首先确定Word的纸张左右页边距,我的页边距左右都是2.5cm。可以这样看自己的页边距
1、打开标尺
2、点击段落→制表位→ 选择全部清除。然后,通过设置按钮,新建2个制表位,分别是:43.2,右对齐;21.62,居中。
3、找到任何一个mathtype编辑的公式,把该公式放到所在行的最左边,其标号紧随其后。像这样。
然后光标放在公式左边→ 按Tab键
公式跑到中间位置,然后把光标放在公式编号前面,再次按Tab键,编号就跑到最右边了。
4、为了实现把该模板应用到别的公式上方便使用:把光标放在已经调整好的公式前面,然后按下图创建样式。
5、样式名任取,可以取为公式标号。
点击确定,该模板就建好了。下一步就是应用在别的公式上了。
6、光标放在任意的空白行,然后点击建好的样式“公式标号”
7、把另一个公式以及编号放在所在行的最左边,按Tab键,然后在公式和标号之间按按Tab键。
8、结束!
作者 | 乔克
来源 | 运维开发故事
监控是整个运维以及产品整个生命周期最重要的一环,它旨在事前能够及时预警发现故障,事中能够结合监控数据定位问题,事后能够提供数据用于分析问题。
一、监控的目的 监控贯穿应用的整个生命周期。即从程序设计、开发、部署、下线。其主要的服务对象有:
技术
业务
技术通过监控系统可以了解技术的环境状态,可以帮助检测、诊断、解决技术环境中的故障和问题。然而监控系统的最终目标是业务,是为了更好的支持业务运行,确保业务的持续开展。
所以监控的目的可以简单归纳如下:1、能够对系统进行7*24小时的实时监控 2、能够及时反馈系统状态 3、保证平台的稳定运行 3、保证服务的安全可靠 4、保证业务的持续运行
二、监控的模式 监控由上至下可以分为:
业务监控
应用监控
操作系统
其中业务监控主要是研发提供一些业务指标、业务数据,对其增长率、错误率等进行告警或者展示,需要提前定义规范甚至埋点。
应用程序的监控主要有探针和内省。其中探针主要是从外部探测应用程序的特征,比如监听端口是否有响应。内省主要是查看应用程序内部的内容,应用程序通过检测并返回其内部的状态,内部的组件,事务和性能等度量,它可以直接将事件、日志和指标直接发送给监控工具。
操作系统主要是监控主要组件的使用率、饱和度以及错误,比如CPU的使用率、CPU的负载等。
三、监控的方式 监控的主要方式有:
健康检查。健康检查是对应用本身健康状况的监控,检查服务是否还正常存活。
日志。日志是排查问题的主要方式,日志可以提供丰富的信息用于定位和解决问题。
调用链监控。调用链监控可以完整的呈现出一次请求的全部信息,包括服务调用链路、所耗时间等。
指标监控。指标是一些基于时间序列的离散数据点,通过聚合和计算后能反映出一些重要指标的趋势。
在上述4中监控方式中,健康检查是云平台等基础设施提供的能力,日志则一般有单独的日志中心进行日志的采集、存储、计算和查询,调用链监控一般也有独立的解决方案进行服务调用的埋点、采集、计算和查询,指标监控则是通过一些 exporter 抓取目标暴露的指标,然后对这些指标数据进行清理、聚合,我们通过聚合出来的数据进行展示、告警等。
说明:该方案主要是针对指标监控
四、监控选型 4.1、健康检查 云平台提供健康检查能力,直接在云平台中配置。
4.2、日志 成熟的开源日志解决方案是ELK。
4.3、调用链监控 调用链健康使用第三方的健康软件,常用的有 skywalking、zikpin、pinpoint、elastic APM、Cat。
其中 zikpin 和 cat 对代码有一定的侵入性,而 skywalking、pinpoint、elastic APM 是基于字节码注入技术,对代码没有侵入性,而且改动最小。
pinpoint 的 agent 仅支持 java 和 php,而 skywalking 和 elastic APM 都支持多种语言,比如 Java/Node.js/Go 等。
在云原生环境下,skywalking 和 elastic APM 更适合。
本篇文章主要是对MySQL学习时的一些总结,作为学习笔记记录
性能分析 性能下降原因 对于某些sql语句来说,会导致执行时间长,等待时间长的后果,从而造成整个sql语句的性能下降。导致sql性能下降的原因主要有:
查询数据过多:能不能拆分,降低过滤条件关联了太多的表,太多join:使用之前尽量先过滤没有利用到索引(单值,复合) 索引是针对列建立的,但并不可能对所有的数据列都建立索引同时索引也并不是越多越好,数据更新的同时,索引也会进行调整,因此过多的索引会降低性能而mysql也不会使用到所有的索引,只会根据其内部的算法找到一个合适的索引使用,因此索引需要建的准当条件比较多时候,可以使用复合索引,复合索引一般会首先使用而有些条件下,就算有索引在具体执行时也不会被使用服务器调优及各个参数设置(缓冲、线程数等)不合理 MySQL常见瓶颈 CPU SQL中对大量数据进行比较、关联、排序、分组。其中最大的压力在于比较
IO 实际内存满足不了缓存数据或排序等需要,导致产生大量 物理 IO查询执行效率低,扫描过多数据行 锁 不适宜的锁的设置,导致线程阻塞,性能下降死锁,线程之间交叉调用资源,导致死锁,程序卡住 服务器硬件 由于服务器硬件导致的性能瓶颈,此时可以通过top、free、iostat和vmstat来查看系统的性能状态
Explain Explain是什么 使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理SQL语句的,分析查询语句或是表结构的性能瓶颈,详情见官网。
Explain能做什么 通过Explain查看sql语句执行计划,可以查看到:
表的读取顺序哪些索引可以使用数据读取操作的操作类型哪些索引被实际使用表之间的引用每张表有多少行被优化器查询 Explain怎么使用 EXPLAIN SQL语句; Explain执行后包含的信息都有:
Explain字段解释 建表 CREATE TABLE t1 ( id INT (10) AUTO_INCREMENT, content VARCHAR (100) NULL, PRIMARY KEY (id) ) ; CREATE TABLE t2 ( id INT (10) AUTO_INCREMENT, content VARCHAR (100) NULL, PRIMARY KEY (id) ) ; CREATE TABLE t3 ( id INT (10) AUTO_INCREMENT, content VARCHAR (100) NULL, PRIMARY KEY (id) ) ; CREATE TABLE t4 ( id INT (10) AUTO_INCREMENT, content VARCHAR (100) NULL, PRIMARY KEY (id) ) ; INSERT INTO t1 (content) VALUES (CONCAT('t1_', FLOOR(1+ RAND() * 1000))) ; INSERT INTO t2 (content) VALUES (CONCAT('t2_', FLOOR(1+ RAND() * 1000))) ; INSERT INTO t3 (content) VALUES (CONCAT('t3_', FLOOR(1+ RAND() * 1000))) ; INSERT INTO t4 (content) VALUES (CONCAT('t4_', FLOOR(1+ RAND() * 1000))) ; id select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序。总共存在三种情况:
目录
丛林跳跃(平台)
项目设置
介绍运动学物体
碰撞响应
Player场景
碰撞层/遮罩
Sprite
碰撞形状
动画
完成场景树
玩家状态
Player脚本
Player移动
Player生命值
收藏品
Collectible场景
Collectible脚本
设计关卡
TileSet配置
基础关卡设计
设计第一关卡
滚动背景
危险物品
敌人
场景设置
脚本
伤害敌人
HUD
场景设置
脚本
附加HUD
标题画面
场景设置
主场景
关卡过渡
收尾工作
音效
无限跌落
二段跳
灰尘粒子
蹲伏状态
爬梯子
移动平台
总结
丛林跳跃(平台) 在本章中,你将以《超级马里奥兄弟》的传统构建一个经典的平台、风格游戏。 平台游戏是一种非常流行的类型,了解它们的工作原理可以帮助你做出各种不同的游戏风格。平台游戏的物理学可能会非常复杂,你会看到Godot的KinematicBody2D物理节点的功能如何帮助你实现你所需要的角色控制器功能,以获得满意的体验。请看下面的截图。
在这个项目中,你将了解:
使用KinematicBody2D物理节点。将动画和用户输入结合起来,产生复杂的角色行为。使用ParallaxLayers创建无限滚动的背景组织你的项目和规划扩展 项目设置 创建一个新项目。在从下面的链接下载资产之前,你需要准备游戏美术的导入设置。这个项目的美术资产使用的是像素艺术风格,这意味着它们在没有过滤的情况下看起来最好,这是Godot对纹理的默认设置。Filtering 是一种对图像的像素进行平滑处理的方法。它可以改善一些艺术的外观,但不是基于像素的图像。
必须为每张图片禁用这个功能很不方便,所以Godot允许你自定义默认的导入设置。点击 FileSystem dock中的icon.png文件,然后点击右侧Scene 选项卡旁边的Import选项卡。这个窗口可以让你改变你选择的文件的导入设置。取消选中Filter 属性,然后点击Preset ,并选择Set as Default for 'Texture'。这样一来,所有的图片在导入时都会禁用过滤功能。请参考下面的截图。
如果你已经导入了图片,它们的导入设置不会自动更新。更改默认值后,您必须重新导入任何现有图像。您可以在FileSystem dock中选择多个文件,然后单击 "Reimport "按钮,一次将设置应用于多个文件。
现在,你可以从下面的链接下载游戏资产,并解压到你的项目文件夹中。Godot会用新的默认设置导入所有图片,https:// github.com/PacktPublishing/Godot-Game-Engine-Projects/releases
学习目标: 目标:熟练运用Java数据结构知识
学习内容: 本文内容:使用Java实现:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
文章目录 学习目标:学习内容:题目描述解题思路:实现代码: 题目描述 示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
解题思路: 首先获取链表长度,创建大小为链表长度的数组,然后遍历链表,依次将元素从尾到头的放入数组
实现代码: public static int[] reversePrint(Node head) { Node cur=head; if(cur==null){ return new int[]{}; } int count=0;//获取链表长度 while(cur!=null){ count++; cur=cur.next; } cur=head; int[] result=new int[count]; //将链表元素放入数组中 for(int i=count-1;i>=0;i--){ result[i]=cur.val; cur=cur.next; } return result; }
一、选择题
1.Java语言中,只限子类或者同一包中的类的方法能访问的访问权限是(C)
A、public B、private C、protected D、无修饰
private:Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。
default:即不加任何访问修饰符,通常称为“默认访问权限“或者“包访问权限”。该模式下,只允许在同一个包中进行访问。
protected:介于public和private之间的一种访问修饰符,一般称之为“保护访问权限”。被其修饰的属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。
public:Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包访问。
2.在以下供选择的方法中,属于接口MouseMotionListener的方法是(D)
A、mouseReleased()B、mouseEntered()C、mouseExited()D、mouseMoved()
3.以下是关于线程的叙述,正确的是(C)
A、多线程的使用可以提高设备的平行工作能力,但是使系统管理变得复杂
B、同一个进程下的线程都有自己的状态、专用数据段和独立的内存资源
C、线程是能独立运行的程序
D、进程的执行效率比线程的执行效率高
4.在编写访问数据库的Java程序时,ResultSet对象的作用是(D)
A、建立新数据库连接B、用来表示与数据库的连接
C、在指定的连接中处理SQL语句D、存储查询结果
5.关于方法main()的说法哪个正确?(C)
A.方法main()只能放在公共类中B.main()的头定义可以根据情况任意更改
C.一个类中可以没有main()方法D.所有对象的创建都必须放在main()方法中
6.抽象方法:(C)
A.可以有方法体(错)B.可以出现在非抽象类中
C.是没有方法体的方法D.抽象类中的方法都是抽象方法
7.this和super:(C)
A.都可以用在main()方法中B.都是指一个内存地址
C.不能用在main()方法中D.意义相同
8.字符流与字节流的区别在于(D)
A.前者带有缓冲,后者没有B.前者是块读写,后者是字节读写
C.二者没有区别,可以互换使用D.每次读写的字节数不同
9.类B是一个抽象类,类C是类B的非抽象子类,下列创建对象x1的语句中正确的是(C)。(抽象类不能被实例化,即不能创建对象)
A.B x1=new B();B.B x1=C();
C.C x1=new C();D.C x1=new B();
10.线程对象的生命周期中,哪个不是其经历的状态(A)。
(五种基本状态:新建;就绪;运行;阻塞;死亡)
A.中断B.运行C.就绪D.死亡
11.对于可以随着窗口的宽度变化而改变相应的控件的位置的布局对象是哪一种(A)
A、FlowLayout B、GridLayout
C、BordyLayout D、CardLayout
12、对于import java.awt.Button;以下那种说法错误(D)
A、Button属于java.awt包B、Button在java.awt目录下
C、Button在java.awt文件中D、Button属于Sun的类
13、用abstract定义的类(D)
A、可以被实例化B、不能派生子类
C、不能被继承D、只能被继承
14、continue语句(C)
A、只中断最内层的循环B、只中断最外层的循环
C、只中断所在层循环中的当次循环D、只中断某一层的循环
15、每个使用组件的程序必须有一个(B)
A、按钮B、容器C、菜单D、标签
16、在Java Applet程序用户自定义的Applet子类中,一般需要重载父类的(D)方法来完成一些画图操作。
A.start()B.stop()
C.init()D.paint()
二、判断题
1.对于容器javax.swing.JPanel,它的默认布局是BorderLayout。(×)JPanel中的默认布局是FlowLayout
2.Socket通常也称为套接字,用于描述IP地址和端口。(√)
在遍历Map集合之前首先先定义一个Map对象:
Map map = new LinkedHashMap();
map.put("1", "one");
map.put("2", "two");
map.put("3", "three");
map.put("4", "fore");
map.put("5", "five");
这个地方使用的是LinkedHashMap,主要是为了确保让map中的元素是按照插入的顺序存放的。
1. 使用keySet()方法遍历
使用keyset方法遍历,是先取出map的key组成的Set集合,通过对Set集合的遍历,然后使用map.get(key)方法取出value值。
for (String key : map.keySet()) {
System.out.println(key + " : " + map.get(key));
}
2. 使用map的values()方法遍历集合的values
map.values()返回的是由map的值组成的Collection,这个方法只能遍历map的所有value,不能得到map的key。
for (String value : map.values()) {
System.out.println(value);
}
3. 使用map的entrySet()方法遍历
使用map的entrySet()方法返回一个以Entry为元素的Set集合,然后对Set集合进行遍历。
for (Entry entry : map.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
4. 通过keySet()返回的集合的iterator遍历
由于map.keySet()返回的是一个Set集合,所以通过它的iterator()方法返回一个迭代器,通过迭代器遍历map。
Iterator it = map.keySet().iterator();
首先我想知道,你想学哪个品牌的PLC,西门子、三菱、施耐德???
因为每个品牌的PLC的编程软件不一样。
比如你选西门子PLC了,首先找一本关于PLC的书学一下,推荐一下
网页链接S7-1200系统列的。这个比较常用,当年是S7-200的,要跟上时代的步伐吧。
安装西门子博途软件网页链接跟着书本学吧。
当你以上都学会了,不,估计有30%的内容你是看不懂的,不是编程你不是懂,编程都好学的,难的是,PLC编程好了,可以控制IO动作了,这就可以了吗,这还达不到一个电气工程师的要求,PLC周围都有哪些部件(或着说子系统)可以用PLC控制的,从而达到控制整个机械设备工艺流程的目的。
学完PLC,大概对PLC有所了解了,下面来了解下低压电器如继电器(了解它的接线与PLC的连接)、接触器(如何控制三相电机的以及三相电机的接线)、断路器相关(1P,2P,3P,4P),低压主要是PLC的输出控制顺,断路器是保护电路的,在电路设计时考虑。
控制开关,传感器、接近开关,电磁开关等(接PLC输入的)。
PLC的输入除了接各种传感器,还可以接高速输入脉冲(了解下编码器)
PLC的输出除了控制各种电磁继电器还有高速输出控制(如步进、伺服等)
还有一个PLC的最强搭档,就是HMI(触摸屏或人机界面),有PLC的地方基本都有它(各别抠门的就算了),操作人员可以通过操作HMI来发指令给PLC,PLC作出对应的运作。当然西门子是有HMI的,博途支持HMI编程的。
假如上面都知道了,那些PLC型号和与PLC相关周边子系统电气部件的型号都要知道,这就是选型,当然不能随便选,要根据机械工艺的需求来选。选完型号后。正式工作就开始了。
利用AutoCAD或Eplan电气制图软件(当然要学了网页链接)。把你选择的所有电器用电路图表示出来,当然电路图符号都有规范的。画好图以后,就可以写PLC与HMI的程序了,图给电工去接线。程序写好后去现场调试。一个项目的周期差不多就这样,大型项目不好说。我说的只是针对设备制造商的电气控制。
首先,JSON有两种结构:
1)数组结构
[
{
key1:value1,
key2:value2
},
{
key3:value3,
key4:value4
}
]
2)对象结构
{
key1:value1,
key2:value2,
...
}
主要的操作步骤如下:
1)将查询的条件从前端传以一定的方式传递到后台。
2)后台根据查询条件从数据库中进行查找。
3)建立JSONObject对象,将查询的加过按照一定的规则添加到对象中,并返回。
4)在前端中通过JavaScript脚本解析后台传过来的JSON对象。(其中通常先采取eval()函数,使得后台传回来的JSON对象被作为一段JavaScript脚本执行,然后对执行结果进行接下来的解析操作)。
程序主体代码如下:
List jsonList = newArrayList();try{
ylx_db query_db= new ylx_db("test"); //这里用的是MySQL里的test数据库,可以根据需要改成自己的数据库名//构造sql语句,根据传递过来的查询条件参数
String sql="select * from "+tableName;
System.out.println(sql);
ResultSet rs=query_db.executeQuery(sql);while(rs.next()) {
List list= newArrayList();//list.add(rs.getString(""));
list.add(rs.getString("lng"));
list.add(rs.getString("lat"));
jsonList.add(list);
System.out.println(rs.getString("lng")+","+rs.getString("lat"));
}
rs.close();
query_db.close();
}catch(SQLException sqlexception) {
sqlexception.printStackTrace();
}//数据库查询完毕,得到了json数组jsonList//
//下面开始构建返回的json
JSONObject jsonObj=newJSONObject();
jsonObj.put("aaData",jsonList); //以键值对的形式给出
response.setContentType("text/html; charset=UTF-8");try{
response.getWriter().print(jsonObj);
response.getWriter().flush();
response.getWriter().close();
}catch(IOException e) {
键盘输入一个含有括号的四则运算表达式,可能含有多余的括号,编程整理该表达式,去掉所有多余的括号,原表达式中所有变量和运算符相对位置保持不变,并保持与原表达式等价。
例:输入表达式 应输出表达式
a+(b+c) a+b+c
(a*b)+c/d a*b+c/d
a+b/(c-d) a+b/(c-d)
注意输入a+b时不能输出b+a。
表达式以字符串输入,长度不超过255。输入不要判错。
所有变量为单个小写字母。只是要求去掉所有多余括号,不要求对表达式化简。
程序如下:
public class PrintString{
private static boolean before = false;
private static void printString(String str){
String temp = "";
for(int i = 0; i < str.length();i++){
if(i == 0){
before = false;
}
else{
if((str.charAt(i - 1) == '*') || (str.charAt(i - 1) == '/')){
before = true;
}else{
before = false;
}
}
if(str.charAt(i) == '('){
除了掌握扎实的专业技能之外,你还需要一份《Java程序员面试宝典》才能在万千面试者中杀出重围,成功拿下offer。
Q1:Java内部类和子类之间有什么区别?
答案:内部类是指在一个外部类的内部再定义一个类,内部类对外部类有访问权限,可以访问类中定义的所有变量和方法。
子类是从父类(superclass)中继承的类,子类可以访问父类所有public和protected的字段和方法。
Q2:Java语言中有哪些常见的访问说明符,有什么意义?
答案:Java中的访问说明符是放在类名之前,用于定义访问范围的关键字,常见的访问说明符有以下几类:
Public:公共,能被项目中的任何一个Class、Method、Field访问。
Protected:受保护,能被同类或子类访问,不能从外部访问。
Default:默认,只能被同一个包的Class、Method、Field访问。
Private:私有,只能被本类访问。
Q3:静态方法和静态变量的目的是什么?
答案:静态变量被类的所有实例共用,静态类只能访问类的静态变量,或调用类的静态方法。
Q4:什么是数据封装及其意义?
答案:封装是面向对象编程中用于在单个单元中组合属性和方法。
封装可以帮助程序员遵循模块化方法进行软件开发,每个对象都有自己的一组方法和变量,并且可以独立于其他对象来执行其功能。另外,封装也有数据隐藏的目的。
Q5:什么是 singleton class(单例类)?并给出其用法的实际例子。
答案:单例类只能有一个实例,必须自己创建自己的唯一实例,必须给所有其他对象提供这一实例。
单例使用场景的最佳实践是由于某些驱动程序限制或由于许可问题的限制只能连接数据库。
Q6:什么是循环?Java中有哪些循环?
答案:循环用于编程中重复执行语句,Java中的循环有三类:
1、for循环
for循环用于执行指定重复次数的语句,当程序员明确知道循环次数可以使用for循环。
2、While循环
当语句满足条件时开始进行重复执行,直到语句不再满足条件退出循环。While循环中在执行语句之前先检查是否满足条件。
3、do while循环
Do while 和while循环基本类似,唯一不同的是do while是先执行语句再检查条件,也就是说do while循环至少会执行一次语句。
Q7:什么是无限循环?如何声明无限循环?
答案:无限循环是指无条件执行,无限运行。无限循环可以由定义中断语句块来结束。
Q8:continue和break语句有什么区别?
答案:break和continue都是循环中的重要关键词,break语句是结束整个循环过程,continue语句只结束本次循环,而不是终止整个循环的执行。
Break:
Continue:
Q9:Java中的double和float变量有什么区别?
答案:float是单精度浮点数,内存中占用4字节,double是双精度浮点数,内存中占用8字节。
Q10:Java中的Final关键字是什么意思?请举例说明
答案:final是Java中的关键字,有“无法改变”、“终态”的含义,final类不能被继承,没有子类,final类中的方法默认是final的,且不能被子类的方法覆盖,但可以被继承。
final成员变量表示常量,只能被赋值一次,赋值后值不再改变。final不能用于修饰构造方法。
下面的例子中,const_val被声明且赋值为常量100:
Private Final int const_val=100
而当一个方法被声明为final之后,它不能被子类覆盖,而且会比其他方法都快。
Q11:举例说明什么是三元运算符?
答案:三元运算符,也称为条件运算符,根据布尔值来决定将哪个值分配给变量,它被表示为...?...:...
在下面的示例中,如果rank为1,status=Done,否则status=Pending
Q12:如何在Java中生成随机数?
答案:使用Math.random()可以生成0.1到1.0范围内的随机数字,然后通过数学方法实现生成符合要求的随机数。
Q13:举例说明什么是default switch case?
答案:在switch语句中,如果没有case条件匹配,那么它会就会执行default后面的语句。
在下面的例子中,当score既不是1也不是2时,就会执行default之后的语句。
Q14:Java中所有派生类的基类是什么?
答案:java.lang.object
Q15:Java中的main()方法可以返回任何数据吗?
答案:java中的main()方法不能返回任何数据,它的返回类型始终是void。
Q16:什么是Java Packages?其意义是什么?
答案:为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。
包的作用:
1. Swing简介
Swing 是 Java 为图形界面应用开发提供的一组工具包,是 Java 基础类的一部分。
Swing 包含了构建图形界面(GUI)的各种组件,如: 窗口、标签、按钮、文本框等。
Swing 提供了许多比 AWT 更好的屏幕显示元素,使用纯 Java 实现,能够更好的兼容跨平台运行。
为了和 AWT 组件区分,Swing 组件在javax.swing.*包下,类名均以 J 开头,例如: JFrame、JLabel、JButton等。
2. Swing组件
一个 Java 的图形界面,由各种不同类型的“元素”组成,例如: 窗口、菜单栏、对话框、标签、按钮、文本框等等,这些“元素”统一被称为 组件(Component)。
组件按照不同的功能,可分为 顶层容器、中间容器、基本组件。一个简单窗口的组成,如下层级结构所示:
顶层容器
菜单栏
中间容器
基本组件
基本组件
组件类型的继承关系:
顶层容器 属于窗口类组件,继承自java.awt.Window;
中间容器 和 基本组件 继承自javax.swing.JComponent。
(1)顶层容器
顶层容器属于窗口类组件,可以独立显示,一个图形界面至少需要一个窗口,例如:
组件
描述
一个普通的窗口(绝大多数 Swing 图形界面程序使用 JFrame 作为顶层容器)
(2)中间容器
中间容器充当基本组件的载体,不可独立显示。中间容器可以添加若干基本组件(也可以嵌套添加中间容器),对容器内的组件进行管理,类似于给各种复杂的组件进行分组管理。最顶层的一个中间容器必须依托在顶层容器(窗口)内。
常用的中间容器(面板):
特殊的中间容器:
(3)基本组件
基本组件是直接实现人机交互的组件。
常用的简单的基本组件:
选取器组件:
其他较为复杂的基本组件:
3. 布局管理器
把 Swing 的各种组件(JComponent)添加到面板容器中(JPanel),需要给面板容器指定布局管理器(LayoutManager),明确容器(Container)内的各个组件之间的排列布局方式。
常用的布局管理器:
给定一个单向链表,编写函数交换相邻 两个元素
输入: 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7
输出: 2 -> 1 -> 4 -> 3 -> 6 -> 5 -> 7
输入: 1 -> 2 -> 3 -> 4 -> 5 -> 6
输出: 2 -> 1 -> 4 -> 3 -> 6 -> 5
通过观察发现:当输入的与元素个数是单数的时候,最后一位不参与交换。
方法1(迭代)
从头节点开始遍历列表,遍历过程中使用每个节点的下一个节点和当前节点的数据进行交换。
时间复杂度:O(n)
实现过程:
c语言
/*C Program to pairwise swap elements in a given linked list*/#include#include
不少网友会在后台给小编留言,询问小编关于软件使用的意见,其中,有一位网友的提问引起了小编的注意。他的问题是:你觉得哪一个uml建模工具好用?如果你也对这一个问题感到好奇的话,可以来看看今天的文章,小编将给大家推荐6款好用的uml建模工具,给大家一个参考。
uml建模工具
6款好用的uml建模工具
一、StarUML
StarUML
StarUML是一种创建UML类图,是一种生成类图和其他类型的统一建模语言(UML)图表的工具,是一个开源项目之一发展快、灵活、可扩展性强(zj)。StarUML免费版是一款开放源码的 UML 开发工具,可绘制9款UML图:用例图、类图、序列图、状态图、活动图、通信图、模块图、部署。
StarUML可设计关于银行金融卡业务的 UseCase 图或是关于可乐贩卖机的实时控制系统的 UseCase图。
软件特色
可绘制9款UML图:用例图、类图、序列图、状态图、活动图、通信图、构件图、部署图以及复合结构图等。
完全免费:StarUML是一套开放源码的软件,不仅免费自由下载,连代码都免费开放。
多种格式影像文件:可导出JPG、JPEG、BMP、EMF和WMF等格式的影像文件。
语法检验:StarUML遵守UML的语法规则,不支持违反语法的动作。
正反向工程:StarUML可以依据类图的内容生成Java、C++、C#代码,也能够读取Java、C++、C#代码反向生成类图。反向工程有两个主要用途,其一是旧有的源码反转成图之后,可以构建UML模型的方式继续将新的设计添加上去;另一项用途是想要解析源码时,可以通过反转的类图来理解,不再需要查看一行又一行的代码,这将节省大量的时间和精力。
支持XMI:StarUML接受XMI 1.1、1.2和1.3版的导入导出。XMI是一种以XML为基础的交换格式,用以交换不同开发工具所生成的UML模型。
导入Rose文件:StarUML可以读取Rational Rose生成的文件,让原先Rose的用户可以转而使用免费的StarUML。早期,Rational Rose是市场占有率最高的UML开发工具,同时也是相当昂贵的工具。由于Rational Rose非常闻名,后来让IBM给收购了。
支持模式:支持23种GoF模式(Pattern),以及3种EJB模式。GoF模式出自于Erich Gamma等4人合著的Design Patterns:Elements of Reusable Object-Oriented Software一书,其内列出了23种软件模式,可解决软件设计上的特定问题。StarUML也支持3种常用的EJB模式,分别为EntityEJB、MessageDrivenEJB、SessionEJB。
StarUML也结合了模式和自动生成代码的功能,方便落实设计。
二、亿图图示专家
亿图图示专家
亿图图示专家是一款基于矢量的综合绘图工具,包含大量的实例库和模版库。可以很方便的创建流程图、网络拓扑图、组织结构图、商业图表、方向图、UML、软件设计图、站点报告、建筑设计等等。
亿图图示是一款跨平台的全类型图形图表设计软件。使用它可以非常容易地创建有专业水准的流程图、组织结构图、网络图、商业展示、建筑平面图、思维导图、科学插画、时尚设计、UML图、工作流程图、程序结构图、网页设计图、电气工程图、方向地图、数据库图表及更多。
软件特色:
1、 超过220个绘图类型。亿图图示可以创建220多种图表类型,利用模板和符号库简化绘图过程,即使是新手也能使用亿图创建出有专业水准可以用作展示的图形。
2、 从模版和示例开始。 拥有超过12500个各式各样矢量符号的符号库,绘图从未如此容易!使用模版和示例,新的升级形状,即装即用的绘图工具,快速启动绘图吧。
3、 几分钟拿到一张有专业水准的图表。这是一款简单易用的文字图形处理程序。软件界面直观,不需要经验和专业知识。它能够让您在仅仅几分钟内就可以创建一个更好的图表。
4、 快速创建交互式信息图表。您可以通过将图表链接到网站、或者在图表中插入文件、加入注释、甚至将图表和其他亿图图形链接起来,都可以迅速地增加图表的信息量。任何人都可以创建这种智能的信息图表。
帮助您更方便,更快捷的阐述设计思想,创作灵感。在设计时亿图采用全拖曳式操作,结合2000多个常用图形模板库和用户自定义实例库,最大程度简化用户的工作量。
三、Software Ideas Modele
Software Ideas Modele
Software Ideas Modeler 是一个小型,便携和功能强大的程序,这将有助于您创建UML图。
它支持10种UML图(类图,用例图,通讯图,序列图,包图,对象图,部署图,状态机图,活动图,纵断面图),实体关系图,图的要求和用户界面建模。
特别说明:软件包含有简体中文界面!专业版个人使用是完全免费的!
四、RGui
RGui
R软件是一款专业的统计建模软件,与其它建模软件不同的是这款软件完全免费、开源,所以深受大家的青睐。R软件拥有数据存储和处理系统;数组运算工具(其向量、矩阵运算方面功能尤其强大);完整连贯的统计分析工具;优秀的统计制图等多种功能。
基本简介
与其说R是一种统计软件,还不如说R是一种数学计算的环境,因为R并不是仅仅提供若干统计程序、使用者只需指定数据库和若干参数便可进行一个统计分析。R的思想是:它可以提供一些集成的统计工具,但更大量的是它提供各种数学计算、统计计算的函数,从而使使用者能灵活机动的进行数据分析,甚至创造出符合需要的新的统计计算方法。
该语言的语法表面上类似 C,但在语义上是函数设计语言的(functional programming language)的变种并且和Lisp 以及 APL有很强的兼容性。特别的是,它允许在“语言上计算”(computing on the language)。这使得它可以把表达式作为函数的输入参数,而这种做法对统计模拟和绘图非常有用。
有些隐蔽问题,有明确报错、但没注意的话排查很花精力,解决起来又非常容易。
特此记录,欢迎持续补充。
Java Mybatis Error attempting to get column xx. Bad format for number ‘2018-09-18’ in column 20(数据类型转换错误)Java函数式编程FunctionalInterface报错:The target method is generic MySQL MySQL ERROR 16 (42000):FUNCTION sum does not exist. Check the ‘Function Name Parsing and Resolution’ 以上。
持续更新中…
该问题将收录于《隐蔽问题系列》
语法虽然基础,但稍不留意还是很难发现的。
今天在写一个FunctionalInterface时,突然遇到了The target method is generic。
都是老司机了,怎么能就这么翻车。检查了多遍语法无果后,既然是generic,那我就常规new一个:
果然编译通过了。
不过等等,重写的方法怎么多出了一点东西<R>,一定有鬼。
想了想函数式编程的设计思想,FunctionalInterface这个method上的泛型确实多余,应该删掉。
尝试重新编译下:
果然通过了。可以愉快的删掉10行代码,开心~
以上。
1 环境 $ npx create-react-app test --typescript 2 function组件 props 一般类型 interface IProps{ param_1: string param_2: number param_3: boolean param_4: string[] param_5?: number[] ...... } function App(props:IProps) { return null } 类型为function组件 import React from 'react'; interface ITest { name: string } function Test({ name }: ITest) { return <span>{name}</span> } function App({ TestComponent }: { TestComponent: React.FC<ITest> }) { return <TestComponent name={'xxx'} /> } export default function () { return <App TestComponent={Test} /> } 类型为class组件 import React from 'react'; interface IProps { age: number } interface IState { name: string } class Test extends React.
Echarts的仪表盘组件是一个比较炫酷的图表,能瞬间提升页面B格。但是默认的仪表盘组件的刻度都是按照设置的最大值均匀分布的。而实际应用中很多场景需要将部分数值区间放大显示到仪表盘上,比如仪表盘前面 50% 显示 0-10 的数值范围后面 50% 就显示 10-50 的范围。这种不规则的刻度不能直接调用 Echarts 提供的方法。需要将数据根据需求进行转换。
本文展示了通过数据转换后实现的不规则刻度仪表盘效果。
1、
let ruler = [0, 10, 25, 50, 100, 200, 500, 1000, 2000]; //仪表盘刻度 let val = 130; //仪表盘当前显示值 setGaugeOption(myChart, ruler, val); //仪表盘 效果如下图:
2、
let ruler = [-20, -10, 0, 10, 20, 40, 80]; //仪表盘刻度 let val = -5; //仪表盘当前显示值 setGaugeOption(myChart, ruler, val); //设置仪表盘 效果如下图:
demo下载:点我下载
谈到JSON,简单的说就是一种数据交换格式。近年来,其在服务器之间交换数据的应用越来越广,相比XML其格式更简单、编解码更容易、扩展性更好,所以深受开发人员的喜爱。
下面简单的写一下在项目中前后台json传值的一个小例子,供大家参考、查阅。
一:前台传后台
1.前台jsp页面代码:
在index中将实体对象(自己创建即可)插入list中,再将list集合转化成json数组,利用post方式发送AJAX请求,将这个json数组发送至后台(servlet),再在后台进行解析即可。
index.jsp
My first json page Athlete athlete1= newAthlete();
athlete1.setAthlete_id(1003);
athlete1.setAthlete_name("林丹");
athlete1.setAthlete_sex("男");
Date athlete_age1= format1.parse("1983-10-14");//是java.util.date
athlete1.setAthlete_age(athlete_age1);
athlete1.setCoach_id(101);
athlete1.setEvent_id(1);
athlete1.setService_status("1");
athlete1.setExperience("2013年第12届全运会男单冠军。");
Athlete athlete2= new Athlete();//记录2
athlete2.setAthlete_id(1004);
athlete2.setAthlete_name("鲍春来");
athlete2.setAthlete_sex("男");
Date athlete_age2= format1.parse("1988-10-14");
athlete2.setAthlete_age(athlete_age2);
athlete2.setCoach_id(101);
athlete2.setEvent_id(1);
athlete2.setService_status("1");
athlete2.setExperience("2011年亚洲羽毛球锦标赛亚军。");
List list1 = new ArrayList();
list1.add(athlete1);
list1.add(athlete2);
JsonConfig jsonConfig= new JsonConfig();//解决date类型的传输问题
jsonConfig.registerJsonValueProcessor(Date.class , newJsonDateValueProcessor());
JSONArray jsonarray=JSONArray.fromObject(list1, jsonConfig);%>
varxmlHttp;
function createXmlHttpRequest() {if(window.ActiveXObject) {
xmlHttp= new ActiveXObject("Microsoft.XMLHTTP");
}else if(window.XMLHttpRequest) {
xmlHttp= newXMLHttpRequest();
项目上需要根据需求进行外部链接跳转 H5 window.location.href = `http://${jumpUrl}`; 移动端 plus.runtime.openURL(`http://${jumpUrl}`)