<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>可乐+代码 的人生</title>
	<atom:link href="http://www.solosky.net/feed" rel="self" type="application/rss+xml" />
	<link>http://www.solosky.net</link>
	<description>solosky@偏居一隅的幽静</description>
	<lastBuildDate>Tue, 28 Dec 2010 07:06:55 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>如何打包和部署air应用程序</title>
		<link>http://www.solosky.net/2010/12/package-and-deploy-air-application.html</link>
		<comments>http://www.solosky.net/2010/12/package-and-deploy-air-application.html#comments</comments>
		<pubDate>Tue, 28 Dec 2010 06:48:44 +0000</pubDate>
		<dc:creator>solosky</dc:creator>
				<category><![CDATA[Air 应用程序开发]]></category>
		<category><![CDATA[air]]></category>
		<category><![CDATA[发布]]></category>
		<category><![CDATA[打包]]></category>
		<category><![CDATA[部署]]></category>

		<guid isPermaLink="false">http://www.solosky.net/?p=192</guid>
		<description><![CDATA[昨天折腾了一个晚上，终于把我写的美女时钟桌面 的air应用程序给发布出去了，在发布的过程中还出现了点问题（下文有说明），不过总算解决了累死我了。 Air应用程序的部署和发布不是一般的麻烦，想来很多和我一样的Air初学开发者在部署Air应用程序可能都不知道怎么做，于是我写了这篇文章，希望能对你有所帮助。  如果你想发布一个Air程序，需要两个步骤，打包和部署。下面对这两个步骤都做详细的说明。本文以上次发布的 美女时钟桌面 作为示例。
一、打包Air应用程序
步骤1. 生成签名文件（数字证书, CA）
Air的应用程序签名（CA）是强制，不签名无法打包应用程序，签名基于RSA不对称加密，生成一对公钥和私钥，使用私钥加密应用程序，同时公布把公钥打包到应用程序中，可以防止其他用户修改发布的Air应用程序然后再发布。  一般来说，获得签名文件的方法有两种:

1) 可以向安全的证书管理机构如VeriSign或Thawte获取证书，这种证书是安全的，并且Air安装程序可以自动联网获取证书信息，如签名者，颁发机构，有效期等。如果联网能查到当前Air安装程序的信息，表明这个程序是未被修改的，原始程序。当然这个需要交纳一定的费用，如果你是开发一个完整的应用程序，并且能保证随时更新，还是建议你使用这种方式获取签名文件。
2) 使用 ADT 创建自签名证书，您可以生成有效的 AIR 安装文件，但由于无法验证自签名证书的可靠性，因此该证书只能向用户提供有限的安全保证。当安装自签名 AIR 文件时，发行商信息将对用户显示为“未知”。ADT 生成的证书有效期为五年。如果只是测试Air应用程序，推荐这种方式。

这里采用第二种方式发布，简单，免费，方便。 首先请确保 命令 AdobeAIRSDK/bin/adt.bat (linux下为adt)在环境变量中，然后执行以下命令:
adt -certificate -cn solosky -o solosky.net 1024-RSA SigningCert.p12 god!1#$
参数说明如下：

-certificate		当前命令为生成签名文件
-cn solosky			分配的作为新证书公共名称，必须。这里是solosky
-o solosky.net		被分配作为证书颁发组织名字。可选。这里是solosky.net
1024-RSA			用于证书的密钥类型，即“1024-RSA”或“2048-RSA”，必须，这里是1024-RSA
SigningCert.p12		保存证书的文件名字，必须，这里是SigningCert.p12
god!1#$				签名私钥，以后签名程序的时候需要输入这个密码，必须，这里是god!1#$

执行完毕后会在当前目录生成一个SigningCert.p12的签名文件，请妥善保管好这个文件，以后更新程序的时候需要使用相同的签名文件签名程序，否则无法完成更新操作； 更多关于adt签名的信息请参考这里 和 对 AIR 应用程序进行签名
步骤2. 打包Air应用程序
生成签名文件之后，接下来就可以直接打包为.air的安装文件了。  首先用cd命令进入air应用程序目录，然后执行以下命令
adt -package  -storetype pkcs12 -keystore ../shells/SigningCert.p12 -keypass god!1#$ girlclock-1.0.air girlclock-air.xml .
参数说明如下：

-package			当前命令为打包air应用程序
-storetype pkcs12	签名密钥类型，保持不变
-keystore ../shells/SigningCert.p12 [...]]]></description>
			<content:encoded><![CDATA[<p>昨天折腾了一个晚上，终于把我写的<a href=" http://www.solosky.net/2010/12/girl-clock-1-0-released.html ">美女时钟桌面</a> 的air应用程序给发布出去了，在发布的过程中还出现了点问题（下文有说明），不过总算解决了累死我了。 Air应用程序的部署和发布不是一般的麻烦，想来很多和我一样的Air初学开发者在部署Air应用程序可能都不知道怎么做，于是我写了这篇文章，希望能对你有所帮助。  如果你想发布一个Air程序，需要两个步骤，打包和部署。下面对这两个步骤都做详细的说明。本文以上次发布的 <a href=" http://www.solosky.net/2010/12/girl-clock-1-0-released.html ">美女时钟桌面</a> 作为示例。</p>
<h2>一、打包Air应用程序</h2>
<h3>步骤1. 生成签名文件（数字证书, CA）</h3>
<p>Air的应用程序签名（CA）是强制，不签名无法打包应用程序，签名基于RSA不对称加密，生成一对公钥和私钥，使用私钥加密应用程序，同时公布把公钥打包到应用程序中，可以防止其他用户修改发布的Air应用程序然后再发布。  一般来说，获得签名文件的方法有两种:</p>
<ul>
<li>1) 可以向安全的证书管理机构如VeriSign或Thawte获取证书，这种证书是安全的，并且Air安装程序可以自动联网获取证书信息，如签名者，颁发机构，有效期等。如果联网能查到当前Air安装程序的信息，表明这个程序是未被修改的，原始程序。当然这个需要交纳一定的费用，如果你是开发一个完整的应用程序，并且能保证随时更新，还是建议你使用这种方式获取签名文件。</li>
<li>2) 使用 ADT 创建自签名证书，您可以生成有效的 AIR 安装文件，但由于无法验证自签名证书的可靠性，因此该证书只能向用户提供有限的安全保证。当安装自签名 AIR 文件时，发行商信息将对用户显示为“未知”。ADT 生成的证书有效期为五年。如果只是测试Air应用程序，推荐这种方式。</li>
</ul>
<p>这里采用第二种方式发布，简单，免费，方便。 首先请确保 命令 AdobeAIRSDK/bin/adt.bat (linux下为adt)在环境变量中，然后执行以下命令:</p>
<pre class="brush:Plain">adt -certificate -cn solosky -o solosky.net 1024-RSA SigningCert.p12 god!1#$</pre>
<p>参数说明如下：</p>
<ul>
<li>-certificate		当前命令为生成签名文件</li>
<li>-cn solosky			分配的作为新证书公共名称，必须。这里是solosky</li>
<li>-o solosky.net		被分配作为证书颁发组织名字。可选。这里是solosky.net</li>
<li>1024-RSA			用于证书的密钥类型，即“1024-RSA”或“2048-RSA”，必须，这里是1024-RSA</li>
<li>SigningCert.p12		保存证书的文件名字，必须，这里是SigningCert.p12</li>
<li>god!1#$				签名私钥，以后签名程序的时候需要输入这个密码，必须，这里是god!1#$</li>
</ul>
<p>执行完毕后会在当前目录生成一个SigningCert.p12的签名文件，请妥善保管好这个文件，以后更新程序的时候需要使用相同的签名文件签名程序，否则无法完成更新操作； 更多关于adt签名的信息请参考<a href="http://help.adobe.com/zh_CN/air/build/WS5b3ccc516d4fbf351e63e3d118666ade46-7f72.html">这里</a> 和 <a href="http://help.adobe.com/zh_CN/air/build/WSfffb011ac560372f-19aa73f128cc9f05e8-8000.html">对 AIR 应用程序进行签名</a></p>
<h3>步骤2. 打包Air应用程序</h3>
<p>生成签名文件之后，接下来就可以直接打包为.air的安装文件了。  首先用cd命令进入air应用程序目录，然后执行以下命令</p>
<pre class="brush:Plain">adt -package  -storetype pkcs12 -keystore ../shells/SigningCert.p12 -keypass god!1#$ girlclock-1.0.air girlclock-air.xml .</pre>
<p>参数说明如下：</p>
<ul>
<li>-package			当前命令为打包air应用程序</li>
<li>-storetype pkcs12	签名密钥类型，保持不变</li>
<li>-keystore ../shells/SigningCert.p12 签名文件地址，切记一定不要放在应用程序目录下，否则签名文件也会打包到应用程序。。。</li>
<li>-keypass god!1#$	签名文件的私钥，创建签名文件的时候输入的密码，运行之后仍需输入一次</li>
<li>girlclock-1.0.air	输出的air发布程序名，一般都以air为后缀</li>
<li>girlclock-air.xml	应用程序的描述文件</li>
<li>.					打包的目录，.表明是当前目录，切记别忘记最后面的一点</li>
</ul>
<p>命令执行完毕，在当前目录会生成girlclock-1.0.air的air部署文件，整个打包过程完成；  更多关于adt打包信息请参考 <a href="http://help.adobe.com/zh_CN/AIR/1.5/devappshtml/WS5b3ccc516d4fbf351e63e3d118666ade46-7fd6.html">使用 AIR Developer Tool (ADT) 打包 AIR 安装文件</a></p>
<blockquote>
<h4>如何生成exe可执行程序</h4>
<p>你还可以指定target native参数，生成本地的可执行文件（window下为exe,linux为deb或者rpm,MacOS为dmg），但这就丧失的air的跨平台性。 如下命令将会生成girlclock-1.0.exe文件：</p>
<pre class="brush:Plain">adt -package  -storetype pkcs12 -keystore ../shells/soloskyAirSign.p12 -keypass god!1#$  -target native girlclock-1.0.exe girlclock-air.xml .</pre>
<p>如果生成本地可执行文件，请注意以下几点：</p>
<ul>
<li>1. 这种发布文件无法通过下面的网页部署方式部署；</li>
<li>2. 可以直接把可执行文件发布出去，用户下载可执行文件，第一次运行时会自动检测Air运行时环境，如果没有会自动下载安装，满足安装条件后会自动安装到系统中，并在开始菜单中创建快捷方式，系统程序卸载工具中创建卸载方式；</li>
<li>3. 如果你的应用程序需要支持NativeProcess(即supportedProfiles配置为extendedDesktop)，则必须采用这种方式打包和部署，我在这里纠结了很久；</li>
<li>4. 无法支持Air的Update框架，但有开源的解决方案（请google之）；</li>
</ul>
</blockquote>
<h2>二、部署应用程序</h2>
<p>因为Air应用程序运行需要Air运行时环境，所以部署起来有点复杂，这里提出了三种部署方式，建议在发布air应用程序的时候，这三种方式都采用，尽量让所有的用户都能顺利的安装上air应用程序；</p>
<h3>1. Web部署</h3>
<p>这种方式只适合打包类型为.air类型的应用程序的部署。 直接把.air的文件提供给用户下载是不行的，因为Air应用程序运行需要Air运行时环境，所以假如用户没有安装air运行时环境，就无法运行.air的应用程序。好在air官方发布了一个统一的安装包，可以在网页上直接安装air应用程序，并且会自动检测用户是否安装air运行时环境，如果没有会自动下载安装，提供了无缝的安装体验，非常的方便，只不过部署起来比较麻烦：</p>
<ul>
<li>1. 先从官方网站下载 <a href="http://download.macromedia.com/pub/developer/air/sample_badge.zip" target="_blank">air安装包文件(Adobe AIR Badge Installer)</a>，并解压；</li>
<li>2. 建立web目录，把生成的.air应用程序文件(girlclock-1.0.air)，以及解压之后的安装包文件里面的AIRInstallBadge.swf，swfobject.js，expressinstall.swf四个文件复制到web目录下；</li>
<li>3. 为你的应用程序截图，调整大小为205&#215;170像素，重命名为snap.png也复制到web目录中；</li>
<li>4. 新建一个文件deploy.html,复制下面的内容到这个文件里，然后修改部分参数，保存(当然你也可以复制到你的发布页中，注意一定要包含swfobject.js脚本)；
<pre class="brush:Plain">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
&lt;title&gt;美女时钟桌面 v1.0 在线安装&lt;/title&gt;
&lt;script type="text/javascript" src="swfobject.js"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id="flashcontent" style="width:215px; height:180px;"&gt;
&lt;strong&gt;请升级你的Flash Player。&lt;/strong&gt;
程序安装需要 Flash Player 6.0.65 或者更高版本的Flash Player。
&lt;/div&gt;
&lt;script type="text/javascript"&gt;
// &lt;![CDATA[

