2013年1月11日 星期五

[介紹]xclip-好用的terminal file剪貼工具

如果常使用vim編輯檔案可能會遇到一個問題,

如果想要將某個檔案的內容複製到其他地方要怎麼辦?

因為vim是使用終端機內的文字編排,所以即使是使用滑鼠游標選取之後在貼上,難免會有許多邊界偵測的問題,以及複製到不必要的字元,因此這個時候還是需要使用GUI的編輯器(EX:geditor)來開啟並且複製。

為了減少這方面的不方便,ubuntu上有個黏貼管理的程式-xclip

安裝

sudo apt-get install xclip

or

前往網站下載

用法

終端機內

將檔案pipe到終端機的buffer內,

cat my_file.md |xclip

如此會將需要複製的內容複製到x buffer內,等待下次需要使用的時候

xclip -o

可以配合其他功能使用,例如:

丟到另外一份檔案中

xclip -o >output.md

使用grep尋找行內關鍵字

xclip -o |grep ^happy

如果是想要儲存在GUI的暫存中

cat my_file.md |xclip -selection clipboard

如此便可以使用滑鼠於其他地方使用貼上功能貼到任意的地方

django基本介紹

趁著專題結束,趕快把Django的內容寫下一些紀錄,方便自己以後要用的時候可以查找,也因為雖然他的文件很完善了XD,但是因為是英文比較難閱讀,而且也需要許多實作來驗證想法,因此想要寫些筆記把心得跟細節記錄下來。

需要知道Django在Ubuntu上如何安裝與基本的運行,請參照這篇

首先

在command line鍵入

django-admin.py --version

我使用的版本文1.4.1,作業系統為Ubuntu12.04,所以如果以前或者以後的版本可能會有相容性的問題。

建立一個project

使用command line輸入

django-admin.py startproject myproject

myproject可以置換成自己想要的專案名稱

之後會得到一個資料夾,用剛才的專案名稱命名,使用cd切換進去後,可以看到以下許多檔案。

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
       urls.py
        wsgi.py

接著輸入

cd myproject
python manage.py runserver

如果看到

Validating models...

0 errors found Django version 1.4.1, using settings 'myproject.settings' Development server is running at http://127.0.0.1:8000/

接著使用瀏覽器開啟http://127.0.0.1:8000/就可以看到成功頁面了

(歡樂的It worked!)

setting.py

所有Django的設定擺放的地方,其中包含許多基本的設定;在創建之後裡面有些項目必須先設定,以方便之後的開發。

資料庫的設定

大部分的web framework都會需要用到資料庫,所以可以優先設定,以下為設定好的例子(以MySQL為例子)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'django',                      # Or path to database file if using sqlite3.
        'USER': 'lucas',                      # Not used with sqlite3.
        'PASSWORD': 'lucas_password',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}

其中最重要的就是ENGINE,NAME,USER,PASSWORD需要設定,比較細部的設定可以參考官方的Database setup

如果是MySQL使用者,記得設定完後去資料庫中新增一個資料庫,而且名字必須要跟設定中的NAME相同,以此為例就需要一個django為名稱的資料庫。

時區設定

TIME_ZONE = 'Asia/Taipei'
LANGUAGE_CODE = 'zh-tw'

如何挑選所在的時區可以參照wiki

urls.py

整個專案中,用來設定對於網站的request應該開啟哪個頁面的重要設定檔案,寫好網站mapping的pattern後,之後的request都會根據此份檔案。

2012年8月27日 星期一

[筆記] SQL語法裡問號的功用


今天在寫程式的時候意外的看到一段SQL

    SELECT token FROM oauth_tokens WHERE userID = ? LIMIT 1

而其中的問號引起了我的注意,因為沒有看到userID在程式中出現,所以就查了一下SQL中問號的功用,後來在stackover裡面的這篇好到答案,才發現他其實是一個好習慣,所以就順便筆記下來了

問號的功能,是用來變數化SQL查詢

他一種安全的作法用來取代原來的寫法

    ODBCCommand cmd = new ODBCCommand("SELECT thingA FROM tableA WHERE thingB = 7")
    result = cmd.Execute()

這個寫法在thingB為固定值的時候沒有什麼問題,但是當你需要動態載入變數的時候,他就會需要寫成這樣(底下的方法是不建議的)

    string s = getStudentName()
    cmd.CommandText = "SELECT * FROM students WHERE (name = '" + s + "')"
    cmd.Execute()

