<?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>Inspiration from life</title>
	<atom:link href="http://blog.chengbo.net/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.chengbo.net</link>
	<description>enjoy everyday</description>
	<lastBuildDate>Sat, 28 Apr 2012 00:15:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>使用Gitolite来对Git的repository实现权限控制</title>
		<link>http://blog.chengbo.net/2012/04/20/use-gitolite-to-manage-git-repositories.html</link>
		<comments>http://blog.chengbo.net/2012/04/20/use-gitolite-to-manage-git-repositories.html#comments</comments>
		<pubDate>Fri, 20 Apr 2012 06:15:59 +0000</pubDate>
		<dc:creator>chengbo</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Gitolite]]></category>

		<guid isPermaLink="false">http://blog.chengbo.net/?p=379</guid>
		<description><![CDATA[我们项目组打算从svn向git迁移，前几天我搭建了git环境，把代码从svn转移过来，然后所有成员都通过server上的git账号来做pull和push，一切都安置妥当，没有问题。但是后来其它项目组也打算使用这个git server，那么问题来了，之前那种授权的方式肯定是不够的，因为只要能连上server，那么他对这个server上所有的repository都有完全的读写权限，这显然是不可接受的。 所以打算使用Gitolite这个组件来做权限控制，搜索了下，找到的文章貌似都是老版本的，所以有了写这篇文章的想法。 Gitolite其实也是一个git repository，首先在server上安装好后，在client上把server上的repository clone下来，在本地做一些更改，再push回server，server端的hooks会根据push上来的配置来更新权限。 接下来，介绍下安装和配置步骤 准备工作 如果你之前是用git账号来做权限控制的话，记得把/etc/passwd里git用户的shell换回/bin/bash，然后把~git/.ssh/authorized_key里不再需要的key移除。 用ssh-kengen生成一对key，比如your-name和your-name.pub（下文均以此为例） 拷贝私钥到本用户的.ssh文件夹中 mv your-name ~/.ssh/ 拷贝公钥到git server上 scp you-name.pub git@your.server.name.or.ip.address:~ 为了以后方便，这里可以做一个server别名，指定连接所需的用户名，server的地址、端口以及私钥 vim ~/.ssh/config 输入以下内容 host githost user your-name hostname your.server.name.or.ip.address port 22 identityfile ~/.ssh/your-name 安装Gitolite 登录git server ssh git@your.server.name.or.ip.address 下载最新的Gitolite git clone git://github.com/sitaramc/gitolite 安装，这里说明下，安装方式有3种，区别在与指定生成gitolite可执行文件的路径，这里采用Gitolite作者推荐的第二种，也就是把文件生成到$HOME/bin中，这样可以在接下来的bash中直接执行gitolite命令而不用指定路径(如果你的~/bin目录不存在记得先mkdir ~/bin) gitolite/install -ln 设置，由于是第一次运行这个命令，所以这里指定的key是拥有Gitolite管理员权限的 gitolite setup -pk your-name.pub 此命令会在你的~/repositories/目录生成两个repository：gitolite-admin.git和testing.git 配置权限 退到你的workstation上 exit...  <a href="http://blog.chengbo.net/2012/04/20/use-gitolite-to-manage-git-repositories.html" class="more-link" title="Read 使用Gitolite来对Git的repository实现权限控制">Read more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>我们项目组打算从svn向git迁移，前几天我搭建了git环境，把代码从svn转移过来，然后所有成员都通过server上的git账号来做pull和push，一切都安置妥当，没有问题。但是后来其它项目组也打算使用这个git server，那么问题来了，之前那种授权的方式肯定是不够的，因为只要能连上server，那么他对这个server上所有的repository都有完全的读写权限，这显然是不可接受的。</p>
<p>所以打算使用Gitolite这个组件来做权限控制，搜索了下，找到的文章貌似都是老版本的，所以有了写这篇文章的想法。</p>
<p>Gitolite其实也是一个git repository，首先在server上安装好后，在client上把server上的repository clone下来，在本地做一些更改，再push回server，server端的hooks会根据push上来的配置来更新权限。</p>
<p>接下来，介绍下安装和配置步骤</p>
<h3>准备工作</h3>
<p>如果你之前是用git账号来做权限控制的话，记得把<code>/etc/passwd</code>里git用户的shell换回<code>/bin/bash</code>，然后把<code>~git/.ssh/authorized_key</code>里不再需要的key移除。</p>
<p>用<code>ssh-kengen</code>生成一对key，比如your-name和your-name.pub（下文均以此为例）</p>
<p>拷贝私钥到本用户的.ssh文件夹中</p>
<pre class="brush: bash; gutter: true">mv your-name ~/.ssh/</pre>
<p>拷贝公钥到git server上</p>
<pre class="brush: bash; gutter: true">scp you-name.pub git@your.server.name.or.ip.address:~</pre>
<p>为了以后方便，这里可以做一个server别名，指定连接所需的用户名，server的地址、端口以及私钥</p>
<pre class="brush: bash; gutter: true">vim ~/.ssh/config</pre>
<p>输入以下内容</p>
<pre class="brush: text; gutter: true">host githost
user your-name
hostname your.server.name.or.ip.address
port 22
identityfile ~/.ssh/your-name</pre>
<h3>安装Gitolite</h3>
<p>登录git server</p>
<pre class="brush: bash; gutter: true">ssh git@your.server.name.or.ip.address</pre>
<p>下载最新的Gitolite</p>
<pre class="brush: bash; gutter: true">git clone git://github.com/sitaramc/gitolite</pre>
<p>安装，这里说明下，安装方式有3种，区别在与指定生成<code>gitolite</code>可执行文件的路径，这里采用Gitolite作者推荐的第二种，也就是把文件生成到<code>$HOME/bin</code>中，这样可以在接下来的bash中直接执行<code>gitolite</code>命令而不用指定路径(如果你的<code>~/bin</code>目录不存在记得先<code>mkdir ~/bin</code>)</p>
<pre class="brush: bash; gutter: true">gitolite/install -ln</pre>
<p>设置，由于是第一次运行这个命令，所以这里指定的key是拥有Gitolite管理员权限的</p>
<pre class="brush: bash; gutter: true">gitolite setup -pk your-name.pub</pre>
<p>此命令会在你的<code>~/repositories/</code>目录生成两个repository：gitolite-admin.git和testing.git</p>
<h3>配置权限</h3>
<p>退到你的workstation上</p>
<pre class="brush: bash; gutter: true">exit</pre>
<p>clone刚才生成的gitolite-admin.git</p>
<pre class="brush: bash; gutter: true">git clone githost:gitolite-admin</pre>
<p>注意这里用的是刚才准备好的server别名来连接的，其中最重要的区别是使用your-name.pub这个key，并且没有采用绝对路径来指定想要clone的repository，而是直接使用名称，并且这个名称也没有包括.git这个后缀。这一点很重要，因为这是用Gitolite的机制来clone，如果你跳过它直接使用git来，那么它的一些功能就无法实现了。以后clone, push其它需要受Gitolite权限控制的repository都必须这样做。</p>
<p>clone完后会有个新的目录<code>gitolite-admin</code>，里面有两个文件夹<code>conf</code>和<code>keydir</code>，第一个目录中包含的是配置文件，里面就是记录权限配置的地方，第二个目录中则包含所有用户的pub key。</p>
<p>现在我们打开配置文件，按照我们的权限配置需要进行设置</p>
<pre class="brush: bash; gutter: true">vim gitolite-admin/conf/gitolite.conf</pre>
<p>我期望的配置如下，你也可以根据你的需要做更改</p>
<pre class="brush: text; gutter: true">@repos_a @proj1 @proj2
@repos_b @proj3 @proj4 @proj5

@team_a @user1 @user2
@team_b @user3 @user4

repo gitolite-admin
RW+ = your-name

repo @repos_a
RW+ = @team_a
R = @all

repo @repos_b
RW+ = @team_b</pre>
<p>这个配置很简单，首先定义了两个repository group，再又定义了两个user group，group的好处就是以后添加repository和user的时候，不需要再单独配置，只需加入到对应的group中即可。</p>
<ul>
<li>添加全新的repository，在上面提到的gitolite.conf文件中配置好对应的名称和权限，再push到server即可，server会自动帮你创建一个empty的bare repository。</li>
<li>如果你已经有一个repository，想把它加进来的话，那就把它拷贝到git server上的<code>~/repositories</code>文件夹里，记得文件夹名要以.git结尾，并且这个repository一定要是bare的，（你可以通过拷贝repository里的.git文件夹，然后运行<code>git config --bool core.bare true</code>，也可以运行<code>git clone --bare your-repository</code>来得到bare repository）。这种方式还有一个额外的操作就是在server上运行一次<code>gitolite setup</code>。</li>
<li>移除repository，在配置文件中移除对应的repo，然后push，接着再删除server上对应的文件夹即可。</li>
</ul>
<ul>
<li>添加user，把pub key拷贝到<code>keydir</code>文件夹里</li>
<li>删除user，一样，移除<code>keydir</code>里对应的pub key</li>
</ul>
<p>注意，上面说的操作，都必须在clone的gitolite-admin里做更改，然后push，千万别在server上自己来，那样是没用的，因为这些权限配置、repository管理都有一些额外的操作，gitolite-admin会帮你搞定一切。</p>
<p>把你的更改push回server上，试试clone，pull，push，看看权限是否正确。比如</p>
<pre class="brush: bash; gutter: true">git clone githost:proj3</pre>
<p>更多的内容，可以参考<a href="http://sitaramc.github.com/gitolite/master-toc.html">官方文档</a></p>
<p>本文由Roy最初发表于：<a href="http://blog.chengbo.net/2012/04/20/use-gitolite-to-manage-git-repositories.html">http://blog.chengbo.net/2012/04/20/use-gitolite-to-manage-git-repositories.html</a>，你可以在保持文章完整和保留本声明的情况下转帖、分发和印刷等。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chengbo.net/2012/04/20/use-gitolite-to-manage-git-repositories.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>用Debian当路由，来解决BT造成的网络慢的问题</title>
		<link>http://blog.chengbo.net/2012/04/18/use-debian-server-as-a-router.html</link>
		<comments>http://blog.chengbo.net/2012/04/18/use-debian-server-as-a-router.html#comments</comments>
		<pubDate>Wed, 18 Apr 2012 05:30:29 +0000</pubDate>
		<dc:creator>chengbo</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[ADSL]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[路由]]></category>

		<guid isPermaLink="false">http://blog.chengbo.net/?p=349</guid>
		<description><![CDATA[自从@TimothyYe 童鞋介绍偶加入HDC后，为了快点完成新人作业，也为了满足我不折腾不舒服斯基的欲望，哥配了一台凌动小PC，Intel ATOM D525NW的主板，集成了CPU和显卡，加上小机箱总共700元。到手后，插上我Thinkpad拆下来的2根1G内存和另外一台闲置N久的台式机160G SATA硬盘，装了个Debian，就可以用了。 装上transmission后，全速挂BT无压力，比那些直接路由或者1、200的NAS给力多了。哥还继续在上面折腾了Git，emule，动态DNS等，远远没有把2G内存榨干，当然这里都说远了，继续回来。 我家使用的是电信ADSL，一个宽带无线路由，手机，notebook，iPad，PC，xbox等（哥真败家。。。），路由拨号连入Internet，然后通过WIFI把其它设备连入LAN，共享外网连接。这个配置在我挂PT之前一直工作正常，可是当我把BT开着，就算上传和下载速度都为0，LAN中的其它设备访问Internet的速度一样很慢，很慢。 分析了下，估计是我那100元的低端无线路由无法支撑如此多的连接会话造成的，简单直接的办法就是升级路由，于是开始上网查高端路由，不查不知道，一查才知道这东西好贵，便宜的怕是不能解决问题，贵的哥又承受不了。纠结了N久，最后发现，何不把我那台Debian来做路由呢？ 马上在淘宝买了根20元的USB有线网卡，收到后插入Debian上，这东西不像Windows和MAC可以自动识别出来然后提示你安装驱动，要自己去折腾，而且附送的光盘上也没有Linux的驱动，看来，要找Google了。 安装配置USB网卡 在Debian上运行 chengbo@chengbo-server:~$ lsusb Bus 005 Device 002: ID 0fe6:9700 Kontron (Industrial Computer Source / ICS Advent) DM9601 Fast Ethernet Adapter 从上得知，USB网卡是DM9601这个型号的 chengbo@chengbo-server:~$ /sbin/ifconfig 只有lo和eth0，新加的网卡没有识别 以DM9601为关键字，Google，找到了这里，下载解压好linux的驱动后，编译出错，好像是头文件不对，哥不会写驱动啊，只有继续Google，发现DM9601的驱动已经集成在新版的内核里了，但是我试了下，用不了，不知道什么原因。继续Google，又找到了这里，根据上面的说明，下载了qf9700的驱动，编译，成功，生成文件qf9700.ko。 安装刚才编译好的驱动 root@chengbo-server:~$ cp qf9700.ko /lib/modules/`uname -r`/kernel/drivers/net/usb root@chengbo-server:~$ cd /lib/modules/`uname -r`/kernel/drivers/net/usb root@chengbo-server: usb$ modprobe usbnet root@chengbo-server: usb$ insmod qf9700.ko root@chengbo-server: usb$...  <a href="http://blog.chengbo.net/2012/04/18/use-debian-server-as-a-router.html" class="more-link" title="Read 用Debian当路由，来解决BT造成的网络慢的问题">Read more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>自从<a title="timothy ye" href="http://www.weibo.com/timothyye" target="_blank">@TimothyYe</a> 童鞋介绍偶加入HDC后，为了快点完成新人作业，也为了满足我不折腾不舒服斯基的欲望，哥配了一台凌动小PC，Intel ATOM D525NW的主板，集成了CPU和显卡，加上小机箱总共700元。到手后，插上我Thinkpad拆下来的2根1G内存和另外一台闲置N久的台式机160G SATA硬盘，装了个Debian，就可以用了。</p>
<p>装上transmission后，全速挂BT无压力，比那些直接路由或者1、200的NAS给力多了。哥还继续在上面折腾了Git，emule，动态DNS等，远远没有把2G内存榨干，当然这里都说远了，继续回来。</p>
<p>我家使用的是电信ADSL，一个宽带无线路由，手机，notebook，iPad，PC，xbox等（哥真败家。。。），路由拨号连入Internet，然后通过WIFI把其它设备连入LAN，共享外网连接。这个配置在我挂PT之前一直工作正常，可是当我把BT开着，就算上传和下载速度都为0，LAN中的其它设备访问Internet的速度一样很慢，很慢。</p>
<p>分析了下，估计是我那100元的低端无线路由无法支撑如此多的连接会话造成的，简单直接的办法就是升级路由，于是开始上网查高端路由，不查不知道，一查才知道这东西好贵，便宜的怕是不能解决问题，贵的哥又承受不了。纠结了N久，最后发现，何不把我那台Debian来做路由呢？</p>
<p>马上在淘宝买了根20元的USB有线网卡，收到后插入Debian上，这东西不像Windows和MAC可以自动识别出来然后提示你安装驱动，要自己去折腾，而且附送的光盘上也没有Linux的驱动，看来，要找Google了。</p>
<h3>安装配置USB网卡</h3>
<p>在Debian上运行</p>
<pre class="brush: bash; gutter: true">chengbo@chengbo-server:~$ lsusb</pre>
<p>Bus 005 Device 002: ID 0fe6:9700 Kontron (Industrial Computer Source / ICS Advent) DM9601 Fast Ethernet Adapter</p>
<p>从上得知，USB网卡是DM9601这个型号的</p>
<pre class="brush: bash; gutter: true">chengbo@chengbo-server:~$ /sbin/ifconfig</pre>
<p>只有lo和eth0，新加的网卡没有识别</p>
<p>以DM9601为关键字，Google，找到了<a href="http://www.davicom.com.tw/page1.aspx?no=209814">这里</a>，下载解压好linux的驱动后，编译出错，好像是头文件不对，哥不会写驱动啊，只有继续Google，发现DM9601的驱动已经集成在新版的内核里了，但是我试了下，用不了，不知道什么原因。继续Google，又找到了<a href="http://ceyes.blog.51cto.com/2377614/808386">这里</a>，根据上面的说明，下载了qf9700的驱动，编译，成功，生成文件qf9700.ko。</p>
<p>安装刚才编译好的驱动</p>
<pre class="brush: bash; gutter: true">root@chengbo-server:~$ cp qf9700.ko /lib/modules/`uname -r`/kernel/drivers/net/usb
root@chengbo-server:~$ cd /lib/modules/`uname -r`/kernel/drivers/net/usb
root@chengbo-server: usb$ modprobe usbnet
root@chengbo-server: usb$ insmod qf9700.ko
root@chengbo-server: usb$ ifconfig eth1 up</pre>
<p>配置好驱动后再运行</p>
<pre class="brush: bash; gutter: true">root@chengbo-server:~$ ifconfig</pre>
<p>多了一个eth1了，到现在新网卡已经可以使用了。</p>
<h3>安装配置ADSL拨号相关软件</h3>
<p>把原先连接无线宽带路由和猫的网线拔掉，接在猫和Debian的USB网卡上<br />
安装拨号软件</p>
<pre class="brush: bash; gutter: true">root@chengbo-server:~$ apt-get install pppoe pppoeconf</pre>
<p>成功后运行</p>
<pre class="brush: bash; gutter: true">root@chengbo-server:~$ pppoeconf</pre>
<p>会弹出一个窗口，自动检测连接ADSL的网卡，然后照提示输入你的用户名，密码，其它的可以用默认值。</p>
<p>运行</p>
<pre class="brush: bash; gutter: true">root@chengbo-server:~$ pon dsl-provider</pre>
<p>就可以拨号了，过后再<code>ifconfig</code>一下，会发现多了个ppp0。<code>poff</code>命令可以关闭ppp0连接。<em>另外，我发现多次拨号可以有多个ppp，比如ppp1，而且IP还不一样，不知道这样是否可以让带宽double，待测试。</em></p>
<p>此时Debian可以上网了，但是LAN中的其它设备还不行。</p>
<h3>设置LAN路由</h3>
<p>设置Debian连接LAN的网卡配置</p>
<pre class="brush: bash; gutter: true">root@chengbo-server:~$ vim /etc/network/interfaces</pre>
<blockquote><p>allow-hotplug eth0<br />
iface eth0 inet static<br />
address 192.168.3.3<br />
netmask 255.255.255.0<br />
network 192.168.3.0<br />
broadcast 192.168.3.255<br />
gateway 192.168.3.3</p></blockquote>
<p>由于所有的无线设备都是有无线宽带路由来DHCP的，所以登录无线宽带路由，把配置改下：</p>
<blockquote><p>range 192.168.3.100-192.168.3.200<br />
netmask 255.255.255.0<br />
gateway 192.168.3.3<br />
dns 8.8.8.8 or 4.4.4.4</p></blockquote>
<p>DNS没有用电信分配给我的，是因为不想看电信强行插入的广告</p>
<p>设置NAT</p>
<pre class="brush: bash; gutter: true">root@chengbo-server:~$ echo &quot;1&quot; &gt; /proc/sys/net/ipv4/ip_forward
root@chengbo-server:~$ /sbin/iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.3.0/24 -j MASQUERADE</pre>
<p>至此LAN中的其它设备也可以上网了，如果还不行的话，检查下你的配置是否正确，然后再看看路由表，把错误的路由改掉。</p>
<p>最后，我家网络的结构如下图</p>
<a href="http://blog.chengbo.net/wp-content/uploads/2012/04/home-network.png"><img class="alignnone size-medium wp-image-372" title="home network" src="http://blog.chengbo.net/wp-content/uploads/2012/04/home-network-300x192.png" alt="home network" /></a>
<p><span style="color: #008000;">// TODO: 此文还需添加Debian重启后自动配置USB网卡，拨号，NAT的内容</span></p>
<p>本文由Roy最初发表于：<a href="http://blog.chengbo.net/2012/04/18/use-debian-server-as-a-router.html">http://blog.chengbo.net/2012/04/18/use-debian-server-as-a-router.html</a>，你可以在保持文章完整和保留本声明的情况下转帖、分发和印刷等。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chengbo.net/2012/04/18/use-debian-server-as-a-router.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>更快的，更好的支持硬件的模拟器</title>
		<link>http://blog.chengbo.net/2012/04/10/faster-emulator-with-better-hardware.html</link>
		<comments>http://blog.chengbo.net/2012/04/10/faster-emulator-with-better-hardware.html#comments</comments>
		<pubDate>Tue, 10 Apr 2012 15:18:02 +0000</pubDate>
		<dc:creator>chengbo</dc:creator>
				<category><![CDATA[Android翻译]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[模拟器]]></category>

		<guid isPermaLink="false">http://blog.chengbo.net/?p=319</guid>
		<description><![CDATA[原文：http://android-developers.blogspot.com/2012/04/faster-emulator-with-better-hardware.html [This post is by Xavier Ducrohet and Reto Meier of the Android engineering team. — Tim Bray.] Android模拟器是开发和测试Android程序的一个关键工具。目前Android设备的功能以及多样性发展的日益迅猛，模拟器要跟上步伐十分的困难。 今天我们激动的宣布，模拟器做了一些十分显著的改进，包括激动人心的性能提升，众多硬件特性，尤其是传感器和多点触控的支持。 加入GPU支持 今天我们发布的系统镜像内置了GPU支持（Android 4.0.3 r2）。Android日益依赖GPU来提高性能，所以新模拟器的差异十分显著。在下面的视频中（需翻墙才能看）模拟器依旧翻译着ARM指令（运行模拟器的宿主系统一般是x86平台，此镜像是ARM平台的，所以中间存在着ARM-&#62;x86指令的转换。之前没有GPU支持，运行如此高分辨率的模拟器并不流畅）；GPU可以让性能提升不少。 一个额外的红利，我们现在已经支持OpenGL ES 2.0了，所以你的OpenGL游戏可以在模拟器中运行了。 请注意的是，目前有很多种的GPU，我们并没有用所有GPU对这个beta版的模拟器做测试，所以，如果你有什么意见或者遇到了什么问题，请联系我们。 模拟更多的硬件特性 移动设备的硬件特性是一个开发平台的重要组成部分，所以我们也高兴的宣布，除了去年加入的摄像头支持，现在还可以使用一个绑定的Android设备来支持传感器和多点触控了。 我们还在为模拟器支持更多的硬件特性，包括蓝牙和NFC（近距离无线通信），而努力。 优化的CPU性能 我们同样也优化了Android模拟器的CPU性能。硬件浮点运算操作在冰淇淋三明治版本(Android 4.0)之上的版本中有效，它让模拟CPU操作大概快了2倍。 上一周，我们发布了包括x86系统镜像和主机驱动程序的Android开发工具r17版本，可以让模拟器使用x86指令执行，大大提高了执行效率。 下面这个视频显示了两个CPU相关的程序，一个有虚化（virtualization），一个没有，在两个运行着相同系统镜像的模拟器上运行的情况。（同样需要翻墙） 构建一个现代化的模拟器 因为Android平台允许应用程序和系统组件之间的深层相互操作，所以我们必须提供一个有着完整系统镜像的模拟器。我们的模拟器虚拟了一个完整的设备：硬件，内核，底层系统库和应用框架。 当然，系统一般被虚拟为ARM CPU的设备；之前，我们用软件来虚拟这些指令，它一直工作的不错，直到包括更多动画和更加复杂的Android 3.0的到来。 我们缺少的是Android x86的支持，和上周r17版本的SDK工具中的GPU支持。把模拟器的OpenGL ES 2.0指令传给宿主操作系统，转换成标准的OpenGL 2.0，然后用宿主GPU来执行，这样模拟器就支持GPU了。 总结 Android生态系统有着很多的来自不同厂商的设备。开发人员需要一个不用买设备就可以测试程序的途径。同时一个快速的，更真实的模拟器有着极大的帮助。 我们希望这些新的优化能够让模拟器在你的开发和测试过程中更加有用，同时期盼能进一步的为你优化它。 本文由Roy最初发表于：http://blog.chengbo.net/2012/04/10/faster-emulator-with-better-hardware.html，你可以在保持文章完整和保留本声明的情况下转帖、分发和印刷等。]]></description>
			<content:encoded><![CDATA[<p>原文：<a href="http://android-developers.blogspot.com/2012/04/faster-emulator-with-better-hardware.html">http://android-developers.blogspot.com/2012/04/faster-emulator-with-better-hardware.html</a></p>
<p><em>[This post is by Xavier Ducrohet and Reto Meier of the Android engineering team. — Tim Bray.]</em></p>
<p>Android模拟器是开发和测试Android程序的一个关键工具。目前Android设备的功能以及多样性发展的日益迅猛，模拟器要跟上步伐十分的困难。</p>
<p>今天我们激动的宣布，模拟器做了一些十分显著的改进，包括激动人心的性能提升，众多硬件特性，尤其是传感器和多点触控的支持。</p>
<h3>加入GPU支持</h3>
<p>今天我们发布的系统镜像内置了GPU支持（Android 4.0.3 r2）。Android日益依赖GPU来提高性能，所以新模拟器的差异十分显著。在下面的视频中（需翻墙才能看）模拟器依旧翻译着ARM指令（运行模拟器的宿主系统一般是x86平台，此镜像是ARM平台的，所以中间存在着ARM-&gt;x86指令的转换。之前没有GPU支持，运行如此高分辨率的模拟器并不流畅）；GPU可以让性能提升不少。</p>
<p><iframe src="http://www.youtube.com/embed/T--vFtyZvc4" frameborder="0" width="420" height="315"></iframe></p>
<p>一个额外的红利，我们现在已经支持OpenGL ES 2.0了，所以你的OpenGL游戏可以在模拟器中运行了。</p>
<p>请注意的是，目前有很多种的GPU，我们并没有用所有GPU对这个beta版的模拟器做测试，所以，如果你有什么意见或者遇到了什么问题，请<a href="http://code.google.com/p/android/issues/entry?template=Tools%20GPU%20bug%20report">联系我们</a>。</p>
<h3>模拟更多的硬件特性</h3>
<p>移动设备的硬件特性是一个开发平台的重要组成部分，所以我们也高兴的宣布，除了去年加入的摄像头支持，现在还可以使用一个绑定的Android设备来支持传感器和多点触控了。</p>
<p>我们还在为模拟器支持更多的硬件特性，包括蓝牙和NFC（近距离无线通信），而努力。</p>
<h3>优化的CPU性能</h3>
<p>我们同样也优化了Android模拟器的CPU性能。硬件浮点运算操作在冰淇淋三明治版本(Android 4.0)之上的版本中有效，它让模拟CPU操作大概快了2倍。</p>
<p>上一周，我们发布了包括x86系统镜像和主机驱动程序的Android开发工具r17版本，可以让模拟器使用x86指令执行，大大提高了执行效率。</p>
<p>下面这个视频显示了两个CPU相关的程序，一个有虚化（virtualization），一个没有，在两个运行着相同系统镜像的模拟器上运行的情况。（同样需要翻墙）</p>
<p><iframe src="http://www.youtube.com/embed/1gnQX_izOrk" frameborder="0" width="420" height="315"></iframe></p>
<h3>构建一个现代化的模拟器</h3>
<p>因为Android平台允许应用程序和系统组件之间的深层相互操作，所以我们必须提供一个有着完整系统镜像的模拟器。我们的模拟器虚拟了一个完整的设备：硬件，内核，底层系统库和应用框架。</p>
<p>当然，系统一般被虚拟为ARM CPU的设备；之前，我们用软件来虚拟这些指令，它一直工作的不错，直到包括更多动画和更加复杂的Android 3.0的到来。</p>
<p>我们缺少的是Android x86的支持，和上周r17版本的SDK工具中的GPU支持。把模拟器的OpenGL ES 2.0指令传给宿主操作系统，转换成标准的OpenGL 2.0，然后用宿主GPU来执行，这样模拟器就支持GPU了。</p>
<h3>总结</h3>
<p>Android生态系统有着很多的来自不同厂商的设备。开发人员需要一个不用买设备就可以测试程序的途径。同时一个快速的，更真实的模拟器有着极大的帮助。</p>
<p>我们希望这些新的优化能够让模拟器在你的开发和测试过程中更加有用，同时期盼能进一步的为你优化它。</p>
<p>本文由Roy最初发表于：<a href="http://blog.chengbo.net/2012/04/10/faster-emulator-with-better-hardware.html">http://blog.chengbo.net/2012/04/10/faster-emulator-with-better-hardware.html</a>，你可以在保持文章完整和保留本声明的情况下转帖、分发和印刷等。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chengbo.net/2012/04/10/faster-emulator-with-better-hardware.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>当ListView有Header时，onItemClick里的position不正确</title>
		<link>http://blog.chengbo.net/2012/03/09/onitemclick-return-wrong-position-when-listview-has-headerview.html</link>
		<comments>http://blog.chengbo.net/2012/03/09/onitemclick-return-wrong-position-when-listview-has-headerview.html#comments</comments>
		<pubDate>Fri, 09 Mar 2012 07:15:49 +0000</pubDate>
		<dc:creator>chengbo</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://blog.chengbo.net/?p=250</guid>
		<description><![CDATA[今天在做项目的时候，遇到一个问题，记录下来。 当我们给ListView添加一个HeaderView后（代码如下），发现onItemClick方法里的position参数的值不是我们所期望的，比如点击ListView的第一行，我们期望的position是0，可是却是1，也就是说，它是从Header开始计数的。 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.home); mAdapter = new MyAdapter(this); mListView = (ListView) findViewById(R.id.list); mListView.addHeaderView(getLayoutInflater().inflate(R.layout.list_header)); mListView.setAdapter(mAdapter); mListView.setOnClickListener(this); } @Override public void onItemClick(AdapterView&#60;?&#62; parent, View v, int position, long id) { doSomething(mAdapter.getItem(position)); } Google了下，发现有个老外issue过一个bug，和我遇到的问题一样，不过这个bug被RomainGuy reject掉了，理由是，你用错了，请用getAdapter。回答的太简洁了，完全没法理解，只好又去仔细研究ListView的代码，终于领会他的意思了。把其中addHeaderView和setAdapter方法贴下来 /** * Add a fixed view to appear at the top of the list. If addHeaderView is...  <a href="http://blog.chengbo.net/2012/03/09/onitemclick-return-wrong-position-when-listview-has-headerview.html" class="more-link" title="Read 当ListView有Header时，onItemClick里的position不正确">Read more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>今天在做项目的时候，遇到一个问题，记录下来。</p>
<p>当我们给<a href="http://developer.android.com/reference/android/widget/ListView.html" target="_blank">ListView</a>添加一个HeaderView后（代码如下），发现<a href="http://developer.android.com/reference/android/widget/AdapterView.OnItemClickListener.html#onItemClick(android.widget.AdapterView&lt;?&gt;, android.view.View, int, long)" target="_blank">onItemClick</a>方法里的position参数的值不是我们所期望的，比如点击ListView的第一行，我们期望的position是0，可是却是1，也就是说，它是从Header开始计数的。</p>
<pre class="brush: java; gutter: true">@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);

	setContentView(R.layout.home);

	mAdapter = new MyAdapter(this);

	mListView = (ListView) findViewById(R.id.list);
	mListView.addHeaderView(getLayoutInflater().inflate(R.layout.list_header));
	mListView.setAdapter(mAdapter);
	mListView.setOnClickListener(this);
}

@Override
public void onItemClick(AdapterView&lt;?&gt; parent, View v, int position, long id) {
	doSomething(mAdapter.getItem(position));
}</pre>
<p>Google了下，发现有个老外issue过一个<a href="http://code.google.com/p/android/issues/detail?id=4197" target="_blank">bug</a>，和我遇到的问题一样，不过这个bug被RomainGuy reject掉了，理由是，你用错了，请用<a href="http://developer.android.com/reference/android/widget/ListView.html#getAdapter()" target="_blank">getAdapter</a>。回答的太简洁了，完全没法理解，只好又去仔细研究ListView的代码，终于领会他的意思了。把其中<a href="http://developer.android.com/reference/android/widget/ListView.html#addHeaderView(android.view.View)" target="_blank">addHeaderView</a>和<a href="http://developer.android.com/reference/android/widget/ListView.html#setAdapter(android.widget.ListAdapter)" target="_blank">setAdapter</a>方法贴下来</p>
<pre class="brush: java; gutter: true">/**
 * Add a fixed view to appear at the top of the list. If addHeaderView is
 * called more than once, the views will appear in the order they were
 * added. Views added using this call can take focus if they want.
 * &lt;p&gt;
 * NOTE: Call this before calling setAdapter. This is so ListView can wrap
 * the supplied cursor with one that that will also account for header
 * views.
 *
 * @param v The view to add.
 * @param data Data to associate with this view
 * @param isSelectable whether the item is selectable
 */
public void addHeaderView(View v, Object data, boolean isSelectable) {
    if (mAdapter != null) {
        throw new IllegalStateException(
                &quot;Cannot add header view to list -- setAdapter has already been called.&quot;);
    }

    FixedViewInfo info = new FixedViewInfo();
    info.view = v;
    info.data = data;
    info.isSelectable = isSelectable;
    mHeaderViewInfos.add(info);
}

/**
 * Sets the data behind this ListView.
 *
 * The adapter passed to this method may be wrapped by a {@link WrapperListAdapter},
 * depending on the ListView features currently in use. For instance, adding
 * headers and/or footers will cause the adapter to be wrapped.
 *
 * @param adapter The ListAdapter which is responsible for maintaining the
 *        data backing this list and for producing a view to represent an
 *        item in that data set.
 *
 * @see #getAdapter()
 */
@Override
public void setAdapter(ListAdapter adapter) {
    if (null != mAdapter) {
        mAdapter.unregisterDataSetObserver(mDataSetObserver);
    }

    resetList();
    mRecycler.clear();

    if (mHeaderViewInfos.size() &gt; 0|| mFooterViewInfos.size() &gt; 0) {
        mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, adapter);
    } else {
        mAdapter = adapter;
    }

    //其它的一些代码这里省略之...
}</pre>
<p>从代码和注释里都可以很清楚的得知，addHeaderView一定要在setAdapter之前调用，如果不是，addHeaderView会抛出一个异常。Android为什么要这样做？因为，在setAdapter的时候，会针对我遇到的这种情况（也就是说，position不正确）做些特殊的处理。setAdapter在内部判断了当前ListView是否有Header或者Footer，如果没有，就直接使用参数传进来的adapter；如果有，则用一个decorated的HeaderViewListAdapter来替换参数。这个HeaderViewListAdapter的使命，就是排除Header和Footer，让position（当然也包括<a href="http://developer.android.com/reference/android/widget/Adapter.html#getItem(int)" target="_blank">getItem</a>, <a href="http://developer.android.com/reference/android/widget/Adapter.html#getItemId(int)" target="_blank">getItemId</a>等）正确返回。</p>
<p>分析到这里，解决方案就出来了：不要直接使用我们声明的adapter，而是用ListView里的那个decorated adapter。获取它的方法就是调用getAdapter。当然，如果ListView没有Header和Footer，直接使用声明的adapter也没有问题，不过为了方便、避免以后出错，还是统一使用decorated adapter比较好。</p>
<p>把onItemClick改成下面这样，就可以了</p>
<pre class="brush: java; gutter: true">@Override
public void onItemClick(AdapterView&lt;?&gt; parent, View v, int position, long id) {
	doSomething(parent.getAdapter().getItem(position));
}</pre>
<p>本文由Roy最初发表于：<a href="http://blog.chengbo.net/2012/03/09/onitemclick-return-wrong-position-when-listview-has-headerview.html">http://blog.chengbo.net/2012/03/09/onitemclick-return-wrong-position-when-listview-has-headerview.html</a>，你可以在保持文章完整和保留本声明的情况下转帖、分发和印刷等。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chengbo.net/2012/03/09/onitemclick-return-wrong-position-when-listview-has-headerview.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何提升Android手机电池的使用时间</title>
		<link>http://blog.chengbo.net/2011/06/29/how-to-maximizing-your-android-phones-battery-life.html</link>
		<comments>http://blog.chengbo.net/2011/06/29/how-to-maximizing-your-android-phones-battery-life.html#comments</comments>
		<pubDate>Wed, 29 Jun 2011 06:59:29 +0000</pubDate>
		<dc:creator>chengbo</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://blog.chengbo.net/?p=232</guid>
		<description><![CDATA[很多朋友抱怨Android手机耗电恐怖，其实我刚入手我的i9003的时候，也被他恐怖的耗电量吓了一跳，睡觉之前还是60%，第二天早上起床却发现手机已经耗尽了所有电量，自动关机了。其实这也不能完全怪Android，它耗电在于几个方面，同样还是和ios做对比： Android和ios的体制不一样。ios实际上是一个单线程系统，程序只能在前台运行，进入后台后就已经是睡眠状态了，只能通过apple的API来进行推送，这就是iphone qq超级难用的原因。而android就是一个纯粹的多线程操作系统，程序完全可以在后台正常运行，这样的代价自然是会多耗费一些电量了。 Android程序普遍上来说比起ios的质量要差一些。Google为了在数量上尽量追赶Apple AppStore，所以在Android Market的准入审批上不像Apple做的那么严格，再加上Android开发门槛要比ios低的多得多，自然造成了Android程序质量普遍偏低。很多程序未充分考虑以及测试在电量上的消耗，如果你正好安装了这些程序，那么电池电量消耗过快也不足为奇了。 那么有什么办法可以尽量提高电池的使用时间呢，我总结了下面几点： 安装质量高的程序。安装前到网上搜索下别人的经验，或者安装后记得监控程序的耗电量（Settings-&#62;About phone-&#62;Battery use），太高的话卸载找另外的替代品吧或者采取其它措施，比如我发现Talkbox就非常耗电，我什么都没做，也没运行它，它自己在后台就耗了30%，所以果断卸载，换微信。 关掉平常不用的服务。WIFI，蓝牙，GPS，3G这些肯定不会随时都需要使用的，平常的时候把它们都关掉，等到需要使用的时候再打开。 调节合适的屏幕亮度。屏幕是耗电大户，因此调节一个合适的亮度对于提升电池使用时间非常有帮助，在Settings-&#62;Display-&#62;Brightness里选择一个对你来说合适的亮度，感觉Automatic brightness偏亮了一点。 保持桌面整洁。Widgets别用太多了，这些东西看起来挺小巧，但是他们还是要耗电滴。 禁用同步。Android可以同步日历，邮件，联系人，相册等信息，关掉这个功能也会提高电池的使用时间。Settings-&#62;Accounts and sync 经常杀进程。不用的程序杀掉它，别以为你按了Home键返回了，它就会安安静静的呆在后台，有些程序不会这么乖，他们可能会同步数据，会联网尝试更新，所以，不用了就kill them，很多软件可以方便的让你批量杀进程，比如我用的Advanced Task Killer，感觉还不错，免费软件。 不要用动态墙纸。动态墙纸看起来挺炫，但是肯定要占用CPU资源的，低调点，静态的墙纸还是有很多好看的。 手机放在常温的地方。过冷过热都会影响电池使用时间。炎炎烈日下面暴晒的车车中，太恐怖了，为了你也为了手机，开空调吧。 这里特别说明下，上面有些方法过于极端了点，手机本来就是拿来使用的，如果你把所有功能都关掉，那自然最省电，但是这还叫手机吗？根据自己的情况做下适当的优化，这才是最好的。 另外，如果你还有其他办法补充，欢迎留言分享给大家。]]></description>
			<content:encoded><![CDATA[<img class="alignnone size-full wp-image-239" title="android.logo" src="http://blog.chengbo.net/wp-content/uploads/2011/06/android.logo_.jpg" border="0" alt="" width="120" height="120" />
<p>很多朋友抱怨Android手机耗电恐怖，其实我刚<a href="http://blog.chengbo.net/2011/06/15/my-new-mobile-samsung-i9003.html">入手我的i9003</a>的时候，也被他恐怖的耗电量吓了一跳，睡觉之前还是60%，第二天早上起床却发现手机已经耗尽了所有电量，自动关机了。其实这也不能完全怪Android，它耗电在于几个方面，同样还是和ios做对比：</p>
<p>Android和ios的体制不一样。ios实际上是一个单线程系统，程序只能在前台运行，进入后台后就已经是睡眠状态了，只能通过apple的API来进行推送，这就是iphone qq超级难用的原因。而android就是一个纯粹的多线程操作系统，程序完全可以在后台正常运行，这样的代价自然是会多耗费一些电量了。</p>
<p>Android程序普遍上来说比起ios的质量要差一些。Google为了在数量上尽量追赶Apple AppStore，所以在Android Market的准入审批上不像Apple做的那么严格，再加上Android开发门槛要比ios低的多得多，自然造成了Android程序质量普遍偏低。很多程序未充分考虑以及测试在电量上的消耗，如果你正好安装了这些程序，那么电池电量消耗过快也不足为奇了。</p>
<p>那么有什么办法可以尽量提高电池的使用时间呢，我总结了下面几点：</p>
<ul>
<li>安装质量高的程序。安装前到网上搜索下别人的经验，或者安装后记得监控程序的耗电量（Settings-&gt;About phone-&gt;Battery use），太高的话卸载找另外的替代品吧或者采取其它措施，比如我发现Talkbox就非常耗电，我什么都没做，也没运行它，它自己在后台就耗了30%，所以果断卸载，换微信。</li>
<li>关掉平常不用的服务。WIFI，蓝牙，GPS，3G这些肯定不会随时都需要使用的，平常的时候把它们都关掉，等到需要使用的时候再打开。</li>
<li>调节合适的屏幕亮度。屏幕是耗电大户，因此调节一个合适的亮度对于提升电池使用时间非常有帮助，在Settings-&gt;Display-&gt;Brightness里选择一个对你来说合适的亮度，感觉Automatic brightness偏亮了一点。</li>
<li>保持桌面整洁。Widgets别用太多了，这些东西看起来挺小巧，但是他们还是要耗电滴。</li>
<li>禁用同步。Android可以同步日历，邮件，联系人，相册等信息，关掉这个功能也会提高电池的使用时间。Settings-&gt;Accounts and sync</li>
<li>经常杀进程。不用的程序杀掉它，别以为你按了Home键返回了，它就会安安静静的呆在后台，有些程序不会这么乖，他们可能会同步数据，会联网尝试更新，所以，不用了就kill them，很多软件可以方便的让你批量杀进程，比如我用的Advanced Task Killer，感觉还不错，免费软件。</li>
<li>不要用动态墙纸。动态墙纸看起来挺炫，但是肯定要占用CPU资源的，低调点，静态的墙纸还是有很多好看的。</li>
<li>手机放在常温的地方。过冷过热都会影响电池使用时间。炎炎烈日下面暴晒的车车中，太恐怖了，为了你也为了手机，开空调吧。</li>
</ul>
<p>这里特别说明下，上面有些方法过于极端了点，手机本来就是拿来使用的，如果你把所有功能都关掉，那自然最省电，但是这还叫手机吗？根据自己的情况做下适当的优化，这才是最好的。</p>
<p>另外，如果你还有其他办法补充，欢迎留言分享给大家。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chengbo.net/2011/06/29/how-to-maximizing-your-android-phones-battery-life.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>升级我的I9003到2.3.4</title>
		<link>http://blog.chengbo.net/2011/06/26/upgrade-my-i9003-to-2-3-4.html</link>
		<comments>http://blog.chengbo.net/2011/06/26/upgrade-my-i9003-to-2-3-4.html#comments</comments>
		<pubDate>Sun, 26 Jun 2011 14:22:27 +0000</pubDate>
		<dc:creator>chengbo</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://blog.chengbo.net/?p=226</guid>
		<description><![CDATA[忍不住手痒，把我的i9003升级到了Gingerbread（Android 2.3.4），在这里把我的升级过程写下来，希望对大家有点帮助。 到这里下载最新的2.3.4的firmware，压缩包的解压密码是samfirmware.com。 运行Odin3_v1.83.exe。 选中Re-Partition，Auto Reboot和F. Reset Time三个复选框。 点击PIT然后选择latona_20110114.pit文件。 手机关机，然后依次按音量向下键（按住不放），Home（按住不放），电源（按住不放），过几秒手机会显示一个绿色的机器人在挖东西，这就是传说中的挖煤模式，学名download mode。 用数据线连接手机和电脑，如果需要装驱动请耐心等待驱动安装完毕。然后odin会识别手机的COM，显示在界面上，我的是COM9。 点击Start按钮。 完毕后点击Reset按钮，这时程序会自动取消Re-Partition复选框。 点击BOOTLOADER按钮选择APBOOT_I9003XXKP7_CL280937_REV08_eng_mid_ship.tar；点击PDA按钮选择CODE_I9003XXKP7_CL280937_REV08_eng_mid_ship.tar.md5；点击PHONE按钮选择MODEM_I9003XXKP7_REV_00_CL1021949.tar.md5；点击CSC选择GT-I9003-CSC-MULTI-OXAKP7.tar.md5。 扣掉电池，按照第5步的方法再次进入挖煤模式。 点击Start按钮，然后不要动，直到看到绿色的PASS。 启动手机，此时就可以正常使用了，但是相机还用不了，黑屏，解决方法是按照上面的步骤再刷一次，就可以了。 升级后的一些感受： 虽说不是稳定版本，但我觉得还是挺稳定的。 界面有所变化，但是区别不大。 ROM很干净，没有太多预装的程序。 Local setting里没有中国，但是并不是说不支持访问中文网页，安装中文软件，以及发送接收中文短信，只是说手机的界面是英文的，并且某些显示的风格也是按照英文的文化来的，比如说号码的分段方式。 VPN依然不能使用，哎。 2011/7/3 Update: I9003XXKP7貌似和微信有点冲突，经常在待机情况下无法唤醒机器，只有拔电池重新开机。目前我已刷至最新的I9003XXKP9，再当一次小白鼠。 2011/8/20 Update: 目前最新版是I9003XXKPH。 经过我的测试，I9003XXKP9已经可以连接VPN了，哇哈哈哈哈！]]></description>
			<content:encoded><![CDATA[<img title="Samsung logo" src="/wp-content/uploads/2011/06/samsung_logo.png" alt="" />
<p>忍不住手痒，把我的i9003升级到了Gingerbread（Android 2.3.4），在这里把我的升级过程写下来，希望对大家有点帮助。</p>
<ol>
<li>到<a href="http://forum.xda-developers.com/showthread.php?t=1004647">这里</a>下载最新的2.3.4的firmware，压缩包的解压密码是samfirmware.com。</li>
<li>运行Odin3_v1.83.exe。</li>
<li>选中Re-Partition，Auto Reboot和F. Reset Time三个复选框。</li>
<li>点击PIT然后选择latona_20110114.pit文件。</li>
<li>手机关机，然后依次按音量向下键（按住不放），Home（按住不放），电源（按住不放），过几秒手机会显示一个绿色的机器人在挖东西，这就是传说中的挖煤模式，学名download mode。</li>
<li>用数据线连接手机和电脑，如果需要装驱动请耐心等待驱动安装完毕。然后odin会识别手机的COM，显示在界面上，我的是COM9。</li>
<li>点击Start按钮。</li>
<li>完毕后点击Reset按钮，这时程序会自动取消Re-Partition复选框。</li>
<li>点击BOOTLOADER按钮选择APBOOT_I9003XXKP7_CL280937_REV08_eng_mid_ship.tar；点击PDA按钮选择CODE_I9003XXKP7_CL280937_REV08_eng_mid_ship.tar.md5；点击PHONE按钮选择MODEM_I9003XXKP7_REV_00_CL1021949.tar.md5；点击CSC选择GT-I9003-CSC-MULTI-OXAKP7.tar.md5。</li>
<li>扣掉电池，按照第5步的方法再次进入挖煤模式。</li>
<li>点击Start按钮，然后不要动，直到看到绿色的PASS。</li>
<li>启动手机，此时就可以正常使用了，但是相机还用不了，黑屏，解决方法是按照上面的步骤再刷一次，就可以了。</li>
</ol>
<p>升级后的一些感受：</p>
<ul>
<li>虽说不是稳定版本，但我觉得还是挺稳定的。</li>
<li>界面有所变化，但是区别不大。</li>
<li>ROM很干净，没有太多预装的程序。</li>
<li>Local setting里没有中国，但是并不是说不支持访问中文网页，安装中文软件，以及发送接收中文短信，只是说手机的界面是英文的，并且某些显示的风格也是按照英文的文化来的，比如说号码的分段方式。</li>
<li>VPN依然不能使用，哎。</li>
</ul>
<p>2011/7/3 Update:<br />
I9003XXKP7貌似和微信有点冲突，经常在待机情况下无法唤醒机器，只有拔电池重新开机。目前我已刷至最新的I9003XXKP9，再当一次小白鼠。<br />
2011/8/20 Update:<br />
目前最新版是I9003XXKPH。</p>
<p>经过我的测试，<span style="color: #ff0000;"><strong>I9003XXKP9已经可以连接VPN了</strong></span>，哇哈哈哈哈！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chengbo.net/2011/06/26/upgrade-my-i9003-to-2-3-4.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>我的第一个android手机</title>
		<link>http://blog.chengbo.net/2011/06/15/my-new-mobile-samsung-i9003.html</link>
		<comments>http://blog.chengbo.net/2011/06/15/my-new-mobile-samsung-i9003.html#comments</comments>
		<pubDate>Wed, 15 Jun 2011 15:23:33 +0000</pubDate>
		<dc:creator>chengbo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://blog.chengbo.net/?p=7</guid>
		<description><![CDATA[之前的DOPOD C858用了快3年了，受够了windows mobile的系统，更要命的是还没有WIFI，正好前段时间实在是不想开车，所以一咬牙在京东上买了三星的I9003，好让自己在公交车上有玩具可以打发时间，也终于了了想要一个android的心愿。 现在用了差不多一个多星期了，有点心得，老婆有部iphone 4，我正好做做比较。 外观，I9003就是个山寨iphone，一个大屏幕下面就只有一个Home的物理按键，放一起两个还很真像。 手感，I9003拿在手上，塑料感比较强，轻飘飘的，像玩具；iphone 4有棱有角的，正反面的玻璃加上侧边的金属框，手感要好得多。 操作系统，三星对android做了定制，图标的排列、短消息等和ios非常像。android稳定性不如ios，才用了一周就死过几次机了，ios几乎不死。 程序的数量和质量，ios要好得多得多，安装与更新也比android简便。 屏幕效果，我的I9003是Super clearLCD，感觉和iphone 4的Retina屏差不多，但是仔细对比，显示的细节和层次感还是不如Retina。 电池，都很悲剧，一天一充，玩的多就一天两充。 与Google服务的集成，我是google fans，深度依赖google的很多服务，比如gmail, gtalk, calendar, docs, maps，android作为google自家的产品，兼容性自然不用多说，就这一点，爽 价格，I9003便宜将近2k，性价比还是很高的，苹果的东西，品牌就要值很多钱的 照相，不清楚，没比较过 总体I9003性价比还是挺高的，我很满意，但是有一个致命的问题，悲剧的I9003连不上VPN，我试过PPTP和L2TP IPSec PSK，iphone 4和win7都可以连上，就我的I9003不行，原因不明，悲剧啊悲剧啊]]></description>
			<content:encoded><![CDATA[<p>之前的DOPOD C858用了快3年了，受够了windows mobile的系统，更要命的是还没有WIFI，正好前段时间实在是不想开车，所以一咬牙在京东上买了三星的I9003，好让自己在公交车上有玩具可以打发时间，也终于了了想要一个android的心愿。</p>
<p>现在用了差不多一个多星期了，有点心得，老婆有部iphone 4，我正好做做比较。</p>
<ul>
<li>外观，I9003就是个山寨iphone，一个大屏幕下面就只有一个Home的物理按键，放一起两个还很真像。</li>
<li>手感，I9003拿在手上，塑料感比较强，轻飘飘的，像玩具；iphone 4有棱有角的，正反面的玻璃加上侧边的金属框，手感要好得多。</li>
<li>操作系统，三星对android做了定制，图标的排列、短消息等和ios非常像。android稳定性不如ios，才用了一周就死过几次机了，ios几乎不死。</li>
<li>程序的数量和质量，ios要好得多得多，安装与更新也比android简便。</li>
<li>屏幕效果，我的I9003是Super clearLCD，感觉和iphone 4的Retina屏差不多，但是仔细对比，显示的细节和层次感还是不如Retina。</li>
<li>电池，都很悲剧，一天一充，玩的多就一天两充。</li>
<li>与Google服务的集成，我是google fans，深度依赖google的很多服务，比如gmail, gtalk, calendar, docs, maps，android作为google自家的产品，兼容性自然不用多说，就这一点，爽</li>
<li>价格，I9003便宜将近2k，性价比还是很高的，苹果的东西，品牌就要值很多钱的</li>
<li>照相，不清楚，没比较过</li>
</ul>
<p>总体I9003性价比还是挺高的，我很满意，但是有一个致命的问题，悲剧的I9003连不上VPN，我试过PPTP和L2TP IPSec PSK，iphone 4和win7都可以连上，就我的I9003不行，原因不明，悲剧啊悲剧啊</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chengbo.net/2011/06/15/my-new-mobile-samsung-i9003.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Hello VPS!</title>
		<link>http://blog.chengbo.net/2011/06/14/my-first-blog-on-vps.html</link>
		<comments>http://blog.chengbo.net/2011/06/14/my-first-blog-on-vps.html#comments</comments>
		<pubDate>Tue, 14 Jun 2011 15:58:16 +0000</pubDate>
		<dc:creator>chengbo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.chengbo.net/?p=1</guid>
		<description><![CDATA[又开始整wordpress了，但是这次不同的是，我整了个vps，不像以前的虚拟主机了。Linux很不熟，看来要耍的转，还要多学习呀。]]></description>
			<content:encoded><![CDATA[<p>又开始整wordpress了，但是这次不同的是，我整了个vps，不像以前的虚拟主机了。Linux很不熟，看来要耍的转，还要多学习呀。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chengbo.net/2011/06/14/my-first-blog-on-vps.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>失眠</title>
		<link>http://blog.chengbo.net/2010/09/15/sleeplessness.html</link>
		<comments>http://blog.chengbo.net/2010/09/15/sleeplessness.html#comments</comments>
		<pubDate>Wed, 15 Sep 2010 14:10:03 +0000</pubDate>
		<dc:creator>chengbo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.chengbo.net/?p=37</guid>
		<description><![CDATA[昨天，是我非常痛苦的一天。 前天晚上做了5个小时的高数题，可能有点兴奋了，再加上很长一段时间没有在奶奶家睡觉，枕头和床不太适应，所以失眠了。凌晨3点的时候实在睡不着，就用手机发了封微博，4点了还是一点睡意都没有，干脆爬起来打开电脑上网。凌晨上网相当无聊，微博几乎没人更新，新闻也是看过的，好不容易混到7点天亮，关机上班去了。这个时间路上可真是顺畅啊，往常一个多小时的路程半个小时就到了，平常10点我才到公司，所以这个时间实在是太早了，一个人都没有。我打开灯，开开电脑浏览邮件，开始工作了。 为了不让自己想睡觉，我一直很专注的做事，时不时的起身走动下，但是即便是这样，十点的时候还是感觉身体不舒服，跑到厕所干呕了几下，于是我请了假想回家补下觉，吃过午饭回到座位上把事情收拾了下就闪人了。坐公交的时候我一直很担心自己会吐出来，所以我坐到最后一排靠窗的地方。结果还是发生了，我往窗外吐了，吐过之后感觉稍微好了点，我弯着身子休息，突然觉得身上发麻，最开始只是小指那一块，后来发展到整个手，脚，再发展到手臂，腿，最后全身都在发麻，我掏出手机，但是却感觉拿不住。很想给边上的人说，我很难受，你是否可以送我去下医院，但是估计别人会认为我是个骗子，所以我忍了。后来实在忍不住打电话给老婆，要她在车站等我，当时我几乎是哭着对电话里说，我全身发麻，好难受，这时车上的人都回过头来用很害怕我的眼神看着我，那种感觉很绝望，恐怕我死在车上，都没人敢上来管我。 终于到家了，非常不容易，从高新西区到东二环，一个漫长的路程。下车看到老婆我几乎瘫倒在她身上，去社区医院，医生说我体温、血压、心跳都正常，她也说不清是什么情况，建议我去医院看看，所以我们找了个野猪儿到了省医院，那庸医不紧不忙，慢慢悠悠的（我挂的急诊）说我仅仅是休息不好，建议我去照头部CT，照你吗个头啊，我又不是头部受伤才呕吐的，想赚钱不是这么赚的，靠。他建议我输液，好吧，我身体很虚弱，正好需要补充，那我输吧，在病床上躺了快3个小时才输完，接着坐公交回家（成都出租涨价涨的太好了，这下我不打车了，省了好多钱）。 晚上吃了饭，洗了澡就打算睡觉了。躺在床上，尽管我感觉非常疲倦，但是还是睡不着。我几乎要疯了，脾气也上来了。老婆去给我买了点安眠药（中成药），吃下去还是没感觉。不知道是不是躺久了，我又吐了两次，头几乎要炸了，就想干脆死了算了，一了百了。我安慰自己，是由于还没有到平常的睡觉时间，所以我睡不着，到11点，关了灯，强忍着头痛，不再翻来覆去，终于，睡着了。 晚上，不知道什么时候，满头大汗的醒来，我花了好一会儿来判断此时到底是梦中还是现实，我恨自己为什么要醒来，这下又要花一番功夫才能再次睡着。不知道是不是最近学数学学的太认真了，我居然梦到函数了，我的脚是两个自变量x，头是因变量y，而我的身体，就是对应法则f，囧。 睡到了早上11点，终于好多了，又请了一天假，好好休息下。Anyway，希望我今天能顺利入睡。。。。。]]></description>
			<content:encoded><![CDATA[<p>昨天，是我非常痛苦的一天。</p>
<p>前天晚上做了5个小时的高数题，可能有点兴奋了，再加上很长一段时间没有在奶奶家睡觉，枕头和床不太适应，所以失眠了。凌晨3点的时候实在睡不着，就用手机发了封微博，4点了还是一点睡意都没有，干脆爬起来打开电脑上网。凌晨上网相当无聊，微博几乎没人更新，新闻也是看过的，好不容易混到7点天亮，关机上班去了。这个时间路上可真是顺畅啊，往常一个多小时的路程半个小时就到了，平常10点我才到公司，所以这个时间实在是太早了，一个人都没有。我打开灯，开开电脑浏览邮件，开始工作了。</p>
<p>为了不让自己想睡觉，我一直很专注的做事，时不时的起身走动下，但是即便是这样，十点的时候还是感觉身体不舒服，跑到厕所干呕了几下，于是我请了假想回家补下觉，吃过午饭回到座位上把事情收拾了下就闪人了。坐公交的时候我一直很担心自己会吐出来，所以我坐到最后一排靠窗的地方。结果还是发生了，我往窗外吐了，吐过之后感觉稍微好了点，我弯着身子休息，突然觉得身上发麻，最开始只是小指那一块，后来发展到整个手，脚，再发展到手臂，腿，最后全身都在发麻，我掏出手机，但是却感觉拿不住。很想给边上的人说，我很难受，你是否可以送我去下医院，但是估计别人会认为我是个骗子，所以我忍了。后来实在忍不住打电话给老婆，要她在车站等我，当时我几乎是哭着对电话里说，我全身发麻，好难受，这时车上的人都回过头来用很害怕我的眼神看着我，那种感觉很绝望，恐怕我死在车上，都没人敢上来管我。</p>
<p>终于到家了，非常不容易，从高新西区到东二环，一个漫长的路程。下车看到老婆我几乎瘫倒在她身上，去社区医院，医生说我体温、血压、心跳都正常，她也说不清是什么情况，建议我去医院看看，所以我们找了个野猪儿到了省医院，那庸医不紧不忙，慢慢悠悠的（我挂的急诊）说我仅仅是休息不好，建议我去照头部CT，照你吗个头啊，我又不是头部受伤才呕吐的，想赚钱不是这么赚的，靠。他建议我输液，好吧，我身体很虚弱，正好需要补充，那我输吧，在病床上躺了快3个小时才输完，接着坐公交回家（成都出租涨价涨的太好了，这下我不打车了，省了好多钱）。</p>
<p>晚上吃了饭，洗了澡就打算睡觉了。躺在床上，尽管我感觉非常疲倦，但是还是睡不着。我几乎要疯了，脾气也上来了。老婆去给我买了点安眠药（中成药），吃下去还是没感觉。不知道是不是躺久了，我又吐了两次，头几乎要炸了，就想干脆死了算了，一了百了。我安慰自己，是由于还没有到平常的睡觉时间，所以我睡不着，到11点，关了灯，强忍着头痛，不再翻来覆去，终于，睡着了。</p>
<p>晚上，不知道什么时候，满头大汗的醒来，我花了好一会儿来判断此时到底是梦中还是现实，我恨自己为什么要醒来，这下又要花一番功夫才能再次睡着。不知道是不是最近学数学学的太认真了，我居然梦到函数了，我的脚是两个自变量x，头是因变量y，而我的身体，就是对应法则f，囧。</p>
<p>睡到了早上11点，终于好多了，又请了一天假，好好休息下。Anyway，希望我今天能顺利入睡。。。。。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chengbo.net/2010/09/15/sleeplessness.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>玉米失而复得，如释重负</title>
		<link>http://blog.chengbo.net/2010/05/28/retrieved-my-domain.html</link>
		<comments>http://blog.chengbo.net/2010/05/28/retrieved-my-domain.html#comments</comments>
		<pubDate>Fri, 28 May 2010 02:29:08 +0000</pubDate>
		<dc:creator>chengbo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.chengbo.net/?p=124</guid>
		<description><![CDATA[其实在三月的时候，玉米就已经过期了，但是当时没太注意，以至于有天我发现我的mail和blog都失效的时候，才知道已经到了REDEMPTIONPERIOD，尽管这个时候我还能要回，但是需要花很大一笔钱。算了，我忍了，花了18.99刀在godaddy买了个BackOrder，等到过期的时候抢注之，失败就算我倒霉，成功了也正好把玉米从之前某个国内无良域名商转到国外去。 这几天一直在关注抢注情况，今天终于看到结果，成功了，哈哈哈哈，2个月的大石头总算掉下来了，如释重负，如释重负。。。]]></description>
			<content:encoded><![CDATA[<p>其实在三月的时候，玉米就已经过期了，但是当时没太注意，以至于有天我发现我的mail和blog都失效的时候，才知道已经到了REDEMPTIONPERIOD，尽管这个时候我还能要回，但是需要花很大一笔钱。算了，我忍了，花了18.99刀在godaddy买了个BackOrder，等到过期的时候抢注之，失败就算我倒霉，成功了也正好把玉米从之前某个国内无良域名商转到国外去。</p>
<p>这几天一直在关注抢注情况，今天终于看到结果，成功了，哈哈哈哈，2个月的大石头总算掉下来了，如释重负，如释重负。。。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chengbo.net/2010/05/28/retrieved-my-domain.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

