三月 11, 2012

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» 轉移至 Nginx

2012 三月全世界的網頁伺服器市佔率圖 from netcraft.com 

上圖可以看出歷久彌新的 Apache 持續雄距首位,有超過 15 年的時間,沒"器"可挑戰它的地位。直至 Nginx 的出現,或許它現在只有 10% ,但從各方評價看來,它絕對是 Apache 有史以來最強大的對手。短短 5 年,它已經爬上第 3 名的位子,從趨勢線上看來,要超越 IIS 也是有很大的機會。

而 Nginx 為什麼短短幾年竄起,絕不是因為『用的人多』。如果是這種原因的話, palm 、 Windows OS 、 x86 CPU 、 PlayStation 到現在會活得好好地,因為它們都曾有超越 50% 的市佔率。

Nginx 被選擇的原因有幾點:
  1. 跨平台: *nix, Mac, Windows 皆可。這那算優點呢!!! 那個網頁伺服器沒跨平台,喔喔~講太早了, IIS 就是不能跨平台,或許這就是它市佔率持續下降的原因,強迫綁 Windows OS ,結果只要 Windows OS 下滑,它就必死無疑了。
  2. 開源的 BSD-like 授權。
  3. 靜態檔案輸出省資源。
  4. 不怕慢速連線。
  5. 比較不怕 DOS 攻擊。
  6. 穩定性高。
簡單講,除了效能,還是效能。而我要的功能, Nginx 都有提供,唯一算得上缺點的,就是因為 Apache 活得比較久,安全性已被磨得比較好了。所以對於我們愛研究的研究生來說,還有什麼理由不切換過去呢? 大概只有「懶」是個原因吧!

目前我們使用 Apache + Django 的方式多是利用 mod_python 的技術。然而這種作法是比較不安全的,把很多事都包給 Apache 去作,那不管是我們程式設計有錯,或是它用的元件有錯,只要出錯那就是管理員等級的錯。不過這個「錯」也不算是 Apache 的錯,是「用 mod_python 」的錯,如果用的是「 mod_fastcgi 」,那安全層級就能拉高了。

所以說來,這次的「升級」是把「 mod_python 」丟掉,改用「 mod_fastcgi 」。那麼我心裡想想,都要換成 Django 自己跑 fcgi mode 了,為什麼不乾脆連前端網頁伺服器也換一下呢! 因為重點已換成 Django 的 fcgi server , Apache 的重點性大減,前端網頁伺服器的功能只剩下靜態檔案輸出、虛擬站台切換、 https 處理等,那我何必跑一個 Huge Apache 呢? Nginx 就是我的新選擇。

安裝很簡單,如果是在 Ubuntu 中,請打:

$ sudo apt-get install nginx

如果是在 Windows 中,請到官網下載 nginx.zip 檔,解開了,就是一個可執行的 nginx 程式。

而我用的方法是下載源始碼自己編譯:

$ wget some_file_link.tgz
$ tar -zxf some_file_link.tgz
$ cd nginx
$ sudo apt-get install libpcre3-dev libssl-dev # 這些是編譯時,須用到的函式庫程式碼
$ sudo apt-get install libxml2-dev libxslt-dev # 這些是編譯時,須用到的函式庫程式碼
$ sudo apt-get install libgd2-xpm-dev libgeoip-dev # 這些是編譯時,須用到的函式庫程式碼
$ ./configure --prefix=/usr/local/nginx --with-debug --with-http_dav_module \
--with-http_addition_module --with-http_geoip_module --with-http_gzip_static_module \
--with-http_image_filter_module --with-http_realip_module --with-http_stub_status_module \
--with-http_ssl_module --with-http_sub_module --with-http_xslt_module \
--with-ipv6 --with-sha1=/usr/include/openssl --with-md5=/usr/include/openssl --with-mail \
--with-mail_ssl_module
$ make
$ sudo make install

這樣 Nginx 就安裝完成了。

接下來,我們作 Django 程式的設定,讓它可以跑在 fcgi mode 上,方法很簡單,原本我們在本機開發時,都是用:

$ python2.7 manage.py runserver 127.0.0.1:8080

讓它跑在 http://127.0.0.1:8080/ 上,現在則改用:

$ cd /home/somewhere
$ su - someuser -c "python2.7 manage.py runfcgi host=localhost port=3033 daemonize=true method=threaded workdir=/home/somewhere pidfile=/home/somewhere/fcgi.pid"

這樣 django 會在 127.0.0.1:3033 中,幫我們開一個 someuser 帳號權限的 fcgi server , daemonize=true 則表示指令打完後,它就背景處理了,想要把這個 fcgi server 殺掉,就去看看 /home/somewhere/fcgi.pid 的內容,裡面的編號就是系統行程編號, kill 那個編號就能關 fcgi server 了。

同時殺掉 fcgi server ,再馬上啟動它的指令可參考如下:

$ su - someuser -c "kill `cat /home/somewhere/fcgi.pid` && python2.7 manage.py runfcgi host=localhost port=3033 daemonize=true method=threaded workdir=/home/somewhere pidfile=/home/somewhere/fcgi.pid"

請注意在這個階段,你用瀏覽器去看 http://127.0.0.1:3033/ 是沒反應的,因為它現在跑的是 FastCGI 協定,不是 http 協定。瀏覽器無法跟 Django FastCGI 溝通。

接下來,我們再到 nginx.conf 去設定。Nginx 與 FastCGI Server 互動原理如下:
圖來自陈辉的博客
先由 Nginx 與瀏覽器互動,得到 GET, POST 等變數後,整理成 fastcgi 協定的變數,然後用 Socket 或 Port 方式傳遞給 FastCGI Server ,接下來就是 FastCGI 去驅動程式去處理,完成後拋回。

以下是 nginx.conf 的設定範例:

user www-data; # 子行程用的是 www-data 帳號
worker_processes 4; # 常駐 4 個子行程
pid /var/run/nginx.pid; # 紀錄母行程的編號
http {
    server_tokens off; # 網頁上不顯示伺服器版本編號
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 30;
    types_hash_max_size 2048;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    gzip on;
    gzip_disable "msie6";
    server {
        listen 80;
        server_name www.whatever-you-want.com.tw;
        root /var/www;
        index index.html;
        access_log /var/log/nginx/TW-access.log;
        error_log /var/log/nginx/TW-error.log;
    }
    server {
        listen 443;
        server_name www.whatever-you-want.com;
        keepalive_timeout 60;
        ssl on;
        ssl_certificate /etc/ssl/hoamon.info/hoamon.info.crt;
        ssl_certificate_key /etc/ssl/hoamon.info/hoamon.info.key;
        location "/" {
            fastcgi_pass_header Authorization;
            fastcgi_intercept_errors off;
            fastcgi_pass 127.0.0.1:3033;
            fastcgi_param PATH_INFO                          $fastcgi_script_name;
            fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
            fastcgi_param  SERVER_SOFTWARE       nginx;
            fastcgi_param  QUERY_STRING                $query_string;
            fastcgi_param  REQUEST_METHOD         $request_method;
            fastcgi_param  CONTENT_TYPE                $content_type;
            fastcgi_param  CONTENT_LENGTH          $content_length;
            fastcgi_param  SCRIPT_FILENAME           $document_root$fastcgi_script_name;
            fastcgi_param  REQUEST_URI                     $request_uri;
            fastcgi_param  DOCUMENT_URI                 $document_uri;
            fastcgi_param  DOCUMENT_ROOT            $document_root;
            fastcgi_param  SERVER_PROTOCOL         $server_protocol;
            fastcgi_param  REMOTE_ADDR                 $remote_addr;
            fastcgi_param  REMOTE_PORT                  $remote_port;
            fastcgi_param  SERVER_ADDR                  $server_addr;
            fastcgi_param  SERVER_PORT                    $server_port;
            fastcgi_param  SERVER_NAME                  $server_name;
        }
        location "/media" {
            autoindex on;
            root /home/somewhere/media;
        }
        access_log  /var/log/nginx/whatever-you-want.access_log;
        error_log   /var/log/nginx/whatever-you-want.error_log;
    }
}

上面有兩個虛擬站台,一個是給 www.whatever-you-want.com.tw ,一個是給 www.whatever-you-want.com 。

www.whatever-you-want.com.tw 只是單純的靜態網站,預設首頁是 http://www.whatever-you-want.com.tw/index.html ,而它的硬碟位置在 /var/www/index.html 。

而使用者若是瀏覽 https://www.whatever-you-want.com/media 的連結,則 Nginx 會給它 /home/somewhere/media 資料夾內的所有檔案。除了 /media/.* 外,其他的連結都會用 3033 port 送到 Django FastCGI Server 處理。

