over 3 years ago

最近,開始有做 Document 的需求。在腦海中,用 Python+Document 以 486 的速度搜尋了一下,第一個想到的就是 Sphinx。這是 Pocoo 公司旗下的一個 project 。

Outline

Read on →
 
over 3 years ago

當你想要將所有的 python source code 編譯成 bytecode,只需透過 compileall 這個模組,用法如下:

$ python -m compileall .

這個指令會替所有的 py 檔生成 pyc 檔。

如果要編成 optimized python code (.pyo),則需要在 -m 前面在多加一個參數 -O

$ python -O -m compileall .

執行 pyo 檔時,也需要帶上參數 -O

$ python -O app.pyo

值得注意的是 pyc 檔或是 pyo 檔並不會增加你程式執行的速度,它增加的是程式 載入 的速度。

補充

2013/12/25 - Compile 成 pyo 檔之後,程式中的 assert 會被刪除,使用時要特別注意 [1]。

參考資料

  1. Compiled Python Files
  2. Python compileall
 
over 3 years ago

SublimeLinter 是從我開始使用 SublimeText 2 時,就不可缺少的套件。他自動檢查的功能實在非常方便,能夠即時的發現問題的小細節,大大的提升程式碼的品質。

SublimeLinter 已經好一陣子不再維護了,似乎是作者把全部的心力都投入在 SublimeLinter 3 (SublimeLinter for SublimeText 3),以下簡稱 SL3 。

SublimeText 3 其實出發佈一段時間了,之前也有抓下來使用了一下,不過,許多套件都還沒支援,最重要的是,SublimeLinter 也還沒好,因此,我就又跳回去使用 ST2。

昨天在更新 ST2 的套件時,發現 SublimeLinter3 正式發佈了,或許,已經發佈很久了。在我重新打開 ST3 測試了一些套件後,發現是時候可以跳過去 ST3 了。

安裝

利用 Package Control 安裝 SublimeLinter 就可以了,不需要特別選 SublimeLinter3。

從 SublimeLinter3 開始,所有的 Linter 都被獨立出來變成一個外掛。因此,你還必須依照自己的需要安裝 Linter 。我常用的 Linter 有:

這些 Linter 同樣透過 Package Control 就可以找到。

設定

透過 Command Palette (⇧⌘P) 找到 Preferences: SublimeLinter Settings - Default 就可以設定 Linter 。以下附上簡單的設定檔。

{
    "user": {
        "error_color": "59BB0C",
        "lint_mode": "load/save",  // 執行 Linter 的時機。可以透過 Command Palette 更改
        "linters": {
            "flake8": {
                "@disable": false,
                "args": [],
                "excludes": [],
                "ignore": "E501",  // 略過 E501 的規則,如有多個例外,請用逗號分隔
                "max-complexity": -1,
                "max-line-length": null,
                "select": ""
            }
        },
        "mark_style": "outline",  // outline 會把錯誤的地方圈起來。其他模式,可以透過 Command Palette 更改
        "show_errors_on_save": false  // 預設是開啟的,不過每次存檔都出現 List 很干擾,所以我就關掉了
    }
}

Command Palette

Command Palette 有幾個方便的 Shortcuts 可以快速的更改 Linter 的效果。

比較會需要更動的是 Lint ModeMark Style,可以自己嘗試一下。

補充

2013/12/24 - jshint 以及 csslint 在 html 檔案中同樣有效,相當棒!

 
over 3 years ago

故事發生在有一次同事要改變時區的時候,為了要讓設定變簡單,決定暫時使用時區的數字來改變系統時區。當我們下了指令:

$ dpkg-reconfigure tzdata

卻發現並不能直接選數字,仔細一瞧原來有個 Etc,難道是傳說中的「其他」。很開心的點進去,就發現

Awesome! 這不就是我們需要的選項。馬上就選了 GMT+8 來測試一下。

這...與我想的不大一樣,仔細看看似乎差了 16 小時。

