之å‰æ到 py2exe å¯ä»¥å»ºç«‹å–®ä¸€çš„ exe imageï¼Œä»Šå¤©é¦¬ä¸Šä¾†æ¸¬è©¦äº†ä¸€ä¸‹ï¼Œæžœç„¶å¾ˆå¥½ç”¨ã€‚é †ä¾¿é‚„å¾ž sample 裡å¸åˆ°æŠŠ image building action 嵌到原指令稿裡的å°æŠ€å·§ï¼š
def main():
"""
Script invokation logic.
"""
if len(sys.argv) > 1 and sys.argv[1] == "py2exe":
setup_py2exe()
sys.exit()
def setup_py2exe():
from distutils.core import setup
import py2exe
setup(
name = "programname",
description = "Program Description",
author = "Yung-Yu Chen",
author_email = "you@guess",
console = [ __file__ ],
version = __version__,
options = { "py2exe": {"compressed" : 1,
"optimize" : 2,
"ascii" : 1,
"bundle_files": 1 } },
zipfile = None
)
if __name__ == '__name__':
main()
ä¸éŽ 500 行指令稿作出來的一個 win32 exe image,åªç”¨åˆ°äº†ä¸€äº› Numeric 函å¼å’Œå°‘數的標準模組,就包出了 2.x MB ("compressed":1 !!),æ¯æ¬¡éƒ½è¦è¼‰å…¥å¥½ä¹… :)
為了一段解è¯å°æ‡‰æª”的程å¼ï¼Œé‚„想了這樣å的碼:
iwant = [ origstring ]
for splitter in [ ':', '=', ',', ';', None ]:
newstrings = []
for substring in iwant:
newstrings.extend( substring.split(splitter) )
iwant = newstrings
éœ€è¦ 6 行,或許有 60 分了å§ï¼›æ„Ÿè¦ºä¸Šæ‡‰è©²é‚„有更çŸçš„寫法,把後四行代æ›æˆä¸€è¡Œ (in Python 2.3)。re 說ä¸å®šå¯ä»¥ç”¨ä¸€è¡Œè§£æ±º (倒是還沒時間去想)。
Fun.
Posted by yungyuc
at
19:44,
0 comment,
0 trackback.
py2exe 從 0.6.1 開始å¯ä»¥å»ºç«‹ "almost standalone" çš„ executive image 了。
想我今天還在苦惱 py2exe 0.5.4 弄出來的亂糟糟目錄... Open Source Rules。
Posted by yungyuc
at
21:08,
0 comment,
0 trackback.
OK, 一段完æˆäº†ä¹‹å¾Œç¬¬äºŒæ®µå°±ä¸æœƒå¤ªé›£äº†ã€‚剛剛用 ssl firefox multiple commonName 當關éµå—去找,便看到了這一篇。commonName 的寫法也列在裡é¢ã€‚
早看到就好了 :) æ ¹æ“šå…¶ä¸çš„ Interoperability Test,我é¸ç”¨ 1. Way: SubjectAltName Only 這個方法;這是 x509v3 çš„ä¸€é … extension。先複製一份 openssl.cnf,在 [v3_req] å€å¡Šè£¡åŠ 上 subjectAltName 的定義:
subjectAltName = DNS:domain1.com, DNS:domain2.com
然後打開 [req] å€å¡Šè£¡çš„
req_extensions = v3_req
最後用這個 openssl.cnf 產生 requestã€ç°½æ ¸ certificate å³å¯ï¼›æˆ‘把 request/sign çš„éŽç¨‹å¯«æˆä¸€å€‹å¦‚下的 Makefile:
OWNER = yungyuc.yungyuc
default:
echo "select one"
req:
openssl req -new \
-config openssl.cnf -text \
-key key.pem -out req.pem
reqsubj:
openssl req -noout -subject -in req.pem
reqtext:
openssl req -noout -text -in req.pem
crt:
openssl x509 \
-req -days 3650 -sha1 \
-extfile openssl.cnf -extensions v3_req \
-CA cacert.pem \
-CAkey cakey.pem \
-in req.pem -out crt.pem
chown $(OWNER) crt.pem
crtsubj:
openssl x509 -noout -subject -in crt.pem
crttext:
openssl x509 -noout -text -in crt.pem
這樣ä¸ç®¡æ˜¯ Firefox, Mozilla 還是 IE,都å¯ä»¥æ£ç¢ºæ”¯æ´å¤š domain name çš„ certificate 了。
Posted by yungyuc
at
22:21,
0 comment,
0 trackback.
這真是一件艱辛åˆå›°è‹¦çš„工作。
大部分架 WWW 的人都åªæœ‰ä¸€å€‹ IP å§ï¼Ÿç„¡è«–是å¦å¦‚æ¤ï¼Œå› 為 apache çš„ NameVirtualHost éžå¸¸å¥½ç”¨çš„關係,想必大家都喜æ¡ç”¨ name-based virtual hosting,而 IP-based virtual hosting 能å…則å…;弄 virtual hosting é‚„è¦å‹• /etc/network/interfaces 畢竟是麻煩。
ä¸éŽå¼„ TLS/SSL (https) 的時候 apache name-based virtual hosting 就傷腦ç‹äº†ï¼›å› 為 TLS/SSL è¦æ ¼å’Œå¯¦ä½œä¸Šçš„é™åˆ¶ï¼Œä¸€å€‹ IP å°±åªèƒ½æœ‰ä¸€å€‹ certificate,所以 named-based virtual hosting åªèƒ½ç‚ºä¸€å€‹ virtual host æ供完整 SSL 能力。
åš´æ ¼ä¾†è¬›å…¶å®ƒæ‰€æœ‰çš„ virtual host 也å¯ä»¥ä½¿ç”¨ SSL,但會共用相åŒçš„ certificateï¼Œå› æ¤åªæœ‰ä¸€å€‹ virtual host èƒ½å¤ æœ‰æ£ç¢ºçš„ domain name (commonName/CN) å°æ‡‰ã€‚
ç‚ºäº†ç ”ç©¶å‡ºè§£æ±ºä¹‹é“,我實在花了太多時間,以致於犬太郎都生氣了。我åƒè€ƒçš„主è¦è³‡è¨Šä¾†æºæ˜¯ openssl-users@openssl.org 裡的 Re: How to include multiple common names in a single SSL certificate? å’Œ x509 (1), req (1)。
解法的é‡é»žåœ¨æ–¼è®“ certificate 列出多個 commonName,也就是 domain name。我們å¯ä»¥ä¿®æ”¹ openssl.conf,讓 openssl req 執行時å–得多é‡çš„ commonName 資訊,或者是直接用 -subj 指定 Subject line:
$ openssl req -new \
-key key.pem -out req.pem \
-subj "/C=TW/ST=Taiwan/O=SEETY/CN=domain1.org/CN=domain2.org"
-subj 是比較方便的作法 (note: openssl.conf 倒還沒有改å°éŽ)。
Request 產生出來之後,å†ç”¨ root/CA cert/key é€²è¡Œç°½æ ¸ï¼Œç”¢ç”Ÿ certificate å³å¯ï¼š
$ openssl x509 \
-req -days 3650 -sha1 -extensions v3_req \
-CA cacert.pem \
-CAkey cakey.pem \
-in req.pem -out crt.pem \
-CAcreateserial
Multiply CN é€™å€‹æ–¹æ³•å”¯ä¸€çš„ç¼ºé»žæ˜¯å®ƒå° Firefox/Mozilla ç„¡æ•ˆï¼Œä½†å° Internet Explorer 是有效的 (å¯ä¸å¯ä»¥å› æ¤èªª IE ä¸å®‰å…¨å‘¢ï¼Ÿ)。ä¸éŽä½œç‚ºä¸€å€‹ workaround,在 https 跳出 certificate verification å°è©±æ¡†çš„æ™‚å€™å¤šæŒ‰å¹¾å€‹æ»‘é¼ ï¼Œé‚„åœ¨æˆ‘å¯ä»¥æŽ¥å—的範åœä¹‹å…§ã€‚
P.S. æŸ¥æ‰¾è³‡æ–™çš„æ™‚å€™çœ‹åˆ°äº†é€™å€‹ï¼Œè »æœ‰ç”¨çš„æ¨£å。
Posted by yungyuc
at
19:00,
0 comment,
0 trackback.
有感å°ç™¼ã€‚
是è¦ç¡è¦ºçš„æ™‚é–“äº†ï¼Œä½†å› ç‚ºç¨®ç¨®åŽŸå› ï¼Œé‚„ä¸æ˜¯é‚£éº¼æƒ³ç¡è¦ºã€‚
見誰的專利?誰的ä¿è·ï¼Ÿèª°çš„霸權?一文後想起å‰ä¸€é™£å看éŽçš„著作權ä¿è·äº†èª°ï¼Ÿä¸€æ›¸ã€‚書ä¸çš„ç¬¬äºŒç« ã€Œé¦¬å…‹å溫與文å¸è‘—作權的æ·å²ã€ä»¤æˆ‘å°è±¡æ·±åˆ»ï¼›è‹¥è¦ä»¥ä¸€å¥è©±ä¾†ç¸½çµé€™ä¸€æ®µçš„心得,應是「美國藉由盜版來å°æŠ—æ陸文化強權,讓文化產æ¥å¾—以æˆé•·ã€ã€‚
從é“德的角度å¯ä»¥å°æ™ºæ…§è²¡ç”¢ä¾µæ¬Šçš„行為作出æ£ç¢ºçš„判斷,但在法律上å»å¯èƒ½å¾ˆé›£ï¼›é€™é …æ¬Šåˆ©æœ¬èº«å°±å¾ˆé›£èªªæ˜¯ä¸€é …ã€Œå¤©ç„¶æ¬Šåˆ©ã€ï¼Œå»æ¯”較åå‘一種具目的性的人為è¦å‰‡ã€‚脫離éŽåŽ»çš„文化商æ¥è¡Œç‚ºæ¡†æž¶ä¹‹å¤–的文化消費/資訊交æ›å¿…然影響金錢的æµå‘,然而在資訊科技繼續擴展人際交æµåœˆçš„ç¾åœ¨èˆ‡æœªä¾†ï¼Œäººé¡žæ–‡åŒ–å»ä¹Ÿåªæœƒæ›´åŠ 地è±å¯Œèˆ‡è¤‡é›œï¼›é€™æ˜¯è¨±å¤šäººæ‰€å¿ƒç¥žåš®å¾€çš„。
至於公平性的å•é¡Œï¼Œæ˜¯å¦æœ‰äº›äººæœƒçµ‚身為人作å«æˆ–一夕æˆå,å°æ–¼æ·å²çš„演進來講,應該是最ä¸é‡è¦çš„一件事了。
其實在「Ctrl+K å…·å‚™ã€çš„ Firefox 上安è£é²ä¾†çš„ Google Toolbar 似乎用處已經ä¸å¤§äº†ï¼Œä¸éŽæ‹¿ä¾†çœ‹çœ‹ PageRank 倒是挺方便的。
在 XGA 螢幕上åŒæ™‚é–‹è‘— Web Developer Toolbar å’Œ Google Toolbar 真是很佔空間。我大概ä¸èƒ½æ”¯æŒå¾ˆä¹…å§ã€‚
Posted by yungyuc
at
22:38,
0 comment,
0 trackback.
我家裡有 12 支三å”排æ’。
12 支三å”排æ’是很貴的。一支排æ’ç®— 200 塊錢,12 æ”¯å°±è¦ 2400 塊血汗錢。生命就該浪費在美好的事物上,ä¸éŽæˆ‘的排æ’空槽至少有 1/3 浪費在大é 變壓器身上,一點也ä¸ç¾Žå¥½ã€‚
感動呀感動,å—å®®åšå£«æ˜¯å¾žå“ªè£¡æ‰¾åˆ°é€™å¼µç¾Žå¦™è±”物的 (左圖)。實在是令人心動神往ä¸èƒ½è‡ªå·±å‘€ã€‚
切... ä¸éŽæˆ‘已經有 12 支排æ’了。
SCons 是好系統,ä¸éŽå°ä»˜ Fortran 90 (with module) 的時候還ä¸å¤ è°æ˜Žã€‚
åŒ…å« module çš„ Fortran 90 原始碼檔案在被 Object() 的時候除了 .o 檔之外,還會產生 .mod 檔。這個 .mod 檔åŒæ¨£æœƒè¢«æ”¾é€² Object() 傳回的 node list 裡,所以之後在 Program( "image", obj_list1+obj_list2 ) 的時候,linker 多åŠéƒ½æœƒæŠ±æ€¨ blahblah.mod çš„æ ¼å¼ä¸å°ã€‚
.mod æª”æ ¹æœ¬ä¸æ‡‰è©²è¢«å‚³é€² linker parameter list,ä¸éœ€è¦è¢«é€£çµã€‚這裡告訴我們應該怎麼把 node list 裡的 .mod 檔濾掉;利用 filter() 函å¼ã€‚
ç›®å‰é€™ä¼¼ä¹Žæ˜¯æœ€ç°¡å–®çš„解決方法。
Posted by yungyuc
at
21:14,
0 comment,
0 trackback.
方便的 shell function:
pathmunge () {
if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then
if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
fi
export PATH
}
在è¨å®šè·¯å¾‘之å‰å»ºç«‹é€™å€‹å‡½å¼ï¼Œå°±å¯ä»¥é¿å…路徑裡出ç¾é‡è¤‡çš„é …ç›®ï¼›åŠ ä»¥è®ŠåŒ–ï¼Œé‚„å¯ä»¥è¨å®šå…¶å®ƒç¨®é¡žçš„路徑:
manpathmunge () {
if ! echo $MANPATH | /bin/egrep -q "(^|:)$1($|:)" ; then
if [ "$2" = "after" ] ; then
MANPATH=$MANPATH:$1
else
MANPATH=$1:$MANPATH
fi
fi
export MANPATH
}
ä¸çŸ¥é“ Debian çš„ /etc/bashrc 裡為何沒有定義。把這個函å¼åŠ 到 ~/.bashrc 裡的話會很方便。
Posted by yungyuc
at
20:45,
0 comment,
0 trackback.