SASS

SASS http://www.ruanyifeng.com/blog/2012/06/sass.html 作者: 阮一峰 日期: 2012年6月19日 学过CSS的人都知道,它不是一种编程语言。 你可以用它开发网页样式,但是没法用它编程。也就是说,CSS基本上是设计师的工具,不是程序员的工具。在程序员眼里,CSS是一件很麻烦的东西。它没有变量,也没有条件语句,只是一行行单纯的描述,写起来相当费事。 很自然地,有人就开始为CSS加入编程元素,这被叫做"CSS预处理器" (css preprocessor) 。它的基本思想是,用一种专门的编程语言,进行网页样式设计,然后再编译成正常的CSS文件。 各种"CSS预处理器"之中,我自己最喜欢SASS,觉得它有很多优点,打算以后都用它来写CSS。下面是我整理的用法总结,供自己开发时参考,相信对其他人也有用。 一、什么是SASS SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护。

2012-11-24 · 1 min · 15 words · -

自适应网页设计 (Responsive Web Design)

自适应网页设计 (Responsive Web Design) http://www.ruanyifeng.com/blog/2012/05/responsive_web_design.html 作者: 阮一峰 日期: 2012年5月 1日 随着3G的普及,越来越多的人使用手机上网。 移动设备正超过桌面设备,成为访问互联网的最常见终端。于是,网页设计师不得不面对一个难题: 如何才能在不同大小的设备上呈现同样的网页? 手机的屏幕比较小,宽度通常在600像素以下;PC的屏幕宽度,一般都在1000像素以上 (目前主流宽度是1366×768) ,有的还达到了2000像素。同样的内容,要在大小迥异的屏幕上,都呈现出满意的效果,并不是一件容易的事。 很多网站的解决方法,是为不同的设备提供不同的网页,比如专门提供一个mobile版本,或者iPhone / iPad版本。这样做固然保证了效果,但是比较麻烦,同时要维护好几个版本,而且如果一个网站有多个portal (入口) ,会大大增加架构设计的复杂度。 于是,很早就有人设想,能不能"一次设计,普遍适用",让同一张网页自动适应不同大小的屏幕,根据屏幕宽度,自动调整布局 (layout) ? 一、“自适应网页设计"的概念 2010年,Ethan Marcotte提出了"自适应网页设计” (Responsive Web Design) 这个名词,指可以自动识别屏幕宽度、并做出相应调整的网页设计。

2012-11-24 · 1 min · 31 words · -

lazygit

lazygit https://github.com/jesseduffield/lazygit go install github.com/jesseduffield/lazygit@latest

2012-11-23 · 1 min · 5 words · -

html 版权符号

html 版权符号 在页面里加上版权符号,HTML代码里对应输入© ©就是版权符号在HTML里的代码,但是很多页面在设计的时候,用的字体是宋体,就算没有设置字体,中文系统下默认用的还是宋体,那么就导致的显示出来的版权符号变形。让我们来看看用宋体显示出来的是什么样子,代码和效果: Copyright ©2009 www.fwl.name 看到了,版权符号变形了 让我们来看看用arial字体显示出来的是什么样子,代码和效果: Copyright ©2009 www.fwl.name 看,这样就正常了· 所以,要很好很完美的显示出版权符号,除了用©外,还得用对字体

2012-11-21 · 1 min · 14 words · -

autoHotKey

autoHotKey ^ ctrl shift ! alt ^!s:: {BS} backspace sleep 500 Send Hello{Enter} return //ctrl+alt+s

2012-11-19 · 1 min · 15 words · -

golang 方法, 接口, 继承

