position,absolute、relative

‘position,absolute、relative’ position: absolute、relative CSS2.0 HandBook上的解释: 设置此属性值为 absolute 会将对象拖离出正常的文档流绝对定位而不考虑它周围内容的布局。假如其他具有不同 z-index 属性的对象已经占据了给定的位置,他们之间不会相互影响,而会在同一位置层叠。此时对象不具有外补丁( margin ),但仍有内补丁( padding )和边框( border )。 要激活对象的绝对(absolute)定位,必须指定 left , right , top , bottom 属性中的至少一个,并且设置此属性值为 absolute 。否则上述属性会使用他们的默认值 auto ,这将导致对象遵从正常的HTML布局规则,在前一个对象之后立即被呈递。 TRBL属性 (TOP、RIGHT、BOTTOM、LEFT) 只有当设定了position属性才有效。 当设定position:absolute 如果父级 (无限) 没有设定position属性,那么当前的absolute则结合TRBL属性以浏览器左上角为原始点进行定位 如果父级 (无限) 设定position属性,那么当前的absolute则结合TRBL属性以父级 (最近) 的左上角为原始点进行定位。 当设定position: relative 则参照父级 (最近) 的内容区的左上角为原始点结合TRBL属性进行定位 (或者说相对于被定位元素在父级内容区中的上一个元素进行偏移) ,无父级则以BODY的左上角为原始点。相对定位是不能层叠的。在使用相对定位时,无论元素是否进行移动,元素依然占据原来的空间。因此,移动元素会导致它覆盖其他框。 一般来讲,网页居中的话用Absolute就容易出错,因为网页一直是随着分辨率的大小自动适应的,而Absolute则会以浏览器的左上角为原始点,不会应为分辨率的变化而变化位置。有时还需要依靠z-index来设定容器的上下关系,数值越大越在最上面,数值范围是自然数。当然有一点要注意,父子关系是无法用z-index来设定上下关系的,一定是子级在上父级在下。 设置此属性值为 relative 会保持对象在正常的HTML流中,但是它的位置可以根据它的前一个对象进行偏移。在相对(relative)定位对象之后的文本或对象占有他们自己的空间而不会覆盖被定位对象的自然空间。与此不同的,在绝对(absolute)定位对象之后的文本或对象在被定位对象被拖离正常文档流之前会占有它的自然空间。放置绝对(absolute)定位对象在可视区域之外会导致滚动条出现。而放置相对(relative)定位对象在可视区域之外,滚动条不会出现。其实对于定位的主要问题是要记住每个定位的意义。相对定位是"相对于"元素在文档流中初始位置的,而绝对定位是"相对于"最近的已经定位的祖先元素

2011-09-07 · 1 min · 52 words · -

Resume, CV

Resume, CV 有的学校把简历叫做resume,另一些叫做Curriculum Vitae,这中间到底有什么差别呢?resume通常更接近求职简历,即把自己所有经历中与目标职位相关性最大的经历筛选出来,展示在自己的简历中;而CV呢,翻译成中文更确切的来讲叫做“个人履历”或“个人履历表”。单听这个名字我们就知道了,CV更多的是把自己过去所有的经历按照时间顺序逐条罗列,比较机械呆板,一般用于学术圈。但是,回到留学申请这个原本的话题上来,即便不同学校对于简历的称呼不同,我们也并不需要区别对待,也就是这个细微的差别,对于申请这件事来讲,可以忽略不计。简历要写什么内容?简历要有抬头,抬头要写姓名和联系方式,电话、邮箱、邮寄地址。简历主体部分要写教育背景、实习/科研/工作经历、项目经历、课外活动、奖项荣誉、专业技能、获得证书、语言能力等等。但并不是一份简历要把上面这些item都写全的。一是根据个人实际背景经历情况筛选,二是根据申请目标专业来具体分析。比方说我申请教育学,那么语言能力就显得尤为重要,但我申请计算机,显然更重要的是在专业技能这个item下展示自己掌握了哪些编程语言及计算机软件。 作者:杜建虎 链接:https://www.zhihu.com/question/20355548/answer/1883548833 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 CV是履历,Resume是简历。Resume,简述于求职相关的教育背景和工作经历,其目的在于说服用人单位雇用自己; CV,Curriculum Vitae CV是集中说明学术工作,不重视与文化程度和学习成绩无直接关系的资料。CV的完整形式是拉丁文Curriculum Vitae,在美国,CV主要是用于申请学术、教育、科研职位,或者申请奖学金等等,而在欧洲、中东、非洲和亚洲等地,CV则更常用于应征工作。CV的长度由其内容确定,有时可长达十页,年轻专业人的履历一般长度都在2—4页,而老资历的通常也在6—8页。应包括:姓名、地址、电话号码及电子邮件地址;文化程度;受何奖励和大学奖学金;教学经历相关经历;有何论著发表;语言或其它技能,课外活动及个人爱好。Resume,大多只需一页大小,而有两页的对具有广泛的工作经验的人才有典型性。应包括:姓名、地址、电子信箱 (可选)和电话号码 (当地和固定的);工作岗位 (可选) ;教育;获何荣誉奖励;有关功课 (可选);经历,列出组织、地址、日期、工作名称、成绩和职责简述。 作者:SongNannnnnn 链接:https://www.zhihu.com/question/20355548/answer/14871763 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 在99%的情况下,对方找你要CV和对方找你要Resume,他们想要的东西是一模一样的:你的简历。最好白纸黑字,最好一页纸,最好PDF。In 99% of the situations when someone says, “Can you send over your CV?" or “Can you send me your resume?” they mean the exact same thing. 作者:朱英楠David 链接:https://www.zhihu.com/question/20355548/answer/91783206 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2011-09-07 · 1 min · 53 words · -