而使用 https 的方法,只須要設定 3 個變數值: ssl , ssl_certificate , ssl_certificate_key 即可。

設定完成後,用指令開啟 Nginx :

$ /usr/local/nginx/sbin/nginx

重新載入:

$ /usr/local/nginx/sbin/nginx -s reload

關閉:

$ /usr/local/nginx/sbin/nginx -s stop

這樣 Nginx 伺服器就建立完成了。

在新架構下,可以由系統管理員獨立控管 Nginx 網頁伺服器的開啟、關閉,而讓程式設計師,自行作 FastCGI Server 的管理,程設師自己作程式更新、套用,避免給予過多的權限。畢竟這兩者的知識領域是有別的,少有人兩邊都作得很好。

=== 以下可能是 *nix(含 Mac) 專用(因為我不知道 Windows 能不能作 unix:socket 的指定) ===

如果我們一台機器有多個 django-base 的虛擬站台,那麼一個 django-base project 就要花一個 port ,這對於系統管理員及程式設計師而言,容易有搞亂的可能性,畢竟 "網址" <=> "port" <=> "django-base project" 的過程當中,是文字對應數字,再對應文字,難以記在人的腦中(也可能是我的記性比不上平均值吧!)。

所以我建議使用 Unix Socket 方式作對應。程式設計師把 socket 開在程式庫的 root 資料夾中,並取名為 django.socket 。再將 django.socket 權限設為 770 ,然後系統管理員把這個 django.socket 擁有群組設為 www-data 。

程式專案在 /home/someproject/ ,設定範例如下:

$ cd /home/someproject && /usr/bin/python2.7 manage.py runfcgi socket=`pwd`/django.socket method=threaded workdir=`pwd` pidfile=`pwd`/pid daemonize=true

上面程式設計師跑起一個 django-base 專案,並將 socket 開在 /home/someproject/django.socket 。

然後系統管理員作權限設定(也可以用 visudo 指給程式設計師作權限設定):

$ sudo chgrp www-data /home/someproject/django.socket
$ sudo chmod 770 /home/someproject/django.socket

系統管理員再把 nginx.conf 原本的 fastcgi_pass 127.0.0.1:3033 設定改如下:

        fastcgi_pass unix:/home/someproject/django.socket;

改成這樣的設定方式,對程式設計師來說,永遠是把 socket 開在同一個專案資料夾中,並命名為 django.socket ,而系統管理員也知道一定是專案資料夾下的 django.socket 。少了數字 port 的對應記憶,減少錯誤的機率。

六月 20, 2011
» 在 Windows、Linux,以及 Mac 上安裝 pip - Python 套件管理程式

這篇是寫給沒用過 virtualenv 與 pip 的 Python 套件管理攻略。

PycTW 2011 上應該沒時間講這種事,還是先在這邊還攻略債吧。

步驟

先講一下原則上的建議安裝方式(同 pip 官方文件上的建議):利用 virtualenv 內建的 pip

  1. 下載 virtualenv.py
  2. python virtualenv.py [新專案環境目錄名]
  3. 進入 virtualenv 環境(在這個環境下安裝的東西不會影響到整個系統)
  4. 開始使用 pip 安裝套件

 

Linux 或 Mac 上的指令參考

$ curl -O https://raw.github.com/pypa/virtualenv/master/virtualenv.py
$ python virtualenv.py my_new_env
$ . my_new_env/bin/activate
(my_new_env)$ pip install ...

通常這樣就完成了 Linux 與 Mac 上的攻略。

 

Windows 上的指令參考

  1. 儲存那個網頁,命名檔案為 virtualenv.py
  2. 打開 terminal(cmd.exe 之類的),cd 到你要放專案資料夾的地方 (例: cd C:\Users\Keith )
  3. python virtualenv.py my_new_env
  4. my_new_env\Scripts\activate.bat
  5. pip install …

 

附錄

如何使用 pip 安裝一個名為 xxx(bottle, nose, Requests, SQLAlchemy, Pyramid, … 等等) 的套件?

pip install xxx

移除套件? pip uninstall xxx

四月 21, 2011
» Mac Tips

在Mac上的 Terminal,預設的狀態很難用,
一來是配色不好看,二來是ls是沒有顏色的。
配色的話,可以自己到preference中選一個喜歡的;
ls的顏色的話,可以在自己的目錄下建立 .profile檔,
然後加入
export CLICOLOR=1
再重開Terminal就行了

四月 17, 2011

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» How to get a free HTTPS web certification authority by StartSSL.com

一般在上網時,所用的 Http 協定是明碼的,使用者與網站伺服器之間的任何網路結點(閘道器)都有方法可以看到網路連線所傳遞的訊息,所以如果網站所提供的服務關係到機密(隱私)資料時,我都會讓網站用 Https 加密協定服務。

使用 Https 服務時,有一個重要觀念: 如何拒絕「中間人攻擊」。

假想一個以 Https 加密協定服務的 A 網站,在它與使用者傳遞公錀(加密憑證)時,是被一個中間人接走,而中間人再把它自己的公錀傳遞給使用者,結果使用者傻傻地使用中間人的公錀加密,再把加密資訊傳到中間人,而中間人用自己的私錀解密後,再用 A 網站公錀加密傳回 A 網站,在這個模式,雖然使用的是 Https 協定,但資料還是被中間人看光光了。

所以要防止此類攻擊,就必須讓使用者能「確認」公錀真的是 A 網站的。方法是使用者自己手頭上要有一些公認機構所發行的公錀憑證(一般的瀏覽器都已經包入),然後在拿到 A 網站的公錀憑證時,用手頭上已有的公認機構公錀憑證去驗證這個 A 網站的公錀憑證是否被這些公認機構簽核過,如果有,則表示公錀的確就是 A 網站的,當使用者用這把公錀加密時,就只能被 A 網站解密。

本篇文章的目的是站在 A 網站的立場上,如何將 A 網站的公錀交給公認機構作簽核,這樣使用者在瀏覽 A 網站時,才不會跳出一個警示視窗告知使用者:「 A 網站有安全疑慮」。

一般將公錀交給公認機構去作簽核是要花錢的,像是國內最大的簽證公司(我猜的)網際威信最便宜的簽核年費是 18000 元。這筆費用不是每個人願意負擔的,像是我的 https 網站,主要是提供我們團隊作專案管理之用,也就不到 10 位的使用者,要我花 18000 元,去買一個「讓使用者在一年之內不會看到該網站有安全疑慮」的警告訊息,這我可花不下手。

所幸,有公認機構了解這種需求,它以「一年免費」作廣告宣傳,如果有更高級的簽核需求,它才額外收費。那麼以我上述所要的,其實就拿那個「一年免費」用用即可。

首先請使用 Firefox (它們目前不支援 Chrome)去瀏覽 http://www.startssl.com/ ,並點選右上角的錀匙圖示,如下圖:


就能看到 Sign-up 按鈕,如下圖:


按下 Sign-up 按鈕就開始註冊帳戶的流程,整個公錀簽核的程序分成三個階段:
  1. 註冊帳戶
  2. 驗證網址
  3. 公錀簽核
1. 註冊帳戶時, startssl 會給你的瀏覽器一個全新的公私錀檔,這個公私錀檔是專供你的帳戶使用的,這個公私錀檔要好好保管,搞丟了,你就不能再用這個帳戶申請簽核的動作,因為它的登入不是用帳號密碼作登入機制,而是用公私錀作登入機制。

2. 驗證網址,你必須證明要作簽核的網址是你所管理的。而這個驗證動作完成後,你也只有 30 天的期限去作簽核它的公錀,過期後,就必須再次驗證網址。

3. 針對已驗證過的網址,你可以申請簽核公錀的動作,主要分兩種作法,一是 startssl 完全生出一把全新的公私錀憑證; 二是我們自己生出私錀及公錀請求檔,再把公錀請求檔交給 startssl 去作出已簽核的公錀。本文是介紹第二種方法,因為私錀應該是自己處理會比較妥當,不要懶惰到連解密錀匙也委託他人製造,我個人認為這種人不只懶還不負責任。

原則上,公錀不過是一個文字檔,所以它在 Linux, Window$, Mac 作業系統下,都能處理,但我個人還是喜歡用 Linux 來作這件事

1. 註冊帳戶:


請填寫你的詳細資料,原則上,他們只採 web 審核,所以只要你的資料不要「太假」,他們都會通過。


請到註冊信箱接受具驗證碼的信。並注意「目前的這個視窗」是不允許關閉的,如果你關閉當下這個網頁,再用相同連結回來,這樣你填寫的驗證碼就算是對的,它也不會通過你的申請。


