PageRank



轉移公告

計劃把 http://blog.hoamon.info/ 文章全部轉移至 http://www.hoamon.info/blog/ 這裡,而本 Blogger 站台的文章近 500 篇,我預計在 2014-12-31 前移轉完畢,完成後 http://blog.hoamon.info/ 將只作代轉服務,一律把舊連結如 http://blog.hoamon.info/index.html 轉成 http://www.hoamon.info/blog/index.html ,敬請舊雨新知互相走告。

新文章只發佈在 http://www.hoamon.info/blog/ 。

何岳峰 敬上

2007年3月23日 星期五

Pygments:程式碼變色的另一種方法

如果你喜歡 Python 多於 VIM 的話,那麼你還有 Pygments 可以用。感謝 Tib 提供的 style 檔。

首先請先安裝 pygments ,請用

# sudo easy_install Pygments-0.7.1-py2.4.egg

這樣你就多了一個 pygmentize 指令了。如果你想要把 pymail.py 變顏色,請下

# pygmentize -f html -O encoding=utf-8,linenos=1 -l python -o pymail.html pymail.py

所得到的 pymail.html 檔則是把 pymail.py 程式碼中的關鍵字作分類的動作,這樣還沒有上顏色喔~要上顏色的作法則是

# pygmentize -f html -S colorful -a div.highlight

這樣則會產生一個 css 語法的程式碼。如果你不喜歡 colorful ,你可以看看你的 /yourpath/Pygments-0.7.1-py2.4.egg/pygments/styles 資料夾下有那些 .py ,這些都可以用。如果還是不喜歡的話,可以參考一下 tib 的 style 檔,把它放到 /yourpath/Pygments- 0.7.1-py2.4.egg/pygments/styles 下,檔名則要命名為「 Class Name 去掉 Style 後全部小寫的英文字」。這樣你就可以用

# pygmentize -f html -S defaultsbt -a div.highlight

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/python
import smtplib

def mkmail(toaddr, name, pwk, history):
fromaddr = 'powerkey@cams.wra.gov.tw'
subject = 'PowerKey of CAMS'
# Add the From: and To: headers at the start!
msg = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n"
% (fromaddr, toaddr, subject))
msg += """**本信 由系統自動發送,請勿回覆本信**
=====================================

%s 先生/小姐:
感謝你的使用。密碼如下方連結:
http://www/PowerKey/showkey.html?powerkey=%s

密碼信寄送的歷史紀錄:
%s
""" % (name[0:3], pwk, history)

server = smtplib.SMTP('localhost')
server.set_debuglevel(0)
server.sendmail(fromaddr, toaddr, msg)
server.quit()

mkmail('hoamon@hoamon.info', '何岳峰', '11e4', 'history')

2007年3月22日 星期四

可怕的 VIM

每次在 blogger 上發表帶有程式碼的文章時,都感到十分麻煩。自己要作 space 轉 dash 的動作,還有變顏色。

但沒想到 VIM 就有一個指令可以讓文章變成網頁格式。

請把你編輯的文章調成你想要發佈的樣子,如行號顯示、顏色區別等,然後用 :TOhtml 指令即可。

下面就是一個 Python 程式碼轉出來的網頁結果:

 1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3 import smtplib
4
5 def mkmail(toaddr, name, pwk, history):
6 fromaddr = 'powerkey@test.com.tw'
7 subject = 'PowerKey'
8 # Add the From: and To: headers at the start!
9 msg = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n"
10 % (fromaddr, toaddr, subject))
11 msg += """**本信由系統自動發送,請勿回覆本信**
12 =====================================
13
14 %s 先生/小姐:
15 感謝你的使用。密碼如下方連結:
16 http://www/PowerKey/showkey.html?powerkey=%s
17
18 密碼信寄送的歷史紀錄:
19 %s
20 """ % (name[0:3], pwk, history)
21
22 server = smtplib.SMTP('localhost')
23 server.set_debuglevel(0)
24 server.sendmail(fromaddr, toaddr, msg)
25 server.quit()
26
27 mkmail('homon%2hoamoin.ino', '何岳峰', '11e4', 'history')

2007年3月21日 星期三

Python及PHP的公私鑰加密方法

昨天費了好大的一番勁,終於可以在 Python 中作公私鑰的處理,忙完了 Python 這邊,再往 PHP 去作,居然只花30分鐘。這最大的原因我想是出在一開始我完全不知道加解密該如何處理,所以我有些時間是花在私錀加解密上,而且 Python 這邊的模組還真是多,我試玩了 5 個,才找到我要的東西。分別是:
  1. python-crypto - 這個模組是基本模組,使用的函式太複雜了,不會用。
  2. ezPyCrypto - 這個簡單些了,但他作出來的公私鑰無法與其他程式相容(這一點,我也不知道為什麼)。
  3. SSLCrypto - 與 ezPyCrypto 是相同作者,而這個模組的效率比 ezPyCrypto 好。但一樣不能與其他程式相容。
  4. pyopenssl - 作者說他不欣賞 M2Crypto 與 SWIG 介接的方式,是的,我也不欣賞。但 pyopenssl 似乎是用 https 通訊上的,而我找不到加解密的用法。
  5. M2Crypto - 終於讓我找到了。但它有一大缺點。它底層是用 SWIG 來與 OpenSSL 介接的,而 SWIG 程式在 Windows 上非常難裝。