// version 9.0.115 or greater is required for launching AIR apps.
var so = new SWFObject("AIRInstallBadge.swf", "Badge", "215", "180", "9.0.115", "#FFFFFF");
so.useExpressInstall('expressinstall.swf');

// 下面的参数在网页安装air应用程序的是必须的
so.addVariable("airversion", "2.5"); // 修改为运行你的air应用程序需要的最低运行时环境版本
so.addVariable("appname", "GirlClock"); // 修改为应用程序名，将会在安装界面上显示给用，仅支持英文....
so.addVariable("appurl", "http://labs.solosky.net/air/girlclock/girlclock-1.0.air"); //你的.air打包文件的绝对地址，必须以http或者https开头

// 下面的参数在网页启动air应用程序是必须的，但安装时是可选的，
so.addVariable("appid", "net.solosky.girlclock"); // 应用程序Id，命名方式类型于java的包命名方式(ex. com.gskinner.air.MyApplication)
so.addVariable("pubid", ""); // publisher id

// 这个参数是可以为airy应用提供在线升级支持
so.addVariable("appversion", "1.0"); //你的应用程序版本

// 下面的参数是可选的
so.addVariable("image", "snap.png"); // 应用程序截图(205x170像素)，推荐设置

//下面的参数请根据自己需要修改
so.addVariable("appinstallarg", "installed from web"); // passed to the application when it is installed from the badge
so.addVariable("applauncharg", "launched from web"); // passed to the application when it is launched from the badge
so.addVariable("helpurl", "help.html"); // optional url to a page containing additional help, displayed in the badge's help screen
so.addVariable("hidehelp", "false"); // hides the help icon if "true"
so.addVariable("skiptransition", "false"); // skips the initial transition if "true"
so.addVariable("titlecolor", "#00AAFF"); // changes the color of titles
so.addVariable("buttonlabelcolor", "#00AAFF"); // changes the color of the button label
so.addVariable("appnamecolor", "#00AAFF"); // changes the color of the application name if the image is not specified or loaded

so.write("flashcontent");