產生「帳戶」專用的公私錀檔,可選擇 Hign Grade 。


將公私錀檔安裝至瀏覽器上,這裡的公私錀檔是指你的帳戶與 startssl 網站溝通時,所用的公私錀檔,而不是你的網站要用的公錀。


建議你備份這份公私錀檔。


完成後,可見到帳戶頁面。

2. 驗證網址:


我是選擇 Domain Name Validation 方式。


填入網址。


startssl 會從 whois 資料中抓出管理員信箱,所以你必須確認該網址的 whois 內容是正確的。


請到信箱收取驗證碼。並填入上面的 Verification Code 中。


成功後,你只有 30 天的時間,去簽核該網站的公錀檔。

3. 簽核公錀:


公錀可以有很多種用途( Email/XMPP/Object Code ),但目前我只需要 Web 的,所以選擇 Web Server SSL/TLS certificate 。


要使用自己獨立生成的私錀來作簽核公錀的動作,請選擇 Skip 。

欲生成長度為 4096 bits 的私錀檔並使用 des3 格式作私錀加密(密碼長度要大於 4 個字元),請使用如下指令:

# openssl genrsa -des3 -out exmple.com.key 4096
Generating RSA private key, 4096 bit long modulus
................................................................................................................................................................++
...............................................++
e is 65537 (0x10001)
Enter pass phrase for exmple.com.key:
Verifying - Enter pass phrase for exmple.com.key:

從新增的私錀中,產生一個憑證請求檔,並在請求檔中,寫入「目標網址」(也就是你剛驗證過的那個網址)的所屬資料,如:所在地、單位名稱、負責人信箱等:

# openssl req -new -key exmple.com.key -out exmple.com.csr
Enter pass phrase for exmple.com.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:{{TW}}
State or Province Name (full name) [Some-State]:{{Taichung}}
Locality Name (eg, city) []:{{Taichung}}
Organization Name (eg, company) [Internet Widgits Pty Ltd]:{{EXAMPLE-Company}}
Organizational Unit Name (eg, section) []:{{EXAMPLE-Company}}
Common Name (eg, YOUR name) []:{{EXAMPLE Company}}
Email Address []:{{master@exmple.com}}

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:


兩個 {{ }} 所包住的部份,請自己修改成正確資料。


在 Linux 完成 CSR 檔的製作後,你會得到 example.com.csr 檔案,請將檔案內容貼入上圖的文字框中。


CSR檔如無誤,它會出現上圖的訊息。


它要你選擇要生成簽核公錀的頂層網域。


請填入你所提供 https 服務的網址名稱。


確認要簽核公錀的網址。 startssl 簽核的公錀,預設會給你的目標網域及它的頂層網址兩個。如果你要簽核公錀的網址希望是 *.example.com ,也就是除頂層網域外,把它的下層網域一網打盡,也是可以,只要二年付 USD 49.9 即可,大約 1500 元的新台幣,而且這是 wild cards 網址,網際威信可沒這麼好康,一個就要 18000 元、二個就是要 36000 元。這時,我又感到「全球化」的愉悅。


接下來,請把文字框中的文字貼到 example.com.crt 中,這個內容即已被簽核過的公錀檔。另外,請順便下載上圖中的 intermediate 及 root 兩個 CA 檔案。


整個工作完成了。

然後在 Apache 設定檔中設定如下:
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM
SSLCertificateFile /etc/apache2/example.com.crt
SSLCertificateKeyFile /etc/apache2/example.com.key
SSLCertificateChainFile /etc/apache2/sub.class1.server.ca.pem
SSLCACertificateFile /etc/apache2/ca.pem
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown

重新啟動 Apache 時,它會問你私錀密碼為何? 這個動作在管理員面前發生是沒有問題的,但在系統自動重開機時,會造成困惱,所以我們可移除私錀的加密,指令如下:

# openssl rsa -in exmple.com.key -out exmple.com.key.no_password

exmple.com.key.no_password 這個私錀檔就是沒加密的,將它寫入 apache 設定檔即可。

四月 16, 2011

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» SSH 的公私錀生成說明

Linux/Mac:

請在命令列鍵入如下指令:

$ ssh-keygen -t rsa -b 4096


Generating public/private rsa key pair.
Enter file in which to save the key (/home/tmp/.ssh/id_rsa): <<按 Enter ,使用預設值>>
Enter passphrase (empty for no passphrase): <<設個私錀密碼,請大於 5 個字元>>
Enter same passphrase again: <<確認剛剛的私錀密碼>>

Your identification has been saved in /home/tmp/.ssh/id_rsa.
Your public key has been saved in /home/tmp/.ssh/id_rsa.pub.
The key fingerprint is:
72:fb:40:ba:8a:40:be:48:03:bd:20:13:6d:83:cb:d0 tmp@core2duo
The key's randomart image is:
+--[ RSA 4096]----+
| |
| + |
|+ A |
|o= . |
|*o. T . S |
|=o . = . |
|.-. . o |
|o.o. . o |
|... ... . |
+-----------------+


這樣,你的公錀就是 ~/.ssh/id_rsa.pub 而私錀就是 ~/.ssh/id_rsa 。

$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAgEAz22m/azvKC7uk05/D6qvl5c+QR95jkiqEpnn3/co/zOGc4Gf7v1sc5H7Lf5CUOTxgfgAOZSmdr1OPaUYU1cvJTLTjKeVznifyTl3KabMH1Yy8wpSS1TjCTbS8896uXXYtrdIL5KEHnVADYdS4fHWtY7uAR+JWlbh9OjN3deU77656knwW0PO5ELMYKUicSZZZFoUFyDCflM61cNNP1i/rwa1pp8nFqyjzNOq5hKaEsssiJK4tPcm+5K8rwRXm3k7fprvoxYswebo9U85kvyWPqY0iMFE0P019Pbq5VWCaqfv9nzD7rZaKe+aLk/7n+E4HSSSLYNlhnQkZUVm40zGnhGEZvT0e+kmpJpXJKjAe3ZJkowc3o8xrBjD0ULP+jN1fHMUxllWOuxgNkqdD/UjXf5E777Zw+Fpoy2B1c/wRPpRfsFisfLg9xxj3MF+E3wkHROOtrSv+M2wLKVtDODF4zwO8dr5g9s5xBTlSJFsBCJGmX2+zQ6y2033amRnr/Xl0+KAqCOdO+BmQ+iw7X0DFCfxZtjx4RQXcGYw3HqSKP3I4Tft0IHD0g1HXuQhMezG6yVIVABgbo47+Xbdxx7vFb82Anv7DnmhbOovk3LDrzPzyNe7fS2Jla5T5Etb5jyEHE1qNfJNzKVgxjBMGKGk7L5GIx7pXUk= tmp@core2duo

把上面的公錀內容放到你想登入的 Linux/Mac 機器中的 ~/.ssh/authorized_keys2 (這個檔,其實是看系統管理員是怎麼設定的,只不過一般的 Linux 套件都是用這個作預設值)中,這樣你就能使用這一對公私錀登入遠端機器了。

Windows:

就比較麻煩了,請去下載 puttygen.exe 程式,執行它後如下圖:



選擇 SSH-2 RSA 及輸入 4096 的 Number of bits in a generated key 後,再按下 Generate 按鈕,讓滑鼠停留在綠色生成桿的下方空白處,並胡亂移動滑鼠遊標,讓 puttygen.exe 得到亂數種子,待進度達百分百後,可得到下圖:



選取的藍色文字即公錀內容,請貼到你欲登入的 Linux/Mac 機器中的 ~/.ssh/authorized_keys2 中,而私錀部份,請在設定密碼「Key passphrase」及確認密碼「Confirm passphrase」後,按下 Save private key 按鈕以存檔至系統硬碟。

最後,請保護好你的私錀檔(最好不要離開生成它的機器硬碟),遺失它或是被別人盜取後的代價相當大。 Good Luck!

五月 28, 2010

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» 如何解決 TortoiseHG on Windows 上中文檔名的問題

因為 Windows 在紀錄檔案名稱時,是用 UTF-16 ,而不是 UTF-8 作紀錄,所以如果在 Windows 中,加入一個「中文檔名(嚴格來說,是非 ascii 編碼的名稱)」的檔案,那麼這個檔案到了 Mac OS X, Linux 平台時,就無法使用了。


要解決這個問題,只要 Windows 使用者用 fixutf8 extension 先處理檔名即可。下載程式碼後,只要到 hgrc.d/Mercurial.rc 檔中,加入

[extensions]
fixutf8 = C:/fix-utf8/fixutf8.py

