<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_sink_cup</title><subtitle type="text">细节 控制 CCN</subtitle><id>http://feed.cnblogs.com/blog/u/63933/rss</id><updated>2012-02-04T12:31:09Z</updated><author><name>sink_cup</name><uri>http://www.cnblogs.com/sink_cup/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/sink_cup/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/63933/rss"/><entry><id>http://www.cnblogs.com/sink_cup/archive/2012/01/29/innovation_works.html</id><title type="text">互联网小创意：比微创新大点</title><summary type="text">偶然看到一些创意，让人耳目一新，很赞，比微创新大点。收集在此。有的营利比较模糊，有的营利比较简单，如果国内没有，值的做做。营利：手机尺寸比较：http://phone-size.com/非营利：互助共享借书：http://bookfor.us/</summary><published>2012-01-29T04:00:00Z</published><updated>2012-01-29T04:00:00Z</updated><author><name>sink_cup</name><uri>http://www.cnblogs.com/sink_cup/</uri></author><link rel="alternate" href="http://www.cnblogs.com/sink_cup/archive/2012/01/29/innovation_works.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/sink_cup/archive/2012/01/29/innovation_works.html"/><content type="html">&lt;p&gt;偶然看到一些创意，让人耳目一新，很赞，比微创新大点。收集在此。&lt;/p&gt;&#xD;
&lt;p&gt;有的营利比较模糊，有的营利比较简单，如果国内没有，值的做做。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;营利：&lt;/p&gt;&#xD;
&lt;p&gt;手机尺寸比较：&lt;a href="http://phone-size.com/" target="_blank"&gt;http://phone-size.com/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;非营利：&lt;/p&gt;&#xD;
&lt;p&gt;互助共享借书：&lt;a href="http://bookfor.us/" target="_blank"&gt;http://bookfor.us/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/sink_cup/aggbug/2331002.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/sink_cup/archive/2012/01/29/innovation_works.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/sink_cup/archive/2012/01/16/12306_ticket_helper.html</id><title type="text">火车票订票机器人：2.0.1版本，支持自动下单</title><summary type="text">火车票订票机器人：作者：未知作者主页：http://www.u-tide.com/blog/安装说明：http://cnbeta.com/articles/168627.htm2.0.1版本：支持自动登录支持自动下单firefox先安装这个：https://addons.mozilla.org/zh-CN/firefox/addon/scriptish/然后firefox与chrome都安装这个：http://files.cnblogs.com/sink_cup/12306_ticket_helper.user.js或者作者提供的这个地址：http://em.tiande.com/fish/_</summary><published>2012-01-16T06:45:00Z</published><updated>2012-01-16T06:45:00Z</updated><author><name>sink_cup</name><uri>http://www.cnblogs.com/sink_cup/</uri></author><link rel="alternate" href="http://www.cnblogs.com/sink_cup/archive/2012/01/16/12306_ticket_helper.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/sink_cup/archive/2012/01/16/12306_ticket_helper.html"/><content type="html">&lt;p&gt;火车票订票机器人：&lt;/p&gt;&#xD;
&lt;p&gt;作者：未知&lt;/p&gt;&#xD;
&lt;p&gt;作者主页：&lt;a href="http://www.u-tide.com/blog/" target="_blank"&gt;http://www.u-tide.com/blog/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;安装说明：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://cnbeta.com/articles/168627.htm" target="_blank"&gt;http://cnbeta.com/articles/168627.htm&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2.0.1版本：&lt;/p&gt;&#xD;
&lt;p&gt;支持自动登录&lt;/p&gt;&#xD;
&lt;p&gt;支持自动下单&lt;/p&gt;&#xD;
&lt;p&gt;firefox先安装这个：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="https://addons.mozilla.org/zh-CN/firefox/addon/scriptish/" target="_blank"&gt;https://addons.mozilla.org/zh-CN/firefox/addon/scriptish/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;然后firefox与chrome都安装这个：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://files.cnblogs.com/sink_cup/12306_ticket_helper.user.js" target="_blank"&gt;http://files.cnblogs.com/sink_cup/12306_ticket_helper.user.js&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;或者作者提供的这个地址：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://em.tiande.com/fish/_softdownload/12306_ticket_helper.user.js" target="_blank"&gt;http://em.tiande.com/fish/_softdownload/12306_ticket_helper.user.js&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;旧版本：&lt;/p&gt;&#xD;
&lt;p&gt;12306_ticket_helper_for_chrome.user.js&lt;/p&gt;&#xD;
&lt;p&gt;12306_ticket_helper_for_firefox.user.js&lt;/p&gt;&lt;img src="http://www.cnblogs.com/sink_cup/aggbug/2323578.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/sink_cup/archive/2012/01/16/12306_ticket_helper.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/sink_cup/archive/2012/01/09/php_array_key_string_int.html</id><title type="text">细节：php array会把string key自动转成int吗？</title><summary type="text">PHP array和别的语言不一样。PHP数组的key可以为int，也可以为string，引申出下面的问题。&amp;lt;?php$a = array( 1 =&amp;gt; &amp;#39;as&amp;#39;, 2 =&amp;gt; &amp;#39;22&amp;#39;,);var_dump($a[0]);var_dump($a[2]);var_dump($a[&amp;#39;2&amp;#39;]);exit;?&amp;gt;结果：$a[0]未定义，$a[2] 与 $a[&amp;#39;2&amp;#39;]相同。&amp;lt;?php$a = array( &amp;#39;1&amp;#39; =&amp;gt; &amp;#39;as&amp;#39;, &amp;#39;2&amp;#39; =&amp;gt; &amp;#39;</summary><published>2012-01-09T07:57:00Z</published><updated>2012-01-09T07:57:00Z</updated><author><name>sink_cup</name><uri>http://www.cnblogs.com/sink_cup/</uri></author><link rel="alternate" href="http://www.cnblogs.com/sink_cup/archive/2012/01/09/php_array_key_string_int.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/sink_cup/archive/2012/01/09/php_array_key_string_int.html"/><content type="html">&lt;p&gt;PHP array和别的语言不一样。&lt;/p&gt;&#xD;
&lt;p&gt;PHP数组的key可以为int，也可以为string，引申出下面的问题。&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;&amp;lt;?php&#xD;
$a = array(&#xD;
    1 =&amp;gt; 'as',&#xD;
    2 =&amp;gt; '22',&#xD;
);&#xD;
var_dump($a[0]);&#xD;
var_dump($a[2]);&#xD;
var_dump($a['2']);&#xD;
exit;&#xD;
?&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;结果：$a[0]未定义，$a[2] 与 $a['2']相同。&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;&amp;lt;?php&#xD;
$a = array(&#xD;
    '1' =&amp;gt; 'as',&#xD;
    '2' =&amp;gt; '22',&#xD;
);&#xD;
var_dump($a[0]);&#xD;
var_dump($a[2]);&#xD;
var_dump($a['2']);&#xD;
exit;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;结果：$a[0]未定义，$a[2] 与 $a['2']相同。&lt;/p&gt;&#xD;
&lt;p&gt;问题：string作为key，然后输出是string还是int。&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;&amp;lt;?php&#xD;
$a = array(&#xD;
    '1' =&amp;gt; 'as',&#xD;
    '2' =&amp;gt; '22',&#xD;
);&#xD;
foreach($a as $k=&amp;gt;$v) {&#xD;
    if($k === 1) {&#xD;
        echo 'int';&#xD;
    }&#xD;
}&#xD;
exit;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;结果：输出int。&lt;/p&gt;&#xD;
&lt;p&gt;问题：现在可以得出结论说php array会自动把数字字符串的key转成int？请看下面的例子。&lt;/p&gt;&#xD;
&lt;p&gt;参考：&lt;a href="http://www.cnblogs.com/sink_cup/archive/2010/12/12/php_intval_mysql_int.html" target="_blank"&gt;http://www.cnblogs.com/sink_cup/archive/2010/12/12/php_intval_mysql_int.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;&amp;lt;?php&#xD;
$a = array(&#xD;
    'asdf' =&amp;gt; 'a',&#xD;
    '2' =&amp;gt; '22',&#xD;
    '2147483647' =&amp;gt; '32 max',&#xD;
    '2147483648' =&amp;gt; '32 max + 1',&#xD;
    '9223372036854775807' =&amp;gt; '64 max',&#xD;
    '9223372036854775808' =&amp;gt; '64 max + 1',&#xD;
    9223372036854775809 =&amp;gt; '64 max + 2',&#xD;
);&#xD;
foreach($a as $k=&amp;gt;$v) {&#xD;
        var_dump($k);&#xD;
        echo ' ';&#xD;
        var_dump($v);&#xD;
}&#xD;
exit;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;在64位的机器上输出：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;string(4) "asdf"&#xD;
 string(1) "a"&#xD;
