<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>VX Box &#187; Program</title>
	<atom:link href="http://www.evan129.com/category/program/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.evan129.com</link>
	<description>Explorative Vision Abbreviated Nature</description>
	<lastBuildDate>Wed, 08 Sep 2010 06:55:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
	
<!-- Start Of Script Generated By WP-PostViews Plus -->
<script type='text/javascript' src='http://www.evan129.com/wp-includes/js/jquery/jquery.js?ver=1.4.2'></script>
<script type="text/javascript">
/* <![CDATA[ */
/* ]]> */
</script>
<!-- End Of Script Generated By WP-PostViews Plus -->
	<item>
		<title>绕过GPL..</title>
		<link>http://www.evan129.com/2010/04/26/%e7%bb%95%e8%bf%87gpl/</link>
		<comments>http://www.evan129.com/2010/04/26/%e7%bb%95%e8%bf%87gpl/#comments</comments>
		<pubDate>Sun, 25 Apr 2010 16:13:08 +0000</pubDate>
		<dc:creator>Evan</dc:creator>
				<category><![CDATA[Program]]></category>
		<category><![CDATA[GPL]]></category>

		<guid isPermaLink="false">http://www.evan129.com/?p=769</guid>
		<description><![CDATA[帮某家公司想的啦，我觉得这方法应该没有法律上的问题 有个核心算法库，没有依赖任何开源的东西，做成.so 外围，尤其是ui相关，用到了大量gpl代码，但是自己修改到的，也全部开源了，因为只要不涉及到核心算法的，也不是太在意啦 如果一般直接把.so带进去发布肯定是有问题的吧？ 我想的是，我实现一个和这个.so一模一样接口的另一个dummy library，实际上用这个so就完全不能达到预期目的，但也不会运行出错，只是意义不大而已。这样整体开源发布就没有破坏gpl 然后，提供个小程序让用户下载实际可用的so文件替换掉那个假的so文件。 这样会有什么问题么？大家有什么想法？]]></description>
			<content:encoded><![CDATA[<p>帮某家公司想的啦，我觉得这方法应该没有法律上的问题</p>
<p>有个核心算法库，没有依赖任何开源的东西，做成.so<br />
外围，尤其是ui相关，用到了大量gpl代码，但是自己修改到的，也全部开源了，因为只要不涉及到核心算法的，也不是太在意啦<br />
如果一般直接把.so带进去发布肯定是有问题的吧？</p>
<p>我想的是，我实现一个和这个.so一模一样接口的另一个dummy library，实际上用这个so就完全不能达到预期目的，但也不会运行出错，只是意义不大而已。这样整体开源发布就没有破坏gpl<br />
然后，提供个小程序让用户下载实际可用的so文件替换掉那个假的so文件。<br />
这样会有什么问题么？大家有什么想法？</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evan129.com/2010/04/26/%e7%bb%95%e8%bf%87gpl/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>周记</title>
		<link>http://www.evan129.com/2010/03/19/%e5%91%a8%e8%ae%b0/</link>
		<comments>http://www.evan129.com/2010/03/19/%e5%91%a8%e8%ae%b0/#comments</comments>
		<pubDate>Fri, 19 Mar 2010 14:07:13 +0000</pubDate>
		<dc:creator>Evan</dc:creator>
				<category><![CDATA[Diary]]></category>
		<category><![CDATA[Program]]></category>
		<category><![CDATA[Maemo]]></category>
		<category><![CDATA[N900]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[手机]]></category>
		<category><![CDATA[输入法]]></category>

		<guid isPermaLink="false">http://www.evan129.com/?p=766</guid>
		<description><![CDATA[工作上面比以前忙了些，由新来的以色列大妈管着了，反正事情就是多些了。 看联通号一直闲置浪费，也开始用了，换到了主力手机上。发现n900不支持动感地带的号码（或者只是不支持134这些新号段的），只好又用起了680。 装了下qt 4.7 的技术预览版，还有新的qt creator。我以前基本上没有接触过qt，也算试试看啦。qt安装需要自己编译，真是漫长。。 qt的几个demo都不错，尤其mobile-demo，我觉得效果很好，在mac上看起来效果也不错。 昨天才发现，n900上的qt程序里不支持用mscim输入。看了下changelog，mscim上次更新都是一个多月前了。这两天有点点小改动，主要是原来版本卸载后系统输入法好像还是不能用，修正了一下。还有几个码表名字改得好看了一点儿。我有想是不是把scim-qtimm的qt支持模块也移植上来，可是看起来可能也不是很容易的活。倒是him-scim这个项目人家做得好像也还可以，不知道是不是也把mscim换用him的前端呢。可是明明him前端也是gtk immodule而已，为什么它就支持在qt中的输入？我是有担心接下来换meego上，这些工作都白费啦。 最近半年多在跟的小说只有《凡人修仙传》了，之前跟的两本都完结了。 好像也没什么了？。。。 我决定每周至少更新一篇blog，不然每周都是自动twitter合集的文了。。。]]></description>
			<content:encoded><![CDATA[<p>工作上面比以前忙了些，由新来的以色列大妈管着了，反正事情就是多些了。</p>
<p>看联通号一直闲置浪费，也开始用了，换到了主力手机上。发现n900不支持动感地带的号码（或者只是不支持134这些新号段的），只好又用起了680。<br />
装了下qt 4.7 的技术预览版，还有新的qt creator。我以前基本上没有接触过qt，也算试试看啦。qt安装需要自己编译，真是漫长。。<br />
qt的几个demo都不错，尤其mobile-demo，我觉得效果很好，在mac上看起来效果也不错。</p>
<p>昨天才发现，n900上的qt程序里不支持用mscim输入。看了下changelog，mscim上次更新都是一个多月前了。这两天有点点小改动，主要是原来版本卸载后系统输入法好像还是不能用，修正了一下。还有几个码表名字改得好看了一点儿。我有想是不是把scim-qtimm的qt支持模块也移植上来，可是看起来可能也不是很容易的活。倒是him-scim这个项目人家做得好像也还可以，不知道是不是也把mscim换用him的前端呢。可是明明him前端也是gtk immodule而已，为什么它就支持在qt中的输入？我是有担心接下来换meego上，这些工作都白费啦。</p>
<p>最近半年多在跟的小说只有《凡人修仙传》了，之前跟的两本都完结了。</p>
<p>好像也没什么了？。。。 我决定每周至少更新一篇blog，不然每周都是自动twitter合集的文了。。。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evan129.com/2010/03/19/%e5%91%a8%e8%ae%b0/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>更新下飞信协议的研究</title>
		<link>http://www.evan129.com/2009/12/06/%e6%9b%b4%e6%96%b0%e4%b8%8b%e9%a3%9e%e4%bf%a1%e5%8d%8f%e8%ae%ae%e7%9a%84%e7%a0%94%e7%a9%b6/</link>
		<comments>http://www.evan129.com/2009/12/06/%e6%9b%b4%e6%96%b0%e4%b8%8b%e9%a3%9e%e4%bf%a1%e5%8d%8f%e8%ae%ae%e7%9a%84%e7%a0%94%e7%a9%b6/#comments</comments>
		<pubDate>Sat, 05 Dec 2009 16:05:56 +0000</pubDate>
		<dc:creator>Evan</dc:creator>
				<category><![CDATA[Program]]></category>
		<category><![CDATA[飞信]]></category>

		<guid isPermaLink="false">http://www.evan129.com/?p=695</guid>
		<description><![CDATA[我很早很早前就抓包研究过下飞信协议，那时还比较简单，除了访问导航服务器获得通信服务器ip外，之后只用和通信服务器联系就可以了。最近在做adium的飞信插件，原来用libfetion.cn的库的，那个全包装完了，就不用自己操心了，现在我改用fetion for pidgin的开源版的库，就可以自己做些补充改进了。其实它工作得还挺好的，只是小细节问题也不断，所以我打算重新研究下飞信协议。 升级到最新的飞信官方版，3.5.2540，然后把抓包工具升级了一下。嗯，这里推荐一下这个叫科来网络分析系统的软件，是个国产工具，个人抓包用它的免费技术交流版就可以了。我感觉很好用，哈，可能只是因为全中文界面？ 我看了fetion for pidgin的代码，里面模拟的版本号是3.3.0370的，看起来也不算很远前的。不过几处都是写死进字符串的，我把版本号提出来作为一个常量定义，这样以后会好改些。登录步骤发送的数据几乎和官方版是一模一样的，只有一个参数不同，&#60;device type=&#8221;pc&#8221; version=&#8221;0&#8243; &#8230;.&#62; 官方版中version是一串猜不出来意思的长数字串，不过看起来这里发送0也没有什么出错情况，我也没有去改动了。测试发现官方版如果连续多次密码输入错误，会弹出对话框显示一个图片验证码，这版插件里完全没有相关处理的代码。这两天有人在adium fetion插件页面留言说一直说密码错误，我怀疑就是出错若干次后，之后输对的也不能通过了。 当前的登录服务器还是221.176.31.1。登录后的步骤中有个sub订阅请求，带的内容n: compactlist，这个在飞信插件中也没有见到有发送该请求，我没有查到这个请求是为了更新什么信息。登录后还有一个s服务请求，n: getscore，这个很明显是请求飞信积分的，其实这玩意儿我也是今天登录才知道飞信也加了这种东西，不过相信一般用户没这个需求。还有个n: getofflinemessages在飞信插件中也没有实现，但这个命令很早前就有了，我怀疑是这个请求一直就收不到消息，所以不如不加？按说离线消息都发手机上了，哪还请求得到。 最主要区别大的是，现在的对话开始有专门的服务器了，这个和msn一样了，学谁不好，学这么麻烦的。发起方在打开一个非离线联系人，准备开始对话时，就有了以下请求 s fetion.com.cn sip-c/2.0 f: sid值 i: 递增值 q: 1 s n: startchat 服务器返回 sip-c/2.0 200 ok i: 如前值 q: 1 s a: cs address=&#8221;221.176.31.120:8080;221.176.31.120:443&#8243;,credential=&#8221;856933642.870995472&#8243;&#8221; 这样就可以去连221.176.31.120:8080或者443（我猜连后者就可以加密会话，不如目前没这个设置而已）来进行对话。连接上后进行注册 r fetion.com.cn sip-c/2.0 f: sid i: 1 q: 0 r a: ticks auth=&#8221;856933642.870995472&#8243; [...]]]></description>
			<content:encoded><![CDATA[<p>我很早很早前就抓包研究过下飞信协议，那时还比较简单，除了访问导航服务器获得通信服务器ip外，之后只用和通信服务器联系就可以了。最近在做adium的飞信插件，原来用libfetion.cn的库的，那个全包装完了，就不用自己操心了，现在我改用fetion for pidgin的开源版的库，就可以自己做些补充改进了。其实它工作得还挺好的，只是小细节问题也不断，所以我打算重新研究下飞信协议。</p>
<p>升级到最新的飞信官方版，3.5.2540，然后把抓包工具升级了一下。嗯，这里推荐一下这个叫<a href="http://www.colasoft.com.cn/">科来网络分析系统</a>的软件，是个国产工具，个人抓包用它的免费技术交流版就可以了。我感觉很好用，哈，可能只是因为全中文界面？<span id="more-695"></span></p>
<p>我看了fetion for pidgin的代码，里面模拟的版本号是3.3.0370的，看起来也不算很远前的。不过几处都是写死进字符串的，我把版本号提出来作为一个常量定义，这样以后会好改些。登录步骤发送的数据几乎和官方版是一模一样的，只有一个参数不同，&lt;device type=&#8221;pc&#8221; version=&#8221;0&#8243; &#8230;.&gt; 官方版中version是一串猜不出来意思的长数字串，不过看起来这里发送0也没有什么出错情况，我也没有去改动了。测试发现官方版如果连续多次密码输入错误，会弹出对话框显示一个图片验证码，这版插件里完全没有相关处理的代码。这两天有人在adium fetion插件页面留言说一直说密码错误，我怀疑就是出错若干次后，之后输对的也不能通过了。</p>
<p>当前的登录服务器还是221.176.31.1。登录后的步骤中有个sub订阅请求，带的内容n: compactlist，这个在飞信插件中也没有见到有发送该请求，我没有查到这个请求是为了更新什么信息。登录后还有一个s服务请求，n: getscore，这个很明显是请求飞信积分的，其实这玩意儿我也是今天登录才知道飞信也加了这种东西，不过相信一般用户没这个需求。还有个n: getofflinemessages在飞信插件中也没有实现，但这个命令很早前就有了，我怀疑是这个请求一直就收不到消息，所以不如不加？按说离线消息都发手机上了，哪还请求得到。</p>
<p>最主要区别大的是，现在的对话开始有专门的服务器了，这个和msn一样了，学谁不好，学这么麻烦的。发起方在打开一个非离线联系人，准备开始对话时，就有了以下请求<br />
s fetion.com.cn sip-c/2.0<br />
f: sid值<br />
i: 递增值<br />
q: 1 s<br />
n: startchat<br />
服务器返回<br />
sip-c/2.0 200 ok<br />
i: 如前值<br />
q: 1 s<br />
a: cs address=&#8221;221.176.31.120:8080;221.176.31.120:443&#8243;,credential=&#8221;856933642.870995472&#8243;&#8221;<br />
这样就可以去连221.176.31.120:8080或者443（我猜连后者就可以加密会话，不如目前没这个设置而已）来进行对话。连接上后进行注册<br />
r fetion.com.cn sip-c/2.0<br />
f: sid<br />
i: 1<br />
q: 0 r<br />
a: ticks auth=&#8221;856933642.870995472&#8243;<br />
k: text/html-fragment<br />
k: multiparty<br />
k: nudge<br />
k: share-background<br />
k: fetion-show<br />
这里就不用密码了，前面有发一个ticks来做验证，不过话说，这些信息都明文在网上传，完全可以捕获后来伪造成该发起人进行对话啊。从k域支持的内容来看，也比以前多了share-background和fetion-show，看来msn和qq都被抄了。<br />
登录成功后，可以邀请好友上来进行会话：<br />
s fetion.com.cn sip-c/2.0<br />
f: sid<br />
i: 2<br />
q: 0 s<br />
n: invitebuddy<br />
l: 85</p>
<p>&lt;args&gt;&lt;contacts&gt;&lt;contact uri=&#8221;sip:xxxxxxxx@fetion.com.cn;p=xxx&#8221; /&gt;&lt;/contacts&gt;&lt;/args&gt;<br />
不过我没有用两个官方版飞信来联测，一端用的是adium fetion。所以肯定丢了这个invitebuddy请求，而发起方发送的消息，还是由登录服务器正常发送过来了。应该是没有得到invitebuddy成功的答复包，所以还能走原来的路径。我就不能确定这种方式是不是一直能用了。现有的飞信插件显然没有考虑过要连这么多服务器的情况，我还没有测试如果同时打开几个会话，是不是会连不同的chat server，或者就算是同一个chat server，怎么来做不同组。这个chat server的引入看起来应该是为了实现负载均衡，但是这种方式开发实在太麻烦了，我还是更喜欢qq的方式，登录时就给你找个压力小的，连上后就不用这么搞来搞去了。</p>
<p>所以，最后情况就是，关于对话部分，我什么都没能改。我也重现了有用户反映的会发生明明消息发出，但提示超时的问题，这个我需要想想怎么处理，要么干脆把提示去了好了。今晚主要修正的是这插件原来在登录时一直是用在线方式登录，不符合pidgin和adium的用上次登出时状态来登录的习惯。另外还有，原来fetion for pidgin插件里的隐身状态值是899，这个值是错的，所以隐身会没有用。我从最新官方版上抓包的内容来看，隐身的状态号应该是0，其它的状态号倒都没有问题。</p>
<p>有谁也研究的，可以讨论讨论。。我把这个fetion for pidgin也升级后，以后可以用在n900上，给上面的pidgin加上飞信功能。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evan129.com/2009/12/06/%e6%9b%b4%e6%96%b0%e4%b8%8b%e9%a3%9e%e4%bf%a1%e5%8d%8f%e8%ae%ae%e7%9a%84%e7%a0%94%e7%a9%b6/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Android用NDK和整套源码下编译JNI的不同</title>
		<link>http://www.evan129.com/2009/10/18/android%e7%94%a8ndk%e5%92%8c%e6%95%b4%e5%a5%97%e6%ba%90%e7%a0%81%e4%b8%8b%e7%bc%96%e8%af%91jni%e7%9a%84%e4%b8%8d%e5%90%8c/</link>
		<comments>http://www.evan129.com/2009/10/18/android%e7%94%a8ndk%e5%92%8c%e6%95%b4%e5%a5%97%e6%ba%90%e7%a0%81%e4%b8%8b%e7%bc%96%e8%af%91jni%e7%9a%84%e4%b8%8d%e5%90%8c/#comments</comments>
		<pubDate>Sun, 18 Oct 2009 04:31:18 +0000</pubDate>
		<dc:creator>Evan</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Program]]></category>
		<category><![CDATA[jni]]></category>
		<category><![CDATA[ndk]]></category>
		<category><![CDATA[开发]]></category>

		<guid isPermaLink="false">http://www.evan129.com/?p=592</guid>
		<description><![CDATA[前些天要写个jni程序，因为才几行代码，想着用ndk开发可能容易些，就先研究了下。不过最终我的代码虽然只有几行，但需要libdl，因为用到了dlopen一类的函数，只能又换到用android源码体系下编译。 不过两个都用了下，就发现了些不同。我其实并不能确定这些是不是实际存在的差异的，我只是拿ndk的sample和我见到的android源码里的jni代码做的比较 1. ndk支持的库很少，所以用以前最好先看看自己需要的功能是不是已经包括了，省得白忙活。不过人家是有解释的，说ndk里有的库才是稳定的，其它的建议你不要用。嗯，google总是这一套说辞，不公开的api也是。至于要看android源码中多了哪些库，make modules后grep一下lib开头的应该就是了，不过也不是所有都能用啦。 2. 注册函数的方法是不同的。举例说，我在com/evan129/jnitest/jniutils.java有个native int foo()方法，需要在jni中实现 在ndk中，你只要实现这个函数，然后函数名是以jint java_com_evan129_jnitest_jniutils_foo(jnienv* env, jobject thiz) 命名既可。也就是说，如果你的jni只要实现这个函数，并且功能也很简单的话，那么你的jni c/cpp文件里只需要这一个函数就完事了。 但在android源码中编译jni代码是不同的，jni中的函数名无所谓。不过你至少还需要加一个 jniexport jint jnicall jni_onload(javavm* vm, void* reserved)方法，这个方法你可以找个现有的复制一把就行，检查运行环境的。然后主要是这个方法中会调用(*env).registernatives函数，在这里把jni中的方法和java文件中的方法关联起来。 看起来像是ndk自动补上了这部分工作，我并不清楚原理啦。 3. 有个很诡异的区别，自动传入的jnienv* env好像不是一个东西。因为在android源码中使用这个env一般是如env->newstringutf(&#8230;)，而ndk中sample里的一处是(*env)->newstringutf(&#8230;) 这env和*env差很大吧。但两处函数传入的都是jnienv* env，我只能怀疑jnienv的定义是不是都是不同的。 末了，就是说下我这个很简单的jni折腾了我两天的一个问题。如前所说，我是用android源码来编译的，自己在packages/app/下建了pinyinjni工程，下面有个jni目录，每次直接用mmm packages/app/pinyinjni/jni来编译。jni目录下的android.mk中指定的名字是这样的local_module := libpinyin 每次编译都很顺利，生成了libpinyin.so。但是我在java文件里，system.loadlibrary(&#8220;libpinyin&#8221;)总是失败。感谢paranoia@newsmth帮我解决了这个问题，告诉我在loadlibrary时用&#8221;pinyin&#8221;。但是，这个事情实在太奇怪了，那文件名是libpinyin.so啊，而且我在这里用/data/data/&#8230;/libpinyin.so这种完整路径也会失败，我以前虽然没写过jni，但调用过，用完整路径指定jni so文件应该不会有问题的。或者，从另一个角度想，如果我local_module的名字不是用lib开头的，那它调用时应该用什么名字？这个&#8221;lib&#8221;前缀又是哪步删除的？我没有多做测试了，但是猜想ndk中应该是没有这种诡异的问题的。]]></description>
			<content:encoded><![CDATA[<p>前些天要写个jni程序，因为才几行代码，想着用ndk开发可能容易些，就先研究了下。不过最终我的代码虽然只有几行，但需要libdl，因为用到了dlopen一类的函数，只能又换到用android源码体系下编译。<br />
不过两个都用了下，就发现了些不同。我其实并不能确定这些是不是实际存在的差异的，我只是拿ndk的sample和我见到的android源码里的jni代码做的比较<br />
1. ndk支持的库很少，所以用以前最好先看看自己需要的功能是不是已经包括了，省得白忙活。不过人家是有解释的，说ndk里有的库才是稳定的，其它的建议你不要用。嗯，google总是这一套说辞，不公开的api也是。至于要看android源码中多了哪些库，make modules后grep一下lib开头的应该就是了，不过也不是所有都能用啦。<br />
2. 注册函数的方法是不同的。举例说，我在com/evan129/jnitest/jniutils.java有个native int foo()方法，需要在jni中实现<br />
在ndk中，你只要实现这个函数，然后函数名是以jint java_com_evan129_jnitest_jniutils_foo(jnienv* env, jobject thiz) 命名既可。也就是说，如果你的jni只要实现这个函数，并且功能也很简单的话，那么你的jni c/cpp文件里只需要这一个函数就完事了。<br />
但在android源码中编译jni代码是不同的，jni中的函数名无所谓。不过你至少还需要加一个<br />
jniexport jint jnicall jni_onload(javavm* vm, void* reserved)方法，这个方法你可以找个现有的复制一把就行，检查运行环境的。然后主要是这个方法中会调用(*env).registernatives函数，在这里把jni中的方法和java文件中的方法关联起来。<br />
看起来像是ndk自动补上了这部分工作，我并不清楚原理啦。<br />
3. 有个很诡异的区别，自动传入的jnienv* env好像不是一个东西。因为在android源码中使用这个env一般是如env->newstringutf(&#8230;)，而ndk中sample里的一处是(*env)->newstringutf(&#8230;) 这env和*env差很大吧。但两处函数传入的都是jnienv* env，我只能怀疑jnienv的定义是不是都是不同的。</p>
<p>末了，就是说下我这个很简单的jni折腾了我两天的一个问题。如前所说，我是用android源码来编译的，自己在packages/app/下建了pinyinjni工程，下面有个jni目录，每次直接用mmm packages/app/pinyinjni/jni来编译。jni目录下的android.mk中指定的名字是这样的local_module := libpinyin 每次编译都很顺利，生成了libpinyin.so。但是我在java文件里，system.loadlibrary(&#8220;libpinyin&#8221;)总是失败。感谢paranoia@newsmth帮我解决了这个问题，告诉我在loadlibrary时用&#8221;pinyin&#8221;。但是，这个事情实在太奇怪了，那文件名是libpinyin.so啊，而且我在这里用/data/data/&#8230;/libpinyin.so这种完整路径也会失败，我以前虽然没写过jni，但调用过，用完整路径指定jni so文件应该不会有问题的。或者，从另一个角度想，如果我local_module的名字不是用lib开头的，那它调用时应该用什么名字？这个&#8221;lib&#8221;前缀又是哪步删除的？我没有多做测试了，但是猜想ndk中应该是没有这种诡异的问题的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evan129.com/2009/10/18/android%e7%94%a8ndk%e5%92%8c%e6%95%b4%e5%a5%97%e6%ba%90%e7%a0%81%e4%b8%8b%e7%bc%96%e8%af%91jni%e7%9a%84%e4%b8%8d%e5%90%8c/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Git-svn实在是有够慢</title>
		<link>http://www.evan129.com/2009/06/20/git-svn-is-really-slo/</link>
		<comments>http://www.evan129.com/2009/06/20/git-svn-is-really-slo/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 16:20:06 +0000</pubDate>
		<dc:creator>Evan</dc:creator>
				<category><![CDATA[Program]]></category>
		<category><![CDATA[git]]></category>

		<guid isPermaLink="false">http://www.evan129.com/?p=283</guid>
		<description><![CDATA[今天中午11点开始git svn checkout三个android源码副本，本地网络，网速超好，到下午五点，正好结束 objects数分别是135246, 95115, 108101。这还ok啦，毕竟svn 历史比较多。然后7pm前开始作svn源取下来后的一些操作，git gc, unpack一类的，到现在还有两个才压缩一半，最快的一个开始writing objects。不知道一个通宵搞不搞得完这些操作。]]></description>
			<content:encoded><![CDATA[<p>今天中午11点开始git svn checkout三个android源码副本，本地网络，网速超好，到下午五点，正好结束</p>
<p>objects数分别是135246, 95115, 108101。这还ok啦，毕竟svn 历史比较多。然后7pm前开始作svn源取下来后的一些操作，git gc, unpack一类的，到现在还有两个才压缩一半，最快的一个开始writing objects。不知道一个通宵搞不搞得完这些操作。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evan129.com/2009/06/20/git-svn-is-really-slo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Howto change the startup animation of Android OS</title>
		<link>http://www.evan129.com/2009/06/16/howto-change-the-startup-animation-of-android-os/</link>
		<comments>http://www.evan129.com/2009/06/16/howto-change-the-startup-animation-of-android-os/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 07:01:47 +0000</pubDate>
		<dc:creator>Evan</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Program]]></category>

		<guid isPermaLink="false">http://www.evan129.com/?p=277</guid>
		<description><![CDATA[the statup animation means the one you see before the launcher application comes out. it was a line with a red point goes from left to right again and again before, in android 1.0. currently, on cupcake, it&#8217;s a text string, &#8220;android&#8221;, with shine goes from left to right. i found someone add an advertisement [...]]]></description>
			<content:encoded><![CDATA[<p>the statup animation means the one you see before the launcher application comes out.<br />
it was a line with a red point goes from left to right again and again before, in android 1.0. currently, on cupcake, it&#8217;s a text string, &#8220;android&#8221;, with shine goes from left to right.<br />
i found someone add an advertisement logo to that animation in a customized rom. so i studied how to remove that, or make a new one by myself.</p>
<p>finally, i found it out. there are 2 pictures under frameworks/base/core/res/assets/images:<br />
android-logo-mask.png<br />
android-logo-shine.png</p>
<p>the 1st one is the background. then, you can edit it with picture editor, like add your own name on it.<br />
well, after edited it, you need to build framework-res out, with command &#8220;make framework-res&#8221;. then, you will get a new framework-res.apk. but usually, you can not use this file to replace the one in the rom/firmware for real devices, like g1, g2. since, some resources are not under the same version.<br />
what i do is pull out the original framework-res.apk from the rom. unzip both this framework-res.apk and the one i made by myself. replace the 2 pictures under assests/images with the one i made before. notice, you can not replace the files with the png files you edited, but not compiled.<br />
then zip out framework-res.apk again, and sign with signapk tool. now you can use the new framework-res.apk to replace the original one.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evan129.com/2009/06/16/howto-change-the-startup-animation-of-android-os/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>糟糕的G1性能。。</title>
		<link>http://www.evan129.com/2009/04/21/g1_performance_is_really_bad/</link>
		<comments>http://www.evan129.com/2009/04/21/g1_performance_is_really_bad/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 10:10:43 +0000</pubDate>
		<dc:creator>Evan</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Program]]></category>
		<category><![CDATA[Benchmark]]></category>

		<guid isPermaLink="false">http://www.evan129.com/?p=254</guid>
		<description><![CDATA[今天工作需要，对g1上的数据操作做benchmark，真恐怖啊。删两千条短信要15分钟，zeze.. 测试的版本是: g1 us version kernel: 2.6.25-01843-gfea26b0 build: dream_devphone_userdebug 1.0 unlocked 116222 test-keys 来，看看短信的结果，单位是毫秒啦。 insert query update all delete all insert again query again update 1 by 1 delete 1 by 1 1 sms 266 30 35 46 144 30 35 48 10 sms 1012 32 37 102 964 42 389 528 100 sms 10480 [...]]]></description>
			<content:encoded><![CDATA[<p>今天工作需要，对g1上的数据操作做benchmark，真恐怖啊。删两千条短信要15分钟，zeze..<br />
<span id="more-254"></span><br />
测试的版本是: g1 us version<br />
kernel: 2.6.25-01843-gfea26b0<br />
build: dream_devphone_userdebug 1.0 unlocked 116222 test-keys<br />
来，看看短信的结果，单位是毫秒啦。</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="width: 100px;"></td>
<td style="width: 100px;">insert</td>
<td style="width: 100px;">query</td>
<td style="width: 110px;">update all</td>
<td style="width: 110px;">delete all</td>
<td style="width: 110px;">insert again</td>
<td style="width: 110px;">query again</td>
<td style="width: 110px;">update 1 by 1</td>
<td style="width: 110px;">delete 1 by 1</td>
</tr>
<tr>
<td>1 sms</td>
<td>266</td>
<td>30</td>
<td>35</td>
<td>46</td>
<td>144</td>
<td>30</td>
<td>35</td>
<td>48</td>
</tr>
<tr>
<td>10 sms</td>
<td>1012</td>
<td>32</td>
<td>37</td>
<td>102</td>
<td>964</td>
<td>42</td>
<td>389</td>
<td>528</td>
</tr>
<tr>
<td>100 sms</td>
<td>10480</td>
<td>124</td>
<td>50</td>
<td>1961</td>
<td>10635</td>
<td>71</td>
<td>3709</td>
<td>7209</td>
</tr>
<tr>
<td>200 sms</td>
<td>21603</td>
<td>98</td>
<td>76</td>
<td>7500</td>
<td>21190</td>
<td>113</td>
<td>7885</td>
<td>17843</td>
</tr>
<tr>
<td>300 sms</td>
<td>32427</td>
<td>151</td>
<td>82</td>
<td>17522</td>
<td>33730</td>
<td>144</td>
<td>12882</td>
<td>33005</td>
</tr>
<tr>
<td>500 sms</td>
<td>59389</td>
<td>240</td>
<td>142</td>
<td>52013</td>
<td>58957</td>
<td>249</td>
<td>34862</td>
<td>75651</td>
</tr>
<tr>
<td>1000 sms</td>
<td>127083</td>
<td>543</td>
<td>241</td>
<td>210535</td>
<td>135372</td>
<td>489</td>
<td>43519</td>
<td>271139</td>
</tr>
<tr>
<td>2000 sms</td>
<td>306354</td>
<td>1045</td>
<td>581</td>
<td>923458</td>
<td>314241</td>
<td>1189</td>
<td>103630</td>
<td>1023005</td>
</tr>
</tbody>
</table>
<p>还没测试过cupcake的表现怎么样。听说g1 cpu很弱，看来果然是真的。<br />
2000条短信的测试只做了一轮，实在太花时间了，和前面比都不是等比例的增长了。但是即使是测过多次，数值较稳定的1000条短信的情况，也要删三分多钟。还是怀念用palm的时光</p>
<p>值得欣慰的是1000条短信的对话，用短信程序打开，载入不到3秒，这点还是很好的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evan129.com/2009/04/21/g1_performance_is_really_bad/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>试用git-svn</title>
		<link>http://www.evan129.com/2009/03/21/%e8%af%95%e7%94%a8git-svn/</link>
		<comments>http://www.evan129.com/2009/03/21/%e8%af%95%e7%94%a8git-svn/#comments</comments>
		<pubDate>Sat, 21 Mar 2009 13:28:49 +0000</pubDate>
		<dc:creator>Evan</dc:creator>
				<category><![CDATA[Program]]></category>
		<category><![CDATA[git]]></category>

		<guid isPermaLink="false">http://www.evan129.com/?p=209</guid>
		<description><![CDATA[首先介绍下mac os x上用macports怎么安装git-svn，网上很多文章都说git在1.5.3版本后自带git-svn了，但我运行git svn提示是没有这个命令的。我的git是因为原来要下载android源码时，按google的说明，用sudo port install git-core安装的。 网上搜了半天，才知道结果，还有人自己编译的，依赖比较多，我觉得太麻烦了。简单来说，如果原来已经像上面说的已经装了git-core的话，需要先sudo port uninstall git-core。安装的话，是用sudo port install git-core +svn这个命令，就会在编译时带上+svn参数了 入门介绍的文章还是比较多的，比如 http://www.robinlu.com/blog/archives/194 在第一步git svn clone时确实比较花时间。看输出的log，似乎是首先取svn上最早的一个版本下来，然后不停的取下一个新版本的更新的部分。所以时间确实比较久，导出我们公司svn的trunk用了两个钟头才完。不过导出后，所有的svn log在本地都有记录了。目录并没有大多少。网上文章一般说在导出后需要做一次git gc。但是我目前用的这个版本git version 1.6.2.1，似乎已经会在git svn clone完后自动做一次git gc了。 刚刚开始使用，才第一次用它提交了个代码。再有心得时再补充吧]]></description>
			<content:encoded><![CDATA[<p>首先介绍下mac os x上用macports怎么安装git-svn，网上很多文章都说git在1.5.3版本后自带git-svn了，但我运行git svn提示是没有这个命令的。我的git是因为原来要下载android源码时，按google的说明，用sudo port install git-core安装的。<br />
网上搜了半天，才知道结果，还有人自己编译的，依赖比较多，我觉得太麻烦了。简单来说，如果原来已经像上面说的已经装了git-core的话，需要先sudo port uninstall git-core。安装的话，是用sudo port install git-core +svn这个命令，就会在编译时带上+svn参数了</p>
<p>入门介绍的文章还是比较多的，比如 <a href="http://www.robinlu.com/blog/archives/194">http://www.robinlu.com/blog/archives/194</a><br />
在第一步git svn clone时确实比较花时间。看输出的log，似乎是首先取svn上最早的一个版本下来，然后不停的取下一个新版本的更新的部分。所以时间确实比较久，导出我们公司svn的trunk用了两个钟头才完。不过导出后，所有的svn log在本地都有记录了。目录并没有大多少。网上文章一般说在导出后需要做一次git gc。但是我目前用的这个版本git version 1.6.2.1，似乎已经会在git svn clone完后自动做一次git gc了。</p>
<p>刚刚开始使用，才第一次用它提交了个代码。再有心得时再补充吧</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evan129.com/2009/03/21/%e8%af%95%e7%94%a8git-svn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>写了个Adium的飞信插件</title>
		<link>http://www.evan129.com/2009/03/17/%e5%86%99%e4%ba%86%e4%b8%aaadium%e7%9a%84%e9%a3%9e%e4%bf%a1%e6%8f%92%e4%bb%b6/</link>
		<comments>http://www.evan129.com/2009/03/17/%e5%86%99%e4%ba%86%e4%b8%aaadium%e7%9a%84%e9%a3%9e%e4%bf%a1%e6%8f%92%e4%bb%b6/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 04:43:08 +0000</pubDate>
		<dc:creator>Evan</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Program]]></category>
		<category><![CDATA[Adium]]></category>
		<category><![CDATA[飞信]]></category>

		<guid isPermaLink="false">http://www.evan129.com/?p=192</guid>
		<description><![CDATA[下载页面请看这里 http://www.evan129.com/mywork/fetion-plugin-for-adium/ 周末花了一天半写的。以前虽然看过点cocoa入门的文章，但从来没有试过，没有一个想做的东西，就不是很有热情投入去学习。因为我很早就研究过飞信的协议，曾经还做过一个java版的，所以本来想自己实现协议部分的。但完成了登录部分后，就发觉实在太麻烦了，一门不熟悉的语言，要处理字符串和线程一类的很让人头疼。于是就用了libfetion的库啦。这库用起来还是挺方便的，可惜出来都快一整年了，功能还是很少，比如没有读好友头像，传文件一类的。 打算接下来写篇关于adium插件开发的文章。嗯]]></description>
			<content:encoded><![CDATA[<p>下载页面请看这里 <a href="http://www.evan129.com/mywork/fetion-plugin-for-adium/">http://www.evan129.com/mywork/fetion-plugin-for-adium/</a></p>
<p>周末花了一天半写的。以前虽然看过点cocoa入门的文章，但从来没有试过，没有一个想做的东西，就不是很有热情投入去学习。因为我很早就研究过飞信的协议，曾经还做过一个java版的，所以本来想自己实现协议部分的。但完成了登录部分后，就发觉实在太麻烦了，一门不熟悉的语言，要处理字符串和线程一类的很让人头疼。于是就用了libfetion的库啦。这库用起来还是挺方便的，可惜出来都快一整年了，功能还是很少，比如没有读好友头像，传文件一类的。</p>
<p>打算接下来写篇关于adium插件开发的文章。嗯</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evan129.com/2009/03/17/%e5%86%99%e4%ba%86%e4%b8%aaadium%e7%9a%84%e9%a3%9e%e4%bf%a1%e6%8f%92%e4%bb%b6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android中要小心的一种内存泄露</title>
		<link>http://www.evan129.com/2009/03/14/avoiding-memory-leaks/</link>
		<comments>http://www.evan129.com/2009/03/14/avoiding-memory-leaks/#comments</comments>
		<pubDate>Sat, 14 Mar 2009 13:26:35 +0000</pubDate>
		<dc:creator>Evan</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Program]]></category>

		<guid isPermaLink="false">http://www.evan129.com/?p=178</guid>
		<description><![CDATA[今天把android-developers blog上的一些文章看了下，有篇文章《avoiding memory leaks》虽然以前也扫了眼，今天再看了一遍，觉得好bt啊。 private static Drawable sBackground; &#160; @Override protected void onCreate&#40;Bundle state&#41; &#123; super.onCreate&#40;state&#41;; &#160; TextView label = new TextView&#40;this&#41;; label.setText&#40;&#34;Leaks are bad&#34;&#41;; &#160; if &#40;sBackground == null&#41; &#123; sBackground = getDrawable&#40;R.drawable.large_bitmap&#41;; &#125; label.setBackgroundDrawable&#40;sBackground&#41;; &#160; setContentView&#40;label&#41;; &#125; 这段代码看得出会内存泄露么？按文中解释说，因为setbackgrounddrawable时，会在drawable中把label这个textview设为callback，就是说drawable中对label有引用，而label中对当前activity的context也有引用。所以当转屏时，系统自动重新建立ui时，原有的整个activity都不能被回收。 作为一个普通的java程序员，真的能想到这个么？文档里也没有提示过，没看到这篇文章，又没自己去看drawable的源代码的开发者，怎么能猜到这个。至少在我第一印象中，我是觉得drawable对象只是类似于image的一类对象。系统竟然在我不注意的时候自动设置了callback。唉，我得检查检查自己的代码中有没有这样的问题了。我不知道除了这个drawable外，还有没有其它类似的东西，真是防不胜防啊 03-15增： 不过我想了下，好像也有点不对啊 当第二次重设label.setbackgrounddrawable(sbackground);时，应该是把sbackground的 callback改回成当前的label啦。那这时gc不就应该能工作么]]></description>
			<content:encoded><![CDATA[<p>今天把android-developers blog上的一些文章看了下，有篇文章《<a href="http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html" target="_blank">avoiding memory leaks</a>》虽然以前也扫了眼，今天再看了一遍，觉得好bt啊。</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> Drawable sBackground<span style="color: #339933;">;</span>
&nbsp;
@Override
<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">void</span> onCreate<span style="color: #009900;">&#40;</span>Bundle state<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">onCreate</span><span style="color: #009900;">&#40;</span>state<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  TextView label <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> TextView<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  label.<span style="color: #006633;">setText</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Leaks are bad&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>sBackground <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    sBackground <span style="color: #339933;">=</span> getDrawable<span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">large_bitmap</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  label.<span style="color: #006633;">setBackgroundDrawable</span><span style="color: #009900;">&#40;</span>sBackground<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  setContentView<span style="color: #009900;">&#40;</span>label<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>这段代码看得出会内存泄露么？按文中解释说，因为setbackgrounddrawable时，会在drawable中把label这个textview设为callback，就是说drawable中对label有引用，而label中对当前activity的context也有引用。所以当转屏时，系统自动重新建立ui时，原有的整个activity都不能被回收。</p>
<p>作为一个普通的java程序员，真的能想到这个么？文档里也没有提示过，没看到这篇文章，又没自己去看drawable的源代码的开发者，怎么能猜到这个。至少在我第一印象中，我是觉得drawable对象只是类似于image的一类对象。系统竟然在我不注意的时候自动设置了callback。唉，我得检查检查自己的代码中有没有这样的问题了。我不知道除了这个drawable外，还有没有其它类似的东西，真是防不胜防啊</p>
<blockquote><p>03-15增： 不过我想了下，好像也有点不对啊<br />
当第二次重设label.setbackgrounddrawable(sbackground);时，应该是把sbackground的<br />
callback改回成当前的label啦。那这时gc不就应该能工作么</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.evan129.com/2009/03/14/avoiding-memory-leaks/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
