<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Roy Notes]]></title>
  <link href="http://roynotes.com/atom.xml" rel="self"/>
  <link href="http://roynotes.com/"/>
  <updated>2012-02-20T16:17:49+08:00</updated>
  <id>http://roynotes.com/</id>
  <author>
    <name><![CDATA[roymax]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[node-restify 简介]]></title>
    <link href="http://roynotes.com/blog/2012/02/node-restify-intro/"/>
    <updated>2012-02-19T22:18:00+08:00</updated>
    <id>http://roynotes.com/blog/2012/02/node-restify-intro</id>
    <content type="html"><![CDATA[<p><a href="https://github.com/mcavage/node-restify">restify</a> 是<a href="http://nodejs.org">Node.js</a>的模块。虽然<code>restify</code>的API或多或少的参考了<a href="http://expressjs.com/">express</a>，但<code>restify</code>不是一个MVC框架，它是一套为了能够正确构建REST风格API而诞生的框架。</p>

<h3>安装restify</h3>

<p>将<code>restify</code>安装到目录<code>restify-dmeo</code></p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ mkdir restify-demo
</span><span class='line'>$ cd restify-demo
</span><span class='line'>$ npm install restify</span></code></pre></td></tr></table></div></figure>


<h3>Hello World</h3>

<figure class='code'><figcaption><span>app.js</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">restify</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;restify&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">respond</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">,</span> <span class="nx">next</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="s1">&#39;hello &#39;</span> <span class="o">+</span> <span class="nx">req</span><span class="p">.</span><span class="nx">params</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">server</span> <span class="o">=</span> <span class="nx">restify</span><span class="p">.</span><span class="nx">createServer</span><span class="p">();</span>
</span><span class='line'><span class="nx">server</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/hello/:name&#39;</span><span class="p">,</span> <span class="nx">respond</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">server</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">8080</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;%s listening at %s&#39;</span><span class="p">,</span> <span class="nx">server</span><span class="p">.</span><span class="nx">name</span><span class="p">,</span> <span class="nx">server</span><span class="p">.</span><span class="nx">url</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>保存文件并执行</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span> <span class="nx">node</span> <span class="nx">app</span><span class="p">.</span><span class="nx">js</span>
</span><span class='line'><span class="nx">restify</span> <span class="nx">listening</span> <span class="nx">at</span> <span class="nx">http</span><span class="o">:</span><span class="c1">//0.0.0.0:8080</span>
</span></code></pre></td></tr></table></div></figure>


<p>通过curl命令测试，服务器返回HTTP状态码<code>200</code>和一个<code>application/json</code>类型的内容(事实上这里不是)</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span> <span class="nx">curl</span> <span class="o">-</span><span class="nx">is</span> <span class="nx">http</span><span class="o">:</span><span class="c1">//localhost:8080/hello/roy</span>
</span><span class='line'><span class="nx">HTTP</span><span class="o">/</span><span class="mf">1.1</span> <span class="mi">200</span> <span class="nx">OK</span>
</span><span class='line'><span class="nx">Access</span><span class="o">-</span><span class="nx">Control</span><span class="o">-</span><span class="nx">Allow</span><span class="o">-</span><span class="nx">Origin</span><span class="o">:</span> <span class="o">*</span>
</span><span class='line'><span class="nx">Access</span><span class="o">-</span><span class="nx">Control</span><span class="o">-</span><span class="nx">Allow</span><span class="o">-</span><span class="nx">Headers</span><span class="o">:</span> <span class="nx">Accept</span><span class="p">,</span> <span class="nx">Accept</span><span class="o">-</span><span class="nx">Version</span><span class="p">,</span> <span class="nx">Content</span><span class="o">-</span><span class="nx">Length</span><span class="p">,</span> <span class="nx">Content</span><span class="o">-</span><span class="nx">MD5</span><span class="p">,</span> <span class="nx">Content</span><span class="o">-</span><span class="nx">Type</span><span class="p">,</span> <span class="nb">Date</span><span class="p">,</span> <span class="nx">X</span><span class="o">-</span><span class="nx">Api</span><span class="o">-</span><span class="nx">Version</span>
</span><span class='line'><span class="nx">Access</span><span class="o">-</span><span class="nx">Control</span><span class="o">-</span><span class="nx">Expose</span><span class="o">-</span><span class="nx">Headers</span><span class="o">:</span> <span class="nx">X</span><span class="o">-</span><span class="nx">Api</span><span class="o">-</span><span class="nx">Version</span><span class="p">,</span> <span class="nx">X</span><span class="o">-</span><span class="nx">Request</span><span class="o">-</span><span class="nx">Id</span><span class="p">,</span> <span class="nx">X</span><span class="o">-</span><span class="nx">Response</span><span class="o">-</span><span class="nx">Time</span>
</span><span class='line'><span class="nx">Server</span><span class="o">:</span> <span class="nx">restify</span>
</span><span class='line'><span class="nx">X</span><span class="o">-</span><span class="nx">Request</span><span class="o">-</span><span class="nx">Id</span><span class="o">:</span> <span class="nx">ec3e9e55</span><span class="o">-</span><span class="mi">7083</span><span class="o">-</span><span class="mi">4</span><span class="nx">e12</span><span class="o">-</span><span class="mi">93</span><span class="nx">ee</span><span class="o">-</span><span class="mi">9</span><span class="nx">c24a0c5c398</span>
</span><span class='line'><span class="nx">Access</span><span class="o">-</span><span class="nx">Control</span><span class="o">-</span><span class="nx">Allow</span><span class="o">-</span><span class="nx">Methods</span><span class="o">:</span> <span class="nx">GET</span>
</span><span class='line'><span class="nx">Connection</span><span class="o">:</span> <span class="nx">close</span>
</span><span class='line'><span class="nx">Content</span><span class="o">-</span><span class="nx">Length</span><span class="o">:</span> <span class="mi">5</span>
</span><span class='line'><span class="nx">Content</span><span class="o">-</span><span class="nx">MD5</span><span class="o">:</span> <span class="mi">65</span><span class="nx">tW24XBT3r1jLUpw0o0Fw</span><span class="o">==</span>
</span><span class='line'><span class="nx">Content</span><span class="o">-</span><span class="nx">Type</span><span class="o">:</span> <span class="nx">application</span><span class="o">/</span><span class="nx">json</span>
</span><span class='line'><span class="nb">Date</span><span class="o">:</span> <span class="nx">Sun</span><span class="p">,</span> <span class="mi">19</span> <span class="nx">Feb</span> <span class="mi">2012</span> <span class="mi">16</span><span class="o">:</span><span class="mi">14</span><span class="o">:</span><span class="mi">13</span> <span class="nx">GMT</span>
</span><span class='line'><span class="nx">X</span><span class="o">-</span><span class="nx">Response</span><span class="o">-</span><span class="nx">Time</span><span class="o">:</span> <span class="mi">3</span>
</span><span class='line'>
</span><span class='line'><span class="s2">&quot;hello roy&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<h3>特性</h3>

<p>接触到<code>restify</code>是因为内部系统需要一个手机归属地的查询接口，基于<code>nodejs</code>和<code>redis</code>的高性能实现，决定快速实现一个，当时也很自然地选择了<code>express</code>作为web层。但<code>express</code>始终是一个Web MVC框架，它包含了一些我不太需要的功能实现（i.e., templating/rendering）。而我只是需要一个更纯粹的API接口而已&#8211;接收请求然后返回一个<code>JSON</code>结果集。</p>

<p>后来从推上找到了<code>restify</code>时，我就觉得这才是我想要的：</p>

<ol>
<li><p>路由</p>

<ul>
<li>基本等同于<code>express</code>/<code>sinatra</code>的路由方式</li>
<li>路由正则表达式支持</li>
<li>版本化支持</li>
</ul>
</li>
<li><p>自动选择内容格式进行响应，并可以自定义格式</p></li>
<li><p>内置REST风格的错误处理机制，重载了400和409来解析应答，得到一个包含<code>code</code>和<code>message</code>的JSON对象。也可以子类化<code>restify.RestError</code>实现自己错误代码和信息。</p>

<p> 已实现的RestError:</p>

<ul>
<li>RestError</li>
<li>BadDigestError</li>
<li>BadMethodError</li>
<li>InternalErrorError</li>
<li>InvalidArgumentError</li>
<li>InvalidContentError</li>
<li>InvalidCredentialsError</li>
<li>InvalidHeaderError</li>
<li>InvalidVersionError</li>
<li>MissingParameterError</li>
<li>NotAuthorizedError</li>
<li>RequestExpiredError</li>
<li>RequestThrottledError</li>
<li>ResourceNotFoundError</li>
<li>WrongAcceptError</li>
</ul>
</li>
<li><p>插件机制</p></li>
<li><p>DTrace支持，这个绝对是调式、诊断和性能测量利器</p></li>
</ol>


<p>虽然现在<code>restify</code>还是初生婴儿，我还是把上面提到的手机归属地查询接口改用了<code>restify</code>来实现了一个<a href="https://github.com/roymax/moquery">moquery</a>。</p>

<p>正如官方描述一样</p>

<pre><code>restify is a smallish framework, similar to `express` for building REST APIs. 
</code></pre>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Installing GitLab on Ubuntu Server 11.10]]></title>
    <link href="http://roynotes.com/blog/2012/01/installing-gitlab-on-ubuntu-server-11-dot-10/"/>
    <updated>2012-01-20T14:20:00+08:00</updated>
    <id>http://roynotes.com/blog/2012/01/installing-gitlab-on-ubuntu-server-11-dot-10</id>
    <content type="html"><![CDATA[<p>打算在团队内推广Git，替换掉当前使用的SVN。所以打算挑选一个类GitHub的管理界面，最终在GitLab和Gitblit中选择了前者。本文为<a href="http://gitlabhq.com/">GitLab</a>在虚拟机下的安装过程。</p>

<h3>安装Ubuntu 11.10</h3>

<p>安装好Ubuntu Server后，我设置源指向163</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup
</span><span class='line'>$ sudo echo "" > /etc/apt/sources.list</span></code></pre></td></tr></table></div></figure>


<p>编辑source.list加入</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>deb http://mirrors.163.com/ubuntu/ oneiric main universe restricted multiverse 
</span><span class='line'>deb-src http://mirrors.163.com/ubuntu/ oneiric main universe restricted multiverse 
</span><span class='line'>deb http://mirrors.163.com/ubuntu/ oneiric-security universe main multiverse restricted 
</span><span class='line'>deb-src http://mirrors.163.com/ubuntu/ oneiric-security universe main multiverse restricted 
</span><span class='line'>deb http://mirrors.163.com/ubuntu/ oneiric-updates universe main multiverse restricted 
</span><span class='line'>deb http://mirrors.163.com/ubuntu/ oneiric-proposed universe main multiverse restricted 
</span><span class='line'>deb-src http://mirrors.163.com/ubuntu/ oneiric-proposed universe main multiverse restricted 
</span><span class='line'>deb http://mirrors.163.com/ubuntu/ oneiric-backports universe main multiverse restricted 
</span><span class='line'>deb-src http://mirrors.163.com/ubuntu/ oneiric-backports universe main multiverse restricted 
</span><span class='line'>deb-src http://mirrors.163.com/ubuntu/ oneiric-updates universe main multiverse restricted</span></code></pre></td></tr></table></div></figure>


<p>更新服务器并安装一些必要软件</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ sudo apt-get update
</span><span class='line'>$ sudo apt-get dist-upgrade -y
</span><span class='line'>$ sudo apt-get install git-core openssh-server sendmail curl gcc libxml2-dev libxslt-dev sqlite3 libsqlite3-dev libcurl4-openssl-dev libreadline-dev libc6-dev libssl-dev libmysql++-dev make build-essential zlib1g-dev python-setuptools  </span></code></pre></td></tr></table></div></figure>


<p>如果使用VMWare的虚拟机，最好安装一下VMWare-tools</p>

<h3>安装rvm &amp; ruby</h3>

<p>gitlab需要使用ruby 1.9.2-p290，习惯了使用rvm来管理ruby版本，所以把rvm也安装一下</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ sudo bash -s stable &lt; &lt;(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )
</span><span class='line'>$ source /etc/profile.d/rvm.sh
</span><span class='line'>$ type rvm | head -1
</span><span class='line'>rvm is a function
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>#Rubies installed in system, gemsets separated per user:
</span><span class='line'>$ rvm user gemsets
</span><span class='line'>$ rvmsudo rvm install 1.9.2
</span><span class='line'>$ sudo -H -i   #切换到root
</span><span class='line'>$ rvm --default use 1.9.2
</span><span class='line'>$ exit #退出root
</span><span class='line'>$ rvm reload
</span><span class='line'>$ ruby -v
</span><span class='line'>ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux]
</span><span class='line'>
</span></code></pre></td></tr></table></div></figure>


<p>基于速度的原因，把rubygem的源调整成<a href="http://ruby.taobao.org">taobao</a>的</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ gem sources -a http://ruby.taobao.org/
</span><span class='line'>$ gem sources --remove http://rubygems.org/
</span><span class='line'>$ gem sources -l 
</span><span class='line'>*** CURRENT SOURCES ***
</span><span class='line'>
</span><span class='line'>http://ruby.taobao.org/
</span><span class='line'>$ </span></code></pre></td></tr></table></div></figure>


<p>淘宝镜像上第1，2行跟我这里反过来的，按官网写法我无法删除rubygems的源，另外我的source文件<code>rubygems.org</code>域名后面是有<code>/</code>的，所以也要加入才能删除。</p>

<p>或直接通过手工编辑<code>vi ~/.gemrc</code>删除。</p>

<p>由于使用了rvm多用户模式所以部分命令需要加上<code>rvmsudo</code> 进行。</p>

<h3>安装rails</h3>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ rvmsudo gem update --system 1.8.14 #安装1.8.15会出错
</span><span class='line'>$ rvmsudo gem install rails</span></code></pre></td></tr></table></div></figure>


<p>或安装GitLab指定版本</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ rvmsudo gem install rails -v 3.1.1 --no-ri --no-rdoc</span></code></pre></td></tr></table></div></figure>


<h3>安装和设置Gitolite</h3>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ sudo adduser \
</span><span class='line'>  --system \
</span><span class='line'>  --shell /bin/sh \
</span><span class='line'>  --gecos 'git version control' \
</span><span class='line'>  --group \
</span><span class='line'>  --disabled-password \
</span><span class='line'>  --home /home/git \
</span><span class='line'>  git
</span><span class='line'>
</span><span class='line'># Add your user to git group
</span><span class='line'>$ sudo usermod -a -G git `eval whoami` 
</span><span class='line'>
</span><span class='line'># Create ssh key
</span><span class='line'>$ ssh-keygen -t rsa
</span><span class='line'>
</span><span class='line'># copy your pub key to git home
</span><span class='line'>sudo cp ~/.ssh/id_rsa.pub /home/git/rails.pub
</span><span class='line'>
</span><span class='line'># clone gitolite
</span><span class='line'>sudo -u git -H git clone git://github.com/gitlabhq/gitolite /home/git/gitolite
</span><span class='line'>
</span><span class='line'># install gitolite
</span><span class='line'>sudo -u git -H /home/git/gitolite/src/gl-system-install
</span><span class='line'>
</span><span class='line'># Setup (Dont forget to set umask as 0007!! 搜索0077修改为0007)
</span><span class='line'>sudo -u git -H sh -c "PATH=/home/git/bin:$PATH; gl-setup ~/rails.pub"
</span><span class='line'>
</span><span class='line'>sudo chmod -R g+rwX /home/git/repositories/
</span><span class='line'>sudo chown -R git:git /home/git/repositories/
</span></code></pre></td></tr></table></div></figure>


<p>检查gitolite安装是否成功，先重新登录确保已经加入git用户组</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># clone admin repo to add localhost to known_hosts
</span><span class='line'># & be sure your user has access to gitolite
</span><span class='line'>git clone git@localhost:gitolite-admin.git /tmp/gitolite-admin 
</span><span class='line'>
</span><span class='line'># if succeed  you can remote it
</span><span class='line'>rm -rf /tmp/gitolite-admin 
</span></code></pre></td></tr></table></div></figure>


<p>如果有下面类似提示</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>perl: warning: Setting locale failed.
</span><span class='line'>perl: warning: Please check that your locale settings:
</span><span class='line'>  LANGUAGE = "en_US:",
</span><span class='line'>  LC_ALL = (unset),
</span><span class='line'>  LC_CTYPE = "zh_CN.UTF-8",
</span><span class='line'>  LANG = "en_US.UTF-8"
</span><span class='line'>    are supported and installed on your system.
</span></code></pre></td></tr></table></div></figure>


<p>编辑<code>sudo vi /etc/environment</code>添加以下内容到最后</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>LC_ALL="en_US.UTF-8"
</span><span class='line'>LANG="en_US.UTF-8"
</span><span class='line'>LANGUAGE="zh:en_US:en"</span></code></pre></td></tr></table></div></figure>


<p>保存后执行<code>source  /etc/environment</code>使其生效。</p>

<h3>安装和设置GitLab</h3>

<p>这里安装的是GitLab的Stable 2.1版本</p>

<h5>安装GitLab必须包</h5>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ sudo apt-get install python-dev python-pip sendmail redis-server libicu-dev
</span><span class='line'>$ sudo pip install pygments
</span><span class='line'>$ sudo gem install bundler</span></code></pre></td></tr></table></div></figure>


<h3>安装gitlab</h3>

<p>按个人习惯将gitlab装在<code>/usr/local</code>目录下</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ sudo git clone -b stable git://github.com/gitlabhq/gitlabhq.git
</span><span class='line'>$ sudo chown -R `eval whoami`:`eval whoami` /usr/local/gitlabhq
</span><span class='line'>$ cd /usr/local/gitlabhq
</span><span class='line'>$ rvmsudo gem install charlock_holmes -v '0.6.8'</span></code></pre></td></tr></table></div></figure>


<p>修改GemFile的<code>http://rubygems.org</code>为<code>http://ruby.taobao.org/</code>，然后</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ bundle install --without development test 
</span><span class='line'>$ bundle exec rake db:setup RAILS_ENV=production
</span><span class='line'>$ bundle exec rake db:seed_fu RAILS_ENV=production</span></code></pre></td></tr></table></div></figure>


<h3>Start Server</h3>

<p><code>bundle exec rails s -e production</code></p>

<h3>测试安装</h3>

<p>打开 <code>http://&lt;ip&gt;:3000</code>，使用以下帐号和密码登录</p>

<p>User - <code>admin@local.host</code>
Password  - <code>5iveL!fe</code></p>

<p>进入<code>http://&lt;ip&gt;:3000/admin/users</code>新增一个用户，完成后退出管理帐号。</p>

<p>使用刚新增的用户登录，并进入<code>http://&lt;ip&gt;:3000/keys</code>添加一个ssh key，如果没有则生成一个（可以参考<a href="http://help.github.com/mac-set-up-git/">github设置你的Git</a>）。</p>

<p>返回首页，新建一个<code>project</code>成功后按系统提示操作</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ mkdir mylab
</span><span class='line'>$ cd mylab
</span><span class='line'>$ git init
</span><span class='line'>$ touch README
</span><span class='line'>$ git add README
</span><span class='line'>$ git commit -m 'first commit'
</span><span class='line'>$ git remote add origin git@localhost:mylab.git   #将loaclhost换成你的ip
</span><span class='line'>$ git push -u origin master</span></code></pre></td></tr></table></div></figure>


<p>如果push成功，你应该可以通过浏览<code>http://&lt;ip&gt;:3000/mylab/repository</code>看到刚刚的第一次提交。</p>

<h3>后续安装</h3>

<p>通过安装<code>Passenger+Nginx</code>可以使用系统管理更加方便，可以<a href="https://github.com/gitlabhq/gitlabhq/wiki/V2.0-easy-setup-for-ubuntu">参考官方文档</a>介绍。</p>

<p>Enjoy!</p>

<hr />

<h3>参考资料</h3>

<ol>
<li><a href="http://firehare.blog.51cto.com/809276/743509">如何在Ubuntu Server 11.10上安装GitLab</a></li>
<li><a href="http://www.ossxp.com/doc/git/gitolite.html">Gitolite 构建 Git 服务器</a></li>
<li><a href="https://github.com/gitlabhq/gitlabhq/wiki/Gitolite">Create git user &amp; install gitolite</a></li>
<li><a href="http://www.ryanwersal.com/blog/2011/10/18/installing-gitlab-on-ubuntu-server/">Installing GitLab on Ubuntu Server</a></li>
<li><a href="https://github.com/gitlabhq/gitlabhq/wiki/Ubuntu.stable">GitLab stable版Ubuntu安装</a></li>
</ol>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[安装autoddvpn]]></title>
    <link href="http://roynotes.com/blog/2012/01/an-zhuang-autoddvpn/"/>
    <updated>2012-01-19T16:27:00+08:00</updated>
    <id>http://roynotes.com/blog/2012/01/an-zhuang-autoddvpn</id>
    <content type="html"><![CDATA[<p>在家已经成功部署autoddvpn近两个月，所以在家里上网的感觉特好（偶尔拉风一下），特记录下来为大家做一次明灯。</p>

<h3>动机</h3>

<p>在用dd-wrt方案前，我用的是ssh tunnel再加上本地autopac，基本已经是一个无敌的解决方案了，也特靠谱的。但家里设备一多，你得想尽办法为每台设备折腾一下，找解决方案。折腾的这些东西都是很折腾人的。与其这样，何不在路由上做功夫，一劳永逸呢。</p>

<h3>需要环境</h3>

<ul>
<li>有一台可刷DD-WRT的设备 ( <a href="http://dd-wrt.com/site/support/router-database">你的路由支持吗？</a> )</li>
<li>一个PPTP或OpenVPN 帐号</li>
<li>ADSL上网环境</li>
</ul>


<h3>准备</h3>

<h5>关于DD-WRT路由器</h5>

<p>家里正好有两台设备，一台是D-Link DIR-605 D1 ,通过查询是wip状态:</p>

<p>work in progress, router support is in the works, but please don&#8217;t ask how long it takes, we cannot give you a schedule in the most cases.</p>

<p>另一台为Netgear WGR614 v9，非常悲剧也是wip。正要放弃准备购买新设备时得知，DIR-605可以刷DIR-615 D2，经过两个晚上的几个小时尝试最终也刷成功，但最后我还是买了一台路由器，因为DIR-605无论如何也支持不了OpenVPN。</p>

<p>如果设备支持OpenVPN，在下载页会列出标有vpn字样的下载链接</p>

<p>我为什么需要OpenVPN？因为我拥有一个Astrill的VPN帐号<a href="http://xcarshop.com" title="Astrill推广链接">推广链接</a>，就因为这个家伙介绍支持DD-WRT我才知晓可以这样玩. Astrill VPN本身是不支持多设备同时登录，通过DD-WRT则可允许7台设备同时使用。</p>

<p>当时我还不知道有autoddvpn这个东西，只能按Astrill的安装介绍来寻找一台支持OpenVPN版本的DD-WRT路由器了。而<a href="https://www.astrill.com/knowledge-base/52/What-Router-for-OpenVPN.html">Astrill推荐</a>了<strong>Asus RT-N16</strong>和<strong>Linksys WRT 160N</strong>，刚好有朋友从香港回来就托运了一台，这样又多花费550人左右。所以我最后用的设备是RT-N16。</p>

<p>事实上，你不需要OpenVPN，用PPTP也是可以的，只要按照autoddvpn的文档写好你的脚本。通过Astrill的安装界面只是图个方便而已。这里我用“可能”来描述是因为我没有进行测试。只不过到后来我也放弃了Astrill的内置安装模式。</p>

<h5>关于PPTP或OpenVPN帐号</h5>

<p>刚才我说了，我的解决方案是<a href="http://xcarshop.com" title="Astrill推广链接">Astrill</a>，大概一年70刀，最近又涨价了。而且现在竟然将DD-WRT单独出来做增值收费, 需要另付 $1/月。</p>

<p>如果你有root权限的主机，自建一个OpenVPN Server也是不错的选择。反正我就没有时间折腾，留给后来人做。</p>

<p>而淘宝上也有很多廉价VPN，总会有你合适的吧。想不花点钱还是不太靠谱吧？</p>

<p>顺便说说Astrill的优势在于服务器节点多，虽然很多速度也不怎么样，但香港节点和美国部分节点都非常的快，而且都不限流量。试过有一次通过New York节点下载XCode 4 ，是<strong>1MB/秒</strong>的速度。</p>

<h5>ADSL</h5>

<p>中国电信的8M ADSL</p>

<h3>安装调试</h3>

<h5>刷新固件</h5>

<p>硬件准备好后就可以开始刷设备了，从dd-wrt.com下载合适的rom文件到本地。针对我的RT-N16，我一共下载了三个文件</p>

<ul>
<li>dd-wrt.v24-14896_NEWD-2_K2.6_mini_RT-N16.trx</li>
<li>dd-wrt.v24-14896_NEWD-2_K2.6_mini.bin</li>
<li>dd-wrt.v24-14896_NEWD-2_K2.6_openvpn.bin</li>
</ul>


<p>用网线接上路由器，访问路由器设置网，找到通过本地上传方式<strong>更新固件</strong>的位置，必须先刷第一个文件，即扩展名为.trx的那个。刷新成功后，再刷其它，都非常简单就不表了。可以看看<a href="http://www.dd-wrt.com/wiki/index.php/Asus_RT-N16">这里</a></p>

<h5>设置路由</h5>

<p>如果使用的是Astrill服务，非常简单。连上网络后通过Astrill的客户端调出安装界面按提示执行就可以了。安装成功后在DD-WRT的路由设置页面进行设置，而且有专门针对GFW的设置，其实原理跟autoddvpn差不多，通过判断IP是否在墙内选择链路。</p>

<p>不过最后，我还是选择了使用autoddvpn介绍的最好模式graceMode。通过Astrill的傻瓜方式虽然可行，但：</p>

<ul>
<li>连接服务不知为何非常的慢。</li>
<li>访问国内网站cdn cache会失效</li>
<li>依赖VPN的稳定性，试过几次VPN掉了连国内网站都访问不到</li>
</ul>


<p>而autoddvpn是反向处理，使用的是本地DNS，对于部分指定的域名才走VPN链路。所以就算VPN不稳定的情况下，至少能保障国内的网站可以访问。</p>

<p>至于如何设置autoddvpn这里不说了，我认为官方的文档已经足够详细。如果你也像我一样使用Astrill VPN服务的话，通过ssh登录路由器，准备你的OpenVPN设置。</p>

<p>openvpn.conf文件需要用到的证书可以通过登录as trill的会员中心<em>VPN SERVICES -  OpenVPN certificates</em> 下载。<em>Server List</em>则可以获取当前的服务器状态和IP，选择几个最快的节点吧，我使用的是HK1和NY1。</p>

<h3>使用感受</h3>

<p>两个月来，在家上网的体验是最好的，唯一不足是最近路由器竟然连接不上，会自动死掉也不会重启，重启后很快又正常。也不知道是否因为刷了DD-WRT而不稳定，我听朋友说他家的官ROM还是非常稳定的，有空时我想重刷一次看看效果。</p>

<p>这样作在家里用倒不错，但出门后就有点麻烦了。手机还好，需要那个情况不好，而且twitter也可以用API Proxy解决。所以我的Mac还是装用iSSH和PAC以备不时之需。其实我想过段日子每天出街自备一个TP—LINK TL-WR800N，连上网络后再接家里的VPN Server端口再访问出去……但多绕啊！再看看吧，不一定弄了。</p>

<p>最后感觉变成Astrill的推广文了，不写了…其实我觉得如果有Linode的东京节点，自建个OpenVPN Server应该也是不错的选择。</p>

<p>如有问题欢迎跟我交流联系.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[sinaly将退伇]]></title>
    <link href="http://roynotes.com/blog/sinaly-will-be-discontinued"/>
    <updated>2011-11-11T00:00:00+08:00</updated>
    <id>http://roynotes.com/blog/sinaly-will-be-discontinued</id>
    <content type="html"><![CDATA[<p>一大早的，见到<a title="trunk.ly已经被AVOS收购，将整合到Delicious" href="http://blog.trunk.ly/2011/11/10/avos-acquires-trunkly/" target="_blank">trunk.ly已经被AVOS收购，将整合到Delicious</a>，同时trunk.ly将于2012年1月13日停止运作。那么我的同步程序<a title="发布我的应用–SiNALY" href="http://blog.roynotes.com/sinaly-python-released/" target="_blank">Sinaly</a>也可以于同一天停止动作了，大家尽快适应Delicious吧。</p>

<p>现在我的问题是还不知道如何将旧delicious的书签导入到新版？又如何将trunkly导入？</p>

<p>后者trunkly正在努力，我相信会有好的解决方案，祝贺trunk.ly团队</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[gitbox=git+dropbox]]></title>
    <link href="http://roynotes.com/blog/gitbox"/>
    <updated>2011-10-19T00:00:00+08:00</updated>
    <id>http://roynotes.com/blog/gitbox</id>
    <content type="html"><![CDATA[<p>自从没有今天背着手提电脑上班后，感觉颈椎真的轻松了很多，为了身体，未来一段时间也不会背着电脑移动。但电脑不移动后，就要想办法将办公室与家里的电脑同步，以保持文档版本的一致性。</p>

<p>现在云服务非常流行，当然将主要文档同步到云端去，我选择了一直使用的dropbox做简单的文档同步就好了。而又有一些属于私人性质的项目代码使用Git进行版本控制，当然我暂时不想将它们公开放到github，又不想购买私有仓库。当然用https://bitbucket.org/ 也不错，它现在已经提供免费的git私有仓库了。当然用dropbox DIY一个其实也挺靠谱的，你只需要这样做:</p>

<p><blockquote>~/project $ git init<br />
~/project $ git add .<br />
~/project $ git commit -m &#8220;first commit&#8221;<br />
~/project $ cd ~/Dropbox/git</blockquote></p>

<p>~/Dropbox/git $ mkdir project.git<br />
~/Dropbox/git $ cd project.git<br />
~/Dropbox/git $ git init &#8211;bare<br />
~/Dropbox/git $ cd ~/project</p>

<p>~/project $ git remote add origin ~/Dropbox/git/project.git<br />
~/project $ git push origin master</p>

<p></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[macbook 467 + ssd]]></title>
    <link href="http://roynotes.com/blog/macbook-467-ssd"/>
    <updated>2011-10-02T00:00:00+08:00</updated>
    <id>http://roynotes.com/blog/macbook-467-ssd</id>
    <content type="html"><![CDATA[<p>自从升级到Lion，我的老467就开始显得非常的老迈，本来就有了更换SSD的想法，某天被好友@tsmib刺激下，决意更换。记录一下更换过程和心得</p>

<p>先看看更换后的测试结果:
<p style="text-align: center;"><a href="http://assets.roynotes.com/uploads/2011/10/DiskSpeedTest.png"></a><a href="http://assets.roynotes.com/uploads/2011/10/DiskSpeedTest.png"><img class="alignnone size-medium wp-image-28340" title="DiskSpeedTest" src="http://assets.roynotes.com/uploads/2011/10/DiskSpeedTest-291x300.png" alt="" width="291" height="300" /></a>
看样子还不错，对不？但其实我只用了不太被推荐的kingston 128GB，因为是朋友送的，就暂时先用着吧。</p></p>

<p><h1>准备</h1>
在SSD的选择上，因为有朋友友情赞助就没有选择@tsmib 强烈推荐的<a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16820233191&amp;Tpk=20-233-191"><strong>Corsair Force Series GT</strong></a> ，再加上467只支持SATA2，没必要买这个。</p>

<p><a href="http://assets.roynotes.com/uploads/2011/10/IMG_05981.jpg"><img class="alignnone size-large wp-image-28342" title="IMG_0598" src="http://assets.roynotes.com/uploads/2011/10/IMG_05981-1024x768.jpg" alt="" width="640" height="480" /></a></p>

<p>开盒照</p>

<p><a href="http://assets.roynotes.com/uploads/2011/10/IMG_06021.jpg"><img class="aligncenter size-large wp-image-28344" title="IMG_0602" src="http://assets.roynotes.com/uploads/2011/10/IMG_06021-1024x768.jpg" alt="" width="640" height="480" /></a></p>

<p>还涉及到光驱盒、支架这些我没有自己去找，直接按@老甘 的<a href="http://www.osxtoy.com/?p=1182">指引</a>买入，但有点小问题，容后再述。</p>

<p><a href="http://assets.roynotes.com/uploads/2011/10/IMG_0599.jpg"><img class="alignnone size-medium wp-image-28346" title="IMG_0599" src="http://assets.roynotes.com/uploads/2011/10/IMG_0599-300x225.jpg" alt="" width="300" height="225" /></a></p>

<p>硬盘支架</p>

<p><a href="http://assets.roynotes.com/uploads/2011/10/IMG_0599.jpg"></a><a href="http://assets.roynotes.com/uploads/2011/10/IMG_0600.jpg"><img class="alignnone size-medium wp-image-28347" title="IMG_0600" src="http://assets.roynotes.com/uploads/2011/10/IMG_0600-300x225.jpg" alt="" width="300" height="225" /></a></p>

<p>外置USB光驱盒</p>

<p><a href="http://assets.roynotes.com/uploads/2011/10/IMG_0600.jpg"></a><a href="http://assets.roynotes.com/uploads/2011/10/IMG_0601.jpg"><img class="alignnone size-medium wp-image-28348" title="IMG_0601" src="http://assets.roynotes.com/uploads/2011/10/IMG_0601-300x225.jpg" alt="" width="300" height="225" /></a></p>

<p>商家赠送的工具，但杯具的是与467的螺丝型号不符，这是一个小问题。
<h1>备份</h1>
推荐使用carbon copy cloner这个工具，可以有选择性地Cloner系统。我将一些相片、视频、下载包都排除在外进行复制，整个过程大约1个多小时。
<a href="http://assets.roynotes.com/uploads/2011/10/屏幕快照-2011-09-22-下午12.02.05.png"><img class="alignnone size-medium wp-image-28356" title="屏幕快照 2011-09-22 下午12.02.05" src="http://assets.roynotes.com/uploads/2011/10/屏幕快照-2011-09-22-下午12.02.05-300x255.png" alt="" width="300" height="255" /></a>
<h1>更换硬盘</h1>
<a href="http://assets.roynotes.com/uploads/2011/10/IMG_0604.jpg"><img title="IMG_0604" src="http://assets.roynotes.com/uploads/2011/10/IMG_0604-225x300.jpg" alt="" width="225" height="300" /></a></p>

<p>最后我是动用自己的工具开拆！如果拆得不踏实，可以到网上找找拆机图示教程，这里就不表述了，要点是一步一步来，别急。</p>

<p><a href="http://assets.roynotes.com/uploads/2011/10/IMG_0605.jpg"><img class="alignnone size-medium wp-image-28351" title="IMG_0605" src="http://assets.roynotes.com/uploads/2011/10/IMG_0605-225x300.jpg" alt="" width="225" height="300" /></a></p>

<p>我也选择了安装在光驱位。</p>

<p>这里说说前面说的小问题，@老甘 介绍的配件装到467上后会多出两颗螺丝，因为支架上少了这两颗螺丝的安装位，我不知道其他型号是不是也是这样。图不太清，将就着看：</p>

<p><a href="http://assets.roynotes.com/uploads/2011/10/IMG_06061.jpg"><img class="alignnone size-medium wp-image-28357" title="IMG_0606" src="http://assets.roynotes.com/uploads/2011/10/IMG_06061-225x300.jpg" alt="" width="225" height="300" /></a><a href="http://assets.roynotes.com/uploads/2011/10/IMG_06071.jpg"><img class="alignnone size-medium wp-image-28358" title="IMG_0607" src="http://assets.roynotes.com/uploads/2011/10/IMG_06071-225x300.jpg" alt="" width="225" height="300" /></a></p>

<p>多出来的两颗螺丝</p>

<p><a href="http://assets.roynotes.com/uploads/2011/10/IMG_0608.jpg"><img class="alignnone size-medium wp-image-28354" title="IMG_0608" src="http://assets.roynotes.com/uploads/2011/10/IMG_0608-300x225.jpg" alt="" width="300" height="225" /></a>
<h1>开机验收</h1>
第一次开机启动按着Opt键，选择由SSD启动。
<h3>进入系统后的第一件事，建立一些软链接将旧硬盘上的内容链进来</h3>
<a href="http://assets.roynotes.com/uploads/2011/10/屏幕快照-2011-09-22-下午6.35.20.png"><img class="alignnone size-large wp-image-28359" title="屏幕快照 2011-09-22 下午6.35.20" src="http://assets.roynotes.com/uploads/2011/10/屏幕快照-2011-09-22-下午6.35.20-1024x346.png" alt="" width="640" height="216" /></a></p>

<p>暂时先不要删除旧硬盘上的数据，以便故障恢复，但如果你有Time Machine则见机行事吧。
<h3>第二件事，进入系统偏好设置－启动磁盘设置你的SSD为永久启动磁盘</h3>
<a href="http://assets.roynotes.com/uploads/2011/10/屏幕快照-2011-10-02-下午3.13.19.png"><img class="alignnone size-full wp-image-28360" title="屏幕快照 2011-10-02 下午3.13.19" src="http://assets.roynotes.com/uploads/2011/10/屏幕快照-2011-10-02-下午3.13.19.png" alt="" width="782" height="419" /></a>
<h2>后话</h2>
SSD安装后，系统开机由3分钟以上立杆见影地缩短到30秒。网上还有一些SSD的优先方法，我暂时未进行，有兴趣可从参考资料里找找。</p>

<p>升级SSD后，经常有程序无故占用了大量的CPU，原因暂时未知，或许内存不足？计算量过大？还是Clone系统的问题呢？系统暂时不打算重装了，等过段时间换上8GB内存再看看效果又会如何。
<h2>参考资料</h2>
[1] <a href="http://anonym.to/?http://www.mcetech.com/optibay/">http://www.mcetech.com/optibay/</a>
[2] Mac OS X 下与 SSD 相关的优化：<a href="http://anonym.to/?http://blog.jjgod.org/2010/04/17/macosx-ssd-tweaks/">http://blog.jjgod.org/2010/04/17/macosx-ssd-tweaks/</a>
[3] 干掉光驱、拥抱 SSD：<a href="http://anonym.to/?http://apple4.us/2011/03/kill-cdrom-embrace-ssd.html">http://apple4.us/2011/03/kill-cdrom-embrace-ssd.html</a>
[4] 关于《干掉光驱、拥抱 SSD》一文的补充：<a href="http://anonym.to/?http://apple4.us/2011/03/kill-cdrom-embrace-ssd-followu.html">http://apple4.us/2011/03/kill-cdrom-embrace-ssd-followu.html</a>
[5] 教您给 Unibody 的 MacBook Pro 安装第二块硬盘：<a href="http://anonym.to/?http://www.cocoabob.net/?p=502">http://www.cocoabob.net/?p=502
</a>[6] Macbook Pro拆机光驱更换固态硬盘实战 <a href="http://www.osxtoy.com/?p=1182">http://www.osxtoy.com/?p=1182</a>
<h3>更新：</h3>
2011-10-20：今早@老甘 问我的SSD为什么那么快，我说我这个应该是最差的了。然后找到朋友的测速图，40G 的海盗船 F系列，还是比我的快</p>

<p><a href="http://assets.roynotes.com/uploads/2011/10/tsmib.jpg"><img class="aligncenter size-medium wp-image-28384" title="tsmib" src="http://assets.roynotes.com/uploads/2011/10/tsmib-246x300.jpg" alt="" width="246" height="300" /></a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[关于书漂计划的一些想法]]></title>
    <link href="http://roynotes.com/blog/piao"/>
    <updated>2011-09-01T00:00:00+08:00</updated>
    <id>http://roynotes.com/blog/piao</id>
    <content type="html"><![CDATA[<p>2011年6月21日我发了<a href="http://weibo.com/1666183302/eCxljJjrQPU">一条微博</a>，希望大家可以把自己认为有价值的书共享出来到某个地方传阅、交换。意想不到的是，一个多月后<a href="http://anson-ho.com/" target="_blank">anson</a>将这个想法实施出来了，是<a href="http://po88.com/?page_id=2">书漂计划</a>。当然这个计划只是跟我的想法不谋而合而已，我只是认为有这样一个资源共享计划非常的好，毕竟有一些书是适合用来传阅的而不是收藏的。而且同时希望可以将这个计划延伸出去扩展到物品。</p>

<p>虽然anson实施了，但这个计划能否顺利有序地持续进行下去，很大程度在于“用户”有没有履行与计划的协定。将书放入计划是意味着该书已经属于计划，而非属于任何人，绝不允许有人将物品私有化。而书的持有者有义务在收到收书人的请求时，与之沟通并协助将书本发送到收书人手上，但产生的费用应该由收书人支出。</p>

<p>为了让书能更自由的漂流，网站可以提供一些交互元素。让大家用社交帐号登录，可以将自己的书加入计划。可以跟踪每本书的漂流轨迹。或许可以通过API将大家在豆瓣的书评、评分同步展示。</p>

<p>同时可以细分一下规则，为书设置有时间限制的状态，如：idle-&gt;reading-&gt;pending-&gt;extend
<ol>
	<li>idle时，收书人通过系统发出邮件向持有人请求该书，并在email中提供联系方式</li>
	<li>持有人与收书人沟通，并发出书本，并更新系统状态为sending（5天后自动更新为reading）</li>
	<li>收书人从拿到一本书开始有30天的reading时间，主动更新系统状态为reading</li>
	<li>30天reading状态后将自动进入7天的pending状态。系统发邮件通知持有人是否要extend，否则将自动进入idle等待下一个收书人</li>
	<li>最多只能extend一次，将书延长30天的阅读时间，过后将自动进入idle</li>
	<li>每个收书人同时只允许有两本书在reading或extend</li>
</ol>
如果再为系统添加一个手机客户端，这个计划将更有趣。让每个人的书柜成为公共书柜这个主意不错，正在根据这些想法用rails做程序骨架，进度缓慢中&#8230;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[创业为了什么？]]></title>
    <link href="http://roynotes.com/blog/start-for-what"/>
    <updated>2011-08-13T00:00:00+08:00</updated>
    <id>http://roynotes.com/blog/start-for-what</id>
    <content type="html"><![CDATA[<p><!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->
<div>创业，绝大部分人是为了赚钱吧，赚钱为了什么？为了可以过上好的生活。因此多数人都有创业的冲动， 为了“住洋楼养番狗”过上富豪生活，尤其是在互联网的世界中，网络创业门槛非常低，拉一根网线、买一台电脑、孤身一人就可以对别人说：我创业了。</div>
<div><span style="font-family: Times;"> 如果创业只是为了赚取更多的金钱，这可不是一件什么好玩的事情，这会让人每天都很纠结与折磨。如果能正确认识到什么是财富，为了财富去创业或许会轻松很多，金钱只是财富的一种价值体现。</span></div>
<div><span style="font-family: Times;">在创业的过程中赚取到的第一桶“金”绝不应该是金钱，它应该是另外的一种财富。</span></div>
<div><span style="font-family: Times;">
</span></div>
<ul>
	<li>你创造一个社区，让无聊的人们有店可去</li>
	<li>你让自己棱角更分明了，重新塑造了自己</li>
	<li>你创造就业机会，让更多人有一种工作</li>
	<li>你获取了人生经验</li>
	<li>你认识了现在的妻子</li>
	<li>你学会了如何办证（你懂的）</li>
	<li>&#8230;&#8230;</li>
	<li>最后你才赚取到金钱，让自己过上好的生活</li>
</ul>
<div>为什么说金钱可能是最后才得到的，因为在达成梦想前得不知创造多少其他“副产品”，最大的原因是：失败的几率比成功高得多。我们又不是资本家与投资者，他们的眼中只有金钱，那是他们心中对于“财富”的定义。金钱是终极目标，需要拼尽全力去达成，但也要享受、认可在创业过程中我们为自己创造的“财富”</div>
<div></div>
<div><span style="font-family: 'DejaVu Sans', Tahoma, sans-serif; font-size: x-small;">整理自<a href="http://noise.startuplus.com/topics/4e2d0ae221068e50ff000005">STARTUP+Noise</a> 中的一个帖子</span></div>
&nbsp;</p>

<p>&nbsp;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[my-first-game]]></title>
    <link href="http://roynotes.com/blog/my-first-game"/>
    <updated>2011-07-09T00:00:00+08:00</updated>
    <id>http://roynotes.com/blog/my-first-game</id>
    <content type="html"><![CDATA[<p>周末无聊，边学边抄边看着敲代码，从零开始体会如下：
<ul>
	<li>学写游戏学得很爽</li>
	<li>用cocos2d这个框架挺爽的</li>
	<li>写游戏需要三角函数、几何学什么的，忘记了要学回来</li>
	<li>写游戏跟写互联网交互应用的感觉不太一样</li>
	<li>用git flow来管理代码非常舒服</li>
</ul>
<a href="http://assets.roynotes.com/uploads/2011/07/屏幕快照-2011-07-09-下午09.28.40.png"></a><a href="http://assets.roynotes.com/uploads/2011/07/屏幕快照-2011-07-09-下午09.28.40.png"></a><a href="http://assets.roynotes.com/uploads/2011/07/屏幕快照-2011-07-09-下午09.28.40.png"><img class="aligncenter size-medium wp-image-28311" title="firstGame" src="http://assets.roynotes.com/uploads/2011/07/屏幕快照-2011-07-09-下午09.28.40-300x159.png" alt="" width="300" height="159" /></a>这个游戏真的很简单，就一个不动的炮台打前进的妖怪。但用来入门真的非常不错，而且翻译质量真的很好（这的确是一个好BLOG，译文藏品非常不错）
<ul>
	<li><a title="如何使用cocos2d来做一个简单的iphone游戏教程（第一部分）" href="http://www.cnblogs.com/andyque/archive/2011/03/22/1990716.html">如何使用cocos2d来做一个简单的iphone游戏教程（第一部分）</a></li>
	<li><a title="如何使用cocos2d开发一个简单的iphone游戏：旋转炮塔。（第二部分）" href="http://www.cnblogs.com/andyque/articles/1997820.html" target="_blank">如何使用cocos2d开发一个简单的iphone游戏：旋转炮塔。（第二部分）</a></li>
	<li><span style="font-size: 13px; font-weight: normal;"><a title="如何使用cocos2d来制作简单的iphone游戏：更猛的怪物和更多的关卡。（第三部分。完！） " href="http://www.cnblogs.com/andyque/articles/1997966.html">如何使用cocos2d来制作简单的iphone游戏：更猛的怪物和更多的关卡。（第三部分。完！）</a></span></li>
</ul>
不过，建议看这些教程学写一个简单游戏前，最好先看看cocos2d的官方<a href="http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:index" target="_blank">Beginners&#8217; Guide和基本概念</a>，这有助于更好地理解如何写一个游戏。</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[business or geek?]]></title>
    <link href="http://roynotes.com/blog/business-or-geek"/>
    <updated>2011-06-28T00:00:00+08:00</updated>
    <id>http://roynotes.com/blog/business-or-geek</id>
    <content type="html"><![CDATA[<p>这个话题来自于<a href="http://markmail.org/thread/qmps3hbk3pkup3xd" target="_blank">华蟒用户组邮件列表2010年1月的一个贴子</a>，因为我本身不是该组的订阅者，最近无意中搜索到，觉得有点意思就分享一些想法。</p>

<p>通常想创业的同学应该也遇到过这样的一些情况，你有一个想法需要想集思广益地跟大家分享讨论，以便*期待*得到更多的人认同，从而再去推进行动。这里的讨论也由一位叫sliuqin的同学展开，他希望跟老婆想要做一个卖茶的电子商务网站：
<blockquote>*关于我们*： 目前，我们分别在两家大型的电子商务公司做*前端开发*，工作2年了。朝九晚六的工作虽然挺安逸，但不是自己想要的，对！我们想创业了。</blockquote></p>

<p>*创业项目*： 独立电子商务网站，主营：茶叶和茶叶相关商品。</p>

<p>*项目优势*： 老爸是开茶叶店的。</p>

<p>*项目开发：* 周期：10个月 人员：</p>

<p>- 我，负责网站后台开发（Ubuntu server + python + django）    - 我老婆，负责前端开发，用户体验和视觉设计。</p>

<p>项目资金：10w，包含我们一年的生活费，和后期的服务器等，吃住在家里（做寄生虫）</p>

<p>现在我们开始了一部分工作，但是是公司工作之余，我们两个人的人生经历还少，我本身也没有做过专业的python开发，所以想听听大家的意见：这个计划*可行吗* ？
但这里讨论的不是这个项目是否可行，我想说的如同以下两位
<ul>
	<li>@john :  “你是想卖茶叶啊，还是想卖网站？”</li>
	<li>@诚子 : “business or geek?&#8221;</li>
</ul>
这真的值得作为开发人员要创业时仔细想一想，我也总会走进这样的一个误区，到底是在为了一项生意还是因技术追求而做呢？而且这种情况往往更多的发生在技术人员向产品转型的人群，他们会以技术的角度去衡量一个项目，到底是用.net还是Java，是用HTML5还是HTML4，是使用Django还是Webpy等等&#8230;&#8230;而忽略了去判断商业的本身，商业计划可行吗？盈利模式可靠吗？目标受众呢？如何推进呢？&#8230;&#8230;.</p>

<p>Business是事业，geek是爱好。当然，我从不认为纯技术流不能创造一家<del>伟大</del>赚钱的互联网公司，这样的公司在互联网行业中俯首皆是。而且还有部分互联网公司出现的时候就不知道该怎么盈利，也就总会有听到说：“等我们的用户数足够大了，我们就会想到盈利方式。”但如果我们认为这些创业者们没有想过怎么去“Business”的话，那我想一定是我搞错了一些东西，他们有想，他们有想得到的某个固定人群，通过技术和人群建立竞争垒壁，争夺人群本身就是一项“商业”。所以他们选择了快速开发让市场去验证终端需求，而绝对不会在技术的选择上浪费太多的时间。</p>

<p>继续拿&lt;REWORK&gt;说事，&#8221;start with business, not a startup&#8221;说的就是这个意思，从一开始就想办法赚钱，行动起来！别用10个月时间＋不熟悉的python来做一个电子商店了，架个开源网店就开卖吧，兄弟。
<ul>
	<li>问某游戏公司CEO：“你们都用什么技术？”答：“没关系，用最熟悉的PHP。”</li>
	<li>问手机游戏开发者：“如何切入移动开发，iOS or Android?”答：“Android，因为我熟悉Java 。”</li>
</ul>
但话说回来，如果目的就是为了学习一门技能或公司没有生存压力下，我个人喜爱并推崇项目尝试使用最新的技术，而不是固步自封。</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[投诉广州电信的ADSL强推广告记]]></title>
    <link href="http://roynotes.com/blog/gz-chinatelecom-push-ad"/>
    <updated>2011-06-21T00:00:00+08:00</updated>
    <id>http://roynotes.com/blog/gz-chinatelecom-push-ad</id>
    <content type="html"><![CDATA[<p>几天前的一个晚上，中国电信突然发飙，我每打开三个网页就弹出一个强制广告。是可忍也，孰不可忍也？抡起手机直拔10000号转人工，对着可怜的客服MM一轮狂喷投诉广告业务推送，并动之以情，晓之以理地表示对于该项业务的坚决反对！后来客服说帮我记录在案，会有专人联系（转介给ADSL部门了）。</p>

<p>第二天，10000号进行电话回访，并试图解释广告业务的合理性，我拒绝了并坚持强调本人不需要广告推送通知优惠及希望做出屏蔽处理的情况下，客服也没有做出过多的纠缠，做了简单的资料核对后，声称在三天内将解除业务绑定。</p>

<p>经过最近这几天的体验，已经没有一个电信强推广告弹出了，也就此证实了网上流传打电话投诉的解决方法是行之有效。在此对中国电信的响应时间、态度给予肯定并表扬。建议所有对上网浏览体验有要求的ADSL用户都处理一下你们本人的ADSL帐号。</p>

<p>至于为什么说中国电信的PUSH广告非常流氓？所谓PUSH广告是指中国电信在你有偿租用他们的服务浏览网页时，通过主动劫持修改了用户的HTTP会话，进而弹出电信的广告，以达到宣传的目的。中国电信作为一家互联网服务运营商（ISP）而存在，他的责任是为用户提供上网浏览的线路。用户通过该服务获取的价值是来自于内容提供的终端而非线路的本身，而用户已经为它支付了本该支付的费用的同时，不应该被动的接受更多的附带价值。</p>

<p>对于刊物、网站上的广告我们还是被动的接受，因为那网站有我愿意主动接受的内容，那是有价值的内容与广告的等价交换。等价交换是建立在一个大家价值观一致下的，就事实而论，现在中国电信的上网费用本人认为与我的价值观未能构成一致，而其他的几家竞争者又未能提供更好的服务。</p>

<p>怪事： 二、三线城市的ADSL包月比一线城市便宜是为什么？一线城市人口基数大，摊分后成本较低才对。</p>

<p>&nbsp;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[start marking something]]></title>
    <link href="http://roynotes.com/blog/start-marking-something"/>
    <updated>2011-06-09T00:00:00+08:00</updated>
    <id>http://roynotes.com/blog/start-marking-something</id>
    <content type="html"><![CDATA[<p>“start marking something”是《 REWORK》中的一节，想法非常低廉，执行非常昂贵。</p>

<p>过去一年碎念太多了，不停地变换着想法和领域，以至于未能系统的执行自己。是时候改变了，找准自己真正感兴趣的领域钻进去，围绕着它来扩散，然后用各种可能的方式来实现它。就算最终想法没有成功，也要成为这个领域的专家。</p>

<p>&nbsp;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[不可不读的黑客与画家]]></title>
    <link href="http://roynotes.com/blog/hackers-and-painters"/>
    <updated>2011-06-06T00:00:00+08:00</updated>
    <id>http://roynotes.com/blog/hackers-and-painters</id>
    <content type="html"><![CDATA[<p><a href="http://assets.roynotes.com/uploads/2011/06/s4669554.jpg"><img class="aligncenter size-full wp-image-28285" title="s4669554" src="http://assets.roynotes.com/uploads/2011/06/s4669554.jpg" alt="" width="306" height="432" /></a></p>

<p>作为技术人《黑客与画家》是不可不读的一本书，而且阮一峰的翻译与之前读过的Joel on software系列一样的好，非常赞。</p>

<p>第六章“如何创造财富”让我重新认识了财富的定义，建立正确的财富价值观对于人生、对于工作都会带来更多的追求。金钱不等同于财富，金钱不是创造出来的，财富才是。手工艺人通过双手做出来的东西通过在商店售卖而创造财富，旧社会更多的是掠夺而非创造。而程序员正是现代的手工艺人，创业就是创造财富的最好方法，付出越多，得到越多。”创业的付出与回报虽然总体上是成比例的，但是在个体上是不成比例的。”，“要么赢得一切，要么彻底失败”</p>

<p>第9章”设计者的品味“让我可以更好的理解和思考如何成为一个好的设计者，并做出一个优美的产品:
<ul>
	<li>好设计是简单的设计</li>
	<li>好设计是永不过时的设计</li>
	<li>好设计是解决主要问题的设计</li>
	<li>好设计是启发性的设计</li>
	<li>好设计通常是有点趣味性的设计</li>
	<li>好设计是艰苦的设计</li>
	<li>好设计是看似容易的设计</li>
	<li>好设计是对称的设计</li>
	<li>好设计是模仿大自然的设计</li>
	<li>好设计是一种再设计</li>
	<li>好设计是能够复制的设计</li>
	<li>好设计常常是奇特的设计</li>
	<li>好设计常常是大胆的设计</li>
</ul>
这是一种执着，一种属于黑客与画家的执着。手工艺人通过双手来创造财富，就同时必须能够理解什么是优美的设计。</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[PhoneGap VS. Titanium]]></title>
    <link href="http://roynotes.com/blog/phonegap-vs-titanium"/>
    <updated>2011-04-30T00:00:00+08:00</updated>
    <id>http://roynotes.com/blog/phonegap-vs-titanium</id>
    <content type="html"><![CDATA[<p>上周末珠三角沙龙如期举行，参加沙龙前特意又简单对比了一下PhoneGap和Titanium的特性，打算到现场跟黎展波交流一下，后因私事不能成行实在可惜。</p>

<p>第一次听说PhoneGap是去年某周末<a href="http://www.taskant.com" target="_blank">TaskAnt</a>的孙总介绍(<a href="http://twitter.com/sunfang" target="_blank">sunfang@twiiter</a>)推荐的，传说当时他们计划做TaskAnt的Mobile客户端，至于最终是否选择了PhoneGap我倒不知道，但现在还没有客户端现在还是没有出来。广告一下：TaskAnt的确是一个非常有爱的小型团队计划任务平台，虽然我现在已经没有在用了，总有一天我会回来。</p>

<p>在比较前，首先有一观点我认为是一致的：如果希望用PhoneGap、Titanium等框架来实现一个流畅的高端游戏或者需要CPU计算能力的应用，在当前的硬件条件、开发成本上的可能性几近为零。走错路了，还是去用原生平台代码去实现吧。正如月光博客上说的一样：“<a href="http://www.williamlong.info/archives/2489.html">兼容性越强的技术，成本越低，性能越差；兼容性越差的技术，成本越高，性能越好</a>”。</p>

<p>在跨平台这个特性上，无可置疑地是PhoneGap胜出。这跟两家公司的策略和框架实现有关，PhoneGap更注重支持多个平台，而Titanium更注重提供原生的UI而只支持iOS+Android。这也体现在API上，PhoneGap没有提供UI部分的JS接口库，而Titanium则提供。</p>

<p>最大的争议，我想在于是否&#8221;native&#8221;这一点上，众所周知PhoneGap的跨平台就是因为它是运行在WebView上的HTML+JS的实现，并且提供兼容性的JS库（当然，这里有一个跟本地设备桥接的实现，Titanium亦然）。而Titanium的实现类似，但争议在于官网上无处不在关于“native”的声明实在令人有点迷惘，过去我也一直以为这个native就是如文档说的一样：“Every single JS instruction you write is converted in pure ObjectiveC.”，包括上一次在沙龙上我也是这样说的（<a title="Titanium框架开发者平台介绍" href="http://blog.roynotes.com/2011/02/28/titanium-dev-platform/" target="_blank">这里</a>）。但现在更多的人在说它不是，最终也只是一个WebView的实现，所谓的native只是指&#8221;native&#8221; UI。的确，从build出来的包里也确实没找到ObjectiveC的代码。但有一点是肯定的，PhoneGap是运行在WebView上的HTML+CSS+JS，而Titanium只是用了JavaScript来写你的Mobile应用。前者包含了DOM特性，后者没有，前者可以用jQuery等第三方库，后者不允许或者说没必要。</p>

<p>文档可读性上，Titanium的文档在过去我是觉得还是非常欠缺的，但在Github上的例子代码都可以解决了我大部分问题。而现在Titanium比我当时接触时好太多了，而且最近还开放了wiki，还有一个Q&amp;A平台，我相信会越来越完善。PhoneGap同样提供wiki文档，但由于没有深入开发之中，还不知道文档是否能真正解决问题。</p>

<p>可扩展性方面，前天我还跟<a href="http://www.cngump.com/" target="_blank">@老甘</a> 说，我知道Titanium可以通过模块的扩展来实现一些官方API没有提供的功能，比如<a href="https://github.com/Shuyinsama/Titanium.paint-Module-expansion" target="_blank">Paint</a> 。今天再特意看看PhoneGap，其实也有<a href="http://wiki.phonegap.com/w/page/36752779/PhoneGap-Plugins" target="_blank">类似的实现</a>。原理应该都是一样的，基于框架的要求使用ObjectiveC来编写针对特殊场境的模块实现，当然也要同时考虑在不同的移动平台上的实现了，也是说兼容性将由开发者来保障。</p>

<p>以前是综合参考资料中各文章汇总出来的简单比较，我并没有去比较各自API中的实现优劣势，我想这个还是留待大家去探索吧。而以上这些资料，已经足以让我们判断如何去选择一个框架：
<ul>
	<li>如果想快速开发一个iOS or/and Android原生UI的程序，选择Titanium或许更适合</li>
	<li>如果想实现一个跨平台的基于HTML的移动应用，PhoneGap或许更适合</li>
</ul>
最后还是一点，开源协议上PhoneGap是基于<a href="http://www.opensource.org/licenses/bsd-license.php" target="_blank">“New” BSD</a> or <a href="http://www.opensource.org/licenses/mit-license" target="_blank">MIT license</a> 的，这比Titanium的<a href="http://www.opensource.org/licenses/apache2.0.php" target="_blank">Apache 2.0 license</a> 更加开放。而参考资料中有提到Titanium发布到AppStore需要付费，我想这可能过去的license或是误读，因为我还没有发布过属于自己的应用，也没有找到这一条付费内容，望知道出处的朋友告知。</p>

<p>anyway，最近不碰Titanium了，直接学ObjectiveC了，哈哈&#8230;&#8230;
<h3><strong>参考资料：</strong></h3>
	<li><a href="http://stackoverflow.com/questions/1482586/comparison-between-corona-phonegap-titanium">http://stackoverflow.com/questions/1482586/comparison-between-corona-phonegap-titanium</a></li>
	<li><a href="http://stackoverflow.com/questions/1482586/comparison-between-corona-phonegap-titanium"></a><a href="http://translate.google.com.hk/translate?hl=zh-CN&amp;ie=UTF-8&amp;sl=ja&amp;tl=zh-CN&amp;u=http://d.hatena.ne.jp/r_kurain/20101121/1290347346&amp;prev=_t">http://translate.google.com.hk/translate?hl=zh-CN&amp;ie=UTF-8&amp;sl=ja&amp;tl=zh-CN&amp;u=http://d.hatena.ne.jp/r_kurain/20101121/1290347346&amp;prev=_t</a></li>
	<li><a href="http://great-way.appspot.com/2010/09/2/Mobile-Apps-cross-platform-development-challenge:-PhoneGap-vs.-Titanium-vs.-Rhod.html">http://great-way.appspot.com/2010/09/2/Mobile-Apps-cross-platform-development-challenge:-PhoneGap-vs.-Titanium-vs.-Rhod.html</a></li>
&#8211;EOF&#8211;</p>

<p>最后还是有话要说：如果只是想写iOS软件而不想学习ObjectiveC，我觉得Titanium才是你的选择。－20110501</p>

<p>如果想开发跨平台的桌面程序，你应该看看Titanium，这跟PhoneGap在Mobile上的实现原理应该是一样的，将HTML5+CSS+JS实现的应用程序包裹在一个WebView容器里实现跨平台。当然，你可能会说AIR更好。－20110503</p>

<p>&nbsp;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[说说创业必经的那些事]]></title>
    <link href="http://roynotes.com/blog/the-e-myth-revisited"/>
    <updated>2011-04-09T00:00:00+08:00</updated>
    <id>http://roynotes.com/blog/the-e-myth-revisited</id>
    <content type="html"><![CDATA[<p>[caption id=&#8221;&#8221; align=&#8221;alignnone&#8221; width=&#8221;312&#8221; caption=&#8221;创业必经的那些事&#8221;]<a href="http://book.douban.com/subject/5301299/"><img title="创业必经的那些事" src="http://img3.douban.com/lpic/s4500054.jpg" alt="创业必经的那些事" width="312" height="426" /></a>[/caption]</p>

<p>刚看完《创业必经的那些事》，我认为这是一本为带有创业梦想的技术人员都必须读一读的好书。
<blockquote>开篇从专业人士特别容易出现的创业冲动说起，带出想要创业的人必须肩负的三种身份：创业者、管理者和专业人士。而这三种身份相辅相承，但却又各自互不认账。往往专业人士被体内的瘦子打动而去创业，却又遇到困境－－无法由专业人士成功转型为管理者，最终以创业失败告终。而本书后半部分正是引导创业人士去解决这些问题，告诉专业人士该如何来构建自己的事业－－建立高效的小企业。</blockquote>
事实上，在购买该书前它在我的豆瓣购书单上很久了，我一直以为这之不过是又一本教条式的教科书，以至于我一直都不愿意真正为它付款。因为我每次通过购书单选我当月想看的书，它好几次旁落了。冲着“创业教父”的名头在我3月买过来打开它后，我被“创业者的冲动”与“三重身份”短短的10几页纸给打动了。</p>

<p>我喜欢Gerber对于三重身份的定义：
<ul>
	<li><strong>创业者</strong> 是个空想家，各种各样的梦想让他生活在未来。</li>
	<li><strong>管理者</strong> 是个实用主义者，活在当下，将一切变得有条不紊，维持目前的状况。</li>
	<li><strong>专业人士</strong> 是个实干家，但活在过去，因为总是以过去的经验来判断，并希望亲自将一切问题解决掉。</li>
</ul>
你要么是一个疯子，喜欢不停地幻想未来，并能有效地管理当下，而且能利用过去的经验完成一切自己制造出来的麻烦。要这样去完成创业的确困难，所以通常会有折衷的方法就是找三个各自具备以上三种素质的人一起去创业。</p>

<p>书的后半部分我是匆匆而看的，我打算在不久的将来再将本书看多一遍，上一次令我这样做的是：《Getting Real》和《Rework》。</p>

<p>“<span style="color: #0000ff;"><strong>当梦想逝去时，剩下的就只有单纯的工作了</strong></span>”是书中我最喜欢的一句话。作为专业人士（开发者）不要只关注技术工作，试试来点梦想，一些关于未来的梦想，不要只单纯地工作。</p>

<p>&nbsp;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[astrill iphone vpn(L2TP) setting]]></title>
    <link href="http://roynotes.com/blog/astrill-iphone-l2tp-setting"/>
    <updated>2011-03-31T00:00:00+08:00</updated>
    <id>http://roynotes.com/blog/astrill-iphone-l2tp-setting</id>
    <content type="html"><![CDATA[<p>最近发现好多网友通过搜索&#8221;astrill iphone&#8221;来到这里，其实设置好简单，因为astrill有针对iphone l2TP的VPN，并且官网有<a href="https://www.astrill.com/manuals/Astrill%20L2VPN%20Manual%20Apple%20iPhone.pdf">PDF教程</a></p>

<p><a href="http://assets.roynotes.com/uploads/2011/03/astrill-iphone-setting.png"><img class="aligncenter size-full wp-image-28240" title="astrill-iphone-setting" src="http://assets.roynotes.com/uploads/2011/03/astrill-iphone-setting.png" alt="" width="330" height="475" /></a>设置好后，确认帐号密码等没有输错还是连接不上的话，等等再试吧。这个VPN有时不太存在，经常连不上的。<br />
 
—EOF—<br />
关于Astrill 的介绍可以看这个</p>

<p><blockquote>
<a href="http://blog.roynotes.com/2011/02/07/a-professional-fast-and-secure-vpn/">http://blog.roynotes.com/2011/02/07/a-professional-fast-and-secure-vpn/</a>
</blockquote></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[初创网站最有价值的是什么?]]></title>
    <link href="http://roynotes.com/blog/what-is-the-most-valuable-startup-site"/>
    <updated>2011-03-23T00:00:00+08:00</updated>
    <id>http://roynotes.com/blog/what-is-the-most-valuable-startup-site</id>
    <content type="html"><![CDATA[<p>“二十一世纪最贵的是什么？人才！”这是《天下无贼》里的一个段子，既搞笑又深意十足。<br />
既然人才是最贵的，那么人才就是小偷团队里面最有价值的资源，这种资源决定了这个团伙作战能力的高低。</p>

<p>而又有创业导师们在微博里日以继夜地重申呐喊着人才对于在创业团队里的重要性与决定性。甚至活跃在微博上的VC们说更看重人才而项目本身。只有合适的人才能让项目成功，一个好点子并不能使项目成功。</p>

<p>哪么对于一个社区网站（没有特别说明下文说的”网站“一词都特指社区网站），最有价值的资源到底又是什么：团队的技术力量还是用户贡献的内容？还是其他什么东西？</p>

<p>个人认为，在一个初创项目中，技术是需求的催化剂，但项目的成功与技术扯上必然关系的少之又少。我宁愿相信－－内容为王，无论是web1.0，web2.0。而用户贡献的内容毕竟还是来自于用户，也就是说：有怎么样的人就有怎么样的内容。</p>

<p>所以，我的结论是：网站最有价值的是用户，而且是特指那批产生核心价值的用户。</p>

<p>按90/9/1理论来说，90％的人贡献度为0，9％是常来又偶尔贡献，剩下的1％才是产生网站核心价值的用户。也就是说一个网站最有价值的就是创建初期，第一批所来的人里给你的网站带来了什么样的氛围与内容。当然，这批用户必定是我们构思网站时所假想的目标人群，我的意思是：网站就是为了这类人而设计的。这群目标用户是否用得开心？是否输出与产品一致的价值观？能否形成造血自循环吸引来第二批人，即那9％也。至于那90％，请不要介意了，看客毕竟还是看客，他们也只是把”饼子“做大的配料而已。</p>

<p>用一系列手段来控制用户输出：
<ul>
	<li>高门槛的用户准入制度，保证了贡献内容的质量。</li>
	<li>严格的强审查制度，控制内容输出的质量保障。</li>
	<li>强烈的用户激励惩罚措施，提高用户的自我审查自觉性。</li>
</ul>
非要举些例子的话，我认为最近火热的“知乎”即是如此执行的，如果不如此去做，它必将成为另一个百度知道，或搜搜问答等一众垃圾问题网站，你不会在上面找到任何有价值的答案。</p>

<p>再举个例子，我认为大部分垂直型的社区网站都如此，如JavaEye这个技术型的论坛。创始人Robbin就曾经在一段时间内“铁腕”地控制着内容的输出、注册N天内不允许发言等措施来保障网站的健康发展。</p>

<p>至于微博，我认为它已经形成了一个文化，习以成俗地几乎每人都做内容的贡献，它已经超过了我所说的“初创”范畴。</p>

<p>返璞归真，创业也好，网站运营也罢，成功与否还是决定于开创初期的那批人。基于模式，该怎么来该怎么去吧，浮云也。</p>

<p>社区社区，形成了社区再谈模式。</p>

<p>－－EOF －－<br />
本文来自于3月20日的一次下午茶闲聊后胡思乱想</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Show出我的Dock]]></title>
    <link href="http://roynotes.com/blog/show-my-dock"/>
    <updated>2011-03-18T00:00:00+08:00</updated>
    <id>http://roynotes.com/blog/show-my-dock</id>
    <content type="html"><![CDATA[<p><p>为了响应OSXToy的《<a href="http://www.osxtoy.com/?p=553">Show出你的Dock活动</a>》，Show一下我的Dock。支持一下老甘！</p>
<p style="text-align: center;"><a href="http://assets.roynotes.com/uploads/2011/03/dock.png"><img class="aligncenter size-full wp-image-28224" title="dock" src="http://assets.roynotes.com/uploads/2011/03/dock.png" alt="" width="666" height="70" /></a></p>
<p>从左到右介绍一下：</p>
<p><strong>Finder 、Mac Store、Mail、FF、Safari、Chrome</strong>就不介绍</p>
<p><strong>Things</strong>相信很多人都知道是一个GTD工具，每天必看、更新</p>
<p><strong>ZOC6</strong>在截完图后就删了，呵呵，现在基本不用了，因为Visor的CMD+`快捷键非常的方便实用。唯一问题可能是需要密码时与1Password配合着使用</p>
<p><strong>终端、iTunes</strong> 还是那个终端与iTunes</p>
<p><strong>1Password</strong> 保存着我的帐号与密码的工具</p>
<p><strong>Adium</strong> 鸭子基本是Mac OS的标配了吧？</p>
<p><strong>SSH Tunel</strong> 有时候我需要它，不解释。但貌似不太好用，求推荐</p>
<p><strong>Twitter</strong> 官方客户端</p>
<p><strong>QQ </strong>就不介绍了</p>
<p><strong>TextMate</strong> 老实说，的确是神器，但中文支持实在是&#8230;&#8230;期待2.0的到来</p>
<p><strong>reeder </strong>替换了之前一直在使用的NetNewsWire了，因为这个阅读起来似乎更舒服点</p>
<p>其它的都通过系统的Spotlight调用，QuickSliver我有装，不过没什么感觉</p>
</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[开源两个项目: SiNALY和xurrency]]></title>
    <link href="http://roynotes.com/blog/sinaly-and-xurrenc"/>
    <updated>2011-03-01T00:00:00+08:00</updated>
    <id>http://roynotes.com/blog/sinaly-and-xurrenc</id>
    <content type="html"><![CDATA[<p>过去一周，将自己最近一段时间做的两个小项目给开源了，都是基于Apache License 2。</p>

<p>其中一个是<a href="http://sinaly.roynotes.com">SiNALY</a>， 用于SINA微博与Trunk.ly的同步程序。</p>

<p>项目地址:  <a href="https://github.com/roymax/py-sinaly">https://github.com/roymax/py-sinaly</a></p>

<p>另一个是Xurrency ， iPhone实时汇率程序，用Titanium平台开发</p>

<p>项目地址: <a href="https://github.com/roymax/xurrency">https://github.com/roymax/xurrency</a></p>

<p>有兴趣的话请移步到<a href="https://github.com/roymax/">github</a>浏览下载</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Titanium框架开发者平台介绍]]></title>
    <link href="http://roynotes.com/blog/titanium-dev-platform"/>
    <updated>2011-02-28T00:00:00+08:00</updated>
    <id>http://roynotes.com/blog/titanium-dev-platform</id>
    <content type="html"><![CDATA[<p><div id="__ss_7052566" style="width: 425px;">2011年2月27日参加<a href="http://techparty.org/" target="_blank">珠三角技术沙龙</a>所准备的演讲PPT。</div>
<div style="width: 425px;" /></p>

<p>一个免费开源的应用程序开发平台，使用你熟悉的javascript, HTML, CSS, Python, Ruby和PHP等web开发技能创建mobile,tablet和desktop的原生应用程序。</p>

<p>
<div style="width: 425px;"></div>
<div style="width: 425px;"><strong><a title="Titanium开发者平台介绍" href="http://www.slideshare.net/weihh/titanium-7052566">Titanium开发者平台介绍</a></strong> <object id="__sse7052566" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=titanium-110224235522-phpapp02&amp;stripped_title=titanium-7052566&amp;userName=weihh" /><param name="name" value="__sse7052566" /><param name="allowfullscreen" value="true" /><embed id="__sse7052566" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=titanium-110224235522-phpapp02&amp;stripped_title=titanium-7052566&amp;userName=weihh" name="__sse7052566" allowscriptaccess="always" allowfullscreen="true"></embed></object></div>
<div id="__ss_7052566" style="width: 425px;">
<div style="padding: 5px 0 12px;">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/weihh">weihh</a></div>
</div></p>
]]></content>
  </entry>
  
</feed>