我們就很直覺的使用字串串接的方式來將變數整合成一句SQL,但是這樣會面臨SQL injection的危險,因為當你要寫入的變數,是來自於你不信任的第三方(不論是使用者、或者是hacker)都有可能串接到無法預期的文字,好一點只是SQL statement Error,但是如果對方傳入設計過的字串,例如Robert'); DROP TABLE students; --,則結果會...

    SELECT* FROM students WHERE (name = Robert');
    DROP TABLE students;

就悲劇了,當然你可能會覺得他怎麼知道你的TABLE Name那又是另外一回事了.XD

所以

應該改用這種方式,除了程式有比較好的可讀性以外,還可以事先過濾使用者輸入的字串

    ODBCCommand cmd = new ODBCCommand("SELECT thingA FROM tableA WHERE thingB = ?")
    cmd.Parameters.Add(7)
    result = cmd.Execute()

當然你也可以使用php PDO的方式來寫入

    $query = 'SELECT token FROM oauth_tokens WHERE userID = ? LIMIT 1';
    $stmt = $this->pdo->prepare($query);
    $stmt->execute(array($this->userID));

都是一種好習慣也是一種好方法:D

2012年8月18日 星期六

pygame遊戲程式設計筆記<前言>


    心血來潮,想寫個網路應用程式來學習網路的操作,但是要寫出一個怎樣的程式或者應用,所以我更進一步的去設計這個想法,很巧的又看到以前的網路遊戲,於是,「何不做一個簡單的網路遊戲?」這個念頭由然而生,就開始上網找了很多的資料,發現遊戲引擎還是以C++和JAVA為大宗,當然現在很多前端的設計、AI還是會使用scripting language來編寫,其中不乏語法簡單,適合用來編寫遊戲的語言Lua的framework,在看過眾多資料後,最終決定使用python來當主力開發語言,雖然資源相對上算是少的,但是目前滿足我的需求上來說,是足夠的,所以在決定後就開始我的遊戲程式設計學習筆記了!

2012年7月10日 星期二

筆記-小型專案開發過程



這學期因為修課的關係,很巧的有兩個team project需要團隊去執行,整個過程雖然不算風風雨雨,但也總是有些不順遂,本想說在社群網站設計的期末展覽結束之後就整理心得,也比較不會忘記當下的想法,不過因為要準備去杭州的比賽以及搬家就先被擱置了,不過在思考沈澱以後,寫下一些筆記也是不錯的。


隊友:

首先,你不得不承認找隊友是件很重要的事情,因為如果找到很強大的隊友他就能將整個專案一手包辦,如此,你就可以很輕鬆的完成這個專案,當然,如果你想要也一起參與這個專案,我想事實的拿出積極度與參與討論都是很重要的,而對於一個專案的需求,會需要不同領域不同能力的隊友也是可以預見的,不過我有幾點覺得應該注意:

  1. 不因為人情選擇你的隊友
    • 因為人情選擇你的隊友,往往使得你們在以後會變得更加難堪,在專案討論的時候,從概念的討論到最後的成品,中間的過程中會有無數次討論甚至爭執,如果因為人情選擇了一個不太好合作的朋友,反而會因為這次的合作使得兩個人因概念上的差異直接產生衝突,所以與其一開始因為人員配置的考量而拒絕對方,也不要因為人情壓力而選擇同組,這對兩個人都不會是件好事情。
  2. 不嘗試去改變對方的想法,認為好的領導就是不管什麼樣的人都可以領導
    • Mr. Jamie網誌中曾提過,「其實沒有一個人是壞掉的,你也往往無法改變他人。與其浪費時間在你無法改變的人身上,還不如去找那些願意接受你的想法的人。」,這點我很認同,千萬不要自己為自己可以改變別人,否則當對方依照他的思維模式在做的時候,吃虧的往往是自己。
  3. 不過份重視過去,但也別小看前科
    • 過去的經驗雖然輝煌,但每次的合作有很大的部份還是全新的一個過程,過去的經驗與戰績未必在這次合作中會起作用;但是,也別小看過去對方是否有不良的經驗,或是不好的態度,如果有,還是在找伙伴時就把他檔在門外吧!!!

溝通:

團隊溝通也是很重要的,如果可以還是建議使用專案管理的協助工具(git、wiki)來協助開發,並且定期討論,而每次進度回報最好能夠完成下面幾點的答案:

  1. 甘特圖
  2. 進度達成度
  3. 下次預定進度

而除此之外,團隊也要養成將遇到的問題筆記的習慣,可以讓在開發類似性質的專案時,減少自行解決問題的成本。

合作:

這次的合作過程中,很榮幸的能夠和設計的朋友一起合作,而當然也有碰到些問題,其實這次合作的過程中設計師是比較隨和的,也許是考量期末展快近了,很多設計被完成出來時其實不完全能夠達到當初設計的概念,例如距離的誤差、按鈕被碰觸時的互動,但若是設計師跟切版者不能是同一人的話,設計師在出圖的時候最好能夠一起附上:

  1. 原始設計圖:最好是可以模擬瀏覽緝獲者手機上瀏覽時的真實情況,並且考慮不同解析度相容性問題,如果今天解析度過小或者過大要怎麼處理。
  2. 框架圖:每個元件跟元件間的位置,如果有顏色,也需要將色碼寫在旁邊,越詳細越可以減少切版時的微調成本。
  3. 動態元件分鏡圖

如果這些東西都齊全了,就只要附上元件圖,如此可以將切版的成本降到最低。

而和程式設計師合作,則是門大學問,市面上有許多書籍在討論,小弟也不夠清楚,不過有幾點我覺得在簡單的專案中可以減少許多溝通成本,以及將討論的時間大幅下降:

  1. 高內聚低耦合的架構設計,如此除了方便切割每個元件的責任歸屬,如果有想要作測試,這種方式也是比較好測試的一種程式設計技巧。
  2. 寫文件,沒錯,就是幫自己設計的元件寫文件,每次要趕著作業的deadline時,常常會聚在一起趕作業,但是其實一個程式設計師在自己熟悉、舒適的環境中寫程式的效率是比較好的,大家聚在一起其實是降低了個別的生產力,但是之所以聚在一起是因為「我不知道你寫了些什麼」、「我不懂你程式的流程應該要怎樣串街」等等的問題,而除了真的因為架構比較旁大的元件需要當面討論外,很多時候其實只要將文件寫好供其他開發者查找,就可以解決這個問題了,而在每個元件最基本應該要有的資料最好也獨立處理,例如每個參數是用來做什麼的、回傳什麼東西、回傳的物件是實例還是參考等等的資訊,都可以透過團隊討論制定好統一文件規格來撰寫,如此就可以降低溝通成本了。


以上是我一點心得的筆記,如果有什麼更好的建議或者不一樣的想法歡迎交流。

2012年5月28日 星期一

[python]dict[x]後串接list()

使用python寫程式時,會遇到需要整理資料的場合,最好是用資料的類別或者ID做索引,對於資料的呈現或是寫入資料庫時,程式都有比較好的架構,但是python只有支援dictionary和list並沒有整合的data structure,所以要自己寫一個。
因為當初自己寫時有遇到些問題,所以配合這一篇,把寫法記錄下來,希望對要用到的人會有幫助。

1. 在要新增一筆資料的時候檢查是否已經被初始化為list
d = {}
d[key] = list()
d[key].append(value)
初始化後就可以使用.append()當成list用了,不過需要檢查是否已經被初始化過了,避免重複初始化。
initialize
d = {}
check
if key not in d:
    d[key] = list()
d[key].append(value)
2. setdefault

initialize
d = {}
setdefault
d.setdefault(t,list()).append( c )
會將dictionary預設為list()

2012年5月20日 星期日

修改 :link :visited :hover等等CSS的預設屬性


    在寫網站CSS的時候,有會需要將一段文字超連結,所以會在文字外圍使用<a>這個標籤包覆,問題是CSS有預設:link :visited :hover的一些特性,所以可能導致自己寫得內容被覆蓋過去,這個時候在CSS檔案裡面的開頭加上

a:link
    color:inherit;
    text-decoration:inherit;
}
a:visited{
    color:inherit;
    text-decoration:inherit;
}

a:hover{
    color:inherit;
    text-decoration:inherit;
}
就會去看是否樣式已經被設定好了,如此自己寫得樣式就不會被覆蓋過去了。