顯示具有 python 標籤的文章。 顯示所有文章
顯示具有 python 標籤的文章。 顯示所有文章

2013年3月2日 星期六

windows 上寫錄音、撥放音樂、拍照的 python 程式

 

本想用 ADOBE AIR 或是 C# 來寫這個小程式,但後來找一找資源,突然看到 python 的 solution,所以決定使用 python 來實作看看,這邊稍微紀錄一下步驟。(我使用 python 2.7)

 

安裝步驟

python 上要能錄音、撥放音樂,需要安裝 PyAudio

http://people.csail.mit.edu/hubert/pyaudio/

image

 

要能存取 Cam,需倚靠這個有名的 OpenCV,我使用的是2.4.4

http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.4/

image

下載解壓縮後,把opencv 資料夾中的 build\python\2.7\cv2.pyd 複製到 python library 路徑下

(在我電腦是 C:\Python27\Lib\site-packages\)

 

同時也要裝 NumPy 以及 Scipy 才行

http://sourceforge.net/projects/numpy/files/NumPy/1.6.1/

http://sourceforge.net/projects/scipy/files/scipy/0.9.0/

 

以上就安裝完成了

 

範例程式

錄音、撥放的範例程式,可以參考連結網站,下方範例(網站中也有整包下載的地方)

http://people.csail.mit.edu/hubert/pyaudio/

image

 

錄影的範例程式,則在 opencv 資料夾中的 samples\python2\video.py

 

以上

2012年11月29日 星期四

使用 python Tornado 實作 WebSocket 聊天室

 

早期網頁更新訊息必須 Refresh 整個頁面,這使得網頁互動效果有一定的限制在。後來 AJAX 的火紅,使得網頁的 UX 提升到了另一個境界。

但 AJAX 仍無法有效率的處理 Realtime 的訊息傳遞,最多只能做到 Realtime-like,畢竟仍是 client 主動,server 被動,若 server 有資料更新,client 也只能透過 polling 的方式來偵測資料是否有更新,而這不但 client 辛苦,server 更是得面臨大量的 garbage packet

只要瀏覽器支援,其實透過 WebSocket 來處理是更理想的。WebScoket 跟傳統 socket 在使用上非常相似,都是由 client 主動連線,並在正常情況下可保持連線,使得 server 可直接將訊息送到「連接中」的 client

 

程式碼如下

Server side

chatroom.py

import tornado.ioloop
import tornado.web
from tornado import websocket
 
clients = []
 
class ChatRoom(websocket.WebSocketHandler):
    def open(self):
        clients.append(self)
    
    def on_close(self):
        clients.remove(self)
    
    def on_message(self, message):
        for client in clients:
            client.write_message(message)
 
application = tornado.web.Application([
    (r"/", ChatRoom),
])
 
if __name__ == "__main__":
    application.listen(8000)
    tornado.ioloop.IOLoop.instance().start()

 

Client side

chatroom.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Chat Room</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script language="javascript" type="text/javascript">
$(document).ready(function () {
    var socket = new WebSocket("ws://localhost:8000/");
    socket.onmessage = function(event) {
        $("#message").append("<div>" + event.data + "</div>");
    }
    
    $("#send").click(function() {
        socket.send($("#text").val());
        $("#text").val("").select();
    });
});
</script>
</head>
<body>
<div id="message"></div>
<textarea id="text"></textarea>
<input type="button" id="send" value="send" />
</body>
</html>

 

安裝 Tornado 不多提,實際執行結果如下:

執行 chatroom.py

SNAGHTML2afaaf

 

多開 chatroom.html,就可以進行聊天了

image

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月26日 星期日

在 Windows Service 中註冊 Python Script

 

將自己寫的程式註冊在 Windows Service 中有幾個好處:

  1. 可以在系統啟動時自動啟動。
  2. 可設定程式出了狀況之後的處理機制。(如馬上重啟…etc)
  3. 在多人連線的環境下,常常會限制「登入個數」,也會設定「閒置登出時間」,一但執行程式的 Session 被登出,程式就停止了。

程式碼如下:

service.py


import win32serviceutil

class service(win32serviceutil.ServiceFramework):
_svc_name_ = "ServiceName"
_svc_display_name_ = "Service display name"
_svc_description_ = "Service description"

def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.isAlive = True

def SvcStop(self):
self.isAlive = False

def SvcDoRun(self):
self.timeout = 1000
while self.isAlive:
# your script here

if __name__ == '__main__':
win32serviceutil.HandleCommandLine(service)

 

接著只要在命令提示字元下達

python service.py install

 

就可以註冊一個服務到windows裡了

 

其他指令可以下達此命令查詢

python service.py

2012年8月24日 星期五

取得 Python 在系統中 Library 的路徑

 

Quick Note:

 

In python