但使用這個外掛(16 (baf283ab9f92)版)會導致 TortoiseHG 無法作 commit 的動作,這 commit 問題,我找了很久,但實在沒辦法解決,只知道 TortoiseHG 將 commit message 以 cp950 送出,但 fixutf8 卻要求 message 要以 utf8 進入,但那裡的程式要修改,我就 de 不到了。

目前我只能回到 cmd.exe 底下,用 hg ci 來作提交動作。

而且,在使用 fixutf8 下,有可能會導致 merge 功能錯亂,這時候,就只得用 Linux/Mac OS X 來解決 merge 問題。

五月 25, 2010
» 為什麼我用Mac

這篇文章其實已經醞釀很久了。起因是前幾個月看了tinyfool的为什么我认为每个程序员都应该用Mac OS X?youxu的开发人员为何应该使用 Mac OS X 兼 OS X 小史,我當時就很想順便分享一下我的經驗,但那時忙著Sikuli實在沒法靜下心來寫文章,直到最近稍微閒下來了才又想起這件事。

我從2005升上研究所前買了第一台Mac mini到現在已經五年了,說起來其實沒有很長,但自從2005年起,我就成了非Mac不用一族。但用Mac是一回事,我要先澄清我不算是狂熱的Apple粉絲,我除了Apple的電腦外,只有跟朋友以超低友情價買過一台開學優惠送的ipod touch來玩,除此之外,我沒有iphone、沒有ipad、也沒有Apple鍵盤滑鼠以外的周邊產品。在2005年以前,我高中和大學約6年都是用Linux作為主要工作環境。我一路從Slackware、RedHat、Mandrake(後來改名Mandriva)、玩到Debian、Ubuntu,那段時期我有數台24hr online的Linux server,還換過3台laptop,但都是裝Linux。在更之前呢,從國小的386 PC算到高一將近10年就是用DOS和Windows了。

這篇文章主要想分享的是作為一個programmer使用各種作業系統開發的經驗,不是想要說服大家全改用Mac。雖然從時間上看起來我用DOS和Windows最久,但我真正開始大量寫程式是國中開始用Visual Basic的事,所以我在DOS和Windows平台的開發經驗其實算是最少的。而大學階段是我最密集寫程式的時候,所以我的經驗和使用的工具也都是以UNIX派的為主,不見得適用所有人。

我在DOS+Windows、Linux、Mac這三大主流平台上都混過一段時間,這個遷徙的歷史其實也代表了我個人心態上的轉換。

在剛開始學電腦的時候,我是純粹的使用者。我用電腦玩遊戲,國中幫老師用excel做全班的成績單,閒來無事就隨手玩玩photoshop、3D studio等軟體自娛娛人。我記得在386的DOS時代要玩個遊戲還挺不簡單,雖然很多遊戲都說只要打play.bat就可以玩了,但事實上總要修改config.sys和autoexec.bat裡的一些記憶體或音效卡的設定才能玩。所以那個時代的使用者其實大都是玩家級的人物,多少都對Adlib、EMS、XMS、可恨的640K限制有些了解才有辦法「玩」電腦。

國中開始寫程式之後,我的心態就不太一樣了。像一般玩家般玩電腦已經不能滿足我,我開始熱切的想了解電腦內部運作的一切原理,想了解每個程式是怎麼寫出來的,每個零件是怎麼運作的,每一個細節我都想知道。而我剛好就在這段時間接觸到Slackware Linux。

Slackware Linux其實是一個不太好用的Linux distribution,可能很多人也沒聽過它。現在的Ubuntu和Windows沒兩樣,一直按「next」就能裝完整個系統並開始使用。但那時的Linux裝完後可是「什 麼 都 沒 有」。沒有X11,更別提其上的GNOME或KDE;文字編輯器只有vi(不是vim)和joe;沒有make、沒有gcc、…,總之,真的什麼都沒有。那個時候裝Linux其實是為了自己架MUD server,但當時Linux的安裝教學都說裝完的一件事就是自己重新compile kernel。(因為預設的kernel很陽春,幾乎什麼driver都沒有,不自己compile的話很多硬體都動不了。)其實當時我覺得這還蠻酷的,make config打完出現數百個選項可以慢慢勾選,讓我這種想要一窺作業系統裡面在搞什麼鬼的人非常過癮。(一開始我還不知道有make menuconfig可以用,所以其中一個選項不小心選錯就會非常痛苦要整個重來……)但過了一段時間我就發現,MUD server沒架起來,但倒是很會重編Linux kernel和設定xf86config。

國中我還在用Visual Basic寫程式時,其實沒有注意到「平台」不同的影響,因為當時我只用Windows和VB寫程式,也不會其他語言,更不用提在不同平台寫程式。一直到上高中學了C,開始寫比賽的程式時,才讓我注意到Turbo C和gcc雖然都可以compile C的程式,但有某些header檔(像是conio.h)是只有Turbo C中才能用的。發現這件事後,我才突然搞懂library是什麼,還有Linux下有一堆libxxxx及libxxxx-dev的套件是在做什麼的。

Windows和Linux的關鍵差異 – 資訊透明度 – 也就在這裡顯現出來。在我學VB的時候,我把當時一本VB5的經典書籍從頭到尾全讀過了,但我竟然對library一點概念都沒有。我以為我能用的東西就是VB提供的那些元件,後來我多學了一點後發現我還能呼叫Windows API做一些VB辦不到的低階功能,我從來沒想過要去利用別人已經寫好的程式和函式來節省自己的開發時間。簡單說,我以為要造一輛車子,就是要從輪子甚至是螺絲釘自己做起。

某方面來說這是個好事,因為我的第一個VB遊戲「黑白棋」,就是這樣一個個pixel從無到有自己畫出的。但如果要寫更大的程式,每次都從輪子做起就不是個好主意了。接觸到Linux後,我也學了很多open source界的「哲學」,其中最重要的就是重用別人的輪子。

記得很久以前在Redhat和Mandrake上裝軟體非常痛苦,雖然每個程式都被包裝成一個RPM檔,但RPM之間的相依性常會讓人發瘋。每裝一個軟體都有可能會跳出數個相依的library或套件需要安裝,然後使用者必須自己去找這些相依的RPM,更糟的是這些相依套件可能會沒完沒了的依賴更多其他的套件…。(還好後來改用Debian就不用再被這個RPM地獄折磨了。)

這個過程讓我深刻的體會到,軟體應該是像金字塔一樣一層疊著一層往上蓋的,Linux套件的包裝方式清楚的讓使用者能夠看出來一個軟體是利用了哪些library建構起來的,如果自己想寫有類似功能的程式,很容易就可以找到相關的library來用。但在Windows下就不是這麼一回事了。Windows的軟體是為end-user設計的,目標使用者很可能什麼都不懂,所以發佈軟體時應該要把所需要的library或套件全部包進去變成一個龐大的自動安裝程式,使用者只要一直按下一步就可以裝完了。這讓使用者變得比較輕鬆,但同時也一些對開發者有益的細節也隱藏起來了。

Windows的軟體大多是完全不透明的,安裝時你不知道它裝了什麼,也不知道它寫了什麼到registry,更別提要知道他的某某功能是怎麼做的。但Linux是在另一個極端,每個程式的一切都是透明易懂的,RPM或DEB套件裡有什麼東西一個指令就一清二處,每個套件需要用到哪些相依套件也是明明白白。此外,Linux下的設定檔都是純文字,只要文字編輯器就可以修改,不但方便編輯,也方便寫自動化的script或是備份系統。當然,更不用提Linux下幾乎所有程式都是open source的,只要有興趣,隨時可以打開每天在用的軟體的source研究它是怎麼做的。這些事情在Windows底下則是天方夜譚,所有的細節都被自然的包裝和隱藏起來了。這種透明度的差異對於充滿好奇心的程式設計師會產生南轅北轍的影響,當你接觸的東西越開放,就能自然而然接觸和學習電腦從裡而外的各種知識;但當你接觸的東西越封閉,就只能受限於黑盒子的限制而當個單純無知的使用者。

高中時轉到Linux作為工作環境還有另一個很大的原因:「效率」。Linux的世界是架構在文字設定檔和command line工具上的,整個OS的操作都可以用command line解決。更方便的是搭配shell script或是Perl、Python這種script language,可以輕易把系統裡各種小工具結合起來完成複雜的工作。command line有個很大的好處,你每天用的操作介面,和寫自動化script的介面是完全一樣的。也就是說,你只要把每天打的指令串起來放進一個檔案,就自然變成了shell script,而日後只要執行這個script就能自動完成需要一連串指令的工作。這種工作方式滿足了我身為一個「懶人」的慾望,因為我懶得每天用手親自重複做同樣的事情,所以我寫script將這些事自動化。當script寫的越多,就會面臨越複雜的工作,這時就會想要學更多”UNIX power tools”的用法(這是O’REILLY的一本好書)或是更強大的「黏合」語言(像是Perl)來組合不同工具。透過這種正向循環,可以不斷刺激自己提昇工作效率:事情做得越快,就可以想得更多,解決更複雜的問題,進而就能學得更多,做得更快。