golang 方法, 接口, 继承 package main import "fmt" type Foo struct{ Field0 string Field1 string } type Bar struct{ Foo Field2 string Field3 string } func main(){ fmt.Println("hello") bar:=Bar{Field2: "f2",Field3: "f3"} bar.Field0="f0" fmt.Printf("%v",bar) } http://www.cnblogs.com/chenny7/p/4497969.html Go语言没有沿袭传统面向对象编程中的诸多概念,比如继承、虚函数、构造函数和析构函数、隐藏的 this 指针等。 go 方法 Go 语言中同时有函数和方法。方法就是一个包含了接收器 (receiver) 的函数,receiver 可以是内置类型或者结构体类型的一个值或者是一个指针。所有给定类型的方法属于该类型的方法集。 如下面的这个例子,定义了一个新类型Integer,它和int一样,只是为它内置的int类型增加了个新方法 Less() 接收器——方法作用的目标 接收器的格式如下: func (接收器变量 接收器类型) 方法名(参数列表) (返回参数) { 函数体 } type Integer int func (a Integer) Less(b Integer) bool { return a < b } func main() { var a Integer = 1 if a.Less(2) { fmt.Println("less then 2") } } 可以看出,Go语言在自定义类型的对象中没有 C++/Java 那种隐藏的 this指针,而是在定义成员方法时显式声明了其所属的对象。 ...

2012-11-18 · 5 min · 895 words · -

Filter FilterChain

Filter FilterChain http://blog.csdn.net/zhaozheng7758/article/details/6105749 一、Filter的介绍及使用**** 什么是过滤器? 与Servlet相似,过滤器是一些web应用程序组件,可以绑定到一个web应用程序中。但是与其他web应用程序组件不同的是,过滤器是"链"在容器的处理过程中的。这就意味着它们会在servlet处理器之前访问一个进入的请求,并且在外发响应信息返回到客户前访问这些响应信息。这种访问使得过滤器可以检查并修改请求和响应的内容。 过滤器适用于那些地方? l 为一个web应用程序的新功能建立模型(可被添加到web应用程序中或者从web应用程序中删除而不需要重写基层应用程序代码); l 向过去的代码添加新功能。 过滤器放在容器结构的什么位置? 过滤器放在web资源之前,可以在请求抵达它所应用的web资源(可以是一个Servlet、一个Jsp页面,甚至是一个HTML页面)之前截获进入的请求,并且在它返回到客户之前截获输出请求。Filter: 用来拦截请求,处于客户端与被请求资源之间,目的是重用代码。Filter链,在web.xml中哪个先配置,哪个就先调用。在filter中也可以配置一些初始化参数。 Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应。 主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链。 Filter 有如下几个用处: l 在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest 。 l 根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。 l 在HttpServletResponse 到达客户端之前,拦截HttpServletResponse 。 l 根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据。 Filter 有如下几个种类: l 用户授权的Filter: Filter 负责检查用户请求,根据请求过滤用户非法请求。 l 日志Filter: 详细记录某些特殊的用户请求。 l 负责解码的Filter: 包括对非标准编码的请求解码。 l 能改变XML 内容的XSLTFilter 等。 一个Filter 可负责拦截多个请求或响应:一个请求或响应也可被多个请求拦截。 创建一个Filter 只需两个步骤: (1)创建Filter 处理类: (2)在web.xml 文件中配置Filter 。 创建Filter 必须实现javax.servlet.Filter 接口,在该接口中定义了三个方法。 • void init(FilterConfig config): 用于完成Filter 的初始化。 ...

2012-11-18 · 3 min · 558 words · -

python调用shell命令

python调用shell命令 http://blog.chinaunix.net/uid-16362696-id-3067891.html python调用shell命令的方法有许多 1.1 os.system(command) 在一个子shell中运行command命令,并返回command命令执行完毕后的退出状态。这实际上是使用C标准库函数system()实现的。这个函数在执行command命令时需要重新打开一个终端,并且无法保存command命令的执行结果。 1.2 os.popen(command,mode) 打开一个与command进程之间的管道。这个函数的返回值是一个文件对象,可以读或者写(由mode决定,mode默认是’r’)。如果mode为’r’,可以使用此函数的返回值调用read()来获取command命令的执行结果。 1.3** **commands.getstatusoutput(command) 使用os.popen()函数执行command命令并返回一个元组(status,output),分别表示command命令执行的返回状态和执行结果。对command的执行实际上是按照{command;} 2>&1的方式,所以output中包含控制台输出信息或者错误信息。output中不包含尾部的换行符。 2.1 subprocess.call([“some_command”,“some_argument”,“another_argument_or_path”]) subprocess.call(command,shell=True) 2.2 subprocess.Popen(command, shell=True) 如果 command 不是一个可执行文件,shell=True 不可省。 使用subprocess模块可以创建新的进程,可以与新建进程的输入/输出/错误管道连通,并可以获得新建进程执行的返回状态。使用subprocess模块的目的是替代os.system()、os.popen*()、commands.*等旧的函数或模块。 最简单的方法是使用class subprocess.Popen(command,shell=True)。Popen类有Popen.stdin,Popen.stdout,Popen.stderr三个有用的属性,可以实现与子进程的通信。 将调用shell的结果赋值给python变量 handle = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) print handle.communicate()[0] 如果想获取执行命令的状态值,也就是$?, 可以用os.system( cmd ) 如果想获取执行命令的print内容, 可以用os.popen( cmd ).read() 既想获取状态值,也想获取打印的内容? import commands stat, content = commands.getstatusoutput( cmd ) stat is the exit code content is the content for printing

