Java RandomAccessFile, MappedByteBuffer, mmap

Java RandomAccessFile, MappedByteBuffer, mmap RandomAccessFile RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用 seek() 方法来访问记录,并进行读写了。这些记录的大小不必相同;但是其大小和位置必须是可知的。但是该类仅限于操作文件。 RandomAccessFile不属于InputStream和OutputStream类系的。实际上,除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系毫不相干,甚至不使用InputStream和OutputStream类中已经存在的任何功能;它是一个完全独立的类,所有方法(绝大多数都只属于它自己)都是从零开始写的。这可能是因为RandomAccessFile能在文件里面前后移动,所以它的行为与其它的I/O类有些根本性的不同。总而言之,它是一个直接继承Object的,独立的类。 基本上,RandomAccessFile的工作方式是,把DataInputStream和DataOutputStream结合起来,再加上它自己的一些方法,比如定位用的getFilePointer( ),在文件里移动用的seek( ),以及判断文件大小的length( )、skipBytes()跳过多少字节数。此外,它的构造函数还要一个表示以只读方式(“r”),还是以读写方式(“rw”)打开文件的参数 (和C的fopen( )一模一样)。它不支持只写文件。 只有RandomAccessFile才有seek搜寻方法,而这个方法也只适用于文件。BufferedInputStream有一个mark( )方法,你可以用它来设定标记(把结果保存在一个内部变量里),然后再调用reset( )返回这个位置,但是它的功能太弱了,而且也不怎么实用。 RandomAccessFile的绝大多数功能,但不是全部,已经被JDK 1.4的nio的"内存映射文件(memory-mapped files)“给取代了,你该考虑一下是不是用"内存映射文件"来代替RandomAccessFile了。 import java.io.IOException; import java.io.RandomAccessFile; public class TestRandomAccessFile { public static void main(String[] args) throws IOException { RandomAccessFile rf = new RandomAccessFile(“rtest.dat”, “rw”); for (int i = 0; i < 10; i++) { //写入基本类型double数据 rf.writeDouble(i * 1.414); } rf.close(); rf = new RandomAccessFile(“rtest.dat”, “rw”); //直接将文件指针移到第5个double数据后面 rf.seek(5 * 8); //覆盖第6个double数据 rf.writeDouble(47.0001); rf.close(); rf = new RandomAccessFile(“rtest.dat”, “r”); ...

2014-11-12 · 3 min · 520 words · -

spring @value

spring @value 在spring 3.0中,可以通过使用@value,对一些如xxx.properties文件 中的文件,进行键值对的注入,例子如下: 1 首先在applicationContext.xml中加入: <beans xmlns:util=“http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd>” 的命名空间,然后 <util:properties id=“settings” location=“WEB-INF/classes/META-INF/spring/test.properties” /> 3 创建test.properties abc=123 import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @RequestMapping("/admin/images") @Controller public class ImageAdminController { private String imageDir; @Value("#{settings[’test.abc’]}") public void setImageDir(String val) { this.imageDir = val; } } 这样就将test.abc的值注入了imageDir中了

2014-11-07 · 1 min · 46 words · -

spring quartz

spring quartz http://www.oschina.net/question/8676_9032 <ref bean="testTrigger"/> </list> </property> <property name="autoStartup" value="true"/> 说明: Scheduler包含一个Trigger列表,每个Trigger表示一个作业。 2、Trigger的配置 说明: Cron表达式的格式: 秒 分 时 日 月 周 年(可选)。 字段名 允许的值 允许的特殊字符 秒 0-59 , - * / 分 0-59 , - * / 小时 0-23 , - * / 日 1-31 , - * ? / L W C 月 1-12 or JAN-DEC , - * / ...

2014-11-07 · 1 min · 183 words · -

semaphore/信号量, mutex/互斥锁