Actor 模型, Actor model

Actor 模型, Actor model 使用actor就像租车——我们如果需要,可以快速便捷地租到一辆;如果车辆发生故障,也不需要自己修理,直接打电话给租车公司更换另外一辆即可。 摘录来自: [美] Paul Butcher. “七周七并发模型。” actor类似于面向对象 (OO)编程中的对象——其封装了状态,并通过消息与其他actor通信。 在面向对象中,我们使用方法调用的方式去传递信息,而在actor中,则使用发送消息去传递信息。 在actor模型中,actor是一个最小的计算单元。 虽然在actor中保留了可变状态,但是其并不和其他actor共享,actor的私有变量不会被其他actor直接更改。 actor模型中遵循以下几个原则: 所有的计算都是在actor中执行的 actor之间只能通过消息进行通信交流 为了响应消息,actor可以进行下列操作 更改状态或行为 发消息给其他actor 创建有限数量的子actor actor模型的好处 事件驱动模型 - actor使用异步消息的形式进行通信,在发消息后不会因等待回复而阻塞其他工作。 强隔离原则 - 和传统的java对象不同,actor不提供公共的api方法供外部调用。相反,其仅通过消息的形式对外提供服务。这样避免了actor之间的任何状态共享;获取一个actor状态的唯一做法就是发一个消息去询问他。 位置透明 - 系统使用工厂构建一个actor实例,并返回其引用。由于位置无关紧要,Actor实例可以启动,停止,移动和重启以进行扩容/缩容,或从意外故障中恢复。 轻量级 - 每个actor实例仅使用几百bytes,在单个应用程序中可以轻松创建百万个并发的actor。 任其崩溃 在传统的模型中,我们往往会尽可能的考虑到各种情况,对入参格式,类型做各种各样的校验,容错。这样混入了大量业务无关代码,使得代码流程变得复杂,而没有明显错误 actor模型中对异常的遵循为"任其崩溃"哲学。不做防御性逻辑,而是让actor的管理者去处理这些问题。 因为actor之间是相互独立的,所以一个actor的崩溃不太可能会影响到其他actor。 没有了防御性代码,使逻辑更加简洁且容易理解。 由actor管理者可以选择崩溃处理方案,也可以不处理,仅记录崩溃原因。 面对故障,actor管理者有四种不同的可选方案: 恢复 (Resume)子 Actor,保持其已有的内部状态,但是忽略掉导致故障的消息; 重启 (Restart)子 Actor,通过启动新的实例,清理其已有的状态; 永久停止 (Stop)子 Actor,将子 Actor 未来所有的消息发送至 Dead-Letter Office ; 将故障传递至更高的层级 (Escalate),这需要让监管者本身也发生故障。 作者:一缕阳光同志88274 链接:https://juejin.cn/post/6844904056649940999 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 作者:一缕阳光同志88274 链接:https://juejin.cn/post/6844904056649940999 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 作者:一缕阳光同志88274 链接:https://juejin.cn/post/6844904056649940999 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 ...

