2012年10月28日 星期日

網頁快照,把 html 轉換為pdf/image

 

http://cutycapt.sourceforge.net/

 

Ubuntu

sudo apt-get install subversion libqt4-webkit libqt4-dev g++ xvfb
svn co https://cutycapt.svn.sourceforge.net/svnroot/cutycapt
cd cutycapt/CutyCapt
qmake
make
sudo mv ./CutyCapt /usr/local/bin

 

Try it

xvfb-run --server-args="-screen 0, 1024x768x24" CutyCapt --url=http://www.google.com/ --out=example.png

2012年10月27日 星期六

解決 Couldn't resolve host

 

Quick Note:

/etc/resolv.conf 是 DNS 的設定檔,若未設定,可能會導致所有的 domain name 都無法使用。

打開 /etc/resolv.conf 加入底下兩行:

nameserver 8.8.8.8

nameserver 8.8.4.4

2012年10月18日 星期四

javascript dump 複雜型態的物件語法

 

Quick Note:
一般的變數、Array…etc都可以使用這個方法印出深層的資料結構。
有點類似 php 裡面的 print_r
JSON.stringify(obj)

2012年9月4日 星期二

在 Ubuntu 上編譯 PIL

 

Quick Note:
 
假設已經安裝了 pip
 
接著下達以下指令
sudo apt-get install libjpeg8-dev
sudo apt-get install zlib1g-dev
sudo apt-get install libfreetype6-dev
sudo apt-get install liblcms1-dev
sudo ln -s /usr/lib/x86_64-linux-gnu/libfreetype.so /usr/lib/
sudo ln -s /usr/lib/x86_64-linux-gnu/libz.so /usr/lib/
sudo ln -s /usr/lib/x86_64-linux-gnu/libjpeg.so /usr/lib/
sudo ln -s /usr/lib/x86_64-linux-gnu/liblcms.so /usr/lib/

 

如果之前已經安裝了 PIL ,但沒有安裝完整,要先移除

sudo pip uninstall PIL

 

接著安裝 PIL

sudo pip install PIL

2012年8月27日 星期一

區別 Django 中的 STATIC_ROOT 與 STATICFILES_DIRS

 

看此篇文章之前,可以先參考

深入了解 django 的 static 設定

 

本文開始

在寫 django 時,我們會引用許多的 app,也會自行製作許多的 app,每一個 app 都可能有自己的 static 檔案或資料夾。

只要在 INSTALLED_APPS 裡引用的 app,便會成為 python manage.py collectstatic 的收集對象,而收集後存放的路徑,便是 STATIC_ROOT

這麼一來便可以讓 app 有自己的 static 資料夾,不需要混在一起了,維護上也會簡單許多。

django default settings.py 裡面 STATIC_ROOT 的上方,也特別警告我們不應該手動更改 STATIC_ROOT 裡面的檔案。

 

有兩個情況我們需要設置 STATICFILES_DIRS

  1. 專案需要一個 static 檔案或資料夾,但卻不知該如何歸類在哪一個 app 底下。
  2. 專案需要改寫某個引用 app 底下的 static 檔案,但卻不希望動到原本 app 底下的 static 檔案。

狀況一我們有待商榷,畢竟「不知該如何歸類」不應該出現在一個成熟的專案下;而狀況二卻很容易發生。

此時便需要設置 STATICFILES_DIRS,越上方的設置優先權越高,而 STATICFILES_DIRS 的優先權當然也高於 INSTALLED_APPS 內的 app

(INSTALLED_APPS 本身也遵循越上方的 app 優先權越高的原則)

admin 舉例

我若要改寫 django/contrib/admin/static/admin/css/base.css,那麼便可如此指定

STATICFILES_DIRS = (
'/project/mystatic',
)

然後建立 /project/mystatic/admin/css/base.css 檔案後編輯,而後下達

python manage.py collectstatic

 

便會將 /project/mystatic/admin/css/base.css 收集到 STATIC_ROOTadmin/css/base.css 底下,並依照優先權決定覆蓋

2012年8月26日 星期日

深入了解 django 的 static 與 media

 

為什麼要設定 static?

為什麼一但設置在 apache 中,static 設定就變得格外重要?開發時,使用 runserver 都不用管這些設定也可以正常運作!

其實那是因為 runserver 是用程式動態決定檔案位置的,如此一來這些 static 檔案,便是參照各「套件」底下的 static 資料夾,而不需要另外設置

作怪的地方在下方,註解起來 runserver 就無法「使用」各套件底下的 static 了(反之應該也可以修改成在 apache 中使用各套件底下的 static,未測試過,也不推薦)

django/contrib/staticfiles/management/commands/runserver.py

image

 

但是為何不能使用 runserver 在正式環境呢?

官方也有提到

https://docs.djangoproject.com/en/dev/ref/django-admin/#runserver-port-or-address-port

DO NOT USE THIS SERVER IN A PRODUCTION SETTING. It has not gone through security audits or performance tests. (And that's how it's gonna stay. We're in the business of making Web frameworks, not Web servers, so improving this server to be able to handle a production environment is outside the scope of Django.)

 

static 的檔案,讓 django 動態處理,累積起來也是十分浪費效能的,我猜這也是原因之一

 

static 設置說明

在寫 Web 時的路徑非常重要,所以往往因為專案路徑改變而發生悲劇,在 Django 裡,你必須了解以下兩種設置有何不同。(media 觀念亦同)


STATIC_URL = "/static/"

這指的是你的 Template 在撰寫 html 時,所引用的路徑,與 Web Server (如 apache) 的指向息息相關。

所有 Django developer 在撰寫 Template 都會遵守的寫法

<script src="{{ STATIC_URL }}mezzanine/js/jquery.tools.js"></script>

or

<link rel="stylesheet"
type="text/css"
href="{% static "admin/css/login.css" %}" />


PS:兩種寫法在意義上似乎有所不同,有機會研究再發佈一篇文章

 

所以如果使用 apache,那麼上面的設置便會全部指向

[ApacheDocumentRoot]/static/

(如 C:/AppServ/www/static)

 

STATIC_ROOT = "C:/AppServ/www/static/"

這個設置是為了讓 python manage.py collectstatic 知道將 static 檔案收集在哪。

原則上必須與 STATIC_URL 指向的路徑一致,才不會導致與 Web Server 找到的檔案不同

在這個 case 中,就會等於 C:/AppServ/www/static

 

PS:在 apache 的 conf 中,也可以利用 Alias 來轉向,只要設置正確就好

 

STATIC_ROOT 更詳細的說明,可以參考

區別 Django 中的 STATIC_ROOT 與 STATICFILES_DIRS

 

說了這麼多 static,那 media 呢?

mediastatic 不同的地方在於,media 通常是用於放置使用者可新增、編輯、刪除的資料,如上傳的圖片,文件等,除此之外,其餘觀念與 static 的設置沒有什麼不同