發表文章

目前顯示的是有「程式設計」標籤的文章

MongoDB 初體驗

因為 Web Mining final project 我們想做 twitter tweet 的 clustering 及 classification,所以需要從 twitter 下載大量的 Tweet 做為實驗用途。一開始我是把這些 tweet 存成 JSON 在文字檔裡,不過隨著 tweet 量越來越多,用文字檔實在很難處理。由於本來就是存成JSON的格式,所以就想到了 MongoDB。 之前只有玩過try MongoDB, 從來沒有好好用過他,這次剛好有這個機會就來用一下 :P 裝好MongoDB後就可以開始始用了。由於這次 project 是用 ruby 寫的(因為有方便的  Twitter Gem  可以用),所以我用了 Mongo Gem   。Mongo Gem 的用法跟 Mongo shell 裡的用法差不多,簡單的用法如下,更多的說明可以參考 Mongo Gem 的 wiki 。

ActiveRecord like API for Python

之前看到 ActiveRecord 有一個很方便的功能: find_by_COLUMN,而 COLUMN 是那個 Table 裡的 columns。這用 Ruby 的 define_method 很好實做,當然 Python 也可以做到。下面是一段 POC (Prove of Concept) code:

Monkey Patching: Python V.S. Ruby

之前在寫Rails的時候還不是很熟悉Ruby,所以很多Ruby的特性沒有去深究。最近剛考完期末考比較有時間了,所以好好來看了一下Ruby。目前覺得學Ruby的好處就是會讓我想去比較Python,因為我個人還是Python的愛好著,所以看Ruby可以做到的功能就想要看Python可不可以做到。拿Ruby最有名的名能之一來說好了: Monkey Patching,從Wikipedia: A  monkey patch  is a way to extend or modify the  run-time   code  of dynamic languages without altering the original  source code . Ruby 可以很容易的動在舊有的Class/Module中加入新的Class/Method,舉例來說我們可以新增一個  method 到 Array 中: def Array.test puts "This is a singleton method `test' of the Array class" end

SQL Job Queue的寫法

最近網站要Deploy到MySQL上才發現之前寫得很多都有問題或是效率不好。 之前對於Job Queue的寫法是這樣寫: def pop(): stamp = time() db.query(Table).update({'stamp': stamp}) return db.query(Table).filter_by(stamp=stamp).all() 後來發現原來MySQL有SELECT .. FOR UPDATE的用法(是不是該修一修Database了XD) 加上了FOR UPDATE後,目前被選到的row就會被Lock起來。而其他的Process如果選到了 同樣的row,就必需等到commit後才能繼續。 所以就可以寫成: def pop(): records = db.query(Table).with_lockmode('update').filter(Table.status == 'NEW').all() db.query(Table).filter(Table.id.in_([x.id for x in records])).update('status': 'QUEUED') db.commit() return records 由於我們把status設成了'QUEUED',而在select時選擇Status為'NEW'的row,所以並不會造成conflict或是lock wait。 這樣的寫法好多了,而且在MySQL裡也比較不會出問題。

Embedded System Final Project

圖片
Embedded System Fianl Project, utilizing 1. Qt-Embedded 2. libchewing (big thanks to Jserv) 3. SQLite 4. QtWebkit 5. ibus-boshiamy Sources can be found at github Here's a video which I demonstrated on our final project meeting. (Sorry for the bad quality)

嵌入系統實驗PXA300 Lab3

圖片
Ubuntu on ARM Machine? No way. 其實是嵌入實驗做的數位相框XD

資結HW2

讓我想到我小時候在哈電族上寫的文字編輯器XD 那時候寫的是有多個Mode的編輯器,有Insert和Normal Mode 所以那時候也要寫像這次資結的東西,移動遊標啊,插入,刪除等... 還因為要輸入中文,所以要偵測雙位元字元... 真的好懷念啊XD

Reference counting

前幾天有人在板上問了個有關C++ class內部member的記憶體管理問題,我那時後就寫了一小段Code來玩玩,所以順便丟上來XD Reference counting 是一種物件對內內部記憶體管理的方式。主要的原理是: 假設現在我有一個Class RefObj內部有一個char*的member用來存字串,那今天我把一個物件assign給另一個 RefObj A("testing"); RefObj B = A;