//更多参数请参见 http://www.adobe.com/devnet/air/articles/badge_for_air.html
// ]]&gt;
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>现在整个目录的内容如下图：<img class="alignnone size-full wp-image-197" title="air-web-deploy-dir" src="http://www.solosky.net/wp-content/uploads/2010/12/air-web-deploy-dir.png" alt="air-web-deploy-dir" width="606" height="169" /></li>
<li>5. 将web目录下面的所有文件上传到你的网站服务器上，然后输入deploy.html查看是否出现安装提示。如下图：<img class="alignnone size-full wp-image-198" title="air-web-deploy-preview" src="http://www.solosky.net/wp-content/uploads/2010/12/air-web-deploy-preview.png" alt="air-web-deploy-preview" width="261" height="225" /></li>
</ul>
<p>更多关于air无缝安装包(Adobe AIR Badge Installer)请参考 <a href="http://www.adobe.com/devnet/air/articles/badge_for_air.html" target="_blank">Getting started with the custom install badge</a></p>
<h3>2. 本地程序部署</h3>
<p>使用上面的打包方法打包为本地应用程序，如indow下为exe,linux为deb或者rpm,MacOS为dmg，可以直接双击执行，但不包含air运行时环境，当用户运行应用程序的时候会自动自动检测系统是否已经安装air运行时环境，如果没有会自动下载并安装。 这种类型的发布程序部署比较简单，直接发布出去即可，</p>
<h3>3. 包含air运行时环境部署</h3>
<p>这种方式可以直接把air运行时环境和air应用程序打包在一起，而不用考虑用户是否已经安装了air运行时环境。但由于包含了air运行时环境，所以有点大，大概20M左右的大小，对于无法联网或者自动安装失败的用户可以尝试使用这种方式发布。 网上的方案比较多，这里还是推荐 <a href="http://plter.com/">梦宇工作室</a> 编写的 <a href="http://plter.com/?p=626">AirLauncher</a> 来打包air应用程序。 遗憾的是仅支持windows。原理很简单，就是启动进程调用adl命令启动程序，但没有命令行窗口。</p>
<ul>
<li>1. 首先建立pack目录，然后把应用程序的所有文件都复制到pack目录中；</li>
<li>2. 在pack目录中建立AdobeAIRSDK目录，并把AIRSDK目录下面的bin和runtimes复制到pack/AdobeAIRSDK下；</li>
<li>3. 复制AirLauncher.exe到pack目录下，并修改应用程序描述符为application.xml；双击运行AirLauncher.exe看能否启动air程序，如果能，工作完成了大部分href=&#8221;http://flexlessons.googlecode.com/files/ResHacker%203.5.zip&#8221;&gt;ResHack修改；整个文件目录结构如下图：<img class="alignnone size-full wp-image-196" title="air-pack-deploy-dir" src="http://www.solosky.net/wp-content/uploads/2010/12/air-pack-deploy-dir.png" alt="air-pack-deploy-dir" width="553" height="227" /></li>
<li>4. 你可以重命名AirLauncher.exe为你的应用名称，如girlclock.exe，程序图标可以使用</li>
<li>5. 打包pack目录下的所有文件为.zip文件，并发布这个压缩文件到网页上即可。</li>
</ul>
<p>你可以在这里查看AirLauncher的作者更详细的打包教程:<a href="http://plter.com/?p=626">用WinRAR制作脱离AIR运行时的AIR程序安装包</a></p>
<p> 上面三种方式都可以完成air应用程序的部署，推荐使用Web部署和本地部署，包含air运行时环境部署也建议一并发布，如果每一种方式不可用，可以尝试其他的安装方法。尽量让每个用户都能用上你写的air应用程序。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.solosky.net/2010/12/package-and-deploy-air-application.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>美女时钟桌面新鲜出炉啦···</title>
		<link>http://www.solosky.net/2010/12/girl-clock-1-0-released.html</link>
		<comments>http://www.solosky.net/2010/12/girl-clock-1-0-released.html#comments</comments>
		<pubDate>Sun, 26 Dec 2010 12:41:13 +0000</pubDate>
		<dc:creator>solosky</dc:creator>
				<category><![CDATA[Air 应用程序开发]]></category>
		<category><![CDATA[air]]></category>
		<category><![CDATA[美女时钟]]></category>

		<guid isPermaLink="false">http://www.solosky.net/?p=167</guid>
		<description><![CDATA[最近看上了air，这个东西真不错，可以用js+html开发桌面程序，简直就是给我定制的。平时没做桌面应用程序，就是因为写GUI太痛苦了，air可以用css+html来做界面，并且可以用我最喜欢的js来开发桌面程序，太爽了，呵呵~
这个程序是很久就准备写的东西，看到air不错，于是就拿来写，还不错，虽然效率不咋地，写起来很自在。
美女时钟桌面，可以从搜道网(http://www.sodao.com)上每隔1分钟下载一个时钟美女（就是一个美女拿了个牌子上面写了当前的时间，很有创意），然后把这个美女贴在桌面上，嘿嘿，搜道的美女都还挺漂亮的，慢慢看吧，1天1440个美女够你看的了。。O(∩_∩)O~
]]></description>
			<content:encoded><![CDATA[<blockquote><p>最近看上了air，这个东西真不错，可以用js+html开发桌面程序，简直就是给我定制的。平时没做桌面应用程序，就是因为写GUI太痛苦了，air可以用css+html来做界面，并且可以用我最喜欢的js来开发桌面程序，太爽了，呵呵~</p></blockquote>
<p>这个程序是很久就准备写的东西，看到air不错，于是就拿来写，还不错，虽然效率不咋地，写起来很自在。<br />
美女时钟桌面，可以从搜道网(<a href="http://www.sodao.com">http://www.sodao.com</a>)上每隔1分钟下载一个时钟美女（就是一个美女拿了个牌子上面写了当前的时间，很有创意），然后把这个美女贴在桌面上，嘿嘿，搜道的美女都还挺漂亮的，慢慢看吧，1天1440个美女够你看的了。。O(∩_∩)O~<br />
<img src="http://www.solosky.net/wp-content/uploads/2010/12/girlclock-1.01.jpg" alt="girlclock-1.0" title="girlclock-1.0" width="600“ class="alignnone wp-image-208" /></p>
<p><strong>一些说明</strong><br />
1.更新时间推荐设置为2分钟，1分钟可能会出现更新滞后的情况；<br />
2.可以选择把美女图片保存到某个目录下；<br />
3.可以拖动美女图片和美女信息到合适的位置，点击预览按钮查看效果；<br />
4.如果拖动出现问题，可以点击重置按钮恢复原始位置；<br />
5.设置自动保存，下次启动自动读取上次设置；<br />
6.如果出现图片位置和预览不符，可以尝试更改不同的墙纸平铺方式试试；</p>
<p><strong>下载和安装</strong><br />
<a href="http://labs.solosky.net/air/girlclock/girlclock-1.0.exe" target="_blank">下载美女时钟桌面 v1.0</a><br />
程序运行需要air运行时环境，下载完毕后，双击girlclock-1.0.exe即可安装。如果没有Air运行时环境，安装程序会自动下载Air运行时环境并安装。<br />
如果下载Air运行时环境过慢，你可以点击<a href="http://get.adobe.com/cn/air/" target="_blank"><strong>这里</strong></a>下载air运行时环境手动安装，安装完毕之后再双击girlclock-1.0.exe安装美女时钟程序。</p>
<p><strong>反馈和建议</strong><br />
如果你在安装和使用的过程中遇到了什么问题或者有好的建议，请在下面留言或者给我发邮件solosky772[at]qq.com，我会在第一时间回复你。</p>
<p><strong>图片版权归搜道网(http://www.sodao.com)所有。</strong></p>
<p><strong>PS:</strong><br />
代码和界面都比较点烂，练手的作品，如果有时间会全部重写代码。但为了学习，公布全部的代码，高手别砸砖呀O__O&#8221;…<br />
你可以在<a href="http://labs.solosky.net/air/girlclock/girlclock-1.0-src.zip">这里</a>下载源代码。</p>
<p><strong>下载地址</strong><br />
<a href="http://labs.solosky.net/air/girlclock/girlclock-1.0.exe" target="_blank">美女时钟桌面 v1.0  下载</a><br />
<a href="http://get.adobe.com/cn/air/" target="_blank">air运行时环境 下载</a><br />
<a href="http://labs.solosky.net/air/girlclock/girlclock-1.0-src.zip">美女时钟桌面 v1.0 源代码 下载</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.solosky.net/2010/12/girl-clock-1-0-released.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>飞信分析外篇 &#8211; 如何绕过2008版的客户端登录时的验证码</title>
		<link>http://www.solosky.net/2010/08/how-to-avoid-the-verify-of-fetion2008-client.html</link>
		<comments>http://www.solosky.net/2010/08/how-to-avoid-the-verify-of-fetion2008-client.html#comments</comments>
		<pubDate>Sun, 01 Aug 2010 06:14:23 +0000</pubDate>
		<dc:creator>solosky</dc:creator>
				<category><![CDATA[飞信哪些事儿]]></category>

		<guid isPermaLink="false">http://www.solosky.net/?p=160</guid>
		<description><![CDATA[重要前提： 使用飞信号登陆。
是的，只要有使用飞信号登陆就可以绕过2008验证码。其实，在飞信登陆的过程中，第一步获取自适应的配置，和第二步SSI登录，这两步可做可不做。
SSI登录那一步有两个目的：
1、获取飞信的URI，我最近发现，其实URI后面的p值没有太多的含义，随便写都可以，主要是飞信号。
2、获取SSIC。SSIC主要是WEB部分，如获取头像，设置头像等需要验证身份必须要SSIC。如果不进行这些操作，SSIC可以不需要；
上面两点，如果都不需要，SSI就可以不做。而在2008的客户端中，验证码的出现是在SSI的过程中，如果不做，就可以绕过验证码。
从上面的分析可以看出，如果你有飞信号，就可以不SSI登录，也就绕过了验证码。至于用户的Uri可以自行构造：
 sip:{飞信号}@fetion.com.cn;p=1234，后面p的值可以随便写。
另外在SIPC验证的过程中，第二步用户验证的那个包，有个A字段，里面有SSIC，直接去掉就可以了
R fetion.com.cn SIP-C/2.0
F: 123456789
I: 1
Q: 2 R
A: Digest algorithm="SHA1-sess",response="49A3741AC50CDFABD704240E19B2A7C1",cnonce="479940A21881CD5C307D47F21586F38C",salt="2764D001"
L: 298

&#60;args&#62;&#60;device type="PC" version="0" client-version="3.5.1170" /&#62;&#60;caps value="simple-im;im-session;temp-group;personal-group;im-relay" /&#62;&#60;events value="contact;permission;system-message;personal-group;compact" /&#62;&#60;user-info attributes="all" /&#62;&#60;presence&#62;&#60;basic value="400" desc="" /&#62;&#60;/presence&#62;&#60;/args&#62;
]]></description>
			<content:encoded><![CDATA[<p>重要前提： <strong>使用飞信号登陆</strong>。</p>
<p>是的，只要有使用飞信号登陆就可以绕过2008验证码。其实，在飞信登陆的过程中，第一步获取自适应的配置，和第二步SSI登录，这两步可做可不做。<br />
SSI登录那一步有两个目的：<br />
1、获取飞信的URI，我最近发现，其实URI后面的p值没有太多的含义，随便写都可以，主要是飞信号。<br />
2、获取SSIC。SSIC主要是WEB部分，如获取头像，设置头像等需要验证身份必须要SSIC。如果不进行这些操作，SSIC可以不需要；<br />
上面两点，如果都不需要，SSI就可以不做。而在2008的客户端中，验证码的出现是在SSI的过程中，如果不做，就可以绕过验证码。</p>
<p>从上面的分析可以看出，如果你有飞信号，就可以不SSI登录，也就绕过了验证码。至于用户的Uri可以自行构造：<br />
<strong> sip:{飞信号}@fetion.com.cn;p=1234</strong>，后面p的值可以随便写。</p>
<p>另外在SIPC验证的过程中，第二步用户验证的那个包，有个A字段，里面有SSIC，直接去掉就可以了</p>
<pre class="brush:Plain">R fetion.com.cn SIP-C/2.0
F: 123456789
I: 1
Q: 2 R
A: Digest algorithm="SHA1-sess",response="49A3741AC50CDFABD704240E19B2A7C1",cnonce="479940A21881CD5C307D47F21586F38C",salt="2764D001"
L: 298

&lt;args&gt;&lt;device type="PC" version="0" client-version="3.5.1170" /&gt;&lt;caps value="simple-im;im-session;temp-group;personal-group;im-relay" /&gt;&lt;events value="contact;permission;system-message;personal-group;compact" /&gt;&lt;user-info attributes="all" /&gt;&lt;presence&gt;&lt;basic value="400" desc="" /&gt;&lt;/presence&gt;&lt;/args&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.solosky.net/2010/08/how-to-avoid-the-verify-of-fetion2008-client.html/feed</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
		<item>
		<title>飞信2010分析 &#8211; 使用HTTP模式和服务器通信</title>
		<link>http://www.solosky.net/2010/08/fetion2010-http-connection-mode.html</link>
		<comments>http://www.solosky.net/2010/08/fetion2010-http-connection-mode.html#comments</comments>
		<pubDate>Sun, 01 Aug 2010 06:06:42 +0000</pubDate>
		<dc:creator>solosky</dc:creator>
				<category><![CDATA[飞信哪些事儿]]></category>

		<guid isPermaLink="false">http://www.solosky.net/?p=154</guid>
		<description><![CDATA[在 飞信2010分析 &#8211; SIPC验证 文章里，简单的提到了飞信使用HTTP传输模式。
HTTP模式是所有传输方式中效率最低，是在其他传输方式都建立失败后才会采用HTTP传输模式，可见飞信在网络环境适应上下了很大的功夫的。
在第一步获取自适应的配置中，曾经提到下面几个参数：
含义				位置									结果举例
SIPC-PROXY		/config/server/sipc-proxy			221.130.46.141:8080
SIPC-SSL		/config/server/sipc-ssl-proxy		221.130.46.141:443
HTTP-TUNNEL		/config/server/http-tunnel			HTTP://221.130.46.141/ht/sd.aspx
飞信建立连接主要就是这三个传输方式。
来看下飞信的建立连接的顺序：
第一步： 尝试连接建立 SIPC-PROXY连接 。 即SIPC服务器端口为8080的连接。 这是最稳定的，效率最高的传输方式。
第二步： 如果第一步失败，则尝试建立SIPC-SSL连接。 即SIPC服务器端口为443的连接。 和SIPC-PROXY连接方式完全一致，就是端口变了。虽说是SSL端口，却仍然没有加密；
第三步： 如果第二步失败，则尝试建立HTTP-TUNNEL连接。 即HTTP代理连接。 采用长连接的模式，效率比较低，而且不太稳定。不过只要能访问HTTP，就可以连接上飞信服务器。
第四步： 如果第三步建立失败，则飞信客户端和飞信服务器建立连接失败。
可以看出如果要分析HTTP模式，则需要把SIPC-PROXY和SIPC-SSL的IP和端口堵上。一般都是相同的IP不同的端口，可以使用防火墙来完成。
HTTP分析可以使用HTTPAnalyzer帮助分析。 在我的飞信资源整合那篇文章中有这两个工具的下载。
在分析之前，还是简单的介绍长连接模式。因为HTTP模式下就是使用了长连接的方式。
我们知道HTTP是一个请求-回复类型的协议。在发起一个请求之后，服务器需要返回一个回复。可以理解为是单向的，请求只能是浏览器发送，服务器只能被动的接受请求处理请求，并不能主动的和客户端发送消息。
在Socket通信模型中，客户端和服务器的通信是双向的，客户端可以主动的向服务器发送信息，服务器也可以主动的向客户端发送信息。这在即时通信里面很有必要，假如其他用户主动的发消息给你，服务器可以在第一时间内主动的发消息通知你。
飞信是需要双向通信的模式，但HTTP服务器是不能主动的给客户端发送信息的。于是产生了长连接的技术，也就是Comet，来模拟服务器主动给客户端发送消息。
长连接其实很简单，客户端主动的发起一个HTTP请求给服务器，服务器收到这个请求后，会查看是否有消息可以返回给客户端，如果有把消息放入回复体内，立即返回给客户端。如果没有，就阻塞掉这个请求，不返回，直到服务器有可以返回的消息或者超时才结束这个请求。客户端检查这个请求，如果是超时，就立即发起另外一个请求，如果不是超时，就处理服务器的返回的数据，处理完了继续发起下一个请求。
这样服务器就始终保留了一个客户端的连接，如果收到消息后就可以立即返回给客户端，完全可以模拟Socket双向的通信模式。
只不过这种模式效率低，而且不太稳定，服务器资源占用率大（因为要维持多个连接），不过在一些特别的情景下需要使用。目前WebQQ和WebFetion等即时通信的WEB都是采用了这样的通信模式。
详细的长连接信息请参见IBM工程师写的文章 &#8211; Comet：基于 HTTP 长连接的“服务器推”技术 。
分析很简单的，不罗嗦过程，直接写结果吧。
HTTP模式下，假如HTTP://221.130.46.141/ht/sd.aspx为获取自适应配置返回的HTTP-TUNNEL地址：
下面是一个HTTP请求的例子：
POST /ht/sd.aspx?t=s&#38;i=2 HTTP/1.1
Cookie: ssic=CRIOAAA0L0hiEKIY+8MORa3QNc4OJcB3rACWXefS7rmhOaQ5fifHEGsFh8+wPK91WlYD9M4zEqvgSG/hiReF2X30HurJRVRinJLO12MtuQdrY9lN4fpni9AvwA6Qj/FDkKr0wT8AAA==
Accept: */*
Pragma: xz4BBcV9df9de4e-0cd9-49c5-bf32-6adc28fcee63
Host: 221.130.46.141
Content-Length: 134
Content-Type: application/oct-stream
User-Agent: IIC2.0/PC 4.0.0000
Connection: Keep-Alive
Cache-Control: no-cache

R fetion.com.cn SIP-C/4.0
F: 685592830
I: 1
Q: 1 R
CN: 258dbcc7cc8a1633c677ebb0abaa5168
CL: type="pc",version="4.0.3340"

SIPP
------------------------------------
HTTP/1.1 200 OK
Connection: close
Date: Sun, 01 Aug 2010 03:14:12 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Cache-Control: [...]]]></description>
			<content:encoded><![CDATA[<p>在 <a href="http://www.solosky.net/2010/04/fetion2010-sipc.html">飞信2010分析 &#8211; SIPC验证</a> 文章里，简单的提到了飞信使用HTTP传输模式。<br />
HTTP模式是所有传输方式中效率最低，是在其他传输方式都建立失败后才会采用HTTP传输模式，可见飞信在网络环境适应上下了很大的功夫的。</p>
<p>在第一步获取自适应的配置中，曾经提到下面几个参数：<br />
含义				位置									结果举例<br />
SIPC-PROXY		/config/server/sipc-proxy			221.130.46.141:8080<br />
SIPC-SSL		/config/server/sipc-ssl-proxy		221.130.46.141:443<br />
HTTP-TUNNEL		/config/server/http-tunnel			HTTP://221.130.46.141/ht/sd.aspx<br />
飞信建立连接主要就是这三个传输方式。</p>
<p>来看下飞信的建立连接的顺序：<br />
第一步： 尝试连接建立 SIPC-PROXY连接 。 即SIPC服务器端口为8080的连接。 这是最稳定的，效率最高的传输方式。<br />
第二步： 如果第一步失败，则尝试建立SIPC-SSL连接。 即SIPC服务器端口为443的连接。 和SIPC-PROXY连接方式完全一致，就是端口变了。虽说是SSL端口，却仍然没有加密；<br />
第三步： 如果第二步失败，则尝试建立HTTP-TUNNEL连接。 即HTTP代理连接。 采用长连接的模式，效率比较低，而且不太稳定。不过只要能访问HTTP，就可以连接上飞信服务器。<br />
第四步： 如果第三步建立失败，则飞信客户端和飞信服务器建立连接失败。</p>
<p>可以看出如果要分析HTTP模式，则需要把SIPC-PROXY和SIPC-SSL的IP和端口堵上。一般都是相同的IP不同的端口，可以使用防火墙来完成。<br />
HTTP分析可以使用HTTPAnalyzer帮助分析。 在我的飞信资源整合那篇文章中有这两个工具的下载。</p>
<p>在分析之前，还是简单的介绍长连接模式。因为HTTP模式下就是使用了长连接的方式。<br />
我们知道HTTP是一个请求-回复类型的协议。在发起一个请求之后，服务器需要返回一个回复。可以理解为是单向的，请求只能是浏览器发送，服务器只能被动的接受请求处理请求，并不能主动的和客户端发送消息。<br />
在Socket通信模型中，客户端和服务器的通信是双向的，客户端可以主动的向服务器发送信息，服务器也可以主动的向客户端发送信息。这在即时通信里面很有必要，假如其他用户主动的发消息给你，服务器可以在第一时间内主动的发消息通知你。<br />
飞信是需要双向通信的模式，但HTTP服务器是不能主动的给客户端发送信息的。于是产生了长连接的技术，也就是Comet，来模拟服务器主动给客户端发送消息。<br />
长连接其实很简单，客户端主动的发起一个HTTP请求给服务器，服务器收到这个请求后，会查看是否有消息可以返回给客户端，如果有把消息放入回复体内，立即返回给客户端。如果没有，就阻塞掉这个请求，不返回，直到服务器有可以返回的消息或者超时才结束这个请求。客户端检查这个请求，如果是超时，就立即发起另外一个请求，如果不是超时，就处理服务器的返回的数据，处理完了继续发起下一个请求。<br />
这样服务器就始终保留了一个客户端的连接，如果收到消息后就可以立即返回给客户端，完全可以模拟Socket双向的通信模式。</p>
<p>只不过这种模式效率低，而且不太稳定，服务器资源占用率大（因为要维持多个连接），不过在一些特别的情景下需要使用。目前WebQQ和WebFetion等即时通信的WEB都是采用了这样的通信模式。<br />
详细的长连接信息请参见IBM工程师写的文章 &#8211; <a href="http://www.ibm.com/developerworks/cn/web/wa-lo-comet/">Comet：基于 HTTP 长连接的“服务器推”技术 。</a></p>
<p>分析很简单的，不罗嗦过程，直接写结果吧。<br />
HTTP模式下，假如HTTP://221.130.46.141/ht/sd.aspx为获取自适应配置返回的HTTP-TUNNEL地址：</p>
<p>下面是一个HTTP请求的例子：</p>
<pre class="brush:Plain">POST /ht/sd.aspx?t=s&amp;i=2 HTTP/1.1
Cookie: ssic=CRIOAAA0L0hiEKIY+8MORa3QNc4OJcB3rACWXefS7rmhOaQ5fifHEGsFh8+wPK91WlYD9M4zEqvgSG/hiReF2X30HurJRVRinJLO12MtuQdrY9lN4fpni9AvwA6Qj/FDkKr0wT8AAA==
Accept: */*
Pragma: xz4BBcV9df9de4e-0cd9-49c5-bf32-6adc28fcee63
Host: 221.130.46.141
Content-Length: 134
Content-Type: application/oct-stream
User-Agent: IIC2.0/PC 4.0.0000
Connection: Keep-Alive
Cache-Control: no-cache

R fetion.com.cn SIP-C/4.0
F: 685592830
I: 1
Q: 1 R
CN: 258dbcc7cc8a1633c677ebb0abaa5168
CL: type="pc",version="4.0.3340"

SIPP
------------------------------------
HTTP/1.1 200 OK
Connection: close
Date: Sun, 01 Aug 2010 03:14:12 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Type: application/oct-stream
Content-Length: 4

SIPP</pre>
<p>就着这个例子，逐步的分析。<br />
请求的方式为POST。<br />
在URL上面有两个参数：<br />
t : 请求的模式，取值有 i,s,d，下面会有详细的说明；<br />
i : 请求的序号，随着请求的次数递增；<br />
还传递了一个Cookie: ssic。 ssic是SSI登录成功后，会在HTTP头中使用标准set-cookie方式返回；<br />
在请求头中还有一个Pragma域，在整个请求中不变，可能是标志唯一的客户端。前面七个字符固定为xz4BBcV，后面是一个GUID，可以随机生成<br />
其他可以保持不变。<br />
<span id="more-154"></span><br />
请求体就是 SIPC信令包+SIPP。 请注意这里一定要加上SIPP四个字符，如果没有SIPC信令包，也要发送SIPP四个字符。信令包的内容和过程和SIPC-PROXY连接发送的内容是完全一样的。<br />
但有一个包有点区别，就是第二步验证的时候  后面的值不同，在SIPC-PROXY和SIPC-SSL连接中这个值为1FFF,在HTTP模式下这个值为AFF。这个值的含义，是表明了客户端支持的特性。如果有时间可能会写文章来分析这个值代表的含义，但现在只需要知道，这个值影响的后面和在线的好友建立对话的方式。</p>
<p>请求的回复头没有什么有价值的东西，回复体就是 SIPC信令包+SIPP 。注意这里还是有个SIPP四个字符。如果有信令包需要返回给客户端就把信令包直接放在回复体中。服务器也可以不返回任何信令包，只返回一个SIPP。</p>
<p>基本的格式就是这样。下面看下过程。<br />
简单的过程和建立一个对话很相似：建立连接 -&gt; 发送消息，接收消息，发送消息，接收消息&#8230;..-&gt; 关闭连接。</p>
<p>1、建立连接的过程很简单，参数t的值为i，POST的内容只有一个SIPP四个字符，如果返回200，建立连接成功；<br />
2、发送和接收消息，请求体放置了需要发送的SIPC信令包，回复体中放置需要接收的SIPC信令包。 注意这里可能有多个信令包可以放入一个请求体或者回复体中。<br />
如果没有任何SIPC信令包可以发送，仍需发送空的请求包（即只含有SIPP四个字符的请求体）给服务器建立长连接。服务器有消息就会把消息放入回复体中，立即返回这个请求，如果没有就阻塞这个请求，直到超时。<br />
3、关闭连接的过程也很简单，参数的t为d，POST的内容只有一个SIPP四个字符，如果返回200，关闭连接成功；</p>
<p>下面是SSISignV4Test例子中的HttpTranfer.java的部分代码，实现了HTTP传输方式，各位可以参考下，完整的例子可以在首页的公告找到下载地址。</p>
<pre class="brush:Java">
public void	startTransfer()	throws Exception
{
	Runnable r = new Runnable(){
		public void	run()
		{
			try{
				ByteWriter writer =	 new ByteArrayWriter();
				//最开始执行了一个i请求
				writer.write("SIPP".getBytes());
				if(!tryExecuteRequest("i", requestId++,	writer,	1))
					throw new Exception("Init Http Transfer	failed..");

				while(!closeFlag) {
					writer.clear();
					BytesEntry entry = bytesEntryQueue.poll(5,TimeUnit.SECONDS);		//等待五秒,如果没有元素也返回
					if(entry!=null)	{
						writer.writeBytes(entry.getBytes(),	entry.getOffset(), entry.getLength());	//
						while(bytesEntryQueue.size()>0)	{
							entry =	bytesEntryQueue.poll();
							writer.writeBytes(entry.getBytes(),	entry.getOffset(), entry.getLength());
						}
					}
					writer.write("SIPP".getBytes());

					//尝试发送这个请求，如果超过指定次数，传递传输异常
					if(!tryExecuteRequest("s",requestId++,writer, 3)) {
						closeFlag =	true;
						throw new Exception("execute http request failed..");
					}
				}

				//结束
				writer.clear();
				writer.write("SIPP".getBytes());
				tryExecuteRequest("d", requestId++,	writer,	1);

			}catch(Throwable e)	{
				 throw new RuntimeException(e);
			}
		}
	};

	this.runThead =	new	Thread(r);
	this.runThead.setName("HttpTransfer");
	this.runThead.start();
}

 /**
	 * 执行一个请求
	 * @param s			 类型(i,s,d)
	 * @param i			 请求的序号
	 * @param writer	 数据
	 * @throws IOException
	 */
	private	void executeRequest(String s, int i,ByteWriter writer) throws IOException
	{
		String turl	= this.url+"?";
		turl +=	"t="+s;
		turl +=	"&#038;i="+ Integer.toString(i);

		URL	realURL	= new URL(turl);
		HttpURLConnection connection = (HttpURLConnection) realURL.openConnection();
		connection.setRequestMethod("POST");
		connection.setRequestProperty("User-Agent",	"IIC2.0/PC 4.0.3340");
		connection.setRequestProperty("Pragma",	this.pragma);
		connection.setRequestProperty("Content-Type", "application/oct-stream");
		connection.setRequestProperty("Accept",	"*/*");
		connection.setRequestProperty("Cookie",	"ssic="+this.ssic);
		connection.setDoOutput(true);
		OutputStream out = connection.getOutputStream();
		out.write(writer.toByteArray(),	0, writer.size());
		out.flush();

		if(connection.getResponseCode()==200) {
			int	contentLength =	connection.getContentLength();
			if(contentLength>4)	{
				InputStream	in = connection.getInputStream();
				writer.clear();
				while(contentLength>4){
					writer.writeByte(in.read());
					contentLength--;
				}
				if(writer.size()>0)	{
					this.bytesReceived(writer.toByteArray(), writer.size());
				}
			}
		}else {
			throw new IOException("Invalid response	stateCode="+connection.getResponseCode());
		}
	}
</pre>
<p>其实HTTP模式下的连接很简单，就是传输SIPC信令包的方式不同而已，其他的没有太大的变化。可以想象HTTP传输方式就是把SIPC-PROXY传输的信令包换了一种方式传输而已。<br />
但有一点有很大的区别，就是HTTP模式下和PROXY，SSL模式下和在线好友建立对话的方式完全不同。这个会在下几篇文章中详细的分析。</p>
<p>HTTP模式就分析到这，下一篇分析在SIPC-PROXY，SIPC-SSL这两种模式下，如何和在线的好友建立会话。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.solosky.net/2010/08/fetion2010-http-connection-mode.html/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>和同学换电脑用，翻到了我一周写完的MapleTMS&#8230;</title>
		<link>http://www.solosky.net/2010/07/about-mapletms.html</link>
		<comments>http://www.solosky.net/2010/07/about-mapletms.html#comments</comments>
		<pubDate>Thu, 01 Jul 2010 04:41:09 +0000</pubDate>
		<dc:creator>solosky</dc:creator>
				<category><![CDATA[乱七八糟的东东]]></category>

		<guid isPermaLink="false">http://www.solosky.net/?p=146</guid>
		<description><![CDATA[这个东西是为科技立项做的，但由于种种原因没有验收，就搁在那里。今天和同学的电脑换回来，清理东西的时候才想起，发在这里有兴趣的朋友拿去研究吧··
我用了一周的时间赶出来的，差不都6000++的代码量，平均一天1K左右，我自己都觉得神奇。。也是个半成品，懒得写了，谁有兴趣谁拿去。
使用之前请配置好Gateway.xml里面的网关信息。可以在这里下载源代码。
下面是关于MapleTMS的介绍。
======================MapleTMS==========================

关于程序的介绍
-----------------------------
短消息服务平台是用户通过一条简单短小的消息和服务平台交流信息的平台。在这个消息平台上，运行了很多的小程序，可以给用户提供各种各样的信息。用户可以发送一条短小的消息请求向平台来获取用户感兴趣的信息，例如查询课表信息。

短消息服务平台集成了多种通信网关，如飞信，短信，QQ，MSN，GTalk等即时通信网关，用户可以自由地选择一种通信网关来和短信服务平台交流信息。

短消息服务平台也是一个运行容器，在上面运行了很多的消息小程序，由这些小程序来完成用户消息的交互。开发者可以根据开发文档独立地开发特定应用的消息小程序并部署到短消息服务平台上，来扩展短消息服务平台提供的消息服务。

短消息平台以一种简单的方式来向用户提供信息，彻底地减少了以前获取信息的繁杂步骤，只需简单的一条短消息就可以获取急需和有价值的信息，十分的方便。短消息平台还可以主动地向用户推送信息，让用户和最新的、及时的信息保持同步，可以让用户远离信息延迟，很有应用价值。

程序的组成
---------------------------
程序由两部分组成，消息服务平台和消息网关。消息服务平台为用户提供信息，消息网关是不同聊天客户端的代理，所有的各种类型的聊天客户端的消息都通过消息网关转发给平台，平台发给用户的消息也是通过消息网关转发的。

短消息平台（MapleTMS-Platform）
----------------------------------
目录结构：
	lib - 存放了平台运行所有的依赖的库文件
	bin - 启动脚本
	conf - 存放了平台的配置信息的文件夹
	  └ MapleTMS.xml 平台配置文件
	apps - 存放了消息应用小程序
	 └ Test - 应用项目文件（可以有多个项目文件夹）
	      ├libs - 当前应用所有的消息小程序依赖的库文件
	      ├classes - 应用小程序.class文件存放的位置
	      └Application.xml 项目的部署文件，存放了所有应用小程序的信息和导航信息

消息网关（MapleTMS-Gateway）
----------------------------------
目录结构:
	lib - 存放了平台运行所有的依赖的库文件
	bin - 启动脚本
	Gateway.xml - 网关的配置文件

网关现在已经支持 飞信，MSN。其他仍待实现。

程序启动
----------------------------------
1. 启动短消息平台(启动消息平台.bat)
2. 启动消息网关 (启动消息网关.bat)

如何使用
----------------------------------
比如现在设置了一个飞信网关，飞信号为 23023121，首先提示用户在飞信客户端添加 23023121 为好友，然后飞信网关会自动同意添加好友请求，之后用户就可以随意的给  23023121 [...]]]></description>
			<content:encoded><![CDATA[<p>这个东西是为科技立项做的，但由于种种原因没有验收，就搁在那里。今天和同学的电脑换回来，清理东西的时候才想起，发在这里有兴趣的朋友拿去研究吧··</p>
<p>我用了一周的时间赶出来的，差不都6000++的代码量，平均一天1K左右，我自己都觉得神奇。。也是个半成品，懒得写了，谁有兴趣谁拿去。</p>
<p>使用之前请配置好Gateway.xml里面的网关信息。可以在<a href="http://downloads.solosky.net/MapleTMS -0.0001Beta.zip" target="_blank">这里</a>下载源代码。</p>
<p>下面是关于MapleTMS的介绍。</p>
<pre>======================MapleTMS==========================

关于程序的介绍
-----------------------------
短消息服务平台是用户通过一条简单短小的消息和服务平台交流信息的平台。在这个消息平台上，运行了很多的小程序，可以给用户提供各种各样的信息。用户可以发送一条短小的消息请求向平台来获取用户感兴趣的信息，例如查询课表信息。

短消息服务平台集成了多种通信网关，如飞信，短信，QQ，MSN，GTalk等即时通信网关，用户可以自由地选择一种通信网关来和短信服务平台交流信息。

短消息服务平台也是一个运行容器，在上面运行了很多的消息小程序，由这些小程序来完成用户消息的交互。开发者可以根据开发文档独立地开发特定应用的消息小程序并部署到短消息服务平台上，来扩展短消息服务平台提供的消息服务。

短消息平台以一种简单的方式来向用户提供信息，彻底地减少了以前获取信息的繁杂步骤，只需简单的一条短消息就可以获取急需和有价值的信息，十分的方便。短消息平台还可以主动地向用户推送信息，让用户和最新的、及时的信息保持同步，可以让用户远离信息延迟，很有应用价值。

程序的组成
---------------------------
程序由两部分组成，消息服务平台和消息网关。消息服务平台为用户提供信息，消息网关是不同聊天客户端的代理，所有的各种类型的聊天客户端的消息都通过消息网关转发给平台，平台发给用户的消息也是通过消息网关转发的。

短消息平台（MapleTMS-Platform）
----------------------------------
目录结构：
	lib - 存放了平台运行所有的依赖的库文件
	bin - 启动脚本
	conf - 存放了平台的配置信息的文件夹
	  └ MapleTMS.xml 平台配置文件
	apps - 存放了消息应用小程序
	 └ Test - 应用项目文件（可以有多个项目文件夹）
	      ├libs - 当前应用所有的消息小程序依赖的库文件
	      ├classes - 应用小程序.class文件存放的位置
	      └Application.xml 项目的部署文件，存放了所有应用小程序的信息和导航信息

消息网关（MapleTMS-Gateway）
----------------------------------
目录结构:
	lib - 存放了平台运行所有的依赖的库文件
	bin - 启动脚本
	Gateway.xml - 网关的配置文件

网关现在已经支持 飞信，MSN。其他仍待实现。

程序启动
----------------------------------
1. 启动短消息平台(启动消息平台.bat)
2. 启动消息网关 (启动消息网关.bat)

如何使用
----------------------------------
比如现在设置了一个飞信网关，飞信号为 23023121，首先提示用户在飞信客户端添加 23023121 为好友，然后飞信网关会自动同意添加好友请求，之后用户就可以随意的给  23023121 发送一条消息， 23023121好友就会发送回欢迎信息，然后根据提示回复相应的编号即可获得相应的服务。
其他类型网关类似。

消息应用小程序的开发和部署
----------------------------------
略，详见 小程序的开发和部署.txt 文件
默认有一个Test消息应用，包含了两个消息小程序:
	HelloInfolet - 这个是经典的HelloWorld演示
	WeatherInfolet - 天气查询，默认是成都，可以输入TQ#城市（如TQ#重庆）查询其他城市的天气

关于版权
----------------------------------
本程序基于Apache Lisence 2.0 发布，你可以自由的分发本程序。请不要用于非法用途。
网关中所使用的开发库版权申明如下
LumaQQ(http://lumaqq.linuxsir.org/main/)  	luma seraph 版权所有
MapleFetion(http://maplefetion.googlecode.com) 	solosky版权所有
jML(http://sourceforge.net/projects/java-jml/)	 jadestorm 版权所有	

关于作者
----------------------------------
Mail:solosky772@qq.com
Site:http://www.solosky.net</pre>
<p>最后发几张截图&#8230;<br />
<span id="more-146"></span><br />
<img class="alignnone size-full wp-image-148" title="Fetion1" src="http://www.solosky.net/wp-content/uploads/2010/07/Fetion1.jpg" alt="Fetion1" width="699" height="1029" /></p>
<p><img class="alignnone size-full wp-image-149" title="MSN2" src="http://www.solosky.net/wp-content/uploads/2010/07/MSN2.jpg" alt="MSN2" width="826" height="1090" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.solosky.net/2010/07/about-mapletms.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>最后一个月，赶一大堆的报告和作业，发点无聊的作品。。</title>
		<link>http://www.solosky.net/2010/06/flash-work-just-for-fun.html</link>
		<comments>http://www.solosky.net/2010/06/flash-work-just-for-fun.html#comments</comments>
		<pubDate>Mon, 28 Jun 2010 16:23:09 +0000</pubDate>
		<dc:creator>solosky</dc:creator>
				<category><![CDATA[乱七八糟的东东]]></category>

		<guid isPermaLink="false">http://www.solosky.net/?p=128</guid>
		<description><![CDATA[很久没来我博客写文章，一个是我的确很懒，二个是我也不知道写什么，平时写代码时的遇到问题感觉还不屑写在这上面，于是就搁置了。翻了翻我以前写的飞信系列文章，访问的人还不少，感谢大家的关心。其实我对飞信有很多东西和大家分享，无奈我的确有点懒，而且文笔不咋地，写个文章有时候文笔不通，让大家见笑了。马上放假，我也要去实习了，最近准备开始恢复写飞信系列的文章，对这两个月的无所为感到万分的抱歉&#8230;.
最近赶学校一大堆报告和作业，也做了点有趣的，很垃圾的东西，我扔在这里，希望逗大家开心下。
下面的作品，完全没技术含量，纯属娱乐，无聊，还有交作业&#8230;.
接水果的游戏，看看能在3分钟内接到多少分的水果&#8230; 【这里可以下载源代码】【全屏】
 
抢钱的游戏，纯属脑残，天上掉金币，砸到了就是你的了&#8230;  【这里可以下载源代码 】【全屏】

最后一个还像点样子，用Flex做的很简单的一个播放器。本来想添加动态歌词的，google了下没有接口，暂时就放弃了&#8230;界面很友好的说&#8230; 【这里可以下载源代码】【如果不能打开，请点击这里查看】

]]></description>
			<content:encoded><![CDATA[<p>很久没来我博客写文章，一个是我的确很懒，二个是我也不知道写什么，平时写代码时的遇到问题感觉还不屑写在这上面，于是就搁置了。翻了翻我以前写的飞信系列文章，访问的人还不少，感谢大家的关心。其实我对飞信有很多东西和大家分享，无奈我的确有点懒，而且文笔不咋地，写个文章有时候文笔不通，让大家见笑了。马上放假，我也要去实习了，最近准备开始恢复写飞信系列的文章，对这两个月的无所为感到万分的抱歉&#8230;.</p>
<p>最近赶学校一大堆报告和作业，也做了点有趣的，很垃圾的东西，我扔在这里，希望逗大家开心下。</p>
<blockquote><p>下面的作品，完全没技术含量，纯属娱乐，无聊，还有交作业&#8230;.</p></blockquote>
<p>接水果的游戏，看看能在3分钟内接到多少分的水果&#8230; 【<a href="http://downloads.solosky.net/HitFruits.zip" target="_blank">这里可以下载源代码</a>】【<a href="http://works.solosky.net/HitFruits/HitFruits.swf">全屏</a>】</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="600" height="500" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://works.solosky.net/HitFruits/HitFruits.swf" /><embed type="application/x-shockwave-flash" width="600" height="500" src="http://works.solosky.net/HitFruits/HitFruits.swf"> </embed></object></p>
<p>抢钱的游戏，纯属脑残，天上掉金币，砸到了就是你的了&#8230;  【<a href="http://downloads.solosky.net/GotIcons.zip" target="_blank">这里可以下载源代码</a> 】【<a href="http://works.solosky.net/GotIcons/GotIcons.swf">全屏</a>】</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="600" height="500" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://works.solosky.net/GotIcons/GotIcons.swf" /><embed type="application/x-shockwave-flash" width="600" height="500" src="http://works.solosky.net/GotIcons/GotIcons.swf"></embed></object></p>
<p>最后一个还像点样子，用Flex做的很简单的一个播放器。本来想添加动态歌词的，google了下没有接口，暂时就放弃了&#8230;界面很友好的说&#8230; 【<a href="http://downloads.solosky.net/SimplePlayer.zip" target="_blank">这里可以下载源代码</a>】【如果不能打开，请点击<a href="http://works.solosky.net/SimplePlayer/SimplePlayer.html">这里</a>查看】<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="600" height="500" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://works.solosky.net/SimplePlayer/SimplePlayer.swf" /><embed type="application/x-shockwave-flash" width="600" height="500" src="http://works.solosky.net/SimplePlayer/SimplePlayer.swf"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.solosky.net/2010/06/flash-work-just-for-fun.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>腾讯QQ概念版官方操作演示</title>
		<link>http://www.solosky.net/2010/04/qq-concept-demo.html</link>
		<comments>http://www.solosky.net/2010/04/qq-concept-demo.html#comments</comments>
		<pubDate>Sun, 25 Apr 2010 03:59:28 +0000</pubDate>
		<dc:creator>solosky</dc:creator>
				<category><![CDATA[乱七八糟的东东]]></category>

		<guid isPermaLink="false">http://www.solosky.net/?p=119</guid>
		<description><![CDATA[前不久，腾讯体验室推出了QQ概念版。QQ概念版应用微软最新一代客户端展现层技术——WPF，实现多点触摸操作，是腾讯首款NUI(自然用户交互)产品，推出了动感相框、动态背景、多Tab聊天窗口、3D交互、桌面好友等一系列新功能,为您打造完美尊贵的新体验。

下面是官方的演示视频。第一个是多点触控演示，操作很流畅，用户体验超好，触控操作是以后人机交互的趋势，腾讯终于迈出了自主创新的第一步了。
当然如果没有触摸屏，用鼠标操作也可以，只不过用户体验没触控操作好了。
目前QQ概念版还在体验室，没有正式发布，要体验的朋友还得去官方申请体验。
特别说明：QQ概念版只能在win7下运行，如果你用的是XP，和我一样，只能看看视频了。。我这破本本，三年前买的，Win7能跑动，就是硬盘小了，只有80G，还是老老实实的用XP吧。。
官方首页：http://labs.qq.com/labs/gainian.shtml
体验中心：http://exp.qq.com/cgi-bin/present/tec_cgi_present_plan_info?plan_id=133
]]></description>
			<content:encoded><![CDATA[<p>前不久，腾讯体验室推出了QQ概念版。QQ概念版应用微软最新一代客户端展现层技术——WPF，实现多点触摸操作，是腾讯首款NUI(自然用户交互)产品，推出了动感相框、动态背景、多Tab聊天窗口、3D交互、桌面好友等一系列新功能,为您打造完美尊贵的新体验。</p>
<p><img class="alignnone size-full wp-image-120" title="qq-concept" src="http://www.solosky.net/wp-content/uploads/2010/04/qq-concept.png" alt="qq-concept" width="659" height="250" /></p>
<p>下面是官方的演示视频。第一个是多点触控演示，操作很流畅，用户体验超好，触控操作是以后人机交互的趋势，腾讯终于迈出了自主创新的第一步了。</p>
<object width="480" height="400"><param name="movie" value="http://player.youku.com/player.php/sid/XMTY2NzA1NTEy/v.swf"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="never"></param><param name="allownetworking" value="internal"></param><param name="flashvars" value="isShowRelatedVideo=false&showAd=0&show_pre=1&show_next=1&isAutoPlay=false&isDebug=false&UserID=&winType=interior&playMovie=true&MMControl=false&MMout=false&RecordCode=1001,1002,1003,1004,1005,1006,2001,3001,3002,3003,3004,3005,3007,3008,9999" /><embed src="http://player.youku.com/player.php/sid/XMTY2NzA1NTEy/v.swf" type="application/x-shockwave-flash" allowscriptaccess="never" allownetworking="internal" allowfullscreen="true" width="480" height="400" flashvars="isShowRelatedVideo=false&showAd=0&show_pre=1&show_next=1&isAutoPlay=false&isDebug=false&UserID=&winType=interior&playMovie=true&MMControl=false&MMout=false&RecordCode=1001,1002,1003,1004,1005,1006,2001,3001,3002,3003,3004,3005,3007,3008,9999"></embed></object>
<p>当然如果没有触摸屏，用鼠标操作也可以，只不过用户体验没触控操作好了。</p>
<object width="480" height="400"><param name="movie" value="http://player.youku.com/player.php/sid/XMTY2NzA0Njc2/v.swf"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="never"></param><param name="allownetworking" value="internal"></param><param name="flashvars" value="isShowRelatedVideo=false&showAd=0&show_pre=1&show_next=1&isAutoPlay=false&isDebug=false&UserID=&winType=interior&playMovie=true&MMControl=false&MMout=false&RecordCode=1001,1002,1003,1004,1005,1006,2001,3001,3002,3003,3004,3005,3007,3008,9999" /><embed src="http://player.youku.com/player.php/sid/XMTY2NzA0Njc2/v.swf" type="application/x-shockwave-flash" allowscriptaccess="never" allownetworking="internal" allowfullscreen="true" width="480" height="400" flashvars="isShowRelatedVideo=false&showAd=0&show_pre=1&show_next=1&isAutoPlay=false&isDebug=false&UserID=&winType=interior&playMovie=true&MMControl=false&MMout=false&RecordCode=1001,1002,1003,1004,1005,1006,2001,3001,3002,3003,3004,3005,3007,3008,9999"></embed></object>
<p>目前QQ概念版还在体验室，没有正式发布，要体验的朋友还得去官方申请体验。</p>
<p>特别说明：QQ概念版只能在win7下运行，如果你用的是XP，和我一样，只能看看视频了。。我这破本本，三年前买的，Win7能跑动，就是硬盘小了，只有80G，还是老老实实的用XP吧。。</p>
<p>官方首页：<a href="http://labs.qq.com/labs/gainian.shtml" target="_blank">http://labs.qq.com/labs/gainian.shtml</a></p>
<p>体验中心：<a href="http://exp.qq.com/cgi-bin/present/tec_cgi_present_plan_info?plan_id=133" target="_blank">http://exp.qq.com/cgi-bin/present/tec_cgi_present_plan_info?plan_id=133</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.solosky.net/2010/04/qq-concept-demo.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>前不久去博客园逛，发现个水贴&#8230;</title>
		<link>http://www.solosky.net/2010/04/hard-to-live-with-girl.html</link>
		<comments>http://www.solosky.net/2010/04/hard-to-live-with-girl.html#comments</comments>
		<pubDate>Wed, 21 Apr 2010 13:20:12 +0000</pubDate>
		<dc:creator>solosky</dc:creator>
				<category><![CDATA[乱七八糟的东东]]></category>

		<guid isPermaLink="false">http://www.solosky.net/?p=113</guid>
		<description><![CDATA[楼主
刚跟一个金融界的哥们吃饭，他说到：“我刚送了女友一副24K的手镯， 她很喜欢，现在女人真是不好养啊！”
我非常郁闷：“唉，难怪我没有女友，我也就能送个24K的新建文本文档……”
刚跟一个金融界的哥们吃饭，他说到：“我刚送了女友一辆40w的车，她很喜欢，现在女人真是不好养啊！”
我非常郁闷： “唉，难怪我没有女友，我也就能送个40w的灯泡……”
楼主一发，楼下盖楼之势犹如滔滔黄河泛滥不绝..想来园子里朋友都是debug良久，憋屈之极，跃然于纸上&#8230;
刚跟一个金融界的哥们吃饭，他说到：“我刚送了女友一2000欧的表，她很喜欢，现在女人真是不好养啊！&#8221;
我非常郁闷： “唉，难怪我没有女友，我也就能送个2000欧的电阻……&#8221;
哥们是搞电子的？？

刚跟一个哥们吃饭，他说到：“我刚送了女友LV的手提包，她很喜欢，现在女人真是不好养啊！&#8221;
我非常郁闷： “唉，难怪我没有女友，我也就能送个AV的压缩包……&#8221;
这位牛，相信你女友肯定会喜欢的。。
刚跟一个金融界的哥们吃饭，他说到：“我刚送了女友一辆BMW，她很喜欢，现在女人真是不好养啊！&#8221;
我非常郁闷： “唉，难怪我没有女友，我也就能送个Bmp……&#8221;
BMW估计很难很难，BMP的却很多，PreenScreen就是一个
刚跟一个金融界的哥们吃饭，他说到：“我刚送了女友一个限量版的Zip打火机， 她很喜欢，现在女人真是不好养啊！&#8221;
我非常郁闷：“唉，难怪我没有女友，我也就能送个限大小版的Zip压缩包……&#8221;
同样是ZIP，差距咋就这么大呢
刚跟一个金融界的哥们吃饭，他说到：“我刚送了女友一个限量版的HP笔记本， 她很喜欢，现在女人真是不好养啊！&#8221;
我非常郁闷：“唉，难怪我没有女友，我也就能玩游戏时送个小瓶装的hp药水……&#8221;
哥们在玩游戏吧··
刚跟一个金融界的哥们吃饭，他说到：“我刚为女友买了一辆QQ， 她很喜欢，现在女人真是不好养啊！&#8221;
我非常郁闷：“唉，难怪我没有女友，我也就能给她个QQ号&#8221;
QQ还是很实用滴,,,
刚跟一个金融界的哥们吃饭，他说到：“我刚送了女友一套别墅， 她很喜欢，现在女人真是不好养啊！&#8221;
我非常郁闷：“唉，难怪我没有女友，我也就能送个开心农场……&#8221;
怎么，你还要叫你女友去帮你偷菜啊~~
刚跟一个金融界的哥们吃饭，他说到：“我刚送了女友一辆10W的奇瑞，她很喜欢，现在女人真是不好养啊！&#8221;
我非常郁闷： “唉，难怪我没有女友，我也就能送个免费的奇虎&#8221;
以上纯属瞎扯。
来源：http://home.cnblogs.com/group/topic/38495-1.html
]]></description>
			<content:encoded><![CDATA[<p><strong>楼主</strong></p>
<blockquote><p>刚跟一个金融界的哥们吃饭，他说到：“我刚送了女友一副24K的手镯， 她很喜欢，现在女人真是不好养啊！”<br />
我非常郁闷：“唉，难怪我没有女友，我也就能送个24K的新建文本文档……”<br />
刚跟一个金融界的哥们吃饭，他说到：“我刚送了女友一辆40w的车，她很喜欢，现在女人真是不好养啊！”<br />
我非常郁闷： “唉，难怪我没有女友，我也就能送个40w的灯泡……”</p></blockquote>
<p>楼主一发，楼下盖楼之势犹如滔滔黄河泛滥不绝..想来园子里朋友都是debug良久，憋屈之极，跃然于纸上&#8230;</p>
<blockquote><p>刚跟一个金融界的哥们吃饭，他说到：“我刚送了女友一2000欧的表，她很喜欢，现在女人真是不好养啊！&#8221;<br />
我非常郁闷： “唉，难怪我没有女友，我也就能送个2000欧的电阻……&#8221;</p></blockquote>
<p>哥们是搞电子的？？<br />
<span id="more-113"></span></p>
<blockquote><p>刚跟一个哥们吃饭，他说到：“我刚送了女友LV的手提包，她很喜欢，现在女人真是不好养啊！&#8221;<br />
我非常郁闷： “唉，难怪我没有女友，我也就能送个AV的压缩包……&#8221;</p></blockquote>
<p>这位牛，相信你女友肯定会喜欢的。。</p>
<blockquote><p>刚跟一个金融界的哥们吃饭，他说到：“我刚送了女友一辆BMW，她很喜欢，现在女人真是不好养啊！&#8221;<br />
我非常郁闷： “唉，难怪我没有女友，我也就能送个Bmp……&#8221;</p></blockquote>
<p>BMW估计很难很难，BMP的却很多，PreenScreen就是一个</p>
<blockquote><p>刚跟一个金融界的哥们吃饭，他说到：“我刚送了女友一个限量版的Zip打火机， 她很喜欢，现在女人真是不好养啊！&#8221;<br />
我非常郁闷：“唉，难怪我没有女友，我也就能送个限大小版的Zip压缩包……&#8221;</p></blockquote>
<p>同样是ZIP，差距咋就这么大呢</p>
<blockquote><p>刚跟一个金融界的哥们吃饭，他说到：“我刚送了女友一个限量版的HP笔记本， 她很喜欢，现在女人真是不好养啊！&#8221;<br />
我非常郁闷：“唉，难怪我没有女友，我也就能玩游戏时送个小瓶装的hp药水……&#8221;</p></blockquote>
<p>哥们在玩游戏吧··</p>
<blockquote><p>刚跟一个金融界的哥们吃饭，他说到：“我刚为女友买了一辆QQ， 她很喜欢，现在女人真是不好养啊！&#8221;<br />
我非常郁闷：“唉，难怪我没有女友，我也就能给她个QQ号&#8221;</p></blockquote>
<p>QQ还是很实用滴,,,</p>
<blockquote><p>刚跟一个金融界的哥们吃饭，他说到：“我刚送了女友一套别墅， 她很喜欢，现在女人真是不好养啊！&#8221;<br />
我非常郁闷：“唉，难怪我没有女友，我也就能送个开心农场……&#8221;</p></blockquote>
<p>怎么，你还要叫你女友去帮你偷菜啊~~</p>
<blockquote><p>刚跟一个金融界的哥们吃饭，他说到：“我刚送了女友一辆10W的奇瑞，她很喜欢，现在女人真是不好养啊！&#8221;<br />
我非常郁闷： “唉，难怪我没有女友，我也就能送个免费的奇虎&#8221;</p></blockquote>
<p>以上纯属瞎扯。<br />
来源：<a href="http://home.cnblogs.com/group/topic/38495-1.html" target="_blank">http://home.cnblogs.com/group/topic/38495-1.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.solosky.net/2010/04/hard-to-live-with-girl.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>启动新项目，WebCDN..</title>
		<link>http://www.solosky.net/2010/04/new-project-webcdn.html</link>
		<comments>http://www.solosky.net/2010/04/new-project-webcdn.html#comments</comments>
		<pubDate>Wed, 21 Apr 2010 12:49:46 +0000</pubDate>
		<dc:creator>solosky</dc:creator>
				<category><![CDATA[乱七八糟的东东]]></category>

		<guid isPermaLink="false">http://www.solosky.net/?p=111</guid>
		<description><![CDATA[没啥目的，想到很多人都在为找免费的图床伤透了脑筋，因为往往图片占据了网站的大部分流量。于是启动了这个项目，希望对像我这样的草根站长提供帮助。。
下面是我googlecode上的项目介绍：

WebCDN可以使用互联网上廉价的、免费的存储空间来帮助你把文件分散地存储到不同的节点，并且生成可以访问的的URL地址。
做过站长的朋友都会知道网站的图片往往是最耗传输流量的，所以很多站长都会选择第三方可以外链的图片存储空间来存储图片。但免费且稳定的图片存储空间不容易找，而且很容易失效，这样又得重新换一个图片存储空间来上传图片，十分的麻烦。 自己做图片存储空间备份又麻烦而且限制太多。
WebCDN可以帮助你解决这些麻烦。WebCDN已经集合了互联网上免费稳定的图片存储空间，把这每个图片存储空间作为一个节点，用户可以启用多个存储节点，当用户上传一张图片，WebCDN会自动的把这张图片分发到不同的存储节点，保证这张图片存储多份。当用户需要访问这个图片时会自动选择最快的节点浏览图片。并且WebCDN会随时检查节点的有效性，当检测到某个节点无效后会自动移除这个节点，保证用户图片的正确访问。WebCDN还可以帮你自动的完成图片备份到本地，减少你备份图片的时间。
当然WebCDN不只是能存储图片，也可以存储其他类型的文件，只要节点支持存储这种类型的文件就可以存储。
WebCDN适合帮助你保存小于2M的文件，较大的文件建议还是采用网盘保存。
WebCDN使用PHP作为开发语言实现的。
目前正在设计中。。
项目地址：http://code.google.com/p/webcdn/ 欢迎有兴趣的朋友加入开发！！
]]></description>
			<content:encoded><![CDATA[<p>没啥目的，想到很多人都在为找免费的图床伤透了脑筋，因为往往图片占据了网站的大部分流量。于是启动了这个项目，希望对像我这样的草根站长提供帮助。。<br />
下面是我googlecode上的项目介绍：</p>
<blockquote><p>
WebCDN可以使用互联网上廉价的、免费的存储空间来帮助你把文件分散地存储到不同的节点，并且生成可以访问的的URL地址。</p>
<p>做过站长的朋友都会知道网站的图片往往是最耗传输流量的，所以很多站长都会选择第三方可以外链的图片存储空间来存储图片。但免费且稳定的图片存储空间不容易找，而且很容易失效，这样又得重新换一个图片存储空间来上传图片，十分的麻烦。 自己做图片存储空间备份又麻烦而且限制太多。</p>
<p>WebCDN可以帮助你解决这些麻烦。WebCDN已经集合了互联网上免费稳定的图片存储空间，把这每个图片存储空间作为一个节点，用户可以启用多个存储节点，当用户上传一张图片，WebCDN会自动的把这张图片分发到不同的存储节点，保证这张图片存储多份。当用户需要访问这个图片时会自动选择最快的节点浏览图片。并且WebCDN会随时检查节点的有效性，当检测到某个节点无效后会自动移除这个节点，保证用户图片的正确访问。WebCDN还可以帮你自动的完成图片备份到本地，减少你备份图片的时间。</p>
<p>当然WebCDN不只是能存储图片，也可以存储其他类型的文件，只要节点支持存储这种类型的文件就可以存储。</p>
<p>WebCDN适合帮助你保存小于2M的文件，较大的文件建议还是采用网盘保存。</p>
<p>WebCDN使用PHP作为开发语言实现的。</p>
<p>目前正在设计中。。</p></blockquote>
<p>项目地址：http://code.google.com/p/webcdn/ 欢迎有兴趣的朋友加入开发！！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.solosky.net/2010/04/new-project-webcdn.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>飞信2010分析 &#8211; 给离线好友发送消息</title>
		<link>http://www.solosky.net/2010/04/fetion2010-send-message-to-offline-buddy.html</link>
		<comments>http://www.solosky.net/2010/04/fetion2010-send-message-to-offline-buddy.html#comments</comments>
		<pubDate>Wed, 21 Apr 2010 05:04:20 +0000</pubDate>
		<dc:creator>solosky</dc:creator>
				<category><![CDATA[飞信哪些事儿]]></category>

		<guid isPermaLink="false">http://www.solosky.net/?p=103</guid>
		<description><![CDATA[今天发这篇文章刚好是全国哀悼玉树地震的中遇难的日子，整个互联网都很悲伤。的确，我也是亲身经历过汶川的地震，经历过那种面对死亡的恐惧和重生过后的喜悦。
汶川地震，我们活着，我们是幸运儿。我们每一个在这场大劫中余生的人，都应该有一种获得重生的净化。在自然面前，人的生命是那么的脆弱。活着，比一切都好。这是地震给我最大的感触。
而在地震中不幸遇难的人们，我们应该为他们祈福，愿他们在天堂活得快乐……阿门····
谨以此文纪念在玉树地震以及汶川地震中死去的同胞们！
飞信发送消息用的是SIP协议里面的标准的M请求。飞信给客户端在线的好友和短信在线的好友发送消息的方式是不同的。我们来先看给状态为短信在线或离线的好友发送消息。
注意我这里说的是消息。飞信由于有短信就有点复杂。解释一下：飞信用户可以给飞信好友发送消息（只要是在用户好友列表里面的用户都视为飞信好友，无论是否开通飞信），
     1.如果用户在线，消息直接通过聊天服务器中转后直接发送给客户端。
     2.如果好友不在线，
          a.好友设置为飞信客户端离线时使用手机短信接收飞信消息，给该好友发送的消息就通过飞信的短信服务器直接通过手机短信的方式把消息发送到好友的手机上，
          b.用户设置为客户端不在线不用手机接收飞信消息，飞信服务器就保存用户发送的消息，不发送到好友的手机，然后等待好友再次登录客户端后才发送给好友。
现在来说明好友URI为sip:111111111@fetion.com.cn;p=1111，状态为短信在线或者离线或者隐身，发送和接收飞信消息的交互过程。（如何判断好友是客户端在线，还是短信在线，还是离线，请参见我上一篇文章。）

下面是飞信客户端“主动”向好友发送消息(不是短信)，请求和回复如下

M fetion.com.cn SIP-C/4.0
F: 123456789
I: 16
Q: 2 M
T: sip:111111111@fetion.com.cn;p=1111
C: text/plain
K: SaveHistory
N: CatMsg
L: 5

hello
-----------------------------------------------------
SIP-C/4.0 200 OK
T: sip:1111111@fetion.com.cn;p=1111
I: 16
Q: 2 M
D: Wed, 21 Apr 2010 02:34:09 GMT

F就是飞信号，前几篇文章已经说明了，注意请求中的T，就是To，写明了短消息接收方的URI地址，这个URI可以在登录成功后返回的好友列表中获取到。  [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>今天发这篇文章刚好是全国哀悼玉树地震的中遇难的日子，整个互联网都很悲伤。的确，我也是亲身经历过汶川的地震，经历过那种面对死亡的恐惧和重生过后的喜悦。<br />
汶川地震，我们活着，我们是幸运儿。我们每一个在这场大劫中余生的人，都应该有一种获得重生的净化。在自然面前，人的生命是那么的脆弱。活着，比一切都好。这是地震给我最大的感触。<br />
而在地震中不幸遇难的人们，我们应该为他们祈福，愿他们在天堂活得快乐……阿门····<br />
谨以此文纪念在玉树地震以及汶川地震中死去的同胞们！</p></blockquote>
<p>飞信发送消息用的是SIP协议里面的标准的M请求。飞信给客户端在线的好友和短信在线的好友发送消息的方式是不同的。我们来先看给状态为短信在线或离线的好友发送消息。</p>
<p>注意我这里说的是消息。飞信由于有短信就有点复杂。解释一下：飞信用户可以给飞信好友发送消息（只要是在用户好友列表里面的用户都视为飞信好友，无论是否开通飞信），<br />
     1.如果用户在线，消息直接通过聊天服务器中转后直接发送给客户端。<br />
     2.如果好友不在线，<br />
          a.好友设置为飞信客户端离线时使用手机短信接收飞信消息，给该好友发送的消息就通过飞信的短信服务器直接通过手机短信的方式把消息发送到好友的手机上，<br />
          b.用户设置为客户端不在线不用手机接收飞信消息，飞信服务器就保存用户发送的消息，不发送到好友的手机，然后等待好友再次登录客户端后才发送给好友。</p>
<p>现在来说明好友URI为sip:111111111@fetion.com.cn;p=1111，状态为短信在线或者离线或者隐身，发送和接收飞信消息的交互过程。（如何判断好友是客户端在线，还是短信在线，还是离线，请参见我上一篇文章。）<br />
<span id="more-103"></span><br />
下面是飞信客户端“主动”向好友发送消息(不是短信)，请求和回复如下</p>
<pre class="brush:Plain">
M fetion.com.cn SIP-C/4.0
F: 123456789
I: 16
Q: 2 M
T: sip:111111111@fetion.com.cn;p=1111
C: text/plain
K: SaveHistory
N: CatMsg
L: 5

hello
-----------------------------------------------------
SIP-C/4.0 200 OK
T: sip:1111111@fetion.com.cn;p=1111
I: 16
Q: 2 M
D: Wed, 21 Apr 2010 02:34:09 GMT
</pre>
<p>F就是飞信号，前几篇文章已经说明了，注意请求中的T，就是To，写明了短消息接收方的URI地址，这个URI可以在登录成功后返回的好友列表中获取到。  前面说过，开通飞信的URI和未开通飞信的URI是不同的，未开通飞信的URI的格式是tel:159xxxxxxxx，倘若知道好友的电话号码，却不知道好友的URI，发送消息时用tel:159xxxxxxxx这样的URI发送消息是不能成功的。但可以通过其他的方式获取到URI，后面会详细说明。<br />
C = Content-Type，消息的格式。有两种:<br />
          text/plain，这种是文本格式，就是说消息内容不含有任何格式信息；<br />
          text/html-fragment：带有格式信息的消息，字体，大小，颜色，就这三种。如<span>hello</span>。<br />
一般说来，发送手机短信的时候就用text/plain无格式的消息，给用客户端登录的好友就用text/html-fragment格式的消息，客户端可以解析并显示这样的格式的信息。<br />
K(Supported): SaveHistory 不清楚啥含义。<br />
N(Event) : CatMsg，这里说明了消息类型，CatMsg就是飞信消息。这里为SendCatSMS就是发送短信，也就是无论好友客户端是否在线，都会直接发送到好友的手机上。<br />
后面的就是SIP信令里面定义的消息体了，即为消息内容。  </p>
<p>来看下回复。发送成功后一般来说有两种状态<br />
     200 OK：发送消息成功，如果对方离线就保存到服务器等待好友下次客户端登陆时候发送给好友。如果对方隐身，将直接发送到客户端。因为隐身和离线状态码都是0，无法判断。<br />
     280 Send SMS OK：发送消息成功，对方客户端不在线，但设置了手机接收消息，消息通过短信方式的发送到对方手机上。这个和200的状态消息内容不一样。如下：</p>
<pre class="brush:Plain">SIP-C/4.0 280 Send SMS OK
T: sip:11111111@fetion.com.cn;p=1111
I: 17
Q: 1 M
L: 115</pre>
<p>可以看出，当发送短信成功的时候，返回了一个配额使用统计。</p>
<p>飞信每天发送到手机的短信都是有一定的限制的，以前测试过，飞信最多每天可以发送750条消息到手机上，每月好像是1000条，没有测试。官方没说，只能猜想。所以用飞信做点小的应用是可以的，想做大的短信应用还是使用短信猫或者其他的短信平台才行。虽然发送到手机短信的信息有限制，但给客户端发送的消息没有限额任何限制。</p>
<p>当然，如果超过了这个限制发送就会失败，返回如下</p>
<pre class="brush:Plain">SIP-C/4.0 486 sy Here
T: sip:1111111@fetion.com.cn;p=1111
I: 4
Q: 10 M
L: 52</pre>
<p>OK，说完了客户端主动向好友发送信息，那好友主动的向用户发信息呢？</p>
<p>因为好友不在线，这种情况只能是好友通过手机回复收到的飞信短信发送信息。手机消息发送方的号码为12520159xxxxxxx这都是飞信网关发送给好友手机的短信。</p>
<p>好友主动给用户发信息是通过一条通知（这里把服务器主动发送给客户端的消息称为一个通知），这是服务器主动发送过来的SIP信令：</p>
<pre class="brush:Plain">M 123456789 SIP-C/4.0
F: sip:11111111@fetion.com.cn;p=1111
I: -110
Q: 111 M
C: text/plain
L: 6
D: Wed, 21 Apr 2010 03:49:43 GMT

你好
-----------------------------------------------------
SIP-C/4.0 200 OK
F: sip:11111111@fetion.com.cn;p=1111
I: -110
Q: 111 M</pre>
<p>很简单吧，F就是From, 说明了这条消息是谁发送的，C和上面一样。注意这里在接受完这个消息之后，一定要发送一个确认回复，向服务器表明我收到了这条消息，如果在一段时间内服务器没有收到这个回复就会像客户端发送消息发送失败回复。I和Q的值就是服务器发回的消息通知里面的I和Q。</p>
<p>上面使用CatMsg发送的消息可能发送到客户端，也可能发送到手机上，如果需要强制把消息发送到手机只需需要把CatMsg改成SendCatSMS就OK了。</p>
<pre class="brush:Plain">M fetion.com.cn SIP-C/4.0
F: 685592830
I: 17
Q: 1 M
T: sip:683209086@fetion.com.cn;p=4710
N: SendCatSMS
L: 5

hello</pre>
<p>注意这里没有了C和K字段，因为都不支持了。消息正文只能是无格式的文本，如果发送成功返回的结果就是280 Send SMS OK，内容和上面一样，不罗嗦了。</p>
<p>倘若需要给手机号为159xxxxxxxx的好友发送消息或者短信，因为发送消息或者短信需要用到uri，但这里只知道好友的手机号，如何才能通过手机号查到好友的Uri呢？？</p>
<p>来看看SIPC验证成功返回的结果中没有手机号码，通过BN返回的状态信息中有的含有手机号，有的没有（主要是飞信权限设置的原因），通过遍历好友查找显然是不行的。</p>
<p>某一天我无意中发现了这样的方法。</p>
<p>发起一个获取好友信息的请求：</p>
<pre class="brush:Plain">S fetion.com.cn SIP-C/4.0
F: 685592830
I: 4
Q: 1 S
N: GetContactInfoV4
L: 46

&lt;args&gt;&lt;contact uri="tel:159xxxxxxxx" /&gt;&lt;/args&gt;
----
SIP-C/4.0 200 OK
I: 4
Q: 1 S
L: 547

&lt;results&gt;&lt;contact uri="tel:159xxxxxxxx" version="0" user-id="123456789" sid="683209086" .../&gt;&lt;/results&gt;</pre>
<p>呵呵，看出来了吗，服务器返回了一个user-id，还记得前面SIPC验证成功之后服务器返回的好友列表中的i吗？i就是user-id，现在得到了手机号为159xxxxxxxx的user-id，就可以去遍历用户的所有好友，如果手机号为159xxxxxxxx的用户是你的好友，就一定会找到这个好友，然后自然就找到了uri(URI就是验证成功之后的好友列表中的u的值)，现在就可以拿这个uri去建立会话发消息或者短信吧。。</p>
<p>好了，上面说的都是和状态为短信在线或离线的好友发送或者接受消息。如果你用这个方法去给在线的好友发送消息你会发现对方可以接受到你发的消息，却不能收到对方发送的消息，这是因为飞信和在线好友发消息使用的方式是不同的，如何给在线好友发消息，下篇文章详细说明。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.solosky.net/2010/04/fetion2010-send-message-to-offline-buddy.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

