<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>icyleaf</title><link href="http://icyleaf.com/" rel="alternate"></link><link href="http://icyleaf.com/feeds/all.atom.xml" rel="self"></link><id>http://icyleaf.com/</id><updated>2013-02-19T19:12:00+08:00</updated><entry><title>针对 Universal 应用上线 App Store 的提示</title><link href="http://icyleaf.com/2013/02/app-store-review-tips-about-universal-app" rel="alternate"></link><updated>2013-02-19T19:12:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2013-02-19:2013/02/app-store-review-tips-about-universal-app</id><summary type="html">&lt;h2&gt;官方禁止新版本支持的设备小余旧版本&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://itunes.apple.com/cn/app/le-ju-ji-suan-qi-zui-gei-li/id397735649?mt=8"&gt;乐居计算器&lt;/a&gt;是我们的第一款 Universal 应用，这次做了重要变化，但仅限于 iPhone 的修改，本想改本次上线仅支持 iPhone 来赶 deadline，临到上线的时候却被 Xcode 报错：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"This bundle does not support one or more of the devices that were supported in the previous bundle for this app. Bundles must continue to support any devices previously supported."&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;官方《&lt;a href="https://developer.apple.com/appstore/guidelines.html"&gt;App Store Review Guidelines&lt;/a&gt;》却没有提到有这样的限制，最后在官方技术 Q&amp;amp;A 找到答疑，参见 &lt;a href="http://developer.apple.com/library/ios/#qa/qa1623/_index.html"&gt;Why am I getting device support errors when uploading my app?&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;iPhone 和 iPad 的排名是分开统计的&lt;/h2&gt;
&lt;p&gt;不知道大家注意没有，其实就算你发布的 app 是 Universal，但 app store 针对它的排行榜确实分开计算的，因此在做排名统计的时候不要只顾着一个设备的数据。那这个下载的数据怎么计算呢？&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;什么设备下载就算那个设备的数据&lt;/li&gt;
&lt;li&gt;通过 itunes 下载的算 iphone 的数据（Ocz）&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;数据来源：&lt;a href="http://www.quora.com/How-does-being-a-universal-app-affect-App-Store-rankings"&gt;How does being a universal app affect App Store rankings&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;iPhone/iPad 新版本改为 Universal，两者都算新品上线&lt;/h2&gt;
&lt;p&gt;原理同上，不再细说&lt;/p&gt;
&lt;h2&gt;iPhone/iPad 还是一劳永逸的 Universal&lt;/h2&gt;
&lt;p&gt;这是一个众说纷纭的话题，我的个人建议是，如果团队人较少且应用是免费发布，尽可能做成 Universal，减少不必要的维护成本和开发成本（虽然兼容平台会有一些牺牲）；如果是做付费且运营的人员可以支撑，可以最快最能抓住市场需求的点发布 iPhone 版本，通过市场反应去绝对是否开发 iPad 版本，等推广达到一个峰值（这个需要自己衡量）时，可以把 iPhone 或 iPad 的改成 Universal 版本，再次赚上一笔。&lt;/p&gt;
&lt;p&gt;当然也有从 Universal 版拆分为 iPhone 和 iPad 的策略，不过我个人对此营销手段感到反感。重要的事让用户失去了占便宜的特殊心理。&lt;/p&gt;
&lt;h3&gt;扩展阅读&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.cocoanetics.com/2011/05/to-universal-or-not/"&gt;To Universal or Not&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.iteleportmobile.com/the-case-for-universal-apps"&gt;The Case for Universal Apps&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</summary><category term="iOS"></category><category term="Xcode"></category><category term="Universal"></category></entry><entry><title>Dash 你值得拥有的文档管理工具</title><link href="http://icyleaf.com/2013/02/dash" rel="alternate"></link><updated>2013-02-06T09:46:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2013-02-06:2013/02/dash</id><summary type="html">&lt;p&gt;Dash 是 Mac OS 的一个文档管理工具，从它第一版发布用到现在，绝对是一个你值得拥有的文档管理工具，因为它还是免费的，你可以从 &lt;a href="https://itunes.apple.com/cn/app/dash-docs-snippets/id458034879?mt=12"&gt;Mac App Store&lt;/a&gt; 购买。但是全功能需要应用内付费，否则有些“小骚扰”。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;建议购买 Full Version，目前是半价，人民币 30 元&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="Dash" src="http://a1.mzstatic.com/us/r1000/106/Purple/v4/14/50/16/14501624-f6fd-4dae-a2bf-187a5a6417de/icon.175x175-75.png" /&gt;&lt;/p&gt;
&lt;h2&gt;特性&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;支持任何一个你想管理的文档（iOS/Mac/PHP/Python/Java/jQuery/Backbone.js 等等）&lt;/li&gt;
&lt;li&gt;支持自定义生成你想要的文档（AppleDoc/JavaDoc/RDoc/Doxygen/pydoctor/Sphinx/Scaladoc）&lt;/li&gt;
&lt;li&gt;自动升级文档版本&lt;/li&gt;
&lt;li&gt;快捷键搜索文档及 API&lt;/li&gt;
&lt;li&gt;管理和搜索 Code Snippets&lt;/li&gt;
&lt;li&gt;无缝插入众多第三方应用（Alfred，XCode，Terminal，Eclipse，甚至任意的 App）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Dash Feature" src="http://a116.phobos.apple.com/us/r1000/079/Purple/v4/ec/c8/d0/ecc8d047-84b0-9202-068b-91082f489f68/mzl.mztawrpk.800x500-75.jpg" /&gt;&lt;/p&gt;
&lt;h2&gt;功能介绍&lt;/h2&gt;
&lt;p&gt;这块已经有人介绍了，我就不多说了：&lt;a href="http://scriptfans.iteye.com/blog/1543219"&gt;Dash：程序员的的好帮手&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;生成自己的文档&lt;/h2&gt;
&lt;p&gt;Dash 本身只支持 docsets 格式的文档，也就是由 &lt;a href="http://gentlebytes.com/appledoc/"&gt;appledoc&lt;/a&gt; 生成的。默认是让 XCode 的 Organizer 管理文档，但是针对这个庞然大物，只是做文档的管理和快速搜索有消受不起。因此 Dash 才诞生出来的。&lt;/p&gt;
&lt;p&gt;其实本篇日志主要是讲这块的内容，从上面的特性上面我也说到 Dash 支持生成任何的文档，因为它支持的文档类型涵盖了目前绝大多数的文档格式，针对这块官方已经写了&lt;a href="http://kapeli.com/docsets"&gt;如何转换的说明&lt;/a&gt;，这里简单说明下：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;语言&lt;/th&gt;
&lt;th&gt;转换工具&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Objective-C 文档&lt;/td&gt;
&lt;td&gt;&lt;a href="http://gentlebytes.com/appledoc-docs-examples-basic/"&gt;appledoc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python, Sphinx, pydoctor&lt;/td&gt;
&lt;td&gt;&lt;a href="http://pypi.python.org/pypi/doc2dash/"&gt;doc2dash&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Javadoc&lt;/td&gt;
&lt;td&gt;&lt;a href="http://kapeli.com/JavaDocset.zip"&gt;java.docset&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RDoc&lt;/td&gt;
&lt;td&gt;使用 Dash 自身的 "Ruby Installed Gems"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scaladoc&lt;/td&gt;
&lt;td&gt;&lt;a href="https://bitbucket.org/inkytonik/mkscaladocset"&gt;mkscaldocset&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Doxygen(源码)&lt;/td&gt;
&lt;td&gt;修改参数生成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;docsetutil&lt;/td&gt;
&lt;td&gt;需要创建指定目录结构&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQLite&lt;/td&gt;
&lt;td&gt;官方支持数据库索引，需要创建指定目录结构&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;生成 Flask 文档&lt;/h3&gt;
&lt;p&gt;因为最近在学习 Flask，过年回家家里没有网络，因为我需要可以查询它的文档，虽然官方提供了 html 和 pdf 格式，但是没有办法快速搜索 API，没法发挥 Dash 的优势嘛，对吧！&lt;/p&gt;
&lt;p&gt;Flask 官方提供的 html 文档是 Sphinx 格式的，首先把&lt;a href="http://flask.pocoo.org/docs/flask-docs.zip"&gt;文档&lt;/a&gt;下载到本地，并安装好 doc2dash，另外备好一个 &lt;a href="https://bitbucket-assetroot.s3.amazonaws.com/c/photos/2011/Sep/30/flask-logo-2523728525-3_avatar.png"&gt;flask icon&lt;/a&gt;。&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;doc2dash&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;因为 Dash 可以让每个文档都有自己的 Icon，否则默认只是 docset 的 Icon，下载完毕之后，执行代码：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;doc2dash&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;icon&lt;/span&gt; &lt;span class="n"&gt;flask&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;logo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;png&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dash&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;flask&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;docs&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;其中 &lt;code&gt;--add-to-dash&lt;/code&gt; 是生成完毕后自动添加到 Dash，默认生成好的 docset 文件在当前目录。&lt;/p&gt;
&lt;p&gt;好了，Dash 已经可以索引到所有的 Flask API 了，真是太 TMD 的酷了！&lt;/p&gt;
&lt;h2&gt;维护你的文档&lt;/h2&gt;
&lt;p&gt;如果你希望把自己生成的文档分享出来，并提供后期的维护升级，你可以提供一个 feed 保持文档的自动更新，这里有&lt;a href="http://kapeli.com/feeds/NodeJS.xml"&gt;一个关于 NodeJS 的例子&lt;/a&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;你可以提供多个 url 多备份提供文档下载&lt;/li&gt;
&lt;li&gt;支持 tgz 格式的打包&lt;/li&gt;
&lt;/ul&gt;</summary><category term="Mac"></category><category term="Dash"></category><category term="Python"></category><category term="Flask"></category></entry><entry><title>介绍 virtualenvwrapper</title><link href="http://icyleaf.com/2013/01/intro-virtualenvwrapper" rel="alternate"></link><updated>2013-01-16T12:27:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2013-01-16:2013/01/intro-virtualenvwrapper</id><summary type="html">&lt;p&gt;上回说到 &lt;a href="http://icyleaf.com/2012/07/intro-virtualenv"&gt;virtualenv&lt;/a&gt; 的基本使用，这会为了提高工作效率，再次介绍针对于它增强的一个扩展 &lt;a href="http://www.doughellmann.com/projects/virtualenvwrapper/"&gt;virtualenvwrapper&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;安装配置&lt;/h2&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;virtualenvwrapper&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;安装好之后需要简单配置下，主要是设置独立环境的保存路径：  &lt;br /&gt;
    $ export WORKON_HOME=~/Envs
    $ mkdir -p $WORKON_HOME
    $ source /usr/local/bin/virtualenvwrapper.sh&lt;/p&gt;
&lt;p&gt;如果使用 oh-my-zsh 的可以开启对应的 virtualenvwrapper 插件， &lt;code&gt;WORKON_HOME&lt;/code&gt; 会设置在 &lt;code&gt;~/.virtualenvs/&lt;/code&gt; &lt;/p&gt;
&lt;h2&gt;常用命令&lt;/h2&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c"&gt;# 查看已创建的环境&lt;/span&gt;
$ &lt;span class="n"&gt;lsvirtualenv&lt;/span&gt;

&lt;span class="c"&gt;# 创建环境&lt;/span&gt;
$ &lt;span class="n"&gt;mkvirtualenv&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;env_name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
$ &lt;span class="n"&gt;mkvirtualenv&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="n"&gt;requirements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;env_name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;# 切换到某个环境&lt;/span&gt;
$ &lt;span class="n"&gt;workon&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;env_name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;# 设置当前环境的默认工作路径(下次执行 workon 命令会自动切换路径)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; $ &lt;span class="n"&gt;setvirtualenvproject&lt;/span&gt;

&lt;span class="c"&gt;# 查看当前环境已安装的 packages&lt;/span&gt;
$ &lt;span class="n"&gt;lssitepackages&lt;/span&gt;

&lt;span class="c"&gt;# 删除环境&lt;/span&gt;
$ &lt;span class="n"&gt;rmvirtualenv&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;env_name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;# 创建临时环境 (deactivate 之后自动销毁)&lt;/span&gt;
$ &lt;span class="n"&gt;mktmpenv&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;查看更详细的&lt;a href="http://virtualenvwrapper.readthedocs.org/en/latest/command_ref.html"&gt;命令描述文档&lt;/a&gt;。&lt;/p&gt;</summary><category term="Python"></category><category term="Virtualenv"></category></entry><entry><title>面粉的种类说明</title><link href="http://icyleaf.com/2013/01/types-of-flour" rel="alternate"></link><updated>2013-01-14T18:42:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2013-01-14:2013/01/types-of-flour</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;以下资源收集于网络。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;面粉为何物&lt;/h2&gt;
&lt;p&gt;小麦是世界上栽种最广的粮食。与其它谷物去壳后直接食用不同，小麦表面麸皮坚韧，内部胚乳易碎，难以加工成整粒，所以只能磨制成面粉。&lt;/p&gt;
&lt;p&gt;小麦面粉和其它粮食磨成粉的最大区别在于小麦特有的两种蛋白质能够结合形成弹性和延展性都很好的面筋（就是既能拉得很长，又不会断掉），因此只有小麦才能制作出花样繁多、口感各异的面食制品。&lt;/p&gt;
&lt;p&gt;面粉中面筋的含量和质量（就是两种蛋白质各自的含量）取决于小麦作物的品种和种植过程，而不是面粉加工过程，但是在加工储藏过程中，蛋白质含量有可能发生变化。 &lt;/p&gt;
&lt;h3&gt;基本概念&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;面筋&lt;/code&gt;：就是从面粉中提取出的（纯筋度）蛋白质部分，可以拌凉皮、做油面筋等中国特色美食。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;小麦淀粉&lt;/code&gt;：又叫澄粉，澄面，汀粉，汀面，就是面粉里除掉蛋白质之后剩下的（无筋度）淀粉部分，颜色非常白，是水晶糕点的主要原料，也是凉皮的原料。 &lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;面粉的分类&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;高筋面粉&lt;/code&gt;：又叫强力粉，bread flour，蛋白质含量11.5%以上，筋度最强，用于做面包、批萨、泡芙、油条、千层饼等需要依靠很强的弹性和延展性来包裹气泡、油层以便形成疏松结构的点心。 &lt;/li&gt;
&lt;li&gt;&lt;code&gt;中筋面粉&lt;/code&gt;：最普通的面粉，plain flour，蛋白质含量9.5-11.5%，用于做馒头、包子、饺子、烙饼、面条、麻花等大多数中式点心。 &lt;/li&gt;
&lt;li&gt;&lt;code&gt;低筋面粉&lt;/code&gt;：又叫薄力粉，cake flour，蛋白质含量6.5-9.5%，可以用按照质量比四份中筋面粉加一份玉米淀粉（其它淀粉也可以）混合配成，适合做蛋糕、饼干、蛋挞等松散、酥脆、没有韧性的点心。 &lt;/li&gt;
&lt;li&gt;&lt;code&gt;自发粉&lt;/code&gt;：超市里卖的自发粉是面粉中混入一定比例的酵母、泡打粉和其它化学添加剂，用时只需要加水，而且可以节约发酵时间。使用自发粉应该按照包装上的说明，因为不同的产品配方，使用方法可能有不同。 &lt;/li&gt;
&lt;li&gt;&lt;code&gt;全麦面粉&lt;/code&gt;：小麦种子由麸皮、胚乳、胚芽三部分组成，麸皮坚硬难以消化，胚芽含油丰富易酸败，因此面粉由胚乳制成。但是麸皮提供丰富的膳食纤维，非常有益于人的消化过程。所以，全麦面粉就是在胚乳制成的普通面粉中添加磨制过的麸皮，对于面包、蛋糕、面条等不同的用途，所添加的麸皮比例和麸皮大小、形状也各有不同，所以其实全麦面粉并不是整个的麦粒直接磨碎的粗制品，反而是更加复杂的精制品。 &lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;中国地区的说明&lt;/h2&gt;
&lt;p&gt;现在国内超市粮食区卖的面粉主要是适合中式面食的中筋面粉，而标注&lt;strong&gt;精粉&lt;/strong&gt;, &lt;strong&gt;特粉&lt;/strong&gt;, &lt;strong&gt;富强粉&lt;/strong&gt;的是表明面粉的加工精细程度，而不是面粉的筋度含量。一般可以用中筋面粉代替高筋面粉或者低筋面粉而不会有明显差别。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;饺子粉&lt;/code&gt; 是中筋面粉，&lt;code&gt;面包粉&lt;/code&gt; 是高筋面粉。&lt;/p&gt;
&lt;/blockquote&gt;</summary><category term="食材"></category></entry><entry><title>2011-2012 两年总结</title><link href="http://icyleaf.com/2013/01/2011-2012-in-review" rel="alternate"></link><updated>2013-01-01T00:34:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2013-01-01:2013/01/2011-2012-in-review</id><summary type="html">&lt;p&gt;从 2011 年忙碌到 2012 年，这两年的时间经历的很多事物，让我感受颇多，而我惊讶的是 2011 的年终总结居然缺失了。这两年工作上专注了一个领域，也是当前最火热移动互联网。两年放在一起总结也算是比较完整的。&lt;/p&gt;
&lt;p&gt;总结从已下几大方面分别详细描述：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;移动互联网&lt;/li&gt;
&lt;li&gt;技术&lt;/li&gt;
&lt;li&gt;户外&lt;/li&gt;
&lt;li&gt;书影音&lt;/li&gt;
&lt;li&gt;下厨&lt;/li&gt;
&lt;li&gt;品酒&lt;/li&gt;
&lt;li&gt;游戏&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;移动互联网&lt;/h2&gt;
&lt;p&gt;在 2010 年终总结也有说过，因为出身 Java，对于 Android 的兴趣以及入手 MBP，又禁不住和 iOS 做个比较，以至于今后踏上了移动互联网的风潮。正好公司和领导也希望组建这样一个团队。于是 @lnsoso 牵头，尽快组建了小团队开始了新的尝试。&lt;/p&gt;
&lt;h3&gt;团队&lt;/h3&gt;
&lt;p&gt;新的团队专注于移动互联网的手机平台：Android 和 iOS。应用主要是“房产”这个相对比较垂直的领域。虽然经历了两年的时间，我们还是保持轻小的团队，核心人员加起来也不到 6 个人，更像是一个创业团队。经历了两年的时间，做了一些产品，其中有欢乐，有痛苦，有争执，甚至更激烈的争吵。但是这些都不会阻碍我们的前进，不仅让我们之间在工作中更好的合作，生活上也成为了至好的朋友。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;能够和这么出色的移动团队一起工作，我感动非常的荣幸！借此感谢 @&lt;a href="http://weibo.com/206424200"&gt;lnsoso&lt;/a&gt;， @&lt;a href="http://weibo.com/54mifan"&gt;&lt;em&gt;米饭&lt;/em&gt;&lt;/a&gt;， @&lt;a href="http://weibo.com/stcui"&gt;SC崔圣&lt;/a&gt;， @&lt;a href="http://weibo.com/u/1611804343"&gt;瑞宇&lt;/a&gt;， 小胖， @&lt;a href="http://weibo.com/designl"&gt;Design_L&lt;/a&gt;， 英军，周奎，庆祥，刘伟和小雨。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;角色变化&lt;/h3&gt;
&lt;p&gt;小团队虽然灵活度很高，但每个人也要担着多项的角色，对于每个人来说都是一种挑战，同样对于我也是。从产品构思，原型设计，前端、后段的代码编写都需要一个人来全程承担，对于程序员来说，相对还算好，缺陷是容易站在局限的角度考虑事情；对于一个项目，不仅仅产品要优秀，更重要的还是要运营的好。对于这个角色我感到有压力。虽然这个行业大家都是在摸着石头过河，本身作为程序员来说，“运营”是一个艰巨的任务。&lt;/p&gt;
&lt;p&gt;最初作为程序员来说，总是觉得和产品，设计等非技术人员存在沟通障碍。尤其是上面想法传达下来的本质变化导致开发出来一个四不像的“怪物”，内心会有一种“产品应该这样才符合逻辑，这样，那样修改灵活的更高”的冲动。然后自己真正担当了“&lt;strong&gt;产品&lt;/strong&gt;”这个角色，需要涉及到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;扩大自己的思考范围&lt;/li&gt;
&lt;li&gt;如何和各阶人员沟通&lt;/li&gt;
&lt;li&gt;和所有参与人员很好沟通并还原真实想法继续碰撞火花&lt;/li&gt;
&lt;li&gt;更好的在技术上展现&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而“运营”这个角色，体现了如何把自己的产品扩散出去。程序员很难从自身的“小宇宙”释放出来。这也是为什么程序员的转型只有两个：架构师和产品经理。&lt;/p&gt;
&lt;p&gt;说实话我本身不是一个好运营，也当不了这个角色。接触这个角色能让我在产品和技术上继续更多的思考。&lt;/p&gt;
&lt;p&gt;不过“技术”才是我的最爱，其他的角色只是为了更好的让我架构于技术。&lt;/p&gt;
&lt;h3&gt;产品&lt;/h3&gt;
&lt;p&gt;房产类的应用其实非常的小众。买房，装修对于大多数人来说都是一次性消费。也很难会有冲动消费。唯一可以有苗头的就是租房业务。然后这个行业由于各种房产中介的介入导致行业的乌鸦瘴气，再加上用户的流动性非常的大，需求周期相对比较长。导致整个房产行业相对比较难做。因此团队初期没有任何创新的应用，大多于公司业务相关：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://3g.leju.com/1/2011/1103/1.html"&gt;口袋房产&lt;/a&gt; - 专注租房和二手房用户，里面整合了我们很多贴心而且很酷的功能。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://3g.leju.com/1/2011/1103/2.html"&gt;乐居计算器&lt;/a&gt; - 最给力的房产、家居计算器。汇率第一时间更新，还有贷款的还款提醒，妈妈再也不用担心我忘记还款了。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://3g.leju.com/1/2011/1206/6.html"&gt;帝都空气质量&lt;/a&gt; - 去年 PM2.5 很火的时候，花了一个星期做的小应用，上线第一天就冲到了天气分类前三名，而且当时我在外地出差，路上构思了很好的宣传语，结果第二天被“网监局”勒令下线了。原因在于应用不能以大公司的名义发布。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://3g.leju.com/1/2012/0614/8.html"&gt;口袋新房&lt;/a&gt; - 凭借我们强大的房产数据库，打造最新最热的新房资料及资讯。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;后续还有些公司的产品由其他部门策划和开发。导致策划的创新项目又无法开展。这点较为头疼。&lt;/p&gt;
&lt;p&gt;除此之外其实自己还有一个比较不太惹眼的项目：移动产品通用管理后台系统。由于产品的数据需要不断的交互，加上各种需求和统计需要，实现了很多很棒的功能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;各个产品的信息，用于版本更新和应用推荐&lt;/li&gt;
&lt;li&gt;用户评论的自动采集，Feedback 的反馈和答复&lt;/li&gt;
&lt;li&gt;产品的用户统计数据&lt;/li&gt;
&lt;li&gt;统计任意 iOS 产品的发布情况，策略分析和排名情况&lt;/li&gt;
&lt;li&gt;应用调用接口的权限系统和统计数据&lt;/li&gt;
&lt;li&gt;健全的日志系统&lt;/li&gt;
&lt;li&gt;加上 twitter boostrap 的出现，又很好的兼容了移动设备。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;根据产品的需求不断的改善优化一个产品的感觉真好。&lt;/p&gt;
&lt;h2&gt;技术&lt;/h2&gt;
&lt;h3&gt;PHP/Java/Obj-C&lt;/h3&gt;
&lt;p&gt;工作原因这三个语言哪个都不能丢，需实时关注和研究：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PHP: 继续保持关注 Kohana 这个框架。更好为服务器端开发，为前端服务。&lt;/li&gt;
&lt;li&gt;Java/Android: 从效率和内存管理上，更好的架构整个框架。&lt;/li&gt;
&lt;li&gt;Obj-C/iOS: 除了自身的知识学习，每次 iOS 升级都有新鲜感，ARC，Storyboard 等特性。推荐 CocoaPod 管理库类。迁移升级 &lt;a href="https://github.com/icyleaf/ShareKit"&gt;ShareKit&lt;/a&gt; 目前已经能够完美支持国内主流分享服务。生产自己的应用。&lt;/li&gt;
&lt;li&gt;Obj-C/Mac：破天荒的为了朋友写了第一个编码转换的 Mac App：&lt;a href="http://icyleaf.com/2012/10/easyconvert-gbk-to-utf8-convert-tool-for-mac"&gt;EasyConvert&lt;/a&gt;，而且还破天荒的收到一个 pull request，感动&lt;/li&gt;
&lt;li&gt;Javascript/jQuery：写过几个豆瓣扩展，全选邀请好友，批量喜欢友邻的喜欢的东西。唉，热心肠就是要多付出。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;除此之外还接触了 Python 和 Go。&lt;/p&gt;
&lt;p&gt;Python 作为脚本语言在命令行下可以完美处理零碎的工作，加上 &lt;a href="https://github.com/openparty/openparty"&gt;OpenParty&lt;/a&gt; 网站代码需要改进，而又学习了 Django 框架（好大好重- -！）。&lt;/p&gt;
&lt;p&gt;Go 了解不多，个人感觉更像是 C 的变异超集，性能和编写上有了很大的改进，也能很好的调试，甚至是为服务器端服务。但是受于 C 的理念和局限性， Go 也不能脱离一些缺陷的设计。&lt;/p&gt;
&lt;h2&gt;户外&lt;/h2&gt;
&lt;p&gt;从 09 年开始和几个朋友陆续做了几次外出。起初爬山仅仅是为了活动筋骨，减少职业病的发生，但后来却逐渐的爱上了这个爱好。工作突然繁忙中断了下来，但对于户外热爱不曾熄灭过。2011 年夏天重新走出户外。&lt;/p&gt;
&lt;h3&gt;爬山&lt;/h3&gt;
&lt;p&gt;2011：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2011-06-04 参加了活动 去看看初夏的关沟&lt;/li&gt;
&lt;li&gt;2011-06-12 参加了活动 《小北队》“箭扣长城-那无法抵挡的诱惑”&lt;/li&gt;
&lt;li&gt;2011-07-17 参加了活动 去十三陵走八陵一库&lt;/li&gt;
&lt;li&gt;2011-07-31 参加了活动 【逍遥游】7月31日 水泉沟-黄花城-香屯一日穿越&lt;/li&gt;
&lt;li&gt;2011-08-06 参加了活动 三岔村野长城&lt;/li&gt;
&lt;li&gt;2011-08-13 参加了活动 【逍遥游】8月13-14翡翠岛第二季优惠活动火爆召集中&lt;/li&gt;
&lt;li&gt;2011-09-03 参加了活动 【华北小黄山】云蒙天仙瀑 冷甸豪宅任我行&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2012：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2012-01-02 参加了活动 元旦崇礼雪乡穿越&lt;/li&gt;
&lt;li&gt;2012-03-03 参加了活动 北京最美乡村-香屯-大云峡谷穿越，感受山谷间纯净的美-徒步、观冰瀑，摄影，赏古长城，一日穿越活动！&lt;/li&gt;
&lt;li&gt;2012-03-17 尼泊尔文化之旅&lt;/li&gt;
&lt;li&gt;2012-07-07 参加了活动 7号8号海陀第二届帐篷节扎营 纯属自娱自乐 捡拾垃圾活动。&lt;/li&gt;
&lt;li&gt;2012-08-04 参加了活动 【三丰队】明长城、东指壶——平谷第一高峰连穿&lt;/li&gt;
&lt;li&gt;2012-08-11 组织了活动 【漫步人生，活在当下】东灵山重装穿越，露营&lt;/li&gt;
&lt;li&gt;2012-11-11 参加了活动 【漫步人生，活在当下】风雪箭扣 - 反穿线路，西栅子 - 将军把关 - 天梯 - 飞鹰倒挂&lt;/li&gt;
&lt;li&gt;2012-11-19 参加了活动 【四野户外】风雪大五台，周末五台连穿&lt;/li&gt;
&lt;li&gt;2012-12-08 组织了活动 【漫步人生，活在当下】经典线路：香八拉-新人拉练&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;户外照片：&lt;a href="http://www.517huwai.com/photos/11573"&gt;http://www.517huwai.com/photos/11573&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;骑行&lt;/h3&gt;
&lt;p&gt;怎么说呢，既然爬山了，怎么能少的了骑车呢，从小就爱骑车，每逢周末都要骑上车在小城里面四处的骑行。虽然没有怎么骑行远路。从心底还是比较热爱的。在 2012 年 05 月末结束了缠绕我两年多的纠结，入手了“美利达”山地车（淘宝购入，远远低于低于市场价。全新专卖店货色）&lt;/p&gt;
&lt;p&gt;然后总是频频刷街于长安街，还是没有太远的骑行，到现在最长的路线也就 100 多公里而已。骑行之后才真正发现，骑行原来比爬山过程更加艰辛。尤其是丘陵地带（有感于南京）。&lt;/p&gt;
&lt;p&gt;明年争取环青海湖 :)&lt;/p&gt;
&lt;p&gt;部分骑行路线：&lt;a href="http://www.douban.com/photos/album/34304181/"&gt;http://www.douban.com/photos/album/34304181/&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;旅行&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2011年十一期间的北疆之旅，历时 8 天，花费 8k 上下&lt;/li&gt;
&lt;li&gt;2012年三月的尼泊尔文化之旅，历史 7 天，花费 5k 上下&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;两次单身旅行，让我深深的感受到，其实出国游没有那么难，而且更舒服，钱还不一定比国内游贵。&lt;/p&gt;
&lt;h2&gt;书影音&lt;/h2&gt;
&lt;p&gt;数据来源于自己书影音的记录。&lt;/p&gt;
&lt;h3&gt;读书&lt;/h3&gt;
&lt;p&gt;看了下历年的统计，我 2010 年读过 82 本（有水分）。 11 年读过 20 本，12 年读过 14 本，这两年读的书明显下降了好多，旅游的书在多数，技术的书明显少了很多。而图书馆去的次数也非常少了。来年要继续努力，读书不能再减了！&lt;/p&gt;
&lt;p&gt;好评图书：窥视印度，不去会死，简单法则，冰与火之歌，黑客与画家，禅与摩托车的维修艺术。&lt;/p&gt;
&lt;h3&gt;电影&lt;/h3&gt;
&lt;p&gt;很遗憾，IMDB Top250，居然历时三年还是没有看完，目前已经看到了第 194 名（不是最新的排名数据）。看了那么多不同类型的电影，终于从脑容量的电影成功转型，认识了一些影人，导演。相比较最近几年的电影，我很庆幸也很遗憾有那么多老电影没看过。&lt;/p&gt;
&lt;p&gt;好评电影：IMDB Top250 所以电影 XD&lt;/p&gt;
&lt;h3&gt;音乐&lt;/h3&gt;
&lt;p&gt;尝试听古典音乐，而且还听了耶鲁大学的公开课《Listen to music》，让我喜欢上了德彪西的《月光》和柴可夫斯基第一&amp;amp;第一钢琴协奏曲。钢琴和小提琴的配合是那么的颤动心灵。&lt;/p&gt;
&lt;p&gt;其实自己听的音乐比较杂，和电影类似，除了重金属，等比较极度喧嚣的音乐外，能接受度比较高。&lt;/p&gt;
&lt;h2&gt;下厨&lt;/h2&gt;
&lt;p&gt;总觉得出了开封，我们家的小吃在任何地方要么吃不着，要么没有熟悉的味道。加上新搬的家附近没有一家良心餐馆，结果把自己的身体吃垮了。时隔 3 年依赖重新下厨开灶。本身擅长开封小吃类面点：羊肉炕馍，大肉火烧，锅贴，千层饼，鸡蛋饼，炒凉粉各种折腾。反正吃的自己不亦乐乎。&lt;/p&gt;
&lt;p&gt;就在写这篇总结之前，花了一个小时给自己做了几张鸡蛋饼，一碗紫菜虾皮汤。&lt;/p&gt;
&lt;p&gt;做饭本着一个原则：不能亏待自己的肚子，嗯！&lt;/p&gt;
&lt;h2&gt;品酒&lt;/h2&gt;
&lt;p&gt;在 2011 年体检查出来轻微脂肪肝，而原因有三，我可能涉及到两种：酒精性脂肪肝，肥胖性脂肪肝。为了健康，戒了大半年酒（也在于追求对象要求）。最终于 11 年光棍节之后还是单身开了酒戒。转念的体检发现脂肪肝木有了。由于同年也开始了户外，所以最终也没有判断出原因 &amp;gt;.&amp;lt;&lt;/p&gt;
&lt;p&gt;啤酒：经 Tin 大师的推荐，喜欢上了比利时啤酒，尤其是智美和都威，前者是修道院啤酒，口感醇厚可嘉，分蓝/红/白帽，红、蓝智美都会随温度不同而明显呈现味道上的变化，至于白帽国内没见到有卖的；而后者劲儿相对比较大，入口略苦，入喉之后出现甘甜，是一种前期痛苦立马又享受想和下一口的冲动。&lt;/p&gt;
&lt;p&gt;白酒：伏特加，托 &lt;a href="http://www.douban.com/people/CNBorn/"&gt;CNBorn&lt;/a&gt; 的福，尝试了纯伏特加的感觉，类似于都威前期，酒性很烈，入喉之后犹如一泉山水滋润着喉咙。这次试喝的是 Absolut Vodka。我不知道是否是否和喝的品牌有差异。&lt;/p&gt;
&lt;p&gt;红酒：北京桂花陈酒，经济实惠的最佳选择。入口初体验入桂花糖水一般甜蜜，又夹杂着一些酒心糖的特殊酒味。后劲较大，一不小心很容易醉。&lt;/p&gt;
&lt;h2&gt;游戏&lt;/h2&gt;
&lt;p&gt;从小就爱玩游戏，打电动，从最初的掌声游戏机（俄罗斯方块），GBC，GBA SP，PSP 到主机类游戏红白机，街机，世嘉，土星，PS，PS2，电脑游戏，网游。都一概不拉的接触过。但自从开始工作之后接触的游戏基本上降到了最低。&lt;/p&gt;
&lt;p&gt;一个机缘巧合，听说烈火战车（Twisted Metal）将于 2012 年情人节发行 PS3 版本。为了这个重温这个游戏，我居然入手了一台 PS3，因此购入了一些比较耐玩的游戏：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;烈火战车&lt;/li&gt;
&lt;li&gt;刺客信条：兄弟会、启示录&lt;/li&gt;
&lt;li&gt;镜之边缘&lt;/li&gt;
&lt;li&gt;暴雨&lt;/li&gt;
&lt;li&gt;神秘海域3&lt;/li&gt;
&lt;li&gt;蝙蝠侠：阿卡姆疯人院&lt;/li&gt;
&lt;li&gt;战地3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;游戏对于来说属于业余消遣，没事时候的解闷工具。沉迷？已经不太可能了。&lt;/p&gt;
&lt;h2&gt;单纯&lt;/h2&gt;
&lt;p&gt;原来出了程序员这个圈子，其他地方是那么的妖魔化，我喜欢纯粹的程序员生活。希望自己可以保持这份单纯，同时多一份戒心，防止不轨分子的侵袭。&lt;/p&gt;
&lt;h2&gt;两年结语&lt;/h2&gt;
&lt;p&gt;很长时间没有写东西了，这一写有些控制不了自己的思想，最近两年思考的东西太多了，同时又少了倾诉。做的事情也逐渐多了，有时候觉得总会被世俗的东西侵袭，一些理想化，纯粹的东西开始动摇。有时候变得很难把握。感觉曾经的很多东西都在一件件的被磨灭或改变。&lt;/p&gt;
&lt;h2&gt;2013？&lt;/h2&gt;
&lt;p&gt;说好的世界末日没有到来，日子还有继续生活下去。该奋斗的东西也不能丢，相信自己的信念，勇往直前吧！少年!&lt;/p&gt;</summary><category term="年终总结"></category></entry><entry><title>打绳结</title><link href="http://icyleaf.com/2012/11/how-to-bends-and-hitches" rel="alternate"></link><updated>2012-11-30T13:49:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2012-11-30:2012/11/how-to-bends-and-hitches</id><summary type="html">&lt;p&gt;收集磨房微博上面
&lt;a href="http://huati.weibo.com/k/%E4%B8%BB%E9%A1%B5%E5%90%9B%E6%95%99%E4%BD%A0%E6%89%93%E7%BB%B3%E7%BB%93?from=510&amp;amp;order=time"&gt;#主页君教你打绳结#&lt;/a&gt;
步骤：&lt;/p&gt;
&lt;h1&gt;Alpine Butterfly Bend（阿尔卑斯蝴蝶结）&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;这个绳结强度大可靠性高，登山的时候很实用，平时绑鞋带什么的就别这样弄了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="Alpine Butterfly
Bend" src="http://ww2.sinaimg.cn/bmiddle/6c76e8c5jw1dyvsxbmdbjg.gif" /&gt;&lt;/p&gt;
&lt;h1&gt;lineman's loop (中间结或工程蝴蝶结)&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;这种结经常用在登山时绑在中间的人身上；此时只要作个大绳圈套在中间人的身上即可。只要两头的人不想松开，中间的人就跑不掉啦.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="lineman's
loop" src="http://ww2.sinaimg.cn/bmiddle/6c76e8c5jw1dz1crmzgl5g.gif" /&gt;&lt;/p&gt;
&lt;h1&gt;blake's hitch (抓结或移动结)&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;用于行进，上升过程中的保护，此结不受力时可滑动，受力时在主绳上卡住不动。晚归不想在门外过夜，被迫从楼顶爬回自家阳台的汉子必备&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="blake's
hitch" src="http://ww4.sinaimg.cn/bmiddle/6c76e8c5jw1dz2oxc2g6ag.gif" /&gt;&lt;/p&gt;
&lt;h1&gt;双渔人结&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;它是连接两根绳子的常用结法，这个结比较容易打，但是很难拆开，大家练习的时候注意不要打的太紧了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="双渔人结" src="http://ww2.sinaimg.cn/bmiddle/6c76e8c5jw1dz3mi2ddkzg.gif" /&gt;&lt;/p&gt;
&lt;h1&gt;双绳八字结&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;今儿个教大家的是另外一种实用的连接两根绳子的结法。大家打的时候要把两端的绳子留长一点，才不容易滑脱~~这种结法的优势在于：即使拉力很大，用过之后绳结都能够轻松解开。试过解不开绳子的同学就知道这个结的好了~~（实际使用时不要用两根大小型号差异太大的绳子）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="双绳八字结" src="http://ww4.sinaimg.cn/bmiddle/6c76e8c5jw1dz52enzvd7g.gif" /&gt;&lt;/p&gt;
&lt;h1&gt;bowline bend (单套结)&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;绳结中间留出来的那个圈可用于绳与绳、绳与环之间的临时连接，常用于户外宿营或者是户外运动中进行固定的临时安全带。非要用听起来那么高级的结来绑鞋带的人你就绑吧&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="bowline
bend" src="http://ww1.sinaimg.cn/bmiddle/6c76e8c5gw1dz68igt76pg.gif" /&gt;&lt;/p&gt;</summary><category term="安全意识"></category></entry><entry><title>修复 OS X 打开方式的重复项</title><link href="http://icyleaf.com/2012/11/fix-duplicate-open-ways-in-osx" rel="alternate"></link><updated>2012-11-06T17:18:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2012-11-06:2012/11/fix-duplicate-open-ways-in-osx</id><summary type="html">&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Library&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Frameworks&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;CoreServices&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Versions&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Frameworks&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;LaunchServices&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Versions&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Support&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lsregister&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;kill&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt; &lt;span class="n"&gt;local&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt; &lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;domainuser&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</summary><category term="Mac"></category><category term="Shell"></category></entry><entry><title>EasyConvert: Mac GBK 转 UTF8 小工具</title><link href="http://icyleaf.com/2012/10/easyconvert-gbk-to-utf8-convert-tool-for-mac" rel="alternate"></link><updated>2012-10-25T19:02:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2012-10-25:2012/10/easyconvert-gbk-to-utf8-convert-tool-for-mac</id><summary type="html">&lt;p&gt;托设计朋友的要求，继续奉献出一个小工具: EasyConvert - 针对于文本文件的编码转换工具 - GBK to UTF8&lt;/p&gt;
&lt;p&gt;首先这个应用是用于 OS X 系统的，其次其实它是一个很弱的工具，对于技术宅来说一行代码搞定：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;iconv&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;GBK&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;UTF&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;8 &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt; &lt;span class="o"&gt;\&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;但对于非技术的人来说，跟他们说 terminal 就费了牛鼻子劲了，索性上工具。&lt;/p&gt;
&lt;p&gt;代码是开放的：&lt;a href="https://github.com/icyleaf/EasyConvert"&gt;https://github.com/icyleaf/EasyConvert&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;应用下载：&lt;a href="https://github.com/downloads/icyleaf/EasyConvert/EasyConvert_v0.1.3.zip"&gt;EasyConvert_v0.1.3.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;使用方法很简单，把要转换的 gbk 文件拖到应用窗口里面，应用会自动保存到同目录下。&lt;/p&gt;
&lt;p&gt;BTW，应用 Icon 及涉及的图片资源均来自网络，&lt;a href="https://github.com/icyleaf/EasyConvert/blob/master/EasyConvert/Readme"&gt;声明在此&lt;/a&gt;。&lt;/p&gt;</summary><category term="Mac"></category><category term="App"></category></entry><entry><title>在 iOS 应用调用 App Store 显示指定应用的详情</title><link href="http://icyleaf.com/2012/10/how-to-preview-app-detail-buit-in-app-using-app-store-data" rel="alternate"></link><updated>2012-10-25T18:42:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2012-10-25:2012/10/how-to-preview-app-detail-buit-in-app-using-app-store-data</id><summary type="html">&lt;p&gt;可能很多手机应用都使用了“应用推荐”的功能，实现方式各式各样，对于 iOS 来说最致命的缺点就是，如果用户喜欢给推荐的应用，当用户点击该应用的时候，系统会硬生生的从当前应用内退出并打开 App Store 查看应用的详情。如果站在用户体验的角度来看，这其实是一个非常差劲的体验。那么能不能有一种方式可以在应用内部打开呢？&lt;/p&gt;
&lt;p&gt;答案是肯定可以！！ iOS 6 其实包括了很多很好的特性，比如 Soical framework，丰富了分享面板，包括我最近刚刚更新的 ShareKit 也对新浪微博支持了这个特性(&lt;a href="https://github.com/icyleaf/ShareKit/issues/4"&gt;ShareKit#4&lt;/a&gt;)。还有针对于 O2O 具有杀手锏作用的 Pass Kit framework 等等等等......&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;喂喂喂，你说了半天没有讲到正题啊？！！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;咳~咳~书归正题，如果你没做应用内付费，可能你就忽略了 iOS 6 对 In-App Purchase 的说明：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;Store&lt;/span&gt; &lt;span class="n"&gt;Kit&lt;/span&gt; &lt;span class="n"&gt;framework&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;StoreKit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="n"&gt;supports&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;purchasing&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;iTunes&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="n"&gt;inside&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="n"&gt;provides&lt;/span&gt; &lt;span class="n"&gt;support&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;having&lt;/span&gt; &lt;span class="n"&gt;downloadable&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="n"&gt;hosted&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;Apple&lt;/span&gt; &lt;span class="n"&gt;servers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;With&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="n"&gt;purchases&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;present&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt; &lt;span class="n"&gt;controller&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt; &lt;span class="n"&gt;lets&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="n"&gt;purchase&lt;/span&gt; &lt;span class="n"&gt;apps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;music&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;books&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt; &lt;span class="n"&gt;iTunes&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="n"&gt;directly&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;within&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;You&lt;/span&gt; &lt;span class="n"&gt;identify&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;want&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;make&lt;/span&gt; &lt;span class="n"&gt;available&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;purchase&lt;/span&gt; &lt;span class="n"&gt;but&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;rest&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;transaction&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;handled&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;Store&lt;/span&gt; &lt;span class="n"&gt;Kit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;也就是说 StoreKit framework 支持了在应用下载其他应用的特性！！！兴奋吧，官方很慷慨的支持了这个功能！！如果查看手册，其实咱们用到的只有 SKStoreProductViewController 这个类和所述的 delegate 就够了。&lt;/p&gt;
&lt;p&gt;代码如下：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;SKStoreProductViewController&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;controller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;SKStoreProductViewController&lt;/span&gt; &lt;span class="n"&gt;alloc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delegate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;NSDictionary&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NSDictionary&lt;/span&gt; &lt;span class="nl"&gt;dictionaryWithObject:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;397735649&amp;quot;&lt;/span&gt; &lt;span class="c1"&gt;// App id&lt;/span&gt;
                                                   &lt;span class="nl"&gt;forKey:&lt;/span&gt;&lt;span class="n"&gt;SKStoreProductParameterITunesItemIdentifier&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;controller&lt;/span&gt; &lt;span class="nl"&gt;loadProductWithParameters:&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;
                      &lt;span class="nl"&gt;completionBlock:&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;BOOL&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;NSError&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                          &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                              &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt; &lt;span class="nl"&gt;presentViewController:&lt;/span&gt;&lt;span class="n"&gt;controller&lt;/span&gt;
                                                 &lt;span class="nl"&gt;animated:&lt;/span&gt;&lt;span class="n"&gt;YES&lt;/span&gt;
                                               &lt;span class="nl"&gt;completion:&lt;/span&gt;&lt;span class="nb"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
                      &lt;span class="p"&gt;}];&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</summary><category term="iOS"></category></entry><entry><title>如何针对 iOS 设备进行网络抓包分析</title><link href="http://icyleaf.com/2012/10/remote-network-packet-capture-for-ios-devices" rel="alternate"></link><updated>2012-10-15T17:47:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2012-10-15:2012/10/remote-network-packet-capture-for-ios-devices</id><summary type="html">&lt;p&gt;Charles 目前是 OS X 上面最好的抓包分析软件，相比 WireShark 功能更加强大，并支持代理功能。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://www.ravelrumba.com/blog/ipad-http-debugging/"&gt;iPad HTTP Debugging with Charles&lt;/a&gt; - 教大家如何使用它进行代理抓包&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.skinkers.com/2012/06/12/testing-tethering-data-driven-mobile-apps-with-charles-and-osx-ipad-iphone-http-debugging/"&gt;Testing / Tethering Data Driven Mobile Apps with Charles and OSX&lt;/a&gt; - 教大家如何进行 request remap，适合不改动代码的情况下修改域名切换环境&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;不过 Charles 的确定就是共享软件，未注册版本可以使用全功能但是限制是只能允许使用 30 分钟，那么...习惯用 Terminal 的还有一个方法：&lt;a href="http://useyourloaf.com/blog/2012/02/07/remote-packet-capture-for-ios-devices.html"&gt;Remote Packet Capture for iOS Devices&lt;/a&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;rvictl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;UDID&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
$ &lt;span class="n"&gt;rvictl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;
$ &lt;span class="n"&gt;tcpdump&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;i&lt;/span&gt; &lt;span class="n"&gt;rvi0&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="n"&gt;tcp&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</summary><category term="Mac"></category><category term="iOS"></category><category term="Shell"></category></entry><entry><title>沙漠穿越要点</title><link href="http://icyleaf.com/2012/09/across-the-desert-tips" rel="alternate"></link><updated>2012-09-25T10:37:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2012-09-25:2012/09/across-the-desert-tips</id><summary type="html">&lt;p&gt;以库布齐沙漠为例：&lt;/p&gt;
&lt;h2&gt;温差&lt;/h2&gt;
&lt;p&gt;1. 五一期间，白天 35 度左右，晚上 10 度左右。&lt;/p&gt;
&lt;p&gt;2. 十一期间，白天 27度左右，晚上 -5 度左右。&lt;/p&gt;
&lt;h2&gt;装备&lt;/h2&gt;
&lt;p&gt;把你所需要的东西列出一个单子，只带必需品，可有可无的东西建议不要带，比如：钥匙、钱包、牙具、化妆品、大的刀具、金属水壶、手机备用电池、充电器、望远镜、笨重的照相器材等等。把这些东西所占的重量用水来代替，我想你的负重也不会有多少。&lt;/p&gt;
&lt;p&gt;1. 背包：&lt;strong&gt;重装&lt;/strong&gt;男士 60L+，女士 50L+ ；&lt;strong&gt;轻装&lt;/strong&gt;男士 40L+，女士
25L+&lt;/p&gt;
&lt;p&gt;2. 服装：干衣裤、冲锋衣裤或雨披（必备其一），晚上温差大的话需要再备抓绒&lt;/p&gt;
&lt;p&gt;3. 睡袋：舒适温标必须在 0 到 -5 度之间&lt;/p&gt;
&lt;p&gt;4. 帐篷：双层帐，最好是铝杆（防风好重量也轻）　
　
​5. 鞋袜：高帮防水登山鞋，徒步鞋（鞋面必须是全皮或表面无网眼面料，防止漏沙）、袜子不少于2双&lt;/p&gt;
&lt;p&gt;6. 手仗：2根必备(节省体力，且保护膝盖。强驴忽略)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;沙套：可防止沙子进入鞋里（雪套亦可）　&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;防晒：帽子（带沿帽为佳。或者头巾）、太阳镜、润唇膏、防晒霜&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;头灯：夜间备用。保证电池备足　&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;水具：建议用水袋，水壶、水瓶也可（人/天日均消耗水约 4L - 6L）&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;11. 炊具：建议 2 - 4 人一套，各带自己的餐具，汽罐每人至少准备一罐&lt;/p&gt;
&lt;p&gt;12. 急救：日常医疗包，创可贴，防中暑药品，闹肚子药等&lt;/p&gt;
&lt;p&gt;13. 摄影：防水套。&lt;/p&gt;
&lt;p&gt;14. 环保：垃圾袋（把不可讲解垃圾回收）&lt;/p&gt;
&lt;p&gt;15. 其他：GPS（防止迷失）、手台（沟通及呼救）&lt;/p&gt;
&lt;h2&gt;食物&lt;/h2&gt;
&lt;p&gt;大家可以多带一些高热量、高营养的食品，尽可能不带垃圾食品。水每人每天准备5-6升水，可以带一些功能性营养性饮料，食品尽量选择高能量的简单易消化并不易变质的干粮类食品，尽量少用耗水量大的食品，金属或玻璃盛装的食品勿带。喜欢喝酒的个别队员也不要带酒，因为酒精会大量消耗水分，等穿越成功回到市内可以尽情腐败。在沙漠里，因为个体的差异每个人所需要的水分也不同，建议在出发前几天就要大量饮水，让身体尽量储存水分，在沙漠负重行走时要采用少量多次的饮水方法补充水分，避免不科学的饮水方法；大家都知道：徒步负重穿越沙漠会耗费大量的体力能量，所以，要求所有队员不管在扎营吃饭或是路餐时都要及时补充食物、补充营养，不要因为累了想多休息一会不想动而不补充能量，那样的话后果会很严重，造成体力严重透支，出现安全隐患，因为以前出现过类似的事情，所以，此次特别强调！如果有队员出现心慌、体力不支等情况要及时报告领队；&lt;/p&gt;
&lt;h2&gt;穿越要点&lt;/h2&gt;
&lt;h3&gt;如何行走&lt;/h3&gt;
&lt;p&gt;控制行军速度和定时休息是顺利到达目的地的关键，沙漠穿越行走 40 分钟休息
3-5 分钟为宜，要严格控制休息时间和行走时间，时速掌握在 2.5-3 公里/小时。&lt;/p&gt;
&lt;p&gt;在平缓的地方行走最好不要跟着前面的脚印走，最好在偏离十几公分的没有经过踩踏的地方走。而在上坡时行走最好选择前面人的脚印走，跟走在台阶上差不多，利用手杖的支撑，会很轻松的翻越沙丘。&lt;/p&gt;
&lt;p&gt;背包负重行走时经常要翻越沙丘，为了给双腿减轻承重，用带大雪栏的双杖辅助行走会起到事半功倍的效果，尤其是上坡，会为双腿分担至少四分之一的承载力，使身体延迟疲劳，也提高了行进速度。　　&lt;/p&gt;
&lt;h3&gt;如何饮水&lt;/h3&gt;
&lt;p&gt;在野外环境，每个人的耐渴程度不一样，在你出发前两天就开始大量饮水，让身体储存足够的水份。进入沙漠后，背包行走，尤其接近中午前后，身体会大量出汗，这个时候你就要特别注意，一定要定时饮水，每次饮水不要超过
100ml，20-30 分钟饮水一次。一般早晨行走 1
个小时侯后开始饮水，中午路餐用水控制在
400-500ml，在行走时要定时定量饮水，这是考验一个人适应环境和自控的能力，若没有这种自控能力，说明你不适合进入沙漠。　　&lt;/p&gt;
&lt;h3&gt;饮食时间&lt;/h3&gt;
&lt;p&gt;负重徒步穿越沙漠，会耗费很多的能量，建议上午 9-10 点，下午 3-4
点边走边拿出少量高热量路餐食用来补充身体能量，并不是等饿的受不了的时候再补充。　&lt;/p&gt;
&lt;h2&gt;摄影者须知&lt;/h2&gt;
&lt;p&gt;沙漠里的细沙会在你不经意的时候沾满你的全身，所以在拍摄时应谨慎的拿出相机，并拍掉手上的沙子，避免相机跟沙子接触。若不小心沾上沙子可用嘴猛力吹掉沙子。有风的情况下尽量不要使用相机，并用密封性好的袋子或者相机套包住相机。　&lt;/p&gt;
&lt;h2&gt;扎营者须知&lt;/h2&gt;
&lt;p&gt;1. 扎营：帐篷迎风面最小的一角冲向来风，打地钉时先把浮沙扒掉，露出硬度大的潮湿沙子，地钉以大于45度角度斜插在湿沙子里面，一般能防止
7-8
级的大风。把除了帐篷门的其他三个部分用沙子挡起来，也能抵抗强风和保暖。&lt;/p&gt;
&lt;p&gt;2. 拔营：睡袋不要叠，抓起睡袋的一个角直接往压缩袋里使劲积压，十几秒就能收好一个睡袋。收帐篷时内外帐不要叠好，可随意的塞到背包里的睡袋上面并压紧。这样下来，拔营速度可大大的提高。　&lt;/p&gt;
&lt;h2&gt;资料来源&lt;/h2&gt;
&lt;p&gt;以上资料从各大户外论坛收集并重新整理归类。&lt;/p&gt;</summary><category term="沙漠"></category></entry><entry><title>户外简易版煲仔饭</title><link href="http://icyleaf.com/2012/09/claypot-rice-on-the-outdoor" rel="alternate"></link><updated>2012-09-05T12:10:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2012-09-05:2012/09/claypot-rice-on-the-outdoor</id><summary type="html">&lt;p&gt;几周前和同事及其朋友几位组织灵山重装扎营，结果当天下雨加上另辟蹊径的路被封，只好改重装徒步...虽然遗憾但是吃到了好吃的煲仔饭，掌勺的是来自广东的黑仔。记录制作步骤如下：&lt;/p&gt;
&lt;p&gt;1. 生米和水的比例是 1:1.5&lt;/p&gt;
&lt;p&gt;2.上火（不是电饭煲）开煮米饭至粘米的时候（水分已经被米粒吸收），加入切好的腊肠和腊肉，小火继续蒸（闷）&lt;/p&gt;
&lt;p&gt;3.几分钟后腊味飘逸出来后，加入少量的酱油（最好不用可以代替的老抽或生抽，颜色和味道都太重），搅拌似的酱油包含每个米粒。&lt;/p&gt;
&lt;p&gt;4.继续闷一会直到米饭完全吸收水分成饱和状出锅（如果喜欢吃锅巴的可以适当多闷一会）&lt;/p&gt;</summary><category term="美食"></category></entry><entry><title>升级 OS X 10.8 和 Python 第三方库那点事</title><link href="http://icyleaf.com/2012/08/upgrade-osx-10-8-with-python-library" rel="alternate"></link><updated>2012-08-24T14:56:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2012-08-24:2012/08/upgrade-osx-10-8-with-python-library</id><summary type="html">&lt;p&gt;今天把公司的机器升级到了 10.8 本来就觉得 OS X
的平滑升级做的非常的好，除了一些被乔帮主鄙视的 JDK
需要重新安装外，其他的一切都很平滑的迁移过来。中午的时候想用 django
练手做个晓项目，熟练的在终端创建新项目，结果爆出如下错误：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;pkg_resources.DistributionNotFound: distribute==0.6.27&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;顺是看了下 &lt;code&gt;/Library/Python/2.7/site-packages&lt;/code&gt;
竟然发现里面没有任何的库，心里想估计是升级的适合系统清理掉了，那只能重新安装下了，于是又输入：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;django&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;再次报错：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;pkg_resources.DistributionNotFound: pip==1.1&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;外头想想也对，python 的库都被清掉了，那只能使用 easy_install 了啊（犯2啊！）&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;easy_install&lt;/span&gt; &lt;span class="n"&gt;pip&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;继续报错 = =!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;pkg_resources.DistributionNotFound: distribute==0.6.27&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ocz，肿么又报错了...迅速脑中确认几件事情：&lt;/p&gt;
&lt;p&gt;1. Python 是否是调用的系统默认的 - √&lt;/p&gt;
&lt;p&gt;2. 确认 easy_install 是否存在 - √ （不仅存在，连没有了的 pip 和
virtualenv 还存在软链接）&lt;/p&gt;
&lt;p&gt;3. distribute 是啥 - ˚∆˚ （Python 新手成长中）&lt;/p&gt;
&lt;p&gt;于是网上查询发现也有不少遇到升级 10.8 发现 pip
不见了，但是他们提供的解决方案是：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;easy_install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;U&lt;/span&gt; &lt;span class="n"&gt;pip&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;但是在我本地执行还是报 &lt;code&gt;distribute&lt;/code&gt;
不存在，看了需要重新安装它了吧，既然不能通过包管理软件执行，那只有官方下载源码安装了：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;curl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;O&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;distribute&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;     $ &lt;span class="n"&gt;distribute_setup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt;
$ &lt;span class="n"&gt;distribute_setup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;安装成功之后就有可以从本篇开头的操作继续重装下去了 T_T&lt;/p&gt;
&lt;p&gt;补习知识：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;distribute 0.6.28&lt;/p&gt;
&lt;p&gt;Easily download, build, install, upgrade, and uninstall Python
packages&lt;/p&gt;
&lt;/blockquote&gt;</summary><category term="python"></category><category term="osx"></category></entry><entry><title>如何保持在 Git Submodule 代码的开放和私有共存</title><link href="http://icyleaf.com/2012/08/how-to-keep-public-and-private-versions-of-a-git-submodule-repo-in-sync" rel="alternate"></link><updated>2012-08-03T17:37:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2012-08-03:2012/08/how-to-keep-public-and-private-versions-of-a-git-submodule-repo-in-sync</id><summary type="html">&lt;p&gt;假设我在 github 有一个开源的版本库 x 供大家使用，该库里面又包含了好些个 submodules，其中有一个 submodule 名为 a 是自己在 github 又创建的:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;submodule&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;icyleaf&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;现在问题是，由于代码需要更新，同时涉及到了 a 这个 submodule，但是它的添加 url 是 read-only，由于 x 这个库是供大家使用，因此 a 又不能设为 private：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;clone&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;icyleaf&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;目前想到的方法是在 x 库以外 clone 下来 a，进行私有的写入和 push 到 github 上面，然后在 x 库的 a 里 git pull 下来获得最新的代码。&lt;/p&gt;
&lt;p&gt;如何解决这样的问题，能够当大家全部 clone 下来，而自己开发也能避免麻烦？在一篇文章上面找到了灵感，折腾了一番搞定了 !&lt;/p&gt;
&lt;p&gt;该文章有一节讲到，开发者如果经常需要更新 submodule ，即可更换 submodule 的 remote url：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="n"&gt;commonlib&lt;/span&gt;

$ &lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;remote&lt;/span&gt; &lt;span class="n"&gt;rm&lt;/span&gt; &lt;span class="n"&gt;origin&lt;/span&gt;

$ &lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;remote&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;origin&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;ssh://mark@git.mysociety.org/data/git/public/commonlib.git&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;remote&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;

&lt;span class="n"&gt;origin&lt;/span&gt; &lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;mark&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mysociety&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;public&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;commonlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;However, you’ll find that two helpful config options will have been
deleted when removing and adding back origin, so you’ll want to add
these back.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="n"&gt;branch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt; &lt;span class="n"&gt;origin&lt;/span&gt;

$ &lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="n"&gt;branch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;merge&lt;/span&gt; &lt;span class="n"&gt;refs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;heads&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;首先我也先对 a 进行 git remote -v，结果显示：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;origin&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;icyleaf&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;origin&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;icyleaf&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;发现和文章里面的显示的结果不一样，于是我就在想能不能在 remote
上面做些手脚，首先看下 git remote 的 help，发现有一条是可以单独设置 remote
push 的 url ，也就是更换上面 git remote -v 中 push 的 url，尝试：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;remote&lt;/span&gt; &lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt; &lt;span class="n"&gt;origin&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;icyleaf&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;再次执行 remote -v:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;origin&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;icyleaf&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;origin&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;icyleaf&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;执行成功！然后随意 commit 并 push orgin master，成功！&lt;/p&gt;
&lt;p&gt;搞定！&lt;/p&gt;</summary><category term="git"></category></entry><entry><title>利用 argparse 写的脚本命令：测试 URL 响应时间</title><link href="http://icyleaf.com/2012/08/url-request-time-test-using-python-with-argparse" rel="alternate"></link><updated>2012-08-02T15:17:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2012-08-02:2012/08/url-request-time-test-using-python-with-argparse</id><summary type="html">&lt;p&gt;前几天看完《&lt;a href="http://woodpecker.org.cn/abyteofpython_cn/chinese/"&gt;Python简明教程&lt;/a&gt;》，预想练手，想起同事的一个 ruby 代码，尝试改写成 python，顺便看看两个语言的简练程度。下面是原始的 ruby 代码：&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;#!/usr/bin/env ruby&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;rubygems&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;net/http&amp;#39;&lt;/span&gt;

&lt;span class="n"&gt;urls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;http://icyleaf.com&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;times&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;urls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="n"&gt;start_at&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;
    &lt;span class="no"&gt;Net&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="no"&gt;URI&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;end_at&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;
    &lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;end_at&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start_at&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
      &lt;span class="n"&gt;color_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;
    &lt;span class="k"&gt;elsif&lt;/span&gt; &lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
      &lt;span class="n"&gt;color_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
      &lt;span class="n"&gt;color_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;33&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt; time: &lt;/span&gt;&lt;span class="se"&gt;\033&lt;/span&gt;&lt;span class="s2"&gt;[&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;color_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;m&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\033&lt;/span&gt;&lt;span class="s2"&gt;[0m seconds&amp;quot;&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;改写 python 的同时，考虑脚本的灵活性准备增加两个参数，第一个是请求测试次数，第二个是请求测试的 URL，而 python 默认提供了 &lt;a href="http://docs.python.org/dev/library/argparse.html"&gt;argparse&lt;/a&gt; 库，可以很方便的生成 --help 的帮助和解析传递的参数：&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/usr/bin/env python&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;urllib2&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;argparse&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;benchmark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;urllib2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;color_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;color_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;color_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;33&lt;/span&gt;

        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;# &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s"&gt;Stauts: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getcode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s"&gt;Time: &lt;/span&gt;&lt;span class="se"&gt;\033&lt;/span&gt;&lt;span class="s"&gt;[&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s"&gt;m&lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="se"&gt;\033&lt;/span&gt;&lt;span class="s"&gt;[0m second(s)&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;argparse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ArgumentParser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;url request time test&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;URL&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;request url&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;-t&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;--time&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;store&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;request times&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse_args&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;benchmark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;当然，我主要是为了练手 python 才去写的，ruby 本身也有 &lt;a href="http://ruby-doc.org/stdlib-1.9.3/libdoc/optparse/rdoc/OptionParser.html"&gt;optparse&lt;/a&gt; 库用于解析参数，但是需要自己手写生成 --help 的输出，而且需要对每个参数做相应的 callback。&lt;/p&gt;
&lt;p&gt;效果如下：&lt;/p&gt;
&lt;p&gt;&lt;img alt="screenshot" src="http://ww3.sinaimg.cn/large/65d1d65bgw1dvi5nsc4sdj.jpg" /&gt;&lt;/p&gt;</summary><category term="python"></category><category term="ruby"></category></entry><entry><title>Sublime Text 2 + GoSublime + ZSH 的配置</title><link href="http://icyleaf.com/2012/07/Sublime-Text-2-GoSublime-ZSH" rel="alternate"></link><updated>2012-07-30T11:01:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2012-07-30:2012/07/Sublime-Text-2-GoSublime-ZSH</id><summary type="html">&lt;p&gt;&lt;a href="http://www.sublimetext.com/2"&gt;Sublime Text 2&lt;/a&gt;（下面简称 Subl） 通过 PCIP（Package Control: Install Package）安装各式各样的插件，其中还包括 Google 刚刚发布 1.0+ 的 golang 语言也有相应的插件 &lt;a href="https://github.com/DisposaBoy/GoSublime"&gt;GoSublime&lt;/a&gt;，其实本来用 tmux + vim 也能解决编写和执行命令之间切换的工作。但是 tmux 的快捷键有时候重复多了会很不爽...&lt;/p&gt;
&lt;p&gt;于是今天开始尝试使用 Subl 来编写 golang，安装完毕插件之后，编写还是比较方便的，有语法高亮，代码提示，错误提示，快速编译执行等，但是我在编译执行的时候总是会报如下错误:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;/bin/sh: go: command not found&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;由于插件默认是安装 sh shell 去搜索路径的，肯定是因为在 &lt;code&gt;.bash_profile&lt;/code&gt; 里面没有找到 go 命令，而我已经切换了 zsh shell （.zshrc）因此才会报此错误。&lt;/p&gt;
&lt;p&gt;最后翻找了半天资料，发现通过 Preferencs -&amp;gt; Brower Packages -&amp;gt; Gosublime 下面有一个 &lt;a href="https://github.com/DisposaBoy/GoSublime/blob/master/USAGE.md"&gt;USAGE.md&lt;/a&gt; 的文档，原来修改 &lt;code&gt;GoSublime.sublime-settings&lt;/code&gt; 下面的 &lt;code&gt;env&lt;/code&gt; 的 $PATH 解决了此问题：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"env": { "PATH": "/usr/local/sbin:/usr/local/bin:$PATH"}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;再次编译运行，搞定！&lt;/p&gt;</summary><category term="golang"></category><category term="Sublime Text 2"></category></entry><entry><title>Dropbox和Apache关于权限的问题</title><link href="http://icyleaf.com/2012/07/how-to-fix-dropbox-with-apache-about-acces-permission" rel="alternate"></link><updated>2012-07-30T09:55:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2012-07-30:2012/07/how-to-fix-dropbox-with-apache-about-acces-permission</id><summary type="html">&lt;p&gt;自从上次 SSD 硬盘不小心挂了之后，就算是返厂检修，一旦是算坏只能更换新的无法提供维修服务。这次我对待一些数据就更加小心了。尤其是代码，其实这次代码也并没有损失多少，丢失了一些平时的练习的项目。但为了保证代码的完整性和整体的同步性，我决定使用 Dropbox 同步我的代码。这样平时练习的代码也不必丢到 Github 或者花麻烦自建的服务器上面，什么都不需要操作就可以同步与无形之中。&lt;/p&gt;
&lt;p&gt;移动用户目录的 src 至 Dropbox 目录并创建软链接：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;mv&lt;/span&gt; &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;Dropbox&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;

$ &lt;span class="n"&gt;ln&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;Dropbox&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;如果这是写 Dropbox 同步代码的事情，那到这里就结束了，后来发现 apache
无法访问 php 的目录，报如下错误：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Symbolic link not allowed or link target not accessible:
/Users/icyleaf/src&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这个问题是因为我 VirtualHost 是这样配置的，使用的是经过处理的软链接的方式访问，而 apache 默认不允许这种行为：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nt"&gt;&amp;lt;directory&lt;/span&gt; &lt;span class="err"&gt;&amp;quot;&lt;/span&gt; &lt;span class="err"&gt;users&lt;/span&gt; &lt;span class="err"&gt;icyleaf&lt;/span&gt; &lt;span class="err"&gt;src&lt;/span&gt; &lt;span class="err"&gt;php&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    Options Indexes FollowSymLinks MultiViews Includes

    AllowOverride All

    Order allow,deny

    Allow from all

&lt;span class="nt"&gt;&amp;lt;/directory&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;但是我 Directory 已经配置了 &lt;code&gt;Options FollowSymLinks&lt;/code&gt; 但还是报如下错误，经过反复的检查 &lt;code&gt;/Users/icyleaf/src&lt;/code&gt; 目录的权限也没有问题，最后只能在配置里把软链接替换成原始路径：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nt"&gt;&amp;lt;directory&lt;/span&gt; &lt;span class="err"&gt;&amp;quot;&lt;/span&gt; &lt;span class="err"&gt;users&lt;/span&gt; &lt;span class="err"&gt;icyleaf&lt;/span&gt; &lt;span class="err"&gt;dropbox&lt;/span&gt; &lt;span class="err"&gt;src&lt;/span&gt; &lt;span class="err"&gt;php&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    Options Indexes FollowSymLinks MultiViews Includes

    AllowOverride All

    Order allow,deny

    Allow from all

&lt;span class="nt"&gt;&amp;lt;/directory&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;发现还是无法访问，但是报了的是另外一个错误：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Permission denied: access to / denied&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;又是一番折腾，最终发现居然是坑爹的 Dropbox 的访问权限居然是：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;drwx&lt;/span&gt;&lt;span class="o"&gt;------&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt; 21 &lt;span class="n"&gt;icyleaf&lt;/span&gt; &lt;span class="n"&gt;staff&lt;/span&gt; 714 7 30 06&lt;span class="p"&gt;:&lt;/span&gt;07 &lt;span class="n"&gt;Dropbox&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;调整权限：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;chmod&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;Dropbox&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;再次查看权限:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;drwxr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt; 21 &lt;span class="n"&gt;icyleaf&lt;/span&gt; &lt;span class="n"&gt;staff&lt;/span&gt; 714 7 30 06&lt;span class="p"&gt;:&lt;/span&gt;07 &lt;span class="n"&gt;Dropbox&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;再次访问权限没有问题，替换为原来的软链接方式访问，一切搞定！&lt;/p&gt;</summary><category term="Dropbox"></category><category term="apache"></category></entry><entry><title>初次接触 virtualenv</title><link href="http://icyleaf.com/2012/07/intro-virtualenv" rel="alternate"></link><updated>2012-07-27T19:23:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2012-07-27:2012/07/intro-virtualenv</id><summary type="html">&lt;p&gt;python 的 virtualenv 功能看着类似于 Ruby 的 RVM，其实这两个东西我都没有用过，本身脚本语言用的最熟练的是 php，最近觉得 php 在处理一些多线程和终端繁琐的事情上有些局限性。决定熟悉下 python 并尝试用 django 做一个小应用。&lt;/p&gt;
&lt;p&gt;由于本身 &lt;a href="http://github.com/openparty/openparty"&gt;OpenParty&lt;/a&gt; 的代码也是基于 django 开发的，加上最近也开始使用了 virtualenv，这样正好解决了不同项目在使用不同的环境造成的一些困扰。&lt;/p&gt;
&lt;p&gt;OS X 本身已经安装了 easy_install 可以通过命令安装：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;easy_install&lt;/span&gt; &lt;span class="n"&gt;pip&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;安装好之后，可以为每个项目创建一个专属的开发环境，这个环境可以单独存放在一个目录下面，比如：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;envs&lt;/span&gt;
      &lt;span class="o"&gt;\&lt;/span&gt;
      &lt;span class="o"&gt;|-&lt;/span&gt; &lt;span class="n"&gt;env1&lt;/span&gt;
      &lt;span class="o"&gt;|-&lt;/span&gt; &lt;span class="n"&gt;env2&lt;/span&gt;
      &lt;span class="o"&gt;\-&lt;/span&gt; &lt;span class="n"&gt;env3&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;创建一个的纯净的开发环境:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;virtualenv&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;packages&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;env_name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;进入专属的开发环境：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;env_name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;activate&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;你会发现 &lt;code&gt;(&amp;lt;env_name&amp;gt;)&lt;/code&gt; 会出现在你终端提示的前面，这个时候就说明进入该环境，以后的任何和 python 相关的依赖都是在这个环境下面，和系统全局的不受任何影响。&lt;/p&gt;
&lt;p&gt;比如通过快速安装项目的依赖：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;$ &lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="n"&gt;requirements&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;下载的依赖都会存放在这个路径：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;env_name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;7&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;退出当前的开发环境：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;deactivate&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;资料参考：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://github.com/openparty/openparty"&gt;OpenParty README&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.virtualenv.org/"&gt;virtualenv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jsome.net/blog/2010/06/11/start-to-use-virtualenv"&gt;开始使用Virtualenv&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</summary><category term="Python"></category><category term="Virtualenv"></category><category term="Django"></category></entry><entry><title>“java.lang.NoClassDefFoundError” in Android</title><link href="http://icyleaf.com/2012/05/how-to-salvation-android-import-jar-exception-during-running" rel="alternate"></link><updated>2012-05-14T17:31:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2012-05-14:2012/05/how-to-salvation-android-import-jar-exception-during-running</id><summary type="html">&lt;p&gt;最近 Eclipse 的 ADT 升级至了 18 版本，结果运行的时候发现导入的第三方 jar
包总是报错&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;java.lang.NoClassDefFoundError&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;可气的是 Eclipse 不会给工程同时在编译的时候也不会报错。&lt;/p&gt;
&lt;p&gt;后来发现此版本，第三方的 &lt;code&gt;jar&lt;/code&gt; 包必须放在项目的 &lt;code&gt;libs&lt;/code&gt;
目录下面，而且仅能放在 &lt;code&gt;libs&lt;/code&gt; 根目录下面，即不能在 &lt;code&gt;libs&lt;/code&gt;
下面在建立子目录存放，也不能改名 &lt;code&gt;lib&lt;/code&gt; 目录....&lt;/p&gt;
&lt;p&gt;更无奈的是， Eclipse 的 User Library 也是出现同样的问题，目前无解 &amp;gt;.&amp;lt;&lt;/p&gt;</summary><category term="Android"></category></entry><entry><title>友盟 iOS 发布渠道自动化脚本</title><link href="http://icyleaf.com/2012/05/ios-publish-channel-packger-for-umeng" rel="alternate"></link><updated>2012-05-10T10:27:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2012-05-10:2012/05/ios-publish-channel-packger-for-umeng</id><summary type="html">&lt;p&gt;现在公司的大多数手机项目的统计服务都是用的&lt;a href="http:///www.umeng.com"&gt;友盟&lt;/a&gt;，而自使用之初到现在都有一个渠道管理的功能，这个最后打包的时候实际上可能会产生一点点的麻烦，最早第一个 app 发布的时候，写了一个半自动的脚本，凑合用了很久，现在觉得需要完全自动化，于是借鉴之前 &lt;a href="http://icyleaf.com/2012/04/automating-script-to-testFlight-from-xcode/"&gt;testflightapp 的自动化脚本&lt;/a&gt;，重新改造脚本。&lt;/p&gt;
&lt;p&gt;实现分两部分：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;iOS 代码&lt;/li&gt;
&lt;li&gt;自动化脚本&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实现原理很简单，我利用一个文本文件放置在项目当中（比如：&lt;code&gt;PublishChannel.txt&lt;/code&gt;），里面只需要存上发布渠道的名字，默认是 &lt;code&gt;App Store&lt;/code&gt;。在代码中只需要想友盟调用函数的时候，读取这个文件即可。只需要做这样简单的工作就结束了 iOS 代码部分的工作。&lt;/p&gt;
&lt;p&gt;主要的功能基本上都是由自动化脚本完成。因为它要去标记分发渠道，处理打包工作：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打包需要一个符合官方发布要求的 Icon，即 512x512 px，PNG 格式且名字必须是 &lt;code&gt;iTunesArtwork&lt;/code&gt; （不能包含后缀，无比保证在终端检查）&lt;/li&gt;
&lt;li&gt;修改 PublishChannel.txt 的分发渠道&lt;/li&gt;
&lt;li&gt;同时需要把 .app 的文件放在 &lt;code&gt;Payload&lt;/code&gt; 并和 &lt;code&gt;iTunesArtwork&lt;/code&gt; 一起打成 ipa 包（实际上就是一个 zip，改成了 ipa）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这样看起来其实工作也不复杂，只不过分发渠道多了就是有些浪费时间。同样还是采用了 Archive 的 Post-Action，这里面可以插入脚本以及外部的调用脚本（如果看不到下面的具体代码，请&lt;a href="https://gist.github.com/2650508"&gt;点击这里&lt;/a&gt;：&lt;/p&gt;
&lt;script src="https://gist.github.com/2650508.js?file=package.sh"&gt;&lt;/script&gt;</summary><category term="XCode"></category><category term="iOS"></category><category term="shell"></category><category term="umeng"></category></entry><entry><title>获取公网 IP</title><link href="http://icyleaf.com/2012/05/fetch-public-ip" rel="alternate"></link><updated>2012-05-09T10:48:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2012-05-09:2012/05/fetch-public-ip</id><summary type="html">&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;curl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;checkip&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dyndns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;grep&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Eo&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;([0-9]{1,3}\\.){3}[0-9]{1,3}&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</summary><category term="shell"></category></entry><entry><title>QuickLook 感悟</title><link href="http://icyleaf.com/2012/04/thinking-in-QuickLook" rel="alternate"></link><updated>2012-04-30T19:03:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2012-04-30:2012/04/thinking-in-QuickLook</id><summary type="html">&lt;p&gt;前段时间对 OS X 系统的 &lt;a href="http://en.wikipedia.org/wiki/Quick_Look"&gt;QuickLook&lt;/a&gt; 非常感兴趣，能够随着开发者的定制，针对不同的文件呈现符合用户需求的预览功能，然后认为它属于是万能的。随后可以琢磨利用它做些意思的事情。&lt;/p&gt;
&lt;h1&gt;范例&lt;/h1&gt;
&lt;p&gt;为了大家对它有个直接的认识，我这里找了几个范例，看到图大家就非常明白了！&lt;/p&gt;
&lt;p&gt;默认系统很对 QuickTime 兼容格式的可以实现视频预览播放，如果安装了最新的 MPlayerX，同样也支持大多数格式（目前还不支持 mkv）
&lt;img alt="video quicklook" src="https://developer.apple.com/library/mac/documentation/UserExperience/Conceptual/Quicklook_Programming_Guide/Art/preview_example2.jpg" /&gt;&lt;/p&gt;
&lt;h1&gt;预热&lt;/h1&gt;
&lt;p&gt;Xcode 已经内置了 QuickLook 的插件模块，一边阅读&lt;a href="https://developer.apple.com/library/mac/#documentation/UserExperience/Conceptual/Quicklook_Programming_Guide/Introduction/Introduction.html"&gt;官方文档&lt;/a&gt;，一边在 Github 上面搜索相关的&lt;a href="https://github.com/search?q=QuickLook&amp;amp;type=Repositories"&gt;开源项目&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;QuickLook 是通过 &lt;a href="https://developer.apple.com/library/mac/#documentation/FileManagement/Conceptual/understanding_utis/understand_utis_conc/understand_utis_conc.html#//apple_ref/doc/uid/TP40001319-CH202-CHDHIJDE"&gt;UTIs&lt;/a&gt; 的资源类型来对文件进行预览。&lt;/p&gt;
&lt;h1&gt;有意思的事情&lt;/h1&gt;
&lt;p&gt;不知从何开始，硬盘收集的电影越来越多，有时候也从朋友那边资源交换来了不少。其实这里有一个很大的问题，交换过来的资源并不一定符合每个人的口味，但面对一个个电影名字的众多视频而且可能还没有仔细的分类（包括我也是没有归类），其实在选择看哪个的时候有些头胀。之前也整理了一些 &lt;a href="http://icyleaf.com/2012/03/pngcrush-usage-with-ios-apps/"&gt;pngcrush&lt;/a&gt; 的资源。脑门一亮，在想能不能利用 QuickLook 去&lt;em&gt;准确显示&lt;/em&gt;电影的信息。&lt;/p&gt;
&lt;p&gt;电影的信息来源不用愁，利用 &lt;a href="http://www.douban.com/service/apidoc/reference/subject"&gt;豆瓣相关 API&lt;/a&gt; 可以搜索到电影的信息，但是这里还有几点难题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;视频文件的文件名是否好提取关键字（视频文件根据每个来源提供者，视频工作室，个人的维护不同导致很难）&lt;/li&gt;
&lt;li&gt;豆瓣 API 接口是否给力（根据 1 是否能够准确搜索到正确的结果呢）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;针对于上面的问题，第一我想测试下豆瓣 API 是否给力，于是找了几种不同方式的视频文件名进行测试，记过尚可，但是搜索结果一般都是多条，其结果显示可能会存在偏差（主要是存在于电脑重名），当然这样也无法避免。这里我想郑重的表扬 IMDB 的策略，&lt;a href="http://www.imdbapi.com/"&gt;IMDB API&lt;/a&gt; 可以按照关键字和 imdb id 去搜索（豆瓣也满足），让我表扬的地方在于，它返回的结果永远只有一条，我曾测试利用不同语种（大语种，小语种不行）的名字去尝试搜索几乎 98% 的命中率， 而且在搜索的基础上，又提供一个 year 的参数。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这会 IMDB API 服务器总是 503 状态，哎...&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;基于种种的问题，我最终采用了在文件添加 imdb id 的方式以保证完美的命中率！（虽然前期准备工作可能辛苦点 &amp;gt;..&amp;lt;）&lt;/p&gt;
&lt;h1&gt;干活！&lt;/h1&gt;
&lt;p&gt;说干就干，在通读了文档和一些开源代码之后，就准备练手。如果大家同样开始跟我新建工程编写代码的时候就会发现一个很坑爹的事情，官方的文档根本没有更新！用的还是 Xcode 3 做的指导。问题在于 3 升级到 4 之后，很多东西都已经改的面目全非。对于熟悉 3 的开发者就不必担心了。&lt;/p&gt;
&lt;p&gt;QuickLook 官方文档的前面内容都没有问题，主要是后面有个 Debug 和 Test 的章节，在 4 里面有了一些大的变化，比如需要把 &lt;code&gt;.qlgenerator&lt;/code&gt; 文件复制到 &lt;code&gt;/Library/QuickLook&lt;/code&gt; 或 &lt;code&gt;~/Library/QuickLook&lt;/code&gt; 目录下面，然后通过外部命令 &lt;code&gt;qlmanage&lt;/code&gt; 去做代码的实现预览。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果发现没有更新，尝试 &lt;code&gt;qlmanage -r&lt;/code&gt; 更新一下&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在 Xcode 4 是如下解决：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;复制 &lt;code&gt;.qlgenerator&lt;/code&gt; 文件到对应的目录下面&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在工程项目的 &lt;code&gt;Build Phases&lt;/code&gt; 找到 &lt;code&gt;Add BuildPhase&lt;/code&gt; 并选择 &lt;code&gt;Add Copy Files&lt;/code&gt;，在选项设置 &lt;code&gt;Destination&lt;/code&gt; 选择 &lt;code&gt;Absolute Path&lt;/code&gt;，在 &lt;code&gt;Subpath&lt;/code&gt; 填入 &lt;code&gt;~/Library/QuickLook&lt;/code&gt;，最后在下面的列表添加项目的 &lt;code&gt;.qlgenerator&lt;/code&gt; 文件&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;执行外部命令&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在工程中按快捷键 &lt;code&gt;Command + Shift + ,&lt;/code&gt;，打开 Scheme， 在 &lt;code&gt;Run&lt;/code&gt; 的 &lt;code&gt;Info&lt;/code&gt; 更换 &lt;code&gt;Executable&lt;/code&gt;，在 &lt;code&gt;/usr/bin&lt;/code&gt; 找到 &lt;code&gt;qlmanage&lt;/code&gt; 文件。再更换到 &lt;code&gt;Arguments&lt;/code&gt; 里面添加参数格式：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;-p /your/path/to/quicklook/file&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;比如，我要预览的是 &lt;code&gt;/Users/icyleaf/sample.mkv&lt;/code&gt; 文件:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;-p /Users/icyleaf/sample.mkv&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;备受打击&lt;/h1&gt;
&lt;p&gt;当一切都紧锣密鼓的完成下去的时候，遇到一个无法解决的问题，就是在使用 HTTP 请求的时候，总是返回 "&lt;em&gt;Operation not permitted&lt;/em&gt;" 的错误，最后没有办法开始 Google 求助，然后发现了&lt;a href="http://web.archiveorange.com/archive/v/SEb6aPoIYeg2zfU4v9Ee"&gt;一个很残酷的现实&lt;/a&gt;。于是我有仔细的看了看官方文档，翻到了彻底让我失败的证据！&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Important&lt;/em&gt; For security reasons, you cannot use Web Kit plug-ins in HTML passed back to Quick Look (so you cannot, for example, use Java applets or Flash animations).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;当前我以为只是不能使用 Webkit 嵌套 HTML，但是看到很多例子（比如预览 Markdown，JSON，.strings 文件）都是通过 WebKit 达到预览格式化后的 HTML 实现的。我还特别高兴的认为官方文档净吓唬我...&lt;/p&gt;
&lt;p&gt;原来官方是出于安全考虑，把所有应用放在一个安全的 sandbox 里面，任何有威胁可能的安全问题一律扼杀掉，最终导致我的想法难产了 T&lt;strong&gt;&lt;em&gt;_&lt;/em&gt;&lt;/strong&gt;T&lt;/p&gt;
&lt;p&gt;BTW，假如你的 QuickLook 也需要使用到 Webkit，默认调试报 "WebKit Threading Violation - initial use of WebKit from a secondary thread." 错误，系统不运行从其他线程访问资源，因此在 Info.plist 把 &lt;code&gt;QLNeedsToBeRunInMainThread&lt;/code&gt; 设置为 &lt;code&gt;YES&lt;/code&gt; 即可。&lt;/p&gt;
&lt;h1&gt;漏网之鱼?&lt;/h1&gt;
&lt;p&gt;为什么这么讲呢，因为我看到 QuickLook 可以利用第三方的命令甚至是脚本去实现一些功能:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/davea/qlmarkdownpython"&gt;qlmarkdownpython&lt;/a&gt; - 利用 py 脚本 + Python framework 实现 markdown 的格式化&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/johan/QuickJSON"&gt;QuickJSON&lt;/a&gt; - 利用 node 脚本实现 JSON 的友好化显示&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;假如可以利用外部的脚本及命令的话，那是不是可以利用他们完成网络的访问及后续的格式化工作，QuickLook 只是做统一的输出？&lt;/p&gt;
&lt;p&gt;To be contiue...&lt;/p&gt;</summary><category term="xcode"></category><category term="quicklook"></category><category term="github"></category></entry><entry><title>自动化脚本上传应用至 testflightapp</title><link href="http://icyleaf.com/2012/04/automating-script-to-testFlight-from-xcode" rel="alternate"></link><updated>2012-04-06T17:09:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2012-04-06:2012/04/automating-script-to-testFlight-from-xcode</id><summary type="html">&lt;p&gt;Testflightapp 是团队开发测试中起了重要的角色，尤其是到目前为止一直是免费，最近还推出的 Live 功能不仅可以统计本身的一些数据还可以把现有的一些其他的账户的数据（比如， itunesconnect，Apple iAd，admob 等）导入进一步扩大聚合。&lt;/p&gt;
&lt;p&gt;尤其是它真的重视开发着的核心需求，仅推出了唯一的一个公开 API，就是上传打包后的 ipa 文件，配合 Xcode 中 Archive 的 Post-action 可以轻松搞定自动化的操作。&lt;/p&gt;
&lt;p&gt;下面是网上搜集的脚本，算是我发现定制化比较强的&lt;a href="https://gist.github.com/1379127"&gt;自动化脚本&lt;/a&gt;，而且注解也写的很详细。可以在配合我的打包脚本，可以把各个发布渠道的事情一起自动化。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：Xcode 默认的 run script 是 &lt;code&gt;/bin/sh&lt;/code&gt;，而上面的脚本是
&lt;code&gt;/bin/bash&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这个 Post-action 不爽的地方在于所有的 &lt;code&gt;echo&lt;/code&gt; 没有办法直接输出到 Xcode 的 output 里面，所以脚本只能把 log 保持到了 &lt;code&gt;/tmp&lt;/code&gt;
目录下面，如果发现出现问题请仔细查看 log。&lt;/p&gt;
&lt;p&gt;BTW，Post-actions 添加的脚本对于忽略了 XCode 干扰文件的版本控制来说，它没有归入到版本控制之中，脚本是被转义后放在了一个 xcscheme 的 xml 文件中：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;xcodeproj&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;xcuserdata&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;xcuserdatad&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;xcschemes&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;xcscheme&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</summary><category term="xcode"></category><category term="ios"></category><category term="testflightapp"></category></entry><entry><title>使用 Git Hooks 实现自动项目部署</title><link href="http://icyleaf.com/2012/03/apps-auto-deploy-with-git" rel="alternate"></link><updated>2012-03-14T11:43:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2012-03-14:2012/03/apps-auto-deploy-with-git</id><summary type="html">&lt;p&gt;最近在某服务器上面搭建 git 开发和部署环境，git 开发环境很简单，按照 ProGit 一书的相关知识就可以轻松搞定，实现了类似 Github 的使用 SSH + 私有 Clone 的方式。&lt;/p&gt;
&lt;p&gt;关于部署，实际上是自动部署，起初的想法是使用 bash shell 制定一个定时任务去不断 git pull 产品代码，后来记得 Git 带有 Hooks，索性在ProGit 一书翻了翻：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Git 本身可以调用自定义的挂钩脚本，其中有两组：客户端和服务器端。客户端挂钩用于客户端的操作，如提交和合并。服务器端挂钩用于 Git 服务器端的操作，如接收被推送的提交。详情请查看 &lt;a href="http://progit.org/book/zh/ch7-3.html"&gt;ProGit 相关章节&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果这样就简单了，利用服务器端调用想要的挂钩（Hook），即可实现自动部署的方案，为了保证不被肆意部署，特加了一个对需要部署 commit 的判断，利用读取 commit subject 并匹配想要的字符串才去部署，这样我认为是一个比较安装的部署方案。&lt;/p&gt;
&lt;p&gt;Git的挂钩（Hook）主要包含：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;applypatch-msg&lt;/li&gt;
&lt;li&gt;post-update&lt;/li&gt;
&lt;li&gt;pre-rebase&lt;/li&gt;
&lt;li&gt;commit-msg&lt;/li&gt;
&lt;li&gt;pre-applypatch&lt;/li&gt;
&lt;li&gt;update&lt;/li&gt;
&lt;li&gt;post-commit&lt;/li&gt;
&lt;li&gt;pre-commit&lt;/li&gt;
&lt;li&gt;post-receive&lt;/li&gt;
&lt;li&gt;prepare-commit-msg&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里我们只需要使用 post-receive 这个 Hook：在接收 post(push)
请求之后执行。其他大部分我也没有大多研究，不过看名字不算难理解，我觉得其中大部分包含 commit 的属于客户端。&lt;/p&gt;
&lt;p&gt;好了，部署开始：&lt;/p&gt;
&lt;p&gt;1. 在服务器 git 仓库（注意是 bare 仓库，不是代码仓库）的 Hooks，编辑
post-receive（如果没有自行创建），代码请看：&lt;/p&gt;
&lt;p&gt;&lt;a href="http://gist.github.com/566767"&gt;http://gist.github.com/566767&lt;/a&gt;）：&lt;/p&gt;
&lt;script src="https://gist.github.com/566767.js"&gt; &lt;/script&gt;

&lt;p&gt;这里会先判断脚本所在目录是否是 bare git 仓库，然后获取最新 commit 的 subject，并匹配是否包含 [deploy] 字样，如果包含，则继续检查产品代码仓库路径是否存在，如果存在则执行 git pull 操作。&lt;/p&gt;
&lt;p&gt;2. 对刚才编辑的 post-receive 执行下面命令以保证脚本可执行：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&amp;quot;&lt;span class="n"&gt;bash&lt;/span&gt;&amp;quot;&lt;span class="p"&gt;}&lt;/span&gt;
$ &lt;span class="n"&gt;chmod&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;receive&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;3. 完成！&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;对于自定义脚本，其实不仅限于 bash shell，你可以使用你熟悉的语言，然后把你的脚本路径在 hooks 脚本中加载即可。&lt;/p&gt;
&lt;p&gt;脚本还会继续更新，下面需要增加关于测试部分的相关判断和部署。 bash shell 还需要进一步学习，上面脚本是我第一次写，如有不妥之处，请指教，感谢！&lt;/p&gt;</summary><category term="git"></category></entry><entry><title>pngcrush 的一些用法</title><link href="http://icyleaf.com/2012/03/pngcrush-usage-with-ios-apps" rel="alternate"></link><updated>2012-03-09T14:27:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2012-03-09:2012/03/pngcrush-usage-with-ios-apps</id><summary type="html">&lt;p&gt;pngcrush 顾名思义，看起名字本身就优化 png 的工具，为什么会提到它呢，因为目前所有 iOS app 自身的 png 文件都是经过它优化的，对于优化有的 png，系统本身默认是无法识别的（包括看图工具，作图工具）。但这个工具不仅仅可以优化还可以还原。假如你希望可以学习优秀 iOS App 的一些 png 资源设计，通过这个工具延伸的一些辅助工具，可以快速预览和恢复未优化的图片。&lt;/p&gt;
&lt;h1&gt;pngcrush&lt;/h1&gt;
&lt;p&gt;本身就是一个开源的工具，托管在 &lt;a href="http://pmt.sourceforge.net/pngcrush/index.html"&gt;SourceForge&lt;/a&gt;，可以在任何平台运行，对于安装 Xcode 的童鞋，此工具默认放在：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c"&gt;# XCode 4.3+&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Applications&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Xcode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Contents&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Developer&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Platforms&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;iPhoneOS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;platform&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Developer&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pngcrush&lt;/span&gt;

&lt;span class="c"&gt;# XCode 4.2.x 以下版本&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Developer&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Platforms&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;iPhoneOS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;platform&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Developer&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;

&lt;span class="c"&gt;# 还原 ipa 目录下所以 png 文件到 reverted 目录下面&lt;/span&gt;
&lt;span class="n"&gt;pngcrush&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;dir&lt;/span&gt; &lt;span class="n"&gt;reverted&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;revert&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;iphone&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;optimizations&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="n"&gt;ipa&lt;/span&gt;&lt;span class="o"&gt;/*&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;png&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;这里还有一些其他版本的&lt;a href="http://stackoverflow.com/questions/7138700/pngcrush-uncrush-on-linux"&gt;类似工具&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Quicklook&lt;/h1&gt;
&lt;p&gt;OSX 有个系统的快速预览功能，简单的解释（针对于图片来说）：可以显示图片的内容，同时选中文件，按&lt;strong&gt;空格&lt;/strong&gt;对于系统可以识别的即可快速查看文件的内容。&lt;/p&gt;
&lt;p&gt;但由于 iOS app 的 png 文件是优化后的，既然系统无法识别，那就更别提 Quicklook 了，于是利用 pngcrush 就有了新的产物：PngUncrush.qlgenerator。有了它就可以用 Quicklook 显示和查看 png 图片了。&lt;/p&gt;
&lt;p&gt;目前利用这个工具做成的工具很多，包括用 shell 安装的，pkg 文件，实际上原理都是把这个文件丢到系统 &lt;code&gt;/Library/QuickLook/&lt;/code&gt; 或者 &lt;code&gt;~/Library/QuickLook/&lt;/code&gt; 下面即可。&lt;/p&gt;
&lt;p&gt;我觉得比较好用的是 &lt;a href="http://castelliweb.com/blog/2010/05/24/quicklook-plugins-for-mac/"&gt;Quicklook Plugins for Mac&lt;/a&gt;，这是一个 pkg 安装文件，不仅包括了对于 png 文件的快速预览，同时对于 ipa 文件的图表也会更换为更为直观的 App 图标，方便大家的浏览和识别。&lt;/p&gt;
&lt;h1&gt;atPeek&lt;/h1&gt;
&lt;p&gt;我就知道你不会满足上面半自动的工具，我想 &lt;a href="http://www.atpurpose.com/atPeek/"&gt;atPeek&lt;/a&gt;(奇怪为什么会被墙掉) 也是你在本博文中最满意的工具。正式介绍下，这个工具自打开的一瞬间，就会加载 &lt;code&gt;Music/iTunes/Mobile Applications&lt;/code&gt; 目录下面的所有 ipa 文件。点击你需要查看的 ipa 文件，不仅可以查看该 ipa 的基本 App，最让大家爽的是，ipa 的所有资源文件以文件资源管理器的方式呈现出来。嗯，没错！我可以看到你们双眼发光了！&lt;/p&gt;
&lt;p&gt;但是，这是一个付费应用，你可以进行的操作就是浏览 ipa 和应用自带的预览功能，任何的放大以及导出 png 资源，都是需要付费的，价格为 $4.99。&lt;/p&gt;</summary><category term="iOS"></category><category term="Mac"></category></entry><entry><title>升级 xcode 4.3.1</title><link href="http://icyleaf.com/2012/03/upgrade-xcode-431" rel="alternate"></link><updated>2012-03-09T14:14:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2012-03-09:2012/03/upgrade-xcode-431</id><summary type="html">&lt;p&gt;下载 XCode 目前有两种途径：&lt;/p&gt;
&lt;p&gt;1. &lt;a href="http://itunes.apple.com/us/app/xcode/id497799835?mt=12"&gt;Mac App
Store&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2. &lt;a href="https://developer.apple.com/downloads/index.action"&gt;Apple Developer Download
Page&lt;/a&gt;
(需要有开发者账号并登陆）&lt;/p&gt;
&lt;p&gt;对于前者好处在于免费下载但下载时间或许非常漫长；但后者如果条件都满足的话（apple developer id + &lt;a href="http://t.cn/zOcn4KN"&gt;script&lt;/a&gt; + vps + axel）那就可以非常快速的下载到页面上面的所有资源。&lt;/p&gt;
&lt;p&gt;XCode 4.3 之后的版本采用核心和模块分离，现在主程序只有 1.8G
左右，其余的包括 Command line tools + dashcode + graphics tools（同样可以使用上面的脚本）需要单独按需下载。但这还不是变化最大的，最大的地方在于之前版本都是存放在 &lt;code&gt;/Developer&lt;/code&gt; 路径下面，4.3 之后的版本统一改放在了 &lt;code&gt;/Applications&lt;/code&gt;下面，下载 dmg 打开后直接把 Xcode 拖入 &lt;code&gt;/Applications&lt;/code&gt; 即可。&lt;/p&gt;
&lt;p&gt;安装完毕后首次启动，会有一个提示，这点需要非常注意，新版的会要求你把
&lt;code&gt;/Developer&lt;/code&gt; 以及 &lt;code&gt;/Applications/Install Xcode&lt;/code&gt; 一并移动至回收站，注意是整个目录完全移动。假如你的机器安装了其他的开发工具放置在了&lt;code&gt;/Developer&lt;/code&gt; 了，这里就需要谨慎处理。&lt;/p&gt;
&lt;p&gt;初次之外，我参考 &lt;a href="http://useyourloaf.com/blog/2012/2/17/updating-to-xcode-43.html"&gt;Use Your
Loaf&lt;/a&gt;的博文，假如你的环境还需要依赖 Command line tools for xcode，除了下载和安装的过程，还需要在终端作下处理。比如上面提到博文所说的 &lt;code&gt;agvtools&lt;/code&gt; 管理 App 版本自动化的工具。在升级 4.3+ 版本可能就会出现下面的错误&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;agvtools&lt;/span&gt;

&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;developer&lt;/span&gt; &lt;span class="n"&gt;directory&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Developer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;Run&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;xcode&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;select&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;developer&lt;/span&gt; &lt;span class="n"&gt;directory&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Use Your Loaf 博文提到需要使用 &lt;code&gt;xcode-select&lt;/code&gt; 重新选择 Xcode
的安装路径，来保证终端工具可以正常运行，但是在 4.3.1
中我尝试还是失败。提示如下：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;xcode&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;select&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Applications&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Xcode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;

$ &lt;span class="n"&gt;agvtool&lt;/span&gt;

&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Can&lt;/span&gt;&lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Applications&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Xcode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;agvtool&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;such&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;经常检查发现，实际上 Command line tools 安装后存放在
&lt;code&gt;/Applications/Xcode.app/Contents/Developer/usr&lt;/code&gt;
路径下面，尝试更正操作:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;xcode&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;select&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;switch&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;/Applications/Xcode.app/Contents/Developer/&lt;/p&gt;
&lt;p&gt;搞定！&lt;/p&gt;
&lt;p&gt;---------华丽丽的分割线---------&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Instruments 哪里去了？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;哼哼，尝试在 Xcode 图标右键 "Open Developer
Tool"，看到了吧，还有一些其他的工具 :)&lt;/p&gt;</summary><category term="xcode"></category></entry><entry><title>Colors: Mac 开发颜色辅助利器</title><link href="http://icyleaf.com/2012/03/colors-is-ios-development-utility-tool" rel="alternate"></link><updated>2012-03-02T11:05:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2012-03-02:2012/03/colors-is-ios-development-utility-tool</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;最新更新，发现更好的免费取色器 &lt;a href="https://itunes.apple.com/us/app/sip/id507257563?mt=12"&gt;Sip&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="http://mattpatenaude.com/"&gt;Colors&lt;/a&gt; 是一个简单的颜色取色器，简单的有可能你都没有听说过它，虽然它对于平面设计师以及
Web
设计师不太看中，但它可是程序员中的一个实用利器，为什么这样说呢，看下面截图，除了基本的颜色取值外，还包括了 Mac 和 iOS（iPhone/iPad）对于类的取值。&lt;/p&gt;
&lt;p&gt;等等，你说的不对，我下载了发现并没有 UIColor 的值，坑爹这不是，哈哈，非也，这个应用的最大好处在于可以自定义输出值。默认程序并没有 UIColor 这值。其实添加也很简单，在设置里（Command+逗号），添加一个名为 UIColor 的选项，其中只需要设置 GRB 的输出值和 Alpha 一样即可（Short Decimal over 1），输出格式使用 UIColor 的 RGBA 格式：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;UIColor&lt;/span&gt; &lt;span class="n"&gt;colorWithRed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c"&gt;%r green:%g blue:%b alpha:%a]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;后来发现这个应用是开源项目，且最后更新时间为 2009 年，难怪没有 UIColor
的输出值，有兴趣的朋友可以 Fork ：https://github.com/13bold/Colors&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我 fork 了作者的分支，添加了对 UIColor 的支持：http://github.com/icyleaf/Colors&lt;/p&gt;
&lt;/blockquote&gt;</summary><category term="Mac"></category><category term="App"></category></entry><entry><title>让 Android 支持下拉刷新(Pull Refresh)</title><link href="http://icyleaf.com/2012/02/pull-refresh-for-android" rel="alternate"></link><updated>2012-02-29T09:06:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2012-02-29:2012/02/pull-refresh-for-android</id><summary type="html">&lt;p&gt;曾几何时，自 Android 发布之后一直以来就被管以 Geek 的玩具，而不太注重界面设计和用户交互设计，这让 Android 开发者也顺其自然的接受了这个不好的头衔，但我一度认为这只是不思进取的行为，谁说 Android 就不能像 iPhone 的界面那样设计，我认为只有用心，没神马不能实现的。说回正题，第一次看到 Android 有这项功能的莫过于改版后的 Twitter，我认为它绝对是一个标榜性的 App（同时也包括已开源许久的 &lt;a href="http://code.google.com/p/foursquared/"&gt;Foursquare&lt;/a&gt;）。于是全世界的开发者就开始寻思这个效果 Twitter
是如何实现的，于是就有了...&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://github.com/johannilsson/android-pulltorefresh/raw/master/android-pull-to-refresh.png" /&gt;&lt;/p&gt;
&lt;p&gt;这是由 &lt;a href="http://johannilsson.com/2011/03/13/android-pull-to-refresh-update.html"&gt;johannilsson&lt;/a&gt; 以及众位其好友的研究成果，并已 Apache 2.0 协议开源托管在 Github：&lt;a href="https://github.com/johannilsson/android-pulltorefresh"&gt;https://github.com/johannilsson/android-pulltorefresh&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;大概看了一下源码，发现和我初步的想法类似，除了需要集成系统的 ListView 之外，只能在 HeaderView 上面做文章，外加配合 onTouchEvent， onScroll
事件可以捕捉用户下拉和上滑的事件监听。&lt;/p&gt;
&lt;p&gt;用法：&lt;/p&gt;
&lt;p&gt;Layout&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;// The PullToRefreshListView replaces a standard ListView widget.&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;markupartist&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;android&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pulltorefreshlistview&lt;/span&gt;
&lt;span class="nl"&gt;android:&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@+id/android:list&amp;quot;&lt;/span&gt;
&lt;span class="nl"&gt;android:&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;fill\_parent&amp;quot;&lt;/span&gt;
&lt;span class="nl"&gt;android:&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;fill\_parent&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Activity&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;// Set a listener to be invoked when the list should be refreshed.&lt;/span&gt;

&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;PullToRefreshListView&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;getListView&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="n"&gt;setOnRefreshListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;
&lt;span class="n"&gt;OnRefreshListener&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Override&lt;/span&gt;
    &lt;span class="n"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="n"&gt;onRefresh&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Do work to refresh the list here.&lt;/span&gt;
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;GetDataTask&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="n"&gt;private&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="n"&gt;GetDataTask&lt;/span&gt; &lt;span class="k"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;AsyncTask&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Override&lt;/span&gt;
&lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="n"&gt;onPostExecute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;mListItems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addFirst&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Added after refresh...&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Call onRefreshComplete when the list has been refreshed.&lt;/span&gt;
    &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;PullToRefreshListView&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;getListView&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="n"&gt;onRefreshComplete&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;onPostExecute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;仓库里除了实现类外，还有&lt;a href="https://github.com/johannilsson/android-pulltorefresh/tree/master/pulltorefreshexample"&gt;一个实例&lt;/a&gt;，看看人家够意思吧。&lt;/p&gt;</summary><category term="Android"></category></entry><entry><title>如何让 iOS 和 Android 支持自定义字体</title><link href="http://icyleaf.com/2011/07/custom-fonts-both-in-ios-and-android" rel="alternate"></link><updated>2011-07-06T13:36:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2011-07-06:2011/07/custom-fonts-both-in-ios-and-android</id><summary type="html">&lt;p&gt;本篇教程的目前源于我们团队设计师一直询问，iOS(iPhone/iPad) 和 Android
两个平台是否支持自定义字体的问题，恰巧前不久&lt;a href="http://www.v2ex.com/t/15220"&gt;唐茶计划&lt;/a&gt;出了一个关于在中文阅读新体验的电子书应用：&lt;a href="http://itunes.apple.com/cn/app/id446752200?mt=8"&gt;失控&lt;/a&gt;。里面提到中文的显示采用了香港字体设计室的全新中文黑体字：&lt;a href="http://www.typeisbeautiful.com/2011/07/4276"&gt;信黑体&lt;/a&gt;。于是我就在想看来
iOS 是可以支持自定义字体的。通过搜索和研究整理如下，供自己备份和大家参考&lt;/p&gt;
&lt;h1&gt;iOS&lt;/h1&gt;
&lt;p&gt;iOS 对字体以样式的支持是非常有限的(内嵌&lt;a href="http://iosfonts.com/"&gt;默认字库列表&lt;/a&gt;)，尤其说对于用习惯了 HTML + CSS，就觉得 iOS 对字体的扩展真是逊到渣了，当然高人们已经准备为大众造福，出现了轻巧的
&lt;a href="https://github.com/zynga/FontLabel"&gt;FontLable&lt;/a&gt;，&lt;a href="https://github.com/mattt/TTTAttributedLabel"&gt;TTTAttributedLabel&lt;/a&gt; 开源库到怪兽级别 &lt;a href="https://github.com/facebook/three20"&gt;Three20&lt;/a&gt; 开源框架。但假如仅仅是想加载自定义字体来说，对于 iOS 4 版本还是比较简单的：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;添加自定义字体文件做资源文件添加到 XCode 项目之中&lt;/li&gt;
&lt;li&gt;在 info.plist 中新增一个名为 UIAppFonts 的 Key，类型是数组（array）&lt;/li&gt;
&lt;li&gt;把新增的字体的文件名（包括后缀）依次填入 UIAppFonts 数组
    （注意区分大小写）&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;保存 info.plist（废话）。准备工作完毕，下面是编码部分&lt;/p&gt;
&lt;p&gt;@implementation CustomFontLabel&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(id)initWithCoder:(NSCoder *)decoder
{
    if (self = [super initWithCoder: decoder])
    {
        [self setFont: [UIFont fontWithName: @"Custom Font Name" size: self.font.pointSize]];
        // 这里 Custom Font Name 并不是字体的文件名，而且系统注册显示的字体标准名称，比如
        // 比如，微软雅黑，最好就用 Microsoft YaHei （不过这个会存在版权问题把 XD）
        // 另外，注意区分大小写
    }
    return self;
}&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;@end&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这里还有更完整的&lt;a href="http://stackoverflow.com/questions/360751/can-i-embed-a-custom-font-in-an-iphone-application"&gt;关于 iOS 不同平台支持自定义字体&lt;/a&gt;的问答。&lt;/p&gt;
&lt;h1&gt;Android&lt;/h1&gt;
&lt;p&gt;Android 默认支持  Droid Sans，Droid Sans Mono 和 Droid Serif 三种字体，其实对于中文的显示还是很不错的，有些类似于微软雅黑字体（&lt;a href="http://www.cnbeta.com/articles/114854.htm"&gt;区别&lt;/a&gt;）。假如只是对默认的字体进行更换，最简单的方法就是配置 layout 文件：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="cp"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="nx"&gt;xml&lt;/span&gt; &lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span class="nx"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;utf-8&amp;quot;&lt;/span&gt;&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;LinearLayout&lt;/span&gt; &lt;span class="nx"&gt;xmlns&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;android&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;&lt;/span&gt;
              &lt;span class="nx"&gt;android&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;orientation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;vertical&amp;quot;&lt;/span&gt;
              &lt;span class="nx"&gt;android&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;layout_width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;fill_parent&amp;quot;&lt;/span&gt;
              &lt;span class="nx"&gt;android&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;layout_height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;fill_parent&amp;quot;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TextView&lt;/span&gt;
            &lt;span class="nx"&gt;android&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;layout_width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;fill_parent&amp;quot;&lt;/span&gt;
            &lt;span class="nx"&gt;android&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;layout_height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;wrap_content&amp;quot;&lt;/span&gt;
            &lt;span class="nx"&gt;android&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;This is a &amp;#39;sans&amp;#39; demo!&amp;quot;&lt;/span&gt;
            &lt;span class="nx"&gt;android&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;typeface&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;sans&amp;quot;&lt;/span&gt;
            &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TextView&lt;/span&gt;
            &lt;span class="nx"&gt;android&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;layout_width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;fill_parent&amp;quot;&lt;/span&gt;
            &lt;span class="nx"&gt;android&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;layout_height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;wrap_content&amp;quot;&lt;/span&gt;
            &lt;span class="nx"&gt;android&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;This is a &amp;#39;serif&amp;#39; demo!&amp;quot;&lt;/span&gt;
            &lt;span class="nx"&gt;android&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;typeface&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;serif&amp;quot;&lt;/span&gt;
            &lt;span class="nx"&gt;android&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;textStyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;italic&amp;quot;&lt;/span&gt;
            &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TextView&lt;/span&gt;
            &lt;span class="nx"&gt;android&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;layout_width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;fill_parent&amp;quot;&lt;/span&gt;
            &lt;span class="nx"&gt;android&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;layout_height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;wrap_content&amp;quot;&lt;/span&gt;
            &lt;span class="nx"&gt;android&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;This is a &amp;#39;monospace&amp;#39; demo!&amp;quot;&lt;/span&gt;
            &lt;span class="nx"&gt;android&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;typeface&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;monospace&amp;quot;&lt;/span&gt;
            &lt;span class="nx"&gt;android&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;textStyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;bold&amp;quot;&lt;/span&gt;
            &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/LinearLayout&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;但是这样肯定不能满足大家对于字体排版高一级的要求，下面是支持自定义字体的步骤：&lt;/p&gt;
&lt;p&gt;首先，添加自定义字体文件放在项目的 &lt;code&gt;assets/fonts&lt;/code&gt; 目录下面（目录可能需要自己创建）。&lt;/p&gt;
&lt;p&gt;其次，编辑 layout 文件（这里做一个示范）&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="cp"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;LinearLayout&lt;/span&gt; &lt;span class="na"&gt;xmlns:android=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;&lt;/span&gt;
              &lt;span class="na"&gt;android:orientation=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;vertical&amp;quot;&lt;/span&gt;
              &lt;span class="na"&gt;android:layout_width=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;fill_parent&amp;quot;&lt;/span&gt;
              &lt;span class="na"&gt;android:layout_height=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;fill_parent&amp;quot;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;TextView&lt;/span&gt; &lt;span class="na"&gt;android:id=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@+id/textview&amp;quot;&lt;/span&gt;
            &lt;span class="na"&gt;android:layout_width=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;fill_parent&amp;quot;&lt;/span&gt;
            &lt;span class="na"&gt;android:layout_height=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;wrap_content&amp;quot;&lt;/span&gt;
            &lt;span class="na"&gt;android:text=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;This is a &amp;#39;Microsoft YaHei&amp;#39; demo!&amp;quot;&lt;/span&gt;
            &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Button&lt;/span&gt; &lt;span class="na"&gt;android:id=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@+id/button&amp;quot;&lt;/span&gt;
            &lt;span class="na"&gt;android:layout_width=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;fill_parent&amp;quot;&lt;/span&gt;
            &lt;span class="na"&gt;android:layout_height=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;wrap_content&amp;quot;&lt;/span&gt;
            &lt;span class="na"&gt;android:text=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;This is a &amp;#39;Microsoft YaHei&amp;#39; button!&amp;quot;&lt;/span&gt;
            &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/LinearLayout&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;最后，在代码部分实现自定义字体（和 iOS 类似）&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;public&lt;/span&gt; &lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="n"&gt;onCreate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Bundle&lt;/span&gt; &lt;span class="n"&gt;savedInstanceState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="n"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;onCreate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;savedInstanceState&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;setContentView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;TextView&lt;/span&gt; &lt;span class="n"&gt;textView&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;Button&lt;/span&gt; &lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="n"&gt;setFont&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;textView&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &amp;quot;&lt;span class="n"&gt;fonts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;YaHei&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ttf&lt;/span&gt;&amp;quot;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text_view&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;setFont&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &amp;quot;&lt;span class="n"&gt;fonts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;YaHei&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ttf&lt;/span&gt;&amp;quot;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="n"&gt;setFont&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TextView&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;int&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TextView&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;findViewById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;Typeface&lt;/span&gt; &lt;span class="n"&gt;font&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Typeface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;createFromAsset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getAssets&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
        &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setTypeface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;扩展阅读 [[1][]] [[2][]]&lt;/p&gt;
&lt;p&gt;话说，为什么 Android 到现在都没有更多的开源的库和框架呢？&lt;/p&gt;</summary><category term="Android"></category><category term="iOS"></category></entry><entry><title>Chrome 扩展: URL to QR-Code</title><link href="http://icyleaf.com/2011/06/chrome-extension-url-to-qr-code" rel="alternate"></link><updated>2011-06-16T12:06:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2011-06-16:2011/06/chrome-extension-url-to-qr-code</id><summary type="html">&lt;p&gt;URL to QR-Code 是一个 Chrome 扩展,适用于 Chrome 浏览页面的同时希望把在手机设备(当然手机得支持 QR-Code的扫描)也能访问.我总结可以适用于以下情景:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这个网页必须使用手机设备访问&lt;/li&gt;
&lt;li&gt;这个网页是一个手机应用的安装链接(AppStore/Google Market),用手机访问可以直接安装&lt;/li&gt;
&lt;li&gt;我就是想用手机浏览此网页,怎么着&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;好吧,基于以上情景,我做了一个 Chrome 扩展,恩,没错,只适用于 Chrome,也许会有人说,这个东西网上已经有了,为什么你还要重造轮子.我的理由是,虽然我的功能非常简单,鉴于目前现有的一些应用,都会把功能显示在 Chrome 的 Tab 上面,其实这个功能用的几率并不多,放在 Tab 实在是浪费了太大的空间,我的 Tab 的 Icons 已经负载过多了(大家可参考我之前分享的 &lt;a href="http://icyleaf.com/2011/06/11/im-using-chrome-extensions-software-list/"&gt;我常用的 Chrome 扩展集合&lt;/a&gt;),因此我决定把 Icon 丢在地址栏的右侧,这里相对于的利用空间更小.点击之后直接弹出
QR-Code,方便手机扫描.&lt;/p&gt;
&lt;p&gt;安装地址: [http://icyleaf.googlecode.com/svn/javascript/Chrome/url_to_qr_code_v0.1.crx][]&lt;/p&gt;
&lt;p&gt;--------------需要更新的分割线----------------&lt;/p&gt;
&lt;p&gt;发现 Google Chart API 居然提供支持 QR-Code,文档在此后面准备更换生成QR-Code的服务接口支持选文字生成和文字链的原始链接的生成.这里算是埋下一个坑,大家可以提醒我来填满。。。&lt;/p&gt;
&lt;p&gt;文档地址：[http://code.google.com/apis/chart/image/docs/gallery/qr_codes.html][]&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;icyleaf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;googlecode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;svn&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;javascript&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Chrome&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;url_to_qr_code_v0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;1&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;crx&lt;/span&gt;
&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;google&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;apis&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;chart&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;gallery&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qr_codes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</summary><category term="chrome"></category></entry><entry><title>魔豆及其豆瓣 API 测试平台开源咯</title><link href="http://icyleaf.com/2011/05/modou-and-douban-api-console-is-open-source-now" rel="alternate"></link><updated>2011-05-02T17:22:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2011-05-02:2011/05/modou-and-douban-api-console-is-open-source-now</id><summary type="html">&lt;p&gt;这是作为 2011 年 5 月 1 日劳动节的福利发放，欢迎各位 Kohana 开发者及其爱好者围观领取，领取内容及其使用方式请前往本人 Github 的项目地址：https://github.com/icyleaf/modou&lt;/p&gt;</summary><category term="PHP"></category><category term="豆瓣"></category><category term="魔豆"></category><category term="Kohana"></category></entry><entry><title>为 ShareKit 增加国内相关微博/SNS 服务</title><link href="http://icyleaf.com/2011/05/append-related-services-into-sharekit-from-china" rel="alternate"></link><updated>2011-05-02T17:19:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2011-05-02:2011/05/append-related-services-into-sharekit-from-china</id><summary type="html">&lt;p&gt;在 iDev 圈内，众所周知 ShareKit是一个家喻户晓的分享框架，很多人都在问哪有支持国内相关微博/SNS服务（比如，新浪微博，腾讯微博，豆瓣，开心网，校内等）的类似框架或者谁去做贡献，造福那些拿来主义的人类。正好碰巧我刚刚接触 iOS 开发不久，为了验证文章开头的那段话，恰巧我开发的应用也需要设计这块的内容，我就只好啃下了这块“硬面包”，实际上在熟悉整个 ShareKit 的代码后，外加上对于 OAuth 协议又非常的了解，做一个扩展还是很轻松的，虽然我对 Objective-C 代码并不是很熟悉，这一切得益于 ShareKit。&lt;/p&gt;
&lt;p&gt;ShareKit 在整体上，代码写的比较完美，对于新增的服务可以轻松实现，而且另外最最大的一个好处在于国内的这些服务实际上都是 Copy to China，这有大大减少了移植的开发量，比较恶心的事，国内为了证明我们的结构和功能不同于原版，对其有做了细微的调整，这就导致使用标准化的协议不能通过，这对于只是想用的人来说就是一种灾难。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;天下事有难易乎？为之，则难者亦易矣；不为，则易者亦难矣。人之为学有难易乎？学之，则难者亦易矣；不学，则易者亦难矣。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;上面是从 V2EX某帖子挖出来的一个评论，实际上这段文字大家在学校的时候应该并不陌生，随后又看到了《&lt;a href="http://huajun.w18.net/?p=388"&gt;凭什么是我们&lt;/a&gt;》这篇文章，更是印证了上面这段话。&lt;/p&gt;
&lt;p&gt;为什么我要说上面这段和标题并不沾边的文字呢，实际上现在要发布的日志本来在我看来是非常没有必要的，因为这个项目我已经在 git 上面 fork 并贡献了关于国内相关微博/SNS服务的代码，我以为大家可以通过搜索引擎搜索到，可想还是有人来问我，那好吧，为了减少询问我的次数，以及这篇日志的SEO，我还是写下了这个日志。&lt;/p&gt;
&lt;p&gt;Github 项目地址：https://github.com/icyleaf/ShareKit&lt;/p&gt;
&lt;p&gt;衷心希望这个 fork 的代码对热情开发的人有所帮助！&lt;/p&gt;</summary><category term="iOS"></category></entry><entry><title>如何在开发和发布环境使用 Android Map Key</title><link href="http://icyleaf.com/2011/05/how-to-using-android-map-key-both-in-development-and-production" rel="alternate"></link><updated>2011-05-02T16:56:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2011-05-02:2011/05/how-to-using-android-map-key-both-in-development-and-production</id><summary type="html">&lt;p&gt;在项目中第一次使用并涉及 Google Map 的功能，而由于 Google 的限制，Google Map 模块出来需要单独下载模块之外，对于每一个应用还都必须具有一个 Google Map Key，这点和使用 Web 开发调用 Google Map API 是一致的。&lt;/p&gt;
&lt;p&gt;对于 Android 采用的 Google Map Key 来说，是由一串 MD5 值（类似这样：94:1E:43:49:87:73:BB:E6:A6:88:D7:20:F1:8E:B5:98）生成的。那么这个 MD5 是哪来的呢？&lt;/p&gt;
&lt;p&gt;1. 开发环境的 Google Map Key&lt;/p&gt;
&lt;p&gt;这个比较简单，网上大面积教程所采用的 android 系统默认带有一个 debug.keystore。假如开发使用 Eclipse，在其 windows -&gt; Preference -&gt; Android -&gt; Build 下，其中 Default debug keystore 的值便是 debug.keystore 的路径。&lt;/p&gt;
&lt;p&gt;在命令行或者终端执行下面命令（注意指明 debug.keystore 的路径）即可获取到 MD5 值。&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;keytool&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;keystore&lt;/span&gt; &lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keystore&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;2. 发布环境的 Google Map Key&lt;/p&gt;
&lt;p&gt;假如你的应用需要上线到官方的 Google Market 上面，则需要根据其 apk 的签名证书（keystore）的 MD5 值去生成，方法也很简单，发布的签名同样可以使用 Eclipse 的 Export 工具制作。制作完毕后（或许这个生成的签名没有 .keystore 后缀，不用在意）。同样也使用上面的命令获取其 MD5 值。&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c"&gt;# 比如，证书路径 /home/icyleaf/android/ews&lt;/span&gt;
$ &lt;span class="n"&gt;keytool&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;keystore&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;icyleaf&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;android&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ews&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="c"&gt;#  查询到了 MD5 值&lt;/span&gt;
&lt;span class="n"&gt;Certificate&lt;/span&gt; &lt;span class="n"&gt;fingerprint&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MD5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; 94&lt;span class="p"&gt;:&lt;/span&gt;1&lt;span class="n"&gt;E43&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;49&lt;span class="p"&gt;:&lt;/span&gt;87&lt;span class="p"&gt;:&lt;/span&gt;73&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;BB&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;E6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;A6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;88&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;D7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;20&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;F1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;8&lt;span class="n"&gt;E&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;B5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;98
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;使用其 MD5 值在 &lt;a href="http://code.google.com/android/maps-api-signup.html"&gt;Sign Up for the Android Maps API&lt;/a&gt; 页面填写生成即可。&lt;/p&gt;
&lt;p&gt;接下来的步骤就没什么了，又是搜索出千篇一律的教程，大家 Google 之。&lt;/p&gt;</summary><category term="Android"></category><category term="Google"></category><category term="Map"></category></entry><entry><title>个人常用 OS X 软件集合</title><link href="http://icyleaf.com/2011/03/im-using-osx-software-list" rel="alternate"></link><updated>2011-03-29T23:29:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2011-03-29:2011/03/im-using-osx-software-list</id><summary type="html">&lt;p&gt;用了 OS X
已经半年多了，整理下日常常用的软件。大多数都是开源或者免费软件，少数需要购买&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AppCleaner：卸载软件必备，适合用于第三方安装和 App Store&lt;/li&gt;
&lt;li&gt;aliwangwang：淘宝用户必备&lt;/li&gt;
&lt;li&gt;DiffMerge：文件、文件夹对比的工具，貌似对中文支持有问题（没有细研究）&lt;/li&gt;
&lt;li&gt;Dropbox：改 hosts 还能继续用的多平台文件云同步软件&lt;/li&gt;
&lt;li&gt;DoubanFM：豆瓣电台&lt;/li&gt;
&lt;li&gt;Cdto：可以快速从 Finder 切换当前路径到 terminal 里&lt;/li&gt;
&lt;li&gt;Evernote：笔记整理同步必备&lt;/li&gt;
&lt;li&gt;Facetime：大家都知道，免费版， HD 是收费版&lt;/li&gt;
&lt;li&gt;Firefox：就是一火狐&lt;/li&gt;
&lt;li&gt;FIT：免费开源的 OSX 输入法&lt;/li&gt;
&lt;li&gt;fraise：文本编辑器，个人比较喜欢，比 TextWrangler 好用&lt;/li&gt;
&lt;li&gt;git：SCM 软件&lt;/li&gt;
&lt;li&gt;brew：terminal 下的软件包管理器&lt;/li&gt;
&lt;li&gt;Chrome：浏览网页的神器&lt;/li&gt;
&lt;li&gt;Growl：消息半透明窗提醒，Ubuntu 都模仿&lt;/li&gt;
&lt;li&gt;iOS Simulator Cropper：可以截 iOS 模拟器截图&lt;/li&gt;
&lt;li&gt;iTerm：Cocoa 重写的 Terminal，支持 Linux 下快捷键切换 Tab&lt;/li&gt;
&lt;li&gt;MesaSQLite：SQLite 数据库管理软件&lt;/li&gt;
&lt;li&gt;MPlayerX：视频播放器&lt;/li&gt;
&lt;li&gt;mysql workbench：Mysql 建模软件&lt;/li&gt;
&lt;li&gt;OmniDiskSweeper：磁盘空间使用率情况&lt;/li&gt;
&lt;li&gt;PHPStorm：Jetbrain 的新一神器，PHP IDE（收费）&lt;/li&gt;
&lt;li&gt;PlistEditPro：plist 编辑器&lt;/li&gt;
&lt;li&gt;PowerWord：金山词霸（最新版是 08 年，汗颜）&lt;/li&gt;
&lt;li&gt;Reeder：Google Reader for OSX&lt;/li&gt;
&lt;li&gt;Sequel pro：Mysql 数据库管理软件&lt;/li&gt;
&lt;li&gt;SIMBL&lt;/li&gt;
&lt;li&gt;Simple Comic：漫画软件&lt;/li&gt;
&lt;li&gt;Skitch：处理截图的好工具&lt;/li&gt;
&lt;li&gt;Sparrow：Gmail 客户端&lt;/li&gt;
&lt;li&gt;TextWrangler：又一文本编辑器&lt;/li&gt;
&lt;li&gt;The Unarchiver: 最智能且免费的解压缩软件&lt;/li&gt;
&lt;li&gt;TotalFinder：Finder 增强型工具，强烈推荐（收费）&lt;/li&gt;
&lt;li&gt;VirtualBox：开源虚拟机&lt;/li&gt;
&lt;li&gt;Xcode 4：Apple 开发必备&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;睡觉前的粗略整理，待续...&lt;/p&gt;</summary><category term="Mac"></category><category term="App"></category></entry><entry><title>2010年度总结</title><link href="http://icyleaf.com/2011/01/2010-year-in-review" rel="alternate"></link><updated>2011-01-05T14:42:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2011-01-05:2011/01/2010-year-in-review</id><summary type="html">&lt;p&gt;2011年已至，又到了一年一度的年终终结的时候了。上个星期还和 @&lt;a href="http://cnborn.net"&gt;CNBorn&lt;/a&gt;
同学聊了年终总结的事情，今天在看翻 Google Reader
发现订阅的很多人都写了总结，虽然晚了几步，还得赶紧跟上。提炼过往的一年内所经历的事情，所感受到的一些事物...整体来说
2010 年对我来说是憧憬的一年。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://icyleaf.com/2008/12/30/2008-year-in-review/"&gt;2008&lt;/a&gt; 年是起步并定制计划的一年，&lt;a href="http://icyleaf.com/2010/01/01/2009-year-in-review/"&gt;2009&lt;/a&gt; 年是 2008
年计划沉淀后发挥的一年，2010
年在事业，技术，思想得到了逐步提高，这次总结大致按照性质为工作，技术，生活等几类：&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;工作&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;2010年可谓是 Twitter 年，作为一名从 2007 年就开始使用的轻度用户到现在随时关注的中度用户。之所谓不能说重度用户，现在已经逐渐减少了 Twitter 的牢骚，慢慢的沉淀浮躁的心，做一些自认为有意义的事情。其中最大的也是让我最满意的一件就是通过 Twitter 让我成功的从 Java 转到了 PHP 开发，感谢  @&lt;a href="http://twitter.com/lnsoso"&gt;lnsoso&lt;/a&gt; 给我这个机会。对个人来说，比较遗憾的是在转入 PHP
这一行业之前，曾尝试以移动互联网开发者的身份“杀入”豆瓣，后因逢遇高人 @&lt;a href="http://www.douban.com/people/flycondor/"&gt;flycondor&lt;/a&gt; 告知个人能力有待提高，未遂 &gt;.\&amp;lt;&lt;/p&gt;
&lt;p&gt;虽然没能进入豆瓣，但能转入互联网开发领域已经让人欣喜了，在&lt;a href="http://house.sina.com.cn"&gt;新浪乐居&lt;/a&gt;的一年内，由于公司技术氛围很融洽，经常会在一起讨论一些技术，分享会。给个人有很好的成长空间和发挥能力。同时非常欣喜能遇上这么多好好的同事和领导 :)&lt;/p&gt;
&lt;h3&gt;技术&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;PHP/Kohana&lt;/p&gt;
&lt;p&gt;1. 2009 年提到的 Douban API Package 以开源的形式正式发布到了
&lt;a href="https://github.com/icyleaf/douban"&gt;github&lt;/a&gt; 上面。&lt;/p&gt;
&lt;p&gt;2. &lt;a href="https://github.com/icyleaf/alpaca"&gt;alpaca&lt;/a&gt;
社区系统在整个一年之中虽然没太多的功能增加，但其代码在不断的重构（最近在读&lt;a href="http://book.douban.com/subject/4262627/"&gt;重构&lt;/a&gt;更加确定了重构的重要性）&lt;/p&gt;
&lt;p&gt;3. 学习了一个轻量级的模版引擎框架 &lt;a href="http://www.twig-project.org/"&gt;twig-php&lt;/a&gt;，虽然也是今年开始熟悉 Smarty 的，但是我更喜欢 twig，语义清晰，解析速度迅速，其实框架的灵感来自于 Django 自身的模版系统，而且易于扩展开发。 详情请看作者在最初的&lt;a href="http://fabien.potencier.org/article/34/templating-engines-in-php"&gt;介绍&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;4. gears 项目一个类似于 ROR 下面 Redmine 的项目需求管理系统，由于 PHP 上面没也太好的系统，自己着手开发并熟悉下复杂逻辑的开发，项目尚在开发中，没有源码发布 :(&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JAVA/Android&lt;/p&gt;
&lt;p&gt;在 2010 年的后半年因好奇和对 Google 开源的个人憧憬心态开始对 Android 开发做了一些研究，开始东拼西凑的做了一些小的应用，后被公司看中正式着手一个公司项目的 App，历时近 3 个月，边学习边琢磨边专注 Android 界面设计，在 12 月中旬终于可以缓一口气，并可以拍拍胸脯说这个软件可以在同等行业内软件的用户体验是可以最棒的！当然功能也不差的 :) 不过该项目还没有最后的完成，等待发布吧！
-   Objective-C/iOS&lt;/p&gt;
&lt;p&gt;接触 iOS 开发的时间在 Android 之后，正好在做完一两个 Android 应用的时候拥有的人生的第一台 MacBook Pro，破不急奈的安装了 Xcode 一展其 IDE 和 Interface Builder 的风采，体验完之后傻了，相对于 Android 的界面设计，我真想发泄一下摔些东西。同等的时间在 Android 下只能设计界面，而在 Xcode 里面设计界面只是几分钟的时候（参考&lt;a href="http://developer.apple.com/library/mac/#documentation/UserExperience/Conceptual/AppleHIGuidelines/XHIGIntro/XHIGIntro.html"&gt;Apple HIG&lt;/a&gt;）其余的时间可尽情的编码。于是从头开始学 Objective-C 下一步尝试 iOS 开发。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;另外很高兴成功 &lt;a href="http://www.beijing-open-party.org/"&gt;Beijng Open Party&lt;/a&gt; 活动的志愿者，希望在新的一年中可以努力为 OP 加油&amp;amp;奋斗！&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;数码设备&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Mac Book Pro&lt;/p&gt;
&lt;p&gt;本来是期待身边的朋友购买的，因某人坚持不下，自己集资购入该设备，为今后 iOS 开发打好前期准备。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;BlackBerry 8900&lt;/p&gt;
&lt;p&gt;再一次下定觉得购入了第二台 bb 设备，第一台 8310 走完了它自己人生光辉的一年，主要是被我蹂躏了不成样子了，作为 RIM 公司后期拥有绝对血统的 8900 和 9000，果断入手前者，同时对 @cooku 童鞋当时问她为什么不买 9000 自我推倒- -！&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;iPad&lt;/p&gt;
&lt;p&gt;啊哈，有一个推倒前期自我反对思想的奢侈品，作为一个较长期的苹果用户，其产品具有一定的“洗脑”作用。当然目前 iPad 使用频率最高的是 iBook、Twitter 和浏览器，偶尔玩玩游戏和体验一些有趣的 app。    &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Canon 50mm/1.8f&lt;/p&gt;
&lt;p&gt;第一个也可能是唯一个佳能的镜头，用的次数并不是很多 &gt;.\&amp;lt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;读书&lt;/h3&gt;
&lt;p&gt;书里面水分很多，夹杂了一些曾经看到的漫画和小说，但也阅读了一些有信仰，有深刻含义的图书，比如 1984，动物庄园，切·格瓦拉传，刀锋，不去会死，苹果往事。&lt;/p&gt;
&lt;p&gt;技术图书推荐：Rework(Olivda 合译本)，用户故事，重构，Pro
Git，给大家看的设计书&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://chart.apis.google.com/chart?chs=400x200&amp;amp;cht=bvs&amp;amp;chd=s:CEUEIKSEcIrQ&amp;amp;chxt=y,x,x&amp;amp;chxl=0:|0|5|10|15|20|25|30|1:|1|2|3|4|5|6|7|8|9|10|11|12|2:|month&amp;amp;chxp=2,100&amp;amp;chf=c,lg,90,76A4FB,0.5,ffffff,0|bg,s,EFEFEF&amp;amp;chco=0000ff&amp;amp;chtt=82%20books+you+added+in+year+2010|divided+by+month" /&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;电影&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;这一年的电影可没少看，因总看恐怖片被 @CNBorn 无比鄙视，因此开始计划看完[IMDB Top 250]&lt;a href="[电驴下载][]"&gt;&lt;/a&gt;，起初计划每天一部，逐渐到后来因各种工作或其他事情只能减少频率，啊，现在已经看满编号的第 100 部了（不包括下面已经看过的）！今年继续努力！&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;音乐&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;这方面还是比较随心所欲，没有太大的变动，只不过开始听古典（莫扎特），开始小听下电影的
OST （曾一度在网上搜索关键词写成 OTA）&lt;/p&gt;
&lt;h3&gt;日志&lt;/h3&gt;
&lt;p&gt;好吧，我承认我没有达到去年说的要求：“2010年的日志数量和2009年类似”，刚才统计了结果，发现
2009 年度共计发布了 31 篇日志，而 2010 年加上 09 年的总结在内也仅仅只有 10 篇，数量下降了 1/3 左右，汗颜。今年开始经过会多发布技术相关的日志，早期一些分享软件或框架的内容会少一些，比较不能再这么水下去了...&lt;/p&gt;
&lt;h3&gt;运动&lt;/h3&gt;
&lt;p&gt;很遗憾，2010 年度并没也什么运动了...需要恢复！我要减灰 Orz...&lt;/p&gt;
&lt;h3&gt;言而总之&lt;/h3&gt;
&lt;p&gt;2010 年读了许多书，也看了不少电影，在个人修养上面有很大的提高，早晨 6 点 50 起床是一个长期考验而且我坚持下来了，也算是摆脱了很大的“懒”的坏习惯。今年最大的开发实践准备尝试敏捷开发流程 + TDD以及重构相结合的开发模式双结合。&lt;/p&gt;
&lt;p&gt;新的一年，加油！&lt;/p&gt;</summary><category term="年终总结"></category></entry><entry><title>OSX: Finder 和 Terminal 的切换</title><link href="http://icyleaf.com/2010/12/switer-between-finder-and-terminal-in-osx" rel="alternate"></link><updated>2010-12-08T14:21:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2010-12-08:2010/12/switer-between-finder-and-terminal-in-osx</id><summary type="html">&lt;p&gt;&lt;strong&gt;在 Finder 打开 Terminal 并切换到当前目录&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;安装一个开源的 Finder 辅助工具：&lt;a href="http://code.google.com/p/cdto/"&gt;cdto&lt;/a&gt;。功能只有一个就是实现在 Finder
打开 Terminal 并切换到当前 Finder 目录。找到你系统的版本的 app （支持当前
OS X 10.4 以上版本，应该都是雪豹了 吧）拷贝到 Applications 下并把它拖到
Finder 的工具栏上即可。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;从 Terminal 中用 Finder 打开当前路径的目录&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;open&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;PS，如果是 Ubuntu 系统的话请安装 nautilus，然后在 Terminal 里面输入&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;nautilus&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</summary><category term="Mac"></category><category term="Linux"></category><category term="Shell"></category></entry><entry><title>Ubuntu 解决 public key is not available 问题</title><link href="http://icyleaf.com/2010/11/apt-get-gpg-error-public-key-not-available" rel="alternate"></link><updated>2010-11-03T14:58:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2010-11-03:2010/11/apt-get-gpg-error-public-key-not-available</id><summary type="html">&lt;p&gt;自 Ubuntu 10.04 升级至 10.10 之后，系统就有些不注意的小毛病，包括系统的各个软件的配置文件可能有改动，加上常年累计尝试并添加很多 ppa&lt;/p&gt;
&lt;p&gt;的源，自定义的软件源在升级兼容的考虑下全部金禁用了导致原本软件源的注解名称也没有了，自己不知道各个软件源是干什么的...于是手动在软件源管理（a本放在了 Applications -&gt; Ubuntu Software Center 程序里面 Edit 菜单下面）清理。&lt;/p&gt;
&lt;p&gt;第一开始是凭记忆清理了一部分不再使用的软件的源，退出后更新发现失败...再次清理 Authentication 里面的 Public key，发现还是有问题，最后下定狠心把所有的源和 public key 全部删除了再更新发现还是有错误 T_T 其实错误提示的是一种类型的：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;W: GPG error: http://ppa.launchpad.net jaunty Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 12DE1BCB04E5E17B5&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;自己动手丰衣足食...Google 之发现有两种解决方案，第一个是在 launchpad keyserver 网站搜索 key 从而找到 public
key，详情请看[这里][]。第二种则相对于比较简单：命令行流。&lt;/p&gt;
&lt;p&gt;1. 复制报错的尾部 NO_PUBKEY 后面的串的后 8
位（以上面的为例：4E5E17B5），执行:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;gpg&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;keyserver&lt;/span&gt; &lt;span class="n"&gt;keyserver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ubuntu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;recv&lt;/span&gt; 4&lt;span class="n"&gt;E5E17B5&lt;/span&gt;# 返回信息&lt;span class="n"&gt;gpg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;requesting&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; 4&lt;span class="n"&gt;E5E17B5&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;hkp&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="n"&gt;keyserver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ubuntu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;comgpg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; 4&lt;span class="n"&gt;E5E17B5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;public&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &amp;quot;&lt;span class="n"&gt;Launchpad&lt;/span&gt; &lt;span class="n"&gt;PPA&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chromium&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;daily&lt;/span&gt;&amp;quot; &lt;span class="n"&gt;importedgpg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;ultimately&lt;/span&gt; &lt;span class="n"&gt;trusted&lt;/span&gt; &lt;span class="n"&gt;keys&lt;/span&gt; &lt;span class="n"&gt;foundgpg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Total&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="n"&gt;processed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 1&lt;span class="n"&gt;gpg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;               &lt;span class="n"&gt;imported&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 1  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RSA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 1&lt;span class="p"&gt;)&lt;/span&gt;
$ &lt;span class="n"&gt;gpg&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;export&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;armor&lt;/span&gt; 4&lt;span class="n"&gt;E5E17B5&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;# 返回信息&lt;span class="n"&gt;OK&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;解决！&lt;/p&gt;</summary><category term="ubuntu"></category></entry><entry><title>水果属性概述</title><link href="http://icyleaf.com/2010/09/fruit-properties-overview" rel="alternate"></link><updated>2010-09-25T14:10:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2010-09-25:2010/09/fruit-properties-overview</id><summary type="html">&lt;p&gt;&lt;strong&gt;热性水果&lt;/strong&gt;：适合寒性体质&lt;/p&gt;
&lt;p&gt;榴连、黑枣&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;温性水果&lt;/strong&gt;：适合寒性体质&lt;/p&gt;
&lt;p&gt;芒果、荔枝、桃子、龙眼、红毛丹、水蜜桃、板栗、释迦、椰子肉、金桔、乌梅、樱桃、红枣、&lt;/p&gt;
&lt;p&gt;李子(微温)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;平性水果&lt;/strong&gt;：适合各种体质&lt;/p&gt;
&lt;p&gt;百香果、柠檬、番石榴、酪梨、凤梨、葡萄、莲雾、柳橙、甘蔗、木瓜、橄榄、梅子、印度枣&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;凉性水果&lt;/strong&gt;：适合热性体质&lt;/p&gt;
&lt;p&gt;火龙果、梨、苹果、杨桃、山竹、葡萄柚、草莓、枇杷&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;寒性水果&lt;/strong&gt;：适合热性体质&lt;/p&gt;
&lt;p&gt;蕃茄(微寒)、西瓜、香蕉、奇异果、甜瓜、柚子、橘子、柿子、椰子水、桑椹&lt;/p&gt;</summary><category term="养生"></category></entry><entry><title>Nginx+FastCGI 环境搭建 Kohana</title><link href="http://icyleaf.com/2010/05/nginx-with-fastcgi-build-kohana" rel="alternate"></link><updated>2010-05-31T09:34:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2010-05-31:2010/05/nginx-with-fastcgi-build-kohana</id><summary type="html">&lt;p&gt;Kohana 默认仅对 Apache 环境提供的部署支持，其实对于 Nginx+FastCGI
也是很容易支持的。本文搭建环境是 Ubuntu 10.4 并采用 apt-get
方式安装，喜爱编译的朋友可以自行解决 :)&lt;/p&gt;
&lt;h3&gt;1. 安装 MySQL&lt;/h3&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;安装过程在会提示设置 root 账户的密码，如果是本机测试开发可以留空后稍候设置。&lt;/p&gt;
&lt;h3&gt;2. 安装 Nginx&lt;/h3&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c"&gt;# 安装 Nginx&lt;/span&gt;
$ &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;get&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;nginx&lt;/span&gt;

&lt;span class="c"&gt;# 启动 Nginx&lt;/span&gt;
$ &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;完成上面两步之后，打开浏览器，输入 localhost 或 127.0.0.1 如果看到 &lt;strong&gt;Welcome to Nginx!&lt;/strong&gt; 字样就说明安装成功了，是不是很简单 :)&lt;/p&gt;
&lt;p&gt;注意，如果你的机器上面如果安装了其他 web 容器（比如 Apache，Lighttd等），启动
ngnix 的时候肯定会报错，因为这些 web 容器启动均占用的 80
端口，更改的方法如下：&lt;/p&gt;
&lt;p&gt;编辑 &lt;code&gt;/etc/nginx/sites-available/default&lt;/code&gt; 文件，修改 server 段中的 listen
为 localhost:8080，其中 8080 是更改的监听端口：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;    
    &lt;span class="n"&gt;listen&lt;/span&gt;   &lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;8080&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="n"&gt;server_name&lt;/span&gt;  &lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    # &lt;span class="p"&gt;[...]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;保存后重启 Nginx：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt; &lt;span class="n"&gt;restart&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h3&gt;3. 安装 PHP5&lt;/h3&gt;
&lt;p&gt;&lt;/p&gt;
PHP 在 Nginx 下是通过 FastCGI 模式运行的，使用 Debain 的包管理可以安装
PHP5 和一些必须的（比如，php5-mysql）和可选的扩展（比如，Kohana 要求的
php5-curl，php5-gd，php5-mcrypt），下面前 5
个是必须的，其他可以依据个人需求添加或减少：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;php5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cgi&lt;/span&gt; &lt;span class="n"&gt;php5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt; &lt;span class="n"&gt;php5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;curl&lt;/span&gt; &lt;span class="n"&gt;php5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gd&lt;/span&gt; &lt;span class="n"&gt;php5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mcrypt&lt;/span&gt; &lt;span class="n"&gt;php5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;idn&lt;/span&gt; &lt;span class="n"&gt;php&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pear&lt;/span&gt; &lt;span class="n"&gt;php5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;imagick&lt;/span&gt; &lt;span class="n"&gt;php5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;imap&lt;/span&gt; &lt;span class="n"&gt;php5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;memcache&lt;/span&gt; &lt;span class="n"&gt;php5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mhash&lt;/span&gt; &lt;span class="n"&gt;php5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ming&lt;/span&gt; &lt;span class="n"&gt;php5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pspell&lt;/span&gt; &lt;span class="n"&gt;php5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;recode&lt;/span&gt; &lt;span class="n"&gt;php5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;snmp&lt;/span&gt; &lt;span class="n"&gt;php5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;tidy&lt;/span&gt; &lt;span class="n"&gt;php5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xmlrpc&lt;/span&gt; &lt;span class="n"&gt;php5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xsl&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;安装完毕后，需要编辑 php 的配置：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c"&gt;# 编辑 /etc/php5/cgi/php.ini 文件&lt;/span&gt;
&lt;span class="c"&gt;# 修改 cgi.fix_pathinfo 的值为 1（如果此项被注解掉了，请删除前面的 # 符号）  cgi.fix_pathinfo = 1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;至此 PHP5 已经安装完毕，但是还没有结束，因为我们还没有让它支持 FastCGI
嗯，由于 Debain 包并没有提供单独的 FastCGI 守护程序，因此我们可以使用其他的方式实现，通常使用的是 lighttpd 项目提供的 spawn-fcgi（本文也用的这个，但是它总会出现小毛病，导致 Nginx 服务 Down 掉，稍候也会给出一点解决方案）或者是 &lt;a href="http://php-fpm.org/"&gt;PHP-FPM&lt;/a&gt;（专门为 PHP 提供 FastCGI 进程管理的软件）&lt;/p&gt;
&lt;p&gt;好吧，让我们在安装 lighttpd：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;lighttpd&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;安装完毕后会你发现一些错误信息：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;Starting&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;lighttpd&lt;/span&gt;
2010&lt;span class="o"&gt;-&lt;/span&gt;05&lt;span class="o"&gt;-&lt;/span&gt;31 10&lt;span class="p"&gt;:&lt;/span&gt;44&lt;span class="p"&gt;:&lt;/span&gt;51&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;300&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt;&lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;bind&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 80 &lt;span class="n"&gt;Address&lt;/span&gt; &lt;span class="n"&gt;already&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt;!
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;还是上面提到的重复占用端口的问题，不过由于我们只是使用它的 spawn-fcgi 因此我们可以不让它当作服务启动：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;lighttpd&lt;/span&gt; &lt;span class="n"&gt;remove&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;好了，让我们开启 FastCGI 守护进程：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;spawn&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fcgi&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; 127&lt;span class="p"&gt;.&lt;/span&gt;0&lt;span class="p"&gt;.&lt;/span&gt;0&lt;span class="p"&gt;.&lt;/span&gt;1 &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; 9000 &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;php5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cgi&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;P&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fastcgi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;其中 -a 代表 ip 地址， -p 是进程的端口， -u 是用户， -g 是用户组，-f 是 &lt;code&gt;php5-cgi&lt;/code&gt; 的执行路径，-P 是进程的 pid，可以适当的在后面在加一个 -C 参数，这个数创建的进程数，本机开发的话一般设置在 3 - 5 左右即可（也可以使用 ab 测试以设置适当的进程数，这样可以防止 Nginx 的无辜 Down 掉）&lt;/p&gt;
&lt;p&gt;提示：spawn-fcgi 必须在运行的状况下才能使得 Nginx 支持 PHP
运行，因此可以把上面的启动代码追加到 /etc/rc.local 文件的尾部保存（在 exit
命令之前）。&lt;/p&gt;
&lt;h3&gt;4. 配置 Nginx&lt;/h3&gt;
&lt;p&gt;Nginx 的配置相对比较简单，语法很像 PHP 代码，如果不了解的可以参考这个：&lt;a href="http://wiki.nginx.org/NginxFullExample"&gt;范例1&lt;/a&gt;和&lt;a href="http://wiki.nginx.org/NginxFullExample2"&gt;范例2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;编辑 &lt;strong&gt;/etc/nginx/nginx.conf&lt;/strong&gt; 文件并作如下修改：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;[...]&lt;/span&gt;
&lt;span class="err"&gt;worker_processes&lt;/span&gt;  &lt;span class="err"&gt;5&lt;/span&gt;&lt;span class="c"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;[...]&lt;/span&gt;    
&lt;span class="err"&gt;keepalive_timeout&lt;/span&gt;   &lt;span class="err"&gt;2&lt;/span&gt;&lt;span class="c"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;[...]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;定义虚拟主机的配置项存放在 &lt;code&gt;/etc/nginx/conf.d/&lt;/code&gt; 目录下面，每个虚拟主机配置一个文件并以 .conf 为文件后缀即可，默认是 default，也就是上面修改 Nginx 默认监听端口的文件，这里还要进一步对它配（点击右侧展开）：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;[...]&lt;/span&gt;
&lt;span class="err"&gt;server&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;        
    &lt;span class="err"&gt;listen&lt;/span&gt;   &lt;span class="err"&gt;80&lt;/span&gt;&lt;span class="c"&gt;;        &lt;/span&gt;
    &lt;span class="err"&gt;server_name&lt;/span&gt;  &lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="c"&gt;;        &lt;/span&gt;
    &lt;span class="err"&gt;access_log&lt;/span&gt;  &lt;span class="err"&gt;/var/log/nginx/localhost.access.log&lt;/span&gt;&lt;span class="c"&gt;;        &lt;/span&gt;
    &lt;span class="err"&gt;location&lt;/span&gt; &lt;span class="err"&gt;/&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;                
        &lt;span class="err"&gt;root&lt;/span&gt;   &lt;span class="err"&gt;/var/www/nginx-default&lt;/span&gt;&lt;span class="c"&gt;;                &lt;/span&gt;
        &lt;span class="err"&gt;index&lt;/span&gt;  &lt;span class="err"&gt;index.php&lt;/span&gt; &lt;span class="err"&gt;index.html&lt;/span&gt; &lt;span class="err"&gt;index.htm&lt;/span&gt;&lt;span class="c"&gt;;        &lt;/span&gt;
    &lt;span class="err"&gt;}&lt;/span&gt;

    &lt;span class="err"&gt;location&lt;/span&gt; &lt;span class="err"&gt;/doc&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;                
        &lt;span class="err"&gt;root&lt;/span&gt;   &lt;span class="err"&gt;/usr/share&lt;/span&gt;&lt;span class="c"&gt;;                &lt;/span&gt;
        &lt;span class="err"&gt;autoindex&lt;/span&gt; &lt;span class="err"&gt;on&lt;/span&gt;&lt;span class="c"&gt;;                &lt;/span&gt;
        &lt;span class="err"&gt;allow&lt;/span&gt; &lt;span class="err"&gt;127.0.0.1&lt;/span&gt;&lt;span class="c"&gt;;                &lt;/span&gt;
        &lt;span class="err"&gt;deny&lt;/span&gt; &lt;span class="err"&gt;all&lt;/span&gt;&lt;span class="c"&gt;;        &lt;/span&gt;
    &lt;span class="err"&gt;}&lt;/span&gt;        &lt;span class="err"&gt;l&lt;/span&gt;

    &lt;span class="err"&gt;ocation&lt;/span&gt; &lt;span class="err"&gt;/images&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;                
        &lt;span class="err"&gt;root&lt;/span&gt;   &lt;span class="err"&gt;/usr/share&lt;/span&gt;&lt;span class="c"&gt;;                &lt;/span&gt;
        &lt;span class="err"&gt;autoindex&lt;/span&gt; &lt;span class="err"&gt;on&lt;/span&gt;&lt;span class="c"&gt;;        &lt;/span&gt;
    &lt;span class="err"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;# error_page  404  /404.html;        &lt;/span&gt;
    &lt;span class="c"&gt;# redirect server error pages to the static page /50x.html        &lt;/span&gt;
    &lt;span class="c"&gt;# error_page   500 502 503 504  /50x.html;        &lt;/span&gt;
    &lt;span class="na"&gt;location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;/50x.html {                &lt;/span&gt;
&lt;span class="s"&gt;        root   /var/www/nginx-default;        &lt;/span&gt;
&lt;span class="s"&gt;    }&lt;/span&gt;

    &lt;span class="c"&gt;# proxy the PHP scripts to Apache listening on 127.0.0.1:80       &lt;/span&gt;
    &lt;span class="c"&gt;#location ~ \.php$ {                &lt;/span&gt;
        &lt;span class="c"&gt;#proxy_pass   http://127.0.0.1;        &lt;/span&gt;
    &lt;span class="c"&gt;#}&lt;/span&gt;

    &lt;span class="c"&gt;# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000        &lt;/span&gt;
    &lt;span class="err"&gt;location&lt;/span&gt; &lt;span class="err"&gt;~&lt;/span&gt; &lt;span class="err"&gt;\.php$&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;                
        &lt;span class="err"&gt;fastcgi_pass&lt;/span&gt;   &lt;span class="err"&gt;127.0.0.1:9000&lt;/span&gt;&lt;span class="c"&gt;;               &lt;/span&gt;
        &lt;span class="err"&gt;fastcgi_index&lt;/span&gt;  &lt;span class="err"&gt;index.php&lt;/span&gt;&lt;span class="c"&gt;;                &lt;/span&gt;
        &lt;span class="err"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="err"&gt;SCRIPT_FILENAME&lt;/span&gt;  &lt;span class="err"&gt;/var/www/nginx-default$fastcgi_script_name&lt;/span&gt;&lt;span class="c"&gt;;                &lt;/span&gt;
        &lt;span class="err"&gt;include&lt;/span&gt;        &lt;span class="err"&gt;fastcgi_params&lt;/span&gt;&lt;span class="c"&gt;;        &lt;/span&gt;
    &lt;span class="err"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;# deny access to .htaccess files, if Apache&amp;#39;s document root        # concurs with nginx&amp;#39;s one        &lt;/span&gt;
    &lt;span class="c"&gt;# location ~ /\.ht {                &lt;/span&gt;
        &lt;span class="err"&gt;deny&lt;/span&gt;  &lt;span class="err"&gt;all&lt;/span&gt;&lt;span class="c"&gt;;        &lt;/span&gt;
    &lt;span class="err"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;[...]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;说明下里面的个别参数：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;server_name&lt;/strong&gt; 是虚拟主机的服务器入口名称，可以是 IP 也可以是域名。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;location&lt;/strong&gt; 段，我在 index 追加了 index.php， root 路径是 &lt;code&gt;/var/www/nginx-default&lt;/code&gt; 说明该虚拟主机的根目录在这里。&lt;/p&gt;
&lt;p&gt;最重要的是关于 PHP 部分的 location 段：&lt;strong&gt;\~ \.php\$ {}&lt;/strong&gt;，Nginx 默认没有开启，我们要确保它开启并在 fastcgi_param 一行更改了参数（因为浏览器调用的默认 PHP 解析器无法找到 PHP 脚本）：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;fastcgi_param&lt;/span&gt; &lt;span class="n"&gt;SCRIPT_FILENAME&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;$&lt;span class="n"&gt;fastcgi_script_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;最后确保在 include 和 fastcgi_params 之间隔出几个空格（BUG）&lt;/p&gt;
&lt;p&gt;重启 Nginx，然后编辑一个 info.php 文件：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;// 创建 /var/www/nginx-default/info.php 文件&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;保存后在浏览器访问（比如：http://localhost/info.php 或
http://localhost:8080/info.php)，如看到 phpinfo
的参数页面说明配置安装成功 :)&lt;/p&gt;
&lt;h3&gt;5. 安装&amp;amp;配置 Kohana&lt;/h3&gt;
&lt;p&gt;Kohana 采用的 v3 版本，&lt;a href="http://v3.kohana.cn/guide/tutorials.git"&gt;安装步骤&lt;/a&gt;（本文把 kohana 存放在 &lt;code&gt;/home/icyleaf/php/kohana&lt;/code&gt; 目录）&lt;/p&gt;
&lt;p&gt;添加 Nginx 虚拟主机配置文件：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c"&gt;# 创建 /etc/nginx/conf.d/kohana.conf 文件&lt;/span&gt;
&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;   
    &lt;span class="n"&gt;listen&lt;/span&gt;   &lt;span class="n"&gt;kohana&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;8080&lt;span class="p"&gt;;&lt;/span&gt;  
    &lt;span class="n"&gt;server_name&lt;/span&gt;  &lt;span class="n"&gt;kohana&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   
    &lt;span class="n"&gt;access_log&lt;/span&gt;  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;kohana&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;access&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c"&gt;# define server root path    &lt;/span&gt;
    &lt;span class="k"&gt;set&lt;/span&gt; $&lt;span class="n"&gt;root_path&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;icyleaf&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;kohana&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;     
        &lt;span class="n"&gt;root&lt;/span&gt;   $&lt;span class="n"&gt;root_path&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;       &lt;span class="nb"&gt;index&lt;/span&gt;  &lt;span class="nb"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt; &lt;span class="nb"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="nb"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;htm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!-&lt;/span&gt;&lt;span class="nb"&gt;e&lt;/span&gt; $&lt;span class="n"&gt;request_filename&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;         
            &lt;span class="n"&gt;rewrite&lt;/span&gt; ^&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;$ &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt;?&lt;span class="n"&gt;kohana_uri&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;$1 &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;      
        &lt;span class="p"&gt;}&lt;/span&gt;    
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000  &lt;/span&gt;
    &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt;$ &lt;span class="p"&gt;{&lt;/span&gt;      
        &lt;span class="n"&gt;root&lt;/span&gt;   $&lt;span class="n"&gt;root_path&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;       
        &lt;span class="n"&gt;fastcgi_pass&lt;/span&gt;   127&lt;span class="p"&gt;.&lt;/span&gt;0&lt;span class="p"&gt;.&lt;/span&gt;0&lt;span class="p"&gt;.&lt;/span&gt;1&lt;span class="p"&gt;:&lt;/span&gt;9000&lt;span class="p"&gt;;&lt;/span&gt;       
        &lt;span class="n"&gt;fastcgi_index&lt;/span&gt;  &lt;span class="nb"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;        
        &lt;span class="n"&gt;fastcgi_param&lt;/span&gt;  &lt;span class="n"&gt;SCRIPT_FILENAME&lt;/span&gt;  $&lt;span class="n"&gt;root_path&lt;/span&gt;$&lt;span class="n"&gt;fastcgi_script_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;      &lt;span class="n"&gt;include&lt;/span&gt; &lt;span class="n"&gt;fastcgi_params&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;配置中首先定义了一个变量 \$root_path 指定 Kohana 的源码的路径，对于
Kohana 的 URL rewrite url 重点是 location 段的：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;!&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; $&lt;span class="n"&gt;request_filename&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;    
    &lt;span class="n"&gt;rewrite&lt;/span&gt; ^&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;$ &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt;?&lt;span class="n"&gt;kohana_uri&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;$1 &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;编辑完成后重载 Nginx 配置：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt; &lt;span class="n"&gt;reload&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;至此教程结束，额外说明的是 Kohana 默认的 .htaccess 对 Nginx 无效可有可无
:)&lt;/p&gt;</summary><category term="nginx"></category><category term="PHP"></category><category term="Kohana"></category></entry><entry><title>如何获取 Element 的 XPath [PHP/Javascript]</title><link href="http://icyleaf.com/2010/04/how-to-get-xpath-of-an-element-for-php-and-javascript" rel="alternate"></link><updated>2010-04-02T11:04:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2010-04-02:2010/04/how-to-get-xpath-of-an-element-for-php-and-javascript</id><summary type="html">&lt;p&gt;这两天研究 HTML 的 DOM 需要寻找某个 Element 元素的完整 XPath
路径，由于使用的是 &lt;a href="http://simplehtmldom.sourceforge.net/manual.htm"&gt;PHP Simple HTML DOM Parser&lt;/a&gt;
开源库，这个库类的使用方法几乎兼容 Javascript 的 DOM 语法并附带 DOM
选择器。虽然功能强大但是并不能直接获取 Element 的
XPath。这个怎么办呢，依稀记得 Firebug
有一个功能，选择某个元素在它的控制台可以显示
XPath。嗯，着手实践一下发现不仅可以显示而且还可以复制 XPath。&lt;/p&gt;
&lt;p&gt;于是想，如果可以找到 Javascript 版的相关代码就一定可以改成 PHP
版本的，结果在 Google 搜索找到了...&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;elt&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;table&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;xpath&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getElementXPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;elt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="n"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xpath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;Get&lt;/span&gt; &lt;span class="n"&gt;full&lt;/span&gt; &lt;span class="n"&gt;XPath&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;element&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getElementXPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;elt&lt;span class="p"&gt;){&lt;/span&gt;  
    &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &amp;quot;&amp;quot;&lt;span class="p"&gt;;&lt;/span&gt;   
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(;&lt;/span&gt; &lt;span class="n"&gt;elt&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;elt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nodeType&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; 1&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;elt&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;elt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parentNode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   
    &lt;span class="p"&gt;{&lt;/span&gt;        
        &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getElementIdx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;elt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;        
        &lt;span class="n"&gt;xname&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;elt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tagName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;     
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; 1&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;xname&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt; &amp;quot;&lt;span class="p"&gt;[&lt;/span&gt;&amp;quot; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &amp;quot;&lt;span class="p"&gt;]&lt;/span&gt;&amp;quot;&lt;span class="p"&gt;;&lt;/span&gt;       
        &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &amp;quot;&lt;span class="o"&gt;/&lt;/span&gt;&amp;quot; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;xname&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   
    &lt;span class="p"&gt;}&lt;/span&gt; 
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;Get&lt;/span&gt; &lt;span class="n"&gt;Idx&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;element&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getElementIdx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;elt&lt;span class="p"&gt;){&lt;/span&gt;    
    &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 1&lt;span class="p"&gt;;&lt;/span&gt;    
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;sib&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;elt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;previousSibling&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;sib&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;sib&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;previousSibling&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    
    &lt;span class="p"&gt;{&lt;/span&gt;        
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nodeType&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; 1 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;sib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tagName&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;elt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tagName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;    
    &lt;span class="p"&gt;}&lt;/span&gt;        
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;PHP 改进版：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;// Use it before import PHP Simple HTML DOM Parser&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;file_get_html&lt;/span&gt;&lt;span class="p"&gt;(&amp;#39;&lt;/span&gt;&lt;span class="nl"&gt;http:&lt;/span&gt;&lt;span class="c1"&gt;//www.google.com/&amp;#39;);&lt;/span&gt;

&lt;span class="c1"&gt;// find a sample element by id&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;elt1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&amp;#39;#&lt;/span&gt;&lt;span class="n"&gt;footer&lt;/span&gt;&lt;span class="p"&gt;&amp;#39;,&lt;/span&gt; &lt;span class="mh"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// find a sample element by tag name&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;elt2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;#39;,&lt;/span&gt; &lt;span class="mh"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// it will return if found it: [@id=&amp;quot;footer&amp;quot;] &lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;xpath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getElementXPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;elt1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// it will return if found it: html/body/div[10] &lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;xpath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getElementXPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;elt2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getElementXPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;elt&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;    
    &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;&amp;#39;&amp;#39;;&lt;/span&gt;  
    &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;TRUE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   
    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;elt&lt;/span&gt; &lt;span class="no"&gt;AND&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;elt&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;nodetype&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mh"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;elt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;elt&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; 
    &lt;span class="p"&gt;{&lt;/span&gt;        
        &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;xname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;elt&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;      
        &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getElementIdx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;elt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;           
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="no"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;elt&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;[&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;&amp;#39;]))&lt;/span&gt;      
        &lt;span class="p"&gt;{&lt;/span&gt;            
            &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;&amp;#39;&lt;/span&gt;&lt;span class="c1"&gt;//*[@id=&amp;quot;&amp;#39; . $elt-&amp;gt;attr[&amp;#39;id&amp;#39;] . &amp;#39;&amp;quot;]&amp;#39;;           &lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;      
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mh"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;       
        &lt;span class="p"&gt;{&lt;/span&gt;            
            &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;xname&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;[&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;]&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;      
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;xname&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;             
        &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;FALSE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getElementIdx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;elt&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;    
    &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    
    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;sib&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;elt&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;prev_sibling&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;sib&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;sib&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;sib&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;prev_sibling&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;    
    &lt;span class="p"&gt;{&lt;/span&gt;        
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;sib&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;nodetype&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mh"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;sib&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;elt&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;        
        &lt;span class="p"&gt;{&lt;/span&gt;         
            &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;        
        &lt;span class="p"&gt;}&lt;/span&gt;    
    &lt;span class="p"&gt;}&lt;/span&gt;        
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;大家同样可以把上面的代码直接 crack 到 PHP Simple HTML DOM Parser 库中。&lt;/p&gt;</summary><category term="PHP"></category><category term="Javascript"></category></entry><entry><title>Douban API Package 发布！</title><link href="http://icyleaf.com/2010/01/douban-api-package" rel="alternate"></link><updated>2010-01-08T09:30:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2010-01-08:2010/01/douban-api-package</id><summary type="html">&lt;p&gt;Douban API Package 是一个使用 PHP 开发且基于 Kohana v3 开发的一个扩展（Module）。&lt;/p&gt;
&lt;p&gt;它对&lt;a href="http://www.douban.com/"&gt;豆瓣&lt;/a&gt; &lt;a href="http://www.douban.com/service/apidoc/"&gt;API&lt;/a&gt; 进行重新封包。它使用起来非常方便，可以快速开发一个 web 应用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;为什么要另外封包？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;对，豆瓣官方提供了一种 PHP 的解决方案，可是需要庞大的支持库：GData（20M左右）以及可能无法修改的环境配置（租用的空间主机会遇到这样的问题）。虽说 Douban API Package 也是基于框架开发，不过 Kohana 是一个纯 PHP5 模式且体积小巧（仅有 478KB），优秀迅捷的框架。&lt;strong&gt;最重要的是&lt;/strong&gt;，Douban API Package 提供了目前官方所有功能的支持。并有线上网站：&lt;a href="http://modou.us/"&gt;魔豆&lt;/a&gt; 和&lt;a href="http://modou.us/console"&gt;豆瓣 API 控制台&lt;/a&gt;长期运营。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;虽然它是基于 Kohana 框架开发，但是并没有使用太多的依赖，稍微熟悉可以轻松分离出来！&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;安装需求&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PHP 5.2+ with curl module&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/kohana/kohana"&gt;Kohana v3&lt;/a&gt; - 一款纯 PHP 5
    框架，它的特点就是&lt;strong&gt;高安全性&lt;/strong&gt;，&lt;strong&gt;轻量级代码&lt;/strong&gt;，&lt;strong&gt;容易使用&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;安装步骤&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;步骤 0: 部署 Kohana v3&lt;/p&gt;
&lt;p&gt;下载并安装 Kohana v3 的过程，请大家参考此教程：&lt;a href="http://kohanaphp.cn/guide/tutorials.git"&gt;使用 Git 部署 Kohana 系统&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;步骤 1: 下载本扩展!&lt;/p&gt;
&lt;p&gt;你可以在部署完毕的 Kohana 系统的根目录执行下面操作：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;submodule&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;icyleaf&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;douban&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;douban&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;完成！&lt;/p&gt;
&lt;p&gt;或者你也可以从本&lt;a href="http://github.com/icyleaf/douban"&gt;github 项目&lt;/a&gt; 下载压缩包放置在 modules 文件夹下面。&lt;/p&gt;
&lt;p&gt;步骤 2: 在 &lt;code&gt;bootstrap.php&lt;/code&gt; 文件中启用该模块(默认情况下，存储在 &lt;code&gt;application&lt;/code&gt; 文件夹)&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;/**&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;Enable&lt;/span&gt; &lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Modules&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;referenced&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;relative&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="n"&gt;absolute&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Kohana&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;     
    &lt;span class="p"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;douban&lt;/span&gt;&lt;span class="p"&gt;&amp;#39;&lt;/span&gt;        &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;MODPATH&lt;/span&gt;&lt;span class="p"&gt;.&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;douban&lt;/span&gt;&lt;span class="p"&gt;&amp;#39;,&lt;/span&gt;     &lt;span class="c1"&gt;// Douban API Module    // &lt;/span&gt;
    &lt;span class="p"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="p"&gt;&amp;#39;&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;MODPATH&lt;/span&gt;&lt;span class="p"&gt;.&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="p"&gt;&amp;#39;,&lt;/span&gt;   &lt;span class="c1"&gt;// Database access    // &lt;/span&gt;
    &lt;span class="p"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;&amp;#39;&lt;/span&gt;      &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;MODPATH&lt;/span&gt;&lt;span class="p"&gt;.&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;&amp;#39;,&lt;/span&gt;      &lt;span class="c1"&gt;// Image manipulation    // &lt;/span&gt;
    &lt;span class="p"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;orm&lt;/span&gt;&lt;span class="p"&gt;&amp;#39;&lt;/span&gt;        &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;MODPATH&lt;/span&gt;&lt;span class="p"&gt;.&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;orm&lt;/span&gt;&lt;span class="p"&gt;&amp;#39;,&lt;/span&gt;        &lt;span class="c1"&gt;// Object Relationship Mapping (not complete)    // &lt;/span&gt;
    &lt;span class="p"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;pagination&lt;/span&gt;&lt;span class="p"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;MODPATH&lt;/span&gt;&lt;span class="p"&gt;.&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;pagination&lt;/span&gt;&lt;span class="p"&gt;&amp;#39;,&lt;/span&gt; &lt;span class="c1"&gt;// Paging of results    // &lt;/span&gt;
    &lt;span class="p"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;paypal&lt;/span&gt;&lt;span class="p"&gt;&amp;#39;&lt;/span&gt;     &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;MODPATH&lt;/span&gt;&lt;span class="p"&gt;.&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;paypal&lt;/span&gt;&lt;span class="p"&gt;&amp;#39;,&lt;/span&gt;     &lt;span class="c1"&gt;// PayPal integration (not complete)    // &lt;/span&gt;
    &lt;span class="p"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;todoist&lt;/span&gt;&lt;span class="p"&gt;&amp;#39;&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;MODPATH&lt;/span&gt;&lt;span class="p"&gt;.&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;todoist&lt;/span&gt;&lt;span class="p"&gt;&amp;#39;,&lt;/span&gt;    &lt;span class="c1"&gt;// Todoist integration    // &lt;/span&gt;
    &lt;span class="p"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;&amp;#39;&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;MODPATH&lt;/span&gt;&lt;span class="p"&gt;.&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;&amp;#39;,&lt;/span&gt;   &lt;span class="c1"&gt;// Unit testing    // &amp;#39;codebench&amp;#39;  =&amp;gt; MODPATH.&lt;/span&gt;
    &lt;span class="p"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;codebench&lt;/span&gt;&lt;span class="p"&gt;&amp;#39;,&lt;/span&gt;  &lt;span class="c1"&gt;// Benchmarking tool    &lt;/span&gt;
&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;目录结构&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;douban&lt;/span&gt; 
   &lt;span class="o"&gt;+---&lt;/span&gt; &lt;span class="n"&gt;classes&lt;/span&gt;         
            &lt;span class="o"&gt;+---&lt;/span&gt; &lt;span class="n"&gt;controller&lt;/span&gt;               # 豆瓣样例         
                    &lt;span class="o"&gt;+---&lt;/span&gt; &lt;span class="n"&gt;douban&lt;/span&gt;                   # &lt;span class="n"&gt;Douban&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="n"&gt;Package&lt;/span&gt;               
                            &lt;span class="o"&gt;+---&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;               # &lt;span class="n"&gt;Douban&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt;                
                            &lt;span class="o"&gt;+---&lt;/span&gt; &lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt;          # &lt;span class="n"&gt;Douban&lt;/span&gt; &lt;span class="n"&gt;Core&lt;/span&gt;            
                            &lt;span class="o"&gt;+---&lt;/span&gt; &lt;span class="n"&gt;oauth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt;         # &lt;span class="n"&gt;Douban&lt;/span&gt; &lt;span class="n"&gt;OAuth&lt;/span&gt;                
                            &lt;span class="o"&gt;+---&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt;       # &lt;span class="n"&gt;Douban&lt;/span&gt; &lt;span class="n"&gt;Requset&lt;/span&gt;                 
                            &lt;span class="o"&gt;+---&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt;      # &lt;span class="n"&gt;Douban&lt;/span&gt; &lt;span class="n"&gt;Response&lt;/span&gt;         
                    &lt;span class="o"&gt;+---&lt;/span&gt; &lt;span class="n"&gt;douban&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt;               # &lt;span class="n"&gt;Douban&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="n"&gt;Class&lt;/span&gt;  
   &lt;span class="o"&gt;+---&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;         
            &lt;span class="o"&gt;+---&lt;/span&gt; &lt;span class="n"&gt;douban&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt;               # 豆瓣 &lt;span class="n"&gt;API&lt;/span&gt; 配置文件         
            &lt;span class="o"&gt;+---&lt;/span&gt; &lt;span class="n"&gt;user_agents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt;          # 奉送给大家一些手机 &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; 配置文件  
   &lt;span class="o"&gt;+---&lt;/span&gt; &lt;span class="n"&gt;media&lt;/span&gt;         
            &lt;span class="o"&gt;+---&lt;/span&gt; &lt;span class="n"&gt;images&lt;/span&gt;                   # 奉送给大家豆瓣 &lt;span class="n"&gt;API&lt;/span&gt; 用到的图像        
   &lt;span class="o"&gt;+---&lt;/span&gt; &lt;span class="n"&gt;vendor&lt;/span&gt;         
            &lt;span class="o"&gt;+---&lt;/span&gt; &lt;span class="n"&gt;OAuth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt;                # &lt;span class="n"&gt;OAuth&lt;/span&gt; 官方推荐 &lt;span class="n"&gt;PHP&lt;/span&gt; 库  
            &lt;span class="o"&gt;+---&lt;/span&gt; &lt;span class="n"&gt;LICENSE&lt;/span&gt;  
   &lt;span class="o"&gt;+---&lt;/span&gt; &lt;span class="n"&gt;README&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;markdown&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;快速上手&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Douban API Package 提供一些演示用例，系统部署完毕后可以通过&lt;code&gt;http://host/demo_douban&lt;/code&gt; 访问。&lt;/p&gt;
&lt;p&gt;文件路径：&lt;code&gt;classes/controller/douban_demo.php&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;源码库：&lt;a href="http://github.com/icyleaf/douban"&gt;http://github.com/icyleaf/douban&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;祝你开发顺利！&lt;/p&gt;
&lt;p&gt;如果任何疑问或者 Bugs 反馈，即可以在本项目中提交 Issue
或者给我发邮件：icyleaf.cn囧gmail.com （请替换 "囧" 为 @）&lt;/p&gt;</summary><category term="PHP"></category><category term="豆瓣"></category></entry><entry><title>2009年度总结</title><link href="http://icyleaf.com/2010/01/2009-year-in-review" rel="alternate"></link><updated>2010-01-01T02:15:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2010-01-01:2010/01/2009-year-in-review</id><summary type="html">&lt;p&gt;忙碌了一天下来，刚打开电脑看着 twitter 刷出来的消息发觉已经到了 2010 年。回顾去年的那篇&lt;a href="http://icyleaf.com/2008/12/30/2008-year-in-review/"&gt;年度总结&lt;/a&gt;感受颇多，年度总结这玩意对于自己来说算是一次思维的整理和归档。就算度过了没有硬性计划的 2009 年总结还是多少要写一些。&lt;/p&gt;
&lt;p&gt;回顾整个 2009 年做的事情，发现其中一些持续的事情是在完善 2008 年度的计划：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;通过维护一个 PHP5 的轻量级开源框架 Kohana 的中文化社区，开始深层次的了解和读懂一个框架的逻辑和模式；通过参加一年的 OpernParty 开源社区的活动，（不完全）吸收了很多新鲜养分。&lt;/li&gt;
&lt;li&gt;成立 &lt;a href="http://kohana.cn"&gt;Kohana 中文社区&lt;/a&gt;已经有一年多的时间也经历了很多：成功完成了对其&lt;a href="http://khnfans.cn/docs"&gt;中文文档&lt;/a&gt;的翻译工作；不断向社区提交和共享代码。然而对于社区的运营也感受颇多，虽然过程是辛苦的，但是我很欣慰。同时还得感谢&lt;a href="http://iiiorz.net"&gt;非正常非人类&lt;/a&gt;，e6nian，&lt;a href="http://codeigniter.org.cn"&gt;Codeigniter中国&lt;/a&gt;老大 Hex，daqing 对 Kohana 和我的支持！&lt;/li&gt;
&lt;li&gt;2009年读了一些各种各样的书，这些书都是我以前几乎没有涉及过的种类。其中一大部分（感谢 &lt;a href="http://cnborn.net"&gt;CNBorn&lt;/a&gt;的推荐）得益于公司搬家，使得上下班几乎有两个小时的闲余时间，很多书籍都是在这段时间消灭的。以后还会继续读更多值得看的书，书再多还是不嫌多的。&lt;/li&gt;
&lt;li&gt;2009年度入手了三个数码产品：iPod Touch ，Canon 450D 和 DELL 2209WA。正式成为 Apple 使用用户和摄影爱好者。&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2008年的那些项目都难产掉了，2009年又有一些项目脚踏实地的进行着：&lt;a href="http://icyleaf.com/2009/06/22/modou/" target="_self"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://icyleaf.com/2009/06/22/modou/"&gt;魔豆&lt;/a&gt;：一个用于移动终端，手持设备的非官方版豆瓣网移动版本。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://icyleaf.com/2009/07/06/douban-api-console/"&gt;豆瓣 API控制台&lt;/a&gt;：魔豆附属项目，开发豆瓣 API 的辅助工具，仅适用于
    Firefox。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kohana.cn"&gt;Aplaca&lt;/a&gt;：一个轻量级的基于 Kohana v3
    开发的论坛系统（目前已上线，因为在开发中暂无发布）。&lt;/li&gt;
&lt;li&gt;Douban API
    Package：这是一个重构版本，最近一直在测试和写测试用例，近期会以开源协议的形式发布。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;新疆出差游：得益于 090705 事件造成那个地区封锁了网络，又因公司项目的事情前去出差，第一次坐灰机，第一次跑那么远的地方。详情请参见&lt;a href="http://icyleaf.com/2009/11/18/xinjiang-yaxin-diary-1/"&gt;系列游记&lt;/a&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;随着寻找各种北京美食，加上工作的性质，对于运动少了许多，今年之中抽出了不少的周末参与到户外运动之中，即活动了筋骨，也提高了身体机能，还能认识很多驴友和漂亮的风景何乐而不为呢。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;总结完毕发现今年的日志数量急剧下降，或许以后的年度日志数量也会在这个数量左右徘徊，随着时间的推移，心智愈加成熟（自我感觉），心要慢慢的静下来（不能在浮躁了）深层次的学习一些技能，继续英语的学习和适当的户外运动，可能的话计划去某个地方游玩。再有就是不能把
2009 年的最大的遗憾留在今年，继续加油！&lt;/p&gt;
&lt;p&gt;UPDATE: 最大的遗憾在 2010 年初已经完美 :)&lt;/p&gt;</summary><category term="年终总结"></category></entry><entry><title>新疆随笔之五</title><link href="http://icyleaf.com/2009/11/xinjiang-diary-5" rel="alternate"></link><updated>2009-11-26T09:30:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2009-11-26:2009/11/xinjiang-diary-5</id><summary type="html">&lt;p&gt;11月02日以后，基本上工作就忙完了，于是 04 日我准备一次暴走扫街，活动地点是市中心，人民广场附近以及红山公园南邻的人民公园。去那边坐的还是前往二道桥大巴扎的公交车，嗯，看来是热点线路，怪不得人那么的多。在上面的随笔我应该说过乌市是一个很现代化的城市，整个乌市和其他大城市没什么太大的差别，也就有一个区域是维族居住生活区。所以来到了人民广场对于周围的环境一点都不陌生，到处高楼大厦，商场一座座，虽然天有点凉，但是人很是很多，一点也看不出来那天是星期三，我直接避开了繁华的路段，转走些小巷细路的。也没发现太多的东西，嗯，可能这附近还是太大众化了，而且还有王府井...偶尔会有些卖囊的和大面积的买葡萄干之类的干活摊位。&lt;/p&gt;
&lt;p&gt;其实那天的天气特别的糟糕，那个天气真想让我骂人，于是开始想是否买个 CPL 会好一些，接着开始询问附近是否有器材城，果不其然，闹市中必有所需，离我不远处正好有一个赛博电脑城，一进去就感觉整个市场就像菜市场一样混乱，但是并没有像海龙那样狗皮膏药的烦你。好不容易找到一家佳能店（奇怪，大多数的DSLR都是尼康的），问了一下，价格小贵，张口就是 180 元，不过一看都是肯高的，心里就有些没底，据说这东西假货居多，而且防伪已经换了不下 10 编了，有没有互联网，谁知道到底是真的假的，真的还好，如果是假的，我也总不能从北京再跑回去吧，琢磨了半天还是没买。不过回来之后听 CNBorn 说这样的鬼天气用 CPL 是没用的。呃，俺的相机至今也就一个配件：UV。主要保护镜头而已，嘿嘿。呃，跑题了...&lt;/p&gt;
&lt;p&gt;那天只顾四处转，不知道哪了就看地图，一点也没有留意时间，转到哪是哪，累了就休息。我的第一个休息点是位于解放南路和北路交口附近的汗腾格里大寺。貌似这边开始就是维族区了，因为我在通过地下通道见到了都是维族乞丐以及路道两边都是维族人的摊位，而且不说汉语。因此我遇见了一个可爱的维族小女孩：身袭火红的外套，一路小跑的就跑过我的眼前，坐到了我的旁边。迅速抓起相机，调整焦距，对焦，按下快门，于是就抓拍到了小女孩的第一张照片。不过这样也被小女孩吸引到了，于是同时我也想办法去吸引她，留住她。这一交谈不要紧，果然又是满口的维语。没办法，我开始使用重复口语回答，比划，给她看我拍的照片，让她玩我的相机，算是暂时不跑开了，刚开始小女孩还有些不适应，到后来越来越有镜头感。这也是我来新疆后最满意的一部分。&lt;/p&gt;
&lt;p&gt;不过小女孩还是呆不住的，玩了一会就跑到大寺一层的商场里（哈，熟悉吧，大巴扎的清真寺一层也是商场，好怪异哦），我也休息的差不多了，准备去对面的新华书店找找旅游的书看看乌市还有些什么好玩的地方。说道看书，我这里岔题下，之前有去过市图书馆（离我住宿的地方很近），临时进入，需要投放一元钱，然后会给你一个临时卡，进入到各层之后就发现，馆藏的图书甚少，而且借书还有年费，不过里面人还是蛮多的，还有专门的维文藏馆。但是最重要的是自习室好多美女哦，我还趁机搭讪了一把，哈哈～这些我信了新疆出美女这句话。咱们再把话题转回新华书店，进入需要存包，无论是家乐福超市还是这里，就算是封闭的背包也需要存，当开始由于我手拿着相机进入的，误被人当成了记者，不过回头想想也是，身穿的这身行头，再配个单反相机，还真可能在非帝都，魔都这样的城市误解（以前在天津的时候也有被人误当成记者...）。由于我把寄存的话会不安全，我也不放心，还是垂头丧气的出了书店。闹市！必有士兵巡逻把守，最重要的是我看到了一个很帅气的武警站岗，刚开始我踱步看着他走了过去，心里不甘，于是又折回走到武警身边向他说明了情况（给他拍相），估计他也把我当记者了还是很热心肠，走到了防暴盾牌中间，摆出了帅气的姿势，等待我的拍照，娃哈哈～&lt;/p&gt;
&lt;p&gt;拍完之后，我的计划准备走前往人民公园（见上路线图从大寺到人民公园的路程），这段路程是最长而且也是让我最迷茫的路程，地图看了半天找不到走到了哪里，所以绕了一些地方，不过我发现我走到人民公园的那些路段都是繁华路段，到处商场一座座，人来人往，兵来兵往的。向西走的这些路段都是汉族区，所以让我比较郁闷，即使到了一个很大型的服装批发集散地，也找不到一点点的维族服装...本还想可以买几顶小方帽呢，集散地的西边尽头就是人民公园，不过在那边并没有找到公园的入口，问路人，他们说不远处有个缺口走进去就行了，呃...看来这也是一个不收费的公园，果不其然，这座公园并没有太多的人，也许跟天气有关系，因为我从图书馆仅有的一点资料了解到，这边公园会有群众载歌载舞。看来我来的时候正好错过了，到处都是光秃秃。转了很大一圈发现真的没什么的东西就回去找地方吃饭。谁知道让我走到了红山公园才能看到一个回去的公交车站...&lt;/p&gt;
&lt;p&gt;本次随笔到此结束，留下最后一部分作为美食的简单汇总。&lt;/p&gt;
&lt;p&gt;如果觉得今天的文字太枯燥，看看下面的石榴解解馋&lt;/p&gt;</summary><category term="旅行"></category><category term="游记"></category></entry><entry><title>新疆随笔之四</title><link href="http://icyleaf.com/2009/11/xinjiang-yaxin-diary-4" rel="alternate"></link><updated>2009-11-24T09:30:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2009-11-24:2009/11/xinjiang-yaxin-diary-4</id><summary type="html">&lt;p&gt;就在清真寺旁边有一道短街有好几家当地的新疆维族饭馆，来回转了几圈，看看这家看看那家犹豫不定，不知道是吃手抓饭好呢，还是烤串，烤馕这些的好，突然看见有家是在外面放的一个大锅，一边架子放着带肉的羊骨头，锅里是翻滚的红红的汤，看着新鲜和卖家比划了几下，说要一碗尝尝（汉语也不是很熟练），然后进了里屋，哇，里面坐满了维族人，操着维语不知道在谈论些什么。然而他们的目光大多投向了手持相机的我，心里有些胆怯，找了一个小角落坐了下面重新打量四周，内部也是常见的清真的建筑风格，看来我来到店家还挺不错，而且价格也非常的便宜。不一会一份看着不咋地的饭端了上来，嗯，这应该是囊包肉，看来也不想其他非新疆城市做的那么好看，里面有南瓜，囊，和羊骨头肉，不过还不赖，汤浓肉劲，一会功夫一碗就被我消灭掉了。噢！差点忘记交代，本来想要一份酸奶的，可惜卖家告诉我这个只有早上才有的，但是我在其他地方吃过，味道和乌鲁木齐驻京办事处的差不多，只不过盛酸奶的容器和勺子并没那么精致。&lt;/p&gt;
&lt;p&gt;最后给大家看一下这家位处国际市集大巴扎旁边饭馆的菜单价格：&lt;/p&gt;
&lt;p&gt;趁着吃完饭，看着小伙计在炒手抓饭，抓拍的几张，然后正好被老板看到，和我叽哩咕嘟的说了一通，当开始以为是不让拍呢，搞了半天才明白，原来是让我给他的小伙计拍一张，于是就有了下面这张照片：&lt;/p&gt;
&lt;p&gt;烤串，这样串串分三种，一种是常见的竹签，一种是粗树枝（乌鲁木齐驻京办事处也是），一种是木边的金属串：&lt;/p&gt;
&lt;p&gt;啊，还有新疆特有的囊，嗯，这个烤馕的烤具和我们家乡烙火烧的家什一样，这个拍的是肉囊（6元一个）：&lt;/p&gt;
&lt;p&gt;美食拍的差不多了，就开始在大巴扎的外围四周溜达，过程中认识一个外地游客的老乡，说是老乡实际上就是想互相拍个照，反正没事一起走走吧，于是就有了下面这张照片，这张是那个老乡（应该有40 岁左右了吧）找到当地的保安合影的。&lt;/p&gt;
&lt;p&gt;转来转去这附近也就集市，观光塔和清真寺，后者进门都是收费的，现在是反季，门票都是 10元，我都没有进去，观光塔其实并不高，而且外面宣传的太邪乎；清真寺更搞，一层居然是商场，二层以上才是清真寺，由于不能拍照和在做礼拜，无法进去。最后就站在公交车站，手持地图寻找下一个目标。经过询问，还真巧，正好问着一个导游，据他说，乌市市区除了这里（大巴扎）就只有红山公园可以看看，因为那里可以俯瞰整个乌市，询问好路线，顺便抓拍了一张当时的路面状况就撤离了这里。&lt;/p&gt;
&lt;p&gt;在找另外一个公交车站时，经过地下通道拍到的，嗯，也和北京差不多，过道两边摆的小摊位和零星的乞讨者。以及路边看到的唯一一家卖葡萄干的老大爷，于是我也顺便买了些，嗯，购买的时候又遇到了语言障碍...&lt;/p&gt;
&lt;p&gt;买完葡萄干后发现做公交车的零钱花掉了...哈，居然这都给忘记了，看到二道桥商场旁边有个大棚的市场，心想买些小玩意换些零钱，这不买不知道，居然让我知道了惊天的秘密！为什么这么说呢，对于一个外地人又没有经过了解就过来玩，对于这边的物价是毫无概念的，尤其是整改后面向国际的大巴扎。其实对面的大棚卖的东西和大巴扎里面的是一模一样的，买纯羊毛的东西，卖家上来也是掏出打火机去燎一点边（不明白的见上面随笔三），而且可能大棚的卖家不是本地人，我知道内幕的那家卖家是山西（还是陕西的？），&lt;strong&gt;我买了 3 个纯羊毛的围巾，经过砍价后居然 120 元就买到了！之前一件就花了我 80 元。天啊！这是何等的利润啊！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;买完这几件后手里就只剩下几块的交通费了，而且东西还蛮多蛮沉的，于是先回了趟宾馆放东西然后在去的红山公园（公交车只有不到 10 站地），说来不行，这要我外出的那几天天气一直的不好，尤其是到午后的时间，整个天空弥漫着一层似烟似雾的障碍物，就和北京的天气一样恶心。公园没有入园门票，但院内的其他部分地方和设施是单向收费的（寺庙，远眺楼，摩天轮，以及各种娱乐小项目），其实这样蛮好，可惜北京人太多，否则我想应该也会是这样的模式。进去之后人并不是很多，其实这个时候天气也算是蛮凉的了，大多数的娱乐项目都已经关闭，湖面也是干涸的。我就四处溜达了一圈，跑到远眺楼上面呆了一会，里面没什么东西，乌市包括亚心的介绍性文字，和大量的图片（新旧城市对比）。&lt;/p&gt;
&lt;p&gt;在回去的时候，看到有一群人在拍照（经询问是给合唱团拍外景），我就凑了过去和摄影师的助理聊上了，他说一般每年的 5 月中下旬和 10 月初来新疆玩是最好的，当然是说周边的风景区，市里实在没什么大多的东西，喀什稍微好些，市里的古建筑更多一些，好像从乌市到喀什坐飞机还得1个多小时。然后有说了一串串让我记不住的风景区的名字还让我看了他们拍的照片，那叫一个美啊...有兴趣的朋友们可以去那个助理给我推荐的新疆天山网（由于疆内的网络还是封锁的，大家可以等开网了之后去看看），这是一个当地的门户网站，里面有一些关于旅行的活动可以参加。&lt;/p&gt;
&lt;p&gt;告别了他们之后，我也结束了今天的行程，打道回府（实际上是去吃夜市了，这个我准备放在随笔的最后一节写一些关于新疆美食的总结吧）。今天的随笔就到这样，让大家等候多时了，希望这部分的随笔还能让大家满意
:)&lt;/p&gt;
&lt;p&gt;明天的随笔是暴走扫街！想知道我都拍到了什么吗？哈哈，下回书接着记录。&lt;/p&gt;</summary><category term="旅行"></category><category term="游记"></category></entry><entry><title>新疆随笔之三</title><link href="http://icyleaf.com/2009/11/xinjiang-yaxin-diary-3" rel="alternate"></link><updated>2009-11-20T09:30:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2009-11-20:2009/11/xinjiang-yaxin-diary-3</id><summary type="html">&lt;p&gt;幸好我们的客户是中国移动，人家休息了我们也可以放松一下。 10 月 31
日（星期六），我耐不住性子抓上相机勇敢的出门了。出门前还是到酒店的前台确认了一下外出是否有生命危险，呃，比较没经历过嘛...买了一份带有
公交路线的地图，前往了今天的第一站，乌市最有特色的维族区市集--大巴扎。&lt;/p&gt;
&lt;p&gt;大巴扎位于城中心偏南的二道桥，其中“巴扎”在维语里就是集市的意思，它是新疆商业与旅游繁荣的象征，也是乌鲁木齐作为少数民族城市的景观建筑，又是一座标志性建筑。国际大巴扎具有浓郁的伊斯兰建筑风格，在涵盖了建筑的功能性和时代感的基础上，重现了古丝绸之路的繁华，集中体现了浓郁西域民族特色和地域文化（以上文字描述摘自网络）。&lt;/p&gt;
&lt;p&gt;这边的公交车也很有特色，也是汉语和维语分别报站和提醒，我还特意录了一段，去大巴扎方向的人非常的多，所以车上人很挤，最初我还是非常小心的自己的贵重物品，和以防扎针事件的发生...不过到后来坐多了，也不顾及那么多了，因为实际上并没有想象中的那么可怕。到了大巴扎后，第一反应是环顾四周不停的看：熙熙攘攘的街道上
全是维族人，感觉就像到达了另个一个国家，一切是那么新鲜。这边分为二道桥市场和新疆国际大巴扎两个部分，既然冲着大巴扎来的，那就先逛它吧，大巴扎是又
一个典型化的商业区，有些类似北京的大栅栏，崭新的建筑就像是北京的老胡同扒倒重新再盖一样的，整个集市分了好些区域，大多数都是吸引外地游客前来购买新疆特色。&lt;/p&gt;
&lt;p&gt;[audio=http://icyleaf.com/wp-content/uploads/2009/11/xinjiang_bus_tips.mp3,新疆公交车提示音,download]&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://fleet1.footbig.com/478/m/b7/b6/b7b64d3a1feb80b05202f93f4426a418-6929.jpg" /&gt;&lt;/p&gt;
&lt;!--more--&gt;

&lt;p&gt;起初的时候，相机还不敢拿出来，毕竟对于外地人来说，新疆人的第一印象并不是很好，而且这里又是
July 5th
的突发现场，先后拿着相机诚惶诚恐的拍了几张又放了包里，主要是因为这个时候（大概
11
点多）我还没有看到一个外地人，而且集市上的卖家还都是在店里坐着，偶尔遇到朋友了，亲切的握个手，闲谈起来。幸好的是一个拿着相机的游客引入我
的眼帘，这一下子让我放下了顾虑和担心，开始对着别人，展示的物品肆无忌惮的拍起来，
看到新鲜的玩意儿就抓起来瞅瞅，店里的挂毯，围巾，披肩，到小摊位的铜镜，各种管制刀具，玉器，还有狼牙，由于不知道是狼牙真的假的，就随随便问了问，然后就发
现了一个问题，这个卖家不怎会说汉语，当我问她多少钱的时候，“10 koi”，“恩? 10
koi?”，“10 koi”，我试着笔出手指，然后说 10
元一个？卖家赶紧“恩，恩”的点点头，这下明白了，原来 “koi”
就是“元”的意思啊，不过心里一琢磨，一颗小小的狼牙这也太贵了吧，说声谢谢就离开了。&lt;/p&gt;
&lt;p&gt;经过四处溜达一圈的经验，我发现，我拿着相机拍别人的商品的时候，他们都会热心的上前来询问有什么需要购买的，然后利用任何可以“勾引”的新鲜玩意和把戏把你“勾搭”回
来。我得承认他们卖东西很有一套，而且很和蔼，涉及到买围巾，披肩等服饰的店面，大多数都是年轻的美女，看中哪个，二话不说，取下来就
往自己身上展示，如果涉及到纯羊毛，迅雷不及掩耳之势点着了打火机，拽着一点边毛就点着了，吹灭，让你凑上闻闻，伸手搓一下，嗯，果然，没错，是纯羊毛
的。下面，最重要的来了，大家肯定很关心价格问题，好吧，他们喊价也很常见，上来张开一个高价，然后在声称平时（以
July 5th
为由）卖一个更高的价格，而且我每到一家都是说，开门价，第一单生意，给你便宜些，但是我心里没底啊，不过他们张口报的高价其实比北京这边购买还是要便宜的很多的，我看中的第一件商品是想送给妈妈的围巾，卖家报“120”，心里踌躇的半天，卖家看到我犹豫，上来就说，“你给个价格吧”心里琢磨了半天，一边按照常规砍价学给出了一个半价
60
元，一边心里自问，这个价格会不会找来一顿爆骂，然后把我扫地出门（嗯，这种事可以在天津发生，从此之后买东西还价有些害怕），谁知道卖家并没有怒火，而
是很亲切的和我讨价还价，他让一小步，我也让一小步，最后我拿出杀手锏，我就这
80
元，你这围巾卖不卖，如果得到答案不卖，里面转头走人，果不其然，卖家同意了，趁着没事，和美女卖家聊了起来，问了问最近的情况。顺便又趁机戴了几顶帽拍
了一下，由于担心外面太短，也没敢没拿太多钱，所以很不错的帽子到最后也没有买，另外至于价格的最终秘密我会放到下一部分的随笔揭秘（不是不是，是时候未到，哈哈
o(∩_∩)o...）：&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://fleet1.footbig.com/478/m/28/9c/289cdb9c73e3ae016a3b33a5102fc1c1-2329.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://fleet1.footbig.com/478/m/da/e6/dae6755e5f909dfb38b145c4e5838cbb-1691.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;告别美女卖家之后又去其他店面去祸害：&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://fleet1.footbig.com/478/m/bd/cf/bdcf4e8c2dc93d5e904b9b9e477516cc-6388.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://fleet1.footbig.com/478/m/51/cf/51cf0f2dabfdec5bba7ba0e5a62e9033-1799.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://fleet1.footbig.com/478/m/91/b9/91b9b30367877e13ebc98b3321b9ee7a-4187.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;到目前为止集市是逛的差不多了，到四周随便转转，就来到了大巴扎的中心小广场，这里有座观光塔，它的前面有一个大巴扎的金字塔标志，后面的旁边是清真寺（下图左边）&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://fleet1.footbig.com/478/m/63/d2/63d286200b408d63baf319d03f4184a1-9160.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;哈，还有摆摊卖石榴汁的：&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://fleet1.footbig.com/478/m/e6/69/e66925b4306c2a76555ac60e008ba980-9037.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;
看到这些突然想起来，这一早上还没有吃饭呢，嗯，找当地特色饭馆去...精彩继续稍后回来，请明天这个时候准时收看
XD

&lt;/div&gt;
&lt;/p&gt;</summary><category term="旅行"></category><category term="游记"></category></entry><entry><title>新疆随笔之二</title><link href="http://icyleaf.com/2009/11/xinjiang-diary-2" rel="alternate"></link><updated>2009-11-19T09:30:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2009-11-19:2009/11/xinjiang-diary-2</id><summary type="html">&lt;p&gt;差不多  11 点钟，飞机就到达了乌市地窝堡机场，打听好同事的住处就赶了过去，坐在出租车上面发现副驾驶的右角居然有摄像头，对于初次到达乌市，第一印象和普通的省会城市差不多，环境也不是太好。幸好乌市并不是太大，出租车的费用也不很贵（起步 6 元，每公里 1.3元）。半个小时的时间就到达了同事所在的如家快捷酒店。附近有市政府所以也比较安全（也就可能不安全，为什么这么说呢。众所周知，自 July 5th 之后那边发生了一些事情，导致不少流血事件的发生，以及群众前往市政府游行，闹的同事晚上都不敢在外出，随时都能看到持棍的人见到不是同族的就会发生冲突）。另外一个重要原因是自 July 5th 之后，随着网上的曝光，整个疆内的网络，包括短信全部停运（最初是可以发短信不能打电话），现在是只能打电话，所以我们这边的项目也只有我前来现场开发。这也是为什么我会在那天之后消失在网上，甚至在 twitter 上面飞机起飞前说完“乌市见”后就没有音讯的原因...说来安全是指，附近（还包括人群嚷嚷的街区）都有警察，武警，特警上街巡逻和士兵哨点把守，好家伙每队中起码有一个持长枪。&lt;/p&gt;
&lt;p&gt;这边昼夜温差好大，刚去的那些天天气还都不错，白天有太阳和北京的天气差不多，不过到了晚上气温骤降，大概晚上 7 点和同事出去吃饭，我穿了带过去的所有衣服（一件Tee，一件线衣，一个带背心的小西服）都是浑身打颤，只有吃完一碗面之后才能抵御下外面的冷空气。除此之外，差不多还有
2 个小时的时差，其实这没有任何的影响。这里上班时间都是 10:00，早上 8 点的时候外面还是黑乎乎的一片，于是我又钻到被窝里呼呼睡一统 XD&lt;/p&gt;
&lt;p&gt;由于我没有通行证无法进移动公司，我主要是做远程开发，工作日的大部分时间都是在宾馆编程，看看电视（无奈之举，只有看 CCTV 获得一些外界的信息），虽然疆内的网站是开着的，不过由于宾馆的网速慢的要死，疆内突发的高访问量，导致各个网站都是很慢很慢的，不过新闻大多数还都是那些疆内新闻和无关紧要的要闻....&lt;/p&gt;
&lt;p&gt;下图大家可以看出，乌市所有的指示的文字都是汉语和维语双文，这是为什么呢？接下来的随笔记着说明，待续...（这次图片少了些，后面的更精彩哦）&lt;/p&gt;</summary><category term="旅行"></category><category term="游记"></category></entry><entry><title>亚心随笔之一</title><link href="http://icyleaf.com/2009/11/xinjiang-diary-1" rel="alternate"></link><updated>2009-11-18T09:30:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2009-11-18:2009/11/xinjiang-diary-1</id><summary type="html">&lt;p&gt;突遇一次机遇能有幸到新疆出差，由于时间紧急，没有来得及做准备工作就飞了过去，来了之后才明白我为什么才有机会出差走一遭...一共在那边呆了有 11 天（10月27日-11月6日）的时间，除了工作外还抽出来了些时间在市里暴走，扫街。顺便品尝了不少的当地美食。最近刚刚可以闲的下来整理了一下照片，
写下了下面的随笔记录：&lt;/p&gt;
&lt;p&gt;11 月 27 日早在 T1 坐的海航飞往乌鲁木齐（以下简称乌市）的飞机，我专门挑了一个靠窗户的座位。这是我第一次做飞机，也在打机票的时候闹了一个很囧的事情，我选择的是电子自主出票，尤其是可以选择座位，最开始我总以为，飞机的窗户是大窗户而不是每个靠边的座位都能占到窗户，于是傻乎乎的问了机场服务人员...&lt;/p&gt;
&lt;p&gt;那天阳光灿烂， 由于起飞的时候正好是早上 8 点多钟，从北京飞往乌市需要 4 个小时的时间，起初新鲜抓着相机拍了好多的云彩和大大的太阳，一抹蓝蓝的天空，后来飞机一直在厚厚的云层中飞行，抓起书继续阅读《向加泰罗尼亚致敬》一书，偶尔和身边的新疆人随便闲扯几句，他是一个很粗犷但心很细的中年人，从事销售行业。和他聊起了第一印象还是很不错的，没有传说中的那么恶略。趁下机的时候还给了我一些提醒。&lt;/p&gt;
&lt;p&gt;当飞机经过甘肃，莫高窟之后，透过飞机出窗户看到的就是另一番风景：一望无际的沙漠，蜿蜒的山脉，旷阔的牧地，曲折的河流，水库和巍巍的天山被银白的白雪覆盖，相机是一直不断的刷刷刷的拍个不停，那个时候阳光已经非常明媚，而且加上窗户的反光，阳光的光晕，以及不小心就能拍到机翼，导致废掉了好多照片。&lt;/p&gt;
&lt;p&gt;待续...&lt;/p&gt;</summary><category term="旅行"></category><category term="游记"></category></entry><entry><title>几本和 Git 相关的书</title><link href="http://icyleaf.com/2009/09/books-about-git" rel="alternate"></link><updated>2009-09-28T13:50:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2009-09-28:2009/09/books-about-git</id><summary type="html">&lt;p&gt;切换到 Git开发已经有一段的时间了，之前一直在使用 svn，现在部分代码还在
Google Code 托管。不过自换了 Git 之后发现 Git 更方便且效率更高，不过用来用去常用的就拿几个命令，很多时候都要去找一些参考资料和教程。从学习到现在一个接触了一个文档，三本书。文档就是官方的文档手册，这个就不再说了，安装完 git 也都会默认内置的，对于这三本书，依次为 &lt;a href="http://book.git-scm.com/"&gt;Git Community Book&lt;/a&gt;，&lt;a href="http://progit.org/"&gt;ProGit&lt;/a&gt;，&lt;a href="http://zh-cn.whygitisbetterthanx.com/"&gt;Why Git is Better Than X&lt;/a&gt;（X 代表其他 SCM 软件，如
svn，bzr等）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Why Git is Better Than X 已经有国内友人翻译完毕，一一介绍了 Git 与其他 SCM 软件有什么优势和特色&lt;/li&gt;
&lt;li&gt;ProGit 不久前开启了&lt;a href="http://progit.org/2009/08/19/translate-this.html"&gt;翻译计划&lt;/a&gt;，中文目前还在&lt;a href="http://groups.google.com/group/progit-zh"&gt;翻译过程&lt;/a&gt;中，这本书很适合作为入门使用和工具书，欢迎前来 &lt;a href="http://github.com/progit/progit"&gt;Fork&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Git Community Book 就是一个由社区维护的手册，内容很全讲解的很详细，就是还没有中文&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可喜的是，这些书籍都是可以在线观看或下载的，当然如果能进一份力量，请去购买正版，或有一腔热血为 Git 贡献，就请加入到翻译之中。&lt;/p&gt;</summary><category term="git"></category></entry><entry><title>Kohana 官方 2.3，2.4，3.0 的最终裁决！</title><link href="http://icyleaf.com/2009/07/official-2-3-2-4-3-0-decisions" rel="alternate"></link><updated>2009-07-24T14:13:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2009-07-24:2009/07/official-2-3-2-4-3-0-decisions</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;更新：Kohana 官方已经做出&lt;a href="http://forum.khnfans.cn/topic/view/167/1.html"&gt;最终裁决&lt;/a&gt;！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;两天前我(Shadowhand)曾经&lt;a href="http://forum.kohanaphp.com/comments.php?DiscussionID=2835&amp;amp;page=6#Item_12"&gt;说过&lt;/a&gt;关于 2.4 和 3.0 版本的问题和它们之间的关系已经做出的解答。之后的今天和其他开发者见面（with more of the devs），这似乎是错误的。所以长话短说，我们现在有两个选择：&lt;/p&gt;
&lt;p&gt;1. 我们在一个月内分别发布 2.4 和 3.0。 2.4 将会经可能的兼容 2.3.x 版本但是其中 Database 和 i18n 是全新的不同于 2.3 的系统。 3.0 也将不同于 2.4 的 Database，但是 i18n 系统还是和 2.4 一致。&lt;/p&gt;
&lt;p&gt;2. 完全抛弃 2.4 而专攻 3.0 版本，它将会有一个全新的类似 2.4 版本的 Database 特性，但是语法和更多的特性稍有些不同。 3.0 在发布的同时，新的网站和用户手册也会同步完成。&lt;/p&gt;
&lt;p&gt;2.4 和 3.0 版本大约将会在同一天发布（2009年的8月下旬或9月上旬）。两个版本都不会去兼容
2.3.4 版本。虽然升级至 2.4 版本将会少于升级至 3.0 的兼容工作。（请记住，我们从来没有建议和要求用户升级到哪个核心版本）&lt;/p&gt;
&lt;p&gt;我本可以行使 &lt;a href="http://lmgtfy.com/?q=bdfl"&gt;BDFL&lt;/a&gt;（Benevolent Dictator For Life，代表少数开源软件开发者的领头人）权利做个强制决定，但是我觉得还是听一听社区的声音。你们认为哪个是 Kohana 在未来长期（至少 6 个月以上）开发基础的最好选择呢?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;更新&lt;/strong&gt;： 选择第二项，将会抛弃 2.3.x 版本公开发布的版本修复&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;原文：&lt;a href="http://forum.kohanaphp.com/comments.php?DiscussionID=3043&amp;amp;page=1"&gt;Official 2.3, 2.4, 3.0 Decisions - We need your feedback!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;---------我是华丽的分割线--------------&lt;/p&gt;
&lt;p&gt;KO3 RC1 目前已经发布，详情请看&lt;a href="http://forum.khnfans.cn/topic/view/168.html"&gt;这里&lt;/a&gt;，希望大家喜欢 Kohana，关注
Kohana，使用 Kohana
的朋友留下你的看法，这对Kohana自身和社区用户都是有益的！&lt;/p&gt;
&lt;p&gt;--------关于 E-TextEditor  的分割线---------------&lt;/p&gt;
&lt;p&gt;今天前去 Textmate clone 的软件 Intype论坛瞅了一眼，惊奇的发现同样是
Textmate clone 的 E-TextEditor 居然在今年3月份宣布开源，而5月份就在
Github 放出了源码！而且声称会开发 Linux 版本并且弘扬 Linux 的精神，Linux
版本统统免费！详情请看 &lt;a href="http://intype.info/forums/discussion/827/eeditor-going-open-source-open-company/#Item_0"&gt;Intype 论坛&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;而且已经有Linux用户编译运行了 E-TextEditor 详情请看：&lt;a href="http://fixnum.org/blog/2009/e_on_fedora"&gt;Building the E text
editor on Fedora 10&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;不知道身为 Textmate clone 的 Intype
会做何打算，它们目前正在全力开发新的版本（貌似内核和界面全部重新），拭目以待！&lt;/p&gt;</summary><category term="PHP"></category><category term="Kohana"></category></entry><entry><title>豆瓣API测试控制台</title><link href="http://icyleaf.com/2009/07/douban-api-console" rel="alternate"></link><updated>2009-07-06T18:06:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2009-07-06:2009/07/douban-api-console</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;项目已开源: http://github.com/icyleaf/modou&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;豆瓣 API 测试控制台的创造灵感来源于 Facebook Developers Tools 中的&lt;a href="http://developers.facebook.com/tools.php"&gt;Facebook API Console&lt;/a&gt;， 或许大家知道，魔豆是我的另外一个豆瓣 API 应用，由于是自己封装的 Douban
API（官方提供的库类要求太多，安装繁琐，这不属于我喜爱简洁，轻便的风格），每次想查看某个
API 接口返回的数据都要写一个 test 跑一下。麻烦不说，还容易出错，于是，使用自己封装的 Douban API，借鉴 Facebook API Console
的界面和类似的功能显示，终于小有所成，其中为了实现此控制台，封包的库类经过两次大改，虽然改的很辛苦，但从中学到了很多开发经验。&lt;/p&gt;
&lt;p&gt;测试用户必须先进行用户验证才能进行测试，这主要是为了：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;避免提交查询中出现错误，并让测试者使用到全部API方法&lt;/li&gt;
&lt;li&gt;防止恶意用户利用它做二次api调用，由于测试控制台的传输很简单，提交参数即可查询。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;查询方法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;进行用户的登录验证&lt;/li&gt;
&lt;li&gt;选择返回的数据类型（支持官方提供的 XML 和 JSON格式）&lt;/li&gt;
&lt;li&gt;选择需要查询的API方法（这里我做了分类）&lt;/li&gt;
&lt;li&gt;如果查询的方法存在参数，会在方法下面显示。&lt;/li&gt;
&lt;li&gt;设置完毕参数后，点击“调用此方法”，稍等片刻即可。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;返回的数据结果会在右侧显示出来，其中，右上部分是调用相关 API 的 URL 地址；右下部分是返回的数据结果。&lt;/p&gt;
&lt;p&gt;如果，参数设置错误，或者其他问题，返回的结果会以 [CODE] Content
的格式返回，其中 &lt;strong&gt;CODE&lt;/strong&gt;代码返回的状态码，&lt;strong&gt;Content&lt;/strong&gt; 是返回的信息。&lt;/p&gt;
&lt;p&gt;通用参数解释：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;id  - 查询方法涉及到的 id 值（人，书影音，日记，广播，豆邮，同城等）&lt;/li&gt;
&lt;li&gt;message - 广播发送的内容&lt;/li&gt;
&lt;li&gt;title - 日记，豆邮的标题&lt;/li&gt;
&lt;li&gt;content - 主题内容&lt;/li&gt;
&lt;li&gt;city - 同城活动的城市代号（根据我判断，应该是中文的拼音，详细请看&lt;a href="http://www.douban.com/location/world/"&gt;官方同城列表&lt;/a&gt;中各个城市的url）&lt;/li&gt;
&lt;li&gt;query - 搜索的关键字&lt;/li&gt;
&lt;li&gt;index - 返回多个元素时，起始元素的下标（相当于豆瓣 api
    文档中的start-index）&lt;/li&gt;
&lt;li&gt;max - 返回多个entry时，每页最多的结果数（相当于豆瓣 api
    文档中的max-results）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其中某些方法（涉及到自身的数据，比如我的信息，我的广播，我的同城）在进行查询的时候可以把
id 留空或者设置为 ‘me’ （不带引号），这样调用结果显示的是自己的信息。&lt;/p&gt;
&lt;p&gt;如果长时间(大于1分钟)处于“调用中”，可能是由于程序问题，请刷新后重试。&lt;/p&gt;
&lt;p&gt;已知存在的问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;界面和方法列表在 Chrome 浏览器有不兼容的问题出现&lt;/li&gt;
&lt;li&gt;返回数据结果头一行多出一个类似水平制表符的转义符似的&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;由于目前为止豆瓣 API 还没有封装完成，现只提供用户，广播，书影音，豆邮和日记的不完全功能测试查询。
其余的 API 会尽快添加进去 :)&lt;/p&gt;
&lt;p&gt;测试地址：[http://ews.im/douban_console][]&lt;/p&gt;</summary><category term="PHP"></category><category term="豆瓣"></category></entry><entry><title>魔豆：豆瓣网非官方移动版本</title><link href="http://icyleaf.com/2009/06/modou" rel="alternate"></link><updated>2009-06-22T15:46:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2009-06-22:2009/06/modou</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;项目已开源: http://github.com/icyleaf/modou&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="http://modou.us" title="魔豆：豆瓣网非官方移动版本"&gt;魔豆&lt;/a&gt;，一个&lt;a href="http://douban.com"&gt;豆瓣网&lt;/a&gt;非官方移动版本，基于&lt;a href="http://www.douban.com/service/apidoc/" title="豆瓣 API"&gt;豆瓣
API&lt;/a&gt;开发的专门为移动终端（手持设备）定制的豆瓣移动版本。魔豆专注于豆瓣网的&lt;strong&gt;广播&lt;/strong&gt;及&lt;strong&gt;同城活动&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;魔豆的来历：豆瓣移动版 -&gt; Douban mobile -&gt; moDouban -&gt; moDou -&gt;魔豆&lt;/p&gt;
&lt;p&gt;目前魔豆发布的功能：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;友邻广播：支持显示广播，回复发起人和重播（重复发布其他发起者的广播）&lt;/li&gt;
&lt;li&gt;同城活动：查看自己参与（包含参加/感兴趣）的活动以及用户所在城市的同城活动（需提前在豆瓣设置）&lt;/li&gt;
&lt;li&gt;查看用户相册以及同城活动相册（仅限于从友邻广播）&lt;/li&gt;
&lt;li&gt;搜索用户/书影音/同城活动&lt;/li&gt;
&lt;li&gt;查看用户/书影音/同城活动信息&lt;/li&gt;
&lt;li&gt;显示和查阅豆邮&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我，是一个重度豆瓣使用者，也许这和身在北京这所繁华的帝都有很大的关系。虽然豆瓣网直到现在为其定位在书影音这三大模块，但不可否认的，豆瓣小组，豆瓣广播，豆瓣同城甚至豆邮都起着重要的标志性作用。&lt;/p&gt;
&lt;p&gt;或许和大家一样，一直期待着豆瓣网能够推出移动版本，可以用手机或其他移动设备查查书影音，看看友邻广播和未读豆邮，浏览下所在城市的同城活动，光想想都是这么的惬意，于是我们在等，一直在等，几乎使我望穿秋水的时候，还是杳无音讯。平时在有 WIFI 网络的情况下，使用 iTouch
访问一下豆瓣网还是可以，如果离开了它，以为这必须使用较昂贵的 GPRS 网络，经过漫长的 loading 才能看到自己感兴趣或自己想看的一点点信息...&lt;/p&gt;
&lt;p&gt;于是，自己何不使用豆瓣API开发一个呢？紧接着通过查阅大量的文档和官方提供的演示代码，抛弃
Zend Framework 和 Gdata，使用自己维护中文化的 &lt;a href="http://khnfans.cn" title="Kohana 中文爱好者"&gt;Kohana&lt;/a&gt;框架，一点一点的搭建起了基础库，通过一个星期多的时间，开始一边做页面的展现，另一边继续完善基础库，直到目前为止，大体的框架已经完成，下面需要考虑如何对细节做修改和完善。&lt;/p&gt;
&lt;p&gt;另外，由于 PHP 没有低耦合的 HTTP requset class，自己使用 curl 函数一点点抠出来的一个 RESTFul requset class，在进行提交 POST，PUT，DELETE 方法还存在一些技术问题，所以魔豆目前还不支持对书影音，同城活动进行操作（包含，想读/听/看，感兴趣，我要参加等等），我会尽快完善。&lt;/p&gt;
&lt;p&gt;开发环境： &lt;strong&gt;Windows XP + XAMPP + E-texteditor&lt;/strong&gt; (Office work) AND
&lt;strong&gt;Ubuntu 9.04 + XAMPP + Aptana&lt;/strong&gt; (Laptop)&lt;/p&gt;
&lt;p&gt;调试设备：iPod Touch + Blackberry 8310 + Nokia N-GAGE QD&lt;/p&gt;
&lt;p&gt;由于设备有限，可能在其他设备上会出现设备误判或UI上的问题（大家可以在本日志下面留下误判设备型号），敬请谅解。后期会对不同设备进行专门的优化
:)&lt;/p&gt;
&lt;p&gt;网站：&lt;a href="http://modou.us"&gt;http://modou.us&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;开发进度：&lt;a href="http://modou.us/timeline"&gt;http://modou.us/timeline&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;相关截图：&lt;a href="http://www.getdropbox.com/gallery/45081/1/modou?h=b26d7e"&gt;http://www.getdropbox.com/gallery/45081/1/modou?h=b26d7e&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;欢迎大家前来测试和使用，心情愉快。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;更新于 2009年06月22日：由于China Mobile的原因，黑莓手机默认浏览器无法判别，请黑莓用户使用 Opera Mini 或其他浏览器访问，原因请看&lt;a href="http://www.douban.com/group/topic/6946152/"&gt;这里&lt;/a&gt;。&lt;/p&gt;
&lt;/blockquote&gt;</summary><category term="PHP"></category><category term="豆瓣"></category><category term="魔豆"></category><category term="Kohana"></category></entry><entry><title>话说相机二三事</title><link href="http://icyleaf.com/2009/05/talk-about-camera" rel="alternate"></link><updated>2009-05-11T14:49:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2009-05-11:2009/05/talk-about-camera</id><summary type="html">&lt;p&gt;记忆中的童年，曾经在父母的衣柜底部发现了一部特老式的国产&lt;a href="http://www.camgle.com/thread-14101-1-1.html"&gt;红梅HM-1相机&lt;/a&gt;（起初忘记什么牌子，只记得有一个梅字），外观有些像莱卡，但要厚许多，镜头是从内部有上往下翻出来，镜头的链接还属于褶皱型的类似塑料，不知道怎么形容，于是Google了一下，发现学名叫120遮叠式皮腔相机。不过因当时年少不懂，几经折磨的相机被我玩坏了...而且是在没有胶卷的情况下，而后诚惶诚恐的把相机重新塞到父母的衣柜下面，从此封口不提此事，幸好后来也没有找我质问。后来才知道那相机是我父亲年轻时购买的机器，同时在家里的相册也发现了不是父亲外出拍摄的照片，当时都是黑白照，或许是父亲的基因遗传还是其他原因，从此对相机产生了浓厚的兴趣。或许对于高科技新鲜物品都是充满了美好的欲望：对于相机，对于电脑亦是...&lt;/p&gt;
&lt;p&gt;学生时代，尤其喜欢把玩胶卷相机，记得在我们上初中的时候当时特流行也最易用的“傻瓜相机”，只要学校组织外出活动，就会想办法去借到一个相机，带上1-2卷胶卷，享受拍照的乐趣，尤其在胶卷用完之后就会跑到一个黑黑的角落，甚至回家后放在被窝里面取出胶卷，生怕一点的曝光出现。后来因有了电脑而着迷，但只要有机会接触到相机就会特兴奋。（下面附图的傻瓜相机应该还是高级货，网上找的其他的都太模糊）&lt;/p&gt;
&lt;p&gt;后来，也就是2008年来北京工作的第一年，开始花自己钱的时候，给自己购买了一份生日礼物：柯达 C340，我的第一款数码相机，虽说是在淘宝上面淘过来的二手相机，歹说也 500 万像素呢～从此无论到哪都会随身携带着它，我还很清楚的记得，当初在购买此相机之后不久，另外一个在北京的朋友给我看来一本关于相机拍摄的初级入门电子书。就在我认真阅读第一节“一般来说数码相机都设有快门优先和光圈优先...”，抓起自己的相机“玩命”的寻找也没有发现这两个曝光功能，随之删除掉了那本入门电子书。开始就是抓什么拍什么，再也不看电子书教程和论坛经验之类的东西生怕受了打击...&lt;/p&gt;
&lt;p&gt;很快一年的时间过去了，这部老爷机我也逐渐熟悉，照片技术也愈发熟练起来，同时也明白了它的优缺点，开机速度和快门速度都比较慢，微拍的时候最不容易对焦，对于较暗光线拍照效果急剧下降，最要命越用耗电量也越大，两节新的 AA 南孚电池在不开闪光灯的情况下最多撑3-4个小时。于此同时从 &lt;a href="http://twitter.com/CNBorn"&gt;CNBorn&lt;/a&gt; 和 &lt;a href="http://twitter.com/yichi"&gt;yichi&lt;/a&gt; 同学了解到一些单反相机的知识，于是心开始动摇了...&lt;/p&gt;
&lt;p&gt;终于，于昨天（2009年05月10日）在 CNBorn 陪同下来到了北京五棵松器材城入手了属于自己的单反相机 —— 佳能 450D + 18-55 IS 套机。随后来到在这期《时尚先生》韩寒的外拍场地，北京世界风情园进行了第一次试拍。虽然因某些原因成为了烂尾工程，但这是一个非常适合练习拍摄的地方，重合了多国的建筑风格，荒废的场地还带着一些探险，寻找古籍的趣味，在一些建筑内，纵横交错的柱子又称了练习用光的有利条件。最最重要的是来到这里的人很少，或许会有少数的摄影爱好者前来外拍，但是最起码的我们不会再因为人多等等原因而延误拍摄的痛苦和无奈。&lt;/p&gt;
&lt;p&gt;从此揭开了新的拍摄乐章...&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;最后特别感谢山居的&lt;a href="http://www.shanju.org/"&gt;清隐子&lt;/a&gt;对各种相机的看法，豆瓣的&lt;a href="http://www.douban.com/people/mattony/"&gt;强哥&lt;/a&gt;解答我的问题，yichi 的购买注意事项等问题的解答，CNBorn
帮我这单反小白验机和使用光圈，快门知识；相机包的挑选！ :P&lt;/p&gt;</summary><category term="摄影"></category></entry><entry><title>Modules Library 和 DBManager Module</title><link href="http://icyleaf.com/2009/03/modules-helper-and-dbmanager-module" rel="alternate"></link><updated>2009-03-05T17:02:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2009-03-05:2009/03/modules-helper-and-dbmanager-module</id><summary type="html">&lt;p&gt;或许大家可能有了解到，本人目前一直在对 &lt;a href="http://kohanaphp.com"&gt;Kohana&lt;/a&gt;这个纯 PHP5
框架进行文档翻译和维护，同时也建立一个站点：&lt;a href="http://khnfans.cn/" title="Kohana爱好者"&gt;Kohana爱好者&lt;/a&gt;。
站点提供中文化的文档，包含中文语言包的中文镜像下载支持以及中文化论坛。Kohana 
凭借着基于 CodeIgniter
框架+PHP5，赢得了一群使用者，我也希望无论是国外的还是国内的使用者都能共享自己的力量。&lt;/p&gt;
&lt;p&gt;恩...以上算是给自己打个广告。Modules Library 和 DBManager Module 均是为
Kohana 框架编写的，以后会根据自己和大家的寻求做适当的更新。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Modules Library&lt;/strong&gt;，中文译为 扩展管理库，是一个方便管理 Kohana
系统自身扩展配置的库类，通过它使用代码就可以轻松实现获取当前所有 Modules
信息，已激活的 Moduels， 未激活的 Modules，最重要的是还可以添加
Modules，激活和关闭 Module。&lt;/p&gt;
&lt;p&gt;范例代码：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;// Instance Module library&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Module&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="k"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// list all modules of application in application/config/config.php&lt;/span&gt;
&lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="n"&gt;Kohana&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="k"&gt;module&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;list_all&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="c1"&gt;// list active modules of application in application/config/config.php&lt;/span&gt;
&lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="n"&gt;Kohana&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="k"&gt;module&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;list_active&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="c1"&gt;// list inactive modules of application in application/config/config.ph p&lt;/span&gt;
&lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="n"&gt;Kohana&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="k"&gt;module&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;list_inactive&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="c1"&gt;// active &amp;#39;auth&amp;#39; module&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="k"&gt;module&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;(&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;&amp;#39;);&lt;/span&gt;

&lt;span class="c1"&gt;// inactive &amp;#39;auth&amp;#39; module&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="k"&gt;module&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;inactive&lt;/span&gt;&lt;span class="p"&gt;(&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;&amp;#39;);&lt;/span&gt;

&lt;span class="c1"&gt;// add &amp;#39;sample_module&amp;#39; module with description.&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="k"&gt;module&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;sample_module&lt;/span&gt;&lt;span class="p"&gt;&amp;#39;,&lt;/span&gt; &lt;span class="p"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;Just&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt; &lt;span class="k"&gt;module&lt;/span&gt;&lt;span class="p"&gt;&amp;#39;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;DBManager Module&lt;/strong&gt;灵感来自 WordPress 插件
WP_DBManager，就连名字都很类似，其实对于其功能也是按照它实现。哈哈～～&lt;/p&gt;
&lt;p&gt;目前对于此扩展实现的功能如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;获得当前 Mysql 版本以及 Kohana 连接数据库等信息&lt;/li&gt;
&lt;li&gt;获取当前所有表数据&lt;/li&gt;
&lt;li&gt;备份数据库（支持Gzip压缩和自动备份）&lt;/li&gt;
&lt;li&gt;优化数据库（支持自动优化）&lt;/li&gt;
&lt;li&gt;修复数据库&lt;/li&gt;
&lt;li&gt;获得，下载，删除数据库备份文件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;此扩展支持配置和 i18n，以及对目前来说一个简易的演示页面。&lt;/p&gt;
&lt;p&gt;目前还没有对实现自动备份后进行 Email 通知的功能，以及以后会对多种数据库支持。和限制最大化数据库备份文件。至于是否可以在进行数据库表数据的操作（比如查询，删除表，修改表等）是否还需要支持？&lt;/p&gt;
&lt;p&gt;以后对自己发布的 Kohana 相关的代码都会托管在 Google Code 上面，地址：&lt;a href="http://code.google.com/p/kohana-fans-cn/"&gt;http://code.google.com/p/kohana-fans-cn/&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi, Don't understand Chinese? ok, No problem. Here to view &lt;a href="http://forum.kohanaphp.com/comments.php?DiscussionID=2117&amp;amp;page=1"&gt;Modules Library&lt;/a&gt; and &lt;a href="http://forum.kohanaphp.com/comments.php?DiscussionID=2156&amp;amp;page=1"&gt;DBManager Module&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</summary><category term="Kohana"></category><category term="PHP"></category></entry><entry><title>Mockups：手绘界面设计软件</title><link href="http://icyleaf.com/2009/02/mockups-best-ui-design-software" rel="alternate"></link><updated>2009-02-18T17:48:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2009-02-18:2009/02/mockups-best-ui-design-software</id><summary type="html">&lt;p&gt;忘记如何知道 Mockups
这款软件了，不过也是今天搜索是无意中发现的一款很棒的界面设计软件，无论你在设计一个软件的外观或者是一个网站的界面甚至说更为细节的一个小的功能模块的展现都可以使用这个软件完成。&lt;/p&gt;
&lt;p&gt;这款软件的亮点可以想 VB 或者 Dreamware
之类的界面拖拽的方式即拖即现，点击拖拽后的控件（可以这么称之为吧），就提示相关的参数属性设置。而且控件库都是可视化显示，无论对于初入这个软件还是不懂设计的和画画的朋友都可以很轻松的上手而且还是手绘的效果，虽然界面不精细但是作为演示的草图已经足够了。而且最为重要的舍弃了笔和纸，也减去了自己拿软件自己进行鼠绘界面设计的痛苦。&lt;/p&gt;
&lt;p&gt;软件分为线上和客户端和嵌入式三个版本，不过作为线上版还是客户端均采用了
Flex 开发，这样可以避免二次语言看法，只需要做部分的调整，就可以作为线上版和
AIR 客户端版本。嵌入式主要是说 Mockups
可以集成到Confluence，JIRA，和XWiki中的版本。&lt;/p&gt;
&lt;p&gt;线上版的地址：&lt;a href="http://www.balsamiq.com/demos/mockups/Mockups.html"&gt;http://www.balsamiq.com/demos/mockups/Mockups.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;对于想尝试客户端的朋友请注意，需要 AIR 支持，请先到 Adboe 官方&lt;a href="http://get.adobe.com/air/"&gt;下载 AIR&lt;/a&gt;，然后在进行 &lt;a href="http://www.balsamiq.com/demos/mockupsAir/MockupsForDesktop.air"&gt;Mockups 安装&lt;/a&gt;。AIR 客户端适用于 Windows/Linux/Mac 系统。&lt;/p&gt;
&lt;p&gt;在下载并安装之后，运行起来，大家就能看到一个精美的界面和预置六十多个界面元素控件的控件管理和下面的展现界面。&lt;/p&gt;
&lt;p&gt;对于完成之后的界面可以导出为 XML 标记语言以方便管理和导入及其他工具或者是保持为 PNG
图片格式。除此之外，软件还支持导入以及添加更多的界面元素控件，这么好的软件当然不可能免费，购买的话需要 \$79 刀的注册费用（对于Confluence，JIRA，和XWiki版本的费用还有所不同），不过官方有说明，注册之后的 Licenses 可以相互使用。对于买不起软件的朋友作者也给出了不同的方式以免费获取 Licenses。&lt;/p&gt;
&lt;p&gt;如果你做到东西需要给大家演示，直接按快捷键 Ctrl + F，会开启全屏功能，在这个全屏功能中，将无法进行编辑，鼠标移动会有一个蓝色的大箭头在界面设计的周围移动，这个主要为了方便演示而制作的功能，可以看出软件作者的细心程度。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;更新&lt;/strong&gt;：在发布完此日志之后随后又给官方指定地址发了一封免费获取 Lincense 的邮件，没想到不过 3分钟，一个价值 \$79 刀的 Lincense 真的发过来了！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;官方网址：&lt;a href="http://www.balsamiq.com/products/mockups"&gt;http://www.balsamiq.com/products/mockups&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[&lt;img alt="mockups snapshot" src="http://icyleaf.com/wp-content/uploads/2009/02/2009-02-18_00044.jpg" title="mockups snapshot" /&gt;]: http://icyleaf.com/wp-content/uploads/2009/02/2009-02-18_00044.jpg&lt;/p&gt;</summary><category term="App"></category><category term="Mockup"></category></entry><entry><title>与SPAM战斗到底：CSS篇</title><link href="http://icyleaf.com/2009/02/fighting-spam-with-css" rel="alternate"></link><updated>2009-02-08T10:58:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2009-02-08:2009/02/fighting-spam-with-css</id><summary type="html">&lt;p&gt;SPAM，现在还没有一个非常严格的定义。一般来说，凡是未经用户许可就强行发送到用户的邮箱中的任何电子邮件。现在应该已经广泛各种网络应用上面。对于网站来说，网站知名度小的时候或许还可以免于“侵犯”，可是一旦在搜索引擎收录的数量做出一些成绩，SPAM 就会主动找上门来，各种垃圾信息就会扑面而来，然而对SPAM 的战斗一起在进行，这是一场没有硝烟的战争，为了防范
SPAM，大家各显其能，招招新颖，当然还有一些专门为 SPAM 创建防御服务的网站，比如说 WordPress 自带的 &lt;a href="http://akismet.com/"&gt;Akismet&lt;/a&gt;。对于各种防御方法，我想应该可以写成一个系列，这个系列的内容或许是从网络上搜集或许是自己突发奇想想出来的奇招（目前应该还不可能哈）。&lt;/p&gt;
&lt;p&gt;今天我带给大家的是方法另辟其境：&lt;strong&gt;CSS&lt;/strong&gt;。总所周知，CSS 是一种层样式表，只是为了网站界面的展现做出重要贡献的角色。那么它怎么实现防御 SPAM 的呢？ok，接着下看。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;原理&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;为了不上了就代码让大家感到迷惑，先讲一下原理：首先在创建表单的时候，添加一个对
SPAM 校验的 input
标签，然后再提交的时候进行对这个标签进行判断其值是否为空，因判断是否为
SPAM（如果你不明白 SPAM 的实现原理请看&lt;a href="http://www.codewall.cn/blog/?p=7"&gt;这里&lt;/a&gt;）。（看官：不就是设置成
hidden 类型吗，这谁都知道）错！我承认这是一个最常见的判断 SPAM
的流程，但这里添加的 input 类型使用的是 text 类型，这是为了防止 SPAM
在进行抓取页面进行对 input 类型判断是否有 hidden
类型为设置的，那么怎么隐藏这个 input 标签呢？那么就可以利用到 CSS 的
display 属性，哈哈，是不是明白了？好吧，看代码吧。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;代码&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;HTML 代码：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&amp;quot;&lt;span class="n"&gt;name&lt;/span&gt;&amp;quot; &lt;span class="o"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;br&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt; 
&lt;span class="n"&gt;Email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&amp;quot;&lt;span class="n"&gt;email&lt;/span&gt;&amp;quot; &lt;span class="o"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;br&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;     
&lt;span class="n"&gt;Comment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&amp;quot;&lt;span class="n"&gt;comment&lt;/span&gt;&amp;quot; &lt;span class="o"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;br&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt; 
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&amp;quot;&lt;span class="n"&gt;hidden&lt;/span&gt;&amp;quot; &lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&amp;quot;&lt;span class="n"&gt;special&lt;/span&gt;&amp;quot; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&amp;quot;&lt;span class="n"&gt;submit&lt;/span&gt;&amp;quot; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&amp;quot;&lt;span class="n"&gt;Post&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&amp;quot; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;CSS 代码：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;35&lt;span class="n"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Arial&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Helvetica&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sans&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;#333&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;14&lt;span class="n"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;special&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;上述代码中 class 为 special 的 input 标签即为判断 SPAM 的标志。使用 CSS
对其隐藏，就在提交表单后进行对这个 input 进行判断是否为空即可。这样就简单避免 SPAM 对 input 的 hidden 判断的避免而轻松达到防御的目的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;声明&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;CSS 防御 SPAM 的实现方法来自&lt;a href="http://www.modernblue.com/web-design-blog/fighting-spam-with-css/"&gt;Modernblue&lt;/a&gt;
网站发布的文章。本人只是做翻译工作，特此声明。&lt;/p&gt;</summary><category term="css"></category></entry><entry><title>回顾 2008 年度及总结报告</title><link href="http://icyleaf.com/2008/12/2008-year-in-review" rel="alternate"></link><updated>2008-12-30T18:46:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2008-12-30:2008/12/2008-year-in-review</id><summary type="html">&lt;p&gt;2008 年是一个不平凡的一年，这一年发生了很多大事件：&lt;strong&gt;南方雪灾，西藏拉萨暴力事件，四川汶川大地震，北京奥运会，三鹿奶粉事件，0807（本人毕业）&lt;/strong&gt;...就在去年的 12 月份，我踏入北京开始了北漂的生活，而且预先给自己制订了一个新的 08 计划：&lt;a href="http://icyleaf.com/2007/12/27/2008-a-new-i/" title="Permanent Link to 2008，一个全新的我"&gt;2008，一个全新的我&lt;/a&gt;。下面针对 08 计划做一下总结：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;专心一致的提高自身的专业知识水平&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这一年还算是不错吧，对于公司的工作每一项都认真的去完成，同时在工作中学到了很多的知识和经验，对于业余爱好来说，可能还是没有把握一个方向：PHP，中间总是会去岔题去研究其他方面的互联网开发的东西，还好没有偏离互联网开发这个方向。同时深深感谢 &lt;a href="http://wordpress.org/"&gt;WordPress&lt;/a&gt;和  &lt;a href="http://twitter.com/"&gt;Twitter&lt;/a&gt;，这两个让我了解了很多，学到了很多。
2.  &lt;strong&gt;提高自己的社交能力&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;幸好自己处在北京这么一个大城市，才得以让我参加各种各种的活动：美食，聚会，技术交流，闲谈，娱乐等，这里重点要感谢&lt;a href="http://www.douban.com"&gt;豆瓣网&lt;/a&gt;，使它让我充实了每一个空闲的周末。同时从最初的 [V2EX聚会][]到回来大大小小的活动，我也很高兴认识了一群志同道合的朋友。当然还有一些在网上认识的朋友。
3.  &lt;strong&gt;提供英语的读写能力&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;很惭愧，一项未完成的项目，虽然经常的订阅一些国外的一些网站，翻译一些博文，但我发现这样对自己学习英语的提高并不是很大，很多都仅仅是能看懂，如何翻译的更好，如何自己写出来还是不是很如意，还有很惭愧的是，自己还承担了 &lt;a href="http://khnfans.cn/docs/"&gt;Kohana 中文文档&lt;/a&gt;的翻译和维护工作。
4.  &lt;strong&gt;计划好了就要努力完成&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;虽然我都是在努力的去完成计划的工作，可惜自己给自己定的计划太多了以至于到现在不是未完成就是出于收尾的状态。自己做了很久的 Todo List 项目，到现在也没有完成...这里要向 &lt;a href="http://blog.donews.com/CNBorn/"&gt;CNBorn&lt;/a&gt; 同学学习，每天利用下班的时间来做自己的项目，当然同样也是一个 Todo List 服务：&lt;a href="http://www.checknerds.com/"&gt;CheckNerds&lt;/a&gt;，目前正在刚刚完成 mobile 版本:) 可能会有人问，为什么你们做同样的项目，恩，是这样的，由于我们在认识之前我就已经开始在进行自己的项目，而且我们的想法还是有些差异，所以可能对针对的人群和开发的功能还不太一样。
5.  &lt;strong&gt;摆脱"懒"的恶习&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;同样很遗憾，还是没有摆脱...我会在今后的日子继续努力，继续摆脱的！&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;对我来说，这一年发生了很多，让我也改变了许多，这一年也让我如愿以偿的拥有了自己的笔记本，更换了自己的手机，给喜欢摄影的我新添了一个老爷相机（本人只有在拥有什么了才会去深入研究，所以先买一个玩玩，等深入了，我会考虑单反...），还在豆瓣组织了
&lt;a href="../2008/11/04/one-shot-everyday/" title="Permanent Link to 一日一摄"&gt;一日一摄&lt;/a&gt; 活动。最重要的是，让我认识了一群志同道合的朋友！&lt;/p&gt;
&lt;p&gt;今年马上就要结束，新的一年又即将开始，结束今年并不代表可以忘记，他永远都是过去，过去的不足自己会努力改正，新的开始还需新的计划，我想等元旦的假期好好整理一下自己的思路，计划一下新的一年。&lt;/p&gt;
&lt;p&gt;同时，祝福大家在 2009 年&lt;strong&gt;牛气冲天&lt;/strong&gt;！&lt;/p&gt;</summary><category term="年终总结"></category></entry><entry><title>正式入黑莓系</title><link href="http://icyleaf.com/2008/12/join-into-blackberry" rel="alternate"></link><updated>2008-12-16T18:57:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2008-12-16:2008/12/join-into-blackberry</id><summary type="html">&lt;p&gt;真的忘记了为什么要买黑莓手机，也许是自己手机太老已没有软件支持；也许是受 &lt;a href="http://www.ipoisson.net"&gt;P阿姨&lt;/a&gt; 的不断诱惑；也许是因为黑莓的软件是 Java 编写的；更也许是 iPhone&amp;amp;G1 太贵了让我望尘却步...不管怎么说，我于2008年12月14日正式入黑莓系，控应该还达不到 XD。&lt;/p&gt;
&lt;p&gt;本来想要买 8820，主要是考虑到在北京可能 WIFI用到的比较多，不过后来听说黑莓对 WIFI 的支持不是很好，而且我也很热衷于 8310 red 版的外观...后来想想还是先买一个 8310，如果用 WIFI 的话就在买一个 iTouch...（iTouch 是受 &lt;a href="http://utombox.com"&gt;Utom&lt;/a&gt; 同学的诱惑）&lt;/p&gt;
&lt;p&gt;说道买黑莓还得感谢 &lt;a href="http://blog.donews.com/CNBorn/"&gt;CNBorn&lt;/a&gt; 同学的推荐的店家，价格合适且质量还过的去，而且卖家因我白去一趟还特意给我一个小小的惊喜：原装耳机和4G的内存卡，而且服务还不错。不过幸好没有在大学生联盟的天津卖家，七楼那里购买（&lt;a href="http://www.52blackberry.com/thread-159426-1-1.html"&gt;原因看这里&lt;/a&gt;），实在是让人汗颜...&lt;/p&gt;
&lt;p&gt;最后还是感谢 &lt;a href="http://www.ipoisson.net"&gt;P阿姨&lt;/a&gt; 再我购机之前的指点以及分享相关软件，主题和资料 :P&lt;/p&gt;</summary><category term="手机"></category><category term="黑莓"></category></entry><entry><title>初学 git 入门</title><link href="http://icyleaf.com/2008/11/new-guy-to-git" rel="alternate"></link><updated>2008-11-07T15:22:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2008-11-07:2008/11/new-guy-to-git</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;Git 是用于 Linux 内核开发的版本控制工具。与常用的版本控制工具 CVS, Subversion 等不同，它采用了分布式版本库的方式，不必服务器端软件支持，使源代码的发布和交流极其方便。Git 的速度很快，这对于诸如 Linux kernel 这样的大项目来说自然很重要。Git 最为出色的是它的合并跟踪（merge tracing）能力。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;当前大多数人用的还应该是 SVN 服务，不过上次见到 &lt;a href="http://blog.donews.com/CNBorn"&gt;CNBorn&lt;/a&gt; 同学使用 ~~git~~（Bazzer） 做版本控制，其实知道它很早不过没有过多的了解，在我稍微了解之后发现 git 比 svn 更具潜力，可惜对于 PHP 的用户来说还没有多少人开始用 git 甚至我在 PHPChina 的论坛看到有人问 git 的问题，居然有人回答 git 是什么...&lt;/p&gt;
&lt;p&gt;同样 git 支持多平台且对于 Windows 的用户也有 GUI 的管理界面。通过几天的了解是使用稍微掌握了一点入门的东西（以下都是命令行的东西，如果你想学习使用 GUI 的操作请看&lt;a href="http://gitcasts.com/posts/git-on-windows"&gt;此讲解视频&lt;/a&gt;）；&lt;/p&gt;
&lt;p&gt;首先是下载并安装 &lt;a href="http://git-scm.com/download"&gt;git&lt;/a&gt;。接着设置用户标识：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="n"&gt;yourname&lt;/span&gt;
$ &lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;然后创建一个目录作为版本库：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;$ &lt;span class="n"&gt;mkdir&lt;/span&gt; &lt;span class="n"&gt;examplecd&lt;/span&gt; &lt;span class="n"&gt;examplegit&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;把本地文件同步到远程 git host 服务网站上面&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c"&gt;# 添加文件&lt;/span&gt;
$ &lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;

&lt;span class="c"&gt;# 提交说明并提交&lt;/span&gt;
$ &lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;commit&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;first commit&amp;#39;&lt;/span&gt;

&lt;span class="c"&gt;# 添加到远程地址，这个地址不固定，以 git hosts 提供地址为准&lt;/span&gt;
$ &lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;remote&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;origin&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;

&lt;span class="c"&gt;# 提交 origin 到 master&lt;/span&gt;
$ &lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;push&lt;/span&gt; &lt;span class="n"&gt;origin&lt;/span&gt; &lt;span class="n"&gt;master&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;另外，如果使用网上的 git host 服务，还涉及到设置 ssh public key 的问题，各个平台有些细微的差别，大家看 github 网站的&lt;a href="http://github.com/guides/providing-your-ssh-key"&gt;相关帮助&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;如果你想系统的学习 git， 不妨通读下 &lt;a href="http://roclinux.cn/?p=914"&gt;《看日记学git》系列文章&lt;/a&gt;&lt;/p&gt;</summary><category term="git"></category></entry><entry><title>校内网，海内网，开心网用户隐私查看器</title><link href="http://icyleaf.com/2008/10/the-school-network-network-happy-at-home-and-network-user-privacy-viewer" rel="alternate"></link><updated>2008-10-10T17:56:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2008-10-10:2008/10/the-school-network-network-happy-at-home-and-network-user-privacy-viewer</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;更新&lt;/strong&gt;：目前校内网已经修补了此漏洞，所以大家可以放弃了，除非你想抓住那 1% 的机会&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;你想查看他或她的私隐信息吗？如果你说的他或她是校内网，海内网，开心网的用户，那么请你尝试一下，校内网，海内网，开心网用户隐私查看器。通过这个工具，你可以轻松的获得用户的相册照片，日志文章以及状态（迷你博客）的内容。恩...趁着目前都还没有打补丁之前。不要做坏事哦～&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;工具&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://labs.icyleaf.com/tools/sns_user_informations.php"&gt;校内网，海内网，开心网用户隐私查看器&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此工具重点做的是校内网的功能模块，对于海内网和开心网的用户，只是显示了用户的相关链接。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;使用说明&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;首先！必须先登录网站系统之后才进行操作！
无论是校内网，海内网还是开心网的用户，首先都需要获得用户的ID，那么怎么获得呢，很简单，只要打开用户的个人界面，查看地址的末尾的数字。一般会以下列的方式出现：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;xiaonei&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;do&lt;/span&gt;?&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;123456
&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hainei&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;?&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;123456
&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kaixin001&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;?&lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;123456
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;数字前面的就可以看出来是用户ID。获得用户ID之后，只要把用户ID填入到校内网，海内网，开心网用户隐私查看器的相应输入框，并选择是哪个网站的用户，点击”Get it!“，稍等片刻就会获得用户的相关链接。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;原理&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;由于校内网和海内网均属于一个团队开发出来的，所以在系统但自身机制上的问题，可以通过地址绕过的方式查看用户的相册，日志，状态记录等等非用户资料信息。但是开心网可能考虑到用户的安全性，在默认选项上安全系数提高了一级。那么到底是哪里提供了呢，好的，我简单讲解一下，对于校内网和海内网，用户无论是创建相册还是添加日志和状态记录，默认的隐私属性（谁能浏览）为”全站用户可见”，这就导致了校内网，海内网，开心网用户隐私查看器的出现。而开心网除了日志之外，其相册，记录默认为“好友可见”。所以，可查看的资源只有日志，还有极少数的用户可能会把相册的隐私属性设置为”全站用户可见”。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;补救方法&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;等待系统的修改，或者系统可能就是为了这样...&lt;/li&gt;
&lt;li&gt;手动修改...把隐私属性修改为“好友可见”或其他。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;特别声明&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;本工具只为技术交流使用，请勿做非法事情，如有此事请自己承担法律责任！切记！切记！&lt;/p&gt;</summary><category term="PHP"></category><category term="校内"></category><category term="海内"></category><category term="开心网"></category></entry><entry><title>入手HP6520</title><link href="http://icyleaf.com/2008/06/buyed-hp6520" rel="alternate"></link><updated>2008-06-30T11:49:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2008-06-30:2008/06/buyed-hp6520</id><summary type="html">&lt;p&gt;&lt;img alt="hp6520" src="http://photo1.bababian.com/upload9/20080630/CEB41D28C79FE8923DDBBEB6101E23C6_500.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;前天在中关村入手的，哈哈
o(∩_∩)o...惠普6520(054)，多年的梦想终于完成了，我的075Q计划延期完成，虽然晚了半年之久，但是能遇到一个自己喜欢的机型和价位比那个时候为了限制价格买本还是很满足的。&lt;/p&gt;
&lt;p&gt;昨天把卖家给我的系统格掉了，装了自己刻的系统（WinodwsXP+Linux
Mint），由于还没有怎么测试，这里初步说一下这两天的使用感受，买本是贴了屏膜和键盘保护，外加了1G的内存，在玩奥妮之刃(oniblade)的时候音效全开，一点也不卡，画面细腻。而在玩鬼泣4PC试玩版的时候，由于本的显卡仅支持Dx9c，所以使用的这个进入的游戏，画面效果很好，跑起来却非常的卡...我不知道到哪开启帧的监测...&lt;/p&gt;
&lt;p&gt;在安装一些大体积的程序（MyEclipse，PhotoShop CS3，Fireworks
CS3的时候，安装速度这叫一个快，看来那1G内存不是白加的，哈哈。&lt;/p&gt;
&lt;p&gt;机器本身的音箱效果一般，就比普通的喇叭好些，而且只有在右边安放，在使用中感觉只有单声道的效果，不过我对这个并不感冒，外配一个好的耳机或外设音箱就ok了:)&lt;/p&gt;
&lt;p&gt;Linux的安装也很顺利，我安装了Ubuntu和Linux
Mint，安装速度也是很快的，完成后不需要自己在另装驱动，不错。&lt;/p&gt;
&lt;p&gt;另外网上所说的硬盘“嘎嘎”响的问题我这也有出现，不过是在进行读写硬盘大操作的时候才会出现，正常现象。散热效果还是蛮理想的，一下午的时候也只是温温的感觉。&lt;/p&gt;
&lt;p&gt;机器基本上还没有怎么使用，现在激活电池阶段，以后就好了～～呵呵(\^___\^)&lt;/p&gt;
&lt;p&gt;更过实物照片：&lt;a href="http://picasaweb.google.com/icyleaf.cn/NoteBook"&gt;Picasa&lt;/a&gt; | &lt;a href="http://www.flickr.com/photos/icyleaf/sets/72157605892268961/"&gt;Flickr&lt;/a&gt;&lt;/p&gt;</summary><category term="nootbook"></category></entry><entry><title>标签(Tag)的数据库设计</title><link href="http://icyleaf.com/2008/06/tags-database-schemas" rel="alternate"></link><updated>2008-06-21T10:14:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2008-06-21:2008/06/tags-database-schemas</id><summary type="html">&lt;p&gt;原文来自：&lt;a href="http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html"&gt;Then each went to his own home&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;原文作者：&lt;a href="http://www.pui.ch/phred/about"&gt;Philipp Keller&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;译者注：本文在涉及到专业术语或者译者表达不明白的地方均会保留原英文。&lt;/p&gt;
&lt;p&gt;最近，在&lt;a href="http://lists.del.icio.us/pipermail/discuss/2005-April/002827.html"&gt;del.icio.us mailinglist&lt;/a&gt;（译者按：应该是美味书签的讨论版块。以下del.icio.us翻译为&lt;strong&gt;美味书签&lt;/strong&gt;）上面发了一个问题：“有人知道美味书签的数据库设计吗？”。之后我得到了一些回复，所以我想把这部分东西的知识分享给大家。&lt;/p&gt;
&lt;h2&gt;疑问&lt;/h2&gt;
&lt;p&gt;当你要为一个书签添加你认为需要的一个或多个标签时（或日志或其他）其数据库是如何设计的？然后，执行查询时取消这些书签中标签的合集（&lt;a href="http://en.wikipedia.org/wiki/Union_%28set_theory%29"&gt;union&lt;/a&gt;）或交集（&lt;a href="http://en.wikipedia.org/wiki/Intersection_%28set_theory%29"&gt;intersection&lt;/a&gt;）。也能从搜索结果中减少一些标签。&lt;/p&gt;
&lt;p&gt;大致有三种不同的解决方案：（&lt;strong&gt;注意&lt;/strong&gt;：如果你开发了一个网站使得任何人都可以添加标签，而且是一个较大规模的网站则请务必看下其作者写的另外一篇文章：&lt;a href="http://www.pui.ch/phred/archives/2005/06/tagsystems-performance-tests.html"&gt;标签系统的性能测试&lt;/a&gt;）&lt;/p&gt;
&lt;h2&gt;“MySQLicious” 方法(solution)&lt;/h2&gt;
&lt;p&gt;在这个方法中仅架构了一个表，它是去规范化（&lt;a href="http://en.wikipedia.org/wiki/Denormalization"&gt;denormalized&lt;/a&gt;）表。&lt;/p&gt;
&lt;p&gt;这个类型被叫做“MySQLicious
方法(solution)”，因为MySQLicious使用这种结构可以把美味书签的数据导入到一个表中。&lt;/p&gt;
&lt;p&gt;译者注：MySQLicious是一个把del.icio.us书签镜像到MySQL数据库中的工具。&lt;/p&gt;
&lt;h3&gt;&lt;span style="color: #800000;"&gt;交集(AND)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;查询方式： “search+webservice+semweb”:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;FROM&lt;/span&gt; `&lt;span class="n"&gt;delicious&lt;/span&gt;`&lt;span class="n"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt; &lt;span class="n"&gt;LIKE&lt;/span&gt; &amp;quot;&lt;span class="c"&gt;%search%&amp;quot;AND tags LIKE &amp;quot;%webservice%&amp;quot;AND tags LIKE &amp;quot;%semweb%&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h3&gt;&lt;span style="color: #800000;"&gt;合集(OR)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;查询方式： “search|webservice|semweb”:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;FROM&lt;/span&gt; `&lt;span class="n"&gt;delicious&lt;/span&gt;`&lt;span class="n"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt; &lt;span class="n"&gt;LIKE&lt;/span&gt; &amp;quot;&lt;span class="c"&gt;%search%&amp;quot;OR tags LIKE &amp;quot;%webservice%&amp;quot;OR tags LIKE &amp;quot;%semweb%&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h3&gt;&lt;span style="color: #800000;"&gt;减少(Exclusion)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;查询方式： “search+webservice-semweb”&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;FROM&lt;/span&gt; `&lt;span class="n"&gt;delicious&lt;/span&gt;`&lt;span class="n"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt; &lt;span class="n"&gt;LIKE&lt;/span&gt; &amp;quot;&lt;span class="c"&gt;%search%&amp;quot;AND tags LIKE &amp;quot;%webservice%&amp;quot;AND tags NOT LIKE &amp;quot;%semweb%&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h3&gt;&lt;span style="color: #800000;"&gt;结论&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;优点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;只用一个表。&lt;/li&gt;
&lt;li&gt;查询方式简单易懂。&lt;/li&gt;
&lt;li&gt;一次就能获得全文搜索结果，可能速度快一些。&lt;/li&gt;
&lt;li&gt;我猜测查询在基于&lt;a href="http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html#comment-57"&gt;良好&lt;/a&gt;的&lt;a href="http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html#comment-62"&gt;参数&lt;/a&gt;下是相当的
    &lt;span style="text-decoration: line-through;"&gt;快（[Peter
    Cooper][]的博客也提到：去规范化！去规范化！去规范化！）&lt;/span&gt;
    慢的。全文搜索会稍微提速，我做了一个&lt;a href="http://www.pui.ch/phred/archives/2005/06/tagsystems-performance-tests.html"&gt;我的配置测试&lt;/a&gt;来验证它。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.pui.ch/phred/archives/2005/05/tags-with-mysql-fulltext.html"&gt;在我随后的日志交待使用MySQL fulltext出来有关标签的事情&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;缺点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每个书签的标签数量是有限的。通常情况下是在数据库中使用一个256字节的域（VCHAIR），否则，假设你用&lt;strong&gt;Text&lt;/strong&gt;或类似的域，则速度将会慢下来。&lt;/li&gt;
&lt;li&gt;如果你注意了（就像&lt;a href="http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html#comment-63"&gt;Patrice&lt;/a&gt;那样）你会发现当你以“websearch”使用&lt;strong&gt;Like
    “%search&lt;/strong&gt;”搜索标签时它也能搜索到，当你修改并使用&lt;strong&gt;Like
    “%search%&lt;/strong&gt;”时你最终必须使用一个混乱的解决方法：在标签头添加一个空格，这样才能使其工作。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;“Scuttle” 方法(solution)&lt;/h2&gt;
&lt;p&gt;分离（Scuttle）字段，并归类到两个表中。右图表“scCategories”是一个标签表，通过一个外来的ID链接书签表。&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;&lt;span style="color: #800000;"&gt;交集(AND)&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;查询方式：“bookmark+webservice+semweb”:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.*&lt;/span&gt;&lt;span class="n"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;scBookmarks&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scCategories&lt;/span&gt; &lt;span class="n"&gt;cWHERE&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bIdAND&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="n"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;bookmark&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;webservice&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;semweb&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="n"&gt;GROUP&lt;/span&gt; &lt;span class="n"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bIdHAVING&lt;/span&gt; &lt;span class="n"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bId&lt;/span&gt; &lt;span class="p"&gt;)=&lt;/span&gt;3
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;首先，当搜索的标签为“bookmark”，“webservice“或“semweb”（例如：&lt;strong&gt;&lt;code&gt;c.category IN ('bookmark', 'webservice', 'semweb')&lt;/code&gt;&lt;/strong&gt;）时所有名为"bookmark"的标签都会被搜索，然后所有包含这三个标签的书签将筛选出来
(&lt;strong&gt;&lt;code&gt;HAVING COUNT(b.bId)=3&lt;/code&gt;&lt;/strong&gt;).&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;&lt;span style="color: #800000;"&gt;合集(OR)&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;查询方式：“bookmark|webservice|semweb”:&lt;/p&gt;
&lt;p&gt;Just leave out the &lt;code&gt;HAVING&lt;/code&gt; clause and you have union:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.*&lt;/span&gt;&lt;span class="n"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;scBookmarks&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scCategories&lt;/span&gt; &lt;span class="n"&gt;cWHERE&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bIdAND&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="n"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;bookmark&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;webservice&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;semweb&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="n"&gt;GROUP&lt;/span&gt; &lt;span class="n"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bId&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h3&gt;&lt;span style="color: #800000;"&gt;减少(Exclusion)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;查询方式：“bookmark+webservice-semweb”，意味着：bookmark AND webservice AND
NOT semweb.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;scBookmarks&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scCategories&lt;/span&gt; &lt;span class="n"&gt;cWHERE&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bIdAND&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="n"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;bookmark&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;webservice&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="n"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bId&lt;/span&gt; &lt;span class="n"&gt;NOTIN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bId&lt;/span&gt; &lt;span class="n"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;scBookmarks&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scCategories&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bId&lt;/span&gt; &lt;span class="n"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;semweb&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;GROUP&lt;/span&gt; &lt;span class="n"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bIdHAVING&lt;/span&gt; &lt;span class="n"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bId&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;2
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;省略掉 &lt;strong&gt;&lt;code&gt;HAVING COUNT&lt;/code&gt;&lt;/strong&gt;
会导致搜索方式变为“bookmark|webservice-semweb”.&lt;/p&gt;
&lt;p&gt;信息来源：&lt;a href="http://www.metafilter.com/user/26222"&gt;Rhomboid&lt;/a&gt;写的&lt;a href="http://ask.metafilter.com/mefi/34897#544185"&gt;helping me out with this query&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;&lt;span style="color: #800000;"&gt;结论&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;我猜测这个解决方案主要有利点是使得他更正常化，比第一个解决方案比较而言，好处在于可以为每一个书签添加无限数量的标签。&lt;/p&gt;
&lt;h2&gt;&lt;a name="toxi"&gt;“Toxi” 方法(solution)&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://toxi.co.uk/"&gt;Toxi&lt;/a&gt;
提出了一个三个表的结构，通过表”tagmap“的书签和标签的n-to-m关联。每一个标签都可以在不同的书签一期使用，反之亦然。这种数据库结构也被用在&lt;a href="http://wordpress.org/"&gt;Wordpress&lt;/a&gt;之中。&lt;/p&gt;
&lt;h3&gt;&lt;span style="color: #800000;"&gt;交集(AND)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;查询方式：“bookmark+webservice+semweb”&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.*&lt;/span&gt;&lt;span class="n"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;tagmap&lt;/span&gt; &lt;span class="n"&gt;bt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bookmark&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="n"&gt;tWHERE&lt;/span&gt; &lt;span class="n"&gt;bt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tag_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tag_idAND&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="n"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;bookmark&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;webservice&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;semweb&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="n"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bookmark_idGROUP&lt;/span&gt; &lt;span class="n"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;idHAVING&lt;/span&gt; &lt;span class="n"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="p"&gt;)=&lt;/span&gt;3
&lt;/pre&gt;&lt;/div&gt;


&lt;h3&gt;&lt;span style="color: #800000;"&gt;合集(OR)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;查询方式：“bookmark|webservice|semweb”&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.*&lt;/span&gt;&lt;span class="n"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;tagmap&lt;/span&gt; &lt;span class="n"&gt;bt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bookmark&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="n"&gt;tWHERE&lt;/span&gt; &lt;span class="n"&gt;bt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tag_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tag_idAND&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="n"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;bookmark&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;webservice&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;semweb&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="n"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bookmark_idGROUP&lt;/span&gt; &lt;span class="n"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h3&gt;&lt;span style="color: #800000;"&gt;减少(Exclusion)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;查询方式：“bookmark+webservice-semweb”，意味：bookmark AND webservice AND
NOT semweb.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;bookmark&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tagmap&lt;/span&gt; &lt;span class="n"&gt;bt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="n"&gt;tWHERE&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bookmark_idAND&lt;/span&gt; &lt;span class="n"&gt;bt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tag_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tag_idAND&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="n"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Programming&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Algorithms&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="n"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="n"&gt;NOT&lt;/span&gt; &lt;span class="n"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="n"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;bookmark&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tagmap&lt;/span&gt; &lt;span class="n"&gt;bt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bookmark_id&lt;/span&gt; &lt;span class="n"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;bt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tag_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tag_id&lt;/span&gt; &lt;span class="n"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Python&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;GROUP&lt;/span&gt; &lt;span class="n"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;idHAVING&lt;/span&gt; &lt;span class="n"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;2
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;省略掉 &lt;strong&gt;&lt;code&gt;HAVING COUNT&lt;/code&gt;&lt;/strong&gt;
会导致搜索方式变为“bookmark|webservice-semweb”.&lt;/p&gt;
&lt;p&gt;信息来源：&lt;a href="http://www.metafilter.com/user/26222"&gt;Rhomboid&lt;/a&gt;写的&lt;a href="http://ask.metafilter.com/mefi/34897#544185"&gt;helping me out with this query&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;span style="color: #800000;"&gt;结论&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;优点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以为每个标签节省额外的信息（描述，分类等）&lt;/li&gt;
&lt;li&gt;这是一个最正常化的解决方案（即，第三范式：&lt;a href="http://en.wikipedia.org/wiki/3NF"&gt;3NF&lt;/a&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;缺点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;当修改或删除书签后，需要删除中间表的相应数据（When altering or
    deleting bookmarks you can end up with tag-orphans）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你想要更复杂的查询，比如”&lt;strong&gt;(bookmarks OR bookmark) AND (webservice or
WS) AND NOT (semweb or
semanticweb)&lt;/strong&gt;“这样的查询语句，我建议参见以下查询/计算过程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;为每一个标签出现在你的”“tag-query”时执行一个查询（Run a query for
    each tag appearing in your
    “tag-query”）：&lt;strong&gt;&lt;code&gt;SELECT b.id FROM tagmap bt, bookmark b, tag t WHERE bt.tag_id = t.tag_id AND b.id = bt.bookmark_id AND t.name = "semweb"&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;把每一个编号集从结果中导到一个数值里面（使用你喜欢的编码语言），这样可以缓存你想要的数组。&lt;/li&gt;
&lt;li&gt;使用合集或交集或其他方式限制数组。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;通过这种方式，你也可以查询&lt;code&gt;"(del.icio.us|delicious)+(semweb|semantic_web)-search"，这种类型的查询（即，括号内）利用去规范化的&lt;/code&gt;“MySQLicious
solution”&lt;code&gt;不能这样做。&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这是最灵活的数据结构和我猜想它的效果相当好（即，使用一些缓存技术）。&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2006年5月更新&lt;/strong&gt;：这篇文章获得了大家的注视。我真的不是为此而准备的！看来大家不断的提到了他，甚至一些网站转载我的文章，我认为，这些不同方式的理论的知识应该归功于：&lt;a href="http://nanovivid.com/projects/mysqlicious/"&gt;MySQLicious&lt;/a&gt;,
&lt;a href="http://sourceforge.net/projects/scuttle/"&gt;scuttle&lt;/a&gt;, &lt;a href="http://toxi.co.uk/"&gt;Toxi&lt;/a&gt;以及所有参与并贡献的评论者（请务必阅读！）&lt;/p&gt;
&lt;p&gt;p.s. 感谢&lt;a href="http://toxi.co.uk/"&gt;Toxi&lt;/a&gt;发给我关于三个表结构的疑问，Benjamin
Reitzammer为我指点的&lt;a href="http://laughingmeme.org/archives/002918.html"&gt;文章&lt;/a&gt;（一个很好的标签查询参考）和powerlinux提供的&lt;a href="http://sourceforge.net/projects/scuttle/"&gt;scuttle&lt;/a&gt;指引。&lt;/p&gt;
&lt;h2&gt;扩展阅读&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;ins datetime="2005-06-28T09:01:13-02:00"&gt;[Taglist: a mailing list
    dedicated to schemas with tagging][]&lt;/ins&gt;&lt;/li&gt;
&lt;li&gt;&lt;ins datetime="2005-06-26T15:02:02-02:00"&gt;[Tagschema: A blog
    dedicated to tagging schemas][]&lt;/ins&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.bigbold.com/snippets/tags/tagging"&gt;Tag-related Queries on Snippets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;ins datetime="2005-05-08T18:28:16-02:00"&gt;&lt;a href="http://www.getluky.net/freetag/"&gt;Freetag&lt;/a&gt; is a php
    “library” with which you can add tags to whatever object you like.
    It actually uses the “toxi schema”.&lt;/ins&gt;&lt;/li&gt;
&lt;li&gt;&lt;ins datetime="2005-05-10T09:45:38-02:00"&gt;Hammy &lt;a href="http://hellojoseph.com/tags-howto.php"&gt;gives an insight&lt;/a&gt;
    how he did his tagging system with “less DB and more code” (that is:
    regular expressions), interesting!&lt;/ins&gt;&lt;/li&gt;
&lt;li&gt;Brad Choate &lt;a href="http://bradchoate.com/weblog/2004/10/06/delicious"&gt;has got some ideas&lt;/a&gt; which tag queries should be
    possible&lt;/li&gt;
&lt;li&gt;Feedmaker has written &lt;a href="http://blog.feedmarker.com/2005/04/26/tagging-in-mysql/"&gt;a sort of reply to this article&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</summary><category term="DB"></category><category term="schemas"></category><category term="Tag"></category></entry><entry><title>如何制定免费短信提醒新邮件</title><link href="http://icyleaf.com/2008/06/how-to-prepare-for-free-sms-alerts-for-new-mail" rel="alternate"></link><updated>2008-06-16T18:22:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2008-06-16:2008/06/how-to-prepare-for-free-sms-alerts-for-new-mail</id><summary type="html">&lt;p&gt;邮箱每个人都有，而且大部分应该还不只一个而已，分类使用，工作用一个，生活用一个，申请会员/社区再用一个....不过多少个一般都会有一个比较重要的，和朋友交流的email。比如我，平时和朋友聊天以及WordPress的留言自动邮件都是发到一个指定的邮件里。一旦到了周六，周日休息的时候，可能会错过一些重要的邮件，而用手机上网收发邮件虽然可以，但是我们总可能一直在刷新吧，所以几天突然想起来邮箱都是由自动转发功能的，那么利用什么做中间介质发短信通知到自己的手机上呢？&lt;/p&gt;
&lt;p&gt;中国移动间接的为我们提供了一个非常棒的服务：&lt;a href="http://mail.139.com"&gt;手机邮箱(&lt;/a&gt;又名139邮箱)，中国移动免费提供1G的服务，直接申请就可以了，然后无论什么时候，只要139邮箱有了新邮件，它就会发一个免费短信到自己的手机上，而且还支持在手机上阅读哦！那么我们开始行动吧。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果你要设定转发所有的邮件请按照这个步骤：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这里我拿Gmail做例子，点击设置（settings）-&gt;
转发和POP/IMAP（Forwarding and
POP/IMAP）。勾选“转发邮件副本到（Forward a copy
of incoming mail
to）”再在后面填写上你的手机邮箱填上，在保存即可。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果你要设定转发符合条件的邮件请按照这个步骤：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;同样以Gmail为例子，点击设置（settings）-&gt;关铝其（Filters），点击新建过滤器（Create
a new filter)，然后根据提示的配置框填写你指定的参数即可，填写完成后，点击”测试搜索"可以预览你的设置是否符合你的要求，如果没有达到，请重新设置，再测试，直到达成你的要求后点击下一步，然后勾选倒数第二项，“转发到（Forward it to）”然后再在后面填写上你的手机邮箱填上，在保存即可。&lt;/p&gt;
&lt;p&gt;注意：&lt;strong&gt;这两个方法不能同时实现，任选其一&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;再找一个邮件测试下，一会你就能听到自己手机的短信铃声咯～祝大家好运!&lt;/p&gt;</summary><category term="Google"></category></entry><entry><title>北京的卤煮</title><link href="http://icyleaf.com/2008/05/beijings-lu-zhu" rel="alternate"></link><updated>2008-05-26T20:50:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2008-05-26:2008/05/beijings-lu-zhu</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;卤煮火烧在北京是一种尽人皆知的食品，它是将火烧和炖好的猪肠和猪肺放在一起煮（有时也用猪腰子），买一碗主食副食和热汤都有了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;据我所知，这火烧每个地方都是不一样的，有的甚至都不是一个种东西，天津的烧饼有些像千层饼，北京的这个卤煮火烧我感觉和发面饼差不多-
-！上次去西单明珠商场6楼吃过一次卤煮火烧，不知道就是那样，还是我买的那家不正宗，蛮难吃的....刚才在豆瓣溜达的时候发现了，一个介绍&lt;a href="http://www.douban.com/group/beijingluzhu/"&gt;北京卤煮的小组&lt;/a&gt;，到目前也只有2个帖子。我无耻的人家的辛苦劳动扒了过来。同时感谢&lt;a href="http://www.douban.com/group/beijingluzhu/"&gt;北京卤煮的小组&lt;/a&gt;的组长让我知道了真正的卤煮，回来有时间一定再去尝尝。&lt;/p&gt;
&lt;p&gt;历数北京小吃，只要没有宗教禁忌的，顶多五个之内就会数到卤煮火烧，好这口儿的人都亲切地称它“卤煮”。跟豆汁儿不一样的是这不是北京独有，在新疆喀什和
乌鲁木齐的夜市上有与其非常相似的做法跟馍一同沉浮的是羊下水，也巨香，西安的著名小吃“葫芦头泡馍”大约也可以归入这类。北京过去还有一种叫赵火烧的，
也类似现如今的这一口吃食。&lt;/p&gt;
&lt;p&gt;据说卤煮二字的意思就是与多种香料同煮，火烧二字则说明了其主料。卤煮火烧是从宫廷的苏造肉演变而来，为降低成本，把五花肉换成了下水，
既顶事儿又价廉，因而深得俺们这类贫苦大众的喜爱。具体制作过程是这样的：把处理好的猪小肠和猪肺投入用多种香料、调料配制的卤汤煮，快好时放入死面火
烧、炸豆腐片，待到肠、肺烂熟，火烧煮透又不脱形的时候捞出，小肠切段，肺、火烧、炸豆腐切块，浇卤汁，加蒜汁、酱豆腐汁、香菜，醋、辣椒油根据口味自行
添加。得和\~&lt;/p&gt;
&lt;p&gt;看起来不复杂，做起来可费了劲儿了，再加上这东东又不贵，所以大多数人都在外头吃，除了我，没听说过几个自己做的。&lt;/p&gt;
&lt;p&gt;一，气味&lt;/p&gt;
&lt;p&gt;猪小肠毕竟处于消化道的偏下位置，所以一定要洗得干净。洗不干净的话，煮出来的异味儿是加多少蒜汁、辣椒都压不下去的&lt;/p&gt;
&lt;p&gt;二，火候&lt;/p&gt;
&lt;p&gt;小肠要煮至烂软，不能跟橡皮筋似的嚼不断、吞不下；火烧要煮到吸足卤汤，切开以后没有白碴儿，但也不能表层与内层完全分离脱落，变成一锅烂粥；炸豆腐要外硬里软，充满空洞&lt;/p&gt;
&lt;p&gt;三，分量&lt;/p&gt;
&lt;p&gt;既然是劳苦大众的享受，就一定要分量够，而且最好吃也相对最贵的小肠所占比例越高越好。师傅们经年累月地干同一件事情，早就熟能生巧了，别看不象肯德基、麦当劳似的有定量的控制，可一份菜底儿该加多少肠、多少肺头，手底下都跟有杆秤似的&lt;/p&gt;
&lt;p&gt;京城的所有卤煮店里，最负盛名的毫无疑问就是前门的陈记卤煮小肠了，如今已经搬到了取灯胡同。卤煮火烧是一口儿重的吃食儿，所以得多加蒜
汁儿和香菜，最好再配上一“小二”，倒不是说啤的镇不住，主要是忒占地儿。既然是下水货，您就甭太拿自个儿的解剖知识当回事儿，要夹起块肺头就琢磨：这白
了咕叽的一小截管子究竟是气管还是支气管呢？然后试图把几块东西拼到一起恢复猪的某器官，那这顿饭就甭吃了。“吱溜”走一口白酒，夹块肥肠儿，半寸长的香
菜杆儿在口中脆响，这会儿要有人问您：“吃鱼翅么？”估计您得回一句：“鱼翅是谁？”&lt;/p&gt;
&lt;p&gt;陈记卤煮小肠店（又名&lt;strong&gt;小肠陈&lt;/strong&gt;）&lt;/p&gt;
&lt;p&gt;地址: 北京崇文区（&lt;strong&gt;前门&lt;/strong&gt;）取灯胡同东口&lt;/p&gt;
&lt;p&gt;还有一份北京卤煮点的详单：&lt;a href="http://www.douban.com/group/topic/2867917/"&gt;北京卤煮店一览&lt;/a&gt;&lt;/p&gt;</summary><category term="卤煮"></category><category term="北京"></category></entry><entry><title>CSS中background-image的另类使用</title><link href="http://icyleaf.com/2008/05/css-background-image-in-the-use-of-alternative" rel="alternate"></link><updated>2008-05-10T10:56:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2008-05-10:2008/05/css-background-image-in-the-use-of-alternative</id><summary type="html">&lt;p&gt;在CSS众多的样式当中，background可以说是扮演着重要的角色，它可以设置对象的背景样式。如颜色或者使用一张图片代替，今天我要多说两句的就是使用一张图片的参数：image。准确的来说应该是background-image。我们可以这样用它：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;background&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;icyleaf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cn&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;logo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jpg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;这都是可以的，所以说css的自由度很高，这点我很喜欢。其实css显示图片分3种，第一种是单纯的显示一个图片；第二种称之为&lt;strong&gt;CSS Sprites&lt;/strong&gt;，也就是说把若干小图片合成一个大图片，然后通过background的postion参数实现效果，第三种就是我们今天说的另类用法，它也有学名称之为&lt;strong&gt;Inline images&lt;/strong&gt;。实现声明一点，这个方法不适用于IE浏览器，恩，没错，IE，我们都遗弃你了。（关于CSS Sprites 的描述信息来自&lt;a href="http://7career.org/2008/02/hpws-1.html"&gt;7career.org&lt;/a&gt;）&lt;/p&gt;
&lt;p&gt;CSS Sprites是一种把所有的图片都以base64编码以源代码的形式写在CSS文件里，格式是这样的：&lt;strong&gt;data:[&lt;mediatype&gt;][;base64],&lt;data&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;data:URL&lt;/code&gt; 标签是在1995年第一次提出，按&lt;a href="http://tools.ietf.org/html/rfc2397"&gt;RFC2397规范的描述&lt;/a&gt;：它是"allows
inclusion of small data items as 'immediate' data.（允许在页面中包含一些小的即时数据）"。如一个内嵌的的图片可以这样引用：&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;background&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;R0lGODlhCAAIAJEAAOnp6eTk5O7m8AAAACH5BAEAAAIALAAAAAAIAAgAAAINjAMJh2q6DnxOVsqmLQA7&lt;/span&gt;&lt;span class="p"&gt;);}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;这段代码可以在firefox浏览器运行，恩，图片是我取自[mg12][]当前模板的背景图，呵呵(\^___\^)&lt;/p&gt;
&lt;p&gt;base64编码简单的说是，Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。最早使用在windows系统的电子邮件传输的，主要是附件的传输。在那个时候的黑客们也流行过一段base64编码版的木马和病毒。为了简单篇幅，想了解的看&lt;a href="http://www.5dmail.net/html/2004-1-30/200413084348.htm"&gt;这里&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;第一次我也是通过这个方法获取的图片的base64编码，主要原因是网上没有现成的转换这种编码的工具，估计已经被大家所遗忘掉了。我这里简单的写了个PHP代码，实现了图片编码的转换：&lt;/p&gt;
&lt;p&gt;这个在线转换的背景就是上面那段代码，大家可以通过查看网页源码看到。图片的代码转换原理也很简单，通过读取图片的文件并把图片储存在一个数组（或字符串）里面，然后使用base64_encode转换即可～ok，讲解完毕。&lt;/p&gt;</summary><category term="CSS"></category></entry><entry><title>防止电脑操作者患上职业病</title><link href="http://icyleaf.com/2008/04/prevention-of-occupational-diseases-computer-operator" rel="alternate"></link><updated>2008-04-15T17:04:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2008-04-15:2008/04/prevention-of-occupational-diseases-computer-operator</id><summary type="html">&lt;p&gt;&lt;img alt="健康饮食" src="http://pic.yupoo.com/301.my/9745755669cf/d1potjdt.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;早餐应吃好，营养充分，以保证旺盛的精力，并有足够的热量。
中餐应多吃含蛋白质高的食物，如瘦猪肉、牛肉、羊肉、鸡鸭、动物内脏、各种鱼、豆类及豆制品。
晚餐宜清淡，多吃含维生素高的食物，如各种新鲜蔬菜，饭后吃点新鲜水果。&lt;/p&gt;
&lt;p&gt;同时，选用含磷脂高的食物以利健脑，例如蛋黄、鱼、虾、核桃、花生等。&lt;/p&gt;
&lt;p&gt;还要有意识多选用保护眼睛的食物、保护眼睛健康，防止近视及其他眼疾，健眼的食物有各种动物的肝脏、牛奶、羊奶、奶油、小米、核桃、胡萝卜、青菜、菠菜、大白菜、西红柿、黄花菜、空心菜、枸杞子及各种新鲜水果。&lt;/p&gt;
&lt;p&gt;此外，电脑操作者在工作1-2个小时后，应活动一下全身，做眼保健操，只要注意膳食结构和劳逸结合，就能增强身体的抵抗力，防止有关疾病发生。&lt;/p&gt;
&lt;p&gt;“网清茶”又称“电脑茶”,采用以湖北神农架原始决明子、枸杞子、桑叶、菊花和富硒野山茶等为主料，经过现代生物技术精心加工而成。它含有丰富的人体所需决明素(obtusin)、枸杞多糖（LBP）、β-胡萝卜素、维生素A、VC、VE、茶多酚(Camellia sinensis)等天然抗氧化物，能迅速清除体内过量的自由基，阻止脂质过氧化，具抗辐射、消除疲劳、明目健脑和排毒养颜作用，能有效解决电磁辐射引起的电脑网络综合症。&lt;/p&gt;
&lt;p&gt;老用电脑的人，健康会受到多方面的危害。除了不可避免地要接触到电磁辐射外，电脑荧光屏的频繁闪动对眼睛也有较强的刺激作用，让人出现流泪、视力减退、头昏脑涨等不适症状。平时多喝绿茶不仅能起到一定的抗辐射作用，还可以让你的眼睛更舒服一些。&lt;/p&gt;
&lt;p&gt;绿茶中含有的维生素C、维生素E，特别是茶多酚，具有很强的抗氧化活性，可以清除人体内的氧自由基，从而起到抗辐射、增强机体免疫力的作用。此外，茶叶中含有胡萝卜素，它在肠壁和肝脏的作用下，可以转变为维生素A。而维生素A具有滋养眼睛、缓解视疲劳、防治夜盲症的作用。&lt;/p&gt;
&lt;p&gt;茶叶对人体造血机能也有显著的保护作用。二战期间，美国向日本的广岛、长崎上空投掷原子弹后，辐射给那里的人带来了巨大的健康危害。但科学家调查发现，原来有饮茶习惯的人，受辐射损伤较轻，血液病发病率较低，由辐射所引起的死亡率也较低。所以，日本人又把茶称之为“原子时代的饮料”。&lt;/p&gt;
&lt;p&gt;不久前，英国科学家研究还发现，喝茶可以阻止人体中一种酶的合成，这种酶会破坏脑细胞间传递信息的媒介乙酰胆碱。因此，喝茶对常用电脑的上班族来说，又多了项好处——使大脑更敏。&lt;/p&gt;</summary><category term="养生"></category></entry><entry><title>脖子落枕怎么办及治疗方法</title><link href="http://icyleaf.com/2008/04/how-do-stiff-neck-and-neck-treatment" rel="alternate"></link><updated>2008-04-06T20:09:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2008-04-06:2008/04/how-do-stiff-neck-and-neck-treatment</id><summary type="html">&lt;p&gt;前天在朋友家过夜，他的枕头好硬，硬的可以和石头相比较，第二天直接，脖子落枕...脖子落枕真的是很难受啊，如何治疗呢？在网上搜了下&lt;strong&gt;.落枕&lt;/strong&gt;是指人在睡觉或外伤后突感颈部肌肉疼痛，尤以头颈部转动时更甚，引起落枕的原因有：&lt;/p&gt;
&lt;p&gt;1.睡眠时头颈姿势不当；&lt;/p&gt;
&lt;p&gt;2.枕头垫得过高、软硬不当或高低不平；&lt;/p&gt;
&lt;p&gt;3.颈部外伤；&lt;/p&gt;
&lt;p&gt;4.颈部受风着凉；&lt;/p&gt;
&lt;p&gt;5.如为颈椎病引起，可反复“落枕”。&lt;/p&gt;
&lt;p&gt;最难受的这落枕，好则一天就能恢复，坏则两三天还是很疼，很难受，唔，我就是后者，好长时间没有落枕过了...人一生中难免不发生落枕，落枕后自感痛苦，由于它可以“自愈”，很少有人去医院就诊，大部分病人是在家人或同事帮助下进行简易处理，家庭护理显得更为重要。
下面摘几则治疗的方法：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;按摩&lt;/strong&gt;：立落枕者身后，用一指轻按颈部，找出最痛点，然后用一拇指从该侧颈上方开始，直到肩背部为止，依次按摩，对最痛点用力按摩，直至感明显酸胀即
表示力量已够，如此反复按摩2～3遍，再以空心拳轻叩按摩过的部位，重复2～3遍。重复上述按摩与轻叩，可迅速使痉挛的颈肌松弛而止痛。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;热敷&lt;/strong&gt;：采用热水袋、电热手炉、热毛巾及红外线灯泡照射均可起到止痛作用。必须注意防止烫伤。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;选用正红花油&lt;/strong&gt;、甘村山风湿油、云香精等，痛处擦揉，每天2～3次，有一定效果。&lt;/p&gt;
&lt;p&gt;伤湿止痛膏、膨香止痛音外贴颈部痛处，每天更换一次，止痛效果较理想，但病人自感贴膏后颈部活动受到一定限制，孕妇忌用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;耳针&lt;/strong&gt;：耳针埋穴于颈、枕区，以食指尖按压上述耳穴5～10分钟，或以食指端按摩上述耳穴。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;针刺&lt;/strong&gt;：不能前后俯仰者，取大抒、京骨穴、昆仑穴；不能左右回顾者，取肩外俞、后溪、风池穴。一般可取悬钟穴，位于足外洞上三寸，针4～5分，灸3～7壮，亦可按摩此穴，每次15分钟。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;口服去痛片1片&lt;/strong&gt;，有临时止痛之效。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;改变睡眠姿势&lt;/strong&gt;，调整枕头高低，自己扭动脖子。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如为颈椎病引起&lt;/strong&gt;，在体疗科医师指导下，进行家庭自我颈椎牵引疗法。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;落枕严重者&lt;/strong&gt;，局部注射025％奴夫卡因10毫升，止痛效果明显。&lt;/p&gt;
&lt;p&gt;另外提供按摩治疗法：&lt;/p&gt;
&lt;p&gt;①将左手或右手中、食、无名指并拢，在颈部疼痛处寻找压痛点（多在胸锁乳突肌、斜方肌等处），由轻到重按揉5分钟左右。可左右手交替进行。&lt;/p&gt;
&lt;p&gt;②用小鱼际由肩颈部从上到下，从下到上轻快迅速击打两分钟左右。&lt;/p&gt;
&lt;p&gt;③用拇指和食指拿捏左右风池穴、肩井穴1－2分钟。&lt;/p&gt;
&lt;p&gt;④以拇指或食指点按落枕穴（手背第2、3掌骨间，指掌关节后5分处），待有酸张感觉时再持续2－3分钟。&lt;/p&gt;
&lt;p&gt;⑤最后进行头颈部前屈、后仰、左右侧偏及旋转等活动，此动作应缓慢进行，切不可用力过猛。&lt;/p&gt;
&lt;p&gt;像我这一个人生活的只有选择按摩和热敷，多做些颈部活动好了....&lt;/p&gt;</summary><category term="养生"></category></entry><entry><title>如何使用VirtualBox安装Linux系统</title><link href="http://icyleaf.com/2008/03/how-to-use-linux-systems-installed-virtualbox" rel="alternate"></link><updated>2008-03-13T10:12:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2008-03-13:2008/03/how-to-use-linux-systems-installed-virtualbox</id><summary type="html">&lt;p&gt;&lt;a href="http://www.icyleaf.cn/2008/03/12/virtualbox-free-cross-platform-open-source-virtual-machine/"&gt;VirtualBox&lt;/a&gt;也已经介绍过了，昨天是实实在在的用VirtualBox体验了一下
&lt;a href="http://www.linuxmint.com/"&gt;Linux Mint&lt;/a&gt;
系统。这篇日志我就大概的说下如何用VirtualBox安装和汉化Linux
Mint系统，大家先看一个经过简单设置有的效果图：&lt;/p&gt;
&lt;p&gt;[&lt;img alt="image" src="http://pic.yupoo.com/icyleaf/7593153ac070/medium.jpg" title="Click to enlarge" /&gt;][]&lt;/p&gt;
&lt;p&gt;这个背景是系统自带的一个，呵呵(\^___\^)，在介绍 &lt;a href="http://www.icyleaf.cn/2008/03/12/virtualbox-free-cross-platform-open-source-virtual-machine/"&gt;VirtualBox&lt;/a&gt;
的文章里面的截图是系统默认的背景。那么如何使用 VirtualBox 安装 Linux
系统呢，其实很简单的，VirtualBox
这个软件从官方网站下载的时候看似是英文的，其实他支持多国语言，安装之后它就会因系统的语言而变化，Linux
Mint系统就从官方上面下载最新版本的镜像文件就可以了，当前最新版本是4.0。
这里我就不复述下载的过程\~\~&lt;/p&gt;
&lt;p&gt;两者都下载并安装VirtualBox之后，打开它的界面，点菜单的“新建”，安装向导的指示下一步有序操作：先点“下一步”，在随后出来的窗口的名称填入你喜欢的名字，如Linux
Mint或者其他以便自己识别，在系统类型里面他并没有列出具体的Linux的发行版号，只能靠内核的版本确定，这里LinuxMint的内核是Linux2.6。接着是配置虚拟内存，如果你机器的实际内存比较大如1G以上，可以配置虚拟内存到400M-512M。再下一步是设置虚拟硬盘，第一次使用是没有硬盘存在，需要”新建"，如果你不是第一次添加，则通过它的下拉菜单可选是那块虚拟硬盘。如果你是初级用户，在新建硬盘的时候，选择“动态扩展硬盘”即可，现在就完成了运行前的操作。&lt;/p&gt;
&lt;p&gt;[&lt;img alt="image" src="http://pic.yupoo.com/icyleaf/0374153bfabc/medium.jpg" title="Click to enlarge" /&gt;][]&lt;/p&gt;
&lt;p&gt;之后直接点击菜单的“启动”就可以了，恩，没错直接启动就可以。VirtualBox提供了一个人性化的设置，如果你使用的是一个新建的虚拟硬盘，在它首次允许之后会弹出一个“首次运行向导”让你选择引导方式。恩，这和VM有些差别，VM提供一个虚拟的BIOS程序，而VrtualBox没有，不过他提供了一个开机引导方式的快捷键&lt;strong&gt;F12&lt;/strong&gt;，而且也支持LAN的方式，这点很强。&lt;/p&gt;
&lt;p&gt;[&lt;img alt="image" src="http://pic.yupoo.com/icyleaf/1315453bfabe/medium.jpg" title="Click to enlarge" /&gt;][]&lt;/p&gt;
&lt;p&gt;在“首次允许向导”的戒指位置选择上图的操作，并在下拉菜单选择今天我们要按照的LinuxMint硬盘就可以了。
从下图可以看出来，虽然LinuxMint系统是基于Ubuntu系统开发的，但是它默认并不支持多国语言，仅仅只有英语：&lt;/p&gt;
&lt;p&gt;[&lt;img alt="image" src="http://pic.yupoo.com/icyleaf/5550553bfbb0/medium.jpg" title="Click to enlarge" /&gt;][]&lt;/p&gt;
&lt;p&gt;我们选择“Start Linux
Mint"启动系统，这就是像LiveCD版的了，随后会进行系统加载并进入到界面，点击桌面的”Install“会出现一个和Ubuntu以及gOS一样的安装系统的窗体，如果你安装过gOS，也许你会在网上搜如何汉化，他们的汉化方式有些变态，其实也是正确的，在选择系统语言环境的时候在选择框的倒数第二个是简体中文，但是如果你选择了，整个的界面全部会变成乱码。这样不利于我们的操作，所以我采取使用默认的英文，在安装好系统之后再进行汉化，相比之下，英文肯定比看乱码舒服多了。呵呵(\^___\^)&lt;/p&gt;
&lt;p&gt;Linux
Mint安装就很简单了，我就不用说了吧，网上搜搜Ubuntu是如何安装的就知道了～嘿嘿，我就不多打字了～记得找LiveCD的安装教程，Ubuntu还提供了一个文本安装的方式：）&lt;/p&gt;
&lt;p&gt;安装完成之后，在登录界面输入完成你在安装时设置的用户名和密码随后会弹出一个询问向导。主要是为了提示是否开启Root并设置密码以及设置终端在打开时是否随机显示一段英文短句（我没自己看写的是什么），对于root一定要开启并设置一个密码，因为Linux的安全机制问题，尤其涉及到后面的安装软件问题，非常重要哦！&lt;/p&gt;
&lt;p&gt;登录界面之后，首先是要解决中文化的问题，首先确保你的机器已经连接到了互联网上面。连上网之后再进行操作：点击左下角的Mint图标，其实和Windows系统差不多，选择里面的”Control
Center“，在弹出的窗口寻找”Language Support“。随后Language
Support窗口会扫描当然的语言文件，已经提示是否下载，我们选择”Let me
later"，然后再Supported
Language列表中寻找Chinese，并在它后面的方框点击选中，然后再点Apply（应用），程序会从网上下载系统的程序的中文语言文件。这个时候我们就等待吧，如果网速好的话差不多，一杯咖啡的时间：）&lt;/p&gt;
&lt;p&gt;&lt;img alt="语言支持" src="http://pic.yupoo.com/icyleaf/9839353bff58/18rl6ci4.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;下载完成之后，点击“OK”并关闭Linux
Mint系统，其实是要重启，为什么要先关闭呢，因为现在还是开机光盘引导，当然我们要去掉光盘引导。先选择你要启动的系统，然后点击菜单的“设置”，在左侧的列表选择“光驱"之后去掉右边的”加载光驱“，然后再保存。之后就可以启动系统了，启动到grub菜单，选择第一个正常启动。第二个是安全模式，不过我没进去过...菜单选择时间默认是4秒。&lt;/p&gt;
&lt;p&gt;又到了登录界面，我们先不急于登录，而是选择登录界面的"Language"，在选择语言窗口选择”Chinese（China
Mainland）“，在点”Change
Language“。系统立即弹出一个窗口，询问是否在以后登录也使用改变后的语言，我们当然是选择是了，之后我们看到我们熟悉的中国字了！尽情享受吧。
[&lt;img alt="image" src="http://pic.yupoo.com/icyleaf/1904353ac062/medium.jpg" title="Click to enlarge" /&gt;][]&lt;/p&gt;
&lt;p&gt;不过他的中文化也不是非常的完美的，不过还有些地方并没有得到汉化，对于日常的使用并没有什么影响的。昨天我在Linux
Mint下面安装了不少的东西：SciTE，komodo
edit，甚至VirtualBox，本来想在Linux下虚拟一个XP，无奈的是不想再下一个600多M的镜像了...不过我还是特别想看到XP虚拟跑Linux,再在虚拟的Linux在虚拟XP，这个场面肯定很壮观，哈哈
o(∩_∩)o...&lt;/p&gt;
&lt;p&gt;同时也希望我这简单的教程对大家会有所帮助：）&lt;/p&gt;
&lt;p&gt;[&lt;img alt="image" src="http://pic.yupoo.com/icyleaf/7593153ac070/medium.jpg" title="Click to enlarge" /&gt;]: http://pic.yupoo.com/icyleaf/7593153ac070/kd4yys3i.jpg
  [&lt;img alt="image" src="http://pic.yupoo.com/icyleaf/0374153bfabc/medium.jpg" title="Click to enlarge" /&gt;]: http://pic.yupoo.com/icyleaf/0374153bfabc/y5pmsouv.jpg
  [&lt;img alt="image" src="http://pic.yupoo.com/icyleaf/1315453bfabe/medium.jpg" title="Click to enlarge" /&gt;]: http://pic.yupoo.com/icyleaf/1315453bfabe/oe7rf4zx.jpg
  [&lt;img alt="image" src="http://pic.yupoo.com/icyleaf/5550553bfbb0/medium.jpg" title="Click to enlarge" /&gt;]: http://pic.yupoo.com/icyleaf/5550553bfbb0/ybtwst85.jpg
  [&lt;img alt="image" src="http://pic.yupoo.com/icyleaf/1904353ac062/medium.jpg" title="Click to enlarge" /&gt;]: http://pic.yupoo.com/icyleaf/1904353ac062/oj7ws1r8.jpg&lt;/p&gt;</summary><category term="VirtualBox"></category><category term="Linux"></category></entry><entry><title>家常饭：炒馍</title><link href="http://icyleaf.com/2008/03/family-meal-a-large-sum-of-speculation" rel="alternate"></link><updated>2008-03-03T21:00:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2008-03-03:2008/03/family-meal-a-large-sum-of-speculation</id><summary type="html">&lt;p&gt;恩，这几天闹肚子，不知道是我生日那天吃肉太多的关系还是昨天晚上吃臊子面的问题，今天是好难受...&lt;/p&gt;
&lt;p&gt;今中午也没敢在外面吃，空着肚子到现在，现在特想吃我爸爸做的炒馍，可惜人在外地，一会自己摸索着做吧...&lt;/p&gt;
&lt;p&gt;这就是炒馍咯，网上称这个叫做炒馍花...呃，真的很不好听...&lt;/p&gt;
&lt;p&gt;下面是我认为的做法：以后称之为王氏菜谱，娃哈哈～～～～&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一、准备材料&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;主料:馍（也称馒头）1-2个馒头&lt;/p&gt;
&lt;p&gt;辅料:鸡蛋1-2个，大葱或者蒜苗少许，也可以用番茄1个&lt;/p&gt;
&lt;p&gt;调料:盐，味精（或鸡精），花生油，也可以用十三香&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;二、做法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.凉馒头，一定要是凉的，要不炒的时候会一塌糊涂的，切成小块。&lt;/p&gt;
&lt;p&gt;最好选择硬一些的馒头，这样炒出来的馍花口感更好。&lt;/p&gt;
&lt;p&gt;2.准备鸡蛋，打开放入碗中，放少许盐搅拌至起泡；洗葱并切成细丝备用。&lt;/p&gt;
&lt;p&gt;如果使用番茄的话就洗净切小块备用。&lt;/p&gt;
&lt;p&gt;3.热油，把搅拌后的鸡蛋放入锅中，并放入切好的葱花放入锅中，之后馒头块下去，加盐调味等炒2-3分钟即可。&lt;/p&gt;
&lt;p&gt;如果使用番茄的话，在鸡蛋炒好之后先腾出，然后再炒番茄，等番茄一半熟之后再放入鸡蛋，葱花等。&lt;/p&gt;
&lt;p&gt;日志是定时发布的，说不定这个时候我正在品尝着炒馍呢\^_\^&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt;
娃哈哈，昨天做到炒馍超赞的，就是盐稍微放多了那么一点点，炒的一大瓷碗，吃的我撑死了，呵呵：）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Continue
update&lt;/strong&gt;：娃哈哈，从买了一个相机，已经会有很多作品出现，这次更新的是今日又做了炒馍，特拍了两张，如下&lt;/p&gt;</summary><category term="家常菜"></category></entry><entry><title>2008，春节吉祥</title><link href="http://icyleaf.com/2008/01/2008-spring-hello" rel="alternate"></link><updated>2008-01-30T13:44:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2008-01-30:2008/01/2008-spring-hello</id><summary type="html">&lt;p&gt;春节马上就要到了，今年是奥运年，所以今年的春节是非常特别的。&lt;/p&gt;
&lt;p&gt;在这个特别的日子，请您在这里留下您的祝福！&lt;/p&gt;
&lt;p&gt;首先最先的是祭灶，不知道大家知不知道这个节日，腊月23日，也就是今天。我们家那边到了，就会买~~灶糖~~（&lt;strong&gt;麻糖&lt;/strong&gt;）吃。那怎么会吃糖呢，其实在为了用糖塞住灶王爷的嘴，让他别说坏话，因为灶王爷要在腊月23日回天上向玉帝汇报这一家人的善行或恶行，玉帝根据灶王爷的汇报，再将这一家在新的一年中应该得到的吉凶祸福的命运交于灶王爷之手。因此，对一家人来说，灶王爷的汇报实在具有重大利害关系。更多请看百度知道。&lt;/p&gt;
&lt;p&gt;可惜北京这边没有这个习俗，要么就是我还不知道- -&lt;/p&gt;
&lt;p&gt;快过年了，不知道在异地的朋友买到回家的车票了么，我到现在还没有买到，家那边下了很大的雪，而且还要过郑州这个大的交通枢纽，所以车票是巨难买，另外我坐车只能保证1-2个小时不晕车，再长我还没有锻炼过=
=，所以做汽车回家还是就此打住...&lt;/p&gt;
&lt;p&gt;整个假期只有短短7天假，挺緊的，回去要好好享受开封的小吃，吃到满足在说，老老实实和父母呆上1-2天，或许假期后又要1年不能见面了。&lt;/p&gt;
&lt;p&gt;今天我感冒了，很难受，唉，不说了，说实话北京很冷，我们住的地方暖气时有时无的让人受不了，而且热水器坏了，希望今天能修好。&lt;/p&gt;
&lt;h2&gt;买笔记本的计划又要耽搁了，年前申办的招商银行的信用卡没有通过，原因是综合评定不足，搞不懂-&lt;/h2&gt;
&lt;p&gt;总结：祝大家春节愉快！~~我要回家！~~我要买本！&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;1.昨天晚上接到几个短信都问我吃麻糖了么，恩，我承认我有些忘记开封的东西了，上面的文章居然把麻糖叫成了灶糖。。。&lt;/p&gt;
&lt;p&gt;2.娃哈哈，刚刚买到车票了，我可以回家了，而且还是卧铺，感谢青菜！！&lt;/p&gt;</summary><category term="年终总结"></category></entry><entry><title>2008，一个全新的我</title><link href="http://icyleaf.com/2007/12/2008-a-new-i" rel="alternate"></link><updated>2007-12-27T22:52:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2007-12-27:2007/12/2008-a-new-i</id><summary type="html">&lt;p&gt;&lt;img alt="2008" src="http://photo15.yupoo.com/20071211/204417_288166203_m.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;看着&lt;a href="http://roamlog.cn/"&gt;漫步&lt;/a&gt;等人参与的&lt;a href="http://www.mifengtd.cn/articles/mifengtd-my-new-years-resolutions.html"&gt;号召：使我的新年目标成功！&lt;/a&gt;活动让我情不自禁。希望有兴趣的朋友也可以参与进来！&lt;/p&gt;
&lt;p&gt;其实我是一个有些冲动的人，什么事情都想要尝试，但又有些3分钟热度，也许是家族遗传的原因。我个人很少制定计划，向来喜欢随心所欲，为所欲为，不愿受人束缚，别人也是严格要求我，我却背道而驰。&lt;/p&gt;
&lt;p&gt;2007年下半年的时候那个时候我还在Opera的博客上面终于下定决定制定了一个[075Q计划][]，其实应该是075K计划(想看要用[梯子][]哦)。不过最终还是没有完成那个计划...&lt;/p&gt;
&lt;p&gt;2008年即将到来，我将要以一个全新的我面对新的一年。以此我也要制定一些计划督促自己，改变自己！&lt;/p&gt;
&lt;p&gt;在2007年的年末开始了我实习生的工作，至此我也即将走出校园，开始新的生活，面对社会，我目前还没有做好准备。&lt;/p&gt;
&lt;p&gt;2008年势必会有更多的事情需要我自己来面对...&lt;/p&gt;
&lt;p&gt;虽然我还没有开始空想未来，但是还是借用右边图片上的一句话勉励自己：&lt;strong&gt;停止空想未来，开始创造未来！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;2008，一个全新的我”是一个很大的项目，此工程下面有几个计划：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Plan 1：专心一致的提高自身的专业知识水平&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;由于自己不时会3分钟热度，耐心不高等因素的原因，使得我学的东西一变再变。从最早的网站制作，黑客技术，软件编程，美工，又到现在回归B/S这方面的东西，整整花了我4年多的时间...这段时间学的真的很杂，但学又仅仅是皮毛。为了能彻底改掉这个坏习惯，因此我要专心一致的研究我目前工作所用的东西，要彻底的提高自身的专业知识水平。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2：提高自己的社交能力&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;呃，可以这样说，我是典型的程序员，天天闷在电脑前鼓捣。通过看我的博客也能了解到，除去自己懂的一些知识，无法和别人侃侃而谈，及其的不善于书面表达和社交沟通...&lt;/p&gt;
&lt;p&gt;“蜀道难，难于上青天”。我再不说真的就像那句词所说的了。&lt;/p&gt;
&lt;p&gt;这个计划可谓是我08年最最重要也是最最困难的一个。这点我要向[漫步][]同学学习，认识了这么多的人...羡慕，就这还居然也要提高沟通能力=。=&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Plan 3：提供英语的读写能力&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;英语啊，英语，你咋认识我我去不认识你呢？&lt;/p&gt;
&lt;p&gt;在很小的时候，听过我的某哥哥英语总是学不好，总是挂掉，我当时心想英语是啥玩意，有这么难学么。上初中的时候知道了什么是英语，还好的是当时英语还不错，成绩都在90分以上，到了高中之后就开始堕落了，因为家里买电脑了。&lt;/p&gt;
&lt;p&gt;自从有了电脑整个人已经迷上去了，当然最初的时候迷的是游戏...&lt;/p&gt;
&lt;p&gt;措施：&lt;/p&gt;
&lt;p&gt;1. 看美国大片- -！&lt;/p&gt;
&lt;p&gt;2. 翻译一些好的文章，文字。&lt;/p&gt;
&lt;p&gt;3. 尝试把自己用的东西全部替换成英语版本。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Plan 4 ：计划好了就要努力完成&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;其实自己有很多的想法，总想恩，这个不错，回来研究下，那个把它做成什么什么的。到了最后新的事物和想法又蹦了出来，之前的方法就这么搁浅了。&lt;/p&gt;
&lt;p&gt;措施：&lt;/p&gt;
&lt;p&gt;1. 这个主要靠用纸记下来或者Google日历提醒自己。&lt;/p&gt;
&lt;p&gt;2. 每个的想法如果实施一定要给自己一个时间的约束。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Plan 5： 摆脱"懒"的恶习&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我自认为我是一个很懒的人，在TX的城市达人上面我申请的是懒达人。如果不懒的话，我本可以做很多的事情，也不会导致我制定的075Q计划失败，我能获得的更多，改变的更多！&lt;/p&gt;
&lt;p&gt;措施：目前还没有具体的方案-。-&lt;/p&gt;</summary><category term="年终总结"></category></entry><entry><title>初学教程：正则表达式</title><link href="http://icyleaf.com/2007/12/beginner-guide-a-regular-expression" rel="alternate"></link><updated>2007-12-10T18:34:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2007-12-10:2007/12/beginner-guide-a-regular-expression</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;正则表达式&lt;/strong&gt;（英文全称regular
expression）描述了一种字符串匹配的模式，可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;正则表达式的用途：&lt;/p&gt;
&lt;p&gt;通过使用正则表达式，可以：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;测试字符串内的模式。
    例如，可以测试输入字符串，以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。&lt;/li&gt;
&lt;li&gt;替换文本。
    可以使用正则表达式来识别文档中的特定文本，完全删除该文本或者用其他文本替换它。&lt;/li&gt;
&lt;li&gt;基于模式匹配从字符串中提取子字符串。
    可以查找文档内或输入域内特定的文本。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例如，您可能需要搜索整个 Web 站点，删除过时的材料，以及替换某些 HTML 格式标记。在这种情况下，可以使用正则表达式来确定在每个文件中是否出现该材料或该 HTML 格式标记。此过程将受影响的文件列表缩小到包含需要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过时的材料。最后，可以使用正则表达式来搜索和替换标记。&lt;/p&gt;
&lt;p&gt;正则表达式在 JScript 或 C
等语言中也很有用，这些语言的字符串处理能力还不为人们所知。&lt;/p&gt;
&lt;p&gt;想要在很短的时间学会
正则表达式也不是一件很容易的事情，现在在网上有一份教程，应该是很火的，名叫"&lt;strong&gt;&lt;a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm"&gt;正则表达式30分钟入门教程&lt;/a&gt;&lt;/strong&gt;"，这也是我推荐的初学入门教程。教程来自&lt;a href="http://www.unibetter.com/"&gt;unibetter大学生社区&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;教程中用到的测试正则表达式的工具是在.NET支持。这里我推荐一个由&lt;a href="http://www.chken.com/"&gt;CHKen&lt;/a&gt;（&lt;a href="http://www.chken.com/ViewSoft.asp?id=1"&gt;CHKen
Player&lt;/a&gt;的作者）使用纯API编写的测试正则表达式工具：&lt;a href="http://www.chken.com/Soft/Other/RegExp.zip" title="点击直接下载"&gt;RegExp&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img alt="RegExp" src="http://pdjh03.mofile.com/p/1/2007/12/11/88/88NF27CQTN_103_500_320.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;另外在&lt;a href="http://www.williamlong.info"&gt;月光博客&lt;/a&gt;还收集了很多“&lt;a href="http://www.williamlong.info/archives/433.html"&gt;常用的正则表达式&lt;/a&gt;”是实际应用中也许对大家会有所帮助。&lt;/p&gt;</summary><category term="regex"></category></entry><entry><title>博客串联：5 个关于你的问题</title><link href="http://icyleaf.com/2007/12/blog-series-five-on-your-question" rel="alternate"></link><updated>2007-12-01T18:44:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2007-12-01:2007/12/blog-series-five-on-your-question</id><summary type="html">&lt;p&gt;记得是&lt;a href="http://roamlog.cn/archives/5-questions-about-you.html"&gt;漫步&lt;/a&gt;好几天前在饭否给我发的信息，让我参与这个活动，由于这几天一直再忙，耽搁了，今天补上：）&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;你从什么时候开始 Blogging 的？&lt;/p&gt;
&lt;p&gt;上大学的时候接触到了博客，偶尔玩玩，而真正开始博客的时候大概是在05年9月份。博客的名字一直是灵狼天，关于它的意义所在，大家自己猜想吧。猜对有糖吃哦呵呵(\^__________\^)
2. 你为什么博客？&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;刚开始在MyOpera申请的一个提供300M空间的博客服务，本来是要做一个家乡的图片博客，后来发现此平台上有很多IT界“有名人士”以及归隐者，受他们影响开始安心的blogging。不过刚开始大部分都是转载一些我喜欢和我收藏的文章。&lt;/p&gt;
&lt;p&gt;去年5.1黄金周后，MyOpera因涉嫌某些东西被GFW掉，后来就有了自己搭站的念头。&lt;/p&gt;
&lt;p&gt;我在MyOpera的地址：http://my.opera.com/icyleaf&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;你是否尝试在网上赚钱或已经开始在网上赚钱？&lt;/p&gt;
&lt;p&gt;一直有尝试过，但是由于个人原因和经营不善问题，一直处于白忙活状态，呵呵，凭着纯乐呵的状态做这件事情，赚不赚钱并不重要，当然有钱赚更好。
4.  你喜欢网络的三个理由&lt;/p&gt;
&lt;p&gt;信息，朋友，Enjoy myself&lt;/p&gt;
&lt;p&gt;通过网络我可以获得我所喜欢的各种信息，让自己充实；&lt;/p&gt;
&lt;p&gt;通过网络我可以结识到很多志同道合的朋友，但由于我不善于言表，都没有太深的交谈&gt;____&amp;lt;我的一大痛处；&lt;/p&gt;
&lt;p&gt;通过网络，Enjoy myself也是一种快乐。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;你 Blogging 的目标是什么？将如何实现？&lt;/p&gt;
&lt;p&gt;对于目前来说。博自己所喜欢的，无论是单纯的生活日志还是混杂的各种信息技术也好都会在一个博客上面展现，本来嘛博客就是记录自己的方方面面，但是由于各种原因使得人们博的心态和目的都已经歪曲。但路是要靠自己来走，我还是凭着一颗单纯的心做自己的博客。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</summary></entry><entry><title>如何治疗嘴唇破皮</title><link href="http://icyleaf.com/2007/11/how-to-treat-lips-popi" rel="alternate"></link><updated>2007-11-09T05:11:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2007-11-09:2007/11/how-to-treat-lips-popi</id><summary type="html">&lt;p&gt;嘴唇破皮确实是一件很痛苦的事情，我也是身受体会，最近嘴唇的皮还是一点一点的起皮。我自称是耐渴性人物，可是嘴唇一开始破皮，就总想用舌头舔，结果是越舔越干，每当皮翘起来的时候，我还会把它揪掉。&lt;/p&gt;
&lt;p&gt;冬天正在慢慢的来临，在着北方的天气干且燥，风又大，更是嘴唇破皮的季节&gt;_&amp;lt;这不刚刚去陪mm逛街的时候买了一管润唇膏。要不我又该受不了了，买润唇膏后就想上网查查嘴唇破皮是什么原因，恩...原因概括可以分6种：&amp;lt; p&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;天气干燥，身体缺水分。&lt;/li&gt;
&lt;li&gt;上火也有可能导致嘴唇破皮。&lt;/li&gt;
&lt;li&gt;也有可能是习惯性的会用舌头來舔嘴唇。&lt;/li&gt;
&lt;li&gt;嘴唇皮肤比较纤薄幼细，嘴唇很容易被紫外线灼伤而引起脱皮。&lt;/li&gt;
&lt;li&gt;身体缺少维生素B2，也有可能导致嘴唇破皮。（甚至会有口角发炎、龟裂，舌头发炎的现象。）&lt;/li&gt;
&lt;li&gt;主要针对女性，若是使用了过度干燥的口紅，或是对口红过敏也有可能造成嘴唇的破皮。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;刚问了问家在南方的室友，原来他那边冬天也有很多嘴唇破皮的，可以这么说，导致嘴唇破皮的最主要的原因是&lt;strong&gt;天气干燥，身体缺水分&lt;/strong&gt;。然而嘴唇干燥，破皮不舒服，很多人会下意识地舔唇，结果却往往越舔越干，越干越舔，形成一个恶性循环，甚至舔得口唇周围皮肤粗糙变厚，甚至嘴唇肿胀，形成医学上的“&lt;strong&gt;舌舔皮炎&lt;/strong&gt;”。无论是从健康还是美观的角度考虑，还是改掉舔唇这个不太雅观的习惯吧。（更多详细可以看&lt;a href="http://www.xiaojd.com/qa/b6b35dc764"&gt;这里&lt;/a&gt;）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;治疗嘴唇破皮的最简单的方法就是多喝水！&lt;/strong&gt;当然治疗嘴唇干燥，破皮不可是是一朝一夕就治疗的，大家可以选用润唇膏消除因干燥而带来的不舒服。是唇膏，不要买唇彩或唇油，这些对于嘴唇破皮无效。&lt;/p&gt;
&lt;p&gt;下面我说一个土方，我家传的，一般在家的朋友可以试下：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;晚上的时候，用筷子沾2-3的小磨油（香油）涂在嘴唇上面，如果嘴唇破皮的不厉害，一般2-3天就好了。&lt;/p&gt;
&lt;/blockquote&gt;</summary><category term="养生"></category></entry><entry><title>人为什么会上火</title><link href="http://icyleaf.com/2007/10/why-do-people-at-fire" rel="alternate"></link><updated>2007-10-30T06:23:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2007-10-30:2007/10/why-do-people-at-fire</id><summary type="html">&lt;p&gt;我发现我现在浑身是病，特开“&lt;strong&gt;养生之道&lt;/strong&gt;”专栏，给自己给大家介绍一些发生在我身上的一些问题和解决方法。希望大家喜欢&lt;/p&gt;
&lt;p&gt;上火对我来说可以说是家常便饭，三天两头的上上火，无论我吃任何的败火（感慨：人类造词的真是高明啊）的药一点用途都没有，只是光往厕所跑的事情了- -!所以我现在根本都不吃药，都是硬挺的。虽说常上火，对我来说一般都是&lt;strong&gt;口腔溃疡&lt;/strong&gt;的症状。但还是不能完全忽视掉那种痛感。太痛苦，太受折磨了...&lt;/p&gt;
&lt;p&gt;&lt;a href="http://zhidao.baidu.com/question/28887798.html?si=1"&gt;上火是中医的理论，西医一直没有明确支持&lt;/a&gt;。中国人一般都是这么叫的。人体里本身是有火的，如果没有火那么生命也就停止了，也就是所谓的生命之火。当然火也应该保持在一定的范围内，比如体温应该在37度左右，如果火过亢人就会不舒服，会出现很多红、肿、热、痛、烦等具体表现。&lt;a href="http://zhidao.baidu.com/question/15539369.html?fr=qrl3"&gt;上火的症状有哪些？吃什么东西可以败火？&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;网上对上火有很多种分类，一般分实虚两种（只是个人观点，不对实际的对与否做解释）。对于口腔溃疡的症状属于&lt;strong&gt;实火旺&lt;/strong&gt;，表现为口腔溃疡、口干、尿黄、心烦易怒等；除了实火旺还有&lt;strong&gt;虚火&lt;/strong&gt;，主要表现有心烦、口干、盗汗、睡眠不安等。按病位分有出来三种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;上焦有火&lt;/strong&gt;（上焦指心肺部位），症见口干、舌烂、唇裂、目赤、耳鸣，甚则微咳。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中焦有火&lt;/strong&gt;（中焦指脾胃部位），表现为时而胃火亢盛，食不知饱，时而嗳腐吞酸，呃气上逆，脘腹胀满，饮食少进。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;下焦有火&lt;/strong&gt;（下焦指肝、肾、膀胱、大小肠部位），表现为大便干，小便少且黄赤，混浊有味，阴部时痒，妇女白带多，甚至带黄。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;如何败火？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.39.net/zhongyi/yaoshan/yaoshan/71927.html"&gt;经常"上火"者的饮食治疗&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://zhidao.baidu.com/question/872372.html"&gt;容易上火应多吃什么食物？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.39.net/Treatment/jktx/jkkd/94705.html"&gt;上火吃泻火药为何无效&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://zhidao.baidu.com/question/1663301"&gt;最快的败火方法是什么&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=""&gt;败火的三道凉菜&lt;/a&gt;http://life.people.com.cn/GB/35076/4534013.html)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;口腔溃疡专栏&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;口腔溃疡发生的部位多见于口腔粘膜及舌的边缘，常是白色溃疡，周围有红晕，十分疼痛，特别是遇酸、咸、辣的食物时，疼痛更加厉害，以致美味佳肴都不愿品尝。虽是口腔小疾，却令人痛苦不堪，甚至坐卧不宁，寝食不安，情绪低落。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="http://health.sohu.com/2004/06/17/62/article220586282.shtml"&gt;人为什么会口腔溃疡&lt;/a&gt;？（说的比较悬乎...)那么人为什么会反复口腔溃疡？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如何预防口腔溃疡？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;口腔溃疡在很大程度上与个人身体素质有关，因此要想完全避免其发生可能性不大，但如果尽量避免诱发因素，仍可降低发生率。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://bk.baidu.com/view/60479.htm"&gt;具体措施&lt;/a&gt;)是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;注意口腔卫生，避免损伤口腔黏膜，避免辛辣性食物和局部刺激。&lt;/li&gt;
&lt;li&gt;保持心情舒畅，乐观开朗，避免事情和着急。&lt;/li&gt;
&lt;li&gt;保证充足的睡眠时间，避免过度疲劳。&lt;/li&gt;
&lt;li&gt;注意生活规律性和营养均衡性，养成一定排便习惯，防止便秘。&lt;/li&gt;
&lt;/ul&gt;</summary><category term="养生"></category></entry><entry><title>如何降低胆固醇</title><link href="http://icyleaf.com/2007/10/how-to-reduce-cholesterol" rel="alternate"></link><updated>2007-10-29T07:05:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2007-10-29:2007/10/how-to-reduce-cholesterol</id><summary type="html">&lt;p&gt;忘记了一个小小重要的事情，上次去北京献血时的验血结果，护士告诉我胆固醇有些过高，说是熬夜导致，熬夜肯定是有的通宵唱K嘛，但是我有些疑惑，为什么胆固醇有些过高是由熬夜导致的？这难道能从血液里面看出来？还是说我身体的胆固醇本身就有些过高？&lt;/p&gt;
&lt;p&gt;听说胆固醇过高很危险，小米说少吃鸡蛋就可以了，鸡蛋含的胆固醇是很高的。而我坚持每天1-2个鸡蛋，
在学校本身就没什么好吃的，在不补补营养怎么能行，呵呵。难道因为鸡蛋含的胆固醇是很高而不吃鸡蛋？赶紧搜了搜关于胆固醇的知识（&lt;a href="http://baike.baidu.com/view/24827.htm"&gt;详细说明&lt;/a&gt;）：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;胆固醇&lt;/strong&gt;又称胆甾醇。一种环戊烷多氢菲的衍生物。早在18世纪人们已从胆石中发现了胆固醇，1816年化学家本歇尔将这种具脂类性质的物质命名为胆固醇。胆固醇广泛存在于动物体内，尤以脑及神经组织中最为丰富，在肾、脾、皮肤、肝和胆汁中含量也高。其溶解性与脂肪类似，不溶于水，易溶于乙醚、氯仿等溶剂。胆固醇是动物组织细胞所不可缺少的重要物质，它不仅参与形成细胞膜，而且是合成胆汁酸，维生素D以及甾体激素的原料。&lt;/p&gt;
&lt;p&gt;一般都知道，脂类物质主要分为两大类。脂肪（主要是甘油三酯）是人体内含量最多的脂类，是体内的一种主要能量来源；另一类叫类脂，是生物膜的基本成分，约占体重的5%，除包括磷脂、糖脂外，还有很重要的一种叫&lt;strong&gt;胆固醇&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;通常，将每100克食物中胆固醇含量低于100毫克的食物称为&lt;strong&gt;&lt;u&gt;低胆固醇食物&lt;/u&gt;&lt;/strong&gt;，如鳗鱼、娼鱼、鲤鱼、猪瘦肉、牛瘦肉、羊瘦肉、鸭肉等；将每100克食物中胆固醇含量为100～200毫克的食物称为&lt;u&gt;&lt;strong&gt;中度胆固醇食物&lt;/strong&gt;&lt;/u&gt;，如草鱼、鲫鱼、鲢鱼、黄鳝、河鳗、甲鱼、蟹肉、猪排、鸡肉等；而将每100克食物中胆固醇含量为200～300毫克的食物称&lt;u&gt;&lt;strong&gt;高胆固醇食物&lt;/strong&gt;&lt;/u&gt;，如猪肾、猪肝、猪肚、蚌肉、蛀肉、蛋黄、蟹黄等。高胆固醇血症的患者应尽量少吃或不吃高胆固醇的食物。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;那么如何降低胆固醇？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;经常食用几种常见的食物就能降低胆固醇：早餐一碗约75克燕麦粥，配一杯无糖豆浆；看电视时吃一把约二十来颗甜杏仁。&lt;/p&gt;
&lt;p&gt;下面在摘录一些搜索到的信息，给自己同时也给大家做参考。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://news.xinhuanet.com/health/2006-07/16/content_4840049.htm"&gt;十种食物能吃掉胆固醇&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.china.com.cn/chinese/health/85030.htm"&gt;27种保持低胆固醇的方法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.china.com.cn/chinese/health/85030.htm"&gt;你应该如何降低胆固醇&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.china.com.cn/chinese/health/373873.htm"&gt;4类食物能降低胆固醇29%&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</summary><category term="养生"></category></entry><entry><title>推荐一本书:《赖声川的创意学》</title><link href="http://icyleaf.com/2007/09/recommend-a-book-stan-lais-creative-learning" rel="alternate"></link><updated>2007-09-28T15:13:00+08:00</updated><author><name>icyleaf</name></author><id>tag:icyleaf.com,2007-09-28:2007/09/recommend-a-book-stan-lais-creative-learning</id><summary type="html">&lt;p&gt;&lt;img alt="创意" src="http://images.dangdang.com/images/9214908_b.jpg" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;书名：赖声川的创意学&lt;/p&gt;
&lt;p&gt;作者：赖声川&lt;/p&gt;
&lt;p&gt;出版社：中信出版社&lt;/p&gt;
&lt;p&gt;ISBN：7508607457&lt;/p&gt;
&lt;p&gt;纸张：胶版纸&lt;/p&gt;
&lt;p&gt;出版日期：2006-9-1&lt;/p&gt;
&lt;p&gt;定价：36元&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;内容提要：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;创意是人类最向往的一种能力，但是我们却不了解它，也不知道如何才能拥有它。专家学者预测，世界即将从"资讯时代"转向所谓"概念时代"，创意也将成为新时代中最重要的工具。最大胆的预测还认为，MFA--艺术硕士（Master
of Fine Arts）将击败MBA，成为工商社会最受欢迎的学位。&lt;/p&gt;
&lt;p&gt;在美国斯坦福大学开设"创意"讲座的赖声川，发明了"创意金字塔"，提出一套生活哲学解构创意，教你在日常生活中运用崭新的"看"法学创意、领风骚。&lt;/p&gt;
&lt;p&gt;作者简介：
赖声川，创意源源不绝的创作人。一九五四年生于美国华盛顿，美国加州柏克莱大学戏剧博士，现任国立台北艺术大学教授、美国史丹福大学客座教授及驻校艺术家、【表演工作坊】艺术总监。他二十九岁开始剧场创作，至今编导舞台剧二十七部（包括轰动亚洲的七小时史诗《如梦之梦》）、电影二部（包括享誉国际的《暗恋桃花源》）、电视影集三百集（包括家喻户晓的《我们一家都是人》），另有剧场导演作品二十二部（包括莫扎特歌剧三部）等。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;这是我最近刚从图书馆借来的一本书，目前只是读了一个开头，不过光是开头给我的感触就很深的一句话：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;社会忙着将创意格式化，却没有考虑到创意是超越格式化和既定框架的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这是一个僵化的社会，我们做什么事情基本都是一个凭着一个标准，一个框架，一个准则，无论是上学，就业，生活这些大方面，就连编程等这些小的方面也是如此。创意不是凭空制作出来的，懂得超与格式化创造创意的人已经高高在上，成为了富豪。前几天我在网上略微看了几章《互联网草根革命》，一个新的创意也并不能说明，你立即成为富豪，还需要想办法去宣传，推广，为了我们的明天，让我们一起努力吧！&lt;/p&gt;
&lt;p&gt;工作之余可以看看这本书，我想可以消除工作的疲乏:)&lt;/p&gt;</summary><category term="图书"></category></entry></feed>