信号量 Semaphore 信号量是 Edsger Dijkstra 发明的数据结构,在解决多种同步问题时很有用。其本质是一个整数,并关联两个操作: 申请 acquire(也称为 wait、decrement 或 P 操作) 释放 release(也称 signal、increment 或 V 操作) acquire操作将信号量减 1,如果结果值为负则线程阻塞,且直到其他线程进行了信号量累加为正数才能恢复。如结果为正数,线程则继续执行。 release操作将信号量加 1,如存在被阻塞的线程,此时他们中的一个线程将解除阻塞。 Go 运行时提供的 runtime_SemacquireMutex 和runtime_Semrelease 函数可用来实现sync.RWMutex互斥锁。 semaphore/信号量, mutex/互斥锁 Mutex 是一把钥匙,一个人拿了就可进入一个房间,出来的时候把钥匙交给队列的第一个。一般的用法是用于串行化对 critical section 代码的访问,保证这段代码不会被并行的运行。 Semaphore/信号量 是一件可以容纳 N 人的房间,如果人不满就可以进去,如果人满了, 就要等待有人出来. 对于N=1的情况,称为binary semaphore。一般的用法是,用于限制对于某一资源的同时访问。 Binary semaphore 与 Mutex 的差异 在 有的系统中 Binary semaphore 与 Mutex 是没有差异的。在有的系统上,主要的差异是mutex一定要由获得锁的进程来释放。而semaphore可以由其它进程释放 (这时的semaphore实际就是个原子的变量,大家可以加或减) ,因此semaphore可以用于进程间同步。Semaphore的同步功能是所有系统都支持的,而Mutex能否由其他进程释放则未定,因此建议mutex只用于保护critical section。而semaphore则用于保护某变量,或者同步。 关于semaphore和mutex的区别,网上有著名的厕所理论 (http://koti.mbnet.fi/niclasw/MutexSemaphore.html) : Mutex Mutex 的发音是 /mjuteks/ ,其含义为互斥(体),这个词是Mutual Exclude的缩写。 Is a key to a toilet. One person can have the key - occupy the toilet - at the time. When finished, the person gives (frees) the key to the next person in the queue. Officially: “Mutexes are typically used to serialise access to a section of re-entrant code that cannot be executed concurrently by more than one thread. A mutex object only allows one thread into a controlled section, forcing other threads which attempt to gain access to that section to wait until the first thread has exited from that section.” Ref: Symbian Developer Library(A mutex is really a semaphore with value 1.) ...

2014-10-31 · 5 min · 869 words · -

apktool APK解压、打包

apktool APK解压、打包 keytool -genkey -alias JFrench.keystore -keyalg RSA -validity 1000000 -keystore JFrench.keystore jarsigner -verbose -keystore E:\projects\keystore\JFrench.keystore -s ignedjar JFrench_signed.apk foo.apk JFrench.keystore http://showlike.iteye.com/blog/1686103 http://blog.csdn.net/jesusjzp/article/details/7922451 apktool之APK解压、打包 http://blog.csdn.net/caszhao/article/details/6030425 博客分类: java apktoolandroidjava 简介: Android apktool是一个用来处理APK文件的工具,可以对APK进行反编译生成程序的源代码和图片、XML配置、语言资源等文件,也可以添加新的功能到APK文件中。用该工具来汉化Android软件然后重新打包发布是相当简单的。 安装 .首先安装需要JAVA环境,先下载JDK/JRE,点击下载,已经有JAVA环境的可跳过此步 .到code.google上下载apktool.jar以及相关文件: http://code.google.com/p/android-apktool/downloads/list 点击下载apktool1.4.3.tar.bz2 和 apktool-install-windows-r04-brut1.tar.bz2 .解压apktool-install-windows-r04-brut1.tar.bz2到任意文件夹,然后解压apktool1.4.3.tar.bz2,把apktool.jar拷贝至apktool-install-windows-r04-brut1.tar.bz2解压所在的文件夹下,此时文件下有aapt.exe、apktool.bat及apktool.jar三个应用。 .点击开始菜单,运行,输入CMD回车,用cd命令转到刚刚解压的D:\My Documents\Desktop\apktool-install-windows-r04-brut1所在的文件夹,输入apktool,出现如下命令即说明安装成功 (以下信息,即apktool使用命令) 。 D:\My Documents\Desktop\apktool-install-windows-r04-brut1>apktool Java代码 收藏代码 Apktool v1.4.3 - a tool for reengineering Android apk files Copyright 2010 Ryszard Wi?niewski brut.alll@gmail.com Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0) Usage: apktool [-q|-quiet OR -v|-verbose] COMMAND [...] ...

2014-09-24 · 2 min · 322 words · -

BSc, BA

BSc, BA BA,全称:Bachelor of Arts,文学学士 BSc,全称:Bachelor of Science,理学学士 MA,全称:Master of Arts, 文学硕士 MBA,全称:Master of Business Administration,工商管理硕士 PhD,全称:Doctor of Philosophy, abbreviated as PhD, Ph.D., D.Phil., or DPhil,博士学位 中心思想就是:Doctor of Philosophy 的叫法源自传统,因为古代欧洲除了神学、法律和医学以外的其他学科都被称为哲学。所以,(据我所知),目前大学和研究机构会颁发的博士学位除了哲学博士以外,还有法学博士(Doctor of Laws)和医学博士(Doctor of Medicine)。顺便摘一段,哲学是什么?(依旧维基)哲学是对普遍而基本的问题的研究,这些问题多与实在、存在、知识、价值、理性、心灵、语言、思想等有关。哲学与其他学科的不同之处在于其批判的方式、通常是系统化的方法,并且以理性论证为基础。 作者:董羽流 链接:https://www.zhihu.com/question/26035428/answer/31879134 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 https://matt.might.net/articles/phd-school-in-pictures/

2014-09-05 · 1 min · 39 words · -

which, command, type

which, command, type 避免使用which, 用shell内置的 command -v, hash, type替代 command -v 相当于 type type type是bash内置命令,语法: type [-afptP] [name ...] type工具用于显示命令的类型信息。它将展示在命令行上输入给定的命令将如何解释。 通过type 命令可以查看命令类型: type echo # echo is a shell builtin which http://www.cnblogs.com/peida/archive/2012/11/08/2759805.html 我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索: which 查看可执行文件的位置。 whereis 查看文件的位置。 locate 配合数据库查看文件位置。 find 实际搜寻硬盘查询文件名称。 which命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。 1.命令格式: which 可执行文件名称 2.命令功能: which指令会在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。 3.命令参数: -n 指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名。 -p 与-n参数相同,但此处的包括了文件的路径。 -w 指定输出时栏位的宽度。 -V 显示版本信息 4.使用实例: 实例1: 查找文件、显示命令路径 命令: which lsmod 输出: [root@localhost ~]# which pwd /bin/pwd [root@localhost ~]# which adduser ...

2014-09-04 · 1 min · 134 words · -

java openjdk JMH

java openjdk JMH create test project with maven mvn archetype:generate \ -DinteractiveMode=false \ -DarchetypeGroupId=org.openjdk.jmh \ -DarchetypeArtifactId=jmh-java-benchmark-archetype \ -DgroupId=org.sample \ -DartifactId=test \ -Dversion=1.0 JMH 是一个由 OpenJDK/Oracle 里面那群开发了 Java 编译器的大牛们所开发的 Micro Benchmark Framework 。何谓 Micro Benchmark 呢?简单地说就是在 method 层面上的 benchmark,精度可以精确到微秒级。可以看出 JMH 主要使用在当你已经找出了热点函数,而需要对热点函数进行进一步的优化时,就可以使用 JMH 对优化的效果进行定量的分析。 比较典型的使用场景还有: 想定量地知道某个函数需要执行多长时间,以及执行时间和输入 n 的相关性 一个函数有两种不同实现 (例如实现 A 使用了 FixedThreadPool,实现 B 使用了 ForkJoinPool) ,不知道哪种实现性能更好 尽管 JMH 是一个相当不错的 Micro Benchmark Framework,但很无奈的是网上能够找到的文档比较少,而官方也没有提供比较详细的文档,对使用造成了一定的障碍。但是有个好消息是官方的 Code Sample 写得非常浅显易懂,推荐在需要详细了解 JMH 的用法时可以通读一遍——本文则会介绍 JMH 最典型的用法和部分常用选项。 第一个例子 如果你使用 maven 来管理你的 Java 项目的话,引入 JMH 是一件很简单的事情——只需要在 pom.xml 里增加 JMH 的依赖即可 <jmh.version>1.14.1</jmh.version> ...

2014-09-03 · 5 min · 866 words · -

startActivityForResult()

startActivityForResult() 举例说我想要做的一个事情是,在一个主界面(主Activity)上能连接往许多不同子功能模块(子Activity上去),当子模块的事情做完之后就回到主界面,或许还同时返回一些子模块完成的数据交给主Activity处理。 目的: A.java 是主界面,B.java 是子功能模块,要从A启动B,B干完活之后把结果汇报给A 先看 A.java 的相关代码 //- A.java -// /* 要做两件事情,第一是用 startActivityForResult() 启动B,其次是回收B的结果 */ //启动B Intent bintent = new Intent(A.this, B.class); //设置 bintent的Bundle的一个值 String bsay = “Hello, this is B speaking”; bintent.putExtra(“listenB”, bsay) startActivityForResult(bintent,0); // 参数(Intent intent, Int requestCode) 的 requestCode 对应下面回收Bundle时识别用的 //重写onActivityResult()来处理返回的数据,建议先看B.java 的代码再回来看这里比较好理解 //这理有三个参数 requestCode, resultCode, data protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (resultCode) { //resultCode为回传的标记,我在B中回传的是RESULT_OK case RESULT_OK: Bundle b=data.getExtras(); //data为B中回传的Intent String str=b.getString(“ListenB”);//str即为回传的值"Hello, this is B speaking" ...

2014-08-26 · 1 min · 142 words · -

javascript unit test

javascript unit test http://blog.sina.com.cn/s/blog_6768f2290100ubw5.html 最近由于工作和个人兴趣的关系,有幸研究了一下javascript的unit test,市面上常见且比较易用的javascript的unit test的framework有三个: jsunit, qunit和yuitest,虽然出处不同,但是本质上,使用方法都大同小异。 jsunit: http://www.jsunit.net/ 最早开发自2001年,是第一个实用的javascript的unit test framework (那时候TDD还远未流行) ,其完全遵循junit的xunit pattern, 有setup, teardown, 有testsuit概念,还有若干种assert方法,不过因为其诞生早,对非同步的ajax测试支持不够,因而有市场占有率渐低的趋势。 qunit: http://docs.jquery.com/Qunit 个人极其欣赏的一个framework,隶属于大名鼎鼎的jquery,但是又无需依赖于jquery的库可单独运行, 方法轻量易学,且具有异步测试的功能。可惜在公司没有被官方支持,只能自己玩。 yui test: http://developer.yahoo.com/yui/yuitest/ 著名的yahoo web js toolkit library中的ut子项目,使用方法和qunit极其相似,也具有异步测试功能,在本人公司被官方支持,最大的缺点是使用时要调用其他诸多的yui模块用来显示结果,不够独立。 以下以qunit为例子,介绍这些unit test framework的使用方法: 1 ) 下载qunit的测试驱动程序js文件和对应显示结果用的css文件 (分别为qunit.js 和qunit.css ) 2 ) 将这两个文件保存在某个目录,并在同一目录建立一个简单的html文件,包含该两个文件以及jquery.js 3 ) 将我们需要测试的js代码的文件也包含入该简单html中(该例中为mycode.js)。 4 ) 将我们要测试的js代码的依赖库也加入该html中(如ExtJS或者其他库) 5 ) 在html中添加script的测试代码 (test suit和assert部分) 6 ) 在浏览器中载入该html文件,页面会自动显示运行结果。 值得一提的是,网上有qunit-CLI的项目,其用rhino解释器来代替浏览器做unit test js的运行环境,提高了测试的效率,有兴趣的朋友可以去google搜索看看。 代码如下: mycode.js function (a, b) { return a + b; } test.html <!- js to be tested -> ...

2014-08-25 · 1 min · 92 words · -

原子操作

原子操作 CAS(Compare And Swap/Set) Fetch And Add Test And Set 原子操作-无锁多线程编程 翻译:Xiaobo 原文链接: Lock-free multithreading with atomic operations 推荐:之前读《程序员的自我修养》一书中有关于多线程的讲解非常好;但最近读到这几篇文章对于多线程的讲解,个人认为比前者(书)更加的清晰、易懂、全面。每篇文章的内容安排也很合理,非常感谢作者TRIANGLES和他优秀的文章,这里是他的个人站点。 相关系列译文 「译文」带你慢慢的了解多线程 「译文」线程同步 「译文」原子操作-无锁多线程编程 (本篇) 「译文」内存重排对无锁多线程的影响 译文正文部分 在希腊语中,原子 (ἄτομος; atomos) 的意思是不可切割。当计算机执行的每个任务无法再细分的时候(无法拆分为更小的子任务),这就是一个原子的任务。 在多线程编程中,原子是一个重要的属性:因为原子操作不可再细分,一个线程就无法闯入到另一个线程正在执行的原子操作中。假如,写入数据操作是原子的,那么其他线程就无法在另一个线程写入未完成的时候进行数据读取。反过来,读取数据也一样。换句话说,原子操作中,不存在数据竞争。 前一篇内容中,已经介绍了所谓的同步原语的概念,还有常见的实现线程同步的工具。它们也经常被用来在多线程中提供原子操作。但实现的方式仅仅是让单线程访问,阻塞其他线程,直到第一个线程完成操作。基于它们有能力冻结线程,同步原语也被称为阻塞机制。 前一篇提到的阻塞机制,在大部分情况下都能很好的工作。只有使用正确,它们也是可靠和快速的。然后,它们也有一些缺点需要注意: 1、休眠的线程除了等待,什么也做不了。 2、它们可以挂起你的应用程序——如果一个持有同步原语锁的线程由于某种原因崩溃,锁本身将永远不会被释放,等待的线程将永远被卡住; 3、开发者无法控制哪些线程将被休眠——一般这是被操作系统控制的,这就有可能引发优先级反转:执行重要任务的线程被迫等待那些执行不重要任务的线程。 大部分情况下,你可能也不会关心这些问题,因为它们似乎不会影响程序执行的正确性。但也有可能,为了充分利用多核 CPU,让一些线程一直保持运行也是可行的,此时如果因为优先级反转而引起系统假死,这就是个大问题了。 无锁编程 好消息是:我们还有其他方式控制多线程的并发任务。这个方式就是无锁编程,这是一种不使用锁机制来保证多线程安全的技术。 坏消息是:这是一种很底层的方式,这种方式,离硬件更近了一步。同时,使用无锁编程是对自己的智力挑战,也是我们了解计算机到底如何工作的好机会。 无锁编程依赖原子指令,这些原子指令是直接被 CPU 执行的。所以,我们需要先了解一些原子指令,然后我会告诉你如何使用这些执行进行并发控制。 什么是原子指令 当计算机显示一张图片到屏幕上的时候,实际上是由若干子任务组成:从存储单元中读取图片,解码图片,渲染像素点等等…,如果我们再放大每个子任务去看,每个子任务又能划分出更多的子任务。一直拆分到最小,对人类可见的被处理器直接执行的操作叫“机器指令”。下图中,虚线框属于软件层,实线框属于硬件层: 不同的 CPU 架构中,都有各自不同的机器指令,其中有些机器指令是原子的,这些指令的执行是单独的,不能分割,也不能被打断。也有一些指令不是原子的:这些指令在执行的时候,会被处理器在划分为多个更细微的操作在后台执行,也被称为微操作(micro-operations) ;我们暂时把焦点放到前边那一类,即原子指令上。原子指令可以分类两个大类: 1、存储/装载指令 (store-load) 2、RMW 指令 (read-modify-write) 存储装载原子指令 (store-load) 这些指令被用来从内存中存储和读取(装载)数据。大多数的 CPU 架构在设计时,都会确保这些操作在一些特定情况下是原子操作。比如基于 X86 架构实现的处理器,都会有MOV指令,用来从内存中读取字节数据交于 CPU,如果对字节对齐(aligned data) 的数据执行MOV操作,CPU 就会确保该操作是原子的。(aligned data:存储在内存中的信息,方便CPU轻松快速的读取)。 RMW (read-modify-write) 原子指令 一些复杂点的操作,仅仅通过存储和读取是无法完成的,比如自增操作(++x),至少需要 3个存储和读取的原子指令,这就会整个操作变的非原子化 。RMW 原子指令正是用来填补这种问题,它能让多次复杂操作变为一整个原子操作。这类指令非常多。一些 CPU 架构实现了它们,主要的分类如下,其他的都是这些指令的子集: ...

2014-08-20 · 2 min · 326 words · -

摄影构图

摄影构图 在《辞海》中是这样解释“构图”的,“构图"为艺术家为了表现作品的主题思想和美感效果,在一定的空间,安排和处理人、物的关系和位置,把个别或局部的形象组成艺术的整体。 https://zhuanlan.zhihu.com/p/52292163 https://zhuanlan.zhihu.com/p/21261635 中心构图, 中心构图是将主体放在画面中心构图,也是比较保险和常用的构图方法。这种方式的优点是能突出主体、明确,而且能够找到画面平衡点。 三分法, 三分法也是比较常见的构图方法。画面一般是横竖各两条线,形成“井”字排布,将画面分为九等分。很多手机和相机都会带这种构图参考线。交叉点是画面最吸引人的地方,将主体放在这个位置也是三分构图的基本原则。 水平线构图, 水平伸展的直线,可以让画面看起来比较宽阔、稳定、和谐。比如地平线和水平面,将两个空间分隔开,给人更多的想象空间。那么,水平线居于什么位置才是好的呢?这也要看情况。比如你想让画面和谐,可以选择三分之一的视觉兴趣线。如果你天空云比较艳丽,你可以多拍天空,如果云颜色单调,你想突出地上的景物,就多拍地面。另外,如果你想拍水面或湖面镜面倒影的感觉,也可以将水平线放在中间,增强对称感。 对称式构图, 说到对称,这里要介绍第4种构图方法。对称式构图。想起小时候学的轴对称图形,这里的对称就是让图像景物按对称或对称中心来构图。常与中心构图联合使用,主体位于画面中心。 框架式构图, 框架式构图,利用前景框架产生遮挡,增加画面的深度。当前景景物和主体有区别度时,通过前后的明显对比也更能突出主体,从更加新颖的角度去观察事物,让普通的风景变得与众不同。 引导线, 画面中出现清晰的线条可以引起关注,起到“吸睛”效果。引导线是画面中任何形式的线条,像直线、曲线、汇聚线、平行线、螺旋线等都可以对观众视线引导。它可以用于创造、增强纵深感等。另外,引导线也不一定是具体的线条,比如排列的或者有明显方向延伸趋势的物体,比如墙壁、道路,还有相同的颜色或者阴影等。 对角线和三角形, 构图中,也经常会用到对角线和三角形的构图。这不仅能够强化几何的美感,还可以带来一种动感的张力。 S型构图(曲线构图), 在自然界有变化万千的形状,其中S型曲线总会给人一种柔和、优雅的美感。让人看上去是延长的,变化的,非常有节奏和韵律。像一些风光大片中,道路、小溪、河流是比较常见的。S型构图也可以用在一些弧度小的曲线元素,像在拍摄美女时,可以利用S展示女性身材特有的魅力。 前景与纵深感, 前景在风光摄影中的作用还是比较强大的。前景掩映后是主体,整个空间被拉长,变得更加立体,更具有纵深感和层次感。 利用空白空间, “画留三分空,生气随之发”。画面中留出空白,通过简单的背景突出主体。可以为画面增加更多的深邃意味。这种留白也可以结合简约主义的构图,通过画面比较少的内容,来给观者更多的想象空间。 黄金三角形构图, 黄金三角形构图和三分法相似。只不过这里的直线是从四个角出发的,在图像左右两边形成两个直角三角形。我们要将画面的元素放在交叉位置。这样可以使画面更加丰富,多个三角形相互关联,相互呼应,更具趣味性。 黄金比例构图, 黄金分割的比例原是一个数学规律,也是在自然界中大量存在的。这个比例被更多地运用在绘画和设计中。黄金分割的比例是1:0.618。在摄影构图中比较高级,黄金分割点表现在对角线上的某条垂直线上的点,还是正方形边长为半径延伸出的螺旋线。但在拍摄时,如果你很难找到这个位置,可以利用九宫格构图,其实是黄金分割的简化版。 填满画面, 将主体填满整个画面,不为周围预留空间,可以让观众目光集中在主体,去排除干扰,更多地记住细节。 重复构图法, 重复构图,一般是在特定的情况下。比如水果摊、花丛、或者一面全是窗的墙。画面的内容是不断地重复要拍摄的主体,单调重复的方式来占据画面,这样也能够突出主体。 改变视角, 们经常看到很多摄影师在拍摄时会趴在地上,或者也有的站在楼顶或者更高的位置去拍摄。这其实是想以人眼高度之外的视角去拍摄物体。现在很多相机可以翻转屏幕,你可以试试仰拍。降低或者提高视角,或许会发现拍摄主体不同的美。

2014-08-13 · 1 min · 34 words · -

kindle

kindle 把pdf 发送到 kindle 把电子书比如 pdf 格式的文档 作为附件发送到 xxx@kindle.cn 设置/查看 amazon账号配置的kindle 邮箱地址 https://www.amazon.cn/hz/mycd/myx#/home/settings/payment 账户列表》 数字内容和设备》内容和设备》首选项》个人文档设置》〖发送至Kindle〗电子邮箱 注意!!! 记得设置白名单: “已认可的发件人电子邮箱列表”

2014-08-13 · 1 min · 18 words · -

linux tty

linux tty pts(pseudo-terminal slave) 用tty命令看看当前bash关联到了哪个tty tty 看 tty 都被哪些进程打开了 lsof /dev/pts/1 往tty里面直接写数据跟写标准输出是一样的效果 echo foo > /dev/pts/1 下面是 tty 和进程以及 I/O 设备交互的结构图: Input +--------------------------+ R/W +------+ ----------->| |<---------->| bash | | pts/1 | +------+ <-----------| |<---------->| lsof | Output | Foreground process group | R/W +------+ +--------------------------+ 两个pts间发送消息 echo "foo" > /dev/pts/2 # 红色字体, 颜色代码参照ANSI控制码 echo -e "\033[31mFoo\033[0m" > /dev/pts/2 列出系统支持的所有终端类型 toe -a 比较两个终端的区别 infocmp infocmp vt100 vt220 TTY历史 支持多任务的计算机出现之前 在计算机出来以前,人们就已经在使用一种叫teletype的设备,用来相互之间传递信息,看起来像下面这样: ...

2014-08-11 · 6 min · 1251 words · -

语法糖

语法糖 语法糖 (Syntactic sugar) ,也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达 (Peter J. Landin) 发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。 举个例子: 在C语言里用a[i]表示*(a+i),用a[i][j]表示*(*(a+i*数组a第二维的长度)+j),看来语法糖不是"现代语言"才有啊,连我们的老大哥C也有,而且这种写法简洁明了,也更好懂了。 实际上从面向过程到面向对象也是一种语法糖啊,C语言可以通过它的指针、类型转换,结构实现面向对象的编程风格,但是C++更进一步的推广了这种风格,更好用了,不过到了C#把OO的风格发挥得淋漓尽致。OO的编程风格对于面向过程来说是不是一种语法糖呢?如果生硬地照此理解,只有计算机硬件指令才不算语法糖,而其他一切利用编译器、汇编器将代码抽象,和自然语言更相近的手段都算语法糖。 现在很多很多编程思想,编程理论层出不穷,当然,对于学习来说我们是要抓住技术的核心,但对于工程来说如何提高工程质量,如何提高工程效率也是我们要关注的,既然这些语法糖能辅助我们以更好的方式编写代码为什么要"抵制"呢? 我想语法糖和其他编程思想一样重要,什么duck type,人本接口,最小接口,约定优于配置,其实不都是一些思想上的"语法糖"? 不过也并不是没有反对的声音,这其中就有图灵奖的第一个获得者: Alan Perlis。.net从2.0到3.0到3.5底层CLR并没有做更新,没有添加任何新的IL指令,所以C#从2.0到3.0中所有的特性都是语法糖,就算从1.0到2.0,也只有一个泛型不是语法糖,其余的新特性也都是如此,但是每一次C#发布新特性的时候我们不得不为之而鼓舞,为之而喝彩。新的语法可以酿造更好的编程风格,以前一些难以实现的方面现在也轻而易举了。 需要声明的是"语法糖"这个词绝非贬义词,它可以给我带来方便,是一种便捷的写法,编译器会帮我们做转换;而且可以提高开发编码的效率,在性能上也不会带来损失。

2014-08-10 · 1 min · 19 words · -

闭包, closure

闭包, closure 何为闭包 闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境) 闭包(Closure) 是一种函数(或函数和其相关的变量环境的组合),它不仅包含函数的定义,还“记住”了创建该函数时的 作用域中的变量。 通俗解释: 闭包就是一个函数 “带着”它所需要的外部变量一起打包起来使用。即使这些外部变量在函数外部已经不存在了,闭包仍然可以访问它们。 函数嵌套:闭包一定是函数内部的函数。 访问外部变量:内部函数访问了外部函数的局部变量。 变量生命周期延长:被闭包引用的外部变量不会在外部函数结束后立即销毁。 java内部类 wiloon.com/inner-class golang 闭包 func outer() func() int { x := 0 return func() int { x++ return x } } Javascript function outer() { let count = 0; return function inner() { count++; console.log(count); }; } const counter = outer(); counter(); // 输出 1 counter(); // 输出 2 python def outer(): x = 10 def inner(): print(x) return inner f = outer() f() # 输出 10 我们知道这个返回的闭包中包含了 Add 函数中提供的变量 y (也就是闭包产生的环境) 也就是说这个闭包包含了函数本身,以及一个对局部变量y的引用。 这里特别需要注意的一点是,如果y是定义在函数Add的调用栈里的一个变量,那么当Add()函数被调用完毕后,y就销毁了,这时候再用原来的指针去访问y就会出问题,因此这里就出现了一个原则: 闭包中引用的外部变量必须是在堆上分配的 实际上Go的编译器在处理到这个闭包时,会使用escape analyze来识别变量y的作用域,当发现变量y被一个闭包所引用时,就会把y转移到堆中 (这一过程称为变量逃逸)。 总结一下,闭包从底层理解,就是函数本身和其所需外部变量的引用,用R大的话来形容闭包的创建过程就是: ...

