酒釀蛋湯

做法:
1.適量的水加酒釀加砂糖煮沸,
2.立即沖入以放好雞蛋的大碗中,即可享受香滑的蛋花和香味四逸的酒釀蛋湯.
我自己有作過,相當簡單~
口味也不錯~不過我覺得酒味有點小重~~不習慣的話,不好入喉~~

當兵好

歌手:林強
專輯:收錄於娛樂世界與2001向前走-十年精選這兩張專輯裡
歌名:當兵好
詞:林強
曲:林強
編曲:羅百吉
當兵好,沒煩惱,沒有戰爭又吃的飽
盡義務,不要逃,當過兵的男人最可靠
一人當兵,全家光榮,報效國家,真驕傲
捍衛家園,造福鄉里,犧牲奉獻,建設寶島
拿著槍,扛著炮,反攻復國救同胞
為種族,為宗教,戰爭殺人不用坐牢
三民主義,世界大同,是我們國家的目標
什麼時候,世界和平,祇有天知道
我靠!我幹!中華民國萬歲!中華民國萬歲!
當兵好,沒煩惱,沒有戰爭又吃的飽
盡義務,不要逃,當過兵的男人最可靠,當過兵的男人地位高
出了社會,容易適應,所學專長,不得了
鞠躬哈腰,欺下瞞上,表面功夫,技巧妙
當兵好,沒煩惱,沒有戰爭又吃的飽
盡義務,不要逃,當過兵的男人最可靠
FUCK !


為什麼喜歡這首歌,我也說不太上來,大概是因為喜歡他強烈的節奏還有諷刺的歌詞吧~~
好像當過兵的人都會有股怨氣~我也有一些~~ ^_^

向侯捷請問STL sort的問題

這是蠻久以前的事情了,那時候為了這個 sort 的問題,發 mail 向侯捷先生請教.雖然隔了很久才回覆我,不過心裡還是很感動~~也才知道自己的程式出了什麼錯.

