更新,這一篇,是一段時間前寫的,居然發現,有沒發的文
現在小弟,也跳過 ansible 了,改用容器化的方案 (真不專情)
Ansible 簡單的系統部屬工具,是用 Python 撰寫的佈署工具,有點像是 puppet , chef , salt 的工具
主要原理,就是透過 ssh 的方式,算是非常單純簡單的方式,比起 puppet 或是 chef 來說
這一篇,我想筆記的是對 Google Cloud Engine 上面 VM 的佈署,安裝就用 python 的 pip 就可以了,因為對 GCE 的支援,是透過 libcloud 的套件做的
所以,你除了要安裝 ansible 外,也是裝 libcloud ,用 pip 的話,安裝像是這樣,看你的系統需不要加 sudo ,因為,我是在 Mac 上面,整個 /usr/local
都是我在用,所以我不用加,實際依自己的系統情形
Posts for: #Python
Write in GO
Python string isalpha
筆記一下
今天追蹤一個問題
程式裡用了類似 u"中文".isalpah() 的比較方式
實際上的中文,是由資料庫傳回的值
是我太肉腳,還是這一個 function 命名的原意不明
這樣會傳回 True
參考文件 https://docs.python.org/3.4/library/stdtypes.html#string-methods
我目前 workaround
u"中文".encode(“utf8”).isalpha()
PS: 所有該死的事,都是起源於 Workaround
TA-Lib
TA-Lib 是個歷史悠久,擁有相當多金融技術指標的實作,也被很多金融有關
的軟體所使用,已經有包含將近 200 種指標,
也有 SWIG 幫忙打包的 Perl , 及 Python 套件
這可是程式交易的利器,輕輕鬆鬆,200 個指標可以用,感謝 Open Soure 的前輩們
Python 的套件,有另一位大哥,用 Cython 重新做新的介面,效能更進一步
不過在 windows 下面編譯還蠻麻煩的,要有 Visual Studio 2008 ,及簡單的 patch ,
詳細可以參考
https://github.com/mrjbq7/ta-lib/issues/4
另外,自己也有需求,所以先包一包 win32 Python2.7 的安裝檔,方便使用,有需要的人也可以自取
記得,丟進去的數值,都要是 float
http://dl.dropbox.com/u/14137697/20121105/TA-Lib-0.4.0.win32-py2.7.exe
PS: 這應該是非常冷門的套件 ;-)
Python 包 EXE
關於目前 Python windows 程式打包的方式選擇也算蠻多的
有用過一些,說一說心得吧
py2exe
安裝後,直結整合到 setup.py 裡
歷史悠久,但是看起來很久沒有後續的維護,一開始我都是用這一個打包,算是很穩定
pyinstaller
後起之秀,single file 的打包方式,算是功能蠻強的,執行時,是解壓到暫存資料夾執行,但是hook 一大堆,解決非常多的套件問題,也算是一種 dirty hack https://github.com/pyinstaller/pyinstaller,算有在維護,小程式可以用他來打包執行也算簡單, 2.0 以後,打包更容易
不需要安裝,直接解壓縮後執行,有用到 multiprocessing 的模組的人,他的 importHook 蠻容易造成動態載入模組的問題,像是程式裡用 import 來載入模組的方式,都蠻容易有問題的,再來就是 hook 程式很多,如果用的第三方模組沒有支援,就非常的難包,需要自己客製寫 spec 檔
python pyinstaller.py -F -d -i your_app/app.ico your_app/app.py
-F 包單一執行檔
-D 包成一個資料夾
-d debug 打開
-i 程式 icon
會產生 your_app/app.spec 檔案,後續可以再手動調整 app.spec,再執行,其實執行 spec 檔時,沒有加 options 沒關係
python pyinstaller.py -F -d -i your_app/app.ico your_app/app.spec
cx_Freeze https://bitbucket.org/anthony_tuininga/cx_freeze/src
實作的方式,比較像是 py2exe ,是寫 setup.py 整合,簡單的也可以直接下 cxfreeze 打包,不能包 single file exe,可以另外用工具包起來,文件比較缺乏,唯一有支援 Python3
安裝完後,可以直接參考範例寫 setup.py ,要注意的是安裝完後放到 Scripts 裡的程式有路徑的問題要先修一下
我用 Python27 的例子 Scripts\cxfreeze 裡的 Python 路徑是 C:\Python\32-bit\2.7\python.exe ,請自己修改成您的
python.exe 的路徑
python setup.py build 就可以了
目前小的程式,會用 pyinstaller
大一點的程式,會用 cx_Freeze
WSDL use suds
在 Python 的函式庫裡, suds 算是通用的選擇,一直用起來也算蠻穩定的
不過在一些比較特別的網路環境裡,或是需要參照其他 XMLSchema 的時候
我比較沒有經驗,所以紀錄一下,這一個環境機器連結外部 80 port 的服務要透過 proxy
proxy_config = {‘http’: ‘http://someproxy.host:3128’}
from suds.xsd.doctor import Import, ImportDoctor
from suds.client import Client
wsdl_url = ‘http://somewebservice.com/service.asmx?WSDL'
imp = Import(‘http://www.w3.org/2001/XMLSchema', location=‘http://www.w3.org/2001/XMLSchema.xsd')
imp.filter.add(‘http://tempuri.org/')
client = Client(wsdl_url, doctor=ImportDoctor(imp), proxy=proxy_config)
print client # read avaliable api ;-)
參考資料
http://stackoverflow.com/questions/5769128/soap-client-using-suds
multiprocessing in wxPython
根據 wiki 上面的文件說 http://wiki.wxpython.org/MultiProcessing
不可以在 wx.App 的程式迴圈中,去產生新的 Process
真的試了一下,還真不行,在不用 threading, subprocess, 或是 wx.Process 的寫法下,只要把產生新 Process 的動作移出
wx.App 的範圍裡就沒有問題了
另外如果程式是用 pyinstaller 包裝成一個檔案,也要注意這 Process 需要重包來解決問題
http://www.pyinstaller.org/wiki/Recipe/Multiprocessing
筆記一下,以免以後忘了
django-pipeline
一個簡單,好用的 django plugin
https://github.com/cyberdelia/django-pipeline
用途,用來產生,壓縮處理, css ,javascript 或是圖片,也可以自動處理 version (也有支援 git 喔) 可以搭配的工具很多,SAAS,LESS,或是 Coffee Script 都 OK,有沒有開始傻笑了 ;-)
Compressors
YUI Compressor compressor (這個是預設的)
Closure Compiler compressor
UglifyJS compressor
JSMin compressor
CSSTidy compressor
Write your own compressor class
Compilers
Coffee Script compiler
LESS compiler
SASS compiler
Stylus compiler
Write your own compiler class
拜託,要用時,還是看一下文件,及 source code
文件 http://django-pipeline.readthedocs.org/en/latest/index.html
EXAMPLE: 我先假設,用的是
Django 1.3.1
settings.py INSTALLED_APPS 有 ‘django.contrib.staticfiles’,把 ‘pipeline’,也加到 INSTALLED_APPS 裡
yuicompressor-2.4.7.jar 我放到 project 資料夾的 pkgs 目錄下面
在 Debian 上面有安裝 openjdk-7-jdk
PIPELINE_JS 的部份,依此類推
settings.py 部份
PROJECT_ROOT = BASE_DIR = os.path.abspath(os.path.dirname(file))我的 base.html 裡的部份
INSTALLED_APPS = (
‘pipeline’, # 這個要有,當然還有其他你要的
)
# django-pipeline
PIPELINE_YUI_BINARY = ‘java -jar ’ + os.path.join(PROJECT_ROOT, ‘pkgs/yuicompressor-2.4.7.jar’)
PIPELINE_VERSION = True
PIPELINE_CSS = {
‘main’: {
‘source_filenames’: (
‘css/style.css’, # 後面可以加很多
),
‘output_filename’: ‘css/pipeline_r?.css’,
’extra_context’: {
‘media’: ‘screen,projection’,
},
},
# other CSS groups goes here
}
……
{% load compressed %}
……
…..
{% compressed_css ‘main’ %}
…..
…
..
覺的不合用,看更多 Django asset-managers
http://djangopackages.com/grids/g/asset-managers/
uWSGI –vhost
用 uWSGI 來啟動 wsgi 的服務,除了傳統的方式,還可以一次管理多個 wsgi 的服務
還有另外一種作法 Emperor 可以對特定資料夾裡所有的設定檔,個別管理,更適合作 PASS 服務的人, http://projects.unbit.it/uwsgi/wiki/Emperor
我的需求沒有這麼大,只是一起跑多個 wsgi ,省一些記憶體,就可以了
用 daemontools 來啟動,這裡面的 buffer-size 有要吃外部的 post back 要加大,不然,預設的實在是太小,最重要的是預設值 PayPal
IPN callback 吃不下,收到錢還不知道,夠重要了吧
#!/bin/bash
# default buffer-size is 4k 4096
exec setuidgid yourname uwsgi –buffer-size 32768 -s 127.0.0.1:3031 -p 3 -M –vhost
以在 Debian 上面的 nginx 裡面的設定範例
server {
listen 80;
server_name yourcoolsite.com;
location /static {
alias /yourstatic/folder/;
}
location / {
include uwsgi_params;
#uwsgi_pass unix:/tmp/digez.sock;
uwsgi_param UWSGI_PYTHONPATH /home/yourname;
uwsgi_param UWSGI_CHDIR /home/yourname/yourcoolsite;
uwsgi_param UWSGI_ENV DJANGO_SETTINGS_MODULE=yourcoolsite.settings;
uwsgi_param UWSGI_MODULE application;
uwsgi_pass 127.0.0.1:3031;
}
放在 /home/yourname/yourcoolsite/ 的 wsgi application.py script 範例
sys.path.append 那兩行,在 Django 1.4 以下,也就是 1.3.1 (含) 以下,都要加,比較不會有路徑的問題
Django 目前的 Dev(或是 trunk 或是 github 上面 master) 開發版,已經改變 project 的路徑,所以不用再加了
# coding: utf-8
import sys
import os
sys.path.append(os.path.abspath(os.path.dirname(file)))
sys.path.append(’..’)
os.environ[‘DJANGO_SETTINGS_MODULE’] = ‘settings’
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
最近流行小而美
此篇算是感恩文 (我知道感恩節過很久了)
Bottle
現在時代不同,講求的是敏捷開發,一個人,當多個用,產生多個 thread 在不同專案,共用同一個大腦,開發人員進步的很快,工具也相當的進步,對函式庫的了解熟悉後,進行拆解
依照專案類型的不同,合併成最佳的組合,感覺,現在寫軟體,花一大堆的時間,看別人的函式庫,或是原始碼,要越高的彈性,及效能,就必須由越底層來切入
想想懶惰真是進步的原動力,這些工具,都是為了解決新問題與挑戰,想想身處在這個時代還蠻幸福的,有這麼多的東西可以玩
真不敢想,再過 10 年以後,軟體開發的進步,不知道可以到達什麼樣的境界,現在不管是 WEB 或是 Mobile 的應用都有長足的進步,想想10 年前的手機,在看看現在手裡的 iPhone 或是 Andriod 手機的運算能力,不可同日而語
自己比較熟的 Web 應用開發
CSS 工具有 SAAS 不過我喜歡 LESS
microjs 的一大堆 javascript 工具,還是自己來包 javascript 的工具
ender.js,還是用 coffee script 當成 Ruby 和 Python 合體來快速開發,我自己是只能算是 javascript 的幼幼班學生,所以只能用些基礎的
常用的 Web Framework,順便附一下,benchmark ,我知道,這一點都不科學,也不切實際,算是一個紀錄
硬體,都是同一台機器 Intel(R) Celeron(R) CPU E3400 @ 2.60GHz (真可憐用 Celeron), JVM 有暖身了
Node v0.6.1 (我知道他不是 framework,只是可以解決一樣的問題)# Hello World benchmark
# all python framework under nginx 1.1.8 uwsgi 0.9.9.3, python2.6.7
# playframework under production mode java -version Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
# node -version v0.6.1
# ab -c 100 -n 1000 TO_TEST_URL
# bottle 0.11.dev
uwsgi –socket 127.0.0.1:3030 –module terry –processes 4
# ~1550 Requests/second
# flask 0.8
uwsgi –socket 127.0.0.1:3030 –module fsk –callable app –processes 4
# OR
uwsgi –socket 127.0.0.1:3030 –module fsk:app –processes 4
# ~1100 Requests/second
# django 1.3.1
# return HttpResponse(“Hello World”)
uwsgi –socket 127.0.0.1:3030 –pp .. –env DJANGO_SETTINGS_MODULE=hello.settings -w “django.core.handlers.wsgi:WSGIHandler()” –processes 4
# ~910 Requests/second
# playframework 1.2.4
# renderText(“Hello World”)
# ~1700 Requests/second
# node 0.6.1
#var http = require(‘http’);
#http.createServer(function (req, res) {
# res.writeHead(200, {‘Content-Type’: ’text/plain’});
# res.end(‘Hello World’);
#}).listen(1337, “127.0.0.1”);
#console.log(‘Server running at http://127.0.0.1:1337/’);
#
# ~2500 Requests/second
#
連結(順序無關喜好,不同的地方,不同的規劃,自己看著辦,Hello World 只是起點,大家的終點不一樣)
Bottle
Flask
Django
PlayFramework
Node.js
PS: 最重要是,由衷的感謝這麼多 Open Source 的前輩,可以這樣無私的和大家分享,不求回報,讓想法可以自由的世界的每一個角落激盪出更多的火花,讓我也可以撿拾前輩的一點點牙慧,增加一點點自己的力量,讓日子過得更美好,由衷的感恩