<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Jim dot NET</title><subtitle type="text">技术总是用来服务于人的。Technique must serve people all the time.</subtitle><id>http://feed.cnblogs.com/blog/u/39116/rss</id><updated>2012-02-02T06:20:52Z</updated><author><name>JimLiu</name><uri>http://www.cnblogs.com/jimnox/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jimnox/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/39116/rss"/><entry><id>http://www.cnblogs.com/jimnox/archive/2011/04/07/javascript-lazy-singleton.html</id><title type="text">JavaScript Lazy单件 - 延迟到第一次访问才执行构造函数</title><summary type="text">var LazySingleton = function(){ var val = 1, _instance; var lazy_init = function(){ alert(&amp;#39;Lazy init, exec no more than once.&amp;#39;); return { getVal : function(){ return val; }, setVal : function(v){ val = v; } }; }; var init = function(){ init = function(){ return _instance; }; return _instance</summary><published>2011-04-07T09:41:00Z</published><updated>2011-04-07T09:41:00Z</updated><author><name>JimLiu</name><uri>http://www.cnblogs.com/jimnox/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jimnox/archive/2011/04/07/javascript-lazy-singleton.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jimnox/archive/2011/04/07/javascript-lazy-singleton.html"/><content type="html">&lt;div &gt;&#xD;
&lt;pre &gt;var LazySingleton = function(){&#xD;
    var val = 1, _instance;&#xD;
    var lazy_init = function(){&#xD;
        alert('Lazy init, exec no more than once.');&#xD;
        return {&#xD;
            getVal : function(){ return val; },&#xD;
            setVal : function(v){ val = v; }&#xD;
        };&#xD;
    };&#xD;
    var init = function(){&#xD;
        init = function(){ return _instance; };&#xD;
        return _instance = lazy_init();&#xD;
    };&#xD;
    return {&#xD;
        getInstance : function(){ return init(); }&#xD;
    };&#xD;
}();&#xD;
&#xD;
alert('load before lazy init.');&#xD;
var ls1 = LazySingleton.getInstance(); // will exec lazy init&#xD;
alert(ls1.getVal()); // 1&#xD;
ls1.setVal(5);&#xD;
&#xD;
var ls2 = LazySingleton.getInstance(); // won't exec lazy init&#xD;
alert(ls2.getVal()); // 5&#xD;
alert(ls1 == ls2); // true&#xD;
alert(ls1 === ls2); // true&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;a target="_blank" href="http://jsfiddle.net/jimnox/4xAWU/2/"&gt;点击这里在线测试&lt;/a&gt;&lt;img src="http://www.cnblogs.com/jimnox/aggbug/2008171.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jimnox/archive/2011/04/07/javascript-lazy-singleton.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jimnox/archive/2011/03/05/1971435.html</id><title type="text">写在考研出分之后</title><summary type="text">快一年没有来到这里了，这一年当中遇到了很多事情。先是放弃了本校保研机会，选择考研。这种介于一战和二战之间的定位很微妙，我不是应届考研，却是第一次考研，且是脱产考研。然后是本来计划是报考中科院计算所，但是后来因为中科院必须读博而我暂时不愿意读博，所以排除中科院。最后在自己和同学的怂恿之下，报了清华。复习很辛苦，有低谷是必然的，但是坚持到了最后，并且考试发挥也很正常。370分，这个成绩对于我来说算不错了，对于我身边的朋友来说更是无可比肩。但是鉴于今年分数看涨，离清华估计还差一步（其实就是差一步），如果是浙大，就基本稳了。A++的学校与A+的学校的距离吧。可能目标定太高了，不过话说回来，如果目标定低</summary><published>2011-03-05T02:37:00Z</published><updated>2011-03-05T02:37:00Z</updated><author><name>JimLiu</name><uri>http://www.cnblogs.com/jimnox/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jimnox/archive/2011/03/05/1971435.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jimnox/archive/2011/03/05/1971435.html"/><content type="html">&lt;p&gt;快一年没有来到这里了，这一年当中遇到了很多事情。&lt;/p&gt;&#xD;
&lt;p&gt;先是放弃了本校保研机会，选择考研。&lt;/p&gt;&#xD;
&lt;p&gt;这种介于一战和二战之间的定位很微妙，我不是应届考研，却是第一次考研，且是脱产考研。&lt;/p&gt;&#xD;
&lt;p&gt;然后是本来计划是报考中科院计算所，但是后来因为中科院必须读博而我暂时不愿意读博，所以排除中科院。&lt;/p&gt;&#xD;
&lt;p&gt;最后在自己和同学的怂恿之下，报了清华。&lt;/p&gt;&#xD;
&lt;p&gt;复习很辛苦，有低谷是必然的，但是坚持到了最后，并且考试发挥也很正常。&lt;/p&gt;&#xD;
&lt;p&gt;370分，这个成绩对于我来说算不错了，对于我身边的朋友来说更是无可比肩。&lt;/p&gt;&#xD;
&lt;p&gt;但是鉴于今年分数看涨，离清华估计还差一步（其实就是差一步），如果是浙大，就基本稳了。&lt;/p&gt;&#xD;
&lt;p&gt;A++的学校与A+的学校的距离吧。&lt;/p&gt;&#xD;
&lt;p&gt;可能目标定太高了，不过话说回来，如果目标定低点，说不定就不会这么用心了。&lt;/p&gt;&#xD;
&lt;p&gt;不论如何，考研没有失败者。&lt;/p&gt;&#xD;
&lt;p&gt;学校只是一片很小的天空，而我必须飞得更高。&lt;/p&gt;&#xD;
&lt;p&gt;找工作了！&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jimnox/aggbug/1971435.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jimnox/archive/2011/03/05/1971435.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jimnox/archive/2010/05/02/how-pplive-fxcks-our-net.html</id><title type="text">PPLive果然是神器（标题党）</title><summary type="text">寝室六人共用一枚1M宽带，A君看PPLIVE用掉150K流量（上传+下载），别的人就网页都打不开了。这也就算了，平常有人看个优酷或者别人开个几分钟下载，A君只要在玩游戏就必定会狂暴，为此我还主动（被）赶出寝室一次（说来话长）。人心之贪，可见一斑。附注：后B君提出很卡，A君于B君承认看视频（没说是PPLIVE），理由是刚才玩游戏很卡（所以就来卡别人？），玩不下去了，只好看会视频（抱抱，你好委屈哦~）</summary><published>2010-05-02T11:52:00Z</published><updated>2010-05-02T11:52:00Z</updated><author><name>JimLiu</name><uri>http://www.cnblogs.com/jimnox/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jimnox/archive/2010/05/02/how-pplive-fxcks-our-net.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jimnox/archive/2010/05/02/how-pplive-fxcks-our-net.html"/><content type="html">&lt;p&gt;寝室六人共用一枚1M宽带，A君看PPLIVE用掉150K流量（上传+下载），别的人就网页都打不开了。&lt;br /&gt;这也就算了，平常有人看个优酷或者别人开个几分钟下载，A君只要在玩游戏就必定会狂暴，为此我还主动（被）赶出寝室一次（说来话长）。&lt;br /&gt;人心之贪，可见一斑。&lt;br /&gt;附注：&lt;br /&gt;后B君提出很卡，A君于B君承认看视频（没说是PPLIVE），理由是刚才玩游戏很卡（所以就来卡别人？），玩不下去了，只好看会视频（抱抱，你好委屈哦~）&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jimnox/aggbug/1726066.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jimnox/archive/2010/05/02/how-pplive-fxcks-our-net.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jimnox/archive/2010/04/27/shape-context-notes-1.html</id><title type="text">Shape Context笔记-1</title><summary type="text">形状上一点的SC是它到其他点的d-bins theta-log(r)直方图。两个SC的距离是它们的Chi^2距离。每个形状用s个采样点，就用s个d-bins的SC来描述它。Generalized Shape Context是通过SC对点的切向量进行统计，GSC的每个槽的值是落在SC中对应槽内的点的切向量之和。两个GSC的距离是它们的Chi^2距离。（后来又说是将切向量展开成单位x, y值得到长为2...</summary><published>2010-04-27T02:56:00Z</published><updated>2010-04-27T02:56:00Z</updated><author><name>JimLiu</name><uri>http://www.cnblogs.com/jimnox/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jimnox/archive/2010/04/27/shape-context-notes-1.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jimnox/archive/2010/04/27/shape-context-notes-1.html"/><content type="html">&lt;div id="blog_text" &gt;&lt;ol&gt;&#xD;
&lt;li&gt;形状上一点的SC是它到其他点的d-bins theta-log(r)直方图。两个SC的距离是它们的Chi^2距离。每个形状用s个采样点，就用s个d-bins的SC来描述它。&lt;/li&gt;&#xD;
&lt;li&gt;Generalized Shape Context是通过SC对点的切向量进行统计，GSC的每个槽的值是落在SC中对应槽内的点的切向量之和。两个GSC的距离是它们的Chi^2距离。（后来又说是将切向量展开成单位x, y值得到长为2-d的向量，两者之差的L^2 norm是其距离，不知道哪个准了&amp;hellip;&amp;hellip;）&lt;/li&gt;&#xD;
&lt;li&gt;Representative Shape Context是从待查询形状Q上随机取的r个SC，这些SC都是按完整的采样点集来计算的。Q的RSC与模板形状Si的距离是这r个SC与Si中的s个SC的最小距离之和。这样两个形状间的距离计算从s*s*d变成了s*r*d，因为通常s是r的20倍以上，所以速度快了不少。&lt;/li&gt;&#xD;
&lt;li&gt;将模板库中出现的SC聚成k类，每个类的中心叫一个Shapeme。对模板库的每个形状Si统计，将其形状上下文分别量化到最近的Shapeme，得到一个对Shapeme统计的K槽直方图。对待查询形状也进行这样的统计。用一个k-bins Shapeme直方图代替了原来的s个d-bins 形状上下文。两个Shapeme直方图的距离是它们的Chi^2距离。通过这样的量化将对s*d的比较变成k的比较，速度很快，精度损失却不大。&lt;/li&gt;&#xD;
&lt;/ol&gt;更多慢慢看&lt;/div&gt;&lt;img src="http://www.cnblogs.com/jimnox/aggbug/1721824.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jimnox/archive/2010/04/27/shape-context-notes-1.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jimnox/archive/2010/04/14/chromium5-sucks-on-canvas-pixel-manipulate.html</id><title type="text">Chromium的Canvas实现中PixelManipulate有bug...吗？</title><summary type="text">在Chromium5中对Canvas Context2D使用getImageData和putImageData，会出现画面错位的问题。</summary><published>2010-04-14T14:37:00Z</published><updated>2010-04-14T14:37:00Z</updated><author><name>JimLiu</name><uri>http://www.cnblogs.com/jimnox/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jimnox/archive/2010/04/14/chromium5-sucks-on-canvas-pixel-manipulate.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jimnox/archive/2010/04/14/chromium5-sucks-on-canvas-pixel-manipulate.html"/><content type="html">&lt;p&gt;这问题很奇葩，早就想写文章了，听我慢慢说来。以下如无特殊说明，都是在Chrome里的结果。&lt;/p&gt;&#xD;
&lt;p&gt;Canvas的getContext('2d')方法可以获得Context2D，很爽，可以用来绘图，速度相当相当理想。&lt;/p&gt;&#xD;
&lt;p&gt;但是在对我的JavaScript版《Bad Apple》的进一步优化中，我们用Canvas发现速度还是就这么地，虽然的的确确比用成千上万个span来做好多了。&lt;/p&gt;&#xD;
&lt;p&gt;所以我需要更高的Canvas操作方法，最好是直接访问图片的字节数组，最好最好是直接访问和输出区域共享的内存！&lt;/p&gt;&#xD;
&lt;p&gt;幸运的是W3C为Context2D提供了getImageData方法，可以直接得到一个RGBA字节数组，自己访问完了以后又putImageData回去。这样速度就能达到极限了，没别的运算压力下，对整个Canvas随机赋色随随便便就能跑100多帧。配合上后来的LZW逐帧解压算法，再结合个&amp;lt;audio&amp;gt;放音乐，可以做到480*360分辨率下音画同步15fps，怎一个爽子了得！？&lt;/p&gt;&#xD;
&lt;p&gt;可惜，在Chrome4.0还是Dev的时候，我就用它来尝试了，很好很强大，就是他的GC似乎非常激进，几秒钟就卡一次，回收很多很多内存。这让人无法忍受。还有一个问题就是用这种方法来绘制图像会出现画面错位的现象，也就是我本文想说的。&lt;/p&gt;&#xD;
&lt;p&gt;幸好在Chrome4.0的正式版中，这个错位的问题解决了，可是GC卡住画面的问题已然没能解决。难道最强的浏览器也不足以征服《Bad Apple》吗！！！&lt;/p&gt;&#xD;
&lt;p&gt;非也！Chrome5.0Dev犹如救世主一般从天而降，这次他的GC改得非常平稳，整个播放过程中不仅帧率稳定，不丢帧，而且也不会出现4.0中大幅度GC停住不动的情况。可惜传说中的画面错位又出现了，我不知道这个问题是从哪来的，应该不是BMP的Stride问题，因为颜色是RGBA的，生来就是4的倍数。&lt;/p&gt;&#xD;
&lt;p&gt;估计过不了多久Chrome5的正式版就要发布了，期待那就是HTML5版的《Bad Apple》能够完美播放的一天。&lt;/p&gt;&#xD;
&lt;p&gt;P.S.Firefox 3.6+可以播放320*240*15fps音画同步版，完美。但是对于480*360的无力，只能放到7.x帧，Firefox3.7也提升不大。&lt;/p&gt;&#xD;
&lt;p&gt;Safari不支持audio，480分辨率fps也达不到15。&lt;/p&gt;&#xD;
&lt;p&gt;自我感觉良好号称地球上最快的Opera呢？我的动态脚本加载在Chrome/Firefox/Safari里都能用，惟独在Opera里戏剧性的罢工了。改成不动态加载的，好嘛，加载速度还挺快，比Chrome快多了。还真能放！音画同步，速度也能达到15fps。不过Ogg爆音，用了700M内存（Chrome200M），而且声音还会卡。看来Opera不过如此。&lt;/p&gt;&#xD;
&lt;p&gt;我只能说期待下一版Chrome更完美的表现吧。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jimnox/aggbug/1712213.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jimnox/archive/2010/04/14/chromium5-sucks-on-canvas-pixel-manipulate.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jimnox/archive/2010/04/10/fantasy-on-mobile-os-multitasking.html</id><title type="text">手机系统中多任务处理方式的一种新想法——无责任YY</title><summary type="text">现在的手机还没法把多任务处理的很好，让我感觉稍微好点的，反而是“古老”的Symbian S60。因为是手机的硬件不够强大，所以这也是没办法的事情。不过我昨天YY了一种新方法。</summary><published>2010-04-10T01:24:00Z</published><updated>2010-04-10T01:24:00Z</updated><author><name>JimLiu</name><uri>http://www.cnblogs.com/jimnox/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jimnox/archive/2010/04/10/fantasy-on-mobile-os-multitasking.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jimnox/archive/2010/04/10/fantasy-on-mobile-os-multitasking.html"/><content type="html">&lt;p&gt;说是无责任YY，因为我没设计过操作系统，也不知道做操作系统有多难。&lt;/p&gt;&#xD;
&lt;p&gt;现在的手机还没法把多任务处理的很好，让我感觉稍微好点的，反而是&amp;ldquo;古老&amp;rdquo;的Symbian S60。因为是手机的硬件不够强大，所以这也是没办法的事情。不过我昨天YY了一种新方法：&lt;/p&gt;&#xD;
&lt;p&gt;规定应用程序维护两个消息循环（通过这个词应该可以看出我被Windows编程所侵蚀了，呃&amp;hellip;&amp;hellip;），一个前台循环，主要负责UI和操控；一个后台循环，主要负责网络、音频、地理定位、接收系统推送的通知等。这样当任务切换到后台的时候，前台循环就挂起，后台循环继续活动。就可以节省很多CPU资源。&lt;/p&gt;&#xD;
&lt;p&gt;不过这样，前台循环占用的大量内存还是得不到释放，这显然对于手机这样内存捉襟见肘的设备是奢侈的。所以我又YY了一种方法，就是前台和后台通过进程/线程间通讯来交换数据，比如共享内存的方法。这部分内存是必须得有的，后台循环必须负责更新和处理他们，前台读取来反应到UI上，UI上发生操控的时候也有一部分数据要写入共享区。但是前台本身的内存是单独享有的，前台挂起的时候可以把这部分内存swap起来，反正前台的进程/线程都挂起了，这部分内存占着空间也没用。&lt;/p&gt;&#xD;
&lt;p&gt;这样只是对现在的编程多了一些要求而已，但是开发者不会受很大的影响。如果不注册后台循环，程序就不具备多任务功能，一关就咪西咪西了，不能在后台执行；如果不注册前台循环，程序简单地退化成系统服务。&lt;/p&gt;&#xD;
&lt;p&gt;嗯，很好很YY。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jimnox/aggbug/1708783.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jimnox/archive/2010/04/10/fantasy-on-mobile-os-multitasking.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jimnox/archive/2010/03/23/no-more-50cents.html</id><title type="text">那些叫嚣着别人是五毛的朋U们</title><summary type="text">请问您收到来自美国正负的50美分了吗？每个人都有自己的观点，您可以不接受，但是请维护别人发表观点的权利&amp;mdash;&amp;mdash;在尊重对方人格的基础上。停止无休止的五毛争夺战吧！</summary><published>2010-03-23T06:57:00Z</published><updated>2010-03-23T06:57:00Z</updated><author><name>JimLiu</name><uri>http://www.cnblogs.com/jimnox/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jimnox/archive/2010/03/23/no-more-50cents.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jimnox/archive/2010/03/23/no-more-50cents.html"/><content type="html">&lt;p&gt;请问您收到来自美国正负的50美分了吗？&lt;/p&gt;&#xD;
&lt;p&gt;每个人都有自己的观点，您可以不接受，但是请维护别人发表观点的权利&amp;mdash;&amp;mdash;在尊重对方人格的基础上。&lt;/p&gt;&#xD;
&lt;p&gt;停止无休止的五毛争夺战吧！&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jimnox/aggbug/1692598.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jimnox/archive/2010/03/23/no-more-50cents.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jimnox/archive/2010/02/18/1669048.html</id><title type="text">自留地</title><summary type="text">App Store浏览器ECMAScript5和HTML5部分支持情况测试FEYour browser doesn&amp;#39;t support Canvas.</summary><published>2010-02-17T16:04:00Z</published><updated>2010-02-17T16:04:00Z</updated><author><name>JimLiu</name><uri>http://www.cnblogs.com/jimnox/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jimnox/archive/2010/02/18/1669048.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jimnox/archive/2010/02/18/1669048.html"/></entry><entry><id>http://www.cnblogs.com/jimnox/archive/2010/02/06/fail-to-build-m8sdk_net.html</id><title type="text">一次失败的尝试——为M8SDK编写.NET版本</title><summary type="text">尝试为M8SDK编写.NET版，未果。</summary><published>2010-02-06T08:59:00Z</published><updated>2010-02-06T08:59:00Z</updated><author><name>JimLiu</name><uri>http://www.cnblogs.com/jimnox/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jimnox/archive/2010/02/06/fail-to-build-m8sdk_net.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jimnox/archive/2010/02/06/fail-to-build-m8sdk_net.html"/></entry><entry><id>http://www.cnblogs.com/jimnox/archive/2010/01/16/bad-apple-js-edition-details-and-browser-testing.html</id><title type="text">《Bad Apple》JavaScript版-创作全解析+浏览器横测</title><summary type="text">在上一篇日志中，小弟向大家展示了一个用JavaScript制作的《Bad Apple》，这次我将对这个程序创作过程中的一些有意思的细节做解释。</summary><published>2010-01-16T02:57:00Z</published><updated>2010-01-16T02:57:00Z</updated><author><name>JimLiu</name><uri>http://www.cnblogs.com/jimnox/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jimnox/archive/2010/01/16/bad-apple-js-edition-details-and-browser-testing.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jimnox/archive/2010/01/16/bad-apple-js-edition-details-and-browser-testing.html"/></entry></feed>