回覆日期:2003年2月20日 上午 03:38
你的程式寫的邏輯不對。
> bool operator==( const myInt& l, const myInt& r) {
> bool operator>( const myInt& l, const myInt& r) {
> bool operator<( const myInt& l, const myInt& r) {
這三個都沒有完整判斷。sort 的時候,要求 class 需定義 operator<,
而 operator< 在什麼時候應該傳回 0, 什麼時候傳回 正值,什麼時候傳回負值,有一定的規則。
問題不是出在你指的地方,而在這裡。
— jjhou
—– Original Message —–
寄件者: "晏仁"
收件者:
傳送日期: 2002年10月8日 PM 11:07
主旨: 請教 STL sort() 的問題
> Dear 侯sir:
>
> 冒昧請教,以下是程式,而問題在最後面~
>
> #include <iostream>
> #include <algorithm>
> #include <vector>
>
> using namespace std;
>
> class myInt {
> protected:
>   int id;
> public:
>   myInt():id(0) {};
>   explicit myInt( int i ):id(i) {};
>   myInt( const myInt& i ):id(i.id) { };
>   int getId( void ) const {
>     return id;
>   }
>   myInt& operator=( myInt& i) {
>     id=i.id;
>     return *this;
>   }
>   myInt& operator=( int i ) {
>     id=i;
>     return *this;
>   }
>   myInt& operator*() { return *this; }
>   myInt* operator->() { return this; }
>   friend bool operator==( const myInt& l, const myInt& r );
>   friend bool operator   friend bool operator>( const myInt& l, const myInt& r );
> };
>
> bool operator==( const myInt& l, const myInt& r) {
>   if( l.getId() == r.getId() )
>     return true;
> }
>
> bool operator>( const myInt& l, const myInt& r) {
>   if( l.getId() > r.getId() )
>     return true;
> }
> bool operator   if( l.getId()     return true;
> }
>
> class myIntCompare {
> public:
>   int operator()( myInt aa, myInt bb ) {
>     if( aa.getId() > bb.getId() )
>       return 1;
>     if( aa.getId() == bb.getId() )
>       return 0;
>     if( aa.getId()       return -1;
>   }
> };
>
> int
> main( int argc, char* argv[] ) {
>   const int COUNTS=10000;
>   typedef vector intVector_t;
>   intVector_t intVector;
>   int i;
>
>   /**
>    * 下面的兩行 code 會導致 segmentation fault,這就是我要問的問題!!
>    * for( i=COUNTS;i>=0;–i )
>    * intVector.push_back( myInt(i) );
>    */
>   intVector.reserve( COUNTS );
>   for( i=COUNTS; i>=0; –i )
>     intVector[i]=i;
>
>   // 以下兩種寫法都可以
>   sort( intVector.begin(), intVector.end(), myIntCompare() );
>   //sort( intVector.begin(), intVector.end() );
>
>   for( i=0; i     cout << intVector[i].getId() < }
>
> 為什麼把
>   intVector.reserve( COUNTS );
>   for( i=COUNTS; i>=0; –i )
>     intVector[i]=i;
>
> 改成
>   for( i=COUNTS;i>=0;–i )
>     intVector.push_back( myInt(i) );
>
> 編譯後再執行
> 就會發生 segmentation fault 的問題呢??
> 真的是很奇怪
> 我知道 vector 在配置的時候會先預留一塊記憶體
> 在 push_back() 的時候,如果發現不夠大,會自動重新配置,
> 並把原來的內容搬到新的地方去.
> 我想可能是重新配置的問題~~
> 但卻不知道真正的原因是什麼?
> 希望侯 sir 能給我一些方向,讓我下手去找出答案~
>
> 喔,對了,我的環境是 linux g++ 2.96.
>
> With Best Regards.

Hook operation / Hooks and anchor

以前逛到的兩個 Pattern, 比較特別的是:

  1. Pattern 名字沒聽過,
  2. 用 VFP 實作的~~

挺有趣的,網址在這裡:

Hook operation 講的是一種包裝別人物件的方法,一般來說,都是利用繼承的方法來將對方的 control 包進去,然後再去作客製化的動作;這個 pattern 則是繼承以後,另外利用了一個 hook manager 去專門處理這個客製化的動作.所以才稱作 Hook(掛勾).
Hooks and anchar 則是前面 hook 的延伸,據我個人的理解,這就有點像是 c# 可以把很多 event 或 delegate 串起來一樣~不過我不是很確定啦~~
另外,上面文章所屬的網站還蠻多文章的,大部分是講如何用VFP去搞 Design Pattern 的,各位可以去看看~~
與各位分享~

MindMap

在這兒看到,
http://blog.twblog.net/brookmeow/archives/002103.html
順道就逛了一堆~~
其實之前有參加過公司的教育訓練,有上過這玩意兒,覺得挺不錯用的~~不過想不到有軟體,國外甚至有網站教學~~
以下是軟體的下載點:
http://sourceforge.net/projects/freemind/
http://toget.pchome.com.tw/intro/business_note/1529.html
這裡則是國外對心智圖的教學:
http://www.jcu.edu.au/studying/services/studyskills/mindmap/index.html
國內介紹 MindMap 的網站
http://home.kimo.com.tw/picmemory.tw/Mind_Map.htm
我試用的是 freemind 這套軟體,它是用 java 寫的.使用上並不困難~~
也可以正確顯示中文(我的 jdk 是 1.4.2_02 )
基本上可以在 node 上加入一些特殊的符號
在 node 上按下滑鼠右鍵,即可新增 node 或刪除 node 或更名…等等
移動的話是用 cut/copy/paste 來達成.
node 之間也會自動編排~蠻方便的~~

Builder pattern on VFP

給予適當的建構資料,就可以得到我們所需要的物件.
詳細的說明可以參考後面所附的參考資料,那些資料就已經寫的很好了,我想我沒必要再畫蛇添足.
最初製作 SQL Builder class 的時候是想說,我只要給予它一些欄位和條件,他就會自動幫我產生 SQL 敘述,而不必再去考量 SQL 敘述是否正確啊…等等的問題.剛好想到 Builder pattern 其實很適合,所以就實做看看.
目前這個 class 已經蠻齊全了,不過有些地方可以再加強.
1. Join 部分
2. 資料型態轉換,作的不好~應該可以再更精簡,更可靠.
3. 傳入 select – sql 敘述,就能產生 delete-sql, update-sql.
4. …
參考資料:
http://www.dotspace.idv.tw/Patterns/Jdon_Builder.htm
http://140.109.17.201/Jyemii/patternscolumn/articles/DesignPatternPart(2).htm
Design Pattern 中譯本 – 葉秉哲譯
範例程式:

* 主程式
LOCAL lc_sql
LOCAL lo_builder
lo_builder=CREATEOBJECT(“csqlbuilder”)
lo_builder.ADDCOLUMN(“u_id”)
lo_builder.ADDCOLUMN(“u_name”)
lo_builder.setTable(“users”)
lo_builder.addWhere(“”, “u_id”, “=”, “drury”)
lo_builder.addOrderby( “u_id” )
lo_builder.addGroupby( “u_id” )
? “=====”
? “select sql::”
?? lo_builder.getSelectSQL()
lo_builder.reconf()
lo_builder.addPair(“u_id”, “ellery”)
lo_builder.addPair(“u_name”, “ellery”)
lo_builder.setTable(“users”)
lo_builder.addWhere(“”, “u_id”, “=”, “drury”)
? “=====”
? “insert sql::” + lo_builder.getInsertSQL()
? “update sql::” + lo_builder.getUpdateSQL()
? “delete sql::” + lo_builder.getDeleteSQL()
*
* Builder pattern 類別實作
* 此類別適用環境: VFP 8.0
* 類別定義開始
*
DEFINE CLASS CSQLBuilder AS CUSTOM
  ADD OBJECT PROTECTED m_pairs AS COLLECTION
  ADD OBJECT PROTECTED m_where AS COLLECTION
  ADD OBJECT PROTECTED m_groupby AS COLLECTION
  ADD OBJECT PROTECTED m_orderby AS COLLECTION
  ADD OBJECT PROTECTED m_keys as collection
  m_table = “” && the table
  m_targettype=”” && cursor, table
  m_target=”” && name
  * Init
  PROCEDURE INIT
  ENDPROC
  * Destroy
  PROCEDURE DESTROY
  ENDPROC
  * Reconfigure
  PROCEDURE reconf
    * MSDN said: pass -1 will clear all items
    THIS.m_pairs.REMOVE( -1 )
    THIS.m_where.REMOVE( -1 )
    THIS.m_groupby.REMOVE( -1 )
    THIS.m_orderby.REMOVE( -1 )
    THIS.m_table = “”
    THIS.m_targettype=””
    THIS.m_target=””
  ENDPROC
  * addColumns
  PROCEDURE ADDCOLUMN( c_field AS STRING )
    THIS.m_pairs.ADD( .NULL., c_field )
  ENDPROC
  PROCEDURE addWhere( c_logical AS STRING, c_field AS STRING, c_operator AS STRING, o_value AS OBJECT )
    THIS.m_where.ADD( o_value, c_logical + c_field + c_operator )
  ENDPROC
  PROCEDURE addPair( c_field AS STRING, o_value AS OBJECT )
    THIS.m_pairs.ADD( o_value, c_field )
  ENDPROC
  PROCEDURE addGroupby( c_field AS STRING )
    THIS.m_groupby.ADD( .NULL., c_field )
  ENDPROC
  PROCEDURE addOrderby( c_field AS STRING )
    THIS.m_orderby.ADD( .NULL., c_field )
  ENDPROC
  PROCEDURE addKey( c_field as String )
    this.m_keys.add( .null., c_field )
  ENDPROC
  PROCEDURE addJoin
    * todo: this is the most hard part.
  ENDPROC
  PROCEDURE setTable( c_table AS STRING )
    THIS.m_table=c_table
  ENDPROC
  PROCEDURE setTarget( c_type AS STRING, c_target AS STRING )
    THIS.m_targettype=c_type
    THIS.m_target=c_string
  ENDPROC
  PROCEDURE getInsertSQL
    LOCAL i
    LOCAL lc_sql
    LOCAL lc_fields, lc_values, lc_type
    lc_fields=””
    lc_values=””
    lc_sql=”insert into ” + THIS.m_table + ” ”
    FOR i=1 TO THIS.m_pairs.COUNT
      lc_fields=lc_fields+THIS.m_pairs.GETKEY(i)
      IF( i+1 <= THIS.m_pairs.COUNT )
        lc_fields=lc_fields+","
      ENDIF
      lc_type=VARTYPE( THIS.m_pairs.ITEM(i) )
      DO CASE
        CASE lc_type="C"
          lc_values=lc_values+ "'" + THIS.m_pairs.ITEM(i)+ "'"
        CASE INLIST( lc_type, "N", "Y" )
          lc_values=lc_values + ALLTRIM( STR(THIS.m_pairs.ITEM(i) ) )
        CASE lc_type="D"
          lc_values=lc_values + "{^" + DTOC( THIS.m_pairs.ITEM(i) ) + "}"
        CASE lc_type="L"
          lc_values=lc_values + IIF( THIS.m_pairs.ITEM(i), ".T.", ".F." )
        CASE lc_type="X"
          lc_values=lc_values + ".null."
      ENDCASE
      IF( i+1 =1 )
      lc_sql=” where ”
    ELSE
      lc_sql=””
    ENDIF
    FOR i=1 TO THIS.m_where.COUNT
      lc_type=VARTYPE( THIS.m_where.ITEM(i) )
      DO CASE
        CASE lc_type=”C”
          lc_value= “‘” + THIS.m_where.ITEM(i)+ “‘”
        CASE INLIST( lc_type, “N”, “Y” )
          lc_value= ALLTRIM( STR(THIS.m_where.ITEM(i) ) )
        CASE lc_type=”D”
          lc_value=”{” + DTOC( THIS.m_where.ITEM(i) ) + “}”
        CASE lc_type=”L”
          lc_value=IIF( THIS.m_where.ITEM(i), “.T.”, “.F.” )
        CASE lc_type=”X”
          lc_value=”.null.”
      ENDCASE
      lc_sql=lc_sql + THIS.m_where.GETKEY(i) + lc_value
      IF( i+1 <= THIS.m_where.COUNT )
        lc_sql=lc_sql+","
      ENDIF
    NEXT
    RETURN lc_sql
  ENDPROC
  PROCEDURE getOnlyKey( o_collection AS COLLECTION )
    LOCAL i
    LOCAL lc_sql
    lc_sql=""
    FOR i=1 TO o_collection.COUNT
      lc_sql=lc_sql+o_collection.GETKEY(i)
      IF( i+1 <= o_collection.COUNT )
        lc_sql=lc_sql+","
      ENDIF
    NEXT
    RETURN lc_sql
  ENDPROC
  PROCEDURE getOrderBySQL
    LOCAL lc_sql
    lc_sql=THIS.getOnlyKey( THIS.m_orderby )
    IF( EMPTY(lc_sql) )
      RETURN lc_sql
    ELSE
      RETURN " order by " + lc_sql
    ENDIF
  ENDPROC
  PROCEDURE getGroupbySQL
    LOCAL lc_sql
    lc_sql=THIS.getOnlyKey( THIS.m_groupby )
    IF( EMPTY(lc_sql) )
      RETURN lc_sql
    ELSE
      RETURN " group by " + lc_sql
    ENDIF
  ENDPROC
  PROCEDURE getSelectSQL
    LOCAL i
    LOCAL lc_sql, lc_where, lc_orderby, lc_groupby
    lc_sql="select "
    FOR i=1 TO THIS.m_pairs.COUNT
      lc_sql=lc_sql+THIS.m_pairs.GETKEY(i)
      IF( i+1 <= THIS.m_pairs.COUNT )
        lc_sql=lc_sql+","
      ENDIF
    NEXT
    lc_sql=lc_sql + " from " + THIS.m_table
    lc_where=THIS.getWhereSQL()
    lc_sql=lc_sql + lc_where
    lc_orderby=THIS.getOrderBySQL()
    lc_sql=lc_sql+lc_orderby
    lc_groupby=THIS.getGroupbySQL()
    lc_sql=lc_sql+lc_groupby
    RETURN lc_sql
  ENDPROC
  PROCEDURE getDeleteSQL
    LOCAL lc_sql
    LOCAL i
    LOCAL lc_value, lc_type, lc_where
    lc_sql="delete from " + THIS.m_table
    lc_where=THIS.getWhereSQL()
    lc_sql=lc_sql+lc_where
    RETURN lc_sql
  ENDPROC
  PROCEDURE getUpdateSQL
    LOCAL i
    LOCAL lc_sql
    LOCAL lc_fields, lc_values, lc_type, lc_where
    lc_fields=""
    lc_values=""
    lc_sql="update " + THIS.m_table + " set "
    FOR i=1 TO THIS.m_pairs.COUNT
      lc_sql=lc_sql+THIS.m_pairs.GETKEY(i)+"="
      lc_type=VARTYPE( THIS.m_pairs.ITEM(i) )
      DO CASE
        CASE lc_type="C"
          lc_sql=lc_sql + "'" + THIS.m_pairs.ITEM(i) + "'"
        CASE INLIST( lc_type, "N", "Y" )
          lc_sql=lc_sql + ALLTRIM( STR(THIS.m_pairs.ITEM(i) ) )
        CASE lc_type="D"
          lc_sql=lc_sql + "{^" + DTOC( THIS.m_pairs.ITEM(i) ) + "}"
        CASE lc_type="L"
          lc_values=lc_sql + IIF( THIS.m_pairs.ITEM(i), ".T.", ".F." )
        CASE lc_type="X"
          lc_values=lc_sql + ".null."
      ENDCASE
      IF( i+1 =1 )
      lc_fields=””
    ELSE
      RETURN “”
    ENDIF
    FOR i=1 TO THIS.m_keys.COUNT
      lc_fields=lc_fields+this.m_keys.getKey(i)
      IF( i+1 <= THIS.m_keys.COUNT )
        lc_fields=lc_fields+","
      ENDIF
    NEXT
    RETURN lc_fields
  ENDPROC
  PROCEDURE getTable()
    RETURN THIS.m_table
  ENDPROC
  PROCEDURE getUpdatableFieldList()
    LOCAL i, lc_fields
    lc_fields=""
    FOR i=1 TO THIS.m_pairs.COUNT
      lc_fields=lc_fields+THIS.m_pairs.GETKEY(i)
      IF( i+1 <= THIS.m_pairs.COUNT )
        lc_fields=lc_fields+","
      ENDIF
    NEXT
    RETURN lc_fields
  ENDPROC
  PROCEDURE getUpdateNameList()
    LOCAL i, lc_fields
    lc_fields=""
    FOR i=1 TO THIS.m_pairs.COUNT
      lc_fields=lc_fields+THIS.m_pairs.GETKEY(i)+" "
      lc_fields=lc_fields+this.m_table+"."+this.m_pairs.getkey(i)
      IF( i+1 <= THIS.m_pairs.COUNT )
        lc_fields=lc_fields+","
      ENDIF
    NEXT
    RETURN lc_fields
  ENDPROC
ENDDEFINE
* 類別定義結束

.Net 的資源檔

資源檔的格式可以直接是 .txt 文字檔
.txt 可用 resgen 轉為 .resources
.txt 的格式很簡單,就是這樣

xyz=aaa

然後可再用下列命令編為 assembly (注意:可依據 locale “/c” 喔!)

al /out:your_app.resources.dll /V:1.0.0.0 /c:zh-TW /embed:your_app.zh-TW.resources,your_app.zh_TW.resources,private

一般來說,製作多國語系資源檔時,與 ap 放在同一層的就是 en 這個 locale.
程式內的寫法: new ResourceManager(“your_app”,this.getType().Assembly );

北投賞櫻花之二

接續之前”北投賞櫻花”那篇~
今天終於騎車去一探究竟了,不過並沒有如願看到一大片櫻花,只有看到零星的櫻花.
清天宮實在是很高,不適合騎機車去,對機車來說,太傷了~
應該要坐捷運與公車去,先坐到北投站,然後再搭乘”小6″.
清天宮旁的步道,左邊可以走到面天山與二子坪,右邊據網站資料表示,走過去應該可以看到一大片櫻花.可惜,我們半途而廢,只走了一些,就放棄繼續走下去了.
照片我放在這裡.

Continue reading “北投賞櫻花之二”

現在的圓環

以前並不知道重慶北路與南京西路的交叉口就是圓環,後來才知道這件事情.
知道以後過了沒多久,那兒就開始施工了,那時候並沒有相機,所以也沒記錄當時的樣子,否則應該可以與今天拍的照片作一個很強烈的對比.