PttXP 更新至0.1.5

Version 0.1.5 * 終於修好了刪除標頭的功能 * 登入重試次數增加為5次 * 修正GUI Lag的問題 * 這次大大的修正了登入問題,幾乎不會再登入失敗了 詳細資訊請至: http://berelent.blogspot.com/p/pttxp-ptt.html

Debian/Ubuntu套件打包

很久以前寫過利 用dpkg-deb來打包套件 ,其實這個方法非常麻煩,我後來都改用dh_make了。 利用dh_make加上CDBS(The Common Debian Build System),可以很方便的建立出一個deb包,這也是標準的打包方式。CDBS演變到現在己經非常方便了,打包者幾乎不用作什麼事。CDBS可以處理非常多常見的build system包括GNU Autotools、Python的setup.py、Qt的qmake、make、cmake等等,支援的列表可以在 CDBS的Documentation 裡找到。 打包的步驟大約如下: 將套件壓縮成 套件名稱_版本.orig.tar.gz,並放在套件目錄的同層目錄 在套件根目錄執行dh_make -s -b。-s表示包裝成single binary,-b表示使用CDBS 編輯debian/control、debian/rules 在套件根目錄執行dpkg-buildpackage -rfakeroot 完成。

cbase

之前寫了一個簡單的進制轉換程式 叫做cbase。不過那時候架構沒有設計的很好,程式碼也很亂,所以我暑假閒著沒事就把他重寫了一次,這次程式碼短得多了,也比較靈活。 記得那陣子好像常常遇到要對數字做不同的基底變換,所以我才會想寫這樣的程式。cbase是一個非常簡單的程式,估計有稍微學過程設的大家都能瞬間寫出來,所以在這裡現醜了XD。 源碼丟在 github ,然後我也順便包了個deb包,要用的自行下載吧XD 其實cbase主要目的就是執行數字間的任意基底變換,比如說 IP IP其實可以看成是256進位的數字,所以如果要把他轉10進制(這可以做什麼我應該不用多說了): ~$ cbase -i 256 -o 10 -d . 119.160.246.241 2007037681

Web Crawler

今天無聊就想說來改一下manpages-cpp的crawler 因為原本那個實在是太慢了... 爬過全部的頁面太概要2個多小時@@ 原來的設計,cppman -r (rebuild index)這個選項本來就不是為user end設計的 而manpages-cpp裡本身就包含了已經cache好的index database。 所以我在rebuild index的功能上設計得很陽春,基本上只是個簡單的DFS。 不過今天我重新檢視了時間會如此慢的原因,發現原來問題是出在urllib.urlopen() 開一個頁面太概要0.7秒,不過這不是網路速度的問題。原因是在urllib預設的text buffer大小是0 所以每讀入資料就要重新分配記憶體,所以才會花到0.7秒。 我的解法是用multi-thread。不過有個很的問題是linux的thread limit 在我的電腦上最高只能開到323個thread,可是利用DFS隨便跑下去都幾百個thread 所以只好設了thread_max,如果要超過了就先join 這樣大概可以將時間縮短到13分鐘。2小時多到13分鐘這算是非常大的進步了。

py2exe Icon in Vista/7

因為Vista/7支援高解析度256x256的icon,所以要讓生成的exe可以同時在XP/Vista/7上顯示正確,就要同時包進256x256, 64x64的Icon。如下面紅色的那行。順序很重要256x256一定要在1, 64x64一定要在0,我試過只有這樣才會顯示正確。 # setup.py from distutils.core import setup import py2exe setup(     name = "NAME",     description = "DESCRIPTION",     version = "VERSION",     windows = [         {             "script": "NAME.py",    # In order to show icon in Vista/7 the first icon resources must    # be (1, "256x256_ico")              "icon_resources": [(1, "256x256_ico"), (0, "64x64_ico")]         }     ],     data_files=[] )

manpages-cpp

C++ Manual pages for GNU/Linux 詳細請看 這裡

GetTube

