<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>.::灵狼天::. &#187; 网络开发</title>
	<atom:link href="http://icyleaf.com/category/webdev/feed/" rel="self" type="application/rss+xml" />
	<link>http://icyleaf.com</link>
	<description>icyleaf&#039;s blog - 心外无理，心外无物，心外无事</description>
	<lastBuildDate>Tue, 13 Dec 2011 02:34:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Chrome 扩展: URL to QR-Code</title>
		<link>http://icyleaf.com/2011/06/chrome-extension-url-to-qr-code/</link>
		<comments>http://icyleaf.com/2011/06/chrome-extension-url-to-qr-code/#comments</comments>
		<pubDate>Thu, 16 Jun 2011 04:06:20 +0000</pubDate>
		<dc:creator>icyleaf</dc:creator>
				<category><![CDATA[网络开发]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[QR-Code]]></category>

		<guid isPermaLink="false">http://icyleaf.com/?p=895</guid>
		<description><![CDATA[URL to QR-Code 是一个 Chrome 扩展,适用于 Chrome 浏览页面的同时希望把在手机设备(当然手机得支持 QR-Code 的扫描)也能访问.我总结可以适用于以下情景: 这个网页必须使用手机设备访问 这个网页是一个手机应用的安装链接(AppStore/Google Market),用手机访问可以直接安装 我就是想用手机浏览此网页,怎么着 好吧,基于以上情景,我做了一个 Chrome 扩展,恩,没错,只适用于 Chrome,也许会有人说,这个东西网上已经有了,为什么你还要重造轮子.我的理由是,虽然我的功能非常简单,鉴于目前现有的一些应用,都会把功能显示在 Chrome 的 Tab 上面,其实这个功能用的几率并不多,放在 Tab 实在是浪费了太大的空间,我的 Tab 的 Icons 已经负载过多了(大家可参考我之前分享的 我常用的 Chrome 扩展集合),因此我决定把 Icon 丢在地址栏的右侧,这里相对于的利用空间更小.点击之后直接弹出 QR-Code,方便手机扫描. 安装地址: http://icyleaf.googlecode.com/svn/javascript/Chrome/url_to_qr_code_v0.1.crx &#8212;&#8212;&#8212;&#8212;&#8211;需要更新的分割线&#8212;&#8212;&#8212;&#8212;&#8212;- 发现 Google Chart API &#8230; <a href="http://icyleaf.com/2011/06/chrome-extension-url-to-qr-code/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>URL to QR-Code 是一个 Chrome 扩展,适用于 Chrome 浏览页面的同时希望把在手机设备(当然手机得支持 QR-Code 的扫描)也能访问.我总结可以适用于以下情景:</p>
<li>这个网页必须使用手机设备访问</li>
<li>这个网页是一个手机应用的安装链接(AppStore/Google Market),用手机访问可以直接安装</li>
<li>我就是想用手机浏览此网页,怎么着</li>
<p>好吧,基于以上情景,我做了一个 Chrome 扩展,恩,没错,只适用于 Chrome,也许会有人说,这个东西网上已经有了,为什么你还要重造轮子.我的理由是,虽然我的功能非常简单,鉴于目前现有的一些应用,都会把功能显示在 Chrome 的 Tab 上面,其实这个功能用的几率并不多,放在 Tab 实在是浪费了太大的空间,我的 Tab 的 Icons 已经负载过多了(大家可参考我之前分享的 <a href="http://icyleaf.com/2011/06/11/im-using-chrome-extensions-software-list/" target="_blank">我常用的 Chrome 扩展集合</a>),因此我决定把 Icon 丢在地址栏的右侧,这里相对于的利用空间更小.点击之后直接弹出 QR-Code,方便手机扫描.</p>
<p>安装地址: <a href="http://icyleaf.googlecode.com/svn/javascript/Chrome/url_to_qr_code_v0.1.crx">http://icyleaf.googlecode.com/svn/javascript/Chrome/url_to_qr_code_v0.1.crx</a></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8211;需要更新的分割线&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>发现 Google Chart API 居然提供支持 QR-Code ,文档在此后面准备更换生成QR-Code的服务接口支持选文字生成和文字链的原始链接的生成.这里算是埋下一个坑,大家可以提醒我来填满。。。</p>
<p>文档地址：<a href="http://code.google.com/apis/chart/image/docs/gallery/qr_codes.html" target="_blank">http://code.google.com/apis/chart/image/docs/gallery/qr_codes.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://icyleaf.com/2011/06/chrome-extension-url-to-qr-code/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>魔豆及其豆瓣 API 测试平台开源咯</title>
		<link>http://icyleaf.com/2011/05/modou-and-douban-api-console-is-open-source-now/</link>
		<comments>http://icyleaf.com/2011/05/modou-and-douban-api-console-is-open-source-now/#comments</comments>
		<pubDate>Mon, 02 May 2011 09:22:04 +0000</pubDate>
		<dc:creator>icyleaf</dc:creator>
				<category><![CDATA[网络开发]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[魔豆]]></category>

		<guid isPermaLink="false">http://icyleaf.com/?p=873</guid>
		<description><![CDATA[这是作为 2011 年 5 月 1 日劳动节的福利发放，欢迎各位 Kohana 开发者及其爱好者围观领取，领取内容及其使用方式请前往本人 Github 的项目地址：https://github.com/icyleaf/modou]]></description>
			<content:encoded><![CDATA[<p>这是作为 2011 年 5 月 1 日劳动节的福利发放，欢迎各位 Kohana 开发者及其爱好者围观领取，领取内容及其使用方式请前往本人 Github 的项目地址：https://github.com/icyleaf/modou</p>
]]></content:encoded>
			<wfw:commentRss>http://icyleaf.com/2011/05/modou-and-douban-api-console-is-open-source-now/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何保持在 Git Submodule 代码的开放和私有共存</title>
		<link>http://icyleaf.com/2010/08/how-to-keep-public-and-private-versions-of-a-git-submodule-repo-in-sync/</link>
		<comments>http://icyleaf.com/2010/08/how-to-keep-public-and-private-versions-of-a-git-submodule-repo-in-sync/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 09:11:07 +0000</pubDate>
		<dc:creator>icyleaf</dc:creator>
				<category><![CDATA[网络开发]]></category>
		<category><![CDATA[git]]></category>

		<guid isPermaLink="false">http://icyleaf.com/?p=798</guid>
		<description><![CDATA[假设我在 github 有一个开源的版本库 x 供大家使用，该库里面又包含了好些个 submodules，其中有一个 submodule 名为 a 是自己在 github 又创建的: $ git submodule add http://github.com/icyleaf/a.git modules/a 现在问题是，由于代码需要更新，同时涉及到了 a 这个 submodule，但是它的添加 url 是 read-only，由于 x 这个库是供大家使用，因此 a 又不能设为 private： $ git clone git@github.com:icyleaf/a.git modules/a 目前想到的方法是在 x 库以外 clone 下来 &#8230; <a href="http://icyleaf.com/2010/08/how-to-keep-public-and-private-versions-of-a-git-submodule-repo-in-sync/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>假设我在 github 有一个开源的版本库 x 供大家使用，该库里面又包含了好些个 submodules，其中有一个 submodule 名为 a 是自己在 github 又创建的:</p>
<pre lang="bash">
$ git submodule add  http://github.com/icyleaf/a.git modules/a
</pre>
<p>现在问题是，由于代码需要更新，同时涉及到了 a 这个 submodule，但是它的添加 url 是 read-only，由于 x 这个库是供大家使用，因此 a 又不能设为 private：</p>
<pre lang="bash">
$ git clone git@github.com:icyleaf/a.git modules/a
</pre>
<p>目前想到的方法是在 x 库以外 clone 下来 a，进行私有的写入和 push 到 github 上面，然后在 x 库的 a 里 git pull 下来获得最新的代码。</p>
<p>如何解决这样的问题，能够当大家全部 clone 下来，而自己开发也能避免麻烦？</p>
<p>在一篇<a rel="nofollow external" href="http://longair.net/blog/2010/06/02/git-submodules-explained/">文章</a>上面找到了灵感，折腾了一番搞定了 <img src="http://kohana.cn/media/images/icons/emoticon/smile.png" alt="" /></p>
<p>该文章有一节讲到，开发者如果经常需要更新 submodule ，即可更换  submodule 的 remote url：</p>
<pre lang="bash">
$ cd commonlib
$ git remote rm origin
$ git remote add origin ssh://mark@git.mysociety.org/data/git/public/commonlib.git
$ git remote -v
origin    ssh://mark@git.mysociety.org/data/git/public/commonlib.git

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.

$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master
</pre>
<p>首先我也先对 a 进行 git remote -v，结果显示：</p>
<pre lang="bash">
origin	http://github.com/icyleaf/a.git (fetch)
origin	http://github.com/icyleaf/a.git (push)
</pre>
<p>发现和文章里面的显示的结果不一样，于是我就在想能不能在 remote 上面做些手脚，首先看下 git remote 的  help，发现有一条是可以单独设置 remote push 的 url ，也就是更换上面 git remote -v 中 push 的  url，尝试：</p>
<pre lang="bash">
$ git remote set-url --push origin git@github.com:icyleaf/a.git
</pre>
<p>再次执行 remote -v:</p>
<pre lang="bash">
origin	http://github.com/icyleaf/a.git (fetch)
origin	git@github.com:icyleaf/a.git (push)
</pre>
<p>执行成功！然后随意 commit 并 push orgin master，成功！</p>
<p>搞定！</p>
]]></content:encoded>
			<wfw:commentRss>http://icyleaf.com/2010/08/how-to-keep-public-and-private-versions-of-a-git-submodule-repo-in-sync/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nginx+FastCGI 环境搭建 Kohana</title>
		<link>http://icyleaf.com/2010/05/nginx-with-fastcgi-build-kohana/</link>
		<comments>http://icyleaf.com/2010/05/nginx-with-fastcgi-build-kohana/#comments</comments>
		<pubDate>Mon, 31 May 2010 01:34:54 +0000</pubDate>
		<dc:creator>icyleaf</dc:creator>
				<category><![CDATA[Kohana]]></category>
		<category><![CDATA[FastCGI]]></category>
		<category><![CDATA[Nginx]]></category>

		<guid isPermaLink="false">http://icyleaf.com/?p=770</guid>
		<description><![CDATA[Kohana 默认仅对 Apache 环境提供的部署支持，其实对于 Nginx+FastCGI 也是很容易支持的。本文搭建环境是 Ubuntu 10.4 并采用 apt-get 方式安装，喜爱编译的朋友可以自行解决 1. 安装 MySQL sudo apt-get install mysql-server mysql-client 安装过程在会提示设置 root 账户的密码，如果是本机测试开发可以留空后稍候设置。 2. 安装 Nginx # 安装 Nginx sudo apt-get install nginx # 启动 Nginx sudo /etc/init.d/nginx start 完成上面两步之后，打开浏览器，输入 localhost &#8230; <a href="http://icyleaf.com/2010/05/nginx-with-fastcgi-build-kohana/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Kohana 默认仅对 Apache 环境提供的部署支持，其实对于 Nginx+FastCGI 也是很容易支持的。本文搭建环境是 Ubuntu 10.4 并采用 apt-get 方式安装，喜爱编译的朋友可以自行解决 <img src='http://icyleaf.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>1. 安装 MySQL</h3>
<pre lang="bash">
sudo apt-get install mysql-server mysql-client
</pre>
<p>安装过程在会提示设置 root 账户的密码，如果是本机测试开发可以留空后稍候设置。</p>
<h3>2. 安装 Nginx</h3>
<pre lang="bash">
# 安装 Nginx
sudo apt-get install nginx
# 启动 Nginx
sudo /etc/init.d/nginx start
</pre>
<p>完成上面两步之后，打开浏览器，输入 localhost 或 127.0.0.1 如果看到 <strong>Welcome to Nginx!</strong> 字样就说明安装成功了，是不是很简单 <img src='http://icyleaf.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>注意，如果你的机器上面如果安装了其他 web 容器（比如 Apache，Lighttd等），启动 ngnix 的时候肯定会报错，因为这些 web 容器启动均占用的 80 端口，更改的方法如下：<br />
编辑 /etc/nginx/sites-available/default 文件，修改 server 段中的 listen 为 localhost:8080，其中 8080 是更改的监听端口：</p>
<pre lang="bash">
server {
	listen   localhost:8080;
	server_name  localhost;

# [...]
</pre>
<p>保存后重启Nginx：</p>
<pre lang="bash">
sudo /etc/init.d/nginx restart
</pre>
<p><span id="more-770"></span></p>
<h3>3. 安装 PHP5</h3>
<p>PHP 在 Nginx 下是通过 FastCGI 模式运行的，使用 Debain 的包管理可以安装 PHP5 和一些必须的（比如，php5-mysql）和可选的扩展（比如，Kohana 要求的 php5-curl，php5-gd，php5-mcrypt），下面前 5 个是必须的，其他可以依据个人需求添加或减少：</p>
<pre lang="bash">
sudo apt-get install php5-cgi php5-mysql php5-curl php5-gd php5-mcrypt php5-idn php-pear php5-imagick php5-imap php5-memcache php5-mhash php5-ming php5-pspell php5-recode php5-snmp php5-tidy php5-xmlrpc php5-xsl
</pre>
<p>安装完毕后，需要编辑 php 的配置：</p>
<pre lang="bash">
# 编辑 /etc/php5/cgi/php.ini 文件
# 修改 cgi.fix_pathinfo 的值为 1（如果此项被注解掉了，请删除前面的 # 符号）
cgi.fix_pathinfo = 1
</pre>
<p>至此 PHP5 已经安装完毕，但是还没有结束，因为我们还没有让它支持 FastCGI 嗯，由于 Debain 包并没有提供单独的 FastCGI 守护程序，因此我们可以使用其他的方式实现，通常使用的是 lighttpd 项目提供的 spawn-fcgi（本文也用的这个，但是它总会出现小毛病，导致 Nginx 服务 Down 掉，稍候也会给出一点解决方案）或者是 <a href="http://php-fpm.org/" target="_blank">PHP-FPM</a>（专门为 PHP 提供 FastCGI 进程管理的软件）</p>
<p>好吧，让我们在安装 lighttpd：</p>
<pre lang="bash">
sudo apt-get install lighttpd
</pre>
<p>安装完毕后会你发现一些错误信息：</p>
<blockquote><p>
Starting web server: lighttpd<br />
2010-05-31 10:44:51: (network.c.300) can&#8217;t bind to port: 80 Address already in use failed!
</p></blockquote>
<p>还是上面提到的重复占用端口的问题，不过由于我们只是使用它的 spawn-fcgi 因此我们可以不让它当作服务启动：</p>
<pre lang="bash">
sudo update-rc.d -f lighttpd remove
</pre>
<p>好了，让我们开启 FastCGI 守护进程：</p>
<pre lang="bash">
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid
</pre>
<p>其中 -a 代表 ip 地址， -p 是进程的端口， -u 是用户， -g 是用户组，-f 是 php5-cgi 的执行路径，-P 是进程的 pid，可以适当的在后面在加一个 -C 参数，这个数创建的进程数，本机开发的话一般设置在 3 &#8211; 5 左右即可（也可以使用 ab 测试以设置适当的进程数，这样可以防止 Nginx 的无辜 Down 掉）</p>
<p>提示：spawn-fcgi 必须在运行的状况下才能使得 Nginx 支持 PHP 运行，因此可以把上面的启动代码追加到 /etc/rc.local 文件的尾部保存（在 exit 命令之前）。</p>
<h3>4. 配置 Nginx</h3>
<p>Nginx 的配置相对比较简单，语法很像 PHP 代码，如果不了解的可以参考这个：<a href="http://wiki.nginx.org/NginxFullExample" target="_blank">范例1</a>和<a href="http://wiki.nginx.org/NginxFullExample2" target="_blank">范例2</a><br />
编辑 <strong>/etc/nginx/nginx.conf</strong> 文件并作如下修改：</p>
<pre lang="bash">
[...]
worker_processes  5;
[...]
    keepalive_timeout   2;
[...]
</pre>
<p>定义虚拟主机的配置项存放在 /etc/nginx/conf.d/ 目录下面，每个虚拟主机配置一个文件并以 .conf 为文件后缀即可，默认是 default，也就是上面修改 Nginx 默认监听端口的文件，这里还要进一步对它配（点击右侧展开）：</p>
<pre lang="bash" colla="-">
[...]
server {
        listen   80;
        server_name  _;

        access_log  /var/log/nginx/localhost.access.log;

        location / {
                root   /var/www/nginx-default;
                index  index.php index.html index.htm;
        }

        location /doc {
                root   /usr/share;
                autoindex on;
                allow 127.0.0.1;
                deny all;
        }

        location /images {
                root   /usr/share;
                autoindex on;
        }

        #error_page  404  /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
                root   /var/www/nginx-default;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
                #proxy_pass   http://127.0.0.1;
        #}

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

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        location ~ /\.ht {
                deny  all;
        }
}
[...]
</pre>
<p>说明下里面的个别参数：<br />
<strong>server_name</strong> 是虚拟主机的服务器入口名称，可以是 IP 也可以是域名。<br />
<strong>location</strong> 段，我在 index 追加了 index.php， root 路径是 /var/www/nginx-default 说明该虚拟主机的根目录在这里。<br />
最重要的是关于 PHP 部分的 location 段：<strong>~ \.php$ {} </strong>，Nginx 默认没有开启，我们要确保它开启并在 fastcgi_param 一行更改了参数（因为浏览器调用的默认 PHP 解析器无法找到 PHP 脚本）：</p>
<pre lang="bash">
fastcgi_param SCRIPT_FILENAME /var/www/nginx-default$fastcgi_script_name;
</pre>
<p>最后确保在  include 和 fastcgi_params 之间隔出几个空格（BUG）</p>
<p>重启 Nginx，然后编辑一个 info.php 文件：</p>
<pre lang="php">
// 创建 /var/www/nginx-default/info.php 文件
<?php phpinfo(); ?>
</pre>
<p>保存后在浏览器访问（比如：http://localhost/info.php 或 http://localhost:8080/info.php)，如看到 phpinfo 的参数页面说明配置安装成功 <img src='http://icyleaf.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>5. 安装&#038;配置 Kohana</h3>
<p>Kohana 采用的 v3 版本，<a href="http://v3.kohana.cn/guide/tutorials.git" target="_blank">安装步骤</a>（本文把 kohana 存放在 /home/icyleaf/php/kohana 目录）<br />
添加 Nginx 虚拟主机配置文件：</p>
<pre lang="bash">
# 创建 /etc/nginx/conf.d/kohana.conf 文件
server {
	listen   kohana.local:8080;
	server_name  kohana.local;
	access_log  /var/log/nginx/kohana.access.log;

	# define server root path
	set $root_path /home/icyleaf/php/kohana;

	location / {
		root   $root_path;
		index  index.php index.html index.htm;

		if (!-e $request_filename) {
		    rewrite ^/(.*)$ /index.php?kohana_uri=/$1 last;
		}
	}

	# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
	#
	location ~ \.php$ {
		root   $root_path;
		fastcgi_pass   127.0.0.1:9000;
		fastcgi_index  index.php;
		fastcgi_param  SCRIPT_FILENAME  $root_path$fastcgi_script_name;
		include fastcgi_params;
	}
}
</pre>
<p>配置中首先定义了一个变量 $root_path 指定 Kohana 的源码的路径，对于 Kohana 的 URL rewrite url 重点是 location 段的：</p>
<pre lang="bash">
if (!-e $request_filename) {
	rewrite ^/(.*)$ /index.php?kohana_uri=/$1 last;
}
</pre>
<p>编辑完成后重载 Nginx 配置：</p>
<pre lang="bash">
sudo /etc/init.d/nginx reload
</pre>
<p>至此教程结束，额外说明的是 Kohana 默认的 .htaccess 对 Nginx 无效可有可无 <img src='http://icyleaf.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://icyleaf.com/2010/05/nginx-with-fastcgi-build-kohana/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何获取 Element 的 XPath [PHP/Javascript]</title>
		<link>http://icyleaf.com/2010/04/how-to-get-xpath-of-an-element-for-php-and-javascript/</link>
		<comments>http://icyleaf.com/2010/04/how-to-get-xpath-of-an-element-for-php-and-javascript/#comments</comments>
		<pubDate>Fri, 02 Apr 2010 03:04:20 +0000</pubDate>
		<dc:creator>icyleaf</dc:creator>
				<category><![CDATA[How-To]]></category>
		<category><![CDATA[网络开发]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[XPath]]></category>

		<guid isPermaLink="false">http://icyleaf.com/?p=759</guid>
		<description><![CDATA[这两天研究 HTML 的 DOM 需要寻找某个 Element 元素的完整 XPath 路径，由于使用的是 PHP Simple HTML DOM Parser 开源库，这个库类的使用方法几乎兼容 Javascript 的 DOM 语法并附带 DOM 选择器。虽然功能强大但是并不能直接获取 Element 的 XPath。这个怎么办呢，依稀记得 Firebug 有一个功能，选择某个元素在它的控制台可以显示 XPath。嗯，着手实践一下发现不仅可以显示而且还可以复制 XPath。 于是想，如果可以找到 Javascript 版的相关代码就一定可以改成 PHP 版本的，结果在 Google 搜索找到了&#8230; var elt = document.getElementById('table'); var &#8230; <a href="http://icyleaf.com/2010/04/how-to-get-xpath-of-an-element-for-php-and-javascript/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>这两天研究 HTML 的 DOM 需要寻找某个 Element 元素的完整 XPath 路径，由于使用的是 <a href="http://simplehtmldom.sourceforge.net/manual.htm">PHP Simple HTML DOM Parser</a> 开源库，这个库类的使用方法几乎兼容 Javascript 的 DOM 语法并附带 DOM 选择器。虽然功能强大但是并不能直接获取 Element 的 XPath。这个怎么办呢，依稀记得 Firebug 有一个功能，选择某个元素在它的控制台可以显示 XPath。嗯，着手实践一下发现不仅可以显示而且还可以复制 XPath。</p>
<p>于是想，如果可以找到 Javascript 版的相关代码就一定可以改成 PHP 版本的，结果在 Google 搜索找到了&#8230;</p>
<pre lang="javascript" line="1" colla="+">
var elt = document.getElementById('table');
var xpath = getElementXPath(elt);
alert(xpath);

// Get full XPath of an element
function getElementXPath(elt)
{
	var path = "";
	for (; elt &#038;&#038; elt.nodeType == 1; elt = elt.parentNode)
	{
		idx = getElementIdx(elt);
		xname = elt.tagName;
		if (idx > 1) xname += "[" + idx + "]";
		path = "/" + xname + path;
	}

	return path;
}

// Get Idx of an element
function getElementIdx(elt)
{
    var count = 1;
    for (var sib = elt.previousSibling; sib ; sib = sib.previousSibling)
    {
        if(sib.nodeType == 1 &#038;&#038; sib.tagName == elt.tagName)	count++
    }

    return count;
}
</pre>
<p>PHP 改进版：</p>
<pre lang="php" line="1" colla="+">
// Use it before import PHP Simple HTML DOM Parser
$html = file_get_html('http://www.google.com/');
// find a sample element by id
$elt1 = $html->find('#footer', 0);
// find a sample element by tag name
$elt2= $html->find('div', 10);

// it will return if found it: //*[@id="footer"]
$xpath = getElementXPath($elt1);

// it will return if found it: html/body/div[10]
$xpath = getElementXPath($elt2);

function getElementXPath($elt)
{
	$path = '';
	$first = TRUE;
	for(; ($elt AND $elt->nodetype == 1); $elt = $elt->parent())
	{
		$xname = $elt->tag;
		$idx = getElementIdx($elt);

		if ($first AND isset($elt->attr['id']))
		{
			$path = '//*[@id="' . $elt->attr['id'] . '"]';
			break;
		}

		if ($idx > 1)
		{
			$xname .= '[' . $idx . ']';
		}

		$path = '/'.$xname.$path;

		$first = FALSE;
	}

	return $path;
}

function getElementIdx($elt)
{
    $count = 1;
    for($sib = $elt->prev_sibling(); $sib ; $sib = $sib->prev_sibling())
    {
        if($sib->nodetype == 1 &#038;&#038; $sib->tag == $elt->tag)
        {
        	$count++;
        }
    }

    return $count;
}
</pre>
<p>大家同样可以把上面的代码直接 crack 到 PHP Simple HTML DOM Parser 库中。</p>
]]></content:encoded>
			<wfw:commentRss>http://icyleaf.com/2010/04/how-to-get-xpath-of-an-element-for-php-and-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Douban API Package 发布！</title>
		<link>http://icyleaf.com/2010/01/douban-api-package/</link>
		<comments>http://icyleaf.com/2010/01/douban-api-package/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 01:30:01 +0000</pubDate>
		<dc:creator>icyleaf</dc:creator>
				<category><![CDATA[Kohana]]></category>
		<category><![CDATA[网络开发]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[douban]]></category>
		<category><![CDATA[豆瓣]]></category>

		<guid isPermaLink="false">http://icyleaf.com/?p=745</guid>
		<description><![CDATA[Douban API Package 是一个使用 PHP 开发且基于 Kohana v3 开发的一个扩展（Module）。 它对豆瓣 API 进行重新封包。它使用起来非常方便，可以快速开发一个 web 应用。 为什么要另外封包？ 对，豆瓣官方提供了一种 PHP 的解决方案，可是需要庞大的支持库：GData（20M左右）以及可能无法修改的环境配置（租用的空间主机会遇到这样的问题）。虽说 Douban API Package 也是基于框架开发，不过 Kohana 是一个纯 PHP5 模式且体积小巧（仅有 478KB），优秀迅捷的框架。最重要的是，Douban API Package 提供了目前官方所有功能的支持。并有线上网站：魔豆 和豆瓣 API 控制台长期运营。 虽然它是基于 Kohana 框架开发，但是并没有使用太多的依赖，稍微熟悉可以轻松分离出来！ 安装需求 PHP 5.2+ with &#8230; <a href="http://icyleaf.com/2010/01/douban-api-package/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Douban API Package 是一个使用 PHP 开发且基于 Kohana v3 开发的一个扩展（Module）。</p>
<p>它对<a href="http://www.douban.com/">豆瓣</a> <a href="http://www.douban.com/service/apidoc/">API</a> 进行重新封包。它使用起来非常方便，可以快速开发一个 web 应用。</p>
<p><strong>为什么要另外封包？</strong><br />
对，豆瓣官方提供了一种 PHP 的解决方案，可是需要庞大的支持库：GData（20M左右）以及可能无法修改的环境配置（租用的空间主机会遇到这样的问题）。虽说 Douban API Package 也是基于框架开发，不过 Kohana 是一个纯 PHP5 模式且体积小巧（仅有 478KB），优秀迅捷的框架。<strong>最重要的是</strong>，Douban API Package 提供了目前官方所有功能的支持。并有线上网站：<a href="http://modou.us/">魔豆</a> 和<a href="http://modou.us/console">豆瓣 API 控制台</a>长期运营。</p>
<p><em>虽然它是基于 Kohana 框架开发，但是并没有使用太多的依赖，稍微熟悉可以轻松分离出来！</em></p>
<p><strong>安装需求</strong></p>
<ul>
<li>PHP 5.2+ with curl module</li>
<li><a href="http://github.com/kohana/kohana">Kohana v3</a> &#8211; 一款纯 PHP 5 框架，它的特点就是<strong>高安全性</strong>，<strong>轻量级代码</strong>，<strong>容易使用</strong>。</li>
</ul>
<p><strong>安装步骤</strong><br />
步骤 0: 部署 Kohana v3</p>
<p>下载并安装 Kohana v3 的过程，请大家参考此教程：<a href="http://kohanaphp.cn/guide/tutorials.git">使用 Git 部署 Kohana 系统</a></p>
<p>步骤 1: 下载本扩展!</p>
<p>你可以在部署完毕的 Kohana 系统的根目录执行下面操作：</p>
<pre lang="bash">$ git submodule add git://github.com/icyleaf/douban.git modules/douban</pre>
<p>完成！</p>
<p>或者你也可以从本<a href="http://github.com/icyleaf/douban">github 项目</a> 下载压缩包放置在 modules 文件夹下面。</p>
<p>步骤 2: 在 <code>bootstrap.php</code> 文件中启用该模块(默认情况下，存储在 `application&#8217; 文件夹)</p>
<pre lang="php">/**
 * Enable modules. Modules are referenced by a relative or absolute path.
 */
Kohana::modules(array(
     'douban'        => MODPATH.'douban',     // Douban API Module
    // 'database'   => MODPATH.'database',   // Database access
    // 'image'      => MODPATH.'image',      // Image manipulation
    // 'orm'        => MODPATH.'orm',        // Object Relationship Mapping (not complete)
    // 'pagination' => MODPATH.'pagination', // Paging of results
    // 'paypal'     => MODPATH.'paypal',     // PayPal integration (not complete)
    // 'todoist'    => MODPATH.'todoist',    // Todoist integration
    // 'unittest'   => MODPATH.'unittest',   // Unit testing
    // 'codebench'  => MODPATH.'codebench',  // Benchmarking tool
    ));
</pre>
<p><strong>目录结构</strong></p>
<pre lang="bash">douban
  +--- classes
         +--- controller               # 豆瓣样例
         +--- douban                   # Douban API Package
                +--- api               # Douban API
                +--- core.php          # Douban Core
                +--- oauth.php         # Douban OAuth
                +--- request.php       # Douban Requset
                +--- response.php      # Douban Response
         +--- douban.php               # Douban API Class
  +--- config
         +--- douban.php               # 豆瓣 API 配置文件
         +--- user_agents.php          # 奉送给大家一些手机 User agent 配置文件
  +--- media
         +--- images                   # 奉送给大家豆瓣 API 用到的图像
  +--- vendor
         +--- OAuth.php                # OAuth 官方推荐 PHP 库
  +--- LICENSE
  +--- README.markdown
</pre>
<p><strong>快速上手</strong><br />
Douban API Package 提供一些演示用例，系统部署完毕后可以通过 <code>http://host/demo_douban</code> 访问。</p>
<p>文件路径：<code>classes/controller/douban_demo.php</code></p>
<p>源码库：<a href="http://github.com/icyleaf/douban">http://github.com/icyleaf/douban</a></p>
<p>祝你开发顺利！</p>
<p>如果任何疑问或者 Bugs 反馈，即可以在本项目中提交 Issue 或者给我发邮件：icyleaf.cn囧gmail.com （请替换 &#8220;囧&#8221; 为 @）</p>
]]></content:encoded>
			<wfw:commentRss>http://icyleaf.com/2010/01/douban-api-package/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>几本和 Git 相关的书</title>
		<link>http://icyleaf.com/2009/09/books-about-git/</link>
		<comments>http://icyleaf.com/2009/09/books-about-git/#comments</comments>
		<pubDate>Mon, 28 Sep 2009 05:50:40 +0000</pubDate>
		<dc:creator>icyleaf</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[网络开发]]></category>
		<category><![CDATA[book]]></category>
		<category><![CDATA[git]]></category>

		<guid isPermaLink="false">http://icyleaf.com/?p=691</guid>
		<description><![CDATA[切换到 Git开发已经有一段的时间了，之前一直在使用 svn，现在部分代码还在 Google Code 托管。不过自换了 Git 之后发现 Git 更方便且效率更高，不过用来用去常用的就拿几个命令，很多时候都要去找一些参考资料和教程。从学习到现在一个接触了一个文档，三本书。文档就是官方的文档手册，这个就不再说了，安装完 git 也都会默认内置的，对于这三本书，依次为 Git Community Book，ProGit，Why Git is Better Than X（X 代表其他 SCM 软件，如 svn，bzr等）。 Why Git is Better Than X 已经有国内友人翻译完毕，一一介绍了 Git 与其他 SCM 软件有什么优势和特色 ProGit 不久前开启了翻译计划，中文目前还在翻译过程中， 这本书很适合作为入门使用和工具书，欢迎前来 Fork Git &#8230; <a href="http://icyleaf.com/2009/09/books-about-git/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>切换到 Git开发已经有一段的时间了，之前一直在使用 svn，现在部分代码还在 Google Code 托管。不过自换了 Git 之后发现 Git 更方便且效率更高，不过用来用去常用的就拿几个命令，很多时候都要去找一些参考资料和教程。从学习到现在一个接触了一个文档，三本书。文档就是官方的文档手册，这个就不再说了，安装完 git 也都会默认内置的，对于这三本书，依次为 <a href="http://book.git-scm.com/" target="_self">Git Community Book</a>，<a href="http://progit.org/" target="_self">ProGit</a>，<a href="http://zh-cn.whygitisbetterthanx.com/" target="_self">Why Git is Better Than X</a>（X 代表其他 SCM 软件，如 svn，bzr等）。</p>
<ul>
<li>Why Git is Better Than X 已经有国内友人翻译完毕，一一介绍了 Git 与其他 SCM 软件有什么优势和特色</li>
<li>ProGit 不久前开启了<a href="http://progit.org/2009/08/19/translate-this.html" target="_self">翻译计划</a>，中文目前还在<a href="http://groups.google.com/group/progit-zh" target="_blank">翻译过程</a>中， 这本书很适合作为入门使用和工具书，欢迎前来 <a href="http://github.com/progit/progit" target="_blank">Fork</a></li>
<li>Git Community Book 就是一个由社区维护的手册，内容很全讲解的很详细，就是还没有中文</li>
</ul>
<p>可喜的是，这些书籍都是可以在线观看或下载的，当然如果能进一份力量，请去购买正版，或有一腔热血为 Git 贡献，就请加入到翻译之中。</p>
]]></content:encoded>
			<wfw:commentRss>http://icyleaf.com/2009/09/books-about-git/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kohana 官方 2.3，2.4，3.0 的最终裁决！</title>
		<link>http://icyleaf.com/2009/07/official-2-3-2-4-3-0-decisions/</link>
		<comments>http://icyleaf.com/2009/07/official-2-3-2-4-3-0-decisions/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 06:13:45 +0000</pubDate>
		<dc:creator>icyleaf</dc:creator>
				<category><![CDATA[Kohana]]></category>

		<guid isPermaLink="false">http://icyleaf.com/?p=673</guid>
		<description><![CDATA[更新：Kohana 官方已经做出最终裁决！ 两天前我(Shadowhand)曾经说过关于 2.4 和 3.0 版本的问题和它们之间的关系已经做出的解答。之后的今天和其他开发者见面（with more of the devs），这似乎是错误的。所以长话短说，我们现在有两个选择： 1. 我们在一个月内分别发布 2.4 和 3.0。 2.4 将会经可能的兼容 2.3.x 版本但是其中 Database 和 i18n 是全新的不同于 2.3 的系统。 3.0 也将不同于 2.4 的 Database，但是 i18n 系统还是和 2.4 一致。 2. 完全抛弃 2.4 而专攻 3.0 &#8230; <a href="http://icyleaf.com/2009/07/official-2-3-2-4-3-0-decisions/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<blockquote><p>更新：Kohana 官方已经做出<a href="http://forum.khnfans.cn/topic/view/167/1.html" target="_blank">最终裁决</a>！</p></blockquote>
<p>两天前我(Shadowhand)曾经<a rel="nofollow external" href="http://forum.kohanaphp.com/comments.php?DiscussionID=2835&amp;page=6#Item_12">说过</a>关于 2.4 和 3.0 版本的问题和它们之间的关系已经做出的解答。之后的今天和其他开发者见面（with more of the devs），这似乎是错误的。所以长话短说，我们现在有两个选择：</p>
<p>1. 我们在一个月内分别发布 2.4 和 3.0。 2.4 将会经可能的兼容 2.3.x 版本但是其中 Database 和 i18n 是全新的不同于 2.3 的系统。 3.0 也将不同于 2.4 的 Database，但是 i18n 系统还是和 2.4 一致。</p>
<p>2. 完全抛弃 2.4 而专攻 3.0 版本，它将会有一个全新的类似 2.4 版本的 Database 特性，但是语法和更多的特性稍有些不同。 3.0 在发布的同时，新的网站和用户手册也会同步完成。</p>
<p>2.4 和 3.0 版本大约将会在同一天发布（2009年的8月下旬或9月上旬）。两个版本都不会去兼容 2.3.4 版本。虽然升级至 2.4 版本将会少于升级至 3.0 的兼容工作。（请记住，我们从来没有建议和要求用户升级到哪个核心版本）</p>
<p>我本可以行使 <a rel="nofollow external" href="http://lmgtfy.com/?q=bdfl">BDFL</a>（Benevolent Dictator For Life，代表少数开源软件开发者的领头人）权利做个强制决定，但是我觉得还是听一听社区的声音。你们认为哪个是 Kohana 在未来长期（至少 6 个月以上）开发基础的最好选择呢?<br />
<span id="more-673"></span><br />
<strong>更新</strong>： 选择第二项，将会抛弃 2.3.x 版本公开发布的版本修复</p>
<p>&#8212;&#8212;&#8211;<br />
原文：<a rel="nofollow external" href="http://forum.kohanaphp.com/comments.php?DiscussionID=3043&amp;page=1">Official 2.3, 2.4, 3.0 Decisions &#8211; We need your feedback!</a></p>
<p>&#8212;&#8212;&#8212;我是华丽的分割线&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>KO3 RC1 目前已经发布，详情请看<a href="http://forum.khnfans.cn/topic/view/168.html" target="_blank">这里</a>，希望大家喜欢 Kohana，关注 Kohana，使用 Kohana 的朋友留下你的看法，这对Kohana自身和社区用户都是有益的！</p>
<p>&#8212;&#8212;&#8211;关于 E-TextEditor  的分割线&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>今天前去 Textmate clone 的软件 Intype论坛瞅了一眼，惊奇的发现同样是 Textmate clone 的 E-TextEditor 居然在今年3月份宣布开源，而5月份就在 Github 放出了源码！而且声称会开发 Linux 版本并且弘扬 Linux 的精神，Linux 版本统统免费！详情请看 <a href="http://intype.info/forums/discussion/827/eeditor-going-open-source-open-company/#Item_0" target="_blank">Intype 论坛</a></p>
<p>而且已经有Linux用户编译运行了 E-TextEditor 详情请看：<a href="http://fixnum.org/blog/2009/e_on_fedora" target="_blank">Building the E text editor on Fedora 10</a></p>
<p>不知道身为 Textmate clone 的 Intype 会做何打算，它们目前正在全力开发新的版本（貌似内核和界面全部重新），拭目以待！</p>
]]></content:encoded>
			<wfw:commentRss>http://icyleaf.com/2009/07/official-2-3-2-4-3-0-decisions/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>豆瓣API测试控制台</title>
		<link>http://icyleaf.com/2009/07/douban-api-console/</link>
		<comments>http://icyleaf.com/2009/07/douban-api-console/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 10:06:36 +0000</pubDate>
		<dc:creator>icyleaf</dc:creator>
				<category><![CDATA[Kohana]]></category>
		<category><![CDATA[网络开发]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[console]]></category>
		<category><![CDATA[douban]]></category>
		<category><![CDATA[豆瓣]]></category>
		<category><![CDATA[魔豆]]></category>

		<guid isPermaLink="false">http://icyleaf.com/?p=668</guid>
		<description><![CDATA[项目已开源: http://github.com/icyleaf/modou 豆瓣 API 测试控制台的创造灵感来源于 Facebook Developers Tools 中的 Facebook API Console， 或许大家知道，魔豆是我的另外一个豆瓣 API 应用，由于是自己封装的 Douban API（官方提供的库类要求太多，安装繁琐，这不属于我喜爱简洁，轻便的风格），每次想查看某个 API 接口返回的数据都要写一个 test 跑一下。 麻烦不说，还容易出错，于是，使用自己封装的 Douban API，借鉴 Facebook API Console 的界面和类似的功能显示，终于小有所成，其中为了实现此控制台，封包的库类经过两次大改，虽然改的很辛苦， 但从中学到了很多开发经验。 测试用户必须先进行用户验证才能进行测试，这主要是为了： 避免提交查询中出现错误，并让测试者使用到全部API方法 防止恶意用户利用它做二次api调用，由于测试控制台的传输很简单，提交参数即可查询。 查询方法： 进行用户的登录验证 选择返回的数据类型（支持官方提供的 XML 和 JSON格式） 选择需要查询的API方法（这里我做了分类） 如果查询的方法存在参数，会在方法下面显示。 &#8230; <a href="http://icyleaf.com/2009/07/douban-api-console/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<blockquote><p>项目已开源: http://github.com/icyleaf/modou</p></blockquote>
<p>豆瓣 API 测试控制台的创造灵感来源于 Facebook Developers Tools 中的<a href="http://developers.facebook.com/tools.php" target="_blank"> Facebook API Console</a>， 或许大家知道，魔豆是我的另外一个豆瓣 API 应用，由于是自己封装的 Douban API（官方提供的库类要求太多，安装繁琐，这不属于我喜爱简洁，轻便的风格），每次想查看某个 API 接口返回的数据都要写一个 test 跑一下。 麻烦不说，还容易出错，于是，使用自己封装的 Douban API，借鉴 Facebook API Console 的界面和类似的功能显示，终于小有所成，其中为了实现此控制台，封包的库类经过两次大改，虽然改的很辛苦， 但从中学到了很多开发经验。</p>
<p>测试用户必须先进行用户验证才能进行测试，这主要是为了：</p>
<ol>
<li>避免提交查询中出现错误，并让测试者使用到全部API方法</li>
<li>防止恶意用户利用它做二次api调用，由于测试控制台的传输很简单，提交参数即可查询。</li>
</ol>
<p>查询方法：</p>
<ol>
<li>进行用户的登录验证</li>
<li>选择返回的数据类型（支持官方提供的 XML 和 JSON格式）</li>
<li>选择需要查询的API方法（这里我做了分类）</li>
<li>如果查询的方法存在参数，会在方法下面显示。</li>
<li>设置完毕参数后，点击“调用此方法”，稍等片刻即可。</li>
</ol>
<p><span id="more-668"></span>返回的数据结果会在右侧显示出来，其中，右上部分是调用相关 API 的 URL 地址；右下部分是返回的数据结果。</p>
<p>如果，参数设置错误，或者其他问题，返回的结果会以 [CODE] Content 的格式返回，其中 <strong>CODE </strong>代码返回的状态码，<strong> Content</strong> 是返回的信息。</p>
<p>通用参数解释：</p>
<ul>
<li>id  &#8211; 查询方法涉及到的 id 值（人，书影音，日记，广播，豆邮，同城等）</li>
<li>message &#8211; 广播发送的内容</li>
<li>title &#8211; 日记，豆邮的标题</li>
<li>content &#8211; 主题内容</li>
<li>city &#8211; 同城活动的城市代号（根据我判断，应该是中文的拼音，详细请看<a href="http://www.douban.com/location/world/" target="_blank">官方同城列表</a>中各个城市的url）</li>
<li>query &#8211; 搜索的关键字</li>
<li>index &#8211; 返回多个元素时，起始元素的下标（相当于豆瓣 api 文档中的start-index）</li>
<li>max &#8211; 返回多个entry时，每页最多的结果数（相当于豆瓣 api 文档中的max-results）</li>
</ul>
<p>其中某些方法（涉及到自身的数据，比如我的信息，我的广播，我的同城）在进行查询的时候可以把 id 留空或者设置为 ‘me’ （不带引号），这样调用结果显示的是自己的信息。</p>
<p>如果长时间(大于1分钟)处于“调用中”，可能是由于程序问题，请刷新后重试。</p>
<p>已知存在的问题：</p>
<ol>
<li>界面和方法列表在 Chrome 浏览器有不兼容的问题出现</li>
<li>返回数据结果头一行多出一个类似水平制表符的转义符似的</li>
</ol>
<p>由于目前为止豆瓣 API 还没有封装完成，现只提供用户，广播，书影音，豆邮和日记的不完全功能测试查询。 其余的 API 会尽快添加进去 <img src='http://icyleaf.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>测试地址：<a href="http://ews.im/douban_console" target="_blank">http://ews.im/douban_console</a></p>
]]></content:encoded>
			<wfw:commentRss>http://icyleaf.com/2009/07/douban-api-console/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>魔豆：豆瓣网非官方移动版本</title>
		<link>http://icyleaf.com/2009/06/modou/</link>
		<comments>http://icyleaf.com/2009/06/modou/#comments</comments>
		<pubDate>Mon, 22 Jun 2009 07:46:30 +0000</pubDate>
		<dc:creator>icyleaf</dc:creator>
				<category><![CDATA[Kohana]]></category>
		<category><![CDATA[网络开发]]></category>

		<guid isPermaLink="false">http://icyleaf.com/?p=648</guid>
		<description><![CDATA[项目已开源: http://github.com/icyleaf/modou 魔豆，一个豆瓣网非官方移动版本，基于豆瓣 API开发的专门为移动终端（手持设备）定制的豆瓣移动版本。魔豆专注于豆瓣网的广播及同城活动。 魔豆的来历：豆瓣移动版 -&#62; Douban mobile -&#62; moDouban -&#62; moDou -&#62;魔豆 目前魔豆发布的功能： 友邻广播：支持显示广播，回复发起人和重播（重复发布其他发起者的广播） 同城活动：查看自己参与（包含参加/感兴趣）的活动以及用户所在城市的同城活动（需提前在豆瓣设置） 查看用户相册以及同城活动相册（仅限于从友邻广播） 搜索用户/书影音/同城活动 查看用户/书影音/同城活动信息 显示和查阅豆邮 我，是一个重度豆瓣使用者，也许这和身在北京这所繁华的帝都有很大的关系。虽然豆瓣网直到现在为其定位在书影音这三大模块，但不可否认的，豆瓣小组，豆瓣广播，豆瓣同城甚至豆邮都起着重要的标志性作用。 或许和大家一样，一直期待着豆瓣网能够推出移动版本，可以用手机或其他移动设备查查书影音，看看友邻广播和未读豆邮，浏览下所在城市的同城活动，光想想都是这么的惬意，于是我们在等，一直在等，几乎使我望穿秋水的时候，还是杳无音讯。平时在有 WIFI 网络的情况下，使用 iTouch 访问一下豆瓣网还是可以，如果离开了它，以为这必须使用较昂贵的 GPRS 网络，经过漫长的 loading 才能看到自己感兴趣或自己想看的一点点信息&#8230; 于是，自己何不使用豆瓣API开发一个呢？紧接着通过查阅大量的文档和官方提供的演示代码，抛弃 Zend Framework 和 Gdata，使用自己维护中文化的 Kohana 框架，一点一点的搭建起了基础库，通过一个星期多的时间，开始一边做页面的展现，另一边继续完善基础库，直到目前为止，大体的框架已经完成，下面需要考虑如何对细节做修改和完善。 另外，由于 PHP 没有低耦合的 &#8230; <a href="http://icyleaf.com/2009/06/modou/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<blockquote><p>项目已开源: http://github.com/icyleaf/modou</p></blockquote>
<p><a title="魔豆：豆瓣网非官方移动版本" href="http://modou.us" target="_blank">魔豆</a>，一个<a href="http://douban.com" target="_blank">豆瓣网</a>非官方移动版本，基于<a title="豆瓣 API" href="http://www.douban.com/service/apidoc/" target="_blank">豆瓣 API</a>开发的专门为移动终端（手持设备）定制的豆瓣移动版本。魔豆专注于豆瓣网的<strong>广播</strong>及<strong>同城活动</strong>。</p>
<p>魔豆的来历：豆瓣移动版 -&gt; Douban mobile -&gt; moDouban -&gt; moDou -&gt;魔豆</p>
<p>目前魔豆发布的功能：</p>
<ol>
<li>友邻广播：支持显示广播，回复发起人和重播（重复发布其他发起者的广播）</li>
<li>同城活动：查看自己参与（包含参加/感兴趣）的活动以及用户所在城市的同城活动（需提前在豆瓣设置）</li>
<li>查看用户相册以及同城活动相册（仅限于从友邻广播）</li>
<li>搜索用户/书影音/同城活动</li>
<li>查看用户/书影音/同城活动信息</li>
<li>显示和查阅豆邮</li>
</ol>
<p><span id="more-648"></span></p>
<p>我，是一个重度豆瓣使用者，也许这和身在北京这所繁华的帝都有很大的关系。虽然豆瓣网直到现在为其定位在书影音这三大模块，但不可否认的，豆瓣小组，豆瓣广播，豆瓣同城甚至豆邮都起着重要的标志性作用。</p>
<p>或许和大家一样，一直期待着豆瓣网能够推出移动版本，可以用手机或其他移动设备查查书影音，看看友邻广播和未读豆邮，浏览下所在城市的同城活动，光想想都是这么的惬意，于是我们在等，一直在等，几乎使我望穿秋水的时候，还是杳无音讯。平时在有 WIFI 网络的情况下，使用 iTouch 访问一下豆瓣网还是可以，如果离开了它，以为这必须使用较昂贵的 GPRS 网络，经过漫长的 loading 才能看到自己感兴趣或自己想看的一点点信息&#8230;</p>
<p>于是，自己何不使用豆瓣API开发一个呢？紧接着通过查阅大量的文档和官方提供的演示代码，抛弃 Zend Framework 和 Gdata，使用自己维护中文化的 <a title="Kohana 中文爱好者" href="http://khnfans.cn" target="_blank">Kohana </a>框架，一点一点的搭建起了基础库，通过一个星期多的时间，开始一边做页面的展现，另一边继续完善基础库，直到目前为止，大体的框架已经完成，下面需要考虑如何对细节做修改和完善。</p>
<p>另外，由于 PHP 没有低耦合的 HTTP requset class，自己使用 curl 函数一点点抠出来的一个 RESTFul requset class，在进行提交 POST，PUT，DELETE 方法还存在一些技术问题，所以魔豆目前还不支持对书影音，同城活动进行操作（包含，想读/听/看，感兴趣，我要参加等等），我会尽快完善。</p>
<p>开发环境： <strong>Windows XP + XAMPP + E-texteditor</strong> (Office work) AND <strong>Ubuntu 9.04 + XAMPP + Aptana</strong> (Laptop)</p>
<p>调试设备：iPod Touch + Blackberry 8310 + Nokia N-GAGE QD</p>
<p>由于设备有限，可能在其他设备上会出现设备误判或UI上的问题（大家可以在本日志下面留下误判设备型号），敬请谅解。后期会对不同设备进行专门的优化 <img src='http://icyleaf.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>网站：<a href="http://modou.us" target="_blank">http://modou.us</a></p>
<p>开发进度：<a href="http://modou.us/timeline" target="_blank">http://modou.us/timeline</a></p>
<p>相关截图：<a href="http://www.getdropbox.com/gallery/45081/1/modou?h=b26d7e" target="_blank">http://www.getdropbox.com/gallery/45081/1/modou?h=b26d7e</a></p>
<p>欢迎大家前来测试和使用，心情愉快。</p>
<blockquote><p>更新于 2009年06月22日：由于China Mobile的原因，黑莓手机默认浏览器无法判别，请黑莓用户使用 Opera Mini 或其他浏览器访问，原因请看<a href="http://www.douban.com/group/topic/6946152/" target="_blank">这里</a>。</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://icyleaf.com/2009/06/modou/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>