2011-09-06 · 2 min · 361 words · -

zoom

zoom Zoom国际版 Zoom国际版,顾名思义,全球使用,支持15个数据中心相互通信。 Zoom国际版启动的数据中心在美国,中国用户无法安排 (发起)会议。 会议的发起者即便是在海外,没有选择中国数据中心 (非默认选项),那么国内的参会者将无法加入到会议中,一般显示错误代码1044,,或是102005、104101、104118、103011等。 国内客户只能使用vpn,否则将无法参会。 Zoom中国版 (国内版) 直联电信、移动、联通三大运营商的主干网,并由阿里云、百度云、华为云、腾讯云这四家云服务商提供数据加密和网关安全等服务。 非法的Zoom开发版 (第三方) http://www.zoom-chn.com/index.php/fuwuxiangmu/21.html

2011-09-06 · 1 min · 14 words · -

junit performance test

junit performance test http://databene.org/contiperf.html @Rule public ContiPerfRule i = new ContiPerfRule(); @Test @PerfTest(invocations = 5) @Required(max = 9000, average = 8000) invocation sequence: constructor() before() test1() test1() after() constructor() before() test2() test2() after()

2011-09-06 · 1 min · 33 words · -

java 日期/date time

java 日期/date time 日期计算 Calendar cal = Calendar.getInstance();//使用默认时区和语言环境获得一个日历。 cal.add(Calendar.DAY_OF_MONTH, -1);//取当前日期的前一天. cal.add(Calendar.DAY_OF_MONTH, +1);//取当前日期的后一天. //通过格式化输出日期 java.text.SimpleDateFormat format = new java.text.SimpleDateFormat(“yyyy-MM-dd”); System.out.println(“Today is:"+format.format(Calendar.getInstance().getTime())); System.out.println(“yesterday is:"+format.format(cal.getTime())); 得到2007-12-25日期: y 年 Year 1996; 96 M 年中的月份 Month July; Jul; 07 d 月份中的天数 Number 10 H 一天中的小时数 (0-23) Number 0 m 小时中的分钟数 Number 30 s 分钟中的秒数 Number 55 S 毫秒数 Number 978 java 8 日期/date time http://www.wiloon.com/?p=8834&embed=true#?secret=RA1Eqnm13T joda-time, ThreeTen Backport http://www.wiloon.com/?p=3269&embed=true#?secret=qXtE3cmQSt SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss.SSS”); ...

2011-09-06 · 2 min · 235 words · -

java zip