大學那幾年我成了虔誠的Linux command line信徒,不管是什麼樣的事情我都可以用各種小工具加上Perl或shell script來解決,而Windows在這方面就完全比不上Linux。Windows的哲學是一套軟體可以做N種事情,但如果你想做的事情不在它原本設計的功能裡,只能兩手一攤什麼事也做不了。

資訊的透明度和command line帶來的高效率讓我非常享受在Linux上工作的樂趣,然而Linux也不是沒有缺點。當我學得越多,對系統底層的好奇心漸漸被滿足後,Linux的缺點就漸漸暴露出來,其中最讓我受不了的是殘破不全的driver支援。讓我印象最深刻的是在802.11b無線網路剛開始流行時,我花了很多時間在找driver和當白老鼠compile最新的driver,重編kernel幾乎是每日例行公事。除了無線網卡外,就算是有線網卡Linux都不見得支援,最惡名昭彰的莫過於Dlink系列的卡,他們的530TX甚至還被暱稱為惡魔卡。(這張便宜的卡在當時非常流行,但偏偏在Linux上就是不能用…)

雖然我是個programmer,但我同時也是一般user。在我想要快樂用電腦看電影或上網時,還要不時的處理系統內部的問題其實有點惱人,更別提當我只想寫一般的桌面程式或是Web app時,為什麼我還得跟Linux kernel奮戰呢?

除了硬體相容性外,Linux這種過於開放的平台還有個大問題是缺乏統一且一致的user experience design,導致usability常常奇差無比,而這也是很多open source軟體普遍共有的問題。程式設計師在乎的是功能面的設計,每個人做自己想要或喜歡的功能,雖然看起來和樂融融,但很少project有專門的團隊負責思考user是誰,他們想要什麼,以及他們會怎麼用這個軟體。同樣的功能但由不同的介面呈現,帶給使用者的感覺也會有天南地北的差異,而由千百個open source軟體拼湊起來的Linux系統帶給使用者的就是千百種不同的設計和使用方式。(後來Ubuntu的出現大大的改善了這個問題,但那時我早已跳到Mac上了…。)

就在Linux的缺點慢慢浮現後,我同時也注意到身邊很多FreeBSD/Linux hacker們開始改用Mac OS X。深入了解後,我很快發現Mac是一個完美解合Linux的效率和開放,同時又兼顧了精心設計過的user experience design的平台。Mac作業系統核心是BSD的近親Darwin,上層有跟Linux相同的command line shell,所以我以往在Linux慣用的設定檔和程式(bash、screen、vim…)全都可以直接帶到Mac上使用。(更棒的是還能像在Debian下一樣用apt-get install或是port install一個指令就自動裝完所有相依套件)

而在command line的上面則是Apple設計的GUI系統,美觀、一致、充分為使用者「設計」過的介面,輕易的就打敗我在Linux上較調半天的FVWM設定。(我換過和較調過無數的window manager,從enlightenment、GNOME、KDE、Window Maker、FVWM…)除此之外,我也不用再自己重編kernel和找driver,每一台Mac都是買來後一打開就能用了。

後來Mac用久了,漸漸發現更多Mac的好處,尤其是對於programmer而言。

每一台Mac都有附Mac OS X的安裝光碟,裡面同時附帶Xcode。而只要把Xcode裝上去後,我整台Mac就已經準備好可以讓我工作了。Xcode是Apple開發的IDE,可以開發各種常見的程式語言,但其實我不用這個。我都用Xcode底層的command line工具,像是gcc、make、svn,加上OS X內建的screen、vim、perl、python、apache(只用這些的話其實連Xcode都不用裝,每一個OS X都內建),我就有了完整的程式開發環境,而且我甚至還不需要連上網路就可以有這些。除此之外,Xcode裡還附帶很多好用的開發、除錯工具,像是我最愛的Shark(非常好用的profiling和memory debug工具)、或是Malloc Debug(找memory leak的好東西)、BigTop(監看每一個process耗用的資源記錄)。

自從我轉到Mac後,後來因為需要寫跨平台程式而切到Windows時,都覺得極端痛苦。因為Windows是給一般使用者的系統,而且所有程式都是獨立分開的,每次光要把開發環境準備好就要先耗上一整天在下載和安裝。後來我學乖了直接裝cygwin弄一個假的UNIX環境出來,但cygwin畢竟還是跑在Windows上,系統設計的哲學不同讓cygwin還是格格不入。(像是Windows就是沒有用文字檔存放系統設定,所以也沒辦法用一般的文字工具自動操作;Windows也沒有提供夠多的command line工具可以控制系統;Windows也沒有符號連結(symbolic link),我之前想用Bazaar check out一個有符號連結的repository就爆炸了…)

從Linux轉到Mac,讓我可以花更多時間專注在我想寫的程式上,而不是拿去研究driver的相容問題,或是Linux kernel新增的設定選項。對於一個應用程式或網頁程式的開發人員來說,這些底層的細節都是不重要的。雖然說Windows也把系統底層的細節藏起來了,但它實在藏的太徹底了。萬一偶爾需要看系統底層的訊息來debug,在Mac上還是跟Linux一樣直接到/var/log下grep一下就有了,但在Windows上除了「回報給微軟」外,也沒太多辦法可以自力救濟。

Mac上很多設計也改變了我使用電腦的方式。例如說QuickSilver讓我可以用鍵盤快速啟動任何程式,甚至是做更複雜的操作。Spotlight讓我不再需要思考怎麼把檔案文件分類整理到不同folder裡,需要什麼就像用google一樣只要直接用spotlight找就好了。Mac上的繪圖、設計軟體都有很貼心的設計,例如OmniGraffle的自動對齊線,可以幫忙使用者輕易設計出平衡、一致、美觀的圖像、網頁、或是圖形介面。Mac上幾乎什麼都可以自然地用drag and drop操作(例如Safari很早以前就可以把檔案拖到網頁裡上傳),但很奇怪Windows上就是有些地方可以有些不行。

整體來說,Mac是一個融合Windows和Linux雙方優點的平衡點,我可以像一般使用者一樣不費心力的操作電腦,也可以用高效率的command line處理複雜的任務,甚至是在需要的時候扮演hacker挖掘底層的錯誤訊息,或是利用Darwin Ports安裝和修改我需要的open source軟體。但除了Mac外,其實我還是有在用Linux,只是都跑在遠端的server上而已。主要原因是在沒有圖形介面時,Mac就沒有什麼優勢了。所以到現在即使我的laptop都改用Mac,我也還是會有一個terminal連到我的Linux server上。(雖然說主要是拿來掛IRC和BBS的…)


五月 5, 2009

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» 使用 PGP 來建立人際信任網

當我們可以使用自己生成的 PGP 公私錀來作加解密及簽章驗證的工作後,事實上,我們還能將 PGP 運用得更淋離盡致: 我們把整個人際關係展現在我們的公錀上。

當你把公錀四處發放的時候,實際上,你正在宣告這個世界,這把公錀可以代表你的身份,用這把公錀所加密的訊息只有你才看得到。而只要相信了「這把公錀就是對應著你的身份」這個關係後,也代表「這把公錀」所驗證成功的某個訊息,必定是由「你」所發佈的。

以上,就是 PGP 信任網的基礎: 一把公錀代表一個人。

所以,如果有一個 A 用他的私錀 Sa,為另一個 B 的公錀 Pb 作簽章而得到 Pb'(這也就是為什麼一把公錀生成後,會有變動發生的原因),那麼我們可以透過 Pa 來作 Pb' 的驗證,驗證成功後,我們將了解到 A 這個人完全為 B 的新公錀 Pb' 負責,因為 Pb' 是 A 所簽章過的。也就是,我們可以合理地相信 A 這個人一定認識 B 這個人,而且他也同意 Pb' 是屬於 B 這個人的公錀

所以,本來我們可能只認識 A ,相信 Pa 是 A 的代表,但是透過 Sa 對 Pb' 的簽章,我們間接地相信 Pb' 是 B 的代表,就算原本我們根本不曉得 B 是何許人也,就算 B 也沒告知我們他的公錀編號,但我們可以透過 A 來相信 Pb' 代表 B 了。

簡單地講,你可以使用個人私錀為「認識(信任)的人的公錀」作簽章 *1,簽章後,別人就會知道你一定認識這些人。