from distutils.sysconfig import get_python_lib
print(get_python_lib())

or

In os shell

python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"

2012年8月16日 星期四

datetime 常用語法

 

Quick Note

 

將字串轉為 datetime 型態(string to datetime)

import time, datetime
timestring = "2005-09-01 12:30:09"
time_format = "%Y-%m-%d %H:%M:%S"
datetime.datetime.fromtimestamp(time.mktime(time.strptime(timestring, time_format)))

 

取得 datetime 的 UNIX timestamp (from 1970)

import time, datetime
 
# eq : now = int(time.time())
now = int(datetime.datetime.now().strftime("%s"))

2012年8月7日 星期二

ec2(ubuntu12.04) + django + apache + mysql + scrapy + sfc(sphinx) 安裝


前言
對一般人來說,比較陌生的是:

  • scrapypython 的爬蟲套件
  • sfc(sphinx) – Sphinx For Chinese 基sphinx 全文檢索套件,並加上中文分詞的支援。(本來打算用 coreseek,但似乎用在繁體中文會有問題,需另外花錢請 coreseek 研發團隊制定) 這是一篇基於 django 安裝搜尋引擎環境的文章。
事前準備
我假設你已經熟悉以下相關知識:
  • AWS EC2(Ubuntu)
  • django

安裝步驟
登入EC2後,首先進行 apt-get 的更新
apt-get update
apt-get upgrade

EC2 本身就會 default 安裝好 python 2.7.3,因此只要直接安裝 pip 以及 virtualenv 即可
安裝 pip
apt-get install python-pip

安裝 virtualenv
apt-get install python-virtualenv

建立虛擬環境
之後便利用 virtualenv 建立一個虛擬環境給 django,使後續安裝的 python 元件獨立於系統 python 的函式庫外。(此步驟非必須,只是這樣可以建立乾淨的環境)
virtualenv ./djangoenv

將環境切換至 djangoenv 虛擬環境
source ./djangoenv/bin/activate

安裝 django(目前最新的版本是 1.4.1)
pip install django

安裝 scrapy
要安裝 scrapy 之前,必須先安裝 gcc 以及編譯相關套件
apt-get install python-dev
apt-get install build-essential
apt-get install libxml2-dev
apt-get install libxslt-dev

接著安裝 scrapy
pip install scrapy

安裝 mysql
apt-get install mysql-server
此步驟會進行mysql root 的帳號設定

apt-get install libmysqlclient-dev
apt-get install mysql-client
pip install mysql-python



安裝 sfc
wget http://sphinx-for-chinese.googlecode.com/files/sphinx-for-chinese-2.0.2-beta-r3019.tar.gz
tar zxvf sphinx-for-chinese-2.0.2-beta-r3019.tar.gz
cd sphinx-for-chinese-2.0.2-beta-r3019/
./configure --prefix=/usr/local/sphinx --with-mysql
make & make install
cd ~

設置環境變數
vi ~/.bashrc

在最底下加上(~/.bashrc 是每個使用者登入都會執行的一個 sh 檔,通常用來宣告環境參數)
PATH="/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/local/sphinx/bin/"
PATH="$PATH":/usr/X11R6/bin:/home/dmtsai/bin
LANG=zh_TW.big5

reboot

重新登入後,一樣切換到 djangoenv 底下
source ./djangoenv/bin/activate

確認是否有成功
echo $LANG
=> zh_TW.big5

下載 & 安裝中文字庫(未來新增字詞就是反覆操作此步驟)
wget http://sphinx-for-chinese.googlecode.com/files/xdict_1.1.tar.gz
tar zxvf xdict_1.1.tar.gz
mkdict xdict_1.1.txt xdict
mv xdict /usr/local/sphinx/etc/

產生出來的 xdict 檔案便是未來定義 sphinx.conf 檔案時,chinese_dictionary 參數所需指向的路徑(如 chinese_dictionary = /usr/local/sphinx/etc/xdict )
若要新增字詞,則可編輯 xdict_1.1.txt 檔案後,重新執行底下的指令即可
mkdict xdict_1.1.txt xdict

安裝 django-sphinx
pip install django-sphinx

設定 sfc
下載檔案
壓縮檔內的檔案分別是:
  • dstest – django 的 sfc test application (需開啟 settings.py 設定資料庫帳密)
  • scrapytest – scrapy 的 test application
  • build_main_index.sh - 更新 index 的腳本 / 清除 sphinx log
  • sphinx.conf – sphinx 的設定檔 (需開啟設定資料庫帳密)

解壓縮上傳之後
mv sphinx.conf /usr/local/sphinx/etc
mv build_main_index.sh /usr/local/sphinx/bin/
chmod +x /usr/local/sphinx/bin/build_main_index.sh

