2008年8月18日 星期一

使用全域熱鍵(Global hotkey)在VB .NET

這篇文章是介紹如何使用VB 2005來編寫可以讀取全域熱鍵(foobar翻成整體熱鍵)的程式,如果你是要找怎麼利用整體熱鍵,那很抱歉你可能迷路了XXD。
在開始寫程式之前,先來稍微介紹一下整體熱鍵的運作方式。
如左圖所示,一般來說,鍵盤上面的訊號是先送給OS處理後,經過管理程序再送給目前活動中(in active)的程序;所以當程式並不是在活動中,那麼自然就不會接收到目前鍵盤的訊號。
而全域熱鍵的用處就在於即使我的程式已經是在背景中,假如鍵盤有相對應的鍵被按下,我的程式也能夠做出想要的回應。而在XP系統下,提供了一個動態函式庫來讓我得以達成以上的需求:user32.dll。我可以藉由user32.dll向管理程序去通知說,我也要接收某些特定的鍵盤訊號,不論我是不是在活動中。註冊完畢後,當鍵盤有訊號進來,管理程序就會看目前進來的訊號是不是有人註冊過,如果有,這個值除了會丟給目前活動中的程序,也會丟給我註冊過的程序。
打個比方好了,就像是像在很常見的網路促銷活動,在一般的情況下如果要知道某商家有沒有特價或是促銷,只能透過商家固定的廣告來得到該資訊,或是要直接到賣場去才能看到。這就是一般的模式下情況,只有固定的一些程序(像是活動中的程序)才能獲得目前鍵盤的資訊。而假如我加入商家的會員,或是到他們的網站上去註冊,那麼就只要打開email(或是實體信箱),就可以知道商家最近有沒有什麼新的特價方案,就只要等著商家就會把訊息傳過來。我的程序也是一樣,一但完成了註冊的動作,負責管理鍵盤訊號的程序就會在有我所觀察的把訊發生之後,一並通知我。
所以在程式的一開始,我必須做這兩行的宣告:
Private Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Integer
Private Declare Sub UnregisterHotKey Lib "user32" (ByVal hwnd As IntPtr, ByVal id As Integer)
告訴程式說,在接下來的程式碼中我需要這兩個從user32函式庫中的函式。
接下來的步驟比較繁複一點,須要參看程式碼,不過部落格中的空白都會被清空,內縮的格式會跑掉變得很難看,所以程式碼就貼在google文件中,連結在這
從form load開始看起,可以看到其中只有一行程式碼,裡面寫的是RegisterGlobalHotKey這個函式,目的是完成整個註冊全域熱鍵的動作,如果懶的去改直接就整個抓去用。比較要注意的是,取得hotkeyID的atomName,原程式碼中是利用threadID去做,不過用這麼麻煩的東西是可以用拉~。而其中 GlobalAddAtom函式就是取得一個類是hash code的東西,他會在系統的atom table寫入原字串以及獲得的atom(類似hash後的key值),在此程式中是利用此函式來得到用來註冊的hotkeyID值。
從form load上面一點看,會看到許多常數的宣告,那些是代表alt, shift, ctrl之類的鍵,不用做任何改變就可以。然後既然有註冊hotkey,當然也要有反註冊的函式UnregisterHotKey,當我們程式要結束的時候通知一下,這個程式已經死掉拉~~不要再寄訊息過來了。所以就照著程式碼那樣把反註冊函式寫完整在UnregisterGlobalHotKey,然後補在form closed(或是closing都可)裡面,讓程式結束後可以把hotkey反註冊掉。
接下來就是最重要的地方拉,如果要讓全域鍵按下後程式有所反應,程式碼就要寫在WndProc裡面。這個函式主要是接收從其他程序丟過來的訊息,所以當丟過來的訊息使說有使用者按下了我所設定的全域鍵,那麼就要給他好好處理一下拉。如果有要在全域熱鍵按下後所執行的程式碼,那麼就要寫在If m.Msg = WM_HOTKEY的裡面。在這個範例中,只做了一個計數器,來計算全域熱鍵被按下幾次,並且在全域熱鍵按下後,將自己設定為活動中的狀態。
這篇就寫到這樣吧,如果要加入全域熱鍵,直接把整篇程式碼給加進去其實也就差不多了XXD,只要把一些地方給改變一下,像是全域熱鍵的設定、按下熱鍵後的處理等比較重要的地方改一下,就可以用了。
在網路上還有找到另外一種做法,一樣是利用user32這個函式庫,又興趣的人可以參考一下^^。
參考網址:
http://www.codeguru.com/vb/gen/vb_system/keyboard/article.php/c4829/
http://www.vbforums.com/showthread.php?t=506461

2008年8月10日 星期日

將音樂檔案轉換成TAK格式

ㄐㄧㄤ~因為上一篇聆聽TAK音樂檔案看起來增加了不少點擊數,所以就先把這篇給補起來吧。^^
其實要將檔案轉換成TAK其實還蠻簡單的,首先到TAK的官網下載最新版本的編碼器(encoder)。目前最新的版本(打這篇文章的時候)是1.0.4
下載解壓縮,可以發現有幾個資料夾:
  • Applications
  • Deco_Lib
  • Sdk
  • Winamp
而要編碼須要用的只有Applications資料夾內的東西,其他就參看Contents.txt裡面的解說,其中有寫各資料夾內含物是什麼。
在這裡利用foobar2000配合takc.exe來進行轉檔,foobar真是個不錯的東西阿,不但可以拿來聽音樂,支援多種音樂格式,也可以透過各種不同音樂的編碼器來對音樂檔案進行轉檔。把在剛剛解壓縮後的資料夾Applications內的takc給複製到foobar資料夾下(這樣以後管理編碼器可能會比較方便),這樣檔案的準備工作也就可以說是完成了,等等就要開始參數的設定工作。
  1. 打開foobar後,選擇Preferences,然後在Tool中選擇Converter。
  2. 在Converter畫面的中間有個Encodeng Presets,在其右邊選擇Add New。
  3. 最上方的Encoder選擇custom,而接下來那個encoder則是編碼器的路徑,在這邊是Takc.exe的路徑。Extention則填入tak;Parameters請填入-e -ihs -p2 -overwrite - %d;中間那bit depth control不用管,用預設值即可;Encoder name當然就填入TAK,setting就填normal吧。
  4. 在播放清單中,對想要轉檔的檔案按下滑鼠右鍵,選擇convert=>convert to=>在encoding preset挑選 TAK normal就可以把該音樂檔轉成TAK格式。
知到了該怎麼去設定參數,那麼也應該了解一下參數所代表的意義。我們這邊用的參數是:-e -ihs -p2 -overwrite - %d。其中-e是代表我們是要對檔案編碼;-ihs是要給多執行緒用的特殊指令;-p2是壓縮比的模式;-overwrite是直接複寫掉已存在的檔案;%d是foobar給的檔案名稱。

這邊比較重要的是壓縮模式,tak總共提供了6種不同程度的壓縮,由p0到p5壓縮比越來越大,壓縮所需要的時間也越長;另外每個不同的程式還提供了該程度的最大壓縮m,與該程度較高壓縮的e,像是p1的最大就是p1m、較高就是p1e,p2最大就是p2m、較高就是p2e,p5最大則是p5m,也是所有壓縮比中最高的,也可以用pMax來表示。所以6種不同的程度再加上每個壓縮程度還擁有一個max與Extra,所以全部共有18種不同壓縮的比率。雖然官方所認定的noraml是p2,不過記然要壓縮當然要壓最高,所以一般在使用還是會設定到pMax,雖然在編碼的時候需要多花點時間,不過壓縮比還算高,而且也比ape的解碼速度還要來的快。

除了使用foobar配合takc之外,也可以直接使用官方所提供的壓縮解壓縮軟體,與takc同一資料夾內的tak.exe。操作也不難,選擇compress(壓縮)後,把要壓縮的檔案(wav檔)加入,並在option設定好一些參數就可以了。不過因為只支援wav檔,基本上還是foobar來的方便。

這邊也有教學,只要會一些簡單的英文就可以看得懂,如果是使用EAC的人可以去參考看看,這邊因為沒有玩過EAC所以就不寫了~。

p.s. 這篇東西老實說寫的我很灰心,怎麼寫都沒辦法合我的意,寫出來的東西有點...如果有人能夠提一些如何改進這篇文章的意見我會很開心的XD。

2008年7月24日 星期四

談假考部隊