註1: PGP 信任網中,所謂的信任並不指的是一般的信任,並不是說你簽章了某個人的公錀,就表示你相信這個人是「好人」,這裡的信任,指的是你「確認」該公錀的確是這個人所擁有的。

這麼作的好處是什麼? 如果你想要寫一封信給歐巴馬(想當然耳,你一定不認識他),又希望你的內容只有他看得見且連他的幕僚也無法事先閱讀,那麼你就可以先下載他的公錀,用他的公錀來加密。但在加密前,得先確認他的公錀有沒有經過你認識的人作過簽章,如果有,則表示這把公錀的確是歐巴馬所擁有。

有沒有可能你不直接認識歐巴馬,但卻透過你的朋友的朋友來認識到歐巴馬呢? 因為他的公錀被 A 簽章過,而 A 的公錀又被 B 簽章過,而 B 的公錀又被 U 簽章過,最後湊巧你認識 U 這個人。這真的是有可能的,請參考六度分離理論 *2。

註2: 六度分離理論告訴我們,地球上的任二個人,他們之間只被 6 個人隔離,也就是你必定能透過某人的朋友去認識某人的朋友再去認識某人的朋友再去認識某人的朋友再去認識某人的朋友去認識某人的朋友來認識地球上的任何一個人。

了解了 PGP 這麼偉大的信任網概念,那麼該如何實現呢? 很簡單,你只要為你所認識的人的公錀所簽章,那麼就能協助體現 PGP 信任網了。

一樣來到「金錀管理程式」的介面。(不知道如何叫出嗎? 請參考如何使用 PGP (Linux/Mac/Windows 皆適用)來加解密及簽章驗證)



選擇一把欲簽章的公錀並按下[簽章],然後再按下[Sign this key]並選擇使用那一把私錀來簽章。完成後,你就會看到該公錀下出現你金錀的資訊,這代表已簽章成功。



** 在為某些公錀簽章時,可能會出現失敗訊息,原因可能是 FireGPG 尚未支援該公錀的額外資訊簽章,如:相片資訊(是的! 公錀也可以放相片。要看別人公錀中的相片請打 gpg --list-options show-photos --list-keys {XXX})。

所以這時候,可以使用命令列來作,如下指令:


# gpg --sign-key {XXX}

並回答它所提出的問題即可。{XXX}代該公錀編號。
**

接下來把該簽章後的公錀匯出至伺服器,並告知該公錀的擁有者:「你已經確認了這把公錀就是代表他這個人,請他可以更新自己的公錀」。

那如果是別人簽章了你的公錀後,請務必記得:「如果你認識這個人且確認他的公錀是那一把的情況下,絕對要用你的私錀去簽章他的公錀,因為這是禮貌」。當然啦, PGP 並沒有強迫你一定要這麼作,但如果你這麼作了, PGP 信任網會更完備。

在簽章他人公錀時,請務必記得:「這個簽章不是恩惠,是一種信任,唯有你認識的人才作簽章。不認識的人請不要簽章。」

除了用自己的私錀去簽章他人公錀外,我建議各位也可以利用 PGP 信任網的概念,為自己的私錀買保險。

什麼是買保險? 之前我提過,如果私錀搞丟了,是不是之前別人用它對應公錀所加密的內文,你完全就看不到了。沒錯,的確是完全看不到了。但是逝者已矣,來者可追,你還是得繼續用 PGP 來過你未來的生活呀! 但是如果你原本的公錀已經有 200 個人為它作過簽章了,那麼你的新公錀難道要重新再去找這些人作一次簽章嗎? 是的,你必須再麻煩當初的 200 個人為你重新再簽章一次。但那些人如何確認你的新公錀的確可以代表你呢! 你勢必得再經歷 200 次由第三方管道(面對面確認、電話確認等非網路形式的確認)提供公錀編號讓對方知道你的新公錀的確代表你的動作,嘩! 這會累死人。

所以,我建議各位多生幾把金錀,並彼此互相簽章,如下圖:



amornose@gmail.com 這把金錀已被 hoamon@hoamon.info, hoamon@gmail.com ... 等金錀給簽章過了。所以如果我的主要使用金錀 HOamon@hoAmon.iNfo 不小心搞丟了,那麼我就用 AmOnroSe@Gmail.Com 的信箱寄信給那 200 個人,並告知我的公錀必須更換為 AmoNrosE@GmaiL.com 了,因為早在之前 amoONrose@gmail.com 已被 hoamon@hoamon.info 所確認過了,所以,那 200 個人可以很容易地相信我這個人已把 hoamon@hoamon.info 公錀更換成 amonrose@gmail.com 了。這就是買保險的意思。

最後,再提醒各位一次,私錀搞丟了,的確是很麻煩的一件事,請慎重保管呀!


五月 4, 2009

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» 如何使用 PGP (Linux/Mac/Windows 皆適用)來加解密及簽章驗證

最簡單的方式就是安裝 GnuPG, Firefox, FireGPG但為什麼要用 PGP 呢?

GnuPG: 是作業系統上的應用程式,其功能是以 PGP 公私錀作文章或檔案的加解密及簽章之用。其操作介面為命令列模式。
FireGPG: 是 Firefox 的外掛套件,它的功能是提供操作 GnuPG 程式的圖形介面。
Firefox: 不用說了吧! 現在還有人不知道 Firefox 是幹什麼的嗎?

上面程式都安裝好後,請打開 Firefox > 工具列 > 工具 > FireGPG > 金錀管理程式,如下圖:



我已經有一些金錀(有些是公錀,有些是私錀,但一律顯示公錀編號)了,綠色框是名稱及註釋、黑色框是 email 、黃色框是金錀編號、紅色框是信任程度。

如果是自己產生的金錀,則同時擁有公私錀,如果是別人給的金錀,則只有公錀。我們都是拿公錀來加密,然後用私錀來解密的,或是用私錀來簽章,再用公錀來驗證。

如果你還沒有金錀,請按下[New Key],然後填寫

  1. Name(最好是別人認得出你的名字)
  2. Email(必須吻合你使用的email,否則使用你公錀的人會誤會這把公錀的真實使用者是誰?)
  3. 註釋(可簡單說明你是誰)
  4. 密碼(這是用來鎖住私錀的,以防止你的私錀不小心落入別人手上,如果沒有這個密碼,別人也無法拿這把私錀來作解密的動作。同樣地,如果你忘了這個密碼,那麼你的公錀也就無用,且過去別人用該公錀加密的內容,你也解不開了,請慎重。)
  5. 建議點選金錀永遠不失效(Never Expire)。
再來就是按下[產生金錀]了。請耐心等候一段時間。並在此時胡亂開啟你的程式,亂打一些指令或文句,讓這把金錀不致於與別人的金錀重複。

成功產生後,要測試加解密的功能,可打開 Firefox > 工具列 > 工具 > FireGPG > 文字編輯器。

請在文字編輯器中,鍵入文句,完成後請點選加密,此時會詢問你用那把公錀,可以 Ctrl 鍵作複選,完成後,該文句就會變成一堆奇怪的亂碼,此亂碼只有你當初選定的那些公錀所對應的私錀才能作解密的動作。

再按下解密鈕, FireGPG 即會找尋該密文所對應的私錀作解密,如果你的私錀當初有設定密碼,此時,會先詢問你密碼為何! 正確鍵入後,它即為你解密。

接下來,測試作簽章及驗證,一樣打開 Firefox > 工具列 > 工具 > FireGPG > 文字編輯器。

請在文字編輯器中,鍵入文句,完成後請點選簽章,此時會詢問你用那把私錀(只能選定一把),完成後,該文句後面會出現一段奇怪的驗證碼,此驗證碼只有你當初選定私錀所對應的公錀才能作驗證的動作。

再按下驗證鈕, FireGPG 即會找尋該驗證碼所對應的公錀作驗證,驗證成功後,會顯示私錀的公開資訊(名稱、註釋、email、公錀編號)及簽章時間。

上面的工作都可正確使用後,接下來,就是把公錀傳給其他人。有二種方式,一種是[匯出至檔案],一種是[匯出至伺服器]。

匯出至檔案後,你可以透過第三方管道(像是隨身碟、email、放在blog 上)把公錀傳遞給其他人,這樣別人在收到公錀後檢查它的 fingerprint 或是公錀編號是否與你真實公錀相同,相同時就可確定這把公錀的確是你所屬的。但此法的缺點是不容易更新公錀內容(什麼,公錀不是一開始產生後,就一直用下去嗎? 為什麼會有變動。欲知詳請,請待下篇分解)。