java zip package com.wiloon.et; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class ZipTest { static final int BUFFER = 2048; static String source = “D:/exported/”; static String destinationPath = “//x.x.x.x/share/xxx/”; static String fileName = “0000-0999.zip”; public static void main(String argv[]) { try { BufferedInputStream origin = null; FileOutputStream dest = new FileOutputStream(destinationPath fileName); ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream( dest)); byte data[] = new byte[BUFFER]; ...

2011-09-06 · 1 min · 141 words · -

loom

loom Oracle 已经停止了异步的JDBC (ADBA) 标准的相关工作。这传达了一个相当明确而又重要的信息: (在Java平台上)fiber 是未来的方向,而异步不是。Oracle 认为异步程序太难写难调,因此全力转向同步的方案 ( 注意这个帖子混用了 fiber 和 lightweight thread 这两个术语,后面的Ron用的术语是 lightweight virtual thread ) On Wednesday, September 18, at Oracle CodeOne Oracle announced that Oracle will stop work on ADBA (Asynchronous Database Access) The Java team’s position is that synchronous code is easier to write, test, debug, maintain, and understand than async code. The only reason to write async code is that threads are so expensive. Project Loom will add fibers, very lightweight threads, to Java. Fibers are so light weight that it is completely practical to spin up as many as you need. So just write first semester CS synchronous code and and execute it on a dedicated fiber. This is much easier than writing async code to do the same task. Synchronous code will use the same JDBC we all know and love. No need to learn a new API. Existing code can be made to work with few if any changes. ...

2011-09-04 · 1 min · 186 words · -

jdk中的jar包, rt.jar ,dt.jar ,tool.jar

jdk中的jar包, rt.jar ,dt.jar ,tool.jar 重点包 rt.jar : 运行时包 dt.jar: dt.jar是关于运行环境的类库 tools.jar: tools.jar是工具类库,编译和运行需要的都是toos.jar里面的类分别是sun.tools.java. ; sun.tols.javac.; charsets.jar: Java 字符集,这个类库中包含 Java 所有支持字符集的字符 cldrdata.jar: http://cldr.unicode.org/ CLDR - Unicode Common Locale Data Repository deploy.jar: deploy.jar是Java部署堆栈的一部分,用于applet和Webstart应用程序。 deploy.jar是Java安装目录的常见部分 - 该文件运行某些产品的安装。 正确设置Java路径后,用户可以执行此文件 (只需双击它或按文件上的Enter键) ,要部署的应用程序将运行其安装程序。 例如。 诺基亚OVI套件通常使用这种部署形式。 作为彼此的JAVA包,如果您将其重命名为ZIP并打开内容,则可以检查包中的类。 dnsns.jar:与 DNS 有关 jaccess.jar: Java Access Bridge is a technology that exposes the Java Accessibility API in a Microsoft Windows DLL, enabling Java applications and applets that implement the Java Accessibility API to be visible to assistive technologies on Microsoft Windows systems. Java Accessibility API is part of Java Accessibility Utilities, which is a set of utility classes that help assistive technologies provide access to GUI toolkits that implement the Java Accessibility API. Java Access Bridge是一种在Microsoft Windows DLL中公开Java Accessibility API的技术,使实现Java Accessibility API的Java应用程序和applet对Microsoft Windows系统上的辅助技术可见。 Java Accessibility API是Java Accessibility Utilities的一部分,它是一组实用程序类,可帮助辅助技术提供对实现Java Accessibility API的GUI工具包的访问。 ...

2011-08-30 · 3 min · 516 words · -

tar

tar tar tar [-cxtzjvfpPN] 文件与目录 …. 参数: -z : 是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩? -x : 解开一个压缩文件的参数指令! -v : 压缩的过程中显示文件!这个常用,但不建议用在背景执行过程! -f : 使用档名,请留意,在 f 之后要立即接档名喔!不要再加参数! 例如使用『 tar -zcvfP tfile sfile』就是错误的写法,要写成 『 tar -zcvPf tfile sfile』才对喔! -c : 建立一个压缩文件的参数指令(create 的意思); -t : 查看 tarfile 里面的文件! 特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在! 因为不可能同时压缩与解压缩。 -j : 是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩? -p : 使用原文件的原来属性 (属性不会依据使用者而变) -P : 可以使用绝对路径来压缩! -N : 比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的文件中! -exclude FILE: 在压缩的过程中,不要将 FILE 打包! ...

2011-08-30 · 2 min · 273 words · -

加减乘除,大于,小于,等于,分数,小数和百分数英文表达

加减乘除,大于,小于,等于,分数,小数和百分数英文表达 add (+), subtract (-), multiply (*), and divide (/) 加减乘除: + - × ÷ 加+: plus 减-: minus 乘×: times 除÷: divided 不等号和等号: > ≥ < ≤ ≠ = 大于>: is greater than 大于等于 (不小于) ≥: is more than or equal to / is no less than 小于<: is less than 小于等于 (不大于) ≤: is less than or equal to / is no more than 不等于≠: is not equal to 等于=: equals 例句: 1、12+36=48: Twelve plus thirty-six is forty-eight. 2、10-4=6: Ten minus four is six. / Ten minus four equals four. 3、5×5=25: Five times five is twenty-five. 4、20÷4=5: Twenty divided by four is five. 5、5>1: Five is greater than one. ...

2011-08-29 · 1 min · 206 words · -

log4e

log4e Log4e是一个免费的Eclipse Plugin,它可帮助你在你的Java工程中快速加入Log; 我们可以在http://log4e.jayefem.de/index.php/Download 网站上下载Log4e最新版本。下载后将相应文件夹拷贝到Eclipse的插件目录下,重新Eclipse,在首选项中会多出一个Log4e选项。 go to http://log4e.jayefem.de/ Eclipse Update URL: http://log4e.jayefem.de/update

2011-08-29 · 1 min · 12 words · -

RxJava

RxJava Reactive Extension (RX) RX在Future和Promise的基础上更进了一步,将单一的事件处理扩展到多个先后相关的事件流处理。举个例子,鼠标拖拽事件,是由一个MouseDown事件加多个MouseMove事件以及一个MouseUp事件构成,Promise处理这种情况需要处理器具有状态记住拖拽的阶段。RX将MouseDown和MouseUp这些事件的处理标准化,并且将拖拽阶段的这一共享状态从业务处理器中抽离,而固化到事件处理流程中。RX抽象了大量的事件操作,使得我们可以将重心放到事件流程建模中,而不是具体的一个接一个事件的处理。共享状态从处理器中抽离也有利于业务处理器的重用以及并发处理。 综上,响应式编程中的事件驱动,要求 对事件建模 对事件流程建模 对事件相关性建模 在那个RxJava刚刚火爆的年代,那是一个荒蛮的年代。我们在异步方面资源匮乏,手头仅有ThreadPool,AsyncTask和Handler这些基础封装的异步库。所以当我们看见RxJava这个新奇的小玩意,当我们看到异步还可以这么简单,轻而易举的解决Concurrency问题。我们当然如获至宝。 而我们现在选择就更多了,无论是Java 8本身提供的CompletableFuture。还是后起之秀Kotlin上的Coroutine,还有Android 上官方提供的LiveData 作者:W_BinaryTree 链接:https://juejin.cn/post/6844903838978146317 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 RxJava 在 GitHub 主页上的自我介绍是 “a library for composing asynchronous and event-based programs using observable sequences for the Java VM” (一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库) ReactiveX是Reactive Extensions的缩写,一般简写为Rx,最初是LINQ的一个扩展,由微软的架构师Erik Meijer领导的团队开发,在2012年11月开源,Rx是一个编程模型,目标是提供一致的编程接口,帮助开发者更方便的处理异步数据流,Rx库支持.NET、JavaScript和C++,Rx近几年越来越流行了,现在已经支持几乎全部的流行编程语言了,Rx的大部分语言库由ReactiveX这个组织负责维护,比较流行的有RxJava/RxJS/Rx.NET,社区网站是 reactivex.io。 Netflix参考微软的Reactive Extensions创建了Java的实现RxJava,主要是为了简化服务器端的并发。2013年二月份,Ben Christensen 和 Jafar Husain发在Netflix技术博客的一篇文章第一次向世界展示了RxJava。 RxJava也在Android开发中得到广泛的应用。 ReactiveX An API for asynchronous programming with observable streams. A combination of the best ideas from the Observer pattern, the Iterator pattern, and functional programming. ...

2011-08-29 · 1 min · 80 words · -

命令模式, Command pattern

命令模式, Command pattern 命令模式, Command pattern , 行动(Action)模式或者交易(Transaction)模式 定义 命令模式属于对象的行为模式。命令模式又称为行动(Action)模式或者交易(Transaction)模式。 命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。 命令模式的结构 命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分隔开,委派给不同的对象。 每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方接收到请求,并执行操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收、以及操作是否被执行、何时被执行、怎么被执行的。 命令允许请求的一方和接收请求的一方能够独立演化,从而具有如下的优点: 命令模式使新的命令很容易被加入到系统里。 允许接受请求的一方决定是否要否决请求。 能较容易的设计一个命令队列。 可以容易的实现对请求的撤销和恢复。 在需要的情况下,可以较容易的将命令记入日志。 下面是一个示意性的系统,说明命令模式的结构: 示意性命令模式结构 命令模式涉及到五个角色,他们分别是: 客户端角色(Client):创建一个具体命令ConcreteCommand对象并确定其接收者。 命令角色(Command): 声明一个给所有具体命令类的抽象接口。 具体命令角色(ConcreteCommand):定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法。 请求者角色(Invoker):负责调用命令对象执行请求,相关的方法叫做行动方法。 接收者角色(Receiver):负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。 命令模式的优点 更松散的耦合 命令模式是的发起命令的对象——客户端,和具体实现命令的对象——接收者对象完全解耦,也就是说发起命令的对象完全不知道具体实现对象是谁,也不知道如何实现。 更动态的控制 命令模式把请求封装起来,可以动态的对它进行参数化、队列化和日志化等操作,从而使得系统更灵活。 很自然的复合命令 命令模式中的命令对象能够很容易的组合成复合命令,也就是宏命令,从而是系统操作更简单,功能更强大。 更好的拓展性 由于发起命令的对象和具体的实现完全解耦,因此拓展新的命令就很容易,只需要实现新的命令对象,然后在装配的时候,把具体的实现对象设置到命令对象中,然后就可以使用这个命令对象,已有的实现完全不用变化。 作者:步积 链接:https://www.jianshu.com/p/5901e76a6348 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 https://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/command.html

2011-08-29 · 1 min · 43 words · -

函数式编程, Functional Programming

函数式编程, Functional Programming 函数式编程已经存在了很长了时间,早在50年代 Lisp 编程语言的介绍中就有提过。如果你有关注近两年里内热门的 Clojure,Scala,Erlang,Haskell,Elixir 等语言的话,其中都有函数式编程的概念。 函数式编程的简要历史 正如我们所说的,早在50年代函数式编程开始之前,Lisp 语言就已经在 IBM 700/7000 系列的科学计算机上运行了。Lisp 引入了很多与我们现在的函数式编程有关的示例与功能,我们甚至可以称 Lisp 是所有函数式编程语言的鼻祖。 这也是函数式编程中最有趣的方面,所有函数式编程语言都是基于相同的 λ演算,这种简单数学基础。 λ演算是图灵完备的,它是一种通用的计算模型,可用于模拟任何一台单带图灵机。它名字中的希腊字母 lambda (λ),被使用在了 lambda 表达式和 lambda 项绑定函数中的变量中。 λ演算是一个极其简单但又十分强大的概念。它的核心主要有两个概念: 函数的抽象,通过引入变量来归纳得出表达式; 函数的应用,通过给变量赋值来对已得出的表达式进行计算; 什么是函数式编程 什么是函数式编程?它是一种编程范式,即一切都是数学函数。函数式编程语言里也可以有对象,但通常这些对象都是恒定不变的 —— 要么是函数参数,要什么是函数返回值。函数式编程语言里没有 for/next 循环,因为这些逻辑意味着有状态的改变。相替代的是,这种循环逻辑在函数式编程语言里是通过递归、把函数当成参数传递的方式实现的。 函数式编程单看上面的理论无疑是无法理解的,所以,需要通过它的一些特点来感受什么是函数式编程 函数是"第一等公民" 所谓"第一等公民" (first class),指的是函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。 举例来说,下面代码中的print变量就是一个函数,可以作为另一个函数的参数。 只用"表达式",不用"语句" “表达式” (expression)是一个单纯的运算过程,总是有返回值;“语句” (statement)是执行某种操作,没有返回值。函数式编程要求,只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。 原因是函数式编程的开发动机,一开始就是为了处理运算 (computation),不考虑系统的读写 (I/O)。“语句"属于对系统的读写操作,所以就被排斥在外。 当然,实际应用中,不做I/O是不可能的。因此,编程过程中,函数式编程只要求把I/O限制到最小,不要有不必要的读写行为,保持计算过程的单纯性。 没有"副作用” 所谓"副作用" (side effect),指的是函数内部与外部互动 (最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。 函数式编程强调没有"副作用",意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值. 不修改状态 上一点已经提到,函数式编程只是返回新的值,不修改系统变量。因此,不修改变量,也是它的一个重要特点。 在其他类型的语言中,变量往往用来保存"状态" (state)。不修改变量,意味着状态不能保存在变量中。函数式编程使用参数保存状态,最好的例子就是递归。 引用透明 引用透明 (Referential transparency),指的是函数的运行不依赖于外部变量或"状态",只依赖于输入的参数,任何时候只要参数相同,引用函数所得到的返回值总是相同的。 OO (object oriented,面向对象)是抽象数据,FP (functional programming,函数式编程)是抽象行为。 在java中,函数式编程是通过lambda表达式实现的。 lambada表达式 基本表达形式如下: ...

2011-08-28 · 1 min · 110 words · -

javadoc

javadoc eclipse 在项目列表中按右键,选择Export (导出) ,然后在Export(导出)对话框中选择java下的javadoc. Java8下 忽略Javadoc编译错误 org.apache.maven.plugins maven-javadoc-plugin 2.10.3 attach-javadocs jar -Xdoclint:none http://www.javajia.com/JAVAbiancheng/7713.html

2011-08-28 · 1 min · 14 words · -

buddyinfo, slabinfo, zoneinfo

buddyinfo, slabinfo, zoneinfo /proc/buddyinfo是linuxbuddy系统管理物理内存的debug信息。 在linux中使用buddy算法解决物理内存的外碎片问题,其把所有空闲的内存,以2的幂次方的形式,分成11个块链表,分别对应为1、2、4、8、16、32、64、128、256、512、1024个页块。 而Linux支持NUMA技术,对于NUMA设备,NUMA系统的结点通常是由一组CPU和本地内存组成,每一个节点都有相应的本地内存,因此buddyinfo 中的Node0表示节点ID;而每一个节点下的内存设备,又可以划分为多个内存区域(zone),因此下面的显示中,对于Node0的内存,又划分类DMA、Normal、HighMem区域。而后面则是表示空闲的区域。 此处以Normal区域进行分析,第二列值为100,表示当前系统中normal区域,可用的连续两页的内存大小为1002PAGE_SIZE;第三列值为52,表示当前系统中normal区域,可用的连续四页的内存大小为522^2PAGE_SIZE cat /proc/buddyinfo Node 0, zone DMA 23 15 4 5 2 3 3 2 3 1 0 Node 0, zone Normal 149 100 52 33 23 5 32 8 12 2 59 Node 0, zone HighMem 11 21 23 49 29 15 8 16 12 2 142 文件/proc/slabinfo统计slab分配器相关信息 % cat /proc/slabinfo https://zhuanlan.zhihu.com/p/358891862 slab 分配器 在Linux中,伙伴分配器(buddy allocator)是以页为单位管理和分配内存。 但在内核中的需求却以字节为单位(在内核中面临频繁的结构体内存分配问题)。 假如我们需要动态申请一个内核结构体(占 20 字节), 若仍然分配一页内存,这将严重浪费内存。那么该如何分配呢? slab 分配器专为小内存分配而生, 由 Sun 公司的一个雇员 Jeff Bonwick 在 Solaris 2.4中 设计并实现。slab 分配器分配内存以字节为单位, 基于伙伴分配器的大内存进一步细分成小内存分配。换句话说,slab 分配器仍然从 Buddy 分配器中申请内存,之后自己对申请来的内存细分管理。 ...

2011-08-28 · 1 min · 113 words · -

迭代器模式, Iterator

迭代器模式, Iterator 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。把游走的任务放在迭代器上,而不是聚合上。这样简化了聚合的接口和实现,也让责任各得其所。 @startuml abstract class Aggregate Aggregate : public abstract Iterator createIterator() class ConcreteAggregate ConcreteAggregate : Object[] objArray ConcreteAggregate : public ConcreteAggregate(Object[] objArray) ConcreteAggregate : public Iterator createIterator() ConcreteAggregate : public Object getElement(int index) ConcreteAggregate : public int size() Aggregate<|--ConcreteAggregate interface Iterator Iterator : public void first() Iterator : public void next() Iterator : public boolean isDone() Iterator : public Object currentItem() class ConcreteIterator ConcreteIterator : private ConcreteAggregate agg ConcreteIterator : private int index ConcreteIterator : private int size ConcreteIterator : public ConcreteIterator(ConcreteAggregate agg) ConcreteIterator : public void first() ConcreteIterator : public void next() ConcreteIterator : public boolean isDone() ConcreteIterator : public Object currentItem() Iterator<|--ConcreteIterator ConcreteAggregate .right.> ConcreteIterator ConcreteIterator-left->ConcreteAggregate class Client Client .left.> Aggregate Client .right.> Iterator @enduml 迭代器模式涉及到以下几个角色: ...

2011-08-27 · 2 min · 425 words · -

mplayer

mplayer 基本播放控制 → 前进10秒 ← 后退10秒 ↑ 前进60秒 ↓ 后退60秒 PageUP 前进10分钟 PageDown 后退10分钟 Enter 全屏 Space 暂停 Esc 退出 q 退出 音量调节 9 降低音量 0 增大音量 / 降低音量 * 增大音量 a 切换声道 mplayer command monitoraspect mplayer -monitoraspect 1.25 6.rmvb 全屏 mplayer -aspect 16:9 -fs debian 6 smplayer 声音小 Options > preferences > audio > output driver select “alsa” http://www.wiloon.com/?p=2850 smplayer 中文字幕 option > preference > subtitles > encoding select utf8 ...

2011-08-27 · 1 min · 84 words · -

Yasm

Yasm Yasm是一个完全重写的NASM汇编。目前,它支持x86和AMD64指令集,接受NASM和气体汇编语法,产出二进制, ELF32 , ELF64 , COFF , Mach - O的 ( 32和64 ) , RDOFF2 ,的Win32和Win64对象的格式,并生成STABS 调试信息的来源,DWARF 2 ,CodeView 8格式。

2011-08-27 · 1 min · 21 words · -