<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>润物无声</title>
		<link>https://blog.zhourunsheng.com/</link>
		<description>Recent content on 润物无声</description>
		<generator>Hugo</generator>
		<language>zh-CN</language>
		
		
		
		
			<lastBuildDate>Fri, 13 Nov 2026 15:36:00 +0800</lastBuildDate>
		
			<atom:link href="https://blog.zhourunsheng.com/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>HTTPS 上线记：免费证书、自动续签与三处联动</title>
				<link>https://blog.zhourunsheng.com/2026/11/https-%e4%b8%8a%e7%ba%bf%e8%ae%b0-%e5%85%8d%e8%b4%b9%e8%af%81%e4%b9%a6-%e8%87%aa%e5%8a%a8%e7%bb%ad%e7%ad%be%e4%b8%8e%e4%b8%89%e5%a4%84%e8%81%94%e5%8a%a8/</link>
				<pubDate>Fri, 13 Nov 2026 15:36:00 +0800</pubDate>
				<guid>https://blog.zhourunsheng.com/2026/11/https-%e4%b8%8a%e7%ba%bf%e8%ae%b0-%e5%85%8d%e8%b4%b9%e8%af%81%e4%b9%a6-%e8%87%aa%e5%8a%a8%e7%bb%ad%e7%ad%be%e4%b8%8e%e4%b8%89%e5%a4%84%e8%81%94%e5%8a%a8/</guid>
				<description>用 acme.sh 从 Let&amp;rsquo;s Encrypt 签下免费证书，写成一条命令；强制跳转最难的不是跳转本身，而是三条必须放行的例外，以及它和证书续签之间的联动。附带 Isso 评论与公众号回调改走 https 时踩到的坑。</description>
			</item>
			<item>
				<title>换服务器手册：一个包搬走整站</title>
				<link>https://blog.zhourunsheng.com/2026/11/%e6%8d%a2%e6%9c%8d%e5%8a%a1%e5%99%a8%e6%89%8b%e5%86%8c-%e4%b8%80%e4%b8%aa%e5%bd%92%e6%a1%a3%e5%8c%85%e6%90%ac%e8%b5%b0%e6%95%b4%e7%ab%99/</link>
				<pubDate>Thu, 12 Nov 2026 22:30:00 +0800</pubDate>
				<guid>https://blog.zhourunsheng.com/2026/11/%e6%8d%a2%e6%9c%8d%e5%8a%a1%e5%99%a8%e6%89%8b%e5%86%8c-%e4%b8%80%e4%b8%aa%e5%bd%92%e6%a1%a3%e5%8c%85%e6%90%ac%e8%b5%b0%e6%95%b4%e7%ab%99/</guid>
				<description>整站打成一个 112 MB 的包，新机器一条命令恢复。包里带源码、WordPress 原件、1335 张历史图片、评论库、nginx 配置与证书、公众号后端、退役旧站备份和编译好的 hugo——本地电脑什么也不用留。</description>
			</item>
			<item>
				<title>写一篇博文：本站的写作与发布流程</title>
				<link>https://blog.zhourunsheng.com/2026/11/%e5%86%99%e4%b8%80%e7%af%87%e5%8d%9a%e6%96%87-%e6%9c%ac%e7%ab%99%e7%9a%84%e5%86%99%e4%bd%9c%e4%b8%8e%e5%8f%91%e5%b8%83%e6%b5%81%e7%a8%8b/</link>
				<pubDate>Thu, 12 Nov 2026 22:25:00 +0800</pubDate>
				<guid>https://blog.zhourunsheng.com/2026/11/%e5%86%99%e4%b8%80%e7%af%87%e5%8d%9a%e6%96%87-%e6%9c%ac%e7%ab%99%e7%9a%84%e5%86%99%e4%bd%9c%e4%b8%8e%e5%8f%91%e5%b8%83%e6%b5%81%e7%a8%8b/</guid>
				<description>全部在服务器终端完成：建骨架、写正文、构建、发布各一条命令，评论去后台点放行。源码本地不留副本，本地流程降级为备用，附三条红线和常见故障对照表。</description>
			</item>
			<item>
				<title>165 篇文章搬家记：从 WordPress 到 Hugo 静态站</title>
				<link>https://blog.zhourunsheng.com/2026/11/165-%e7%af%87%e6%96%87%e7%ab%a0%e6%90%ac%e5%ae%b6%e8%ae%b0-%e4%bb%8e-wordpress-%e5%88%b0-hugo-%e9%9d%99%e6%80%81%e7%ab%99/</link>
				<pubDate>Thu, 12 Nov 2026 22:20:00 +0800</pubDate>
				<guid>https://blog.zhourunsheng.com/2026/11/165-%e7%af%87%e6%96%87%e7%ab%a0%e6%90%ac%e5%ae%b6%e8%ae%b0-%e4%bb%8e-wordpress-%e5%88%b0-hugo-%e9%9d%99%e6%80%81%e7%ab%99/</guid>
				<description>WordPress 4.1.41 跑了十多年，终于搬家：165 篇文章转成 Markdown，Hugo 生成静态页，评论改用 Isso 自托管。这篇记录全过程，以及五个只有真跑一遍才会暴露的坑。</description>
			</item>
			<item>
				<title>手机安装账户同步服务</title>
				<link>https://blog.zhourunsheng.com/2014/07/%e6%89%8b%e6%9c%ba%e5%ae%89%e8%a3%85%e8%b4%a6%e6%88%b7%e5%90%8c%e6%ad%a5%e6%9c%8d%e5%8a%a1/</link>
				<pubDate>Mon, 21 Jul 2014 09:14:14 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2014/07/%e6%89%8b%e6%9c%ba%e5%ae%89%e8%a3%85%e8%b4%a6%e6%88%b7%e5%90%8c%e6%ad%a5%e6%9c%8d%e5%8a%a1/</guid>
				<description>&lt;h2 id=&#34;前提&#34;&gt;【前提】&lt;/h2&gt;&#xA;&lt;p&gt;手机需要root过，不然没有权限拷贝apk到 /system/app 目录下面。&lt;/p&gt;&#xA;&lt;h2 id=&#34;步骤&#34;&gt;【步骤】&lt;/h2&gt;&#xA;&lt;p&gt;通过手机的【设置】&amp;ndash;【关于手机】 查看当前系统的Android版本，例如我的手机是4.2.2。&lt;/p&gt;&#xA;&lt;p&gt;在 &lt;a href=&#34;http://wiki.rootzwiki.com/Google_Apps&#34;&gt;http://wiki.rootzwiki.com/Google_Apps&lt;/a&gt; 中下载对应的服务包。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2014/07/recommended_package_android.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;里面包含了很多的服务(system\app)app，我们只需要安装服务框架，登录服务，日历同步，通讯录同步，邮件同步即可。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2014/07/install_apks.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;拷贝到 \system\app 系统目录中。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2014/07/copyapks.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2014/07/google_sync.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;【账户同步】&lt;/p&gt;</description>
			</item>
			<item>
				<title>Ubuntu 制作一键安装盘（四）</title>
				<link>https://blog.zhourunsheng.com/2014/05/ubuntu-%e5%88%b6%e4%bd%9c%e4%b8%80%e9%94%ae%e5%ae%89%e8%a3%85%e7%9b%98%ef%bc%88%e5%9b%9b%ef%bc%89/</link>
				<pubDate>Fri, 23 May 2014 10:13:15 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2014/05/ubuntu-%e5%88%b6%e4%bd%9c%e4%b8%80%e9%94%ae%e5%ae%89%e8%a3%85%e7%9b%98%ef%bc%88%e5%9b%9b%ef%bc%89/</guid>
				<description>&lt;p&gt;本文测试原生的Kubuntu系统，基于原生Ubuntu系统，安装KDE环境后制作安装盘请参照文章《Ubuntu 制作一键安装盘（三）》。&lt;/p&gt;&#xA;&lt;p&gt;版本：Kubuntu 12.04 下载地址：http://www.kubuntu.org/getkubuntu/download-lts&lt;/p&gt;&#xA;&lt;p&gt;【更新源(主要是下载速度的因素)】&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;deb http://mirrors.163.com/ubuntu/ precise main restricted universe multiverse&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;deb http://mirrors.163.com/ubuntu/ precise-security main restricted universe multiverse&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;deb http://mirrors.163.com/ubuntu/ precise-updates main restricted universe multiverse&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;deb http://mirrors.163.com/ubuntu/ precise-proposed main restricted universe multiverse&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;deb http://mirrors.163.com/ubuntu/ precise-backports main restricted universe multiverse&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;deb-src http://mirrors.163.com/ubuntu/ precise main restricted universe multiverse&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;deb-src http://mirrors.163.com/ubuntu/ precise-security main restricted universe multiverse&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;deb-src http://mirrors.163.com/ubuntu/ precise-updates main restricted universe multiverse&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;deb-src http://mirrors.163.com/ubuntu/ precise-proposed main restricted universe multiverse&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;deb-src http://mirrors.163.com/ubuntu/ precise-backports main restricted universe multiverse&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# Remastersys Precise&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;deb http://www.remastersys.com/ubuntu precise main&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;【添加公钥】&lt;/p&gt;</description>
			</item>
			<item>
				<title>Ubuntu 制作一键安装盘（三）</title>
				<link>https://blog.zhourunsheng.com/2014/05/ubuntu-%e5%88%b6%e4%bd%9c%e4%b8%80%e9%94%ae%e5%ae%89%e8%a3%85%e7%9b%98%ef%bc%88%e4%b8%89%ef%bc%89/</link>
				<pubDate>Fri, 23 May 2014 10:07:06 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2014/05/ubuntu-%e5%88%b6%e4%bd%9c%e4%b8%80%e9%94%ae%e5%ae%89%e8%a3%85%e7%9b%98%ef%bc%88%e4%b8%89%ef%bc%89/</guid>
				<description>&lt;p&gt;Ubuntu gnome主题的安装光盘制作请参照文章《Ubuntu 制作一键安装盘（二）》，本文进行KDE桌面环境的安装测试。&lt;/p&gt;&#xA;&lt;p&gt;注意：经过测试 remastersys 不能很好的支持GNOME发行版安装的KDE的桌面环境。&lt;/p&gt;&#xA;&lt;p&gt;【安装KDE桌面环境】&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;sudo apt-get install kubuntu-desktop kde-standard&lt;/li&gt;&#xA;&lt;li&gt;简体中文支持：sudo apt-get install language-pack-kde-zh-hans language-pack-kde-zh-hant&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;【步骤】&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;制作发布安装盘 sudo remastersys dist&lt;/li&gt;&#xA;&lt;li&gt;live 模式测试, 版本 Ubuntu 12.04 KDE 32位&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;结果：进入KDE登录界面，因为custom账户没有密码，无法登录进去系统。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;live 模式测试, 版本 Ubuntu 12.04 KDE 64位&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;结果：可以进入GNOME主题系统，但是因为缺少/var/spool/isc* 工作目录，后台测试程序不完整。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;考虑解决方案(isc* 为测试程序，工作目录在/var/spool/isc*)：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;修改 /usr/bin/remastersys 脚本文件，加入自己的处理，例如拷贝必要的文件&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;log_msg &amp;ldquo;Copying iscxxx files&amp;quot;service iscxxx stop &amp;amp;&amp;gt; /dev/null cp -rf /var/spool/isc* $WORKDIR/dummysys/var/spool/ &amp;amp;&amp;gt; /dev/null&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2014/05/remastersys_update_pro.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;sudo remastersys dist&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;结果2：可以进入GNOME主题系统，前后台程序运行正常。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;install 模式测试，无法进行系统的安装，没有安装过程，直接进入live模式&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
			</item>
			<item>
				<title>Ubuntu 制作一键安装盘（二）</title>
				<link>https://blog.zhourunsheng.com/2014/05/ubuntu-%e5%88%b6%e4%bd%9c%e4%b8%80%e9%94%ae%e5%ae%89%e8%a3%85%e7%9b%98%ef%bc%88%e4%ba%8c%ef%bc%89/</link>
				<pubDate>Thu, 22 May 2014 10:11:55 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2014/05/ubuntu-%e5%88%b6%e4%bd%9c%e4%b8%80%e9%94%ae%e5%ae%89%e8%a3%85%e7%9b%98%ef%bc%88%e4%ba%8c%ef%bc%89/</guid>
				<description>&lt;p&gt;本文采用 Remastersys 制作安装盘，使用relinux制作安装盘，请参照上一篇文章《Ubuntu 制作一键安装盘（一）》。&lt;/p&gt;&#xA;&lt;p&gt;【步骤】&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;修改源 &lt;code&gt;/etc/apt/sources.list&lt;/code&gt;，加入：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# Remastersys Precise&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;deb http://www.remastersys.com/ubuntu precise main&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;安装 RemasterSys：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt-get update&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; sudo apt-get install remastersys&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果出现 GPG 错误，请参照文章最后的「错误解决」。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;错误解决的另一种方法，Add repository key：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wget -O - http://www.remastersys.com/ubuntu/remastersys.gpg.key &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo apt-key add -&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;进行备份：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo remastersys dist cdfs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2014/05/remastersys_distcdfs.png&#34; alt=&#34;&#34;&gt;&#xA;sudo remastersys dist iso custom.iso&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2014/05/remastersys_distiso.png&#34; alt=&#34;&#34;&gt;&#xA;```&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;生成 iso 文件，大约 1.2GB。&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;拷贝出来：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo cp /home/remastersys/remastersys/custom.iso /media/sf_vmshare/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;新建虚拟机进行测试，运行 live 模式，guest 账户登录，测试程序可以正常运行，测试通过。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2014/05/remastersys_ubuntu_live.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;系统安装测试，测试通过。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2014/05/remastersys_ubuntu_install.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>Ubuntu 制作一键安装盘（一）</title>
				<link>https://blog.zhourunsheng.com/2014/05/ubuntu-%e5%88%b6%e4%bd%9c%e4%b8%80%e9%94%ae%e5%ae%89%e8%a3%85%e7%9b%98%ef%bc%88%e4%b8%80%ef%bc%89/</link>
				<pubDate>Thu, 22 May 2014 09:50:19 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2014/05/ubuntu-%e5%88%b6%e4%bd%9c%e4%b8%80%e9%94%ae%e5%ae%89%e8%a3%85%e7%9b%98%ef%bc%88%e4%b8%80%ef%bc%89/</guid>
				<description>&lt;p&gt;基于 Ubuntu系统开发了一套系统，为了方便装机的便利性，制作一键安装盘。&lt;/p&gt;&#xA;&lt;p&gt;注意：利用如下方法可以正常做出安装盘，但是安装过程中会出现错误，另外运行live cd的时候也会出现如下low graphic的问题，暂时无解，第一次尝试失败。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2014/05/system_running_lowgf.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;【步骤】&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;下载软件 relinux，&lt;a href=&#34;https://launchpad.net/relinux&#34;&gt;https://launchpad.net/relinux&lt;/a&gt;，例如 relinux_0.4a1-5_i386.deb&lt;/li&gt;&#xA;&lt;li&gt;安装 sudo dpkg -i relinux_0.4a1-5_i386.deb&lt;/li&gt;&#xA;&lt;li&gt;依赖错误修复 sudo apt-get install -f&lt;/li&gt;&#xA;&lt;li&gt;语言环境（简体中文）设定 echo $LANG; export LANG=&amp;lsquo;zh_CN.UTF-8&amp;rsquo;; echo $LANG&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2014/05/relinux_welcome.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2014/05/relinux_configuration.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2014/05/relinux_osweaver.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2014/05/relinux_end.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;制作镜像 sudo relinux, 暂时保留默认设定&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;查看 iso 文件，大小 2.0GB&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;zhours@zhours-VirtualBox:&lt;del&gt;/relinux$ ll /home/relinux/总用量 1923372 drwxr-xr-x  4 root root       4096  5月 12 15:09 ./drwxr-xr-x  4 root root       4096  5月 12 14:31 ../-rw-r&amp;ndash;r&amp;ndash;  1 root root 1969508352  5月 12 15:09 custom.iso-rw-r&amp;ndash;r&amp;ndash;  1 root root         47  5月 12 15:11 custom.iso.md5 drwxr-xr-x  6 root root       4096  5月 12 15:05 .ISO_STRUCTURE/drwxr-xr-x 12 root root       4096  5月 12 14:31 .TMPSYS/zhours@zhours-VirtualBox:&lt;/del&gt;/relinux$&lt;/p&gt;</description>
			</item>
			<item>
				<title>迁移博客图片资源从SAE到七牛</title>
				<link>https://blog.zhourunsheng.com/2014/05/%e8%bf%81%e7%a7%bb%e5%8d%9a%e5%ae%a2%e5%9b%be%e7%89%87%e8%b5%84%e6%ba%90%e4%bb%8esae%e5%88%b0%e4%b8%83%e7%89%9b/</link>
				<pubDate>Wed, 21 May 2014 09:57:02 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2014/05/%e8%bf%81%e7%a7%bb%e5%8d%9a%e5%ae%a2%e5%9b%be%e7%89%87%e8%b5%84%e6%ba%90%e4%bb%8esae%e5%88%b0%e4%b8%83%e7%89%9b/</guid>
				<description>&lt;p&gt;博客的很多图片资料存放在 SAE 上面，鉴于七牛的静态资源存储不错，计划迁移到七牛云存储上面，进而方便统一管理。&lt;/p&gt;&#xA;&lt;p&gt;【下载 SAE Storage 中的资料】&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;所需工具：Cyberduck&lt;/li&gt;&#xA;&lt;li&gt;配置&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;服务器：auth.sinas3.com  端口：443  用户名：应用AccessKey  密码：应用SecretKey&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2014/05/cyberduck.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;【上传到七牛】&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;所需工具：qiniu-devtools-windows_386 [qrsync.exe]&lt;/li&gt;&#xA;&lt;li&gt;配置, 新建 conf.json 文件&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;access_key：应用AccessKey  secret_key：应用SecretKey  bucket：bucket 名称  sync_dir：本地同步文件夹&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2014/05/confjson.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;执行 qrsync.exe conf.json 即可&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;【外链切换】&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;原外链地址：&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://carey-wordpress.stor.sinaapp.com/uploads/2011/06/The-Moon-150x150.jpg&#34;&gt;http://carey-wordpress.stor.sinaapp.com/uploads/2011/06/The-Moon-150x150.jpg&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;新外链地址：&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://carey.u.qiniudn.com/uploads/2011/06/The-Moon-150x150.jpg&#34;&gt;http://carey.u.qiniudn.com/uploads/2011/06/The-Moon-150x150.jpg&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;【数据库相关】&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;查询包含外链的相关文章&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;SELECT * FROM  &lt;code&gt;wp_posts&lt;/code&gt; WHERE post_content LIKE  &amp;lsquo;%http://carey-wordpress.stor.sinaapp.com/%&amp;rsquo;&lt;/p&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;指定文章替换&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;UPDATE wp_posts SET post_content = replace(post_content, &amp;lsquo;&lt;a href=&#34;http://carey-wordpress.stor.sinaapp.com/&#39;&#34;&gt;http://carey-wordpress.stor.sinaapp.com/&#39;&lt;/a&gt;, &amp;lsquo;&lt;a href=&#34;http://carey.u.qiniudn.com/&#39;&#34;&gt;http://carey.u.qiniudn.com/&#39;&lt;/a&gt;) WHERE ID=24&lt;/p&gt;&#xA;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;全局替换&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;UPDATE wp_posts SET post_content = replace(post_content, &amp;lsquo;&lt;a href=&#34;http://carey-wordpress.stor.sinaapp.com/&#39;&#34;&gt;http://carey-wordpress.stor.sinaapp.com/&#39;&lt;/a&gt;, &amp;lsquo;&lt;a href=&#34;http://carey.u.qiniudn.com/&#39;&#34;&gt;http://carey.u.qiniudn.com/&#39;&lt;/a&gt;)&lt;/p&gt;&#xA;&lt;p&gt;【资料相关】&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;SAE 地址：&lt;a href=&#34;http://sae.sina.com.cn/&#34;&gt;http://sae.sina.com.cn/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;SAE SVN 地址：&lt;a href=&#34;https://svn.sinaapp.com/carey&#34;&gt;https://svn.sinaapp.com/carey&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;七牛官方：&lt;a href=&#34;https://portal.qiniu.com/&#34;&gt;https://portal.qiniu.com/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
			</item>
			<item>
				<title>搭建基于Flask框架的树莓派服务器</title>
				<link>https://blog.zhourunsheng.com/2013/11/%e6%90%ad%e5%bb%ba%e5%9f%ba%e4%ba%8eflask%e6%a1%86%e6%9e%b6%e7%9a%84%e6%a0%91%e8%8e%93%e6%b4%be%e6%9c%8d%e5%8a%a1%e5%99%a8/</link>
				<pubDate>Sat, 09 Nov 2013 10:15:57 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/11/%e6%90%ad%e5%bb%ba%e5%9f%ba%e4%ba%8eflask%e6%a1%86%e6%9e%b6%e7%9a%84%e6%a0%91%e8%8e%93%e6%b4%be%e6%9c%8d%e5%8a%a1%e5%99%a8/</guid>
				<description>&lt;p&gt;本文展示了怎么样来利用Flask框架来搭建树莓派的服务器，然后通过web方式来控制物理硬件的开关~。背后的实现原理是，在树莓派的平台上利用python语言开发包，开发IO通信程序，然后通过Flask框架，以web的方式展现出来，那么，这样就可以通过pc的web浏览器或者手持设备的web浏览器来控制实际的硬件开发，实现了物联网的远程控制。&lt;/p&gt;&#xA;&lt;p&gt;The following is an adapted excerpt from Getting Started with Raspberry Pi&lt;/p&gt;&#xA;&lt;p&gt;. I especially like this section of the book because it shows off one of the strengths of the Pi: its ability to combine modern web frameworks with hardware and electronics.&lt;/p&gt;&#xA;&lt;p&gt;Not only can you use the Raspberry Pi to get data from servers via the internet, but your Pi can also act as a server itself. There are many different web servers that you can install on the Raspberry Pi. Traditional web servers, like Apache or lighttpd, serve the files from your board to clients. Most of the time, servers like these are sending HTML files and images to make web pages, but they can also serve sound, video, executable programs, and much more.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android云推送之GCM</title>
				<link>https://blog.zhourunsheng.com/2013/09/android%e4%ba%91%e6%8e%a8%e9%80%81%e4%b9%8bgcm/</link>
				<pubDate>Sat, 28 Sep 2013 09:39:37 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/09/android%e4%ba%91%e6%8e%a8%e9%80%81%e4%b9%8bgcm/</guid>
				<description>&lt;p&gt;本文展示了怎样来利用谷歌的云推送系统Google Cloud Messaging (GCM)来推送消息到Android手机，目前支持两大类消息，一类是“send-to-sync”，即发送一个触发指令，格式为一个自定义的字符串，例如 &amp;ldquo;syncTime&amp;quot;表示同步时间，那么Android客户端收到此消息的话，需要启动一个后台线程，同设定的Server进行交互，获取最新的时间；还有一类是“message with payload”，即发送一条消息，消息中可包含正文内容，比如message.addData(&amp;ldquo;new_time&amp;rdquo;, curTime)，则可以通过键值&amp;quot;new_time&amp;quot;获取到具体的时间。&lt;/p&gt;&#xA;&lt;p&gt;Pushing data has a number of benefits such as increased battery life and decreased server load. GCM is free to use and has no quotas, so it is a perfect candidate to handle the heavy lifting required for data updates.&lt;/p&gt;&#xA;&lt;p&gt;There are two types of messages you can push with GCM: Send-to-sync and message with payload. A send-to-sync is basically a tickle, telling your app to sync with the server while a message with payload lets you send data in the push message (up to 4kb). Here’s a simple, full stack example that will help highlight how to get each of these types of push messages integrated with your app.&lt;/p&gt;</description>
			</item>
			<item>
				<title>备忘：C与C&#43;&#43;之间的互相调用</title>
				<link>https://blog.zhourunsheng.com/2013/09/%e5%a4%87%e5%bf%98%ef%bc%9ac%e4%b8%8ec%e4%b9%8b%e9%97%b4%e7%9a%84%e4%ba%92%e7%9b%b8%e8%b0%83%e7%94%a8/</link>
				<pubDate>Fri, 20 Sep 2013 14:03:12 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/09/%e5%a4%87%e5%bf%98%ef%bc%9ac%e4%b8%8ec%e4%b9%8b%e9%97%b4%e7%9a%84%e4%ba%92%e7%9b%b8%e8%b0%83%e7%94%a8/</guid>
				<description>&lt;p&gt;最新在做Ubuntu上面的C++开发，其中用到了部分C库，那么就涉及到C和C++之间的混合调用，C++调用C语言比较方便，反之则要稍作变通。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1-c-调用-c-语言&#34;&gt;1. C++ 调用 C 语言&lt;/h2&gt;&#xA;&lt;p&gt;头文件包含：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;extern &amp;#34;C&amp;#34;&#xA;{&#xA;#include &amp;#34;iec61850_server.h&amp;#34;&#xA;#include &amp;#34;iso_server.h&amp;#34;&#xA;#include &amp;#34;acse.h&amp;#34;&#xA;#include &amp;#34;thread.h&amp;#34;&#xA;#include &amp;#34;model.h&amp;#34;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;函数调用：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;IedServer_observeDataAttribute(iedServer, (DataAttribute*)mmsi.dmm, observerCallback);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;回调函数observerCallback的声明和实现如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;extern &amp;#34;C&amp;#34;&#xA;{&#xA;  void observerCallback(DataAttribute* dataAttribute)&#xA;  {&#xA;    call_Lib_daObserverCallback(mod, dataAttribute);&#xA;  }&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;2-c-调用-c-语言&#34;&gt;2. C 调用 C++ 语言&lt;/h2&gt;&#xA;&lt;p&gt;在C语言的函数中是无法直接调用C++代码的，如果要调用，需要做一个wrapper，例如call_Lib_daObserverCallback，它的声明和实现如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;extern &amp;#34;C&amp;#34; void call_Lib_daObserverCallback(Lib* p, DataAttribute* dataAttribute) // wrapper function&#xA;{&#xA;   p-&amp;gt;daObserverCallback(dataAttribute);&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;daObserverCallback 才是我们C++代码的实现：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;void Lib::daObserverCallback(DataAttribute* dataAttribute)&#xA;{&#xA;  map&amp;lt;string, MMSINFO&amp;gt;::iterator it;&#xA;  // ...&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
			</item>
			<item>
				<title>体验物联网</title>
				<link>https://blog.zhourunsheng.com/2013/09/%e4%bd%93%e9%aa%8c%e7%89%a9%e8%81%94%e7%bd%91/</link>
				<pubDate>Mon, 16 Sep 2013 09:47:15 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/09/%e4%bd%93%e9%aa%8c%e7%89%a9%e8%81%94%e7%bd%91/</guid>
				<description>&lt;p&gt;上个星期初步接触了物联网，正好工作手头有这些基本的器件，可以打造一个最简单的物联网环境，体验一下。本文的目的是展示一个基于温湿度数据采集的报警系统，当温度或者湿度达到一定的临界值，自动打开报警器，并且微信通知系统管理员，系统管理员也可以通过微信查询当前环境的实时温湿度数据。&lt;/p&gt;&#xA;&lt;p&gt;【系统整体架构】&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;PC端本地通过OpenScada系统采集温湿度的数据&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;PC端本地将采集到的温湿度数据定时上报到云端，供PAD查询&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;PC端本地检测温湿度的阀值，启动或者关闭报警设备&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;PC端本地检测到报警信息，及时给云端报告告警信息，云端通过微信系统推送到系统管理员账号上&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;系统管理员通道PAD微信系统，查询当前环境的数据&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;【硬件环境】&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;工作PC，ubuntu系统，运行openscada数据采集系统&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;PAD一台，手机也可以，模拟器也行，能跑微信就行&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;USB-485 转接器，PC上没有485端口，需要转换成USB通信协议&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;FT-02RL开关量输入输出模块(MODBUS-RTU协议)，软件控制继电器开关&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;温湿度传感器，基于485 modbus的数据传输协议&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;【硬件布线】&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;注意一下电源的正负极，不要接反了&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;注意485的A B数据端口，不要接反了&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;其他的没啥问题了&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;【软件环境】&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;本地PC运行Ubuntu 12.04 OS&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;本地实现OpenScada数据采集系统，可以采集Modbus协议的数据，和基于Modbus协议控制外设&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;远端的PHP服务器，采用的我博客（http://blog.zhourunsheng.com）的后台，基于wordpress + 插件&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;微信公众号的接入，像我下面的微信号是专门为博客服务的&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;【演示数据查询】&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;加入公众微信号，查询关键字“zhou_runsheng”，或者扫描如下的二维码，添加&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2013/04/qrcode_runsheng_blog.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;发送查询指令，例如“查询温湿度”，返回当前环境温湿度数据&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&amp;lt;&amp;lt;&amp;lt; 查询温湿度&amp;gt;&amp;gt;&amp;gt; 温湿度数据：温度：33.5 度湿度：88.7%露点：18.7 度&lt;/p&gt;&#xA;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;其他的指令还没有加入，如果输入其他的查询信息，默认会按照该关键词来搜索相关的博文展示&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;【演示报警】&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;加热温湿度采集器（O(∩_∩)O，用火烤烤，甭烧毁仪器就行）&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;加湿温湿度采集器（最简单的办法，对着仪器哈口气，湿度立马上升到99.99%）&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;当温湿度达到管理员配置的临界阀值（比如温度超过33摄氏度），产生报警&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;报警产生，报警器响铃，微信推送通知系统管理员&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;湿度报警, 继电器开关打开，左数第一个亮起来的红灯&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;【未来】&lt;/p&gt;&#xA;&lt;p&gt;目前仅仅实现了简单的数据采集+报警应急处理，推广到其他地方，比如智能家居，智能农田灌溉，智能监控系统等等，O(∩_∩)O哈哈~，先想想怎么样打造一套智能的家居吧~~~，把家里联网的东西全控制了。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android后台服务之IntentService</title>
				<link>https://blog.zhourunsheng.com/2013/09/android%e5%90%8e%e5%8f%b0%e6%9c%8d%e5%8a%a1%e4%b9%8bintentservice/</link>
				<pubDate>Sat, 07 Sep 2013 09:07:10 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/09/android%e5%90%8e%e5%8f%b0%e6%9c%8d%e5%8a%a1%e4%b9%8bintentservice/</guid>
				<description>&lt;p&gt;在Android的开发过程中，经常需要用到后台服务来完成非UI的工作，比如文件的下载，那么本文提到的IntentService便是一个很好的选择，可以利用它的队列机制，放入一系列的任务，然后系统会依次启动单独的Service来执行任务，免去了自己维护队列的麻烦。&lt;/p&gt;&#xA;&lt;p&gt;In the new category Read the code&lt;/p&gt;&#xA;&lt;p&gt;I’m going to show the internals of the Android framework. Reading the code of the framework can give you a good impression about what’s going on under the hood. In addition to that knowing how the framework developers solved common problems can help you to find the best solutions when facing problems in your own app code.&lt;/p&gt;&#xA;&lt;p&gt;What is the IntentService class good for?&lt;/p&gt;</description>
			</item>
			<item>
				<title>JavaScript之变量和函数提升</title>
				<link>https://blog.zhourunsheng.com/2013/09/javascript%e4%b9%8b%e5%8f%98%e9%87%8f%e5%92%8c%e5%87%bd%e6%95%b0%e6%8f%90%e5%8d%87/</link>
				<pubDate>Sat, 07 Sep 2013 07:54:32 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/09/javascript%e4%b9%8b%e5%8f%98%e9%87%8f%e5%92%8c%e5%87%bd%e6%95%b0%e6%8f%90%e5%8d%87/</guid>
				<description>&lt;p&gt;JS代码有一个特殊的规则，那就是 hoisted提升规则，函数的调用可以放在函数实现的前面，但是仅限于函数是以非表达式的场合声明实现的，那么变量的提升又有什么不同呢，在开发过程中还会出现哪些经常犯的错误，本文对此进行了介绍。&lt;/p&gt;&#xA;&lt;p&gt;One of the trickier aspects of JavaScript for new JavaScript developers is the fact that variables and functions are &amp;ldquo;hoisted.&amp;rdquo; Rather than being available after their declaration, they might actually be available beforehand. How does that work? Let&amp;rsquo;s take a look at variable hoisting first.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;// ReferenceError: noSuchVariable is not defined&#xA;console.log(noSuchVariable);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This is more or less what one would expect. An error is thrown when you try to access the value of a variable that doesn&amp;rsquo;t exist. But what about this case?&lt;/p&gt;</description>
			</item>
			<item>
				<title>Python开发之性能优化</title>
				<link>https://blog.zhourunsheng.com/2013/08/python%e5%bc%80%e5%8f%91%e4%b9%8b%e6%80%a7%e8%83%bd%e4%bc%98%e5%8c%96/</link>
				<pubDate>Sat, 31 Aug 2013 10:45:21 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/python%e5%bc%80%e5%8f%91%e4%b9%8b%e6%80%a7%e8%83%bd%e4%bc%98%e5%8c%96/</guid>
				<description>&lt;p&gt;不论什么语言的开发，都会涉及到下面的几个问题，代码的运行时间，性能出现的瓶颈，内存的占用情况，是否有内存的泄露等等，同样Python也不例外，本文介绍了几个优秀的Python工具，可以实现如上所述问题的检测机制，通过动态运行跟踪代码的执行情况，从而发现问题点。&lt;/p&gt;&#xA;&lt;p&gt;While it’s not always the case that every Python program you write will require a rigorous performance analysis, it is reassuring to know that there are a wide variety of tools in Python’s ecosystem that one can turn to when the time arises.&lt;/p&gt;&#xA;&lt;p&gt;Analyzing a program’s performance boils down to answering 4 basic questions:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;How fast is it running?&lt;/li&gt;&#xA;&lt;li&gt;Where are the speed bottlenecks?&lt;/li&gt;&#xA;&lt;li&gt;How much memory is it using?&lt;/li&gt;&#xA;&lt;li&gt;Where is memory leaking?&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Below, we’ll dive into the details of answering these questions using some awesome tools.&lt;/p&gt;</description>
			</item>
			<item>
				<title>解读JavaScript的Scope和Context</title>
				<link>https://blog.zhourunsheng.com/2013/08/%e8%a7%a3%e8%af%bbjavascript%e7%9a%84scope%e5%92%8ccontext/</link>
				<pubDate>Sat, 31 Aug 2013 09:47:22 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/%e8%a7%a3%e8%af%bbjavascript%e7%9a%84scope%e5%92%8ccontext/</guid>
				<description>&lt;p&gt;本文详细解读了Javascript语言中的作用域Scope和上下文Context。JS是一种特殊的解释型语言，尤其是闭包的概念，使得JS更灵活，还有事件的绑定bind，this指针的用法等，相信本文有所帮助。&lt;/p&gt;&#xA;&lt;p&gt;JavaScript’s implementation of scope and context is a unique feature of the language, in part because it is so flexible. Functions can be adopted for various contexts and scope can be encapsulated and preserved. These concepts are behind some of the most powerful design patterns JavaScript has to offer. However, this is also a tremendous source of confusion amongst developers, and for good reason. The following is a comprehensive explanation of scope and context in JavaScript, the difference between them, and how various design patterns make use of them.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Ubuntu升级源备忘</title>
				<link>https://blog.zhourunsheng.com/2013/08/ubuntu%e5%8d%87%e7%ba%a7%e6%ba%90%e5%a4%87%e5%bf%98/</link>
				<pubDate>Fri, 30 Aug 2013 14:29:10 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/ubuntu%e5%8d%87%e7%ba%a7%e6%ba%90%e5%a4%87%e5%bf%98/</guid>
				<description>&lt;p&gt;ubuntu的版本支持的时间都有限, 如果过了支持的时间，更新源会被停用，那么只能采取old-releases源了。&lt;/p&gt;&#xA;&lt;p&gt;查看当前系统的版本信息&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;chs@chs-VirtualBox:~/project/openscada$ sudo lsb_release -a&#xA;[sudo] password for chs:&#xA;No LSB modules are available.&#xA;Distributor ID: Ubuntu&#xA;Description: Ubuntu 11.04&#xA;Release: 11.04&#xA;Codename: natty&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;可以发现当前的系统版本是11.04，代号为natty。&lt;/p&gt;&#xA;&lt;p&gt;old-releases源信息如下&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;deb http://old-releases.ubuntu.com/ubuntu/ natty main restricted universe multiverse&#xA;deb http://old-releases.ubuntu.com/ubuntu/ natty-security main restricted universe multiverse&#xA;deb http://old-releases.ubuntu.com/ubuntu/ natty-updates main restricted universe multiverse&#xA;deb http://old-releases.ubuntu.com/ubuntu/ natty-proposed main restricted universe multiverse&#xA;deb http://old-releases.ubuntu.com/ubuntu/ natty-backports main restricted universe multiverse&#xA;deb-src http://old-releases.ubuntu.com/ubuntu/ natty main restricted universe multiverse&#xA;deb-src http://old-releases.ubuntu.com/ubuntu/ natty-security main restricted universe multiverse&#xA;deb-src http://old-releases.ubuntu.com/ubuntu/ natty-updates main restricted universe multiverse&#xA;deb-src http://old-releases.ubuntu.com/ubuntu/ natty-proposed main restricted universe multiverse&#xA;deb-src http://old-releases.ubuntu.com/ubuntu/ natty-backports main restricted universe multiverse&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;修改更新源，替换成上面的源信息&lt;/p&gt;</description>
			</item>
			<item>
				<title>网站SEO优化之CSS JS代码合并</title>
				<link>https://blog.zhourunsheng.com/2013/08/%e7%bd%91%e7%ab%99seo%e4%bc%98%e5%8c%96%e4%b9%8bcss-js%e4%bb%a3%e7%a0%81%e5%90%88%e5%b9%b6/</link>
				<pubDate>Fri, 30 Aug 2013 11:34:48 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/%e7%bd%91%e7%ab%99seo%e4%bc%98%e5%8c%96%e4%b9%8bcss-js%e4%bb%a3%e7%a0%81%e5%90%88%e5%b9%b6/</guid>
				<description>&lt;p&gt;在优化网站的过程中，其中一个规则就是尽量减少HTTP的请求数量，比如图片的合并，JS，CSS代码的合并等，本文介绍了一款PHP的自动合并脚本，可以在网站中使用，只要将原来需要引用JS和CSS的地方，换成该脚本的函数调用，那么脚本就会自动将过个请求合并成一个请求，重而提高网站的打开速度。&lt;/p&gt;&#xA;&lt;h2 id=&#34;combining-assets&#34;&gt;Combining Assets&lt;/h2&gt;&#xA;&lt;p&gt;One of the basic tenets of making a web-page load quickly is reducing the number of HTTP requests that your page makes. One very common way of doing this, is assuring that all of your CSS files are combined into one request (ideally in the &amp;lt;head&amp;gt; tag), and all of your javscript files are combined into one request (ideally at the bottom of the &amp;lt;body&amp;gt; tag).&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-solution&#34;&gt;The Solution&lt;/h2&gt;&#xA;&lt;p&gt;I’ve worked with several large sites which each had their own solutions, but recently I found myself needing to speed up a fairly simple site:Burndown for Trello.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Ubuntu SVN客户端连接windows VisualSVN SSL证书问题</title>
				<link>https://blog.zhourunsheng.com/2013/08/ubuntu-svn%e5%ae%a2%e6%88%b7%e7%ab%af%e8%bf%9e%e6%8e%a5windows-visualsvn-ssl%e8%af%81%e4%b9%a6%e9%97%ae%e9%a2%98/</link>
				<pubDate>Fri, 30 Aug 2013 10:29:50 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/ubuntu-svn%e5%ae%a2%e6%88%b7%e7%ab%af%e8%bf%9e%e6%8e%a5windows-visualsvn-ssl%e8%af%81%e4%b9%a6%e9%97%ae%e9%a2%98/</guid>
				<description>&lt;h2 id=&#34;问题&#34;&gt;问题&lt;/h2&gt;&#xA;&lt;p&gt;英文：svn: OPTIONS of &amp;lsquo;&lt;a href=&#34;https://server.domain.local/svn/repo&#39;:SSL&#34;&gt;https://server.domain.local/svn/repo&#39;:SSL&lt;/a&gt; handshake failed: SSL error:Key usage violation in certificate has been detected. (&lt;a href=&#34;https://server.domain.local&#34;&gt;https://server.domain.local&lt;/a&gt;) 中文：SSL handshake failed: SSL 错误：在证书中检测到违规的密钥用法。&lt;/p&gt;&#xA;&lt;h2 id=&#34;解决方案&#34;&gt;解决方案&lt;/h2&gt;&#xA;&lt;h2 id=&#34;symptoms&#34;&gt;Symptoms&lt;/h2&gt;&#xA;&lt;p&gt;Subversion clients receive the following error message when attempting to connect to VisualSVN Server:&lt;/p&gt;&#xA;&lt;p&gt;svn: OPTIONS of &amp;lsquo;&lt;a href=&#34;https://server.domain.local/svn/repo&#39;&#34;&gt;https://server.domain.local/svn/repo&#39;&lt;/a&gt;: SSL handshake failed: SSL error:&lt;/p&gt;&#xA;&lt;p&gt;Key usage violation in certificate has been detected. (&lt;a href=&#34;https://server.domain.local&#34;&gt;https://server.domain.local&lt;/a&gt;) You may experience the issue if both of the following conditions are met:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;VisualSVN Server has a self-signed certificate applied and&lt;/li&gt;&#xA;&lt;li&gt;Subversion client is built against the GnuTLS library.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;NoteGnuTLS library is an alternative to OpenSSL. Most Subversion clients for Windows are built against OpenSSL and are not affected by this issue. While some Subversion packages (available mostly on Linux-based operating systems such as Ubuntu and Debian) are built against GnuTLS and are affected.&lt;/p&gt;</description>
			</item>
			<item>
				<title>搭建基于Python的视频服务器</title>
				<link>https://blog.zhourunsheng.com/2013/08/%e6%90%ad%e5%bb%ba%e5%9f%ba%e4%ba%8epython%e7%9a%84%e8%a7%86%e9%a2%91%e6%9c%8d%e5%8a%a1%e5%99%a8/</link>
				<pubDate>Sat, 24 Aug 2013 10:57:27 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/%e6%90%ad%e5%bb%ba%e5%9f%ba%e4%ba%8epython%e7%9a%84%e8%a7%86%e9%a2%91%e6%9c%8d%e5%8a%a1%e5%99%a8/</guid>
				<description>&lt;p&gt;本文基于Python后台搭建了一个视频服务器，集视频的上传，视频的格式转化，视频的播放于一体，后台基于Django框架和Amazon S3的存储，视频格式的转换基于Encoding.com的在线服务，消息队列基于RabbitMQ，视频上传和转换处理完毕后，采用浏览器的Html5播放，采用了Video.js。&lt;/p&gt;&#xA;&lt;p&gt;Stickyworld&amp;rsquo;s consultation web app has supported video for a long time but it&amp;rsquo;s been hosted via a YouTube embed. When we started building the new version of the web app we wanted to take control of the video content and also free our users from YouTube&amp;rsquo;s terms of service.&lt;/p&gt;&#xA;&lt;p&gt;I personally had worked on projects with clients in the past which did video transcoding and it was never something easy to achieve. It takes a lot to accept every video, audio and container format under the sun and output them into various video formats that the web knows and loves.&lt;/p&gt;</description>
			</item>
			<item>
				<title>NODE.JS开发入门</title>
				<link>https://blog.zhourunsheng.com/2013/08/node-js%e5%bc%80%e5%8f%91%e5%85%a5%e9%97%a8/</link>
				<pubDate>Sat, 24 Aug 2013 10:18:49 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/node-js%e5%bc%80%e5%8f%91%e5%85%a5%e9%97%a8/</guid>
				<description>&lt;p&gt;一篇优秀的NODE.JS入门文章，介绍了安装，运行简单的程序，IO程序，NPM安装依赖包，Module开发。&lt;/p&gt;&#xA;&lt;p&gt;There&amp;rsquo;s no shortage of Node.js tutorials out there, but most of them cover specific use cases or topics that only apply when you&amp;rsquo;ve already got Node up and running. I see comments every once and awhile that sound something like, &amp;ldquo;I&amp;rsquo;ve downloaded Node, now what?&amp;rdquo; This tutorial answers that question and explains how to get started from the very beginning.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-is-nodejs&#34;&gt;What is Node.js?&lt;/h2&gt;&#xA;&lt;p&gt;A lot of the confusion for newcomers to Node is misunderstanding exactly what it is. The description on nodejs.org definitely doesn&amp;rsquo;t help.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android动画设计之ViewOverlay</title>
				<link>https://blog.zhourunsheng.com/2013/08/android%e5%8a%a8%e7%94%bb%e8%ae%be%e8%ae%a1%e4%b9%8bviewoverlay/</link>
				<pubDate>Thu, 22 Aug 2013 10:38:06 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/android%e5%8a%a8%e7%94%bb%e8%ae%be%e8%ae%a1%e4%b9%8bviewoverlay/</guid>
				<description>&lt;h2 id=&#34;什么是viewoverlay&#34;&gt;什么是ViewOverlay？&lt;/h2&gt;&#xA;&lt;p&gt;ViewOverlay is a class that we can find in Android since its version 4.3 (API version 18) that provides a transparent layer on top of a View&lt;/p&gt;&#xA;&lt;p&gt;, to which you can add visual content and that does not affect the layout hierarchy.&lt;/p&gt;&#xA;&lt;p&gt;It always has the same size and position as its host view, allowing you to add content over that view.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2013/08/vo-all.gif&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;运行效果&#34;&gt;运行效果&lt;/h2&gt;&#xA;&lt;p&gt;红色部分：使用了按钮的 parent-parent layout (the main, first-level, layout) ViewGroupOverlay，所以可以穿越整个画面。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android网络编程之SPDY</title>
				<link>https://blog.zhourunsheng.com/2013/08/android%e7%bd%91%e7%bb%9c%e7%bc%96%e7%a8%8b%e4%b9%8bspdy/</link>
				<pubDate>Thu, 22 Aug 2013 09:33:06 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/android%e7%bd%91%e7%bb%9c%e7%bc%96%e7%a8%8b%e4%b9%8bspdy/</guid>
				<description>&lt;p&gt;Android的网络编程大家基本都熟悉，Http的Get，Post请求与其他语言的开发大同小异，可以采用Android自带的网络开发包，也可以采用Apache的开源网络编程包。本文介绍一个支持SPDY的开发包 OkHttp，关于SPDY的知识，大家可以从维基百科和百度百科上面找到，基本就是增强版的Http。&lt;/p&gt;&#xA;&lt;p&gt;OkHttp is an HTTP client that’s efficient by default:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;SPDY support allows all requests to the same host to share a socket.&lt;/li&gt;&#xA;&lt;li&gt;Connection pooling reduces request latency (if SPDY isn’t available).&lt;/li&gt;&#xA;&lt;li&gt;Transparent GZIP shrinks download sizes.&lt;/li&gt;&#xA;&lt;li&gt;Response caching avoids the network completely for repeat requests.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;示例代码&#34;&gt;示例代码&lt;/h2&gt;&#xA;&lt;h2 id=&#34;get-a-url&#34;&gt;GET A URL&lt;/h2&gt;&#xA;&lt;p&gt;This program downloads a URL and print its contents as a string.&lt;/p&gt;&#xA;&lt;p&gt;Full source.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    OkHttpClient client = new OkHttpClient();&#xA;&#xA;    String get(URL url) throws IOException {&#xA;      HttpURLConnection connection = client.open(url);&#xA;      InputStream in = null;&#xA;      try {&#xA;        // Read the response.&#xA;        in = connection.getInputStream();&#xA;        byte[] response = readFully(in);&#xA;        return new String(response, &amp;#34;UTF-8&amp;#34;);&#xA;      } finally {&#xA;        if (in != null) in.close();&#xA;      }&#xA;    }&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;post-to-a-server&#34;&gt;POST TO A SERVER&lt;/h2&gt;&#xA;&lt;p&gt;This program posts data to a service.&lt;/p&gt;</description>
			</item>
			<item>
				<title>深度解读Android关机过程</title>
				<link>https://blog.zhourunsheng.com/2013/08/%e6%b7%b1%e5%ba%a6%e8%a7%a3%e8%af%bbandroid%e5%85%b3%e6%9c%ba%e8%bf%87%e7%a8%8b/</link>
				<pubDate>Wed, 21 Aug 2013 11:59:03 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/%e6%b7%b1%e5%ba%a6%e8%a7%a3%e8%af%bbandroid%e5%85%b3%e6%9c%ba%e8%bf%87%e7%a8%8b/</guid>
				<description>&lt;p&gt;想知道Android系统的关系过程么？？？本文将会展示一个完整的关机处理流程。&lt;/p&gt;&#xA;&lt;p&gt;What happened when I long press power button ?&lt;/p&gt;&#xA;&lt;p&gt;What is shutdown sequence ?&lt;/p&gt;&#xA;&lt;p&gt;How is it different from desktop linux shutdown sequence?&lt;/p&gt;&#xA;&lt;p&gt;How to change shutdown menu ?&lt;/p&gt;&#xA;&lt;p&gt;Many questions pop-up in mind when we think about Android shutdown sequence. Before you read about shutdown sequence I suggest you to read about boot sequence article.&lt;/p&gt;&#xA;&lt;p&gt;Android is linux based open source operating system, x86 (x86 is a series of computer microprocessor instruction set architectures based on the Intel 8086 CPU.) is most likely system where linux kernel is deployed however all Android devices are running on ARM process (ARM (formerly Advanced RISC Machine, which was formerly Acorn RISC Machine)) except Intel&amp;rsquo;s Xolo device (&lt;a href=&#34;http://xolo.in/xolo-x900-features&#34;&gt;http://xolo.in/xolo-x900-features&lt;/a&gt;). Xolo comes with Atom 1.6 GHz x86 processor. Android shutdown sequence is different from desktop linux like ubuntu, fedora, etc.&lt;/p&gt;</description>
			</item>
			<item>
				<title>基于Gradle生成Android apklibs</title>
				<link>https://blog.zhourunsheng.com/2013/08/%e5%9f%ba%e4%ba%8egradle%e7%94%9f%e6%88%90android-apklibs/</link>
				<pubDate>Wed, 21 Aug 2013 10:45:58 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/%e5%9f%ba%e4%ba%8egradle%e7%94%9f%e6%88%90android-apklibs/</guid>
				<description>&lt;p&gt;So, you&amp;rsquo;ve decided to switch your Android library project to the new hotness (Gradle, Android&amp;rsquo;s new build system)? About to release a new Android library? Read on.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;*What is apklib?*apklib is a way to bundle an Android library project.&lt;/p&gt;&#xA;&lt;p&gt;Many Android developers thought the existing Android build system, based on Ant, was insufficient. Maven is arguably a better build system, so the android-maven-plugin was created, to let Maven users build their Android projects.&lt;/p&gt;</description>
			</item>
			<item>
				<title>创建自定义的SQLite Loader</title>
				<link>https://blog.zhourunsheng.com/2013/08/%e5%88%9b%e5%bb%ba%e8%87%aa%e5%ae%9a%e4%b9%89%e7%9a%84sqlite-loader/</link>
				<pubDate>Wed, 21 Aug 2013 10:30:52 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/%e5%88%9b%e5%bb%ba%e8%87%aa%e5%ae%9a%e4%b9%89%e7%9a%84sqlite-loader/</guid>
				<description>&lt;p&gt;在开发Android的过程中，我们经常会用到SQLite进行资料的存储，本文给出了一种自定义Loader的方式，直接访问SQLite的API进行交互。&lt;/p&gt;&#xA;&lt;p&gt;Today we’ll discuss about custom loaders in Android. Loaders have been introduced from Android 3.0 but we can also use loaders in prior versions of Android starting from Android 1.6 with the help of Android compatibility library.&lt;/p&gt;&#xA;&lt;p&gt;In this tutorial we won’t discuss the basics of loader which is vastly available in the Internet. A very good tutorial on loaders in Android can be found here . Here we’ll discuss about how to create a custom loader in Android which can read data from SQLite Database and return the read data as a collection of POJO.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Aspect Oriented Programming (AOP) 设计导读</title>
				<link>https://blog.zhourunsheng.com/2013/08/aspect-oriented-programming-aop-%e8%ae%be%e8%ae%a1%e5%af%bc%e8%af%bb/</link>
				<pubDate>Sat, 17 Aug 2013 08:22:00 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/aspect-oriented-programming-aop-%e8%ae%be%e8%ae%a1%e5%af%bc%e8%af%bb/</guid>
				<description>&lt;p&gt;AOP通俗来讲，就是在不改变既有代码的基础上增加新功能，比如常用的地方有日志记录，可能我们已经上线了产品，代码也已经进行了发布，如何在此种情况下，增加log记录，打印出后台函数的调用记录，参数传递情况等等。在面向对象的设计过程中，已经有其他的方式可以利用，比如继承，组合，代理等，但是相对于AOP来说，都没有后者灵活。本文基于JavaScript语言进行介绍。&lt;/p&gt;&#xA;&lt;p&gt;Aspect Oriented Programming (AOP) is a technique for augmenting the behavior of objects, methods, and functions non-invasively. AOP allows you to add new behaviors and to combine and modify existing behaviors &amp;ldquo;from the outside&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;While there are many techniques for adding and combining behavior, such as inheritance, composition, and delegation, AOP can prove to be more flexible and less invasive in many situations, and it is a worthwhile addition to your toolbox of techniques.&lt;/p&gt;</description>
			</item>
			<item>
				<title>一种更符合自然语意的PHP正则表达式</title>
				<link>https://blog.zhourunsheng.com/2013/08/%e4%b8%80%e7%a7%8d%e6%9b%b4%e7%ac%a6%e5%90%88%e8%87%aa%e7%84%b6%e8%af%ad%e6%84%8f%e7%9a%84php%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f/</link>
				<pubDate>Thu, 15 Aug 2013 22:07:37 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/%e4%b8%80%e7%a7%8d%e6%9b%b4%e7%ac%a6%e5%90%88%e8%87%aa%e7%84%b6%e8%af%ad%e6%84%8f%e7%9a%84php%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f/</guid>
				<description>&lt;p&gt;在编程的过程中，尤其是文本的处理，我们很多时候都需要正则表达式，比如，验证用户输入的Email是否格式正确，电话号码是否符合规范，或者其他的自定义规则。对新手来说，熟记正则表达式的规则比较困难，那么有没有一种更符合自然语义的正则表达式呢，本文会给你答案。&lt;/p&gt;&#xA;&lt;p&gt;Most newbie (and some seasoned) programmers have difficultly constructing Regular Expressions. Many a times one needs to create a Regexp quickly to test a a particular piece of code. However, not being comfortable withe Regexps can be a problem.&lt;/p&gt;&#xA;&lt;p&gt;VerbalExpressions&lt;/p&gt;&#xA;&lt;p&gt;is a PHP library that enables you to construct regular expressions using natural language like constructs. Think of it like a DSL for building Regexps.&lt;/p&gt;&#xA;&lt;p&gt;verbalexpressions 已经实现了多个语言版本的库，可以从这里得到。&lt;/p&gt;&#xA;&lt;p&gt;Below is a sample PHP code that constructs a regular expression which tests whether a given string is a valid url.&lt;/p&gt;</description>
			</item>
			<item>
				<title>PHP中Session的使用</title>
				<link>https://blog.zhourunsheng.com/2013/08/php%e4%b8%adsession%e7%9a%84%e4%bd%bf%e7%94%a8/</link>
				<pubDate>Thu, 15 Aug 2013 21:38:34 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/php%e4%b8%adsession%e7%9a%84%e4%bd%bf%e7%94%a8/</guid>
				<description>&lt;p&gt;php中使用session的场合主要是用户登录信息的记录和页面之间数据的传递，session的有效期为浏览器的生存期，直到用户关闭浏览器，服务器中的session数据才清除。本文介绍了怎么样利用session来存储变量。&lt;/p&gt;&#xA;&lt;p&gt;In this article I’m going to show you some simple things to work with sessions in php, these are mostly used to store information about your users, like usernames, choices selected by users and similar, these however are stored on the server and deleted once the user closes the browser. To interact with session variables you need to carefully create them and then check them and accordingly do something based on their value. This is actually the main topic of this article, how to check and create php session variables.&lt;/p&gt;</description>
			</item>
			<item>
				<title>libiec61850在OpenSCADA系统中的使用(二)</title>
				<link>https://blog.zhourunsheng.com/2013/08/libiec61850%e5%9c%a8openscada%e7%b3%bb%e7%bb%9f%e4%b8%ad%e7%9a%84%e4%bd%bf%e7%94%a8%e4%ba%8c/</link>
				<pubDate>Thu, 15 Aug 2013 15:36:41 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/libiec61850%e5%9c%a8openscada%e7%b3%bb%e7%bb%9f%e4%b8%ad%e7%9a%84%e4%bd%bf%e7%94%a8%e4%ba%8c/</guid>
				<description>&lt;p&gt;上一篇文章《libiec61850在OpenSCADA系统中的使用》介绍了libiec61850和OpenSCADA系统的混合编译，编译是没有问题，但是做成模块的话运行起来还是会出现问题，其中最主要的问题就是库的链接，导致运行时函数找不到，原因出在C和C++函数相互调用的关系，libiec61850是C库，OpenSCADA是C++。&lt;/p&gt;&#xA;&lt;p&gt;本文采用将libiec61850编译成动态库的方式供OpenSCADA系统调用，步骤如下：&lt;/p&gt;&#xA;&lt;h2 id=&#34;动态库的编译安装&#34;&gt;动态库的编译安装&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;修改libiec61850的 &amp;ldquo;lib61850\make\target_system.mk&amp;rdquo; 文件，编译选项添加fPIC&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;CFLAGS += -g&#xA;CFLAGS += -fPIC&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;修改libiec61850 的“lib61850\Makefile”文件，添加生成动态库的参数soname&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$(DYN_LIB_NAME): $(LIB_OBJS)&#xA;$(CC) $(LDFLAGS) -lpthread -shared -Wl,-soname -Wl,libiec61850.so -o $(DYN_LIB_NAME) $(LIB_OBJS) $(LDLIBS)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;编译生成动态库&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ make dynlib&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;生成 “lib61850\build\libiec61850.so”文件&lt;/p&gt;&#xA;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;安装动态库到系统目录&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ /usr/bin/install -c lib61850/build/libiec61850.so /usr/lib/i386-linux-gnu/libiec61850.so&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;5&#34;&gt;&#xA;&lt;li&gt;修改OpenSCADA SP61850 module的 &amp;ldquo;Makefile.am&amp;rdquo; 文件，动态链接libiec61850.so&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!!! The module link flags&#xA;spec_SP61850_la_LDFLAGS = -module -avoid-version -no-undefined -Llib61850/build -liec61850 $(SP61850_LDLAGS)&#xA;&#xA;############ for lib61850 include header file and lib file ##################&#xA;AM_CPPFLAGS = -Ilib61850/inc -Ilib61850/src/common -Ilib61850/src/mms/iso_presentation -Ilib61850/src/mms/iso_session -Ilib61850/src/mms/iso_cotp -Ilib61850/src/mms/iso_acse -Ilib61850/src/mms/iso_mms/common -Ilib61850/src/mms/iso_mms/client -Ilib61850/src/mms/iso_mms/server -Ilib61850/src/mms/iso_client -Ilib61850/src/mms/iso_server -Ilib61850/src/mms/asn1 -Ilib61850/src/iedcommon -Ilib61850/src/iedserver/mms_mapping -Ilib61850/src/iedserver/model -Ilib61850/src/iedserver -Ilib61850/src/iedclient -Ilib61850/src/hal -Ilib61850/src/hal/thread -Ilib61850/src/hal/socket -Ilib61850/src/goose&#xA;#############################################################################&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;测试代码的编写&#34;&gt;测试代码的编写&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;修改“SP61850\module.h”头文件，添加libiec6180的常用头文件&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/////////////////////////////////////////////////////////&#xA;extern &amp;#34;C&amp;#34;&#xA;{&#xA;#include &amp;#34;iec61850_server.h&amp;#34;&#xA;#include &amp;#34;iso_server.h&amp;#34;&#xA;#include &amp;#34;acse.h&amp;#34;&#xA;#include &amp;#34;thread.h&amp;#34;&#xA;#include &amp;lt;stdlib.h&amp;gt;&#xA;#include &amp;lt;stdio.h&amp;gt;&#xA;&#xA;#include &amp;#34;static_model.h&amp;#34;&#xA;&#xA;/* import IEC 61850 device model created from SCL-File */&#xA;extern IedModel iedModel;&#xA;}&#xA;////////////////////////////////////////////////////////&#xA;&#xA;////C++类（class Lib : public TSpecial）内部添加属性&#xA;///////////////////////////////////////////////////////////&#xA;&#xA;int running;&#xA;IedServer iedServer;&#xA;///////////////////////////////////////////////////////////&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;修改“SP61850\module.cpp”文件，控制服务器的启动与停止&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;//////// 启动服务器 void Lib::modStart( )&#xA;&#xA;//61850 server.&#xA;if(! running)&#xA;{&#xA;iedServer = IedServer_create(&amp;amp;iedModel);&#xA;&#xA;/* MMS server will be instructed to start listening to client connections. */&#xA;IedServer_start(iedServer, 102);&#xA;&#xA;/* Instruct the server that we will be informed if a clients writes to a&#xA;* certain variables we are interested in.&#xA;*/&#xA;IedServer_observeDataAttribute(iedServer, IEDMODEL_Device1_DSCH1_NamPlt_vendor,&#xA;observerCallback);&#xA;&#xA;IedServer_observeDataAttribute(iedServer, IEDMODEL_Device1_DSCH1_NamPlt_swRev,&#xA;observerCallback);&#xA;&#xA;if (!IedServer_isRunning(iedServer))&#xA;{&#xA;mess_err(nodePath().c_str(),_(&amp;#34;Start 61850 Server error.&amp;#34;));&#xA;IedServer_destroy(iedServer);&#xA;}&#xA;else&#xA;{&#xA;running = 1;&#xA;}&#xA;}&#xA;&#xA;////// 停止服务器 void Lib::modStop( )&#xA;//&#xA;if(running)&#xA;{&#xA;/* stop MMS server - close TCP server socket and all client sockets */&#xA;IedServer_stop(iedServer);&#xA;&#xA;/* Cleanup - free all resources */&#xA;IedServer_destroy(iedServer);&#xA;&#xA;running = 0;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;注册数据监听函数&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;extern &amp;#34;C&amp;#34;&#xA;{&#xA;void observerCallback(DataAttribute* dataAttribute)&#xA;{&#xA;if (dataAttribute == IEDMODEL_Device1_DSCH1_NamPlt_vendor)&#xA;{&#xA;printf(&amp;#34;GGIO.NamPlt.vendor changed to %s\n&amp;#34;,&#xA;MmsValue_toString(dataAttribute-&amp;gt;mmsValue));&#xA;}&#xA;else if (dataAttribute == IEDMODEL_Device1_DSCH1_NamPlt_swRev)&#xA;{&#xA;printf(&amp;#34;GGIO.NamPlt.swRef changed to %s\n&amp;#34;,&#xA;MmsValue_toString(dataAttribute-&amp;gt;mmsValue));&#xA;}&#xA;}&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;生成测试数据，修改数据节点&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;////////////////////for test/////////////////////////////&#xA;if(running)&#xA;{&#xA;MmsValue* td = MmsValue_newIntegerFromInt32 (200);&#xA;IedServer_updateAttributeValue(iedServer, IEDMODEL_Device1_DSCH1_SchdSt_stVal, td);&#xA;MmsValue_delete(td);&#xA;&#xA;td = MmsValue_newIntegerFromInt32 (202);&#xA;IedServer_updateAttributeValue(iedServer, IEDMODEL_Device1_DSCH1_Health_stVal, td);&#xA;MmsValue_delete(td);&#xA;}&#xA;////////////////////////////////////////////////&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;系统测试&#34;&gt;系统测试&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;编译SP61850 模块&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$cd openscada-0.8.0.5/src/moduls/special/SP61850&#xA;&#xA;$ make clean; make&#xA;&#xA;$ ~/project/openscada-0.8.0.5/src/moduls/special/SP61850$ ldd .libs/spec_SP61850.so&#xA;linux-gate.so.1 =&amp;gt; (0x00542000)&#xA;libiec61850.so =&amp;gt; /usr/lib/i386-linux-gnu/libiec61850.so (0x007e7000)&#xA;libstdc++.so.6 =&amp;gt; /usr/lib/i386-linux-gnu/libstdc++.so.6 (0x00bc0000)&#xA;libm.so.6 =&amp;gt; /lib/i386-linux-gnu/libm.so.6 (0x00e84000)&#xA;libc.so.6 =&amp;gt; /lib/i386-linux-gnu/libc.so.6 (0x00110000)&#xA;libgcc_s.so.1 =&amp;gt; /lib/i386-linux-gnu/libgcc_s.so.1 (0x00273000)&#xA;libpthread.so.0 =&amp;gt; /lib/i386-linux-gnu/libpthread.so.0 (0x0028f000)&#xA;/lib/ld-linux.so.2 (0x00af2000)&#xA;&#xA;$ sudo make install&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;运行测试&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo openscada&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;利用61850客户端软件进行连接确认，例如IEDScout，连接[192.168.1.160:102]&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;参考资料&#34;&gt;参考资料&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://libiec61850.com/api/2&#34;&gt;http://libiec61850.com/api/2&lt;/a&gt;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>怎样写出更有效率的CSS</title>
				<link>https://blog.zhourunsheng.com/2013/08/%e6%80%8e%e6%a0%b7%e5%86%99%e5%87%ba%e6%9b%b4%e6%9c%89%e6%95%88%e7%8e%87%e7%9a%84css/</link>
				<pubDate>Thu, 15 Aug 2013 09:18:22 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/%e6%80%8e%e6%a0%b7%e5%86%99%e5%87%ba%e6%9b%b4%e6%9c%89%e6%95%88%e7%8e%87%e7%9a%84css/</guid>
				<description>&lt;p&gt;在页面设计的过程中，总会使用CSS来进行样式设计，样式的选择器也无非常用4种，ID，Class，Tag和Universal，优先级从高到底，那么怎么样设计选择器和样式，可以提高CSS的解析效率，平时的设计中又会出现哪些误区，那么如下的文章值得一看。&lt;/p&gt;&#xA;&lt;p&gt;Writing good CSS code can speed up page rendering. Essentially, the fewer rules the engine has to evaluate the better.&lt;/p&gt;&#xA;&lt;h3 id=&#34;mdn&#34;&gt;MDN&lt;/h3&gt;&#xA;&lt;p&gt;groups CSS selectors in four primary categories, and these actually follow the order of how efficient they are:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ID Rules&lt;/li&gt;&#xA;&lt;li&gt;Class Rules&lt;/li&gt;&#xA;&lt;li&gt;Tag Rules&lt;/li&gt;&#xA;&lt;li&gt;Universal Rules&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The efficiency is generally quote from Even Faster Websites by Steve Souders which was published in 2009. Souders list is more detailed, though, and you can find the full list referenced here. You can find more details in Google’s best practices for efficient CSS selectors.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android构建编译系统之Gradle Build</title>
				<link>https://blog.zhourunsheng.com/2013/08/android%e6%9e%84%e5%bb%ba%e7%bc%96%e8%af%91%e7%b3%bb%e7%bb%9f%e4%b9%8bgradle-build/</link>
				<pubDate>Tue, 13 Aug 2013 11:15:51 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/android%e6%9e%84%e5%bb%ba%e7%bc%96%e8%af%91%e7%b3%bb%e7%bb%9f%e4%b9%8bgradle-build/</guid>
				<description>&lt;p&gt;Google I/O 2013 大会推出了一款新的Android开发工具Android Studio IDE，与Eclipse相差不多，实际的开发选择哪一款随个人喜好，像我平时的开发都是以Eclipse为主，ant辅助进行构建，也支持了一种新的构建工具Gradle，Android Studio IDE内置的默认构建工具就是Gradle，关于Gradle的详细资料可以参照官方网站。本系列文章介绍了Android开发过程中的Gradle Build，共有7篇文章，由浅入深。&lt;/p&gt;&#xA;&lt;p&gt;At Google I/O 2013 Google announced some new developer tools including the new Android Studio IDE, and a new build system based around Gradle. In this series we’ll have a look at the Gradle build system, and look at how to convert existing projects to use the new build system.&lt;/p&gt;&#xA;&lt;p&gt;Previously on Styling Android we’ve looked at using Maven for automating your builds&lt;/p&gt;</description>
			</item>
			<item>
				<title>Java开发内存优化导读</title>
				<link>https://blog.zhourunsheng.com/2013/08/java%e5%bc%80%e5%8f%91%e5%86%85%e5%ad%98%e4%bc%98%e5%8c%96%e5%af%bc%e8%af%bb/</link>
				<pubDate>Tue, 13 Aug 2013 10:32:05 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/java%e5%bc%80%e5%8f%91%e5%86%85%e5%ad%98%e4%bc%98%e5%8c%96%e5%af%bc%e8%af%bb/</guid>
				<description>&lt;p&gt;在开发Java的过程中，怎么样合理的利用 Object，资源的申请与释放，每种类型的 Object 占用的内存大小是多少，有没有可以替换的lib可以使用。鉴于效率的考量和内存占用的考量，我们应该选择什么样的数据结构，那么如下的文章将会找到答案。&lt;/p&gt;&#xA;&lt;p&gt;This article will give you the general advices on memory consumption optimization in Java.&lt;/p&gt;&#xA;&lt;p&gt;Memory usage optimization is the most important type of optimization in Java.&lt;/p&gt;&#xA;&lt;p&gt;Current systems are limited by memory access times rather than by CPU frequency&lt;/p&gt;&#xA;&lt;p&gt;(otherwise, why CPU producers are implementing all these L1s, L2s and L3s?). It means that by reducing your application memory footprint you will most likely improve your program data processing speed by making your CPU to wait for smaller amount of data. Now let’s get back to Java.&lt;/p&gt;</description>
			</item>
			<item>
				<title>【摘自】人、技术、情怀</title>
				<link>https://blog.zhourunsheng.com/2013/08/%e3%80%90%e6%91%98%e8%87%aa%e3%80%91%e4%ba%ba%e3%80%81%e6%8a%80%e6%9c%af%e3%80%81%e6%83%85%e6%80%80/</link>
				<pubDate>Mon, 12 Aug 2013 10:36:18 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/%e3%80%90%e6%91%98%e8%87%aa%e3%80%91%e4%ba%ba%e3%80%81%e6%8a%80%e6%9c%af%e3%80%81%e6%83%85%e6%80%80/</guid>
				<description>&lt;p&gt;这个世界人很多，做技术的人也不少，但是有情怀的技术人不多。&lt;/p&gt;&#xA;&lt;p&gt;人类发明了各种工具来方便自己、改善生活亦或是达到某种目的，虽然并不只是人类会制造工具，但是不同的是我们懂得如何去思考、沉淀、积累。现在我们有了计算机、有了编程语言、有了网络，也许我们已经不再需要具体的工具形态就能改变世界，一切就在弹指一挥间。&lt;/p&gt;&#xA;&lt;p&gt;但是我们所造就的工具却正奴役着我们，多少程序员苦逼的吐槽自己是码农？多少人在2米见方的格子里敲着CURD？多少人每天熬到深夜只是因为Deadline逼近？这就像历史中描述的工业革命的那段日子，人们发明了蒸汽机、纺织机，但是却成了这些机器的守护者。我们存在的意义也许只是按照机器的指示做出各种动作，什么梦想、什么情怀，已经烟飘云散。&lt;/p&gt;&#xA;&lt;p&gt;我们不反对技术的进步，然而这种进步不应该以牺牲自己的生活为代价，二者是可以兼容的。如果你了解运维就应该知道这是一个很苦逼的差事，“没出事不被人想起，一旦有事就要随时待命”。在今年的QCon北京上，来自Github的运维工程师分享了他不同的“生活”，通过工具、脚本、辅助机器人，他可以逍遥在自己的小船上晒着太阳维护着机房。的确我们需要对自己所做的工作负责，但是我们更要对自己负责。如果你还能想起十几二十年的梦想，如果你能在码字的间隙去环顾现在的生活，请问一个问题，这是否是我想要的！&lt;/p&gt;&#xA;&lt;p&gt;技术人，不要把自己陷在技术的圈子中，世界太大，人生太短。我们习惯了敲错代码就按下ctrl+z，出问题了就debug，但是人生是一段不能回头的单行道，不要迷惘选择是否正确，当你心之所向，那就前往。最后送大家一首叶芝的诗，献给也许已经逝去的“情怀”！ ：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;当你老了，白发苍苍，睡意朦胧，在炉前打盹，请取下这本诗篇，慢慢吟咏，梦见你当年的双眼那柔美的光芒与青幽的晕影；多少人真情假意，爱过你的美丽，爱过你欢乐而迷人的青春，唯独一人爱过你朝圣者的心，爱你日益凋谢的脸上的哀戚；当你佝偻着，在灼热的炉栅边，你将轻轻诉说，带着一丝伤感，逝去的爱，如今以步上高山，在密密星群里埋藏着它的赧颜。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
			</item>
			<item>
				<title>libiec61850在OpenSCADA系统中的使用</title>
				<link>https://blog.zhourunsheng.com/2013/08/libiec61850%e5%9c%a8openscada%e7%b3%bb%e7%bb%9f%e4%b8%ad%e7%9a%84%e4%bd%bf%e7%94%a8/</link>
				<pubDate>Fri, 09 Aug 2013 13:01:22 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/libiec61850%e5%9c%a8openscada%e7%b3%bb%e7%bb%9f%e4%b8%ad%e7%9a%84%e4%bd%bf%e7%94%a8/</guid>
				<description>&lt;p&gt;libiec61850 是一套开源的C库，它实现了大多数的61850的协议转换，原理同样是基于MMS协议的映射。本文要将libiec61850用在OpenSCADA系统中，使OpenSCADA系统可以提供智能变电站61850协议的接入。&lt;/p&gt;&#xA;&lt;h2 id=&#34;简介&#34;&gt;简介&lt;/h2&gt;&#xA;&lt;p&gt;libiec61850 is an open-source (GPLv3) implementation of an IEC 61850 client and server library. It is implemented in C to provide maximum portability. It can be used to implement IEC 61850 compliant client and server applications on embedded systems and PCs running Linux and Windows. Included is a set of simple example applications that can be used as a starting point to implement your own IEC 61850 compliant devices or to communicate with IEC 61850 devices.&lt;/p&gt;</description>
			</item>
			<item>
				<title>基于PHP后台的Android云推送方案</title>
				<link>https://blog.zhourunsheng.com/2013/08/%e5%9f%ba%e4%ba%8ephp%e5%90%8e%e5%8f%b0%e7%9a%84android%e4%ba%91%e6%8e%a8%e9%80%81%e6%96%b9%e6%a1%88/</link>
				<pubDate>Thu, 08 Aug 2013 22:19:16 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/%e5%9f%ba%e4%ba%8ephp%e5%90%8e%e5%8f%b0%e7%9a%84android%e4%ba%91%e6%8e%a8%e9%80%81%e6%96%b9%e6%a1%88/</guid>
				<description>&lt;p&gt;开发过移动APP的同学都知道云推送，比如Google的后台服务，联系人同步，邮件同步，APK的自动升级等都是这个机制，其实利用云推送机制还可以实现消息的发送，本文介绍了一种基于PHP后台的推送机制，实现原理还是通过Google的云端服务(Google Cloud Messaging for Android service)，android客户端采用的是phoneGap的PushPlugin。&lt;/p&gt;&#xA;&lt;p&gt;Last days I’ve been working within a Phonegap&lt;/p&gt;&#xA;&lt;p&gt;project for Android devices using Push Notifications. The idea is simple. We need to use the Push Notification Plugin&lt;/p&gt;&#xA;&lt;p&gt;for Android. First we need to register the Google Cloud Messaging for Android service at Google’s console, and then we can send Push notifications to our Android device.&lt;/p&gt;&#xA;&lt;p&gt;The Push Notification plugin provides a simple example to send notifications using Ruby&lt;/p&gt;</description>
			</item>
			<item>
				<title>OpenSCADA系统添加自定义模块</title>
				<link>https://blog.zhourunsheng.com/2013/08/openscada%e7%b3%bb%e7%bb%9f%e6%b7%bb%e5%8a%a0%e8%87%aa%e5%ae%9a%e4%b9%89%e6%a8%a1%e5%9d%97/</link>
				<pubDate>Thu, 08 Aug 2013 16:56:24 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/openscada%e7%b3%bb%e7%bb%9f%e6%b7%bb%e5%8a%a0%e8%87%aa%e5%ae%9a%e4%b9%89%e6%a8%a1%e5%9d%97/</guid>
				<description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;&#xA;&lt;p&gt;OpenSCADA作为一个开源的Scada系统，本文基于此系统来添加一个子模块，例子中准备添加一个支持61850协议的模块（名称为SP61850）。&lt;/p&gt;&#xA;&lt;p&gt;OpenScada内置支持如下的子系统&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&amp;ldquo;Data Bases&amp;rdquo;&lt;/li&gt;&#xA;&lt;li&gt;&amp;ldquo;Communication Interfaces, Transports&amp;rdquo;&lt;/li&gt;&#xA;&lt;li&gt;&amp;ldquo;Protocols of the communication interfaces&amp;rdquo;&lt;/li&gt;&#xA;&lt;li&gt;&amp;ldquo;Data Sources and Data Acquisition&amp;rdquo;&lt;/li&gt;&#xA;&lt;li&gt;&amp;ldquo;Archives(Histories) (of messages and values)&amp;rdquo;&lt;/li&gt;&#xA;&lt;li&gt;&amp;ldquo;User Interfaces (GUI, TUI, WebGUI, speach, signal &amp;hellip;)&amp;rdquo;&lt;/li&gt;&#xA;&lt;li&gt;&amp;ldquo;Additional modules&amp;rdquo;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;我们所要添加的子模块隶属于如上的&amp;quot;Additional modules&amp;quot;，即&amp;quot;special&amp;quot;子系统。&lt;/p&gt;&#xA;&lt;h2 id=&#34;步骤&#34;&gt;步骤&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ cd openscada-0.8.0.5/src/moduls/special&#xA;$ cp -r =Tmpl= SP61850; cd SP61850&#xA;$ rm -f configure.in&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;编辑&amp;quot;module.cpp&amp;quot;文件 2.1 module info 改为如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;//!!! Module&amp;#39;s meta-information. Change for your module.&#xA;//*************************************************&#xA;//* Modul info! *&#xA;#define MOD_ID &amp;#34;SP61850&amp;#34;&#xA;#define MOD_NAME _(&amp;#34;Special 61850 model&amp;#34;)&#xA;#define MOD_TYPE SSPC_ID&#xA;#define VER_TYPE SSPC_VER&#xA;#define SUB_TYPE &amp;#34;LIB&amp;#34;&#xA;#define MOD_VER &amp;#34;0.0.1&amp;#34;&#xA;#define AUTHORS _(&amp;#34;Carey Chow&amp;#34;)&#xA;#define DESCRIPTION _(&amp;#34;Special subsystem 61850 module.&amp;#34;)&#xA;#define LICENSE &amp;#34;MyLicense&amp;#34;&#xA;//*************************************************&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;2.2 全文搜索替换 Tmpl &amp;ndash;&amp;gt; SP61850 2.3 注释掉模板中无效的地方&lt;/p&gt;</description>
			</item>
			<item>
				<title>Java开发内存占用监测</title>
				<link>https://blog.zhourunsheng.com/2013/08/java%e5%bc%80%e5%8f%91%e5%86%85%e5%ad%98%e5%8d%a0%e7%94%a8%e7%9b%91%e6%b5%8b/</link>
				<pubDate>Mon, 05 Aug 2013 21:15:20 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/java%e5%bc%80%e5%8f%91%e5%86%85%e5%ad%98%e5%8d%a0%e7%94%a8%e7%9b%91%e6%b5%8b/</guid>
				<description>&lt;p&gt;在开发Java的过程中，怎么样来监测一个对象占用的内存大小，对于调试程序，优化程序来说，有很大的帮助，本文介绍了一个开发包，JAMM (Java Agent for Memory Measurements)，可以很方便的在程序的运行过程中动态监测对象的内存占用情况。&lt;/p&gt;&#xA;&lt;p&gt;This short article shows how to measure java object memory size at runtime with JAMM&lt;/p&gt;&#xA;&lt;p&gt;, a java agent dedicated to measure actual object memory use including JVM overhead.&lt;/p&gt;&#xA;&lt;p&gt;JAMM uses the Instrumentation&lt;/p&gt;&#xA;&lt;p&gt;implementation provided by the JVM to compute memory usage of a given object by calling the getObjectSize(..) method.&lt;/p&gt;&#xA;&lt;p&gt;It is quite simple to use, as explained by the author:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;MemoryMeter meter = new MemoryMeter();&#xA;meter.measure(object);&#xA;meter.measureDeep(object);&#xA;meter.countChildren(object);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The only constraint is to attach JAMM java agent to the JVM before using it to measure memory usage, by starting the JVM with the-javaagent option pointing to the JAMM jar.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Java语言开发之SQL语句改善</title>
				<link>https://blog.zhourunsheng.com/2013/08/java%e8%af%ad%e8%a8%80%e5%bc%80%e5%8f%91%e4%b9%8bsql%e8%af%ad%e5%8f%a5%e6%94%b9%e5%96%84/</link>
				<pubDate>Mon, 05 Aug 2013 18:57:15 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/java%e8%af%ad%e8%a8%80%e5%bc%80%e5%8f%91%e4%b9%8bsql%e8%af%ad%e5%8f%a5%e6%94%b9%e5%96%84/</guid>
				<description>&lt;p&gt;在基于Java语言的开发过程中，DB相关的开发相信大家都接触过SQL语句，增删改查作为基本的操作，比较熟悉，那么JOIN，UNION, MERGE, DISTINCT这些高级的操作使用过没有呢？使用的过程中有哪些误用呢？有没有可能改善现在的SQL语句来提高程序的性能。本文介绍了几种常见的SQL误用场合，有语法方面的，改善效率方面的，下次，自己再做开发的时候，想想当前的SQL处理语句有没有可以完善的情况。&lt;/p&gt;&#xA;&lt;p&gt;Java developers mix object-oriented thinking with imperative thinking, depending on their levels of:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Skill (anyone can code imperatively)&lt;/li&gt;&#xA;&lt;li&gt;Dogma (some use the “Pattern-Pattern”, i.e. the pattern of applying patterns everywhere and giving them names)&lt;/li&gt;&#xA;&lt;li&gt;Mood (true OO is more clumsy to write than imperative code. At first)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;But when Java developers write SQL, everything changes. SQL is a declarative language that has nothing to do with either object-oriented or imperative thinking. It is very easy to express a query in SQL. It is not so easy to express it optimally or correctly. Not only do developers need to re-think their programming paradigm, they also need to think in terms of set theory.&lt;/p&gt;</description>
			</item>
			<item>
				<title>OpenSCADA系统的安装配置</title>
				<link>https://blog.zhourunsheng.com/2013/08/openscada%e7%b3%bb%e7%bb%9f%e7%9a%84%e5%ae%89%e8%a3%85%e9%85%8d%e7%bd%ae/</link>
				<pubDate>Mon, 05 Aug 2013 14:36:48 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/openscada%e7%b3%bb%e7%bb%9f%e7%9a%84%e5%ae%89%e8%a3%85%e9%85%8d%e7%bd%ae/</guid>
				<description>&lt;h2 id=&#34;简介&#34;&gt;简介&lt;/h2&gt;&#xA;&lt;p&gt;SCADA(Supervisory Control And Data Acquisition)系统，即数据采集与监视控制系统。SCADA系统是以计算机为基础的DCS与电力自动化监控系统；它应用领域很广，可以应用于电力、冶金、石油、化工等领域的数据采集与监视控制以及过程控制等诸多领域。详细可以从百度百科和维基百科了解。&lt;/p&gt;&#xA;&lt;h2 id=&#34;安装环境&#34;&gt;安装环境&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;OS: Ubuntu 11&lt;/li&gt;&#xA;&lt;li&gt;openscada-0.8.0.5&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;依赖包的安装&#34;&gt;依赖包的安装&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;####### 文字处理相关&#xA;sudo apt-get install gettext&#xA;sudo apt-get install zlib1g-dev&#xA;sudo apt-get install libgd2-xpm-dev&#xA;sudo apt-get install libpcre3 libpcre3-dev&#xA;sudo apt-get install bison&#xA;&#xA;####### 数据库相关&#xA;sudo apt-get install libmysqlclient15-dev&#xA;sudo apt-get install libsqlite3-dev&#xA;sudo apt-get install firebird2.5-dev&#xA;sudo apt-get install postgresql libpq-dev&#xA;&#xA;####### 网络，声音相关&#xA;sudo apt-get install libsnmp-dev&#xA;sudo apt-get install portaudio19-dev&#xA;&#xA;####### 图形相关&#xA;sudo apt-get install libqt4-dev qt4-dev-tools&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;编译步骤&#34;&gt;编译步骤&lt;/h2&gt;&#xA;&lt;h2 id=&#34;steps-of-preparation-of-the-source-tree-to-build&#34;&gt;Steps of preparation of the source tree to build:&lt;/h2&gt;&#xA;&lt;p&gt;Make directory for project building:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android开发之布局加载LayoutInflater</title>
				<link>https://blog.zhourunsheng.com/2013/08/android%e5%bc%80%e5%8f%91%e4%b9%8b%e5%b8%83%e5%b1%80%e5%8a%a0%e8%bd%bdlayoutinflater/</link>
				<pubDate>Sun, 04 Aug 2013 18:11:45 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/android%e5%bc%80%e5%8f%91%e4%b9%8b%e5%b8%83%e5%b1%80%e5%8a%a0%e8%bd%bdlayoutinflater/</guid>
				<description>&lt;p&gt;在开发Android的过程中，涉及到list view什么的，应该经常会碰到加载layout的状况，那么平时使用inflate函数的时候，经常是怎么传递参数的？在不同的场合，比如list view的adapter中加载layout与在自定义Dialog中加载Layout，它们有没有特殊区别的地方，本文就会介绍inflate函数的正确使用方法，请学习一下。&lt;/p&gt;&#xA;&lt;h2 id=&#34;layout-inflation-is-the-term-used-within-the-context-of-android-to-indicate-when-an-xml-layout-resource-is-parsed-and-converted-into-a-hierarchy-of-view-objects&#34;&gt;Layout inflation is the term used within the context of Android to indicate when an XML layout resource is parsed and converted into a hierarchy of View objects.&lt;/h2&gt;&#xA;&lt;p&gt;It’s common practice in the Android SDK, but you may be surprised to find that there is a wrong way to use LayoutInflater&lt;/p&gt;&#xA;&lt;p&gt;, and your application might be one of the offenders. If you’ve ever written something like the following code using LayoutInflater in your Android application:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android开发之上下文Context</title>
				<link>https://blog.zhourunsheng.com/2013/08/android%e5%bc%80%e5%8f%91%e4%b9%8b%e4%b8%8a%e4%b8%8b%e6%96%87context/</link>
				<pubDate>Sun, 04 Aug 2013 17:46:08 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/android%e5%bc%80%e5%8f%91%e4%b9%8b%e4%b8%8a%e4%b8%8b%e6%96%87context/</guid>
				<description>&lt;p&gt;开发过Android的同学，应该对上下文Context的概念不陌生，启动新的Activity，启动新的Service，加载系统资源文件，加载Layout等等，记得以前还分析过腾讯游戏平台免安装的实现机制，这些都涉及到了上下文Context。同时，如果误用了Context了，还会导致内存的泄露，想了解Android系统中Context使用的场合么？那么本文就会给你回答~~~&lt;/p&gt;&#xA;&lt;h2 id=&#34;context-is-probably-the-most-used-element-in-android-applicationsit-may-also-be-the-most-misused&#34;&gt;Context is probably the most used element in Android applications…it may also be the most misused.&lt;/h2&gt;&#xA;&lt;h3 id=&#34;context&#34;&gt;Context&lt;/h3&gt;&#xA;&lt;p&gt;objects are so common, and get passed around so frequently, it can be easy to create a situation you didn’t intend.  Loading resources, launching a new Activity, obtaining a system service, getting internal file paths, and creating views all require a Context&lt;/p&gt;&#xA;&lt;p&gt;(and that’s not even getting started on the full list!) to accomplish the task.  What I’d like to do is provide for you some insights on how Context&lt;/p&gt;</description>
			</item>
			<item>
				<title>Python模块发布文件setup.py vs requirements.txt</title>
				<link>https://blog.zhourunsheng.com/2013/08/python%e6%a8%a1%e5%9d%97%e5%8f%91%e5%b8%83%e6%96%87%e4%bb%b6setup-py-vs-requirements-txt/</link>
				<pubDate>Sun, 04 Aug 2013 17:06:39 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/python%e6%a8%a1%e5%9d%97%e5%8f%91%e5%b8%83%e6%96%87%e4%bb%b6setup-py-vs-requirements-txt/</guid>
				<description>&lt;p&gt;我们都知道发布Python模块的时候需要准备几份文件，其中就包括了setup.py和requirements.txt，这两份文件中都需要填写待发布模块的依赖关系，那么是不是这样就会出现信息的重复，维护起来也不方便呢？如下的文章解释了这两个文件中重复信息的不同功用，前者为“虚引用”，后者为“具体引用”，那么他们利用的场合和背后的机制是什么样子的，马上就会知晓了。&lt;/p&gt;&#xA;&lt;p&gt;There&amp;rsquo;s a lot of misunderstanding between setup.py and requirements.txt&lt;/p&gt;&#xA;&lt;p&gt;and their roles. A lot of people have felt they are duplicated information and have even created tools to handle this &amp;ldquo;duplication&amp;rdquo;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;python-libraries&#34;&gt;Python Libraries&lt;/h2&gt;&#xA;&lt;p&gt;A Python library in this context is something that has been developed and released for others to use. You can find a number of them on PyPI&lt;/p&gt;&#xA;&lt;p&gt;that others have made available. A library has a number of pieces of metadata that need to be provided in order to successfully distribute it. These are things such as the Name, Version, Dependencies, etc. The setup.py file gives you the ability to specify this metadata like:&lt;/p&gt;</description>
			</item>
			<item>
				<title>你需要了解的SQL注入技术</title>
				<link>https://blog.zhourunsheng.com/2013/08/%e4%bd%a0%e9%9c%80%e8%a6%81%e4%ba%86%e8%a7%a3%e7%9a%84sql%e6%b3%a8%e5%85%a5%e6%8a%80%e6%9c%af/</link>
				<pubDate>Sat, 03 Aug 2013 10:43:47 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/%e4%bd%a0%e9%9c%80%e8%a6%81%e4%ba%86%e8%a7%a3%e7%9a%84sql%e6%b3%a8%e5%85%a5%e6%8a%80%e6%9c%af/</guid>
				<description>&lt;p&gt;开发WEB的同学都应该听说过SQL注入，如果开发过程中，直接利用parameter中传入的值来进行数据库查询的话就有SQL注入的风险，那么到底有哪些高级的SQL注入手法，相信读过本文，了解的就不是一点点了，看看黑客们是怎样注入的，那么，自己在以后的开发过程中也要适时留意，防范这种风险。&lt;/p&gt;&#xA;&lt;p&gt;Put on your black hats folks, it’s time to learn some genuinely interesting things about SQL injection. Now remember – y’all play nice with the bits and pieces you’re about to read, ok?&lt;/p&gt;&#xA;&lt;p&gt;SQL injection is a particularly interesting risk for a few different reasons:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;It’s getting increasingly harder to write vulnerable code due to frameworks that automatically parameterise inputs – yet we still write bad code.&lt;/li&gt;&#xA;&lt;li&gt;You’re not necessarily in the clear just because you use stored procedures or a shiny ORM (you’re aware that&lt;a href=&#34;http://www.troyhunt.com/2012/12/stored-procedures-and-orms-wont-save.html&#34;&gt;SQLi can still get through these&lt;/a&gt;, right?) – we still build vulnerable apps around these mitigations.&lt;/li&gt;&#xA;&lt;li&gt;It’s easily detected remotely by automated tools which can be orchestrated to crawl the web searching for vulnerable sites – yet we’re still putting them out there.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;It remains number one on the OWASP Top 10&lt;/p&gt;</description>
			</item>
			<item>
				<title>Python函数调用的自动化内联机制</title>
				<link>https://blog.zhourunsheng.com/2013/08/python%e5%87%bd%e6%95%b0%e8%b0%83%e7%94%a8%e7%9a%84%e8%87%aa%e5%8a%a8%e5%8c%96%e5%86%85%e8%81%94%e6%9c%ba%e5%88%b6/</link>
				<pubDate>Sat, 03 Aug 2013 10:14:02 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/python%e5%87%bd%e6%95%b0%e8%b0%83%e7%94%a8%e7%9a%84%e8%87%aa%e5%8a%a8%e5%8c%96%e5%86%85%e8%81%94%e6%9c%ba%e5%88%b6/</guid>
				<description>&lt;p&gt;相信开发过C++语言的同学都知道，inline内联函数，get和set函数通常都写成内联机制，为的是提高程序的运行效率，缩短函数调用的时间。那么开发过Android的同学，也应该知道，android程序优化中有一条机制就是尽量不用get和set函数，因为Java中不支持C++的内联机制，所以只能舍弃get和set方法，尽管有失面向对象的访问机制，但是对手持设备来说，合理利用有限资源，提高运行效率才是首选。&lt;/p&gt;&#xA;&lt;p&gt;本文中讲的是怎样在Python语言中利用内联机制，Python是解释性的语言，没有编译过程，那么怎么在Python中实现内联机制呢？相信读完全文，就会有个清晰的认识，目前的实现还仍有很多不足的地方，限制很多，期待以后Python的升级能够自带就好了。&lt;/p&gt;&#xA;&lt;p&gt;Calling functions in Python can be expensive. Consider this example: there are two statements that are being timed, the first one calls a function that returns an integer while the second one calls a function that returns the result of a second function call which returns an integer.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;tom@toms ~$ python -m timeit -n 10000000  -s &amp;#34;def get_n(): return 1&amp;#34; &amp;#34;get_n()&amp;#34;&#xA;10000000 loops, best of 3: 0.145 usec per loop&#xA;tom@toms ~$ time python -m timeit -n 10000000 -s &amp;#34;get_n = lambda: 1; get_r_n = lambda: get_n()&amp;#34; &amp;#34;get_r_n()&amp;#34;&#xA;10000000 loops, best of 3: 0.335 usec per loop&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The additional function call doubled the program execution time, despite not effecting the output of the function in any way. This got me thinking, how hard would it be to create a Python module that would inline functions, removing the calling overhead from certain functions you specify?&lt;/p&gt;</description>
			</item>
			<item>
				<title>分享Python模块到PyPI</title>
				<link>https://blog.zhourunsheng.com/2013/08/%e5%88%86%e4%ba%abpython%e6%a8%a1%e5%9d%97%e5%88%b0pypi/</link>
				<pubDate>Sat, 03 Aug 2013 09:40:54 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/08/%e5%88%86%e4%ba%abpython%e6%a8%a1%e5%9d%97%e5%88%b0pypi/</guid>
				<description>&lt;p&gt;怎么样打包自己的Python模块，并且分享到PyPI，相信下面的文章会给你一个满意的答案！&lt;/p&gt;&#xA;&lt;p&gt;A completely incomplete guide to packaging a Python module and sharing it with the world on PyPI.&lt;/p&gt;&#xA;&lt;h2 id=&#34;abstract&#34;&gt;Abstract&lt;/h2&gt;&#xA;&lt;p&gt;Few things give me caremads like Python modules I want to use that aren’t on PyPI (pronounced “pie pee eye”, or “cheese shop”,not “ pie pie ”!). On the other hand – as pydanny points out – the current situation on packaging is rather confusing.&lt;/p&gt;&#xA;&lt;p&gt;Therefore I want to help everyone who has some great code but feels lost with getting it on PyPI. I will be using my latest opus “ pem ” as a realistic yet simple example of how to get a pure-Python 2 and&lt;/p&gt;</description>
			</item>
			<item>
				<title>PHP 发送博文到百度空间</title>
				<link>https://blog.zhourunsheng.com/2013/05/php-%e5%8f%91%e9%80%81%e5%8d%9a%e6%96%87%e5%88%b0%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/</link>
				<pubDate>Sun, 19 May 2013 11:59:31 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/05/php-%e5%8f%91%e9%80%81%e5%8d%9a%e6%96%87%e5%88%b0%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/</guid>
				<description>&lt;p&gt;昨天，测试了PHP方式登录百度空间，可以参见博文《PHP 登录百度空间》，今天通过抓包工具的分析，分析了博文的发布过程，实现了博文的自动发布。&lt;/p&gt;&#xA;&lt;p&gt;参照代码如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;private function postArticle($baiduzoneurl, $title, $content, $category, $blogpower)&#xA;{&#xA;$post_data = array();&#xA;$post_data[&amp;#34;title&amp;#34;] = $title;&#xA;$post_data[&amp;#34;tags[]&amp;#34;] = $category;&#xA;$post_data[&amp;#34;content&amp;#34;] = $content;&#xA;$post_data[&amp;#34;private&amp;#34;] = $blogpower == 0? &amp;#34;&amp;#34; : &amp;#34;1&amp;#34;;&#xA;$post_data[&amp;#34;imgnum&amp;#34;] = &amp;#34;0&amp;#34;;&#xA;$post_data[&amp;#34;bdstoken&amp;#34;] = $this-&amp;gt;bdstoken;&#xA;$post_data[&amp;#34;qbid&amp;#34;] = &amp;#34;&amp;#34;;&#xA;$post_data[&amp;#34;refer&amp;#34;] = &amp;#34;http://hi.baidu.com/home&amp;#34;;&#xA;$post_data[&amp;#34;multimedia[]&amp;#34;] = &amp;#34;&amp;#34;;&#xA;$post_data[&amp;#34;private1&amp;#34;] = $post_data[&amp;#34;private&amp;#34;];&#xA;$post_data[&amp;#34;synflag&amp;#34;] = &amp;#34;&amp;#34;;&#xA;$post_data[&amp;#34;qing_request_source&amp;#34;] = &amp;#34;new_request&amp;#34;;&#xA;&#xA;$this-&amp;gt;doHttpPost(&amp;#34;http://hi.baidu.com/pub/submit/createtext&amp;#34;, $post_data, &amp;#34;http://hi.baidu.com/pub/show/createtext&amp;#34;);&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;接下来再进行wordpress插件的更新，哈哈，这个就快多了！！！&lt;/p&gt;</description>
			</item>
			<item>
				<title>PHP 登录百度空间</title>
				<link>https://blog.zhourunsheng.com/2013/05/php-%e7%99%bb%e5%bd%95%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/</link>
				<pubDate>Sat, 18 May 2013 22:00:20 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/05/php-%e7%99%bb%e5%bd%95%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/</guid>
				<description>&lt;p&gt;前几天，先测试了利用Python脚本登录百度空间，问题已解决，可以参照我的博文《python 脚本登录百度空间》，今天完善了php方式的登录过程，原理同python脚本的登录。&lt;/p&gt;&#xA;&lt;h2 id=&#34;代码如下&#34;&gt;代码如下:&lt;/h2&gt;&#xA;&lt;p&gt;登录代码&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;private function loginBaiduZone($user,$password)&#xA;{&#xA;//get Cookie&#xA;$ret = $this-&amp;gt;doHttpPost(&amp;#34;https://passport.baidu.com/v2/api/?getapi&amp;amp;class=login&amp;amp;tpl=mn&amp;amp;tangram=false&amp;#34;, &amp;#34;&amp;#34;, &amp;#34;&amp;#34;);&#xA;&#xA;//get token&#xA;$ret = $this-&amp;gt;doHttpPost(&amp;#34;https://passport.baidu.com/v2/api/?getapi&amp;amp;class=login&amp;amp;tpl=mn&amp;amp;tangram=false&amp;#34;, &amp;#34;&amp;#34;, &amp;#34;&amp;#34;);&#xA;preg_match_all(&amp;#39;/login_token=\&amp;#39;(.+)\&amp;#39;/&amp;#39;, $ret, $tokens);&#xA;$login_token = $tokens[1][0];&#xA;&#xA;//login&#xA;$post_data = array();&#xA;$post_data[&amp;#39;username&amp;#39;] = $user;&#xA;$post_data[&amp;#39;password&amp;#39;] = $password;&#xA;$post_data[&amp;#39;token&amp;#39;] = $login_token;&#xA;$post_data[&amp;#39;charset&amp;#39;] = &amp;#34;UTF-8&amp;#34;;&#xA;$post_data[&amp;#39;callback&amp;#39;] = &amp;#34;parent.bd12Pass.api.login._postCallback&amp;#34;;&#xA;$post_data[&amp;#39;index&amp;#39;] = &amp;#34;0&amp;#34;;&#xA;$post_data[&amp;#39;isPhone&amp;#39;] = &amp;#34;false&amp;#34;;&#xA;$post_data[&amp;#39;mem_pass&amp;#39;] = &amp;#34;on&amp;#34;;&#xA;$post_data[&amp;#39;loginType&amp;#39;] = &amp;#34;1&amp;#34;;&#xA;$post_data[&amp;#39;safeflg&amp;#39;] = &amp;#34;0&amp;#34;;&#xA;$post_data[&amp;#39;staticpage&amp;#39;] = &amp;#34;https://passport.baidu.com/v2Jump.html&amp;#34;;&#xA;$post_data[&amp;#39;tpl&amp;#39;] = &amp;#34;mn&amp;#34;;&#xA;$post_data[&amp;#39;u&amp;#39;] = &amp;#34;http://www.baidu.com/&amp;#34;;&#xA;$post_data[&amp;#39;verifycode&amp;#39;] = &amp;#34;&amp;#34;;&#xA;&#xA;$ret = $this-&amp;gt;doHttpPost(&amp;#34;http://passport.baidu.com/v2/api/?login&amp;#34;, $post_data, &amp;#34;https://passport.baidu.com/v2/?login&amp;amp;tpl=mn&amp;amp;u=http%3A%2F%2Fwww.baidu.com%2F&amp;#34;);&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Http请求的工具函数&lt;/p&gt;</description>
			</item>
			<item>
				<title>python 脚本登录百度空间</title>
				<link>https://blog.zhourunsheng.com/2013/05/python-%e8%84%9a%e6%9c%ac%e7%99%bb%e5%bd%95%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/</link>
				<pubDate>Wed, 15 May 2013 21:48:18 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/05/python-%e8%84%9a%e6%9c%ac%e7%99%bb%e5%bd%95%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/</guid>
				<description>&lt;p&gt;最近半年的时间，百度空间进行了多次变更，自从去年的wordpress百度空间博文同步插件不可用之后，就一直没有维护更新，最近百度空间基本稳定了，通过抓包对比分析，发现和以前的登录过程很不一样，先利用python脚本进行登录过程的模拟，然后再利用php实现，来维护更新同步插件。&lt;/p&gt;&#xA;&lt;h2 id=&#34;大体的登录原理如下&#34;&gt;大体的登录原理如下&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;首先获取登录的cookie文件，没有cookie的话，百度空间不能正常登录，访问如下网址获取cookie&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://passport.baidu.com/v2/api/?getapi&amp;amp;amp;class=login&amp;amp;amp;tpl=mn&amp;amp;amp;tangram=false&#34;&gt;https://passport.baidu.com/v2/api/?getapi&amp;amp;amp;class=login&amp;amp;amp;tpl=mn&amp;amp;amp;tangram=false&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;获取登录过程的token，同样再次请求上面的网址，但是这一次需要携带第1步中server返回的cookie信息&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://passport.baidu.com/v2/api/?getapi&amp;amp;amp;class=login&amp;amp;amp;tpl=mn&amp;amp;amp;tangram=false&#34;&gt;https://passport.baidu.com/v2/api/?getapi&amp;amp;amp;class=login&amp;amp;amp;tpl=mn&amp;amp;amp;tangram=false&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;发送登录账号信息（用户名，密码等）到如下网址，同样需要携带步骤2中server返回的cookie信息&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://passport.baidu.com/v2/api/?login&#34;&gt;http://passport.baidu.com/v2/api/?login&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;至此，登录过程完毕&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;代码示例&#34;&gt;代码示例&lt;/h2&gt;&#xA;&lt;p&gt;下面的示例代码会登录百度空间，然后把所有的博文自动备份到本地，其中登录的过程就如上面的原理所讲。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!/usr/bin/python&#xA;#coding:utf8&#xA;import cookielib, urllib2, urllib&#xA;import os,sys,socket,re&#xA;#解析有多少页博客&#xA;pageStr = &amp;#34;&amp;#34;&amp;#34;var PagerInfo = {\s*allCount\s*:\s*&amp;#39;(\d+)&amp;#39;,\s*pageSize\s*:\s*&amp;#39;(\d+)&amp;#39;,\s*curPage\s*:\s*&amp;#39;\d+&amp;#39;\s*};&amp;#34;&amp;#34;&amp;#34;&#xA;pageObj = re.compile(pageStr, re.DOTALL)&#xA;#获取登陆token&#xA;login_tokenStr = &amp;#39;&amp;#39;&amp;#39;bdPass.api.params.login_token=&amp;#39;(.*?)&amp;#39;;&amp;#39;&amp;#39;&amp;#39;&#xA;login_tokenObj = re.compile(login_tokenStr,re.DOTALL)&#xA;#获取博客标题和url&#xA;blogStr = r&amp;#39;&amp;#39;&amp;#39;&amp;lt;div&amp;gt;&amp;lt;a href=&amp;#34;.*?&amp;#34; target=_blank&amp;gt;.*?&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;a href=&amp;#34;(.*?)&amp;#34; target=_blank&amp;gt;(.*?)&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&amp;#39;&amp;#39;&amp;#39;&#xA;blogObj = re.compile(blogStr,re.DOTALL)&#xA;class Baidu(object):&#xA;    def __init__(self,user = &amp;#39;&amp;#39;, psw = &amp;#39;&amp;#39;, blog = &amp;#39;&amp;#39;):&#xA;        self.user = user&#xA;        self.psw  = psw&#xA;        self.blog = blog&#xA;        if not user or not psw or not blog:&#xA;            print &amp;#34;Plz enter enter 3 params:user,psw,blog&amp;#34;&#xA;            sys.exit(0)&#xA;        if not os.path.exists(self.user):&#xA;            os.mkdir(self.user)&#xA;        self.cookiename = &amp;#39;baidu%s.coockie&amp;#39; % (self.user)&#xA;        self.token = &amp;#39;&amp;#39;&#xA;        self.allCount  = 0&#xA;        self.pageSize  = 10&#xA;        self.totalpage = 0&#xA;        self.logined = False&#xA;        self.cj = cookielib.LWPCookieJar()&#xA;        try:&#xA;            self.cj.revert(self.cookiename)&#xA;            self.logined = True&#xA;            print &amp;#34;OK&amp;#34;&#xA;        except Exception, e:&#xA;            print e&#xA;        self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj))&#xA;        self.opener.addheaders = [(&amp;#39;User-agent&amp;#39;,&amp;#39;Opera/9.23&amp;#39;)]&#xA;        urllib2.install_opener(self.opener)&#xA;        socket.setdefaulttimeout(30)&#xA;    #登陆百度&#xA;    def login(self):&#xA;        #如果没有获取到cookie，就模拟登陆&#xA;        if not self.logined:&#xA;            print &amp;#34;logon to baidu ...&amp;#34;&#xA;            #第一次先访问一下，目的是为了先保存一个cookie下来&#xA;            qurl = &amp;#39;&amp;#39;&amp;#39;https://passport.baidu.com/v2/api/?getapi&amp;amp;class=login&amp;amp;tpl=mn&amp;amp;tangram=false&amp;#39;&amp;#39;&amp;#39;&#xA;            r = self.opener.open(qurl)&#xA;            self.cj.save(self.cookiename)&#xA;            #第二次访问，目的是为了获取token&#xA;            qurl = &amp;#39;&amp;#39;&amp;#39;https://passport.baidu.com/v2/api/?getapi&amp;amp;class=login&amp;amp;tpl=mn&amp;amp;tangram=false&amp;#39;&amp;#39;&amp;#39;&#xA;            r = self.opener.open(qurl)&#xA;            rsp = r.read()&#xA;            #print rsp&#xA;            self.cj.save(self.cookiename)&#xA;            #通过正则表达式获取token&#xA;            matched_objs = login_tokenObj.findall(rsp)&#xA;            if matched_objs:&#xA;                self.token = matched_objs[0]&#xA;                print &amp;#39;token =&amp;#39;, self.token&#xA;                #然后用token模拟登陆&#xA;                post_data = urllib.urlencode({&amp;#39;username&amp;#39;:self.user,&#xA;                                              &amp;#39;password&amp;#39;:self.psw,&#xA;                                              &amp;#39;token&amp;#39;:self.token,&#xA;                                              &amp;#39;charset&amp;#39;:&amp;#39;UTF-8&amp;#39;,&#xA;                                              &amp;#39;callback&amp;#39;:&amp;#39;parent.bd12Pass.api.login._postCallback&amp;#39;,&#xA;                                              &amp;#39;index&amp;#39;:&amp;#39;0&amp;#39;,&#xA;                                              &amp;#39;isPhone&amp;#39;:&amp;#39;false&amp;#39;,&#xA;                                              &amp;#39;mem_pass&amp;#39;:&amp;#39;on&amp;#39;,&#xA;                                              &amp;#39;loginType&amp;#39;:&amp;#39;1&amp;#39;,&#xA;                                              &amp;#39;safeflg&amp;#39;:&amp;#39;0&amp;#39;,&#xA;                                              &amp;#39;staticpage&amp;#39;:&amp;#39;https://passport.baidu.com/v2Jump.html&amp;#39;,&#xA;                                              &amp;#39;tpl&amp;#39;:&amp;#39;mn&amp;#39;,&#xA;                                              &amp;#39;u&amp;#39;:&amp;#39;http://www.baidu.com/&amp;#39;,&#xA;                                              &amp;#39;verifycode&amp;#39;:&amp;#39;&amp;#39;,&#xA;                                            })&#xA;                #path = &amp;#39;http://passport.baidu.com/?login&amp;#39;&#xA;                path = &amp;#39;http://passport.baidu.com/v2/api/?login&amp;#39;&#xA;                self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj))&#xA;                self.opener.addheaders = [(&amp;#39;User-agent&amp;#39;,&amp;#39;Opera/9.23&amp;#39;)]&#xA;                urllib2.install_opener(self.opener)&#xA;                headers = {&#xA;                  &amp;#34;Accept&amp;#34;: &amp;#34;image/gif, */*&amp;#34;,&#xA;                  &amp;#34;Referer&amp;#34;: &amp;#34;https://passport.baidu.com/v2/?login&amp;amp;tpl=mn&amp;amp;u=http%3A%2F%2Fwww.baidu.com%2F&amp;#34;,&#xA;                  &amp;#34;Accept-Language&amp;#34;: &amp;#34;zh-cn&amp;#34;,&#xA;                  &amp;#34;Content-Type&amp;#34;: &amp;#34;application/x-www-form-urlencoded&amp;#34;,&#xA;                  &amp;#34;Accept-Encoding&amp;#34;: &amp;#34;gzip, deflate&amp;#34;,&#xA;                  &amp;#34;User-Agent&amp;#34;: &amp;#34;Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)&amp;#34;,&#xA;                  &amp;#34;Host&amp;#34;: &amp;#34;passport.baidu.com&amp;#34;,&#xA;                  &amp;#34;Connection&amp;#34;: &amp;#34;Keep-Alive&amp;#34;,&#xA;                  &amp;#34;Cache-Control&amp;#34;: &amp;#34;no-cache&amp;#34;&#xA;                }&#xA;                req = urllib2.Request(path,&#xA;                                post_data,&#xA;                                headers=headers,&#xA;                                )&#xA;                rsp = self.opener.open(req).read()&#xA;                #print rsp&#xA;                self.cj.save(self.cookiename)&#xA;                #for login test&#xA;                #qurl = &amp;#39;&amp;#39;&amp;#39;http://hi.baidu.com/pub/show/createtext&amp;#39;&amp;#39;&amp;#39;&#xA;                #rsp = self.opener.open(qurl).read()&#xA;                #file_object = open(&amp;#39;login.txt&amp;#39;, &amp;#39;w&amp;#39;)&#xA;                #file_object.write(rsp)&#xA;                #file_object.close()&#xA;            else:&#xA;                print &amp;#34;Login Fail&amp;#34;&#xA;                sys.exit(0)&#xA;    #获取博客一共有多少页，如果有私有博文的话，登陆和不登陆获取的是不一样的&#xA;    def getTotalPage(self):&#xA;        #获取博客的总页数&#xA;        req2 = urllib2.Request(self.blog)&#xA;        rsp = urllib2.urlopen(req2).read()&#xA;        if rsp:&#xA;            rsp = rsp.replace(&amp;#39;\r&amp;#39;,&amp;#39;&amp;#39;).replace(&amp;#39;\n&amp;#39;,&amp;#39;&amp;#39;).replace(&amp;#39;\t&amp;#39;,&amp;#39;&amp;#39;)&#xA;            matched_objs = pageObj.findall(rsp)&#xA;            if matched_objs:&#xA;                obj0,obj1 = matched_objs[0]&#xA;                self.allCount = int(obj0)&#xA;                self.pageSize = int(obj1)&#xA;                self.totalpage = (self.allCount / self.pageSize) + 1&#xA;                print &amp;#39;allCount:%d, pageSize:%d, totalpage:%d&amp;#39; % (self.allCount,self.pageSize,self.totalpage)&#xA;    #获取每一页里的博客链接&#xA;    def fetchPage(self,url):&#xA;        req = urllib2.Request(url)&#xA;        rsp = urllib2.urlopen(req).read()&#xA;        if rsp:&#xA;            rsp = rsp.replace(&amp;#39;\r&amp;#39;,&amp;#39;&amp;#39;).replace(&amp;#39;\n&amp;#39;,&amp;#39;&amp;#39;).replace(&amp;#39;\t&amp;#39;,&amp;#39;&amp;#39;)&#xA;            matched_objs = blogObj.findall(rsp)&#xA;            if matched_objs:&#xA;                for obj in matched_objs:&#xA;                    #这里可以用多线程改写一下,单线程太慢&#xA;                    self.download(obj[0],obj[1])&#xA;    def downloadBywinget(self,url,title):&#xA;        #比如使用wget之类的第三方工具，自己填参数写&#xA;        pass&#xA;    #下载博客&#xA;    def download(self,url,title):&#xA;        path = &amp;#39;%s/%s.html&amp;#39; % (self.user,title.decode(&amp;#39;utf-8&amp;#39;))&#xA;        url = &amp;#39;http://hi.baidu.com%s&amp;#39; % (url)&#xA;        print &amp;#34;Download url %s&amp;#34; % (url)&#xA;        nFail = 0&#xA;        while nFail &amp;lt; 5:&#xA;            try:&#xA;                sock = urllib.urlopen(url)&#xA;                htmlSource = sock.read()&#xA;                myfile = file(path,&amp;#39;w&amp;#39;)&#xA;                myfile.write(htmlSource)&#xA;                myfile.close()&#xA;                sock.close()&#xA;                return&#xA;            except:&#xA;                nFail += 1&#xA;        print (&amp;#39;download blog fail:%s&amp;#39; % (url))&#xA;    def dlownloadall(self):&#xA;        for page in range(1,self.totalpage+1):&#xA;            url = &amp;#34;%s?page=%d&amp;#34; % (self.blog,page)&#xA;            #这里可以用多线程改写一下,单线程太慢&#xA;            self.fetchPage(url)&#xA;def main():&#xA;    user = &amp;#39;runsheng2005&amp;#39;       #你的百度登录名&#xA;    psw  = &amp;#39;password&amp;#39;  #你的百度登陆密码,不输入用户名和密码，得不到私有的文章&#xA;    blog = &amp;#34;http://hi.baidu.com/zhourunsheng&amp;#34; #你自己的百度博客链接&#xA;    baidu = Baidu(user,psw,blog)&#xA;    baidu.login()&#xA;    baidu.getTotalPage()&#xA;    baidu.dlownloadall()&#xA;if __name__ == &amp;#39;__main__&amp;#39;:&#xA;    main()&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;例如，我的用户名是&lt;em&gt;runsheng2005&lt;/em&gt;，则会在工作目录建立一个名为&lt;em&gt;baidurunsheng2005.coockie&lt;/em&gt;的文件用来保存cookie信息，其中的内容如下：&lt;/p&gt;</description>
			</item>
			<item>
				<title>生活杂记</title>
				<link>https://blog.zhourunsheng.com/2013/04/%e7%94%9f%e6%b4%bb%e6%9d%82%e8%ae%b0/</link>
				<pubDate>Sat, 06 Apr 2013 14:43:54 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2013/04/%e7%94%9f%e6%b4%bb%e6%9d%82%e8%ae%b0/</guid>
				<description>&lt;p&gt;距离上一次写博客已经半年多天气了，在这个过程中发生了很多的事情，导致博客的更新中断了，也有读者的mail拖了好久才给回复，插件也没有后续的维护了，这段时间内有开心的事，也有难过的事，上天总是在合适的时间分配给你一个合适的任务，经历过的总是成长的，从现在开始再把博客续集起来~~~为了更好的将文章进行分享出去，特意创建了一个微信公众号！&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2013/04/qrcode_runsheng_blog.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;公共平台二维码使用方式如下：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;扫描上面的二维码进行微信好友的添加&lt;/li&gt;&#xA;&lt;li&gt;发送查询的关键字，例如“android”  &lt;img src=&#34;/wp-content/uploads/2013/04/sousuo_android.png&#34; alt=&#34;android&#34;&gt;&lt;/li&gt;&#xA;&lt;li&gt;返回与“android”相关的博文  &lt;img src=&#34;/wp-content/uploads/2013/04/sousuo_jieguo.png&#34; alt=&#34;jieguo&#34;&gt;&lt;/li&gt;&#xA;&lt;li&gt;阅读搜索到的博客文章  &lt;img src=&#34;/wp-content/uploads/2013/04/yuedu_bowen.png&#34; alt=&#34;read&#34;&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
			</item>
			<item>
				<title>配置wordpress博客阻止部分IP访问</title>
				<link>https://blog.zhourunsheng.com/2012/08/%e9%85%8d%e7%bd%aewordpress%e5%8d%9a%e5%ae%a2%e9%98%bb%e6%ad%a2%e9%83%a8%e5%88%86ip%e8%ae%bf%e9%97%ae/</link>
				<pubDate>Thu, 02 Aug 2012 17:31:59 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/08/%e9%85%8d%e7%bd%aewordpress%e5%8d%9a%e5%ae%a2%e9%98%bb%e6%ad%a2%e9%83%a8%e5%88%86ip%e8%ae%bf%e9%97%ae/</guid>
				<description>&lt;p&gt;上个月，博客安装了没一个星期，就被莫名的IP攻击了，一个月的流量早早用完了，导致博客整整歇业了将近20天，这个月的第一天，8月1号，估计攻击的ip还在沉睡中，没出现什么异常，到了8月2号，就又开始攻击了。&lt;/p&gt;&#xA;&lt;p&gt;今天下载分析了一下apache日志文件，找到了这几个攻击的ip，详情如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;113.108.76.195 - - [02/Aug/2012:00:10:02 -0400] &amp;#34;GET /favicon.ico HTTP/1.0&amp;#34; 301 584 &amp;#34;-&amp;#34; &amp;#34;Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1) QQBrowser/6.0&amp;#34;&#xA;113.108.76.196 - - [02/Aug/2012:00:10:04 -0400] &amp;#34;GET /favicon.ico HTTP/1.1&amp;#34; 301 584 &amp;#34;-&amp;#34; &amp;#34;Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1) QQBrowser/6.0&amp;#34;&#xA;114.86.181.181 - - [02/Aug/2012:00:10:05 -0400] &amp;#34;GET /favicon.ico HTTP/1.1&amp;#34; 301 583 &amp;#34;-&amp;#34; &amp;#34;Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1) QQBrowser/6.0&amp;#34;&#xA;116.237.76.204 - - [02/Aug/2012:03:04:37 -0400] &amp;#34;GET /favicon.ico HTTP/1.1&amp;#34; 301 583 &amp;#34;-&amp;#34; &amp;#34;Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1) QQBrowser/6.0&amp;#34;&#xA;202.105.139.117 - - [02/Aug/2012:04:02:01 -0400] &amp;#34;GET /favicon.ico HTTP/1.1&amp;#34; 301 584 &amp;#34;-&amp;#34; &amp;#34;Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2)&amp;#34;&#xA;218.17.162.137 - - [02/Aug/2012:04:12:04 -0400] &amp;#34;GET /favicon.ico HTTP/1.1&amp;#34; 301 584 &amp;#34;-&amp;#34; &amp;#34;Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2)&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;主要就是这六个IP，反复请求favicon.ico文件，平均每秒发送几十个数据请求，导致博客一天的最大流量能达到3.5个G，太可怕了。&lt;/p&gt;</description>
			</item>
			<item>
				<title>为Wordpress建立Html格式的Sitemap</title>
				<link>https://blog.zhourunsheng.com/2012/06/%e4%b8%bawordpress%e5%bb%ba%e7%ab%8bhtml%e6%a0%bc%e5%bc%8f%e7%9a%84sitemap/</link>
				<pubDate>Sun, 24 Jun 2012 11:56:39 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/06/%e4%b8%bawordpress%e5%bb%ba%e7%ab%8bhtml%e6%a0%bc%e5%bc%8f%e7%9a%84sitemap/</guid>
				<description>&lt;p&gt;熟悉wordpress建站的童鞋都知道sitemap的重要性，尤其是对网站的SEO以及各大重要搜索引擎的索引都有重要的作用，wordpress已经有许多优秀的sitemap生成插件可以使用，不过他们大部分生成的都只是xml格式的数据，可以直接提交到搜索引擎，方便搜索引擎的索引，但是不方便访客的阅读。&lt;/p&gt;&#xA;&lt;p&gt;本文介绍一下怎样客制化和建立自己的Sitemap Page页面，可以包括或者排除特定的页面，特定的分类，加入自己定制的信息等等。&lt;/p&gt;&#xA;&lt;h2 id=&#34;建立步骤&#34;&gt;建立步骤&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;为了代码的重用，我们需要利用wordpress主题模板的特性（theme partial），在当前的主题文件夹下面新建立一个partials文件夹，然后在里面新建立一个sitemap.php文件，内容如下：&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;h2 id=&amp;#34;authors&amp;#34;&amp;gt;Authors&amp;lt;/h2&amp;gt;&#xA;&amp;lt;ul&amp;gt;&#xA;&amp;lt;?php&#xA;wp_list_authors(&#xA;array(&#xA;&amp;#39;exclude_admin&amp;#39; =&amp;gt; false,&#xA;)&#xA;);&#xA;?&amp;gt;&#xA;&amp;lt;/ul&amp;gt;&#xA;&#xA;&amp;lt;h2 id=&amp;#34;pages&amp;#34;&amp;gt;Pages&amp;lt;/h2&amp;gt;&#xA;&amp;lt;ul&amp;gt;&#xA;&amp;lt;?php&#xA;// Add pages you&amp;#39;d like to exclude in the exclude here&#xA;wp_list_pages(&#xA;array(&#xA;&amp;#39;exclude&amp;#39; =&amp;gt; &amp;#39;&amp;#39;,&#xA;&amp;#39;title_li&amp;#39; =&amp;gt; &amp;#39;&amp;#39;,&#xA;)&#xA;);&#xA;?&amp;gt;&#xA;&amp;lt;/ul&amp;gt;&#xA;&#xA;&amp;lt;h2 id=&amp;#34;posts&amp;#34;&amp;gt;Posts&amp;lt;/h2&amp;gt;&#xA;&amp;lt;ul&amp;gt;&#xA;&amp;lt;?php&#xA;&#xA;// Add categories you&amp;#39;d like to exclude in the exclude here&#xA;$cats = get_categories(&amp;#39;exclude=&amp;#39;);&#xA;foreach ($cats as $cat) {&#xA;echo &amp;#34;&amp;lt;li&amp;gt;&amp;lt;h3&amp;gt;&amp;#34;.$cat-&amp;gt;cat_name.&amp;#34;&amp;lt;/h3&amp;gt;&amp;#34;;&#xA;echo &amp;#34;&amp;lt;ul&amp;gt;&amp;#34;;&#xA;query_posts(&amp;#39;posts_per_page=-1&amp;amp;cat=&amp;#39;.$cat-&amp;gt;cat_ID);&#xA;while(have_posts()) {&#xA;the_post();&#xA;$category = get_the_category();&#xA;// Only display a post link once, even if it&amp;#39;s in multiple categories&#xA;if ($category[0]-&amp;gt;cat_ID == $cat-&amp;gt;cat_ID) {&#xA;echo &amp;#39;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#34;&amp;#39;.get_permalink().&amp;#39;&amp;#34;&amp;gt;&amp;#39;.get_the_title().&amp;#39;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#39;;&#xA;}&#xA;}&#xA;echo &amp;#34;&amp;lt;/ul&amp;gt;&amp;#34;;&#xA;echo &amp;#34;&amp;lt;/li&amp;gt;&amp;#34;;&#xA;}&#xA;&#xA;//Add Custom Post Types to your HTML Sitemap&#xA;foreach( get_post_types( array(&amp;#39;public&amp;#39; =&amp;gt; true) ) as $post_type ) {&#xA;if ( in_array( $post_type, array(&amp;#39;post&amp;#39;,&amp;#39;page&amp;#39;,&amp;#39;attachment&amp;#39;) ) )&#xA;continue;&#xA;&#xA;$pt = get_post_type_object( $post_type );&#xA;&#xA;echo &amp;#39;&amp;lt;h2&amp;gt;&amp;#39;.$pt-&amp;gt;labels-&amp;gt;name.&amp;#39;&amp;lt;/h2&amp;gt;&amp;#39;;&#xA;echo &amp;#39;&amp;lt;ul&amp;gt;&amp;#39;;&#xA;&#xA;query_posts(&amp;#39;post_type=&amp;#39;.$post_type.&amp;#39;&amp;amp;posts_per_page=-1&amp;#39;);&#xA;while( have_posts() ) {&#xA;the_post();&#xA;echo &amp;#39;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#34;&amp;#39;.get_permalink().&amp;#39;&amp;#34;&amp;gt;&amp;#39;.get_the_title().&amp;#39;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#39;;&#xA;}&#xA;&#xA;echo &amp;#39;&amp;lt;/ul&amp;gt;&amp;#39;;&#xA;}&#xA;?&amp;gt;&#xA;&amp;lt;/ul&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;拷贝一份当前主题下面的page.php，并重新命名为page-sitemap.php,编辑内容如下：&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;?php&#xA;/*&#xA;Template Name: Sitemap Page&#xA;*/&#xA;?&amp;gt;&#xA;&amp;lt;?php get_header(); ?&amp;gt;&#xA;&amp;lt;div id=&amp;#34;content&amp;#34;&amp;gt;&#xA;&amp;lt;?php if (have_posts()) : ?&amp;gt;&amp;lt;?php while (have_posts()) : the_post(); ?&amp;gt;&#xA;&amp;lt;!-- menu --&amp;gt;&#xA;&amp;lt;div id=&amp;#34;map&amp;#34;&amp;gt;&#xA;&amp;lt;div class=&amp;#34;browse&amp;#34;&amp;gt;现在位置 ＞&amp;lt;a title=&amp;#34;返回首页&amp;#34; href=&amp;#34;&amp;lt;?php echo get_settings(&amp;#39;Home&amp;#39;); ?&amp;gt;/&amp;#34;&amp;gt;首页&amp;lt;/a&amp;gt; ＞&amp;lt;?php the_title(); ?&amp;gt;&amp;lt;/div&amp;gt;&#xA;&amp;lt;div id=&amp;#34;feed&amp;#34;&amp;gt;&amp;lt;a href=&amp;#34;&amp;lt;?php echo get_option(&amp;#39;swt_rsssub&amp;#39;); ?&amp;gt;&amp;#34; title=&amp;#34;RSS&amp;#34;&amp;gt;RSS&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&#xA;&amp;lt;/div&amp;gt;&#xA;&amp;lt;!-- end: menu --&amp;gt;&#xA;&amp;lt;!-- entry --&amp;gt;&#xA;&amp;lt;div class=&amp;#34;clear&amp;#34;&amp;gt;&amp;lt;/div&amp;gt;&#xA;&amp;lt;div class=&amp;#34;entry_box_s&amp;#34;&amp;gt;&#xA;&amp;lt;div class=&amp;#34;entry&amp;#34;&amp;gt;&#xA;&amp;lt;div class=&amp;#34;page&amp;#34; id=&amp;#34;post-&amp;lt;?php the_ID(); ?&amp;gt;&amp;#34;&amp;gt;&#xA;&amp;lt;?php the_content(&amp;#39;More &amp;amp;raquo;&amp;#39;); ?&amp;gt;&#xA;&amp;lt;div class=&amp;#34;clear&amp;#34;&amp;gt;&amp;lt;/div&amp;gt;&#xA;&amp;lt;/div&amp;gt;&#xA;&amp;lt;?php get_template_part(&amp;#39;/partials/sitemap&amp;#39;); ?&amp;gt;&#xA;&amp;lt;/div&amp;gt;&#xA;&amp;lt;!-- end: entry --&amp;gt;&#xA;&amp;lt;div class=&amp;#34;clear&amp;#34;&amp;gt;&amp;lt;/div&amp;gt;&#xA;&amp;lt;i class=&amp;#34;lt&amp;#34;&amp;gt;&amp;lt;/i&amp;gt;&#xA;&amp;lt;i class=&amp;#34;rt&amp;#34;&amp;gt;&amp;lt;/i&amp;gt;&#xA;&amp;lt;/div&amp;gt;&#xA;&amp;lt;div class=&amp;#34;entry_sb&amp;#34;&amp;gt;&#xA;&amp;lt;i class=&amp;#34;lb&amp;#34;&amp;gt;&amp;lt;/i&amp;gt;&#xA;&amp;lt;i class=&amp;#34;rb&amp;#34;&amp;gt;&amp;lt;/i&amp;gt;&#xA;&amp;lt;/div&amp;gt;&#xA;&amp;lt;?php endwhile; ?&amp;gt;&#xA;&amp;lt;?php endif; ?&amp;gt;&#xA;&amp;lt;/div&amp;gt;&#xA;&amp;lt;!-- end: content --&amp;gt;&#xA;&amp;lt;?php get_sidebar(); ?&amp;gt;&#xA;&amp;lt;?php get_footer(); ?&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;主要修改两个地方，一个是在文件的顶部加入&lt;/p&gt;</description>
			</item>
			<item>
				<title>Sitemap</title>
				<link>https://blog.zhourunsheng.com/sitemap/</link>
				<pubDate>Sun, 24 Jun 2012 11:42:01 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/sitemap/</guid>
				<description></description>
			</item>
			<item>
				<title>Android ListView 之瀑布流设计</title>
				<link>https://blog.zhourunsheng.com/2012/06/android-listview-%e4%b9%8b%e7%80%91%e5%b8%83%e6%b5%81%e8%ae%be%e8%ae%a1/</link>
				<pubDate>Thu, 21 Jun 2012 17:08:45 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/06/android-listview-%e4%b9%8b%e7%80%91%e5%b8%83%e6%b5%81%e8%ae%be%e8%ae%a1/</guid>
				<description>&lt;p&gt;谈论起瀑布流，相信大家不怎么陌生，实际上现在好多的网站都已经按照这种风格设计了，简言之就是按需加载，先加载一屏的内容，当用户向下滚动到页面底部的时候，继续加载一屏的内容，就这样，一直循环往复，用户浏览多少，加载多少！&lt;/p&gt;&#xA;&lt;p&gt;在Android ListView的设计中，就可以很好的融合这种设计方法，本文就简单介绍一种方法来实现瀑布流的功能，进入程序主界面的时候先加载一部分内容，然后当用户向下滚到到底部的时候继续加载，用户向下继续滚到，则继续加载，一直到内容加载完毕。&lt;/p&gt;&#xA;&lt;p&gt;本文的程序设计思路来自于 cwac-endless，其功能介绍如下：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Provides the EndlessAdapter, a wrapper for an existing ListAdapter that adds &amp;ldquo;endless list&amp;rdquo; capability. When the user scrolls to the bottom of the list, if there is more data for this list to be retrieved, your code gets invoked in a background thread to fetch the new rows, which then get seamlessly attached to the bottom of the list.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;代码的实现还依赖于另一个开发包 cwac-adapter,其功能介绍如下:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Provides an AdapterWrapper, a simple wrapper class that, by default, delegates all ListAdapter methods to a wrapped ListAdapter. The idea is that you can extend AdapterWrapper and only override certain ListAdapter methods, with the rest handled via the wrapped adapter.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
			</item>
			<item>
				<title>Android 配置 Ant 脚本之代码混淆和优化</title>
				<link>https://blog.zhourunsheng.com/2012/06/android-%e9%85%8d%e7%bd%ae-ant-%e8%84%9a%e6%9c%ac%e4%b9%8b%e4%bb%a3%e7%a0%81%e6%b7%b7%e6%b7%86%e5%92%8c%e4%bc%98%e5%8c%96/</link>
				<pubDate>Wed, 20 Jun 2012 17:49:35 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/06/android-%e9%85%8d%e7%bd%ae-ant-%e8%84%9a%e6%9c%ac%e4%b9%8b%e4%bb%a3%e7%a0%81%e6%b7%b7%e6%b7%86%e5%92%8c%e4%bc%98%e5%8c%96/</guid>
				<description>&lt;p&gt;本文的目的是介绍怎么样配置android的ant自动化编译脚本，来实现编译发布版本时代码的混淆和代码的优化，利用的主要工具包括ant和proguard。&lt;/p&gt;&#xA;&lt;h2 id=&#34;编译环境&#34;&gt;编译环境&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ant 版本 1.8.4&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;F:\workspace\eReader&amp;gt;ant -version&#xA;Apache Ant(TM) version 1.8.4 compiled on May 22 2012&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;java 版本 1.7&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;F:\workspace\eReader&amp;gt;java -version&#xA;java version &amp;#34;1.7.0_05&amp;#34;&#xA;Java(TM) SE Runtime Environment (build 1.7.0_05-b05)&#xA;Java HotSpot(TM) Client VM (build 23.1-b03, mixed mode, sharing)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;文件配置&#34;&gt;文件配置&lt;/h2&gt;&#xA;&lt;p&gt;因为 Android 已经内置了 proguard 的支持，所以我们只需要进行配置启用该功能即可。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;生成 build.xml 文件&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;F:\workspace\eReader&amp;gt;android update project -p .&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;配置 local.properties 文件  sdk.dir会自动指向当前系统android的开发环境路径，key.store和key.alias分别指向签名文件和签名文件的别名，这个需要自己制作，主要是release的时候需要使用&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sdk.dir=E:\\PROGRA~1\\android-sdk-windows&#xA;&#xA;key.store=F:\\Android\\android_key\\careychow.keystore&#xA;key.alias=Carey&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;配置 build.xml 文件配置签名算法为 SHA1&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; &amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&#xA; &amp;lt;project name=&amp;#34;GAReader&amp;#34; default=&amp;#34;help&amp;#34;&amp;gt;&#xA;     .... 此处省略若干&#xA;&#xA;     &amp;lt;presetdef name=&amp;#34;signjar&amp;#34;&amp;gt;&#xA;         &amp;lt;signjar sigalg=&amp;#34;MD5withRSA&amp;#34; digestalg=&amp;#34;SHA1&amp;#34; /&amp;gt;&#xA;     &amp;lt;/presetdef&amp;gt;&#xA;&#xA; &amp;lt;/project&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;自动化编译&#34;&gt;自动化编译&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;执行编译命令 ant release&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;   F:\workspace\eReader&amp;gt;ant release&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;输入签名密钥的密码和签名别名的密码进行签名&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;   ......&#xA;   -release-prompt-for-password:&#xA;    [input] Please enter keystore password (store:F:\Android\android_key\careych&#xA;ow.keystore):&#xA;careychow&#xA;    [input] Please enter password for alias &amp;#39;Carey&amp;#39;:&#xA;careychow&#xA;   ......&#xA;-release-sign:&#xA;     [echo] Signing final apk...&#xA;  [signjar] Signing JAR: F:\workspace\eReader\bin\GAReader-release-unsigned.apk&#xA;to F:\workspace\eReader\bin\GAReader-release-unaligned.apk as Carey&#xA;  [signjar] 输入密钥库的密码短语:&#xA; [zipalign] Running zip align on final apk...&#xA;     [echo] Release Package: F:\workspace\eReader\bin\GAReader-release.apk&#xA;[propertyfile] Updating property file: F:\workspace\eReader\bin\build.prop&#xA;[propertyfile] Updating property file: F:\workspace\eReader\bin\build.prop&#xA;[propertyfile] Updating property file: F:\workspace\eReader\bin\build.prop&#xA;[propertyfile] Updating property file: F:\workspace\eReader\bin\build.prop&#xA;&#xA;-post-build:&#xA;&#xA;release:&#xA;&#xA;BUILD SUCCESSFUL&#xA;Total time: 1 minute 36 seconds&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;常见错误&#34;&gt;常见错误&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;去除 proguard 的警告信息，尤其在自己引用第三方library的时候，代码混淆的过程中，proguard分析当前所有的类库，会警告有些类或者方法无法识别，因为这些都是第三方library自己编译的，我们无法再去找它所依赖的其他包，只需要配置忽略这些警告即可，方法如下：配置 proguard.cfg 文件，在文件的最后加上要忽略的类&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  ......&#xA;-dontwarn java.awt.**,antlr.**,org.junit.**,jargs.gnu.**&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;解决签名错误 INSTALL_PARSE_FAILED_NO_CERTIFICATES  目前在JDK7的版本和ant1.8.4会出现这个问题，如果不指明所使用的签名算法，则APK就无法正确签名，在安装的过程中就会出现如上的错误信息，解决办法就是在build.xml中指明签名算法。还有另外的解决方法，可参照如下文章：    &#x9;&lt;a href=&#34;http://stackoverflow.com/questions/8036422/android-signing-with-ant&#34;&gt;http://stackoverflow.com/questions/8036422/android-signing-with-ant&lt;/a&gt;  &#x9;&lt;a href=&#34;http://stackoverflow.com/questions/9820769/why-does-adb-fail-with-failure-install-parse-failed-no-certificates&#34;&gt;http://stackoverflow.com/questions/9820769/why-does-adb-fail-with-failure-install-parse-failed-no-certificates&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;总结&#34;&gt;总结&lt;/h2&gt;&#xA;&lt;p&gt;配置和启用的过程倒是不复杂，主要就是出现的一些版本兼容问题比较难解决，好了，内容就讲解这么多！&lt;/p&gt;</description>
			</item>
			<item>
				<title>Wordpress中实用的SQl语句</title>
				<link>https://blog.zhourunsheng.com/2012/06/wordpress%e4%b8%ad%e5%ae%9e%e7%94%a8%e7%9a%84sql%e8%af%ad%e5%8f%a5/</link>
				<pubDate>Tue, 05 Jun 2012 13:40:10 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/06/wordpress%e4%b8%ad%e5%ae%9e%e7%94%a8%e7%9a%84sql%e8%af%ad%e5%8f%a5/</guid>
				<description>&lt;p&gt;利用wordpress搭建个人博客比较方便，有时候会涉及到博客内容的批量变更，本文分享几个有效的sql语句来方便的进行内容更新。&lt;/p&gt;&#xA;&lt;h2 id=&#34;数据库备份&#34;&gt;数据库备份&lt;/h2&gt;&#xA;&lt;p&gt;在做具体的修改以前，建议先备份数据库，phpMyAdmin备份步骤如下：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Login to your &lt;strong&gt;phpMyAdmin&lt;/strong&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Select your WordPress database.&lt;/li&gt;&#xA;&lt;li&gt;Click on &lt;strong&gt;Export&lt;/strong&gt; at the top of the navigation.&lt;/li&gt;&#xA;&lt;li&gt;Select the tables you want to backup, or select all tables to backup the whole database.&lt;/li&gt;&#xA;&lt;li&gt;Select SQL to export as &lt;strong&gt;.sql&lt;/strong&gt; extension.&lt;/li&gt;&#xA;&lt;li&gt;Check the &amp;ldquo;Save as file&amp;rdquo; checkbox.&lt;/li&gt;&#xA;&lt;li&gt;Choose compression type, select &lt;strong&gt;gzipped&lt;/strong&gt; to compress the database to a smaller size.&lt;/li&gt;&#xA;&lt;li&gt;Finally click &lt;strong&gt;Go&lt;/strong&gt;, and a download window will prompt you to save your backup database file.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;实用sql语句&#34;&gt;实用SQL语句&lt;/h2&gt;&#xA;&lt;p&gt;变更博客网址 Siteurl &amp;amp; Homeurl&lt;/p&gt;</description>
			</item>
			<item>
				<title>FLV格式流媒体的缓存渐进拖放原理</title>
				<link>https://blog.zhourunsheng.com/2012/06/flv%e6%a0%bc%e5%bc%8f%e6%b5%81%e5%aa%92%e4%bd%93%e7%9a%84%e7%bc%93%e5%ad%98%e6%b8%90%e8%bf%9b%e6%8b%96%e6%94%be%e5%8e%9f%e7%90%86/</link>
				<pubDate>Sat, 02 Jun 2012 20:21:23 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/06/flv%e6%a0%bc%e5%bc%8f%e6%b5%81%e5%aa%92%e4%bd%93%e7%9a%84%e7%bc%93%e5%ad%98%e6%b8%90%e8%bf%9b%e6%8b%96%e6%94%be%e5%8e%9f%e7%90%86/</guid>
				<description>&lt;p&gt;前几天讲解了mp4格式文件的解析，边缓存边播放，拖动处理，faplayer的编译等等，可以查看我的《Android系列专题文章》，本文给大家介绍flv格式文件的缓存渐进拖放原理。&lt;/p&gt;&#xA;&lt;p&gt;flv是Adobe公司提出来的一种视频存储格式，因为其压缩的效果比较好，容量小，所以很适合网络传播，这也就是国外的youtube，国内的优酷，土豆等等都无一类外的采用flv格式来进行存储，有关flv格式的具体内容可以参照 Flash Video 和 osflash。&lt;/p&gt;&#xA;&lt;p&gt;flv是采用一种tag的数据结构进行流媒体数据的存储，首先是文件头，接下来是可选的meta信息，再后面就是音频和视频数据的交替存储，比起来mp4文件庞大的文件头，flv的文件头基本可以忽略了，只有9个字节，meta部分存储一些音视频解码和长度等的一些信息，具体的音频和视频的tab部分存储实际的流媒体数据。&lt;/p&gt;&#xA;&lt;p&gt;mp4文件之所以能边缓存边播放，并且可以支持跳转，原因是文件头存储了视频整体的信息，像视频的总时长，关键帧，对应的时间轴，对应的文件偏移量等等，有了这些信息，就能实现在视频全部下载完毕之前就支持跳转播放，如果mp4的文件头放在了文件末端，那么该文件就不支持缓存跳转播放了，只有等待文件全部下载完毕之后才能进行播放，具体怎么样将文件头重新提取到头部，我博客专题的文章中有写，可以参照。&lt;/p&gt;&#xA;&lt;p&gt;同理，flv文件的meta信息是可选的，如果这部分数据没有存储关键帧，时间轴和文件偏移量，那么该flv文件在全部缓存完毕之前是不支持跳转播放的，那么，大家可能会很奇怪，优酷，土豆看了这么久，所有的视频都是可以拖动跳转的，那么具体的原因是什么，下面我给大家详细解释。&lt;/p&gt;&#xA;&lt;p&gt;首先大家先了解下什么是flv meta 注入，意思就是通过解析当前flv文件的音视频tag，然后根据这些流媒体数据来生成关键帧，时间轴和偏移量的信息，然后将这些信息重置到该flv文件的meta部分，这样就能够使不支持拖动播放的flv文件变得支持拖动播放了，实际上优酷的做法就是这样，用户上传的视频动态转码成flv格式，并且通过扫描和解析flv文件，进行meta注入，最后我们在网上播放的视频就是处理过的视频。实现flv注入，有两个工具可以使用，具体可以参照 flvmdi 和 FLVTool2。&lt;/p&gt;&#xA;&lt;p&gt;接下来我用win版本的flvtool来分析一段优酷的视频（谢霆锋热血微电影），解析到的meta信息如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;C:/Users/Administrator/Desktop/flvtool2.exe -P test.flv&#xA;  hasKeyframes: true&#xA;  hasVideo: true&#xA;  framerate: 15&#xA;  audiosamplerate: 22050&#xA;  hasAudio: true&#xA;  height: 288&#xA;  metadatacreator: modified by youku.com in 20111202&#xA;  keyframes: &#xA;    times: &#xA;      - 0&#xA;      - 0&#xA;      - 6&#xA;      - 12&#xA;      - 18&#xA;      - 24&#xA;      - 25.6666666666667&#xA;      - 26.7333333333333&#xA;      - 28.3333333333333&#xA;      - 30.2666666666667&#xA;      // 省略部分&#xA;      - 193.866666666667&#xA;      - 199.866666666667&#xA;      - 205.866666666667&#xA;    filepositions: &#xA;      - 1400&#xA;      - 1494&#xA;      - 98389&#xA;      - 205673&#xA;      - 312032&#xA;      - 422862&#xA;      - 438242&#xA;      - 495063&#xA;      - 555999&#xA;      - 695882&#xA;      // 省略部分&#xA;      - 7259084&#xA;      - 7426324&#xA;      - 7538447&#xA;  duration: 210.066666666667&#xA;  hasMetadata: true&#xA;  width: 512&#xA;...&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;通过分析上面的meta信息，我们可以得到该视频的播放尺寸为512*288，视频的总时长约为210s，也就是3分半钟，从keyframes中可以解析得到关键帧对应的时间轴和对应的文件文件偏移量，有了这些信息，就能让该视频支持缓存跳转播放了，还有一句话，大家注意“metadatacreator: modified by youku.com in 20111202”，这是优酷在进行视频处理的时候填入的制作者信息。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Java PHP Json Mysql 中文乱码问题之解决</title>
				<link>https://blog.zhourunsheng.com/2012/06/java-php-json-mysql-%e4%b8%ad%e6%96%87%e4%b9%b1%e7%a0%81%e9%97%ae%e9%a2%98%e4%b9%8b%e8%a7%a3%e5%86%b3/</link>
				<pubDate>Fri, 01 Jun 2012 11:15:55 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/06/java-php-json-mysql-%e4%b8%ad%e6%96%87%e4%b9%b1%e7%a0%81%e9%97%ae%e9%a2%98%e4%b9%8b%e8%a7%a3%e5%86%b3/</guid>
				<description>&lt;h2 id=&#34;问题&#34;&gt;问题&lt;/h2&gt;&#xA;&lt;p&gt;客户端采用Java语言编写，服务器端采用PHP语言编写，数据库采用Mysql存储，客户端和服务器之间的交互采用Json，在传递英文数据的时候没有问题，当传递中文数据数据的时候，就会出现中文乱码问题，mysql里面的中文全部变成问号了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;解决方案&#34;&gt;解决方案&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Mysql数据库，数据表，数据字段采用统一编码UTF-8, 如 utf8_general_ci&lt;/li&gt;&#xA;&lt;li&gt;客户端Java字符串转成json格式的时候先进行urlencode处理&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;JSONObject jo = new JSONObject();&#xA;//jo.accumulate(&amp;#34;note&amp;#34;, note);&#xA;jo.accumulate(&amp;#34;note&amp;#34;, URLEncoder.encode(note));&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;服务器端PHP转换json格式后，插入数据库前先进行urldecode处理&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$data = array(&#xA;    &amp;#39;meta_key&amp;#39; =&amp;gt; &amp;#39;note&amp;#39;,&#xA;    //&amp;#39;meta_value&amp;#39; =&amp;gt; $params[&amp;#39;note&amp;#39;],&#xA;    &amp;#39;meta_value&amp;#39; =&amp;gt; urldecode($params[&amp;#39;note&amp;#39;]),&#xA;);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;经过以上的步骤处理，可完美解决中文乱码问题&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
			</item>
			<item>
				<title>三星 S5830i 安装谷歌同步服务</title>
				<link>https://blog.zhourunsheng.com/2012/05/%e4%b8%89%e6%98%9f-s5830i-%e5%ae%89%e8%a3%85%e8%b0%b7%e6%ad%8c%e5%90%8c%e6%ad%a5%e6%9c%8d%e5%8a%a1/</link>
				<pubDate>Wed, 30 May 2012 13:58:52 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/05/%e4%b8%89%e6%98%9f-s5830i-%e5%ae%89%e8%a3%85%e8%b0%b7%e6%ad%8c%e5%90%8c%e6%ad%a5%e6%9c%8d%e5%8a%a1/</guid>
				<description>&lt;p&gt;三星 S5830i 手机的root和安装google市场可以参看系列文章《三星S5830i安装谷歌服务》，本文介绍在此基础上安装谷歌的同步服务，具体包括通讯录同步，邮件同步和日历同步，安装方法如下。&lt;/p&gt;&#xA;&lt;h2 id=&#34;安装顺序&#34;&gt;安装顺序&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;下载 &lt;a href=&#34;http://carey-blog-image.googlecode.com/files/Google_Mobile_Service%28GMS%29%E8%B0%B7%E6%AD%8C%E7%A7%BB%E5%8A%A8%E6%9C%8D%E5%8A%A1%282.3.4%29.zip&#34;&gt;Google&lt;em&gt;Mobile&lt;/em&gt;Service(GMS)谷歌移动服务(2.3.4).zip&lt;/a&gt;，这是Android版本2.3的GMS服务包，里面包括了基本的google服务APP，不过我们不用那么多，只需要GoogleContactsSyncAdapter.apk, GoogleCalendarSyncAdapter.apk 和 Gmail.apk 就够了。&lt;/li&gt;&#xA;&lt;li&gt;将解压后得到的3个APK放到系统目录*/system/app*中，然后重启手机进行自动安装&lt;/li&gt;&#xA;&lt;li&gt;配置账户同步，勾选账户，日历和邮件同步的选项，稍等一会儿，所有的通讯录，日历和邮件就都同步ok了  &lt;img src=&#34;/wp-content/uploads/2012/06/all-google-apps.png&#34; alt=&#34;all-google-apps&#34;&gt;  &lt;img src=&#34;/wp-content/uploads/2012/06/google-sync.png&#34; alt=&#34;google-sync&#34;&gt;&lt;/li&gt;&#xA;&lt;li&gt;这样的话，基本所有的google服务就都具备了，以后涉及到google其他的APP都木有问题了&lt;/li&gt;&#xA;&lt;li&gt;如果还想安装其他的google app，方法同上，有的只能安装到系统目录中，即/system/app下，有的可以按照普通的方法进行安装，视具体情况而定&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
			</item>
			<item>
				<title>三星 S5830i 安装谷歌市场 Google Market</title>
				<link>https://blog.zhourunsheng.com/2012/05/%e4%b8%89%e6%98%9f-s5830i-%e5%ae%89%e8%a3%85%e8%b0%b7%e6%ad%8c%e5%b8%82%e5%9c%ba-google-market/</link>
				<pubDate>Wed, 30 May 2012 09:31:07 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/05/%e4%b8%89%e6%98%9f-s5830i-%e5%ae%89%e8%a3%85%e8%b0%b7%e6%ad%8c%e5%b8%82%e5%9c%ba-google-market/</guid>
				<description>&lt;p&gt;前几天刚把三星S5830i Root过了，现在操作起来顺畅多了，还有一个待解决的问题就是没有google服务，没法安装google market，本文就介绍怎么样在手机没有内置google服务的基础上来自己安装，国内好多的定制行货手机都被裁剪掉了，真搞不懂为什么？？？好了，接下来介绍一下安装顺序，前提是你的手机已经root过了，具体怎么样root可以参照文章《三星 S5830i root》。&lt;/p&gt;&#xA;&lt;h2 id=&#34;安装顺序&#34;&gt;安装顺序&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;下载 google 服务包，里面包括 GoogleServicesFramework.apk 和 Vending.apk，注意我的三星手机目前的android版本是2.3.6，所以该谷歌服务适用于2.3，其他的版本我还没有测试过，不过装了也不会出现什么副作用，可以试试，&lt;a href=&#34;http://carey-blog-image.googlecode.com/files/GoogleServicesFramework-Vending-2.3.zip&#34;&gt;点我&lt;/a&gt;下载。&lt;/li&gt;&#xA;&lt;li&gt;将上面已经下载的两个APK放置到 &lt;em&gt;/system/app&lt;/em&gt; 目录中，然后关机重启进行自动安装，安装以后提示google market应用升级，然后自动升级到google play store，截图如下  &lt;img src=&#34;/wp-content/uploads/2012/06/googleservicesframework.png&#34; alt=&#34;googleservicesframework&#34;&gt;  &lt;img src=&#34;/wp-content/uploads/2012/06/vending.png&#34; alt=&#34;vending&#34;&gt;  &lt;img src=&#34;/wp-content/uploads/2012/06/playstore.png&#34; alt=&#34;playstore&#34;&gt;&lt;/li&gt;&#xA;&lt;li&gt;接下来打开play store应用绑定Google账户，填写正确的google账户信息，绑定完了就ok了，截图如下：  &lt;img src=&#34;/wp-content/uploads/2012/06/playstoresetting.png&#34; alt=&#34;playstoresetting&#34;&gt;  &lt;img src=&#34;/wp-content/uploads/2012/06/playstoresettingok.png&#34; alt=&#34;playstoresettingok&#34;&gt;  &lt;img src=&#34;/wp-content/uploads/2012/06/playstoremainpage.png&#34; alt=&#34;playstoremainpage&#34;&gt;&lt;/li&gt;&#xA;&lt;li&gt;欧了，现在就可以利用play store进行apk安装和升级了，随心所欲的利用google服务&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
			</item>
			<item>
				<title>Android 流媒体播放之缓冲跳转实现</title>
				<link>https://blog.zhourunsheng.com/2012/05/android-%e6%b5%81%e5%aa%92%e4%bd%93%e6%92%ad%e6%94%be%e4%b9%8b%e7%bc%93%e5%86%b2%e8%b7%b3%e8%bd%ac%e5%ae%9e%e7%8e%b0/</link>
				<pubDate>Tue, 29 May 2012 14:06:09 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/05/android-%e6%b5%81%e5%aa%92%e4%bd%93%e6%92%ad%e6%94%be%e4%b9%8b%e7%bc%93%e5%86%b2%e8%b7%b3%e8%bd%ac%e5%ae%9e%e7%8e%b0/</guid>
				<description>&lt;p&gt;前几篇文章分析了mp4文件的格式和文件的解析，以及视频边缓冲边播放的原理讲解与代码实现，具体可以参看 Android视频播放专题系列文章的讲解，本文就展示一下缓冲跳转代码的实现原理。&lt;/p&gt;&#xA;&lt;p&gt;先分享一下4幅图片，分别为播放前的缓存，正常播放中，跳转缓冲和跳转以后的正常播放。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2012/06/huanchongqian.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2012/06/bofangzhong.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2012/06/tiaozhuanghuanchong.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2012/06/tiaozhuangbofang.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;代码解析&#34;&gt;代码解析&lt;/h2&gt;&#xA;&lt;p&gt;视频断点分隔的数据结构定义定义了每一段视频的时间偏移点，文件位移偏移点，文件段的大小和当前的缓存状态&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;class VideoInfo {&#xA;        double timestart;&#xA;        long offsetstart;&#xA;        long offsetend;&#xA;        long downloadsize;&#xA;        DownloadStatus status;&#xA;&#xA;        public VideoInfo() {&#xA;            status = DownloadStatus.NOTSTART;&#xA;        }&#xA;&#xA;        @Override&#xA;        public String toString() {&#xA;            String s = &amp;#34;beginTime:&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;缓存状态的定义分别为还未缓存，正在下载中和缓存完毕&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    enum DownloadStatus {&#xA;        NOTSTART, DOWNLOADING, FINISH,&#xA;    }&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;分段视频的下载利用了Http协议的 Range 属性，下载部分文件&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;private void downloadbyvideoinfo(VideoInfo vi) throws IOException {&#xA;        System.out.println(&amp;#34;download -&amp;gt; &amp;#34; + vi.toString());&#xA;&#xA;        URL url = new URL(this.url);&#xA;        HttpURLConnection conn = (HttpURLConnection) url.openConnection();&#xA;        conn.setConnectTimeout(3000);&#xA;        conn.setRequestProperty(&amp;#34;Range&amp;#34;, &amp;#34;bytes=&amp;#34; + vi.offsetstart + &amp;#34;-&amp;#34;&#xA;                + vi.offsetend);&#xA;&#xA;        RandomAccessFile raf = new RandomAccessFile(new File(localFilePath),&#xA;                &amp;#34;rws&amp;#34;);&#xA;        raf.seek(vi.offsetstart);&#xA;&#xA;        InputStream in = conn.getInputStream();&#xA;&#xA;        byte[] buf = new byte[1024 * 10];&#xA;        int len;&#xA;        vi.downloadsize = 0;&#xA;        while ((len = in.read(buf)) != -1) {&#xA;            raf.write(buf, 0, len);&#xA;            vi.downloadsize += len;&#xA;            Message msg = handler.obtainMessage();&#xA;            msg.what = MSG_DOWNLOADUPDATE;&#xA;            msg.obj = vi.offsetstart + vi.downloadsize;&#xA;            handler.sendMessage(msg);&#xA;        }&#xA;&#xA;        in.close();&#xA;        raf.close();&#xA;    }&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;检测指定时间点的视频数据是否已经缓存完毕&lt;/p&gt;</description>
			</item>
			<item>
				<title>VPN设置推荐</title>
				<link>https://blog.zhourunsheng.com/2012/05/vpn%e8%ae%be%e7%bd%ae%e6%8e%a8%e8%8d%90/</link>
				<pubDate>Mon, 28 May 2012 19:13:54 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/05/vpn%e8%ae%be%e7%bd%ae%e6%8e%a8%e8%8d%90/</guid>
				<description>&lt;p&gt;相信有不少童鞋希望找到国外的资源，神马在线代理了，ssh了，vpn了等等，本人也因为喜欢搜索和使用国外的资源，所以经常使用这些东西，使用时间最久的算是goagent，自己在google的gae上面搭建一个代理，利用google的免费服务，查个资料了什么的也足够用了。本文向读者推荐另一个比较稳定的vpn服务，本人也实测了一下，看视频很流畅，截图如下：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2012/05/youtube.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;申请流程&#34;&gt;申请流程&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://49.212.9.175/entry/&#34;&gt;点击我&lt;/a&gt;进入申请页面&lt;/li&gt;&#xA;&lt;li&gt;在 E-MAIL 一栏中填写自己的邮箱，然后勾选同意注册条款的方框，点击最下面的粉色按钮进入下一步&lt;/li&gt;&#xA;&lt;li&gt;在这一步中什么也不需要做，只是一些确认条款，直接再点击粉色的按钮进入下一步&lt;/li&gt;&#xA;&lt;li&gt;在这一步中需要确认邮箱，直接点击粉色的按钮发送确认信即可&lt;/li&gt;&#xA;&lt;li&gt;稍后在邮箱中会收到一封激活信件，点击链接激活即可&lt;/li&gt;&#xA;&lt;li&gt;激活后，邮箱会收到一封vpn的账户密码和ip地址信息，账户就是你注册的邮箱地址，密码是一个随机字符串，例如：&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    本登録しました。&#xA;&#xA;    接続IDとパスワードは以下の通りです。&#xA;&#xA;    接続ID     xxx@gmail.com&#xA;    パスワード  npPPUaYI&#xA;    VPNサーバ  49.212.0.54&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;在电脑中配置新建立vpn链接并激活即可，不想用的时候关闭即可。激活以后的截图如下：  &lt;img src=&#34;/wp-content/uploads/2012/05/vpnlianjie.png&#34; alt=&#34;vpnlianjie&#34;&gt;&lt;/li&gt;&#xA;&lt;li&gt;好了，现在可以欣赏外面的世界了&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
			</item>
			<item>
				<title>编译 faplayer 播放器</title>
				<link>https://blog.zhourunsheng.com/2012/05/%e7%bc%96%e8%af%91-faplayer-%e6%92%ad%e6%94%be%e5%99%a8/</link>
				<pubDate>Sat, 26 May 2012 13:17:31 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/05/%e7%bc%96%e8%af%91-faplayer-%e6%92%ad%e6%94%be%e5%99%a8/</guid>
				<description>&lt;p&gt;最近在做一个有关视频播放的项目，涉及到的问题就是视频解码，目前最优秀的两套解码库就是ffmpeg和flv，几乎现在能见到的所有视频格式都能解码，本文编译的faplayer就是基于flv的解码库。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2012/05/faplayer_pause.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;编译成功的程序可以正常播放优酷的flv格式，截图如下：&lt;/p&gt;&#xA;&lt;h2 id=&#34;环境配置&#34;&gt;环境配置&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Android SDk 参见 &lt;a href=&#34;http://developer.android.com/sdk/index.html&#34;&gt;http://developer.android.com/sdk/index.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Android NDk 参见 &lt;a href=&#34;http://developer.android.com/sdk/ndk/index.html&#34;&gt;http://developer.android.com/sdk/ndk/index.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;环境变量配置如下（~/.bashrc）：&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;   export ANDROID_SDK=/home/careychow/android/sdk/android-sdk-linux&#xA;   # export ANDROID_NDK=/home/careychow/android/ndk/android-ndk-r8&#xA;   export ANDROID_NDK=/home/careychow/android/ndk/android-ndk-r5c&#xA;   export PATH=$PATH:$ANDROID_SDK/tools:$ANDROID_SDK/platform-toos:$ANDROID_NDK&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;注：faplayer 利用 android-ndk-r5c 编译，用 android-ndk-r8 编译会出现错误&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;安装ruby环境，推荐安装ruby1.9.2&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt-get install ruby&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;手机cpu类型检测&#34;&gt;手机CPU类型检测&lt;/h2&gt;&#xA;&lt;p&gt;我自己的三星s5830i cpu 信息如下&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    C:\Users\Administrator&amp;gt;adb shell cat /proc/cpuinfo&#xA;    Processor       : ARMv6-compatible processor rev 5 (v6l)&#xA;    BogoMIPS        : 832.90&#xA;    Features        : swp half thumb fastmult vfp edsp java&#xA;    CPU implementer : 0x41&#xA;    CPU architecture: 6TEJ&#xA;    CPU variant     : 0x1&#xA;    CPU part        : 0xb36&#xA;    CPU revision    : 5&#xA;&#xA;    Hardware        : BCM21553 ThunderbirdEDN31 platform&#xA;    Revision        : 0000&#xA;    Serial          : 0000000000000000&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;编译-faplayer&#34;&gt;编译 faplayer&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;下载代码&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; git clone https://github.com/tewilove/faplayer.git&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;配置 local.properties 指向android sdk的安装路径，我的配置是：&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; sdk.dir=/home/careychow/android/sdk/android-sdk-linux&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;配置编译参数并编译代码，具体的配置需要参照上面的cpu信息，如果类型不匹配，编译出来的apk是无法正常安装的，会出现 **Failure [INSTALL_FAILED_CPU_ABI_INCOMPATIBLE]**错误，我的手机不支持neon，所以采用第二个配置参数 ABI=armeabi，可正常安装和执行&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Build examples:&#xA;./build.sh # &amp;lt;-- this will build for cortex-a8 with neon by default.&#xA;./build.sh ABI=armeabi # &amp;lt;-- this will build for arm1136j-s with softfp.&#xA;./build.sh ABI=armeabi-v7a FPU=vfpv3-d16 TUNE=cortex-a9 # &amp;lt;-- Xoom&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;生成 APK&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; ant debug&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;命令后会在bin文件夹下面生成 faplayer-debug.apk  **注**：如果提示build.xml文件过期，则可用如下命令修复&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; android update project -p .&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
			</item>
			<item>
				<title>三星 S5830i root</title>
				<link>https://blog.zhourunsheng.com/2012/05/%e4%b8%89%e6%98%9f-s5830i-root/</link>
				<pubDate>Sat, 26 May 2012 11:34:40 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/05/%e4%b8%89%e6%98%9f-s5830i-root/</guid>
				<description>&lt;p&gt;手机不root太不方便了，尤其三星手机内置了太多APP，给自己装APP的空间太小了，不够用，装几个工具软件就满了，木有办法，还是root吧，root以后调试程序也方便。&lt;/p&gt;&#xA;&lt;h2 id=&#34;root-过程&#34;&gt;root 过程&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;下载root刷机包：&lt;a href=&#34;http://carey-blog-image.googlecode.com/files/update.zip&#34;&gt;update.zip&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;不要解压直接将update.zip拷贝到SD卡根目录&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;adb push update.zip /mnt/sdcard/&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;关机后，同时按音量+键、HOME键（功能键）、开机键，出现三星的logo之后，同时放开，进入Recovery模式&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;用音量键上下移动选择：apply update from sdcard，按HOME键（功能键）进入SD卡目录，选择update.zip文件，再按HOME键盘确定更新，更新完成后重启&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;ol start=&#34;5&#34;&gt;&#xA;&lt;li&gt;重启后看到已经安装的授权管理程序，说明已经root成功&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;ol start=&#34;6&#34;&gt;&#xA;&lt;li&gt;使用豌豆夹或者SystemAPP卸载系统那些定制的内置APP&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;ol start=&#34;7&#34;&gt;&#xA;&lt;li&gt;自己装几个实用的APP，并将安装路径选择到SD卡上，这样舒服多了&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
			</item>
			<item>
				<title>Android 视频播放之流媒体解析</title>
				<link>https://blog.zhourunsheng.com/2012/05/android-%e8%a7%86%e9%a2%91%e6%92%ad%e6%94%be%e4%b9%8b%e6%b5%81%e5%aa%92%e4%bd%93%e8%a7%a3%e6%9e%90/</link>
				<pubDate>Tue, 22 May 2012 16:04:15 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/05/android-%e8%a7%86%e9%a2%91%e6%92%ad%e6%94%be%e4%b9%8b%e6%b5%81%e5%aa%92%e4%bd%93%e8%a7%a3%e6%9e%90/</guid>
				<description>&lt;p&gt;最近做的一个项目需求是要实现视频的边缓存边播放，还要能实现视频内部的跳转，实际来讲就是视频点播，只不过要通过http协议来实现，也即用户可以拖动seekbar跳转到播放指定时间点的视频，要实现这样的功能，那么就需要提前解析视频的关键信息，得到时间点对应的视频流的内部偏移量，这样当进行实际跳转的时候就能根据跳转的时间点转换到文件内部的偏移量，进而进行视频流内容的缓存下载。&lt;/p&gt;&#xA;&lt;p&gt;至于如何实现视频的边缓存边播放，可以参照我的博文《Android视频播放之边缓存边播放》和 《Android 视频播放之流媒体格式处理》，本文的目的是给大家展示怎么样进行视频数据流的解析.&lt;/p&gt;&#xA;&lt;h2 id=&#34;前期准备&#34;&gt;前期准备&lt;/h2&gt;&#xA;&lt;p&gt;依赖的第三方解析包 mp4parser，Google的项目地址为 &lt;a href=&#34;http://code.google.com/p/mp4parser/&#34;&gt;http://code.google.com/p/mp4parser/&lt;/a&gt;,它主要实现了mp4和其他格式媒体数据的解析，本文的解析代码就是依赖于它底层的数据解析，项目中有一个图形化界面的解析器，下载地址为&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://mp4parser.googlecode.com/files/isoviewer-2.0-RC-7.jar&#34;&gt;http://mp4parser.googlecode.com/files/isoviewer-2.0-RC-7.jar&lt;/a&gt;，可以通过它来查看视频文件的整体编码结构。&lt;/p&gt;&#xA;&lt;p&gt;通过在命令行执行&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;F:\workspace\mp4parser-read-only&amp;gt;java -jar isoviewer-2.0-RC-7.jar&#xA;&#xA;![](/wp-content/uploads/2012/05/parse_mp4.png)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;来启动程序，然后通过菜单的File导入需要解析的视频文件就好了截图如下：本文代码依赖的jar包如下：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://carey-blog-image.googlecode.com/files/aspectjrt.jar&#34;&gt;http://carey-blog-image.googlecode.com/files/aspectjrt.jar&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://carey-blog-image.googlecode.com/files/isoparser-1.0-RC-6-20120510.091755-1.jar&#34;&gt;http://carey-blog-image.googlecode.com/files/isoparser-1.0-RC-6-20120510.091755-1.jar&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;关键代码解析&#34;&gt;关键代码解析&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;计算视频的总时长&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;视频的总时间轴 Duration 除以时间轴的比例 Timescale，结果就是当前视频的总秒数&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;lengthInSeconds = (double) isoFile.getMovieBox().getMovieHeaderBox().getDuration() / isoFile.getMovieBox().getMovieHeaderBox().getTimescale();&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;获取音频和视频的box数据&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;一般的流媒体数据有两个TrackBox，第一个为音频，第二个为视频&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;List&amp;lt;TrackBox&amp;gt; trackBoxes = isoFile.getMovieBox().getBoxes(TrackBox.class);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;解析视频的box数据&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;取得关键帧的信息，因为视频的跳转只能在关键帧之间跳转，所以我们需要重点关注关键帧对应的时间点&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Iterator&amp;lt;TrackBox&amp;gt; iterator = trackBoxes.iterator();&#xA;&#xA;SampleTableBox stbl = null;&#xA;TrackBox trackBox = null;&#xA;while (iterator.hasNext()) {&#xA;  trackBox = iterator.next();&#xA;  stbl = trackBox.getMediaBox().getMediaInformationBox().getSampleTableBox();&#xA;  // 我们只处理视频的关键帧，音频数据略过&#xA;  if (stbl.getSyncSampleBox() != null) {&#xA;    syncSamples = stbl.getSyncSampleBox().getSampleNumber();&#xA;    syncSamplesSize = new long[syncSamples.length];&#xA;    syncSamplesOffset = new long[syncSamples.length];&#xA;    timeOfSyncSamples = new double[syncSamples.length];&#xA;    break;&#xA;  }&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;获取视频box中内部的详细参数&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;包括帧与时间的对应关系，即每一帧对应视频的时间点是第几秒，帧与chunk的对应关系，mp4为了进行视频的压缩，都是把一系列连续的帧放到一个chunk中，每个chunk中帧的数量不等，chunk与数据流文件偏移的关系，即每个chunk对应的视频流数据在文件的具体偏移位置。&lt;/p&gt;</description>
			</item>
			<item>
				<title>谷歌搜索</title>
				<link>https://blog.zhourunsheng.com/search/</link>
				<pubDate>Sat, 19 May 2012 17:35:23 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/search/</guid>
				<description>&lt;p&gt;谷歌搜索&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android 视频播放之流媒体格式处理</title>
				<link>https://blog.zhourunsheng.com/2012/05/android-%e8%a7%86%e9%a2%91%e6%92%ad%e6%94%be%e4%b9%8b%e6%b5%81%e5%aa%92%e4%bd%93%e6%a0%bc%e5%bc%8f%e5%a4%84%e7%90%86/</link>
				<pubDate>Sat, 19 May 2012 16:13:59 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/05/android-%e8%a7%86%e9%a2%91%e6%92%ad%e6%94%be%e4%b9%8b%e6%b5%81%e5%aa%92%e4%bd%93%e6%a0%bc%e5%bc%8f%e5%a4%84%e7%90%86/</guid>
				<description>&lt;h2 id=&#34;格式编码&#34;&gt;格式编码&lt;/h2&gt;&#xA;&lt;p&gt;项目的需求要实现流媒体的播放，简言之就是视频可以支持边下载边播放。鉴于MP4/h.264编码的优势，视频采用MP4文件格式存储，因为mp4只是一个存储的规范，像国内的优酷主要采用flv文件格式，其内部也是MP4编码，flv是 Adobe 支持的格式，这样的话，不论是在网站端，通过pc浏览器浏览，借助于 Flash Player，还是手持设备，借助于 ffmpeg 的解码库，都能实现视频的无缝播放，算是一个比较完美的解决方案。&lt;/p&gt;&#xA;&lt;p&gt;在实际视频的处理中，发现一个问题，利用Android手机自己拍摄录制的视频，可以完美支持边下载边播放，通过Iphone手机录制的视频，然后转码成mp4格式的视频就不能支持边下载边播放了，问题困扰了两三天，没办法，开始研究mp4的存储格式，最后终于找到了问题的所在。&lt;/p&gt;&#xA;&lt;p&gt;了解mp4格式的应该知道，mp4是采用一种box数据结构来存储视频数据的，理想的情况是，box的顺序为ftyp，moov，free和mdat，通过moov的解析就能获取该视频的关键信息，比如播放时长，关键帧数，sample存储情况，在mdat中对应的编码数据偏移量等等。这样只要视频缓存完头部信息，即moov之后，就能知道当前视频的关键数据了，随着mdat的逐渐下载，就能完美实现视频的边缓存边播放，具体的实例教程请参见我的博文《Android视频播放之边缓存边播放》。&lt;/p&gt;&#xA;&lt;p&gt;但是通过第三方软件的编码转换，有的就把moov放置到mdat之后了，这样只有把视频全部下载完成之后才能获取该视频的关键信息，才能开始播放，理论上也就没法实现视频的边缓存边播放，找到问题的关键点之后，就开始寻找解决办法，终于找到qt-faststart，它能解析原视频格式，并将moov信息尽可能的提前，这样就能及早解析和播放视频了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;格式转换&#34;&gt;格式转换&lt;/h2&gt;&#xA;&lt;p&gt;下载地址：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://notboring.org/downloads/video/qt-faststart.zip&#34;&gt;qt-faststart.exe binary for Windows&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/danielgtaylor/qtfaststart&#34;&gt;qt-faststart written in Python&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://renaun.com/blog/code/qtindexswapper/&#34;&gt;qtindexswapper written for Adobe AIR&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;我使用的是window的客户端，使用命令如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Usage: qt-faststart （转换前的视频文件） (转换后的视频文件)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;参考文章&#34;&gt;参考文章&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.stoimen.com/blog/2010/11/12/how-to-make-mp4-progressive-with-qt-faststart/&#34;&gt;how-to-make-mp4-progressive-with-qt-faststart&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://multimedia.cx/eggs/improving-qt-faststart/&#34;&gt;improving-qt-faststart&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.chinaunicom.com.cn/upload/1287474923316.pdf&#34;&gt;移动流媒体协议综述&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
			</item>
			<item>
				<title>Android视频播放之边缓存边播放</title>
				<link>https://blog.zhourunsheng.com/2012/05/android%e8%a7%86%e9%a2%91%e6%92%ad%e6%94%be%e4%b9%8b%e8%be%b9%e7%bc%93%e5%ad%98%e8%be%b9%e6%92%ad%e6%94%be/</link>
				<pubDate>Sun, 13 May 2012 17:23:00 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/05/android%e8%a7%86%e9%a2%91%e6%92%ad%e6%94%be%e4%b9%8b%e8%be%b9%e7%bc%93%e5%ad%98%e8%be%b9%e6%92%ad%e6%94%be/</guid>
				<description>&lt;p&gt;最近在做Android视频播放的有关项目，其中有一项需求就是要求视频可以边加载缓存边播放，类似于优酷土豆的视频点播。网上找了一些相关的资料，比较了每种视频格式的优缺点之后，结合Android手机自身的优势，默认支持mp4编码和解码，最终采用mp4格式作为视频的存储格式。&lt;/p&gt;&#xA;&lt;p&gt;其实最真实的流媒体协议传输格式并不是普通的http方式，而是rtsp，那样的话得搭建专门的流媒体服务器，成本比较高，采用普通的http方式，实现的是一种伪流媒体传输，但是对于常用的视频缓存播放也足够了。&lt;/p&gt;&#xA;&lt;p&gt;要想实现视频的边缓存边播放，原则上就要求视频的存储格式是分段的，而mp4正好满足这个要求，只要将mp4的整体视频信息放在mp4文件的开头，这样只要加载了mp4文件的头部之后，就能解析出该mp4文件的时长，比特率等等，为后续的视频缓存做初始化设置，然后每加载一段mp4文件的数据流，通过解析头部来或得当前视频流的帧信息，并在播放器中播放，这样就能先加载一段进行播放，同时缓存后续的一段，依此原理就能实现。&lt;/p&gt;&#xA;&lt;p&gt;本文的目的就是给大家介绍一种以此原理而开发一个Android视频边缓存边播放的示例，通过该示例的学习，相信大家能对该原理有更深入的理解。&lt;/p&gt;&#xA;&lt;p&gt;在介绍具体的demo之前，先放上几张截图，分别为视频播放前的缓存，视频边缓存边播放，缓存完毕的视频播放。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2012/05/jiazaiqian.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2012/05/bofangzhong.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2012/05/jiazaiwanbi.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;代码解析&#34;&gt;代码解析&lt;/h2&gt;&#xA;&lt;p&gt;VideoViewDemo.java 主要是用来设置启动参数，设定网络视频的url地址和本地缓存的地址，本地缓存的地址可以不设置，程序会自己维护，如果您自己设置了，视频就会缓存到该位置。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;public class VideoViewDemo extends Activity {&#xA;    @Override&#xA;    public void onCreate(Bundle icicle) {&#xA;    super.onCreate(icicle);&#xA;&#xA;    //String url = &amp;#34;http://carey-blog-image.googlecode.com/files/vid_20120510_090204.mp4&amp;#34;;&#xA;    String url = &amp;#34;http://bbfile.b0.upaiyun.com/data/videos/2/vid_20120510_090204.mp4&amp;#34;;&#xA;&#xA;    Intent intent = new Intent();&#xA;    intent.setClass(VideoViewDemo.this, BBVideoPlayer.class);&#xA;    intent.putExtra(&amp;#34;url&amp;#34;, url);&#xA;    intent.putExtra(&amp;#34;cache&amp;#34;,&#xA;            Environment.getExternalStorageDirectory().getAbsolutePath()&#xA;                    + &amp;#34;/VideoCache/&amp;#34; + System.currentTimeMillis() + &amp;#34;.mp4&amp;#34;);&#xA;    startActivity(intent);&#xA;}&#xA;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;BBVideoPlayer.java 就是视频缓存的核心了，READY BUFF定义了初始缓存区的大小，当视频加载到初始缓存区满的时候，播放器开始播放，CACHE&lt;/p&gt;&#xA;&lt;p&gt;BUFF则是核心交换缓存区，主要是用来动态调节缓存区，当网络环境较好的时候，该缓存区为初始大小，当网络环境差的时候，该缓存区会动态增加，主要就是为了避免视频播放的时候出现一卡一卡的现象。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;public class BBVideoPlayer extends Activity {&#xA;&#xA;private VideoView mVideoView;&#xA;private TextView tvcache;&#xA;private String remoteUrl;&#xA;private String localUrl;&#xA;private ProgressDialog progressDialog = null;&#xA;&#xA;private static final int READY_BUFF = 2000 * 1024;&#xA;private static final int CACHE_BUFF = 500 * 1024;&#xA;&#xA;private boolean isready = false;&#xA;private boolean iserror = false;&#xA;private int errorCnt = 0;&#xA;private int curPosition = 0;&#xA;private long mediaLength = 0;&#xA;private long readSize = 0;&#xA;&#xA;@Override&#xA;protected void onCreate(Bundle savedInstanceState) {&#xA;    super.onCreate(savedInstanceState);&#xA;    setContentView(R.layout.bbvideoplayer);&#xA;&#xA;    findViews();&#xA;    init();&#xA;    playvideo();&#xA;}&#xA;&#xA;private void findViews() {&#xA;    this.mVideoView = (VideoView) findViewById(R.id.bbvideoview);&#xA;    this.tvcache = (TextView) findViewById(R.id.tvcache);&#xA;}&#xA;&#xA;private void init() {&#xA;    Intent intent = getIntent();&#xA;&#xA;    this.remoteUrl = intent.getStringExtra(&amp;#34;url&amp;#34;);&#xA;    System.out.println(&amp;#34;remoteUrl: &amp;#34; + remoteUrl);&#xA;&#xA;    if (this.remoteUrl == null) {&#xA;        finish();&#xA;        return;&#xA;    }&#xA;&#xA;    this.localUrl = intent.getStringExtra(&amp;#34;cache&amp;#34;);&#xA;&#xA;    mVideoView.setMediaController(new MediaController(this));&#xA;&#xA;    mVideoView.setOnPreparedListener(new OnPreparedListener() {&#xA;&#xA;        public void onPrepared(MediaPlayer mediaplayer) {&#xA;            dismissProgressDialog();&#xA;            mVideoView.seekTo(curPosition);&#xA;            mediaplayer.start();&#xA;        }&#xA;    });&#xA;&#xA;    mVideoView.setOnCompletionListener(new OnCompletionListener() {&#xA;&#xA;        public void onCompletion(MediaPlayer mediaplayer) {&#xA;            curPosition = 0;&#xA;            mVideoView.pause();&#xA;        }&#xA;    });&#xA;&#xA;    mVideoView.setOnErrorListener(new OnErrorListener() {&#xA;&#xA;        public boolean onError(MediaPlayer mediaplayer, int i, int j) {&#xA;            iserror = true;&#xA;            errorCnt++;&#xA;            mVideoView.pause();&#xA;            showProgressDialog();&#xA;            return true;&#xA;        }&#xA;    });&#xA;}&#xA;&#xA;private void showProgressDialog() {&#xA;    mHandler.post(new Runnable() {&#xA;&#xA;        @Override&#xA;        public void run() {&#xA;            if (progressDialog == null) {&#xA;                progressDialog = ProgressDialog.show(BBVideoPlayer.this,&#xA;                        &amp;#34;视频缓存&amp;#34;, &amp;#34;正在努力加载中 ...&amp;#34;, true, false);&#xA;            }&#xA;        }&#xA;    });&#xA;}&#xA;&#xA;private void dismissProgressDialog() {&#xA;    mHandler.post(new Runnable() {&#xA;&#xA;        @Override&#xA;        public void run() {&#xA;            if (progressDialog != null) {&#xA;                progressDialog.dismiss();&#xA;                progressDialog = null;&#xA;            }&#xA;        }&#xA;    });&#xA;}&#xA;&#xA;private void playvideo() {&#xA;    if (!URLUtil.isNetworkUrl(this.remoteUrl)) {&#xA;        mVideoView.setVideoPath(this.remoteUrl);&#xA;        mVideoView.start();&#xA;        return;&#xA;    }&#xA;&#xA;    showProgressDialog();&#xA;&#xA;    new Thread(new Runnable() {&#xA;&#xA;        @Override&#xA;        public void run() {&#xA;            FileOutputStream out = null;&#xA;            InputStream is = null;&#xA;&#xA;            try {&#xA;                URL url = new URL(remoteUrl);&#xA;                HttpURLConnection httpConnection = (HttpURLConnection) url&#xA;                        .openConnection();&#xA;&#xA;                if (localUrl == null) {&#xA;                    localUrl = Environment.getExternalStorageDirectory()&#xA;                            .getAbsolutePath()&#xA;                            + &amp;#34;/VideoCache/&amp;#34;&#xA;                            + System.currentTimeMillis() + &amp;#34;.mp4&amp;#34;;&#xA;                }&#xA;&#xA;                System.out.println(&amp;#34;localUrl: &amp;#34; + localUrl);&#xA;&#xA;                File cacheFile = new File(localUrl);&#xA;&#xA;                if (!cacheFile.exists()) {&#xA;                    cacheFile.getParentFile().mkdirs();&#xA;                    cacheFile.createNewFile();&#xA;                }&#xA;&#xA;                readSize = cacheFile.length();&#xA;                out = new FileOutputStream(cacheFile, true);&#xA;&#xA;                httpConnection.setRequestProperty(&amp;#34;User-Agent&amp;#34;, &amp;#34;NetFox&amp;#34;);&#xA;                httpConnection.setRequestProperty(&amp;#34;RANGE&amp;#34;, &amp;#34;bytes=&amp;#34;&#xA;                        + readSize + &amp;#34;-&amp;#34;);&#xA;&#xA;                is = httpConnection.getInputStream();&#xA;&#xA;                mediaLength = httpConnection.getContentLength();&#xA;                if (mediaLength == -1) {&#xA;                    return;&#xA;                }&#xA;&#xA;                mediaLength += readSize;&#xA;&#xA;                byte buf[] = new byte[4 * 1024];&#xA;                int size = 0;&#xA;                long lastReadSize = 0;&#xA;&#xA;                mHandler.sendEmptyMessage(VIDEO_STATE_UPDATE);&#xA;&#xA;                while ((size = is.read(buf)) != -1) {&#xA;                    try {&#xA;                        out.write(buf, 0, size);&#xA;                        readSize += size;&#xA;                    } catch (Exception e) {&#xA;                        e.printStackTrace();&#xA;                    }&#xA;&#xA;                    if (!isready) {&#xA;                        if ((readSize - lastReadSize) &amp;gt; READY_BUFF) {&#xA;                            lastReadSize = readSize;&#xA;                            mHandler.sendEmptyMessage(CACHE_VIDEO_READY);&#xA;                        }&#xA;                    } else {&#xA;                        if ((readSize - lastReadSize) &amp;gt; CACHE_BUFF&#xA;                                * (errorCnt + 1)) {&#xA;                            lastReadSize = readSize;&#xA;                            mHandler.sendEmptyMessage(CACHE_VIDEO_UPDATE);&#xA;                        }&#xA;                    }&#xA;                }&#xA;&#xA;                mHandler.sendEmptyMessage(CACHE_VIDEO_END);&#xA;            } catch (Exception e) {&#xA;                e.printStackTrace();&#xA;            } finally {&#xA;                if (out != null) {&#xA;                    try {&#xA;                        out.close();&#xA;                    } catch (IOException e) {&#xA;                        //&#xA;                    }&#xA;                }&#xA;&#xA;                if (is != null) {&#xA;                    try {&#xA;                        is.close();&#xA;                    } catch (IOException e) {&#xA;                        //&#xA;                    }&#xA;                }&#xA;            }&#xA;&#xA;        }&#xA;    }).start();&#xA;&#xA;}&#xA;&#xA;private final static int VIDEO_STATE_UPDATE = 0;&#xA;private final static int CACHE_VIDEO_READY = 1;&#xA;private final static int CACHE_VIDEO_UPDATE = 2;&#xA;private final static int CACHE_VIDEO_END = 3;&#xA;&#xA;private final Handler mHandler = new Handler() {&#xA;    @Override&#xA;    public void handleMessage(Message msg) {&#xA;        switch (msg.what) {&#xA;        case VIDEO_STATE_UPDATE:&#xA;            double cachepercent = readSize * 100.00 / mediaLength * 1.0;&#xA;            String s = String.format(&amp;#34;已缓存: [%.2f%%]&amp;#34;, cachepercent);&#xA;&#xA;            if (mVideoView.isPlaying()) {&#xA;                curPosition = mVideoView.getCurrentPosition();&#xA;                int duration = mVideoView.getDuration();&#xA;                duration = duration == 0 ? 1 : duration;&#xA;&#xA;                double playpercent = curPosition * 100.00 / duration * 1.0;&#xA;&#xA;                int i = curPosition / 1000;&#xA;                int hour = i / (60 * 60);&#xA;                int minute = i / 60 % 60;&#xA;                int second = i % 60;&#xA;&#xA;                s += String.format(&amp;#34; 播放: %02d:%02d:%02d [%.2f%%]&amp;#34;, hour,&#xA;                        minute, second, playpercent);&#xA;            }&#xA;&#xA;            tvcache.setText(s);&#xA;&#xA;            mHandler.sendEmptyMessageDelayed(VIDEO_STATE_UPDATE, 1000);&#xA;            break;&#xA;&#xA;        case CACHE_VIDEO_READY:&#xA;            isready = true;&#xA;            mVideoView.setVideoPath(localUrl);&#xA;            mVideoView.start();&#xA;            break;&#xA;&#xA;        case CACHE_VIDEO_UPDATE:&#xA;            if (iserror) {&#xA;                mVideoView.setVideoPath(localUrl);&#xA;                mVideoView.start();&#xA;                iserror = false;&#xA;            }&#xA;            break;&#xA;&#xA;        case CACHE_VIDEO_END:&#xA;            if (iserror) {&#xA;                mVideoView.setVideoPath(localUrl);&#xA;                mVideoView.start();&#xA;                iserror = false;&#xA;            }&#xA;            break;&#xA;        }&#xA;&#xA;        super.handleMessage(msg);&#xA;    }&#xA;};&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;总体来说，原理比较简单，就是把视频加载了一段后，就送到播放器播放，如果出现了错误，则优先缓存一部分文件，然后再继续播放，类似的处理过程循环往复。&lt;/p&gt;</description>
			</item>
			<item>
				<title>服务器端API设计之JSONP</title>
				<link>https://blog.zhourunsheng.com/2012/04/%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%ab%afapi%e8%ae%be%e8%ae%a1%e4%b9%8bjsonp/</link>
				<pubDate>Wed, 18 Apr 2012 15:38:26 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/04/%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%ab%afapi%e8%ae%be%e8%ae%a1%e4%b9%8bjsonp/</guid>
				<description>&lt;p&gt;最近设计项目的服务器端API，起初的设想是客户端采用XML的格式发送数据，然后服务器端返回JSON格式的数据，中间的通信过程采用JS的Ajax机制。&lt;/p&gt;&#xA;&lt;p&gt;项目初步测试也已通过，功能实现上面倒是没有问题，唯一的缺点就是AJax的跨域通信，想了解更多的关于json，jsonp，ajax和跨域通信的知识可以参照下面的网址：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://zh.wikipedia.org/zh/JSONP&#34;&gt;http://zh.wikipedia.org/zh/JSONP&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://zh.wikipedia.org/zh/JSON&#34;&gt;http://zh.wikipedia.org/zh/JSON&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://zh.wikipedia.org/zh/AJAX&#34;&gt;http://zh.wikipedia.org/zh/AJAX&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;现在准备花一点时间，把基于json通信的代码全部迁移为基于jsonp通信，这样就能彻底解决了跨域通信的问题，也更方便API的编写，做了调查和了解之后，发现其实代码的改动非常小，示例代码如下：服务器端的代码：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;客户端传入的xml文件的解析&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;private function parseInputData()&#xA;{&#xA;    $params = array();&#xA;    if ( $_SERVER[&amp;#39;REQUEST_METHOD&amp;#39;] === &amp;#39;POST&amp;#39; )&#xA;    {&#xA;        $input = trim(file_get_contents(&amp;#39;php://input&amp;#39;));&#xA;        import(&amp;#34;@.ORG.Util&amp;#34;);&#xA;        $params = xml_to_array($input);&#xA;    } else {&#xA;        $input = trim($_REQUEST[&amp;#39;params&amp;#39;]);&#xA;        import(&amp;#34;@.ORG.Util&amp;#34;);&#xA;        $params = xml_to_array($input);&#xA;   }&#xA;   return $params;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;给客户端返回json/jsonp格式的处理数据&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;if(strtoupper($type)==&amp;#39;JSON&amp;#39;) {&#xA;   if (isset($_REQUEST[&amp;#39;callback&amp;#39;])) {&#xA;      // 返回JSONP数据格式到客户端&#xA;      header(&amp;#39;Content-Type:text/javascript; charset=utf-8&amp;#39;);&#xA;      exit($_REQUEST[&amp;#39;callback&amp;#39;] . &amp;#39;(&amp;#39; . json_encode($result) . &amp;#39;);&amp;#39;);&#xA;   } else {&#xA;     // 返回JSON数据格式到客户端&#xA;     header(&amp;#39;Content-Type: application/x-json; charset=utf-8&amp;#39;);&#xA;     exit(json_encode($result));&#xA;   }&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;客户端的代码：&lt;/p&gt;</description>
			</item>
			<item>
				<title>利用GitHub Pages安装部署Octopress博客</title>
				<link>https://blog.zhourunsheng.com/2012/04/%e5%88%a9%e7%94%a8github-pages%e5%ae%89%e8%a3%85%e9%83%a8%e7%bd%b2octopress%e5%8d%9a%e5%ae%a2/</link>
				<pubDate>Sun, 15 Apr 2012 19:59:49 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/04/%e5%88%a9%e7%94%a8github-pages%e5%ae%89%e8%a3%85%e9%83%a8%e7%bd%b2octopress%e5%8d%9a%e5%ae%a2/</guid>
				<description>&lt;p&gt;周末闲来无事，学习了一下怎样利用github pages来建立自己的博客，现在比较成熟的博客系统是 Octopress，关于其详细的介绍可以参见官方文档，本文建立的博客页面已经绑定到了 zhourunsheng.com 域名，可以查看博客的效果！&lt;/p&gt;&#xA;&lt;h2 id=&#34;1-github-page-的建立&#34;&gt;1. github page 的建立&lt;/h2&gt;&#xA;&lt;p&gt;要想在github上面建立自己的博客，首先需要建立page，可以参考官方的文档 &lt;a href=&#34;http://help.github.com/pages/&#34;&gt;http://help.github.com/pages/&lt;/a&gt;，简单来说，比如我的github账户名称是careychow，那么需要建立一个 careychow.github.com 的 repository，将博客的静态页面上传到该repository的master分支中，当通过浏览器访问 &lt;a href=&#34;http://careychow.github.com&#34;&gt;http://careychow.github.com&lt;/a&gt;的时候，github服务器就会将其中博客页面展示出来。&lt;/p&gt;&#xA;&lt;h2 id=&#34;2-搭建-octopress-本地环境&#34;&gt;2. 搭建 Octopress 本地环境&lt;/h2&gt;&#xA;&lt;p&gt;linux 环境的搭建可以参见官方文档 &lt;a href=&#34;http://octopress.org/docs/setup/&#34;&gt;http://octopress.org/docs/setup/&lt;/a&gt;因为我自己通常都在win7下面办公，所以下面介绍一下win7环境下 Octopress 的搭建和部署 a. 安装 git，下载地址：msysgit，最新版本 Git-1.7.10-preview20120409.exe，详细参见 &lt;a href=&#34;http://help.github.com/win-set-up-git/b&#34;&gt;http://help.github.com/win-set-up-git/b&lt;/a&gt;.安装 ruby，下载地址:RubyInstaller，安装版本 rubyinstaller-1.9.2-p290.exe，注意版本是1.9.2 c. 安装gem编译环境，下载地址：DevKit-tdm-32-4.5.2-20111229-1559-sfx.exe，下载完成后，将其解压到如 E:\DevKit，然后在win的cmd窗口中执行如下命令进行安装：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cd E:\DevKit&#xA;ruby dk.rb init&#xA;ruby dk.rb instal&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;e. 安装python，下载地址：activepython，安装2.7版，主要是博客代码加亮模块需要python环境的支持，安装完以后，在win的cmd窗口中执行：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; easy_install pygments &#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;3-更新配置&#34;&gt;3. 更新配置&lt;/h2&gt;&#xA;&lt;p&gt;a. 中文 utf-8 编码的支持，在win7环境变量中配置如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;LANG=zh_CN.UTF-8&#xA;LC_ALL=zh_CN.UTF-8&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;b. 变更 gem 的更新源，ruby的官方更新源经常被河蟹，木有办法，幸亏国内有淘宝做好事，提供了国内的更新源，这样速度就快多了，变更如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;gem sources --remove http://rubygems.org/&#xA;gem sources -a http://ruby.taobao.org/&#xA;gem sources -l&#xA;注意 ：请确保只有 http://ruby.taobao.org/ 唯一一个条目&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;c. 安装 rdoc 和 bundler&lt;/p&gt;</description>
			</item>
			<item>
				<title>资源收集之优秀代码片段分享网站</title>
				<link>https://blog.zhourunsheng.com/2012/04/%e8%b5%84%e6%ba%90%e6%94%b6%e9%9b%86%e4%b9%8b%e4%bc%98%e7%a7%80%e4%bb%a3%e7%a0%81%e7%89%87%e6%ae%b5%e5%88%86%e4%ba%ab%e7%bd%91%e7%ab%99/</link>
				<pubDate>Fri, 13 Apr 2012 17:16:06 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/04/%e8%b5%84%e6%ba%90%e6%94%b6%e9%9b%86%e4%b9%8b%e4%bc%98%e7%a7%80%e4%bb%a3%e7%a0%81%e7%89%87%e6%ae%b5%e5%88%86%e4%ba%ab%e7%bd%91%e7%ab%99/</guid>
				<description>&lt;p&gt;本文分享一些优秀代码片段的网络资源，不论是设计师，还是开发人员，相信能从这些优秀的代码片段中找到一些灵感，同时使用最少的代码来解决熟悉的问题，这些网址是从国外文章《Awesome sites to find useful code snippets》分享过来的。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2012/05/CatsWhoCode%20snippet%20library.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;catswhocode-snippet-library&#34;&gt;&lt;a href=&#34;http://www.catswhocode.com/blog/snippets&#34;&gt;CatsWhoCode snippet library&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Some of you already know it, but a few weeks ago I’ve created a snippet library with a picky selection of usefull snippets focused on web development:PHP, JavaScript, CSS, htaccess&lt;/p&gt;&#xA;&lt;p&gt;… Approximately one new snippet is published every day. Users are welcome to submit their own snippets.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2012/05/Snipplr.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;snipplr&#34;&gt;&lt;a href=&#34;http://snipplr.com/&#34;&gt;Snipplr&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Snipplr is probably the largest code snippet repository&lt;/p&gt;&#xA;&lt;p&gt;available on the internet. Since 5 years, they have published thousand of pieces of code. Some snippets are super useful, some other not so, but there’s a strong chance that you’ll find what you need on a website with so many snippets.&lt;/p&gt;</description>
			</item>
			<item>
				<title>关于PhoneGap视频插件的代码更新</title>
				<link>https://blog.zhourunsheng.com/2012/04/%e5%85%b3%e4%ba%8ephonegap%e8%a7%86%e9%a2%91%e6%8f%92%e4%bb%b6%e7%9a%84%e4%bb%a3%e7%a0%81%e6%9b%b4%e6%96%b0/</link>
				<pubDate>Fri, 13 Apr 2012 14:55:35 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/04/%e5%85%b3%e4%ba%8ephonegap%e8%a7%86%e9%a2%91%e6%8f%92%e4%bb%b6%e7%9a%84%e4%bb%a3%e7%a0%81%e6%9b%b4%e6%96%b0/</guid>
				<description>&lt;p&gt;本文主要介绍PhoneGap视频插件的代码更新，具体插件的开发过程请参照我以前的博文《phonegap之android端插件开发》。现在PhoneGap已经把代码移交到apache开源项目cordova里面，本文代码的更新主要涉及到两项，一是把以前phoneGap的引用迁移到cordova的引用中，二是在原来插件代码的基础上增加回调机制。&lt;/p&gt;&#xA;&lt;p&gt;以前版本的视频插件可以在android设备上面正常工作，但是有一个潜在的问题，因为插件启动视频播放利用的是 “startActivity”方法，无法获取到视频播放结束的消息，本次代码的主要改进就是改变原来启动视频播放的函数，使用“startActivityForResult”方法，这样当视频播放结束的时候，“onActivityResult”方法会被回调，从而该插件就能正确通知插件使用者视频已正常播放结束，可以继续处理其他流程。&lt;/p&gt;&#xA;&lt;p&gt;Java 端的完整代码如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;package com.dlgreat.bbhtml.plugins;&#xA;&#xA;import org.apache.cordova.api.Plugin;&#xA;import org.apache.cordova.api.PluginResult;&#xA;import org.json.JSONArray;&#xA;import org.json.JSONException;&#xA;&#xA;import android.content.Intent;&#xA;import android.net.Uri;&#xA;&#xA;public class VideoPlayer extends Plugin {&#xA;&#xA;private String callbackId;&#xA;&#xA;@Override&#xA;public PluginResult execute(String action, JSONArray args, String callbackId) {&#xA;   this.callbackId = callbackId;&#xA;   PluginResult.Status status = PluginResult.Status.OK;&#xA;   String result = &amp;#34;&amp;#34;;&#xA;&#xA;   try {&#xA;       if (action.equals(&amp;#34;playVideo&amp;#34;)) {&#xA;           playVideo(args.getString(0));&#xA;&#xA;           PluginResult res = new PluginResult(PluginResult.Status.NO_RESULT);&#xA;           res.setKeepCallback(true);&#xA;           return res;&#xA;       }&#xA;&#xA;       return new PluginResult(status, result);&#xA;   } catch (JSONException e) {&#xA;       return new PluginResult(PluginResult.Status.JSON_EXCEPTION);&#xA;   }&#xA;}&#xA;&#xA;private void playVideo(String url) {&#xA;    Uri uri = Uri.parse(url);&#xA;    Intent intent = new Intent(Intent.ACTION_VIEW);&#xA;    intent.setDataAndType(uri, &amp;#34;video/*&amp;#34;);&#xA;&#xA;    this.ctx.startActivityForResult(this, intent, 0);&#xA;}&#xA;&#xA;@Override&#xA;public void onActivityResult(int requestCode, int resultCode, Intent intent) {&#xA;  if (requestCode == 0) {&#xA;     success(new PluginResult(PluginResult.Status.OK, &amp;#34;&amp;#34;), callbackId);&#xA;  }&#xA;}&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Javascript端的完整代码如下：&lt;/p&gt;</description>
			</item>
			<item>
				<title>文章归档</title>
				<link>https://blog.zhourunsheng.com/archives/</link>
				<pubDate>Tue, 10 Apr 2012 14:09:43 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/archives/</guid>
				<description></description>
			</item>
			<item>
				<title>Sencha Touch 程序设计之 Android 平台 Back 按键处理</title>
				<link>https://blog.zhourunsheng.com/2012/04/sencha-touch-%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1%e4%b9%8b-android-%e5%b9%b3%e5%8f%b0-back-%e6%8c%89%e9%94%ae%e5%a4%84%e7%90%86/</link>
				<pubDate>Mon, 09 Apr 2012 15:23:40 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/04/sencha-touch-%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1%e4%b9%8b-android-%e5%b9%b3%e5%8f%b0-back-%e6%8c%89%e9%94%ae%e5%a4%84%e7%90%86/</guid>
				<description>&lt;p&gt;利用 Sencha Touch 结合PhoneGap设计本地APP，免不了要分别处理android平台和iphone平台，两个平台的最大区别之一就是back键的处理。iphone平台没有back按键，只有home按键，按下该键的话程序会自动转入后台处理，该按键的效用等同于android平台的home按键，但是，android平台特殊的地方在于，它还有一个back键，熟悉了android平台的开发者或使用者，把该键的作用理解为退回程序的上一个页面，如果程序已经在主页面，此时则退出程序。&lt;/p&gt;&#xA;&lt;p&gt;因为Sencha Touch对android平台进行了消息封装，默认对back键的处理，同home键的处理一致，这令很多android开发者或使用者使用其功能的话不太友好，我自己在调试程序的过程中就误操作过了N次，每次按下back键期望程序回退到上一个页面，没想到程序直接消失了，转到后台去了。&lt;/p&gt;&#xA;&lt;p&gt;网上搜索了一些解决方案，各有利弊，汇总贴可参照Sencha Touch官方论坛《Why-can-t-I-control-Android-phone-s-hardware-Back-button-in-Sencha-with-PhoneGap》，下面介绍一下我设计的一个解决方案，在实测环境中工作良好，总结如下：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;首先在Sencha 启动代码中捕获android平台的back按键消息，阻止Sencha 框架的默认处理&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;var App = new Ext.application({&#xA; // ... APP 配置参数&#xA;&#xA; launch : function () {&#xA;  // ... 界面初始化&#xA;   BBGlobalData.mainPanel = Ext.create(&amp;#39;Ext.Panel&amp;#39;, {&#xA;       fullscreen: true,&#xA;       layout : &amp;#39;card&amp;#39;,&#xA;       cardAnimation : &amp;#39;slide&amp;#39;,&#xA;       items: [&#xA;           Ext.create(&amp;#39;BBShow.view.LoginPanel&amp;#39;),&#xA;           Ext.create(&amp;#39;BBShow.view.HomePanel&amp;#39;),&#xA;           Ext.create(&amp;#39;BBShow.view.MediaPanel&amp;#39;),&#xA;           Ext.create(&amp;#39;BBShow.view.PicCarousel&amp;#39;),&#xA;           Ext.create(&amp;#39;BBShow.view.ReportListPanel&amp;#39;),&#xA;           Ext.create(&amp;#39;BBShow.view.ReportPanel&amp;#39;),&#xA;       ]&#xA;   });&#xA;&#xA;   Ext.Viewport.add(BBGlobalData.mainPanel);&#xA;&#xA;   document.addEventListener(&amp;#39;deviceready&amp;#39;, function () {&#xA;     console.log(&amp;#39;deviceready&amp;#39;);&#xA;     document.addEventListener(&amp;#34;backbutton&amp;#34;, function () {&#xA;           console.log(&amp;#39;user presses the back button on Android&amp;#39;);&#xA;           // 获取当前的焦点页面，并发送自定义消息&amp;#39;back&amp;#39;&#xA;           BBGlobalData.mainPanel.getActiveItem().fireEvent(&amp;#39;back&amp;#39;);&#xA;    }, false);&#xA;  }, false);&#xA;}&#xA;})&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;在子页面中注册back消息的监听器&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/*定义登录面板*/&#xA;Ext.define(&amp;#39;BBShow.view.LoginPanel&amp;#39;, {&#xA;extend: &amp;#39;Ext.Panel&amp;#39;,&#xA;&#xA;    config: {&#xA;      items: [&#xA;      {&#xA;        xtype: &amp;#39;titlebar&amp;#39;,&#xA;        docked: &amp;#39;top&amp;#39;,&#xA;        title: &amp;#39;用户登录&amp;#39;&#xA;      },&#xA;      // 其他页面内容&#xA;     ],&#xA;    listeners: [&#xA;     {&#xA;      fn: &amp;#39;onBack&amp;#39;,&#xA;      event: &amp;#39;back&amp;#39;, //注册监听自定义back按键消息&#xA;     }&#xA;    ]&#xA;  },&#xA;&#xA;  onBack: function() {&#xA;    //BBGlobalData.gotoHomePanel(); //如，跳转到其他页面&#xA;    BBGlobalData.exitApp(); //或退出程序&#xA;  },&#xA;});&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;实现退出程序的处理，借助于PhoneGap&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;   BBGlobalData.exitApp = function() {&#xA;   navigator.app.exitApp();&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;实现页面跳转的处理（主页面采用card view，类似于扑克的翻牌）&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;BBGlobalData.gotoHomePanel = function() {&#xA;   BBGlobalData.mainPanel.setActiveItem(1);&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;总结：其实总的解决方法还是很简单，只要把整体的框架搭建完善了，很容易就能在多平台之间转换了。&lt;/p&gt;</description>
			</item>
			<item>
				<title>php使用ffmpeg-php扩展库进行视频截图</title>
				<link>https://blog.zhourunsheng.com/2012/04/php%e4%bd%bf%e7%94%a8ffmpeg-php%e6%89%a9%e5%b1%95%e5%ba%93%e8%bf%9b%e8%a1%8c%e8%a7%86%e9%a2%91%e6%88%aa%e5%9b%be/</link>
				<pubDate>Sun, 08 Apr 2012 16:23:25 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/04/php%e4%bd%bf%e7%94%a8ffmpeg-php%e6%89%a9%e5%b1%95%e5%ba%93%e8%bf%9b%e8%a1%8c%e8%a7%86%e9%a2%91%e6%88%aa%e5%9b%be/</guid>
				<description>&lt;p&gt;这几天做项目，其中一个需求是用户上传视频文件到服务器，然后服务器自动截取该视频的一帧作为该视频对应的缩略图，服务器端语言采用php编写，找了半天资料，发现ffmpeg-php可以满足该需求，所以下面简单介绍一下该扩展库的配置和使用方法。&lt;/p&gt;&#xA;&lt;p&gt;测试服务器环境 WampServer Version 2.1，php5.3.5，ffmpeg-php 配置和使用步骤如下：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;下载 ffmpeg-php,&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;ffmpeg-php-5.3-win32-all.zip&lt;/p&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;将 php_ffmpeg.dll 放到 PHP 扩展目录，（例如 E:\Program Files\wamp\bin\php\php5.3.5\ext）&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;将其他的dll文件放到系统目录，（例如 C:\Windows\System32）&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;修改 php.ini，添加 extension=php_ffmpeg.dll 配置项，结果如下：&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;extension=php_gd2.dll extension=php_gettext.dll extension=php_ffmpeg.dll （注：Wamp 环境下要修改 apache 目录中的 php.ini,(例如E:\Program Files\wamp\bin\apache\Apache2.2.17\bin\php.ini), 同时要启用gd2 和 gettext 模块）&lt;/p&gt;&#xA;&lt;ol start=&#34;5&#34;&gt;&#xA;&lt;li&gt;重新启动 apache 服务器&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;6.打印输出 phpinfo，查看是否有如下输出，若有，则说明 ffmpeg-php 模块配置正确&lt;/p&gt;&#xA;&lt;h2 id=&#34;ffmpeg&#34;&gt;ffmpeg&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;ffmpeg-php version&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;0.6.0-svn&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;ffmpeg-php built on&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Sep 8 2010 12:13:47&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;ffmpeg-php gd support&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;enabled&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;ffmpeg libavcodec version&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Lavc52.87.4&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;ffmpeg libavformat version&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Lavf52.78.3&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;ffmpeg swscaler version&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;SwS0.11.0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Directive&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Local Value&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Master Value&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;ffmpeg.allow_persistent&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;ffmpeg.show_warnings&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;ol start=&#34;7&#34;&gt;&#xA;&lt;li&gt;编写测试代码，示例代码截取视频的第二帧为缩略图&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;public function testmp4()&#xA;{&#xA;if(extension_loaded(&amp;#39;ffmpeg&amp;#39;)){//判断ffmpeg是否载入&#xA;$mov = new ffmpeg_movie(&amp;#39;E:\\Program Files\\wamp\\www\\BBShow\\test\\guangfa15s.mp4&amp;#39;);//视频的路径&#xA;dump($mov);&#xA;$ff_frame = $mov-&amp;gt;getFrame(2);&#xA;$gd_image = $ff_frame-&amp;gt;toGDImage();&#xA;$img=$_SERVER[&amp;#39;DOCUMENT_ROOT&amp;#39;].&amp;#34;/test.jpg&amp;#34;;//要生成图片的绝对路径&#xA;imagejpeg($gd_image, $img);//创建jpg图像&#xA;imagedestroy($gd_image);//销毁一图像&#xA;}else{&#xA;echo &amp;#34;ffmpeg没有载入&amp;#34;;&#xA;}&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;8&#34;&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;运行测试代码，即可在服务器端生成 jpg 格式的缩略图&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;有关 ffmpeg-php 的详细使用说明，请参照官方API（&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
			</item>
			<item>
				<title>Sencha Touch 程序设计体验之笔记本</title>
				<link>https://blog.zhourunsheng.com/2012/04/sencha-touch-%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1%e4%bd%93%e9%aa%8c%e4%b9%8b%e7%ac%94%e8%ae%b0%e6%9c%ac/</link>
				<pubDate>Mon, 02 Apr 2012 15:48:17 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/04/sencha-touch-%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1%e4%bd%93%e9%aa%8c%e4%b9%8b%e7%ac%94%e8%ae%b0%e6%9c%ac/</guid>
				<description>&lt;p&gt;这几天进行进行 webmobile App的设计，起初的设计方案采用的是 Jquery Mobile + PhoneGap，原想应该工作的不错，没想到到了最后，进行程序结合测试的时候出现了一个莫名奇妙的问题，那就是，利用Jquery Mobile进行页面切换，反复进行七次以上的连环页面跳转，同时在后台发送 Ajax数据请求，从服务器download数据，就会破坏PhoneGap的本地工作机制，导致后面的PhoneGap本地函数调用无法正常进行，PhoneGap的工作原理也是ajax通信机制，在环境出错的情况下，总是返回status = 0的状态，无奈解决了两天还是没有彻底解决，现在着手试着另一套界面设计框架Sencha Touch。&lt;/p&gt;&#xA;&lt;p&gt;学习Sencha Touch，改写了别人的一个APP，一个记事本程序，详细的E文请参照《writing a sencha touch application》。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2012/05/05.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2012/05/07.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;笔记本程序的运行效果图如下(分别是笔记列表和笔记编辑页面)：&lt;/p&gt;&#xA;&lt;p&gt;当时设计该程序的代码基于Sencha Touch1.1.0，现在Sencha Touch已经发布了2.0版本，所以里面有很多代码已经无法正常工作了，本文还是按照作者当初的设计思路，重新基于Sencha Touch2.0进行了编码工作，程序已经可以正常运行，后面附上本程序的JS源码：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;var App = new Ext.application({&#xA;name : &amp;#39;NotesApp&amp;#39;,&#xA;useLoadMask : true,&#xA;&#xA;launch : function () {&#xA;notesListToolbar = Ext.create(&amp;#39;Ext.Toolbar&amp;#39;, {&#xA;id: &amp;#39;notesListToolbar&amp;#39;,&#xA;docked: &amp;#39;top&amp;#39;,&#xA;title: &amp;#39;记事本&amp;#39;,&#xA;layout: &amp;#39;hbox&amp;#39;,&#xA;items: [&#xA;{ xtype: &amp;#39;spacer&amp;#39; },&#xA;{&#xA;id: &amp;#39;newNoteButton&amp;#39;,&#xA;text: &amp;#39;新建笔记&amp;#39;,&#xA;ui: &amp;#39;action&amp;#39;,&#xA;handler: function () {&#xA;var now = new Date();&#xA;var noteId = now.getTime();&#xA;var note = Ext.ModelMgr.create(&#xA;{ id: noteId, date: now, title: &amp;#39;&amp;#39;, narrative: &amp;#39;&amp;#39; },&#xA;&amp;#39;Note&amp;#39;&#xA;);&#xA;&#xA;noteEditor.setRecord(note);&#xA;Ext.Viewport.setActiveItem(&amp;#39;noteEditor&amp;#39;, {type: &amp;#39;slide&amp;#39;, direction: &amp;#39;left&amp;#39;});&#xA;}&#xA;}&#xA;]&#xA;});&#xA;&#xA;Ext.regModel(&amp;#39;Note&amp;#39;, {&#xA;idProperty: &amp;#39;id&amp;#39;,&#xA;fields: [&#xA;{ name: &amp;#39;id&amp;#39;, type: &amp;#39;int&amp;#39; },&#xA;{ name: &amp;#39;date&amp;#39;, type: &amp;#39;date&amp;#39;, dateFormat: &amp;#39;c&amp;#39; },&#xA;{ name: &amp;#39;title&amp;#39;, type: &amp;#39;string&amp;#39; },&#xA;{ name: &amp;#39;narrative&amp;#39;, type: &amp;#39;string&amp;#39; }&#xA;],&#xA;validations: [&#xA;{ type: &amp;#39;presence&amp;#39;, field: &amp;#39;id&amp;#39; },&#xA;{ type: &amp;#39;presence&amp;#39;, field: &amp;#39;title&amp;#39;, message: &amp;#39;请输入笔记的标题!&amp;#39; }&#xA;]&#xA;});&#xA;&#xA;Ext.regStore(&amp;#39;NotesStore&amp;#39;, {&#xA;model: &amp;#39;Note&amp;#39;,&#xA;sorters: [{&#xA;property: &amp;#39;date&amp;#39;,&#xA;direction: &amp;#39;DESC&amp;#39;&#xA;}],&#xA;proxy: {&#xA;type: &amp;#39;localstorage&amp;#39;,&#xA;id: &amp;#39;notes-app-localstore&amp;#39;&#xA;},&#xA;getGroupString: function (record) {&#xA;if (record &amp;amp;&amp;amp; record.data.date) {&#xA;return record.get(&amp;#39;date&amp;#39;).toDateString();&#xA;} else {&#xA;return &amp;#39;&amp;#39;;&#xA;}&#xA;},&#xA;});&#xA;&#xA;notesList = Ext.create(&amp;#39;Ext.List&amp;#39;, {&#xA;id: &amp;#39;notesList&amp;#39;,&#xA;store: &amp;#39;NotesStore&amp;#39;,&#xA;grouped: true,&#xA;emptyText: &amp;#39;&amp;lt;div style=&amp;#34;margin: 5px;&amp;#34;&amp;gt;目前还没有创建笔记.&amp;lt;/div&amp;gt;&amp;#39;,&#xA;loadingText: &amp;#39;正在读取笔记 ...&amp;#39;,&#xA;itemTpl: &amp;#39;&amp;lt;div class=&amp;#34;list-item-title&amp;#34;&amp;gt;{title}&amp;lt;/div&amp;gt;&amp;#39; +&#xA;&amp;#39;&amp;lt;div class=&amp;#34;list-item-narrative&amp;#34;&amp;gt;{narrative}&amp;lt;/div&amp;gt;&amp;#39;,&#xA;onItemDisclosure: function (record) {&#xA;var selectedNote = record;&#xA;noteEditor.setRecord(selectedNote);&#xA;Ext.Viewport.setActiveItem(&amp;#39;noteEditor&amp;#39;, { type: &amp;#39;slide&amp;#39;, direction: &amp;#39;left&amp;#39; });&#xA;},&#xA;listeners: {&#xA;&amp;#39;render&amp;#39;: function (thisComponent) {&#xA;thisComponent.getStore().load();&#xA;},&#xA;}&#xA;});&#xA;&#xA;notesListContainer = Ext.create(&amp;#39;Ext.Panel&amp;#39;, {&#xA;id : &amp;#39;notesListContainer&amp;#39;,&#xA;layout : &amp;#39;fit&amp;#39;,&#xA;items: [notesListToolbar, notesList],&#xA;html: &amp;#39;This is the notes list container&amp;#39;&#xA;});&#xA;&#xA;noteEditorTopToolbar = Ext.create(&amp;#39;Ext.Toolbar&amp;#39;, {&#xA;title: &amp;#39;编辑笔记&amp;#39;,&#xA;docked: &amp;#39;top&amp;#39;,&#xA;&#xA;items: [&#xA;{&#xA;text: &amp;#39;记事本&amp;#39;,&#xA;ui: &amp;#39;back&amp;#39;,&#xA;handler: function () {&#xA;Ext.Viewport.setActiveItem(&amp;#39;notesListContainer&amp;#39;, { type: &amp;#39;slide&amp;#39;, direction: &amp;#39;right&amp;#39; });&#xA;}&#xA;},&#xA;{ xtype: &amp;#39;spacer&amp;#39; },&#xA;{&#xA;text: &amp;#39;保存&amp;#39;,&#xA;ui: &amp;#39;action&amp;#39;,&#xA;handler: function () {&#xA;var currentNote = noteEditor.getRecord();&#xA;// Update the note with the values in the form fields.&#xA;noteEditor.updateRecord(currentNote);&#xA;&#xA;var errors = currentNote.validate();&#xA;if (!errors.isValid()) {&#xA;currentNote.reject();&#xA;Ext.Msg.alert(&amp;#39;请等待...&amp;#39;, errors.getByField(&amp;#39;title&amp;#39;)[0].getMessage(), Ext.emptyFn);&#xA;return;&#xA;}&#xA;&#xA;var notesStore = notesList.getStore();&#xA;&#xA;if (notesStore.findRecord(&amp;#39;id&amp;#39;, currentNote.data.id) === null) {&#xA;notesStore.add(currentNote);&#xA;} else {&#xA;currentNote.setDirty();&#xA;}&#xA;&#xA;notesStore.sync();&#xA;notesStore.sort([{ property: &amp;#39;date&amp;#39;, direction: &amp;#39;DESC&amp;#39;}]);&#xA;&#xA;notesList.refresh();&#xA;&#xA;Ext.Viewport.setActiveItem(&amp;#39;notesListContainer&amp;#39;, { type: &amp;#39;slide&amp;#39;, direction: &amp;#39;right&amp;#39; });&#xA;}&#xA;}&#xA;]&#xA;});&#xA;&#xA;noteEditorBottomToolbar = Ext.create(&amp;#39;Ext.Toolbar&amp;#39;, {&#xA;docked: &amp;#39;bottom&amp;#39;,&#xA;&#xA;items: [&#xA;{ xtype: &amp;#39;spacer&amp;#39; },&#xA;{&#xA;iconCls: &amp;#39;trash&amp;#39;,&#xA;iconMask: true,&#xA;handler: function () {&#xA;var currentNote = noteEditor.getRecord();&#xA;var notesStore = notesList.getStore();&#xA;&#xA;if (notesStore.findRecord(&amp;#39;id&amp;#39;, currentNote.data.id)) {&#xA;notesStore.remove(currentNote);&#xA;}&#xA;&#xA;notesStore.sync();&#xA;&#xA;notesList.refresh();&#xA;Ext.Viewport.setActiveItem(&amp;#39;notesListContainer&amp;#39;, { type: &amp;#39;slide&amp;#39;, direction: &amp;#39;right&amp;#39; });&#xA;}&#xA;}&#xA;]&#xA;});&#xA;&#xA;noteEditor = Ext.create(&amp;#39;Ext.form.FormPanel&amp;#39;,{&#xA;id: &amp;#39;noteEditor&amp;#39;,&#xA;items: [&#xA;noteEditorTopToolbar,&#xA;{&#xA;xtype: &amp;#39;textfield&amp;#39;,&#xA;name: &amp;#39;title&amp;#39;,&#xA;label: &amp;#39;笔记标题&amp;#39;,&#xA;required: true&#xA;},&#xA;{&#xA;xtype: &amp;#39;textareafield&amp;#39;,&#xA;name: &amp;#39;narrative&amp;#39;,&#xA;label: &amp;#39;笔记内容&amp;#39;&#xA;},&#xA;noteEditorBottomToolbar&#xA;]&#xA;});&#xA;&#xA;mainPanel = Ext.create(&amp;#39;Ext.Panel&amp;#39;, {&#xA;fullscreen: true,&#xA;layout : &amp;#39;card&amp;#39;,&#xA;cardAnimation : &amp;#39;slide&amp;#39;,&#xA;items: [notesListContainer, noteEditor]&#xA;});&#xA;&#xA;Ext.Viewport.add(mainPanel);&#xA;}&#xA;})&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;有兴趣学习Sencha Touch的童鞋，该sample还是一个不错的入门选择，接下来再挑选几个不错的sample来update。&lt;/p&gt;</description>
			</item>
			<item>
				<title>CSS 多行文本的垂直居中方法</title>
				<link>https://blog.zhourunsheng.com/2012/03/css-%e5%a4%9a%e8%a1%8c%e6%96%87%e6%9c%ac%e7%9a%84%e5%9e%82%e7%9b%b4%e5%b1%85%e4%b8%ad%e6%96%b9%e6%b3%95/</link>
				<pubDate>Fri, 30 Mar 2012 19:46:50 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/03/css-%e5%a4%9a%e8%a1%8c%e6%96%87%e6%9c%ac%e7%9a%84%e5%9e%82%e7%9b%b4%e5%b1%85%e4%b8%ad%e6%96%b9%e6%b3%95/</guid>
				<description>&lt;p&gt;前一篇文章《CSS 元素垂直居中的 6种方法》中介绍了6种常用的利用CSS来垂直居中元素的方法，本文介绍一种多行文本垂直居中的解决方案。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2012/05/abehappy.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;实现的效果如下：查看 Demo，下载代码文件 Html代码&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;div class=&amp;#34;area&amp;#34;&amp;gt;&#xA;&amp;lt;div class=&amp;#34;bubble&amp;#34;&amp;gt;&#xA;&amp;lt;p&amp;gt;To look best, text should really be centered inside this bubble both vertically and horizontally.&amp;lt;/p&amp;gt;&#xA;&amp;lt;/div&amp;gt;&#xA;&amp;lt;/div&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;CSS代码&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;.area {&#xA;  width: 300px;&#xA;  height: 300px;&#xA;  background: url(../images/abe-bg.png) no-repeat;&#xA;  position: relative;&#xA;}&#xA;&#xA;.bubble {&#xA;  position: absolute;&#xA;  left: 93px;&#xA;  top: 21px;&#xA;  width: 135px;&#xA;  height: 84px;&#xA;  display: table;&#xA;}&#xA;&#xA;.bubble p {&#xA;  display: table-cell;&#xA;  vertical-align: middle;&#xA;  text-align: center;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;上面的代码利用了table table-cell中的vertical-align: middle 属性。&lt;/p&gt;&#xA;&lt;p&gt;IE 8 开始支持 CSS tables，那么在IE7及以下，怎么来解决呢？&lt;/p&gt;</description>
			</item>
			<item>
				<title>CSS 元素垂直居中的 6种方法</title>
				<link>https://blog.zhourunsheng.com/2012/03/css-%e5%85%83%e7%b4%a0%e5%9e%82%e7%9b%b4%e5%b1%85%e4%b8%ad%e7%9a%84-6%e7%a7%8d%e6%96%b9%e6%b3%95/</link>
				<pubDate>Fri, 30 Mar 2012 14:24:51 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/03/css-%e5%85%83%e7%b4%a0%e5%9e%82%e7%9b%b4%e5%b1%85%e4%b8%ad%e7%9a%84-6%e7%a7%8d%e6%96%b9%e6%b3%95/</guid>
				<description>&lt;p&gt;利用CSS进行元素的水平居中，比较简单，行级元素设置其父元素的text-align center，块级元素设置其本身的left 和 right margins为auto即可。本文收集了六种利用css进行元素的垂直居中的方法，每一种适用于不同的情况，在实际的使用过程中选择某一种方法即可。&lt;/p&gt;&#xA;&lt;h2 id=&#34;line-height-method&#34;&gt;Line-Height Method&lt;/h2&gt;&#xA;&lt;p&gt;试用：单行文本垂直居中，demo 代码：html&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;div id=&amp;#34;parent&amp;#34;&amp;gt;&#xA;&amp;lt;div id=&amp;#34;child&amp;#34;&amp;gt;Text here&amp;lt;/div&amp;gt;&#xA;&amp;lt;/div&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;css&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#child {&#xA;line-height: 200px;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;垂直居中一张图片，代码如下 html&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;div id=&amp;#34;parent&amp;#34;&amp;gt;&#xA;&amp;lt;img src=&amp;#34;image.png&amp;#34; alt=&amp;#34;&amp;#34; /&amp;gt;&#xA;&amp;lt;/div&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;css&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#parent {&#xA;line-height: 200px;&#xA;}&#xA;#parent img {&#xA;vertical-align: middle;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;css-table-method&#34;&gt;CSS Table Method&lt;/h2&gt;&#xA;&lt;p&gt;适用：通用，demo 代码：html&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;div id=&amp;#34;parent&amp;#34;&amp;gt;&#xA;&amp;lt;div id=&amp;#34;child&amp;#34;&amp;gt;Content here&amp;lt;/div&amp;gt;&#xA;&amp;lt;/div&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;css&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#parent {display: table;}&#xA;#child {&#xA;display: table-cell;&#xA;vertical-align: middle;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;低版本 IE fix bug：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#child {&#xA;display: inline-block;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;absolute-positioning-and-negative-margin&#34;&gt;Absolute Positioning and Negative Margin&lt;/h2&gt;&#xA;&lt;p&gt;适用：块级元素，demo 代码：html&lt;/p&gt;</description>
			</item>
			<item>
				<title>编写 PhoneGap 程序调试问题解决方案</title>
				<link>https://blog.zhourunsheng.com/2012/03/%e7%bc%96%e5%86%99-phonegap-%e7%a8%8b%e5%ba%8f%e8%b0%83%e8%af%95%e9%97%ae%e9%a2%98%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/</link>
				<pubDate>Wed, 28 Mar 2012 10:22:15 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/03/%e7%bc%96%e5%86%99-phonegap-%e7%a8%8b%e5%ba%8f%e8%b0%83%e8%af%95%e9%97%ae%e9%a2%98%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/</guid>
				<description>&lt;p&gt;这几天做项目，需要设计一个和服务器交互的库，同时也有一个提高效率的需求就是设计缓存机制，无奈PhoneGap提供的API太坑爹了，编写个缓存费了N大的劲才完成，记录一下要注意的地方。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;客户端浏览器调试Ajax请求报错“&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Origin null is not allowed by Access-Control-Allow-Origin. ”解决办法：谷歌浏览器 chrome.exe &amp;ndash;disable-web-security&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2012/05/02.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;PhoneGap 远程调试&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;远程调试架构图如下所示：配置步骤如下：a. 登录网址：http://debug.phonegap.com/填写配置信息 b. 在本地代码中引用远程调试JS代码文件 c. 打开远程调试窗口 &lt;a href=&#34;http://debug.phonegap.com/client/#bbshow&#34;&gt;http://debug.phonegap.com/client/#bbshow&lt;/a&gt; （bbshow为第一步骤配置的名字）在调试窗口中可以修改节点的属性，然后手机上的画面就会自动更新了。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2012/05/06.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2012/05/03.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2012/05/04.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;常用的代码总结&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;a. 设计 Ajax 数据通信（如用户登录）&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/*&#xA;用户登录模块&#xA;&#xA;params = {};&#xA;params.username 登录用户名&#xA;params.password 登录用户密码&#xA;&#xA;succcb  登录成功时候的回调函数 function(data);&#xA;errcb   登录失败时候的回调函数 function(text);&#xA;*/&#xA;function bb_login(params, succcb, errcb)&#xA;{&#xA;   var tmplate = login_req_xml(params);&#xA;&#xA;   doPost(tmplate, function(data, textStatus, jqXHR) {&#xA;      if (data.status == 0) {&#xA;          errcb(data.info);&#xA;      } else {&#xA;          GServerData.curToken = data.data;&#xA;          succcb(data.data);&#xA;      }&#xA;   }, function(jqXHR, textStatus, errorThrown) {&#xA;         errcb(textStatus);&#xA;   });&#xA;}&#xA;&#xA;/*用户登录的模板文件*/&#xA;function login_req_xml(params)&#xA;{&#xA;  var tmplate = &amp;#39;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;&amp;#39;&#xA;       + &amp;#39;&amp;lt;request&amp;gt;&amp;#39;&#xA;       + &amp;#39;&amp;lt;operation&amp;gt;&amp;#39;&#xA;       + &amp;#39;&amp;lt;module&amp;gt;token&amp;lt;/module&amp;gt;&amp;#39;&#xA;       + &amp;#39;&amp;lt;action&amp;gt;login&amp;lt;/action&amp;gt;&amp;#39;&#xA;       + &amp;#39;&amp;lt;params&amp;gt;&amp;#39;&#xA;       + &amp;#39;&amp;lt;username&amp;gt;&amp;#39; + params.username + &amp;#39;&amp;lt;/username&amp;gt;&amp;#39;&#xA;       + &amp;#39;&amp;lt;password&amp;gt;&amp;#39; + params.password + &amp;#39;&amp;lt;/password&amp;gt;&amp;#39;&#xA;       + &amp;#39;&amp;lt;/params&amp;gt;&amp;#39;&#xA;       + &amp;#39;&amp;lt;/operation&amp;gt;&amp;#39;&#xA;       + &amp;#39;&amp;lt;/request&amp;gt;&amp;#39;;&#xA;   return  tmplate;&#xA;}&#xA;&#xA;/*&#xA;向服务器发送 POST 请求.&#xA;&#xA;data: 向服务器发送的数据内容&#xA;succcb: 成功时候的回调函数 success(data, textStatus, jqXHR)&#xA;errcb:  失败时候的回调函数 error(jqXHR, textStatus, errorThrown)&#xA;*/&#xA;function doPost(data, succcb, errcb)&#xA;{&#xA;   $.ajax({&#xA;      type: &amp;#34;POST&amp;#34;,&#xA;      url: Config.serverapi,&#xA;      data: data,&#xA;      cache: false,&#xA;      dataType: &amp;#34;json&amp;#34;,&#xA;      success: succcb,&#xA;      error: errcb&#xA;   });&#xA;}&#xA;&#xA;b.  数据缓存&#xA;&#xA;/*&#xA;dataUrl 请求数据的网络URL地址&#xA;如果缓存成功，则会返回本地的File地址&#xA;&#xA;succcb 登录成功时候的回调函数 function(data);&#xA;errcb 登录失败时候的回调函数 function(text);&#xA;*/&#xA;function bb_loadCacheData(dataurl, succcb, errcb)&#xA;{&#xA;  var errorCB = function (err) {&#xA;      console.log(&amp;#34;Error processing : &amp;#34; + err.code);&#xA;      errcb(&amp;#34;Error processing : &amp;#34; + err.code);&#xA;  }&#xA;&#xA;var downLoadFile = function(db) {&#xA;  console.log(&amp;#34;downLoadFile ... [&amp;#34; + dataurl + &amp;#34;]&amp;#34;);&#xA;&#xA;   //特别备注：在Phonegap1.5.0中，LocalFileSystem.TEMPORARY 和 LocalFileSystem.PERSISTENT 两者相反了&#xA;   window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fileSystem) {&#xA;        var datadate = new Date().getTime();&#xA;        var filename = datadate + &amp;#39;_&amp;#39; + dataurl.substr(dataurl.lastIndexOf(&amp;#39;/&amp;#39;)+1);&#xA;&#xA;        var fileTransfer = new FileTransfer();&#xA;&#xA;        fileTransfer.download(&#xA;           dataurl,&#xA;           fileSystem.root.fullPath.substr(&amp;#34;file://&amp;#34;.length) + Config.datacachepath + filename,&#xA;           function(entry) {&#xA;               console.log(&amp;#34;download complete: &amp;#34; + entry.fullPath);&#xA;               db.transaction(function (tx) {&#xA;                   tx.executeSql(&amp;#39;INSERT INTO data_cache (dataurl, datapath, datadate) VALUES (&amp;#34;&amp;#39; + dataurl + &amp;#39;&amp;#34;,&amp;#34;&amp;#39; + entry.fullPath + &amp;#39;&amp;#34;,&amp;#34;&amp;#39; + datadate + &amp;#39;&amp;#34;)&amp;#39;);&#xA;               succcb(entry.fullPath);&#xA;               }, errorCB);&#xA;           },&#xA;          function(error) {&#xA;              console.log(&amp;#34;download error source &amp;#34; + error.source);&#xA;              console.log(&amp;#34;download error target &amp;#34; + error.target);&#xA;              console.log(&amp;#34;download error code &amp;#34; + error.code);&#xA;              errcb(&amp;#34;download error code &amp;#34; + error.code);&#xA;          }&#xA;      ); &#xA;     }, errorCB);&#xA;   };&#xA;&#xA;   var db = window.openDatabase(&amp;#34;cache.db&amp;#34;, &amp;#34;1.0&amp;#34;, &amp;#34;BBShow Data Cache DB&amp;#34;, 200000);&#xA;   db.transaction(function (tx) {&#xA;      tx.executeSql(&amp;#39;CREATE TABLE IF NOT EXISTS data_cache (id unique, dataurl, datapath, datadate)&amp;#39;);&#xA;      tx.executeSql(&amp;#39;SELECT * FROM data_cache WHERE dataurl=?&amp;#39;, [dataurl], function(tx, results) {&#xA;      if (results.rows.length &amp;gt; 0) {&#xA;         window.resolveLocalFileSystemURI(results.rows.item(0).datapath, function(fileEntry) {&#xA;              console.log(fileEntry.fullPath);&#xA;              succcb(fileEntry.fullPath);&#xA;         }, function(error) {&#xA;              console.log(&amp;#34;Unable to resolveLocalFileSystemURI: &amp;#34; + error.code);&#xA;              db.transaction(function (tx) {&#xA;              tx.executeSql(&amp;#39;DELETE FROM data_cache WHERE dataurl=?&amp;#39;, [dataurl]);&#xA;              downLoadFile(db);&#xA;         }, errorCB);&#xA;        });&#xA;      } else {&#xA;          downLoadFile(db);&#xA;      }&#xA;     }, errorCB);&#xA;   }, errorCB);&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;总之，这两天才发现 PhoneGap不是一般的难用，真应该再多完善完善！！！&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android 开发之 HttpClient Class can not find 之解决办法</title>
				<link>https://blog.zhourunsheng.com/2012/03/android-%e5%bc%80%e5%8f%91%e4%b9%8b-httpclient-class-can-not-find-%e4%b9%8b%e8%a7%a3%e5%86%b3%e5%8a%9e%e6%b3%95/</link>
				<pubDate>Mon, 26 Mar 2012 14:28:16 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/03/android-%e5%bc%80%e5%8f%91%e4%b9%8b-httpclient-class-can-not-find-%e4%b9%8b%e8%a7%a3%e5%86%b3%e5%8a%9e%e6%b3%95/</guid>
				<description>&lt;p&gt;相信大家在开发 Android 的过程中遇到过这么一种情况，那就是 “ Could not find class &amp;lsquo;org.apache.commons.httpclient.HttpClient&amp;rsquo;”。&lt;/p&gt;&#xA;&lt;p&gt;尤其是在 eclipse 的插件ADT升级之后，很容易出现该问题，昨天Google放出了ADT的升级包，然后我也就升级了一下开发环境，没想到前天还运行好好的程序，今天突然就不会工作了，检查log发现，HttpClient无法找到，但是在普通的Java运行环境下就可以正常运行。&lt;/p&gt;&#xA;&lt;p&gt;因为Apache的HttpClient开发包，Google自己也定制了一份，已经内置到开发环境中了，所以我们如果使用纯粹的Apache原生态的HttpClient开发包就可能出现冲突的问题，每当Google升级ADT之后，说不定程序就Over了。&lt;/p&gt;&#xA;&lt;p&gt;实在没有办法，那就把基于Apache原生态的HttpClient完全替换成Google定制后的类型吧，转换前后的代码对比如下：&lt;/p&gt;&#xA;&lt;h2 id=&#34;基于apache原生态的httpclient&#34;&gt;基于Apache原生态的HttpClient&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;package com.shiny.mid.net;&#xA;&#xA;import org.apache.commons.httpclient.HttpClient;&#xA;import org.apache.commons.httpclient.HttpStatus;&#xA;import org.apache.commons.httpclient.methods.ByteArrayRequestEntity;&#xA;import org.apache.commons.httpclient.methods.GetMethod;&#xA;import org.apache.commons.httpclient.methods.PostMethod;&#xA;&#xA;public final class HSHttpClient {&#xA;&#xA;private static final int CONNECTION_TIMEOUT = 20000;&#xA;private static HSHttpClient mHSHttpClient;&#xA;&#xA;private HSHttpClient() {&#xA;}&#xA;&#xA;public static synchronized HSHttpClient getInstance() {&#xA;if (mHSHttpClient == null) {&#xA;mHSHttpClient = new HSHttpClient();&#xA;}&#xA;return mHSHttpClient;&#xA;}&#xA;&#xA;/**&#xA;* Using GET method.&#xA;*&#xA;* @param url&#xA;*            The remote URL.&#xA;* @param queryString&#xA;*            The query string containing parameters&#xA;* @return Response string.&#xA;* @throws Exception&#xA;*/&#xA;public String httpGet(String url, String queryString) throws Exception {&#xA;String responseData = null;&#xA;&#xA;if (queryString != null &amp;amp;&amp;amp; !queryString.equals(&amp;#34;&amp;#34;)) {&#xA;url += &amp;#34;?&amp;#34; + queryString;&#xA;}&#xA;&#xA;HttpClient httpClient = new HttpClient();&#xA;GetMethod httpGet = new GetMethod(url);&#xA;httpGet.getParams().setParameter(&amp;#34;http.socket.timeout&amp;#34;,&#xA;new Integer(CONNECTION_TIMEOUT));&#xA;&#xA;try {&#xA;int statusCode = httpClient.executeMethod(httpGet);&#xA;if (statusCode != HttpStatus.SC_OK) {&#xA;System.err.println(&amp;#34;HttpGet Method failed: &amp;#34;&#xA;+ httpGet.getStatusLine());&#xA;}&#xA;responseData = httpGet.getResponseBodyAsString();&#xA;} catch (Exception e) {&#xA;throw new Exception(e);&#xA;} finally {&#xA;httpGet.releaseConnection();&#xA;httpClient = null;&#xA;}&#xA;&#xA;return responseData;&#xA;}&#xA;&#xA;/**&#xA;* Using POST method.&#xA;*&#xA;* @param url&#xA;*            The remote URL.&#xA;* @param queryString&#xA;*            The query string containing parameters&#xA;* @return Response string.&#xA;* @throws Exception&#xA;*/&#xA;public String httpPost(String url, String queryString) throws Exception {&#xA;String responseData = null;&#xA;HttpClient httpClient = new HttpClient();&#xA;PostMethod httpPost = new PostMethod(url);&#xA;httpPost.addParameter(&amp;#34;Content-Type&amp;#34;,&#xA;&amp;#34;application/x-www-form-urlencoded&amp;#34;);&#xA;httpPost.getParams().setParameter(&amp;#34;http.socket.timeout&amp;#34;,&#xA;new Integer(CONNECTION_TIMEOUT));&#xA;if (queryString != null &amp;amp;&amp;amp; !queryString.equals(&amp;#34;&amp;#34;)) {&#xA;httpPost.setRequestEntity(new ByteArrayRequestEntity(queryString&#xA;.getBytes()));&#xA;}&#xA;&#xA;try {&#xA;int statusCode = httpClient.executeMethod(httpPost);&#xA;if (statusCode != HttpStatus.SC_OK) {&#xA;System.err.println(&amp;#34;HttpPost Method failed: &amp;#34;&#xA;+ httpPost.getStatusLine());&#xA;}&#xA;responseData = httpPost.getResponseBodyAsString();&#xA;} catch (Exception e) {&#xA;throw new Exception(e);&#xA;} finally {&#xA;httpPost.releaseConnection();&#xA;httpClient = null;&#xA;}&#xA;&#xA;return responseData;&#xA;}&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;基于google定制的httpclient&#34;&gt;基于Google定制的HttpClient&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;package com.dlgreat.bbshow.net;&#xA;&#xA;import org.apache.http.HttpResponse;&#xA;import org.apache.http.HttpStatus;&#xA;import org.apache.http.client.HttpClient;&#xA;import org.apache.http.client.methods.HttpGet;&#xA;import org.apache.http.client.methods.HttpPost;&#xA;import org.apache.http.entity.StringEntity;&#xA;import org.apache.http.impl.client.DefaultHttpClient;&#xA;import org.apache.http.params.BasicHttpParams;&#xA;import org.apache.http.params.HttpConnectionParams;&#xA;import org.apache.http.params.HttpParams;&#xA;import org.apache.http.util.EntityUtils;&#xA;&#xA;public final class BBHttpClient {&#xA;&#xA;private static final int CONNECTION_TIMEOUT = 20000;&#xA;private static BBHttpClient mHSHttpClient;&#xA;&#xA;private BBHttpClient() {&#xA;}&#xA;&#xA;public static synchronized BBHttpClient getInstance() {&#xA;if (mHSHttpClient == null) {&#xA;mHSHttpClient = new BBHttpClient();&#xA;}&#xA;return mHSHttpClient;&#xA;}&#xA;&#xA;/**&#xA;* Using GET method.&#xA;*&#xA;* @param url&#xA;*            The remote URL.&#xA;* @param queryString&#xA;*            The query string containing parameters&#xA;* @return Response string.&#xA;* @throws Exception&#xA;*/&#xA;public String httpGet(String url, String queryString) throws Exception {&#xA;if (queryString != null &amp;amp;&amp;amp; !queryString.equals(&amp;#34;&amp;#34;)) {&#xA;url += &amp;#34;?&amp;#34; + queryString;&#xA;}&#xA;&#xA;HttpGet httpGet = new HttpGet(url);&#xA;&#xA;HttpParams params = new BasicHttpParams();&#xA;HttpConnectionParams.setConnectionTimeout(params, CONNECTION_TIMEOUT);&#xA;HttpConnectionParams.setSoTimeout(params, CONNECTION_TIMEOUT);&#xA;HttpClient httpClient = new DefaultHttpClient(params);&#xA;&#xA;try {&#xA;HttpResponse response = httpClient.execute(httpGet);&#xA;if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {&#xA;System.err.println(&amp;#34;HttpGet Method failed: &amp;#34;&#xA;+ response.getStatusLine().toString());&#xA;httpGet.abort();&#xA;}&#xA;return EntityUtils.toString(response.getEntity());&#xA;} catch (Exception e) {&#xA;throw new Exception(e);&#xA;} finally {&#xA;httpClient.getConnectionManager().shutdown();&#xA;}&#xA;}&#xA;&#xA;/**&#xA;* Using POST method.&#xA;*&#xA;* @param url&#xA;*            The remote URL.&#xA;* @param queryString&#xA;*            The query string containing parameters&#xA;* @return Response string.&#xA;* @throws Exception&#xA;*/&#xA;public String httpPost(String url, String queryString) throws Exception {&#xA;HttpPost httpPost = new HttpPost(url);&#xA;&#xA;if (queryString != null &amp;amp;&amp;amp; !queryString.equals(&amp;#34;&amp;#34;)) {&#xA;StringEntity se = new StringEntity(queryString);&#xA;httpPost.setHeader(&amp;#34;Content-Type&amp;#34;,&#xA;&amp;#34;application/x-www-form-urlencoded&amp;#34;);&#xA;httpPost.setEntity(se);&#xA;}&#xA;&#xA;HttpParams params = new BasicHttpParams();&#xA;HttpConnectionParams.setConnectionTimeout(params, CONNECTION_TIMEOUT);&#xA;HttpConnectionParams.setSoTimeout(params, CONNECTION_TIMEOUT);&#xA;HttpClient httpClient = new DefaultHttpClient(params);&#xA;&#xA;try {&#xA;HttpResponse response = httpClient.execute(httpPost);&#xA;if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {&#xA;System.err.println(&amp;#34;HttpPost Method failed: &amp;#34;&#xA;+ response.getStatusLine().toString());&#xA;httpPost.abort();&#xA;}&#xA;return EntityUtils.toString(response.getEntity());&#xA;} catch (Exception e) {&#xA;throw new Exception(e);&#xA;} finally {&#xA;httpClient.getConnectionManager().shutdown();&#xA;}&#xA;}&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
			</item>
			<item>
				<title>利用 jQuery Mobile 制作 wordpress 手机主题</title>
				<link>https://blog.zhourunsheng.com/2012/03/%e5%88%a9%e7%94%a8-jquery-mobile-%e5%88%b6%e4%bd%9c-wordpress-%e6%89%8b%e6%9c%ba%e4%b8%bb%e9%a2%98/</link>
				<pubDate>Tue, 06 Mar 2012 21:59:46 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/03/%e5%88%a9%e7%94%a8-jquery-mobile-%e5%88%b6%e4%bd%9c-wordpress-%e6%89%8b%e6%9c%ba%e4%b8%bb%e9%a2%98/</guid>
				<description>&lt;p&gt;jQuery Mobile 作为一款十分优秀的 Javascript 开发框架，可以用来方便的开发面向手持设备的网站和Web APP。&lt;/p&gt;&#xA;&lt;p&gt;本文就带领大家使用 jQuery Mobile 来制作一款 wordpress 的手机主题。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2012/05/01.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;示例代码演示效果如下&lt;/p&gt;&#xA;&lt;h2 id=&#34;主题制作步骤&#34;&gt;主题制作步骤&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;我们可以从头开始来制作一款主题，不过为了节省制作主题的时间，示例代码是通过客制化另外一款主题来实现的，首先需要下载一款 BLANK-Theme&lt;/p&gt;&#xA;&lt;p&gt;的 wordpress 主题，该主题除了样式 style 没有定义以外，其他的功能都基本已经实现了，通过修改文件 style.css，您可以修改该主题的名字，也可以客制化该主题的样式。&lt;/p&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;修改 Header 和 Footer&lt;/p&gt;&#xA;&lt;p&gt;既然要制作手机主题，首先需要引用 jQuery 和 jQuery Mobile 开发库，您可以把这些开发库下载到自己的Server上，也可以利用JQuery的CDN Server，推荐利用CDN加速，这些库的加载速度会快很多，同时也可以为您的服务器节省流量。&lt;/p&gt;&#xA;&lt;p&gt;修改 header.php 文件，在&amp;lt;head&amp;gt; 和&amp;lt;/head&amp;gt; 的标签中添加如下代码：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;link rel=&amp;#34;stylesheet&amp;#34; href=&amp;#34;http://code.jquery.com/mobile/1.0.1/jquery.mobile-1.0.1.min.css&amp;#34; /&amp;gt;&#xA;&amp;lt;script src=&amp;#34;http://code.jquery.com/jquery-1.7.1.min.js&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;&#xA;&amp;lt;script src=&amp;#34;http://code.jquery.com/mobile/1.0.1/jquery.mobile-1.0.1.min.js&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;因为 jQuery Mobile 使用 HTML5, 我们需要修改 doctype。更新 Header 如下:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;&#xA;&amp;lt;html &amp;lt;?php language_attributes(); ?&amp;gt;&amp;gt;&#xA;&amp;lt;head&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;接下来，替换从 &amp;lt;body &amp;lt;?php body_class(); ?&amp;gt;&amp;gt; 标签开始的全部内容如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;body &amp;lt;?php body_class(); ?&amp;gt;&amp;gt;&#xA;&amp;lt;div data-role=&amp;#34;page&amp;#34; data-theme=&amp;#34;b&amp;#34; id=&amp;#34;jqm-home&amp;#34;&amp;gt;&#xA;&amp;lt;div data-role=&amp;#34;header&amp;#34;&amp;gt;&#xA;&amp;lt;h1&amp;gt;&amp;lt;?php bloginfo(&amp;#39;name&amp;#39;); ?&amp;gt;&amp;lt;/h1&amp;gt;&#xA;&amp;lt;/div&amp;gt;&#xA;&#xA;&amp;lt;div data-role=&amp;#34;content&amp;#34;&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然后开始修改 footer.php 文件，替换为如下内容：&lt;/p&gt;</description>
			</item>
			<item>
				<title>留言</title>
				<link>https://blog.zhourunsheng.com/messages/</link>
				<pubDate>Wed, 29 Feb 2012 21:35:35 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/messages/</guid>
				<description></description>
			</item>
			<item>
				<title>友情链接</title>
				<link>https://blog.zhourunsheng.com/links/</link>
				<pubDate>Wed, 29 Feb 2012 21:34:31 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/links/</guid>
				<description></description>
			</item>
			<item>
				<title>PhoneGap入门之问题解读</title>
				<link>https://blog.zhourunsheng.com/2012/02/phonegap%e5%85%a5%e9%97%a8%e4%b9%8b%e9%97%ae%e9%a2%98%e8%a7%a3%e8%af%bb/</link>
				<pubDate>Sat, 18 Feb 2012 10:30:39 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/02/phonegap%e5%85%a5%e9%97%a8%e4%b9%8b%e9%97%ae%e9%a2%98%e8%a7%a3%e8%af%bb/</guid>
				<description>&lt;p&gt;很多PhoneGap新手总是需要一些基础问题的解答，Adobe技术布道师Andrew Trice常在其博文中回答诸如” PhoneGap是什么?”、“phonegap应用开发出来是什么样的形态?”、“如何开发phonegap?”等问题。近日他将这些问题回答整理成文以帮助开发者理解和使用PhoneGap。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1-phonegap是什么&#34;&gt;1. PhoneGap是什么?&lt;/h2&gt;&#xA;&lt;p&gt;PhoneGap是一个基于HTML和JavaScript的应用开发平台，使用它可以构建本地应用。你可以把PhoneGap看作一个正方形的web view container，它使用JavaScript编程接口实现用户在不同操作系统下的访问。你可以利用传统的web开发技术(如HTML、CSS、JavaScript )开发用户接口，利用PhoneGap容器把它们部署到不同的应用环境和设备上。&lt;/p&gt;&#xA;&lt;p&gt;PhoneGap可以被用来开发跨平台的应用，这些平台包括Apple iOS、Google Android,、Windows Phone、BlackBerry、HP WebOS,、Symbian 和 Bada。你可以通过链接&lt;a href=&#34;http://phonegap.com/about/features&#34;&gt;http://phonegap.com/about/features&lt;/a&gt; 获取更多关于PhoneGap支持的平台及其特色功能的信息。&lt;/p&gt;&#xA;&lt;p&gt;PhoneGap是一个开源的框架，用户可以去&lt;a href=&#34;http://incubator.apache.org/projects/callback.html&#34;&gt;http://incubator.apache.org/projects/callback.html&lt;/a&gt;获取更多信息。&lt;/p&gt;&#xA;&lt;h2 id=&#34;2开发出的phonegap应用是什么样的形态&#34;&gt;2.开发出的PhoneGap应用是什么样的形态？&lt;/h2&gt;&#xA;&lt;p&gt;由于UI绘制引擎就是移动设备的内置web浏览器，所以PhoneGap应用的形态可能多种多样。你可以使用标准的HTML&amp;amp;CSS使它看起来就像一个简单的网页，也可以使用UI框架使它像jQuery UI, Kendo UI, Sencha, Twitter Bootstrap或Skeleton(或者其它任意基于HTML/CSS/JS的用户框架接口)。另外你也可以采用CSS模式/主题使它看起来就像一个本地应用，如模仿iOS 和 Android的iUI，模仿BlackBerry的bbUI。&lt;/p&gt;&#xA;&lt;p&gt;PhoneGap应用可以是基于HTML的静态UIs，也可以是利用JavaScript开发具有动态效果和交互体验动态UIs。这取决于特定的应用、用户体验设计、受众目标以及指示PhoneGap应用如何出现的应用实例。&lt;/p&gt;&#xA;&lt;p&gt;使用PhoneGap应用，你可以通过缩小放大操作放大或者缩小查看的内容，或者利用利用viewport metadata tag锁定浏览内容的大小。你可以利用常规浏览器的操作方式滚动浏览网页也可以像iScroll一样采用基于接触的滑动方式浏览网页。&lt;/p&gt;&#xA;&lt;p&gt;基于HTML, CSS &amp;amp; JavaScript你有许多方式可以创建用户接口，所以并没有一个典型的外观。如果你没有使用任何的CSS模式，那么用户接口各元素默认和使用的操作系统或者浏览器保持一致，包括按钮、链接、色彩以及亮度。这时PhoneGap应用和操作系统默认的浏览器一样运行。&lt;/p&gt;&#xA;&lt;h2 id=&#34;3-如何利用phonegap开发应用&#34;&gt;3. 如何利用PhoneGap开发应用？&lt;/h2&gt;&#xA;&lt;p&gt;利用PhoneGap开发应用非常简单，90%的PhoneGap应用只需要一个文本编辑器即可。PhoneGap也能很容易的与特定的设备整合形成开发环境。具体可以参考以各应用平台上的开发指导链接：•iOS: &lt;a href=&#34;http://phonegap.com/start#ios-x4&#34;&gt;http://phonegap.com/start#ios-x4&lt;/a&gt;&#xA;•Android: &lt;a href=&#34;http://phonegap.com/start#android&#34;&gt;http://phonegap.com/start#android&lt;/a&gt;&#xA;•BlackBerry: &lt;a href=&#34;http://phonegap.com/start#blackberry&#34;&gt;http://phonegap.com/start#blackberry&lt;/a&gt;&#xA;•Windows Phone: &lt;a href=&#34;http://phonegap.com/start#wp&#34;&gt;http://phonegap.com/start#wp&lt;/a&gt;&#xA;•WebOS: &lt;a href=&#34;http://phonegap.com/start#webos&#34;&gt;http://phonegap.com/start#webos&lt;/a&gt;&#xA;•Symbian: &lt;a href=&#34;http://phonegap.com/start#symbian&#34;&gt;http://phonegap.com/start#symbian&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://farm8.staticflickr.com/7064/6894224509_93c1ceee58_d.jpg&#34; alt=&#34;phonegap_platforms&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;在开发PhoneGap应用应用时，一定要谨记你是在web浏览器实例中运行代码。你是利用HTML和JavaScript开发应用而不是本地代码，因此不需要其它任何东西。实际上我的大部分开发都是利用HTML编辑器和Chrome浏览器实现的。当我需要在设备上做测试的时候再切换到特定的设备环境。&lt;/p&gt;&#xA;&lt;h2 id=&#34;4-如何调试phonegap应用&#34;&gt;4. 如何调试PhoneGap应用？&lt;/h2&gt;&#xA;&lt;p&gt;调试PhoneGap应用是PhoneGap开发过程中最棘手部分。只在物理设备上测试，并不能测试出所有的JavaScript异常。下面是一些具体的调式策略：&lt;strong&gt;尽可能利用桌面浏览器调试&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;由于PhoneGap应用是利用HTML, CSS, and JavaScript进行开发的，你可以利用HTML编辑器开发大部分应用然后利用桌面web浏览器调试。最新版本的web浏览器(包括Chrome、IE、Firefox、Opera 和Safari)都提供了丰富的调试功能。利用web浏览器开发工具，你可以检查HTML DOM元素，检查CSS的模式、设置JavaScript断点、检查内存和JavaScript变量。通过下面链接可以获得更多更多关于桌面浏览器开发工具的信息：&lt;/p&gt;&#xA;&lt;p&gt;•Chrome Developer Tools: &lt;a href=&#34;http://code.google.com/chrome/devtools/docs/overview.html&#34;&gt;http://code.google.com/chrome/devtools/docs/overview.html&lt;/a&gt;&#xA;•Firefox via FireBug: &lt;a href=&#34;http://getfirebug.com/&#34;&gt;http://getfirebug.com/&lt;/a&gt;&#xA;•Safari Developer Tools: &lt;a href=&#34;https://developer.apple.com/technologies/safari/developer-tools.html&#34;&gt;https://developer.apple.com/technologies/safari/developer-tools.html&lt;/a&gt;&#xA;•IE Developer Tools: &lt;a href=&#34;http://msdn.microsoft.com/en-us/ie/aa740478&#34;&gt;http://msdn.microsoft.com/en-us/ie/aa740478&lt;/a&gt;&#xA;•Opera Developer Tools: &lt;a href=&#34;http://dev.opera.com/articles/view/opera-developer-tools/&#34;&gt;http://dev.opera.com/articles/view/opera-developer-tools/&lt;/a&gt; 你一旦利用桌面工具开发了应用的主要功能，便可以切换到特定的设备环境增加特定的设备功能并与PhoneGap APIs整合。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android 多APK设计专题之为不同的API Level创建不同的应用APK</title>
				<link>https://blog.zhourunsheng.com/2012/02/android-%e5%a4%9aapk%e8%ae%be%e8%ae%a1%e4%b8%93%e9%a2%98%e4%b9%8b%e4%b8%ba%e4%b8%8d%e5%90%8c%e7%9a%84api-level%e5%88%9b%e5%bb%ba%e4%b8%8d%e5%90%8c%e7%9a%84%e5%ba%94%e7%94%a8apk/</link>
				<pubDate>Tue, 07 Feb 2012 22:00:32 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/02/android-%e5%a4%9aapk%e8%ae%be%e8%ae%a1%e4%b8%93%e9%a2%98%e4%b9%8b%e4%b8%ba%e4%b8%8d%e5%90%8c%e7%9a%84api-level%e5%88%9b%e5%bb%ba%e4%b8%8d%e5%90%8c%e7%9a%84%e5%ba%94%e7%94%a8apk/</guid>
				<description>&lt;p&gt;多APK支持是 Android Market 的一个新特性，它允许您为同一款应用对应不同的设备API Level 创建不同的APK，Android Market 会自动进行管理，通过识别用户设备的系统等级，比如2.2，2.3，4.0等等，然后会选择适合该设备的APK来让用户安装。&lt;/p&gt;&#xA;&lt;p&gt;为不同的API Level设计的APK，可以进行特别的优化设置，比如GL纹理设置，API级别，屏幕尺寸，或其中的多个组合。&lt;/p&gt;&#xA;&lt;p&gt;本节课就带领大家熟悉一下多APK的设计思路，您可以从中找到必要的开发工具和开发维护多个版本APK的方法。&lt;/p&gt;&#xA;&lt;h2 id=&#34;确认您需要多个apks&#34;&gt;确认您需要多个APKs&lt;/h2&gt;&#xA;&lt;p&gt;当您设计一款应用程序，为了满足多版本多设备之间的需求，在不牺牲向后兼容性的情况下，又可以利用最新版本的新特性，似乎多APK支持是个不错的解决方案。但事实并非如此，您可以通过阅读资料《&lt;a href=&#34;http://developer.android.com/guide/market/publishing/multiple-apks.html&#34;&gt;Using Single APK Instead&lt;/a&gt; 》和《&lt;a href=&#34;http://android-developers.blogspot.com/2010/07/how-to-have-your-cupcake-and-eat-it-too.html&#34;&gt;this article&lt;/a&gt;》来学习怎样在单一APK中实现上面提到的功能需求，以及怎样利用我们的支持库，同时也可以了解一下如何来编码实现。&lt;/p&gt;&#xA;&lt;p&gt;使用单一APK有如下优势：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;发布和测试更容易&lt;/li&gt;&#xA;&lt;li&gt;只需要维护一个代码库&lt;/li&gt;&#xA;&lt;li&gt;应用程序能够自适应设备配置的变化&lt;/li&gt;&#xA;&lt;li&gt;应用恢复功能跨设备通用&lt;/li&gt;&#xA;&lt;li&gt;应用升级容易&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;本文的余下章节，假定您已经认为您确实需要多APKs的解决方案，而不使用单一 APK 的方法。&lt;/p&gt;&#xA;&lt;h2 id=&#34;图示化需求&#34;&gt;图示化需求&lt;/h2&gt;&#xA;&lt;p&gt;可以通过创建一个简单的图表来确定需要几个APK来支持，以及每个APK与之对应的API Level范围。您可以在Android 平台版本的信息页面（&lt;a href=&#34;http://developer.android.com/resources/dashboard/platform-versions.html&#34;&gt;Platform Versions&lt;/a&gt; ）中找到有用的参考资料，通过这种方法可以快速确定需要的APK个数和每个APK对应的API Level范围，尤其在出现API Level范围有重叠情况的时候更加有效，同时也方便了日后参考。&lt;/p&gt;&#xA;&lt;p&gt;创建一个水平的列表来表示出当前已经发布的Android 版本号，在列表的最后一个位置放置一个+号来代表未来发布的版本。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | + |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;对上面的列表进行着色，每一种颜色对应一个APK，之后您的团队就可以以此来进行讨论还开发。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | + |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;设计公共库&#34;&gt;设计公共库&lt;/h2&gt;&#xA;&lt;p&gt;无论是修改已有的代码做二次开发，还是从头开发一个新的应用，第一件事情就是提取公共的代码库，这些代码可以被不同的应用使用，并且只需要在一处编写和维护，比如多语言支持（language-localized strings），颜色主题（color themes），bug修复代码等，提供公共代码可以大大提高开发效率和节省开发时间，以及降低更新代码时引入的错误。&lt;/p&gt;</description>
			</item>
			<item>
				<title>关于Java程序自动发布文章到百度空间的程序更新</title>
				<link>https://blog.zhourunsheng.com/2012/02/%e5%85%b3%e4%ba%8ejava%e7%a8%8b%e5%ba%8f%e8%87%aa%e5%8a%a8%e5%8f%91%e5%b8%83%e6%96%87%e7%ab%a0%e5%88%b0%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4%e7%9a%84%e7%a8%8b%e5%ba%8f%e6%9b%b4%e6%96%b0/</link>
				<pubDate>Sun, 05 Feb 2012 13:21:09 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/02/%e5%85%b3%e4%ba%8ejava%e7%a8%8b%e5%ba%8f%e8%87%aa%e5%8a%a8%e5%8f%91%e5%b8%83%e6%96%87%e7%ab%a0%e5%88%b0%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4%e7%9a%84%e7%a8%8b%e5%ba%8f%e6%9b%b4%e6%96%b0/</guid>
				<description>&lt;p&gt;利用Java程序自动发送博客文章到百度空间，可以参照我的博文《&lt;a href=&#34;/2011/07/java%E7%A8%8B%E5%BA%8F%E8%87%AA%E5%8A%A8%E5%8F%91%E5%B8%83%E6%96%87%E7%AB%A0%E5%88%B0%E7%99%BE%E5%BA%A6%E7%A9%BA%E9%97%B4/&#34;&gt;Java程序自动发布文章到百度空间&lt;/a&gt;》，通过修改程序的源码，主要是登录账户的信息就可以进行代码测试。&lt;/p&gt;&#xA;&lt;p&gt;2012年开始，百度空间的博文发布系统进行了一些调整，主要是变更了一些请求的API参数和URL地址，以及增加跨域检测，提高了安全性，所以旧的代码无法正常工作，更新过的可以正常工作的代码在本文的最后有下载链接。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;主要变更点如下：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;百度空间的登录 params.put(&amp;ldquo;mem_pass&amp;rdquo;, &amp;ldquo;on&amp;rdquo;);&lt;/li&gt;&#xA;&lt;li&gt;添加博文类别 params.put(&amp;ldquo;spIsBlogCatAdd&amp;rdquo;, &amp;ldquo;1&amp;rdquo;);&lt;/li&gt;&#xA;&lt;li&gt;博文发布参数变更：params.put(&amp;ldquo;previewImg&amp;rdquo;, &amp;ldquo;&amp;rdquo;); 提交地址变更：private static final String SUBMIT_CREATBLOG_URL = &amp;ldquo;&lt;a href=&#34;http://hi.baidu.com/%22&#34;&gt;http://hi.baidu.com/&amp;quot;&lt;/a&gt; + Config.USERNAME + &amp;ldquo;/blog/submit/createblog&amp;rdquo;;&lt;/li&gt;&#xA;&lt;li&gt;跨域检测 httpPost.setRequestHeader(&amp;ldquo;Referer&amp;rdquo;, refURL);&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;strong&gt;代码下载&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;程序源码 &lt;a href=&#34;http://carey-blog-image.googlecode.com/files/BaiduCreateBlog%2820120205%29.zip&#34;&gt;BaiduCreateBlog(20120205)&lt;/a&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>分享考《系统架构设计师》的心得</title>
				<link>https://blog.zhourunsheng.com/2012/02/%e5%88%86%e4%ba%ab%e8%80%83%e3%80%8a%e7%b3%bb%e7%bb%9f%e6%9e%b6%e6%9e%84%e8%ae%be%e8%ae%a1%e5%b8%88%e3%80%8b%e7%9a%84%e5%bf%83%e5%be%97/</link>
				<pubDate>Wed, 01 Feb 2012 23:12:39 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/02/%e5%88%86%e4%ba%ab%e8%80%83%e3%80%8a%e7%b3%bb%e7%bb%9f%e6%9e%b6%e6%9e%84%e8%ae%be%e8%ae%a1%e5%b8%88%e3%80%8b%e7%9a%84%e5%bf%83%e5%be%97/</guid>
				<description>&lt;p&gt;2011年11月中旬参加了系统架构设计师的考试，考试还算比较顺利，顺利通过了国家分数线，获得了资格证书。除去考试不说，在准备考试的这段时间里了解了一下架构设计的主要工作，和做架构设计的理论知识和一些成熟的架构方案，对自己以后的实际工作有很大的帮助。&lt;/p&gt;&#xA;&lt;p&gt;算算自己准备了将近两个月的时间，差不多从9月份开始着手准备，基本上也都是工作外的时间，每天抽空看看书，复习复习，除非项目特别吃紧，比如到了项目发布的阶段，平时的时间还算比较充足，前期就是买书，找资料和了解一下考试的背景知识，中期主要就是熟悉考试题型，看看历年的考试题，做做参考书课后的习题，后期基本上就是试着做做模拟题，好好准备一下论文设计方面的知识，基本可以分成下面一些阶段。&lt;/p&gt;&#xA;&lt;h2 id=&#34;前期准备&#34;&gt;【前期准备】&lt;/h2&gt;&#xA;&lt;p&gt;9月份到10月份一个月的时间基本就是补充基础知识，其实好多大学的课程都已经学习过了，无奈毕业以后就基本不怎么看书了，忘了很多，不过比起从头来学还是轻松了很多，这一段时间的准备怎么也像当初考研的总复习，O(∩_∩)O哈哈~。&lt;/p&gt;&#xA;&lt;p&gt;参考书籍：《系统架构设计师考试全程指导》和《系统架构设计师教程》&lt;/p&gt;&#xA;&lt;p&gt;这两本书基础知识基本上涵盖齐全了，后一本书可以粗略看一次，了解一下架构设计师需要的主要背景理论知识，前一本书推荐看两次，第一次算是过一下主要的理论知识点，能记住多少算多少，第二次顺便做一下课后的习题，实际上题目也没几道，每个章节也才不到20道题目，便于加深理解，同时重点记忆一些关键的知识点。&lt;/p&gt;&#xA;&lt;p&gt;【中期准备】 10月份到11月份这一个月基本上就是熟悉考试的题型，了解一下考试题目是什么样子的，主要考什么，哪些是重点，案例分析题目怎么解答等等。&lt;/p&gt;&#xA;&lt;p&gt;参考书籍：《系统架构设计师考试试题分类精解与题型练习》和 《系统分析师考试案例分析与设计试题分类精解》&lt;/p&gt;&#xA;&lt;p&gt;可以看一下历年的考题，相信大家考试也都不少了，最具有参考价值的题目仍旧是历年的真题，虽说系统架构师自从09年才开始，毕竟和系统分析师还是类似的，所以系统分析师的题目也可以拿来做参考。总得来说，通过本书试着做一些题目，了解一下历年考过的知识，和简答题目的方法，尤其是下午的案例分析题，难度相对比较高，可以重点学习一下回答这类题目的方法。&lt;/p&gt;&#xA;&lt;p&gt;网络知识：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;InfoQ的《架构师》专刊，每月一期，内容比较新，大家可以有空阅读，参考网址：&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.infoq.com/cn/architect/&#34;&gt;http://www.infoq.com/cn/architect/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;Google Reader，订阅一些IT时事新闻周刊，新闻报道和软件开发技术，follow几个牛人博客，这都是汇集知识的不错方法，参考网址：&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.google.com/reader/view&#34;&gt;https://www.google.com/reader/view&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;网上找一下最近半年左右的技术分享报告，技术分享文章和IT行业评测报告什么的，紧跟IT潮流&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;后期准备&#34;&gt;【后期准备】&lt;/h2&gt;&#xA;&lt;p&gt;11月份，考试前夕，这段时间主要是知识总结和准备论文方面的工作。架构知识涉及面太广，不可能面面俱到，所有的知识都非常熟悉，必要的背景知识相信通过前段时间的学习，基本也就OK了，现在重点是论文设计了。一来，论文的字数比较多，2个小时的考试时间，写3000字的论文，还要扣除包括审题，概要什么的时间花费，练习练习动手写作能力还是非常重要的。我自己就因为这段时间没准备好，所以在考场上基本上休息时间没超过5分钟，从头至尾都在写字，直到收卷前4-5分钟也才写完和校验完，可以说是时间刚刚好，如果及早能练练手的话，相信语言的组织了，字迹的工整程度了，都能提高不少。二来，选择自己在近两年时间内做过的印象最深的一个项目，从项目的整体角度考虑，需求分析了，架构设计了，软件测试了，认为能够以宏观角度概括的，都可以整理一下，这都是用来写作的素材，像我今年论文的主题就是论需求分析的获取。三来，就是细化自己在项目中所做的工作，不要泛泛而谈，举实例出来，提出解决方案，这就是论文的论据。&lt;/p&gt;&#xA;&lt;p&gt;其实论文这块，题目本身比较灵活，结合自己的实际项目经验来写，相对来说容易许多，内容也不会显得太空洞。同时可以网上参考一下历年的优秀论文，了解一下开头怎么写，中间内容怎么写，结尾怎么写，使文章读起来整体有一气呵成的感觉，免得写的不着边际，跑题了。&lt;/p&gt;&#xA;&lt;p&gt;参考书籍：《系统架构设计师考试考前冲刺预测卷及考点解析》&lt;/p&gt;&#xA;&lt;p&gt;这个类似于模拟考试，时间不足的话做个一套到二套熟悉一下考试的范围，我也考前仅仅做了一套，主要是练练手，查缺补漏，看看平时有没有漏掉的重要知识点，同时把握一下答题的时间，选择题，案例分析题和论文题的时间安排。&lt;/p&gt;&#xA;&lt;h2 id=&#34;总结&#34;&gt;【总结】&lt;/h2&gt;&#xA;&lt;p&gt;总的来说，基础知识还是要花大工夫的，毕竟涉及的知识面比较广泛，操作系统了，网络了，数据库了，信息系统了，软件架构设计了，知识产权了等等。有些是了解的，有些是要重点掌握的，在复习基础知识的时候可以归类记忆。&lt;/p&gt;&#xA;&lt;p&gt;再着，要多了解一下当前互联网产业的热门技术，毕竟做架构设计工作也是与时俱进的，现在都有好多的成熟架构解决方案，平时多了解和积累一些。&lt;/p&gt;&#xA;&lt;p&gt;最后，也最重要，在实际的项目中把所积累的知识运用一下，不仅对自己做设计工作有好处，同时对考试来说，案例分析和论文设计也就比较容易上手了，不然的话，那就真是纸上谈兵了。考试的时候无从下手，不容易答题。&lt;/p&gt;&#xA;&lt;p&gt;这算是自己考架构设计师的一点心得体会，难免有不足之处，相信大家只要认真准备了，考试还是比较容易过的，重要的是自己在工作中做架构设计的时候也能得心应手，灵活做设计，最后也预祝大家都能考个好成绩！！！&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android 相片管理专题之相机操作</title>
				<link>https://blog.zhourunsheng.com/2012/01/android-%e7%9b%b8%e7%89%87%e7%ae%a1%e7%90%86%e4%b8%93%e9%a2%98%e4%b9%8b%e7%9b%b8%e6%9c%ba%e6%93%8d%e4%bd%9c/</link>
				<pubDate>Thu, 12 Jan 2012 19:57:14 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/01/android-%e7%9b%b8%e7%89%87%e7%ae%a1%e7%90%86%e4%b8%93%e9%a2%98%e4%b9%8b%e7%9b%b8%e6%9c%ba%e6%93%8d%e4%bd%9c/</guid>
				<description>&lt;p&gt;本节课主要讲述怎样通过调用系统的framework APIs来控制设备的摄像头操作。&lt;/p&gt;&#xA;&lt;p&gt;相比调用系统内置的其他相机应用来拍照和摄像，自己编写代码来直接控制相机操作需要更多的工作，然而，如果您要设计一款专业的拍照应用，或者相机功能与您的UI界面进行深度整合，那么您可以从本节课找到所需的知识。&lt;/p&gt;&#xA;&lt;h2 id=&#34;开启相机&#34;&gt;开启相机&lt;/h2&gt;&#xA;&lt;p&gt;自己编写代码控制相机的第一步就是获得一个&lt;a href=&#34;http://developer.android.com/reference/android/hardware/Camera.html&#34;&gt;Camera&lt;/a&gt; 实例对象，与Android系统内置的其他相机应用类似，推荐的方法是在&lt;a href=&#34;http://developer.android.com/reference/android/app/Activity.html#onCreate(android.os.Bundle)&#34;&gt;onCreate()&lt;/a&gt;方法中启动一个新的线程来开启相机，因为这个过程可能比较耗时，新启一个线程来处理可以有效避免UI主线程的停顿，另一种方式是将开启相机的过程推迟到 &lt;a href=&#34;http://developer.android.com/reference/android/app/Activity.html#onResume()&#34;&gt;onResume()&lt;/a&gt; 方法中，这样便于代码的重用和简化流程控制。&lt;/p&gt;&#xA;&lt;p&gt;如果此时有其他应用正在使用相机，那么当您的程序调用方法&lt;a href=&#34;http://developer.android.com/reference/android/hardware/Camera.html#open()&#34;&gt;Camera.open()&lt;/a&gt; 的时候会出现异常，需要进行捕获（ try block）。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;   private boolean safeCameraOpen(int id) {&#xA;     boolean qOpened = false;&#xA;  &#xA;     try {&#xA;       releaseCameraAndPreview();&#xA;       mCamera = Camera.open(id);&#xA;       qOpened = (mCamera != null);&#xA;     } catch (Exception e) {&#xA;       Log.e(getString(R.string.app_name), &amp;#34;failed to open Camera&amp;#34;);&#xA;       e.printStackTrace();&#xA;     }&#xA;     return qOpened;&#xA;   }&#xA;&#xA;   private void releaseCameraAndPreview() {&#xA;     mPreview.setCamera(null);&#xA;     if (mCamera != null) {&#xA;       mCamera.release();&#xA;       mCamera = null;&#xA;     }&#xA;   }&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;从 API level 9 开始，camera framework 支持用户程序控制多个相机，如果您在调用方法&lt;a href=&#34;http://developer.android.com/reference/android/hardware/Camera.html#open()&#34;&gt;open()&lt;/a&gt; 的时候没有传递任何参数，那么系统会默认启动Androd设备的第一个后置摄像头。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android 相片管理专题之视频捕捉</title>
				<link>https://blog.zhourunsheng.com/2012/01/android-%e7%9b%b8%e7%89%87%e7%ae%a1%e7%90%86%e4%b8%93%e9%a2%98%e4%b9%8b%e8%a7%86%e9%a2%91%e6%8d%95%e6%8d%89/</link>
				<pubDate>Wed, 11 Jan 2012 23:11:37 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/01/android-%e7%9b%b8%e7%89%87%e7%ae%a1%e7%90%86%e4%b8%93%e9%a2%98%e4%b9%8b%e8%a7%86%e9%a2%91%e6%8d%95%e6%8d%89/</guid>
				<description>&lt;p&gt;这节课主要讲述怎样利用设备已安装的相机应用程序来进行视频捕捉。&lt;/p&gt;&#xA;&lt;p&gt;假如您的应用中有一个功能是视频整合，但是您又不想编写太复杂的代码来自己控制相机的视频捕捉，幸好，大多数Android设备已至少安装有一个相机程序，本课程就教您怎么样利用设备自带的相机应用来拍摄视频。&lt;/p&gt;&#xA;&lt;h2 id=&#34;申请相机权限&#34;&gt;申请相机权限&lt;/h2&gt;&#xA;&lt;p&gt;如果您的应用的基本功能就是拍照或拍摄视频，需要在Android Market 中进行可见性限制，只有拥有摄像头的设备才能浏览和下载您的应用程序，那么您需要在manifest 文件的&lt;a href=&#34;http://developer.android.com/guide/topics/manifest/uses-feature-element.html&#34;&gt;&amp;lt; uses-feature &amp;gt;&lt;/a&gt; tag中加入权限限制。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;   &amp;lt;manifest ... &amp;gt;&#xA;     &amp;lt;uses-feature android:name=&amp;#34;android.hardware.camera&amp;#34; /&amp;gt;&#xA;     ...&#xA;   &amp;lt;/manifest ... &amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果您的应用在设备没有相机的情况下仍能正常工作，那么可以在该tag中加入android:required=&amp;ldquo;false&amp;rdquo;。设定以后，所有的设备不管有没有摄像头都可以在Android Market 上面浏览和下载您的应用。但是，您需要自己在运行时检测设备是否有摄像头，调用方法&lt;a href=&#34;http://developer.android.com/reference/android/content/pm/PackageManager.html#hasSystemFeature(java.lang.String)&#34;&gt;hasSystemFeature(PackageManager.FEATURE_CAMERA)&lt;/a&gt;即可，如果相机不可用，那么您就需要禁用应用中与拍照或拍摄视频有关的功能模块。&lt;/p&gt;&#xA;&lt;h2 id=&#34;用相机录制视频&#34;&gt;用相机录制视频&lt;/h2&gt;&#xA;&lt;p&gt;在Andriod系统中，您的应用要委托其他的应用帮忙完成一些工作，可以使用&lt;a href=&#34;http://developer.android.com/reference/android/content/Intent.html&#34;&gt;Intent&lt;/a&gt;，把期望完成的任务和参数列表设置到&lt;a href=&#34;http://developer.android.com/reference/android/content/Intent.html&#34;&gt;Intent&lt;/a&gt;中，然后通过系统广播出去，最后当其他应用完成工作的时候，您的应用可以收到一个反馈信息，在回调函数中就可以取得任务处理结果。调用相机程序录制视频的过程与上面描述的类似，有三个关注点，定义拍摄视频的 &lt;a href=&#34;http://developer.android.com/reference/android/content/Intent.html&#34;&gt;Intent&lt;/a&gt;，启动其他相机应用&lt;a href=&#34;http://developer.android.com/reference/android/app/Activity.html&#34;&gt;Activity&lt;/a&gt;，处理拍摄后的视频流数据。&lt;/p&gt;&#xA;&lt;p&gt;示例代码，启动视频录制应用&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;   private void dispatchTakeVideoIntent() {&#xA;    Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);&#xA;    startActivityForResult(takeVideoIntent, ACTION_TAKE_VIDEO);&#xA;  }&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;一个好的习惯是，在调用上面的代码前首先检查设备中是否有内置相机应用程序可以处理您的请求，示例代码如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;   public static boolean isIntentAvailable(Context context, String action) {&#xA;    final PackageManager packageManager = context.getPackageManager();&#xA;    final Intent intent = new Intent(action);&#xA;    List&amp;lt;ResolveInfo&amp;gt; list =&#xA;        packageManager.queryIntentActivities(intent,&#xA;            PackageManager.MATCH_DEFAULT_ONLY);&#xA;    return list.size() &amp;gt; 0;&#xA;  }&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;查看视频&#34;&gt;查看视频&lt;/h2&gt;&#xA;&lt;p&gt;捕获的视频流数据会通过回调函数[onactivityresult()](&lt;a href=&#34;http://developer.android.com/reference/android/app/Activity.html#onActivityResult(int&#34;&gt;http://developer.android.com/reference/android/app/Activity.html#onActivityResult(int&lt;/a&gt;, int, android.content.Intent))返回到您的应用中，您可以从 &lt;a href=&#34;http://developer.android.com/reference/android/content/Intent.html&#34;&gt;Intent&lt;/a&gt;中获得该视频数据的&lt;a href=&#34;http://developer.android.com/reference/android/net/Uri.html&#34;&gt;Uri&lt;/a&gt;地址，示例代码展示了如何将捕获到的视频数据显示在&lt;a href=&#34;http://developer.android.com/reference/android/widget/VideoView.html&#34;&gt;VideoView&lt;/a&gt;界面中。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android 相片管理专题之拍照功能</title>
				<link>https://blog.zhourunsheng.com/2012/01/android-%e7%9b%b8%e7%89%87%e7%ae%a1%e7%90%86%e4%b8%93%e9%a2%98%e4%b9%8b%e6%8b%8d%e7%85%a7%e5%8a%9f%e8%83%bd/</link>
				<pubDate>Tue, 10 Jan 2012 23:06:17 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/01/android-%e7%9b%b8%e7%89%87%e7%ae%a1%e7%90%86%e4%b8%93%e9%a2%98%e4%b9%8b%e6%8b%8d%e7%85%a7%e5%8a%9f%e8%83%bd/</guid>
				<description>&lt;p&gt;这节课主要讲述怎样利用设备已安装的其他照相应用程序来拍摄照片。&lt;/p&gt;&#xA;&lt;p&gt;例如您想要实现一个气象服务的APP，用来把全球的天气图片收集在一起，整合这些图片只是您应用程序的一部分工作，但是您又不想编写太复杂的代码来自己控制相机的拍照，幸好，大多数Android设备已至少安装有一个拍照程序，本课程就教您怎么样利用设备自带的拍照应用来拍摄这些图片。&lt;/p&gt;&#xA;&lt;h2 id=&#34;申请相机权限&#34;&gt;申请相机权限&lt;/h2&gt;&#xA;&lt;p&gt;如果您的应用的基本功能就是拍照，需要在Android Market 中进行可见性限制，只有拥有摄像头的设备才能浏览和下载您的应用程序，那么您需要在manifest 文件的&lt;a href=&#34;http://developer.android.com/guide/topics/manifest/uses-feature-element.html&#34;&gt;&amp;lt; uses-feature &amp;gt;&lt;/a&gt; tag中加入权限限制。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;   &amp;lt;manifest ... &amp;gt;&#xA;     &amp;lt;uses-feature android:name=&amp;#34;android.hardware.camera&amp;#34; /&amp;gt;&#xA;     ...&#xA;   &amp;lt;/manifest ... &amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果您的应用在设备没有相机的情况下仍能正常工作，那么可以在该tag中加入android:required=&amp;ldquo;false&amp;rdquo;。设定以后，所有的设备不管有没有摄像头都可以在Android Market 上面浏览和下载您的应用。但是，您需要自己在运行时检测设备是否有摄像头，调用方法&lt;a href=&#34;http://developer.android.com/reference/android/content/pm/PackageManager.html#hasSystemFeature(java.lang.String)&#34;&gt;hasSystemFeature(PackageManager.FEATURE_CAMERA)&lt;/a&gt;即可，如果相机不可用，那么您就需要禁用应用中与拍照有关的功能模块。&lt;/p&gt;&#xA;&lt;h2 id=&#34;用相机程序拍照&#34;&gt;用相机程序拍照&lt;/h2&gt;&#xA;&lt;p&gt;在Andriod系统中，如果您的应用要委托其他的应用帮忙完成一些工作，可以使用&lt;a href=&#34;http://developer.android.com/reference/android/content/Intent.html&#34;&gt;Intent&lt;/a&gt;，把期望完成的任务和参数列表设置到&lt;a href=&#34;http://developer.android.com/reference/android/content/Intent.html&#34;&gt;Intent&lt;/a&gt;中，然后通过系统广播出去，最后当其他应用完成工作的时候，您的应用可以收到一个反馈信息，在回调函数中就可以取得任务处理结果。调用相机程序进行拍照，过程与上面描述的类似，有三个关注点，定义拍照的 &lt;a href=&#34;http://developer.android.com/reference/android/content/Intent.html&#34;&gt;Intent&lt;/a&gt;，启动其他相机应用&lt;a href=&#34;http://developer.android.com/reference/android/app/Activity.html&#34;&gt;Activity&lt;/a&gt;，处理拍照后的照片数据。&lt;/p&gt;&#xA;&lt;p&gt;示例代码，启动拍照应用&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;   private void dispatchTakePictureIntent(int actionCode) {&#xA;     Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);&#xA;     startActivityForResult(takePictureIntent, actionCode);&#xA;   }&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;恭喜您，通过如上的代码就可以给您的应用加入使用设备内置应用拍照的功能，当然，如果恰巧设备中没有安装任何的拍照应用，那么您的应用就有可能出错，一个好的解决办法是，在调用上面的代码前首先检查设备中是否有内置拍照应用，示例代码如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;   public static boolean isIntentAvailable(Context context, String action) {&#xA;     final PackageManager packageManager = context.getPackageManager();&#xA;     final Intent intent = new Intent(action);&#xA;     List&amp;lt;ResolveInfo&amp;gt; list =&#xA;          packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);&#xA;     return list.size() &amp;gt; 0;&#xA;   }&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;查看照片&#34;&gt;查看照片&lt;/h2&gt;&#xA;&lt;p&gt;如果您的应用不仅仅是通过设备内置的拍照应用拍摄照片，还需要对照片进行进一步的变换处理，那么您需要获得原始照片数据，拍照应用会将编码后的相片数据（small &lt;a href=&#34;http://developer.android.com/reference/android/graphics/Bitmap.html&#34;&gt;Bitmap&lt;/a&gt; ）放到&lt;a href=&#34;http://developer.android.com/reference/android/content/Intent.html&#34;&gt;Intent&lt;/a&gt;的&amp;quot;data&amp;quot;键值中，然后通过回调[onactivityresult()](&lt;a href=&#34;http://developer.android.com/reference/android/app/Activity.html#onActivityResult(int&#34;&gt;http://developer.android.com/reference/android/app/Activity.html#onActivityResult(int&lt;/a&gt;, int, android.content.Intent))返回，如下示例代码将返回后的照片数据显示到 &lt;a href=&#34;http://developer.android.com/reference/android/widget/ImageView.html&#34;&gt;ImageView&lt;/a&gt;中。&lt;/p&gt;</description>
			</item>
			<item>
				<title>WordPress 优化手记</title>
				<link>https://blog.zhourunsheng.com/2012/01/wordpress-%e4%bc%98%e5%8c%96%e6%89%8b%e8%ae%b0/</link>
				<pubDate>Mon, 09 Jan 2012 21:37:39 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/01/wordpress-%e4%bc%98%e5%8c%96%e6%89%8b%e8%ae%b0/</guid>
				<description>&lt;p&gt;个人主站建立了有一段的时间了，从域名注册，空间神马的东西鼓捣完了，国内的国外的都试过了，有些对建站有效的优化方法和代码更新，做一下记录，以后更新的时候便于查询。&lt;/p&gt;&#xA;&lt;h2 id=&#34;seo-优化工作&#34;&gt;SEO 优化工作&lt;/h2&gt;&#xA;&lt;p&gt;主要改动：header.php 改动原因：加入meta信息（网页描述“ description ”和网页关键词 &amp;ldquo;keywords &amp;ldquo;）利于搜索引擎索引&lt;/p&gt;&#xA;&lt;p&gt;代码更新：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  &amp;lt;?php&#xA;  //add by carey zhou on 2011/12/31&#xA;  // add meta keywords and description by conditionary&#xA;  function the_excerpt_max_charlength($charlength) {&#xA;   $excerpt = get_the_excerpt();&#xA;   $charlength++;&#xA;&#xA;   if ( mb_strlen( $excerpt ) &amp;gt; $charlength ) {&#xA;    $subex = mb_substr( $excerpt, 0, $charlength - 5 );&#xA;    $exwords = explode( &amp;#39; &amp;#39;, $subex );&#xA;    $excut = - ( mb_strlen( $exwords[ count( $exwords ) - 1 ] ) );&#xA;    if ( $excut &amp;lt; 0 ) {&#xA;     return mb_substr( $subex, 0, $excut );&#xA;    } else {&#xA;     return $subex;&#xA;    }&#xA;   } else {&#xA;    return $excerpt;&#xA;   }&#xA;  }&#xA;  $description = &amp;#39;&amp;#39;;&#xA;  $keywords = &amp;#39;&amp;#39;;&#xA;&#xA;  if ( is_home() || is_front_page() ) {&#xA;    $description = &amp;#39;润物无声是周润生的个人博客空间，主要用来分享和记录最新的互联网科技知识，优秀的企业架构解决方案和程序设计开发技术，同时致力于打造一个知识分享的平台。&amp;#39;;&#xA;    $keywords = &amp;#39;Technology blog, Internet news, Program development, Architecture design,科技博客,互联网新闻,程序开发,架构设计&amp;#39;;&#xA;  }&#xA;  else if (is_single()) {&#xA;    $exerpt = the_excerpt_max_charlength(200);&#xA;    if ( $exerpt != &amp;#39;&amp;#39;) {&#xA;      $description = $exerpt;&#xA;    }&#xA;    else {&#xA;     $description = $post-&amp;gt;post_title ;&#xA;    }&#xA;    $tags = wp_get_post_tags($post-&amp;gt;ID);&#xA;    foreach ($tags as $tag ) {&#xA;      $keywords = $tag-&amp;gt;name . &amp;#39;, &amp;#39; . $keywords;&#xA;    }&#xA;    $keywords = $keywords . &amp;#39;润物无声&amp;#39;;&#xA;  }&#xA;&#xA;  if ( $description != &amp;#39;&amp;#39; ): ?&amp;gt;&#xA;  &amp;lt;meta name=&amp;#34;description&amp;#34; content=&amp;#34;&amp;lt;?php echo &amp;#34;$description&amp;#34; ?&amp;gt;&amp;#34; /&amp;gt;&#xA;  &amp;lt;?php endif;&#xA;  if ( $keywords != &amp;#39;&amp;#39;): ?&amp;gt;&#xA;  &amp;lt;meta name=&amp;#34;keywords&amp;#34; content=&amp;#34;&amp;lt;?php echo &amp;#34;$keywords&amp;#34; ?&amp;gt;&amp;#34; /&amp;gt;&#xA;  &amp;lt;?php endif;&#xA;  //add by carey zhou on 2011/12/31&#xA;  ?&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;优秀分页界面&#34;&gt;优秀分页界面&lt;/h2&gt;&#xA;&lt;p&gt;主要改动：loop.php 改动原因：加入分页界面支持，方便浏览博文其他工作：需要分页插件支持：http://wordpress.org/extend/plugins/wp-pagenavi&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android 信息共享专题之ActionBar添加分享动作</title>
				<link>https://blog.zhourunsheng.com/2012/01/android-%e4%bf%a1%e6%81%af%e5%85%b1%e4%ba%ab%e4%b8%93%e9%a2%98%e4%b9%8bactionbar%e6%b7%bb%e5%8a%a0%e5%88%86%e4%ba%ab%e5%8a%a8%e4%bd%9c/</link>
				<pubDate>Sun, 08 Jan 2012 16:12:31 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/01/android-%e4%bf%a1%e6%81%af%e5%85%b1%e4%ba%ab%e4%b8%93%e9%a2%98%e4%b9%8bactionbar%e6%b7%bb%e5%8a%a0%e5%88%86%e4%ba%ab%e5%8a%a8%e4%bd%9c/</guid>
				<description>&lt;p&gt;在Android 4.0 (API Level 14)中引入的 ActionProvider 方便了在 ActionBar 中添加share action，一个 ActionProvider 一旦和 ActionBar 中的某个菜单项绑定起来，它就会负责该菜单项的界面绘画更新和事件处理。借助于 ShareActionProvider，您只需要设置一个share intent就可以了，其余的事情都交给 ShareActionProvider 来处理。&lt;/p&gt;&#xA;&lt;p&gt;注意：ShareActionProvider 要求最低 API Level 14&lt;/p&gt;&#xA;&lt;h2 id=&#34;更新菜单声明&#34;&gt;更新菜单声明&lt;/h2&gt;&#xA;&lt;p&gt;要想使用 ShareActionProviders，您需要在菜单资源文件(menu resource)的Share菜单项&amp;lt;item&amp;gt;中声明 android:actionProviderClass 属性，示例如下&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;menu xmlns:android=&amp;#34;http://schemas.android.com/apk/res/android&amp;#34;&amp;gt;       &#xA;&amp;lt;item android:id=&amp;#34;@+id/menu_item_share&amp;#34;           &#xA;android:showAsAction=&amp;#34;ifRoom&amp;#34;           &#xA;android:title=&amp;#34;Share&amp;#34;           &#xA;android:actionProviderClass=&amp;#34;android.widget.ShareActionProvider&amp;#34; /&amp;gt;       &#xA;...   &#xA;&amp;lt;/menu&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;通过如上的定义，就把该菜单项的界面显示和消息事件处理委托给 ShareActionProviders，不过具体要显示的内容还是需要您来指定。&lt;/p&gt;&#xA;&lt;h2 id=&#34;设置-share-intent&#34;&gt;设置 Share Intent&lt;/h2&gt;&#xA;&lt;p&gt;为了使 ShareActionProvider&lt;/p&gt;&#xA;&lt;p&gt;可以正常工作，您还必须要设置Share Intent。这个Share Intent和第一节课《Android 信息共享专题之内容发布》中讲解的Intent一样，需要设置其Action为 ACTION_SEND，要发送的内容通过键值 EXTRA_TEXT 或者 EXTRA_STREAM 设置到该Intent中。具体步骤如下，您首先需要在 Activity 或者 Fragment 中inflating（加载）菜单资源文件，找到上文中声明的那个菜单项 MenuItem （如 menu_item_share），接着呼叫方法 MenuItem.getActionProvider() 来获得一个 ShareActionProvider 实例，最后调用 setShareIntent() 把Share Intent和该菜单项关联起来。示例代码：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  private ShareActionProvider mShareActionProvider;&#xA;&#xA;  ...&#xA;  @Override&#xA;  public boolean onCreateOptionsMenu(Menu menu) {&#xA;      // Inflate menu resource file.&#xA;      getMenuInflater().inflate(R.menu.share_menu, menu);&#xA;&#xA;      // Locate MenuItem with ShareActionProvider&#xA;      MenuItem item = menu.findItem(R.id.menu_item_share);&#xA;&#xA;      // Fetch and store ShareActionProvider&#xA;      mShareActionProvider = (ShareActionProvider) item.getActionProvider();&#xA;&#xA;      // Return true to display menu&#xA;      return true;&#xA;  }&#xA;&#xA;  // Call to update the share intent&#xA;  private void setShareIntent(Intent shareIntent) {&#xA;      if (mShareActionProvider != null) {&#xA;          mShareActionProvider.setShareIntent(shareIntent);&#xA;      }&#xA;  }&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;您可能会选择只有在第一次创建菜单的时候设置share intent一次，其余菜单界面刷新的时候都不会再改变intent的设置了，或者也会选择每次菜单刷新的时候就重新设置intent一次，随着UI界面的改变会更新不同的intent。例如，您在Gallery app中全屏幕浏览图片的时候和滚动浏览图片的时候可能会设置不同的sharing intent。想了解更多的关于 ShareActionProvider 方面的知识，请参照 Action Bar 指南。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android 信息共享专题之内容接收</title>
				<link>https://blog.zhourunsheng.com/2012/01/android-%e4%bf%a1%e6%81%af%e5%85%b1%e4%ba%ab%e4%b8%93%e9%a2%98%e4%b9%8b%e5%86%85%e5%ae%b9%e6%8e%a5%e6%94%b6/</link>
				<pubDate>Sat, 07 Jan 2012 20:15:54 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/01/android-%e4%bf%a1%e6%81%af%e5%85%b1%e4%ba%ab%e4%b8%93%e9%a2%98%e4%b9%8b%e5%86%85%e5%ae%b9%e6%8e%a5%e6%94%b6/</guid>
				<description>&lt;p&gt;如上节课《&lt;a href=&#34;/2012/01/android-%E4%BF%A1%E6%81%AF%E5%85%B1%E4%BA%AB%E4%B8%93%E9%A2%98%E4%B9%8B%E5%86%85%E5%AE%B9%E5%8F%91%E5%B8%83/&#34;&gt;Android 信息共享之内容发布&lt;/a&gt;》所讲，您的应用可以给其他的APP发送内容，同样地，您的应用也可以接收和处理其他APP发送的内容。设计之初，您就应该考虑，如何让您的APP与用户交互，以及您的APP主要处理哪些类型的数据。例如，一个网络社交类的APP可能对纯文本格式的数据感兴趣，像网页的URL地址。 &lt;a href=&#34;https://market.android.com/details?id=com.google.android.apps.plus&#34;&gt;Google+ Android application&lt;/a&gt; 则同时对纯文本格式的数据和单张或多张图片类型的数据感兴趣，因为这样可以方便用户在 Gallery APP 浏览图片的时候发送一条附带图片的 Google+ 信息流（Post）。&lt;/p&gt;&#xA;&lt;h2 id=&#34;更新-manifest-文件&#34;&gt;更新 Manifest 文件&lt;/h2&gt;&#xA;&lt;p&gt;Intent filters 主要用来告诉系统您的APP关心什么类型的系统消息。如前面章节《&lt;a href=&#34;/2012/01/android-%E4%BF%A1%E6%81%AF%E5%85%B1%E4%BA%AB%E4%B8%93%E9%A2%98%E4%B9%8B%E5%86%85%E5%AE%B9%E5%8F%91%E5%B8%83/&#34;&gt;Android 信息共享之内容发布&lt;/a&gt;》构造发送内容的Intent时需要设置Action为&lt;a href=&#34;http://developer.android.com/reference/android/content/Intent.html#ACTION_SEND&#34;&gt;ACTION_SEND&lt;/a&gt;，那么接收内容同样要告诉系统您的APP对Action为ACTION_SEND的系统消息感兴趣。您需要在 &lt;a href=&#34;http://developer.android.com/guide/topics/intents/intents-filters.html#ifs&#34;&gt;&amp;lt;intent-filter&amp;gt;&lt;/a&gt; tag中定义关注的intent filter，比如，您的APP可以用来处理纯文本格式的数据，通用类型的单张图片，或者混合类型的图片列表，那么您的manifest 可能是这样的：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;   &amp;lt;activity android:name=&amp;#34;.ui.MyActivity&amp;#34; &amp;gt;&#xA;   &amp;lt;intent-filter&amp;gt;&#xA;      &amp;lt;action android:name=&amp;#34;android.intent.action.SEND&amp;#34; /&amp;gt;&#xA;      &amp;lt;category android:name=&amp;#34;android.intent.category.DEFAULT&amp;#34; /&amp;gt;&#xA;      &amp;lt;data android:mimeType=&amp;#34;image/*&amp;#34; /&amp;gt;&#xA;   &amp;lt;/intent-filter&amp;gt;&#xA;   &amp;lt;intent-filter&amp;gt;&#xA;      &amp;lt;action android:name=&amp;#34;android.intent.action.SEND&amp;#34; /&amp;gt;&#xA;      &amp;lt;category android:name=&amp;#34;android.intent.category.DEFAULT&amp;#34; /&amp;gt;&#xA;      &amp;lt;data android:mimeType=&amp;#34;text/plain&amp;#34; /&amp;gt;&#xA;   &amp;lt;/intent-filter&amp;gt;&#xA;   &amp;lt;intent-filter&amp;gt;&#xA;     &amp;lt;action android:name=&amp;#34;android.intent.action.SEND_MULTIPLE&amp;#34; /&amp;gt;&#xA;     &amp;lt;category android:name=&amp;#34;android.intent.category.DEFAULT&amp;#34; /&amp;gt;&#xA;     &amp;lt;data android:mimeType=&amp;#34;image/*&amp;#34; /&amp;gt;&#xA;   &amp;lt;/intent-filter&amp;gt;&#xA;   &amp;lt;/activity&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;注：想了解更多的有关Intent和Intent Filter的资讯请参照 《 &lt;a href=&#34;http://developer.android.com/guide/topics/intents/intents-filters.html#ifs&#34;&gt;Intents and Intent Filters&lt;/a&gt;》。&lt;/p&gt;&#xA;&lt;p&gt;假如其他的APP发送了与上面manifest文件中声明的intent filter匹配的数据（通过声明Intent，设置Action值，填充数据，调用&lt;a href=&#34;http://developer.android.com/reference/android/content/Context.html#startActivity(android.content.Intent)&#34;&gt;startActivity()&lt;/a&gt;方法），那么您的APP就会出现在 intent chooser（选择器）中，当用户选择了您的应用程序，对应的activity （如上文声明的 .ui.MyActivity）就会被启动，具体怎么样处理接收到的数据就取决于您的设计了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;处理接收到的数据&#34;&gt;处理接收到的数据&lt;/h2&gt;&#xA;&lt;p&gt;要想得到其他APP发送过来的数据，您首先需要调用方法&lt;a href=&#34;http://developer.android.com/reference/android/content/Intent.html#getIntent(java.lang.String)&#34;&gt;getIntent()&lt;/a&gt; 来获得包含数据的&lt;a href=&#34;http://developer.android.com/reference/android/content/Intent.html&#34;&gt;Intent&lt;/a&gt;对象，一旦您得到了该对象，就可以读取里面的值来决定下一步的动作。有一点您需要注意，如果您的Activity的启动入口不止这一处，比如用户可以通过主界面launcher启动，那么您就应该小心应对此类问题，主要区别是两者 &lt;a href=&#34;http://developer.android.com/reference/android/content/Intent.html&#34;&gt;Intent&lt;/a&gt;包含的内容不同。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android 信息共享专题之内容发布</title>
				<link>https://blog.zhourunsheng.com/2012/01/android-%e4%bf%a1%e6%81%af%e5%85%b1%e4%ba%ab%e4%b8%93%e9%a2%98%e4%b9%8b%e5%86%85%e5%ae%b9%e5%8f%91%e5%b8%83/</link>
				<pubDate>Fri, 06 Jan 2012 20:03:18 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/01/android-%e4%bf%a1%e6%81%af%e5%85%b1%e4%ba%ab%e4%b8%93%e9%a2%98%e4%b9%8b%e5%86%85%e5%ae%b9%e5%8f%91%e5%b8%83/</guid>
				<description>&lt;p&gt;构造和触发一个Intent，需要先要指定其Action。Android系统已经预定义了很多Action，其中的&lt;a href=&#34;http://developer.android.com/reference/android/content/Intent.html#ACTION_SEND&#34;&gt;ACTION_SEND&lt;/a&gt;用来做数据分享，可以把数据从一个Activity发送到另一个Activity，甚至跨越进程边界的限制。要想给其他的Activity发送内容，您需要做的是构造一个Intent，设置Action类别为&lt;a href=&#34;http://developer.android.com/reference/android/content/Intent.html#ACTION_SEND&#34;&gt;ACTION_SEND&lt;/a&gt;，把数据填充到该Intent中，并且设置正确的数据的类型，最后触发该Intent，这样系统就会选择最合适的目标Activity来接收和处理该数据。如果候选的目标Activity多于一个，则系统通常会弹出一个对话框让用户来选择，如果候选的目标Activity只有一个，那么系统就会直接启动该Activity来处理数据。同样地，您自己的应用程序也可以在manifest文件中声明可以处理的数据类型，这样当其他Activity发送此种类型的数据时，系统就会将您的App列入到候选名单中。&lt;/p&gt;&#xA;&lt;p&gt;数据的共享常应用在社会化分享的APP中，方便用户快速和简单的分享自己的共享信息。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt; ：最简单的在&lt;a href=&#34;http://developer.android.com/reference/android/app/ActionBar.html&#34;&gt;ActionBar&lt;/a&gt;中添加一个&amp;quot;share action item&amp;quot;的方法是使用&lt;a href=&#34;http://developer.android.com/reference/android/widget/ShareActionProvider.html&#34;&gt;ShareActionProvider&lt;/a&gt;，其要求API level 14，将在后面的章节讨论。&lt;/p&gt;&#xA;&lt;h2 id=&#34;发送文本数据&#34;&gt;发送文本数据&lt;/h2&gt;&#xA;&lt;p&gt;数据分享最常用的是Activity之间发送文本内容，例如，系统的内置浏览器可以共享当前正在浏览页面的URL地址，以纯文本的数据格式存储，这非常有助于用户通过Email或者社会化分享APP分享有趣的文章链接和网站链接。&lt;/p&gt;&#xA;&lt;p&gt;示例代码：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;   Intent sendIntent = new Intent();&#xA;   sendIntent.setAction(Intent.ACTION_SEND);&#xA;   sendIntent.putExtra(Intent.EXTRA_TEXT, &amp;#34;This is my text to send.&amp;#34;);&#xA;   sendIntent.setType(&amp;#34;text/plain&amp;#34;);&#xA;   startActivity(sendIntent);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果当前设备里安装的所有应用程序中其中有一个APP的intent filter设置了&lt;a href=&#34;http://developer.android.com/reference/android/content/Intent.html#ACTION_SEND&#34;&gt;ACTION_SEND&lt;/a&gt;，并且声明的数据类型匹配纯文本（text/plain）格式，那么系统就会启动它，若此时匹配的APP个数多于一个，系统会弹出一个选择对话框(a &amp;ldquo;chooser&amp;rdquo;) ，让用户从中选择处理该数据的APP。若您触发该Intent的时候使用了[Intent.createChooser()](&lt;a href=&#34;http://developer.android.com/reference/android/content/Intent.html#createChooser(android.content.Intent&#34;&gt;http://developer.android.com/reference/android/content/Intent.html#createChooser(android.content.Intent&lt;/a&gt;, java.lang.CharSequence)) ，那么系统总是会弹出选择对话框(a &amp;ldquo;chooser&amp;rdquo;) 让用户选择，这么做有如下优点。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;即使用户以前选择过默认的处理APP，系统还是会弹出选择器让用户可以重新选择&lt;/li&gt;&#xA;&lt;li&gt;如果没有任何匹配的APP可以处理该数据，那么系统会有提示信息&lt;/li&gt;&#xA;&lt;li&gt;您可以为选择器对话框设定自定义标题&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;示例代码：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;   Intent sendIntent = new Intent();&#xA;   sendIntent.setAction(Intent.ACTION_SEND);&#xA;   sendIntent.putExtra(Intent.EXTRA_TEXT, &amp;#34;This is my text to send.&amp;#34;);&#xA;   sendIntent.setType(&amp;#34;text/plain&amp;#34;);&#xA;   startActivity(Intent.createChooser(sendIntent, getResources().getText(R.string.send_to));&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ACTION_SEND Intent　选择器对话框如下面图示&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://farm8.staticflickr.com/7022/6646562279_fd0fc74854_d.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;可选地，您也可以在Intent中设置一些标准的附加参数，比如&lt;a href=&#34;http://developer.android.com/reference/android/content/Intent.html#EXTRA_EMAIL&#34;&gt;EXTRA_EMAIL&lt;/a&gt;, &lt;a href=&#34;http://developer.android.com/reference/android/content/Intent.html#EXTRA_CC&#34;&gt;EXTRA_CC&lt;/a&gt;, &lt;a href=&#34;http://developer.android.com/reference/android/content/Intent.html#EXTRA_BCC&#34;&gt;EXTRA_BCC&lt;/a&gt;,　&lt;a href=&#34;http://developer.android.com/reference/android/content/Intent.html#EXTRA_SUBJECT&#34;&gt;EXTRA_SUBJECT&lt;/a&gt;，除非目标APP会使用该数据，不然也没有什么副作用。通常如果您设计的应用程序可以用来接收和处理该数据，那么应该使用它们。&lt;/p&gt;&#xA;&lt;p&gt;注意：某些Email邮件处理程序，比如Gmail，需要的是一个字符串数组类型（&lt;a href=&#34;http://developer.android.com/reference/java/lang/String.html&#34;&gt;String[]&lt;/a&gt; for extras like &lt;a href=&#34;http://developer.android.com/reference/android/content/Intent.html#EXTRA_EMAIL&#34;&gt;EXTRA_EMAIL&lt;/a&gt; and &lt;a href=&#34;http://developer.android.com/reference/android/content/Intent.html#EXTRA_CC&#34;&gt;EXTRA_CC&lt;/a&gt;），那么您应该使用[putExtra(String, String[])](&lt;a href=&#34;http://developer.android.com/reference/android/content/Intent.html#putExtra(java.lang.String&#34;&gt;http://developer.android.com/reference/android/content/Intent.html#putExtra(java.lang.String&lt;/a&gt;, java.lang.String[])) 来添加附加参数。&lt;/p&gt;&#xA;&lt;h2 id=&#34;发送二进制数据&#34;&gt;发送二进制数据&lt;/h2&gt;&#xA;&lt;p&gt;与发送文本格式的数据类似，构造一个Intent其Action为&lt;a href=&#34;http://developer.android.com/reference/android/content/Intent.html#ACTION_SEND&#34;&gt;ACTION_SEND&lt;/a&gt;，设定正确的MIME类型，填充数据的URI 到Intent的键值 &lt;a href=&#34;http://developer.android.com/reference/android/content/Intent.html#EXTRA_STREAM&#34;&gt;EXTRA_STREAM&lt;/a&gt;中，最后触发该Intent就可以了。共享二进制数据最常用的是图片数据的分享，其他任何的二进制数据都可以分享，只要设定了正确的MIME类型。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android 用户管理专题之创建自定义帐户类型</title>
				<link>https://blog.zhourunsheng.com/2012/01/android-%e7%94%a8%e6%88%b7%e7%ae%a1%e7%90%86%e4%b8%93%e9%a2%98%e4%b9%8b%e5%88%9b%e5%bb%ba%e8%87%aa%e5%ae%9a%e4%b9%89%e5%b8%90%e6%88%b7%e7%b1%bb%e5%9e%8b/</link>
				<pubDate>Thu, 05 Jan 2012 20:39:40 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/01/android-%e7%94%a8%e6%88%b7%e7%ae%a1%e7%90%86%e4%b8%93%e9%a2%98%e4%b9%8b%e5%88%9b%e5%bb%ba%e8%87%aa%e5%ae%9a%e4%b9%89%e5%b8%90%e6%88%b7%e7%b1%bb%e5%9e%8b/</guid>
				<description>&lt;p&gt;到目前为止，我们学习和讨论的都是利用Google的账户来访问Google的在线服务，假如您有自己的在线服务，却没有Google类型的账户，这个时候该怎么办呢？本节课的目的就是来解决上面提到的问题，为自己的在线服务创建一个自定义的账户类型，并且像设备的内置账户一样的方式工作。&lt;/p&gt;&#xA;&lt;h2 id=&#34;创建自定义账户&#34;&gt;创建自定义账户&lt;/h2&gt;&#xA;&lt;p&gt;要想创建一个新的自定义类型的账户，首先要做的工作是生成用户凭据（credentials），该过程可以很简单，比如要求用户输入账户名和密码，也可以复杂一些，要求用户设置一次性密码或启用生物特征扫描（如视网膜扫描，指纹识别）。不论是哪种方式，这是您必须要做的工作。&lt;/p&gt;&#xA;&lt;p&gt;具体包括：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;收集用户凭据&lt;/li&gt;&#xA;&lt;li&gt;将用户凭据同在线服务进行身份认证&lt;/li&gt;&#xA;&lt;li&gt;存储认证过的用户凭据&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;通常这三个步骤可以在一个 activity 中完成，我们可以将这个activity 称之为认证 activity （authenticator activity）。&lt;/p&gt;&#xA;&lt;p&gt;因为 authenticator activity 需要访问系统的账户管理器 AccountManager，比普通的 activity 有更多的权限要求，Android framework 为了方便应用程序的开发，特意提供了一个基类 AccountAuthenticatorActivity，您可以通过继承该类来实现自定义的账户验证器。&lt;/p&gt;&#xA;&lt;p&gt;前两个步骤（收集凭据和服务验证）如何实现完全取决于您应用程序的设计，最后一个步骤（存储凭据）是一个标准的实现，代码如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; final Account account = new Account(mUsername, your_account_type);&#xA; mAccountManager.addAccountExplicitly(account, mPassword, null);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;智能安全&#34;&gt;智能安全&lt;/h2&gt;&#xA;&lt;p&gt;需要特别注意的是：AccountManager 本身并不对用户凭据（credentials）做任何的加密处理，以纯文本的方式进行存储，在大部分的设备上，这都没有问题，因为 credentials 保存在只有 root 权限才能读取的数据库中，但是对于已经 root 解锁的设备来说，就有可能出现问题，此时任何人可通过 adb 工具来读取系统中存储的 credentials 信息。&lt;/p&gt;&#xA;&lt;p&gt;考虑到这些因素，您就不应该简单的把用户的实际密码通过 AccountManager.addAccountExplicitly() 来保存，相反，应该存入一个更加安全的加密的安全令牌来抵御安全攻击。如果您的用户凭据用来保护非常有价值的数据，您在设计的时候应该慎重考虑。&lt;/p&gt;&#xA;&lt;h3 id=&#34;remember&#34;&gt;Remember&lt;/h3&gt;&#xA;&lt;p&gt;: When it comes to security code, follow the &amp;ldquo;Mythbusters&amp;rdquo; rule: don&amp;rsquo;t try this at home! Consult a security professional before implementing any custom account code.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android 用户管理专题之基于OAuth2协议的服务认证</title>
				<link>https://blog.zhourunsheng.com/2012/01/android-%e7%94%a8%e6%88%b7%e7%ae%a1%e7%90%86%e4%b8%93%e9%a2%98%e4%b9%8b%e5%9f%ba%e4%ba%8eoauth2%e5%8d%8f%e8%ae%ae%e7%9a%84%e6%9c%8d%e5%8a%a1%e8%ae%a4%e8%af%81/</link>
				<pubDate>Wed, 04 Jan 2012 23:34:56 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/01/android-%e7%94%a8%e6%88%b7%e7%ae%a1%e7%90%86%e4%b8%93%e9%a2%98%e4%b9%8b%e5%9f%ba%e4%ba%8eoauth2%e5%8d%8f%e8%ae%ae%e7%9a%84%e6%9c%8d%e5%8a%a1%e8%ae%a4%e8%af%81/</guid>
				<description>&lt;p&gt;为了能安全地访问在线服务，必须要验证用户的身份，即需要用户提供证明自己身份的认证信息。如果一个应用程序要访问第三方服务提供商的数据，那么安全验证问题更加复杂，此时不仅需要验证用户的身份信息，还要验证应用程序的信息，以此来保证应用程序只能访问获得了用户授权的那部分服务和数据。&lt;/p&gt;&#xA;&lt;p&gt;目前用来解决应用程序和第三方服务提供商授权认证的标准协议是 OAuth2，它本身只提供了一个值，即授权令牌（auth token）。它代表了用户的授权和应用程序按照用户授权的范围能够进行的数据访问与操作。本节课展示了怎样通过 OAuth2 协议来认证和访问 Google 的一个服务（服务方必须支持 OAuth2 协议），虽然本节课的例子只是针对 Google Service，其他的任何第三方服务提供商只要支持 OAuth2 协议，本文中提到的技术解决方案也同样适用。&lt;/p&gt;&#xA;&lt;p&gt;使用 OAuth2 的优势：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;通过获得用户授权的账户来访问在线服务&lt;/li&gt;&#xA;&lt;li&gt;按照用户的意愿进行授权应用程序的访问控制&lt;/li&gt;&#xA;&lt;li&gt;处理授权和认证错误&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;前期准备&#34;&gt;前期准备&lt;/h2&gt;&#xA;&lt;p&gt;开始进行 OAuth2 认证之前，您首先需要获得服务方提供的 API 信息，具体包括：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;服务提供方的 API 请求地址&lt;/li&gt;&#xA;&lt;li&gt;访问类型（认证范围-&lt;strong&gt;auth scope&lt;/strong&gt;），一个字符串类型的数据，用来标志应用程序申请的特定类型的认证。例如，auth scope 是 View your tasks，那么就是 read-only（只读）方式访问 Google Tasks 服务，如果 auth scope 是 Manage Your Tasks，那么就是 read-write（读写）方式访问Google Tasks 服务。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;client id&lt;/strong&gt; 和 **client secret，**同样是字符串类型，用来唯一标志访问在线服务的应用程序，也就是您自己接下来要发开的应用程序，这些信息可以从服务提供商那里直接获得。Google 提供了一个自助服务器来方便用户申请。您可以通过阅读这篇文章 &lt;a href=&#34;http://code.google.com/apis/tasks/articles/oauth-and-tasks-on-android.html&#34;&gt;《Getting Started with the Tasks API and OAuth 2.0 on Android》&lt;/a&gt; 来了解怎么样申请Google 的 Tasks 服务。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;获得访问令牌-auth-token&#34;&gt;获得访问令牌 （Auth Token）&lt;/h2&gt;&#xA;&lt;p&gt;获得访问令牌的步骤参照下图：&lt;/p&gt;</description>
			</item>
			<item>
				<title>WordPress 使用 Flickr 做图床</title>
				<link>https://blog.zhourunsheng.com/2012/01/wordpress-%e4%bd%bf%e7%94%a8-flickr-%e5%81%9a%e5%9b%be%e5%ba%8a/</link>
				<pubDate>Mon, 02 Jan 2012 18:03:07 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/01/wordpress-%e4%bd%bf%e7%94%a8-flickr-%e5%81%9a%e5%9b%be%e5%ba%8a/</guid>
				<description>&lt;p&gt;今天早上到博客转了一圈，发现博客里面的所有图片都变成XX了，毫无疑问，所有的图片链接都失效了。&lt;/p&gt;&#xA;&lt;p&gt;一开始没明白是怎么回事，以为是网站挂掉了，想想也不是，文字还是会正常显示出来的，那就只有一个问题了，图床出问题了。&lt;/p&gt;&#xA;&lt;p&gt;当初一开始博客建立在新浪的 SAE 上面，后来迁移至此，所有以前博文的图片都还放在 SAE 的 storage 上面，我赶快登陆storage的后台进行查看，看看到底图片出什么问题了，一看心都凉了，所有的图片都没了，连 upload 文件夹都木有了，写 wordpress 的孩子你是懂得的，upload 文件夹放神马东西。我又赶快查看了新浪官方的 SAE 博客，发现它的图片也变 XX 了，到此，问题基本也眉目了，估计了过了个新年，什么以数字文件夹命名的出问题了，或者是服务器在维护，先不管那么多了，官方的博客都出问题了，我的出问题也就正常了。&lt;/p&gt;&#xA;&lt;p&gt;然后在网上找其他的图床平台，毕竟自己的 VPS 放太多图片，流量变大耗费不起啊，想着很久以前就利用 flickr 做过图床，网上找了一个wordpress 的插件 wordpress-flickr-manager，无奈，作者很久都不维护了，放在最新的 wordprss3.3 上面无法工作，还是自立更生吧，动手调试，修改，终于可以正常工作了。&lt;/p&gt;&#xA;&lt;p&gt;修改过的 wordpress-flickr-manager 可从我的google code里面下载，下载链接：wordpress-flickr-manager.zip 友情提示：插件已正式更名为 wpflickr，官方下载地址为：http://wordpress.org/extend/plugins/wpflickr/&lt;/p&gt;&#xA;&lt;p&gt;和其他的插件使用类似，下载后解压到 plugins 文件夹下面，并激活。然后到“设置”选项下的 “Flickr” 下面进行自己 Flickr 帐号的绑定，其他的配置选项保留默认就行。&lt;/p&gt;&#xA;&lt;p&gt;那么在编写博文的时候，上传或插入媒体的控件旁边就会多出一个 “ Add Flickr Photo “ 的图标，点击它进行图片的上传，就可以直接将图片上传到绑定的 flickr 账户中，选择了图片的大小及其他参数后，可以插入到博文中。&lt;/p&gt;&#xA;&lt;p&gt;示例图片：上面的这张图片就是利用该插件上传到我的 flickr 账户中的，如果您能看到，说明该插件是工作正常的。&lt;/p&gt;&#xA;&lt;p&gt;好了，希望大家下载使用，如有神马问题，联系我即可！&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android 用户管理专题之记录用户身份</title>
				<link>https://blog.zhourunsheng.com/2012/01/android-%e7%94%a8%e6%88%b7%e7%ae%a1%e7%90%86%e4%b8%93%e9%a2%98%e4%b9%8b%e8%ae%b0%e5%bd%95%e7%94%a8%e6%88%b7%e8%ba%ab%e4%bb%bd/</link>
				<pubDate>Sun, 01 Jan 2012 10:56:03 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2012/01/android-%e7%94%a8%e6%88%b7%e7%ae%a1%e7%90%86%e4%b8%93%e9%a2%98%e4%b9%8b%e8%ae%b0%e5%bd%95%e7%94%a8%e6%88%b7%e8%ba%ab%e4%bb%bd/</guid>
				<description>&lt;p&gt;每个人都喜欢自己的名字被他人记住，同样地，如果想让您的应用程序更人性化，为不同的用户提供不同的用户体验，以及自定义配置，那么就需要记录用户的个人信息。当用户从旧的设备更新到新的设备，或者从一台设备切换到另一台设备上面（例如用户拥有一台平板电脑和手机，并且经常在两者之间切换），您的应用应当可以准确识别出用户，那么如何才能区分用户和记录用户信息，并且准确地鉴别用户身份，本文的目的就是要解决上面提到的问题。&lt;/p&gt;&#xA;&lt;p&gt;对于大多数应用来说，账户管理器 AccountManager 就足够了，利用其提供的API，只要获得用户的权限许可，就可以很容易地取得当前设备上已经存储的用户账户名信息。&lt;/p&gt;&#xA;&lt;p&gt;集成用户帐号的管理，可以让您的应用程序完成如下的功能：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;表格的自动填写（如用户的 Email 地址信息）&lt;/li&gt;&#xA;&lt;li&gt;记录和获得与用户身份绑定的ID，而不仅仅是设备的ID&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;账户管理器-accountmanager-是否适合您的应用程序&#34;&gt;账户管理器 AccountManager 是否适合您的应用程序&lt;/h2&gt;&#xA;&lt;p&gt;应用程序通常使用如下的3种技术来进行账户的管理：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;要求用户填写账户名称&lt;/li&gt;&#xA;&lt;li&gt;识别当前应用程序运行的设备信息，记录设备的ID&lt;/li&gt;&#xA;&lt;li&gt;通过系统提供的 &lt;a href=&#34;http://developer.android.com/reference/android/accounts/AccountManager.html&#34;&gt;AccountManager&lt;/a&gt;来获取当前设备已记录的用户信息&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;方案（1）的缺点如下：首先，每次启动应用程序之前都需要输入用户名的信息，程序显得不太友好，吸引力不足，其次，没有好的办法来保证用户名的唯一性。&lt;/p&gt;&#xA;&lt;p&gt;方案（2）较方案（1）来说为用户减轻了一点负担，但是它很难保证用户的准确性。因为您的应用程序仅仅是与具体的设备绑定在了一起，想象一下，用户从一台旧设备升级到了新设备，在新设备上面运行应用的时候，您的应用程序就不再记得该用户了。&lt;/p&gt;&#xA;&lt;p&gt;方案（3）是首选的解决方案，通过利用系统提供的 AccountManager，您可以获取当前设备上面已经存储的用户身份信息，不论用户拥有多少台设备，只要用户登录了该设备，那么您就可以准确地识别该用户。对于您应用程序的设计来说，也仅仅是加入几个多余的 UI 界面而已。&lt;/p&gt;&#xA;&lt;h2 id=&#34;设计不同的账户类型&#34;&gt;设计不同的账户类型&lt;/h2&gt;&#xA;&lt;p&gt;Android 设备可以存储不同类型的账户信息，当您通过 AccountManager 来进行账户查询的时候，通常需要利用账户类型来进行过滤，账户类型（account type）是一个字符串，要求唯一性，用来和系统中已存储的其他类型的账户进行区分，例如，Google 的账户类型是 &amp;ldquo;com.google&amp;rdquo;,Twitter 的账户类型是 &amp;ldquo;com.twitter.android.auth.login&amp;rdquo;，当然可以利用自己的个人域名来进行区分，例如 &amp;ldquo;com.zhourunsheng.com&amp;rdquo;。&lt;/p&gt;&#xA;&lt;h2 id=&#34;申请获得用户账户信息的权限-get_account&#34;&gt;申请获得用户账户信息的权限 GET_ACCOUNT&lt;/h2&gt;&#xA;&lt;p&gt;如果要读取当前设备上面的账户信息，您的应用需要 GET_ACCOUNTS 权限，在 manifest 文件的&amp;lt;uses-permission&amp;gt;tag 中添加示例代码&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;manifest ... &amp;gt;&#xA;&amp;lt;uses-permission android:name=&amp;#34;android.permission.GET_ACCOUNTS&amp;#34; /&amp;gt;&#xA;...&#xA;&amp;lt;/manifest&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;用户帐号查询&#34;&gt;用户帐号查询&lt;/h2&gt;&#xA;&lt;p&gt;一旦确定了账户的类型，您就可以通过 AccountManager 来进行查询了。首先通过调用 AccountManager.get() 来获得一个 AccountManager 实例对象，然后调用它的成员函数 getAccountsByType()，通过传递账户类型的参数，就能得到该账户类型下面的所有用户的一个用户列表。&lt;/p&gt;&#xA;&lt;p&gt;示例代码&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;AccountManager am = AccountManager.get(this); // &amp;#34;this&amp;#34; references the current Context&#xA;&#xA;Account[] accounts = am.getAccountsByType(&amp;#34;com.google&amp;#34;);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;函数调用返回一个包含所有帐号 Account 的数组。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android 电源管理专题之管理广播接收器 Broadcast Receivers</title>
				<link>https://blog.zhourunsheng.com/2011/12/android-%e7%94%b5%e6%ba%90%e7%ae%a1%e7%90%86%e4%b8%93%e9%a2%98%e4%b9%8b%e7%ae%a1%e7%90%86%e5%b9%bf%e6%92%ad%e6%8e%a5%e6%94%b6%e5%99%a8-broadcast-receivers/</link>
				<pubDate>Sat, 31 Dec 2011 21:14:58 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/12/android-%e7%94%b5%e6%ba%90%e7%ae%a1%e7%90%86%e4%b8%93%e9%a2%98%e4%b9%8b%e7%ae%a1%e7%90%86%e5%b9%bf%e6%92%ad%e6%8e%a5%e6%94%b6%e5%99%a8-broadcast-receivers/</guid>
				<description>&lt;p&gt;最简单的监测设备状态变更的做法就是为每一个状态的变化都创建一个对应的 BroadcastReceiver，然后在 BroadcastReceiver 的实现代码中，取得设备当前的状态来调整应用程序的运行任务。&lt;/p&gt;&#xA;&lt;p&gt;但是这样做有一个缺点就是可能您的应用程序会过于频繁的唤醒设备来处理状态的变更，这往往不是您期待的结果。&lt;/p&gt;&#xA;&lt;p&gt;一个更好的解决办法就是在程序的运行过程中动态的启用和禁用广播事件接收器，这样您就可以只启用目前最关心的广播事件接听器，而禁用掉现在并不需要的事件接听器。&lt;/p&gt;&#xA;&lt;h2 id=&#34;动态切换和级联事件接器&#34;&gt;动态切换和级联事件接器&lt;/h2&gt;&#xA;&lt;p&gt;您可以使用 PackageManager 来管理 manifest 中声明的广播接收器，示例代码展示了如何利用这一技术来启用和禁用相应的广播接收器。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ComponentName receiver = new ComponentName(context, myReceiver.class);&#xA;&#xA;PackageManager pm = context.getPackageManager();&#xA;&#xA;pm.setComponentEnabledSetting(receiver,&#xA;PackageManager.COMPONENT_ENABLED_STATE_ENABLED,&#xA;PackageManager.DONT_KILL_APP)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;通过使用这一技术，如果设备当前处在未联网的状态，那么您的应用程序可以禁用除网络事件接收器以外所有其他的广播事件接听器。相反，一旦您确定设备已经连接到了网络，那么就可以停止监听网络状态变化的监听器，然后简单检查一下是否能连接互联网，如果能的话就可以执行应用程序的数据更新任务了。&lt;/p&gt;&#xA;&lt;p&gt;同样，您也可以使用该技术来延迟启动一个需要较高带宽的大网络文件的下载，通过简单注册一个网络连接状态切换的事件监听器，只有当设备切换到 wi-fi 状态的时候才启动文件的下载工作。&lt;/p&gt;&#xA;&lt;p&gt;参考文摘：&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://developer.android.com/training/monitoring-device-state/manifest-receivers.html&#34;&gt;http://developer.android.com/training/monitoring-device-state/manifest-receivers.html&lt;/a&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android 电源管理专题之获取和监测网络连接状态</title>
				<link>https://blog.zhourunsheng.com/2011/12/android-%e7%94%b5%e6%ba%90%e7%ae%a1%e7%90%86%e4%b8%93%e9%a2%98%e4%b9%8b%e8%8e%b7%e5%8f%96%e5%92%8c%e7%9b%91%e6%b5%8b%e7%bd%91%e7%bb%9c%e8%bf%9e%e6%8e%a5%e7%8a%b6%e6%80%81/</link>
				<pubDate>Fri, 30 Dec 2011 21:16:23 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/12/android-%e7%94%b5%e6%ba%90%e7%ae%a1%e7%90%86%e4%b8%93%e9%a2%98%e4%b9%8b%e8%8e%b7%e5%8f%96%e5%92%8c%e7%9b%91%e6%b5%8b%e7%bd%91%e7%bb%9c%e8%bf%9e%e6%8e%a5%e7%8a%b6%e6%80%81/</guid>
				<description>&lt;p&gt;设定周期性的闹铃提醒和后台服务，最常见的用途是定期更新应用程序的数据，从互联网上下载资源，缓存数据或者执行长时间的下载任务。但是如果设备当前没有连接到网络，或者是网络状况不稳定，连接太慢，不能正常完成数据的下载任务，那么此时仍需要唤醒设备来更新数据么？&lt;/p&gt;&#xA;&lt;p&gt;您可以通过 ConnectivityManager 来检查设备当前是否连接到了网络，如果已连接，具体是连接到哪种类型的网络。&lt;/p&gt;&#xA;&lt;h2 id=&#34;检测网络连接状态&#34;&gt;检测网络连接状态&lt;/h2&gt;&#xA;&lt;p&gt;如果设备当前没有连接到任何网络，那么您的应用程序也就没有必要安排定时的数据更新任务。&lt;/p&gt;&#xA;&lt;p&gt;示例代码展示了如何利用 ConnectivityManager 来查询当前活跃的可连接网络，以及设备目前是否已经联网。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ConnectivityManager cm =&#xA;(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);&#xA;&#xA;NetworkInfo activeNetwork = cm.getActiveNetworkInfo();&#xA;boolean isConnected = activeNetwork.isConnectedOrConnecting();&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;检测网络的类型&#34;&gt;检测网络的类型&lt;/h2&gt;&#xA;&lt;p&gt;目前 Android 设备支持的网络类型有移动网络，WiMAX，Wi-Fi和以太网。&lt;/p&gt;&#xA;&lt;p&gt;通过查询当前激活的网络类型，可以获得网络带宽等信息，然后据此调整您应用程序的后台数据刷新频率。&lt;/p&gt;&#xA;&lt;p&gt;示例代码&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;移动网络的费用要明显高于无线网络的费用，因此，在大多数情况下，如果当前设备连接的是移动网络，那么您应用程序的后台数据更新频率应尽可能保持比较低的状态，同样地，如果要下载一个较大的网络文件，在移动网络下应该暂停下载工作，等设备重新连接到了无线网络的环境再恢复下载工作。&lt;/p&gt;&#xA;&lt;p&gt;虽然已经暂停了应用程序的后台更新操作，您的应用程序还是应该时刻监测当前设备网络的变化，一旦设备连接上了合适的网络环境（比如wi-fi），那么暂停的任务就可以重新开始执行了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;监测网络连接的变化&#34;&gt;监测网络连接的变化&lt;/h2&gt;&#xA;&lt;p&gt;一旦设备连接的网络环境发生变化，系统的 ConnectivityManager 会广播一个类型为 CONNECTIVITY_ACTION (&amp;ldquo;android.net.conn.CONNECTIVITY_CHANGE &amp;ldquo;) 的通知消息，您可以在应用程序的 manifest 文件中定义相应的广播接收器receiver，然后根据网络环境的变化来适当调整程序数据的更新频率。&lt;/p&gt;&#xA;&lt;p&gt;示例代码&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;action android:name=&amp;#34;android.net.conn.CONNECTIVITY_CHANGE&amp;#34;/&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;网络环境的变化可能会非常频繁，只要设备的网络环境在无线网络和移动网络之间来回切换的时候，系统都会广播网络变化的通知，比较好的做法是，只有当您的更新程序此时处于暂停的状态，并且在网络连接上的时候需要恢复暂停工作的执行，那么应当注册和监听网络变化的广播，如果接收到广播通知，只需要检查网络是否已经连接上了，如果网络已经连接，那么应用程序就可以开始数据，否则的话，仍旧保持在暂停的状态，一直等到网络重新连接上了，再恢复任务的执行。&lt;/p&gt;&#xA;&lt;p&gt;我们需要这样一种解决方法可以使您方便的注册和注销 manifest 中声明的广播接收器 Receivers，在下一节课再继续讨论。&lt;/p&gt;&#xA;&lt;p&gt;参考文摘：&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html&#34;&gt;https://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html&lt;/a&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android 电源管理专题之获取和监测Dock状态和类型</title>
				<link>https://blog.zhourunsheng.com/2011/12/android-%e7%94%b5%e6%ba%90%e7%ae%a1%e7%90%86%e4%b8%93%e9%a2%98%e4%b9%8b%e8%8e%b7%e5%8f%96%e5%92%8c%e7%9b%91%e6%b5%8bdock%e7%8a%b6%e6%80%81%e5%92%8c%e7%b1%bb%e5%9e%8b/</link>
				<pubDate>Tue, 27 Dec 2011 21:20:16 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/12/android-%e7%94%b5%e6%ba%90%e7%ae%a1%e7%90%86%e4%b8%93%e9%a2%98%e4%b9%8b%e8%8e%b7%e5%8f%96%e5%92%8c%e7%9b%91%e6%b5%8bdock%e7%8a%b6%e6%80%81%e5%92%8c%e7%b1%bb%e5%9e%8b/</guid>
				<description>&lt;p&gt;Android 设备可以接在不同类型的 Dock 底座中，其中包括车载的，家用的，以及数字的和模拟的。许多 Dock 基座都能为接在其上面的设备供电，所以，“dock-state”（Dock状态）也通常是接入设备的充电状态。&lt;/p&gt;&#xA;&lt;p&gt;Dock 状态的变化如何影响您应用程序的服务更新速度取决于您应用程序的设计。假如是一个获取体育赛况的应用程序，那么在 “desktop dock” 状态时，可以提高其数据的更新频率，而当在 “car docked” 状态时，可以完全禁用数据的更新。相反，假如该应用程序是用来获取当前交通路况的，那么就应当在“car docked” 状态时选择最大限度提高数据的更新速度。&lt;/p&gt;&#xA;&lt;p&gt;系统会广播 “sticky” 类型的 Dock 状态通知 Intent，您可以通过该 Intent 来查询设备当前是否在 Dock 状态，以及具体的 Dock 类型。&lt;/p&gt;&#xA;&lt;h2 id=&#34;获得当前的-dock-状态&#34;&gt;获得当前的 Dock 状态&lt;/h2&gt;&#xA;&lt;p&gt;Dock 状态的详细信息可以从 Action 为 ACTION_DOCK_EVENT 中的广播数据中取得，因为广播类型是 “sticky”的，您不需要自己定义 BroadcastReceiver，只需要调用 registerReceiver() 方法，并且传入空的参数 null 就可以了。&lt;/p&gt;&#xA;&lt;p&gt;该方法的返回值 intent 就包括了当前 Dock 状态的详细信息。&lt;/p&gt;&#xA;&lt;p&gt;示例代码：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;IntentFilter ifilter = new IntentFilter(Intent.ACTION_DOCK_EVENT);&#xA;Intent dockStatus = context.registerReceiver(null, ifilter);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;您可以通过键值 EXTRA_DOCK_STATE 来取得当前的 Dock 状态。&lt;/p&gt;&#xA;&lt;p&gt;示例代码：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;int dockState = battery.getIntExtra(EXTRA_DOCK_STATE, -1);&#xA;boolean isDocked = dockState != Intent.EXTRA_DOCK_STATE_UNDOCKED;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;获得当前的dock-类型&#34;&gt;获得当前的Dock 类型&lt;/h2&gt;&#xA;&lt;p&gt;如果设备当前在Dock状态，那么目前支持的Dock类型如下：&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android 电源管理专题之监测电池电量和充电状态</title>
				<link>https://blog.zhourunsheng.com/2011/12/android-%e7%94%b5%e6%ba%90%e7%ae%a1%e7%90%86%e4%b8%93%e9%a2%98%e4%b9%8b%e7%9b%91%e6%b5%8b%e7%94%b5%e6%b1%a0%e7%94%b5%e9%87%8f%e5%92%8c%e5%85%85%e7%94%b5%e7%8a%b6%e6%80%81/</link>
				<pubDate>Mon, 26 Dec 2011 21:38:34 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/12/android-%e7%94%b5%e6%ba%90%e7%ae%a1%e7%90%86%e4%b8%93%e9%a2%98%e4%b9%8b%e7%9b%91%e6%b5%8b%e7%94%b5%e6%b1%a0%e7%94%b5%e9%87%8f%e5%92%8c%e5%85%85%e7%94%b5%e7%8a%b6%e6%80%81/</guid>
				<description>&lt;p&gt;通过检查设备当前的电池电量和充电状态，然后适当改变后台服务的更新频率，可以有效降低电量的消耗。所以您的应用程序的更新频率也应当根据设备当前的电池电量和充电状态来进行动态调整。&lt;/p&gt;&#xA;&lt;p&gt;通常情况下，当设备在充电的过程中，可以提高应用程序的数据更新频率，因为此时电池电量的消耗相较于充电的过程耗费很小，基本可以忽略。相反，如果电池是在正常的使用过程中，那么应当合理调整应用程序的更新频率，不能更新太频繁，这样有助于延长电池的使用寿命。&lt;/p&gt;&#xA;&lt;p&gt;同时，应用程序应当一直监视设备电量的状态变化，在设备电量不足时，尽量降低更新频率，或者干脆停止数据更新。&lt;/p&gt;&#xA;&lt;h2 id=&#34;获取当前的电池状态&#34;&gt;获取当前的电池状态&lt;/h2&gt;&#xA;&lt;p&gt;BatteryManage r 会发送“ sticky ”类型的系统广播，在 Intent 中包括了当前的电池电量状态和充电状态等信息。&lt;/p&gt;&#xA;&lt;p&gt;因为电池状态的广播类型是 “sticky”类型的，所以我们不需要注册相应的BroadcastReceiver。只需要在调用 registerReceiver 的时候传递空参数 null 就可以，然后函数的返回值 intent 中就包括了当前电池状态的各种信息。&lt;/p&gt;&#xA;&lt;p&gt;当然您也可以传递一个自定义的 BroadcastReceiver，在后面的章节里面有介绍，不过实际上也是没有什么必要的。&lt;/p&gt;&#xA;&lt;p&gt;示例代码：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);&#xA;Intent batteryStatus = context.registerReceiver(null, ifilter);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;从返回的 Intent 中我们可以获得当前的充电状态和充电类型，是通过USB，还是AC充电器?&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;// Are we charging / charged?&#xA;int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);&#xA;boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||&#xA;status == BatteryManager.BATTERY_STATUS_FULL;&#xA;&#xA;// How are we charging?&#xA;int chargePlug = battery.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);&#xA;boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB;&#xA;boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;通常情况下，在AC充电器的情况下，您可以最大化应用程序的更新频率，如果是在USB充电的状态下，适当降低更新频率，而如果是在非充电的时候，您应当将更新频率降到最低的情况，以合理利用电量。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android 音乐编程专题之管理音频硬件</title>
				<link>https://blog.zhourunsheng.com/2011/12/android-%e9%9f%b3%e4%b9%90%e7%bc%96%e7%a8%8b%e4%b8%93%e9%a2%98%e4%b9%8b%e7%ae%a1%e7%90%86%e9%9f%b3%e9%a2%91%e7%a1%ac%e4%bb%b6/</link>
				<pubDate>Thu, 22 Dec 2011 21:22:04 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/12/android-%e9%9f%b3%e4%b9%90%e7%bc%96%e7%a8%8b%e4%b8%93%e9%a2%98%e4%b9%8b%e7%ae%a1%e7%90%86%e9%9f%b3%e9%a2%91%e7%a1%ac%e4%bb%b6/</guid>
				<description>&lt;p&gt;Android 系统通常支持多种音频设备，常见的有手机内置扬声器，插孔式有线耳机，蓝牙 A2DP(蓝牙立体声音频传输规范（A2DP）)设备。&lt;/p&gt;&#xA;&lt;h2 id=&#34;获取当前正在播放音频的硬件信息&#34;&gt;获取当前正在播放音频的硬件信息&lt;/h2&gt;&#xA;&lt;p&gt;使用不同的硬件设备可能会影响您应用程序的设计方式，您可以通过 AudioManager 来查询当前正在播放音频的硬件设备信息，是内置扬声器，还是有线耳机，或者是蓝牙设备。&lt;/p&gt;&#xA;&lt;p&gt;示例代码如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;if (isBluetoothA2dpOn()) {&#xA;   // Adjust output for Bluetooth. 蓝牙设备&#xA;} else if (isSpeakerphoneOn()) {&#xA;   // Adjust output for Speakerphone. 内置扬声器(免提)&#xA;} else if (isWiredHeadsetOn()) {&#xA;   // Adjust output for headsets 有线耳机&#xA;} else {&#xA;   // If audio plays and noone can hear it, is it still playing? 未知设备&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;处理音频播放硬件的状态变化&#34;&gt;处理音频播放硬件的状态变化&lt;/h2&gt;&#xA;&lt;p&gt;当耳机线脱落，蓝牙设备断开，音频输出流会自动切换到内置扬声器。如果此时您正在大声播放音乐，这可能不是您期待的结果。&lt;/p&gt;&#xA;&lt;p&gt;不过也不用担心，当出现硬件设备切换的时候，Android 会发送系统广播 ACTION_AUDIO_BECOMING_NOISY，您的应用程序中应该注册一个 BroadcastReceiver 来监听这个消息，当出现这种情况的时候，如果正在听音乐，较好的设计方案是暂停当前音乐的播放，如果正在玩游戏，那么尽量降低游戏的音量是个不错的解决方法。&lt;/p&gt;&#xA;&lt;p&gt;示例代码如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;private class NoisyAudioStreamReceiver extends BroadcastReceiver {&#xA;  @Override&#xA;  public void onReceive(Context context, Intent intent) {&#xA;    if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) {&#xA;       // Pause the playback&#xA;    }&#xA;  }&#xA;}&#xA;&#xA;private IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);&#xA;&#xA;private void startPlayback() {&#xA;   registerReceiver(myNoisyAudioStreamReceiver(), intentFilter);&#xA;}&#xA;&#xA;private void stopPlayback() {&#xA;   unregisterReceiver(myNoisyAudioStreamReceiver);&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;参考文摘：http://developer.android.com/training/managing-audio/audio-output.html&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android 音乐编程专题之管理音频焦点</title>
				<link>https://blog.zhourunsheng.com/2011/12/android-%e9%9f%b3%e4%b9%90%e7%bc%96%e7%a8%8b%e4%b8%93%e9%a2%98%e4%b9%8b%e7%ae%a1%e7%90%86%e9%9f%b3%e9%a2%91%e7%84%a6%e7%82%b9/</link>
				<pubDate>Wed, 21 Dec 2011 21:14:58 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/12/android-%e9%9f%b3%e4%b9%90%e7%bc%96%e7%a8%8b%e4%b8%93%e9%a2%98%e4%b9%8b%e7%ae%a1%e7%90%86%e9%9f%b3%e9%a2%91%e7%84%a6%e7%82%b9/</guid>
				<description>&lt;p&gt;因为系统中可能会有多个应用程序会播放音频，所以需要考虑他们之间该如何交互，为了避免多个应用程序同时播放音乐，Android 系统使用音频焦点来进行统一管理，即只有获得了音频焦点的应用程序才可以播放音乐。&lt;/p&gt;&#xA;&lt;p&gt;您的应用程序在开始播放音频文件前，首先应该请求获得音频焦点，并且应该同时注册监听音频焦点的丢失通知，即如果音频焦点被系统或其他的应用程序抢占时，您的应用程序可以做出合适的响应。&lt;/p&gt;&#xA;&lt;h2 id=&#34;获取音频焦点&#34;&gt;获取音频焦点&lt;/h2&gt;&#xA;&lt;p&gt;您的应用程序在开始播放任何音频之前，首先应该持有流的音频焦点。&lt;/p&gt;&#xA;&lt;p&gt;可以通过调用 requestAudioFocus() 来实现，如果请求成功，返回 AUDIOFOCUS_REQUEST_GRANTED。&lt;/p&gt;&#xA;&lt;p&gt;您必须指定流类型（使用的是哪一个流）和音频焦点的类型（短暂的或是持久的）。&lt;/p&gt;&#xA;&lt;p&gt;瞬态焦点用来播放很短时间的音频（例如，播放导航指令）。&lt;/p&gt;&#xA;&lt;p&gt;持久焦点用来播放较长一段时间的音频（例如，播放音乐）。&lt;/p&gt;&#xA;&lt;p&gt;下面的代码片断演示了请求音乐音频流的永久音频焦点。&lt;/p&gt;&#xA;&lt;p&gt;例如当用户按下播放背景音乐的按键，您应该立即请求音频焦点，当成功获得了焦点后再开始播放音乐。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE);&#xA;...&#xA;&#xA;// Request audio focus for playback&#xA;int result = am.requestAudioFocus(afChangeListener,&#xA;// Use the music stream.&#xA;AudioManager.STREAM_MUSIC,&#xA;// Request permanent focus.&#xA;AudioManager.AUDIOFOCUS_GAIN);&#xA;&#xA;if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {&#xA;    am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);&#xA;    // Start playback.&#xA;    // 开始播放音乐文件&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;一旦您的应用程序完成了播放，请记得要调用 abandonAudioFocus() 方法来通知系统释放音频焦点，同时注销相关的 AudioManager.OnAudioFocusChangeListener。这样当您的应用程序释放了音频焦点，则系统会允许其他被中断的应用程序重新获取该焦点来继续播放。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;// Abandon audio focus when playback complete&#xA;am.abandonAudioFocus(afChangeListener);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;当请求瞬态音频焦点时有一个附加参数可供设置，即是否允许 &amp;ldquo;DUCK&amp;rdquo;。通常当应用程序失去了音频焦点时应该停止播放。如果获取短暂音频焦点的时候设置了&amp;quot;DUCK&amp;quot; 附加参数，则允许其他的应用程序继续播放，不需要停止，只要降低音量就可以了，然后直到您的应用程序释放了焦点，其他应用程序再重新获得的时候，将音量还原到有一开始的状态。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;// Request audio focus for playback&#xA;int result = am.requestAudioFocus(afChangeListener,&#xA;// Use the music stream.&#xA;AudioManager.STREAM_MUSIC,&#xA;// Request permanent focus.&#xA;AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);&#xA;&#xA;if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {&#xA;  // Start playback.&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&amp;ldquo;DUCK&amp;rdquo; 特别适合那种间歇性播放音频流的应用程序，如驾驶导航的声音提示。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android 音乐编程专题之控制应用程序的音量和播放</title>
				<link>https://blog.zhourunsheng.com/2011/12/android-%e9%9f%b3%e4%b9%90%e7%bc%96%e7%a8%8b%e4%b8%93%e9%a2%98%e4%b9%8b%e6%8e%a7%e5%88%b6%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e7%9a%84%e9%9f%b3%e9%87%8f%e5%92%8c%e6%92%ad%e6%94%be/</link>
				<pubDate>Tue, 20 Dec 2011 21:03:17 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/12/android-%e9%9f%b3%e4%b9%90%e7%bc%96%e7%a8%8b%e4%b8%93%e9%a2%98%e4%b9%8b%e6%8e%a7%e5%88%b6%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e7%9a%84%e9%9f%b3%e9%87%8f%e5%92%8c%e6%92%ad%e6%94%be/</guid>
				<description>&lt;h2 id=&#34;识别音频流&#34;&gt;识别音频流&lt;/h2&gt;&#xA;&lt;p&gt;创造优秀音频体验的第一步是了解您的应用程序将使用的音频流类型。&lt;/p&gt;&#xA;&lt;p&gt;Android 系统保持相互独立的音频流通道来播放音乐，报警，通知，来电铃声，系统声音，呼叫（通话）音量，和 DTMF 音调（键盘拨号）。&lt;/p&gt;&#xA;&lt;p&gt;这样做主要是为了使用户能够独立地控制每个流的音量。&lt;/p&gt;&#xA;&lt;p&gt;多数的流仅限于系统事件，所以，除非您的应用程序是要更换闹钟，否则几乎可以肯定的是使用 STREAM_MUSIC 音频流。&lt;/p&gt;&#xA;&lt;h2 id=&#34;使用硬件音量按键来控制应用程序的音量&#34;&gt;使用硬件音量按键来控制应用程序的音量&lt;/h2&gt;&#xA;&lt;p&gt;默认情况下，按音量键控制修改当前获得焦点的音频流的音量。假如您的应用程序当前不是正在播放音乐，或者没有运行，那么音量键将会调整振铃的音量。&lt;/p&gt;&#xA;&lt;p&gt;如果您有一个游戏或音乐应用程序，当用户点击音量键的时候，即使他们目前正在浏览歌曲，或者没有停留在当前的音乐游戏的位置，他们仍然希望控制游戏或音乐的音量。&lt;/p&gt;&#xA;&lt;p&gt;您可以通过接收音量控制键的按键消息来修改当前的音频流音量。不过不用那么麻烦，Android 已经提供了方便的 setVolumeControlStream() 方法来根据您指定的音频流来自动调节音量。&lt;/p&gt;&#xA;&lt;p&gt;首先确定您的应用程序将使用的音频流，然后通过 setVolumeControlStream 方法设置其为当前焦点的音频流。&lt;/p&gt;&#xA;&lt;p&gt;这个方法应该被及早调用，并且在生命周期中只需要调用一次即可，所以通常应在 Activity 或者 Fragment 的 OnCreate() 内调用。&lt;/p&gt;&#xA;&lt;p&gt;这将确保只要你的应用程序是可见状态的，音量控制功能就是用户所期望的效果(即控制当前应用程序的音量)。&lt;/p&gt;&#xA;&lt;p&gt;代码示例：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;setVolumeControlStream(AudioManager.STREAM_MUSIC);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;从现在开始，按设备上的音量键将影响您指定的（示例“音乐”）的音频流。&lt;/p&gt;&#xA;&lt;h2 id=&#34;使用硬件播放控制按键来控制应用程序的音频播放&#34;&gt;使用硬件播放控制按键来控制应用程序的音频播放&lt;/h2&gt;&#xA;&lt;p&gt;很多手机和许多无线耳机都附带有媒体播放控制按钮，如播放，暂停，停止，跳过。每当用户按下这些硬件键，系统就会广播 ACTION_MEDIA_BUTTON 动作。&lt;/p&gt;&#xA;&lt;p&gt;为了响应媒体按钮的点击事件，您需要注册 BroadcastReceiver 来监听广播。&lt;/p&gt;&#xA;&lt;p&gt;代码示例：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;receiver android:name=&amp;#34;.RemoteControlReceiver&amp;#34;&amp;gt;&#xA;  &amp;lt;intent-filter&amp;gt;&#xA;     &amp;lt;action android:name=&amp;#34;android.intent.action.MEDIA_BUTTON&amp;#34; /&amp;gt;&#xA;  &amp;lt;/intent-filter&amp;gt;&#xA;&amp;lt;/receiver&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Receiver 中需要知道到底是按下了哪个键的具体信息，Intent 中包括了 EXTRA_KEY_EVENT 键值，可以通过它来取得 KeyEvent 类型的值，KeyEvent中的 KEYCODE_MEDIA_*静态常量表示了所有的媒体按钮类型，如 KEYCODE_MEDIA_PLAY_PAUSE 和 KEYCODE_MEDIA_NEXT 等等。&lt;/p&gt;&#xA;&lt;p&gt;代码示例：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;public class RemoteControlReceiver extends BroadcastReceiver {&#xA;  @Override&#xA;  public void onReceive(Context context, Intent intent) {&#xA;    if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {&#xA;      KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);&#xA;      if (KeyEvent.KEYCODE_MEDIA_PLAY == event.getKeyCode()) {&#xA;        // Handle key press.&#xA;        // 处理播放按键的消息&#xA;      }&#xA;   }&#xA; }&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;因为多个应用程序可能会接听和响应媒体按键消息，您必须以编程方式控制您的应用程序何时应该接受媒体按钮事件。&lt;/p&gt;</description>
			</item>
			<item>
				<title>生活杂记之2011-12-20</title>
				<link>https://blog.zhourunsheng.com/2011/12/%e7%94%9f%e6%b4%bb%e6%9d%82%e8%ae%b0%e4%b9%8b2011-12-20/</link>
				<pubDate>Tue, 20 Dec 2011 20:02:58 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/12/%e7%94%9f%e6%b4%bb%e6%9d%82%e8%ae%b0%e4%b9%8b2011-12-20/</guid>
				<description>&lt;p&gt;今天来博客转了一圈，发现博文内容已经是一个月以前的了，最近项目内容太多，一直无暇顾及。&lt;/p&gt;&#xA;&lt;p&gt;还好，上周总算是第一阶段平稳过去了，趁着这段时间再回顾点Android的内容吧。&lt;/p&gt;&#xA;&lt;p&gt;回想起来，已经有半年多的时间没有接触Android的项目开发了。&lt;/p&gt;&#xA;&lt;p&gt;Google 最近推出了一套Android Training的课程，个人感觉还不错，阅读了几个课题后，发现收获还是蛮大的，在此也向各位喜欢Android开发的人员推荐一下，官方网址请参照：http://developer.android.com/training/index.html.&lt;/p&gt;&#xA;&lt;p&gt;自己建立博客的初衷也就是要达到内容分享的目的和整理自己的学习笔记和学习心得，那么接下来的几天时间，正好可以把这几个专题翻译一下，既做了笔记，又加深了理解，算是个两全其美的办法吧！&lt;/p&gt;&#xA;&lt;p&gt;如果各位有发现更好的文章或者博客内容，欢迎推荐给我，联系信息可在“关于我”的页面中找到。&lt;/p&gt;&#xA;&lt;p&gt;记录一批优秀的学习资料和文章到一处是个不错的想法，现在开始行动！！！&lt;/p&gt;</description>
			</item>
			<item>
				<title>PhoneGap 之 Android 端插件开发</title>
				<link>https://blog.zhourunsheng.com/2011/11/phonegap-%e4%b9%8b-android-%e7%ab%af%e6%8f%92%e4%bb%b6%e5%bc%80%e5%8f%91/</link>
				<pubDate>Wed, 02 Nov 2011 21:33:53 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/11/phonegap-%e4%b9%8b-android-%e7%ab%af%e6%8f%92%e4%bb%b6%e5%bc%80%e5%8f%91/</guid>
				<description>&lt;p&gt;前面一篇文章 《移动 APP 之跨平台解决方案》介绍了一种跨平台的解决方案，即用开发web app的方式来编写mobile app。鉴于PhoneGap才刚刚新起，还有许多功能因为平台的差异性无法很好的解决，所以我们在实际的开发中，发现有很多功能还需要完善，一种比较好的方式就是编写平台依赖的插件，进而扩展PhoneGap的功能。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/11/lunny-300x133.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;本文介绍一下开发和使用插件的一个流程，以 VideoPlayer 为例。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;环境搭建，下载 phonegap-android 的源码，下载地址 &lt;a href=&#34;https://github.com/phonegap/phonegap-plugins&#34;&gt;https://github.com/phonegap/phonegap-plugins&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;编写video.js，提供给web开发端的接口定义，定义了一个VideoPlayer类和play函数，参数为要播放的文件视频地址，代码如下：&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/**&#xA; * Constructor&#xA; */&#xA;function VideoPlayer() {&#xA;};&#xA;&#xA;/**&#xA; * Starts the video player intent&#xA; *&#xA; * @param url           The url to play&#xA; */&#xA;VideoPlayer.prototype.play = function(url) {&#xA;    PhoneGap.exec(null, null, &amp;#34;VideoPlayer&amp;#34;, &amp;#34;playVideo&amp;#34;, [url]);&#xA;};&#xA;&#xA;/**&#xA; * Load VideoPlayer&#xA; */&#xA;PhoneGap.addConstructor(function() {&#xA;    PhoneGap.addPlugin(&amp;#34;videoPlayer&amp;#34;, new VideoPlayer());&#xA;});&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;编写 Android VideoPlayer 的具体实现代码，VideoPlayer/src/com/phonegap/plugins/video/VideoPlayer.java&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;package com.phonegap.plugins.video;&#xA;&#xA;import org.json.JSONArray;&#xA;import org.json.JSONException;&#xA;import android.content.Intent;&#xA;import android.net.Uri;&#xA;import com.phonegap.api.Plugin;&#xA;import com.phonegap.api.PluginResult;&#xA;&#xA;public class VideoPlayer extends Plugin {&#xA;    private static final String YOU_TUBE = &amp;#34;youtube.com&amp;#34;;&#xA;&#xA;    @Override&#xA;    public PluginResult execute(String action, JSONArray args, String callbackId) {&#xA;        PluginResult.Status status = PluginResult.Status.OK;&#xA;        String result = &amp;#34;&amp;#34;;&#xA;&#xA;        try {&#xA;            if (action.equals(&amp;#34;playVideo&amp;#34;)) {&#xA;                playVideo(args.getString(0));&#xA;            }&#xA;            else {&#xA;                status = PluginResult.Status.INVALID_ACTION;&#xA;            }&#xA;            return new PluginResult(status, result);&#xA;        } catch (JSONException e) {&#xA;            return new PluginResult(PluginResult.Status.JSON_EXCEPTION);&#xA;        }&#xA;    }&#xA;&#xA;    private void playVideo(String url) {&#xA;        // Create URI&#xA;        Uri uri = Uri.parse(url);&#xA;&#xA;        Intent intent = null;&#xA;        // Check to see if someone is trying to play a YouTube page.&#xA;        if (url.contains(YOU_TUBE)) {&#xA;            // If we don&amp;#39;t do it this way you don&amp;#39;t have the option for youtube&#xA;            intent = new Intent(Intent.ACTION_VIEW, uri);&#xA;        } else {&#xA;            // Display video player&#xA;            intent = new Intent(Intent.ACTION_VIEW);&#xA;            intent.setDataAndType(uri, &amp;#34;video/*&amp;#34;);&#xA;        }&#xA;&#xA;        this.ctx.startActivity(intent);&#xA;    }&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;配置插件, res/xml/plugins.xml 添加如下代码&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;plugin name=&amp;#34;VideoPlayer&amp;#34; value=&amp;#34;com.phonegap.plugins.video.VideoPlayer&amp;#34;/&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;5&#34;&gt;&#xA;&lt;li&gt;编写代码进行调用，文件开头引入js代码框架，然后进行VideoPlayer类的play函数调用&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;script type=&amp;#34;text/javascript&amp;#34; charset=&amp;#34;utf-8&amp;#34; src=&amp;#34;phonegap.js&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;&#xA;&amp;lt;script type=&amp;#34;text/javascript&amp;#34; charset=&amp;#34;utf-8&amp;#34; src=&amp;#34;video.js&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;&#xA;&#xA; //Sample use:&#xA; /**&#xA;    * Display an intent to play the video.&#xA;    *&#xA;    * @param url           The url to play&#xA;    */&#xA; //play(url)&#xA;&#xA;window.plugins.videoPlayer.play(&amp;#34;http://path.to.my/video.mp4&amp;#34;);&#xA;window.plugins.videoPlayer.play(&amp;#34;file:///path/to/my/video.mp4&amp;#34;);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;6&#34;&gt;&#xA;&lt;li&gt;到此为止，插件的开发和部署，以及调用就都ok了，是不是很简单( ⊙ o ⊙ )啊！&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;最后向大家推荐一本书籍《PhoneGap Beginner&amp;rsquo;s Guide》，相信通过本书的学习，就知道了怎样利用PhoneGap来开发跨平台的mobile app了，同时也可以关注 &lt;a href=&#34;https://github.com/phonegap&#34;&gt;https://github.com/phonegap&lt;/a&gt; 项目的最新进展情况和新特性，如果可以的话，贡献自己的力量来进行完善和扩充，O(∩_∩)O~！&lt;/p&gt;</description>
			</item>
			<item>
				<title>移动 APP 之跨平台解决方案</title>
				<link>https://blog.zhourunsheng.com/2011/10/%e7%a7%bb%e5%8a%a8-app-%e4%b9%8b%e8%b7%a8%e5%b9%b3%e5%8f%b0%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/</link>
				<pubDate>Sat, 29 Oct 2011 10:29:21 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/10/%e7%a7%bb%e5%8a%a8-app-%e4%b9%8b%e8%b7%a8%e5%b9%b3%e5%8f%b0%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/</guid>
				<description>&lt;p&gt;最近看了一本书《Building Android Apps with HTML CSS and JavaScript》，顾名思义就是用开发web的方式来开发Android的APP，其中倒不是web的开发技术最吸我，而是这样的一种解决方案。像我们现在的手持设备种类这么多，主流的不外乎Android，Iphone，Ipad等等，如果要对每一种平台都开发一个相应的APP版本，代价太大。而基于浏览器的web app就容易解决这个问题，只需开发一次，便可以通用部署。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/10/jqtouch.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;上面即是使用web技术来开发本地iphone app的一幅运行图，关于web的开发技术，这里就不多说了，这里重点提及 Phonegap,利用它我们就可以把web app转换成各种移动平台的APP。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;PhoneGap&lt;/strong&gt; is an HTML5 app platform that allows you to author native applications with web technologies and get access to APIs and app stores. PhoneGap leverages web technologies developers already know best&amp;hellip; HTML and JavaScript&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;这里简单介绍一下PhoneGap，它对各个移动平台的API进行了一次封装，屏蔽了每种移动平台的具体细节，而设计了一个公共的API层，对开发者来说，只要调用统一的API来进行开发就可以了。&lt;/p&gt;&#xA;&lt;p&gt;把PhoneGap的源代码下载来通读了一下，了解了一下背后的实现原理，下面以Camera的功能为例来进行说明。&lt;/p&gt;&#xA;&lt;p&gt;API 开发文档请参照 &lt;a href=&#34;http://docs.phonegap.com/en/1.1.0/index.html&#34;&gt;http://docs.phonegap.com/en/1.1.0/index.html&lt;/a&gt;，其中有关Camera的开发API请参照&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://docs.phonegap.com/en/1.1.0/phonegap_camera_camera.md.html#Camera&#34;&gt;http://docs.phonegap.com/en/1.1.0/phonegap_camera_camera.md.html#Camera&lt;/a&gt;，我们的代码就可以写成&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;navigator.camera.getPicture(onSuccess, onFail, { quality: 50 });&#xA;function onSuccess(imageData) {    &#xA;  var image = document.getElementById(&amp;#39;myImage&amp;#39;);    &#xA;  image.src = &amp;#34;data:image/jpeg;base64,&amp;#34; + imageData;&#xA;}&#xA;function onFail(message) {    &#xA;  alert(&amp;#39;Failed because: &amp;#39; + message);&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;是不是很简单，具体后台平台的差异我们根本不需要来进行区别，全部由PhoneGap来给处理了，那么它是怎么处理的呢，继续往下看。&lt;/p&gt;</description>
			</item>
			<item>
				<title>You’ve got to find what you love</title>
				<link>https://blog.zhourunsheng.com/2011/10/youve-got-to-find-what-you-love/</link>
				<pubDate>Thu, 06 Oct 2011 12:58:18 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/10/youve-got-to-find-what-you-love/</guid>
				<description>&lt;p&gt;（斯坦福大学的演讲）纪念一位传奇！&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/10/steve-jobs-300x217.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;You’ve got to find what you love Today I want to tell you three stories from my life. That’s it. No big deal. Just three stories.  我今天很荣幸能和你们一起参加毕业典礼，斯坦福大学是世界上最好的大学之一。我从来没有从大学中毕业。说实话，今天也许是在我的生命中离大学毕业最近的一天了。今天我想向你们讲述我生活中的三个故事。不是什么大不了的事情，只是三个故事而已。The first story is about connecting the dots.  第一个故事是关于如何把生命中的点点滴滴串连起来。I dropped out of Reed College after the first 6 months, but then stayed around as a drop-in for another 18 months or so before I really quit. So why did I drop out?  我在Reed大学读了六个月之后就退学了，但是在十八个月以后——我真正的作出退学决定之前，我还经常去学校。我为什么要退学呢？It started before I was born. My biological mother was a young, unwed college graduate student, and she decided to put me up for adoption. She felt very strongly that I should be adopted by college graduates, so everything was all set for me to be adopted at birth by a lawyer and his wife. Except that when I popped out they decided at the last minute that they really wanted a girl. So my parents, who were on a waiting list, got a call in the middle of the night asking: “We have an unexpected baby boy; do you want him?” They said: “Of course.” My biological mother later found out that my mother had never graduated from college and that my father had never graduated from high school. She refused to sign the final adoption papers. She only relented a few months later when my parents promised that I would someday go to college.  故事从我出生的时候讲起。我的亲生母亲是一个年轻的，没有结婚的大学毕业生。她决定让别人收养我, 她十分想让我被大学毕业生收养。所以在我出生的时候，她已经做好了一切的准备工作，能使得我被一个律师和他的妻子所收养。但是她没有料到，当我出生之后，律师夫妇突然决定他们想要一个女孩。所以我的生养父母（他们还在我亲生父母的观察名单上）突然在半夜接到了一个电话:“我们现在这儿有一个不小心生出来的男婴，你们想要他吗？”他们回答道:“当然！”但是我亲生母亲随后发现，我的养母从来没有上过大学，我的父亲甚至从没有读过高中。她拒绝签这个收养合同。只是在几个月以后，我的父母答应她一定要让我上大学，那个时候她才同意。And 17 years later I did go to college. But I naively chose a college that was almost as expensive as Stanford, and all of my working-class parents’ savings were being spent on my college tuition. After six months, I couldn’t see the value in it. I had no idea what I wanted to do with my life and no idea how college was going to help me figure it out. And here I was spending all of the money my parents had saved their entire life. So I decided to drop out and trust that it would all work out OK. It was pretty scary at the time, but looking back it was one of the best decisions I ever made. The minute I dropped out I could stop taking the required classes that didn’t interest me, and begin dropping in on the ones that looked interesting.  在十七岁那年，我真的上了大学。但是我很愚蠢的选择了一个几乎和你们斯坦福大学一样贵的学校, 我父母还处于蓝领阶层，他们几乎把所有积蓄都花在了我的学费上面。在六个月后, 我已经看不到其中的价值所在。我不知道我想要在生命中做什么，我也不知道大学能帮助我找到怎样的答案。但是在这里，我几乎花光了我父母这一辈子的所有积蓄。所以我决定要退学，我觉得这是个正确的决定。不能否认，我当时确实非常的害怕, 但是现在回头看看，那的确是我这一生中最棒的一个决定。在我做出退学决定的那一刻, 我终于可以不必去读那些令我提不起丝毫兴趣的课程了。然后我还可以去修那些看起来有点意思的课程。It wasn’t all romantic. I didn’t have a dorm room, so I slept on the floor in friends’ rooms, I returned coke bottles for the 5¢ deposits to buy food with, and I would walk the 7 miles across town every Sunday night to get one good meal a week at the Hare Krishna temple. I loved it. And much of what I stumbled into by following my curiosity and intuition turned out to be priceless later on. Let me give you one example:  但是这并不是那么罗曼蒂克。我失去了我的宿舍，所以我只能在朋友房间的地板上面睡觉，我去捡5美分的可乐瓶子，仅仅为了填饱肚子, 在星期天的晚上，我需要走七英里的路程，穿过这个城市到Hare Krishna寺庙（注：位于纽约Brooklyn下城）,只是为了能吃上饭——这个星期唯一一顿好一点的饭。但是我喜欢这样。我跟着我的直觉和好奇心走, 遇到的很多东西，此后被证明是无价之宝。让我给你们举一个例子吧：Reed College at that time offered perhaps the best calligraphy instruction in the country. Throughout the campus every poster, every label on every drawer, was beautifully hand calligraphed. Because I had dropped out and didn’t have to take the normal classes, I decided to take a calligraphy class to learn how to do this. I learned about serif and san serif typefaces, about varying the amount of space between different letter combinations, about what makes great typography great. It was beautiful, historical, artistically subtle in a way that science can’t capture, and I found it fascinating.  Reed大学在那时提供也许是全美最好的美术字课程。在这个大学里面的每个海报, 每个抽屉的标签上面全都是漂亮的美术字。因为我退学了, 没有受到正规的训练, 所以我决定去参加这个课程，去学学怎样写出漂亮的美术字。我学到了san serif 和serif字体, 我学会了怎么样在不同的字母组合之中改变空格的长度, 还有怎么样才能作出最棒的印刷式样。那是一种科学永远不能捕捉到的、美丽的、真实的艺术精妙, 我发现那实在是太美妙了。None of this had even a hope of any practical application in my life. But ten years later, when we were designing the first Macintosh computer, it all came back to me. And we designed it all into the Mac. It was the first computer with beautiful typography. If I had never dropped in on that single course in college, the Mac would have never had multiple typefaces or proportionally spaced fonts. And since Windows just copied the Mac, its likely that no personal computer would have them. If I had never dropped out, I would have never dropped in on this calligraphy class, and personal computers might not have the wonderful typography that they do. Of course it was impossible to connect the dots looking forward when I was in college. But it was very, very clear looking backwards ten years later.  当时看起来这些东西在我的生命中，好像都没有什么实际应用的可能。但是十年之后，当我们在设计第一台Macintosh电脑的时候，就不是那样了。我把当时我学的那些家伙全都设计进了Mac。那是第一台使用了漂亮的印刷字体的电脑。如果我当时没有退学, 就不会有机会去参加这个我感兴趣的美术字课程, Mac就不会有这么多丰富的字体，以及赏心悦目的字体间距。那么现在个人电脑就不会有现在这么美妙的字型了。当然我在大学的时候，还不可能把从前的点点滴滴串连起来，但是当我十年后回顾这一切的时候，真的豁然开朗了。Again, you can’t connect the dots looking forward; you can only connect them looking backwards. So you have to trust that the dots will somehow connect in your future. You have to trust in something – your gut, destiny, life, karma, whatever. This approach has never let me down, and it has made all the difference in my life.  再次说明的是，你在向前展望的时候不可能将这些片断串连起来；你只能在回顾的时候将点点滴滴串连起来。所以你必须相信这些片断会在你未来的某一天串连起来。你必须要相信某些东西：你的勇气、目的、生命、因缘。这个过程从来没有令我失望（let me down）,只是让我的生命更加地与众不同而已。My second story is about love and loss.  我的第二个故事是关于爱和损失的。I was lucky – I found what I loved to do early in life. Woz and I started Apple in my parents garage when I was 20. We worked hard, and in 10 years Apple had grown from just the two of us in a garage into a billion company with over 4000 employees. We had just released our finest creation – the Macintosh – a year earlier, and I had just turned 30. And then I got fired. How can you get fired from a company you started? Well, as Apple grew we hired someone who I thought was very talented to run the company with me, and for the first year or so things went well. But then our visions of the future began to diverge and eventually we had a falling out. When we did, our Board of Directors sided with him. So at 30 I was out. And very publicly out. What had been the focus of my entire adult life was gone, and it was devastating.  我非常幸运, 因为我在很早的时候就找到了我钟爱的东西。Woz和我在二十岁的时候就在父母的车库里面开创了苹果公司。我们工作得很努力, 十年之后, 这个公司从那两个车库中的穷光蛋发展到了超过四千名的雇员、价值超过二十亿的大公司。在公司成立的第九年，我们刚刚发布了最好的产品，那就是Macintosh。我也快要到三十岁了。在那一年, 我被炒了鱿鱼。你怎么可能被你自己创立的公司炒了鱿鱼呢? 嗯，在苹果快速成长的时候，我们雇用了一个很有天分的家伙和我一起管理这个公司, 在最初的几年，公司运转的很好。但是后来我们对未来的看法发生了分歧, 最终我们吵了起来。当争吵不可开交的时候, 董事会站在了他的那一边。所以在三十岁的时候, 我被炒了。在这么多人的眼皮下我被炒了。在而立之年，我生命的全部支柱离自己远去, 这真是毁灭性的打击。I really didn’t know what to do for a few months. I felt that I had let the previous generation of entrepreneurs down – that I had dropped the baton as it was being passed to me. I met with David Packard and Bob Noyce and tried to apologize for screwing up so badly. I was a very public failure, and I even thought about running away from the valley. But something slowly began to dawn on me – I still loved what I did. The turn of events at Apple had not changed that one bit. I had been rejected, but I was still in love. And so I decided to start over.  在最初的几个月里，我真是不知道该做些什么。我把从前的创业激情给丢了, 我觉得自己让与我一同创业的人都很沮丧。我和David Pack和Bob Boyce见面，并试图向他们道歉。我把事情弄得糟糕透顶了。但是我渐渐发现了曙光, 我仍然喜爱我从事的这些东西。苹果公司发生的这些事情丝毫的没有改变这些, 一点也没有。我被驱逐了，但是我仍然钟爱它。所以我决定从头再来。I didn’t see it then, but it turned out that getting fired from Apple was the best thing that could have ever happened to me. The heaviness of being successful was replaced by the lightness of being a beginner again, less sure about everything. It freed me to enter one of the most creative periods of my life.  我当时没有觉察, 但是事后证明, 从苹果公司被炒是我这辈子发生的最棒的事情。因为，作为一个成功者的极乐感觉被作为一个创业者的轻松感觉所重新代替: 对任何事情都不那么特别看重。这让我觉得如此自由, 进入了我生命中最有创造力的一个阶段。During the next five years, I started a company named NeXT, another company named Pixar, and fell in love with an amazing woman who would become my wife. Pixar went on to create the worlds first computer animated feature film, Toy Story, and is now the most successful animation studio in the world. In a remarkable turn of events, Apple bought NeXT, I retuned to Apple, and the technology we developed at NeXT is at the heart of Apple’s current renaissance. And Laurene and I have a wonderful family together.  在接下来的五年里, 我创立了一个名叫NeXT的公司, 还有一个叫Pixar的公司, 然后和一个后来成为我妻子的优雅女人相识。Pixar 制作了世界上第一个用电脑制作的动画电影——“”玩具总动员”,Pixar现在也是世界上最成功的电脑制作工作室。在后来的一系列运转中,Apple收购了NeXT, 然后我又回到了Apple公司。我们在NeXT发展的技术在Apple的复兴之中发挥了关键的作用。我还和Laurence 一起建立了一个幸福的家庭。I’m pretty sure none of this would have happened if I hadn’t been fired from Apple. It was awful tasting medicine, but I guess the patient needed it. Sometimes life hits you in the head with a brick. Don’t lose faith. I’m convinced that the only thing that kept me going was that I loved what I did. You’ve got to find what you love. And that is as true for your work as it is for your lovers. Your work is going to fill a large part of your life, and the only way to be truly satisfied is to do what you believe is great work. And the only way to do great work is to love what you do. If you haven’t found it yet, keep looking. Don’t settle. As with all matters of the heart, you’ll know when you find it. And, like any great relationship, it just gets better and better as the years roll on. So keep looking until you find it. Don’t settle.  我可以非常肯定，如果我不被Apple开除的话, 这其中一件事情也不会发生的。这个良药的味道实在是太苦了，但是我想病人需要这个药。有些时候, 生活会拿起一块砖头向你的脑袋上猛拍一下。不要失去信心。我很清楚唯一使我一直走下去的，就是我做的事情令我无比钟爱。你需要去找到你所爱的东西。对于工作是如此, 对于你的爱人也是如此。你的工作将会占据生活中很大的一部分。你只有相信自己所做的是伟大的工作, 你才能怡然自得。如果你现在还没有找到, 那么继续找、不要停下来、全心全意的去找, 当你找到的时候你就会知道的。就像任何真诚的关系, 随着岁月的流逝只会越来越紧密。所以继续找，直到你找到它，不要停下来！My third story is about death.  我的第三个故事是关于死亡的。When I was 17, I read a quote that went something like: “If you live each day as if it was your last, someday you’ll most certainly be right.” It made an impression on me, and since then, for the past 33 years, I have looked in the mirror every morning and asked myself: “If today were the last day of my life, would I want to do what I am about to do today?” And whenever the answer has been “No” for too many days in a row, I know I need to change something.  当我十七岁的时候, 我读到了一句话:“如果你把每一天都当作生命中最后一天去生活的话，那么有一天你会发现你是正确的。”这句话给我留下了深刻的印象。从那时开始，过了33年，我在每天早晨都会对着镜子问自己:“如果今天是我生命中的最后一天, 你会不会完成你今天想做的事情呢？”当答案连续很多次被给予“不是”的时候, 我知道自己需要改变某些事情了。Remembering that I’ll be dead soon is the most important tool I’ve ever encountered to help me make the big choices in life. Because almost everything – all external expectations, all pride, all fear of embarrassment or failure – these things just fall away in the face of death, leaving only what is truly important. Remembering that you are going to die is the best way I know to avoid the trap of thinking you have something to lose. You are already naked. There is no reason not to follow your heart.  “记住你即将死去”是我一生中遇到的最重要箴言。它帮我指明了生命中重要的选择。因为几乎所有的事情, 包括所有的荣誉、所有的骄傲、所有对难堪和失败的恐惧，这些在死亡面前都会消失。我看到的是留下的真正重要的东西。你有时候会思考你将会失去某些东西,“记住你即将死去”是我知道的避免这些想法的最好办法。你已经赤身裸体了, 你没有理由不去跟随自己的心一起跳动。About a year ago I was diagnosed with cancer. I had a scan at 7:30 in the morning, and it clearly showed a tumor on my pancreas. I didn’t even know what a pancreas was. The doctors told me this was almost certainly a type of cancer that is incurable, and that I should expect to live no longer than three to six months. My doctor advised me to go home and get my affairs in order, which is doctor’s code for prepare to die. It means to try to tell your kids everything you thought you’d have the next 10 years to tell them in just a few months. It means to make sure everything is buttoned up so that it will be as easy as possible for your family. It means to say your goodbyes.  大概一年以前, 我被诊断出癌症。我在早晨七点半做了一个检查, 检查清楚的显示在我的胰腺有一个肿瘤。我当时都不知道胰腺是什么东西。医生告诉我那很可能是一种无法治愈的癌症, 我还有三到六个月的时间活在这个世界上。我的医生叫我回家, 然后整理好我的一切, 那就是医生准备死亡的程序。那意味着你将要把未来十年对你小孩说的话在几个月里面说完.；那意味着把每件事情都搞定, 让你的家人会尽可能轻松的生活；那意味着你要说“再见了”。I lived with that diagnosis all day. Later that evening I had a biopsy, where they stuck an endoscope down my throat, through my stomach and into my intestines, put a needle into my pancreas and got a few cells from the tumor. I was sedated, but my wife, who was there, told me that when they viewed the cells under a microscope the doctors started crying because it turned out to be a very rare form of pancreatic cancer that is curable with surgery. I had the surgery and I’m fine now.  我整天和那个诊断书一起生活。后来有一天早上我作了一个活切片检查，医生将一个内窥镜从我的喉咙伸进去，通过我的胃, 然后进入我的肠子, 用一根针在我的胰腺上的肿瘤上取了几个细胞。我当时很镇静，因为我被注射了镇定剂。但是我的妻子在那里, 后来告诉我，当医生在显微镜地下观察这些细胞的时候他们开始尖叫, 因为这些细胞最后竟然是一种非常罕见的可以用手术治愈的胰腺癌症。我做了这个手术, 现在我痊愈了。This was the closest I’ve been to facing death, and I hope its the closest I get for a few more decades. Having lived through it, I can now say this to you with a bit more certainty than when death was a useful but purely intellectual concept:  那是我最接近死亡的时候, 我还希望这也是以后的几十年最接近的一次。从死亡线上又活了过来, 死亡对我来说，只是一个有用但是纯粹是知识上的概念的时候，我可以更肯定一点地对你们说：No one wants to die. Even people who want to go to heaven don’t want to die to get there. And yet death is the destination we all share. No one has ever escaped it. And that is as it should be, because Death is very likely the single best invention of Life. It is Life’s change agent. It clears out the old to make way for the new. Right now the new is you, but someday not too long from now, you will gradually become the old and be cleared away. Sorry to be so dramatic, but it is quite true.  没有人愿意死, 即使人们想上天堂, 人们也不会为了去那里而死。但是死亡是我们每个人共同的终点。从来没有人能够逃脱它。也应该如此。因为死亡就是生命中最好的一个发明。它将旧的清除以便给新的让路。你们现在是新的, 但是从现在开始不久以后, 你们将会逐渐的变成旧的然后被清除。我很抱歉这很戏剧性, 但是这十分的真实。Your time is limited, so don’t waste it living someone else’s life. Don’t be trapped by dogma – which is living with the results of other people’s thinking. Don’t let the noise of other’s opinions drown out your own inner voice. And most important, have the courage to follow your heart and intuition. They somehow already know what you truly want to become. Everything else is secondary.  你们的时间很有限, 所以不要将他们浪费在重复其他人的生活上。不要被教条束缚，那意味着你和其他人思考的结果一起生活。不要被其他人喧嚣的观点掩盖你真正的内心的声音。还有最重要的是, 你要有勇气去听从你直觉和心灵的指示——它们在某种程度上知道你想要成为什么样子，所有其他的事情都是次要的。When I was young, there was an amazing publication called The Whole Earth Catalog, which was one of the bibles of my generation. It was created by a fellow named Stewart Brand not far from here in Menlo Park, and he brought it to life with his poetic touch. This was in the late 1960′s, before personal computers and desktop publishing, so it was all made with typewriters, scissors, and polaroid cameras. It was sort of like Google in paperback form, 35 years before Google came along: it was idealistic, and overflowing with neat tools and great notions.  当我年轻的时候, 有一本叫做“整个地球的目录”振聋发聩的杂志，它是我们那一代人的圣经之一。它是一个叫Stewart Brand的家伙在离这里不远的Menlo Park书写的, 他象诗一般神奇地将这本书带到了这个世界。那是六十年代后期, 在个人电脑出现之前, 所以这本书全部是用打字机,、剪刀还有偏光镜制造的。有点像用软皮包装的google, 在google出现三十五年之前：这是理想主义的，其中有许多灵巧的工具和伟大的想法。Stewart and his team put out several issues of The Whole Earth Catalog, and then when it had run its course, they put out a final issue. It was the mid-1970s, and I was your age. On the back cover of their final issue was a photograph of an early morning country road, the kind you might find yourself hitchhiking on if you were so adventurous. Beneath it were the words: “Stay Hungry. Stay Foolish.” It was their farewell message as they signed off. Stay Hungry. Stay Foolish. And I have always wished that for myself. And now, as you graduate to begin anew, I wish that for you.  Stewart和他的伙伴出版了几期的“整个地球的目录”,当它完成了自己使命的时候, 他们做出了最后一期的目录。那是在七十年代的中期, 你们的时代。在最后一期的封底上是清晨乡村公路的照片（如果你有冒险精神的话，你可以自己找到这条路的），在照片之下有这样一段话：“保持饥饿，保持愚蠢。”这是他们停止了发刊的告别语。“保持饥饿，保持愚蠢。”我总是希望自己能够那样，现在, 在你们即将毕业，开始新的旅程的时候, 我也希望你们能这样：Stay Hungry. Stay Foolish.  保持饥饿，保持愚蠢。Thank you all very much.  非常感谢你们！&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
			</item>
			<item>
				<title>Heroku 上的 Scala 程序设计</title>
				<link>https://blog.zhourunsheng.com/2011/10/heroku-%e4%b8%8a%e7%9a%84-scala-%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1/</link>
				<pubDate>Tue, 04 Oct 2011 20:29:46 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/10/heroku-%e4%b8%8a%e7%9a%84-scala-%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1/</guid>
				<description>&lt;p&gt;最近 Heroku 官方博客发布声明已经支持Scala语言《Scala now runs on Heroku》，本文就带领大家熟悉一下Scala App的开发流程。&lt;/p&gt;&#xA;&lt;p&gt;目前有两种开发部署方式可供选择，一种类似《Heroku 上的 Java 程序设计》，采用Maven管理，另一种是利用 sbt&lt;/p&gt;&#xA;&lt;p&gt;(the Scala Build Tool) 去开发部署，本文以第二种方式来进行介绍。关于Heroku的详细介绍和本地的开发环境安装，请参照博文《Heroku 上的 Java 程序设计》，本文只对不同的地方做具体说明。&lt;/p&gt;&#xA;&lt;p&gt;Heroku = Polyglot + Platform as a Service (PaaS) + Cloud Components&lt;/p&gt;&#xA;&lt;h2 id=&#34;开发步骤&#34;&gt;开发步骤&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;安装 Scala 开发工具 &lt;a href=&#34;https://github.com/harrah/xsbt/wiki/Setup&#34;&gt;sbt&lt;/a&gt;（win7的环境我已经写好了配置文件，直接下载到工程目录中即可&lt;a href=&#34;/wp-content/uploads/2011/10/win7_sdt.zip&#34;&gt;win7_sdt&lt;/a&gt;）&lt;/li&gt;&#xA;&lt;li&gt;登录 Heroku :&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;heroku auth:login&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;创建一个新工程目录，例如careyscala，目录中新建文件 &lt;em&gt;careyscala/build.sbt，&lt;/em&gt; 内容如下:&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;scalaVersion := &amp;#34;2.9.1&amp;#34;&#xA;&#xA;{&#xA;  val stage = TaskKey[Unit](&amp;#34;stage&amp;#34;, &amp;#34;Prepares the project to be run, in environments that deploy source trees rather than packages.&amp;#34;)&#xA;  stage in Compile := {}&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;为Heroku添加一个新的 “stage” task.&#xA;4. 建立编译配置文件 &lt;em&gt;careyscala/project/build.properties&lt;/em&gt; ，用来指明sdt的版本，具体内容如下:&lt;/p&gt;</description>
			</item>
			<item>
				<title>探讨 Android 网络编程</title>
				<link>https://blog.zhourunsheng.com/2011/09/%e6%8e%a2%e8%ae%a8-android-%e7%bd%91%e7%bb%9c%e7%bc%96%e7%a8%8b/</link>
				<pubDate>Fri, 30 Sep 2011 23:29:32 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/09/%e6%8e%a2%e8%ae%a8-android-%e7%bd%91%e7%bb%9c%e7%bc%96%e7%a8%8b/</guid>
				<description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;&#xA;&lt;p&gt;谈到 Android 的网络编程，相信大家都不会陌生，我们平时用到的也就是两种 Http Client，分别为 HttpURLConnection 和  Apache HTTP Client，下面就分析一下它们各自的适用场合。&lt;/p&gt;&#xA;&lt;p&gt;Most network-connected Android apps will use HTTP to send and receive data. Android includes two HTTP clients: HttpURLConnection and Apache HTTP Client. Both support HTTPS, streaming uploads and downloads, configurable timeouts, IPv6 and connection pooling.&lt;/p&gt;&#xA;&lt;h2 id=&#34;apache-http-client&#34;&gt;Apache HTTP Client&lt;/h2&gt;&#xA;&lt;p&gt;Apache Http Client 的优势是适合于作为web 浏览器的客户端和稳定性较好，并且可灵活配置，缺点是在追求兼容性的情况下难以扩展。&lt;/p&gt;&#xA;&lt;p&gt;DefaultHttpClient and its sibling AndroidHttpClient&lt;/p&gt;&#xA;&lt;p&gt;are extensible HTTP clients suitable for web browsers. They have large and flexible APIs. Their implementation is stable and they have few bugs.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Heroku平台的FaceBook APP开发</title>
				<link>https://blog.zhourunsheng.com/2011/09/heroku%e5%b9%b3%e5%8f%b0%e7%9a%84facebook-app%e5%bc%80%e5%8f%91/</link>
				<pubDate>Sat, 24 Sep 2011 13:17:21 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/09/heroku%e5%b9%b3%e5%8f%b0%e7%9a%84facebook-app%e5%bc%80%e5%8f%91/</guid>
				<description>&lt;p&gt;Facebook 官方博客发表声明开始支持APP自动化部署到 Heroku&lt;/p&gt;&#xA;&lt;p&gt;平台，这倒是一个好消息，APP的开发者再也不用担心平台的部署问题了，更何况Heroku这后起之秀的优秀云平台提供者，PHP，Ruby，Node.js等等几乎现在流行的开发语言都支持，所以方便多了。详情见 Facebook and Heroku: an even easier way to get started。本文就介绍一下具体的开发和部署方法。&lt;/p&gt;&#xA;&lt;h2 id=&#34;部署&#34;&gt;部署&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;访问FaceBook &lt;a href=&#34;https://developers.facebook.com/apps&#34;&gt;Dev App&lt;/a&gt;开发中心，创建一个新的APP（ &lt;strong&gt;Create New App&lt;/strong&gt;），输入APP的基本信息，包括APP Name 和 APP Namespace &lt;img src=&#34;/wp-content/uploads/2011/09/create_new_app1-300x113.png&#34; alt=&#34;&#34;&gt;&lt;/li&gt;&#xA;&lt;li&gt;APP 建立以后，进入到APP的配置界面，在这里选择云平台部署，选择 &lt;strong&gt;Cloud Services -&amp;gt; &lt;strong&gt;Get Started&lt;img src=&#34;/wp-content/uploads/2011/09/careyblog_app_setting-300x216.png&#34; alt=&#34;&#34;&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;在云平台中选择Heroku，目前只有该平台，所以直接选择即可 &lt;img src=&#34;/wp-content/uploads/2011/09/clound_service_heroku-300x99.png&#34; alt=&#34;&#34;&gt;&lt;/li&gt;&#xA;&lt;li&gt;接下来开始配置Heroku的开发环境，选择一个目前最流行的Node.js，然后APP开始自动配置 &lt;img src=&#34;/wp-content/uploads/2011/09/clound_service_heroku_select_nodejs-300x144.png&#34; alt=&#34;&#34;&gt;&lt;/li&gt;&#xA;&lt;li&gt;然后APP会请求账户的权限，允许即可，页面会跳转到部署好的页面上面，比如我建立的CareyBlog已经部署到了&lt;a href=&#34;https://afternoon-frost-4168.herokuapp.com&#34;&gt;https://afternoon-frost-4168.herokuapp.com/&lt;/a&gt;，现在可以直接访问了，程序已经实现了一部分功能了，如抓取好友列表，最近照片等等 &lt;img src=&#34;/wp-content/uploads/2011/09/careyblog_request_permission-300x216.png&#34; alt=&#34;&#34;&gt;&lt;a href=&#34;/wp-content/uploads/2011/09/careyblog_app_page1.png&#34;&gt;&lt;img src=&#34;/wp-content/uploads/2011/09/careyblog_app_page1-300x209.png&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;至此为止，前期工作都已OK，APP的框架已经搭建，并且部署完毕，后续就是丰富APP的内容，进一步开发了&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;开发&#34;&gt;开发&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;到创建APP时填写的邮箱中收取Heroku的部署信息&lt;/li&gt;&#xA;&lt;li&gt;登录Heroku获取代码&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;heroku login&#xA;git clone git@heroku.com:afternoon-frost-4168.git -o heroku&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/09/facebook_app_code-300x104.png&#34; alt=&#34;&#34;&gt;&#xA;3. 修改代码并更新&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git commit -am &amp;#34;changed greeting&amp;#34;&#xA;git push heroku&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;总结&#34;&gt;总结&lt;/h2&gt;&#xA;&lt;p&gt;一切操作都在云端解决了，只剩下好的创意来开发APP了！&lt;/p&gt;</description>
			</item>
			<item>
				<title>探秘腾讯Android手机游戏平台之不安装游戏APK直接启动法</title>
				<link>https://blog.zhourunsheng.com/2011/09/%e6%8e%a2%e7%a7%98%e8%85%be%e8%ae%afandroid%e6%89%8b%e6%9c%ba%e6%b8%b8%e6%88%8f%e5%b9%b3%e5%8f%b0%e4%b9%8b%e4%b8%8d%e5%ae%89%e8%a3%85%e6%b8%b8%e6%88%8fapk%e7%9b%b4%e6%8e%a5%e5%90%af%e5%8a%a8%e6%b3%95/</link>
				<pubDate>Sun, 18 Sep 2011 16:36:18 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/09/%e6%8e%a2%e7%a7%98%e8%85%be%e8%ae%afandroid%e6%89%8b%e6%9c%ba%e6%b8%b8%e6%88%8f%e5%b9%b3%e5%8f%b0%e4%b9%8b%e4%b8%8d%e5%ae%89%e8%a3%85%e6%b8%b8%e6%88%8fapk%e7%9b%b4%e6%8e%a5%e5%90%af%e5%8a%a8%e6%b3%95/</guid>
				<description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;&#xA;&lt;p&gt;相信这样一个问题，大家都不会陌生，&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;“有什么的方法可以使Android的程序APK不用安装，而能够直接启动”。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;发现最后的结局都是不能实现这个美好的愿望，而腾讯Android手机游戏平台却又能实现这个功能，下载的连连看，五子棋都没有安装过程，但是都能直接运行，这其中到底有什么“玄机”呢，也有热心童鞋问过我这个问题，本文就为大家来揭开这个谜团。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;重要说明在实践的过程中大家都会发现资源引用的问题，这里重点声明两点：1. 资源文件是不能直接inflate的，如果简单的话直接在程序中用代码书写。2. 资源文件是不能用R来引用的，因为上下文已经不同了，腾讯的做法是将资源文件打包(*.pak文件和APK打包在一起)，虽然APK是没有进行安装，但是资源文件是另外解压到指定文件夹下面的，然后将文件夹的地址传给了第三方应用程序，这样第三方应用程序通过File的inputstream流还是可以读取和使用这些资源的。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;实践&#34;&gt;实践&lt;/h2&gt;&#xA;&lt;p&gt;我实现了一个小小的Demo，麻雀虽小五脏俱全，为了突出原理，我就尽量简化了程序，通过这个实例来让大家明白后台的工作原理。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;下载demo的apk程序&lt;a href=&#34;/wp-content/uploads/2011/09/apks.zip&#34;&gt;apks&lt;/a&gt;，其中包括了两个apk，分别是A和B&lt;/li&gt;&#xA;&lt;li&gt;这两个APK可分别安装和运行，A程序界面只显示一个Button，B程序界面会动态显示当前的时间&lt;/li&gt;&#xA;&lt;li&gt;下面的三幅图片分别为直接启动运行A程序（安装TestA.apk），直接启动运行B程序（安装TestB.apk）和由A程序动态启动B程序（安装TestA.apk，TestB.apk不用安装，而是放在/mnt/sdcard/目录中，即 SD卡上）的截图，细心的同学可以停下来观察一下他们之间的不同  &lt;img src=&#34;/wp-content/uploads/2011/09/device-2011-09-18-A-200x300.png&#34; alt=&#34;&#34;&gt;&lt;img src=&#34;/wp-content/uploads/2011/09/device-2011-09-18-B-200x300.png&#34; alt=&#34;&#34;&gt;&lt;img src=&#34;/wp-content/uploads/2011/09/device-2011-09-18-AB-200x300.png&#34; alt=&#34;&#34;&gt;&lt;/li&gt;&#xA;&lt;li&gt;后两幅图片的不同，也即Title的不同，则解释出了我们将要分析的后台实现原理的机制&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;实现原理&#34;&gt;实现原理&lt;/h2&gt;&#xA;&lt;p&gt;最能讲明白道理的莫过于源码了，下面我们就来分析一下A和B的实现机制，首先来分析TestA.apk的主要代码实现：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#x9;@Override&#xA;&#x9;public void onCreate(Bundle savedInstanceState) {&#xA;&#x9;&#x9;super.onCreate(savedInstanceState);&#xA;&#x9;&#x9;setContentView(R.layout.main);&#xA;&#xA;&#x9;&#x9;Button btn = (Button) findViewById(R.id.btn);&#xA;&#x9;&#x9;btn.setOnClickListener(new OnClickListener() {&#xA;&#xA;&#x9;&#x9;&#x9;@Override&#xA;&#x9;&#x9;&#x9;public void onClick(View v) {&#xA;&#x9;&#x9;&#x9;&#x9;Bundle paramBundle = new Bundle();&#xA;&#x9;&#x9;&#x9;&#x9;paramBundle.putBoolean(&amp;#34;KEY_START_FROM_OTHER_ACTIVITY&amp;#34;, true);&#xA;&#x9;&#x9;&#x9;&#x9;String dexpath = &amp;#34;/mnt/sdcard/TestB.apk&amp;#34;;&#xA;&#x9;&#x9;&#x9;&#x9;String dexoutputpath = &amp;#34;/mnt/sdcard/&amp;#34;;&#xA;&#x9;&#x9;&#x9;&#x9;LoadAPK(paramBundle, dexpath, dexoutputpath);&#xA;&#x9;&#x9;&#x9;}&#xA;&#x9;&#x9;});&#xA;&#x9;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;代码解析&#34;&gt;代码解析&lt;/h3&gt;&#xA;&lt;p&gt;这就是OnCreate函数要做的事情，装载view界面，绑定button事件，大家都熟悉了，还有就是设置程序B的放置路径，因为我程序中代码是从/mnt/sdcard/TestB.apk中动态加载，这也就是为什么要让大家把TestB.apk放在SD卡上面的原因了。关键的函数就是最后一个了LoadAPK，它来实现动态加载B程序。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#x9;public void LoadAPK(Bundle paramBundle, String dexpath, String dexoutputpath) {&#xA;&#x9;&#x9;ClassLoader localClassLoader = ClassLoader.getSystemClassLoader();&#xA;&#x9;&#x9;DexClassLoader localDexClassLoader = new DexClassLoader(dexpath,&#xA;&#x9;&#x9;&#x9;&#x9;dexoutputpath, null, localClassLoader);&#xA;&#x9;&#x9;try {&#xA;&#x9;&#x9;&#x9;PackageInfo plocalObject = getPackageManager()&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;.getPackageArchiveInfo(dexpath, 1);&#xA;&#xA;&#x9;&#x9;&#x9;if ((plocalObject.activities != null)&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;amp;&amp;amp; (plocalObject.activities.length &amp;gt; 0)) {&#xA;&#x9;&#x9;&#x9;&#x9;String activityname = plocalObject.activities[0].name;&#xA;&#x9;&#x9;&#x9;&#x9;Log.d(TAG, &amp;#34;activityname = &amp;#34; + activityname);&#xA;&#xA;&#x9;&#x9;&#x9;&#x9;Class localClass = localDexClassLoader.loadClass(activityname);&#xA;&#x9;&#x9;&#x9;&#x9;Constructor localConstructor = localClass&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;.getConstructor(new Class[] {});&#xA;&#x9;&#x9;&#x9;&#x9;Object instance = localConstructor.newInstance(new Object[] {});&#xA;&#x9;&#x9;&#x9;&#x9;Log.d(TAG, &amp;#34;instance = &amp;#34; + instance);&#xA;&#xA;&#x9;&#x9;&#x9;&#x9;Method localMethodSetActivity = localClass.getDeclaredMethod(&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;#34;setActivity&amp;#34;, new Class[] { Activity.class });&#xA;&#x9;&#x9;&#x9;&#x9;localMethodSetActivity.setAccessible(true);&#xA;&#x9;&#x9;&#x9;&#x9;localMethodSetActivity.invoke(instance, new Object[] { this });&#xA;&#xA;&#x9;&#x9;&#x9;&#x9;Method methodonCreate = localClass.getDeclaredMethod(&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;#34;onCreate&amp;#34;, new Class[] { Bundle.class });&#xA;&#x9;&#x9;&#x9;&#x9;methodonCreate.setAccessible(true);&#xA;&#x9;&#x9;&#x9;&#x9;methodonCreate.invoke(instance, new Object[] { paramBundle });&#xA;&#x9;&#x9;&#x9;}&#xA;&#x9;&#x9;&#x9;return;&#xA;&#x9;&#x9;} catch (Exception ex) {&#xA;&#x9;&#x9;&#x9;ex.printStackTrace();&#xA;&#x9;&#x9;}&#xA;&#x9;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;代码解析-1&#34;&gt;代码解析&lt;/h3&gt;&#xA;&lt;p&gt;这个函数要做的工作如下：加载B程序的APK文件，通过类加载器DexClassLoader来解析APK文件，这样会在SD卡上面生成一个同名的后缀为dex的文件，例如/mnt/sdcard/TestB.apk==&amp;gt;/mnt/sdcard/TestB.dex,接下来就是通过java反射机制，动态实例化B中的Activity对象，并依次调用了其中的两个函数，分别为setActivity和onCreate.看到这里，大家是不是觉得有点奇怪，Activity的启动函数是onCreate，为什么要先调用setActivity，而更奇怪的是setActivity并不是系统的函数，确实，那是我们自定义的，这也就是核心的地方。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Google Plus API 之程序设计</title>
				<link>https://blog.zhourunsheng.com/2011/09/google-plus-api-%e4%b9%8b-%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1/</link>
				<pubDate>Sat, 17 Sep 2011 13:25:22 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/09/google-plus-api-%e4%b9%8b-%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1/</guid>
				<description>&lt;p&gt;昨天Google官方发布新闻(Getting started on the Google+ &lt;em&gt;API&lt;/em&gt;)，Google Plus开放了一个只读的API，允许抓取用户的公开Profile和公开的Activity信息流，其中 Google+ Platform 的具体开发API介绍详见官网。&lt;/p&gt;&#xA;&lt;p&gt;今天我就带领大家熟悉一下基于Google+ 开放API的程序设计，本程序基于SAE平台，采用PHP语言开发，基于Java语言和Python语言也都比较好开发，google官方都有开放的lib可以直接使用，不用自己再做底层封装了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;实现步骤&#34;&gt;实现步骤&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;访问 &lt;a href=&#34;https://code.google.com/apis/console/?api=plus&#34;&gt;Google API Console&lt;/a&gt; 开启Google+ API权限. &lt;img src=&#34;/wp-content/uploads/2011/09/active_google_plus.png&#34; alt=&#34;&#34;&gt;&lt;/li&gt;&#xA;&lt;li&gt;访问 &lt;a href=&#34;https://code.google.com/apis/console/?api=plus&#34;&gt;Google API Console&lt;/a&gt; 生成  developer key, OAuth2 client id, OAuth2 client secret, 和注册 OAuth2 redirect uri. &lt;img src=&#34;/wp-content/uploads/2011/09/google_plus_client_id.png&#34; alt=&#34;&#34;&gt; &lt;img src=&#34;/wp-content/uploads/2011/09/google-plus-simple-api-access.png&#34; alt=&#34;&#34;&gt;&lt;/li&gt;&#xA;&lt;li&gt;下载 google api的php开发库，&lt;a href=&#34;http://google-api-php-client.googlecode.com/files/google-api-php-client-0.4.4.tar.gz&#34;&gt;google-api-php-client&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;更新google api开发库，因为我的运行环境基于新浪云SAE平台，所以要做一些特别的改动：1. 实现SAE平台的MemCache，在google-api-php-clientsrccache中建立apiSAEMemcacheCache.php文件，具体内容如下&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;?php&#xA;/**&#xA; * SAE Memcache&#xA; *&#xA; * @author Carey Zhou &amp;lt;zhourunsheng2008@google.com&amp;gt;&#xA; */&#xA;class apiSAEMemcacheCache extends apiCache {&#xA;  private $connection = false;&#xA;&#xA;  public function __construct() {&#xA;&#x9;//do nothing&#xA;  }&#xA;&#xA;  private function connect() {&#xA;    if (! $this-&amp;gt;connection = @memcache_init()) {&#xA;      throw new apiCacheException(&amp;#34;Memcache init failed&amp;#34;);&#xA;    }&#xA;  }&#xA;&#xA;  private function check() {&#xA;    if (! $this-&amp;gt;connection) {&#xA;      $this-&amp;gt;connect();&#xA;    }&#xA;  }&#xA;&#xA;  /**&#xA;   * @inheritDoc&#xA;   */&#xA;  public function get($key, $expiration = false) {&#xA;    $this-&amp;gt;check();&#xA;    if (($ret = @memcache_get($this-&amp;gt;connection, $key)) === false) {&#xA;      return false;&#xA;    }&#xA;    if (! $expiration || (time() - $ret[&amp;#39;time&amp;#39;] &amp;gt; $expiration)) {&#xA;      $this-&amp;gt;delete($key);&#xA;      return false;&#xA;    }&#xA;    return $ret[&amp;#39;data&amp;#39;];&#xA;  }&#xA;&#xA;  /**&#xA;   * @inheritDoc&#xA;   */&#xA;  public function set($key, $value) {&#xA;    $this-&amp;gt;check();&#xA;    // we store it with the cache_time default expiration so objects will at least get cleaned eventually.&#xA;    if (@memcache_set($this-&amp;gt;connection, $key, array(&amp;#39;time&amp;#39; =&amp;gt; time(),&#xA;        &amp;#39;data&amp;#39; =&amp;gt; $value), false) == false) {&#xA;      throw new apiCacheException(&amp;#34;Couldn&amp;#39;t store data in cache&amp;#34;);&#xA;    }&#xA;  }&#xA;&#xA;  /**&#xA;   * @inheritDoc&#xA;   */&#xA;  public function delete($key) {&#xA;    $this-&amp;gt;check();&#xA;    @memcache_delete($this-&amp;gt;connection, $key);&#xA;  }&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;更新 google-api-php-clientsrccacheapiCache.php文件，将我们新添加的SAEMemcache加进去，代码如下：&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;require_once &amp;#34;apiSAEMemcacheCache.php&amp;#34;;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;更新 google-api-php-clientsrcioapiCurlIO.php文件，修正一个bug【当Header中出现&amp;quot;HTTP/1.1 100 Continue&amp;quot;的时候，原程序会出现解析错误，导致程序崩溃，估计也是SAE环境的特殊性导致的】，具体改正如下：原来的代码：&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;// Parse out the raw response into usable bits&#xA;    list($rawResponseHeaders, $responseBody) = explode(&amp;#34;rnrn&amp;#34;, $data, 2);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;现在的代码：&lt;/p&gt;</description>
			</item>
			<item>
				<title>混乱代码分享之 Python 程序设计</title>
				<link>https://blog.zhourunsheng.com/2011/09/%e6%b7%b7%e4%b9%b1%e4%bb%a3%e7%a0%81%e5%88%86%e4%ba%ab%e4%b9%8b-python-%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1/</link>
				<pubDate>Mon, 12 Sep 2011 09:19:07 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/09/%e6%b7%b7%e4%b9%b1%e4%bb%a3%e7%a0%81%e5%88%86%e4%ba%ab%e4%b9%8b-python-%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1/</guid>
				<description>&lt;p&gt;Python代码历来是讲究整洁的，但是也不乏高手能写出如此混乱而又有节奏的代码，下面的混乱代码就是用来生成彭罗斯铺砖图案的。&lt;/p&gt;&#xA;&lt;h2 id=&#34;程序源码&#34;&gt;程序源码&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;_                                 =&#xA;                                &amp;#34;&amp;#34;&amp;#34;if!&#xA;                              1:&amp;#34;e,V=100&#xA;                            0,(0j-1)**-.2;&#xA;                           v,S=.5/  V.real,&#xA;                         [(0,0,4      *e,4*e*&#xA;                       V)];w=1          -v&amp;#34;def!&#xA;                      E(T,A,              B,C):P&#xA;                  ,Q,R=B*w+                A*v,B*w+C&#xA;            *v,A*w+B*v;retur              n[(1,Q,C,A),(1,P&#xA;     ,Q,B),(0,Q,P,A)]*T+[(0,C            ,R,B),(1,R,C,A)]*(1-T)&amp;#34;f&#xA;or!i!in!_[:11]:S       =sum([E          (*x)for       !x!in!S],[])&amp;#34;imp&#xA;  ort!cair               o!as!O;      s=O.Ima               geSurfac&#xA;   e(1,e,e)               ;c=O.Con  text(s);               M,L,G=c.&#xA;     move_to                ,c.line_to,c.s                et_sour&#xA;       ce_rgb                a&amp;#34;def!z(f,a)                :f(-a.&#xA;        imag,a.       real-e-e)&amp;#34;for!T,A,B,C!in[i       !for!i!&#xA;          in!S!if!i[&amp;#34;&amp;#34;&amp;#34;;exec(reduce(lambda x,i:x.replace(chr&#xA;           (i),&amp;#34;n &amp;#34;[34-i:]),   range(   35),_+&amp;#34;&amp;#34;&amp;#34;0]]:z(M,A&#xA;             );z(L,B);z         (L,C);         c.close_pa&#xA;             th()&amp;#34;G             (.4,.3             ,1);c.&#xA;             paint(             );G(.7             ,.7,1)&#xA;             ;c.fil             l()&amp;#34;fo             r!i!in&#xA;             !range             (9):&amp;#34;!             g=1-i/&#xA;             8;d=i/          4*g;G(d,d,d,          1-g*.8&#xA;             )&amp;#34;!def     !y(f,a):z(f,a+(1+2j)*(     1j**(i&#xA;             /2.))*g)&amp;#34;!for!T,A,B,C!in!S:y(M,C);y(L,A);y(M&#xA;             ,A);y(L,B)&amp;#34;!c.st            roke()&amp;#34;s.write_t&#xA;             o_png(&amp;#39;pen                        rose.png&amp;#39;)&#xA;             &amp;#34;&amp;#34;&amp;#34;                                       ))&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;执行效果&#34;&gt;执行效果&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/09/penrose.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>SL4A 之实现原理解析</title>
				<link>https://blog.zhourunsheng.com/2011/09/sl4a-%e4%b9%8b%e5%ae%9e%e7%8e%b0%e5%8e%9f%e7%90%86%e8%a7%a3%e6%9e%90/</link>
				<pubDate>Sun, 11 Sep 2011 21:17:08 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/09/sl4a-%e4%b9%8b%e5%ae%9e%e7%8e%b0%e5%8e%9f%e7%90%86%e8%a7%a3%e6%9e%90/</guid>
				<description>&lt;p&gt;关于SL4A的简介和在Android系统的安装及使用，请参考我的上一篇博文《Android 脚本设计之 SL4A》,本篇来分析其内部的实现机制。&lt;/p&gt;&#xA;&lt;h2 id=&#34;深入理解sl4a&#34;&gt;深入理解SL4A&lt;/h2&gt;&#xA;&lt;p&gt;SL4A架构实现了本地脚本和原生态Android程序的内部消息通信，所以任何本地脚本语言，只要实现了这套兼容的JSON RPC通信接口，就可以呼叫SL4A的RPC Server端程序。至于为什么要选用JSON，及这种格式的优点和特征，此处就不详细叙述了，大家可以查看 JSON 官网。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;“JavaScript Object Notation (JSON) is a lightweight, text-based,  language-independent data interchange format. It was derived from the  ECMAScript Programming Language Standard. JSON defines a small  set of formatting rules for the portable representation of structured data.  JSON can represent four primitive types (strings, numbers, booleans,  and null) and two structured types (objects and arrays).”&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;sl4a总体架构&#34;&gt;SL4A总体架构&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/09/SL4A_architecture_overview.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;从上图可以看出，SL4A总体包括Client和Server两部分来实现通信和整体架构的独立性，Client端负责解析本地脚本，这样只要本地脚本实现了兼容的接口，就可以方便实现脚本语言的扩展，而Server端则封装了Android原生态程序的设计，即使在android底层API发生API变化的时候，Client端也基本不会受到影响，Client把脚本中解析出来的函数调用通过RPC通信，远程呼叫Server端代理接口，然后由Server调用原生态的Android API（Android Facade架构）来完成具体的功能，在调用结束后，Server端将执行结果反馈给Client端。&lt;/p&gt;&#xA;&lt;p&gt;整个执行过程如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; -­‐-­‐ Script Interpreter&#xA;-­‐-­‐-­‐-­‐ Client/Caller/Consumer Script&#xA;-­‐-­‐-­‐-­‐-­‐-­‐ &amp;#34;Android&amp;#34; Script Object (locally wraps RPC calls) -­‐ Local Proxy&#xA;-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐ Remote Procedure Calls (RPC) – Exchanges contain a JSON payload&#xA;-­‐-­‐-­‐-­‐-­‐-­‐ Android API Java Facade -­‐ Remote Proxy&#xA;-­‐-­‐-­‐-­‐ API Server/Provider -­‐ Android Java application&#xA;-­‐-­‐ The Android Platform itself&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;local-proxy-的实现机制&#34;&gt;Local Proxy 的实现机制&lt;/h2&gt;&#xA;&lt;p&gt;其实每个本地模块都封装实现了一个android实体类，然后开放其调用接口，内部通过RPC与SL4A Server端通信。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Android 脚本设计之 SL4A</title>
				<link>https://blog.zhourunsheng.com/2011/09/android-%e8%84%9a%e6%9c%ac%e8%ae%be%e8%ae%a1%e4%b9%8b-sl4a/</link>
				<pubDate>Sun, 11 Sep 2011 11:33:27 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/09/android-%e8%84%9a%e6%9c%ac%e8%ae%be%e8%ae%a1%e4%b9%8b-sl4a/</guid>
				<description>&lt;h2 id=&#34;什么是sl4a&#34;&gt;什么是SL4A&lt;/h2&gt;&#xA;&lt;p&gt;SL4A的全称为Scripting Layer for Android, 顾名思义就是Android的脚本架构层，它的目的就是可以用熟知的脚本开发语言来开发Android应用程序。其工作原理基于RPC远程调用，通过本地的脚本解析器和远端的原生态Android Server层的APK进行信息交互，即实现一个远程代理，把本地脚本的函数调用通过json格式的封装，传递给远程原生态Server APK进行实际的android系统函数呼叫，最后将操作的执行结果反馈给本地脚本解析器，然后再在终端显示出运行结果。&lt;/p&gt;&#xA;&lt;h2 id=&#34;sl4a适用场景&#34;&gt;SL4A适用场景&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RAD programming，即 rapid application development，快速原型开发，进行工程项目的可行性分析&lt;/li&gt;&#xA;&lt;li&gt;编写测试脚本，通常代码量都比较小，可方便实现&lt;/li&gt;&#xA;&lt;li&gt;开发工具软件包，来实现一些快捷的功能&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;sl4a环境安装&#34;&gt;SL4A环境安装&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;下载安装 &lt;a href=&#34;http://code.google.com/p/android-scripting/downloads/list&#34;&gt;sl4a&lt;/a&gt;  APK，目前的版本是 &lt;a href=&#34;http://android-scripting.googlecode.com/files/sl4a_r4.apk&#34;&gt;sl4a_r4.apk&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;C:UsersCarey.RS.Zhou&amp;gt;adb install -r C:UsersCarey.RS.ZhouDesktopsl4a_r4.apk&#xA;156 KB/s (858471 bytes in 5.355s)&#xA;        pkg: /data/local/tmp/sl4a_r4.apk&#xA;Success&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;在APP列表中找到 sl4a 并运行，接受 Usage Tracking，选择 Accept &lt;img src=&#34;/wp-content/uploads/2011/09/sl4a-run-usage-tracking-200x300.png&#34; alt=&#34;&#34;&gt;&lt;/li&gt;&#xA;&lt;li&gt;程序默认只安装了一个shell环境，进入的步骤为【Menu】【View】【Interpreters】【Shell】 在shell命令行中执行ps命令后的执行结果如下，说明程序安装正确 &lt;img src=&#34;/wp-content/uploads/2011/09/sl4a-shell-ps-300x200.png&#34; alt=&#34;&#34;&gt;&lt;/li&gt;&#xA;&lt;li&gt;安装sl4a的本地脚本解析器，我们以安装python环境为例来说明，其他解析器的安装类似进入的步骤为【Menu】【View】【Interpreters】【Add】 &lt;img src=&#34;/wp-content/uploads/2011/09/sl4a-add-python-200x300.png&#34; alt=&#34;&#34;&gt;&lt;/li&gt;&#xA;&lt;li&gt;选择Python之后，后台开始下载PythonForAndroid的APK，完成后点击安装 &lt;img src=&#34;/wp-content/uploads/2011/09/sl4a-python-download-200x300.png&#34; alt=&#34;&#34;&gt;&lt;/li&gt;&#xA;&lt;li&gt;安装PythonForAndroid的APK之后，依次选择【Open】【Install】按钮，此时会进入第二阶段的安装过程，即安装python的附加module &lt;img src=&#34;/wp-content/uploads/2011/09/sl4a-python-open-200x300.png&#34; alt=&#34;&#34;&gt;&lt;img src=&#34;/wp-content/uploads/2011/09/sl4a-python-install-modules-200x300.png&#34; alt=&#34;&#34;&gt;&lt;img src=&#34;/wp-content/uploads/2011/09/sl4a-pyhon-download-modules-200x300.png&#34; alt=&#34;&#34;&gt;&lt;/li&gt;&#xA;&lt;li&gt;全部安装之后回到该界面，按钮由刚才的Install变成现在的Uninstall，特别提醒，千万别点击Uninstall按钮，不然就把刚才下载的module都卸载了，然后就悲剧啦，退出该界面即可 &lt;img src=&#34;/wp-content/uploads/2011/09/sl4a-pythomodeul-install-200x300.png&#34; alt=&#34;&#34;&gt;&lt;/li&gt;&#xA;&lt;li&gt;我们再次进入Interpreters，发现不只是Shell了，还多了一个Python 2.6.2，说明python环境搭建好了，现在就可以在android上面进行python脚本编写了，点击进去看看 &lt;img src=&#34;/wp-content/uploads/2011/09/sl4a-python-allok-200x300.png&#34; alt=&#34;&#34;&gt;&lt;img src=&#34;/wp-content/uploads/2011/09/sl4a-python-print-carey-300x200.png&#34; alt=&#34;&#34;&gt;&lt;/li&gt;&#xA;&lt;li&gt;到此为止，环境都ok了，我们小小测试一下，显示个Toast出来，看看是多么的简单，剩下的就请大家好好发挥吧，比起Java原生态程序的编写是不是方便了很多啊 &lt;img src=&#34;/wp-content/uploads/2011/09/sl4a-pyhon-maketoast-300x200.png&#34; alt=&#34;&#34;&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;参考文献&#34;&gt;参考文献&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;SL4A Home：&lt;a href=&#34;http://code.google.com/p/android-scripting/&#34;&gt;http://code.google.com/p/android-scripting/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
			</item>
			<item>
				<title>Heroku 上的 Play Framework（Java）</title>
				<link>https://blog.zhourunsheng.com/2011/09/heroku-%e4%b8%8a%e7%9a%84-play-framework%ef%bc%88java%ef%bc%89/</link>
				<pubDate>Sun, 04 Sep 2011 11:06:06 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/09/heroku-%e4%b8%8a%e7%9a%84-play-framework%ef%bc%88java%ef%bc%89/</guid>
				<description>&lt;p&gt;上周Heroku开始支持Java程序设计，具体的请参见我的上一篇博文《Heroku 上的 Java 程序设计》，本周Heroku开始支持Play框架，本文就带领大家熟悉一下基于play框架的程序开发流程。&lt;/p&gt;&#xA;&lt;h2 id=&#34;play是什么&#34;&gt;Play是什么&lt;/h2&gt;&#xA;&lt;p&gt;Play是一个Java Web框架。针对Web开发，Play采用了“净室”方法，不会强加约束，例如：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;兼容Servlet容器、支持JSP、兼容标准Java Web App布局、顺应Java和OO原则。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Play遵循Ruby on Rails的“Built-and-Deploy”模型，而不是更传统的“Package-and-Distribute”模型。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;不需要公式化的类或XML配置文件。框架采用了全新的打包惯例，在适当的地方使用了静态代码。举例来说，控制器入口点是无状态的，它面向HTTP而非面向对象，因此可以用静态方法来实现。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Play基于无容器的PaaS模型。Play应用可以运行于本地，也可以无缝地部署到生产环境。这样一来就可以简化部署工作流，消除由环境差异导致的问题。&#xA;从架构角度来看，Play使用了 Netty，这是一个由 JBoss团队构建的非阻塞I/O协议库，它使用基于Continuation的编程模型，可以支持请求的异步处理。Play还实现了 Share-Nothing 模型，可以很方便地通过添加节点对应于程序进行水平扩展，有状态会话是无法做到这点的。&lt;/p&gt;&#xA;&lt;h2 id=&#34;怎样使用play&#34;&gt;怎样使用Play&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;安装 heroku 客户端开发环境，参见  &lt;a href=&#34;http://toolbelt.herokuapp.com/linux/readme&#34;&gt;Linux&lt;/a&gt;, &lt;a href=&#34;http://toolbelt.herokuapp.com/osx/download&#34;&gt;Mac&lt;/a&gt;,  &lt;a href=&#34;http://toolbelt.herokuapp.com/windows/download&#34;&gt;Windows&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;安装 &lt;a href=&#34;http://git-scm.com/&#34;&gt;git&lt;/a&gt;  客户端软件和配置 ssh key，参见 &lt;a href=&#34;http://help.github.com/mac-key-setup/&#34;&gt;Mac&lt;/a&gt;，&lt;a href=&#34;http://help.github.com/msysgit-key-setup/&#34;&gt;Windows&lt;/a&gt; 和 &lt;a href=&#34;http://help.github.com/linux-key-setup/&#34;&gt;Linux&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;安装 &lt;a href=&#34;http://www.playframework.org/download&#34;&gt;Play! version 1.2.3&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;登录 Heroku :&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;heroku auth:login&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;5&#34;&gt;&#xA;&lt;li&gt;创建一个 Play! app:&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;play new play_hello_carey&#xA;cd play_hello_carey&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/09/new_play_hello_carey-300x173.png&#34; alt=&#34;&#34;&gt;&#xA;6. 本地运行 app :&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;play run --%production&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/09/play_run_production-300x173.png&#34; alt=&#34;&#34;&gt;&#xA;7. 建立 git repo:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git init&#xA;git add app conf lib public test&#xA;git commit -m init&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;8&#34;&gt;&#xA;&lt;li&gt;在 Heroku 上建立一个新的 app :&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;heroku create -s cedar&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/09/create_new_app-300x42.png&#34; alt=&#34;&#34;&gt;&#xA;9. 上传 play_hello_carey app 到 Heroku:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Heroku 上的 Java 程序设计</title>
				<link>https://blog.zhourunsheng.com/2011/08/heroku-%e4%b8%8a%e7%9a%84-java-%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1/</link>
				<pubDate>Sat, 27 Aug 2011 10:07:57 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/08/heroku-%e4%b8%8a%e7%9a%84-java-%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1/</guid>
				<description>&lt;h2 id=&#34;heroku简介&#34;&gt;Heroku简介&lt;/h2&gt;&#xA;&lt;p&gt;Heroku is a Polyglot Cloud Application Platform&lt;/p&gt;&#xA;&lt;p&gt;. Heroku provides us a way to run Ruby, Node.js, Clojure, and Java applications on a managed, scalable, and multi-tenant system. Heroku also provides numerous add-ons that help us make the shift from monolithic middleware to Cloud Components. Another way to say it is:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Heroku = Polyglot + Platform as a Service (PaaS) + Cloud Components&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Heroku是一个支持多语言的云应用平台。它为我们提供了一个支撑的环境来运行Ruby，Node.js，Clojure，和Java应用程序，并且是可扩展，多租户的系统。Heroku还提供了众多的组件，帮助我们从单片中间件转移到云组件。另一种说法是：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Heroku = 多语种 + 平台作为服务（PaaS）+ 云组件&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
			</item>
			<item>
				<title>程序设计原则</title>
				<link>https://blog.zhourunsheng.com/2011/08/%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1%e5%8e%9f%e5%88%99/</link>
				<pubDate>Thu, 18 Aug 2011 12:47:32 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/08/%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1%e5%8e%9f%e5%88%99/</guid>
				<description>&lt;p&gt;回想自己的程序设计生涯也有一段时间了，好的编程准则的确能提高工作效率和提高自己的程序设计水平，下面摘录一些优秀的原则，供自己也供其他人来参考和学习，分别为英文原文和对应的中文翻译！&lt;/p&gt;&#xA;&lt;h2 id=&#34;principles-of-good-programming&#34;&gt;Principles of Good Programming&lt;/h2&gt;&#xA;&lt;p&gt;The principles of good programming are closely related to principles  of good design and engineering. The following programming principles  have helped me over the years become a better programmer, and I believe  can help any developer become more efficient and to produce code which  is easier to maintain and that has fewer defects.&lt;/p&gt;&#xA;&lt;h3 id=&#34;dry---dont-repeat-yourself&#34;&gt;DRY - Don’t repeat yourself&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;This is probably the  single most fundamental tenet in programming is to avoid repetition.  Many programming constructs exist solely for that purpose (e.g. loops,  functions, classes, and more). As soon as you start repeating yourself  (e.g. a long expression, a series of statements, same concept) create a  new abstraction.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://en.wikipedia.org/wiki/Don%27t_repeat_yourself&#34;&gt;http://en.wikipedia.org/wiki/Don%27t_repeat_yourself&lt;/a&gt; Abstraction Principle&lt;/p&gt;</description>
			</item>
			<item>
				<title>电话归属地查询之Android解决方案</title>
				<link>https://blog.zhourunsheng.com/2011/08/%e7%94%b5%e8%af%9d%e5%bd%92%e5%b1%9e%e5%9c%b0%e6%9f%a5%e8%af%a2%e4%b9%8bandroid%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/</link>
				<pubDate>Sun, 14 Aug 2011 10:19:06 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/08/%e7%94%b5%e8%af%9d%e5%bd%92%e5%b1%9e%e5%9c%b0%e6%9f%a5%e8%af%a2%e4%b9%8bandroid%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/</guid>
				<description>&lt;p&gt;最近接触的一个项目中，其中有一个功能需求就是号码归属地的查询，乍一看确实挺简单，反正数据库也都有了，只不过就是查询一下而已嘛！到了实际程序设计的时候才发现，5M的数据库光要加载起来就得1分多钟，放在android手机上跑的太慢了，没办法，只好另辟蹊径了！！！&lt;/p&gt;&#xA;&lt;p&gt;本文的基本思路如下：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;先把数据进行分组，即每一个地区一个组，例如&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;1898742 1898743 1898744 :云南曲靖 1894380 1894381 1894382 :吉林松原&lt;/p&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;把电话号码进行排序，目的就是为了找到电话号码的区间，例如&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;1894815 → 1899819 :广东珠海，找到了一个区段，这样就不用把每个电话号码读存储下来，只要存储一个区间就好，这样可以大大节省存储空间&lt;/p&gt;&#xA;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;设计新的存储格式，本文的程序采用如下方式存储&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;文件开头是两个偏移量，之后依次是数据区：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;第一条电话记录在文件中的位置偏移    最后一条电话记录在文件中的位置偏移&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;电话归属地的字符串（例如：辽宁大连，湖北武汉，广东珠海，广东深圳…，字符串之间以逗号分隔）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;第一条电话记录（例如：1894815{代表号码段起始值} 5{代表连续的号码个数} 2{代表该归属地字符串在所有归属地字符串中的偏移量}）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;第二条电话记录&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;最后一条电话记录&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;归属地查询&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;根据用户输入的电话号码，利用二分查找法可快速定位到该记录在文件中的位置偏移，读出该记录中位置字符串的偏移值，进而查表即可找到归属地程序设计，源码如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;package com.carey.tel;&#xA;import java.io.BufferedReader;&#xA;import java.io.FileInputStream;&#xA;import java.io.IOException;&#xA;import java.io.InputStreamReader;&#xA;import java.io.RandomAccessFile;&#xA;import java.util.ArrayList;&#xA;import java.util.Collections;&#xA;import java.util.Date;&#xA;import java.util.HashMap;&#xA;&#xA;public class JavaTelArea {&#xA;     private static JavaTelArea jta = null;&#xA;     private static final String INDEXDATAFILE = &amp;#34;tel.bin&amp;#34;;&#xA;     private static Hearder cacheHearder = null;&#xA;     private static AreaCode cacheAreaCode = null;&#xA;     private static String cacheIndexFilePath = null;&#xA;&#xA;     public static void main(String[] args) {&#xA;          JavaTelArea ctc = JavaTelArea.getInstance();&#xA;          //ctc.genIndexFile(&amp;#34;e:\&amp;#34;, &amp;#34;e:\telphone.txt&amp;#34;);&#xA;          String indexPath = &amp;#34;e:\&amp;#34;;&#xA;&#xA;          long startTime = new Date().getTime();&#xA;          String searchNum = &amp;#34;13889650920&amp;#34;;&#xA;          String res = ctc.searchTel(indexPath, searchNum);&#xA;          System.out.println(searchNum + &amp;#34; : &amp;#34; + res);&#xA;          System.out.println(System.currentTimeMillis() - startTime + &amp;#34;ms&amp;#34;);&#xA;&#xA;          startTime = new Date().getTime();&#xA;          searchNum = &amp;#34;+8613659867583&amp;#34;;&#xA;          res = ctc.searchTel(indexPath, searchNum);&#xA;          System.out.println(searchNum + &amp;#34; : &amp;#34; + res);&#xA;          System.out.println(System.currentTimeMillis() - startTime + &amp;#34;ms&amp;#34;);&#xA;&#xA;          startTime = new Date().getTime();&#xA;          searchNum = &amp;#34;1301815&amp;#34;;&#xA;          res = ctc.searchTel(indexPath, searchNum);&#xA;          System.out.println(searchNum + &amp;#34; : &amp;#34; + res);&#xA;          System.out.println(System.currentTimeMillis() - startTime + &amp;#34;ms&amp;#34;);&#xA;&#xA;          startTime = new Date().getTime();&#xA;          searchNum = &amp;#34;1301816&amp;#34;;&#xA;          res = ctc.searchTel(indexPath, searchNum);&#xA;          System.out.println(&amp;#34;没有预测&amp;#34;);&#xA;          System.out.println(searchNum + &amp;#34; : &amp;#34; + res);&#xA;          System.out.println(System.currentTimeMillis() - startTime + &amp;#34;ms&amp;#34;);&#xA;&#xA;          startTime = new Date().getTime();&#xA;          searchNum = &amp;#34;1301816&amp;#34;;&#xA;&#x9;  res = ctc.searchTel(indexPath, searchNum, true);&#xA;&#x9;  System.out.println(&amp;#34;根据号码连贯性原理预测&amp;#34;);&#xA;          System.out.println(searchNum + &amp;#34; : &amp;#34; + res);&#xA;          System.out.println(System.currentTimeMillis() - startTime + &amp;#34;ms&amp;#34;);&#xA;&#xA;          startTime = new Date().getTime();&#xA;          searchNum = &amp;#34;1301817&amp;#34;;&#xA;          res = ctc.searchTel(indexPath, searchNum);&#xA;          System.out.println(searchNum + &amp;#34; : &amp;#34; + res);&#xA;          System.out.println(System.currentTimeMillis() - startTime + &amp;#34;ms&amp;#34;);&#xA;    }&#xA;&#xA;    private HashMap&amp;lt;Long, String&amp;gt; generateTestData() {&#xA;          HashMap&amp;lt;Long, String&amp;gt;&#xA;          telToAreaCode = new HashMap&amp;lt;Long, String&amp;gt;();&#xA;          telToAreaCode.put(1310944l, &amp;#34;新疆伊犁州&amp;#34;);&#xA;          telToAreaCode.put(1301263l, &amp;#34;新疆伊犁州&amp;#34;);&#xA;          telToAreaCode.put(1301264l, &amp;#34;新疆伊犁州&amp;#34;);&#xA;          telToAreaCode.put(1301260l, &amp;#34;新疆伊犁州&amp;#34;);&#xA;          telToAreaCode.put(955L, &amp;#34;海南&amp;#34;);&#xA;          telToAreaCode.put(1320955l, &amp;#34;海南&amp;#34;);&#xA;          telToAreaCode.put(1320957l, &amp;#34;海南&amp;#34;);&#xA;          telToAreaCode.put(1300561L, &amp;#34;陕西商州&amp;#34;);&#xA;          telToAreaCode.put(1300562L, &amp;#34;陕西商州&amp;#34;);&#xA;          return telToAreaCode;&#xA;    }&#xA;&#xA;    public static synchronized JavaTelArea getInstance() {&#xA;         if (jta == null) {&#xA;               jta = new JavaTelArea();&#xA;         }&#xA;         return jta;&#xA;    }&#xA;&#xA;   /**&#x9; * Generate Index File (tel.bin)&#x9; * */&#xA;   private void genIndexFile(String indexFilePath, String souceFile) {&#xA;         ArrayList&amp;lt;String&amp;gt; strs = readFileToList(souceFile);&#xA;         HashMap&amp;lt;Long, String&amp;gt;&#xA;         telToArea = createTel2AreaHashMap(strs);&#xA;         writeDate(indexFilePath + INDEXDATAFILE, telToArea);&#xA;   }&#xA;&#xA;   /**&#x9; * read file content to String array list, every line one string.&#x9; * */&#xA;   private ArrayList&amp;lt;String&amp;gt; readFileToList(String filePath) {&#xA;        final ArrayList&amp;lt;String&amp;gt;&#xA;        strLists = new ArrayList&amp;lt;String&amp;gt;();&#xA;&#xA;        BufferedReader bReader = null;&#xA;        try {&#xA;              bReader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath)));&#xA;              String str = bReader.readLine();&#xA;              while (str != null) {&#xA;                   strLists.add(str);&#xA;                   str = bReader.readLine();&#xA;              }&#xA;         } catch (Exception e) {&#xA;             e.printStackTrace();&#xA;         } finally {&#xA;           if (bReader != null) {&#xA;               try {&#xA;                     bReader.close();&#xA;               } catch (IOException e) {&#xA;                    e.printStackTrace();&#xA;               }&#xA;          }&#xA;       }&#xA;       return strLists;&#xA;    }&#xA;&#xA;     /**&#x9; * create telephone number to area hash map.&#x9; * */&#xA;     HashMap&amp;lt;Long, String&amp;gt; createTel2AreaHashMap(ArrayList&amp;lt;String&amp;gt; strs) {&#xA;           final HashMap&amp;lt;Long, String&amp;gt;&#xA;           telToArea = new HashMap&amp;lt;Long, String&amp;gt;();&#xA;&#xA;           String[] tels = null;&#xA;           int len = 0;&#xA;           String strArea = null;&#xA;           for (String string : strs) {&#xA;               tels = string.split(&amp;#34; &amp;#34;);&#xA;               len = tels.length;&#xA;               strArea = tels[len - 1].substring(1);&#xA;&#xA;               for (int i = 0; i &amp;lt; len - 1; i++) {&#xA;                    telToArea.put(Long.valueOf(tels[i]), strArea);&#xA;               }&#xA;           }&#xA;         return telToArea;&#xA;    }&#xA;&#xA;    /**&#x9; * combined the adjacent Records.&#x9; * */&#xA;    private void combinedRecords(ArrayList&amp;lt;Record&amp;gt; records, Record newRecord) {&#xA;          int size = records.size();&#xA;          if (size &amp;gt; 0&amp;amp;&amp;amp; records.get(size - 1).areacodeIndex == newRecord.areacodeIndex) {&#xA;               // combined&#xA;              Record lastRecord = records.get(size - 1);&#xA;              lastRecord.numCnt = (int) (newRecord.baseTelNum - lastRecord.baseTelNum) + newRecord.numCnt;&#xA;         } else {&#xA;              records.add(newRecord);&#xA;         }&#xA;    }&#xA;&#xA;   /**&#x9; * write index info to file.&#x9; * */&#xA;   private void writeDate(String filePath, HashMap&amp;lt;Long, String&amp;gt; telToAreaCode) {&#xA;       // 1. get all area info&#xA;       ArrayList&amp;lt;String&amp;gt; tmpAreaCodes = new ArrayList&amp;lt;String&amp;gt;(telToAreaCode.values());&#xA;       ArrayList&amp;lt;String&amp;gt; strAreaCodes = new ArrayList&amp;lt;String&amp;gt;();&#xA;       for (String str : tmpAreaCodes) {&#xA;            if (!strAreaCodes.contains(str)) {&#xA;                    strAreaCodes.add(str);&#xA;            }&#xA;       }&#xA;       tmpAreaCodes.clear();&#xA;       tmpAreaCodes = null;&#xA;&#xA;       StringBuffer sb = new StringBuffer();&#xA;       for (String str : strAreaCodes) {&#xA;                 sb.append(str + &amp;#34;,&amp;#34;);&#xA;       }&#xA;       sb.deleteCharAt(sb.length() - 1);&#xA;&#xA;       AreaCode areaCode = new AreaCode(sb.toString());&#xA;       areaCode.print();&#xA;&#xA;       // 2. Sort HashMap and combined the adjacent telephone number&#xA;       ArrayList&amp;lt;Long&amp;gt; telNunms = new ArrayList&amp;lt;Long&amp;gt;(telToAreaCode.keySet());&#xA;       Collections.sort(telNunms);&#xA;       ArrayList&amp;lt;Record&amp;gt; records = new ArrayList&amp;lt;Record&amp;gt;();&#xA;       long baseNum = 0;&#xA;       String baseArea = null;&#xA;       int numCnt = 0;&#xA;       for (Long tm : telNunms) {&#xA;             if (numCnt == 0) {&#xA;                    baseNum = tm;&#xA;                    baseArea = telToAreaCode.get(tm);&#xA;                    numCnt = 1;&#xA;             } else {&#xA;                    if (tm == baseNum + numCnt &amp;amp;&amp;amp; baseArea.equals(telToAreaCode.get(tm))) {&#xA;&#x9;&#x9;&#x9;  numCnt++;&#xA;                    } else {&#xA;                         combinedRecords(records, new Record(baseNum, numCnt,&#x9;strAreaCodes.indexOf(baseArea)));&#xA;                         baseNum = tm;&#xA;                         baseArea = telToAreaCode.get(tm);&#xA;                         numCnt = 1;&#xA;                    }&#xA;             }&#xA;          }&#xA;         combinedRecords(records,&#x9;new Record(baseNum, numCnt, strAreaCodes.indexOf(baseArea)));&#x9;&#x9;&#xA;&#xA;         // for (Record record : records) {&#xA;               // record.print();&#xA;         // }&#xA;&#xA;         // 3. Write data to the file&#xA;         RandomAccessFile raf = null;&#xA;         try {&#xA;                raf = new RandomAccessFile(filePath, &amp;#34;rw&amp;#34;);&#xA;                raf.seek(0);&#xA;&#xA;                Hearder hearder = new Hearder();&#xA;                hearder.firstRecordOffset = hearder.Size() + areaCode.Size();&#xA;                hearder.lastRecordOffset = hearder.firstRecordOffset&#x9;+ (records.size() - 1) * records.get(0).Size();&#xA;                hearder.print();&#xA;                hearder.write(raf);&#xA;&#xA;                areaCode.write(raf);&#xA;&#xA;                for (Record record : records) {&#xA;                       record.write(raf);&#xA;                }&#xA;          } catch (Exception e) {&#xA;              e.printStackTrace();&#xA;          } finally {&#xA;              if (raf != null) {&#xA;                    try {&#xA;                           raf.close();&#xA;                     } catch (IOException e) {&#xA;                            e.printStackTrace();&#xA;                     }&#xA;              }&#xA;          }&#xA;    }&#xA;&#xA;   class Hearder {&#xA;         int firstRecordOffset;&#xA;         int lastRecordOffset;&#xA;&#xA;         public int Size() {&#xA;                 return (Integer.SIZE + Integer.SIZE) / Byte.SIZE;&#xA;         }&#xA;&#xA;         public void write(RandomAccessFile raf) throws IOException {&#xA;                raf.writeInt(this.firstRecordOffset);&#xA;                raf.writeInt(this.lastRecordOffset);&#xA;         }&#xA;&#xA;        public void read(RandomAccessFile raf) throws IOException {&#xA;               this.firstRecordOffset = raf.readInt();&#xA;               this.lastRecordOffset = raf.readInt();&#xA;        }&#xA;&#xA;        public void print() {&#xA;                System.out.println(&amp;#34;===== Hearder ===== &amp;#34;);&#xA;                System.out.println(&amp;#34;[&amp;#34; + firstRecordOffset + &amp;#34; , &amp;#34;&#x9; + lastRecordOffset + &amp;#34;]&amp;#34;);&#xA;        }&#xA;    }&#xA;&#xA;   class AreaCode {&#xA;          private String areacode;&#xA;          private String[] codes;&#xA;&#xA;          public AreaCode() {&#xA;               this(&amp;#34;&amp;#34;);&#xA;          }&#xA;&#xA;          public AreaCode(String areacode) {&#xA;               this.areacode = areacode;&#xA;               this.codes = null;&#xA;          }&#xA;&#xA;          public int Size() {&#xA;                 return areacode.getBytes().length + (Integer.SIZE / Byte.SIZE);&#xA;          }&#xA;&#xA;          public void print() {&#xA;                System.out.println(&amp;#34;===== AreaCode ===== &amp;#34;);&#xA;                System.out.println(&amp;#34;[&amp;#34; + areacode.getBytes().length + &amp;#34;]&amp;#34; + areacode);&#xA;          }&#xA;&#xA;         public void write(RandomAccessFile raf) throws IOException {&#xA;&#x9;&#x9;raf.writeInt(areacode.getBytes().length);&#xA;                raf.write(this.areacode.getBytes());&#xA;         }&#xA;&#xA;         public void read(RandomAccessFile raf) throws IOException {&#xA;                byte[] bytes = new byte[raf.readInt()];&#xA;                raf.read(bytes);&#xA;                this.areacode = new String(bytes);&#xA;         }&#xA;&#xA;         public String getCodeByIndex(int index) {&#xA;             if (this.codes == null) {&#xA;                   this.codes = this.areacode.split(&amp;#34;,&amp;#34;);&#xA;             }&#xA;             return (index &amp;lt; 0 || this.codes == null || index &amp;gt;= this.codes.length) ? null&#x9; : this.codes[index];&#xA;        }&#xA;}&#xA;&#xA;class Record {&#xA;       long baseTelNum;&#xA;       int numCnt;&#xA;       int areacodeIndex;&#xA;&#xA;       public Record() {&#xA;            this(0, 0, 0);&#xA;       }&#xA;&#xA;       public Record(long baseTelNum, int numCnt, int areacodeIndex) {&#xA;             this.baseTelNum = baseTelNum;&#xA;             this.numCnt = numCnt;&#xA;             this.areacodeIndex = areacodeIndex;&#xA;       }&#xA;&#xA;       public void print() {&#xA;             System.out.println(&amp;#34;===== Record ===== &amp;#34;);&#xA;             System.out.println(&amp;#34;&amp;lt;&amp;#34; + baseTelNum + &amp;#34;&amp;gt; &amp;lt;&amp;#34; + numCnt + &amp;#34;&amp;gt; &amp;lt;&amp;#34; + areacodeIndex + &amp;#34;&amp;gt;&amp;#34;);&#xA;       }&#xA;&#xA;      public int Size() {&#xA;             return (Long.SIZE + Integer.SIZE) / Byte.SIZE;&#xA;      }&#xA;&#xA;      public void write(RandomAccessFile raf) throws IOException {&#xA;           raf.writeLong(this.baseTelNum);&#xA;           int tmp = this.numCnt &amp;lt;&amp;lt; 16;&#xA;           tmp += 0xFFFF &amp;amp; this.areacodeIndex;&#xA;           raf.writeInt(tmp);&#xA;      }&#xA;&#xA;     public void read(RandomAccessFile raf) throws IOException {&#xA;          this.baseTelNum = raf.readLong();&#xA;          int tmp = raf.readInt();&#xA;          this.numCnt = tmp &amp;gt;&amp;gt; 16;&#xA;          this.areacodeIndex = 0xFFFF &amp;amp; tmp;&#xA;     }&#xA;&#xA;     public int inWhich(long telNum) {&#xA;         if (telNum &amp;lt; this.baseTelNum) {&#xA;               return -1;&#xA;         } else if (telNum &amp;gt;= this.baseTelNum + this.numCnt) {&#xA;               return 1;&#xA;         } else {&#xA;               return 0;&#xA;         }&#xA;    }&#xA; }&#xA;&#xA;  public String searchTel(String indexFilePath, String telNum) {&#xA;          return searchTel(indexFilePath, telNum, false);&#xA;  }&#xA;&#xA;  /**&#x9; * search&#x9; * */&#xA;  public String searchTel(String indexFilePath, String telNum, boolean forecast) {&#xA;&#x9;StringBuffer sb = new StringBuffer(telNum);&#xA;&#xA;&#x9;// +&#xA;&#x9;if (sb.charAt(0) == &amp;#39;+&amp;#39;) {&#xA;&#x9;&#x9;sb.deleteCharAt(0);&#xA;&#x9;}&#xA;&#xA;&#x9;// 86&#xA;&#x9;if (sb.charAt(0) == &amp;#39;8&amp;#39; &amp;amp;&amp;amp; sb.charAt(1) == &amp;#39;6&amp;#39;) {&#xA;&#x9;&#x9;sb.delete(0, 2);&#xA;&#x9;}&#xA;&#xA;&#x9;// 以0开头，是区号&#xA;&#x9;if (sb.charAt(0) == &amp;#39;0&amp;#39;) {&#xA;&#x9;&#x9;sb.deleteCharAt(0);&#xA;&#x9;&#x9;// 首先按照4位区号查询，若查询为空，再按3位区号查询&#xA;&#x9;&#x9;if (sb.length() &amp;gt;= 3) {&#xA;&#x9;&#x9;&#x9;sb.delete(3, sb.length());&#xA;&#x9;&#x9;} &#xA;&#xA;&#x9;&#x9;String dial = searchTel(indexFilePath, Long.valueOf(sb.toString()),false);&#xA;&#xA;&#x9;&#x9;if (dial != null) {&#xA;&#x9;&#x9;&#x9;return dial;&#xA;&#x9;&#x9;}&#xA;&#xA;&#x9;&#x9;if (sb.length() &amp;gt;= 2) {&#xA;&#x9;&#x9;&#x9;sb.delete(2, sb.length());&#xA;&#x9;&#x9;}&#xA;&#x9;}&#xA;&#x9;// 以1开头，是手机号或者服务行业号码&#xA;&#x9;else if (sb.charAt(0) == &amp;#39;1&amp;#39;) {&#xA;&#x9;&#x9;// 首先按照手机号码查询，若查询为空，再按特殊号码查询&#xA;&#xA;&#x9;&#x9;if (sb.length() &amp;gt; 7) {&#xA;&#x9;&#x9;&#x9;String dial = searchTel(indexFilePath, Long.valueOf(sb.substring(0, 8)),false);&#xA;&#xA;&#x9;&#x9;&#x9;if (dial != null) {&#xA;&#x9;&#x9;&#x9;&#x9;return dial;&#xA;&#x9;&#x9;&#x9;}&#xA;&#xA;&#x9;&#x9;&#x9;dial = searchTel(indexFilePath, Long.valueOf(sb.toString()),false);&#xA;&#xA;&#x9;&#x9;&#x9;if (dial != null) {&#xA;&#x9;&#x9;&#x9;&#x9;return dial;&#xA;&#x9;&#x9;&#x9;}&#xA;&#xA;&#x9;&#x9;&#x9;// 只需要保留7位号码就ok了，多余的删掉&#xA;&#x9;&#x9;&#x9;if (sb.length() &amp;gt; 7) {&#xA;&#x9;&#x9;&#x9;&#x9;sb.delete(7, sb.length());&#xA;&#x9;&#x9;&#x9;}&#xA;&#x9;&#x9;} else {&#xA;&#x9;&#x9;&#x9;//小于7位，最有可能是服务号码&#xA;&#x9;&#x9;&#x9;//do nothing.&#xA;&#x9;&#x9;}&#xA;&#x9;}&#xA;&#x9;// 以其他数字开头，这也不知道是啥号码了&#xA;&#x9;else {&#xA;&#x9;&#x9;//do nothing.&#xA;&#x9;}&#xA;&#xA;&#x9;return searchTel(indexFilePath, Long.valueOf(sb.toString()), forecast);&#xA;  }&#xA;&#xA; private String searchTel(String indexFilePath, long telNum, boolean forecast) {&#xA;          RandomAccessFile raf = null;&#xA;          try {&#xA;             raf = new RandomAccessFile(indexFilePath + INDEXDATAFILE, &amp;#34;r&amp;#34;);&#xA;             if (cacheIndexFilePath == null || !cacheIndexFilePath.equals(indexFilePath)) {&#xA;                cacheIndexFilePath = indexFilePath;&#xA;                cacheHearder = new Hearder();&#xA;                cacheHearder.read(raf);&#xA;                cacheHearder.print();&#xA;&#xA;                cacheAreaCode = new AreaCode();&#xA;                cacheAreaCode.read(raf);&#xA;                cacheAreaCode.print();&#xA;             }&#xA;&#xA;            int index = lookUP(raf, cacheHearder.firstRecordOffset, cacheHearder.lastRecordOffset, telNum, forecast);&#xA;            return cacheAreaCode.getCodeByIndex(index);&#xA;         } catch (Exception e) {&#xA;              e.printStackTrace();&#xA;         } finally {&#xA;              if (raf != null) {&#xA;                  try {&#xA;                         raf.close();&#xA;                  } catch (IOException e) {&#xA;                       e.printStackTrace();&#xA;                  }&#xA;               }&#xA;         }&#xA;&#xA;      return null;&#xA;  }&#xA;&#xA;  private int lookUP(RandomAccessFile raf, long startpos, long endpos, long looknum, boolean forecast) throws IOException {&#xA;      Record record = new Record();&#xA;      long seekpos = 0;&#xA;&#xA;      do {&#xA;            seekpos = startpos + (endpos - startpos) / record.Size() / 2 * record.Size();&#xA;            raf.seek(seekpos);&#xA;            record.read(raf);&#xA;&#xA;           if (record.inWhich(looknum) &amp;gt; 0) {&#xA;                 startpos = seekpos + record.Size();&#xA;           } else if (record.inWhich(looknum) &amp;lt; 0) {&#xA;                 endpos = seekpos - record.Size();&#xA;           } else {&#xA;                 return record.areacodeIndex;&#xA;           }&#xA;      } while (startpos &amp;lt;= endpos);&#xA;&#xA;     if (forecast) {&#xA;            return record.areacodeIndex;&#xA;     } else {&#xA;           return -1;&#xA;     }&#xA;  }&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;程序运行情况如下：&lt;/p&gt;</description>
			</item>
			<item>
				<title>技术导航</title>
				<link>https://blog.zhourunsheng.com/technical-navigation/</link>
				<pubDate>Mon, 08 Aug 2011 08:04:59 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/technical-navigation/</guid>
				<description>&lt;h2 id=&#34;前沿技术导航&#34;&gt;前沿技术导航&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://code.google.com/intl/en/labs/&#34;&gt;Google Code Labs(Google代码实验室)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://webintents.org/&#34;&gt;Web Intents&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://code.google.com/intl/zh-CN/chrome/nativeclient/docs/technical_overview.html&#34;&gt;Native Client SDK&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;html5-设计-android-app&#34;&gt;Html5 设计 Android APP&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.rexsee.com/CN/help.html&#34;&gt;Rexsee&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://phonegap.com/&#34;&gt;PhoneGap&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://developer.sencha.io/&#34;&gt;Sencha.io&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;软件设计&#34;&gt;软件设计&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.rebeccamurphey.com/&#34;&gt;Rebecca Murphey&lt;/a&gt; 的&lt;a href=&#34;http://jqfundamentals.com/book/index.html&#34;&gt;《jQuery基础》&lt;/a&gt;（jQuery Fundamentals）&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.infoq.com/minibooks/emag-03-2010-rest&#34;&gt;infoQ REST&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.infoq.com/cn/minibooks/beautiful-code&#34;&gt;代码之美（精选版）&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.infoq.com/cn/minibooks/beautiful-architecture&#34;&gt;架构之美（精选版）&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.infoq.com/cn/minibooks/build-high-performance-web&#34;&gt;构建高性能Web站点（精选版）&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.infoq.com/cn/minibooks/web-app-developer-1&#34;&gt;Web应用开发者（第一期）&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;项目管理&#34;&gt;项目管理&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.infoq.com/cn/architect/&#34;&gt;infoQ 架构师期刊&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.infoq.com/cn/minibooks/manage-it&#34;&gt;项目管理修炼之道（精选版）&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
			</item>
			<item>
				<title>Google API</title>
				<link>https://blog.zhourunsheng.com/2011/08/google-api/</link>
				<pubDate>Tue, 02 Aug 2011 17:09:06 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/08/google-api/</guid>
				<description>&lt;p&gt;本文收集了一系列的Google开发API，可以有效与自己的web服务相集成，提高开发效率。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/08/google-api.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;1-lattitude-api&#34;&gt;1) &lt;a href=&#34;http://code.google.com/apis/latitude/&#34;&gt;Lattitude API&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/08/Lattitude-API.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;2-earth-api&#34;&gt;2) &lt;a href=&#34;http://code.google.com/apis/earth/&#34;&gt;Earth API&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/08/Earth-API.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;3-google-map-api&#34;&gt;3) &lt;a href=&#34;http://code.google.com/apis/earth/&#34;&gt;Google Map API&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/08/Google-Map-API.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;4geocoding-api&#34;&gt;4)&lt;a href=&#34;http://code.google.com/apis/maps/documentation/geocoding/&#34;&gt;GeoCoding API&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/08/GeoCoding-API.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;5google-direction-api&#34;&gt;5)&lt;a href=&#34;http://code.google.com/apis/maps/documentation/directions/#Introduction&#34;&gt;Google Direction API&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/08/Google-Direction-API.gif&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;6static-api&#34;&gt;6)&lt;a href=&#34;http://code.google.com/apis/maps/documentation/staticmaps/&#34;&gt;Static API&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/08/Static-API.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;7places-api&#34;&gt;7)&lt;a href=&#34;http://code.google.com/apis/maps/documentation/places/#Introduction&#34;&gt;Places API&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/08/Places-API.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;8--buzz-api&#34;&gt;8 ) &lt;a href=&#34;http://code.google.com/apis/buzz/&#34;&gt;Buzz API&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/08/Buzz-API1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;9friend-connect-api&#34;&gt;9)&lt;a href=&#34;http://code.google.com/apis/friendconnect/&#34;&gt;Friend Connect API&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/08/Friend-Connect-API.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;10social-graph-api&#34;&gt;10)&lt;a href=&#34;http://code.google.com/apis/socialgraph/&#34;&gt;Social Graph API&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/08/Social-Graph-API.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;11-wave-api&#34;&gt;11) &lt;a href=&#34;http://code.google.com/apis/wave/&#34;&gt;Wave API&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/08/Wave-API.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;12youtube-apis&#34;&gt;12)&lt;a href=&#34;http://code.google.com/apis/youtube/overview.html&#34;&gt;YouTube API’s&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/08/YouTube-API.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;13adwords-api&#34;&gt;13)&lt;a href=&#34;http://code.google.com/apis/adwords/&#34;&gt;ADwords API&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/08/ADwords-API.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;14-adsense-api&#34;&gt;14) &lt;a href=&#34;http://code.google.com/apis/adsense/&#34;&gt;Adsense API&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/08/Adsense-API1.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;15blogger-data-api&#34;&gt;15)&lt;a href=&#34;http://code.google.com/apis/blogger/&#34;&gt;Blogger Data API&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/08/Blogger-Data-API.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;16webmaster-tools-api&#34;&gt;16)&lt;a href=&#34;http://code.google.com/apis/webmastertools/&#34;&gt;Webmaster Tools API&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/08/Webmaster-Tools-API.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;17-code-search-api&#34;&gt;17) &lt;a href=&#34;http://code.google.com/apis/codesearch/&#34;&gt;Code Search API&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/08/Code-Search-API.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;18-picasa-web-album--data-api&#34;&gt;18) &lt;a href=&#34;http://code.google.com/apis/picasaweb/overview.html&#34;&gt;Picasa Web Album  DATA API&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/08/Picasa-Web-Album-DATA-API.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;19-management-api&#34;&gt;19) &lt;a href=&#34;http://code.google.com/apis/analytics/docs/mgmt/home.html&#34;&gt;Management API&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/08/Management-API.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>Java深度解析之安全与对象序列化RMI</title>
				<link>https://blog.zhourunsheng.com/2011/08/java%e6%b7%b1%e5%ba%a6%e8%a7%a3%e6%9e%90%e4%b9%8b%e5%ae%89%e5%85%a8%e4%b8%8e%e5%af%b9%e8%b1%a1%e5%ba%8f%e5%88%97%e5%8c%96rmi/</link>
				<pubDate>Tue, 02 Aug 2011 16:32:02 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/08/java%e6%b7%b1%e5%ba%a6%e8%a7%a3%e6%9e%90%e4%b9%8b%e5%ae%89%e5%85%a8%e4%b8%8e%e5%af%b9%e8%b1%a1%e5%ba%8f%e5%88%97%e5%8c%96rmi/</guid>
				<description>&lt;p&gt;本系列的文章转载自 infoq专栏合集《Java深度历险》，10篇文章分别由浅到深描述了Java的多个细节，具体包括&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Java 字节代码的操纵&lt;/li&gt;&#xA;&lt;li&gt;Java类的加载、链接和初始化&lt;/li&gt;&#xA;&lt;li&gt;Java线程：基本概念、可见性与同步&lt;/li&gt;&#xA;&lt;li&gt;Java垃圾回收机制与引用类型&lt;/li&gt;&#xA;&lt;li&gt;Java泛型&lt;/li&gt;&#xA;&lt;li&gt;Java注解&lt;/li&gt;&#xA;&lt;li&gt;Java反射与动态代理&lt;/li&gt;&#xA;&lt;li&gt;Java I/O&lt;/li&gt;&#xA;&lt;li&gt;Java安全&lt;/li&gt;&#xA;&lt;li&gt;Java对象序列化与RMI&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;相信通过十个主题的学习，读者能对Java的这几个方面有较深入的理解。enjoy it！&lt;/p&gt;&#xA;&lt;h2 id=&#34;java-安全&#34;&gt;Java 安全&lt;/h2&gt;&#xA;&lt;p&gt;安全性是Java应用程序的非功能性需求的重要组成部分，如同其它的非功能性需求一样，安全性很容易被开发人员所忽略。当然，对于Java EE的开发人员来说，安全性的话题可能没那么陌生，用户认证和授权可能是绝大部分Web应用都有的功能。类似 Spring Security 这样的框架，也使得开发变得更加简单。本文并不会讨论Web应用的安全性，而是介绍Java安全一些底层和基本的内容。&lt;/p&gt;&#xA;&lt;p&gt;认证用户认证是应用安全性的重要组成部分，其目的是确保应用的使用者具有合法的身份。&#xA;Java安全中使用术语主体（Subject）来表示访问请求的来源。一个主体可以是任何的实体。一个主体可以有多个不同的身份标识（Principal）。比如一个应用的用户这类主体，就可以有用户名、身份证号码和手机号码等多种身份标识。除了身份标识之外，一个主体还可以有公开或是私有的安全相关的凭证（Credential），包括密码和密钥等。&lt;/p&gt;&#xA;&lt;p&gt;典型的用户认证过程是通过登录操作来完成的。在登录成功之后，一个主体中就具备了相应的身份标识。Java提供了一个可扩展的登录框架，使得应用开发人员可以很容易的定制和扩展与登录相关的逻辑。登录的过程由 LoginContext 启动。在创建LoginContext的时候需要指定一个登录配置（Configuration）的名称。该登录配置中包含了登录所需的多个 LoginModule 的信息。每个LoginModule实现了一种登录方式。当调用LoginContext的 login 方法的时候，所配置的每个LoginModule会被调用来执行登录操作。如果整个登录过程成功，则通过 getSubject 方法就可以获取到包含了身份标识信息的主体。开发人员可以实现自己的LoginModule来定制不同的登录逻辑。&lt;/p&gt;&#xA;&lt;p&gt;每个LoginModule的登录方式由两个阶段组成。第一个阶段是在 login&lt;/p&gt;&#xA;&lt;p&gt;方法的实现中。这个阶段用来进行必要的身份认证，可能需要获取用户的输入，以及通过数据库、网络操作或其它方式来完成认证。当认证成功之后，把必要的信息保存起来。如果认证失败，则抛出相关的异常。第二阶段是在 commit 或 abort&lt;/p&gt;&#xA;&lt;p&gt;方法中。由于一个登录过程可能涉及到多个LoginModule。LoginContext会根据每个LoginModule的认证结果以及相关的配置信息来确定本次登录是否成功。LoginContext用来判断的依据是每个LoginModule对整个登录过程的必要性，分成必需、必要、充分和可选这四种情况。如果登录成功，则每个LoginModule的commit方法会被调用，用来把身份标识关联到主体上。如果登录失败，则LoginModule 的abort方法会被调用，用来清除之前保存的认证相关信息。&lt;/p&gt;&#xA;&lt;p&gt;在LoginModule进行认证的过程中，如果需要获取用户的输入，可以通过 CallbackHandler 和对应的Callback来完成。每个 Callback 可以用来进行必要的数据传递。典型的启动登录的过程如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;public Subject login() throws LoginException {    &#xA;    TextInputCallbackHandler callbackHandler = new TextInputCallbackHandler();    &#xA;    LoginContext lc = new LoginContext(&amp;#34;SmsApp&amp;#34;, callbackHandler);    &#xA;    lc.login();    &#xA;    return lc.getSubject();&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这里的SmsApp是登录配置的名称，可以在配置文件中找到。该配置文件的内容也很简单。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;SmsApp {    &#xA;    security.login.SmsLoginModule required;&#xA;};&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这里声明了使用security.login.SmsLoginModule这个登录模块，而且该模块是必需的。配置文件可以通过启动程序时的参数java.security.auth.login.config来指定，或修改JVM的默认设置。下面看看SmsLoginModule的核心方法login和commit。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Java深度解析之反射机制动态代理与I/O</title>
				<link>https://blog.zhourunsheng.com/2011/08/java%e6%b7%b1%e5%ba%a6%e8%a7%a3%e6%9e%90%e4%b9%8b%e5%8f%8d%e5%b0%84%e6%9c%ba%e5%88%b6%e5%8a%a8%e6%80%81%e4%bb%a3%e7%90%86%e4%b8%8eio/</link>
				<pubDate>Tue, 02 Aug 2011 16:18:47 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/08/java%e6%b7%b1%e5%ba%a6%e8%a7%a3%e6%9e%90%e4%b9%8b%e5%8f%8d%e5%b0%84%e6%9c%ba%e5%88%b6%e5%8a%a8%e6%80%81%e4%bb%a3%e7%90%86%e4%b8%8eio/</guid>
				<description>&lt;p&gt;本系列的文章转载自 infoq专栏合集《Java深度历险》，10篇文章分别由浅到深描述了Java的多个细节，具体包括&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Java 字节代码的操纵&lt;/li&gt;&#xA;&lt;li&gt;Java类的加载、链接和初始化&lt;/li&gt;&#xA;&lt;li&gt;Java线程：基本概念、可见性与同步&lt;/li&gt;&#xA;&lt;li&gt;Java垃圾回收机制与引用类型&lt;/li&gt;&#xA;&lt;li&gt;Java泛型&lt;/li&gt;&#xA;&lt;li&gt;Java注解&lt;/li&gt;&#xA;&lt;li&gt;Java反射与动态代理&lt;/li&gt;&#xA;&lt;li&gt;Java I/O&lt;/li&gt;&#xA;&lt;li&gt;Java安全&lt;/li&gt;&#xA;&lt;li&gt;Java对象序列化与RMI&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;相信通过十个主题的学习，读者能对Java的这几个方面有较深入的理解。enjoy it！&lt;/p&gt;&#xA;&lt;h2 id=&#34;java反射与动态代理&#34;&gt;Java反射与动态代理&lt;/h2&gt;&#xA;&lt;p&gt;以前文章中介绍Java注解的时候，多次提到了Java的反射API。与 javax.lang.model 不同的是，通过反射API可以获取程序在运行时刻的内部结构。反射API中提供的动态代理也是非常强大的功能，可以原生实现 AOP&lt;/p&gt;&#xA;&lt;p&gt;中的方法拦截功能。正如英文单词reflection的含义一样，使用反射API的时候就好像在看一个Java类在水中的倒影一样。知道了Java类的内部结构之后，就可以与它进行交互，包括创建新的对象和调用对象中的方法等。这种交互方式与直接在源代码中使用的效果是相同的，但是又额外提供了运行时刻的灵活性。使用反射的一个最大的弊端是性能比较差。相同的操作，用反射API所需的时间大概比直接的使用要慢一两个数量级。不过现在的JVM实现中，反射操作的性能已经有了很大的提升。在灵活性与性能之间，总是需要进行权衡的。应用可以在适当的时机来使用反射API。&lt;/p&gt;&#xA;&lt;h3 id=&#34;基本用法&#34;&gt;基本用法&lt;/h3&gt;&#xA;&lt;p&gt;Java 反射API的第一个主要作用是获取程序在运行时刻的内部结构。这对于程序的检查工具和调试器来说，是非常实用的功能。只需要短短的十几行代码，就可以遍历出来一个Java类的内部结构，包括其中的构造方法、声明的域和定义的方法等。这不得不说是一个很强大的能力。只要有了java.lang.Class类的对象，就可以通过其中的方法来获取到该类中的构造方法、域和方法。对应的方法分别是 getConstructor、getField 和 getMethod。这三个方法还有相应的getDeclaredXXX版本，区别在于getDeclaredXXX版本的方法只会获取该类自身所声明的元素，而不会考虑继承下来的。&lt;/p&gt;&#xA;&lt;p&gt;Constructor、Field 和 Method 这三个类分别表示类中的构造方法、域和方法。这些类中的方法可以获取到所对应结构的元数据。&lt;/p&gt;&#xA;&lt;p&gt;反射API的另外一个作用是在运行时刻对一个Java对象进行操作。这些操作包括动态创建一个Java类的对象，获取某个域的值以及调用某个方法。在Java源代码中编写的对类和对象的操作，都可以在运行时刻通过反射API来实现。考虑下面一个简单的Java类。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;class MyClass {&#xA;    public int count;&#xA;    public MyClass(int start) {&#xA;        count = start;&#xA;    }&#xA;    public void increase(int step) {&#xA;        count = count + step;&#xA;    }&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;使用一般做法和反射API都非常简单。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;MyClass myClass = new MyClass(0); //一般做法&#xA;myClass.increase(2);&#xA;System.out.println(&amp;#34;Normal -&amp;gt; &amp;#34; + myClass.count);&#xA;try {&#xA;    Constructor constructor = MyClass.class.getConstructor(int.class); //获取构造方法&#xA;    MyClass myClassReflect = constructor.newInstance(10); //创建对象&#xA;    Method method = MyClass.class.getMethod(&amp;#34;increase&amp;#34;, int.class);  //获取方法&#xA;    method.invoke(myClassReflect, 5); //调用方法&#xA;    Field field = MyClass.class.getField(&amp;#34;count&amp;#34;); //获取域&#xA;    System.out.println(&amp;#34;Reflect -&amp;gt; &amp;#34; + field.getInt(myClassReflect)); //获取域的值&#xA;} catch (Exception e) {&#xA;    e.printStackTrace();&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;由于数组的特殊性，Array 类提供了一系列的静态方法用来创建数组和对数组中的元素进行访问和操作。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Java深度解析之泛型与注解</title>
				<link>https://blog.zhourunsheng.com/2011/08/java%e6%b7%b1%e5%ba%a6%e8%a7%a3%e6%9e%90%e4%b9%8b%e6%b3%9b%e5%9e%8b%e4%b8%8e%e6%b3%a8%e8%a7%a3/</link>
				<pubDate>Tue, 02 Aug 2011 16:07:01 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/08/java%e6%b7%b1%e5%ba%a6%e8%a7%a3%e6%9e%90%e4%b9%8b%e6%b3%9b%e5%9e%8b%e4%b8%8e%e6%b3%a8%e8%a7%a3/</guid>
				<description>&lt;p&gt;本系列的文章转载自 infoq专栏合集《Java深度历险》，10篇文章分别由浅到深描述了Java的多个细节，具体包括&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Java 字节代码的操纵&lt;/li&gt;&#xA;&lt;li&gt;Java类的加载、链接和初始化&lt;/li&gt;&#xA;&lt;li&gt;Java线程：基本概念、可见性与同步&lt;/li&gt;&#xA;&lt;li&gt;Java垃圾回收机制与引用类型&lt;/li&gt;&#xA;&lt;li&gt;Java泛型&lt;/li&gt;&#xA;&lt;li&gt;Java注解&lt;/li&gt;&#xA;&lt;li&gt;Java反射与动态代理&lt;/li&gt;&#xA;&lt;li&gt;Java I/O&lt;/li&gt;&#xA;&lt;li&gt;Java安全&lt;/li&gt;&#xA;&lt;li&gt;Java对象序列化与RMI&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;相信通过十个主题的学习，读者能对Java的这几个方面有较深入的理解。enjoy it！&lt;/p&gt;&#xA;&lt;h2 id=&#34;java泛型&#34;&gt;Java泛型&lt;/h2&gt;&#xA;&lt;h3 id=&#34;java泛型-1&#34;&gt;Java泛型&lt;/h3&gt;&#xA;&lt;p&gt;（generics）是JDK 5中引入的一个新特性，允许在定义类和接口的时候使用类型参数（type parameter）。声明的类型参数在使用时用具体的类型来替换。泛型最主要的应用是在JDK 5中的新集合类框架中。对于泛型概念的引入，开发社区的观点是褒贬不一。从好的方面来说，泛型的引入可以解决之前的集合类框架在使用过程中通常会出现的运行时刻类型错误，因为编译器可以在编译时刻就发现很多明显的错误。而从不好的地方来说，为了保证与旧有版本的兼容性，Java泛型的实现上存在着一些不够优雅的地方。当然这也是任何有历史的编程语言所需要承担的历史包袱。后续的版本更新会为早期的设计缺陷所累。&lt;/p&gt;&#xA;&lt;p&gt;开发人员在使用泛型的时候，很容易根据自己的直觉而犯一些错误。比如一个方法如果接收List&amp;lt;Object&amp;gt;作为形式参数，那么如果尝试将一个List&amp;lt;String&amp;gt;的对象作为实际参数传进去，却发现无法通过编译。虽然从直觉上来说，Object是String的父类，这种类型转换应该是合理的。但是实际上这会产生隐含的类型转换问题，因此编译器直接就禁止这样的行为。本文试图对Java泛型做一个概括性的说明。&lt;/p&gt;&#xA;&lt;h3 id=&#34;类型擦除&#34;&gt;类型擦除&lt;/h3&gt;&#xA;&lt;p&gt;正确理解泛型概念的首要前提是理解类型擦除（type erasure）。Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节代码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数，会被编译器在编译的时候去掉。这个过程就称为类型擦除。如在代码中定义的List&amp;lt;Object&amp;gt;和List&amp;lt;String&amp;gt;等类型，在编译之后都会变成List。JVM看到的只是List，而由泛型附加的类型信息对JVM来说是不可见的。Java编译器会在编译时尽可能的发现可能出错的地方，但是仍然无法避免在运行时刻出现类型转换异常的情况。类型擦除也是Java的泛型实现方式与 C++模板机制实现方式之间的重要区别。&lt;/p&gt;&#xA;&lt;p&gt;很多泛型的奇怪特性都与这个类型擦除的存在有关，包括：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;泛型类并没有自己独有的Class类对象。比如并不存在List&amp;lt;String&amp;gt;.class或是List&amp;lt;Integer&amp;gt;.class，而只有List.class。&lt;/li&gt;&#xA;&lt;li&gt;静态变量是被泛型类的所有实例所共享的。对于声明为MyClass&amp;lt;T&amp;gt;的类，访问其中的静态变量的方法仍然是 MyClass.myStaticVar。不管是通过new MyClass&amp;lt;String&amp;gt;还是new MyClass&amp;lt;Integer&amp;gt;创建的对象，都是共享一个静态变量。&lt;/li&gt;&#xA;&lt;li&gt;泛型的类型参数不能用在Java异常处理的catch语句中。因为异常处理是由JVM在运行时刻来进行的。由于类型信息被擦除，JVM是无法区分两个异常类型MyException&amp;lt;String&amp;gt;和MyException&amp;lt;Integer&amp;gt;的。对于JVM来说，它们都是 MyException类型的。也就无法执行与异常对应的catch语句。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;类型擦除的基本过程也比较简单，首先是找到用来替换类型参数的具体类。这个具体类一般是Object。如果指定了类型参数的上界的话，则使用这个上界。把代码中的类型参数都替换成具体的类。同时去掉出现的类型声明，即去掉&amp;lt;&amp;gt;的内容。比如T get()方法声明就变成了Object get()；List&amp;lt;String&amp;gt;就变成了List。接下来就可能需要生成一些桥接方法（bridge method）。这是由于擦除了类型之后的类可能缺少某些必须的方法。比如考虑下面的代码：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;class MyString implements Comparable&amp;lt;String&amp;gt; {&#xA;    public int compareTo(String str) {        &#xA;        return 0;    &#xA;    }&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;当类型信息被擦除之后，上述类的声明变成了class MyString implements Comparable。但是这样的话，类MyString就会有编译错误，因为没有实现接口Comparable声明的int compareTo(Object)方法。这个时候就由编译器来动态生成这个方法。&lt;/p&gt;&#xA;&lt;h3 id=&#34;实例分析&#34;&gt;实例分析&lt;/h3&gt;&#xA;&lt;p&gt;了解了类型擦除机制之后，就会明白编译器承担了全部的类型检查工作。编译器禁止某些泛型的使用方式，正是为了确保类型的安全性。以上面提到的List&amp;lt;Object&amp;gt;和List&amp;lt;String&amp;gt;为例来具体分析：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;public void inspect(List&amp;lt;Object&amp;gt; list) {    &#xA;    for (Object obj : list) {        &#xA;        System.out.println(obj);    &#xA;    }    &#xA;    list.add(1); //这个操作在当前方法的上下文是合法的。 &#xA;}&#xA;public void test() {    &#xA;    List&amp;lt;String&amp;gt; strs = new ArrayList&amp;lt;String&amp;gt;();    &#xA;    inspect(strs); //编译错误 &#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这段代码中，inspect方法接受List&amp;lt;Object&amp;gt;作为参数，当在test方法中试图传入List&amp;lt;String&amp;gt;的时候，会出现编译错误。假设这样的做法是允许的，那么在inspect方法就可以通过list.add(1)来向集合中添加一个数字。这样在test方法看来，其声明为List&amp;lt;String&amp;gt;的集合中却被添加了一个Integer类型的对象。这显然是违反类型安全的原则的，在某个时候肯定会抛出 ClassCastException。因此，编译器禁止这样的行为。编译器会尽可能的检查可能存在的类型安全问题。对于确定是违反相关原则的地方，会给出编译错误。当编译器无法判断类型的使用是否正确的时候，会给出警告信息。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Java深度解析之线程控制与垃圾回收</title>
				<link>https://blog.zhourunsheng.com/2011/08/java%e6%b7%b1%e5%ba%a6%e5%8e%86%e9%99%a9%e4%b9%8b%e7%ba%bf%e7%a8%8b%e6%8e%a7%e5%88%b6%e4%b8%8e%e5%9e%83%e5%9c%be%e5%9b%9e%e6%94%b6/</link>
				<pubDate>Tue, 02 Aug 2011 15:46:40 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/08/java%e6%b7%b1%e5%ba%a6%e5%8e%86%e9%99%a9%e4%b9%8b%e7%ba%bf%e7%a8%8b%e6%8e%a7%e5%88%b6%e4%b8%8e%e5%9e%83%e5%9c%be%e5%9b%9e%e6%94%b6/</guid>
				<description>&lt;p&gt;本系列的文章转载自 infoq专栏合集《Java深度历险》，10篇文章分别由浅到深描述了Java的多个细节，具体包括&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Java 字节代码的操纵&lt;/li&gt;&#xA;&lt;li&gt;Java类的加载、链接和初始化&lt;/li&gt;&#xA;&lt;li&gt;Java线程：基本概念、可见性与同步&lt;/li&gt;&#xA;&lt;li&gt;Java垃圾回收机制与引用类型&lt;/li&gt;&#xA;&lt;li&gt;Java泛型&lt;/li&gt;&#xA;&lt;li&gt;Java注解&lt;/li&gt;&#xA;&lt;li&gt;Java反射与动态代理&lt;/li&gt;&#xA;&lt;li&gt;Java I/O&lt;/li&gt;&#xA;&lt;li&gt;Java安全&lt;/li&gt;&#xA;&lt;li&gt;Java对象序列化与RMI&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;相信通过十个主题的学习，读者能对Java的这几个方面有较深入的理解。enjoy it！&lt;/p&gt;&#xA;&lt;h2 id=&#34;java线程基本概念可见性与同步&#34;&gt;Java线程​：基本概念、可见性与同步&lt;/h2&gt;&#xA;&lt;p&gt;开发高性能并发应用不是一件容易的事情。这类应用的例子包括高性能Web服务器、游戏服务器和搜索引擎爬虫等。这样的应用可能需要同时处理成千上万个请求。对于这样的应用，一般采用多线程或事件驱动的架构。对于Java来说，在语言内部提供了线程的支持。但是Java的多线程应用开发会遇到很多问题。首先是很难编写正确，其次是很难测试是否正确，最后是出现问题时很难调试。一个多线程应用可能运行了好几天都没问题，然后突然就出现了问题，之后却又无法再次重现出来。如果在正确性之外，还需要考虑应用的吞吐量和性能优化的话，就会更加复杂。本文主要介绍Java中的线程的基本概念、可见性和线程同步相关的内容。&lt;/p&gt;&#xA;&lt;p&gt;Java线程基本概念在操作系统中两个比较容易混淆的概念是进程（process）和线程&lt;/p&gt;&#xA;&lt;p&gt;（thread）。操作系统中的进程是资源的组织单位。进程有一个包含了程序内容和数据的地址空间，以及其它的资源，包括打开的文件、子进程和信号处理器等。不同进程的地址空间是互相隔离的。而线程表示的是程序的执行流程，是CPU调度的基本单位。线程有自己的程序计数器、寄存器、栈和帧等。引入线程的动机在于操作系统中阻塞式I/O的存在。当一个线程所执行的I/O被阻塞的时候，同一进程中的其它线程可以使用CPU来进行计算。这样的话，就提高了应用的执行效率。线程的概念在主流的操作系统和编程语言中都得到了支持。&lt;/p&gt;&#xA;&lt;p&gt;一部分的Java程序是单线程的。程序的机器指令按照程序中给定的顺序依次执行。Java语言提供了 java.lang.Thread 类来为线程提供抽象。有两种方式创建一个新的线程：一种是继承java.lang.Thread类并覆写其中的 run() 方法，另外一种则是在创建java.lang.Thread类的对象的时候，在构造函数中提供一个实现了 java.lang.Runnable 接口的类的对象。在得到了java.lang.Thread类的对象之后，通过调用其 start() 方法就可以启动这个线程的执行。&lt;/p&gt;&#xA;&lt;p&gt;一个线程被创建成功并启动之后，可以处在不同的状态中。这个线程可能正在占用CPU时间运行；也可能处在就绪状态，等待被调度执行；还可能阻塞在某个资源或是事件上。多个就绪状态的线程会竞争CPU时间以获得被执行的机会，而CPU则采用某种算法来调度线程的执行。不同线程的运行顺序是不确定的，多线程程序中的逻辑不能依赖于CPU的调度算法。&lt;/p&gt;&#xA;&lt;h3 id=&#34;可见性&#34;&gt;可见性&lt;/h3&gt;&#xA;&lt;p&gt;可见性（visibility）的问题是Java多线程应用中的错误的根源。在一个单线程程序中，如果首先改变一个变量的值，再读取该变量的值的时候，所读取到的值就是上次写操作写入的值。也就是说前面操作的结果对后面的操作是肯定可见的。但是在多线程程序中，如果不使用一定的同步机制，就不能保证一个线程所写入的值对另外一个线程是可见的。造成这种情况的原因可能有下面几个：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;CPU 内部的缓存：现在的CPU一般都拥有层次结构的几级缓存。CPU直接操作的是缓存中的数据，并在需要的时候把缓存中的数据与主存进行同步。因此在某些时刻，缓存中的数据与主存内的数据可能是不一致的。某个线程所执行的写入操作的新值可能当前还保存在CPU的缓存中，还没有被写回到主存中。这个时候，另外一个线程的读取操作读取的就还是主存中的旧值。&lt;/li&gt;&#xA;&lt;li&gt;CPU的指令执行顺序：在某些时候，CPU可能改变指令的执行顺序。这有可能导致一个线程过早的看到另外一个线程的写入操作完成之后的新值。&lt;/li&gt;&#xA;&lt;li&gt;编译器代码重排：出于性能优化的目的，编译器可能在编译的时候对生成的目标代码进行重新排列。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;现实的情况是：不同的CPU可能采用不同的架构，而这样的问题在多核处理器和多处理器系统中变得尤其复杂。而Java的目标是要实现“编写一次，到处运行”，因此就有必要对Java程序访问和操作主存的方式做出规范，以保证同样的程序在不同的CPU架构上的运行结果是一致的。Java内存模型（Java Memory Model）就是为了这个目的而引入的。&lt;/p&gt;&#xA;&lt;p&gt;JSR 133 则进一步修正了之前的内存模型中存在的问题。总得来说，Java内存模型描述了程序中共享变量的关系以及在主存中写入和读取这些变量值的底层细节。&lt;/p&gt;&#xA;&lt;p&gt;Java内存模型定义了Java语言中的 synchronized、volatile 和 final&lt;/p&gt;&#xA;&lt;p&gt;等关键词对主存中变量读写操作的意义。Java开发人员使用这些关键词来描述程序所期望的行为，而编译器和JVM负责保证生成的代码在运行时刻的行为符合内存模型的描述。比如对声明为volatile的变量来说，在读取之前，JVM会确保CPU中缓存的值首先会失效，重新从主存中进行读取；而写入之后，新的值会被马上写入到主存中。而synchronized和volatile关键词也会对编译器优化时候的代码重排带来额外的限制。比如编译器不能把 synchronized块中的代码移出来。对volatile变量的读写操作是不能与其它读写操作一块重新排列的。&lt;/p&gt;&#xA;&lt;p&gt;Java 内存模型中一个重要的概念是定义了“在之前发生（happens-before）”的顺序。如果一个动作按照“在之前发生”的顺序发生在另外一个动作之前，那么前一个动作的结果在多线程的情况下对于后一个动作就是肯定可见的。最常见的“在之前发生”的顺序包括：对一个对象上的监视器的解锁操作肯定发生在下一个对同一个监视器的加锁操作之前；对声明为volatile的变量的写操作肯定发生在后续的读操作之前。有了“在之前发生”顺序，多线程程序在运行时刻的行为在关键部分上就是可预测的了。编译器和JVM会确保“在之前发生”顺序可以得到保证。比如下面的一个简单的方法：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;public void increase() {&#xA;    this.count++;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这是一个常见的计数器递增方法，this.count++实际是this.count = this.count + 1，由一个对变量this.count的读取操作和写入操作组成。如果在多线程情况下，两个线程执行这两个操作的顺序是不可预期的。如果 this.count的初始值是1，两个线程可能都读到了为1的值，然后先后把this.count的值设为2，从而产生错误。错误的原因在于其中一个线程对this.count的写入操作对另外一个线程是不可见的，另外一个线程不知道this.count的值已经发生了变化。如果在increase() 方法声明中加上synchronized关键词，那就在两个线程的操作之间强制定义了一个“在之前发生”顺序。一个线程需要首先获得当前对象上的锁才能执行，在它拥有锁的这段时间完成对this.count的写入操作。而另一个线程只有在当前线程释放了锁之后才能执行。这样的话，就保证了两个线程对 increase()方法的调用只能依次完成，保证了线程之间操作上的可见性。&lt;/p&gt;&#xA;&lt;p&gt;如果一个变量的值可能被多个线程读取，又能被最少一个线程锁写入，同时这些读写操作之间并没有定义好的“在之前发生”的顺序的话，那么在这个变量上就存在数据竞争（data race）。数据竞争的存在是Java多线程应用中要解决的首要问题。解决的办法就是通过synchronized和volatile关键词来定义好“在之前发生”顺序。&lt;/p&gt;&#xA;&lt;h3 id=&#34;java中的锁&#34;&gt;Java中的锁&lt;/h3&gt;&#xA;&lt;p&gt;当数据竞争存在的时候，最简单的解决办法就是加锁。锁机制限制在同一时间只允许一个线程访问产生竞争的数据的临界区。Java语言中的 synchronized关键字可以为一个代码块或是方法进行加锁。任何Java对象都有一个自己的监视器，可以进行加锁和解锁操作。当受到 synchronized关键字保护的代码块或方法被执行的时候，就说明当前线程已经成功的获取了对象的监视器上的锁。当代码块或是方法正常执行完成或是发生异常退出的时候，当前线程所获取的锁会被自动释放。一个线程可以在一个Java对象上加多次锁。同时JVM保证了在获取锁之前和释放锁之后，变量的值是与主存中的内容同步的。&lt;/p&gt;&#xA;&lt;h3 id=&#34;java线程的同步&#34;&gt;Java线程的同步&lt;/h3&gt;&#xA;&lt;p&gt;在有些情况下，仅依靠线程之间对数据的互斥访问是不够的。有些线程之间存在协作关系，需要按照一定的协议来协同完成某项任务，比如典型的生产者-消费者模式。这种情况下就需要用到Java提供的线程之间的等待-通知机制。当线程所要求的条件不满足时，就进入等待状态；而另外的线程则负责在合适的时机发出通知来唤醒等待中的线程。Java中的java.lang.Object类中的 wait/notify/notifyAll 方法组就是完成线程之间的同步的。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Java深度解析之字节代码操控与类的加载链接初始化</title>
				<link>https://blog.zhourunsheng.com/2011/08/java%e6%b7%b1%e5%ba%a6%e5%8e%86%e9%99%a9%e4%b9%8b%e5%ad%97%e8%8a%82%e4%bb%a3%e7%a0%81%e6%93%8d%e6%8e%a7%e4%b8%8e%e7%b1%bb%e7%9a%84%e5%8a%a0%e8%bd%bd%e9%93%be%e6%8e%a5%e5%88%9d%e5%a7%8b%e5%8c%96/</link>
				<pubDate>Tue, 02 Aug 2011 15:28:00 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/08/java%e6%b7%b1%e5%ba%a6%e5%8e%86%e9%99%a9%e4%b9%8b%e5%ad%97%e8%8a%82%e4%bb%a3%e7%a0%81%e6%93%8d%e6%8e%a7%e4%b8%8e%e7%b1%bb%e7%9a%84%e5%8a%a0%e8%bd%bd%e9%93%be%e6%8e%a5%e5%88%9d%e5%a7%8b%e5%8c%96/</guid>
				<description>&lt;p&gt;本系列的文章转载自 infoq专栏合集《Java深度历险》，10篇文章分别由浅到深描述了Java的多个细节，具体包括&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Java 字节代码的操纵&lt;/li&gt;&#xA;&lt;li&gt;Java类的加载、链接和初始化&lt;/li&gt;&#xA;&lt;li&gt;Java线程：基本概念、可见性与同步&lt;/li&gt;&#xA;&lt;li&gt;Java垃圾回收机制与引用类型&lt;/li&gt;&#xA;&lt;li&gt;Java泛型&lt;/li&gt;&#xA;&lt;li&gt;Java注解&lt;/li&gt;&#xA;&lt;li&gt;Java反射与动态代理&lt;/li&gt;&#xA;&lt;li&gt;Java I/O&lt;/li&gt;&#xA;&lt;li&gt;Java安全&lt;/li&gt;&#xA;&lt;li&gt;Java对象序列化与RMI&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;相信通过十个主题的学习，读者能对Java的这几个方面有较深入的理解。enjoy it！&lt;/p&gt;&#xA;&lt;h2 id=&#34;java-字节代码的操纵&#34;&gt;Java 字节代码的操纵&lt;/h2&gt;&#xA;&lt;p&gt;在一般的Java应用开发过程中，开发人员使用Java的方式比较简单。打开惯用的IDE，编写Java源代码，再利用IDE提供的功能直接运行Java  程序就可以了。这种开发模式背后的过程是：开发人员编写的是Java源代码文件（.java），IDE会负责调用Java的编译器把Java源代码编译成平台无关的字节代码（byte code），以类文件的形式保存在磁盘上（.class）。Java虚拟机（JVM）会负责把Java字节代码加载并执行。Java通过这种方式来实现其 “编写一次，到处运行（Write once, run anywhere）”的目标。Java类文件中包含的字节代码可以被不同平台上的JVM所使用。Java字节代码不仅可以以文件形式存在于磁盘上，也可以通过网络方式来下载，还可以只存在于内存中。JVM中的类加载器会负责从包含字节代码的字节数组（byte[]）中定义出Java类。在某些情况下，可能会需要动态的生成 Java字节代码，或是对已有的Java字节代码进行修改。这个时候就需要用到本文中将要介绍的相关技术。首先介绍一下如何动态编译Java源文件。&lt;/p&gt;&#xA;&lt;h3 id=&#34;动态编译-java-源文件&#34;&gt;动态编译 Java 源文件&lt;/h3&gt;&#xA;&lt;p&gt;在一般情况下，开发人员都是在程序运行之前就编写完成了全部的Java源代码并且成功编译。对有些应用来说，Java源代码的内容在运行时刻才能确定。这个时候就需要动态编译源代码来生成Java字节代码，再由JVM来加载执行。典型的场景是很多算法竞赛的在线评测系统（如 PKU JudgeOnline），允许用户上传Java代码，由系统在后台编译、运行并进行判定。在动态编译Java源文件时，使用的做法是直接在程序中调用Java编译器。&lt;/p&gt;&#xA;&lt;h3 id=&#34;jsr-199&#34;&gt;JSR 199&lt;/h3&gt;&#xA;&lt;p&gt;引入了Java编译器API。如果使用JDK 6 的话，可以通过此API来动态编译Java代码。比如下面的代码用来动态编译最简单的Hello World类。该Java类的代码是保存在一个字符串中的。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;public class CompilerTest {&#xA;  public static void main(String[] args) throws Exception {&#xA;    String source = &amp;#34;public class Main { public static void main(String[] args){System.out.println(&amp;#34;Hello World!&amp;#34;);}}&amp;#34;;&#xA;    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler()&#xA;    StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);     &#xA;    StringSourceJavaObject sourceObject = new CompilerTest.StringSourceJavaObject(&amp;#34;Main&amp;#34;, source);     &#xA;    Iterable&amp;lt; extends JavaFileObject&amp;gt; fileObjects = Arrays.asList(sourceObject);&#xA;    CompilationTask task = compiler.getTask(null, fileManager, null, null, null, fileObjects);&#xA;    boolean result = task.call();&#xA;    if (result) {&#xA;      System.out.println(&amp;#34;编译成功。&amp;#34;);&#xA;    }&#xA;}&#xA;&#xA;static class StringSourceJavaObject extends SimpleJavaFileObject {&#xA;  private String content = null;&#xA;  public StringSourceJavaObject(String name, String content) throws URISyntaxException {&#xA;    super(URI.create(&amp;#34;string:///&amp;#34; + name.replace(&amp;#39;.&amp;#39;,&amp;#39;/&amp;#39;) + Kind.SOURCE.extension), Kind.SOURCE);&#xA;    this.content = content;&#xA;  }&#xA;  public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {&#xA;     return content;&#xA;  }&#xA; }&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果不能使用 JDK 6 提供的 Java 编译器 API 的话，可以使用 JDK 中的工具类 com.sun.tools.javac.Main，不过该工具类只能编译存放在磁盘上的文件，类似于直接使用javac命令。&lt;/p&gt;</description>
			</item>
			<item>
				<title>阿里云应用托管（ACE）搭建 wordpress 博客</title>
				<link>https://blog.zhourunsheng.com/2011/07/%e9%98%bf%e9%87%8c%e4%ba%91%e5%ba%94%e7%94%a8%e6%89%98%e7%ae%a1%ef%bc%88ace%ef%bc%89%e6%90%ad%e5%bb%ba-wordpress-%e5%8d%9a%e5%ae%a2/</link>
				<pubDate>Sat, 30 Jul 2011 09:58:15 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/%e9%98%bf%e9%87%8c%e4%ba%91%e5%ba%94%e7%94%a8%e6%89%98%e7%ae%a1%ef%bc%88ace%ef%bc%89%e6%90%ad%e5%bb%ba-wordpress-%e5%8d%9a%e5%ae%a2/</guid>
				<description>&lt;p&gt;成功搭建ACE应用：http://carey.aliapp.com, 步骤总结如下：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;访问 &lt;a href=&#34;http://ace.aliyun.com/&#34;&gt;http://ace.aliyun.com/&lt;/a&gt;，申请ACE的CloudID，并且启动域名解析，目前在内测阶段，需要邀请码才可以&lt;/li&gt;&#xA;&lt;li&gt;下载中文版 wordpress，下载地址：&lt;a href=&#34;http://cn.wordpress.org/wordpress-3.2.1-zh_CN.zip&#34;&gt;http://cn.wordpress.org/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;解压 wordpress压缩包，并且修改部分文件，具体如下：&lt;/li&gt;&#xA;&lt;li&gt;用Ftp软件将wordpress文件夹中的全部文件上传到ACE的FTP服务器，我用的是Flashfxp&lt;/li&gt;&#xA;&lt;li&gt;访问http://carey(ACE域名).aliapp.com/wp-admin/install.php 完成后续的安装过程&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
			</item>
			<item>
				<title>全文信息检索之 Lucene 简介</title>
				<link>https://blog.zhourunsheng.com/2011/07/%e5%85%a8%e6%96%87%e4%bf%a1%e6%81%af%e6%a3%80%e7%b4%a2%e4%b9%8b-lucene-%e7%ae%80%e4%bb%8b/</link>
				<pubDate>Fri, 29 Jul 2011 16:24:12 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/%e5%85%a8%e6%96%87%e4%bf%a1%e6%81%af%e6%a3%80%e7%b4%a2%e4%b9%8b-lucene-%e7%ae%80%e4%bb%8b/</guid>
				<description>&lt;h2 id=&#34;lucene-简介&#34;&gt;Lucene 简介&lt;/h2&gt;&#xA;&lt;p&gt;Lucene 是一个基于 Java 的全文信息检索工具包，它不是一个完整的搜索应用程序，而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一个开源项目。也是目前最为流行的基于 Java 开源全文检索工具包。&lt;/p&gt;&#xA;&lt;p&gt;目前已经有很多应用程序的搜索功能是基于 Lucene 的，比如 Eclipse 的帮助系统的搜索功能。Lucene 能够为文本类型的数据建立索引，所以你只要能把你要索引的数据格式转化的文本的，Lucene 就能对你的文档进行索引和搜索。比如你要对一些 HTML 文档，PDF 文档进行索引的话你就首先需要把 HTML 文档和 PDF 文档转化成文本格式的，然后将转化后的内容交给 Lucene 进行索引，然后把创建好的索引文件保存到磁盘或者内存中，最后根据用户输入的查询条件在索引文件上进行查询。不指定要索引的文档的格式也使 Lucene 能够几乎适用于所有的搜索应用程序。&lt;/p&gt;&#xA;&lt;p&gt;下图表示了搜索应用程序和 Lucene 之间的关系，也反映了利用 Lucene 构建搜索应用程序的流程：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/lucene.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;索引和搜索&#34;&gt;索引和搜索&lt;/h2&gt;&#xA;&lt;p&gt;索引是现代搜索引擎的核心，建立索引的过程就是把源数据处理成非常方便查询的索引文件的过程。为什么索引这么重要呢，试想你现在要在大量的文档中搜索含有某个关键词的文档，那么如果不建立索引的话你就需要把这些文档顺序的读入内存，然后检查这个文章中是不是含有要查找的关键词，这样的话就会耗费非常多的时间，想想搜索引擎可是在毫秒级的时间内查找出要搜索的结果的。这就是由于建立了索引的原因，你可以把索引想象成这样一种数据结构，他能够使你快速的随机访问存储在索引中的关键词，进而找到该关键词所关联的文档。Lucene 采用的是一种称为反向索引（inverted index）的机制。反向索引就是说我们维护了一个词 / 短语表，对于这个表中的每个词 / 短语，都有一个链表描述了有哪些文档包含了这个词 / 短语。这样在用户输入查询条件的时候，就能非常快的得到搜索结果。我们将在本系列文章的第二部分详细介绍 Lucene 的索引机制，由于 Lucene 提供了简单易用的 API，所以即使读者刚开始对全文本进行索引的机制并不太了解，也可以非常容易的使用 Lucene 对你的文档实现索引。&lt;/p&gt;&#xA;&lt;p&gt;对文档建立好索引后，就可以在这些索引上面进行搜索了。搜索引擎首先会对搜索的关键词进行解析，然后再在建立好的索引上面进行查找，最终返回和用户输入的关键词相关联的文档。&lt;/p&gt;&#xA;&lt;h2 id=&#34;lucene-软件包分析&#34;&gt;Lucene 软件包分析&lt;/h2&gt;&#xA;&lt;p&gt;Lucene 软件包的发布形式是一个 JAR 文件，下面我们分析一下这个 JAR 文件里面的主要的 JAVA 包，使读者对之有个初步的了解。&lt;/p&gt;&#xA;&lt;p&gt;Package: org.apache.lucene.document 这个包提供了一些为封装要索引的文档所需要的类，比如 Document, Field。这样，每一个文档最终被封装成了一个 Document 对象。&lt;/p&gt;</description>
			</item>
			<item>
				<title>个人项目</title>
				<link>https://blog.zhourunsheng.com/personal-project/</link>
				<pubDate>Thu, 28 Jul 2011 09:20:28 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/personal-project/</guid>
				<description>&lt;h2 id=&#34;项目代码管理平台&#34;&gt;项目代码管理平台：&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://code.google.com/u/100996274872078163517&#34;&gt;润物无声(Google Code)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://bitbucket.org/runsheng2005&#34;&gt;润物无声(bitbucket)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/careychow&#34;&gt;润物无声(github)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;电子书共享平台&#34;&gt;电子书共享平台&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://pan.baidu.com/share/home?uk=4093911471&#34;&gt;电子书籍&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
			</item>
			<item>
				<title>MySQL在线资源与手册</title>
				<link>https://blog.zhourunsheng.com/2011/07/mysql%e5%9c%a8%e7%ba%bf%e8%b5%84%e6%ba%90%e4%b8%8e%e6%89%8b%e5%86%8c/</link>
				<pubDate>Wed, 27 Jul 2011 11:58:06 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/mysql%e5%9c%a8%e7%ba%bf%e8%b5%84%e6%ba%90%e4%b8%8e%e6%89%8b%e5%86%8c/</guid>
				<description>&lt;p&gt;MySQL作为现在比较流行的开源数据库系统，在中小型项目的开发中使用的比较多，本文收集了一些实用的在线资源可以方便MySQL数据库的学习和在线手册的参考。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/mysql-logo.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;1official-home-of-mysql&#34;&gt;1)&lt;a href=&#34;http://www.mysql.com/&#34;&gt;Official Home Of MySql&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Official-Home-Of-MySql.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;2-w3schoolscom&#34;&gt;2) &lt;a href=&#34;http://www.w3schools.com/php/php_mysql_intro.asp&#34;&gt;W3Schools.com&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/W3Schools-com.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;3mysql-basics&#34;&gt;3)&lt;a href=&#34;http://www.analysisandsolutions.com/code/mysql-tutorial.htm&#34;&gt;MySql Basics&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/MySql-Basics.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;4-tutorializedcom&#34;&gt;4) &lt;a href=&#34;http://www.tutorialized.com/tutorials/MySQL/1&#34;&gt;Tutorialized.com&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Tutorialized-com.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;5-tizag-mysql-tutorials&#34;&gt;5) &lt;a href=&#34;http://www.tizag.com/mysqlTutorial/index.php&#34;&gt;Tizag MySql Tutorials&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Tizag-MySql-Tutorials.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;6tutorialspointcom&#34;&gt;6)&lt;a href=&#34;http://www.tutorialspoint.com/mysql/index.htm&#34;&gt;Tutorialspoint.com&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Tutorialspoint-com.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;7mysql-forge&#34;&gt;7)&lt;a href=&#34;http://forge.mysql.com/&#34;&gt;MySql Forge&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/MySql-Forge.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;8official-mysql-forum&#34;&gt;8)&lt;a href=&#34;http://forums.mysql.com/&#34;&gt;Official MySql Forum&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Official-MySql-Forum.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;9devshedcom&#34;&gt;9)&lt;a href=&#34;http://forums.devshed.com/mysql-help-4/&#34;&gt;Devshed.com&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Devshed-com.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;10sitepointcom&#34;&gt;10)&lt;a href=&#34;http://www.sitepoint.com/&#34;&gt;Sitepoint.com&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Sitepoint-com.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;11planet-mysql&#34;&gt;11)&lt;a href=&#34;http://planet.mysql.com/&#34;&gt;Planet MySql&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Planet-MySql.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;12mysql-performance-blog&#34;&gt;12)&lt;a href=&#34;http://www.mysqlperformanceblog.com/&#34;&gt;MySql Performance Blog&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/MySql-Performance-Blog.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;13sqlorg&#34;&gt;13)&lt;a href=&#34;http://www.sql.org/&#34;&gt;Sql.org&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Sql-org.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;14roseindia&#34;&gt;14)&lt;a href=&#34;http://www.roseindia.net/mysql/&#34;&gt;RoseIndia&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/RoseIndia.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;15webdevelopersnotes&#34;&gt;15)&lt;a href=&#34;http://www.webdevelopersnotes.com/tutorials/sql/mysql_tutorial_what_next.php3&#34;&gt;WebDevelopersNotes&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/WebDevelopersNotes.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>实用的PHP正则表达式函数库</title>
				<link>https://blog.zhourunsheng.com/2011/07/%e5%ae%9e%e7%94%a8%e7%9a%84php%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f%e5%87%bd%e6%95%b0%e5%ba%93/</link>
				<pubDate>Wed, 27 Jul 2011 10:36:40 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/%e5%ae%9e%e7%94%a8%e7%9a%84php%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f%e5%87%bd%e6%95%b0%e5%ba%93/</guid>
				<description>&lt;p&gt;在平常的web开发中，经常需要处理文本的匹配和替换，以及表单的验证，下面这些实用的经过验证的代码相信会给开发带来很多便利！&lt;/p&gt;&#xA;&lt;h2 id=&#34;1-string-mtach&#34;&gt;1) &lt;a href=&#34;http://forums.pcworld.co.nz/showthread.php?t=60179&#34;&gt;String Mtach&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/String-Mtach.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;2-password-match-validation&#34;&gt;2) &lt;a href=&#34;http://www.webcheatsheet.com/php/regular_expressions.php&#34;&gt;Password Match Validation&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Password-Match-Validation.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;3-email-address-validation&#34;&gt;3) &lt;a href=&#34;http://www.totallyphp.co.uk/code/validate_an_email_address_using_regular_expressions.htm&#34;&gt;Email Address Validation&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Email-Address-Validation.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;4-date-format-validation&#34;&gt;4) &lt;a href=&#34;http://roshanbh.com.np/2008/05/date-format-validation-php.html&#34;&gt;Date Format Validation&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Date-Format-Validation.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;5validate-url&#34;&gt;5)&lt;a href=&#34;http://stackoverflow.com/questions/206059/php-validation-regex-for-url&#34;&gt;Validate URL&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Validate-URL.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;6validate--url-using-preg_match&#34;&gt;6)&lt;a href=&#34;http://www.daniweb.com/web-development/php/threads/65872&#34;&gt;Validate  URL using Preg_match&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Validate-URL-using-Preg_match.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;7email-validation-using-ereg&#34;&gt;7)&lt;a href=&#34;http://www.php.net/manual/en/function.ereg.php&#34;&gt;Email Validation Using ereg&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Email-Validation-Using-ereg.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;8-ip-address-matching-valdation&#34;&gt;8 )&lt;a href=&#34;http://roshanbh.com.np/2008/04/ip-address-validation-php.html&#34;&gt;IP Address Matching Valdation&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/IP-Address-Matching-Valdation.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;9uk-postcode-validation&#34;&gt;9)&lt;a href=&#34;http://www.php.net/manual/en/function.ereg.php&#34;&gt;UK Postcode Validation&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/UK-Postcode-Validation.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;10ssnisbn-and-zipcode-validation&#34;&gt;10)&lt;a href=&#34;http://www.php.net/manual/en/function.ereg.php&#34;&gt;SSN,ISBN and Zipcode Validation&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/SSNISBN-and-Zipcode-Validation.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>为什么每个程序设计者都应该学习 Python 或者 Ruby</title>
				<link>https://blog.zhourunsheng.com/2011/07/%e4%b8%ba%e4%bb%80%e4%b9%88%e6%af%8f%e4%b8%aa%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1%e8%80%85%e9%83%bd%e5%ba%94%e8%af%a5%e5%ad%a6%e4%b9%a0-python-%e6%88%96%e8%80%85-ruby/</link>
				<pubDate>Mon, 25 Jul 2011 10:47:13 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/%e4%b8%ba%e4%bb%80%e4%b9%88%e6%af%8f%e4%b8%aa%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1%e8%80%85%e9%83%bd%e5%ba%94%e8%af%a5%e5%ad%a6%e4%b9%a0-python-%e6%88%96%e8%80%85-ruby/</guid>
				<description>&lt;p&gt;这是一篇选自外文的评论文章，该文告诉我们为什么要选择python或者ruby，他们相比较其他的编程语言有哪些优势，对我们以后的开发会有怎样的帮助。&lt;/p&gt;&#xA;&lt;p&gt;=========== 英文原文============&lt;/p&gt;&#xA;&lt;p&gt;If you are a student, you probably know C, C++ and Java. A few know VB, or C# / .NET. At some point you’ve probably built some web pages, so you know HTML, CSS and maybe JavaScript. By and large, it is difficult to find students who have any exposure to languages beyond this. And this is a shame because there are a number of programming languages out there which will make you a better programmer.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Web 设计师专用的 Firefox 4 插件</title>
				<link>https://blog.zhourunsheng.com/2011/07/web-%e8%ae%be%e8%ae%a1%e5%b8%88%e4%b8%93%e7%94%a8%e7%9a%84-firefox-4-%e6%8f%92%e4%bb%b6/</link>
				<pubDate>Thu, 21 Jul 2011 09:30:09 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/web-%e8%ae%be%e8%ae%a1%e5%b8%88%e4%b8%93%e7%94%a8%e7%9a%84-firefox-4-%e6%8f%92%e4%bb%b6/</guid>
				<description>&lt;p&gt;有什么好的方法可以有效提高web的开发效率，无非就是拥有合适和便捷的开发工具，相信通过本文推荐的几款插件可以大大提高开发的效率和便于程序的调试，enjoy it&amp;hellip;&lt;/p&gt;&#xA;&lt;h2 id=&#34;1-codtch&#34;&gt;1) &lt;a href=&#34;https://addons.mozilla.org/en-US/firefox/addon/codetch/?application=firefox&amp;amp;id=1002&#34;&gt;Codtch&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Codtch.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;2cssusage&#34;&gt;2)&lt;a href=&#34;https://addons.mozilla.org/en-US/firefox/addon/css-usage/&#34;&gt;CSSUsage&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/CSSUsage.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;3javascript-debugger&#34;&gt;3)&lt;a href=&#34;https://addons.mozilla.org/en-US/firefox/addon/javascript-debugger/&#34;&gt;JavaScript Debugger&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/JavaScript-Debugger.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;4colorzilla&#34;&gt;4)&lt;a href=&#34;https://addons.mozilla.org/en-US/firefox/addon/colorzilla/&#34;&gt;ColorZilla&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/ColorZilla.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;5-firebug&#34;&gt;5) &lt;a href=&#34;https://addons.mozilla.org/en-US/firefox/addon/firebug/&#34;&gt;Firebug&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Firebug.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;6web-developer&#34;&gt;6)&lt;a href=&#34;https://addons.mozilla.org/en-US/firefox/addon/web-developer/&#34;&gt;Web Developer&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Web-Developer.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;7-total-validator&#34;&gt;7) &lt;a href=&#34;https://addons.mozilla.org/en-US/firefox/addon/total-validator/&#34;&gt;Total Validator&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Total-Validator.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;8--html-validator&#34;&gt;8 ) &lt;a href=&#34;https://addons.mozilla.org/en-US/firefox/addon/html-validator/&#34;&gt;HTML Validator&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/HTML-Validator.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;9-firephp&#34;&gt;9) &lt;a href=&#34;https://addons.mozilla.org/en-US/firefox/addon/firephp/&#34;&gt;FirePHP&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/FirePHP.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;10measureit&#34;&gt;10)&lt;a href=&#34;https://addons.mozilla.org/en-US/firefox/addon/measureit/&#34;&gt;MeasureIt&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/MeasureIt.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>项目管理工具</title>
				<link>https://blog.zhourunsheng.com/2011/07/%e9%a1%b9%e7%9b%ae%e7%ae%a1%e7%90%86%e5%b7%a5%e5%85%b7/</link>
				<pubDate>Tue, 12 Jul 2011 10:03:25 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/%e9%a1%b9%e7%9b%ae%e7%ae%a1%e7%90%86%e5%b7%a5%e5%85%b7/</guid>
				<description>&lt;h2 id=&#34;1-basecamp&#34;&gt;1. &lt;a href=&#34;http://basecamphq.com/&#34;&gt;Basecamp&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Basecamp 是一个很棒的在线项目管理和协作平台，用户可在上面创建和管理任务。使用 Basecamp，雇员可轻松的和团队以及客户分享文档、幻灯片和项目。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Basecamp.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;2-lighthouse&#34;&gt;2. &lt;a href=&#34;http://lighthouseapp.com/&#34;&gt;LightHouse&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Lighthouse 是另一个在线协作工具，帮你管理工作流。有了 LightHouse 用户可自动组织各种工作任务、集成了 email 客户端，使用里程碑进行项目计划，可直接附加文档和图片。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/LightHouse.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;3-wrike&#34;&gt;3. &lt;a href=&#34;http://www.wrike.com/&#34;&gt;Wrike&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Wrike 是一个社会化项目管理软件，帮助成千上万的公司高效、实时的管理各种项目，包括项目管理、时间跟踪、甘特图、excel的导入导出、任务管理等等功能。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Wrike.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;4-comindwork&#34;&gt;4. &lt;a href=&#34;http://www.comindwork.com/&#34;&gt;Comindwork&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Comindwork 帮助用户管理各种不同的项目，有了 Comindwork，雇员和客户可管理待办事宜、wiki、email，使用甘特图表、MS Project 和工作流等技术。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Comindwork.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;5-creativepro-office&#34;&gt;5. &lt;a href=&#34;http://www.mycpohq.com/&#34;&gt;CreativePro Office&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;CreativePro Office 是非常帮的项目管理工具，帮助雇员管理包括任务、时间消耗、发票金额、项目联系人、备注和消息等等，这些功能都在一个视图中进行展示，非常直观。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/CreativePro-Office.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;6-5pm&#34;&gt;6. &lt;a href=&#34;http://www.5pmweb.com/plans.php?ref=1047&#34;&gt;5PM&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;5pm™ 是一个直观的基于 Web 的项目管理工具，帮助用户管理项目、任务以及协同工作，时间跟踪等等。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/5PM.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;7-zoho-projects&#34;&gt;7. &lt;a href=&#34;http://www.zoho.com/projects/&#34;&gt;Zoho Projects&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Zoho Projects 是一个在线项目管理软件，提供协作和bug跟踪功能。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Zoho-Projects.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;8-projectdesk&#34;&gt;8. &lt;a href=&#34;http://projectdesk.net/&#34;&gt;ProjectDesk&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Project Desk 是一个在线的项目和任务管理工具，提供虚拟的工作空间为成员提供高效的通讯手段。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/ProjectDesk.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;9-huddle&#34;&gt;9. &lt;a href=&#34;http://www.huddle.com/&#34;&gt;Huddle&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Huddle 帮助雇员管理任务、项目，分享文件和协作信息&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Huddle.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;10-proworkflow&#34;&gt;10. &lt;a href=&#34;http://www.proworkflow.com/&#34;&gt;Proworkflow&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;ProWorkflow 为你的公司管理项目、任务、时间跟踪、成员和联系人管理等等。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Proworkflow.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>如何正确处理 Java 中的中文编码</title>
				<link>https://blog.zhourunsheng.com/2011/07/%e5%a6%82%e4%bd%95%e6%ad%a3%e7%a1%ae%e5%a4%84%e7%90%86-java-%e4%b8%ad%e7%9a%84%e4%b8%ad%e6%96%87%e7%bc%96%e7%a0%81/</link>
				<pubDate>Fri, 08 Jul 2011 10:13:41 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/%e5%a6%82%e4%bd%95%e6%ad%a3%e7%a1%ae%e5%a4%84%e7%90%86-java-%e4%b8%ad%e7%9a%84%e4%b8%ad%e6%96%87%e7%bc%96%e7%a0%81/</guid>
				<description>&lt;p&gt;在Java的程序设计过程中，经常碰到需要处理中文的地方，如何能正确的对汉字进行编码解码非常关键，不然通常都会出现汉字无法正常处理的情况，有时候会变成一些？？？，而有的时候会显示一些奇怪的符号，本文摘自IBM文库，该文章详细介绍了java中的中文编码问题。&lt;/p&gt;&#xA;&lt;h2 id=&#34;几种常见的编码格式&#34;&gt;几种常见的编码格式&lt;/h2&gt;&#xA;&lt;h3 id=&#34;为什么要编码&#34;&gt;为什么要编码&lt;/h3&gt;&#xA;&lt;p&gt;不知道大家有没有想过一个问题，那就是为什么要编码？我们能不能不编码？要回答这个问题必须要回到计算机是如何表示我们人类能够理解的符号的，这些符号也就是我们人类使用的语言。由于人类的语言有太多，因而表示这些语言的符号太多，无法用计算机中一个基本的存储单元—— byte  来表示，因而必须要经过拆分或一些翻译工作，才能让计算机能理解。我们可以把计算机能够理解的语言假定为英语，其它语言要能够在计算机中使用必须经过一次翻译，把它翻译成英语。这个翻译的过程就是编码。所以可以想象只要不是说英语的国家要能够使用计算机就必须要经过编码。这看起来有些霸道，但是这就是现状，这也和我们国家现在在大力推广汉语一样，希望其它国家都会说汉语，以后其它的语言都翻译成汉语，我们可以把计算机中存储信息的最小单位改成汉字，这样我们就不存在编码问题了。&lt;/p&gt;&#xA;&lt;p&gt;所以总的来说，编码的原因可以总结为：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;计算机中存储信息的最小单元是一个字节即 8 个 bit，所以能表示的字符范围是 0~255 个&lt;/li&gt;&#xA;&lt;li&gt;人类要表示的符号太多，无法用一个字节来完全表示&lt;/li&gt;&#xA;&lt;li&gt;要解决这个矛盾必须需要一个新的数据结构 char，从 char 到 byte 必须编码&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;如何翻译&#34;&gt;如何“翻译”&lt;/h3&gt;&#xA;&lt;p&gt;明白了各种语言需要交流，经过翻译是必要的，那又如何来翻译呢？计算中提拱了多种翻译方式，常见的有  ASCII、ISO-8859-1、GB2312、GBK、UTF-8、UTF-16  等。它们都可以被看作为字典，它们规定了转化的规则，按照这个规则就可以让计算机正确的表示我们的字符。目前的编码格式很多，例如  GB2312、GBK、UTF-8、UTF-16  这几种格式都可以表示一个汉字，那我们到底选择哪种编码格式来存储汉字呢？这就要考虑到其它因素了，是存储空间重要还是编码的效率重要。根据这些因素来正确选择编码格式，下面简要介绍一下这几种编码格式。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ASCII 码&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;学过计算机的人都知道 ASCII 码，总共有 128 个，用一个字节的低 7 位表示，0&lt;del&gt;31 是控制字符如换行回车删除等；32&lt;/del&gt;126 是打印字符，可以通过键盘输入并且能够显示出来。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ISO-8859-1&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;128 个字符显然是不够用的，于是 ISO 组织在 ASCII 码基础上又制定了一些列标准用来扩展 ASCII 编码，它们是  ISO-8859-1~ISO-8859-15，其中 ISO-8859-1 涵盖了大多数西欧语言字符，所有应用的最广泛。ISO-8859-1  仍然是单字节编码，它总共能表示 256 个字符。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;GB2312&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;它的全称是《信息交换用汉字编码字符集基本集》，它是双字节编码，总的编码范围是 A1-F7，其中从 A1-A9 是符号区，总共包含 682 个符号，从 B0-F7 是汉字区，包含 6763 个汉字。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;GBK&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;全称叫《汉字内码扩展规范》，是国家技术监督局为 windows95 所制定的新的汉字内码规范，它的出现是为了扩展  GB2312，加入更多的汉字，它的编码范围是 8140~FEFE（去掉 XX7F）总共有 23940 个码位，它能表示 21003  个汉字，它的编码是和 GB2312 兼容的，也就是说用 GB2312 编码的汉字可以用 GBK 来解码，并且不会有乱码。&lt;/p&gt;</description>
			</item>
			<item>
				<title>搭建PHP在线代理</title>
				<link>https://blog.zhourunsheng.com/2011/07/%e6%90%ad%e5%bb%baphp%e5%9c%a8%e7%ba%bf%e4%bb%a3%e7%90%86/</link>
				<pubDate>Thu, 07 Jul 2011 22:40:57 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/%e6%90%ad%e5%bb%baphp%e5%9c%a8%e7%ba%bf%e4%bb%a3%e7%90%86/</guid>
				<description>&lt;p&gt;想用你的主机搭建在线代理服务器么，本文就介绍几个比较优秀的PHP在线代理脚本。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;phpMyProxy&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/phpmyproxy-script.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;phpMyProxy is a free, light and powerful php-based proxy script. The script is free and released under a GNU GPL Version 3, so you’re pretty much free to use, share, modify, redistribute, etc. The proxy script is fast and secure, requires a little server resource, encodes web address, supports Gzip Compression to save bandwidth, works with HTTPS (Secure HTTP) connections and provides very easy customization (language translation and template modification). phpMyProxy script requires PHP 4.0.2 or higher with cURL installed and session support.&lt;/p&gt;</description>
			</item>
			<item>
				<title>15个绚丽的jQuery特效</title>
				<link>https://blog.zhourunsheng.com/2011/07/15%e4%b8%aa%e6%96%b0%e9%b2%9c%e5%92%8c%e4%bc%98%e7%a7%80%e7%9a%84jquery%e6%95%99%e7%a8%8b/</link>
				<pubDate>Thu, 07 Jul 2011 11:38:13 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/15%e4%b8%aa%e6%96%b0%e9%b2%9c%e5%92%8c%e4%bc%98%e7%a7%80%e7%9a%84jquery%e6%95%99%e7%a8%8b/</guid>
				<description>&lt;h2 id=&#34;vintage-typewriter-the-sexiest-jquery-contact-form-ever&#34;&gt;Vintage typewriter: The sexiest jQuery contact form ever&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/typewriter.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;shutter-effect-portfolio-with-jquery-and-canvas&#34;&gt;&lt;a href=&#34;http://tutorialzine.com/2011/03/photography-portfolio-shutter-effect/&#34;&gt;Shutter Effect Portfolio with jQuery and Canvas&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/shutter-effect.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;how-to-build-a-sliding-feature-slideshow-with-jquery&#34;&gt;&lt;a href=&#34;http://line25.com/tutorials/how-to-build-a-sliding-feature-slideshow-with-jquery&#34;&gt;How To Build a Sliding Feature Slideshow with jQuery&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/slideshow.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;drag-drop-shopping-cart-using-jquery&#34;&gt;&lt;a href=&#34;http://superdit.com/2011/04/02/drag-drop-shopping-cart-using-jquery/&#34;&gt;Drag Drop Shopping Cart Using JQuery&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/drag-n-drop.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;image-wall-with-jquery&#34;&gt;&lt;a href=&#34;http://tympanus.net/codrops/2011/05/25/image-wall/&#34;&gt;Image Wall with jQuery&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/imagewall.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;photobooth-with-php-jquery-and-css3&#34;&gt;&lt;a href=&#34;http://tutorialzine.com/2011/04/jquery-webcam-photobooth/&#34;&gt;Photobooth with PHP, jQuery and CSS3&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/photobooth.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;html5-grayscale-image-hover&#34;&gt;&lt;a href=&#34;http://webdesignerwall.com/tutorials/html5-grayscale-image-hover&#34;&gt;HTML5 Grayscale Image Hover&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/grayscale.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;jquery-and-css-single-page-portfolio-a-vertical-parallax-navigation-experiment&#34;&gt;&lt;a href=&#34;http://www.tutorialshock.com/tutorials/single-page-portfolio-vertical-parallax-jquery-css/&#34;&gt;jQuery and CSS Single Page Portfolio, a Vertical Parallax Navigation Experiment&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Parallax.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;how-to-create-a-cool-animated-menu-with-jquery&#34;&gt;&lt;a href=&#34;http://line25.com/tutorials/how-to-create-a-cool-animated-menu-with-jquery&#34;&gt;How To Create a Cool Animated Menu with jQuery&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/cool-animated-menu.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>10个优秀的JavaScript框架</title>
				<link>https://blog.zhourunsheng.com/2011/07/10%e4%b8%aa%e4%bc%98%e7%a7%80%e7%9a%84javascript%e6%a1%86%e6%9e%b6/</link>
				<pubDate>Wed, 06 Jul 2011 22:01:43 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/10%e4%b8%aa%e4%bc%98%e7%a7%80%e7%9a%84javascript%e6%a1%86%e6%9e%b6/</guid>
				<description>&lt;p&gt;本文推荐几个优秀的JavaScript框架：&lt;/p&gt;&#xA;&lt;h2 id=&#34;1jquery-javascript-library&#34;&gt;1)&lt;a href=&#34;http://jquery.com/&#34;&gt;JQuery-JavaScript Library&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h2 id=&#34;2-mootools-javascript-framework&#34;&gt;2) &lt;a href=&#34;http://mootools.net/&#34;&gt;MooTools-JavaScript FrameWork&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/MooTools-e1309937309871.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;3adobe-spry-ajax-framework&#34;&gt;3)&lt;a href=&#34;http://labs.adobe.com/technologies/spry/home.html&#34;&gt;Adobe Spry-Ajax Framework&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Adobe-Spry-framework-e1309937123734.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;4sproutcore-javascript-framework&#34;&gt;4)&lt;a href=&#34;http://www.sproutcore.com/&#34;&gt;SproutCore-JavaScript Framework&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/SproutCore_1309799871164-e1309799956593.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;5javascriptmvc-javascript-framework&#34;&gt;5)&lt;a href=&#34;http://javascriptmvc.com/&#34;&gt;JavaScriptMVC-javaScript Framework&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/JavaScriptMVC_1309800208352-e1309800267932.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;6-raphael-javascript-library&#34;&gt;6) &lt;a href=&#34;http://raphaeljs.com/&#34;&gt;Raphael-JavaScript Library&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Raphael-JavaScript-Library_1309800495833-e1309800541787.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;7dhtmlx-javascript-library&#34;&gt;7)&lt;a href=&#34;http://dhtmlx.com/&#34;&gt;DHTMLX-JavaScript Library&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/DHTMLX-JavaScript-Ajax-Library_1309800677253-e1309800743626.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;8-rico--ajax-framework&#34;&gt;8 )&lt;a href=&#34;http://openrico.org/rico/home.page&#34;&gt;Rico -Ajax Framework&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/rico.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;9-yui-yahoo-javascript-and-css-library&#34;&gt;9) &lt;a href=&#34;http://developer.yahoo.com/yui/&#34;&gt;YUI Yahoo-JavaScript And CSS Library&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/yui-library.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;10prototype-javascript-framework&#34;&gt;10)&lt;a href=&#34;http://www.prototypejs.org/&#34;&gt;Prototype-JavaScript Framework&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/prototypejs.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>巧用DOS脚本删除工程的SVN信息</title>
				<link>https://blog.zhourunsheng.com/2011/07/%e5%b7%a7%e7%94%a8dos%e8%84%9a%e6%9c%ac%e5%88%a0%e9%99%a4%e5%b7%a5%e7%a8%8b%e7%9a%84svn%e4%bf%a1%e6%81%af/</link>
				<pubDate>Tue, 05 Jul 2011 20:33:52 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/%e5%b7%a7%e7%94%a8dos%e8%84%9a%e6%9c%ac%e5%88%a0%e9%99%a4%e5%b7%a5%e7%a8%8b%e7%9a%84svn%e4%bf%a1%e6%81%af/</guid>
				<description>&lt;p&gt;从网络上的SVN服务器上面把代码下载下来，有时候想完全去除掉该工程项目的svn信息，我们都知道svn信息保存在工程项目中的每个隐藏的.svn文件夹下面，如果手动删除的话，有可能删除不完全，导致重新导入的时候会出现错误，本文分享一个实用的dos脚本，只要将其放置到工程项目的根目录下，单击运行一次即可，就会全部清除掉隐藏的svn文件信息。&lt;/p&gt;&#xA;&lt;p&gt;代码如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;@echo off&#xA;for /r %%a in (.) do if exist %%a.svn rd /s/q %%a.svn&#xA;pause&#xA;@echo on&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;将其拷贝到本地的文本文件中，命名为removesvn.bat即可。&lt;/p&gt;&#xA;&lt;p&gt;然后将 removesvn.bat 放到需要清除svn信息的工程文件夹中运行一次就ok。&lt;/p&gt;</description>
			</item>
			<item>
				<title>XML-RPC 之 Android实现（下）</title>
				<link>https://blog.zhourunsheng.com/2011/07/xml-rpc-%e4%b9%8b-android%e5%ae%9e%e7%8e%b0%ef%bc%88%e4%b8%8b%ef%bc%89/</link>
				<pubDate>Tue, 05 Jul 2011 17:55:01 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/xml-rpc-%e4%b9%8b-android%e5%ae%9e%e7%8e%b0%ef%bc%88%e4%b8%8b%ef%bc%89/</guid>
				<description>&lt;p&gt;代码对RPC的请求进行了封装，至于XML格式的生成请参照上一篇博文《XML-RPC 之 Android实现（上）》。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.xmlrpc.android&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.io.File&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.io.FileWriter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.io.PushbackInputStream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.io.StringWriter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.net.URI&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.net.URL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.security.KeyManagementException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.security.KeyStoreException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.security.NoSuchAlgorithmException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.security.UnrecoverableKeyException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.util.Map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.apache.http.HttpEntity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.apache.http.HttpResponse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.apache.http.HttpStatus&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.apache.http.auth.UsernamePasswordCredentials&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.apache.http.client.methods.HttpPost&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.apache.http.entity.FileEntity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.apache.http.entity.StringEntity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.apache.http.params.CoreConnectionPNames&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.apache.http.params.HttpParams&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.apache.http.params.HttpProtocolParams&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.wordpress.android.util.ConnectionClient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.xmlpull.v1.XmlPullParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.xmlpull.v1.XmlPullParserFactory&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.xmlpull.v1.XmlSerializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;android.os.Environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;android.util.Log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;android.util.Xml&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;XMLRPCClient&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_METHOD_CALL&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;methodCall&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_METHOD_NAME&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;methodName&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_METHOD_RESPONSE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;methodResponse&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_PARAMS&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;params&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_PARAM&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;param&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_FAULT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;fault&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_FAULT_CODE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;faultCode&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_FAULT_STRING&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;faultString&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConnectionClient&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HttpPost&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;postMethod&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XmlSerializer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;serializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HttpParams&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;httpParams&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* XMLRPCClient constructor. Creates new instance based on server URI&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param XMLRPC&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            server URI&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;XMLRPCClient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;URI&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;uri&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;httpuser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;httppasswd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;postMethod&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HttpPost&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;uri&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;postMethod&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;addHeader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;text/xml&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;postMethod&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;addHeader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;charset&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// UPDATE THE VERSION NUMBER BEFORE RELEASE! &amp;lt;3 Dan&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;postMethod&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;addHeader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;User-Agent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;wp-android/1.4.1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;httpParams&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;postMethod&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getParams&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;HttpProtocolParams&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setUseExpectContinue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;httpParams&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// username &amp;amp; password not needed&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;UsernamePasswordCredentials&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;creds&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UsernamePasswordCredentials&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;httpuser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;httppasswd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// this gets connections working over https&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;uri&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getScheme&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;uri&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getScheme&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;equals&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;uri&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getPort&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConnectionClient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;creds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;443&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;KeyManagementException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConnectionClient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;creds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NoSuchAlgorithmException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConnectionClient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;creds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;KeyStoreException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConnectionClient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;creds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UnrecoverableKeyException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConnectionClient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;creds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConnectionClient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;creds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;uri&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getPort&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;KeyManagementException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConnectionClient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;creds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NoSuchAlgorithmException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConnectionClient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;creds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;KeyStoreException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConnectionClient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;creds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UnrecoverableKeyException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConnectionClient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;creds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConnectionClient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;creds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConnectionClient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;creds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;serializer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Xml&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;newSerializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* Convenience constructor. Creates new instance based on server String&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* address&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param XMLRPC&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            server address&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;XMLRPCClient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;httpuser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;httppasswd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;URI&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;create&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;httpuser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;httppasswd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* Convenience XMLRPCClient constructor. Creates new instance based on&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* server URL&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param XMLRPC&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            server URL&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;XMLRPCClient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;URL&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;httpuser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;httppasswd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;URI&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;create&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toExternalForm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;httpuser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;httppasswd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* Call method with optional parameters. This is general method. If you want&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* to call your method with 0-8 parameters, you can use more convenience&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* call methods&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param method&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            name of method to call&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param params&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            parameters to pass to method (may be null if method has no&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            parameters)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @return deserialized method return value&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @throws XMLRPCException&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;call&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;throws&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XMLRPCException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;callXMLRPC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* Convenience method call with no parameters&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param method&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            name of method to call&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @return deserialized method return value&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @throws XMLRPCException&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;call&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;throws&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XMLRPCException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;callXMLRPC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* Convenience method call with one parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param method&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            name of method to call&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @return deserialized method return value&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @throws XMLRPCException&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;call&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;throws&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XMLRPCException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;callXMLRPC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* Convenience method call with two parameters&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param method&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            name of method to call&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 1st parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 2nd parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @return deserialized method return value&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @throws XMLRPCException&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;call&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;throws&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XMLRPCException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;callXMLRPC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* Convenience method call with three parameters&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param method&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            name of method to call&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 1st parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 2nd parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 3rd parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @return deserialized method return value&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @throws XMLRPCException&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;call&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;throws&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XMLRPCException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;callXMLRPC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* Convenience method call with four parameters&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param method&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            name of method to call&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 1st parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 2nd parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 3rd parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 4th parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @return deserialized method return value&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @throws XMLRPCException&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;call&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;throws&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XMLRPCException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;callXMLRPC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* Convenience method call with five parameters&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param method&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            name of method to call&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 1st parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 2nd parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 3rd parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 4th parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p4&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 5th parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @return deserialized method return value&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @throws XMLRPCException&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;call&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;throws&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XMLRPCException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;callXMLRPC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* Convenience method call with six parameters&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param method&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            name of method to call&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 1st parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 2nd parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 3rd parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 4th parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p4&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 5th parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p5&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 6th parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @return deserialized method return value&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @throws XMLRPCException&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;call&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;throws&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XMLRPCException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;callXMLRPC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* Convenience method call with seven parameters&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param method&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            name of method to call&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 1st parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 2nd parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 3rd parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 4th parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p4&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 5th parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p5&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 6th parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p6&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 7th parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @return deserialized method return value&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @throws XMLRPCException&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;call&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p6&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;throws&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XMLRPCException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p6&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;callXMLRPC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* Convenience method call with eight parameters&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param method&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            name of method to call&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 1st parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 2nd parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 3rd parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 4th parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p4&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 5th parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p5&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 6th parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p6&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 7th parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param p7&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            method&amp;#39;s 8th parameter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @return deserialized method return value&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @throws XMLRPCException&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;call&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p6&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p7&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;throws&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XMLRPCException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p6&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p7&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;callXMLRPC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* Call method with optional parameters&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param method&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            name of method to call&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @param params&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            parameters to pass to method (may be null if method has no&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*            parameters)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @return deserialized method return value&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;* @throws XMLRPCException&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@SuppressWarnings&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;unchecked&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;callXMLRPC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;throws&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XMLRPCException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// prepare POST body&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;File&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tempFile&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;equals&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;wp.uploadFile&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tempFilePath&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getExternalStorageDirectory&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;File&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;separator&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;wordpress&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;File&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;separator&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;wp-&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;currentTimeMillis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;.xml&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;File&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;directory&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;File&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tempFilePath&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getParentFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;directory&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;exists&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;directory&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;mkdirs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;throw&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XMLRPCException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Path to file could not be created.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;tempFile&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;File&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tempFilePath&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;FileWriter&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fileWriter&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;FileWriter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tempFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;serializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setOutput&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fileWriter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;serializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;startDocument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;serializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;startTag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_METHOD_CALL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// set method name&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;serializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;startTag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_METHOD_NAME&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;endTag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_METHOD_NAME&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// set method params&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;serializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;startTag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_PARAMS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;serializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;startTag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_PARAM&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;startTag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;XMLRPCSerializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;TAG_VALUE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;XMLRPCSerializer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;serialize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;serializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;serializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;endTag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XMLRPCSerializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;TAG_VALUE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;endTag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_PARAM&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;serializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;endTag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_PARAMS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;serializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;endTag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_METHOD_CALL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;serializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;endDocument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;fileWriter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;flush&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;fileWriter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;close&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;FileEntity&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fEntity&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;FileEntity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tempFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;text/xml; charset=&amp;#34;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UTF&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;fEntity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setContentType&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;text/xml&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// fEntity.setChunked(true);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;postMethod&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setEntity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fEntity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;StringWriter&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bodyWriter&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StringWriter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;serializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setOutput&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bodyWriter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;serializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;startDocument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;serializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;startTag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_METHOD_CALL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// set method name&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;serializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;startTag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_METHOD_NAME&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;endTag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_METHOD_NAME&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// set method params&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;serializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;startTag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_PARAMS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;serializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;startTag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_PARAM&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;startTag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;XMLRPCSerializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;TAG_VALUE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;equals&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;metaWeblog.editPost&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;||&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;equals&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;metaWeblog.newPost&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;XMLRPCSerializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;serialize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;serializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;XMLRPCSerializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;serialize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;serializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;serializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;endTag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XMLRPCSerializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;TAG_VALUE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;endTag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_PARAM&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;serializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;endTag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_PARAMS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;serializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;endTag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_METHOD_CALL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;serializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;endDocument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;HttpEntity&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;entity&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StringEntity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bodyWriter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// Log.i(&amp;#34;WordPress&amp;#34;, bodyWriter.toString());&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;postMethod&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setEntity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;entity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// set timeout to 40 seconds, does it need to be set for both client&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// and method?&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getParams&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setParameter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;CoreConnectionPNames&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;CONNECTION_TIMEOUT&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;40000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getParams&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setParameter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;CoreConnectionPNames&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;SO_TIMEOUT&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;40000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;postMethod&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getParams&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setParameter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;CoreConnectionPNames&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;CONNECTION_TIMEOUT&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;40000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;postMethod&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getParams&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setParameter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;CoreConnectionPNames&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;SO_TIMEOUT&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;40000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// execute HTTP POST request&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;HttpResponse&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;execute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;postMethod&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;WordPress&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;response = &amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getStatusLine&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// check status code&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;statusCode&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getStatusLine&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getStatusCode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;equals&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;wp.uploadFile&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// get rid of the temp file&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;tempFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;delete&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;statusCode&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HttpStatus&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;SC_OK&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;throw&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XMLRPCException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;HTTP status code: &amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;statusCode&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34; was returned. &amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getStatusLine&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getReasonPhrase&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// setup pull parser&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;XmlPullParser&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pullParser&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XmlPullParserFactory&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;newInstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;newPullParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;HttpEntity&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;entity&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getEntity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// change to pushbackinput stream 1/18/2010 to handle self installed&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// wp sites that insert the BOM&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;PushbackInputStream&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;is&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PushbackInputStream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;entity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getContent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// get rid of junk characters before xml response. 60 = &amp;#39;&amp;lt;&amp;#39;. Added&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// stopper to prevent infinite loop&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bomCheck&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;is&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;read&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stopper&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bomCheck&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;60&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stopper&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;bomCheck&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;is&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;read&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;stopper&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;is&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;unread&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bomCheck&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;pullParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setInput&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;is&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// lets start pulling...&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;pullParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;nextTag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;pullParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XmlPullParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;START_TAG&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;TAG_METHOD_RESPONSE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;pullParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;nextTag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// either TAG_PARAMS (&amp;lt;params&amp;gt;) or TAG_FAULT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// (&amp;lt;fault&amp;gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tag&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pullParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;equals&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_PARAMS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// normal response&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;pullParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;nextTag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// TAG_PARAM (&amp;lt;param&amp;gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;pullParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XmlPullParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;START_TAG&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_PARAM&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;pullParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;nextTag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// TAG_VALUE (&amp;lt;value&amp;gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// no parser.require() here since its called in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// XMLRPCSerializer.deserialize() below&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// deserialize result&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;obj&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XMLRPCSerializer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;deserialize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pullParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;entity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;consumeContent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;obj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;equals&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_FAULT&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// fault response&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;pullParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;nextTag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// TAG_VALUE (&amp;lt;value&amp;gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// no parser.require() here since its called in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// XMLRPCSerializer.deserialize() below&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// deserialize fault result&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Map&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Map&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XMLRPCSerializer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;deserialize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pullParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;faultString&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_FAULT_STRING&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;faultCode&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TAG_FAULT_CODE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;entity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;consumeContent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;throw&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XMLRPCFault&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;faultString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;faultCode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;entity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;consumeContent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;throw&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XMLRPCException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Bad tag &amp;lt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tag&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&amp;gt; in XMLRPC response - neither &amp;lt;params&amp;gt; nor &amp;lt;fault&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XMLRPCException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// catch &amp;amp; propagate XMLRPCException/XMLRPCFault&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;throw&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Exception&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// wrap any other Exception(s) around XMLRPCException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;throw&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XMLRPCException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其他工具类的实现，比如错误，异常的实现类和Base64的编码和解码请参照：&lt;code&gt;android_rpc&lt;/code&gt;。&lt;/p&gt;</description>
			</item>
			<item>
				<title>XML-RPC 之 Android实现（上）</title>
				<link>https://blog.zhourunsheng.com/2011/07/xml-rpc-%e4%b9%8b-android%e5%ae%9e%e7%8e%b0%ef%bc%88wordpress%e5%ae%98%e6%96%b9%e7%89%88%ef%bc%89/</link>
				<pubDate>Tue, 05 Jul 2011 17:44:03 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/xml-rpc-%e4%b9%8b-android%e5%ae%9e%e7%8e%b0%ef%bc%88wordpress%e5%ae%98%e6%96%b9%e7%89%88%ef%bc%89/</guid>
				<description>&lt;p&gt;xml-rpc的文档规范请参照博文《XML-RPC 规范》，本文是其android版本的一个实现，代码摘自wordpress的官方android发布版。&lt;/p&gt;&#xA;&lt;p&gt;主要XML的封装和解封代码实现如下，实现了将Java的数据类型封装成xml-rpc请求格式的xml数据和解析xml格式的返回数据来转换成java的数据类型：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;package org.xmlrpc.android;&#xA;&#xA;import java.io.BufferedReader;&#xA;import java.io.DataInputStream;&#xA;import java.io.FileInputStream;&#xA;import java.io.IOException;&#xA;import java.io.InputStream;&#xA;import java.io.StringReader;&#xA;import java.text.ParseException;&#xA;import java.text.SimpleDateFormat;&#xA;import java.util.ArrayList;&#xA;import java.util.Calendar;&#xA;import java.util.Date;&#xA;import java.util.HashMap;&#xA;import java.util.Iterator;&#xA;import java.util.List;&#xA;import java.util.Map;&#xA;import java.util.TimeZone;&#xA;import java.util.Map.Entry;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import org.wordpress.android.models.MediaFile;&#xA;import org.xmlpull.v1.XmlPullParser;&#xA;import org.xmlpull.v1.XmlPullParserException;&#xA;import org.xmlpull.v1.XmlSerializer;&#xA;&#xA;class XMLRPCSerializer {&#xA; static final String TAG_NAME = &amp;#34;name&amp;#34;;&#xA; static final String TAG_MEMBER = &amp;#34;member&amp;#34;;&#xA; static final String TAG_VALUE = &amp;#34;value&amp;#34;;&#xA; static final String TAG_DATA = &amp;#34;data&amp;#34;;&#xA;&#xA; static final String TYPE_INT = &amp;#34;int&amp;#34;;&#xA; static final String TYPE_I4 = &amp;#34;i4&amp;#34;;&#xA; static final String TYPE_I8 = &amp;#34;i8&amp;#34;;&#xA; static final String TYPE_DOUBLE = &amp;#34;double&amp;#34;;&#xA; static final String TYPE_BOOLEAN = &amp;#34;boolean&amp;#34;;&#xA; static final String TYPE_STRING = &amp;#34;string&amp;#34;;&#xA; static final String TYPE_DATE_TIME_ISO8601 = &amp;#34;dateTime.iso8601&amp;#34;;&#xA; static final String TYPE_BASE64 = &amp;#34;base64&amp;#34;;&#xA; static final String TYPE_ARRAY = &amp;#34;array&amp;#34;;&#xA; static final String TYPE_STRUCT = &amp;#34;struct&amp;#34;;&#xA;&#xA; static SimpleDateFormat dateFormat = new SimpleDateFormat(&amp;#34;yyyyMMdd&amp;#39;T&amp;#39;HH:mm:ss&amp;#34;);&#xA;&#xA; /**&#xA; * 序列化请求数据，封装成对应的XML格式.&#xA; *&#xA; * 请求示例：&#xA; *&#xA; * &amp;lt;methodCall&amp;gt;&#xA; *     &amp;lt;methodName&amp;gt;examples.getStateName&amp;lt;/methodName&amp;gt;&#xA; *       &amp;lt;params&amp;gt;&#xA; *          &amp;lt;param&amp;gt;&#xA; *             &amp;lt;value&amp;gt;&amp;lt;i4&amp;gt;41&amp;lt;/i4&amp;gt;&amp;lt;/value&amp;gt;&#xA; *          &amp;lt;/param&amp;gt;&#xA; *        &amp;lt;/params&amp;gt;&#xA; *  &amp;lt;/methodCall&amp;gt;&#xA; *&#xA; * 结构体：&#xA; *  &amp;lt;struct&amp;gt;&#xA; *     &amp;lt;member&amp;gt;&#xA; *         &amp;lt;name&amp;gt;lowerBound&amp;lt;/name&amp;gt;&#xA; *         &amp;lt;value&amp;gt;&amp;lt;i4&amp;gt;18&amp;lt;/i4&amp;gt;&amp;lt;/value&amp;gt;&#xA; *     &amp;lt;/member&amp;gt;&#xA; *     &amp;lt;member&amp;gt;&#xA; *         &amp;lt;name&amp;gt;upperBound&amp;lt;/name&amp;gt;&#xA; *         &amp;lt;value&amp;gt;&amp;lt;i4&amp;gt;139&amp;lt;/i4&amp;gt;&amp;lt;/value&amp;gt;&#xA; *     &amp;lt;/member&amp;gt;&#xA; *  &amp;lt;/struct&amp;gt;&#xA; *&#xA; * 数组：&#xA; *  &amp;lt;array&amp;gt;&#xA; *     &amp;lt;data&amp;gt;&#xA; *        &amp;lt;value&amp;gt;&amp;lt;i4&amp;gt;12&amp;lt;/i4&amp;gt;&amp;lt;/value&amp;gt;&#xA; *        &amp;lt;value&amp;gt;&amp;lt;string&amp;gt;Egypt&amp;lt;/string&amp;gt;&amp;lt;/value&amp;gt;&#xA; *        &amp;lt;value&amp;gt;&amp;lt;boolean&amp;gt;0&amp;lt;/boolean&amp;gt;&amp;lt;/value&amp;gt;&#xA; *        &amp;lt;value&amp;gt;&amp;lt;i4&amp;gt;-31&amp;lt;/i4&amp;gt;&amp;lt;/value&amp;gt;&#xA; *     &amp;lt;/data&amp;gt;&#xA; *  &amp;lt;/array&amp;gt;&#xA; * &#xA; * */&#xA; static void serialize(XmlSerializer serializer, Object object,&#xA; boolean convertToGMT) throws IOException {&#xA; // check for scalar types:&#xA; if (object instanceof Integer || object instanceof Short&#xA; || object instanceof Byte) {&#xA; // 基本类型： 整型&#xA; serializer.startTag(null, TYPE_I4).text(object.toString()).endTag(null, TYPE_I4);&#xA; } else if (object instanceof Long) {&#xA; // 基本类型： 长整型&#xA; serializer.startTag(null, TYPE_I8).text(object.toString()).endTag(null, TYPE_I8);&#xA; } else if (object instanceof Double || object instanceof Float) {&#xA; // 基本类型： 浮点型&#xA; serializer.startTag(null, TYPE_DOUBLE).text(object.toString()).endTag(null, TYPE_DOUBLE);&#xA; } else if (object instanceof Boolean) {&#xA; // 基本类型： 布尔型&#xA; Boolean bool = (Boolean) object;&#xA; String boolStr = bool.booleanValue() ? &amp;#34;1&amp;#34; : &amp;#34;0&amp;#34;;&#xA; serializer.startTag(null, TYPE_BOOLEAN).text(boolStr).endTag(null, TYPE_BOOLEAN);&#xA; } else if (object instanceof String) {&#xA; // 基本类型： 字符串型&#xA; serializer.startTag(null, TYPE_STRING).text(object.toString()).endTag(null, TYPE_STRING);&#xA; } else if (object instanceof Date || object instanceof Calendar) {&#xA; // 基本类型： 日期型&#xA; Date date = (Date) object;&#xA; SimpleDateFormat dateFormat = new SimpleDateFormat(&amp;#34;yyyyMMdd&amp;#39;T&amp;#39;HH:mm:ss&amp;#34;);&#xA; if (convertToGMT) {&#xA; long pubDate = date.getTime();&#xA; TimeZone tz = TimeZone.getDefault();&#xA; long offset = tz.getOffset(pubDate);&#xA; pubDate += offset * -1;&#xA; date = new Date(pubDate);&#xA; }&#xA; String sDate = dateFormat.format(date);&#xA; serializer.startTag(null, TYPE_DATE_TIME_ISO8601).text(sDate).endTag(null, TYPE_DATE_TIME_ISO8601);&#xA; } else if (object instanceof byte[]) {&#xA; // 基本类型： Base64编码型&#xA; String value = new String(Base64Coder.encode((byte[]) object));&#xA; serializer.startTag(null, TYPE_BASE64).text(value).endTag(null, TYPE_BASE64);&#xA; } else if (object instanceof MediaFile) {&#xA; // 基本类型： Base64编码型&#xA; // convert media file binary to base64&#xA; serializer.startTag(null, &amp;#34;base64&amp;#34;);&#xA; MediaFile videoFile = (MediaFile) object;&#xA; InputStream inStream = new DataInputStream(new FileInputStream(videoFile.getFilePath()));&#xA; byte[] buffer = new byte[3600];// you must use a 24bit multiple&#xA; int length = -1;&#xA; String chunk = null;&#xA; // int ctr = 0;&#xA; // Log.i(&amp;#34;WordPress&amp;#34;, &amp;#34;converting media file to base64&amp;#34;);&#xA; while ((length = inStream.read(buffer)) &amp;gt; 0) {&#xA; chunk = Base64.encodeBytes(buffer, 0, length);&#xA; serializer.text(chunk);&#xA; // ctr+=3600;&#xA; // Log.i(&amp;#34;WordPress&amp;#34;, &amp;#34;chunk &amp;#34; + ctr);&#xA; }&#xA; // Log.i(&amp;#34;WordPress&amp;#34;, &amp;#34;conversion done!&amp;#34;);&#xA; inStream.close();&#xA; serializer.endTag(null, &amp;#34;base64&amp;#34;);&#xA; } else if (object instanceof List&amp;lt;?&amp;gt;) {&#xA; // 复合类型： 数组型&#xA; serializer.startTag(null, TYPE_ARRAY).startTag(null, TAG_DATA);&#xA; List&amp;lt;Object&amp;gt; list = (List&amp;lt;Object&amp;gt;) object;&#xA; Iterator&amp;lt;Object&amp;gt; iter = list.iterator();&#xA; while (iter.hasNext()) {&#xA; Object o = iter.next();&#xA; serializer.startTag(null, TAG_VALUE);&#xA; serialize(serializer, o, convertToGMT);&#xA; serializer.endTag(null, TAG_VALUE);&#xA; }&#xA; serializer.endTag(null, TAG_DATA).endTag(null, TYPE_ARRAY);&#xA; } else if (object instanceof Object[]) {&#xA; // 复合类型： 数组型&#xA; serializer.startTag(null, TYPE_ARRAY).startTag(null, TAG_DATA);&#xA; Object[] objects = (Object[]) object;&#xA; for (int i = 0; i &amp;lt; objects.length; i++) {&#xA; Object o = objects[i];&#xA; serializer.startTag(null, TAG_VALUE);&#xA; serialize(serializer, o, convertToGMT);&#xA; serializer.endTag(null, TAG_VALUE);&#xA; }&#xA; serializer.endTag(null, TAG_DATA).endTag(null, TYPE_ARRAY);&#xA; } else if (object instanceof Map) {&#xA; // 复合类型： 结构型&#xA; serializer.startTag(null, TYPE_STRUCT);&#xA; Map&amp;lt;String, Object&amp;gt; map = (Map&amp;lt;String, Object&amp;gt;) object;&#xA; Iterator&amp;lt;Entry&amp;lt;String, Object&amp;gt;&amp;gt; iter = map.entrySet().iterator();&#xA; while (iter.hasNext()) {&#xA; Entry&amp;lt;String, Object&amp;gt; entry = iter.next();&#xA; String key = entry.getKey();&#xA; Object value = entry.getValue();&#xA;&#xA; serializer.startTag(null, TAG_MEMBER);&#xA; serializer.startTag(null, TAG_NAME).text(key).endTag(null, TAG_NAME);&#xA; serializer.startTag(null, TAG_VALUE);&#xA; serialize(serializer, value, convertToGMT);&#xA; serializer.endTag(null, TAG_VALUE);&#xA; serializer.endTag(null, TAG_MEMBER);&#xA; }&#xA; serializer.endTag(null, TYPE_STRUCT);&#xA; } else {&#xA; throw new IOException(&amp;#34;Cannot serialize &amp;#34; + object);&#xA; }&#xA; }&#xA;&#xA; /**&#xA; * 反序列化服务器的返回数据，解封成Java的数据类型.&#xA; *&#xA; * 回复示例：&#xA; *&#xA; * &amp;lt;methodResponse&amp;gt;&#xA; *    &amp;lt;params&amp;gt;&#xA; *       &amp;lt;param&amp;gt;&#xA; *         &amp;lt;value&amp;gt;&amp;lt;string&amp;gt;South Dakota&amp;lt;/string&amp;gt;&amp;lt;/value&amp;gt;&#xA; *       &amp;lt;/param&amp;gt;&#xA; *    &amp;lt;/params&amp;gt;&#xA; * &amp;lt;/methodResponse&amp;gt;&#xA; * */&#xA; static Object deserialize(XmlPullParser parser)&#xA; throws XmlPullParserException, IOException {&#xA; parser.require(XmlPullParser.START_TAG, null, TAG_VALUE);&#xA;&#xA; parser.nextTag();&#xA; String typeNodeName = parser.getName();&#xA;&#xA; Object obj;&#xA; if (typeNodeName.equals(TYPE_INT) || typeNodeName.equals(TYPE_I4)) {&#xA; String value = parser.nextText();&#xA; obj = Integer.parseInt(value);&#xA; } else if (typeNodeName.equals(TYPE_I8)) {&#xA; String value = parser.nextText();&#xA; obj = Long.parseLong(value);&#xA; } else if (typeNodeName.equals(TYPE_DOUBLE)) {&#xA; String value = parser.nextText();&#xA; obj = Double.parseDouble(value);&#xA; } else if (typeNodeName.equals(TYPE_BOOLEAN)) {&#xA; String value = parser.nextText();&#xA; obj = value.equals(&amp;#34;1&amp;#34;) ? Boolean.TRUE : Boolean.FALSE;&#xA; } else if (typeNodeName.equals(TYPE_STRING)) {&#xA; obj = parser.nextText();&#xA; } else if (typeNodeName.equals(TYPE_DATE_TIME_ISO8601)) {&#xA; String value = parser.nextText();&#xA; try {&#xA; obj = dateFormat.parseObject(value);&#xA; } catch (ParseException e) {&#xA; e.printStackTrace();&#xA; obj = value;&#xA; // throw new IOException(&amp;#34;Cannot deserialize dateTime &amp;#34; + value);&#xA; }&#xA; } else if (typeNodeName.equals(TYPE_BASE64)) {&#xA; String value = parser.nextText();&#xA; BufferedReader reader = new BufferedReader(new StringReader(value));&#xA; String line;&#xA; StringBuffer sb = new StringBuffer();&#xA; while ((line = reader.readLine()) != null) {&#xA; sb.append(line);&#xA; }&#xA; obj = Base64Coder.decode(sb.toString());&#xA; } else if (typeNodeName.equals(TYPE_ARRAY)) {&#xA; parser.nextTag(); // TAG_DATA (&amp;lt;data&amp;gt;)&#xA; parser.require(XmlPullParser.START_TAG, null, TAG_DATA);&#xA;&#xA; parser.nextTag();&#xA; List&amp;lt;Object&amp;gt; list = new ArrayList&amp;lt;Object&amp;gt;();&#xA; while (parser.getName().equals(TAG_VALUE)) {&#xA; list.add(deserialize(parser));&#xA; parser.nextTag();&#xA; }&#xA; parser.require(XmlPullParser.END_TAG, null, TAG_DATA);&#xA; parser.nextTag(); // TAG_ARRAY (&amp;lt;/array&amp;gt;)&#xA; parser.require(XmlPullParser.END_TAG, null, TYPE_ARRAY);&#xA; obj = list.toArray();&#xA; } else if (typeNodeName.equals(TYPE_STRUCT)) {&#xA; parser.nextTag();&#xA; Map&amp;lt;String, Object&amp;gt; map = new HashMap&amp;lt;String, Object&amp;gt;();&#xA; while (parser.getName().equals(TAG_MEMBER)) {&#xA; String memberName = null;&#xA; Object memberValue = null;&#xA; while (true) {&#xA; parser.nextTag();&#xA; String name = parser.getName();&#xA; if (name.equals(TAG_NAME)) {&#xA; memberName = parser.nextText();&#xA; } else if (name.equals(TAG_VALUE)) {&#xA; memberValue = deserialize(parser);&#xA; } else {&#xA; break;&#xA; }&#xA; }&#xA; if (memberName != null &amp;amp;&amp;amp; memberValue != null) {&#xA; map.put(memberName, memberValue);&#xA; }&#xA; parser.require(XmlPullParser.END_TAG, null, TAG_MEMBER);&#xA; parser.nextTag();&#xA; }&#xA; parser.require(XmlPullParser.END_TAG, null, TYPE_STRUCT);&#xA; obj = map;&#xA; } else {&#xA; throw new IOException(&amp;#34;Cannot deserialize &amp;#34; + parser.getName());&#xA; }&#xA; parser.nextTag(); // TAG_VALUE (&amp;lt;/value&amp;gt;)&#xA; parser.require(XmlPullParser.END_TAG, null, TAG_VALUE);&#xA; return obj;&#xA; }&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;其他工具类的实现，比如错误，异常的实现类和Base64的编码和解码请参照：android_rpc&lt;/p&gt;</description>
			</item>
			<item>
				<title>XML-RPC 规范</title>
				<link>https://blog.zhourunsheng.com/2011/07/xml-rpc-%e8%a7%84%e8%8c%83/</link>
				<pubDate>Tue, 05 Jul 2011 16:35:28 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/xml-rpc-%e8%a7%84%e8%8c%83/</guid>
				<description>&lt;p&gt;Overview(简介) XML-RPC is a Remote Procedure Calling protocol that works over the Internet.&lt;/p&gt;&#xA;&lt;p&gt;An XML-RPC message is an HTTP-POST request. The body of the request is  in XML. A procedure executes on the server and the value it returns is  also formatted in XML.&lt;/p&gt;&#xA;&lt;p&gt;Procedure parameters can be scalars, numbers, strings, dates, etc.; and can also be complex record and list structures.&lt;/p&gt;&#xA;&lt;p&gt;工作机制：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/xmlrpc.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Request example（请求示例）&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;POST /RPC2 HTTP/1.0&#xA;User-Agent: Frontier/5.1.2 (WinNT)&#xA;Host: betty.userland.com&#xA;Content-Type: text/xml&#xA;Content-length: 181&#xA;&#xA;&amp;lt;?xml version=&amp;#34;1.0&amp;#34;?&amp;gt;&#xA;&amp;lt;methodCall&amp;gt;&#xA;   &amp;lt;methodName&amp;gt;examples.getStateName&amp;lt;/methodName&amp;gt;&#xA;   &amp;lt;params&amp;gt;&#xA;      &amp;lt;param&amp;gt;&#xA;         &amp;lt;value&amp;gt;&amp;lt;i4&amp;gt;41&amp;lt;/i4&amp;gt;&amp;lt;/value&amp;gt;&#xA;      &amp;lt;/param&amp;gt;&#xA;   &amp;lt;/params&amp;gt;&#xA;&amp;lt;/methodCall&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Header requirements（请求中需设置header的必要信息）&lt;/p&gt;</description>
			</item>
			<item>
				<title>jQuery Mobile 教程</title>
				<link>https://blog.zhourunsheng.com/2011/07/jquery-mobile-%e6%95%99%e7%a8%8b/</link>
				<pubDate>Tue, 05 Jul 2011 14:49:21 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/jquery-mobile-%e6%95%99%e7%a8%8b/</guid>
				<description>&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://miamicoder.com/category/tutorials/jquery-mobile-tutorials/&#34;&gt;Creating a Website Using JQuery Mobile&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;在本教程中将告诉您如何利用jQuery Mobile建立一个网站。这个教程的第一部分为您解释该网站的特点并且完成网站的主页。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Creating-a-Website-Using-JQuery-Mobile.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.elated.com/articles/jquery-mobile-what-can-it-do-for-you/&#34;&gt;jQuery Mobile: What Can It Do for You?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;这是一篇介绍jQuery Mobile主要特性和优点的详细教程，举例说明了如何利用这个新架构帮助你快速建立优质移动应用。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/jQuery-Mobile-What-Can-It-Do-for-You.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://fuelyourcoding.com/getting-started-with-jquery-mobile-rails-3/&#34;&gt;Getting Started with jQuery Mobile &amp;amp; Rails 3&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;本教程教我们如何利用Rails 3和jQuery Mobile创建CRUD应用。该应用程序将允许我们通过移动设备创建，读取，更新和删除博客帖子。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Getting-Started-with-jQuery-Mobile-Rails-3.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://devgrow.com/mobile-web-dev-using-jquery-mobile/&#34;&gt;Creating a Simple App Using jQuery Mobile&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;在这篇文章中，我们将看看如何利用框架，动态（AJAX）的页面加载，iOS的风格设计和页面过渡等创建一个简单的移动网站。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Creating-a-Simple-App-Using-jQuery-Mobile.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;ol start=&#34;5&#34;&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.catswhocode.com/blog/how-to-create-a-mobile-wordpress-theme-with-jquery-mobile&#34;&gt;How to create a mobile WordPress theme with jQuery Mobile&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/How-to-create-a-mobile-WordPress-theme-with-jQuery-Mobile.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;本教程为您介绍如何创建一个移动优化WordPress主题。&lt;/p&gt;&#xA;&lt;p&gt;6.&lt;a href=&#34;http://www.mobiledevelopersolutions.com/home/start/twominutetutorials/tmt1part1&#34;&gt;Two-Minute Tutorial  1&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;这个两分钟教程展示了如何使用AppLaud和PhoneGap Media API播放音频文件，并使用jQuery Mobile实现按钮和文本显示。它也显示了两种方法来访问音频文件：网址或本地上传。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Two-Minute-Tutorial.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;ol start=&#34;7&#34;&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://mobile.tutsplus.com/tutorials/mobile-web-apps/jquery-mobile-forms/&#34;&gt;jQuery Mobile Framework – A Forms Tutorial&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;jQuery Mobile是一个相对较新的移动网络框架，2010年10月首次发布。该框架有许多有趣的功能来支持移动应用开发。在本教程中，我们将集中于 jQuery Mobile的一些基本要素：页面结构，形式和Ajax提交表单。本教程是基于jQuery Mobile 1.0 alpha版本。&lt;/p&gt;</description>
			</item>
			<item>
				<title>学习 Android 优秀开源项目</title>
				<link>https://blog.zhourunsheng.com/2011/07/%e5%ad%a6%e4%b9%a0-android-%e4%bc%98%e7%a7%80%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae/</link>
				<pubDate>Tue, 05 Jul 2011 13:14:28 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/%e5%ad%a6%e4%b9%a0-android-%e4%bc%98%e7%a7%80%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae/</guid>
				<description>&lt;ol&gt;&#xA;&lt;li&gt;FBReaderJ&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;FBReaderJ用于Android平台的电子书阅读器，它支持多种电子书籍格式包括：oeb、ePub和fb2。此外还支持直接读取zip、tar和gzip等压缩文档。&#xA;项目地址：FBReaderJ&lt;/p&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;Angle&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Angle是一款专为Android平台设计的，适合快速开发的2D游戏引擎，基于OpenGL ES技术开发。该引擎全部用Java代码编写，并且可以根据自己的需要替换里面的实现。&#xA;项目地址：angle&lt;/p&gt;&#xA;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;android-shuffle&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;android-shuffle是一个GTD（Getting Things Done）个人备忘记事本。&#xA;项目地址：android-shuffle&lt;/p&gt;&#xA;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;Open GPS Tracker&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;GPSTracker是一个能够使用Android地图记录你的驾车或旅行路线的项目，出发前打开软件选择开始记录，你所经过的路线就会实时显示在地图上，同时还会显示当前的行驶速度。程序会按用户自己设置的标题自动存路线留做日后查看，也可以把路线分享给朋友。GPSTracker项目是一个Map方面的完整应用，包括两个主要组成部分，第一部分是一个收集和存储GPS追踪数据的系统服务，第二部分是Map Activity控制跟踪数据并在地图上显示提供接口。GPSTracker项目用到了osmdroid项目的部分功能，其中OpenStreetMap是一个可供自由编辑的世界地图，允许您查看，编辑或者使用世界各地的地理数据来帮助您。&#xA;项目地址：open-gpstracker&lt;/p&gt;&#xA;&lt;ol start=&#34;5&#34;&gt;&#xA;&lt;li&gt;Rokon&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Rokon是一个强大、可扩展、灵活的Android 2D游戏引擎，基于OpenGL ES技术开发，物理引擎为Box2D，因此能够实现一些较为复杂的物理效果，有人将它称为Cocos2d-iPhone引擎的Android版（因为业务逻辑和编码风格上也确实很像）。&#xA;项目地址：rokon&lt;/p&gt;&#xA;&lt;ol start=&#34;6&#34;&gt;&#xA;&lt;li&gt;LGame&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;LGame是一款国人开发的Java游戏引擎，有Android及PC(J2SE)两个开发版本。其底层绘图器LGrpaphics封装有J2SE以及J2ME提供的全部Graphics API（PC版采用Graphics2D封装，Android版采用Canvas模拟实现），所以能够将J2SE或J2ME开发经验直接套用其中，两版本间主要代码能够相互移植。Android版内置有Admob接口，可以不必配置XML直接硬编码Admob广告信息。该引擎除了基本的音效、图形、物理、精灵等常用组件以外，也内置有Ioc、xml、http等常用Java组件的封装，代价是jar体积较为庞大，PC版已突破1.2MB，Android版有所简化也在500KB左右。此外，该引擎还内置有按照1:1实现的J2ME精灵类及相关组件，可以将绝大多数 J2ME游戏平移到Android或PC版中。&#xA;项目地址：loon-simple&lt;/p&gt;&#xA;&lt;ol start=&#34;7&#34;&gt;&#xA;&lt;li&gt;OpenIntents&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;通过&amp;quot;Intents&amp;quot;，Android给连接软件和动态替换组件提供了优秀的基础。Google定义了一批intents（如：打电话啊，联系人清单上选择一个联系人，打开浏览器，电池更换的时候提供提示，等等，详细清单请看：available intents和intent class) 但是任何程序可以自由定义额外的intents和content-providers。我们可以很容易的联想到独立开发的程序（比如在这次的比赛中）极少有可能会和新定义的intents和接口良好的一起工作。我们这个项目的目标是收集很可能在多个项目中都有用的想法（而且很可能已经被其他独立程序员实现了），定义一批比较合理且扩展性比较好的一批intents和接口，提供基础但稳定有效的实现，可以被其他Android程序所应用的，特别是其他参加比赛的程序员们。OpenIntents本身也会参加这次的比赛。我们提供小的样品程序来演示OpenIntents的用法和特性。因为我们专注于经常被使用到的那些intents，Google也很可能在不久的将来提供他们自己的标准intents（比如关于日历的。。。）当那个发生的时候，我们会提供透明的接口来直接呼叫Google的实现方法，而你已有的程序可以直接使用Google的新功能而不需要改变任何东西。而且，由于你的程序在设计初期就是已经支持intents的了，当Google的intents出来的时候，你可以很方便的直接他们的intents。还有可能的是Google可能会借用一些OpenIntents开发的intents。无论如何，如果你的程序使用OpenIntents，在和其他使用OpenIntents程序提供互相支持的同时，你会得到额外的附加值，从而全面增强用户体验。&#xA;项目地址：openintents&lt;/p&gt;&#xA;&lt;ol start=&#34;8&#34;&gt;&#xA;&lt;li&gt;android-bluetooth&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Android Bluetooth API支持远程设备扫描、远程设备配对，服务发现（SDP）和客户端RFCOMM串行连接。&#xA;项目地址：android-bluetooth&lt;/p&gt;&#xA;&lt;ol start=&#34;9&#34;&gt;&#xA;&lt;li&gt;Android apktool&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Android apktool是一个用来处理APK文件的工具，可以对APK进行反编译生成程序的源代码和图片、XML配置、语言资源等文件，也可以添加新的功能到APK文件中。用该工具来汉化Android软件然后重新打包发布是相当简单的。&#xA;项目地址：android-apktool&lt;/p&gt;&#xA;&lt;ol start=&#34;10&#34;&gt;&#xA;&lt;li&gt;quake2android&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;quake2android是一个将《雷神之锤2》（Quake2）游戏移植到Android平台上的开源项目。支持谷歌Nexus One，三星Galaxy S，摩托罗拉Droid X等手机。&#xA;项目地址：quake2android&lt;/p&gt;&#xA;&lt;ol start=&#34;11&#34;&gt;&#xA;&lt;li&gt;AndEngine&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;AndEngine是一个开源的，基于OpenGL实现的Android 2D游戏引擎。这里提供一些基于AndEngine实现的示例。&#xA;项目地址：andengine&lt;/p&gt;&#xA;&lt;ol start=&#34;12&#34;&gt;&#xA;&lt;li&gt;android-opencv&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;android-opencv是一个将OpenCV移到Android手机平台的开源项目，该项目使用OpenCV最新的一个分枝并利用一个改良过的Android NDK进行构建。&#xA;项目地址：android-opencv&lt;/p&gt;&#xA;&lt;ol start=&#34;13&#34;&gt;&#xA;&lt;li&gt;android-dalvik-vm-on-java&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;android-dalvik-vm-on-java该项目的目标是开发一个采用Java实现的Android Dalvik虚拟机。目的是为了学习Dalvik VM的思想和架构。当前支持Dalvik可执行文件格式（.dex），完整的Dalvik指令系统，J2ME CLDC API，多线程（包括同步阻塞，等待和通知）。&#xA;项目地址：android-dalvik-vm-on-java&lt;/p&gt;&#xA;&lt;ol start=&#34;14&#34;&gt;&#xA;&lt;li&gt;Android PC_BCR&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Android PC_BCR让你能够使用你的Android手机做为PC机的外围条形码扫描仪。扫描的条形码将通过WiFi网络连接传PC机中。这个开源项目由多个组件组成，在手机设备上PC_BCR使用ZXing扫描仪器来扫描条形码，然后程序通过网络传到PC中，PC中有专门的PC_BCR程序接收。&#xA;项目地址：android-pcbcr&lt;/p&gt;</description>
			</item>
			<item>
				<title>创业编程七个错误认识</title>
				<link>https://blog.zhourunsheng.com/2011/07/%e5%88%9b%e4%b8%9a%e7%bc%96%e7%a8%8b%e4%b8%83%e4%b8%aa%e9%94%99%e8%af%af%e8%ae%a4%e8%af%86/</link>
				<pubDate>Mon, 04 Jul 2011 09:17:42 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/%e5%88%9b%e4%b8%9a%e7%bc%96%e7%a8%8b%e4%b8%83%e4%b8%aa%e9%94%99%e8%af%af%e8%ae%a4%e8%af%86/</guid>
				<description>&lt;p&gt;多少年来，人们普遍有一种看法，认为软件工程应该和其它种类的工程一样：仔细的设计，精确的规划，然后进行开发—严格按照设计说明书。就像修建一座桥梁，不是吗？这种开发方式的问题在于：软件，它是“软”的。它可以无限的延展。任何需要的时候你都可以大幅度的修改你的软件，人们也都是这么干的。还有，因为软件可以被拿来对任何事物进行模型造型，你能要求软件开发人员去实现的可能的东西几乎是无穷无尽。想要在软件里模拟集成电路吗？干吧。想管理银行？没问题。让五亿人和他们的朋友保持联系？为什么不呢？小菜一碟。不仅如此，在开发的中途我们还能要求程序员去做各种修改，这种事情经常的以一种不可预期的形式出现。&lt;/p&gt;&#xA;&lt;p&gt;这可不是像修桥那样。&lt;/p&gt;&#xA;&lt;p&gt;由于漠视这种需求不断变化的现实，多年来，无数的项目要么惨遭失败，要么巨额超出预算。所以，在总总的各种证据面前，整个行业为什么还要坚守这种错误的认识？很难说为什么。不过，最终，行业里开始出现一种新的认识：软件开发工作应该更好的响应需求的变化。事实上，为了适应这种需求上的变化，我们应该改进软件开发过程。没有比如今的web创业开发社区更欢迎这种趋势的了。所谓的敏捷开发方法已经开始流行，“lean start-up”运动号召对运行中的系统进行自动的或依据经验的超常快速变更响应。&lt;/p&gt;&#xA;&lt;p&gt;所以，我们都是好样的，不是吗？虽然行动的不是那么快。尽管有越来越多的敏捷开发方法被人们接受，仍然有大量的传统错误认识游荡在我们周围…这些认识大部分都该丢到脑后。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1-误解你应该招聘一些日本忍者式的程序员&#34;&gt;1. 误解：你应该招聘一些“日本忍者”式的程序员&lt;/h2&gt;&#xA;&lt;p&gt;对编程超人的迷信是硅谷创业公司中最普遍的一种病症：一个孤僻的程序员，以匹萨和咖啡因为能量，头戴耳麦，通宵不倦的开发一个复杂的系统，所有的东西都自己一个人来干。时过境迁了。软件开发已经发展成一种团体运动。所有的创业公司只要获得了任何有意义的成功，都会成长起来。一个编程独侠客能够胜任的情况放到一个10人的公司里后就不可行了。而且，更糟糕的是，鼓励逞英雄的行为会在开发团队里产生腐蚀性的机能障碍。始终如一的朝九晚五、日复一日编写出公司赖以生存的稳固功能代码的程序员，输给了能以通宵加班(通常只是一晚)来期望获得慷慨的褒奖的精明极端利己主义者。与其奖励这种英雄，不如培养出真正具有团队精神的员工。&lt;/p&gt;&#xA;&lt;h2 id=&#34;2-误解-程序员需要安静的工作避免打搅&#34;&gt;2. 误解: 程序员需要安静的工作，避免打搅&lt;/h2&gt;&#xA;&lt;p&gt;让人们独自的干活，这个听起来很有道理。每一次的打扰都是切实的中断你的思绪，而且你需要花很久才能重新找回那种“状态”。有些著名的软件公司甚至坚持要为每个程序员安排独立的办公室。他们这样就不会被打搅了，是吗？除非现代新形式的干扰并不会像一个真人拍你的肩头时引起你的分心，比如即时聊天工具，移动手机，Facebook，Twitter，电子邮件，以及从程序员头上戴的耳麦里传出的用于帮助集中精神的音乐。现实情况是，大多数的独自工作的程序员每天只花一小段时间用于真正的编程：各种形式的干扰事情层出不穷，整天他们都在进入状态和失去状态的循环中来来回回。然而，有个办法能解决这个问题：结对编程。两个程序员，一台电脑。没有Email，没有Twitter，没有手机电话(至少没有无计划的电话；你可以在有规律的间隔休息时间里处理这些事情)。如果按照这样做，你会收获一个完全编程的一天。而且，和他人一起工作，“进入状态”的过程几乎完全不费时间。这是一种完全不同的工作方式，我深信这种方式的效率远高于独自工作的形式。事实上，针对当前的办公室里的这些“电子设备引起的注意力分散”情况，我认为这是能让软件开发团队获得最高效率的唯一办法。&lt;/p&gt;&#xA;&lt;h2 id=&#34;3-误解-创业公司竞争激烈所以每个人都该干到精疲力竭为止&#34;&gt;3. 误解: 创业公司竞争激烈，所以每个人都该干到精疲力竭为止&lt;/h2&gt;&#xA;&lt;p&gt;没白没夜的加班加点并不能让你做的更多，做的更快。事实上，这会让你适得其反。不错，你觉得一周就能完成。但大部分的创业公司的开发计划都会比这个长，程序员通常需要持续几个月的进行开发(如果不是几年的话)来成功的完成一个产品。很多创业公司的行为表现就好象是这罐金子就放在那个墙角，只要能再努力一点就能拿到它。很快，开发人员的精力就被榨干了，如僵尸一般只是做出在加班的样子，没有任何的工作效率。高强度的工作，只是从短期来看会获得更多的工作效率。著名的开发公司Pivotal帮助过成百上千的创业公司开发过系统，从来都是严格按照40小时工作日来完成任务的。&lt;/p&gt;&#xA;&lt;h2 id=&#34;4-误解-工期紧必然需要走捷径&#34;&gt;4. 误解: 工期紧必然需要走捷径&lt;/h2&gt;&#xA;&lt;p&gt;很多团队都以市场压力大、需要立即发布产品为由，写出劣质的代码。写出的测试程序绕开问题部位；疯狂的攻坚冲锋中认真设计原则被抛在脑后。但是，作为各个软件开发团队，大家都一样。高效能的团队在成功之余不失英雄本色：正相反，当压力出现时，他们岿然不动，以自身深厚的功底成功化解任务。我们无数次听到过高压下出高成就的传奇故事—要么是军事行动、专业运动，要么是飞行员在河上强行降落—其中的原因无非是英雄们的那句话，“我们受过专门训练”。&lt;/p&gt;&#xA;&lt;h2 id=&#34;5-误解开发人员应该全权负责自己的代码&#34;&gt;5. 误解：开发人员应该全权负责自己的代码&lt;/h2&gt;&#xA;&lt;p&gt;负责自己的代码，听起来很正确。理所当然的。个人职责嘛。可是，开发团队里在代码上分配归属人就意味着每个模块的程序只有一个开发人员来写，只有一个人能掌握。这会导致负责模块的程序员之间产生“地方保护主义”。对于公司老板来说，这造成了很大的风险，因为团队中损失一个人就会影响整个团队的进程，如果这个人是负责系统的关键核心模块的，那更会造成公司业务瘫痪。健康的工作方式是让每个程序员都经手过系统内的所有代码。结对编程能让你实现这个效果，知识会从一个人传递到另一个人。所谓的“巴士指数”(团队中的多少人被车撞才会导致大家都无法进行)是一个软件创业公司的关键风险指标。我们这里所说的不仅仅指的是巴士在使坏，还有你的竞争对手，他们乐衷于挖走你最好的程序员。理解整个系统的人越多，你的公司就越健壮，越有活力。&lt;/p&gt;&#xA;&lt;h2 id=&#34;6-误解你需要一个怪异的招聘过程&#34;&gt;6. 误解：你需要一个怪异的招聘过程&lt;/h2&gt;&#xA;&lt;p&gt;你会在雇用一个演员时不进行试镜吗？如果要试，你就能短暂的做一回导演。这正是如今几乎所有的公司在招聘程序员时会出现的场景。通常的面试都会谈论应聘者的经验。这就完了。你可以想象一下，问一个踌躇满志的演员是否喜欢饰演哈姆雷特这个角色。你能传神的扮演他吗？好的。你被雇用了！很多著名的软件公司喜欢给应聘者出脑筋急转弯题。有些顶级的公司甚至给候选人进行IQ测试。他们中最可取的是在白板上模拟软件问题，让候选人解决。这些情况让人很无奈。我要说的是这非常明显的道理：招到好的程序员的唯一可靠的方法就是跟他们一起编程。我对程序员的面试是跟他们进行一个小时的快速的结对编程—而且这只是面试的一个开始。大量的筛选，把他们按满分100打分。什么样的会被选中？思维敏捷，抽象思考能力强，掌握各种算法，问题解决能力强。而最重要的是，领会能力。因为协作是对团队来说最重要的东西，如果你不能理解其他人是如何思考的，再聪明也没用。&lt;/p&gt;&#xA;&lt;h2 id=&#34;7-误解-专业化很重要&#34;&gt;7. 误解: 专业化很重要&lt;/h2&gt;&#xA;&lt;p&gt;非常自然的，管理者遇到问题时习惯把问题分解，各个击破。在开发团队里，这通常怂恿技术人员专项发展。前端开发，后台开发，数据库管理员等等。&lt;/p&gt;&#xA;&lt;h3 id=&#34;brad-feld&#34;&gt;Brad Feld&lt;/h3&gt;&#xA;&lt;p&gt;在他的博客里建议说，每个团队里都应该有个“全能程序员”，这个人是个真正的通才。他是对的，但他说的还不够。每个团队里的每个成员都应该是通才全才。为什么？因为专才导致团队脆弱。还记得“巴士指数”吗？每个专才都是一个弱点；如果他离开了，你找不到替代他的人，你完了。不仅如此，它还能使团队机能失调。专项的人需要把他们负责的系统里相互独立的模块通过定义好的接口相互通信。事实上，他们每人都写出了各自不统一通信方式。这导致了大量的额外开销，经常会出现“地方保护主义”或相互指责。而在著名的Pivotal公司，每个程序员都要接触到系统的各个层面，从HTML和JavaScript到Ruby，到数据库。而有些人认为专才会在系统的某个层面上更专业的，这种说法未必站得住脚。如今的软件技术变得已经不是那么复杂了。程序员能更容易的掌握各个层面上的知识以及如何操作它们。顺便说一下，这暗示出了另外一个非常重要的信息：你不再需要为某个特殊的技术而招聘人才了。缺少Ruby程序员？好，招一个Java程序员，培训他使用Ruby(这里使用结对编程格外的有效)。有些人称自己为“服务器端”程序员？没问题，让他们写JavaScript程序，他们很快就能学会。&lt;/p&gt;&#xA;&lt;p&gt;如果他们是人才，那就体现在这里。&lt;/p&gt;&#xA;&lt;p&gt;英文来源：What’s Your Start-up’s “Bus Count”? 7 Myths of Entrepreneurship and Programming 中文来源：http://www.aqee.net/2011/07/04/7-myths-of-entrepreneurship-and-programming/&lt;/p&gt;</description>
			</item>
			<item>
				<title>人人网的 OAuth2.0 认证实现</title>
				<link>https://blog.zhourunsheng.com/2011/07/%e4%ba%ba%e4%ba%ba%e7%bd%91%e7%9a%84-oauth2-0-%e8%ae%a4%e8%af%81%e5%ae%9e%e7%8e%b0/</link>
				<pubDate>Sat, 02 Jul 2011 18:58:59 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/%e4%ba%ba%e4%ba%ba%e7%bd%91%e7%9a%84-oauth2-0-%e8%ae%a4%e8%af%81%e5%ae%9e%e7%8e%b0/</guid>
				<description>&lt;p&gt;现在貌似只有人人网最开始使用了OAuth2.0的认证，估计后续这些SNS站点都开始实现了，相比较OAuth1.0来看，2.0的认证过程确实方便了很多。&lt;/p&gt;&#xA;&lt;p&gt;OAuth2.0 认证流程：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/renren-oauth20.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Java代码实现：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;package com.carey.renren.example;  &#xA;import java.io.UnsupportedEncodingException;&#xA;import java.net.URI;&#xA;import java.net.URLEncoder;&#xA;import java.util.Scanner;&#xA;import java.util.TreeMap;  &#xA;import com.carey.renren.RenRenHttpClient;&#xA;import com.carey.renren.RenRenOAuth;&#xA;import com.carey.renren.utils.RenRenHttpUtil;  &#xA;&#xA;public class RenRenMain {      &#xA; public static void main(String[] args) {        &#xA;    renrenRequest();    &#xA; }      &#xA;&#xA; private static void renrenRequest() {        &#xA;  if (!java.awt.Desktop.isDesktopSupported()) {            &#xA;     System.err.println(&amp;#34;Desktop is not supported (fatal)&amp;#34;);            &#xA;     System.exit(1);        &#xA;  }          &#xA;&#xA;  java.awt.Desktop desktop = java.awt.Desktop.getDesktop();          &#xA;  if (desktop == null || !desktop.isSupported(java.awt.Desktop.Action.BROWSE)) {            &#xA;      System.err.println(&amp;#34;Desktop doesn&amp;#39;t support the browse action&amp;#34;);            &#xA;      System.exit(1);        &#xA;  }                  &#xA;&#xA;  getAuthorizationCode(desktop);        &#xA;  //  界面返回：        &#xA;  //  http://graph.renren.com/oauth/login_success.html?code=ki2wk30AHg18KLWvriLA1rlf9tAUd1Um                 &#xA;&#xA;  getAccessToken(desktop);        &#xA;  // 界面返回：        &#xA;  //  {         //  &amp;#34;access_token&amp;#34;: &amp;#34;143511|5.57d2ad88cdd22398c03a2fcbb3bbd229.86400.1306422000-1167553647&amp;#34;,        &#xA;  // &amp;#34;expires_in&amp;#34;: 88680,        &#xA;  // &amp;#34;scope&amp;#34;: &amp;#34;email status_update publish_feed&amp;#34;        &#xA;  // }                  &#xA;&#xA;  getSessionToken(desktop);        &#xA;  // 界面返回：        &#xA;  //{&amp;#34;renren_token&amp;#34;:{&amp;#34;session_secret&amp;#34;:&amp;#34;ca076de790d8fc2470cb7b9da2c936f9&amp;#34;,&amp;#34;expires_in&amp;#34;:88667,        &#xA;  // &amp;#34;session_key&amp;#34;:&amp;#34;5.57d2ad88cdd22398c03a2fcbb3bbd229.86400.1306422000-1167553647&amp;#34;},        &#xA;  // &amp;#34;oauth_token&amp;#34;:&amp;#34;143511|5.57d2ad88cdd22398c03a2fcbb3bbd229.86400.1306422000-1167553647&amp;#34;,&amp;#34;user&amp;#34;:{&amp;#34;id&amp;#34;:1167553647}}&#xA;&#xA;  testAPI();        &#xA;  //  获取用户基本信息，输出结果为：        &#xA;  // [{&amp;#34;uid&amp;#34;:1167553647,&amp;#34;tinyurl&amp;#34;:&amp;#34;http://hd34.xiaonei.com/photos/hd34/20080322/13/30/tiny_22p107.jpg&amp;#34;,&amp;#34;vip&amp;#34;:1,&amp;#34;sex&amp;#34;:1,  &#xA;  //  &amp;#34;name&amp;#34;:&amp;#34;周润生&amp;#34;,&amp;#34;star&amp;#34;:1,&amp;#34;headurl&amp;#34;:&amp;#34;http://hd34.xiaonei.com/photos/hd34/20080322/13/30/head_22p107.jpg&amp;#34;,&amp;#34;zidou&amp;#34;:0}]&#xA; }          &#xA;&#xA; private static void getAuthorizationCode(java.awt.Desktop desktop) {        &#xA;  System.out.println(&amp;#34;get Authorization Code......&amp;#34;);                  &#xA;  try {            &#xA;   String urlStr = RenRenOAuth.AuthorizationURL + &amp;#34;?&amp;#34; + &amp;#34;client_id=&amp;#34;  + RenRenOAuth.APIKey + &amp;#34;&amp;amp;&amp;#34; + &amp;#34;response_type=code&amp;#34;&#xA;    + &amp;#34;&amp;amp;redirect_uri=&amp;#34; + RenRenOAuth.RedirectURL;            &#xA;   System.out.println(&amp;#34;authorization url: n&amp;#34; + urlStr);              &#xA;   desktop.browse(new URI(urlStr));        &#xA;  } catch (Exception e) {            &#xA;   e.printStackTrace();        &#xA;  }    &#xA; }  &#xA;&#xA; private static void getAccessToken(java.awt.Desktop desktop) {        &#xA;  System.out.println(&amp;#34;get Access Token......&amp;#34;);          &#xA;        System.out.println(&amp;#34;Input your Authorization code：&amp;#34;);       &#xA;  Scanner in = new Scanner(System.in);        &#xA;  String input = in.nextLine();          &#xA;&#xA;  try {           &#xA;   String urlStr = RenRenOAuth.OAuthURL + &amp;#34;?&amp;#34; + &amp;#34;client_id=&amp;#34; + RenRenOAuth.APIKey + &amp;#34;&amp;amp;client_secret=&amp;#34; + RenRenOAuth.SecretKey + &amp;#34;&amp;amp;redirect_uri=&amp;#34;    &#xA;    + RenRenOAuth.RedirectURL  + &amp;#34;&amp;amp;grant_type=authorization_code&amp;#34; + &amp;#34;&amp;amp;code=&amp;#34; + input;            &#xA;   System.out.println(&amp;#34;access url: n&amp;#34; + urlStr);              &#xA;   desktop.browse(new URI(urlStr));        &#xA;  } catch (Exception e) {&#xA;   e.printStackTrace();&#xA;  }   &#xA; }     &#xA;&#xA; private static void getSessionToken(java.awt.Desktop desktop) {&#xA;  System.out.println(&amp;#34;get Session Token......&amp;#34;);&#xA;  System.out.println(&amp;#34;Input your Access token：&amp;#34;); &#xA;  Scanner in = new Scanner(System.in);       &#xA;  String input = in.nextLine();                 &#xA;&#xA;  try {            &#xA;   input = URLEncoder.encode(input, &amp;#34;UTF-8&amp;#34;);       &#xA;  } catch (UnsupportedEncodingException e1) {            &#xA;   e1.printStackTrace();        &#xA;  }          &#xA;&#xA;  try {            &#xA;   String urlStr = RenRenOAuth.SessionURL + &amp;#34;?&amp;#34; + &amp;#34;oauth_token=&amp;#34; + input;            &#xA;   System.out.println(&amp;#34;session url: n&amp;#34; + urlStr);              &#xA;   desktop.browse(new URI(urlStr));        &#xA;  } catch (Exception e) {            &#xA;   e.printStackTrace();        &#xA;  }    &#xA; }          &#xA;&#xA; private static void testAPI() {        &#xA;  System.out.println(&amp;#34;Input your Session Token：&amp;#34;);        &#xA;  //Scanner in = new Scanner(System.in);        &#xA;  //String input = in.nextLine();                  &#xA;  String input = &amp;#34;5.57d2ad88cdd22398c03a2fcbb3bbd229.86400.1306422000-1167553647&amp;#34;;                  &#xA;  TreeMap params = new TreeMap();        &#xA;  params.put(&amp;#34;session_key&amp;#34;, input);        &#xA;&#xA;  //params.put(&amp;#34;method&amp;#34;, &amp;#34;friends.get&amp;#34;);                  &#xA;  params.put(&amp;#34;method&amp;#34;, &amp;#34;users.getInfo&amp;#34;);        &#xA;  params.put(&amp;#34;uids&amp;#34;, &amp;#34;1167553647&amp;#34;);                  &#xA;  String content = sendPostRestRequest(params, &amp;#34;JSON&amp;#34;, RenRenOAuth.ApiUrl);        &#xA;  if (content.indexOf(&amp;#34;error_code&amp;#34;) &amp;gt;= 0) {            &#xA;   //error        &#xA;  }        &#xA;&#xA;  System.out.println(content);    &#xA; }          &#xA;&#xA; public static String sendPostRestRequest(TreeMap params, String format, String url) {       &#xA;  RenRenHttpUtil.prepareParams(params, format);        &#xA;  String content = RenRenHttpClient.doPost(url, params);        &#xA;  return content;    &#xA; }&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;上面代码的实现过程和OAuth2.0的认证流程相互一致，其他主要功能函数实现如下：&lt;/p&gt;</description>
			</item>
			<item>
				<title>同步wordpress文章到百度空间</title>
				<link>https://blog.zhourunsheng.com/2011/07/%e5%90%8c%e6%ad%a5wordpress%e6%96%87%e7%ab%a0%e5%88%b0%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/</link>
				<pubDate>Sat, 02 Jul 2011 17:49:27 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/%e5%90%8c%e6%ad%a5wordpress%e6%96%87%e7%ab%a0%e5%88%b0%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/</guid>
				<description>&lt;p&gt;本文实现了wordpress的插件开发，自动同步 wordpress 的文章到百度空间。&lt;/p&gt;&#xA;&lt;p&gt;== Description ==同步发布 WordPress 博文到百度空间.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;支持设置发布到百度空间中文章的评论权限。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;支持设置发布到百度空间中文章的访问权限。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;支持设置发布到百度空间中文章的转载权限。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;支持将Wordpress中文章链接发布到百度空间。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;支持发布到百度空间中文章的自动归类&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;== Installation ==&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;上传整个文件夹 wp2baiduzone 到 &lt;code&gt;/wp-content/plugins/&lt;/code&gt; 目录&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;后台控制面板&amp;quot;插件(Plugins)&amp;ldquo;中激活 wp2baiduzone 插件&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;后台控制面板&amp;quot;配置(Settings)-&amp;gt;wp2baiduzone&amp;quot;中配置插件信息（百度空间的账户信息和博文同步的权限信息）&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;软件配置界面：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/wordpress-baidu.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;下载地址：http://wordpress.org/extend/plugins/wp2baiduzone/&lt;/p&gt;&#xA;&lt;h2 id=&#34;变更历史&#34;&gt;变更历史&lt;/h2&gt;&#xA;&lt;p&gt;时间：2012-06-26&lt;/p&gt;&#xA;&lt;p&gt;鉴于最近百度空间进行了升级，所以原有的插件在新环境下可能无法正常工作，为了不影响新旧空间所有用户的使用，插件暂时没有做更新，对新版的百度空间做了一款补充插件，和原有插件的文件名都相同，下载下来替换掉现有的插件即可，部分功能有变更，待后续完善，下载地址 wp2baiduzone(20120626).zip.&lt;/p&gt;&#xA;&lt;p&gt;时间：2013-09-19 新版的百度空间已经稳定了，插件目前更新到1.3稳定版本，可以进行同步。&lt;/p&gt;</description>
			</item>
			<item>
				<title>通过GAE平台自动发布文章到百度空间</title>
				<link>https://blog.zhourunsheng.com/2011/07/%e9%80%9a%e8%bf%87gae%e5%b9%b3%e5%8f%b0%e8%87%aa%e5%8a%a8%e5%8f%91%e5%b8%83%e6%96%87%e7%ab%a0%e5%88%b0%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/</link>
				<pubDate>Sat, 02 Jul 2011 17:37:47 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/%e9%80%9a%e8%bf%87gae%e5%b9%b3%e5%8f%b0%e8%87%aa%e5%8a%a8%e5%8f%91%e5%b8%83%e6%96%87%e7%ab%a0%e5%88%b0%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/</guid>
				<description>&lt;p&gt;昨天写了一篇通过Java程序自动发送文章到百度空间，具体实现原理和代码请参照&amp;lt;&amp;lt;Java程序自动发布文章到百度空间&amp;gt;&amp;gt;今天把那版代码进行了更新，现在可以放置到GAE平台了，这样基于GAE平台环境搭建的个人博客就可以很方便的将个人的博文同步到百度空间。&lt;/p&gt;&#xA;&lt;p&gt;具体的实现原理现在不多说了，现在展示一下核心代码：1.&lt;/p&gt;&#xA;&lt;p&gt;Config.Java 配置个人百度空间的账户名和密码&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;package com.carey.baidublog;  &#xA;&#xA;public class Config {    &#xA; public static final String USERNAME = &amp;#34;username&amp;#34;;    &#xA; public static final String PASSWORD = &amp;#34;password&amp;#34;;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;GAEPublishBaiduActicleServlet.java 用来处理GAE的servlet请求&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;package com.carey.gae.baidu;  &#xA;import java.io.IOException;&#xA;import javax.servlet.http.*;  &#xA;import com.carey.baidublog.BDHttpClient;  &#xA;&#xA;public class GAEPublishBaiduActicleServlet extends HttpServlet {    &#xA; private static final long serialVersionUID = 1L;      &#xA;&#xA; public void doGet(HttpServletRequest req, HttpServletResponse resp)  throws IOException {        &#xA;  try {         &#xA;   BDHttpClient.publishBlog(&amp;#34;gae-title&amp;#34;, &amp;#34;gae-content&amp;#34;, &amp;#34;gae-category&amp;#34;);        &#xA;  } catch (Exception e) {            &#xA;   e.printStackTrace();        &#xA;  }          &#xA;&#xA;  resp.setContentType(&amp;#34;text/plain&amp;#34;);        &#xA;  resp.getWriter().println(&amp;#34;成功发布一篇博文到百度空间&amp;#34;);    &#xA; }&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;BDHttpClient.java 完成百度博文的发布&lt;/p&gt;</description>
			</item>
			<item>
				<title>Java程序自动发布文章到百度空间</title>
				<link>https://blog.zhourunsheng.com/2011/07/java%e7%a8%8b%e5%ba%8f%e8%87%aa%e5%8a%a8%e5%8f%91%e5%b8%83%e6%96%87%e7%ab%a0%e5%88%b0%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/</link>
				<pubDate>Sat, 02 Jul 2011 17:20:20 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/java%e7%a8%8b%e5%ba%8f%e8%87%aa%e5%8a%a8%e5%8f%91%e5%b8%83%e6%96%87%e7%ab%a0%e5%88%b0%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/</guid>
				<description>&lt;p&gt;这几天建立了个博客，想把这个博客的内容同时导入到其他博客中去，同时，当在本博客发表一篇博文的时候，也同步传输到其他博客中去，这样就方便多了，以后只要维护一个就ok了。&lt;/p&gt;&#xA;&lt;p&gt;CSDN的博客开放的比较好，符合 &lt;a href=&#34;http://www.xmlrpc.com/metaWeblogApi&#34;&gt;http://www.xmlrpc.com/metaWeblogApi&lt;/a&gt; 标准，可以有开放的API来调用，容易解决。&lt;/p&gt;&#xA;&lt;p&gt;目前遇到的问题就是导入博文到百度空间，貌似百度现在还没有做出什么开放的API来，没办法来直接调用，不过也有方法来解决，那就是通过程序来模拟浏览器的登录过程和发表文章的过程，通过测试，搞定。。O(∩_∩)O哈哈~下面介绍一下程序的思路和展示一下源码：1.&lt;/p&gt;&#xA;&lt;p&gt;基本思路就是通过程序来模拟浏览器的登录过程，本文的代码基于Java语言实现，主要利用的就是Apache的HttpClient包。&lt;/p&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;大家首先可以利用浏览器的插件来捕获我们正常到百度登录过程，和发表博文过程的所有Http请求的数据，着重分析一下表单数据的提交，就可以知道百度空间发文在后台做了那些操作和需要哪些重要的数据来验证用户的正常登录。&lt;/p&gt;&#xA;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;用程序来模拟浏览器登录的最重要的处理，就是Cookie的保存和后续数据的传输，因为像百度这类需要用户输入账户和密码来登录的系统，并且具有密码记忆功能的网站，用户的验证信息都存储在Cookie中。&lt;/p&gt;&#xA;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;因为为了让百度服务器识别用户的登录，那就要在程序中记录第一次登录过程的Cookie数据，然后在以后的http请求中将cookie数据回传给服务器，那样服务器就认为你一直登录了，不然文章是不能正确发布出去的，因为你没有cookie的话，服务器还认为你没有登录过，会拒绝操作。&lt;/p&gt;&#xA;&lt;ol start=&#34;5&#34;&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;用户的身份验证解决了以后，百度发表文章的时候，还要多加一步验证，就是通过访问新建博文的页面，获取一个临时的百度 token，它会与你接下来发表的博文一一对应，我猜测可能是服务器支持单用户多点登录，同时发表多篇博文吧，不过这都没关系了，反正我们照做就行啦。&lt;/p&gt;&#xA;&lt;ol start=&#34;6&#34;&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;文章分类的处理，我发现百度这边做的不够智能，如果你发表博文的时候，指定了一个不存在的类别，直接决绝发布，所以，还是想个笨点的办法，每次发布博文前，先建立一个类别，如果已经有了这个类型，重新建立一次也没关系，反正也不会覆盖掉，因为百度会拒绝建立新的类别，错误类型是类别已存在，这个善意的错误忽略就ok。。。哈哈 7.&lt;/p&gt;&#xA;&lt;p&gt;所有这些前期工作做好了，就能正常发布文章了，下面贴出一下源码文件，大家按照自己的方式去修改吧：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Config.java&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;主要配置一下个人百度账号的用户名和密码&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;package com.carey.baidublog;   &#xA; public class Config {    &#xA; public static final String USERNAME = &amp;#34;username&amp;#34;;    &#xA; public static final String PASSWORD = &amp;#34;password&amp;#34;;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;PublishBlog.java&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;测试程序，调用函数发布文章到百度空间&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;package com.carey.baidublog;  &#xA;public class PublistBlog {    &#xA; public static void main(String[] args) {        &#xA;  try {            &#xA;   BDHttpClient.publishBlog(&amp;#34;Article-Title&amp;#34;, &amp;#34;Article-Content&amp;#34;,  &amp;#34;Article-category&amp;#34;);            &#xA;   System.out.println(&amp;#34;成功发布一篇文章到百度空间&amp;#34;);        &#xA;  } catch (Exception e) {            &#xA;      e.printStackTrace();        &#xA;  }    &#xA; }&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;BDHttpClient.java&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;发布百度博文的实现类，主要是http请求和cookie的处理，以及获取百度令牌token&lt;/p&gt;</description>
			</item>
			<item>
				<title>AIR for Android 之源码和实现原理分析</title>
				<link>https://blog.zhourunsheng.com/2011/07/air-for-android-%e4%b9%8b%e6%ba%90%e7%a0%81%e5%92%8c%e5%ae%9e%e7%8e%b0%e5%8e%9f%e7%90%86%e5%88%86%e6%9e%90/</link>
				<pubDate>Sat, 02 Jul 2011 15:55:24 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/air-for-android-%e4%b9%8b%e6%ba%90%e7%a0%81%e5%92%8c%e5%ae%9e%e7%8e%b0%e5%8e%9f%e7%90%86%e5%88%86%e6%9e%90/</guid>
				<description>&lt;p&gt;airbootstap.jar 的实现机制简单来说其实就是：&lt;/p&gt;&#xA;&lt;p&gt;通过继承Android的Activity来实现一个新的Activity（AppEntry），它通过“com.adobe.air.AndroidActivityWrapper” 封装实现了Android中Activity本身的方法，例如onResume，onPause等等，废话不说，直接上源码，相信大家浏览过一遍就基本清楚了。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;package air.app;&#xA;&#xA;import java.lang.reflect.Method;&#xA;import java.net.URISyntaxException;&#xA;&#xA;import android.app.Activity;&#xA;import android.app.AlertDialog;&#xA;import android.app.Dialog;&#xA;import android.content.ActivityNotFoundException;&#xA;import android.content.ComponentName;&#xA;import android.content.Context;&#xA;import android.content.DialogInterface;&#xA;import android.content.Intent;&#xA;import android.content.ServiceConnection;&#xA;import android.content.pm.PackageInfo;&#xA;import android.content.pm.PackageManager;&#xA;import android.content.res.Configuration;&#xA;import android.content.res.Resources;&#xA;import android.graphics.Bitmap;&#xA;import android.graphics.Canvas;&#xA;import android.os.Bundle;&#xA;import android.os.IBinder;&#xA;import android.os.Process;&#xA;import android.util.AttributeSet;&#xA;import android.view.ContextMenu;&#xA;import android.view.KeyEvent;&#xA;import android.view.Menu;&#xA;import android.view.MenuItem;&#xA;import android.view.MotionEvent;&#xA;import android.view.View;&#xA;import android.view.WindowManager;&#xA;import dalvik.system.DexClassLoader;&#xA;&#xA;public class AppEntry extends Activity {&#xA; private static final String LOG_TAG = &amp;#34;AppEntry&amp;#34;;&#xA; private static String RUNTIME_PACKAGE_ID = &amp;#34;com.adobe.air&amp;#34;;&#xA; private static Object sAndroidActivityWrapper = null;&#xA; private static Class&amp;lt;?&amp;gt; sAndroidActivityWrapperClass;&#xA; private static boolean sDexLoaded = false;&#xA; private static DexClassLoader sDloader;&#xA;&#xA; /**&#xA;  * Activity 的 启动函数，用来初始化Adobe AIR的环境&#xA;  * */&#xA; public void onCreate(Bundle paramBundle) {&#xA;  super.onCreate(paramBundle);&#xA;  if (!isRuntimeInstalled()) {&#xA;   showDialog();&#xA;  } else {&#xA;   loadDexAndCreateActivityWrapper();&#xA;   if (!sDexLoaded) {&#xA;    launchAIRService();&#xA;   } else {&#xA;    InvokeWrapperOnCreate();&#xA;   }&#xA;  }&#xA; }&#xA;&#xA; /**&#xA;  * 执行指定的方法：paramMethod为方法名，paramArrayOfObject为方法的参数&#xA;  *&#xA;  * */&#xA; private Object InvokeMethod(Method paramMethod, Object[] paramArrayOfObject) {&#xA;  Object localObject1 = null;&#xA;  if (!sDexLoaded) {&#xA;   return localObject1;&#xA;  }&#xA;&#xA;  try {&#xA;   if (paramArrayOfObject != null) {&#xA;    localObject1 = paramMethod.invoke(sAndroidActivityWrapper,&#xA;      paramArrayOfObject);&#xA;   } else {&#xA;    Object[] arrayOfObject = new Object[0];&#xA;    localObject1 = paramMethod.invoke(sAndroidActivityWrapper,&#xA;      arrayOfObject);&#xA;   }&#xA;  } catch (Exception localException) {&#xA;  }&#xA;  return localObject1;&#xA; }&#xA;&#xA; /**&#xA;  * 主要用来初始化Activity的包装类 sAndroidActivityWrapperClass， 后续的方法调用都是通过它来的&#xA;  * */&#xA; private void InvokeWrapperOnCreate() {&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[2];&#xA;   arrayOfClass[0] = Activity.class;&#xA;   arrayOfClass[1] = String[].class;&#xA;   Method localMethod = localClass.getMethod(&amp;#34;onCreate&amp;#34;, arrayOfClass);&#xA;   Boolean localBoolean1 = new Boolean(false);&#xA;   Boolean localBoolean2 = new Boolean(true);&#xA;   String[] arrayOfString = new String[5];&#xA;   arrayOfString[0] = &amp;#34;&amp;#34;;&#xA;   arrayOfString[1] = &amp;#34;&amp;#34;;&#xA;   arrayOfString[2] = &amp;#34;-nodebug&amp;#34;;&#xA;   arrayOfString[3] = localBoolean1.toString();&#xA;   arrayOfString[4] = localBoolean2.toString();&#xA;&#xA;   Object[] arrayOfObject = new Object[2];&#xA;   arrayOfObject[0] = this;&#xA;   arrayOfObject[1] = arrayOfString;&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; private static void KillSelf() {&#xA;  Process.killProcess(Process.myPid());&#xA; }&#xA;&#xA; /**&#xA;  * 用来启动Adobe AIR service服务&#xA;  * */&#xA; private void launchAIRService() {&#xA;  try {&#xA;   Intent localIntent1 = new Intent(&amp;#34;com.adobe.air.AIRServiceAction&amp;#34;);&#xA;   localIntent1.setClassName(RUNTIME_PACKAGE_ID,&#xA;     &amp;#34;com.adobe.air.AIRService&amp;#34;);&#xA;&#xA;   bindService(localIntent1, new ServiceConnection() {&#xA;&#xA;    @Override&#xA;    public void onServiceConnected(ComponentName arg0, IBinder arg1) {&#xA;     unbindService(this);&#xA;     loadDexAndCreateActivityWrapper();&#xA;     if (AppEntry.sDexLoaded) {&#xA;      InvokeWrapperOnCreate();&#xA;     } else {&#xA;      AppEntry.KillSelf();&#xA;     }&#xA;    }&#xA;&#xA;    @Override&#xA;    public void onServiceDisconnected(ComponentName arg0) {&#xA;    }&#xA;&#xA;   }, 1);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; /**&#xA;  * 启动Android Market 来下载 Adobe AIR for Android 的apk程序&#xA;  * */&#xA; private void launchMarketPlaceForAIR() {&#xA;  String str2 = null;&#xA;  try {&#xA;   PackageManager localPackageManager = getPackageManager();&#xA;   ComponentName localComponentName = getComponentName();&#xA;   Bundle localBundle = localPackageManager.getActivityInfo(&#xA;     localComponentName, 128).metaData;&#xA;   if (localBundle != null) {&#xA;    str2 = (String) localBundle.get(&amp;#34;airDownloadURL&amp;#34;);&#xA;   }&#xA;  } catch (android.content.pm.PackageManager.NameNotFoundException namenotfoundexception) {&#xA;  }&#xA;&#xA;  if (str2 == null) {&#xA;   StringBuilder localStringBuilder = new StringBuilder()&#xA;     .append(&amp;#34;market://details?id=&amp;#34;);&#xA;   str2 = localStringBuilder.append(RUNTIME_PACKAGE_ID).toString();&#xA;  }&#xA;  BroadcastIntent(&amp;#34;android.intent.action.VIEW&amp;#34;, str2);&#xA; }&#xA;&#xA; /**&#xA;  * 创建 DexClassLoader， sAndroidActivityWrapperClass 和 初始化&#xA;  * sAndroidActivityWrapper（通过调用方法CreateAndroidActivityWrapper）&#xA;  * */&#xA; private void loadDexAndCreateActivityWrapper() {&#xA;  try {&#xA;   if (!sDexLoaded) {&#xA;    Context localContext = createPackageContext(RUNTIME_PACKAGE_ID,&#xA;      3);&#xA;    String str2 = RUNTIME_PACKAGE_ID;&#xA;    String str3 = getFilesDir().getAbsolutePath();&#xA;    ClassLoader localClassLoader = localContext.getClassLoader();&#xA;    sDloader = new DexClassLoader(str2, str3, null,&#xA;      localClassLoader);&#xA;    sAndroidActivityWrapperClass = sDloader&#xA;      .loadClass(&amp;#34;com.adobe.air.AndroidActivityWrapper&amp;#34;);&#xA;    if (sAndroidActivityWrapperClass != null) {&#xA;     sDexLoaded = true;&#xA;    }&#xA;   }&#xA;&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[1];&#xA;   arrayOfClass[0] = Activity.class;&#xA;   Method localMethod = localClass.getMethod(&#xA;     &amp;#34;CreateAndroidActivityWrapper&amp;#34;, arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[1];&#xA;   arrayOfObject[0] = this;&#xA;   sAndroidActivityWrapper = localMethod.invoke(null, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; /**&#xA;  * 用来启动 Activity&#xA;  * */&#xA; public void BroadcastIntent(String paramString1, String paramString2) {&#xA;  try {&#xA;   Intent localIntent = Intent.parseUri(paramString2, 0)&#xA;     .setAction(paramString1).addFlags(268435456);&#xA;   startActivity(localIntent);&#xA;  } catch (ActivityNotFoundException localActivityNotFoundException) {&#xA;  } catch (URISyntaxException localURISyntaxException) {&#xA;  }&#xA; }&#xA;&#xA; public void finishActivityFromChild(Activity paramActivity, int paramInt) {&#xA;  super.finishActivityFromChild(paramActivity, paramInt);&#xA;  try {&#xA;   Class localClass1 = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[2];&#xA;   arrayOfClass[0] = Activity.class;&#xA;   arrayOfClass[1] = Integer.TYPE;&#xA;   Method localMethod = localClass1.getMethod(&#xA;     &amp;#34;finishActivityFromChild&amp;#34;, arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[2];&#xA;   arrayOfObject[0] = paramActivity;&#xA;   Integer localInteger = Integer.valueOf(paramInt);&#xA;   arrayOfObject[1] = localInteger;&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; public void finishFromChild(Activity paramActivity) {&#xA;  super.finishFromChild(paramActivity);&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[1];&#xA;   arrayOfClass[0] = Activity.class;&#xA;   Method localMethod = localClass.getMethod(&amp;#34;finishFromChild&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[1];&#xA;   arrayOfObject[0] = paramActivity;&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; /**&#xA;  * 通过 getPackageInfo 的方法来测试 Adobe AIR 环境是否ready，如果抛出异常， 说明Adobe&#xA;  * AIR的相关软件还没有安装&#xA;  * */&#xA; public boolean isRuntimeInstalled() {&#xA;  PackageManager localPackageManager = getPackageManager();&#xA;  int i;&#xA;  try {&#xA;   PackageInfo localPackageInfo = localPackageManager.getPackageInfo(&#xA;     RUNTIME_PACKAGE_ID, 256);&#xA;   i = 1;&#xA;  } catch (PackageManager.NameNotFoundException localNameNotFoundException) {&#xA;   i = 0;&#xA;  }&#xA;&#xA;  return i == 1;&#xA; }&#xA;&#xA; protected void onActivityResult(int paramInt1, int paramInt2,&#xA;   Intent paramIntent) {&#xA;  try {&#xA;   if (sDexLoaded) {&#xA;    Class localClass1 = sAndroidActivityWrapperClass;&#xA;    Class[] arrayOfClass = new Class[3];&#xA;    arrayOfClass[0] = Integer.TYPE;&#xA;    arrayOfClass[1] = Integer.TYPE;&#xA;    arrayOfClass[2] = Intent.class;&#xA;    Method localMethod = localClass1.getMethod(&amp;#34;onActivityResult&amp;#34;,&#xA;      arrayOfClass);&#xA;    Object[] arrayOfObject = new Object[3];&#xA;    Integer localInteger1 = Integer.valueOf(paramInt1);&#xA;    arrayOfObject[0] = localInteger1;&#xA;    Integer localInteger2 = Integer.valueOf(paramInt2);&#xA;    arrayOfObject[1] = localInteger2;&#xA;    arrayOfObject[2] = paramIntent;&#xA;    InvokeMethod(localMethod, arrayOfObject);&#xA;   }&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; protected void onApplyThemeResource(Resources.Theme paramTheme,&#xA;   int paramInt, boolean paramBoolean) {&#xA;  super.onApplyThemeResource(paramTheme, paramInt, paramBoolean);&#xA;  try {&#xA;   Class localClass1 = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[3];&#xA;   arrayOfClass[0] = Resources.Theme.class;&#xA;   arrayOfClass[1] = Integer.TYPE;&#xA;   arrayOfClass[2] = Boolean.TYPE;&#xA;   Method localMethod = localClass1.getMethod(&amp;#34;onApplyThemeResource&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[3];&#xA;   arrayOfObject[0] = paramTheme;&#xA;   Integer localInteger = Integer.valueOf(paramInt);&#xA;   arrayOfObject[1] = localInteger;&#xA;   Boolean localBoolean = Boolean.valueOf(paramBoolean);&#xA;   arrayOfObject[2] = localBoolean;&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; public void onAttachedToWindow() {&#xA;  super.onAttachedToWindow();&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[0];&#xA;   Method localMethod = localClass.getMethod(&amp;#34;onAttachedToWindow&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[0];&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; public void onBackPressed() {&#xA;  super.onBackPressed();&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[0];&#xA;   Method localMethod = localClass.getMethod(&amp;#34;onBackPressed&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[0];&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; protected void onChildTitleChanged(Activity paramActivity,&#xA;   CharSequence paramCharSequence) {&#xA;  super.onChildTitleChanged(paramActivity, paramCharSequence);&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[2];&#xA;   arrayOfClass[0] = Activity.class;&#xA;   arrayOfClass[1] = CharSequence.class;&#xA;   Method localMethod = localClass.getMethod(&amp;#34;onChildTitleChanged&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[2];&#xA;   arrayOfObject[0] = paramActivity;&#xA;   arrayOfObject[1] = paramCharSequence;&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; public void onConfigurationChanged(Configuration paramConfiguration) {&#xA;  super.onConfigurationChanged(paramConfiguration);&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[1];&#xA;   arrayOfClass[0] = Configuration.class;&#xA;   Method localMethod = localClass.getMethod(&amp;#34;onConfigurationChanged&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[1];&#xA;   arrayOfObject[0] = paramConfiguration;&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; public void onContentChanged() {&#xA;  super.onContentChanged();&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[0];&#xA;   Method localMethod = localClass.getMethod(&amp;#34;onContentChanged&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[0];&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; public boolean onContextItemSelected(MenuItem paramMenuItem) {&#xA;  boolean bool1 = super.onContextItemSelected(paramMenuItem);&#xA;  boolean bool3;&#xA;  try {&#xA;   Class localClass1 = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[2];&#xA;   arrayOfClass[0] = MenuItem.class;&#xA;   arrayOfClass[1] = Boolean.TYPE;&#xA;   Method localMethod = localClass1.getMethod(&amp;#34;onContextItemSelected&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[2];&#xA;   arrayOfObject[0] = paramMenuItem;&#xA;   Boolean localBoolean = Boolean.valueOf(bool1);&#xA;   arrayOfObject[1] = localBoolean;&#xA;   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))&#xA;     .booleanValue();&#xA;  } catch (Exception localException) {&#xA;   bool3 = bool1;&#xA;  }&#xA;  return bool3;&#xA; }&#xA;&#xA; public void onContextMenuClosed(Menu paramMenu) {&#xA;  super.onContextMenuClosed(paramMenu);&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[1];&#xA;   arrayOfClass[0] = Menu.class;&#xA;   Method localMethod = localClass.getMethod(&amp;#34;onContextMenuClosed&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[1];&#xA;   arrayOfObject[0] = paramMenu;&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; public void onCreateContextMenu(ContextMenu paramContextMenu,&#xA;   View paramView, ContextMenu.ContextMenuInfo paramContextMenuInfo) {&#xA;  super.onCreateContextMenu(paramContextMenu, paramView,&#xA;    paramContextMenuInfo);&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[3];&#xA;   arrayOfClass[0] = ContextMenu.class;&#xA;   arrayOfClass[1] = View.class;&#xA;   arrayOfClass[2] = ContextMenu.ContextMenuInfo.class;&#xA;   Method localMethod = localClass.getMethod(&amp;#34;onCreateContextMenu&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[3];&#xA;   arrayOfObject[0] = paramContextMenu;&#xA;   arrayOfObject[1] = paramView;&#xA;   arrayOfObject[2] = paramContextMenuInfo;&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; public CharSequence onCreateDescription() {&#xA;  CharSequence localCharSequence = super.onCreateDescription();&#xA;  Object localObject;&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[1];&#xA;   arrayOfClass[0] = CharSequence.class;&#xA;   Method localMethod = localClass.getMethod(&amp;#34;onCreateDescription&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[1];&#xA;   arrayOfObject[0] = localCharSequence;&#xA;   localObject = (CharSequence) InvokeMethod(localMethod,&#xA;     arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;   localObject = localCharSequence;&#xA;  }&#xA;  return (CharSequence) localObject;&#xA; }&#xA;&#xA; protected Dialog onCreateDialog(int paramInt) {&#xA;  Dialog localDialog = super.onCreateDialog(paramInt);&#xA;  Object localObject;&#xA;  try {&#xA;   Class localClass1 = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[2];&#xA;   arrayOfClass[0] = Integer.TYPE;&#xA;   arrayOfClass[1] = Dialog.class;&#xA;   Method localMethod = localClass1.getMethod(&amp;#34;onCreateDialog&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[2];&#xA;   Integer localInteger = Integer.valueOf(paramInt);&#xA;   arrayOfObject[0] = localInteger;&#xA;   arrayOfObject[1] = localDialog;&#xA;   localObject = (Dialog) InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;   localObject = localDialog;&#xA;  }&#xA;  return (Dialog) localObject;&#xA; }&#xA;&#xA; protected Dialog onCreateDialog(int paramInt, Bundle paramBundle) {&#xA;  Dialog localDialog = super.onCreateDialog(paramInt, paramBundle);&#xA;  Object localObject;&#xA;  try {&#xA;   Class localClass1 = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[3];&#xA;   arrayOfClass[0] = Integer.TYPE;&#xA;   arrayOfClass[1] = Bundle.class;&#xA;   arrayOfClass[2] = Dialog.class;&#xA;   Method localMethod = localClass1.getMethod(&amp;#34;onCreateDialog&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[3];&#xA;   Integer localInteger = Integer.valueOf(paramInt);&#xA;   arrayOfObject[0] = localInteger;&#xA;   arrayOfObject[1] = paramBundle;&#xA;   arrayOfObject[2] = localDialog;&#xA;   localObject = (Dialog) InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;   localObject = localDialog;&#xA;  }&#xA;&#xA;  return (Dialog) localObject;&#xA; }&#xA;&#xA; public boolean onCreateOptionsMenu(Menu paramMenu) {&#xA;  boolean bool1 = super.onCreateOptionsMenu(paramMenu);&#xA;  boolean bool3;&#xA;  try {&#xA;   Class localClass1 = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[2];&#xA;   arrayOfClass[0] = Menu.class;&#xA;   arrayOfClass[1] = Boolean.TYPE;&#xA;   Method localMethod = localClass1.getMethod(&amp;#34;onCreateOptionsMenu&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[2];&#xA;   arrayOfObject[0] = paramMenu;&#xA;   Boolean localBoolean = Boolean.valueOf(bool1);&#xA;   arrayOfObject[1] = localBoolean;&#xA;   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))&#xA;     .booleanValue();&#xA;  } catch (Exception localException) {&#xA;   bool3 = bool1;&#xA;  }&#xA;  return bool3;&#xA; }&#xA;&#xA; public boolean onCreatePanelMenu(int paramInt, Menu paramMenu) {&#xA;  boolean bool1 = super.onCreatePanelMenu(paramInt, paramMenu);&#xA;  boolean bool3;&#xA;  try {&#xA;   Class localClass1 = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[3];&#xA;   arrayOfClass[0] = Integer.TYPE;&#xA;   arrayOfClass[1] = Menu.class;&#xA;   arrayOfClass[2] = Boolean.TYPE;&#xA;   Method localMethod = localClass1.getMethod(&amp;#34;onCreatePanelMenu&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[3];&#xA;   Integer localInteger = Integer.valueOf(paramInt);&#xA;   arrayOfObject[0] = localInteger;&#xA;   arrayOfObject[1] = paramMenu;&#xA;   Boolean localBoolean = Boolean.valueOf(bool1);&#xA;   arrayOfObject[2] = localBoolean;&#xA;   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))&#xA;     .booleanValue();&#xA;  } catch (Exception localException) {&#xA;   bool3 = bool1;&#xA;  }&#xA;  return bool3;&#xA; }&#xA;&#xA; public View onCreatePanelView(int paramInt) {&#xA;  View localView = super.onCreatePanelView(paramInt);&#xA;  Object localObject;&#xA;  try {&#xA;   Class localClass1 = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[2];&#xA;   arrayOfClass[0] = Integer.TYPE;&#xA;   arrayOfClass[1] = View.class;&#xA;   Method localMethod = localClass1.getMethod(&amp;#34;onCreatePanelView&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[2];&#xA;   Integer localInteger = Integer.valueOf(paramInt);&#xA;   arrayOfObject[0] = localInteger;&#xA;   arrayOfObject[1] = localView;&#xA;   localObject = (View) InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;   localObject = localView;&#xA;  }&#xA;  return (View) localObject;&#xA; }&#xA;&#xA; public boolean onCreateThumbnail(Bitmap paramBitmap, Canvas paramCanvas) {&#xA;  boolean bool1 = super.onCreateThumbnail(paramBitmap, paramCanvas);&#xA;  boolean bool3;&#xA;  try {&#xA;   Class localClass1 = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[3];&#xA;   arrayOfClass[0] = Bitmap.class;&#xA;   arrayOfClass[1] = Canvas.class;&#xA;   arrayOfClass[2] = Boolean.TYPE;&#xA;   Method localMethod = localClass1.getMethod(&amp;#34;onCreateThumbnail&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[3];&#xA;   arrayOfObject[0] = paramBitmap;&#xA;   arrayOfObject[1] = paramCanvas;&#xA;   Boolean localBoolean = Boolean.valueOf(bool1);&#xA;   arrayOfObject[2] = localBoolean;&#xA;   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))&#xA;     .booleanValue();&#xA;  } catch (Exception localException) {&#xA;   bool3 = bool1;&#xA;  }&#xA;  return bool3;&#xA; }&#xA;&#xA; public View onCreateView(String paramString, Context paramContext,&#xA;   AttributeSet paramAttributeSet) {&#xA;  View localView = super.onCreateView(paramString, paramContext,&#xA;    paramAttributeSet);&#xA;  Object localObject;&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[4];&#xA;   arrayOfClass[0] = String.class;&#xA;   arrayOfClass[1] = Context.class;&#xA;   arrayOfClass[2] = AttributeSet.class;&#xA;   arrayOfClass[3] = View.class;&#xA;   Method localMethod = localClass.getMethod(&amp;#34;onCreateView&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[4];&#xA;   arrayOfObject[0] = paramString;&#xA;   arrayOfObject[1] = paramContext;&#xA;   arrayOfObject[2] = paramAttributeSet;&#xA;   arrayOfObject[3] = localView;&#xA;   localObject = (View) InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;   localObject = localView;&#xA;  }&#xA;  return (View) localObject;&#xA; }&#xA;&#xA; public void onDestroy() {&#xA;  super.onDestroy();&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[0];&#xA;   Method localMethod = localClass&#xA;     .getMethod(&amp;#34;onDestroy&amp;#34;, arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[0];&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; public void onDetachedFromWindow() {&#xA;  super.onDetachedFromWindow();&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[0];&#xA;   Method localMethod = localClass.getMethod(&amp;#34;onDetachedFromWindow&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[0];&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; public boolean onKeyDown(int paramInt, KeyEvent paramKeyEvent) {&#xA;  boolean bool1 = super.onKeyDown(paramInt, paramKeyEvent);&#xA;  boolean bool3;&#xA;  try {&#xA;   Class localClass1 = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[3];&#xA;   arrayOfClass[0] = Integer.TYPE;&#xA;   arrayOfClass[1] = KeyEvent.class;&#xA;   arrayOfClass[2] = Boolean.TYPE;&#xA;   Method localMethod = localClass1.getMethod(&amp;#34;onKeyDown&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[3];&#xA;   Integer localInteger = Integer.valueOf(paramInt);&#xA;   arrayOfObject[0] = localInteger;&#xA;   arrayOfObject[1] = paramKeyEvent;&#xA;   Boolean localBoolean = Boolean.valueOf(bool1);&#xA;   arrayOfObject[2] = localBoolean;&#xA;   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))&#xA;     .booleanValue();&#xA;  } catch (Exception localException) {&#xA;   bool3 = bool1;&#xA;  }&#xA;  return bool3;&#xA; }&#xA;&#xA; public boolean onKeyLongPress(int paramInt, KeyEvent paramKeyEvent) {&#xA;  boolean bool1 = super.onKeyLongPress(paramInt, paramKeyEvent);&#xA;  boolean bool3;&#xA;  try {&#xA;   Class localClass1 = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[3];&#xA;   arrayOfClass[0] = Integer.TYPE;&#xA;   arrayOfClass[1] = KeyEvent.class;&#xA;   arrayOfClass[2] = Boolean.TYPE;&#xA;   Method localMethod = localClass1.getMethod(&amp;#34;onKeyLongPress&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[3];&#xA;   Integer localInteger = Integer.valueOf(paramInt);&#xA;   arrayOfObject[0] = localInteger;&#xA;   arrayOfObject[1] = paramKeyEvent;&#xA;   Boolean localBoolean = Boolean.valueOf(bool1);&#xA;   arrayOfObject[2] = localBoolean;&#xA;   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))&#xA;     .booleanValue();&#xA;  } catch (Exception localException) {&#xA;   bool3 = bool1;&#xA;  }&#xA;  return bool3;&#xA; }&#xA;&#xA; public boolean onKeyMultiple(int paramInt1, int paramInt2,&#xA;   KeyEvent paramKeyEvent) {&#xA;  boolean bool1 = super&#xA;    .onKeyMultiple(paramInt1, paramInt2, paramKeyEvent);&#xA;  boolean bool3;&#xA;  try {&#xA;   Class localClass1 = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[4];&#xA;   arrayOfClass[0] = Integer.TYPE;&#xA;   arrayOfClass[1] = Integer.TYPE;&#xA;   arrayOfClass[2] = KeyEvent.class;&#xA;   arrayOfClass[3] = Boolean.TYPE;&#xA;   Method localMethod = localClass1.getMethod(&amp;#34;onKeyMultiple&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[4];&#xA;   Integer localInteger1 = Integer.valueOf(paramInt1);&#xA;   arrayOfObject[0] = localInteger1;&#xA;   Integer localInteger2 = Integer.valueOf(paramInt2);&#xA;   arrayOfObject[1] = localInteger2;&#xA;   arrayOfObject[2] = paramKeyEvent;&#xA;   Boolean localBoolean = Boolean.valueOf(bool1);&#xA;   arrayOfObject[3] = localBoolean;&#xA;   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))&#xA;     .booleanValue();&#xA;  } catch (Exception localException) {&#xA;   bool3 = bool1;&#xA;  }&#xA;  return bool3;&#xA; }&#xA;&#xA; public boolean onKeyUp(int paramInt, KeyEvent paramKeyEvent) {&#xA;  boolean bool1 = super.onKeyUp(paramInt, paramKeyEvent);&#xA;  boolean bool3;&#xA;  try {&#xA;   Class localClass1 = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[3];&#xA;   arrayOfClass[0] = Integer.TYPE;&#xA;   arrayOfClass[1] = KeyEvent.class;&#xA;   arrayOfClass[2] = Boolean.TYPE;&#xA;   Method localMethod = localClass1.getMethod(&amp;#34;onKeyUp&amp;#34;, arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[3];&#xA;   Integer localInteger = Integer.valueOf(paramInt);&#xA;   arrayOfObject[0] = localInteger;&#xA;   arrayOfObject[1] = paramKeyEvent;&#xA;   Boolean localBoolean = Boolean.valueOf(bool1);&#xA;   arrayOfObject[2] = localBoolean;&#xA;   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))&#xA;     .booleanValue();&#xA;  } catch (Exception localException) {&#xA;   bool3 = bool1;&#xA;  }&#xA;  return bool3;&#xA; }&#xA;&#xA; public void onLowMemory() {&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[0];&#xA;   Method localMethod = localClass.getMethod(&amp;#34;onLowMemory&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[0];&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; public boolean onMenuItemSelected(int paramInt, MenuItem paramMenuItem) {&#xA;  boolean bool1 = super.onMenuItemSelected(paramInt, paramMenuItem);&#xA;  boolean bool3;&#xA;  try {&#xA;   Class localClass1 = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[3];&#xA;   arrayOfClass[0] = Integer.TYPE;&#xA;   arrayOfClass[1] = MenuItem.class;&#xA;   arrayOfClass[2] = Boolean.TYPE;&#xA;   Method localMethod = localClass1.getMethod(&amp;#34;onMenuItemSelected&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[3];&#xA;   Integer localInteger = Integer.valueOf(paramInt);&#xA;   arrayOfObject[0] = localInteger;&#xA;   arrayOfObject[1] = paramMenuItem;&#xA;   Boolean localBoolean = Boolean.valueOf(bool1);&#xA;   arrayOfObject[2] = localBoolean;&#xA;   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))&#xA;     .booleanValue();&#xA;  } catch (Exception localException) {&#xA;   bool3 = bool1;&#xA;  }&#xA;  return bool3;&#xA; }&#xA;&#xA; public boolean onMenuOpened(int paramInt, Menu paramMenu) {&#xA;  boolean bool1 = super.onMenuOpened(paramInt, paramMenu);&#xA;  boolean bool3;&#xA;  try {&#xA;   Class localClass1 = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[3];&#xA;   arrayOfClass[0] = Integer.TYPE;&#xA;   arrayOfClass[1] = Menu.class;&#xA;   arrayOfClass[2] = Boolean.TYPE;&#xA;   Method localMethod = localClass1.getMethod(&amp;#34;onMenuOpened&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[3];&#xA;   Integer localInteger = Integer.valueOf(paramInt);&#xA;   arrayOfObject[0] = localInteger;&#xA;   arrayOfObject[1] = paramMenu;&#xA;   Boolean localBoolean = Boolean.valueOf(bool1);&#xA;   arrayOfObject[2] = localBoolean;&#xA;   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))&#xA;     .booleanValue();&#xA;  } catch (Exception localException) {&#xA;   bool3 = bool1;&#xA;  }&#xA;  return bool3;&#xA; }&#xA;&#xA; protected void onNewIntent(Intent paramIntent) {&#xA;  Intent localIntent = paramIntent;&#xA;  super.onNewIntent(localIntent);&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[1];&#xA;   arrayOfClass[0] = Intent.class;&#xA;   Method localMethod = localClass.getMethod(&amp;#34;onNewIntent&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[1];&#xA;   arrayOfObject[0] = localIntent;&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; public boolean onOptionsItemSelected(MenuItem paramMenuItem) {&#xA;  boolean bool1 = super.onOptionsItemSelected(paramMenuItem);&#xA;  boolean bool3;&#xA;  try {&#xA;   Class localClass1 = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[2];&#xA;   arrayOfClass[0] = MenuItem.class;&#xA;   arrayOfClass[1] = Boolean.TYPE;&#xA;   Method localMethod = localClass1.getMethod(&amp;#34;onOptionsItemSelected&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[2];&#xA;   arrayOfObject[0] = paramMenuItem;&#xA;   Boolean localBoolean = Boolean.valueOf(bool1);&#xA;   arrayOfObject[1] = localBoolean;&#xA;   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))&#xA;     .booleanValue();&#xA;  } catch (Exception localException) {&#xA;   bool3 = bool1;&#xA;  }&#xA;  return bool3;&#xA; }&#xA;&#xA; public void onOptionsMenuClosed(Menu paramMenu) {&#xA;  super.onOptionsMenuClosed(paramMenu);&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[1];&#xA;   arrayOfClass[0] = Menu.class;&#xA;   Method localMethod = localClass.getMethod(&amp;#34;onOptionsMenuClosed&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[1];&#xA;   arrayOfObject[0] = paramMenu;&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; public void onPanelClosed(int paramInt, Menu paramMenu) {&#xA;  super.onPanelClosed(paramInt, paramMenu);&#xA;  try {&#xA;   Class localClass1 = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[2];&#xA;   arrayOfClass[0] = Integer.TYPE;&#xA;   arrayOfClass[1] = Menu.class;&#xA;   Method localMethod = localClass1.getMethod(&amp;#34;onPanelClosed&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[2];&#xA;   Integer localInteger = Integer.valueOf(paramInt);&#xA;   arrayOfObject[0] = localInteger;&#xA;   arrayOfObject[1] = paramMenu;&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; public void onPause() {&#xA;  super.onPause();&#xA;  try {&#xA;   if (sDexLoaded) {&#xA;    Class localClass = sAndroidActivityWrapperClass;&#xA;    Class[] arrayOfClass = new Class[0];&#xA;    Method localMethod = localClass.getMethod(&amp;#34;onPause&amp;#34;,&#xA;      arrayOfClass);&#xA;    Object[] arrayOfObject = new Object[0];&#xA;    InvokeMethod(localMethod, arrayOfObject);&#xA;   }&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; protected void onPostCreate(Bundle paramBundle) {&#xA;  super.onPostCreate(paramBundle);&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[1];&#xA;   arrayOfClass[0] = Bundle.class;&#xA;   Method localMethod = localClass.getMethod(&amp;#34;onPostCreate&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[1];&#xA;   arrayOfObject[0] = paramBundle;&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; protected void onPostResume() {&#xA;  super.onPostResume();&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[0];&#xA;   Method localMethod = localClass.getMethod(&amp;#34;onPostResume&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[0];&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; protected void onPrepareDialog(int paramInt, Dialog paramDialog) {&#xA;  super.onPrepareDialog(paramInt, paramDialog);&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[2];&#xA;   // arrayOfClass[0] = R.id.class;&#xA;   // 因为此处的第一个参数为int类型，所以做个替换就OK&#xA;   arrayOfClass[0] = Integer.TYPE;&#xA;   arrayOfClass[1] = Dialog.class;&#xA;   Method localMethod = localClass.getMethod(&amp;#34;onPrepareDialog&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[2];&#xA;   Integer localInteger = Integer.valueOf(paramInt);&#xA;   arrayOfObject[0] = localInteger;&#xA;   arrayOfObject[1] = paramDialog;&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; protected void onPrepareDialog(int paramInt, Dialog paramDialog,&#xA;   Bundle paramBundle) {&#xA;  super.onPrepareDialog(paramInt, paramDialog, paramBundle);&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[3];&#xA;   // arrayOfClass[0] = R.id.class;&#xA;   // 因为此处的第一个参数为int类型，所以做个替换就OK&#xA;   arrayOfClass[0] = Integer.TYPE;&#xA;   arrayOfClass[1] = Dialog.class;&#xA;   arrayOfClass[2] = Bundle.class;&#xA;   Method localMethod = localClass.getMethod(&amp;#34;onPrepareDialog&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[3];&#xA;   Integer localInteger = Integer.valueOf(paramInt);&#xA;   arrayOfObject[0] = localInteger;&#xA;   arrayOfObject[1] = paramDialog;&#xA;   arrayOfObject[2] = paramBundle;&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; public boolean onPrepareOptionsMenu(Menu paramMenu) {&#xA;  boolean bool1 = super.onPrepareOptionsMenu(paramMenu);&#xA;  boolean bool3;&#xA;  try {&#xA;   Class localClass1 = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[2];&#xA;   arrayOfClass[0] = Menu.class;&#xA;   arrayOfClass[1] = Boolean.TYPE;&#xA;   Method localMethod = localClass1.getMethod(&amp;#34;onPrepareOptionsMenu&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[2];&#xA;   arrayOfObject[0] = paramMenu;&#xA;   Boolean localBoolean = Boolean.valueOf(bool1);&#xA;   arrayOfObject[1] = localBoolean;&#xA;   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))&#xA;     .booleanValue();&#xA;  } catch (Exception localException) {&#xA;   bool3 = bool1;&#xA;  }&#xA;  return bool3;&#xA; }&#xA;&#xA; public boolean onPreparePanel(int paramInt, View paramView, Menu paramMenu) {&#xA;  boolean bool1 = super.onPreparePanel(paramInt, paramView, paramMenu);&#xA;  boolean bool3;&#xA;  try {&#xA;   Class localClass1 = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[4];&#xA;   arrayOfClass[0] = Integer.TYPE;&#xA;   arrayOfClass[1] = View.class;&#xA;   arrayOfClass[2] = Menu.class;&#xA;   arrayOfClass[3] = Boolean.TYPE;&#xA;   Method localMethod = localClass1.getMethod(&amp;#34;onPreparePanel&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[4];&#xA;   Integer localInteger = Integer.valueOf(paramInt);&#xA;   arrayOfObject[0] = localInteger;&#xA;   arrayOfObject[1] = paramView;&#xA;   arrayOfObject[2] = paramMenu;&#xA;   Boolean localBoolean = Boolean.valueOf(bool1);&#xA;   arrayOfObject[3] = localBoolean;&#xA;   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))&#xA;     .booleanValue();&#xA;  } catch (Exception localException) {&#xA;   bool3 = bool1;&#xA;  }&#xA;  return bool3;&#xA; }&#xA;&#xA; public void onRestart() {&#xA;  super.onRestart();&#xA;  try {&#xA;   if (sDexLoaded) {&#xA;    Class localClass = sAndroidActivityWrapperClass;&#xA;    Class[] arrayOfClass = new Class[0];&#xA;    Method localMethod = localClass.getMethod(&amp;#34;onRestart&amp;#34;,&#xA;      arrayOfClass);&#xA;    Object[] arrayOfObject = new Object[0];&#xA;    InvokeMethod(localMethod, arrayOfObject);&#xA;   }&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; protected void onRestoreInstanceState(Bundle paramBundle) {&#xA;  super.onRestoreInstanceState(paramBundle);&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[1];&#xA;   arrayOfClass[0] = Bundle.class;&#xA;   Method localMethod = localClass.getMethod(&amp;#34;onRestoreInstanceState&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[1];&#xA;   arrayOfObject[0] = paramBundle;&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; public void onResume() {&#xA;  super.onResume();&#xA;  try {&#xA;   if (sDexLoaded) {&#xA;    Class localClass = sAndroidActivityWrapperClass;&#xA;    Class[] arrayOfClass = new Class[0];&#xA;    Method localMethod = localClass.getMethod(&amp;#34;onResume&amp;#34;,&#xA;      arrayOfClass);&#xA;    Object[] arrayOfObject = new Object[0];&#xA;    InvokeMethod(localMethod, arrayOfObject);&#xA;   }&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; public Object onRetainNonConfigurationInstance() {&#xA;  Object localObject1 = super.onRetainNonConfigurationInstance();&#xA;  Object localObject3;&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[1];&#xA;   arrayOfClass[0] = Object.class;&#xA;   Method localMethod = localClass.getMethod(&#xA;     &amp;#34;onRetainNonConfigurationInstance&amp;#34;, arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[1];&#xA;   arrayOfObject[0] = localObject1;&#xA;   localObject3 = InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;   localObject3 = localObject1;&#xA;  }&#xA;  return localObject3;&#xA; }&#xA;&#xA; protected void onSaveInstanceState(Bundle paramBundle) {&#xA;  super.onSaveInstanceState(paramBundle);&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[1];&#xA;   arrayOfClass[0] = Bundle.class;&#xA;   Method localMethod = localClass.getMethod(&amp;#34;onSaveInstanceState&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[1];&#xA;   arrayOfObject[0] = paramBundle;&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; public boolean onSearchRequested() {&#xA;  boolean bool1 = super.onSearchRequested();&#xA;  boolean bool3;&#xA;  try {&#xA;   Class localClass1 = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[1];&#xA;   arrayOfClass[0] = Boolean.TYPE;&#xA;   Method localMethod = localClass1.getMethod(&amp;#34;onSearchRequested&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[1];&#xA;   Boolean localBoolean = Boolean.valueOf(bool1);&#xA;   arrayOfObject[0] = localBoolean;&#xA;   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))&#xA;     .booleanValue();&#xA;  } catch (Exception localException) {&#xA;   bool3 = bool1;&#xA;  }&#xA;  return bool3;&#xA; }&#xA;&#xA; public void onStart() {&#xA;  super.onStart();&#xA; }&#xA;&#xA; public void onStop() {&#xA;  super.onStop();&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[0];&#xA;   Method localMethod = localClass.getMethod(&amp;#34;onStop&amp;#34;, arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[0];&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; protected void onTitleChanged(CharSequence paramCharSequence, int paramInt) {&#xA;  super.onTitleChanged(paramCharSequence, paramInt);&#xA;  try {&#xA;   Class localClass1 = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[2];&#xA;   arrayOfClass[0] = CharSequence.class;&#xA;   Class localClass2 = Integer.TYPE;&#xA;   arrayOfClass[1] = localClass2;&#xA;   Method localMethod = localClass1.getMethod(&amp;#34;onTitleChanged&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[2];&#xA;   arrayOfObject[0] = paramCharSequence;&#xA;   Integer localInteger = Integer.valueOf(paramInt);&#xA;   arrayOfObject[1] = localInteger;&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; public boolean onTouchEvent(MotionEvent paramMotionEvent) {&#xA;  boolean bool1 = super.onTouchEvent(paramMotionEvent);&#xA;  boolean bool3;&#xA;  try {&#xA;   Class localClass1 = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[2];&#xA;   arrayOfClass[0] = MotionEvent.class;&#xA;   arrayOfClass[1] = Boolean.TYPE;&#xA;   Method localMethod = localClass1.getMethod(&amp;#34;onTouchEvent&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[2];&#xA;   arrayOfObject[0] = paramMotionEvent;&#xA;   Boolean localBoolean = Boolean.valueOf(bool1);&#xA;   arrayOfObject[1] = localBoolean;&#xA;   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))&#xA;     .booleanValue();&#xA;  } catch (Exception localException) {&#xA;   bool3 = bool1;&#xA;  }&#xA;  return bool3;&#xA; }&#xA;&#xA; public boolean onTrackballEvent(MotionEvent paramMotionEvent) {&#xA;  boolean bool1 = super.onTrackballEvent(paramMotionEvent);&#xA;  boolean bool3;&#xA;  try {&#xA;   Class localClass1 = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[2];&#xA;   arrayOfClass[0] = MotionEvent.class;&#xA;   arrayOfClass[1] = Boolean.TYPE;&#xA;   Method localMethod = localClass1.getMethod(&amp;#34;onTrackballEvent&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[2];&#xA;   arrayOfObject[0] = paramMotionEvent;&#xA;   Boolean localBoolean = Boolean.valueOf(bool1);&#xA;   arrayOfObject[1] = localBoolean;&#xA;   bool3 = ((Boolean) InvokeMethod(localMethod, arrayOfObject))&#xA;     .booleanValue();&#xA;  } catch (Exception localException) {&#xA;   bool3 = bool1;&#xA;  }&#xA;  return bool3;&#xA; }&#xA;&#xA; public void onUserInteraction() {&#xA;  super.onUserInteraction();&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[0];&#xA;   Method localMethod = localClass.getMethod(&amp;#34;onUserInteraction&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[0];&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; protected void onUserLeaveHint() {&#xA;  super.onUserLeaveHint();&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[0];&#xA;   Method localMethod = localClass.getMethod(&amp;#34;onUserLeaveHint&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[0];&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; public void onWindowAttributesChanged(&#xA;   WindowManager.LayoutParams paramLayoutParams) {&#xA;  super.onWindowAttributesChanged(paramLayoutParams);&#xA;  try {&#xA;   Class localClass = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[1];&#xA;   arrayOfClass[0] = WindowManager.LayoutParams.class;&#xA;   Method localMethod = localClass.getMethod(&#xA;     &amp;#34;onWindowAttributesChanged&amp;#34;, arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[1];&#xA;   arrayOfObject[0] = paramLayoutParams;&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; public void onWindowFocusChanged(boolean paramBoolean) {&#xA;  super.onWindowFocusChanged(paramBoolean);&#xA;  try {&#xA;   Class localClass1 = sAndroidActivityWrapperClass;&#xA;   Class[] arrayOfClass = new Class[1];&#xA;   arrayOfClass[0] = Boolean.TYPE;&#xA;   Method localMethod = localClass1.getMethod(&amp;#34;onWindowFocusChanged&amp;#34;,&#xA;     arrayOfClass);&#xA;   Object[] arrayOfObject = new Object[1];&#xA;   Boolean localBoolean = Boolean.valueOf(paramBoolean);&#xA;   arrayOfObject[0] = localBoolean;&#xA;   InvokeMethod(localMethod, arrayOfObject);&#xA;  } catch (Exception localException) {&#xA;  }&#xA; }&#xA;&#xA; public void showDialog() {&#xA;  AlertDialog.Builder localBuilder1 = new AlertDialog.Builder(this);&#xA;  AlertDialog.Builder localBuilder2 = localBuilder1.setTitle(2130968578);&#xA;  AlertDialog.Builder localBuilder3 = localBuilder1&#xA;    .setMessage(2130968579);&#xA;&#xA;  AlertDialog.Builder localBuilder4 = localBuilder1.setPositiveButton(&#xA;    2130968576,&#xA;    new android.content.DialogInterface.OnClickListener() {&#xA;     @Override&#xA;     public void onClick(DialogInterface arg0, int arg1) {&#xA;      launchMarketPlaceForAIR();&#xA;      System.exit(0);&#xA;     }&#xA;    });&#xA;&#xA;  AlertDialog.Builder localBuilder5 = localBuilder1.setNegativeButton(&#xA;    2130968577,&#xA;    new android.content.DialogInterface.OnClickListener() {&#xA;     @Override&#xA;     public void onClick(DialogInterface arg0, int arg1) {&#xA;      System.exit(0);&#xA;     }&#xA;&#xA;    });&#xA;&#xA;  AlertDialog.Builder localBuilder6 = localBuilder1&#xA;    .setOnCancelListener(new android.content.DialogInterface.OnCancelListener() {&#xA;     @Override&#xA;     public void onCancel(DialogInterface arg0) {&#xA;      System.exit(0);&#xA;     }&#xA;    });&#xA;&#xA;  AlertDialog localAlertDialog = localBuilder1.show();&#xA; }&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;源码看完了，不知大家了解的怎么样了，不管怎样先休息一下，过端午了，先吃粽子啦。。。&lt;/p&gt;</description>
			</item>
			<item>
				<title>AIR for Android</title>
				<link>https://blog.zhourunsheng.com/2011/07/air-for-android/</link>
				<pubDate>Sat, 02 Jul 2011 15:49:51 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/air-for-android/</guid>
				<description>&lt;p&gt;工程项目，建立步骤如下：1.&lt;/p&gt;&#xA;&lt;p&gt;下载工程项目所需的资源文件 air_for_android-flex_4_5-air_2_6-v_1 2.&lt;/p&gt;&#xA;&lt;p&gt;建立 Android 工程 TestAIR (注意不要勾选Create Activity，先不创建Activity)&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Porject Name: TestAIR&#xA;Standard Android Platform: 2.2&#xA;Application Name: TestAIR&#xA;Package Name: com.carey&#xA;Min SDK Version: 8&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/TestAIR-project.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;将下载下来的资源文件覆盖新创建工程的同名目录和文件，包括 assets 和 res，airbootstap.jar 将作为链接库 4.&lt;/p&gt;&#xA;&lt;p&gt;删除&amp;quot;res/layout&amp;quot; 目录 5.&lt;/p&gt;&#xA;&lt;p&gt;将 airbootstrap.jar 添加到 Build Path 6.&lt;/p&gt;&#xA;&lt;p&gt;新建一个Class文件，名称为 MainApp，内容如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;package com.carey;  &#xA;import air.app.AppEntry;&#xA;import android.os.Bundle;  &#xA;&#xA;public class MainApp extends AppEntry {    &#xA;&#xA;  @Override   &#xA;  public void onCreate(Bundle arg0) {        &#xA;      System.out.println(&amp;#34;carey test adobe air for android!!!&amp;#34;);        &#xA;      super.onCreate(arg0);    &#xA;  }&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;7&#34;&gt;&#xA;&lt;li&gt;更新 Manifest 文件中的 Activity 为 MainApp&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;内容如下：&lt;/p&gt;</description>
			</item>
			<item>
				<title>Extending AIR for Android (4)</title>
				<link>https://blog.zhourunsheng.com/2011/07/extending-air-for-android-4/</link>
				<pubDate>Sat, 02 Jul 2011 15:35:06 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/extending-air-for-android-4/</guid>
				<description>&lt;h2 id=&#34;application-licensing&#34;&gt;Application Licensing&lt;/h2&gt;&#xA;&lt;p&gt;Android provides APIs to help you enforce licensing policies for non-free apps in the Android Market. You might want to go read up on Android Licensing before you give this one a try.&#xA;To add Application Licensing to you AIR for Android application you first need to follow the steps outlined in the Android documentation. The broad steps are as follows:1.&lt;/p&gt;&#xA;&lt;p&gt;Set up an Android Market publisher account 2.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Extending AIR for Android (3)</title>
				<link>https://blog.zhourunsheng.com/2011/07/extending-air-for-android-3/</link>
				<pubDate>Sat, 02 Jul 2011 15:24:28 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/extending-air-for-android-3/</guid>
				<description>&lt;h2 id=&#34;widgets&#34;&gt;Widgets&lt;/h2&gt;&#xA;&lt;p&gt;Widgets in Android are the mini apps that can be displayed on the home screen of the device. There is a fairly limited amount of things that can be displayed in Widgets. So unfortunately Widgets can’t be built with AIR for Android. However a custom application Widget can be packaged with an AIR for Android application. To add a Widget to an AIR for Android application you can use the default AppEntry class instead of wrapping it with another class (MainApp in my example). (It doesn’t, however, do any harm to keep the MainApp class there.) To add a Widget simply add its definition to the AndroidManifest.xml file, create the Widget with Java, and create a corresponding layout resource.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Extending AIR for Android (2)</title>
				<link>https://blog.zhourunsheng.com/2011/07/extending-air-for-android-2/</link>
				<pubDate>Sat, 02 Jul 2011 15:11:56 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/extending-air-for-android-2/</guid>
				<description>&lt;p&gt;System Notifications and Services&lt;/p&gt;&#xA;&lt;p&gt;AIR for Android applications don’t yet have an API to do Android system notifications. But you can add system notifications to your AIR for Android application through a startup hook. In order for the AIR application to communicate with the native Android APIs you must provide a bridge for the communication. The simplest way to create that bridge is using a network socket. The Android application can listen for data on the socket and then read that data and determine if it needs to display a system notification. Then the AIR application can connect to the socket and send the necessary data. This is a pretty straightforward example but some security (for instance a key exchange) should be implemented to insure that malicious apps don’t discover and abuse the socket. Also some logic to determine which socket should be used would likely be necessary.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Extending AIR for Android (1)</title>
				<link>https://blog.zhourunsheng.com/2011/07/extending-air-for-android-1/</link>
				<pubDate>Sat, 02 Jul 2011 14:47:46 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/extending-air-for-android-1/</guid>
				<description>&lt;p&gt;Adobe AIR provides a consistent platform for desktop and mobile apps. While consistency is very important there are times when developers need to extend beyond the common APIs. This article will walk you through how to integrate AIR for Android applications with other native APIs and functionality in the Android SDK. It covers three common use cases for native extensibility: System Notifications, Widgets, and Application Licensing.&lt;/p&gt;&#xA;&lt;p&gt;If you’d like to follow along you will need the following prerequisites:&lt;/p&gt;</description>
			</item>
			<item>
				<title>利用Appspot访问外部资源</title>
				<link>https://blog.zhourunsheng.com/2011/07/%e5%88%a9%e7%94%a8appspot%e8%ae%bf%e9%97%ae%e5%a4%96%e9%83%a8%e8%b5%84%e6%ba%90/</link>
				<pubDate>Sat, 02 Jul 2011 14:26:16 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/%e5%88%a9%e7%94%a8appspot%e8%ae%bf%e9%97%ae%e5%a4%96%e9%83%a8%e8%b5%84%e6%ba%90/</guid>
				<description>&lt;p&gt;网上翻墙的技术层出不群，本人自己也使用过很多，用过之后，发现还是利用appspot 最实在，最方便。&lt;/p&gt;&#xA;&lt;p&gt;既然要利用appspot 进行翻墙，那么首先得解决访问*.appspot .com的问题, 因为它本身就是一个墙外的东西，真是灰常像先有鸡还是先有蛋的两难问题啊。。。&lt;/p&gt;&#xA;&lt;p&gt;幸好这个问题比较容易解决，现将解决方法罗列如下：&lt;/p&gt;&#xA;&lt;p&gt;【本文用的是win7，xp神马的类似】&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;建立自己的appspot 代理 gappproxy, 在 google code 上面下载其源代码工程 gappproxy-read-only，&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;fetchserver是用来上传到appspot的，比如我自己的代理地址为：http://careyproxy.appspot.com/fetch.py&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/gappproxy.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;修改hosts文件，win7 在 C:Windows\System32\drivers\etc 下面，注意需要管理员的权限，修改如下：&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;203.208.39.104 careyproxy.appspot.com&#xA;209.85.225.101 sites.google.com&#xA;209.85.225.101 docs.google.com&#xA;209.85.225.101 spreadsheets.google.com&#xA;209.85.225.101 picasaweb.google.com&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;修改 gappproxy-read-onlylocalproxyproxy.conf 配置文件&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;listen_port = 8008&#xA;fetch_server = http://careyproxy.appspot.com/fetch.py&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;运行 gappproxy-read-onlylocalproxy proxy.py，命令行输出如下：&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/localproxy.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;说明服务已经启动了&lt;/p&gt;&#xA;&lt;ol start=&#34;5&#34;&gt;&#xA;&lt;li&gt;修改本机浏览器的代理地址为127.0.0.1：8008，试试是不是已经能访问facebook和twitter啦&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/facebook.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;现在开始慢慢欣赏墙外的世界吧。。。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Google ClientLogin for Installed Applications</title>
				<link>https://blog.zhourunsheng.com/2011/07/google-clientlogin-for-installed-applications/</link>
				<pubDate>Sat, 02 Jul 2011 14:20:22 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/google-clientlogin-for-installed-applications/</guid>
				<description>&lt;p&gt;访问Google的很多服务都需要账户的验证，例如Google Calendar，Google Mail，Google Apps等等，其中ClientLogin验证是使用最多的情况。&lt;/p&gt;&#xA;&lt;p&gt;本文就简单介绍一下手机应用程序和桌面应用程序的ClientLogin的基本流程和方法。&lt;/p&gt;&#xA;&lt;p&gt;The ClientLogin authorization process（验证过程）&lt;/p&gt;&#xA;&lt;p&gt;Authorization with ClientLogin involves a sequence of interactions between three entities: the installed application, Google services, and the user.&lt;/p&gt;&#xA;&lt;p&gt;This diagram illustrates the sequence:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/ClientLogin-authorization-process.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;图片中的验证流程说明如下：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;When the third-party application needs to access a user&amp;rsquo;s Google service, it retrieves the user&amp;rsquo;s login name and password.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;The third-party application then makes a ClientLogin call to Google&amp;rsquo;s Authorization service.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;If the Google Authorization service decides additional vetting is necessary, it returns failure response with a CAPTCHA token and challenge, in the form of a URL for a CAPTCHA image.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;If a CAPTCHA challenge is received, the third-party application displays the CAPTCHA image for the user and solicits an answer from the user.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;If requested, the user submits an answer to the CAPTCHA challenge.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;The third-party application makes a new ClientLogin call, this time including the CAPTCHA answer and token (received with the failure response).&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;On a successful login attempt (with or without CAPTCHA challenge), the Google Authorization service returns a token to the application.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;The application contacts the Google service with a request for data access, referencing the token received from the Google Authorization service.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;If the Google service recognizes the token, it supplies the requested data access.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
			</item>
			<item>
				<title>脚本方式获取Google ClientLogin Auth Token</title>
				<link>https://blog.zhourunsheng.com/2011/07/%e8%84%9a%e6%9c%ac%e6%96%b9%e5%bc%8f%e8%8e%b7%e5%8f%96google-clientlogin-auth-token/</link>
				<pubDate>Sat, 02 Jul 2011 14:06:53 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/%e8%84%9a%e6%9c%ac%e6%96%b9%e5%bc%8f%e8%8e%b7%e5%8f%96google-clientlogin-auth-token/</guid>
				<description>&lt;p&gt;在开发基于Google服务的应用程序中，有很多的情况都需要获取Auth Token。&lt;/p&gt;&#xA;&lt;p&gt;本文编写了一个简单的shell脚本文件，可方便程序开发人员快速的获取到Auth Token来调试程序。&lt;/p&gt;&#xA;&lt;p&gt;本示例程序获取的Googel服务为ah，即Google App Engine，如果需要获取其他服务的token，只要修改脚本中的 service=ah 为自己的服务即可。&lt;/p&gt;&#xA;&lt;p&gt;Google 常用服务和Service Name 对照表&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Google API&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Service name&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Google Analytics Data APIs&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;analytics&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Google Apps APIs &lt;em&gt;(Domain Information &amp;amp; Management)&lt;/em&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;apps&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Google Base Data API&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;gbase&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Google Sites Data API&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;jotspot&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Blogger Data API&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;blogger&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Book Search Data API&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;print&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Calendar Data API&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;cl&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Google Code Search Data API&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;codesearch&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Contacts Data API&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;cp&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Documents List Data API&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;writely&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Finance Data API&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;finance&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Gmail Atom feed&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;mail&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Health Data API&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;health&lt;/code&gt; &lt;code&gt;weaver&lt;/code&gt; (H9 sandbox)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Maps Data APIs&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;local&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Picasa Web Albums Data API&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;lh2&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Sidewiki Data API&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;annotateweb&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Spreadsheets Data API&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;wise&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Webmaster Tools API&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;sitemaps&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;YouTube Data API&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;youtube&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Google Service 评测请参照 Google Account Service Names （Google工程师 Tony Ruscoe）脚本代码如下（get_auth_token.sh）：&lt;/p&gt;</description>
			</item>
			<item>
				<title>打造个人的云端笔记本之CareyDiary</title>
				<link>https://blog.zhourunsheng.com/2011/07/%e6%89%93%e9%80%a0%e4%b8%aa%e4%ba%ba%e7%9a%84%e4%ba%91%e7%ab%af%e7%ac%94%e8%ae%b0%e6%9c%ac%e4%b9%8bcareydiary/</link>
				<pubDate>Sat, 02 Jul 2011 13:58:17 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/%e6%89%93%e9%80%a0%e4%b8%aa%e4%ba%ba%e7%9a%84%e4%ba%91%e7%ab%af%e7%ac%94%e8%ae%b0%e6%9c%ac%e4%b9%8bcareydiary/</guid>
				<description>&lt;p&gt;打造个人的云端笔记本（CareyDiary）&#xA;在自己的日常生活中，有好多情况都需要记录一点东西，而且又希望能长久的保存，自从有了Android手机，记笔记倒是方便了，但是发现，每次一刷完机，东西全没了，提前做好备份工作吧，又嫌麻烦，还是找个智能的方法吧，不然怎么叫智能机呢。。。&lt;/p&gt;&#xA;&lt;p&gt;通过前段时间对欧美业务的开发，发现为自己打造一个在线记笔记的软件还是很实用的，怪不得国外都喜欢这个东西。&lt;/p&gt;&#xA;&lt;p&gt;本文的软件基于Google官方的Note程序移植而来，毕竟官方的东西还是可信的，O(∩_∩)O哈哈~&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;云端服务：&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://diary.zhourunsheng.com&#34;&gt;http://diary.zhourunsheng.com&lt;/a&gt; 后台采用GAE服务的支持，Java语言开发，和 Google C2DM消息push架构&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/webnote.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;本地APP：http://careydiary.googlecode.com/files/careydiary-android.apk&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;基于Android2.2系统开发，整合系统的Sync机制和Google账户的管理，可实现本地笔记和在线笔记的同步&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/localnote.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;系统架构介绍：&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/push-c2dm.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;从上图不难看出，本系统主要是利用了Google的消息push机制C2DM, 从而可以有效的实现在线笔记和本地笔记的及时同步，因为服务器的后台开发基于GAE，所以又能方便集合个人的账户认证管理，只要你拥有一个GMail邮件账户，即可利用本服务实现信息的在线存储。&lt;/p&gt;&#xA;&lt;p&gt;[Android Cloud to Device Messaging Framework]&lt;/p&gt;&#xA;&lt;p&gt;Android Cloud to Device Messaging (C2DM) is a service that helps developers send data from servers to their applications on Android devices. The service provides a simple, lightweight mechanism that servers can use to tell mobile applications to contact the server directly, to fetch updated application or user data. The C2DM service handles all aspects of queueing of messages and delivery to the target application running on the target device.&lt;/p&gt;</description>
			</item>
			<item>
				<title>探索GAE背后的奥秘之参考文章推荐</title>
				<link>https://blog.zhourunsheng.com/2011/07/%e6%8e%a2%e7%b4%a2gae%e8%83%8c%e5%90%8e%e7%9a%84%e5%a5%a5%e7%a7%98%e4%b9%8b%e5%8f%82%e8%80%83%e6%96%87%e7%ab%a0%e6%8e%a8%e8%8d%90/</link>
				<pubDate>Sat, 02 Jul 2011 12:56:32 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/%e6%8e%a2%e7%b4%a2gae%e8%83%8c%e5%90%8e%e7%9a%84%e5%a5%a5%e7%a7%98%e4%b9%8b%e5%8f%82%e8%80%83%e6%96%87%e7%ab%a0%e6%8e%a8%e8%8d%90/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://perspectives.mvdirona.com/2008/06/25/GooglesDrKaiFuLeeOnCloudComputing.aspx&#34;&gt;Google&amp;rsquo;s Dr. Kai-Fu Lee on Cloud Computing&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://perspectives.mvdirona.com/2009/10/31/TheCostOfLatency.aspx&#34;&gt;The Cost of Latency&lt;/a&gt; &lt;a href=&#34;http://googleappengine.blogspot.com/&#34;&gt;Google App Engine Blog&lt;/a&gt; Bigtable: A Distributed Storage System for Structured Data&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://code.google.com/events/io/sessions/FromSparkPlugToDriveTrain.html&#34;&gt;From Spark Plug to Drive Train: Life of an App Engine Request&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://perspectives.mvdirona.com/2008/07/10/GoogleMegastore.aspx&#34;&gt;Google Megastore&lt;/a&gt; &lt;a href=&#34;http://code.google.com/intl/zh-CN/appengine/docs/&#34;&gt;Google App Engine官方文档&lt;/a&gt; &lt;a href=&#34;http://highscalability.com/google-architecture&#34;&gt;Google Architecture&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://highscalability.com/google-appengine-first-look&#34;&gt;Google App Engine - a first look&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.infoq.com/news/2009/08/google-chose-jetty&#34;&gt;Google Chose Jetty for App Engine&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.readwriteweb.com/cloud/2010/02/google-app-engine-is-down---ba.php&#34;&gt;Google App Engine is Down - Backup Data Center Having Problems&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.ibm.com/developerworks/cn/opensource/os-cloud-virtual2/&#34;&gt;面向虚拟基础设施的云服务，第 2 部分: Platform as a Service (PaaS) 和 AppScale&lt;/a&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>探索GAE背后的奥秘之Datastore设计</title>
				<link>https://blog.zhourunsheng.com/2011/07/%e6%8e%a2%e7%b4%a2gae%e8%83%8c%e5%90%8e%e7%9a%84%e5%a5%a5%e7%a7%98%e4%b9%8bdatastore%e8%ae%be%e8%ae%a1/</link>
				<pubDate>Sat, 02 Jul 2011 12:50:42 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/%e6%8e%a2%e7%b4%a2gae%e8%83%8c%e5%90%8e%e7%9a%84%e5%a5%a5%e7%a7%98%e4%b9%8bdatastore%e8%ae%be%e8%ae%a1/</guid>
				<description>&lt;p&gt;本篇会首先会从程序员角度来介绍一下Datastore在使用方面的一些信息，之后会接着介绍Datastore是如何构建的。&lt;/p&gt;&#xA;&lt;h2 id=&#34;使用方面&#34;&gt;使用方面&lt;/h2&gt;&#xA;&lt;p&gt;首先，在编程方面，Datastore是基于&amp;quot;Entity（实体）&amp;ldquo;这个概念，而且Entity和&amp;quot;对象&amp;quot;这个概念比较类似，同时Entity可以包括多个Property（属性），Property的类别有整数，浮点和字符串等，比如，可以设计一个名为&amp;quot;Person&amp;quot;的Entity，它包含名为&amp;quot;Name&amp;quot;的字符串Property和名为&amp;quot;Age&amp;quot;的整数Property。由于Datastore是&amp;quot;Schema-less&amp;quot;的，所以数据的Schema都由应用维护，而且能非常方便地对一个Entity所包含的属性进行增删和修改。在存储方面，一个Entity的实例可以被认为是一个普通的&amp;quot;Row（行）&amp;quot;，而包含所有这种Entity的实例的Table被称为Kind，比如，所有通过&amp;quot;Person&amp;quot;这个Entity生成实例，比如小吴，小朱和小华等，它们都会存放在同一个名为&amp;quot;Person&amp;quot;的Kind中。在结构方面，虽然也能通过特定的方式在Datastore中实现关系型结构，但是Datastore在设计上是为层次（Hierarchical）性结构&amp;quot;度身定做&amp;quot;的，有Root Entity和Child Entity之分，比如，可以把&amp;quot;Person&amp;quot;作为Root Entity（父实体），&amp;ldquo;Address&amp;quot;作为&amp;quot;Person&amp;quot;的Child Entity，两者合在一起可以称为一个&amp;quot;Entity Group&amp;rdquo;。这样做的好处是能将这两个实体集中一个BigTable本地分区中，而且能对这两个实体进行本地事务。&lt;/p&gt;&#xA;&lt;p&gt;接下来，将谈一下Datastore支持那些高级功能：其一是提供名为GQL（Google Query Language）的查询语言，GQL是SQL的一个非常小的子集，包括对&amp;rdquo;&amp;gt;&amp;quot;，&amp;quot;&amp;lt;&amp;ldquo;和&amp;rdquo;=&amp;ldquo;等操作符。其二是App Engine会根据代码中查询语句来自动生成相应Index，但不支持对Composite Index生成。其三是虽然由于Datastore分布式的设计，所以在速度方面和传统的关系型数据库相比一定的差距，但是Google的架构师保证大部分对Datastore的操作能在200ms之内完成，同时也得益于它的分布式设计，使得它在扩展性方面特别出色。其四是Datastore也支持在实体之间创建关系，比如在Python版App Engine中可以使用ReferenceProperty在实体间构建一对多和多对多的关系。&lt;/p&gt;&#xA;&lt;p&gt;下表为Datastore和传统的关系型数据库之间的比较：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Datastore&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;关系型数据库&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;SQL支持&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;只支持一些基本的查询&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;全部支持&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;主要结构&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;层次（Hierarchical）&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;关系&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Index&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;部分可自动创建&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;手动创建&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;事务&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;只支持在一个Entity Group内执行&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;支持&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;平均执行速度（ms）&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;低于200&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;低于100&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;扩展型&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;非常好&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;很困难，而且需要进行大量的修改&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;表1. Datastore和关系型数据库之间的比较&lt;/p&gt;&#xA;&lt;p&gt;最后，在接口方面，Python版提供一套私有的API和框架，在基本功能方面，比较容易学习，但在部分高级功能方面，比如关系和事务等方面，学习难度很高；Java版的API是基于JDO和JPA这两套官方的ORM标准，但是和现在事实的标准Hibernate有一定的差异。&lt;/p&gt;&#xA;&lt;h2 id=&#34;实现方面&#34;&gt;实现方面&lt;/h2&gt;&#xA;&lt;p&gt;在实现方面，Datastore是在BigTable的基础上构建的，所以本段会首先重新介绍一下BigTable，之后会介绍Datastore的两个组成部分：Entities Table和Index，最后会讲一下它在事务和备份这两方面所采用的机制。&lt;/p&gt;&#xA;&lt;h3 id=&#34;bigtable&#34;&gt;BigTable&lt;/h3&gt;&#xA;&lt;p&gt;在本系列的第一篇已经按照Google的Paper对BigTable技术做了一定的介绍，但其实BigTable本身其实没有之前介绍的那样复杂，其实就是一个非常巨大的Table，这也是它之所以名为&amp;quot;BigTable&amp;quot;的原因，而且结构就像图1那样非常简单，就是一个个ROW，每个ROW都有一个Name和一组Cloumn，但是为了支持海量的数据，它将这个大的Table进行分片（Sharding）处理，每台服务器存储一个海量的Table的一小部分，并且为了查询效率，会对这个Table进行排序。就像App Engine的创始人之一Ryan Barrett所说的那样&amp;quot;BigTable is a sharded, sorted array &amp;ldquo;。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/BigTable-Simple.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;图1. BigTable简化版模型&lt;/p&gt;&#xA;&lt;p&gt;在功能方面，首先，BigTable支持基本的CRUD操作，也就是增加(Create)，查询(Read)，更新(Update)和删除(Delete)。其次支持对Single-Row的事务与基于前缀和范围的扫描。&lt;/p&gt;&#xA;&lt;h3 id=&#34;entities-table&#34;&gt;Entities Table&lt;/h3&gt;&#xA;&lt;p&gt;它是Datastore最核心的Table，是以BigTable的形式存在的，主要用于存储所有的Entity，而且是格式非常简单，每行都会有一个Row Name，也称为Entity Key（可认为它是一个Entity的Primary Key），而且只有唯一一个Column，主要用于存放被序列化的Entity。每个Entity的Key的生成是基于它的父Entity（如果有的话）和其父至上的Entity，直到其Root Entity。以下图为例，timmy的父Entity是jane，jane的父Entity兼Root Entity是Ethel，所以最后timmy的Entity Key是&amp;rdquo;/Grandparent:Ethel/Parent:Jane/Child:Timmy&amp;rdquo;。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/entity-P20keys.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;图2. Entity Key的例子 Index&lt;/p&gt;</description>
			</item>
			<item>
				<title>探索GAE背后的奥秘之GAE架构</title>
				<link>https://blog.zhourunsheng.com/2011/07/%e6%8e%a2%e7%b4%a2gae%e8%83%8c%e5%90%8e%e7%9a%84%e5%a5%a5%e7%a7%98%e4%b9%8bgae%e6%9e%b6%e6%9e%84/</link>
				<pubDate>Sat, 02 Jul 2011 12:39:08 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/%e6%8e%a2%e7%b4%a2gae%e8%83%8c%e5%90%8e%e7%9a%84%e5%a5%a5%e7%a7%98%e4%b9%8bgae%e6%9e%b6%e6%9e%84/</guid>
				<description>&lt;p&gt;本篇将首先介绍App Engine的一些设计理念，接着将对App Engine的组成部分等进行介绍。&lt;/p&gt;&#xA;&lt;h2 id=&#34;设计理念&#34;&gt;设计理念&lt;/h2&gt;&#xA;&lt;p&gt;App Engine在设计理念方面，主要可以总结为下面这五条：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;重用现有的Google技术：大家都知道，重用是软件工程的核心理念之一，因为通过重用不仅能减低开发成本，而且能简化架构。在App Engine开发的过程中，重用的思想也得到了非常好的体现，比如Datastore是基于Google的bigtable技术，Images服务是基于Picasa的，用户认证服务是利用Google Account的，Email服务是基于Gmail的等。&lt;/li&gt;&#xA;&lt;li&gt;无状态：为了让更好地支持扩展，Google没有在应用服务器层存储任何重要的状态，而主要在datastore这层对数据进行持久化，这样当应用流量突然爆发时，可以通过为应用添加新的服务器来实现扩展。&lt;/li&gt;&#xA;&lt;li&gt;硬限制：App Engine对运行在其之上的应用代码设置了很多硬性限制，比如无法创建Socket和Thread等有限的系统资源，这样能保证不让一些恶性的应用影响到与其临近应用的正常运行，同时也能保证在应用之间能做到一定的隔离。&lt;/li&gt;&#xA;&lt;li&gt;利用Protocol Buffers技术来解决服务方面的异构性：应用服务器和很多服务相连，有可能会出现异构性的问题，比如应用服务器是用Java写的，而部分服务是用C++写的等。Google在这方面的解决方法是基于语言中立，平台中立和可扩展的Protocol Buffer，并且在App Engine平台上所有API的调用都需要在进行RPC（Remote Procedure Call，远程方面调用）之前被编译成Protocol Buffer的二进制格式。&lt;/li&gt;&#xA;&lt;li&gt;分布式数据库：因为App Engine将支撑海量的网络应用，所以独立数据库的设计肯定是不可取的，而且很有可能将面对起伏不定的流量，所以需要一个分布式的数据库来支撑海量的数据和海量的查询。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;组成部分&#34;&gt;组成部分&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/GAE-P20ARCH.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;图1. GAE的架构图简单而言，其架构可以分为三个部分：前端，Datastore和服务群：前端共包括四个模块：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Front End：既可以认为它是Load Balancer，也可以认为它是Proxy，它主要负责负载均衡和将请求转发给App Server（应用服务器）或者Static Files等工作。&lt;/li&gt;&#xA;&lt;li&gt;Static Files：在概念上，比较类似于CDN（Content Delivery Network，内容分发网络），用于存储和传送那些应用附带的静态文件，比如图片，CSS和JS脚本等。&lt;/li&gt;&#xA;&lt;li&gt;App Server：用于处理用户发来的请求，并根据请求的内容来调用后面的Datastore和服务群。&lt;/li&gt;&#xA;&lt;li&gt;App Master：是在应用服务器间调度应用，并将调度之后的情况通知Front End。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;datastore&#34;&gt;Datastore&lt;/h3&gt;&#xA;&lt;p&gt;它是基于BigTable技术的分布式数据库，虽然其也可以被理解成为一个服务，但是由于其是整个App Engine唯一存储持久化数据的地方，所以其是App Engine中一个非常核心的模块。其具体细节将在下篇和大家讨论。&lt;/p&gt;&#xA;&lt;p&gt;服务群整个服务群包括很多服务供App Server调用，比如Memcache，图形，用户，URL抓取和任务队列等。&lt;/p&gt;&#xA;&lt;h2 id=&#34;python版和java版app-engine在实现方面的区别&#34;&gt;Python版和Java版App Engine在实现方面的区别&lt;/h2&gt;&#xA;&lt;p&gt;因为大多数服务都可以被这两个版本共享，所以两者之间的区别主要集中在App Server端，Python版App Server应该是经过Google修改的Python Runtime，版本号应该是2.5.2，而Java版App Server是基于Jetty 6的，因为它的体积和最常用的Tomcat相比更娇小，这样能使得一台服务器支持更多的应用，而且其应该经过Google的一定的修改。&lt;/p&gt;&#xA;&lt;h2 id=&#34;流程&#34;&gt;流程&lt;/h2&gt;&#xA;&lt;p&gt;在这里举一个普通的HTTP请求的处理流程为例：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;用户发送一个HTTP请求。&lt;/li&gt;&#xA;&lt;li&gt;Front End接受这个请求，并将这个请求转发给一个空闲的App Server。&lt;/li&gt;&#xA;&lt;li&gt;App Server会处理这个请求。&lt;/li&gt;&#xA;&lt;li&gt;检查用于处理这个请求的Handler是不是已经被初始化了，如果没有的话，需要对这个Handler进行初始化。&lt;/li&gt;&#xA;&lt;li&gt;调用服务群的用户认证服务来对用户进行认证，如果失败的话，需要终止整个请求的处理工作，并返回用户无法被认证的信息。&lt;/li&gt;&#xA;&lt;li&gt;查看这个请求所需的数据是否已经缓存在Memcahe中，如果没有的话，将对Datastore发出查询请求来得到数据。&lt;/li&gt;&#xA;&lt;li&gt;通过整合上步得到数据来生成相关的HTML，并返回给用户。&lt;/li&gt;&#xA;&lt;li&gt;由于HTML里面会包含对一些静态文件的引用，比如图片和CSS等，所以当用户收到HTML之后，还会通过Front End对Static Files里面存储的静态文件进行读取。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;文章来源：http://www.dbanotes.net/arch/google_app_engine-arch_intro.html&lt;/p&gt;</description>
			</item>
			<item>
				<title>探索GAE背后的奥秘之GAE简介</title>
				<link>https://blog.zhourunsheng.com/2011/07/%e6%8e%a2%e7%b4%a2gae%e8%83%8c%e5%90%8e%e7%9a%84%e5%a5%a5%e7%a7%98%e4%b9%8bgae%e7%ae%80%e4%bb%8b/</link>
				<pubDate>Sat, 02 Jul 2011 12:30:44 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/%e6%8e%a2%e7%b4%a2gae%e8%83%8c%e5%90%8e%e7%9a%84%e5%a5%a5%e7%a7%98%e4%b9%8bgae%e7%ae%80%e4%bb%8b/</guid>
				<description>&lt;p&gt;通过前面两篇介绍，大家应该对Google强大的基础设施有一定的了解。本篇开始介绍构筑在这强大基础设施之上的Google App Engine。&lt;/p&gt;&#xA;&lt;h2 id=&#34;google-app-engine的介绍&#34;&gt;Google App Engine的介绍&lt;/h2&gt;&#xA;&lt;p&gt;由于发布S3和EC2这两个优秀的云服务，使得Amazon已经率先在云计算市场站稳了脚跟，而身为云计算这个浪潮的发起者之一的Google肯定不甘示弱，并在2008年四月份推出了Google App Engine这项PaaS服务，虽然现在无法称其为一个革命性的产品，但肯定是现在市面上最成熟，并且功能最全面的PaaS平台。&lt;/p&gt;&#xA;&lt;p&gt;Google App Engine 提供一整套开发组件来让用户轻松地在本地构建和调试网络应用，之后能让用户在Google强大的基础设施上部署和运行网络应用程序，并自动根据应用所承受的负载来对应用进行扩展，并免去用户对应用和服务器等的维护工作。同时提供大量的免费额度和灵活的资费标准。在开发语言方面，现支持Java和Python这两种语言，并为这两种语言提供基本相同的功能和API。&lt;/p&gt;&#xA;&lt;p&gt;目前已经支持google开发的第三种语言Go语言平台的开发了。&lt;/p&gt;&#xA;&lt;p&gt;功能在功能上，主要有六个方面：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;动态网络服务，并提供对常用网络技术的支持，比如SSL等。&lt;/li&gt;&#xA;&lt;li&gt;持久存储空间，并支持简单的查询和本地事务。&lt;/li&gt;&#xA;&lt;li&gt;能对应用进行自动扩展和负载平衡。&lt;/li&gt;&#xA;&lt;li&gt;一套功能完整的本地开发环境，可以让用户在本机上对App Engine进行开发和调试。&lt;/li&gt;&#xA;&lt;li&gt;支持包括Email和用户认证等多种服务。&lt;/li&gt;&#xA;&lt;li&gt;提供能在指定时间和定期触发事件的计划任务和能实现后台处理的任务队列。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;使用流程整个使用流程主要包括五个步骤：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;下载SDK和IDE，并在本地搭建开发环境。&lt;/li&gt;&#xA;&lt;li&gt;在本地对应用进行开发和调试。&lt;/li&gt;&#xA;&lt;li&gt;使用GAE自带上传工具来将应用部署到平台上。&lt;/li&gt;&#xA;&lt;li&gt;在管理界面中启动这个应用。&lt;/li&gt;&#xA;&lt;li&gt;利用管理界面来监控整个应用的运行状态和资费。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;由于本系列是专注于GAE的实现和设计两方面，所以不会对GAE的使用有非常深入地介绍，如果希望大家对GAE的使用方面有更深的理解，具体可以参看一下GAE的官方文档。&lt;/p&gt;&#xA;&lt;h2 id=&#34;google-app-engine的主要组成部分&#34;&gt;Google App Engine的主要组成部分&lt;/h2&gt;&#xA;&lt;p&gt;主要可分为五部分：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;应用服务器：主要是用于接收来自于外部的Web请求。&lt;/li&gt;&#xA;&lt;li&gt;Datastore：主要用于对信息进行持久化，并基于Google著名的BigTable技术。&lt;/li&gt;&#xA;&lt;li&gt;服务：除了必备的应用服务器和Datastore之外，GAE还自带很多服务来帮助开发者，比如：Memcache，邮件，网页抓取，任务队列，XMPP等。&lt;/li&gt;&#xA;&lt;li&gt;管理界面：主要用于管理应用并监控应用的运行状态，比如，消耗了多少资源，发送了多少邮件和应用运行的日志等。&lt;/li&gt;&#xA;&lt;li&gt;本地开发环境：主要是帮助用户在本地开发和调试基于GAE的应用，包括用于安全调试的沙盒，SDK和IDE插件等工具。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;应用服务器&#34;&gt;应用服务器&lt;/h2&gt;&#xA;&lt;p&gt;应用服务器依据其支持语言的不同而有不同的实现。&lt;/p&gt;&#xA;&lt;h3 id=&#34;python的实现&#34;&gt;Python的实现&lt;/h3&gt;&#xA;&lt;p&gt;Python版应用服务器的基础就是普通的Python 2.5.2版的Runtime，并考虑在未来版本中添加对Python 3的支持，但是因为Python 3对Python而言，就好比Java2之于Java1，跨度非常大，所以引入Python3的难度很大。在Web技术方面，支持诸如Django，CherryPy，Pylons和Web2py等Python Web框架，并自带名为&amp;quot;WSGI&amp;quot;的CGI框架。虽然Python版应用服务器是基于标准的Python Runtime，但是为了安全并更好地适应App Engine的整体架构，对运行在应用服务器内的代码设置了很多方面的限制，比如不能加载用C编写Python模块和无法创建Socket等。&lt;/p&gt;&#xA;&lt;h3 id=&#34;java的实现&#34;&gt;Java的实现&lt;/h3&gt;&#xA;&lt;p&gt;在实现方面，Java版应用服务器和Python版基本一致，也是基于标准的Java Web容器，而且选用了轻量级的Jetty技术，并跑在Java 6上。通过这个Web容器不仅能运行常见的Java Web 技术，包括Servlet，JSP，JSTL和GWT等，而且还能跑大多数常用的Java API（App Engine有一个 The JRE Class White List&lt;/p&gt;&#xA;&lt;p&gt;来定义那些Java API能在App Engine的环境中被使用）和一些基于JVM的脚本语言，例如JavaScript，Ruby或Scala等，但同样无法创建Socket和Thread，或者对文件进行读写，也不支持一些比较高阶的API和框架，包括JDBC，JSF，Struts 2，RMI，JAX-RPC和Hibernate等。&lt;/p&gt;&#xA;&lt;h2 id=&#34;datastore&#34;&gt;Datastore&lt;/h2&gt;&#xA;&lt;p&gt;Datastore提供了一整套强大的分布式数据存储和查询服务，并能通过水平扩展来支撑海量的数据。但Datastore并不是传统的关系型数据库，它主要以&amp;quot;Entity&amp;quot;的形式存储数据，一个Entity包括一个Kind（在概念上和数据库的Table比较类似）和一系列属性。&lt;/p&gt;&#xA;&lt;p&gt;Datastore提供强一致性和乐观（optimistic）同步控制，而在事务方面，则支持本地事务，也就是在只能同一个Entity Group内执行事务。&lt;/p&gt;&#xA;&lt;p&gt;在接口方面，Python版提供了非常丰富的接口，而且还包括名为GQL的查询语言，而Java版则提供了标准的JDO和JPA这两套API。&lt;/p&gt;</description>
			</item>
			<item>
				<title>探索GAE背后的奥秘之Google的整体架构猜想</title>
				<link>https://blog.zhourunsheng.com/2011/07/%e6%8e%a2%e7%b4%a2gae%e8%83%8c%e5%90%8e%e7%9a%84%e5%a5%a5%e7%a7%98%e4%b9%8bgoogle%e7%9a%84%e6%95%b4%e4%bd%93%e6%9e%b6%e6%9e%84%e7%8c%9c%e6%83%b3/</link>
				<pubDate>Sat, 02 Jul 2011 12:14:38 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/%e6%8e%a2%e7%b4%a2gae%e8%83%8c%e5%90%8e%e7%9a%84%e5%a5%a5%e7%a7%98%e4%b9%8bgoogle%e7%9a%84%e6%95%b4%e4%bd%93%e6%9e%b6%e6%9e%84%e7%8c%9c%e6%83%b3/</guid>
				<description>&lt;p&gt;本文是基于现有的公开资料和个人的经验来对Google的整体架构进行总结和猜想。&lt;/p&gt;&#xA;&lt;p&gt;在软件工程界，大家有一个共识，那就是&amp;quot;需求决定架构&amp;quot;，也就是说，架构的发展是为了更好地支撑应用。那么本文在介绍架构之前，先介绍一下Google所提供的主要产品有哪些？&lt;/p&gt;&#xA;&lt;h2 id=&#34;产品&#34;&gt;产品&lt;/h2&gt;&#xA;&lt;p&gt;对于Google和它几个主要产品，比如搜索和邮件等，大家已经非常熟悉了，但是其提供服务的不只于此，并主要可分为六大类：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;各种搜索：网页搜索，图片搜索和视频搜索等。&lt;/li&gt;&#xA;&lt;li&gt;广告系统：AdWords和AdSense。&lt;/li&gt;&#xA;&lt;li&gt;生产力工具：Gmail和Google Apps等。&lt;/li&gt;&#xA;&lt;li&gt;地理产品：地图，Google Earth和Google Sky等。&lt;/li&gt;&#xA;&lt;li&gt;视频播放：Youtube。&lt;/li&gt;&#xA;&lt;li&gt;PaaS平台：Google App Engine。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;设计理念&#34;&gt;设计理念&lt;/h2&gt;&#xA;&lt;p&gt;根据现有的资料，Google的设计理念主要可以总结出下面这六条：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Scale，Scale，Scale Scale：因为Google大多数服务所面对的客户都是百万级别以上的，导致Scale也就是伸缩已经深深植入Google的DNA中，而且Google为了帮助其开发人员更好地开发分布式应用和服务，不仅研发了用于大规模数据处理MapReduce框架，还推出了用于部署分布式应用的PaaS平台Google App Engine。&lt;/li&gt;&#xA;&lt;li&gt;容错：一个分布式系统，就算是构建在昂贵的小型机或者大型机之上，也会不时地出现软件或者硬件方面的错误，何况Google的分布式系统还是浇筑在便宜的X86服务器之上，即使其设备标称的MTBF（平均故障间隔时间）很高，但是由于一个集群内的设备极多，导致其错误发生的几率非常高，比如李开复曾经提过这样一个例子：在一个拥有两万台X86服务器的集群中，每天大约有110台机器会出现宕机等恶劣情况，所以容错是一个不可被忽视的问题，同时这点也被Google院士Jeffrey Dean在多次演讲中提到。&lt;/li&gt;&#xA;&lt;li&gt;低延迟：延迟是影响用户体验的一个非常重要的因素，Google的副总裁Marissa Mayer曾经说过：&amp;ldquo;如果每次搜索的时间多延迟半秒的话，那么使用搜索服务的人将减少20%&amp;quot;，从这个例子可以看出，低延迟对用户体验非常关键，而且为了避免光速和复杂网络环境造成的延时，Google已在很多地区设置了本地的数据中心。&lt;/li&gt;&#xA;&lt;li&gt;廉价的硬件和软件：由于Google每天所处理的数据和请求在规模上是史无前例的，所以现有的服务器和商业软件厂商是很难为Google&amp;quot;度身定做&amp;quot;一套分布式系统，而且就算能够设计和生产出来，其价格也是Google所无法承受的，所以其上百万台服务器基本采用便宜的X86系统和开源的Linux，并开发了一整套分布式软件栈，其中就包括上篇提到的MapReduce，BigTable和GFS等。&lt;/li&gt;&#xA;&lt;li&gt;优先移动计算：虽然随着摩尔定律的不断发展，使得很多资源都处于不断地增长中，比如带宽等，但是到现在为止移动数据成本远大于移动计算的成本，所以在处理大规模数据的时候，Google还是倾向于移动计算，而不是移动数据。&lt;/li&gt;&#xA;&lt;li&gt;服务模式：在Google的系统中，服务是相当常用的，比如其核心的搜索引擎需要依赖700-1000个内部服务，而且服务这种松耦合的开发模式在测试，开发和扩展等方面都有优势，因为它适合小团队开发，并且便于测试。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;整体架构的猜想&#34;&gt;整体架构的猜想&lt;/h2&gt;&#xA;&lt;p&gt;在整体架构这部分，首先会举出Google的三种主要工作负载，接着会试着对数据中心进行分类，最后会做一下总结。&lt;/p&gt;&#xA;&lt;p&gt;三种工作负载对于Google而言，其实工作负载并不仅仅只有搜索这一种，主要可以被分为三大类：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;本地交互：用于在用户本地为其提供基本的Google服务，比如网页搜索等，但会将内容的生成和管理工作移交给下面的内容交付系统，比如：生成搜索所需的Index等。通过本地交互，能让用户减少延迟，从而提高用户体验，而且其对SLA要求很高，因为是直接面对客户的。&lt;/li&gt;&#xA;&lt;li&gt;内容交付：用于为Google大多数服务提供内容的存储，生成和管理工作，比如创建搜索所需的Index，存储YouTube的视频和GMail的数据等，而且内容交互系统主要基于Google自己开发那套分布式软件栈。还有，这套系统非常重视吞吐量和成本，而不是SLA。&lt;/li&gt;&#xA;&lt;li&gt;关键业务：主要包括Google一些企业级事务，比如用于企业日常运行的客户管理和人力资源等系统和赚取利润的广告系统（AdWords和AdSense），同时关键业务对SLA的要求非常高。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;两类数据中心&#34;&gt;两类数据中心&lt;/h3&gt;&#xA;&lt;p&gt;按照2008年数据，Google在全球有37个数据中心，其中19个在美国，12个在欧洲，3个在亚洲(北京、香港、东京)，另外3个分布于俄罗斯和南美。下图显示其中36个数据中心在全球的分布：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/google_map_worldwide.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;图1. 2008年Google全球数据中心分布图根据 Jeffrey Dean&lt;/p&gt;&#xA;&lt;p&gt;在2009年末的一次演讲和最近几期季报可以推测出Google并没有在2009年过多地增加全球数据中心的数量，总数应该还是稍多于36个，但很有可能在台湾、马来西亚、立陶宛等地增加新的数据中心。&lt;/p&gt;&#xA;&lt;p&gt;虽然Google拥有数据中心数量很多，但是它们之间存在一定的差异，而且主要可以分为两类：其一是巨型数据中心，其二是大中型数据中心。&lt;/p&gt;&#xA;&lt;h3 id=&#34;巨型数据中心&#34;&gt;巨型数据中心&lt;/h3&gt;&#xA;&lt;p&gt;服务器规模应该在十万台以上，常坐落于发电厂旁以获得更廉价的能源，主要用于Google内部服务，也就是内容交付服务，而且在设计方面主要关注成本和吞吐量，所以引入了大量的定制硬件和软件，来减低PUE并提升处理量，但其对SLA方面要求不是特别严厉，只要保证绝大部分时间可用即可。下图是Google巨型数据中心的一个代表，这个数据中心位于美国俄勒冈州北部哥伦比亚河畔的Dalles市，总占地面积接近30英亩，并占用了附近一个1.8GW水力发电站的大部分电力输出，当这个数据中心全部投入使用后，将消耗103兆瓦的电力，这相当于一个中小型城市的整个生活用电。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/google-P20DC.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;图2. Google在美国俄勒冈州哥伦比亚河畔的巨型数据中心近景图大中型数据中心：服务器规模在千台至万台左右，可用于本地交互或者关键业务，在设计方面上非常重视延迟和高可用性，使得其坐落地点尽可能地接近用户而且采用了标准硬件和软件，比如Dell的服务器和MySQL的数据库等，常见的PUE大概在1.5和1.9之间。本来坐落于北京朝阳区酒仙桥附近的&amp;quot;世纪互联&amp;quot;机房的Google中国数据中心也属于大中型数据中心这类，其采用的硬件有DELL的工作站和Juniper的防火墙等，下图为其一角。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/google-qianzhongguo.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;图3. Google前中国数据中心的一角（参[26]）关于两者的区别：具体请查看下表：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;巨型数据中心&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;大中型数据中心&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;工作负载&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;内容交付&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;本地交互/关键业务&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;地点&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;离发电厂近&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;离用户近&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;设计特点&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;高吞吐，低成本&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;低延迟，高可用性&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;服务器定制化&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;多&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;少&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;SLA&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;普通&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;高&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;服务器数量&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;十万台以上&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;千台以上&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;数据中心数量&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;十个以内&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;几十个&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;PUE估值&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1.2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1.5&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;表1. 巨型与大中型数据中心的对比表&lt;/p&gt;</description>
			</item>
			<item>
				<title>探索GAE背后的奥秘之Google的核心技术</title>
				<link>https://blog.zhourunsheng.com/2011/07/%e6%8e%a2%e7%b4%a2gae%e8%83%8c%e5%90%8e%e7%9a%84%e5%a5%a5%e7%a7%98%e4%b9%8bgoogle%e7%9a%84%e6%a0%b8%e5%bf%83%e6%8a%80%e6%9c%af/</link>
				<pubDate>Fri, 01 Jul 2011 17:44:02 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/07/%e6%8e%a2%e7%b4%a2gae%e8%83%8c%e5%90%8e%e7%9a%84%e5%a5%a5%e7%a7%98%e4%b9%8bgoogle%e7%9a%84%e6%a0%b8%e5%bf%83%e6%8a%80%e6%9c%af/</guid>
				<description>&lt;p&gt;本系列文章基于公开资料对Google App Engine的实现机制这个话题进行深度探讨。在切入Google App Engine之前，首先会对Google的核心技术和其整体架构进行分析，以帮助大家之后更好地理解Google App Engine的实现。&lt;/p&gt;&#xA;&lt;p&gt;本篇将主要介绍Google的十个核心技术，而且可以分为四大类：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;分布式基础设施：GFS、Chubby 和 Protocol Buffer。&lt;/li&gt;&#xA;&lt;li&gt;分布式大规模数据处理：MapReduce 和 Sawzall。&lt;/li&gt;&#xA;&lt;li&gt;分布式数据库技术：BigTable 和数据库 Sharding。&lt;/li&gt;&#xA;&lt;li&gt;数据中心优化技术：数据中心高温化、12V电池和服务器整合。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;分布式基础设施&#34;&gt;分布式基础设施&lt;/h2&gt;&#xA;&lt;h3 id=&#34;gfs&#34;&gt;GFS&lt;/h3&gt;&#xA;&lt;p&gt;由于搜索引擎需要处理海量的数据，所以Google的两位创始人Larry Page和Sergey Brin在创业初期设计一套名为&amp;quot;BigFiles&amp;quot;的文件系统，而GFS（全称为&amp;quot;Google File System&amp;quot;）这套分布式文件系统则是&amp;quot;BigFiles&amp;quot;的延续。&lt;/p&gt;&#xA;&lt;p&gt;首先，介绍它的架构，GFS主要分为两类节点：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Master节点：主要存储与数据文件相关的元数据，而不是Chunk（数据块）。元数据包括一个能将64位标签映射到数据块的位置及其组成文件的表格，数据块副本位置和哪个进程正在读写特定的数据块等。还有Master节点会周期性地接收从每个Chunk节点来的更新（&amp;ldquo;Heart-beat&amp;rdquo;）来让元数据保持最新状态。&lt;/li&gt;&#xA;&lt;li&gt;Chunk节点：顾名思义，肯定用来存储Chunk，数据文件通过被分割为每个默认大小为64MB的Chunk的方式存储，而且每个Chunk有唯一一个64位标签，并且每个Chunk都会在整个分布式系统被复制多次，默认为3次。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;下图就是GFS的架构图：&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;/wp-content/uploads/2011/07/Google-file-system.png&#34;&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/Google-file-system.png&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&#xA;图1. GFS的架构图（参片[15]）接着，在设计上，GFS主要有八个特点：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;大文件和大数据块：数据文件的大小普遍在GB级别，而且其每个数据块默认大小为64MB，这样做的好处是减少了元数据的大小，能使Master节点能够非常方便地将元数据放置在内存中以提升访问效率。&lt;/li&gt;&#xA;&lt;li&gt;操作以添加为主：因为文件很少被删减或者覆盖，通常只是进行添加或者读取操作，这样能充分考虑到硬盘线性吞吐量大和随机读写慢的特点。&lt;/li&gt;&#xA;&lt;li&gt;支持容错：首先，虽然当时为了设计方便，采用了单Master的方案，但是整个系统会保证每个Master都会有其相对应的复制品，以便于在Master节点出现问题时进行切换。其次，在Chunk层，GFS已经在设计上将节点失败视为常态，所以能非常好地处理Chunk节点失效的问题。&lt;/li&gt;&#xA;&lt;li&gt;高吞吐量：虽然其单个节点的性能无论是从吞吐量还是延迟都很普通，但因为其支持上千的节点，所以总的数据吞吐量是非常惊人的。&lt;/li&gt;&#xA;&lt;li&gt;保护数据：首先，文件被分割成固定尺寸的数据块以便于保存，而且每个数据块都会被系统复制三份。&lt;/li&gt;&#xA;&lt;li&gt;扩展能力强：因为元数据偏小，使得一个Master节点能控制上千个存数据的Chunk节点。&lt;/li&gt;&#xA;&lt;li&gt;支持压缩：对于那些稍旧的文件，可以通过对它进行压缩，来节省硬盘空间，并且压缩率非常惊人，有时甚至接近90%。&lt;/li&gt;&#xA;&lt;li&gt;用户空间：虽然在用户空间运行在运行效率方面稍差，但是更便于开发和测试，还有能更好利用Linux的自带的一些POSIX API。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;现在Google内部至少运行着200多个GFS集群，最大的集群有几千台服务器，并且服务于多个Google服务，比如Google搜索。但由于GFS主要为搜索而设计，所以不是很适合新的一些Google产品，比YouTube、Gmail和更强调大规模索引和实时性的Caffeine搜索引擎等，所以Google已经在开发下一代GFS，代号为&amp;quot;Colossus&amp;quot;，并且在设计方面有许多不同，比如：支持分布式Master节点来提升高可用性并能支撑更多文件，Chunk节点能支持1MB大小的chunk以支撑低延迟应用的需要。&lt;/p&gt;&#xA;&lt;h3 id=&#34;chubby&#34;&gt;Chubby&lt;/h3&gt;&#xA;&lt;p&gt;简单的来说，Chubby 属于分布式锁服务，通过 Chubby，一个分布式系统中的上千个client都能够对于某项资源进行&amp;quot;加锁&amp;quot;或者&amp;quot;解锁&amp;quot;，常用于BigTable的协作工作，在实现方面是通过对文件的创建操作来实现&amp;quot;加锁&amp;quot;，并基于著名科学家Leslie Lamport的Paxos算法。&lt;/p&gt;&#xA;&lt;h3 id=&#34;protocol-buffer&#34;&gt;Protocol Buffer&lt;/h3&gt;&#xA;&lt;p&gt;Protocol Buffer，是Google内部使用一种语言中立、平台中立和可扩展的序列化结构化数据的方式，并提供 Java、C++ 和 Python 这三种语言的实现，每一种实现都包含了相应语言的编译器以及库文件，而且它是一种二进制的格式，所以其速度是使用 XML&lt;/p&gt;&#xA;&lt;p&gt;进行数据交换的10倍左右。它主要用于两个方面：其一是RPC通信，它可用于分布式应用之间或者异构环境下的通信。其二是数据存储方面，因为它自描述，而且压缩很方便，所以可用于对数据进行持久化，比如存储日志信息，并可被Map Reduce程序处理。与Protocol Buffer比较类似的产品还有Facebook的 Thrift，而且 Facebook 号称Thrift在速度上还有一定的优势。&lt;/p&gt;&#xA;&lt;h2 id=&#34;分布式大规模数据处理&#34;&gt;分布式大规模数据处理&lt;/h2&gt;&#xA;&lt;h3 id=&#34;mapreduce&#34;&gt;MapReduce&lt;/h3&gt;&#xA;&lt;p&gt;首先，在Google数据中心会有大规模数据需要处理，比如被网络爬虫（Web Crawler）抓取的大量网页等。由于这些数据很多都是PB级别，导致处理工作不得不尽可能的并行化，而Google为了解决这个问题，引入了MapReduce这个编程模型，MapReduce是源自函数式语言，主要通过&amp;quot;Map（映射）&amp;ldquo;和&amp;quot;Reduce（化简）&amp;ldquo;这两个步骤来并行处理大规模的数据集。Map会先对由很多独立元素组成的逻辑列表中的每一个元素进行指定的操作，且原始列表不会被更改，会创建多个新的列表来保存Map的处理结果。也就意味着，Map操作是高度并行的。当Map工作完成之后，系统会先对新生成的多个列表进行清理（Shuffle）和排序，之后会这些新创建的列表进行Reduce操作，也就是对一个列表中的元素根据Key值进行适当的合并。&#xA;下图为MapReduce的运行机制：&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;/wp-content/uploads/2011/07/MapReduce.png&#34;&gt;&lt;img src=&#34;/wp-content/uploads/2011/07/MapReduce.png&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&#xA;图2. MapReduce的运行机制（参[19]）&lt;/p&gt;</description>
			</item>
			<item>
				<title>同步wordpress文章到CSDN</title>
				<link>https://blog.zhourunsheng.com/2011/06/%e5%90%8c%e6%ad%a5wordpress%e6%96%87%e7%ab%a0%e5%88%b0csdn/</link>
				<pubDate>Thu, 30 Jun 2011 23:29:14 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/06/%e5%90%8c%e6%ad%a5wordpress%e6%96%87%e7%ab%a0%e5%88%b0csdn/</guid>
				<description>&lt;p&gt;本文实现了wordpress的插件开发，自动同步 wordpress的文章到CSDN。&lt;/p&gt;&#xA;&lt;p&gt;== Description ==&#xA;同步发布 WordPress 博文到支持 Metaweblog API 的博客系统.&#xA;Version 1.0 支持功能&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;支持发布wordpress的博文到实现Metaweblog API 的博客系统（CSDN，博客园等）&lt;/li&gt;&#xA;&lt;li&gt;支持将Wordpress中文章链接发布到其他博客系统。&lt;/li&gt;&#xA;&lt;li&gt;支持发布文章的自动归类&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;== Installation ==&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;上传整个文件夹 wp2metaweblog  到 &lt;code&gt;/wp-content/plugins/&lt;/code&gt; 目录&lt;/li&gt;&#xA;&lt;li&gt;后台控制面板&amp;quot;插件(Plugins)&amp;ldquo;中激活 wp2metaweblog 插件&lt;/li&gt;&#xA;&lt;li&gt;后台控制面板&amp;quot;配置(Settings)-&amp;gt;wp2metaweblog&amp;quot;中配置插件信息（博客系统的账户信息）&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;软件配置界面:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/06/wp2metaweblog-Screenshots-300x170.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;软件下载地址：http://code.google.com/p/wp2metaweblog/downloads/list&lt;/p&gt;</description>
			</item>
			<item>
				<title>AsyncQueryHandler</title>
				<link>https://blog.zhourunsheng.com/2011/06/asyncqueryhandler/</link>
				<pubDate>Thu, 30 Jun 2011 14:03:54 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/06/asyncqueryhandler/</guid>
				<description>&lt;p&gt;Class Overview A helper class to help make handling asynchronous&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://developer.android.com/reference/android/content/ContentResolver.html&#34;&gt;ContentResolver&lt;/a&gt; queries easier.&lt;/p&gt;&#xA;&lt;p&gt;AsyncQueryHandler的目的就是为了将查询数据库的操作放到后台执行，当后台数据查询完了以后，再通知界面的更新，以此来提高前台页面的显示速度！&lt;/p&gt;&#xA;&lt;p&gt;内部的实现机制其实就是Handler，我们自己平时做大数据量显示的时候也用到过，另起一个线程去执行任务，当后台计算完成的时候通过Handler发送Message来重绘界面，这个的实现原理类似，做了一层封装而已，方便开发人员的调用。&lt;/p&gt;&#xA;&lt;h2 id=&#34;public-methods&#34;&gt;Public Methods&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;修饰符&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;方法&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;final void&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;http://developer.android.com/reference/android/content/AsyncQueryHandler.html#cancelOperation%28int%29&#34;&gt;cancelOperation&lt;/a&gt;(int token) Attempts to cancel operation that has not already started.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;void&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;http://developer.android.com/reference/android/content/AsyncQueryHandler.html#handleMessage%28android.os.Message%29&#34;&gt;handleMessage&lt;/a&gt;(&lt;a href=&#34;http://developer.android.com/reference/android/os/Message.html&#34;&gt;Message&lt;/a&gt; msg) Subclasses must implement this to receive messages.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;final void&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;http://developer.android.com/reference/android/content/AsyncQueryHandler.html#startDelete%28int,%20java.lang.Object,%20android.net.Uri,%20java.lang.String,%20java.lang.String%5B%5D%29&#34;&gt;startDelete&lt;/a&gt;(int token, &lt;a href=&#34;http://developer.android.com/reference/java/lang/Object.html&#34;&gt;Object&lt;/a&gt; cookie, &lt;a href=&#34;http://developer.android.com/reference/android/net/Uri.html&#34;&gt;Uri&lt;/a&gt; uri, &lt;a href=&#34;http://developer.android.com/reference/java/lang/String.html&#34;&gt;String&lt;/a&gt; selection, &lt;a href=&#34;http://developer.android.com/reference/java/lang/String.html&#34;&gt;String[]&lt;/a&gt; selectionArgs) This method begins an asynchronous delete.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;final void&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;http://developer.android.com/reference/android/content/AsyncQueryHandler.html#startInsert%28int,%20java.lang.Object,%20android.net.Uri,%20android.content.ContentValues%29&#34;&gt;startInsert&lt;/a&gt;(int token, &lt;a href=&#34;http://developer.android.com/reference/java/lang/Object.html&#34;&gt;Object&lt;/a&gt; cookie, &lt;a href=&#34;http://developer.android.com/reference/android/net/Uri.html&#34;&gt;Uri&lt;/a&gt; uri, &lt;a href=&#34;http://developer.android.com/reference/android/content/ContentValues.html&#34;&gt;ContentValues&lt;/a&gt; initialValues) This method begins an asynchronous insert.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;void&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;http://developer.android.com/reference/android/content/AsyncQueryHandler.html#startQuery%28int,%20java.lang.Object,%20android.net.Uri,%20java.lang.String%5B%5D,%20java.lang.String,%20java.lang.String%5B%5D,%20java.lang.String%29&#34;&gt;startQuery&lt;/a&gt;(int token, &lt;a href=&#34;http://developer.android.com/reference/java/lang/Object.html&#34;&gt;Object&lt;/a&gt; cookie, &lt;a href=&#34;http://developer.android.com/reference/android/net/Uri.html&#34;&gt;Uri&lt;/a&gt; uri, &lt;a href=&#34;http://developer.android.com/reference/java/lang/String.html&#34;&gt;String[]&lt;/a&gt; projection, &lt;a href=&#34;http://developer.android.com/reference/java/lang/String.html&#34;&gt;String&lt;/a&gt; selection, &lt;a href=&#34;http://developer.android.com/reference/java/lang/String.html&#34;&gt;String[]&lt;/a&gt; selectionArgs, &lt;a href=&#34;http://developer.android.com/reference/java/lang/String.html&#34;&gt;String&lt;/a&gt; orderBy) This method begins an asynchronous query.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;final void&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;http://developer.android.com/reference/android/content/AsyncQueryHandler.html#startUpdate%28int,%20java.lang.Object,%20android.net.Uri,%20android.content.ContentValues,%20java.lang.String,%20java.lang.String%5B%5D%29&#34;&gt;startUpdate&lt;/a&gt;(int token, &lt;a href=&#34;http://developer.android.com/reference/java/lang/Object.html&#34;&gt;Object&lt;/a&gt; cookie, &lt;a href=&#34;http://developer.android.com/reference/android/net/Uri.html&#34;&gt;Uri&lt;/a&gt; uri, &lt;a href=&#34;http://developer.android.com/reference/android/content/ContentValues.html&#34;&gt;ContentValues&lt;/a&gt; values, &lt;a href=&#34;http://developer.android.com/reference/java/lang/String.html&#34;&gt;String&lt;/a&gt; selection, &lt;a href=&#34;http://developer.android.com/reference/java/lang/String.html&#34;&gt;String[]&lt;/a&gt; selectionArgs) This method begins an asynchronous update.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;protected-methods&#34;&gt;Protected Methods&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;返回值&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;方法&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;http://developer.android.com/reference/android/os/Handler.html&#34;&gt;Handler&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;http://developer.android.com/reference/android/content/AsyncQueryHandler.html#createHandler%28android.os.Looper%29&#34;&gt;createHandler&lt;/a&gt;(&lt;a href=&#34;http://developer.android.com/reference/android/os/Looper.html&#34;&gt;Looper&lt;/a&gt; looper)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;void&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;http://developer.android.com/reference/android/content/AsyncQueryHandler.html#onDeleteComplete%28int,%20java.lang.Object,%20int%29&#34;&gt;onDeleteComplete&lt;/a&gt;(int token, &lt;a href=&#34;http://developer.android.com/reference/java/lang/Object.html&#34;&gt;Object&lt;/a&gt; cookie, int result) Called when an asynchronous delete is completed.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;void&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;http://developer.android.com/reference/android/content/AsyncQueryHandler.html#onInsertComplete%28int,%20java.lang.Object,%20android.net.Uri%29&#34;&gt;onInsertComplete&lt;/a&gt;(int token, &lt;a href=&#34;http://developer.android.com/reference/java/lang/Object.html&#34;&gt;Object&lt;/a&gt; cookie, &lt;a href=&#34;http://developer.android.com/reference/android/net/Uri.html&#34;&gt;Uri&lt;/a&gt; uri) Called when an asynchronous insert is completed.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;void&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;http://developer.android.com/reference/android/content/AsyncQueryHandler.html#onQueryComplete%28int,%20java.lang.Object,%20android.database.Cursor%29&#34;&gt;onQueryComplete&lt;/a&gt;(int token, &lt;a href=&#34;http://developer.android.com/reference/java/lang/Object.html&#34;&gt;Object&lt;/a&gt; cookie, &lt;a href=&#34;http://developer.android.com/reference/android/database/Cursor.html&#34;&gt;Cursor&lt;/a&gt; cursor) Called when an asynchronous query is completed.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;void&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;http://developer.android.com/reference/android/content/AsyncQueryHandler.html#onUpdateComplete%28int,%20java.lang.Object,%20int%29&#34;&gt;onUpdateComplete&lt;/a&gt;(int token, &lt;a href=&#34;http://developer.android.com/reference/java/lang/Object.html&#34;&gt;Object&lt;/a&gt; cookie, int result) Called when an asynchronous update is completed.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;其实这些方法都是成对来使用的，比如查询操作，我们通过调用 startDelete (int token,Object cookie,Uri uri,String selection,String[]&lt;/p&gt;</description>
			</item>
			<item>
				<title>每个程序员都该阅读的书</title>
				<link>https://blog.zhourunsheng.com/2011/06/%e6%af%8f%e4%b8%aa%e7%a8%8b%e5%ba%8f%e5%91%98%e9%83%bd%e8%af%a5%e9%98%85%e8%af%bb%e7%9a%84%e4%b9%a6/</link>
				<pubDate>Thu, 30 Jun 2011 09:39:29 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/06/%e6%af%8f%e4%b8%aa%e7%a8%8b%e5%ba%8f%e5%91%98%e9%83%bd%e8%af%a5%e9%98%85%e8%af%bb%e7%9a%84%e4%b9%a6/</guid>
				<description>&lt;p&gt;调查问卷：What is the single most influential book every programmer should read?&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Code Complete (2nd Ed) by Steve McConnell 《代码大全（第二版）》 2.&lt;/p&gt;&#xA;&lt;p&gt;Pragmatic Programmer 《程序员修炼之道》 3.&lt;/p&gt;&#xA;&lt;p&gt;Structure and Interpretation of Computer Programs 《计算机程序的构造和解释》 4.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://rads.stackoverflow.com/amzn/click/0131103628&#34;&gt;The C Programming Language&lt;/a&gt; 《C程序设计语言》 5.&lt;/p&gt;&#xA;&lt;p&gt;Introduction to algorithms (Cormen, Leiserson, Rivest, Stein) 《算法导论》 6.&lt;/p&gt;&#xA;&lt;p&gt;Refactoring: Improving the Design of Existing Code 《重构：改善既有代码的设计》 7.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://c2.com/cgi/wiki?DesignPatternsBook&#34;&gt;Design Patterns&lt;/a&gt; 《设计模式》 8.&lt;/p&gt;&#xA;&lt;p&gt;The Mythical Man-Month 《人月神话》 9.&lt;/p&gt;&#xA;&lt;p&gt;The Art of Computer Programming 《计算机程序设计艺术》 10.&lt;/p&gt;</description>
			</item>
			<item>
				<title>推荐15个国外优秀的PHP在线学习网站</title>
				<link>https://blog.zhourunsheng.com/2011/06/%e6%8e%a8%e8%8d%9015%e4%b8%aa%e5%9b%bd%e5%a4%96%e4%bc%98%e7%a7%80%e7%9a%84php%e5%9c%a8%e7%ba%bf%e5%ad%a6%e4%b9%a0%e7%bd%91%e7%ab%99/</link>
				<pubDate>Fri, 24 Jun 2011 09:12:21 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/06/%e6%8e%a8%e8%8d%9015%e4%b8%aa%e5%9b%bd%e5%a4%96%e4%bc%98%e7%a7%80%e7%9a%84php%e5%9c%a8%e7%ba%bf%e5%ad%a6%e4%b9%a0%e7%bd%91%e7%ab%99/</guid>
				<description>&lt;h2 id=&#34;1-phpnet&#34;&gt;&lt;a href=&#34;http://www.php.net/&#34;&gt;1) PHP.net&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h2 id=&#34;2-php-builder&#34;&gt;&lt;a href=&#34;http://www.phpbuilder.com/&#34;&gt;2) PHP Builder&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h2 id=&#34;3-deniweb-forum&#34;&gt;&lt;a href=&#34;http://www.daniweb.com/&#34;&gt;3) Deniweb Forum&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h2 id=&#34;4-w3schools&#34;&gt;&lt;a href=&#34;http://www.w3schools.com/PHP/DEfaULT.asP&#34;&gt;4) W3Schools&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h2 id=&#34;5-stack-overflow&#34;&gt;&lt;a href=&#34;http://stackoverflow.com/&#34;&gt;5) Stack Overflow&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h2 id=&#34;6-php-edit&#34;&gt;&lt;a href=&#34;http://www.phpedit.com/en&#34;&gt;6) PHP Edit&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h2 id=&#34;7-php-designer&#34;&gt;&lt;a href=&#34;http://www.mpsoftware.dk/phpdesigner.php&#34;&gt;7) PHP Designer&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h2 id=&#34;8-zend-studio&#34;&gt;&lt;a href=&#34;http://www.zend.com/en/&#34;&gt;8) Zend Studio&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/06/23432564V-6.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;9-wikibooks-php-books&#34;&gt;&lt;a href=&#34;http://en.wikibooks.org/wiki/PHP_Programming&#34;&gt;9) WikiBook’s PHP Books&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h2 id=&#34;10-php--tutorials&#34;&gt;&lt;a href=&#34;http://www.tutorialized.com/tutorials/PHP/1&#34;&gt;10) PHP  Tutorials&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h2 id=&#34;11-developer-tutorials&#34;&gt;&lt;a href=&#34;http://www.developertutorials.com/category/tutorials/php/&#34;&gt;11) Developer Tutorials&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h2 id=&#34;12-9lessons&#34;&gt;&lt;a href=&#34;http://www.9lessons.info/&#34;&gt;12) 9Lessons&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h2 id=&#34;13-hot-scripts&#34;&gt;&lt;a href=&#34;http://www.hotscripts.com/category/php/&#34;&gt;13) Hot Scripts&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h2 id=&#34;14-php-freaks&#34;&gt;&lt;a href=&#34;http://www.phpfreaks.com/&#34;&gt;14) PHP Freaks&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h2 id=&#34;15-big-resouces&#34;&gt;&lt;a href=&#34;http://www.bigresource.com/scripts/&#34;&gt;15) Big Resouces&lt;/a&gt;&lt;/h2&gt;</description>
			</item>
			<item>
				<title>关于我</title>
				<link>https://blog.zhourunsheng.com/about-me/</link>
				<pubDate>Thu, 23 Jun 2011 22:21:14 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/about-me/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;我是谁，我是谁，我是天空一朵云！！！&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2011/06/The-Moon.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;个人信息&#34;&gt;个人信息&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;职业：系统架构设计师&lt;/li&gt;&#xA;&lt;li&gt;现居：辽宁 大连&lt;/li&gt;&#xA;&lt;li&gt;兴趣：互联网最前沿技术，只要喜欢，什么都可以&lt;/li&gt;&#xA;&lt;li&gt;主页：&lt;a href=&#34;http://zhourunsheng.com&#34;&gt;http://zhourunsheng.com&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;联系方式email&#34;&gt;联系方式（Email）&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Gmail：&lt;a href=&#34;mailto:zhourunsheng2008@gmail.com&#34;&gt;zhourunsheng2008@gmail.com&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Foxmail：&lt;a href=&#34;mailto:396468178@qq.com&#34;&gt;396468178@qq.com&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;公众平台二维码&#34;&gt;公众平台二维码&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/wp-content/uploads/2013/04/qrcode_runsheng_blog.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;网站政策&#34;&gt;网站政策&lt;/h2&gt;&#xA;&lt;p&gt;如未另行说明，本网站的内容根据&lt;/p&gt;&#xA;&lt;p&gt;Creative Commons Attribution 3.0 License（知识共享许可协议·3.0·版）&lt;/p&gt;&#xA;&lt;p&gt;授予许可，代码示例根据&lt;/p&gt;&#xA;&lt;p&gt;Apache 2.0 License (Apache 许可 2.0 版）&lt;/p&gt;&#xA;&lt;p&gt;授予许可。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Ubuntu 10.10 Manual 手册</title>
				<link>https://blog.zhourunsheng.com/2011/06/ubuntu-10-10-manual-%e6%89%8b%e5%86%8c/</link>
				<pubDate>Thu, 23 Jun 2011 12:56:46 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/06/ubuntu-10-10-manual-%e6%89%8b%e5%86%8c/</guid>
				<description>&lt;p&gt;Official Ubuntu 10.10 Manual 手册《Getting Started with Ubuntu 10.10》，现在已经可以免费下载了。&lt;/p&gt;&#xA;&lt;p&gt;该书是一本不错的入门书籍和查询手册，对于一步一步掌握Ubuntu有很大的参考价值。&lt;/p&gt;&#xA;&lt;p&gt;下载地址：http://ubuntu-manual.org/&lt;/p&gt;&#xA;&lt;p&gt;使用命令：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wget http://files.ubuntu-manual.org/manuals/getting-started-with-ubuntu/10.10/en_US/screen/Getting%20Started%20with%20Ubuntu%2010.10.pdf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;下载链接：《Getting Started with Ubuntu 10.10》&lt;/p&gt;</description>
			</item>
			<item>
				<title>如何成为Python高手</title>
				<link>https://blog.zhourunsheng.com/2011/06/%e5%a6%82%e4%bd%95%e6%88%90%e4%b8%bapython%e9%ab%98%e6%89%8b/</link>
				<pubDate>Thu, 23 Jun 2011 09:14:23 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/06/%e5%a6%82%e4%bd%95%e6%88%90%e4%b8%bapython%e9%ab%98%e6%89%8b/</guid>
				<description>&lt;p&gt;本文是从 How to become a proficient Python programmer 这篇文章翻译而来。&lt;/p&gt;&#xA;&lt;p&gt;这篇文章主要是对我收集的一些文章的摘要。因为已经有很多比我有才华的人写出了大量关于如何成为优秀Python程序员的好文章。&lt;/p&gt;&#xA;&lt;p&gt;我的总结主要集中在四个基本题目上：函数式编程，性能，测试，编码规范。&lt;/p&gt;&#xA;&lt;p&gt;如果一个程序员能将这四个方面的内容知识都吸收消化，那他/她不管怎样都会有巨大的收获。&lt;/p&gt;&#xA;&lt;h2 id=&#34;函数式编程&#34;&gt;函数式编程&lt;/h2&gt;&#xA;&lt;p&gt;命令式的编程风格已经成为事实上的标准。命令式编程的程序是由一些描述状态转变的语句组成。虽然有时候这种编程方式十分的有效，但有时也不尽如此(比如复杂性) —— 而且，相对于声明式编程方式，它可能会显得不是很直观。&lt;/p&gt;&#xA;&lt;p&gt;如果你不明白我究竟是在说什么，这很正常。这里有一些文章能让你脑袋开窍。但你要注意，这些文章有点像《骇客帝国》里的红色药丸 —— 一旦你尝试过了函数式编程，你就永远不会回头了。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.amk.ca/python/writing/functional&#34;&gt;http://www.amk.ca/python/writing/functional&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.secnetix.de/olli/Python/lambda_functions.hawk&#34;&gt;http://www.secnetix.de/olli/Python/lambda_functions.hawk&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://docs.python.org/howto/functional.html&#34;&gt;http://docs.python.org/howto/functional.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;性能&#34;&gt;性能&lt;/h2&gt;&#xA;&lt;p&gt;你会看到有如此多的讨论都在批评这些“脚本语言”(Python，Ruby)是如何的性能低下，可是你却经常的容易忽略这样的事实：是程序员使用的算法导致了程序这样拙劣的表现。&lt;/p&gt;&#xA;&lt;p&gt;这里有一些非常好的文章，能让你知道Python的运行时性能表现的细节详情，你会发现，通过这些精炼而且有趣的语言，你也能写出高性能的应用程序。而且，当你的老板质疑Python的性能时，你别忘了告诉他，这世界上第二大的搜索引擎就是用Python写成的 —— 它叫做Youtube(参考 Python摘录)&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://jaynes.colorado.edu/PythonIdioms.html&#34;&gt;http://jaynes.colorado.edu/PythonIdioms.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://wiki.python.org/moin/PythonSpeed/PerformanceTips&#34;&gt;http://wiki.python.org/moin/PythonSpeed/PerformanceTips&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;测试&#34;&gt;测试&lt;/h2&gt;&#xA;&lt;p&gt;如今在计算机科学界，测试可能是一个最让人不知所措的主题了。有些程序员能真正的理解它，十分重视TDD(测试驱动开发)和它的后继者BDD(行为驱动开发)。而另外一些根本不接受，认为这是浪费时间。那么，我现在将告诉你：如果你不曾开始使用TDD/BDD，那你错过了很多最好的东西！&lt;/p&gt;&#xA;&lt;p&gt;这并不只是说引入了一种技术，可以替换你的公司里那种通过愚蠢的手工点击测试应用程序的原始发布管理制度，更重要的是，它是一种能够让你深入理解你自己的业务领域的工具 —— 真正的你需要的、你想要的攻克问题、处理问题的方式。如果你还没有这样做，请试一下。下面的这些文章将会给你一些提示：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.oreillynet.com/lpt/a/5463&#34;&gt;http://www.oreillynet.com/lpt/a/5463&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.oreillynet.com/lpt/a/5584&#34;&gt;http://www.oreillynet.com/lpt/a/5584&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://wiki.cacr.caltech.edu/danse/index.php/Unit_testing_and_Integration_testing&#34;&gt;http://wiki.cacr.caltech.edu/danse/index.php/Unit_testing_and_Integration_testing&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://docs.python.org/library/unittest.html&#34;&gt;http://docs.python.org/library/unittest.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;编码规范&#34;&gt;编码规范&lt;/h2&gt;&#xA;&lt;p&gt;并非所有的代码生来平等。有些代码可以被另外的任何一个好的程序员读懂和修改。但有些却只能被读，而且只能被代码的原始作者修改 —— 而且这也只是在他或她写出了这代码的几小时内可以。为什么会这样？因为没有经过代码测试(上面说的)和缺乏正确的编程规范。&lt;/p&gt;&#xA;&lt;p&gt;下面的文章给你描述了一个最小的应该遵守的规范合集。如果按照这些指导原则，你将能编写出更简洁和漂亮的代码。作为附加效应，你的程序会变得可读性更好，更容易的被你和任何其他人修改。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.python.org/dev/peps/pep-0008/&#34;&gt;http://www.python.org/dev/peps/pep-0008/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.fantascienza.net/leonardo/ar/python_best_practices.html&#34;&gt;http://www.fantascienza.net/leonardo/ar/python_best_practices.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;那就去传阅这这些资料吧。从坐在你身边的人开始。也许在下一次程序员沙龙或编程大会的时候，也已经成为一名Python编程高手了！&lt;/p&gt;&#xA;&lt;p&gt;祝你学习旅途顺利。&lt;/p&gt;&#xA;&lt;p&gt;如果你喜欢这些文章，请在微博上顶一下，让其他人也知道。&lt;/p&gt;&#xA;&lt;p&gt;本文转自：http://www.aqee.net/2011/06/23/how-to-become-a-proficient-python-programmer/&lt;/p&gt;</description>
			</item>
			<item>
				<title>Sina App Engine 与 Google App Engine</title>
				<link>https://blog.zhourunsheng.com/2011/06/sina-app-engine-%e4%b8%8e-google-app-engine/</link>
				<pubDate>Wed, 22 Jun 2011 08:44:00 +0000</pubDate>
				<guid>https://blog.zhourunsheng.com/2011/06/sina-app-engine-%e4%b8%8e-google-app-engine/</guid>
				<description>&lt;p&gt;新浪推出了自己的云计算服务平台，和Google一样，都叫App Engine。&lt;/p&gt;&#xA;&lt;p&gt;根据NIST的定义，Google App Engine属于PaaS平台型服务，那么它具体提供什么样的服务，新浪推出的Sina App Engine和Google的又有哪些区别呢？&lt;/p&gt;&#xA;&lt;h2 id=&#34;背景&#34;&gt;背景&lt;/h2&gt;&#xA;&lt;p&gt;云计算服务在Google、Amazon等公司成功产品的引领下，正在商业化的道路上大步向前。在NIST的定义中，有三种云计算服务模型。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Software as a Service (&lt;strong&gt;SaaS&lt;/strong&gt;)：软件即服务模型，用户直接使用构建在云端的软件。例如，Google Docs, Salesforce.com&lt;/li&gt;&#xA;&lt;li&gt;Platform as a Service (&lt;strong&gt;PaaS&lt;/strong&gt;)：平台即服务模型，用户使用云平台所支持的语言和工具，开发应用并部署在云平台。例如，Google App Engine, Force.com&lt;/li&gt;&#xA;&lt;li&gt;Infrastructure as a Service (&lt;strong&gt;IaaS&lt;/strong&gt;)：基础架构即服务模型，提供处理器、存储、网络等（虚拟）硬件资源给用户，用户可任意安装软件和开发环境，包括安装操作系统。例如，Amazon EC2, Joyent&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;可见，三种模型从应用到平台再到架构，越来越底层，用户得到的可操作性和灵活性也越来越大。&lt;/p&gt;&#xA;&lt;h2 id=&#34;google-app-engine是什么&#34;&gt;Google App Engine是什么？&lt;/h2&gt;&#xA;&lt;p&gt;Google App Engine（GAE） 提供一整套开发组件来让用户轻松地在本地构建和调试网络应用，之后能让用户在Google强大的基础设施上部署和运行网络应用程序。配置可随应用的访问量和数据存储需要的增长轻松扩展，使用 GAE，将不再需要维护服务器：只需上传你的应用程序，它便可立即为你的客户提供服务。&lt;/p&gt;&#xA;&lt;p&gt;简单来说，这和虚拟主机服务类似，只是运行环境不同。虚拟主机支持的是ASP, JSP, PHP等网页应用，而GAE现支持Java、Python和Google自家开发的Go这三种语言开发的应用程序，并为这三种语言提供基本相同的功能和API。&lt;/p&gt;&#xA;&lt;p&gt;GAE提供大量的免费使用额度和灵活的资费标准。多达 500 MB 的存储空间，以及可支持每月约 500 万页面浏览量的足够的 CPU 和带宽，完全免费。选择付费服务则可按需提高相应配置。&lt;/p&gt;&#xA;&lt;h3 id=&#34;功能支持&#34;&gt;功能支持&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;网址抓取（&lt;strong&gt;URL Fetch&lt;/strong&gt;）：访问互联网上的资源，抓取检索数据。&lt;/li&gt;&#xA;&lt;li&gt;邮件（&lt;strong&gt;Mail&lt;/strong&gt;）：GAE可以利用基于Gmail的基础设施来发送电子邮件。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Memcache&lt;/strong&gt;缓存：高性能的内存缓存保障，对于那些不需要持久性存储和事务功能的数据（例如临时数据或从数据存储区复制到缓存以进行高速访问的数据）很有用。&lt;/li&gt;&#xA;&lt;li&gt;图像操作（&lt;strong&gt;Image Manipulation&lt;/strong&gt;）：使用该 API，您可以对 JPEG 和 PNG 格式的图像进行缩放、裁剪、旋转和翻转，还能使用预先定义的算法提升图片的质量。&lt;/li&gt;&#xA;&lt;li&gt;计划任务和任务队列（&lt;strong&gt;Scheduled Tasks &amp;amp; Task Queues&lt;/strong&gt;）：允许将任务计划为按指定间隔运行，这些任务通常称为Cron job。另外可以通过在一个队列插入任务（以Web Hook的形式）来实现后台处理，GAE会根据调度方面的设置来安排这个队列里面的任务执行。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;sina-app-engine是什么&#34;&gt;Sina App Engine是什么？&lt;/h2&gt;&#xA;&lt;p&gt;Sina App Engine（SAE），是由新浪公司开发和运营的开放云计算平台。SAE为App开发者提供稳定、快捷、透明、可控的服务化的平台，并且减少开发者的开发和维护成本。和GAE一样，他们都属于PaaS平台型云计算服务。&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
