之前提到 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.

Python/Zope@Japan 的人好幸福的樣子,怎麼覺得他們常常出去玩呀 (happy)。

» continue reading
Posted by yungyuc at 18:11, 1 comments, 0 trackback.

py2exe0.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.

有感小發。

是要睡覺的時間了,但因為種種原因,還不是那麼想睡覺。

誰的專利?誰的保護?誰的霸權?一文後想起前一陣子看過的著作權保護了誰?一書。書中的第二章「馬克吐溫與文學著作權的歷史」令我印象深刻;若要以一句話來總結這一段的心得,應是「美國藉由盜版來對抗歐陸文化強權,讓文化產業得以成長」。

從道德的角度可以對智慧財產侵權的行為作出正確的判斷,但在法律上卻可能很難;這項權利本身就很難說是一項「天然權利」,卻比較偏向一種具目的性的人為規則。脫離過去的文化商業行為框架之外的文化消費/資訊交換必然影響金錢的流向,然而在資訊科技繼續擴展人際交流圈的現在與未來,人類文化卻也只會更加地豐富與複雜;這是許多人所心神嚮往的。

至於公平性的問題,是否有些人會終身為人作嫁或一夕成名,對於歷史的演進來講,應該是最不重要的一件事了。

Posted by yungyuc at 12:22, 0 comment, 1 trackbacks.

其實在「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 支排插了。

Posted by yungyuc at 19:11, 0 comment, 1 trackbacks.

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.
Change to page (10 entries in each page): 1 2
© hover year to navigate month: powered by django