ma...記然是小學生,基本上還是和教育拖離不了關係阿~~(茶
從今天大學聯考前,假考部隊的消息就一直不斷的流出來,除了之前颱風淹大水的新聞把這件是壓掉了好一段時間外,一直到今天剛好是大學網路選填志願的第一天。所以今天就無聊上網看看,有沒有網頁可以一探究竟。不過沒想到除了新聞之外,大多是一些批評的文章,讓人有點失望。
很多人都在擔心,假考部隊會造成怎樣的後果。有的人說會影響考試的公平性,有人說被否認了他們的努力,有人說這是藐視弱勢。我說,終於看到這塊土地的成長,雖然還差得遠。從這些批評當中,我們可以看到許多人已經跳脫在反對的這塊思維,進而到反反對。這是一種進步,是讓人高興的,不過為什麼還差得遠呢?因為放長遠一點來看,假考部隊是一種"現象",或是一個"結果"。而不是一個"因"。批評的人只看到這個現象所帶來的後果,而恐懼擔心。但真正應該憂心的不是現象,應該是造成這個現象的"因",其從何而來?
說穿了,假考部隊不就是台灣社會變遷中的一附帶現象。他的訴求很簡單明瞭:加速大學的退場機制,目的是:提升大學品質,如此而已。
那出現的原因呢?太多太多了...要談太麻煩了,所以就不談了。
屁!就是麻煩事才要談,台灣的每一個錯誤的政策後面,都有太多的原因。不過可以做個簡單的假想歸納:事情是要有人去想要達成才會去做,有很多人的希望,所以有人為了完成別人的願望所以去做,然後有人把這些件事(大家的願望)弄成了大家的事,這就變成了政治。不管中間的過程如何,政策的後面是人的期望,這篇土上的人的期望。不過我們也知道,這塊土地上的人太過於純樸(尤其是前一批的生產階級),一心只想要有個好環境,一直努力消耗、生產。不過,現在的我們知道了新的想法,另一種思維。過去的人不是錯的,但現事是有問題的。解了"因",接下了就是去"改變現況"。
從現象下手嗎?那就太膚淺了。
那?解現在的問題,只有新的想法,只屬於現在的方法。從根本上,我們的教育已經有在改變,我們的孩子現在學習的,思考的已經不同於以往。這條大學之路是否正確,應該要讓他們(準備上路的那群人XD)來思考。

後記:我覺得市場機制還不錯,只不過要建立在健全的認知上,不少台灣人還是不能接受。也許...台灣接受共產也是另一種選擇,我不喜歡就是了...

2008年7月23日 星期三

VM Tools安裝小筆記


最近系統說實在有點不怎麼穩,要我在繼續拿牠來測試新軟體老實說,有點於心不忍,不知道再這樣摧殘下去還能夠用多久...所以就又拿出來VMware。這次的host OS與Guest OS都是XP,理論上對我來說應該式小菜一碟。不過沒想到之前聽說還蠻好用的FastXP(乾淨+SP3),居然在這次安裝中頻頻失敗,一氣之下還是用回傳說中的鬱金香。比較神奇的是...之前一直設定失敗讓我決心砍掉整個VM的網路,居然沒兩下就弄好了。為了下次安裝這邊也來個筆記,最主要的是把VM 網路設定裡面去看一看,把NAT、DHCP都打開,然後把Gateway的位置找到並記下,預設好像是192.168.191.2,192.168.191.1則是host OS的IP。然後把這些資訊在guest OS設定完成就可以了。
安裝完後接下來當然就是要測試軟體阿,不過除了利用網路之外,VM在5.5以後就有提供VM Tools這支工具來達成更簡化的操作。比較常用到的就是支援host os與guest os之前的拖曳,以及其切換不再需要一些特殊的動作,只要滑鼠移到該界面上即可使用。安裝方法如下
  1. 進入guest os中
  2. 在工具列上點選VM=>Install VMware Tools
  3. 開啟guest os中的光碟機,並執行其安裝程式(VMware會暫時將光碟機 map到安裝程式)
  4. 完成
在host os這邊倒是不需要做什麼設定,主要是要注意他會把安裝程式放到光碟機中。另外一個分享資料的方法就是用它內建的Shared folders,在設定上很簡單,只要在工具列上選擇VM=>Settings,然後選Options就會看到設定的項目,再逐一把想要加入的資料夾加入即可。比較麻煩的是究竟設定完後,要在哪裡才找的到這些資料夾呢?答案就是在\\.host這台電腦中!在"網路上的芳鄰"的網址列打上\\.host,資料夾就會出現拉~~。為了方便起見,可以把該資料夾直接設定為網路磁碟機,在每次登入的時候連線,這樣就可以每次開機都可以看到該資料夾的內容了。使用Shared folders的好處是不用同一份資料還要再guest os再佔一份空間,這對只要拿來安裝的檔案或是只有要讀取的檔案都不錯用喔^^。

2008年7月21日 星期一

聆聽TAK檔案格式的音樂


最近稍微將這整個Blog的標籤做了一些小整頓,稍微看起來比較像樣子了。話說google給的標籤範例有問題啦~明明分隔符號是英文的逗號",",但是他卻用頓號"、",害我之前打的都有問題,也懶得一個一個改了,目前就是有事沒事就跑來改一點,看看能在民國幾年能改完XXD。

進入正題,最近開始出頭的音樂檔案格式TAK,相信還沒多少人聽過(在這篇文章生出來的這個時間)。他的全名是Tom's lossless Audio Kompressor,德國出產,首頁。新東西出來就是有新東西的缺點,目前僅有少部分播放軟體支援。在中文環境下,我想能夠被知道且可以支援的軟體應該就只有Winamp以及foobar2000,其他常用的像是MPC、KMPlayer、WMP等都不能。下面就分別來說明要怎麼來播放:
Winamp
  1. 首先到到TAK官網去下載TAK最新的版本,在Download下面就可以找的到,目前是到1.0.4。
  2. 把下載的檔案解壓縮後,會有一個名稱為Winamp的資料夾,把裡面的in_tak.dll複製到系統中Winamp所在的資料夾下的Plugins資料夾。也就是放到"Winamp所在資料夾"\Plugins這個資料夾,系統預設值是C:\Program Files\Winamp\Plugins。
  3. 結束~刪掉下載的壓縮檔與解壓縮的檔案。
foobar2000
  1. 到foobar他朋友家foosion去下載TAK Decoder。基本上要foobar2000 0.9.4以後的版本才有支援,這邊貼個給0.9.5用的快速連結
  2. 將壓縮檔解壓縮後後,把tak_deco_lib.dll複製到foobar2000所在的資料夾。
  3. 把解壓縮後出現的components資料夾裡面的foo_input_tak.dll複製到foobar2000資料夾下的components資料夾,也就是"foobar200資料夾"\components。
  4. 如果要做檔案關連的話,就把icon資料夾內的檔案也複製到foobar資料夾下的icon資料夾。
  5. 完成~刪掉壓縮與解壓縮的檔案。
其實還蠻簡單的拉,不過在個人常用的foobar下還需要考慮到版本問題實在是有點...
目前已經完成使用foobar2000來encode TAK檔案,下次在來PO上來關於編碼的一些參數設定吧^^
參考連結:http://www.hydrogenaudio.org/forums/index.php?showtopic=54721

2008年7月14日 星期一

VB2005豆知識第一彈


很久沒有來發一些文章了....沒事還是要來補充一些料才好~^^。所以這次的內容就決定是來小談一下一些VB2005比較少人會談到的東西。基本上每個豆知識因為本身就是豆知識,所以當然內容也不會很多,究竟一次該弄多少料出來呢....我也不知道!而老實說呢...料也不多啦~~等改天有需要的時候自然會去研究然後就自己跑出來了~。

首先呢,先來補一下之前說要玩VB foreach的東西,其實我記得大約是寫完那邊JAVA的後一到兩天就玩完了,不過沒啥機會能夠順到PO就一直放在那了XXD。如果要能讓某個類別能夠支援foreach,就必須先實做IEnumerable界面,另外這個介面還需要一個Enumerator,所以必須還要再有一個類別是實做IEnumerator。說穿了,其實就是用一個Enumerator去逐一把整個陣列(或是串列)中的值一個一個丟出去,所以IEnumerable借面就是負責去丟Enumerator給外面呼叫foreach的地方。所以這邊也可很清楚的看到,使用foreach是絕對不適合用來改變Enumerable類別內的值。【範例檔下載

一開始講就講foreach可能會讓人霧撒撒,沒關係,接下來講點比較簡單的!來談談要如何在VB 2005裡使用外部參數。這邊的外部參數的定義就是像是一般我們在執行程式的時候,有時候為了做一些特別的需要會把參數打在後面,就是檢查網路有時候會用到 ipconfig /all 後面的/all,或是檢查磁碟機時下的指令chkdsk c: /r 後面的c: /r。在C或是JAVA中,我們可以很簡單的重main後面去抓args,那VB2005呢?
其實很簡單,他就在My.Application.CommandLineArgs,要去使用他的話可以用foreach去把裡面的值全部讀出來,然後去做你要的處理就可以了。至於範例就免了吧,太簡單到沒辦法寫了...

那就來期待下期會出現什麼吧!!
如何使用drag and drop
如何使用剪貼簿
如何減少ListBox增加大量資料的時間
如何使用DataGidView表現出類似StringGrid的感覺

嗯....接下來就要等我看還有沒有想到什麼了...

2008年6月9日 星期一

淺談認識正版

會想到說...要寫這篇的原因其實很簡單,玩電腦這麼久,什麼是盜版自己也知道。但是還是有超多的人聽完智慧財產權的宣導後,還是一無所知(基本上都在睡覺)。剛剛好6/1號聽說什麼聯盟要開始查公司內部使否用盜版軟體,所以就來簡單寫一下,什麼才是正版軟體(當然,不是正版就是所謂的盜版了)。

從最簡單確定你用到的軟體(或是其他媒體)是不是整版的方法就是有沒有獲得授權!只要有授權,就是正版的。那麼,另一個問題又來了,什麼是授權?在市面上各種不同的軟體都會擁有各自的授權方式,要得到授權不外乎就是跟該軟體製作公司購買取得。而對終端消費者而言(就是一般非公司、非公眾的使用者),逐一跟軟體公司取得授權老實說太麻煩,所以就會有一般我們在市面上看到的零售版本。所以普通的終端消費者購買零售版的軟體即可獲得授權。而在軟體包裝內,都會附有授權書(如果沒有看到,那就是買到盜版了)。授權書中都會詳細記載授權的使用方式,像是合理使用的範圍,授權的數量。這邊要注意一下,除非有特別註明,否則每一份授權將僅能使用在一台電腦上

換句話說,如果家中有三台電腦,你想要為他們都灌上一套正版的防毒軟體,你就必須買一套擁有三分授權的防毒軟體,或是購買三套普通授權的防毒軟體。
小總結一下上面所說的,我們可以作簡單的定義:所謂正版(對於軟體來說),就是在一台非公眾電腦上,取得一份普通授權。就拿遊戲來舉例好了,目前市面上能買到的單機遊戲(非網路遊戲)都是一般單份的授權。所以今天我買了一款遊戲,安裝在我的電腦上玩,OK,正版。但是,假如今天我的同學買了一款遊戲,他很慷慨的把遊戲光碟借我要讓我玩,問題就來了,獲得授權的是我的同學而不是我,光碟只是一搭載軟體的媒體,當我一把這塊借來的遊戲一灌到我的電腦上,非授權的使用行為就是確立發生(除非授權中有提即可以轉借,但是一般的單機版遊戲是不可能會允許的),也就是我獲得了盜版。

同理,今天小明買了一款新的作業系統,安裝在他的電腦上毫無疑問的他使用的是正版的作業系統;而我跟他借"正版"的光碟來灌在我的電腦,因為我沒有獲得任何的使用授權,所以我用的就是盜版。換個角度想,今天我買了一套軟體,基於合理的使用下,我可以為這套軟體作適當的備份(也就是拷貝正版光碟)。當有一天,正版光碟因為某些原因而損毀,我就可以拿出拷貝的光碟繼續使用,而不致變成盜版的使用者。因為我是取得了這套軟體的使用授權,所以就算我用的來源光碟並非是正版買來的,我也非盜版使用戶(這是基於台灣法律中合理的使用範圍內)。

真正比較麻煩的是非上述一般的簡單授權(一機一份),不過在講下去之前,不得不提到除了要付費取得的授權之外,也還是有可以免費取得授權的軟體。在網路上可以看到許多試用版的軟體都是可以免費取得並使用,只是這些使用都帶有附帶條件,必須注意其授權的範圍。或是你可以找到一些可自由散發的軟體,在使用上沒什麼限制,不過在轉散發的同時,通常這些軟體會有一些特殊的要求像是連同源使碼一起含帶散佈等使用上的規定。這些軟體授權都會很清楚的寫在其網頁或是安裝的訊息當中,一般正常的使用上也不至於會變成盜版使用者。不過假使使用像是軟體序號產生器,軟體註冊機,軟體cracker等程式來延長軟體的使用期限或是獲得軟體的完整功能等不當操作,一樣是盜版喔(因為你只獲得受限制的授權,而沒有獲得完整的使用授權)。

再說回來,關於大量授權與公眾電腦的授權又跟上述有一些些的不相同。所謂大量授權一般適用於公司或是企業中多台電腦需要同一份軟體的使用,而其電腦大多是專屬於某職員使用(單人單機使用);而公眾電腦則是同一台電腦上有可能許多不同的使用者來使用,像是一般學校的電腦教室。這些特別的授權必須要跟該軟體公司洽詢,每家軟體公司的授權皆有不同的規定,不一定完全符合上述所說。當然,授權的價位也是...洽詢!!

就小弟所知,大概就是這樣,有任何錯誤趕快來嗆我,我再來修正科科。

2008年6月6日 星期五

失血


最近一直在考慮要不要去買新的DVD空白片,因為之前買的一大推庫存被我一直燒燒燒,燒到剩下最後一盒沒有拆封的的春の歌,連CD片和DVD+R都沒剩了。最近也把剩下的那盒
春の歌也要燒完了,一直再找時間去補充一下新貨,順便買一點雙層片回來,科科。

最近也一直在考慮說,要不要買顆電池,畢竟要外出拍照還是不可少的,而之前那顆副廠電池已經有點怪怪的,在給我拍人家的社團成果發表會時,撐不到結束就沒電了...結果拍完回來電池電量又顯示有一半...

所以呢,就稱今天這個要去高雄接我妹的機會,順便去建國路走走。先到了建國路那家專門在賣Nikon相機的德寶,一進去,靠,怎麼這麼多人。在那邊探了一陣子還找不到什麼人可以幫我,只不過是小假日ㄇㄟ,這麼多人都很閒嗎?終於抓到一個有空的人幫我處理一下我的request,不過我只知道我的相機是D50,電池型號我倒是沒有記,那個有空的人也不知道D50該用啥電池,就問了一下店老闆。這讓我其實有點怕怕的,怕買到型號不同的電池還要多跑一趟,不過回家找了一下資料,確定是沒錯啦。報價是1400,比我想像中的貴將近一倍。猶豫了一下,不過既然跑了這趟,不買好像有點可惜,買了基本上多一顆電池也比較安心(雖然平時都沒再用>"<)。不知道這樣的價錢有沒有買貴,上網查了一下(網路真的還蠻方便的),看來這家店人多不是沒有原因的(後來在路上多少有看到其他的相機專賣店,人數也是還好),P入口網站的商店要賣到1800,Y拍最便宜也要1400,不管北部還是中部。跟我想像的差不多,原廠電池的差價應該會不差到哪裡去,只看店家有沒有良心。

買DVD片本來都是到建國商場裡面去,不過因為順向的關係,乾脆就在建國商場對面的光碟超市買一買。嗯,裡面居然沒賣春の歌,讓我小失望了一下。不過還有很多其他片子,這是就不買DVD-R了,從此改用+R吧!!不過可能還是要適時的去補充一下-R片,不然就不能製作可以讓DVD player吃的DVD片了(現在好像有機子可以吃+R了?)。順便也買了已經空窗很久的CD片,為了弄給我家那台汽車可以吃的音樂CD;另外也買了一些DL片,有空又可以來備份檔案拉,之前我的照片用單層片燒了好幾張,用雙層也可以節省不少光碟量。這樣買一買剛好500元(DVD+R一盒50片350元,CD10片50元,DVD+R-DL5片100),不好殺價~"~,算了,就降吧。

就醬,本來預計一千多就可以搞定的兩樣東西,花了我將近兩張小朋友。在加上最近因為已經期末要畢業了,有點沒在節制的跟同學出去吃"好料"的(牛魔王,幸福調味,白色希望,DH,明洞等),伙食代急速竄高,看來真的要調節一下了...

2008年5月31日 星期六

今天的晚餐

呵呵~昨天突然想到要吃義大利麵,所以今天就來做啦~!!
主要是想做燻雞風味,看看和別人做出來有什麼不一樣XXD。所以就先來煮麵吧!!包裝上是說放入滾水中滾個9分鐘,不過事實上,九分多的時候吃起來還有生麵的味道,所以就多煮了將近10分,不過還是不算到軟的程度。最後就是瀝乾等調理拉。


接下來是順便煮個湯,今天因為弄到了白醬調理包,所以還是煮個海鮮濃湯。


這邊是濃湯的配料(左邊的三包)


然後神奇的事發生了,湯就已經做好了~"~。後來覺得不夠稠,勾了一點芡。我媽也加了一匙的鮮奶油,不過這讓湯出現了許多白點~"~。接下來是進入今天的重點,白醬的製作,先把一些配料炒香。


然後丟入義大利麵與甜椒,最後淋上水加白醬包做成的液體,均勻攪拌。


接下來就稍微悶一下,讓麵入味。做好啦~~然後是盛盤,因為手殘拍了影片,谷歌似乎不能直接連相簿的影片,也懶得重新上傳。丟連結吧!!我是盛盤
成品來個一張。


不可或缺的,再補一張與雞仔的合照。


換個角度在一張啦~~

最後就是評論拉~其實因為偷懶用了白醬包,覺得成就感少了很多,味道也沒有那麼的恰到好處。在湯的方面,還不算難喝拉,不過應該是少了牛奶的香氣,感覺就差那一點。至於麵的話雖說這碗式燻雞義大利麵,不過燻雞因為是買便便的,就反而不是很在意XD。主要重心是放在麵與醬汁的搭配。自己覺得也是還好,也是少了一種香氣,也沒有很順口,可以讓人想要把整碗醬汁喝的一丁點也不剩。嗯...不知到哪時候還要再來挑戰一次。

番外篇,這次把500G的筆管麵全煮了,結果盛碗的時候才發現,基本上三人份只需要半包(250g)即可,剩了不少放冰箱...

去日本玩的注意事項


時間:日本要比台灣快一小時,所以要記得把手錶調快。不過..這樣我這種晚睡的人來說,不就等於更晚睡了嗎?不過習慣之後回來就可以早早睡了~"~
接下來用食衣住行育樂來大致分一下應該注意的事情:

食:沒什麼要注意的,日本的東西雖然貴,但是也是去這麼一次,多買多吃吧。另外自來水就是飲用水,用買的話...基本上都要500日幣以上。另外農產品還不錯,一定要嘗嘗!?

衣:在泡湯旅館裡面基本上就穿浴衣吧,要注意浴衣的穿法是右下左上。

住:大多房間為榻榻米,如果有特別需要得事先跟導遊說。廁所衛生紙請丟馬桶。

行:走路開車都是靠左

育:這...不是教育考察團應該不會去弄到這麼方面。

樂:基本上,大多事項會集中在這,因為本來就是去玩的阿XXD。所以在大至列出幾條吧。
1.日本商品為不二價,並為外含稅(也就是說,看的到商品價格還要另外加上5%才是實際上的價格。)
2.打電話請在先撥001886(或是0041886)接下來接區碼,然後是電話號碼。手機的話就是把打完前置碼後,把第一個0去掉的剩下號碼打上去。撥電話個例子:高雄縣的123-4567 => 001-8867-123-4567;手機的例子:0912-345-678 => 001-886-912-345-678。
要打電話的話基本上建議使用電話卡,在各大車站接有自動販賣機,要購買的時候請將紙幣人頭面朝上。如果要使用手機的話,要有3G的手機才可以漫遊(因為日本手機是phs),不過漫遊費加一加每分鐘要價台幣72元...請三思。另外有出租手機的服務,可以打日本內手機便宜(但跟團基本上用不太到)
電話卡有分NTT與KDD兩種,分別只適用於他們自有的電話亭。電話為11點以後有折扣(打台灣才10點...不會太晚XD)
3.日本泡湯為裸湯,另外建議自己準備一個袋子去泡湯(裝衣物+盥洗用具)
4.因為回台灣能兌換的錢(日幣要換回台幣)只有整鈔可以用,所以...回來錢把零錢用完吧。
5.可以帶個筆記本,記錄一下一路上的心情筆記!?另外,因為日本各大站都有紀念章可以蓋,可以去留個紀念。
----以上是旅行社用說的,以下是網路上的
1.泡麵可以不用帶。一來是因為泡麵容易被壓壞,佔空間,二來日本也有不錯吃的泡麵,可以去嘗看看。
2.不要買藥品,台灣的就很好了。便利商店的東西倒是可以多看。
3.旅行支票不好用,刷卡會被抽兩次,以現金最佳。
4.日本氣候較為乾燥,可以隨身攜帶乳液。
5.可以注意一下水溝蓋,聽說每個地方(北海道)的水溝蓋各有特色

2008年5月30日 星期五

轉換跑道~

嗯...從今天開始阿~小學生的網誌要開始從程式寫作轉為美食報導啦~~(灑花)
哈哈,隨便說說的,其實呢重點在下一篇吧?
好吧結束一下那些看不懂的文字。來介紹一下今天剛寄到我家的東西,發文附圖是一定要的啦~!首先我們可以看到,哇~~多可愛的小雞仔阿,只可惜今天主角不是他。是中間那從黑貓運來的神祕箱子,旁邊的零錢是用一張小朋友找回來的...

那趕緊來看看這到底是什麼阿~~仔細看了一下,品名:好吃的包子...
來看一下傳說中好吃的包子長怎樣...嗯,其實就大大扁扁的。因為馬上就到冰箱去了,所以就沒再多照了。

最後是...內容物的收據。看起來還不便宜。
至於吃起來怎樣?不跟你說...自己吃就知道了,哇哈哈哈,這篇文章上來的時候我已經吃了幾顆了。不過傳說中的泡芙居然被丟在冷凍庫...不給我吃~"~

2008年5月26日 星期一

絕交!!


說來不知道能不能算好笑
看著日子一天天過去,已經沒有以往那種成長的喜悅
取而代之的是眼睜睜看著自己已經不再年經,卻還是不知所措

想到小孩子之間的絕交
反而是一種令人覺得幸福的味道!?(後來沒復合的不算)
為了一件小事而吵架,兩人大聲攘攘,最後氣而將絕交兩字脫口而出
然後滿腦子都是對方的錯,自己的不甘
接下來是從不能解對方到嘗試去思考,然後對自己懊惱
最後道歉,兩人又手牽手一起開心玩去了。
長大了,能生悶氣的時間延長了
能不爽對方的話變多了,能閃避對方的方法增加了
也許能放下的東西也變多了
不過放下的是曾經的回憶,還是對方的過錯?
只是剛好恰巧想到上面的東西
最近就又有類似的處境發生(或是說很久沒處理的?)
其實說實在的,如果不曾在意過對方,就不會有上述的東西發生
只是越在意,受傷也越深
相聚總是緣份,珍惜自己現在所有的,我相信至少珍惜不會有錯

2008年5月9日 星期五

For Each 面面觀與實作

今天要來討論的是...很快樂的for each!!目前眾多OO程式語言都有支援這類的語法,在不需要index的時候用起來還蠻方便的。我們知道說,像是在眾多的implements collection的類別中,都可以使用此語法,不過在一些我們所設計之特殊的資料結構(ADT, class)上,往往可能需要此類語法的支援,那麼怎樣才能夠針對我們所撰寫的資料結構,讓for each也能夠跑呢?

像是Ruby在前幾篇文章就有提到說,要如何實作其for each語法。在Ruby中是使用了Block的觀念去把上層的程式碼交給下層來處理,也就是說只要能提供類似 .each方法,逐一將直送進yield中即可達成我們要的目標。所以今天我們就來討論一下在JAVA要怎樣來實作。

首先我們先觀察一下目前有哪些類別可以被for each實作...google很快就跟我們說,像是List、Set、HashSet等等,繼承這些介面的類別都可以。透過查看Java doc我們可以很簡單的查覺,這些介面都是繼承於一個名叫做Iterable的介面,點進去看一下,嗯...很好,很清楚著寫著說,只要實作此介面者,都可以被for each所使用,只要在類別中把方法Iterator iterator()實作即可。於是,我們可以在繼續往下觀察Iterator...不過這邊就不再寫下去(學會看Java doc畢竟是基本工不是嗎?再說下去就會汙辱到看官的智商了)。

整理一下目前的情報,如果要能實作for each就必須實作自Iterable;而要實作Iterable,就必須要提供一個iterator。而一個iterator就需要實作三個方法boolean hasNext()、E next()、void remove()。其中remove則不一定要寫程式碼在裡面,看需求而定。而這邊就提供一個簡單而沒啥意義的簡單範例


因為這個blog本身不適合張貼程式碼(空白會被吃掉),所以就將就一下,對照著看唄。在這個程式碼中,Node是最基礎的元件(類別),一方面是為了將抽象化的層次提高,另一方面則是Iterable本身需要參考的類別(ADT),而不能是基礎資料型態。而Nodes當然就是我們所需要的可以被foreach之類別,裡面提供了加入和刪除。最後是實作Iterator的Itr,基本上將Iterator放在Iterable的子類別是個不錯的選擇,可以很容易自在的取得上層類別的方法與物件。不過這次我是將整個Iterator寫的比較鬆,以利往後也許還有機會可以直接抓過來用,僅僅在remove用到了上層類別的delete,如果不要remove,獨立出來也是可以。

所以其實整個實作的重點就在於要丟出一個Iterator,其可以提供判斷還有沒有下一個元素(hasNext),亦要提供一個方法可以依序丟出集合中的元素(next)。Iterator 怎麼實作就是隨意了,不過基本上還是跟實作Iterable的類別脫離不了關係。這麼辛苦做出來的東西...實用性有多大是不知道(範例是沒啥用的XD),不過如果善加利用也許能夠增加整個程式的效率。

而如果覺得寫那麼多,卻沒啥fu,那還不如直接去繼承ArrayList等類別,善加利用類別中已經提供的方法,還是可以達到製作容器的目的,而且人家早就把程式碼寫好,可以專心處理類別中的其他部分,照樣還是可以用foreach。
(下次來挑戰看看VB好了XD)

2008年5月5日 星期一

動畫資料庫

最近可能真的是有給他閒到,更新Blog的頻率已經高到令我自己都不太敢相信...
好吧這是題外話XXD。在更新完上一篇文章後,翼神龍突然問我說,有沒有收到某部動畫,而且是DVDrip版的。這個問題真的考倒我了,目前我這邊的動畫清單收錄的資訊僅僅有:動畫名稱、英文名稱、已燒錄集數、是否完檔,完結等等,其他都沒有,而我記得放那部動畫的光碟目前正在外面,所以當然是不知道啦。這時候我突然又想起了一個好久沒有完成的計畫:動畫資料庫。這個計劃是從去年暑假七月,因為收的動畫量已經不是一般的少了,所以逐漸開始有想要整理的想法。不過一直遲遲因為沒辦法決定一些格式與定義所以完成不了,最後因為懶得整合兩個分開撰寫的部分而放棄(其實是因為兩邊寫的時間不同,資料庫用不一樣不能轉換~"~)。


而在翼神龍大大的提醒之下,想說試試看寫一些東西吧,反正最近不是在寫ACM,不然就是在掛網、上B、聊天等等。今天是撰寫的第二天,也差不多完成了這個部份的工作。花了兩個工作天,作後的決定是延用後來的的資料庫版本,依循之前的轉換程式重新寫一遍。先簡單說明一下之前的動畫庫資料庫,首先我把它分成兩個部分分別撰寫,其一是負責搜集檔案名稱,並將其轉換成資料庫格式並儲存(簡稱A部分);其二是負責顯示與讀取資料的內容,並含有搜尋功能(簡稱B部分)。B部分在乍看之下應該是沒什麼問題,真正的問題在A部分的資料格式與B部分不符,要改不能只是小改而已...冏。所以還是重寫比較乾脆拉~~,而且整個UI也都改了。目前已完成大致上的基本功能 ,只要開啟資料夾,設定好參數,按下套用,基本上能從檔名讀的資訊都可以讀出來,其他的就還是要靠手動輸入。更改完成之後就可以按下存檔拉~~。另外由於某J的建議,加上了一個可以順便更改檔名的工具,一樣是利用參數。只要設定好參數,進入改檔名頁面,打入你想要的檔名格式,就可以即時預覽檔名,最後需要的話就按下確定吧^^。

另外,還有幾個無限期可能會做的小工具,其一是可以幫助使用者快速設定參數的小幫手;其二可能是可以自動判定參數的小程式,同樣可以用來幫助前面的程式。後面的程式可以利用經驗模式來撰寫,難度可能還OK。但是第一個光是卡在設計就很難下手了,目前還想不到什麼比較好的方式可以做到這項要求。

接下來應該是要整合檢視與輸入介面,這個也是考驗設計的一大問題。另外還有像是同一部動畫卻有兩三種不同的檔案格式,這種比較麻煩的問題,目前是列為已知但不處理,等有空再來玩玩看好了(問題還是出在設計UI上)。

這邊就直接丟上這個程式,不怕死的可以下載。檔案裡面順便附帶了可以參考使用的目錄。
點我下載

因為visual studio 2005系列寫的程式需要 .Net FrameWork 2.0,所以丟個網址上來

2008年5月3日 星期六

程式設計完全新手教學


最近到了這種時候,總覺得有點閒到爆的感覺,該考的考試也都考完了,剩下的就等成績而已。最近有一些學弟來跟我問關於程式設計的事情,像是OO是什麼阿,完全不會程式設計要怎麼學阿,等等之類的。雖然說我比較想就看看能不能暑假搞一個小團體大家一起來快樂學習,不過老實說在實行上總有一些現實上的問題,像是教室的借用,人數的多寡,程度上的差異等等,因為就算把想要學的人通通都擠在一班,有的人只差在OO不懂,基礎還是OK的,而有些人是根本就還停留在複製貼上的境界,沒辦法這麼做。

於是在某天的妄想下,終於爆出另一種奇異的點子,要不然來寫書好了XXD。這個想法很有趣,雖然對它的完成我並不保持希望,但是嘗試一下有何不妨。

在一開始我想先架構一下最基本的程式流程,用一些比較具體的事物來帶出一整個設計模式。最基本的有 if else if, while, for,一般的程式語言就降了。瞭解了流程設計之後,再來討論所謂的基本資料型態與比較運算子的操作(在這邊基本的資料型態只介紹整數以及字串)。配合著流程設計,我們可以嘗試寫出較有技巧一點的程式碼。接下來則是介紹矩陣的應用。像這樣一步一步把寫程式的必要工具得手,抽像程度逐層提高,配合上大量舉例與實作,以及由真實事物所引申出來的例子,也許能夠真的有辦法也說不定...

在這邊困難度比較高的地方有兩個,一個是舉例,我也曾經用譬喻法來教學過,不過那時候老實說用的真的不怎麼好,沒有達到什麼效果。好的例子不但要能貼近實際生活,還要能引起讀者個共鳴與興趣,這是我不知道目前能不能辦到的。第二個則是簡化的藝術,要讓一個還算會寫程式的人去想像不會寫程式的人的困難點在哪哩, 這是非常有挑戰性的!!有時候因為想要通通教給學的人,反而會不得其所,教的人很累,聽的人一個頭兩個大還是不知道台上在講啥。重點的捨取超重要,一個好的重點可以承先啟後,令人印象深刻。

所以~~~一起來期待吧!!!

(以上有可能是空想....XD)

2008年4月29日 星期二

Ruby初試心得2

繼續上面那邊之後,又繼續寫了一些題目。前面這邊就來講一些比較小的重點吧~

>> <<
首先呢,是ruby的位元運算子是 >> 或是 <<,而其方向性就是代表左移或是右移。在數字的型態下可以很簡單的算出某數乘以2的n次方後的值。而同樣的符號用在陣列或是字串則是代表在尾端插入或是移出幾個元素,不過跟數字不同的是,因為陣列或是字串都是為指標,所以會造成變數值的改變。(也就是說,arr = [], 現在我想要取得比多幾個元素,arr2 = arr[] << "test" -> arr2 = ["test"], arr = ["test])如果想要避免這種情況,用+運算子會較恰當。

空白 ()
ruby不是style free的語言(好像也沒聽過有人說過),他對空白(white space)老實說很明顯的是sensitive。舉個例子 i = str.length -1這個statement是不合語法的,你可以在-號前後都加空白,或是只在後面加空白,但是就是不能只加在前面。有時候會遇到莫名其妙的編譯錯誤, 這時候請嘗試檢查一些步必要的空白,有時候就可以過了~"~。類似的情形還有(),在ruby方法後面的參數你可以選擇像一般語言使用()來傳遞,也可以用個空白來代替這樣的語法來增加可讀性。像是 my_score.is_greater_than your_score。不過在參數一多,或是方法中的參數有方法的時候,這樣的式子小則出現warning,大則無法通過編譯。所以..除了是非常簡明的方法外,盡量要少用這樣的語法。

Enumerable
重點來了,for each語法在ruby中算的上簡單又實用的語法,在實做圖論的一些演算法的時候,for each node in graph這樣虛擬碼,跟ruby語法幾乎沒兩樣。不過要實做他,必須包含Enumerable 此模組。當初看到的時候,是在是有點開心,可以這麼簡單就實做出來,不過是令苦惱的是說明文件上的一段話:The class must provide a method each, which yields successive members of the collection. 我知道要提供一個each方法讓他提供其他實做,問題是,那each裡面到底要寫些啥好?是丟出一個陣列還是也丟出一個each?在多方查詢之後...最後還是找到ruby論壇,裡面雖然沒有找到有人問過相同問題,不過也是看到的人家是如何利用此方法。其實就是利用區段的概念,每個block都可以傳遞參數與程式碼,在最外層的程式碼去呼叫each方法的時候,會將區段內的程式碼往內(上)層傳,最後實際做的程式碼則是最內層的each。然而要如何接收其他區段內的程式碼呢,其實就是利用yields。如果對ruby區段有了解的人應該就知道跟怎麼做了,不過因為小弟資值駑鈍,無法參透所以還是看了其他大大的範例才會。實作方法很簡單,首先引入Enumerable 像是
class MyClass
include Enumerable
...
然後去定義個方法
def each
@elements.each {|elemant| yield element}
end
在這個範例中,是用另一個集合的each去實做此類別的each。如果有其他應用的話,一樣就是利用yield把程式碼傳進來,然後再把參數丟進去就OK了。

Comparable
這是本章的重點之二,利用此模組可以實做某類別的比較運算子(<, >, ==, <=, >=)。只要提供一個方法<=>,那麼接下來去就可以去比較拉~~。這個模組的實踐比較簡單,回傳0表式等於,回傳+1表是大於,-1則是小於。至於怎麼定義,就要看實作的內容了。
比較有趣的是,因為我曾經為了要讓Array時做此類別,於是自行定義了<=>。在小於與大於的表現上都合乎與我的預期,但是在==上我卻發現引入Comparable此模組並不會覆寫其類別原本所定義的==。雖然這是我想要的結果,不過卻是出乎我意料(我以為會被<=>方法所影響,因為Comparable實做了除了===的其他比較運算子),本來還在考慮要不要自己再去覆寫==,沒想到省了一道功夫。這也說明一件事,類別方法被覆寫的優先順序應該是模組方法,類別方法,自訂類別方法(已經有的類別方法,又去再覆寫他),越後面的使越不容易蓋掉。至於更大範圍的測是我還沒玩過,有機會再說吧。

alias
這是今天最後的重點了,用個很快樂的東西做個ending吧。當我們在快樂的複寫方法的時候,而又想要使用原來的方法要怎麼辦呢?剛開始讓人想到的應該就是super吧,這個super很快樂沒錯,不過當我們不是繼承某類別,從其子類別要去覆寫父親類別方法,而是想要複寫某個已存在類別的方法。如果我們就這樣傻傻給牠覆寫下去,裡面又使用到相同名稱的方法...那結果就會出現很精彩的遞迴又遞迴的遞迴地獄。所以~~!這時候就是alias出場的時候了。利用alias把原本的方法名稱指定成其他名子,這樣就可以安心的在覆寫的方法中使用原本的方法。
如果我沒是皮癢想要複寫Fixnum中的+變成兩次,可以這樣做
class Fixnum
alias plus +
def +(num)
self.plus(num).plus(num)
end
end
print "1 + 2 = ", 1+2
結果就會很開心了XXXD
當然alias不只可以用在這種地方,不過通常方法沒有被覆寫的的時候,應該不需要再給他一個名子吧。

2008年4月27日 星期日

Ruby初試心得

最近沒事開始玩一些東西,其中一樣就是ACM,一種練習寫程式的好地方,裡面有上萬筆題目可以讓人來打發時間。其中第124題,看了之後覺得可以動手於是開始想要用哪種語言來寫。用C語言的話,我對其字串處理不熟,所以不知道該如何下手好;如果用JAVA應該還不錯,最近也看了一些軟體工程的書,說不定可以派上用場,也許可以用一些高階的資料結構來解這題。不過當我真的要開始下手的時候,遇到了一個我忘記的嚴重問題,我已經忘了java要如何從鍵盤(標準input裝置)去得到輸入的字串。只記得是用串流...然後就忘記了,結果是冏在哪邊。接下來我想VB也是可以OO,字串處理我也OK,標準輸入輸出也很簡單,只是剛開始要我碰真的有很多困難點,很多同義的語法,但是要用一些很奇怪的表示法,讓人難以適應。不過這都還算是小事,最讓我頭痛的是互相參考的類別編譯不能過...阿~~我承認在設計上是有這樣的瑕疵,但是不給過也太過份了,所以就跳槽到最近才開始碰的ruby。

Ruby是全OO的語言,我想應該沒啥問題吧...不過還是有很多問題XXD。一開始遇到的是Ruby沒有介面(Interface)!!很好...這樣設計模式第一條,針對介面而寫程式我就冏了。沒關係,那我就想像有一個介面在那邊,程式碼一樣寫,只不過是少了一個實作介面的步驟。在初步構想下,我是先將題目的概念轉化成一種節點與節點之間的關係,第一行輸入會讓程式將所有元素宣告成一種基礎節點(basenode),然後再經由第二條的條件式,去真的new出節點。而在這裡會產生的實例(Instance)會有兩種:一種是跟順序無關的節點(freenode);一種是被條件限制住的節點(limitnode)。經由程式去判讀條件式,並分別將基礎節點實際產生出節點實例。

基於上述想法,我就開始寫了下述錯誤的程式碼(邏輯上的錯誤)。不過讓我有fu的其實是其中雜湊所帶來的震撼,雜湊很有趣,很方便,可以給程式碼帶來更多的便利性以及高度的抽象化。但是當我正爽的時候,卻發現我要用for each取出其中的元素的時候,資料型態居然不是我當初所放進去的freenode/limitnode,而是array,使得下面的程式碼完全沒辦法跑,因為會有找不到方法的錯誤(因為is_bigger是節點的方法,而array本身沒有),最後才發現原來是雜湊在被call for each的時候會像是先利用call to_a轉換成陣列型態之後再被丟出裡面的元素,而其元素則是包含鍵與其值,也就是[key, value],所以丟出來的東西是array沒錯...當然沒辦法取得我所定義的方法。

我這邊的解法很簡單,取出第二個值就結束了XXD。不過剛剛看了一下hash的方法,應該還有其他的方法可以解,等等試試看^^~這邊就放錯誤的程式碼上來,以便可以觀察錯誤的地方。
以知有錯的地方有:is_bigger的邏輯(含limitnode的實作)、判斷free/limit node的程式區段
錯誤的程式碼

2008年4月12日 星期六

啥米哇糕,MaDa字幕製作程式?(What's it, Mada subtitle generator?)

最近天氣很糟...不是很熱就是很悶。考試也考的不怎樣...總覺得讓人有點傷心。想要買個CPU來讓自己爽一下,結果最近E8400大家都缺貨,不肯單賣,讓我硬是碰了釘子。討厭的日子總沒有好事會發生,因為...發生了就不叫做討厭的日子了XXD。


最近某J要我寫一個關於字幕的Replacer,他要用一些自訂標籤來玩字幕特效,但是發現單單使用一邊文書處理軟體的取代似乎不夠用(需要時間的phaser and counter),反正近日來也無所事事,就寫了。
本來打算要用新學的ruby來玩玩,但是發現在Pragmatic Programmers - Programming Ruby, 2nd Ed - 2005 這本書上找不到檔案寫入的方式!?從讀取檔案到字串處裡都還OK,卻讓我找不到寫檔的方法,害我當下冏到,另外我比較熟的語言就是c, java, vb。C的字串處理我不清楚,沒玩過C++;JAVA因為看了超越JAVA總覺得他的字串是弱項;剩下的就是勉強能用的VB,當然隨便拖一拖GUI就出來也是我會採用他的原因啦。反正字串處理的模組是另外寫,邏輯也盡量保持清楚,以後要改寫是不會需要很多時間。意外的花了不少時間,不過還是在一天內寫完了,後來就和J大討論看還要不要再擴展下去,不過J大一直就沒消息了XD。

不知道為什麼那種念頭一直在我心中圍繞不散,也許是最近真的太閒了。在找了一些關於ass字募的資料後,覺得如果要玩自訂標籤,乾脆寫一個產生器(generator)不是更好嗎?感覺上要省事的多。不過軟體開發有一條很清楚的規則是不能被忘卻的:不要再發明輪子。別人做過的東西就拿來用吧,不要再自己寫一次。於是我開始尋找一些產生器。嗯...看到了一個很虛的卡拉OK字幕製作程式,用VB6寫的,安裝後感覺真的鳥到爆,只有聲音讓你對時間軸...ma...也許這樣對一般人就夠了,但不是我想要的,另外他的宣傳文說啥彩色字幕是讓我覺得最蠢的東西~"~。
所以我就開始把visual studio 2005打開,看看有沒有可能寫出一個東西。於是我開始跟客戶(偽)開始對話:
我:程式中需要的的功能是什麼?
客:最重要的是有影片可以即時預覽,以及支援ass動態字幕的各種語法,可以讓我隨心所欲的變換各種不同的特效。
於是我開始找看看有沒有可以播放影片的插件可以使用(如果要我自己去找原始碼弄成dll再放進去那還是不要寫好~"~),結果發現了有wmp可以用,雖然大家都不怎麼喜歡wmp(有在看片的人),但是能簡單寫還是最重要哈,玩了一下,把時間軸給弄出來了。真是有趣XXD。因為wmp也是屬於吃系統編碼的那種撥放器,所以只要系統能播放的東西都可以看,所以基本上,最基本的基本已經做出來。接下來就是文字檔的匯入(簡單),然後存成ass(需要做一點字串處理),接下來是玩特效的結合,最後是能夠讀取ass檔並做編輯。大致上的開發流程就是這樣。

不過我不相信這個輪子沒人發明過,所以我又開始尋找的旅程...

就算找到...說不定我還是會作,因為我是學生ㄇㄟ~~而且是國小喔!!

2008年4月5日 星期六

第一個資料庫應用(with scaffold)--Ruby on Rails 完全新手手冊


在自己不斷遭受到失敗與挫折之時,雖然一度對ROR產生了小小的反感,"沒式改什麼版,書都沒用了"。不過仔細想想,沒有工具書到不全然是工具的問題,沒人出書這才是重點。其他較為流行的語言(例如C, Java)在國內都有許多不同的版本之書籍可供參考;反觀ROR,目前市面上幾乎都是翻譯書(我還沒看到有自己寫的~"~),而原文書有提到Rails2.0最快也要五月份才會有書出現(亞馬遜上查的)。難道這段時間就只能苦苦摸索嗎?!!終於皇天不負苦心人,讓我找到一篇關於在Rails使用靜態scaffold step by step (動態scaffold在Rails 2.0 已廢除)這邊文章。那麼就讓我們一起跟著做做看吧^^。

第一步:開始

在開始之前,先讓我們仔細想一想,我們要的東西是什麼?我們要怎麼樣安排資料庫中的資料?在這邊我就先舉一個簡單的例子:假設我們要開一個網路商店,那麼我就先建立一個store專案。(後面=>就是要輸入的程式碼)
=>rails store

第二步:建立資料庫

建立完專案之後呢,我們就要來決定我們的資料庫名稱。這個資料庫名稱老實說不怎麼重要,就隨便想想吧...嗯,那就也叫store好了XD。決定了之後我們就要來更改資料庫的設定檔。在 store\config 目錄下有個檔案叫做 database.yml 的檔案,打開文字編輯器來修改裡面的內容(在這邊建議使用 AptanaStudio 或是 SciTE來編輯,因為使用win的記事本會因為作業系統斷行符號的不同而產生難以閱讀的現象)。#號是註解符號,所以就不用看了。從developmet開始看,我們需要把內容改成下列這樣:
development:
adapter: mysql #調節器名稱,隨便填應該也可以拉
database: store_development #資料庫名稱
timeout: 5000 #可以不用管
username: root #mysql的帳號
password: #mysql的密碼
host: localhost #可接收的連線範圍
(這邊要注意一下,因為ruby對空白字元與tab是敏感的,所以在冒號後面一定要有一個空白,否則會出錯!!)這邊我們可以看到,資料庫名稱為 store_development,這樣的命名方式是內定的。其意義是指開發中的資料庫,在 development 敘述下還有test與production,其意義就是測試與成品資料庫。命名當然也就是 store_test 與 store_production。如果打算要做成品的話就要全部都填寫清楚,在這邊我們只是測試開發,所以可以只填好development的區段,其他就不管了。
修改完設定檔後,我們下這一行指令來建立資料庫:
=>rake db:create
(如果要順便建立test用與production的資料庫可以下 rake db:create:all)
執行之後如果沒有什麼錯誤訊息那就可以了,假如你不放心,那可以下mysql的指令或是利用像是phpMyAdmin的資料庫管理軟體來檢查是否資料庫已經建立。

第三步:Scaffolding!

在我參考的文章中在這一步有去做確認網站有沒有架好,但是我覺得這那真的是多餘的動作,所以就不做了。讓我們來想想下一步要怎麼進行。現在我們有了資料庫,那麼還要建立一個表格(table)來存放記錄(records),並且決定表格中的欄位(名稱)。這邊最重要的是表格的名稱,他最後會在MVC中都會出現(MVC有機會以後再說XD),依照命名規則,他必須是一個英文名詞,且須為複數型,那麼因為商店裡面有很多好玩的小玩意兒,所以就決定是...items拉(我知道很爛,但是不要打我)。接下來決定欄位的名稱,先做個簡單的吧,有名稱(title)、描述(decription)與價位(price)就夠了;名稱的資料型態為 string, 描述為text, 價位則為 integer。那麼輸入指令:
=>ruby script/generate scaffold Items title:string description:text price:integer
這時候就可以發現ruby又幫我們建立了許多檔案,其中在store\db\migrate中有一個 001_create_items.rb 我們可以打開來檢查看看,應該就會像下面這樣:
class CreateItems < ActiveRecord::Migration
def self.up create_table :items do |t|
t.string :title
t.text :description
t.integer :price
t.timestamps
end
end
def self.down drop_table :items
end
end

第四步:Migration

檢查完上面的檔案沒有問題之後,我們就可以來執行下面的指令:
=>rake db:migrate
出現成功訊息就好啦!!如果失敗的話呢...請檢查1.database.yml有沒有設定錯誤 2.mySql資料庫有沒有正在執行,使用者權限是否有開放給設定檔的那個使用者等等

第五步:執行server

老實說...就沒第五步ㄇㄟ,寫辛酸的拉,執行server已經在第一篇文章有說過了:
=>ruby script/server
這樣應該就能看到成果出現啦!!什麼?不知道怎麼看到網頁?唉呦,就是 http://localhost:3000/Items 因為在這邊我們用到的控制器(controller)是item的複數型態。

補充

其實在設定資料庫的幾個步驟,可以利用其他的資料庫軟體來完成,像是建立資料庫、建立table等,都有許多方法可以達到同樣的效果。不過在這邊就是盡量的使用ruby給我們的工具,來熟悉一下,等有心得了再來換成習慣的工具也不遲。
當然,這樣用scaffold做出來的網頁雖然快速,但是還是略嫌粗糙了點。所已接下來就是看書的時間拉,雖然rails1.2和2.0 scaffold使用的方法不同,但是書上在介紹完後,還是會開始繼續一些我們在製作動態網頁的技巧。所以階段性任務達成!!下次來研究架站或是考慮要不要把簡易ruby手冊的後半給補完^^"

*關於命名規則的單複數型態:在1.2版的 rails scaffold必須要在資料表格(table)、控制器(controller)使用複數型態,而在模型(model)使用單數型態。但在測試過 rails 2.0的 scaffold之後,發現應該沒有很明確的規定單複數要怎麼使用。藉由其 scaffold產生的模型、控制器、資料表格將會以相同的名稱命名。

**如果要以其他工具自行建置table,需注意 rails在 table中一定需要一欄為id的索引(作為主鍵),如果用rake來幫忙建造則會自動建置。

注:本篇圖案與主題無關....

2008年4月4日 星期五

Ruby簡介--Ruby on Rails 完全新手手冊


既然我們要玩的東西就是Ruby onRails,那麼了解ruby就是必然的事了。
那麼就讓我來簡單的介紹一下ruby這個玩意兒!
不過在開始之前,先來說明一下有兩種不同的環境可以選擇:其一是利用irb,一行一行撰寫程式碼,可以即時的從視窗中看到執行的結果;另一種就比較像是一般的程式語言一樣,先撰寫好程式碼,存成.rb檔,然後在執行 ruby xxx.rb就可以看到執行的結果。(注意:這裡的兩種方法都是在文字命令列下執行)在這裡推薦使用irb來玩會比較有趣^^。

基本輸入/輸出

puts, print / get
print=>輸出文字不換行
puts=>輸出文字且換行
printf=>同C的printg
demo:
puts "Hello World!!"
print "Hello"
print "World!!"
printf("Number: %5.2f,\nString: %s\n", 1.23, "hello")

get=>從鍵盤取得輸入的串流(含換行符號),如果沒有可以切受return的值,則會把值丟到$_
chomp=>將變數$_去掉尾部的換行符號
demo:
lines = get
puts line


由上面幾個簡單的例子我們可以有以下這些發現
1.method的括號可以省略不寫
2.method必有返回值(nil或是值)

基本資料型態

numbers/strings/ranges/regular expressions
數字(number) => 分為fixnum與bignum
字串(string) => 就是字串
範圍(range) => 一個遞增的範圍像是1..5、A..B,則分別表示{1, 2, 3, 4, 5},{A, B};若是三個點則為不包含最後的數(值)ex:1...5表示{1, 2, 3, 4}
*正規表示式(
regular expression) => 還蠻有趣的東西...晚點再來討論
demo:
num = 11
num = 99999999999999999999999
num = 0x6C #hex
num = 0r100101 #binary
num = 045172 #octal
num = 123_456_789 #123456789
rg = 1..5
rg == 5 #false
rg === 5 #true
rg = "abc".."abe" #{"abc", "abd", "abe"}
str = "#{'Ho! '*3} Merry Christmas!" #Ho! Ho! Ho! Merry Christmas!
str = "say \"Hello\"" #say "Hello"
str = "Hello " + "World!!"
str = 'Hello World!!'

基本流程控制

if..elsif(elseif)..else => 基本上要寫elsif才對,但式測試後發現elseif也可以過XXD
unless => if 的反敘述
case..when..else => 同C的swicth..case..default
while/until
for..in => 同for each語法
break/next/redo/retry =>限迴圈中使用,跳出/跳至下一個/再次執行同一個/重新執行迴圈(從頭)
demo:
def get_time(clock)
if clocck < clock ="=">
+clock.to_s+'點'
end
end
####我不是分隔線#####
count=0
for value in 1..10
count+=1 until value%2==1 #count+=1 if value%2==0
end
####我不是分隔線#####
score = 70
str = score>60?'passed':'not pass'

Array and Hash 陣列與雜湊

關於array基本上和我們平常在用的array差不多,所以基本的就不談了,來談談在Ruby中的array到底有什麼特別的地方。那麼首先來舉個例子:
a = [123, 9.8765, "LOVE"]
上述敘述將有三個元素的array指定給a,在Ruby中不同型態元素的array是允許的。接下來測試一下:
puts a[1] #9.8765
puts a.class #Array
puts a.length #3
puts a[3] #nil
puts a[-1] #LOVE
puts a[-4] #nill

從這邊我們可以看到有負數的索引值在,在array中索引-1代表的是陣列最後一個元素,-2則是倒數第二個元素...依此類推,長度為n的陣列第一個元素的index可以為-n或是0。而只要是沒有被assign值的地方將回return nil值。而這個陣列本身的長度為動態的,如果我們現在指定a[4]=99,那麼我們可以看到 a.length將會變成5,a[3]依然是nil。這在邊我們就可以發現到幾個要比較小心來處理的地方:因為負數的index可能有意義,要小心處理其範圍;如果讀到nil值不代表已經走到陣列邊界,包含nil這個元素的array是合法的。使用length屬性或是for each來處理可能較不容易出錯。

另外array也可使用雙index,其意義為Array[起始index, 元素個數]。也就是說,a[3]與a[3, 1]所得到的值是相同的。這邊有個array a=[1, 3, 5, 7, 9],則a[1, 3] = {3, 5, 7};a[-4, 2] = {3, 5}而不是{3, 1},元素個數都是從start index開始抓後面的元素。而多為陣列表示法則為[a][b]...[n]。

依照上面的想法,同樣的我們可以在array中使用range來做index。例如a[1..3]={3, 5, 7};負數Range也可以,不過切記range必須是要遞增的。
後註:array裡面同樣也可以塞array喔!依此觀念就能很容易實作長度不為一的多為陣列;a=["a", "b", "c"] => a=%w{a, b, c}

在Hash這邊我們先來看一個範例
my_favor = {
'animal' => '小雞',
'book' => '遊戲說明書',
'game' => '風色幻想',
'CD' => '天使領域 OST'}
測試一下,puts my_favor['CD'] #
天使領域 OST;puts my_favor.length #4
感覺還蠻簡單的不是嗎?陣列就有點像是比較tightly hash,限制了index的表示法。而相較之下hash的index就叫為多元化,數字與字串都可以做為index,如果能運用的恰當,則可增加成式的可讀性^^。

續待
iterator, block, class

小試ROR--Ruby on Rails 完全新手手冊



本篇文章由某G學弟死盯加上學了一點新東西做點筆記,對以後可以省掉不少找重覆資料的時間(我計性很差 = ="),所以就從最簡單的部分開始吧!!

準備

ROR的相關歷史簡介為了要符合DRY的精神,所以請自行參考相關書籍(其實是自己懶的寫=>踢飛)。最重要的還是先去官網看一看,目前已經有中文化的官網了(大心),不過說實在的,還蠻鳥的,看英文版的比較實在XXD。雖然在ptt上面大大比較推說自行下載ruby、rails、mySQL,然後自行分別安裝,不過正因為科技始終來自於惰性,所以還是下載了 Instant Rails來使用。
先來看一下Instant Rails裡面有什麼

嗯...有架過網站的人對裡面一些東西應該不陌生才對,不過這裡並不對裡面的東西討論(迷之音:那你幹蠻寫出來阿~"~),重點在於第三項,rails的版本是2.0.2。就一般程式語言來說,為了要向下相容,較高的版本通常能夠吃以前的東西。但很不幸的(對於初學者來說),Rails2.0以後的版本為了要實行REST拿掉了動態scaffold以及pagintation,改成了外掛形式,必須要另外安裝才能使用。而靜態的scaffold語法也較以往不同,詳細請參考 rails 2.0無法使用靜態的scaffold功能 此篇文章。

安裝

安裝Instant Rails很簡單,這邊以windows環境使用Instant Rails2.0做範例。解壓縮下載的檔案到目地資料夾後,執行InstantRails.exe,出現問題選項選擇"是",即可完成。同資料夾下有個use_ruby.cmd,看了一下裡面的內容後,應該是要在系統註冊path變數用的,不過我點了一下到是沒有作用,所以還是手動設定。設定法如下:控制台=>系統=>進階=>環境變數=>系統變數 找到變數'PATH'按一下編輯,把ruby\bin的位置輸入,還有mysql\bin的位置也要,基本上會跟use_ruby.cmd這個檔案裡面的位置會一樣(這裡面本來就是要設定系統變數的ㄇㄟ)。基本上這樣就安裝完畢拉~~!

執行

在執行方面,會較建議使用文字命令模式(命令提示字元,commond line mode)來執行整個環境。因為我們在上面已經做過設定系統變數:path的關係,現在就可以直接打上irb按下enter,這樣馬上就進入ruby介面。這...雖然一般沒什麼在用(對我來說),不過在測試上卻是一個好幫手。一樣,詳情參考ruby程設相關書籍。
現在來稍微觀察一下Instant Rails的目錄結構,有幾個看一就懂得像是ruby, apache, mysql就不管他了,其他的看起來也沒什麼特別重要。php資料夾內有個phpMyAdmin可以用來管理mySQL,要用的話要放到www的資料夾下(此apache伺服器預設跟目錄),rails_apps裡面放了兩個網站範例,有空可以玩玩看至於實際架站的方法有兩三種,這個因為目前還不熟,所以就先pass拉。
目前就只要知道在要測試網站的目錄下執行 ruby script/server 就可以在loaclhost:3000找到你自己的網站啦!!

Hello World!

0.先進入文字命令列模式
1.在你自己要建立專案的資料夾下鍵入 'rails 專案名' (ex: rails helloworld),這樣ruby就會自動幫你建置許多需要檔案
2.進入專案資料夾(ex:cd helloworld),並找到public資料夾,把裡面的index.html給取代掉就好啦!!
3.執行 ruby script/server
4.在瀏覽器的網址列上輸入 http://localhost:3000/ 就看的到拉~~

不過照這樣寫出來的東西總覺得有點沒意思,那麼我們可以怎麼改呢
那我們就把index.html的內容改成下列的樣子
<html>
<head><title>Hello World</title></head>
<body>
<h1><%= h('Hello World!!')%></h1>
<br />
</body></html>

嗯...這樣是不是比較有fu了一點。其中h這個method是用來完整輸出引數,也就是說不論放什麼字元下去,他都能在網頁上忠實的呈現出來,是不可或缺的小幫手^^"



第一篇大致上就到這邊結束,下面列一些好用的
一、參考書目(依優先順序排列)[ISBN]
  • 超越 Java:探討程式語言的未來 (Beyond Java)[9867794761]
  • Agile Web Development with Rails, 2/e[0977616630]
  • Programming Ruby: The Pragmatic Programmers' Guide, 2/e[0974514055]
第一本書談到了相當多的rails的術語與細節,不可不看,第二本則僅供參考,因為書中的範例還是使用了rails1.2的架構,拿到2.0來做會有問題(最前面有提到),而第三本因為還沒看,所以哈~

二、工具程式(主要程式除外)
  • AptanaStudio
  • Navicat
  • UltraEdit
前兩套都有免費版的可以下載,使用到目前為止也沒遇到什麼不順手的,免費版的就很好用了^^。第一套是ruby的IDE,使用套件(rails)更新後就可以直接啟動WEBrick,除錯上帶來不少方便性。第二套是mySQL的GUI管理工具,會用access就會用了,比起phpMyAdmin是要方便許多,lite版也夠一般使用了。最後一套應該大家都知道,雖然用來寫ruby不甚順手,但比起記事本還是方便許多。

2008年3月23日 星期日

時間 ? 幻想?

在突如其然的大雨中,想試著聽著雨聲而睡去。不過總覺得有些這麼的可惜,所以不知覺得開始想想一些什麼。就這樣的天外飛來一筆,想到我對於時間的看法。對於修過教育學程的我來說,告訴學童時間時怎樣的抽象概念很重要,但是我自己對時間的認識又是如何呢?昨天、今天、明天;前一分、現在、下一分鐘;早上、中午、晚上;上課、等待、下課???

就上述來看,時間就只是一種具有單一方向性的軸,串連著一個世界的過去和未來。先不管其中被串連的過去未來是否連續或否,從其單一方向的軸來看,從數學的角度來說,就我所觀察到的軸是一直線的,但是在別的平面則可能不是這樣子。先把我所在的世界以一個平面來說,所能觀察到的時間軸為直線,若有其他世界(第三觀察者),則同一著時間軸投影在上面是否還會是直線?
依此時間空間概念,我提出一個隨便說說的假設,我可以把時間的軸看成一圓,而附著在一球體上。就像是地球儀上有著許多條緯線一樣。這也許就能說明相對時間的差異!?

在打這篇小記的時候,突然又想到這個時間球體模型有一個還蠻詭異的地方。如果假設時間的軸是一個圓,那麼可以解釋在不同圓上可以觀察到不同的時間;但是如果真的是一個圓,那麼這個圓的開始與結束又在哪裡?或是當我們又走過再軸上同樣的點時,會發生什麼呢?或是也許時間又是一種更加複雜的螺旋?到這邊已經超過我妄想的範圍了...不過還蠻有趣的,哈!

2008年3月8日 星期六

今年的年度預算

預算總額 about 10000~20000

待買事項 / 預算
  1. CPU / 5000~8000
  2. 喇叭 / 1500
  3. ACG / 2000
  4. 電腦周邊消耗品(ex:DVD 空白片) / 1500
  5. 雜項 / 3000
已買事項 / 金額 / 贊助 (/附註)
  1. 螢幕 / 9850 / 0 /非預期
  2. 喇叭 / 899 / 899
  3. CPU / 5920 / 1000
可收入來源 / 金額
  1. 生活費 / 4000 / 含一般生活雜支,可能6月後斷源
  2. 獎學金 / 6000+5000+?? / 等抽完獎才可知明細(郵局、新光、大社)
  3. 青山打工 / ?? / 要先確認可打工時數