int(2)&#xD;
 string(2) "22"&#xD;
int(2147483647)&#xD;
 string(6) "32 max"&#xD;
int(2147483648)&#xD;
 string(10) "32 max + 1"&#xD;
int(9223372036854775807)&#xD;
 string(6) "64 max"&#xD;
string(19) "9223372036854775808"&#xD;
 string(10) "64 max + 1"&#xD;
int(-9223372036854775808)&#xD;
 string(10) "64 max + 2"&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;结论：php的int取值范围与系统有关，在int的有效范围内，php array会把数字字符串的key转成int；当key超过int范围时，不再转换。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/sink_cup/aggbug/2317236.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/sink_cup/archive/2012/01/09/php_array_key_string_int.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/sink_cup/archive/2011/12/28/php_curl.html</id><title type="text">php curl常见错误：SSL错误、bool(false)</title><summary type="text">症状：php curl调用https出错排查方法：在命令行中使用curl调用试试。原因：服务器所在机房无法验证SSL证书。解决办法：跳过SSL证书检查。curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);症状：php curl调用curl_exec返回bool(false)，命令行curl调用正常。排查方法：var_dump(curl_error($ch));返回：string(23) &amp;quot;Empty reply from server&amp;quot;再排查： curl_setopt($ch, CURLOPT_HEADER, true); cur</summary><published>2011-12-28T07:54:00Z</published><updated>2011-12-28T07:54:00Z</updated><author><name>sink_cup</name><uri>http://www.cnblogs.com/sink_cup/</uri></author><link rel="alternate" href="http://www.cnblogs.com/sink_cup/archive/2011/12/28/php_curl.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/sink_cup/archive/2011/12/28/php_curl.html"/><content type="html">&lt;p&gt;症状：php curl调用https出错&lt;/p&gt;&#xD;