另一種方式[匯出至伺服器],則是把公錀上傳至某一伺服器( FireGPG 的預設值是 subkeys.pgp.net ),然後跟其他人告知你的公錀編號及 fingerprint ,讓其他人到 subkeys.pgp.net 去下載。此法在使用上比較便利,省去了自行傳檔的功夫,一律要求其他人到公錀伺服器上抓取。

當你把公錀上傳至伺服器後,你就要廣為宣傳你的公錀編號、email,慎重一點的,還可以註明 fingerprint 。像我的處理方式就是放在 http://hoamon.blogspot.com/http://www.hoamon.info/#AboutMe 中,以及我在實體名片及信件簽名檔上都放了公錀編號、 email 及 fingerprint 。方便其他人比對公錀的真實性。但請注意一點,如果你是用網路形式來比對公錀編號的話,它會有一定程度的不可信,因為你不知道你的閘道器管理員有沒有動過手腳,最好的確認方式是與公錀主人面對面比對 *1,再次之是電話比對(已經有風險了),其他方法的風險就更高了。

註1: 如果你看過天龍特攻隊的話,或許你就會知道「面對面比對」也是有風險的,因為你不知道對方是不是「小白」。

當大家都擁有你的公錀時,就能寄送加密文本給你,如此一來,絕對可以保證,發文者與收文者之間沒有人可以破解此一加密文本。

不過,以上兩種匯出方法,所匯出的都只是公錀,如果想要匯出私錀來作備份的話,就必須打指令了,記得公錀不用作備份,它是可以從私錀中產生的。但其實也非常簡單,指令如下(Windows 用戶請到你的 GnuPG 安裝位置中打該指令):

# gpg -a --export-secret-keys {XXX} > private_key.txt

{XXX} 可以是 email 位置,也可以是公錀編號。匯出後,私錀內容就存在 private_key.txt 中。請慎重保管此檔。

又如果你想要把某個檔案作加密,也是得使用命令列來達到,如下(可用多把公錀加密):

# gpg -r {XXX} -r {YYY} -e {some_filename_you_want_to_encrypt}

解密則直接下

# gpg -d {some_fileame} > new_filename


十二月 16, 2008
» Notification Authentication error on Adium

有時候用Adium連接MSN時,常會出現 Notification Authentication error。
會出現這個問題的情況,通常都是我在使用3.5G連線時才會發生。
今天Google了一下,總算找到原因了。

解決辦法是,在 /etc/hosts 加入下面一行:
65.54.239.80 messenger.hotmail.com

再重開 Adium 就可以順利連線了。

十二月 15, 2008
» gettext-tools problem on Fink

If you used Fink on OSX, and got an error message like this:
Can’t resolve dependency “fink (>= 0.28.0)” for package “gettext-tools-0.14.5-4″ (no matching packages/versions found) Exiting with failure.

You should need to run “fink index -f” to forcibly refresh it, and then you should be able to selfupdate and get fink and gettext-tools updated.

References...

八月 19, 2008
» Make your MacBookPro Cooler

根據前一篇 Make your MacBook Cooler 提到的軟體 smcFanControl2 以及 CoolBook,這次拿了一台 Macbook Pro 來實測。這台 MBP 是 加到爆 的版本,也就是 C2D 2.6G/7k200/4G,能測試這台高貴的機器真是有幸呀。

燒機的方法是使用 Xbench,測試的過程裡除了全速不斷的一直跑 Xbench 以外,並且將 CoolBook 的 CPU loading 也調到最高 10。接著把 Applications 目錄裡所有的程式通通開啟,包含了 iLife08, iwork08, Aperture2, Office08, Adobe CS3, Parallels Desktop 等各式各樣重量級軟體,約略開啟了總共五十多個應用程式。最後... 再連續 “同時播放” 三個 FullHD 畫質的 mpg 影片檔。

想當然爾,系統是整個 Lag 到不行了,我把 CPU 跟 GPU 風扇轉速固定在 2000rpm(最低轉速),讓機器狂燒十幾分鐘,CPU 溫度最高達到八十度C,但是系統卻非常的穩定沒有當機,也沒有任何一個應用程式 Crash 掉,最後實測出這顆 C2D T9500 的極限值:2600Mhz@0.9875v。下面的圖示是使用 CoolBook 調整到最低電壓而且最穩定的狀況,CPU Idle 的待機溫度居然只有 28度C (室溫大約 24度C),只能說 45奈米的 CPU 真不是蓋的。

八月 1, 2008
» Nokia N82入手!

之前對iPhone 3G流了很久的口水,但因為AT&T在Boston及Cambridge地區收訊實在糟得不得了,所以昨天終於下定決心放棄iPhone,回頭找尋Nokia手機,如果必要再買iPod Touch就好。

Nokia一直是我最愛用的手機品牌,大學時用過一年多別牌的手機(BxxQ),慘痛的經驗讓我更堅定非Nokia手機不用的執念。(Well, Apple是個例外 哈哈:D)去年Nokia N95剛出來時,500萬畫素的照相功能加上內建GPS、Wifi的S60 Smartphone平台,讓我非常心動,可惜那時要去當兵,只能繼續忍著用沒相機的陽春手機。過了一年,終於退伍可以認真考慮入手Nokia N95,但這時竟然被我看到了Mobile01的N82敗家分享

Nokia N82在功能性方面和N95相當,甚至還有N95沒有的氙氣閃光燈和AGPS,更棒的是N82是直立機,沒有用久就容易出問題的滑蓋!(N95還是雙滑蓋,意思就是滑蓋壞掉的機率是單滑蓋的兩倍..XD)最神奇的是,N82竟然還比N95便宜!!!唯一可以挑剔一下的就只有2.4吋螢幕稍微小了一點,除此之外這N82簡直就是夢幻級的超級手機。

既然所有條件都符合,此時不敗更待何時,敗家就是要靠衝動。於是,在我昨天早上決定要買後,到了晚上,包好膜的全新N82黑魂版就躺在我的書桌上啦 :-D (敗家行動力滿分)

Nokia現在對於Mac蠻友善的,官網就有提供許多Mac上用的軟體。iSync Plugin裝完後就能用iSync同步通訊錄和行事曆的資料;Nokia Multimedia Transfer可以同步iTunes的音樂、影片,還有iPhoto裡的相片,雖然不像iPod或iPhone直接被iTunes支援,但透過Nokia的程式也還是能輕易的完成Mac和手機的資料交換。

目前我還沒辦法在Mac上做的只剩下Nokia Map Loader。還好這只是用來下載地圖資料,第一次把常去的地圖先下載完後,平常就很少會需要開它了,所以不算是太麻煩的問題。

另外順便列出一些我這兩天找到的S60好軟體,如果有用S60的朋友們知道什麼好軟體也歡迎推薦:

  1. Opera Mobile 內建的browser實在太爛了,一定要換一個的啊。Opera Mobile我在N82上跑有時會自己crash,原因還不明。後來發現Opera Mini就穩多了,目前我是兩個都裝著用。
  2. Gmail Java版client 這個版本可以連任何用Google Apps架起來的私人版gmail,要直接用手機連m.google.com/a才看得到。用這個看mail比瀏覽器方便多了。
  3. Google Maps for S60(支援GPS喔!)
  4. Skype mobile 最近Skype官方出了S60的client(以往S60都得透過fring轉接,效果並不好),目前官網沒寫支援N82,但我抓N95的回來安裝也是能用。
  5. 來電過濾(Call filter) 直接從N82的下載功能抓到的
  6. Sport Tracker 這玩意超棒的,裝上後只要帶著手機去慢跑,就能自動紀錄走過的路徑、速度、距離,如果有每天運動的習慣就能看到每天的統計圖,可以讓單純的慢跑也變得比較有趣一點。
  7. CorePlayer 超級厲害的萬用media player,幾乎所有格式都能撥。

六月 29, 2008
» SmartSleep for Mac

Mac預設的睡眠是指暫時不用電腦時,讓電腦進入一個比較不耗電的狀態,記憶體的內容會保留著,並且還會把記憶體整個寫到硬碟中,這樣即使電池都用光了還是能從硬碟中的sleepimage回復到當時的狀態。Apple會這樣設計我猜是想讓使用者完全不需要用到「關機」,不用電腦就進入睡眠,也不用管電池有沒有電,反正最後都還是能回復過來。 但我比較偏好將兩種睡眠模式(以下分別稱為sleep和hibernate。前者是會耗電保留記憶體內容:後者將記憶體寫到硬碟,完全不耗電)分開使用。因為Macbook本來就常常會帶來帶去,如果只是要短暫移動到另一個地方,我喜歡只用sleep,這樣螢幕一蓋上就能馬上拿著走。如果知道會有一長段時間不再開電腦,我就會用hibernate,沒必要同時保持在sleep下耗電。 如果用預設的睡眠(同時做sleep和hibernate),其實要等白色電源燈開始呼吸時,也就是sleepimage已經寫入硬碟後才是真正進入睡眠,這時也才能移動機器。(在硬碟寫入時移動機器很容易把硬碟搞壞喔) 現在Macbook標準配備是2GB...