2012-11-17 · 1 min · 62 words · -

Lambda 表达式

Lambda 表达式 “Lambda 表达式"是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型。 所有 Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为"goes to”。该 Lambda 运算符的左边是输入参数 (如果有) ,右边包含表达式或语句块。Lambda 表达式 x => x * x 读作"x goes to x times x"。 函数式接口functional interface, @FunctionalInterface 函数式接口(Functional Interface)是Java 8对一类特殊类型的接口的称呼。 这类接口只定义了唯一的抽象方法的接口 (除了隐含的Object对象的公共方法) , 因此最开始也就做SAM类型的接口 (Single Abstract Method) 。 为什么会单单从接口中定义出此类接口呢? 原因是在 Java Lambda 的实现中, 开发组不想再为Lambda表达式单独定义一种特殊的Structural函数类型,称之为箭头类型 (arrow type) , 依然想采用Java既有的类型系统(class, interface, method等), 原因是增加一个结构化的函数类型会增加函数类型的复杂性,破坏既有的Java类型,并对成千上万的Java类库造成严重的影响。 权衡利弊, 因此最终还是利用SAM 接口作为 Lambda表达式的目标类型。 JDK中已有的一些接口本身就是函数式接口,如Runnable。 JDK 8中又增加了java.util.function包, 提供了常用的函数式接口。 函数式接口代表的一种契约, 一种对某个特定函数类型的契约。 在它出现的地方,实际期望一个符合契约要求的函数。 Lambda表达式不能脱离上下文而存在,它必须要有一个明确的目标类型,而这个目标类型就是某个函数式接口。 方法引用 (method reference) 双冒号 “::” 是 Java 8 引入 Lambda 表达式后的一种用法,表示方法引用 (method reference) ,可以更加简洁的实例化接口 双冒号表达式返回的是一个 函数式接口对象 (用 @FunctionalInterface 注解的 interface 类型) 的实例,如下: ...

2012-11-17 · 5 min · 1020 words · -

数据库索引

