<?xml version="1.0" encoding="UTF-8"?><rss version="0.92">
<channel>
	<title>其实我是一个程序员</title>
	<link>http://liubin.nanshapo.com</link>
	<description>编程是一种乐趣</description>
	<lastBuildDate>Thu, 08 Dec 2011 12:31:59 +0000</lastBuildDate>
	<docs>http://backend.userland.com/rss092</docs>
	<language>en</language>
	<!-- generator="WordPress/3.2.1" -->

	<item>
		<title>永远免费的Paas云平台总结（2011年版）</title>
		<description><![CDATA[这是一篇翻译文，原文见： http://www.publickey1.jp/blog/11/paas2011.html &#160; PHP fog是以PHP语言为开发工具的Paas云计算平台，近日，他们在blog上宣布 ， 运营公司宣布废除之前的6个月免费使用限制，变为永远免费，而且， 还可以免费的部署3个应用。 当然，免费使用的服务有很多资源上的限制，但是， 像Wordpress等软件还是能自由部署运营的。 实际上，永久免费的Paas型云平台除了PHP fog之外，还有几个， 这里顺便一块介绍一下。 PHP fog 就像它的名字里暗示的一样，它主要是提供PHP执行环境的平台，除了PHP， 当然更少不了Mysql。此外，还可以安装WordPress，Drupal，Sugar CRM， Joomla等常用程序。 免费使用的资源包括：内存和CPU为公用，存储空间为100MB， 数据库大小为20MB；最多可以部署安装3个应用。 网址：https://phpfog.com/ Heroku HeroKu支持Ruby on Rails，Clojure，Java，Node.js等几种编程语言（系统）， 数据库为PostgreSQL。它也是作为Facebook应用的平台，广泛被使用的Paas平台。 在Heroku上，对于每一个进程采用一个叫Dyno的单位来进行性能管理， 增加这个值，则能提高应用的相应速度和吞吐量。有适用于Web server的 Web dyno和作为后台进程的Worker dyno。 如果一个月使用时间在750小时以下的话，Dyno是免费的， 数据库的大小则限制为5MB以下免费。 不过，仔细算算，即使一个月有31天，算下来也只有744小时而已， 所以如果不使用Worker dyno，只做Web应用的话，也可以说的上是免费的了。 网址：http://www.heroku.com cloudControl cloudControl是德国的一个创业公司运营的支持PHP的Paas平台， 数据库支持Mysql和MongoDB，Xeround等。 在cloudControl上，以BOX为单位对应用进行管理， 一个BOX由在不同的虚拟机上的两个进程组成，即使一台机器出问题， 以可以自动检测到问题并且还到可用的虚拟机上。可以通过增加BOX来提高应用的性能。 cloudControl，对于一个部署，提供一个免费的BOX和memcached。 虽然可以使用mysql或MongoDB，但是关于这方面的限制规定等没有找到。 网址：http://cloudcontrol.com dotCloud dotCloud支持PHP，Perl，Java，Python，数据库则支持Mysql， PostgreSQL，Cassandra，MongoDB，CounchDB，Redis等， 且支持Memcached，RabbitMQ，Hadoop等各种环境。 不管选择哪种语言和数据库环境，用户都可以免费建立两个应用， 且支持SSL和EMAIL系统。 而且，这个平台对于OpenSource的黑客，学生，创业者， [...]]]></description>
		<link>http://liubin.nanshapo.com/2011/12/08/forever-free-paas-cloud-2011-version/</link>
			</item>
	<item>
		<title>doctrine和mysql的timestamp问题</title>
		<description><![CDATA[如果在mysql里定义为timestamp，默认的mapping会作为datetime类型的： /** * @var datetime $calendarTs * * @ORM\Column(name=&#8221;calendar_ts&#8221;, type=&#8221;datetime&#8221;, nullable=false) */ 如果在php里这样设置: $obj->setMyTsField(date(&#8216;Y-m-d H:i:s&#8217;)); 会出错： atal error: Call to a member function format() on a non-object in /vendor/doctrine-dbal/lib/Doctrine/DBAL/Types/DateTimeType.php on line 44 原因在于，date() 返回字的数据类型为符串类型，而 &#8220;datetime&#8221;的属性只能设置为 DateTime 对象。 如下修改，就可以了： $obj->setMyTsField(new \DateTime());]]></description>
		<link>http://liubin.nanshapo.com/2011/06/20/doctrine-timestamp-mysql/</link>
			</item>
	<item>
		<title>howto do git replace</title>
		<description><![CDATA[代码提交后，如果还要再改一次，如何修改？ 首先在本地修改代码 再执行如下命令： git add ./ git commit &#8211;amend repo upload ./ &#8211;replace]]></description>
		<link>http://liubin.nanshapo.com/2011/03/04/howto-do-git-replace/</link>
			</item>
	<item>
		<title>android的收彩信通知的过程解析</title>
		<description><![CDATA[这里对froyo(非标准)里mms模块收彩信的函数调用关系进行一点解说。这里只说的是收到彩信，但是还没有下载（设为手工下载） 首先，mms是通过WAPPUSH实现的，具体在com.android.internal.telephony包里的WapPushOverSms类。 这个类里除了构造函数，另一个public的就是dispatchWapPdu()了 仔细查看下，就会找到dispatchWapPdu_MMS()这个函数 private void dispatchWapPdu_MMS(byte[] pdu, int transactionId, int pduType, &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; int&#160;headerStartIndex, int headerLength) { &#160; &#160; &#160; &#160; byte[]&#160;header = new byte[headerLength]; &#160; &#160; &#160; &#160; System.arraycopy(pdu, headerStartIndex, header, 0, header.length); &#160; &#160; &#160; &#160; [...]]]></description>
		<link>http://liubin.nanshapo.com/2011/02/19/android-mms-receive/</link>
			</item>
	<item>
		<title>XXX烧鸡步骤</title>
		<description><![CDATA[1。关机，拔电池 2。按住相机按钮的同时按电源键 3。sudo ./fastboot devices 确认设备链接成功 4。sudo ./fastboot erase userdata 删除用户数据 5。sudo ./fastboot flash boot boot_xxx.img 烧写boot信息 6。sudo ./fastboot flast system system_xxx.img 烧写 system镜像]]></description>
		<link>http://liubin.nanshapo.com/2011/02/14/xxx_flash/</link>
			</item>
	<item>
		<title>如何让自己的应用在应用程序列表里排在前面</title>
		<description><![CDATA[普通的android的home程序里的应用一览，应该是按照字母顺序升续排列的，不光是android，其它平台可能也类似，很多东西都有按字母排列这一功能，这也是angry bird起名的由来吧，a怎么排都靠前。那么我们自己的程序必须要遵守这个规则吗？如果用汉字岂不是要排到很后面去了？ 答案是有小窍门，可以把你的“汉字”的应用名排到前面去，那就是修改app_name的值 先看看如何做吧，以应用汇为例 在values/string.xml里有如下代码 &#60;resources&#62; &#160; &#60;string&#160;name=&#34;app_name&#34;&#62;\u0020掌上应用汇&#60;/string&#62; &#160; &#60;string&#160;name=&#34;label&#34;&#62;掌上应用汇&#60;/string&#62; &#60;/resources&#62; 怎么样，一下子就明白了吧，app_name前面应该是有个空格，这样可以保证这个程序甚至可以排到a开头的程序的前面 掌上应用汇做的比较巧妙]]></description>
		<link>http://liubin.nanshapo.com/2011/02/10/order-first-of-all-apps/</link>
			</item>
	<item>
		<title>用Handler也能同步操作</title>
		<description><![CDATA[用Handler多数是为了异步操作，不阻塞UI线程的操作，可以防止ANR等。 今天看com.android.internal.telephony.gsm.SimSmsInterfaceManager的实现发现如下操作： Handler mHandler = new Handler() { &#160; &#160; &#160; &#160; @Override &#160; &#160; &#160; &#160; public&#160;void handleMessage(Message msg) { &#160; &#160; &#160; &#160; &#160; &#160; switch&#160;(msg.what) { &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; case&#160;EVENT_UPDATE_DONE: &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; synchronized&#160;(mLock) { &#160; &#160; &#160; &#160; &#160; [...]]]></description>
		<link>http://liubin.nanshapo.com/2011/01/31/synchronous-operation-with-handler/</link>
			</item>
	<item>
		<title>从android的framebuffer里取图</title>
		<description><![CDATA[在网上看到的 只需要如下命令即可： $ adb shell # cat /dev/graphics/fb0 > /sdcard/frame.raw 然后用FFMPEG转换为png $ IMAGE_RES=320&#215;480 $ RAW_IMAGE=frame.raw $ OUT_IMAGE=frame-%d.png $ #Download the raw data $ adb pull /sdcard/$RAW_IMAGE . $ ffmpeg -vcodec rawvideo -f rawvideo -pix_fmt rgb565 -s $IMAGE_RES \ -i $RAW_IMAGE -f image2 -vcodec png $OUT_IMAGE 可以参考http://my.opera.com/otaku_2r/blog/grab-a-frame-in-android-frame-buffer]]></description>
		<link>http://liubin.nanshapo.com/2011/01/13/grab-a-frame-in-android-frame-buffer/</link>
			</item>
	<item>
		<title>线程问题引起的内存泄露</title>
		<description><![CDATA[最近解决的一个内存泄露，竟然是由于线程问题引起的 看看下面代码，如何？ new Thread(new Runnable() { &#160; &#160; &#160; &#160; &#160; &#160; public&#160;void run() { &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; MessagingNotification.updateSendFailedNotificationForThread(ComposeMessageActivity.this, threadId); &#160; &#160; &#160; &#160; &#160; &#160; } &#160; &#160; &#160; &#160; }).run(); 有什么问题吗？ 对，这段代码生成了一个thread的对象，竟然调用了run方法，这引起了内存泄露。 必须改为start才行。 而run方法，只是调用了Runnable的run方法而已： // Thread.class public void run() { &#160; &#160; if&#160;(target != null) { &#160; &#160; [...]]]></description>
		<link>http://liubin.nanshapo.com/2010/12/28/memory-leak-for-the-thread/</link>
			</item>
	<item>
		<title>activity的启动方式（launch mode）</title>
		<description><![CDATA[在android里，有4种activity的启动模式，分别为： &#8220;standard&#8221; (默认) &#8220;singleTop&#8221; &#8220;singleTask&#8221; &#8220;singleInstance&#8221; 它们主要有如下不同： 1. 如何决定所属task &#8220;standard&#8221;和&#8221;singleTop&#8221;的activity的目标task，和收到的Intent的发送者在同一个task内，除非intent包括参数FLAG_ACTIVITY_NEW_TASK。 如果提供了FLAG_ACTIVITY_NEW_TASK参数，会启动到别的task里。 &#8220;singleTask&#8221;和&#8221;singleInstance&#8221;总是把activity作为一个task的根元素，他们不会被启动到一个其他task里。 2. 是否允许多个实例 &#8220;standard&#8221;和&#8221;singleTop&#8221;可以被实例化多次，并且存在于不同的task中，且一个task可以包括一个activity的多个实例； &#8220;singleTask&#8221;和&#8221;singleInstance&#8221;则限制只生成一个实例，并且是task的根元素。 singleTop要求如果创建intent的时候栈顶已经有要创建 的Activity的实例，则将intent发送给该实例，而不发送给新的实例。 3. 是否允许其它activity存在于本task内 &#8220;singleInstance&#8221;独占一个task，其它activity不能存在那个task里；如果它启动了一个新的activity，不管新的activity的launch mode 如何，新的activity都将会到别的task里运行（如同加了FLAG_ACTIVITY_NEW_TASK参数）。 而另外三种模式，则可以和其它activity共存。 4. 是否每次都生成新实例 &#8220;standard&#8221;对于没一个启动Intent都会生成一个activity的新实例； &#8220;singleTop&#8221;的activity如果在task的栈顶的话，则不生成新的该activity的实例，直接使用栈顶的实例，否则，生成该activity的实例。 比如现在task栈元素为A-B-C-D（D在栈顶），这时候给D发一个启动intent，如果D是 &#8220;standard&#8221;的，则生成D的一个新实例，栈变为A－B－C－D－D。 如果D是singleTop的话，则不会生产D的新实例，栈状态仍为A-B-C-D 如果这时候给B发Intent的话，不管B的launchmode是&#8221;standard&#8221; 还是 &#8220;singleTop&#8221; ，都会生成B的新实例，栈状态变为A-B-C-D-B。 &#8220;singleInstance&#8221;是其所在栈的唯一activity，它会每次都被重用。 &#8220;singleTask&#8221;如果在栈顶，则接受intent，否则，该intent会被丢弃，但是该task仍会回到前台。 当已经存在的activity实例处理新的intent时候，会调用onNewIntent()方法 如果收到intent生成一个activity实例，那么用户可以通过back键回到上一个状态；如果是已经存在的一个activity来处理这个intent的话，用户不能通过按back键返回到这之前的状态。]]></description>
		<link>http://liubin.nanshapo.com/2010/12/23/activity-launch-mode/</link>
			</item>
</channel>
</rss>

