2013年3月16日 星期六

如何成為一個「比較」厲害的程式設計師

 

會寫這篇,有感而發。

現在的網路資訊太過發達,什麼東西只要 Google 一下,就可以找到了。因此,要成為一個會開發各種功能的程式設計師,早已不是什麼難事。

這件事情在 APP 程式設計師上,更是屢見不鮮,即便開發過數十款 Android APP 的程式設計師,可能仍是不懂 JAVA 中的 Interface 的好處。

這件事情,已成常態,所以要成為一個「比較」厲害的程式設計師,你只要比別人多了解一點各種程式語言精妙之處即可。

 

先試著重構吧?整理一下你的程式碼,當你整理上遇到困難時,再回頭看看軟體工程的文章,看看大師們的 Design pattern,一定會有一些不同的體悟的。

 

關於重構- http://jjhou.boolan.com/jjtbooks-refactoring.htm

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年12月27日 星期四

解決 jquery AJAX POST in django 遭遇 csrf 的問題

 

Quick Note:

django 在 1.4 之後,會預設所有的 POST 都會進行 CSRF 的檢查,所以 AJAX 若需 POST,便會出現異常,只要在使用這個 jQuery 語法的地方,加上以下 javascript 的程式碼即可。

if (!$)
    var $ = django.jQuery;
 
$('html').ajaxSend(function(event, xhr, settings) {
    function getCookie(name) {
        var cookieValue = null;
        if (document.cookie && document.cookie != '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = $.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
    if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
        // Only send the token to relative URLs i.e. locally.
        xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
    }
});

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年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)