数据库索引 数据库索引好比是一本书前面的目录,能加快数据库的查询速度。 例如这样一个查询: select * from table1 where id=44。如果没有索引,必须遍历整个表,直到ID等于44的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),直接在索引里面找44 (也就是在ID这一列找) ,就可以得知这一行的位置,也就是找到了这一行。可见,索引是用来定位的。 索引分为聚簇索引和非聚簇索引两种,聚簇索引 是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。为表设置索引要付出代价的: 一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。 详述 创建索引可以大大提高系统的性能。第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。 也许会有人要问: 增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?因为,增加索引也有许多不利的方面。第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 索引是建立在数据库表中的某些列的上面。在创建索引的时候,应该考虑在哪些列上可以创建索引,在哪些列上不能创建索引。一般来说,应该在这些列上创建索引: 在经常需要搜索的列上,可以加快搜索的速度; 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构; 在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的; 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间; 在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。 同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点: 第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。 第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。 第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少,不利于使用索引。 第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改操作远远多于检索操作时,不应该创建索引。可以基于数据库表中的单列或多列创建索引。多列索引可以区分其中一列可能有相同值的行。 如果经常同时搜索两列或多列或按两列或多列排序时,索引也很有帮助。例如,如果经常在同一查询中为姓和名两列设置判据,那么在这两列上创建多列索引将很有意义。 确定索引的有效性: 检查查询的WHERE和JOIN子句。在任一子句中包括的每一列都是索引可以选择的对象。 对新索引进行试验以检查它对运行查询性能的影响。 考虑已在表上创建的索引数量。最好避免在单个表上有很多索引。 检查已在表上创建的索引的定义。最好避免包含共享列的重叠索引。 检查某列中唯一数据值的数量,并将该数量与表中的行数进行比较。比较的结果就是该列的可选择性,这有助于确定该列是否适合建立索引,如果适合,确定索引的类型。根据数据库的功能,可以在数据库设计器中创建三种索引: 唯一索引、主键索引和聚集索引。有关数据库所支持的索引功能的详细信息,请参见数据库文档。 提示: 尽管唯一索引有助于定位信息,但为获得最佳性能结果,建议改用主键或唯一约束。 唯一索引 唯一索引是不允许其中任何两行具有相同索引值的索引。 当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。例如,如果在employee表中职员的姓(lname)上创建了唯一索引,则任何两个员工都不能同姓。 主键索引 数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。 在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。 聚集索引 在聚集索引中,表中行的物理顺序与键值的逻辑 (索引) 顺序相同。一个表只能包含一个聚集索引。 如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。 索引 uuid vs 自增 需要看你索引适应的形式,如果使用 b-tree 索引形式,有序 id 比无需 id 好,如果是 hash 索引,两个差别不大。主要原因是索引在磁盘上存储的形式,常用的 b-tree 索引如果 id 是连续的,那么数据存储在相邻的磁盘上,如果查询和写入操作的 id 连续,那么减少随机读写硬盘的几率,提升读写效率。所以看你的实际情况,如果你用的是 b-tree 索引,同时记录比较多,那么用有序 id 作为索引效率会高很多。 ...

2012-11-17 · 1 min · 87 words · -

MySQL 分页

MySQL 分页 一般MySQL最基本的分页方式: select * from content order by id desc limit 0, 10 在中小数据量的情况下,这样的SQL足够用了,唯一需要注意的问题就是确保使用了索引。随着数据量的增加,页数会越来越多,查看后几页的SQL就可能类似: select * from content order by id desc limit 10000, 10 一言以蔽之,就是越往后分页,LIMIT语句的偏移量就会越大,速度也会明显变慢。 此时,我们可以通过2种方式: 一,子查询的分页方式来提高分页效率,SQL语句如下: SELECT * FROM content WHERE id <= (SELECT id FROM content ORDER BY id desc LIMIT “.($page-1)*$pagesize.”, 1) ORDER BY id desc LIMIT $pagesize 为什么会这样呢?因为子查询是在索引上完成的,而普通的查询时在数据文件上完成的,通常来说,索引文件要比数据文件小得多,所以操作起来也会更有效率。 (via) 通过explain SQL语句发现: 子查询使用了索引! id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY content range PRIMARY PRIMARY 4 NULL 6264 Using where ...

2012-11-15 · 1 min · 170 words · lcf

管程, monitor

