﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-咖啡伴侣-随笔分类-自己</title><link>http://www.blogjava.net/oathleo/category/30443.html</link><description>呆在上海</description><language>zh-cn</language><lastBuildDate>Sat, 05 Jan 2013 09:50:08 GMT</lastBuildDate><pubDate>Sat, 05 Jan 2013 09:50:08 GMT</pubDate><ttl>60</ttl><item><title>java nio 之MappedByteBuffer，高效文件/内存映射</title><link>http://www.blogjava.net/oathleo/archive/2013/01/05/393791.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Sat, 05 Jan 2013 02:49:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/01/05/393791.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/393791.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/01/05/393791.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/393791.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/393791.html</trackback:ping><description><![CDATA[<a href="http://download.oracle.com/javase/1.4.2/docs/api/java/nio/MappedByteBuffer.html" style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: dotted; border-bottom-color: #3354aa; outline: 0px; font-size: 13px; vertical-align: baseline; background-color: #ffffff; color: #3354aa; text-decoration: initial; font-family: Georgia, Times, 'Times New Roman', serif; line-height: 22px;">MappedByteBuffer</a><span style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;">是java nio引入的文件内存映射方案，读写性能极高。NIO最主要的就是实现了对异步操作的支持。其中一种通过把一个套接字通道(SocketChannel)注册到一个选择器(Selector)中,不时调用后者的选择(select)方法就能返回满足的选择键(SelectionKey),键中包含了SOCKET事件信息。这就是select模型。</span><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><span style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; SocketChannel的读写是通过一个类叫ByteBuffer(java.nio.ByteBuffer)来操作的.这个类本身的设计是不错的,比直接操作byte[]方便多了. ByteBuffer有两种模式:直接/间接.间接模式最典型(也只有这么一种)的就是HeapByteBuffer,即操作堆内存 (byte[]).但是内存毕竟有限,如果我要发送一个1G的文件怎么办?不可能真的去分配1G的内存.这时就必须使用"直接"模式,即 MappedByteBuffer,文件映射.</span><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><span style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp; 先中断一下,谈谈操作系统的内存管理.一般操作系统的内存分两部分:物理内存;虚拟内存.虚拟内存一般使用的是页面映像文件,即硬盘中的某个(某些)特殊的文件.操作系统负责页面文件内容的读写,这个过程叫"页面中断/切换". MappedByteBuffer也是类似的,你可以把整个文件(不管文件有多大)看成是一个ByteBuffer.MappedByteBuffer 只是一种特殊的 ByteBuffer ，即是ByteBuffer的子类。 MappedByteBuffer 将文件直接映射到内存（这里的内存指的是虚拟内存，并不是物理内存）。通常，可以映射整个文件，如果文件比较大的话可以分段进行映射，只要指定文件的那个部分就可以。</span><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><span style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;">三种方式：</span><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><span style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileChannel提供了map方法来把文件影射为内存映像文件： MappedByteBuffer map(int mode,long position,long size); 可以把文件的从position开始的size大小的区域映射为内存映像文件，mode指出了 可访问该内存映像文件的方式：READ_ONLY,READ_WRITE,PRIVATE.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><span style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;">a. READ_ONLY,（只读）： 试图修改得到的缓冲区将导致抛出 ReadOnlyBufferException.(MapMode.READ_ONLY)</span><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><span style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;">&nbsp;b. READ_WRITE（读/写）： 对得到的缓冲区的更改最终将传播到文件；该更改对映射到同一文件的其他程序不一定是可见的。 (MapMode.READ_WRITE)</span><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><span style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;">c. PRIVATE（专用）： 对得到的缓冲区的更改不会传播到文件，并且该更改对映射到同一文件的其他程序也不是可见的；相反，会创建缓冲区已修改部分的专用副本。 (MapMode.PRIVATE)</span><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><span style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;">三个方法：</span><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><span style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;">a. fore();缓冲区是READ_WRITE模式下，此方法对缓冲区内容的修改强行写入文件</span><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><span style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;">b. load()将缓冲区的内容载入内存，并返回该缓冲区的引用</span><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><span style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;">c. isLoaded()如果缓冲区的内容在物理内存中，则返回真，否则返回假</span><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><span style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;">三个特性：</span><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><span style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; 调用信道的map()方法后，即可将文件的某一部分或全部映射到内存中，映射内存缓冲区是个直接缓冲区，继承自ByteBuffer,但相对于ByteBuffer,它有更多的优点：</span><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><span style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;">a. 读取快</span><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><span style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;">b. 写入快</span><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><span style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;">c. 随时随地写入</span><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><span style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;">下面来看代码：</span><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><code style="margin: 0px 0px 20px; padding: 5px 10px; border: 1px solid #eeeeee; outline: 0px; font-size: 13px; vertical-align: baseline; background-color: #f4f4f4; font-family: 'andale mono', 'lucida console', monospace; line-height: 1.5; display: block; overflow-x: auto; color: #444444;"><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">package study;</span><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">import java.io.FileInputStream;</span><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">import java.io.FileOutputStream;</span><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">import java.nio.ByteBuffer;</span><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">import java.nio.MappedByteBuffer;</span><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">import java.nio.channels.FileChannel;</span><br /><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">public class MapMemeryBuffer {</span><br /><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">&nbsp;&nbsp; &nbsp;public static void main(String[] args) throws Exception {</span><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ByteBuffer byteBuf = ByteBuffer.allocate(1024 * 14 * 1024);</span><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;byte[] bbb = new byte[14 * 1024 * 1024];</span><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;FileInputStream fis = new FileInputStream("e://data/other/UltraEdit_17.00.0.1035_SC.exe");</span><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;FileOutputStream fos = new FileOutputStream("e://data/other/outFile.txt");</span><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;FileChannel fc = fis.getChannel();</span><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;long timeStar = System.currentTimeMillis();// 得到当前的时间</span><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;fc.read(byteBuf);// 1 读取</span><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());</span><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println(fc.size()/1024);</span><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;long timeEnd = System.currentTimeMillis();// 得到当前的时间</span><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println("Read time :" + (timeEnd - timeStar) + "ms");</span><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;timeStar = System.currentTimeMillis();</span><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;fos.write(bbb);//2.写入</span><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//mbb.flip();</span><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;timeEnd = System.currentTimeMillis();</span><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println("Write time :" + (timeEnd - timeStar) + "ms");</span><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;fos.flush();</span><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;fc.close();</span><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;fis.close();</span><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">&nbsp;&nbsp; &nbsp;}</span><br /><br /><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: verdana;">}</span></code><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><span style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;">运行结果：</span><pre style="margin-top: 0px; margin-bottom: 20px; padding: 5px 10px; border: 1px solid #eeeeee; outline: 0px; font-size: 13px; vertical-align: baseline; background-color: #f4f4f4; font-family: 'andale mono', 'lucida console', monospace; line-height: 1.5; overflow-x: auto; color: #444444;"><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: 'courier new';">14235</span><br /> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: 'courier new';">Read time :24ms</span><br /> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: 'courier new';">Write time :21ms</span></pre><span style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;">我们把标注1和2语句注释掉，换成它们下面的被注释的那条语句，再来看运行效果。</span><pre style="margin-top: 0px; margin-bottom: 20px; padding: 5px 10px; border: 1px solid #eeeeee; outline: 0px; font-size: 13px; vertical-align: baseline; background-color: #f4f4f4; font-family: 'andale mono', 'lucida console', monospace; line-height: 1.5; overflow-x: auto; color: #444444;"><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: 'courier new';">14235</span><br /> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: 'courier new';">Read time :2ms</span><br /> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: 'courier new';">Write time :0ms</span></pre><span style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;">可以看出速度有了很大的提升。MappedByteBuffer的确快，但也存在一些问题，主要就是内存占用和文件关闭等不确定问题。被MappedByteBuffer打开的文件只有在垃圾收集时才会被关闭，而这个点是不确定的。在javadoc里是这么说的：</span><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><pre style="margin-top: 0px; margin-bottom: 20px; padding: 5px 10px; border: 1px solid #eeeeee; outline: 0px; font-size: 13px; vertical-align: baseline; background-color: #f4f4f4; font-family: 'andale mono', 'lucida console', monospace; line-height: 1.5; overflow-x: auto; color: #444444;">A mapped byte buffer and the file mapping that it represents remain valid until the buffer itself <br /> is garbage-collected.<br /> <br /> </pre><span style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;">这里提供一种解决方案：</span><br style="color: #444444; font-family: Georgia, Times, 'Times New Roman', serif; font-size: 13px; line-height: 22px; background-color: #ffffff;" /><pre style="margin-top: 0px; margin-bottom: 20px; padding: 5px 10px; border: 1px solid #eeeeee; outline: 0px; font-size: 13px; vertical-align: baseline; background-color: #f4f4f4; font-family: 'andale mono', 'lucida console', monospace; line-height: 1.5; overflow-x: auto; color: #444444;"><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: 'courier new';">AccessController.doPrivileged(new PrivilegedAction() {</span><br /> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: 'courier new';">&nbsp; public Object run() {</span><br /> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: 'courier new';">&nbsp;&nbsp;&nbsp; try {</span><br /> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: 'courier new';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method getCleanerMethod = buffer.getClass().getMethod("cleaner", new Class[0]);</span><br /> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: 'courier new';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getCleanerMethod.setAccessible(true);</span><br /> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: 'courier new';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sun.misc.Cleaner cleaner = (sun.misc.Cleaner) </span><br /> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: 'courier new';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getCleanerMethod.invoke(byteBuffer, new Object[0]);</span><br /> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: 'courier new';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cleaner.clean();</span><br /> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: 'courier new';">&nbsp;&nbsp;&nbsp; } catch (Exception e) {</span><br /> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: 'courier new';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</span><br /> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: 'courier new';">&nbsp;&nbsp;&nbsp; }</span><br /> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: 'courier new';">&nbsp;&nbsp;&nbsp; return null;</span><br /> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: 'courier new';">&nbsp; }</span><br /> <span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background-color: transparent; font-family: 'courier new';">});</span></pre><div><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: 'courier new';"><br /></span></div><img src ="http://www.blogjava.net/oathleo/aggbug/393791.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-01-05 10:49 <a href="http://www.blogjava.net/oathleo/archive/2013/01/05/393791.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NIO</title><link>http://www.blogjava.net/oathleo/archive/2013/01/04/393736.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Fri, 04 Jan 2013 03:18:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/01/04/393736.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/393736.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/01/04/393736.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/393736.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/393736.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: java.nio.ByteBuffer-------------------------------Capacity&nbsp;缓冲区最大容量Limit&nbsp;当前最大使用量，或者说是有效数据的EOF位置。Position&nbsp;指向当前位置的指针-----------------------------------假设一个缓冲区容量是10，开始指针指向0，即position=0。然后写入...&nbsp;&nbsp;<a href='http://www.blogjava.net/oathleo/archive/2013/01/04/393736.html'>阅读全文</a><img src ="http://www.blogjava.net/oathleo/aggbug/393736.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-01-04 11:18 <a href="http://www.blogjava.net/oathleo/archive/2013/01/04/393736.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浏览器开发canvas</title><link>http://www.blogjava.net/oathleo/archive/2012/08/10/385214.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Fri, 10 Aug 2012 03:52:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2012/08/10/385214.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/385214.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2012/08/10/385214.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/385214.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/385214.html</trackback:ping><description><![CDATA[<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">HTML5的canvas需要firefox, safari, chrome, opera或者IE9. 对低于9的IE版本，该游戏使用ExplorerCanvas库来模拟，虽然视觉效果差一些但也可以使用．简单写写canvas兼容低版本(&lt;９)IE的经验．</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">Canvas是HTML5新增加的元素, 可以方便的画图. Firefox, safari, chrome, opera的最近版本以及IE9都支持. IE8及以下不支持HTML5, 但是ExplorerCanvas库(http://excanvas.sourceforge.net/)调用IE内部功能提供了几乎相同的API. ExplorerCanvas不支持字体, 所以为了使用文字, 还需要使用canvas-text库(http://code.google.com/p/canvas-text/).</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">使用ExplorerCanvas及canvas-text, 需要在HTML header里包括:&nbsp;&nbsp;</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">&nbsp; &lt;script type="text/javascript" src="javascript/excanvas/excanvas.js"&gt;&lt;/script&gt;</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">&nbsp; &lt;script type="text/javascript" src="javascript/excanvas/canvas.text.js"&gt;&lt;/script&gt;</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">&nbsp; &lt;script type="text/javascript" src="javascript/excanvas/faces/optimer-normal-normal.js"&gt;&lt;/script&gt;</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">如果同一页HTML要兼容低版本IE和其它支持HTML5的浏览器, 可以用如下的语法选择性加入低版本IE需要的部分:&nbsp;&nbsp;</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">&nbsp; &lt;!--[if IE]&gt;</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">&nbsp; &lt;script type="text/javascript" src="javascript/excanvas/excanvas.js"&gt;&lt;/script&gt;</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">&nbsp; &lt;script type="text/javascript" src="javascript/excanvas/canvas.text.js"&gt;&lt;/script&gt;</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">&nbsp; &lt;script type="text/javascript" src="javascript/excanvas/faces/optimer-normal-normal.js"&gt;&lt;/script&gt;</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">&nbsp; &lt;![endif]--&gt;&nbsp;&nbsp;</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">下面的部分包括在HTML的BODY里, canvas元素的后面:</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">&nbsp; &lt;!--[if ! IE]&gt;--&gt; &lt;script type="text/javascript" src="javascript/mycode.js"&gt;&lt;/script&gt; &lt;!--&lt;![endif]--&gt;</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">&nbsp; &lt;!--[if IE]&gt; &lt;script type="text/javascript" src="javascript/mycode.ie.js"&gt;&lt;/script&gt; &lt;![endif]--&gt;</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">下面是mycode.ie.js不同于mycode.js的部分.&nbsp;&nbsp;</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">1. addEventListener -&gt; attachEvent</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">别的浏览器用addEventListener. IE用attachEvent. 对于事件名, IE要多加一个"on". 比如IE用"onmousedown", 别的浏览器用"mousedown".&nbsp;&nbsp;</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">2. 为了兼容手机, 鼠标事件为触屏事件取代, 所以mousedown/mouseup/mousemove改用如下的事件: touchstart/touchend/touchmove.</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">3. event.pageX -&gt; pageX(event)</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">别的浏览器直接用event.pageX. IE完全不同, 所以另外自定义一个函数pageX(event)来达到相同效果:</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">function pageX(e) {</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">&nbsp; if (e.pageX) return e.pageX;</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">&nbsp; else if (e.clientX)</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">&nbsp; return e.clientX + (document.documentElement.scrollLeft ?</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">&nbsp; document.documentElement.scrollLeft : document.body.scrollLeft);</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">&nbsp; else return null;</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">}</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">4. in event handlers, this.offsetLeft/Top -&gt; vCanvas.offsetLeft/Top</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">别的浏览器this指代事件发生的元素, 这里是canvas. IE的this指代window, 所以要专门指明vCanvas.offsetLeft/Top.</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">5. onmouseout在IE里行为不稳定, 所以应避免使用, 或者改用onmouseleave.</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">6. 辨认鼠标的左右键, 别的浏览器用event.which, IE用event.button.</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">7. DIV元素的半透明效果，别的浏览器用 style="background-color:rgba(255,255,255,0.75);", IE用style="background-color: white; opacity:0.75;filter:alpha(opacity=75);"&nbsp;&nbsp;</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">8. 定义元素高度和宽度时，IE常要指明单位px，别的浏览器不用. 比如:</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">&nbsp; &lt;!--[if ! IE]&gt;--&gt;&nbsp;&nbsp;</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">&nbsp; &lt;table id="Toolbar" border="0" cellpadding="2" cellspacing="0" bgcolor="#ffffff" style="font-size:12px; width:320;"&gt;</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">&nbsp; &lt;!--&lt;![endif]--&gt;</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">&nbsp; &lt;!--[if IE]&gt;&nbsp;&nbsp;</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">&nbsp; &lt;table id="Toolbar" border="0" cellpadding="2" cellspacing="0" bgcolor="#ffffff" style="font-size:12px; width:320px;"&gt;</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">&nbsp; &lt;![endif]--&gt;</span><br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<br style="font-family: simsun; line-height: 23px; background-color: #ffffff; " />
<span style="font-family: simsun; line-height: 23px; background-color: #ffffff; ">9. 另外IE引擎慢一些, 所以别的浏览器里运行流畅的canvas事件, 在IE里要简略一些来保证运行速度.</span><img src ="http://www.blogjava.net/oathleo/aggbug/385214.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2012-08-10 11:52 <a href="http://www.blogjava.net/oathleo/archive/2012/08/10/385214.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>推荐新书-Ext江湖</title><link>http://www.blogjava.net/oathleo/archive/2011/12/22/Ext.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Thu, 22 Dec 2011 05:47:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/12/22/Ext.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/367005.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/12/22/Ext.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/367005.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/367005.html</trackback:ping><description><![CDATA[友人出的新书：恭喜并强烈推荐下 《Ext江湖》，<br />
<div><a href="http://product.china-pub.com/194667">http://product.china-pub.com/194667<strong><br />
</strong>
<br /></a>摘录一段别人的评价：<br />本书每一章节思路清晰、重点突出，文风朴实、目标明确，具有很强的针对性、实用性；本书每一样例以开发者角度，循序渐进，从浅入深一步一步娓娓道来；Ext江湖，处处充满惊喜，处处埋藏绝技，它就是欧莱雅，你值得拥有！<br /></div><div></div><img src ="http://www.blogjava.net/oathleo/aggbug/367005.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-12-22 13:47 <a href="http://www.blogjava.net/oathleo/archive/2011/12/22/Ext.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>仿射变换</title><link>http://www.blogjava.net/oathleo/archive/2011/12/20/366819.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Tue, 20 Dec 2011 03:21:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/12/20/366819.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/366819.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/12/20/366819.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/366819.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/366819.html</trackback:ping><description><![CDATA[<div><div style="font-size: 14.7px; font-weight: bold; margin-bottom: 10px; color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; ">&nbsp;</div><div id="cnblogs_post_body" style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; font-size: 13px; line-height: 20px; background-color: #ffffff; "><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">仿射变换可以理解为</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">・对坐标进行放缩，旋转，平移后取得新坐标的值。</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">・经过对坐标轴的放缩，旋转，平移后原坐标在在新坐标领域中的值。</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">&nbsp;</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">如上图所示，XY坐标系坐标轴旋转&#952;，坐标原点移动（x0，y0）。</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">XY坐标系中的坐标（X，Y），则求新坐标系xy中的坐标值的方程组为:</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">&nbsp;</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">X = X･<span style="line-height: 19px; ">cos</span>&#952; - Y･<span style="line-height: 19px; ">sin</span>&#952; + x0</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">Y = X･sin&#952; + Y･<span style="line-height: 19px; ">cos</span>&#952; + y0</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">&nbsp;</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">写成矩阵形式为</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">&nbsp;</div><span style="line-height: 19px; "><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">| x |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;cos&#952;&nbsp;&nbsp;&nbsp;sin&#952; |&nbsp;&nbsp; | x0 |</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">|&nbsp;&nbsp; | = | X&nbsp;Y | * |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| + |&nbsp;&nbsp;&nbsp; |</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">| y |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | -sin&#952;&nbsp;cos&#952; |&nbsp;&nbsp; | y0 |</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">&nbsp;</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">为将原点移动的值放入矩阵，则可以加入一个不影响原方程组的解的冗余方程。于是可以写成</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">&nbsp;</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">X = X･cos&#952; - Y･sin&#952; + x0</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">Y = X･sin&#952; + Y･cos&#952; + y0</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">1 = X･0&nbsp;&nbsp;&nbsp;&nbsp; + Y･0&nbsp;&nbsp;&nbsp;&nbsp; + 1</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">&nbsp;</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">写成矩阵形式为</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">| x |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;cos&#952;&nbsp;&nbsp;&nbsp;sin&#952;&nbsp;&nbsp; 0|</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">| y | = | X&nbsp;Y&nbsp;1 | * | -sin&#952;&nbsp;cos&#952;&nbsp;&nbsp; 0|</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">| 1 |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | x0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1|</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">&nbsp;</div><span style="line-height: 21px; font-size: 10.5pt; "><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">这个矩阵就是Helmert变换矩阵。</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">&nbsp;</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">考虑到新坐标系对于原坐标系在x，y两个坐标轴上的放缩率，可分别表示为&#955;x和&#955;y，则Helmert变换方程组可以修改为</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">&nbsp;</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">X = (&#955;x)X･<span style="line-height: 19px; ">cos</span>&#952; - (&#955;y)Y･<span style="line-height: 19px; ">sin</span>&#952; + x0</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">Y = (&#955;x)X･sin&#952; + (&#955;y)Y･<span style="line-height: 19px; ">cos</span>&#952; + y0</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">&nbsp;</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">同样按照前述方法写成三阶矩阵为</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">&nbsp;</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">| x |<span style="line-height: 19px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |</span>&nbsp;(&#955;x)cos&#952;<span style="line-height: 19px; ">&nbsp;&nbsp; (</span>&#955;x)sin&#952;<span style="line-height: 19px; ">&nbsp;&nbsp; 0|</span></div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">| y | = | X&nbsp;Y&nbsp;1 | * | (&#955;y)-sin&#952;&nbsp;(&#955;y)cos&#952;<span style="line-height: 19px; ">&nbsp;&nbsp; 0|</span></div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">| 1 |<span style="line-height: 19px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | &nbsp;x0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y0</span><span style="line-height: 19px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>1|</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">&nbsp;</div><div style="margin-top: 0mm; margin-right: 0mm; margin-bottom: 0pt; margin-left: 0mm; ">这个矩阵就是affine变换矩阵，仿射矩阵。</div></span></span></div></div><img src ="http://www.blogjava.net/oathleo/aggbug/366819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-12-20 11:21 <a href="http://www.blogjava.net/oathleo/archive/2011/12/20/366819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>年终奖</title><link>http://www.blogjava.net/oathleo/archive/2011/12/07/365748.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Wed, 07 Dec 2011 05:52:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/12/07/365748.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/365748.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/12/07/365748.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/365748.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/365748.html</trackback:ping><description><![CDATA[<div>12月4日傍晚，中国农业大学经济管理学院副教授葛长银发了一条微博，&#8220;请大家注意年终奖临界点，宁可少千元不要超一元&#8221;，并举出例子，<br />比如年终奖为 18000元，那么要缴纳540元的税，<br />如果按年终奖为18001元，则需要多纳税1155.1元，即1695.1元。<br />同理，54001元的年终奖比 54000元多纳4950.2元；<br />发108001元比108000元多纳24390.25元；<br />发420001元比420000元多纳19250.3元；<br />发 660001元比660000元多纳30250.35元；<br />发960001元比960000元多纳88000.45元。</div><img src ="http://www.blogjava.net/oathleo/aggbug/365748.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-12-07 13:52 <a href="http://www.blogjava.net/oathleo/archive/2011/12/07/365748.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>旋转门压缩算法</title><link>http://www.blogjava.net/oathleo/archive/2011/09/14/358603.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Wed, 14 Sep 2011 05:46:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/09/14/358603.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/358603.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/09/14/358603.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/358603.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/358603.html</trackback:ping><description><![CDATA[<div> 对于工业生产现场来说，过程实时数据变化很快，数据存储量很大，如果每个数据都存储，在经历不长时间后就会占据大量磁盘空间。一般来说，工业生产的很多数 据是线性变化的，或者是符合某种规律变化的，如果数据库能够根据某些条件进行判断，将某些可忽略的数据，不进行存储，而当需要查找该数据时，可以通过线性 或步进插值计算出来，就可以大幅度提高存储效率，同时节约磁盘空间。 <p align="left"> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 上述描述的情况就是在线数据压缩。所谓数据压缩，就是丢弃那些对于在准确重现现场设备（以下称为测点）历史曲线时不是必需的测点数据。</p> <p align="left"> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 当今，非常流行的数据压缩算法是由美国OSI软件公司研发的旋转门压缩算法，此算法已经成功地运用在了PI实时数据库系统当中，此算法主要针对的对象是浮点数数据类型的数据。</p> <p align="left"> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 旋转门压缩算法分析：</p> <ul><li> <div align="left">部分原文：</div> </li></ul> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> With the swinging door algorithm, a value is stored if a straight line drawn between the last stored value and the next value does not come within the compression deviation specification of all the intermediate points. Two slopes are required to carry out this test. The following figure shows the slopes as they are initialized after a value is stored:</p> <p align="center"><a href="http://photo.blog.sina.com.cn/showpic.html#blogid=5f7bdfe40100d6n4&amp;url=http://s3.sinaimg.cn/orignal/5f7bdfe4t6898b7c55322" target="_blank"><img src="http://s3.sinaimg.cn/bmiddle/5f7bdfe4t6898b7c55322" alt="在线数据压缩算法分析" title="在线数据压缩算法分析" /></a></p> <p align="center">&nbsp;<wbr></p> <p align="center">Figure1 &#8211; Swinging Door slopes after recording a value</p> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> The dotted lines are the two slopes. Let the compression deviation specification be 8. One of the lines is drawn from the last recorded value plus 8 through whichever value maximizes the slope of the line. This is the top dotted line in Figure 1. The other dotted line is drawn from the last recorded value minus 8 through whichever value minimizes the slope of the line. The third line is drawn between the last recorded value and the new value. This is the solid line in Figure 1. The previous value is recorded if the slope of the top dotted line is greater than the slope of the solid line or the slope of the solid line is greater than the slope of the bottom dotted line.</p> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> The algorithm ensures that each discarded value falls within the compression deviation specification of the solid line. The compression deviation specification is also the maximum error in a trend of archived values. The next figure shows the lines after four more values have been received.</p> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> The next figure shows the arrival of a value which causes the previous value to be recorded.</p> <p align="center"><a href="http://photo.blog.sina.com.cn/showpic.html#blogid=5f7bdfe40100d6n4&amp;url=http://s13.sinaimg.cn/orignal/5f7bdfe4t6898ba941e7c" target="_blank"><img src="http://s13.sinaimg.cn/bmiddle/5f7bdfe4t6898ba941e7c" alt="在线数据压缩算法分析" title="在线数据压缩算法分析" /></a></p> <p align="center">&nbsp;<wbr></p> <p align="center">Figure 2 &#8211; Recording a new value</p> <ul><li> <div align="left">中文解释：</div> </li></ul> <p align="left"> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 对于旋转门压缩算法来说，先由上一保存数据项和当前数据项来画出一条直线（在二维坐标图上），如果待保存数据项不在当前数据项和上一保存数据项的压缩偏差范围之内，则待保存数据项被保存。实验中还需要两条斜线（旋转门）。图1（Figure 1）中显示了这两个旋转门，传入系统的第一个测点数据项会直接被保存，否则因为数据库中没有被保存的测点数据项就无法确定旋转门了。</p> <p align="left"> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 压缩偏差是旋转门压缩算法中的重要参数，它是人为设定的绝对误差值，可以简单的理解为在绝对误差范围内，数据被压缩掉，在绝对误差范围外，数据不被压缩。</p> <p align="left"> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 另外，算法的实现还需要计算以下几个斜率：</p> <p align="left">&nbsp;<wbr>&nbsp;<wbr> （1）上斜率 <strong>K</strong><strong>1</strong> =（当前数据项数值 -（上一保存数据项数值 - 压缩偏差））/（当前数据项时间 - 上一保存数据项时间）</p> <p align="left">&nbsp;<wbr>&nbsp;<wbr> （2）下斜率 <strong>K</strong><strong>2</strong> =（当前数据项数值 -（上一保存数据项数值 + 压缩偏差））/（当前数据项时间 - 上一保存数据项时间）</p> <p align="left">&nbsp;<wbr>&nbsp;<wbr> （3）中间斜率<strong>K</strong> =（当前数据项数值 - 待保存数据项数值）/（当前数据项时间 - 待保存数据项时间）</p> <p align="left"> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 通过计算压缩变量上一保存数据项和当前数据项与待保存数据项的斜率来进行压缩控制。即：</p> <p align="left"> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 如果 <strong>K</strong><strong>2</strong>&#8804;<strong>K</strong>&#8804;<strong>K</strong><strong>1</strong>，待保存数据项被压缩。</p> <p align="left"> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 如果 <strong>K&lt;K</strong><strong>2</strong>或者<strong>K&gt;K</strong><strong>1</strong>，待保存数据项被存储。</p> <p align="left">&nbsp;<wbr></p> <p align="left">算法实现流程如下：</p> <p align="left">1.第一个数据项处理：直接存入数据库。</p> <p align="left">2.第二个数据项处理：计算前后两数据项的上下两个斜率，并将上下斜率作为后续判断的依据。</p> <p align="left"> 3.两个数据项以上处理：计算上中下斜率，进行判断：（1）如果没有通过旋转门压缩检测，把上一个数据项信息保存，并将新的上下斜率保存作为后续判断的依据；（2）如果通过旋转门压缩检测，则不需要保存。</p> <p align="left">4.循环执行第三步中的压缩条件判断。</p></div><br /><br /><br /><div><div>#include &lt;stdio.h&gt; <br />#include &lt;stdlib.h&gt; <br />#include  &lt;time.h&gt;<br />#include &lt;unistd.h&gt; <br />#include &lt;math.h&gt;</div> <div>static int maxnum = 3600;<br />void main(int argc,char **argv[])<br />{<br />&nbsp;  int now=0, start=0;&nbsp; <br />&nbsp; FILE *fd, *fd1;<br />&nbsp; <br />&nbsp; fd =  fopen("test", "r");<br />&nbsp; fd1 = fopen("test.zip", "w");<br />&nbsp; <br />&nbsp; float  E=10.01; <br />&nbsp; float mem, mem_old;<br />&nbsp; float upgate; /*定义上门*/&nbsp; <br />&nbsp;  float downgate; /*定义下门*/&nbsp; </div> <div>&nbsp; float k1; /*k1表示上门和过程数据间的斜率*/&nbsp; <br />&nbsp; float k2;  /*k2表示下门和过程数据间的斜率*/&nbsp; <br />&nbsp; <br />&nbsp; fread(&amp;mem, sizeof(float), 1, fd);<br />&nbsp;  mem_old = mem;<br />&nbsp; <br />&nbsp; for(;;) {<br />&nbsp; &nbsp;if(now == maxnum-1) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fwrite(&amp;mem,  sizeof(float), 1, fd1); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;break;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;fwrite(&amp;mem,  sizeof(float), 1, fd1);</div> &nbsp;&nbsp;&nbsp; start = now;<br />&nbsp;&nbsp;&nbsp; upgate=mem+E;&nbsp; <br />&nbsp;&nbsp;&nbsp; downgate=mem-E;&nbsp; <br />&nbsp;&nbsp;&nbsp;  k1=-10000;&nbsp; <br />&nbsp;&nbsp;&nbsp; k2=-10000;&nbsp; <br />&nbsp;&nbsp;&nbsp; for(;;) {<br />&nbsp;&nbsp;&nbsp; &nbsp;now++;<br />&nbsp;&nbsp;&nbsp;  &nbsp;mem_old = mem;<br />&nbsp;&nbsp;&nbsp; &nbsp;fread(&amp;mem, sizeof(float), 1, fd);<br />&nbsp;&nbsp;&nbsp;  &nbsp;if(fabs(mem-upgate)&gt;0.001){<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;if((mem-upgate)/(now  -start)&gt;k1) k1=(mem-upgate)/(now-start);&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;now=now++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;fwrite(&amp;mem_old, sizeof(float), 1, fd1); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(fabs(mem-downgate)&gt;0.001){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if((downgate-mem)/(now-start)&gt;k2) k2=(downgate-mem)/(now-start);&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;now=now++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;fwrite(&amp;mem_old,  sizeof(float), 1, fd1); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;  <br />&nbsp;&nbsp;&nbsp;if(now == maxnum-1) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }</div><img src ="http://www.blogjava.net/oathleo/aggbug/358603.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-09-14 13:46 <a href="http://www.blogjava.net/oathleo/archive/2011/09/14/358603.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>世上最伟大的十个公式，薛定谔方程排名第六，质能方程排名第五</title><link>http://www.blogjava.net/oathleo/archive/2011/09/08/358261.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Thu, 08 Sep 2011 01:22:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/09/08/358261.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/358261.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/09/08/358261.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/358261.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/358261.html</trackback:ping><description><![CDATA[<div><h3><div>http://cnbeta.com/articles/154387.htm</div></h3><br /><br /><h3>世上最伟大的十个公式，薛定谔方程排名第六，质能方程排名第五</h3> 		<p id="news_font">  </p>         <p id="news_author"><span>leoliyuan发布于 2011-09-08 08:49:56|4126  次阅读 字体：<a>大</a>  <a>小</a>  <a href="http://m.cnbeta.com/print.php?sid=154387" target="_blank">打印预览</a> <a><img src="http://img.cnbeta.com/share/01-qqweibo.gif" title="分享至腾讯微博" target="_blank" align="absmiddle"  alt="" /></a> <a href="http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=http%3A%2F%2Fwww.cnbeta.com%2Farticles%2F154387.htm" target="_blank" style="color:#000000;text-decoration:none;font-size:12px;font-weight:normal"><img src="http://img.cnbeta.com/share/04-qzone.gif" title="分享到QQ空间" target="_blank" align="absmiddle"  alt="" /></a> <a><img alt="分享至新浪微博" src="http://img.cnbeta.com/share/02-weibo.gif" align="absMiddle" border="0" /></a>   <a><img src="http://img.cnbeta.com/share/06-kaixin001.gif" alt="转贴到开心网" align="absMiddle" border="0" /></a> <a><img src="http://img.cnbeta.com/share/05-renren.gif" alt="分享到校内人人网" align="absMiddle" border="0" /></a> <a><img src="http://img.cnbeta.com/share/08-google.gif" alt="添加到Google书签" align="absMiddle" border="0" /></a></span></p>                   <a href="http://cnbeta.com/topics/448.htm"><img src="http://img.cnbeta.com/topics/science.gif" alt="cnBeta 科学探索" name="sign" id="sign" align="right" /></a>         <p><span style="font-weight:bold;">英国科学期刊《物理世界》曾让读者投票评选了&#8220;最伟大的公式&#8221;，最终榜上有名的十个公式既有无人不知的1+1=2，又有著名的E=mc2；既有简单的-圆周公式，又有复杂的欧拉公式&#8230;&#8230;</span><br style="font-weight:bold;" /> <br /></p> 		<p>从什么时候起我们开始厌恶数学？这些东西原本如此美丽，如此精妙。这个地球上有多少伟大的智慧曾耗尽一生，才最终写下一个等号。每当你解不开方程的时候，不妨换一个角度想，暂且放下对理科的厌恶和对考试的痛恨。因为你正在见证的，是科学的美丽与人类的尊严。<br /> <br /> </p><div style="text-align:center;"><strong>No.10 圆的周长公式（The Length of the Circumference of a Circle）</strong> </div> <p>&nbsp;</p> <p align="center">    <img src="http://img.cnbeta.com/newsimg/110908/08495601330513097.png" alt="" border="0" width="65" height="14" /></p> <p>&nbsp;</p> <p align="left">这公式贼牛逼了，初中学到现在。目前，人类已经能得到圆周率的2061亿位精度。还是挺无聊的。现代科技领域使用的-圆周率值，有十几位已经足够了。如果用 35位精度的-圆周率值，来计算一个能把太阳系包起来的一个圆的周长，误差还不到质子直径的百万分之一。现在的人计算圆周率，多数是为了验证计算机的计算 能力，还有就是为了兴趣。</p> <p>&nbsp;</p> <p align="center">    <strong>No.9 傅立叶变换（The Fourier Transform）</strong></p> <p>&nbsp;</p> <p align="center">    <img src="http://img.cnbeta.com/newsimg/110908/0849561124410015.png" alt="" border="0" width="234" height="39" /></p> <p>&nbsp;</p> <p align="left">这个挺专业的，一般人完全不明白。不多作解释。简要地说没有这个式子没有今天的电子计算机，所以你能在这里上网除了感谢党感谢政府还要感谢这个完全看不懂的式子。另外傅立叶虽然姓傅，但是法国人。</p> <p>&nbsp;</p> <p align="center">    <strong>No.8 德布罗意方程组（The de Broglie Relations）</strong></p> <p>&nbsp;</p> <p align="center">    <img src="http://img.cnbeta.com/newsimg/110908/08495721612444966.png" alt="" border="0" width="58" height="18" /></p> <p align="center">    <img src="http://img.cnbeta.com/newsimg/110908/08495831881949457.png" alt="" border="0" width="65" height="14" /></p> <p>&nbsp;</p> <p align="left">这个东西也挺牛逼的，高中物理学到光学的话很多概念跟它是远亲。简要地说德布罗意这人觉得电子不仅是一个粒子，也是一种波，它还有 &#8220;波长&#8221;。于是搞啊搞就有了这个物质波方程，表达了波长、能量等等之间的关系。同时他获得了1929年诺贝尔物理学奖。</p> <p>&nbsp;</p> <p align="center">    <strong>No.7 1+1=2</strong></p> <p align="left">这个公式不需要名称，不需要翻译，不需要解释。</p> <p>&nbsp;</p> <p align="center">    <strong>No.6 薛定谔方程（The Schr&amp;ouml;dinger Equation）</strong></p> <p align="center">    <br />     <img src="http://img.cnbeta.com/newsimg/110908/08495841892949409.png" alt="" border="0" width="199" height="43" /></p> <p>&nbsp;</p> <p align="left">也是一般人完全不明白的。因此我摘录官方评价：&#8220;薛定谔方程是世界原子物理学文献中应用最广泛、影响最大的公式。&#8221;由于对量子力学的杰出贡献，薛定谔获得1933年诺贝尔物理奖。<br /> <br /> 另外薛定谔虽然姓薛，但是奥地利人。</p> <p>&nbsp;</p> <p align="center">    <strong>No.5 质能方程（Mass&#8211;energy Equivalence）</strong></p> <p>&nbsp;</p> <p align="center">    <img src="http://img.cnbeta.com/newsimg/110908/08495951084274075.png" alt="" border="0" width="81" height="21" /></p> <p>&nbsp;</p> <p align="left">好像从来没有一个科学界的公式有如此广泛的意义。在物理学&#8220;奇迹年&#8221;1905年，由一个叫做爱因斯坦的年轻人提出。同年他还发表了《论动体的电动力学》&#8212;&#8212;俗称狭义相对论。</p> <p align="left">这个公式告诉我们，爱因斯坦是牛逼的，能量和质量是可以互换的。副产品：原子弹。</p> <p>&nbsp;</p> <p align="center">    <strong>No.4 勾股定理/毕达哥拉斯定理（Pythagorean Theorem）</strong></p> <p>&nbsp;</p> <p align="center">    <img src="http://img.cnbeta.com/newsimg/110908/08495961124994529.png" alt="" border="0" width="100" height="20" /></p> <p>&nbsp;</p> <p align="left">做数学不可能没用到过吧，不多讲了。</p> <p>&nbsp;</p> <p align="center">    <strong>No.3 牛顿第二定律（Newton's Second Law of Motion）</strong></p> <p>&nbsp;</p> <p align="center">    <img src="http://img.cnbeta.com/newsimg/110908/08500071187692712.png" alt="" border="0" width="69" height="14" /></p> <p>&nbsp;</p> <p align="left">有史以来最伟大的没有之一的科学家在有史以来最伟大没有之一的科学巨作《自然哲学的数学原理》当中的被认为是经典物理学中最伟大的没有之一的核心定律。动力的所有基本方程都可由它通过微积分推导出来。对于学过高中物理的人，没什么好多讲了。</p> <p>&nbsp;</p> <p align="center">    <strong>No.2 欧拉公式（Euler's Identity）</strong></p> <p>&nbsp;</p> <p align="center">    <img src="http://img.cnbeta.com/newsimg/110908/08500181796112191.png" alt="" border="0" width="93" height="20" /></p> <p>&nbsp;</p> <p align="left">这 个公式是上帝写的么？到了最后几名，创造者个个神人。欧拉是历史上最多产的数学家，也是各领域（包含数学的所有分支及力学、光学、音响学、水利、天文、化 学、医药等）最多著作的学者。数学史上称十八世纪为&#8220;欧拉时代&#8221;。欧拉出生于瑞士，31岁丧失了右眼的视力，59岁双眼失明，但他性格乐观，有惊人的记忆 力及集中力。他一生谦逊，很少用自己的名字给他发现的东西命名。不过还是命名了一个最重要的一个常数&#8212;&#8212;e。</p> <p align="left">关 于e，以前有一个笑话说：在一家精神病院里，有个病患整天对着别人说，&#8220;我微分你、我微分你。&#8221;也不知为什么，这些病患都有一点简单的微积分概念，总以为 有一天自己会像一般多项式函数般，被微分到变成零而消失，因此对他避之不及，然而某天他却遇上了一个不为所动的人，他很意外，而这个人淡淡地对他说，&#8220;我 是e的x次方。&#8221;</p> <p align="left">这个公式的巧妙之处在于，它没有任何多余的内容，将数学中最基本的e、i、pie放在了同一个式子中，同时加入了数学也是哲学中最重要的0和1，再以简单的加号相连。</p> <p align="left">高斯曾经说：&#8220;一个人第一次看到这个公式而不感到它的魅力，他不可能成为数学家。&#8221;</p> <p>&nbsp;</p> <p align="center">    <strong>No.1 麦克斯韦方程组（The Maxwell's Equations）</strong></p> <p align="center">积分形式：</p> <p align="center">    <img src="http://img.cnbeta.com/newsimg/110908/08500191595366494.png" alt="" border="0" width="145" height="45" /></p> <p align="center">    <img src="http://img.cnbeta.com/newsimg/110908/085002101161057981.png" alt="" border="0" width="117" height="45" /></p> <p align="center">    <img src="http://img.cnbeta.com/newsimg/110908/08500211911355757.png" alt="" border="0" width="172" height="48" /></p> <p align="center">    <img src="http://img.cnbeta.com/newsimg/110908/085003121410933300.png" alt="" border="0" width="215" height="48" /></p> <p>&nbsp;</p> <p align="center">微分形式：</p> <p align="center">    <img src="http://img.cnbeta.com/newsimg/110908/085004131937549733.png" alt="" border="0" width="92" height="20" /></p> <p align="center">    <img src="http://img.cnbeta.com/newsimg/110908/08500514171307556.png" alt="" border="0" width="82" height="15" /></p> <p align="center">    <img src="http://img.cnbeta.com/newsimg/110908/085005151448323996.png" alt="" border="0" width="128" height="43" /></p> <p align="center">    <img src="http://img.cnbeta.com/newsimg/110908/08500616145911412.png" alt="" border="0" width="160" height="43" /></p> <p>&nbsp;</p> <p align="left">任何一个能把这几个公式看懂的人，一定会感到背后有凉风&#8212;&#8212;如果没有上帝，怎么解释如此完美的方程？这组公式融合了电的高斯定律、磁的高斯定律、法拉第定律 以及安培定律。比较谦虚的评价是：&#8220;一般地，宇宙间任何的电磁现象，皆可由此方程组解释。&#8221;到后来麦克斯韦仅靠纸笔演算，就从这组公式预言了电磁波的存 在。我们不是总喜欢编一些故事，比如爱因斯坦小时候因为某一刺激从而走上了发奋学习、报效祖国的道路么？事实上，这个刺激就是你看到的这个方程组。也正是 因为这个方程组完美统一了整个电磁场，让爱因斯坦始终想要以同样的方式统一引力场，并将宏观与微观的两种力放在同一组式子中：即著名的&#8220;大一统理论&#8221;。爱 因斯坦直到去世都没有走出这个隧道，而如果一旦走出去，我们将会在隧道另一头看到上帝本人。</p></div><img src ="http://www.blogjava.net/oathleo/aggbug/358261.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-09-08 09:22 <a href="http://www.blogjava.net/oathleo/archive/2011/09/08/358261.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>换一种态度看程序员 转</title><link>http://www.blogjava.net/oathleo/archive/2010/08/10/328371.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Tue, 10 Aug 2010 01:51:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2010/08/10/328371.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/328371.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2010/08/10/328371.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/328371.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/328371.html</trackback:ping><description><![CDATA[<p><strong>有这样一群人，他们经常孤独地工作到深夜，漆黑夜里的显示器成为房间中唯一的光源，手边残留着比萨饼和碳酸饮料。繁重的编码任务让他们很少离开座位，即便是周五的深夜，这些人依旧在办公室中奋战。</strong><br />
乍一听，这像是在描述黑客们的工作状态。但实际上，大多数普通的开发人员就是这样生活着。除了工作，他们有家庭、兴趣以及责任，但项目的压力让他们无暇顾及工作以外的事情。工时长、假期短以及与当前社会发展脱节等问题普遍存在于他们当中。</p>
虽然现在社会大力倡导所谓的知识经济，但这群聪明且高度专业化的人员不被重视，因为经理们认为，程序员是替代性很强的群体。这样的观念导致这些潜在的社会精英不得不重新考虑他们的职业规划。最终，他们当中的大多数另谋高就，另一些则踏入到全新的行业之中。<br />
<br />
你认为游戏行业真的是一片乐土吗?一名业内人士讲，游戏开发几乎会占据程序员生活的全部，因为产品质量总会有改进的余地。他们工作时间长，没有加班费以及应有的假期。有些员工甚至连续四年薪水都没有调整过。他身边不少同事都是因为工作而导致了离婚。<br />
<br />
当工作条件变得无法忍受时，最聪明以及最有天分的员工通常是最先离开的。凭借他们的资质，他们可以在其他领域挖掘到更多的机会。这样势必导致开发团队整体
水平的下降。经理对开发者施加的压力越大，长期来看团队的效率就越低。IT顾问布鲁斯&#183;韦伯斯特将这种情况称为&#8220;死海效应&#8221;。如果公司发展每况愈下，它就
更难得到真正的人才，也更难留住这些人，这样的恶性循环无疑会拖垮公司。离岸外包的出现则加剧了这种趋势：内部开发团队的效率越低，公司就越希望通过低成
本外包取代这个团队。而内部开发者会强烈地感到他们即将被替代，因此无法集中精力工作。<br />
<br />
员工的倦怠会毁掉公司的未来，而经理们是可以降低死海效应的。他们可以设定合理的工作时长并且提供加班费，可以规定公休日并严格地执行，可以设置合理的产
品发布时间以减少过度的压力。他们甚至可以尝试调整项目的开发方法，比如采用敏捷开发等。但是，最重要的一点就是，他们必须重新审视开发人员的价值。在这
样一个与互联网发展速度同步的领域，每一个员工都应该被公平、公正地对待，并且获得应有的尊重，即使他们真地喜欢比萨饼和碳酸饮料。
<img src ="http://www.blogjava.net/oathleo/aggbug/328371.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2010-08-10 09:51 <a href="http://www.blogjava.net/oathleo/archive/2010/08/10/328371.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如果有了这玩意</title><link>http://www.blogjava.net/oathleo/archive/2010/07/27/327225.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Tue, 27 Jul 2010 08:20:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2010/07/27/327225.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/327225.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2010/07/27/327225.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/327225.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/327225.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 如果有一天，技术高度发达，发达到生产了一种机器，可以接通人的大脑，产生所有人类可以感知的感觉。<br />
人戴上这种帽子样的机器，就进入幻想世界，在幻想的世界里面所有感觉都和真实的一模一样。<br />
&nbsp;&nbsp;&nbsp; 想吃就吃，想睡就睡，想买房就买房，想干坏事就干坏事，想有美女就有美女...<br />
有了这玩意，人类还能进步吗？<br />
<br />
&nbsp;&nbsp;&nbsp; <br />
<br />
<img src ="http://www.blogjava.net/oathleo/aggbug/327225.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2010-07-27 16:20 <a href="http://www.blogjava.net/oathleo/archive/2010/07/27/327225.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>google.cn 算是真的死了</title><link>http://www.blogjava.net/oathleo/archive/2010/07/01/324941.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Thu, 01 Jul 2010 01:45:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2010/07/01/324941.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/324941.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2010/07/01/324941.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/324941.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/324941.html</trackback:ping><description><![CDATA[Google获准在中国运营Google.cn域名的ICP牌照于6月30日到期。在美国西部时间6月28日晚间10点(北京时间6
月29日下午1点)，Google通过官方博客发布&#8220;关于谷歌中国的最新声明&#8221;称，在与中国有关部门的沟通中已明确获知，自动指向的做法是不可接受的，继
续进行自动指向，域名Google.cn的ICP牌照将无法通过年检。<br />
<br />
感谢google.cn！是我们自己命运不济，出生卑微。<br />
<img src ="http://www.blogjava.net/oathleo/aggbug/324941.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2010-07-01 09:45 <a href="http://www.blogjava.net/oathleo/archive/2010/07/01/324941.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2009年总结</title><link>http://www.blogjava.net/oathleo/archive/2010/02/22/313659.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Mon, 22 Feb 2010 10:03:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2010/02/22/313659.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/313659.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2010/02/22/313659.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/313659.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/313659.html</trackback:ping><description><![CDATA[<br />
<br />
<br />
<object codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="895" height="583">
<param name="_cx" value="23680" />
<param name="_cy" value="15425" />
<param name="FlashVars" value="" />
<param name="Movie" value="http://web.servasoft.com/svgdemo/swf/android.swf" />
<param name="Src" value="http://web.servasoft.com/svgdemo/swf/android.swf" />
<param name="WMode" value="Window" />
<param name="Play" value="-1" />
<param name="Loop" value="-1" />
<param name="Quality" value="High" />
<param name="SAlign" value="" />
<param name="Menu" value="-1" />
<param name="Base" value="" />
<param name="AllowScriptAccess" value="" />
<param name="Scale" value="ShowAll" />
<param name="DeviceFont" value="0" />
<param name="EmbedMovie" value="0" />
<param name="BGColor" value="FFFFFF" />
<param name="SWRemote" value="" />
<param name="MovieData" value="" />
<param name="SeamlessTabbing" value="1" />
<param name="Profile" value="0" />
<param name="ProfileAddress" value="" />
<param name="ProfilePort" value="0" />
<param name="AllowNetworking" value="all" />
<param name="AllowFullScreen" value="false" /><embed src="http://web.servasoft.com/svgdemo/swf/android.swf" quality="high" bgcolor="#FFFFFF" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" width="895" height="583"></embed></object>
<img src ="http://www.blogjava.net/oathleo/aggbug/313659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2010-02-22 18:03 <a href="http://www.blogjava.net/oathleo/archive/2010/02/22/313659.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>前路漫漫</title><link>http://www.blogjava.net/oathleo/archive/2008/08/06/220450.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Wed, 06 Aug 2008 07:59:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2008/08/06/220450.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/220450.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2008/08/06/220450.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/220450.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/220450.html</trackback:ping><description><![CDATA[买房,钱到用时方恨少.<br />恨什么呢?自己怎么还是这么穷?<br />不够努力,走错了路,还是?<br />是不是做技术就只能这样了?<br />太多的疑问,没有答案,只能往前走.<img src ="http://www.blogjava.net/oathleo/aggbug/220450.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2008-08-06 15:59 <a href="http://www.blogjava.net/oathleo/archive/2008/08/06/220450.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>