&lt;p&gt;排查方法：在命令行中使用curl调用试试。&lt;/p&gt;&#xD;
&lt;p&gt;原因：服务器所在机房无法验证SSL证书。&lt;/p&gt;&#xD;
&lt;p&gt;解决办法：跳过SSL证书检查。&lt;/p&gt;&#xD;
&lt;p&gt;curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;症状：php curl调用curl_exec返回bool(false)，命令行curl调用正常。&lt;/p&gt;&#xD;
&lt;p&gt;排查方法：&lt;/p&gt;&#xD;
&lt;p&gt;var_dump(curl_error($ch));&lt;/p&gt;&#xD;
&lt;p&gt;返回：&lt;/p&gt;&#xD;
&lt;p&gt;string(23) "Empty reply from server"&lt;/p&gt;&#xD;
&lt;p&gt;再排查：&lt;/p&gt;&#xD;
&lt;p&gt;curl_setopt($ch, CURLOPT_HEADER, true);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);&lt;/p&gt;&#xD;
&lt;p&gt;返回：&lt;/p&gt;&#xD;
&lt;p&gt;HTTP/1.1 100 Continue&lt;br /&gt;Connection: close&lt;/p&gt;&#xD;
&lt;p&gt;原因：php curl接收到HTTP 100就结束了，应该继续接收HTTP 200&lt;/p&gt;&#xD;
&lt;p&gt;解决方案：&lt;/p&gt;&#xD;
&lt;p&gt;curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;参考资料：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://the-stickman.com/web-development/php-and-curl-disabling-100-continue-header/" target="_blank"&gt;http://the-stickman.com/web-development/php-and-curl-disabling-100-continue-header/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/sink_cup/aggbug/2304914.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/sink_cup/archive/2011/12/28/php_curl.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/sink_cup/archive/2011/11/30/domain_ttl.html</id><title type="text">域名 TTL 查询</title><summary type="text">Windows：nslookup -d example.comLinux：dig example.com</summary><published>2011-11-30T10:17:00Z</published><updated>2011-11-30T10:17:00Z</updated><author><name>sink_cup</name><uri>http://www.cnblogs.com/sink_cup/</uri></author><link rel="alternate" href="http://www.cnblogs.com/sink_cup/archive/2011/11/30/domain_ttl.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/sink_cup/archive/2011/11/30/domain_ttl.html"/><content type="html">&lt;p&gt;Windows：&lt;/p&gt;&#xD;
&lt;p&gt;nslookup -d example.com&lt;/p&gt;&#xD;
&lt;p&gt;Linux：&lt;/p&gt;&#xD;
&lt;p&gt;dig example.com&lt;/p&gt;&lt;img src="http://www.cnblogs.com/sink_cup/aggbug/2268941.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/sink_cup/archive/2011/11/30/domain_ttl.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/sink_cup/archive/2011/11/27/linux_useradd_sudo.html</id><title type="text">Linux添加sudo用户</title><summary type="text">Linux 添加 sudo 用户创建用户的时候，指定admin组，这样用户就有sudo权限了。sudo useradd -m -s /bin/bash -g admin jimsudo passwd jim123456123456给老用户添加sudo权限sudo usermod -g admin jim参考资料：http://www.iteye.com/topic/607470</summary><published>2011-11-27T15:03:00Z</published><updated>2011-11-27T15:03:00Z</updated><author><name>sink_cup</name><uri>http://www.cnblogs.com/sink_cup/</uri></author><link rel="alternate" href="http://www.cnblogs.com/sink_cup/archive/2011/11/27/linux_useradd_sudo.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/sink_cup/archive/2011/11/27/linux_useradd_sudo.html"/><content type="html">&lt;p&gt;&lt;strong&gt;Linux 添加 sudo 用户&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;创建用户的时候，指定admin组，这样用户就有sudo权限了。&lt;/p&gt;&#xD;
&lt;pre&gt;sudo useradd -m -s /bin/bash -g admin jim&#xD;
sudo passwd jim&#xD;
123456&#xD;
123456&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;strong&gt;给老用户添加sudo权限&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;pre&gt;sudo usermod -g admin jim&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;参考资料：&lt;a href="http://www.iteye.com/topic/607470" target="_blank"&gt;http://www.iteye.com/topic/607470&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/sink_cup/aggbug/2265407.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/sink_cup/archive/2011/11/27/linux_useradd_sudo.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/sink_cup/archive/2011/11/13/apache_httpd_module-mod_expires-mod_deflate.html</id><title type="text">Apache httpd 安装module——mod_expires、mod_deflate</title><summary type="text">编译安装好apache httpd以后，可以继续添加扩展mod_expires 用于发送header，设置静态文件的过期时间。参考：http://httpd.apache.org/docs/2.2/mod/mod_expires.htmlcd httpd-2.2.19/modules/metadatasudo /usr/local/apache2/bin/apxs -i -a -c mod_expires.cecho &amp;#39;ExpiresActive On&amp;#39; | sudo tee -a /usr/local/apache2/conf/httpd.confecho &amp;#39;File</summary><published>2011-11-13T05:55:00Z</published><updated>2011-11-13T05:55:00Z</updated><author><name>sink_cup</name><uri>http://www.cnblogs.com/sink_cup/</uri></author><link rel="alternate" href="http://www.cnblogs.com/sink_cup/archive/2011/11/13/apache_httpd_module-mod_expires-mod_deflate.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/sink_cup/archive/2011/11/13/apache_httpd_module-mod_expires-mod_deflate.html"/><content type="html">&lt;p&gt;编译安装好apache httpd以后，可以继续添加扩展&lt;/p&gt;&#xD;
&lt;p&gt;mod_expires 用于发送header，设置静态文件的过期时间。&lt;/p&gt;&#xD;
&lt;p&gt;参考：&lt;a href="http://httpd.apache.org/docs/2.2/mod/mod_expires.html" target="_blank"&gt;http://httpd.apache.org/docs/2.2/mod/mod_expires.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;pre&gt;cd httpd-2.2.19/modules/metadata&#xD;
sudo /usr/local/apache2/bin/apxs -i -a -c mod_expires.c&#xD;
echo 'ExpiresActive On' | sudo tee -a /usr/local/apache2/conf/httpd.conf&#xD;
echo 'FileEtag none' | sudo tee -a /usr/local/apache2/conf/httpd.conf&#xD;
然后按照在静态服务器的配置里加上ExpiresDefault "access plus 1 month"&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;mod_deflate 用于开启gzip压缩&lt;/p&gt;&#xD;
&lt;pre&gt;cd httpd-2.2.19/modules/filters&#xD;
sudo /usr/local/apache2/bin/apxs -i -a -c mod_deflate.c&#xD;
echo 'SetOutputFilter DEFLATE' | sudo tee -a /usr/local/apache2/conf/httpd.conf&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;改完配置，重启apache。&lt;/p&gt;&#xD;
&lt;p&gt;参考资料：&lt;/p&gt;&#xD;
&lt;p&gt;《高性能网站建设指南》&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://book.douban.com/subject/3132277/" target="_blank"&gt;http://book.douban.com/subject/3132277/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/sink_cup/aggbug/2247218.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/sink_cup/archive/2011/11/13/apache_httpd_module-mod_expires-mod_deflate.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/sink_cup/archive/2011/11/05/rest_uri_rewrite_header_version_number.html</id><title type="text">REST URI设计：版本号放在header中，rewrite配置</title><summary type="text">REST API新版本上线后，旧版本要继续在线，所以要做多版本并行。服务器代码目录api.example.com/ 0.1/ c m www/index.php 0.2/之前做的URI是这样的：curl http://api.example.com/0.2/users/1web server需要做rewrite，把各个版本的请求路由到 {v}/www/index.php。版本号的格式为：11.11.11，即([0-9]+\.)+[0-9]+这时候apache这么配...</summary><published>2011-11-05T09:06:00Z</published><updated>2011-11-05T09:06:00Z</updated><author><name>sink_cup</name><uri>http://www.cnblogs.com/sink_cup/</uri></author><link rel="alternate" href="http://www.cnblogs.com/sink_cup/archive/2011/11/05/rest_uri_rewrite_header_version_number.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/sink_cup/archive/2011/11/05/rest_uri_rewrite_header_version_number.html"/><content type="html">&lt;p&gt;REST API新版本上线后，旧版本要继续在线，所以要做多版本并行。&lt;/p&gt;&#xD;
&lt;p&gt;服务器代码目录&lt;/p&gt;&#xD;
&lt;p&gt;api.example.com/&lt;/p&gt;&#xD;
&lt;p&gt;0.1/&lt;/p&gt;&#xD;
&lt;p&gt;c&lt;/p&gt;&#xD;
&lt;p&gt;m&lt;/p&gt;&#xD;
&lt;p&gt;www/index.php&lt;/p&gt;&#xD;
&lt;p&gt;0.2/&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;之前做的URI是这样的：&lt;/p&gt;&#xD;
&lt;pre&gt;curl http://api.example.com/0.2/users/1&lt;/pre&gt;&#xD;
&lt;p&gt;web server需要做rewrite，把各个版本的请求路由到 {v}/www/index.php。&lt;/p&gt;&#xD;
&lt;p&gt;版本号的格式为：11.11.11，即([0-9]+\.)+[0-9]+&lt;/p&gt;&#xD;
&lt;p&gt;这时候apache这么配：&lt;/p&gt;&#xD;
&lt;pre&gt;DocumentRoot "/api.example.com/"&#xD;
    ServerName api.example.com&#xD;
    RewriteEngine On&#xD;
    RewriteRule ^/(([0-9]+\.)+[0-9]+)/ /$1/www/index.php&#xD;
    #RewriteLogLevel 9&#xD;
    #RewriteLog logs/api.example.com-rewrite_log&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;调试通过，就可以把rewrite_log关掉了。&lt;/p&gt;&#xD;