管程, monitor 管程, 监视器, Moniter Java程序设计语言中,每个对象都可以作为一个管程。需要互斥使用的方法必须明确标示关键字 synchronized . 代码块也可以标示关键字synchronized. 不使用明确的条件变量, Java的这种管程在入口队列之外,使用单独的条件等待队列. 所有等待的线程进入这个队列, 所有的notify与notify all操作也施加于这个队列。这种方法已经被其它程序设计语言使用,如C#. Java中的同步方法与其他经典管程有本质差别: Java没有内嵌的条件变量。反之,Java提供了两个过程wait和notify ,分别与sleep和wakeup等价, 不过,当它们在同步方法中使用时,它们不受竞争条件约束。理论上,方法wait可以被中断,它本身就是与中断有关的代码。Java需要显式表示异常处理。 在JAVA中是如何实现管程? 在Java虚拟机中,每个对象和类在逻辑上与管程相关联。为了实现管程的互斥能力,一个锁(有时也称为一个互斥锁)关联每个对象和类。这就是所谓操作系统书籍上的信号量(semaphore),互斥锁是一个二进制信号量。 如果一个线程拥有一些数据的锁,那么没有其他线程可以获取这个锁,直到拥有锁的线程释放它。当我们做多线程编程时,如果任何时候都需要编写一个信号量,这将是不方便。幸运的是,我们并不需要,因为JVM自动为我们实现了。 声明一个管程区域,这意味着数据不能被超过一个线程访问,java提供同步代码块和同步方法。一旦代码被嵌入synchronized关键字,它就是一个管程区域。该锁在后台通过JVM自动实现。 3.在JAVA的同步代码中,哪一部分是管程? 我们知道每个对象/类都关联一个管程。我认为更好的说法应该是每个对象都有一个管程,因为每个对象可以有它自己的临界区,并能够监控线程顺序。 为了使不同的线程协作,JAVA为提供了wait()和notify()来挂起线程和唤醒另外一个等待的线程。此外,还有其他3个方法: wait(long timeout, int nanos) wait(long timeout) notified by other threads or notified by timeout. notify(all) 这些方法只能在同步代码块或同步方法中调用。因为所有的这些方法都需要线程持有对象的锁,所以只能通过同步来实现。 管程 (英语: Moniters,也称为监视器) 是一种程序结构,结构内的多个子程序 (对象或模块) 形成的多个工作线程互斥访问共享资源。 这些共享资源一般是硬件设备或一群变量。管程实现了在一个时间点,最多只有一个线程在执行管程的某个子程序。 与那些通过修改数据结构实现互斥访问的并发程序设计相比,管程实现很大程度上简化了程序设计。 管程提供了一种机制,线程可以临时放弃互斥访问,等待某些条件得到满足后,重新获得执行权恢复它的互斥访问。 一个管程包含: 多个彼此可以交互并共用资源的线程 多个与资源使用有关的变量 一个互斥锁 一个用来避免竞态条件的不变量 一个管程的程序在运行一个线程前会先取得互斥锁,直到完成线程或是线程等待某个条件被满足才会放弃互斥锁。 若每个执行中的线程在放弃互斥锁之前都能保证不变量成立,则所有线程皆不会导致竞态条件成立。 当一个线程执行管程中的一个子程序时,称为占用(occupy)该管程. 管程的实现确保了在一个时间点,最多只有一个线程占用了该管程。这是管程的互斥锁访问性质。 当线程要调用一个定义在管程中的子程序时,必须等到已经没有其它线程在执行管程中的某个子程序。 在管程的简单实现中,编译器为每个管程对象自动加入一把私有的互斥锁。该互斥锁初始状态为解锁, 在管程的每个公共子程序的入口给该互斥锁加锁,在管程的每个公共子程序的出口给该互斥锁解锁。 条件变量(Condition Variable) 管程提供了一种实现互斥的简便途径,但这还不够。我们还需要一种办法使得线程在无法继续运行时被阻塞。 在生产者-消费者问题中,很容易将针对缓冲区满和缓冲区空的测试放到管程过程中,但是生产者在发现缓冲区满的时候如何阻塞呢? 解决的方法是引入条件变量 (condition variables) 以及相关的两个操作: wait和signal。 ...

2012-11-15 · 2 min · 274 words · -

消息队列/message queue/MQ, CORBA, DCOM, RMI, RPC

