2009年4月15日 星期三

Lex & Yacc

事實上網路上資料很多了,我這裡就不再次詳細說明
如果好好活用的話對於一些文件自動化分析是非常有幫助的
(可是前提是你要分析的文件必須具有Well Structure的特性....)

上次寫約莫也是將近五年前的事情了,好在還有點印象,很快就上手

http://ijdlt.nctu.edu.tw/cp09/index.php?option=com_content&task=view&id=18&Itemid=1

今天將由我負責向學弟妹們報告Lex和Yacc的用法,真是怕誤人子弟阿
裡面也舉了兩個簡單的例子
盡量用淺顯易懂的方式讓大家了解

希望今天報告可以順利幫助學弟妹們釐清觀念

2009年4月12日 星期日

行動商務作業 J2ME 萬年曆




這次作業一是要做一個萬年曆,完成了順手把他po上來

記得上次動手做萬年曆已經是六年前的事情了,那時候是大一修程式語言的時候用Pascal寫的
Pascal可以用的Resource相對於Java是少了很多,因此當時幾乎什麼都要自己寫

相對之下,用Java裡的Calendar API可以少掉一些對於日期上的計算
以前修Java課的時候也有用過Calendar這個抽象類別,所以本來以為很快就會搞定這個部分

不過寫完一個Java版本的時間計算的class後才發現,
J2me裡面的Calendar和Java中所定義的不太一樣
有些東西被精簡掉了,於是只好再寫一個J2me的版本

完成Calendar邏輯的部分,才知道原來UI的設計才是這個作業的困難之處!
原本以為table這種基本的UI應該是隨便new一下就有的東西
沒想到J2me的High-level UI這麼簡陋,雖然可以用StringItem排列達到相同的UI效果,
不過KeyPress Event的接收卻是個問題
中間試過很多方法,也發現很多好玩且可行的方法,
不過最後還是決定先自己用Canvas自己畫一個了,
順便熟悉一下Canvas這個Low-level UI,之後如果要設J2me Game才不會手忙腳亂

基於Open Source精神,此程式以GPL的形式發佈。

CalendarCanvas.java
CalendarWidget.java
Note.java

底下是Demo影片(臨時找不到錄影軟體,因而用未註冊的freeware,有未註冊字樣請見諒)
我簡單的操作一下它的新增和刪除的紀錄備忘功能
以及它可以跨月跨年任意跳躍時間的萬年曆功能



目前的版本已經完成的Features:

  • 萬年曆功能
  • 備忘新增和刪除功能
  • 動態計算長寬和網格大小,換成不同的螢幕大小程式不用重寫(參照最上面附圖)
  • 可以在Nokia S60或Sun WTK的模擬器上運行(後來發現MIDlet要能在S60上跑寫法要夠嚴謹)
  • 使用RMS當做資料儲存媒介,關機不會遺失內容
之後預計要做的Enhancements,標示Advanced是比較進階且難度高的:

  • 使用Third Party UI Library - 可以做出較為進階的特效或者和使用者主題結合
  • 增加跳躍日期功能 - 直接跳到指定日期
  • 增加週檢視 - 更精確的時間事件表,以兩小時為單位
  • 增加不同類別 - 不同欄位設計、不同圖示(Advanced)
  • 增加使用者自定類別功能(Advanced)

2009年4月8日 星期三

變數命名法則

Java命名慣例

套件
有點類似將網址倒過來的感覺,從大到小描述可能是一個登入名稱,部門,計畫,機器等等
範例 edu.nctu.cs.kdelab.justmaker

類別 介面
應該是名詞,由每個內部單字開頭字母皆為大寫的混和字組成。
範例 ArrayCalendar

方法
應該為動詞,混和第一個字母小寫和內部單字的第一個字母大寫的狀況。
範例 getMonth()

變數
混和第一個字母小寫和內部單字的第一個字母大寫的狀況。

常數
應該是以("_") 底線分隔的全大寫字。
範例 static final int Month_Of_Year= 12;

匈牙利命名法

在匈牙利命名法中,類型名在實際變數名前。
變數名稱 = 屬性+類型+描述

屬性
g_ 全域變數
c_ 常數
m_ 成員變數

類型
n int
l long
c char
b boolean
p pointer

描述
Custom 自訂
Src 來源
Dst 目的
Tmp 暫時

範例
g_nTmpCounter

Java Calendar的使用方法

以前大學修課Java的時候就曾經要用這個class
不過當時對於debug的能力和理解力比較弱

現在又遇到,花了一點時間弄懂這個class的使用方式
這裡紀錄幾個簡單的用法

http://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html

Calendar calendar = Calendar.getInstance();
// 取得一個calendar的Instance
// 預設會是系統的時間

calendar.set(int field, int value);
// 這個method可以讓你設定calendar的某一field為指定的value
// 舉例來說 calendar.set(Calendar.DATE, 1);
// 就是將calendar日期指定為1
// field的種類可以在api裡面都可以查到

calendar.get(int field, int value);
// 這個method可以讓你取得calendar的某一field的value
// 舉例來說 calendar.get(Calendar.DAY_OF_WEEK);
// 可以取得現在calendar的時間是一周裡面的哪一天
// 不過這裡要注意的是,星期天會回傳為1,為一周裡的第一天,星期一會回傳2,依此類推

這幾個方法會用就差不多了