&lt;p&gt;更多的了解REST以后，觉得把版本号、access_token放在header中更符合资源的概念。&lt;/p&gt;&#xD;
&lt;p&gt;参考：&lt;a href="http://www.ruanyifeng.com/blog/2011/09/restful.html" target="_blank"&gt;http://www.ruanyifeng.com/blog/2011/09/restful.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;URI改成这样：&lt;/p&gt;&#xD;
&lt;pre&gt;curl -H 'Accept:application/json; version=0.2' http://api.example.com/users/1&lt;/pre&gt;&#xD;
&lt;p&gt;这个时候需要web server从header中解析到版本号，然后路由。&lt;/p&gt;&#xD;
&lt;p&gt;这个时候apache这么配：&lt;/p&gt;&#xD;
&lt;pre&gt;DocumentRoot "/api.example.com/"&#xD;
    ServerName api.example.com&#xD;
    RewriteEngine On&#xD;
    RewriteCond  %{HTTP_ACCEPT}  version=(([0-9]+\.)+[0-9]+) &#xD;
    RewriteRule ^(.+)$ - [env=v:%1]&#xD;
    RewriteCond  %{HTTP_ACCEPT}  version=(([0-9]+\.)+[0-9]+)&#xD;
    RewriteRule  .*   /%{ENV:v}/www/index.php&#xD;
    #RewriteLogLevel 9&#xD;
    #RewriteLog logs/api.example.com-rewrite_log&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;在网上查了半天，才试出来apache rewrite从header中取变量。&lt;/p&gt;&#xD;