消息队列/message queue/MQ, CORBA, DCOM, RMI, RPC http://blog.csdn.net/mr_smile2014/article/details/47452281 消息队列是在消息的传输过程中保存消息的容器,消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。 一、 产生背景: 现今,越来越多的企业面临着各种各样的数据集成和系统整合,CORBA、DCOM、RMI 等RPC中间件技术也应运而生,但由于采用RPC同步处理技术,在性能、健壮性、可扩展性上都存在着诸多缺点。而基于消息的异步处理模型采用非阻塞的调用特性,发送者将消息发送给消息服务器,消息服务器在合适的时候再将消息转发给接收者;发送和接收是异步的,发送者无需等待,二者的生命周期也可以不必相同,而且发送者可以将消息间接传给多个接收者,大大提高了程序的性能、可扩展性及健壮性,这使得异步处理模型在分布式应用上比起同步处理模型更具有吸引力。 分布式对象调用,如CORBA,RMI 和DCOM,提供了一种通讯机制,透明地在异构的分布式计算环境中传递对象请求,这些对象可以位于本地或远程机器。它通过在对象与对象之间提供一种统一的接口,使对象之间的调用和数据共享不再关心对象的位置、实现语言及所驻留的操作系统。这个接口就是面向对象的中间件。 二、传统面向对象中间件的局限性 同步通信: 客户发出调用后,必须等待服务对象完成处理并返回结果后才能继续执行。 客户和服务对象的生命周期紧密耦合: 客户进程和服务对象进程都必须正常运行,如果由于服务对象崩溃或网络故障导致客户的请求不可达,客户会接收到异常。 三、面向消息的中间件的优越性 消息中间件作为一个中间层软件, 它为分布式系统中创建、发送、接收消息提供了一套可靠通用的方法,实现了分布式系统中可靠的、高效的、实时的跨平台数据传输。消息中间件减少了开发跨平台和网络协议软件的复杂性,它屏蔽了不同操作系统和网络协议的具体细节,面对规模和复杂度都越来越高的分布式系统。它与传统的面向对象中间件相比具有如下优点: 采用异步通信模式: 发送消息者可以在发送消息后进行其它的工作,不用等待接收者的回应,而接收者也不必在接到消息后立即对发送者的请求进行处理。 客户和服务对象生命周期的松耦合关系: 客户进程和服务对象进程不要求都正常运行,如果由于服务对象崩溃或者网络故障导致客户的请求不可达,客户不会接收到异常,消息中间件能保证消息不会丢失。 四、消息中间件的技术标准 消息中间件主要有JMS和AMQP两种技术标准; JMS Java关于消息服务的标准是JMS,JMS即Java消息服务 (Java Message Service) 应用程序接口是一个Java平台中关于面向消息中间件 (MOM) 的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,类似于JDBC,需要不同的提供商进行各自的实现。实现JMS标准的软件可以作为Java下的消息中间件服务器。JMS 使您能够通过消息收发服务 (有时称为消息中介程序或路由器) 从一个 JMS 客户机向另一个 JMS客户机发送消息。消息是 JMS中的一种类型对象,由两部分组成: 报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。根据有效负载的类型来划分,可以将消息分为几种类型,它们分别携带: 简单文本(TextMessage)、可序列化的对象 (ObjectMessage)、属性集合 (MapMessage)、字节流 (BytesMessage)、原始值流 (StreamMessage),还有无有效负载的消息 (Message)。 AMQP AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。Erlang中的实现有 RabbitMQ等。

2012-11-15 · 1 min · 56 words · -

sql join