M2Crypto 在 ubunto 6.06.01 及 fedora core 5 中都有了。只是我還是用 PyPi 上的 0.17 版。而安裝方式是:
  • 先安裝 python2.4-pyrex 、 libssl-dev 、 swig 。
  • 到 m2crypto 資料夾執行 sudo python setup.py install
接下來,測試 M2Crypto 模組,因為我希望這個模組所用的公私鑰可與其他程式互動,所以用 openssl 來產生公私鑰。產生方法:

# openssl genrsa -out rsaprivate.pem 2048
# openssl rsa -in rsaprivate.pem -out rsapublic.pem -pubout -outform PEM

這樣我們就有兩支鑰匙了。接下我們用 Python with 私鑰 加密。

from M2Crypto import RSA

def test_encrypt(padding):
----msg="The magic words are squeamish ossifrage."
----priv=RSA.load_key('rsaprivate.pem')
----padding=eval('RSA.'+padding)
----ctxt=priv.private_encrypt(msg, padding)
----file = open(' c.txt', 'wb')
----file.write(ctxt)

if __name__ == '__main__':
----test_encrypt('pkcs1_padding')

我們得到了 c.txt 這個加密檔。好了,接下來,要到 Windows 去冒險了。

請先安裝 openssl.exe ,版本須大於 0.9.8 喔~
接下來設定 php.ini ,把 ;extension=openssl.dll 的註解拿掉,重新啟動 Apache2 。這樣你的 PHP 就多了 openssl 相關函式庫了。

接下來執行下面的 PHP 程式,它會用公鑰來解密,最後會得到「String decrypt : The magic words are squeamish ossifrage.」。恭喜你啦。公私鑰加解密就這麼簡單。

<?php
$fp=fopen ("rsapublic.pem","r");
$pub_key=fread($fp,8192);
fclose($fp);
$fp=fopen ("c.txt","r");
$crypttext=fread($fp,8192);
fclose($fp);
openssl_get_publickey($pub_key);
openssl_public_decrypt($crypttext,$newsource,$pub_key);
echo "String decrypt : $newsource\n";
?>

2007年3月17日 星期六

換書 or 賣書


錯買了一本書「ajax經典範例集」。內容盡是 AJAX.net 及 C# 程式範例。怪我網路購物前沒作好分析工作。翻了兩、三頁就看不下去了。誠徵有心人與我交換此書,如果你有博碩的 Ajax 與 Google Map API 入門實作 ,歡迎你與我交換,或者你願意用 200 元跟我買這本沒看幾頁的新書。

交易方式: 埔里面交。
有心人請寄 email 給我。

2007年3月15日 星期四

CMCLass: 派送問題(1)

受強烈地震之災,USA--A區有 12 軍事基地 毀損,被迫需搬遷至 B 區 12 軍事基地。搬遷成本與軍事基地間搬遷直線距離成正比。

兩區的平面座標如下:
A區 X 座標 Y 座標
B區 X 座標 Y 座標
1 1130 863
1 1031 1206
2 1705 1283
2 1046 1000
3 1326 1736
3 1803 1809
4 975 825
4 1588 1821
5 1286 807
5 1300 1482
6 909 1143
6 1939 1228
7 1579 1608
7 1147 1703
8 1162 1118
8 1319 1254
9 876 1573
9 1300 1182
10 1198 1748
10 1817 1269
11 801 1134
11 1945 1605
12 956 1226
12 1349 1488

非常典型的 lp 問題,方程式也非常好設定。首先我們要列出這 a[12] 到 b[12] 的所有相對距離,共有 12 x 12 = 144 個,這也表示決策變數 Xij 有144個,當 Xij = 1 時,表示由 i 基地搬遷至 j 基地,當 Xij = 0 時,表示「沒事發生」。

所以目標函數就是所有相對距離 x 決策變數的總和。

接下來設定 25 條方程式:

all Xij >= 0。

sum j=1~12 Xij = 1 對所有的 i 成立。(實在不知道該如何展現數學方程式,只好用口語的方式)

sum i=1~12 Xij = 1 對所有的 j 成立。(實在不知道該如何展現數學方程式,只好用口語的方式)

這樣就有 25 條方程式了。跑一下 lp 程式就可以得到答案。