2014-08-10 · 5 min · 968 words · -

Git Stash

Git Stash 比如当前分支是 branch0, 新建了一个文件, 之后发现分支不对, 应该是在 branch1 上添加, 这时就可以用 git stash 暂存当前修改, 切换到 branch1 再 git stash pop. git stash # 如果有新添加的文件,那么就需要添加 -a 参数 git stash save -a "msg0" git stash list git stash pop git stash pop 开启某个修改暂存后,会在 stash list 里面将最近一次的修改暂存记录删除掉,而 git stash apply stash@{0} 则不会。 https://blog.csdn.net/daguanjia11/article/details/73810577 Git Stash用法 最近在使用Git管理项目工程的时候,遇到了很多问题,也学习到了很多关于Git常见使用的技巧,下面就其中关于Git Stash的用法和大家分享下。 首先,简单介绍下Git Stash命令的用法,详细的用法在man文档中有相关介绍,下面我来说明常见的使用。 git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。 git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。 git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。 git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。 ...

2014-08-09 · 1 min · 106 words · -

ssh 跳板(Jump Host)的使用

ssh 跳板(Jump Host)的使用 ProxyJump Host hostB HostName 10.124.44.91 User root Host arch-vm HostName 192.168.122.2 User root ProxyJump hostB # jump0: 跳板机 # server0: 目标服务器 host jump0 HostName 192.168.0.1 User user0 Host server0 HostName 192.168.0.2 User user0 ProxyCommand ssh -q -W %h:%p jump0 # %h: ~/.ssh/config 的语法, 代表主机名, 执行的时候会用 HostName 的值替换 # %p: 端口 # https://linux.die.net/man/5/ssh_config # -q 表示代理命令工作在静默模式下,而 -W 则表示 stdio 转发 这里说的 ssh 跳板,是指我们通过一个中继服务器其访问另一台内网服务器。典型的应用场景是在 VPN 网络中,我们进入了 VPN 服务器之后再访问另一个网段的内网服务器。 ...