sql join 多个条件 SELECT a.* FROM product a LEFT JOIN product_details b ON a.id=b.id AND b.weight!=44 AND b.exist=0 WHERE b.id IS NULL; join inner join(等值连接) 只返回两个表中联结字段相等的行 left join (左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录 INNER JOIN 语法: INNER JOIN 连接两个数据表的用法: SELECT * FROM 表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号 INNER JOIN 连接三个数据表的用法: SELECT * FROM (表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号 **INNER JOIN 连接四个数据表的用法: ** SELECT * FROM ((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号 ...

2012-11-14 · 3 min · 429 words · -

jconsole

jconsole http://jiajun.iteye.com/blog/810150 一、JConsole是什么 从Java 5开始 引入了 JConsole。JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行。您可以轻松地使用 JConsole (或者,它更高端的 “近亲” VisualVM ) 来监控 Java 应用程序性能和跟踪 Java 中的代码。 二、如何启动JConsole 如果是从命令行启动,使 JDK 在 PATH 上,运行 jconsole 即可。 如果从 GUI shell 启动,找到 JDK 安装路径,打开 bin 文件夹,双击 jconsole 。 当分析工具弹出时 (取决于正在运行的 Java 版本以及正在运行的 Java 程序数量) ,可能会出现一个对话框,要求输入一个进程的 URL 来连接,也可能列出许多不同的本地 Java 进程 (有时包含 JConsole 进程本身) 来连接。如图所示: 想分析那个程序就双击那个进程。 三、如何设置JAVA程序运行时可以被JConsolse连接分析 本地程序 (相对于开启JConsole的计算机) ,无需设置任何参数就可以被本地开启的JConsole连接 (Java SE 6开始无需设置,之前还是需要设置运行时参数 -Dcom.sun.management.jmxremote ) 无认证连接 (下面的设置表示: 连接的端口为8999、无需认证就可以被连接) Java代码 收藏代码 -Dcom.sun.management.jmxremote.port=8999 \ ...

2012-11-14 · 1 min · 170 words · -

生产线节拍

生产线节拍 流程的"节拍"(Cycle time)是指连续完成相同的两个产品(或两次服务,或两批产品)之间的间隔时间。换句话说,即指完成一个产品所需的平均时间。节拍通常只是用于定义一个流程中某一具体工序或环节的单位产出时间。如果产品必须是成批制作的,则节拍指两批产品之间的间隔时间。在流程设计中,如果预先给定了一个流程每天(或其它单位时间段)必须的产出,首先需要考虑的是流程的节拍。 在机械加工生产线的设计中,节拍是设计的一个很重要的因素。生产节拍的平衡很重要。生产节拍的公式为 t=60Tβ/N 式中t为生产节拍,T为一年基本工时,一般规定,按一班制工时为2360h/年,按两班制工时为4650h/年;β为复杂系数,一般取为0.65-0.85;N为生产线加工工件的年生产纲领。 机械加工生产线的主要分类有: 单一产品固定节拍生产线、单一产品非固定节拍生产线、成组产品可调节生产线、柔性制造生产线。

2012-11-14 · 1 min · 8 words · -

KubeKey

KubeKey sudo apt install socat conntrack ebtables ipset ipvsadm git clone https://github.com/kubesphere/kubekey.git cd kubekey ./build.sh -p cd output ./kk create cluster https://kubesphere.io/zh/docs/installing-on-linux/introduction/intro/

2012-11-14 · 1 min · 22 words · -

dstat

dstat dstat 是一个可以取代vmstat,iostat,netstat和ifstat这些命令的多功能产品。dstat克服了这些命令的局限并增加了一些另外的功能,增加了监控项,也变得更灵活了。dstat可以很方便监控系统运行状况并用于基准测试和排除故障。 dstat可以让你实时地看到所有系统资源,例如,你能够通过统计IDE控制器当前状态来比较磁盘利用率,或者直接通过网络带宽数值来比较磁盘的吞吐率(在相同的时间间隔内)。 dstat将以列表的形式为你提供选项信息并清晰地告诉你是在何种幅度和单位显示输出。这样更好地避免了信息混乱和误报。更重要的是,它可以让你更容易编写插件来收集你想要的数据信息,以从未有过的方式进行扩展。 Dstat的默认输出是专门为人们实时查看而设计的,不过你也可以将详细信息通过CSV输出到一个文件,并导入到Gnumeric或者Excel生成表格中。 https://linux.cn/article-3215-1.html pacman -S dstat

2012-11-13 · 1 min · 10 words · -

xrandr

‘Linux 双显示器/多屏/扩展屏幕/xrandr’ Can’t open display :0 用 root 用户执行 xrandr 会报错 Can’t open display :0, 尝试用其它普通用户 https://www.reddit.com/r/linux4noobs/comments/lu1plx/hi_i_get_this_authorization_required_but_no/ 4k 显示器调整 dpi xrandr -display :0.0 --listmonitors xrandr -display :0 --listmonitors xrandr -display :0 --dpi 144 # 或者这样配置环境变量 export DISPLAY=:0 xrandr --listmonitors xrdb -query xdpyinfo|grep dots xdpyinfo | grep -B 2 resolution xrandr -verbose xrandr -output DVI-0 -left-of VGA-0 -auto 不带参数执行xrandr能够列出当前的显示设备和每个设备支持的模式。 edit xorg.conf add line Virtual 2560 1024 wiloon@debian:~$ xrandr Screen 0: minimum 320 x 200, current 1680 x 1050, maximum 16384 x 16384 DFP1 connected 1680x1050+0+0 (normal left inverted right x axis y axis) 518mm x 324mm 1920x1200 60.0 + 1920x1080 60.0 1600x1200 60.0 1680x1050 60.0* 1400x1050 60.0 1600x900 60.0 1360x1024 60.0 1280x1024 60.0 1440x900 60.0 1280x960 60.0 1280x800 60.0 1280x768 60.0 1280x720 60.0 1024x768 60.0 800x600 60.3 640x480 59.9 DFP2 disconnected (normal left inverted right x axis y axis) DFP3 disconnected (normal left inverted right x axis y axis) DFP4 disconnected (normal left inverted right x axis y axis) DFP5 connected 1680x1050+0+0 (normal left inverted right x axis y axis) 408mm x 255mm 1680x1050 60.0*+ 1600x1200 60.0 1400x1050 60.0 1600x900 60.0 1360x1024 60.0 1280x1024 75.0 60.0 1440x900 59.9 1280x960 60.0 1280x800 60.0 1152x864 60.0 75.0 1280x768 60.0 1280x720 60.0 1024x768 75.0 70.1 60.0 800x600 72.2 75.0 60.3 56.2 640x480 75.0 72.8 66.6 59.9 CRT1 disconnected (normal left inverted right x axis y axis) wiloon@debian:~$ xrandr -output DFP1 -auto -left-of DFP5 xrandr -output DFP1 -mode 1920x1200 -left-of CRT2 -mode 1680x1050 wiloon@debian:~$ cvt 1680 1050 # 1680x1050 59.95 Hz (CVT 1.76MA) hsync: 65.29 kHz; pclk: 146.25 MHz Modeline "1680x1050_60.00" 146.25 1680 1784 1960 2240 1050 1053 1059 1089 -hsync +vsync wiloon@debian:~$ xrandr -newmode "1680x1050" 146.25 1680 1784 1960 2240 1050 1053 1059 1089 -hsync +vsync wiloon@debian:~$ xrandr -addmode VGA1 "1680x1050" wiloon@debian:~$ xrandr -output VGA1 -mode 1680x1050 设置显示分辨率及 xrandr 介绍 X Windows 中有一个显示分辨率的概念,在默认情况下,这个显示分辨率为 max*max ,max等于你的所有连接上的显示器中最大分辨率中的最大值。例如我的笔记本液晶屏最大分辨率为 1024*768,外接显示器最大分辨率为 1280*1024,则默认的显示分辨率为 1280*1280。如果我设置左右双屏且使用最大分辨率,那么总显示分辨率就会达到2304*1024,达到超出系统默认的大小。在这种情况下强行设置双屏幕,就会导致 X 进入超低分辨率,结果不得不手工重设 xrog.conf 来恢复。 为了更好检测这个问题,我们需要用到xrandr 这个软件,xrandr系统已经自带,如果没有请安装x11-xserver-utils: sudo apt-get install x11-xserver-utils 。 不带参数执行xrandr能够列出当前的显示设备和每个设备支持的模式。Screen代表了总显示区域,VGA代表显示器,LVDS代表笔记本液晶屏。 ...

2012-11-11 · 4 min · 765 words · -

JUDE,Astah

JUDE,Astah 随着UML的扩大,UML建模工具也越来越庞大。不过,许多功能并不是用户所寻求的。因此,Astah Professional (原名JUDE) 听取用户心声,根据用户需要打造,按照使用习惯设计,轻便简单,友好易用,用户可以轻松使用它来高速建模,极大的提高了效率。 Astah Professional 功能强大,支持 UML1.4中所有图和主要的图形,元模 (Meta Model) 及属性,全面满足您建模所需,还集成了思维导图,工程合并,协作开发等十余项特色功能,以及许多方便用户的贴心实用的功能。 Astah Professional 是100% 纯 Java 应用程序,可以跨平台在各种主流操作系统中使用。支持 OMG XMI标准格式,可以与其它建模工具交互模型。为方便用户书写 Office 文档,软件支持以 Microsoft EMF 增强图元拷贝粘贴至 Microsoft Office,也可以将模型信息导出到 Office Excel。软件提供了内容丰富的使用手册,全面查看 Astah Professional 所有的功能。

2012-11-09 · 1 min · 32 words · -