[MORE...]

三月 21, 2008
» New York Times首頁的Apple廣告

現在The New York Times的首頁上有個非常有趣的Apple新廣告。

同樣是Mac與PC的對話,但這次卻是在NYTimes首頁上佔掉了上方一整排的banner和頭條右方三分之一寬的空間,更有趣的是這兩塊空間是互相連結的!
廣告大意是上方banner一開始顯示的是CNET.com對Windows Vista的評論:

“Vista… one of the biggest blunders in technology” — CNET.com

於是PC說:「啊!又是個說Vista壞話的評論。應該要來更新一下…。」就在PC切換了「立即更新」的開關後,又出現了一個壞評論:

“It’s time for a Vista do-over” — PC Magazine

於是PC又走回去再次切換更新開關。這次來了個正面評價,結果沒想到是…

“Mac OS X Leopard: A perfect 10″ — InfoWorld

這個廣告的內容,還有利用兩個相互連結的flash都十分有創意,更厲害的是Apple竟然能說服NYTimes把這廣告擺上他們的首頁。(我想這恐怕不是砸大錢就能做到的) 只能說Apple的行銷功力實在是太厲害了啊!

三月 9, 2008
» Mac OS X下的Ramdisk解決方案

我常常在注意我電腦的資源使用情況,尤其是CPU和RAM的使用狀況,因為這兩項資源跟系統流暢度有非常密切的關係。最近觀察我Macbook(2.0Ghz Core 2 Duo, 2GB RAM)平常的情況,雖然平常大概會同時開13個以上的應用程式,但CPU的兩個核心平均負載大概都在20~30%以下,而RAM更是有700MB的剩餘空間。

總而言之,我的電腦太快了,RAM太多了。

嫌CPU一直閒著沒事做的話,有很多類似Seti@home之類的耗電程式可以隨時讓CPU 100%運轉。嫌RAM太多的話,可以把一部分的RAM挪出來當作一般磁碟使用,這種磁碟則稱為Ramdisk。

在Mac OS X下要做Ramdisk方法很多種,在此大概做個簡單介紹。

方法 1: 直接在Terminal下指令。(超硬派作法,geeks only)

Mac的terminal下可以做到很多神奇的事,甚至像是建立ramdisk這種程式都有提供。我想會用這方法的人是少之又少,我就不解說了。詳細指令可參考Create a RAM Disk in Mac OS X這篇文章。

方法 2: Espérance DV

這是個有點古老的Ramdisk軟體,但功能還頗完整。可以自動儲存和恢復Ramdisk的內容,也能設定把Safari Cache/Icons和xcode編譯的暫存區放到Ramdisk中。但我在Leopard中,自動儲存和恢復的功能一直沒辦法正常運作,另外它內部設定的Safari資料夾也是舊的。總之這軟體在Leopard中已經殘廢一半,而且沒有持續更新傾向..。

方法 3: Ram Disk Utility PRO

這是難得一見由台灣人開發的Mac軟體。功能強大,可以自由設定要同步進Ramdisk的目錄,空間快不夠還會有警告。雖然這軟體蠻完整的,但有幾個小地方我不太喜歡,導致我用過一次以後就不想開了XD

  • 每同步一個目錄就要建一個Ramdisk,而且Ramdisk圖示還不能隱藏,所以只要同步目錄一多就會看到一大堆Ramdisk volume…。
  • 它是獨立執行的應用程式,一login就要一直開著,在dock和alt-tab中都會佔掉一個位子。
  • 它是要註冊的shareware….

說來說去,上面三個方法都各有缺點。我理想中的解決方案是這樣的:

  • 像Espérance DV一樣是Preferences Pane裡面的元件,設定完就能關掉。
  • 同步的目錄可以自由設定,且用symbolic link連結至Ramdisk內就好。
  • Ramdisk圖示要能在桌面和Finder中隱藏。
  • 登入時自動建立Ramdisk,同步已設定的目錄。
  • open source software

剛好我最近空閒時間蠻多的,於是就決定自己動手比較快。可以順便一邊學Objective C和Cocoa,還能一邊解決這個小困擾,怎麼算都划得來。

因為建立Ramdisk已經有Espérance DV能做了,所以本來我只打算寫ramdisk內的目錄同步部份,就把這程式叫做RamdiskSync。沒想到後來寫一寫欲罷不能,就把它變成一個獨立的Ramdisk建立和設定工具了XD

RamdiskSync的詳細介紹就留待下篇再說了。

» iPhone SDK

Apple最近終於公開了iPhone SDK,除了提供廣大程式設計師在iPhone上開發程式外,還順便提出了一個讓開發人員能直接在iTunes Stores販賣作品的business model。

在iPhone程式開發上,iPhone開發模式跟現有的Mac OS X應用程式沒兩樣。從下面的系統架構圖可以看出來,第一層一樣是Objective C + Cocoa(iPhone上叫Cocoa Touch, 多支援一些iPhone特有的功能,像是multi-touch、加速感應器)。中間有Media Layer提供影音、3D動畫(OpenGL ES)、繪圖的API,以及Core Services提供較為高階的網路連結、資料庫(SQLite),比較特別的是這層還提供了iPhone透過wifi及手機基地台做的地理定位資訊(Core Location)。最底層是提供低階OS功能的Core OS,包括檔案存取、Threading..等等。

整個開發平台對於熟悉Mac OS X的開發人員來講其實非常容易上手,EA甚至在兩個星期內就在iPhone做了Spore的簡易移植,SEGA也移植了Super Monkey Ball(並且是靠加速度感測器來操作的!),從影片demo的效果看起來實在非常驚人。流暢的3D動畫和OpenAL提供的立體音效,再加上內建的3軸加速度感應器和multi-touch screen,即使iPhone不拿來打電話,以後也必定是一個可期待的攜帶型遊戲平台。

除了提出開發平台外,Apple還順勢提出讓iPhone Developer能販賣作品的平台,一方面能把SDK賣給想靠開發iPhone程式賺錢的程式設計師,另一方面也讓這些程式設計師能夠靠販賣iPhone程式獲取收益(跟Apple 7/3拆帳,每個月領一次),實在是很聰明的策略。

iPhone一旦多了官方SDK後,可預期的是iPhone上的native app會如雨後春筍般大量出現,另外也可能吸引到其他Smartphone平台的開發者投入iPhone及Mac平台的開發。(在demo中,從EPOCRATES來的speaker說:「這些動畫效果都是由內建的API自動提供的,我們沒有多寫任何一行程式碼來做這些事。但它們真的讓程式看起來很酷。」)

老實說,看了這些demo後,我也想去敗一台iPhone了…。

十二月 29, 2007
» File types of OSX-screen-capture

每次重裝 OSX 後想要改預設截圖的格式時,都會忘記指令是什麼,
這次 Google 到了,乾脆貼上來做紀錄,以後就不用在到處找了。

defaults write com.apple.screencapture type XXX
XXX 可以是 pdf jpg gif png,這樣預設截圖時就會採用該格式,
不然還有這個軟體 shotChoice 可以自動設定截圖格式 。

準備要從 Tiger 重新安裝至 Leopard 了,希望一切無痛順利!

十二月 21, 2007
» Ubuntu Desktop 7.10 in Parallels Desktop 3.0

Ubuntu Desktop 7.10 在 Parallels Desktop 3.0 裝不起來,
途中會因為顯示問題,而導致無法順利進入安裝畫面。

錯誤訊息是:“The screen has reset 6 times over the
past 90 seconds, something is probably wrong.
Waiting 2 minutes to try again on display :0″

解決的方法是,在開機畫面按下 F6 以 Single 模式進入安裝,
接著編輯 /etc/X11/xorg.conf 更改 Display SubSection。

SubSection “Display”
Modes “1024×768”
EndSubSection

這樣就能順利安裝了! (這裡 有 Parallels 官網的解決方法)

十一月 30, 2007
» Free US iTunes Account (download album art)

最近看到一篇『免費”申請”US iTunes Account (下載Album Art)』,
可用來下載 Album Art,照著文章順序來做,真的可行!

雖然我的 Album Art 都是拿原版 CD 接 HP PSC 1510 掃描出來的,
這個 Free Account (to download album art) 也還是蠻好用的。

A Feedjack powered Planet
A Django site.