Etc/GMT

根據 Wiki Tz Database 的說法:

Area is the name of a continent, an ocean, or "Etc". The continents and oceans currently include: Africa, America, Antarctica, Arctic, Asia, Atlantic, Australia, Europe, Indian, and Pacific.

The special area of "Etc" is used for some administrative zones, particularly for "Etc/UTC" which represents Coordinated Universal Time. In order to conform with the POSIX style, those zone names beginning with "Etc/GMT" have their sign reversed from what most people expect. In this style, zones west of GMT have a positive sign and those east have a negative sign in their name (e.g "Etc/GMT-14" is 14 hours ahead/east of GMT.)

Etc 後面接著的 GMT 偏移量是與現實中相反的。也就是以正數表示格林威治 (Greenwich) 以西,以負數表示格林威治以東。

由來

因為 POSIX 時區格式定義了不同的方向時區偏移量。(主要的原因是當初 Unix 的開發者幾乎都在美國,而他們以正數來表示他們所在地與格林威治的偏移量。)

The POSIX TZ string takes the following form:

stdoffset[dst[offset][,date[/time],date[/time]]]

where:

std and dst are 3 or more characters specifying the standard and daylight saving time (DST) zone names. Starting with POSIX.1-2001, std and dst may also be in a quoted form like <UTC+10>; this allows "+" and "-" in the names.

offset is of the form '[+-]hh:[mm[:ss]]' and specifies the offset west of UT. 'hh' may be a single digit; 0<=hh<=24. The default DST offset is one hour ahead of standard time.

在設定時區時,若無法以區域來表示時區,只好以偏移量來作計算,因此也就有了 GMT+1, GMT+2, ...。為了不要讓使用者將之與一般的時區方向搞混,當時的開法者就決定用 Etc 這個資料夾把這些數字時區裝起來,也就有了一開始提到的這些選項。

參考資料

  1. Why does TZ=UTC-8 produce dates that are UTC+8?
  2. Understand the POSIX format
  3. Definition of POSIX TZ
  4. IETF Timezone Etc
 
over 3 years ago

在使用 django 檔案上傳時遇到了編碼問題。

Traceback:
File "/var/www/.venv/local/lib/python2.7/site-packages/django/db/models/base.py" in save
  546.                        force_update=force_update, update_fields=update_fields)
File "/var/www/.venv/local/lib/python2.7/site-packages/django/db/models/base.py" in save_base
  624.                         values = [(f, None, (raw and getattr(self, f.attname) or f.pre_save(self, False))) for f in non_pks]
File "/var/www/.venv/local/lib/python2.7/site-packages/django/db/models/fields/files.py" in pre_save
  250.             file.save(file.name, file, save=False)
File "/var/www/.venv/local/lib/python2.7/site-packages/django/db/models/fields/files.py" in save
  86.         self.name = self.storage.save(name, content)
File "/var/www/.venv/local/lib/python2.7/site-packages/django/core/files/storage.py" in save
  47.         name = self.get_available_name(name)
File "/var/www/.venv/local/lib/python2.7/site-packages/django/core/files/storage.py" in get_available_name
  73.         while self.exists(name):
File "/var/www/.venv/local/lib/python2.7/site-packages/django/core/files/storage.py" in exists
  243.         return os.path.exists(self.path(name))
File "./.venv/lib/python2.7/genericpath.py" in exists
  18.         os.stat(path)

Exception Type: UnicodeEncodeError at /zh/proposal/upload_abstract/1/
Exception Value: 'ascii' codec can't encode characters in position 63-67: ordinal not in range(128)

主要原因似乎是 python 引用底層 os library 時,系統看不懂你使用的編碼(可是 python 懂 XD)。這時候你只要去系統安裝你需要的語言包。重新啟動 server 後問題就解決了。例如:

$ locale-gen zh_TW.UTF-8

參考資料

nginx - UnicodeEncodeError when uploading files in Django admin - Server Fault