設置 crontab 每30分鐘重新建立一次索引
crontab -e
0-57/30 * * * * /bin/sh /usr/local/sphinx/bin/build_main_index.sh

增加開機程序,主要使 searchd 不用每次都人工開啟
vi /etc/rc.local
在檔案最下方增加 (exit 0 之上)
ulimit -SHn 500000
/usr/bin/nohup /bin/sh /usr/local/sphinx/bin/build_main_index.sh 2>&1 > /dev/null &
/usr/local/sphinx/bin/searchd

如此一來便大功告成

測試 sphinx
將上面壓縮檔裡的 dstest 與 scrapytest 都放置在 /root/ 底下
mysql -u root -p
CREATE DATABASE dstest default character set utf8;
exit

cd ~/dstest/
python manage.py syncdb
python manage.py runserver 0.0.0.0:80
然後進入到 admin 介面增加幾筆資料

接著下達底下指令建立索引
indexer --all

打開 searchd
searchd

打開瀏覽器,輸入
http://[EC2_IP]/search/

就可以看到搜尋畫面,並可以搜尋剛剛建立的資料(default 是全部的資料)

測試 scrapy
cd ~/scrapytest/

下達底下指令就會開始爬文,並存入 mysql db dstest 中 model 的資料表裡
scrapy crawl scrapytest

都沒看到錯誤訊息就算是成功了,接著可以到後台看是否有資料匯入(但資料我是亂抓的,沒經過處理,所以看起來會很像亂碼)

若要把爬過的資料也納入搜尋中,可執行
indexer --rotate --all

安裝 apache
apt-get install apache2
 
安裝 mod_wsgi
mod_wsgi 可使 Apache 支援 python 的應用程式,據網路評價,在表現上比 mod_python 還優異許多,底下是官方網站
http://code.google.com/p/modwsgi/
apt-get install libapache2-mod-wsgi
 
設定 django + apache
(記得先停用 python manage.py runserver)
NOTE:
/etc/apache2/sites-available
這裡放的是可用但不一定啟用的設定檔,需透過 a2ensite, a2dissite 指令啟停
 
/etc/apache2/sites-enabled
這裡放的是會自動啟用的設定檔,若設定上有衝突,從檔名排序小的優先
(如都佔用了 VirtualHost *:80)

先開啟 /root/ 資料夾權限,讓 apache 可存取
chmod 777 /root
 
cd /etc/apache2/sites-enabled
mv 000-default 999-default
vi 000-dstest

貼上底下的內容
<VirtualHost *:80>
        WSGIScriptAlias / /root/dstest/dstest/wsgi.py
        Alias /static /root/djangoenv/lib/python2.7/site-packages/django/contrib/admin/static
</VirtualHost>


因使用 virtualenv,所以 dstest/dstest/wsgi.py 也做了些修改,在最上方加入
import sys
import site

site.addsitedir('/root/djangoenv/lib/python2.7/site-packages')
sys.path.append('/root/dstest')


重啟apache
/etc/init.d/apache2 restart

打開瀏覽器,輸入
http://[EC2_IP]/admin/

就可以看到 admin 頁面,完成了所有設定。
 
 
注意事項:
Alias /static /root/djangoenv/lib/python2.7/site-packages/django/contrib/admin/static
這行只是暫時的解法,未來應該要在適合的地方建立 django 的 static 資料夾以及 media 資料夾,並用上述的方法分別設置。
設置後也需記得將 /root/djangoenv/lib/python2.7/site-packages/django/contrib/admin/static/admin 資料夾複製到你設置的 static 底下)
 
Reference:

2011年10月23日 星期日

用 python 蒙太奇(Montage)、馬賽克(Mosaic) 你的圖片

angelbaby.mosaicangelbaby 

蒙太奇一下我的女神(Angelbaby),這是用 1619 張圖片,縮成 5x5 pixel,且一張小圖最多只能使用 100 次拼湊出來的效果。

 

這是原程式碼

https://github.com/sameeptandon/python-mosaic

 

原程式碼提供的蒙太奇少了兩樣我想要的功能:

  1. 可限定一張小圖可使用的次數。(原程式碼永遠是挑選最像的那張小圖)
  2. 放入小圖時,他是規律性的由上至下,由左至右的放入,而不是隨機跳動。(這功能必須先有上述功能才有意義)

所以動手改了一下,

檔案下載 mosaic.py

使用方式如下:

image

主要參數紅框由左至右的意義是:

  1. 目標圖片
  2. 圖片資料夾
  3. 目標圖片切割成每小塊的寬跟高
  4. 圖片縮小成小圖後的寬跟高
  5. 一張小圖可用的次數(但如果小圖不夠多,則會重新計數)

 

成果要越像,那麼

  1. 圖片資料夾越多圖片越好
  2. 寬跟高越小越好
  3. 一張小圖可用次數越高越好

 

以上