!!!!! This page is outdated !!!! !!!!! Please visit here to get the latest update !!!!! !!!!! 此頁面己停止更新 !!!! !!!!! 請到 這裡 取得最新資訊 !!!!! GetTube是一個用來下載YouTube影片的Python Script, 有文字模式和GUI 可以下載FLV, 3GP, MP4, MP4-720p(視影片而定), MP4-1080p(視影片而定), MP3 (0.6.0新增)。

Qt Runtime

Because Trolltech didn't provide standalone runtime library installer, I packed a runtime library using NSIS. You can download it from here: [ Qt-4.6.1-Runtime-setup.exe ] NSIS Script: [ Qt-Runtime.nsi ] List of Files: phonon4.dll Qt3Support4.dll QtAssistantClient4.dll QtCLucene4.dll QtCore4.dll QtDesigner4.dll QtDesignerComponentsd4.dll QtGui4.dll QtHelp4.dll QtMultimedia4.dll QtNetwork4.dll QtOpenGL4.dll QtScript4.dll QtScriptTools4.dll QtSql4.dll QtSvg4.dll QtTest4.dll QtWebKit4.dll QtXml4.dll QtXmlPatterns4.dll

OVFF嘸蝦米翻譯機

圖片
本來只有文字介面版的,這幾天用Qt寫了個圖形化介面。 這是我在GNOME上編譯的結果:D 下載:Windows Installer: [ gOVFF-2.1.0-Installer.exe ] Github 頁面: govff @ github

Assembly Final Procject

GIT版本控制系統

Git Wiki 寫ToyVM時開始使用Git,不得不佩服他的強大 下列是一些常用的指令 (其實看一下gittutorial和man page就會啦) * HEAD在git代表的是最後一個commit。HEAD^代表查看HEAD的parent,也就是上上個commit,HEAD^^代表HEAD的parent的parent。HEAD~4代表HEAD的parent的parent的parent的parent。假如你有branch過的話,HEAD可能不只有一個parent,HEAD^2可以代表另一個parent。 1. git init 這個指令會在當前目錄下創建一個新的Git Repository,也就是產生.git目錄 2. git add 將某的檔案加入索引(index)中,有就是準備建立快照(snapshot)的檔案。注意:這只是加入索引,還沒有真正建立快照。 3. git commit 為已加入索引的檔案建立快照。此時會出現VI(或者其他文字編輯器),讓你編輯commit註解(message). 以後每次都要git add,再git commit有點麻煩,所以可以利用:`-a'這個flag,也就是git commit -a。這樣git會自懂找出本來就加過索引的檔案,然後自動git add再git commit。注意是之前已經加入索引的檔案,新增的檔案要自己用git add加入索引。 -m "MSG" :可以將commit訊息附加在後面,這樣就不用進到文字編輯器。 --amend :是用來修改前一個commit的訊息,假如你在commit的時候把訊息打錯了,可以利用git commit --amend來修改message. 4. git log 查看log檔 5. git branch 顯示目前的分支。 如果branch後面有加參數,比如說git branch experimental,這樣就會產生一個新的branch。 可以在不同branch之間,對檔案進行不同的修改。 6. git checkout 切換目前所在的branch,git checkout experimental就會跳到experimental分支 checkout,也可以用來還原檔案,或是從某個comm...

ToyVM - 紀念一下

圖片
ToyVM是計算機組織與組合語言這門課裡教的TOY Machine的模擬器 本來只是自己寫爽的 寫的很簡陋 沒想到竟然被放到課程網上 結果只好改的完整一點囉 這次也順便學了git來管理版本 git真是好用阿! 恩 只是要紀念一下 畢竟ToyVM的生命週期好短... 大概只有一個多星期吧 以後應該也不會用到 所以也不會再改了 不過應該還是可以給學弟妹用~ 現在覺得這個其實大家都會寫,PO到資訊系版好像有點班門弄斧了Orz 原始碼和執行檔這 [toyvm-0.2.6.1.tar.gz] ,目前是0.2.6.1,應該是最後版本,課程網上的0.2.4.2 不過沒差都差不多,只是加了一些比較花俏的功能罷了 Show一下圖XD