2014-08-08 · 1 min · 171 words · -

委托模式

委托模式 http://blog.sina.com.cn/s/blog_5f13e9910100g3ob.html http://www.iteye.com/topic/29541 委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。委托模式是一项基本技巧,许多其他的模式,如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式。委托模式使得我们可以用聚合来替代继承,它还使我们可以模拟mixin。 “委托"在C#中是一个语言级特性,而在Java语言中没有直接的对应,但是我们可以通过动态代理来实现委托!代码如下: Java代码 收藏代码 import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /* @author Liusheng 实现"委托"模式,用户需要实现InvocationHandler接口; 参考: http://www.uml.org.cn/j2ee/200411036.htm */ public abstract class Delegator implements InvocationHandler { //RelegateTo针对每个对象都要生成一个实例,因而非Static的log,代价比较高。 //protected Log _log = LogFactory.getLog(this.getClass()); //private static Log _log = LogFactory.getLog(RelegateTo.class); //————— protected Object obj_orgin = null; //原始对象 protected Object obj_proxy = null; //代理对象 //————— public Delegator() { //空 } public Delegator(Object orgin){ this.createProxy(orgin); } //————— protected Object createProxy(Object orgin) { obj_orgin = orgin; obj_proxy = Proxy.newProxyInstance( orgin.getClass().getClassLoader(), //加载器 ...

2014-08-08 · 2 min · 267 words · -

adb command

adb command pacman -S android-tools 在手机上打开USB调试 adb help adb kill-server sudo adb start-server adb devices #这个命令将登录设备的shell adb shell # adb push <本地路径> <远程路径> adb push <本地路径> <远程路径> #列出手机装的所有app 的包名 adb shell pm list packages 查看设备 –查看当前连接的设备, 连接到计算机的android设备或者模拟器将会列出显示 adb reboot bootloader adb pull Copies a specified file from an emulator/device instance to your development computer. 从电脑上发送文件到设备 –用push命令可以把本机电脑上的文件或者文件夹复制到设备(手机) adb push Copies a specified file from your development computer to an emulator/device instance. ...

2014-08-07 · 1 min · 153 words · -