那麼 Python 如何跑 lp 程式呢!首先請裝 GLPK 函數庫,這是由 gnu 組織開發的 linear programming toolkit ,功能還可以,但如果決策變數太多,有可能會跑不完。

理論上,你裝了 GLPK 後,就可以執行 lp 計算,但是直接用 GLPK 的話,必須用 mathprog 格式餵資料給 GLPK ,而這個格式太複雜了,所以我先去載入一個輸出 mathprog 格式的 Python 類別 pulp ,透過這個類別幫我控制 GLPK 函式庫。

以下是我的 Python 程式:

def caldest(From, To):
----from math import sqrt
----dest = []

----for start in From:
--------subdest = []
--------for end in To:
------------subdest.append(round(sqrt((start[0] - end[0])**2 + (start[1] - end[1])**2), 0))
--------dest.append(subdest)

----return dest

def optima(coef):
----from pulp import *
----(Dest, var, obj) = (coef, [], 0)
----prob = LpProblem("dest", LpMinimize)

----for i in xrange(len(Dest)):
--------var.append([])
--------for j in xrange(len(Dest[0])):
------------(str_i, str_j) = ("%03d" % (i + 1), "%03d" % (j + 1))
------------var[i].append(LpVariable("var"+str_i+'_'+str_j, 0, 1, LpInteger))
------------obj += Dest[i][j] * var[i][j]

----prob += obj, 'OBJ.'

----for i in xrange(len(Dest)):
--------st = 0
--------for j in xrange(len(Dest[0])):
------------st += var[i][j]
--------prob += st == 1

----for j in xrange(len(Dest[0])):
--------st = 0
--------for i in xrange(len(Dest)):
------------st += var[i][j]
--------prob += st == 1

----#prob.writeLP("dest.lp")
----prob.solve()

----print "Status:", LpStatus[prob.status]

----for v in prob.variables():
--------if v.varValue >= 1:
------------print v.name[3:6] + ' => ' + v.name[7:10]

----print "objective=", value(prob.objective)

if __name__ == '__main__':
----A = [[1130, 863],
--------[1705, 1283],
--------[1326, 1736],
--------[975, 825],
--------[1286, 807],
--------[909, 1143],
--------[1579, 1608],
--------[1162, 1118],
--------[876, 1573],
--------[1198, 1748],
--------[801, 1134],
--------[956, 1226]]

----B = [[1031, 1206],
--------[1046, 1000],
--------[1803, 1809],
--------[1588, 1821],
--------[1300, 1482],
--------[1939, 1228],
--------[1147, 1703],
--------[1319, 1254],
--------[1300, 1182],
--------[1817, 1269],
--------[1945, 1605],
--------[1349, 1488]]

----dest = caldest(A, B)
----optima(dest)

執行後,得到搬遷方式為:

001 => 009
002 => 010
003 => 003
004 => 002
005 => 006
006 => 001
007 => 011
008 => 008
009 => 007
010 => 004
011 => 005
012 => 012

最小路徑為 4412.0

2007年3月10日 星期六

JavaScript ≠ Java

回應阿西摩的分享誌: JavaScript ≠ Java

題目是對了。javascript的確不等於java,就像java不等於javascript一樣。

但java比javascript高級??這就有問題了。這就像是拿xx比芭樂一樣。

你會拿java applet來作表單,然後在裡面作資料驗證嗎?是有這個可能(需加密的登入表單,如網路郵局的表單),但全世界有99%(這是不精確的形容詞,表示很多而已)的程式師是拿javascript來作。

javascript可以拿作寫桌面程式嗎?現在可能還沒有人拿它直接來作整個桌面程式,只有拿來作桌面程式中的一個小元件,像是檢查使用者輸入指令(javascript sheel),但將來網頁應用程式當道時,又會有多少桌面程式留下來?java跨平台又如何,一堆動態語言(python、perl、ruby、php)都跨平台,連javascript也跨平台(請不要拿Jscript來說,那是微軟自己玩爽的),不只是活在瀏覽器,也可以活在伺服端。

阿西摩只是一個良好的 java 程設師,不是一個良好的 javascript 程設師,因此他的立場不中立。而我不是一個良好的 javascript 程設師,但我卻不妄言 javascript 劣於 java ,所以這應是包含態度的問題。

Use Djange Project Step by Step

當我為這個主題寫第二篇文章時,發現這類型的文章並不適合用 blog 形式展現,文章與文章之間鍵結能力太差了,而且要寫的豐富、深入有時候還需要過客的協助。

所以我把整篇文章都丟到 Trac 系統( http://ptrac.hoamon.info/wiki/UseDjango ),TOC:

Use Djange Project Step by Step
  1. 安裝Django
  2. 使用models建立資料表
  3. 建立 admin 頁面
  4. ……
本來只是想拿 Trac 系統練習多人的軟體專案管理,但用來作自己的文章/手冊管理也不錯喔~
Related Posts Plugin for WordPress, Blogger...