&lt;p&gt;也可以用php来路由，todo。&lt;/p&gt;&#xD;
&lt;p&gt;参考资料：&lt;/p&gt;&#xD;
&lt;p&gt;apache [env=ps:http]&amp;nbsp;%{ENV:ps}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html" target="_blank"&gt;http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;apache rewrite 变量 %{}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://httpd.apache.org/docs/current/mod/mod_rewrite.html#RewriteCond" target="_blank"&gt;http://httpd.apache.org/docs/current/mod/mod_rewrite.html#RewriteCond&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;apache rewrite %N $N&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://httpd.apache.org/docs/current/mod/mod_rewrite.html#RewriteRule" target="_blank"&gt;http://httpd.apache.org/docs/current/mod/mod_rewrite.html#RewriteRule&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;apache&amp;nbsp;[E=VAR:VAL] [env&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_e" target="_blank"&gt;http://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_e&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;截图：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/102653/2011110517041129.png" alt="" /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/sink_cup/aggbug/2237146.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/sink_cup/archive/2011/11/05/rest_uri_rewrite_header_version_number.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/sink_cup/archive/2011/10/31/ubuntu_x64_eclipse_android_sdk_java.html</id><title type="text">Ubuntu 11.10 x64 安装 Eclipse Android SDK Java开发IDE</title><summary type="text">操作系统：Ubuntu 11.10 x64目标：安装 Eclipse Android SDK Java先安装Android SDK，再安装eclipsehttp://www.cnblogs.com/sink_cup/archive/2011/10/31/ubuntu_x64_android_sdk_java.html安装Eclipse Classic下载Eclipse Classic Linux 64 Bithttp://www.eclipse.org/downloads/?osType=linux安装Eclipse ADT下载ADT-14.0.0.ziphttp://developer.an</summary><published>2011-10-31T09:54:00Z</published><updated>2011-10-31T09:54:00Z</updated><author><name>sink_cup</name><uri>http://www.cnblogs.com/sink_cup/</uri></author><link rel="alternate" href="http://www.cnblogs.com/sink_cup/archive/2011/10/31/ubuntu_x64_eclipse_android_sdk_java.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/sink_cup/archive/2011/10/31/ubuntu_x64_eclipse_android_sdk_java.html"/><content type="html">&lt;p&gt;操作系统：Ubuntu 11.10 x64&lt;/p&gt;&#xD;
&lt;p&gt;目标：安装 Eclipse Android SDK Java&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;先安装Android SDK，再安装eclipse&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/sink_cup/archive/2011/10/31/ubuntu_x64_android_sdk_java.html" target="_blank"&gt;http://www.cnblogs.com/sink_cup/archive/2011/10/31/ubuntu_x64_android_sdk_java.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;安装Eclipse Classic&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下载Eclipse Classic Linux 64 Bit&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.eclipse.org/downloads/?osType=linux"&gt;http://www.eclipse.org/downloads/?osType=linux&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;安装Eclipse ADT&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下载ADT-14.0.0.zip&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://developer.android.com/sdk/eclipse-adt.html#troubleshooting" target="_blank"&gt;http://developer.android.com/sdk/eclipse-adt.html#troubleshooting&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Eclipse -》 Help -》 Install New Software -》 add，选择下载的zip&lt;/p&gt;&#xD;
&lt;p&gt;重启eclipse&lt;/p&gt;&#xD;
&lt;p&gt;Eclipse -》Window -》 Preferences -》 Android&lt;/p&gt;&#xD;
&lt;p&gt;设置SDK Location，选择目录android-sdk-linux&lt;/p&gt;&#xD;
&lt;p&gt;关闭eclipse。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;开始Android Java hello world&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://developer.android.com/resources/tutorials/hello-world.html" target="_blank"&gt;http://developer.android.com/resources/tutorials/hello-world.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;package what.ever;&#xD;
&#xD;
import android.app.Activity;&#xD;
import android.os.Bundle;&#xD;
import android.widget.TextView;&#xD;
&#xD;
public class HelloWorldActivity extends Activity {&#xD;
    /** Called when the activity is first created. */&#xD;
    @Override&#xD;
    public void onCreate(Bundle savedInstanceState) {&#xD;
        super.onCreate(savedInstanceState);&#xD;
        TextView tv = new TextView(this);&#xD;
        tv.setText("Hello, Android Java");&#xD;
        setContentView(tv);&#xD;
    }&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;编译后直接安装到手机里&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;eclipse -》 window -》 Show View -》 other -》 device， 在device界面中选择你手机的名字就行了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Eclipse调试Android&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;eclipse -》 window -》 Open Perspective -》 other -》 DDMS&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;参考资料：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://developer.android.com/sdk/installing.html" target="_blank"&gt;http://developer.android.com/sdk/installing.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;截图：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/102653/2011102621271775.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/102653/2011092515170897.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/102653/2011092516450039.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/102653/2011092520250239.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/102653/2011092614545138.png" alt="" /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/sink_cup/aggbug/2230574.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/sink_cup/archive/2011/10/31/ubuntu_x64_eclipse_android_sdk_java.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/sink_cup/archive/2011/10/31/ubuntu_x64_android_sdk_java.html</id><title type="text">Ubuntu 11.10 x64 安装 Android SDK</title><summary type="text">操作系统：Ubuntu 11.10 x64操作系统说明：Ubuntu 11.10 x64已自带了openjdk-6-jre目标：安装 Android SDK Java安装32位库文件由于Android SDK中的部分程序是32位的，所以Ubuntu x64系统需要安装32位库文件，才能兼容32位的程序。如果不安装，adb会出错：java.io.IOException: error=2sudo apt-get install ia32-libs安装Android SDK下载Android SDK Linuxhttp://developer.android.com/sdk/index.html解压</summary><published>2011-10-31T07:45:00Z</published><updated>2011-10-31T07:45:00Z</updated><author><name>sink_cup</name><uri>http://www.cnblogs.com/sink_cup/</uri></author><link rel="alternate" href="http://www.cnblogs.com/sink_cup/archive/2011/10/31/ubuntu_x64_android_sdk_java.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/sink_cup/archive/2011/10/31/ubuntu_x64_android_sdk_java.html"/><content type="html">&lt;p&gt;操作系统：Ubuntu 11.10 x64&lt;/p&gt;&#xD;
&lt;p&gt;操作系统说明：Ubuntu 11.10 x64已自带了openjdk-6-jre&lt;/p&gt;&#xD;
&lt;p&gt;目标：安装 Android SDK Java&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;安装32位库文件&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;由于Android SDK中的部分程序是32位的，所以Ubuntu x64系统需要安装32位库文件，才能兼容32位的程序。如果不安装，adb会出错：java.io.IOException: error=2&lt;/p&gt;&#xD;
&lt;pre&gt;sudo apt-get install ia32-libs&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;strong&gt;安装Android SDK&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下载Android SDK Linux&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://developer.android.com/sdk/index.html" target="_blank"&gt;http://developer.android.com/sdk/index.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;解压缩即可，得到目录android-sdk-linux。&lt;/p&gt;&#xD;
&lt;pre&gt;tar -zxvf android-sdk_r15-linux.tgz&#xD;
cd android-sdk-linux/&#xD;
echo tools/android是Java软件，由于系统自带了jre，所以可以运行。&#xD;
./tools/android&#xD;
echo 选中Adroid SDK Platform-tools、Android 4.0、在线安装，需要下载一段时间。&#xD;
echo 做个链接&#xD;
sudo ln -s /home/user1/Downloads/android-sdk-linux/tools/android /usr/bin/&#xD;
sudo ln -s /home/user1/Downloads/android-sdk-linux/platform-tools/adb /usr/bin/&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;如果出现错误：Failed to fetch URL https://dl-ssl.google.com/android/repository/repository.xml, reason: java.security.cert.CertificateException: No name matching dl-ssl.google.com found&lt;/p&gt;&#xD;
&lt;p&gt;解决方法：&lt;/p&gt;&#xD;
&lt;p&gt;settings -》勾选 Force https://...sources to be fetched using http://&lt;/p&gt;&#xD;
&lt;p&gt;sudo vi /etc/hosts&lt;/p&gt;&#xD;
&lt;p&gt;203.208.46.100 dl.google.com&lt;/p&gt;&#xD;
&lt;p&gt;203.208.46.100 dl-ssl.google.com&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;adb识别Android设备（手机、平板等）&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Android设备：系统设置-》应用程序-》未知源。选中此项。&lt;/p&gt;&#xD;
&lt;p&gt;Android设备：系统设置-》应用程序-》开发-》USB调试。选中此项。&lt;/p&gt;&#xD;
&lt;p&gt;Android设备通过USB线连接电脑。&lt;/p&gt;&#xD;
&lt;pre&gt;adb devices&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;如果显示List of devices attached ???????????? no permissions，说明无法识别这款设备，修改配置即可识别，步骤如下。&lt;/p&gt;&#xD;
&lt;pre&gt;lsusb&lt;/pre&gt;&#xD;
&lt;p&gt;看到设备的厂商ID，比如Bus 002 Device 003: ID 0bb4:0ccf High Tech Computer Corp.表示厂商ID为0bb4&lt;/p&gt;&#xD;
&lt;pre&gt;sudo vi /etc/udev/rules.d/51-android.rules&lt;/pre&gt;&#xD;
&lt;p&gt;按照厂商ID填写，比如0bb4就写&lt;/p&gt;&#xD;
&lt;pre&gt;SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ODE="0666", GROUP="plugdev"&lt;/pre&gt;&#xD;
&lt;pre&gt;sudo chmod a+r /etc/udev/rules.d/51-android.rules&#xD;
sudo service udev restart&#xD;
android update adb&lt;/pre&gt;&#xD;
&lt;p&gt;把设备拔下来，重新连上。&lt;/p&gt;&#xD;
&lt;pre&gt;adb devices&lt;/pre&gt;&#xD;
&lt;p&gt;如果显示正常，即可。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;创建一个安卓虚拟设备AVD&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果没有Android手机或者平板，没关系，可以在安卓虚拟机里运行。&lt;/p&gt;&#xD;
&lt;pre&gt;android&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;Tools -》 Manager AVDs -》 new&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;手写hello world&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;todo&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;参考资料：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://developer.android.com/sdk/installing.html" target="_blank"&gt;http://developer.android.com/sdk/installing.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;截图：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/102653/2011110122544624.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/102653/2011102710020516.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/102653/2011102710273094.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/102653/2011102711163932.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/102653/2011102711170698.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/102653/2011110122205951.png" alt="" /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/sink_cup/aggbug/2230344.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/sink_cup/archive/2011/10/31/ubuntu_x64_android_sdk_java.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
