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 “北投賞櫻花之二”

現在的圓環

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

購屋的粗糙決策

2004年2月25日….
我買房子了~~
房子還不錯,格局上,每個房間顯得獨立,實際坪數約26~27坪,比起周圍的房子來說有點貴了些.雖說車位要抽籤,不過據說其實不用抽就有車位可用.交通上還算便利~
現在心裡有點後悔說~
經過幾天的沉澱與檢討,有幾點以後若要再次購屋時,需要特別注意:
1.24 日打電話跟仲介說要出價.其實這時候,應該要再看一次房子,然後再想想才是~~
2.仲介問我要出多少價錢的時候,應該先設法詢問周圍的房價再出價
3.不管怎麼樣,還是要找父母來看看~
p.s.
2004年3月11日
回頭繼續寫這篇的時候,其實已經沒什麼感覺了~~反正~就是買了~~

Gentoo

因為前幾天,FAE 跟我說上海有個客戶用 gentoo, 結果我的程式執行有問題,雖然應該是可以執行,不過想說早就對 gentoo 蠻有興趣,所以就想說下載來玩玩看.
不過 .iso 檔案好幾天前就下載完,只是沒什麼時間來安裝,前幾天又卡到買房子的事情…昨天終於想說來玩玩看,於是就利用 vmware 試用版來裝裝看.
第一片 cd 放進去開機,就可以開出完整的 linux, 有點類似 knoppix.
只是要安裝到硬碟上,可就要花一番功夫了.
我參考了這篇 Gentoo 1.4 安裝指南 裡面的安裝步驟來做~~
我本來想說節省時間,從 stage 3 開始,可是一時手賤,改了 /etc/make.conf,結果反而多花了很多時間….這樣斷斷續續的一搞,花了很多時間~~最後卻又開不了機~~
只好再來一次,這一次,我才發現,原來我少了一些步驟,使得 gentoo 的 emerge 每次都得上網路去抓最新的 portage, 所以才會慢….這次就學聰明了,從光碟複製 portage ,然後盡量不改設定,這樣就快多了~~
安裝步驟大致摘錄如下:
1.光碟開機後,就是一個 live linux 可以用
2.切割你的 partition,自行格式化…等等.
3.把切割好的 partition 掛載到 /mnt/gentoo 下,並且把 swap 掛起來(swapon /dev/hdx),這樣速度會比較快
4.建議從stage 3開始,所以要
# cd /mnt/gentoo
# tar -xvjpf /mnt/cdrom/stages/stage3-*.tar.bz2
把 stage 3 的檔案放到 partition 中…
5.把光碟上的 portage 以及一些 gentoo 幫我們編譯好的檔案放到 /mnt/gentoo 中
# tar -xvjf /mnt/cdrom/snapshots/portage-yyyymmdd.tar.bz2 -C /mnt/gentoo/usr
# cp -R /mnt/cdrom/distfiles /mnt/gentoo/usr/portage/distfiles
# cp -a /mnt/cdrom/packages/ /mnt/gentoo/usr/portage/packages
6.再來就是 chroot, 切到剛剛都大致弄好的環境下
# mount -t proc proc /mnt/gentoo/proc
# cp /etc/resolv.conf /mnt/gentoo/etc/resolv.conf
# chroot /mnt/gentoo /bin/bash
# env-update
# source /etc/profile
7. 更新到最新套件(emerge sync), 調整 make 參數(/etc/make.conf), 更新系統(CONFIG_PROTECT=”-*” emerge -u system),省時間的話,這步驟可以跳過.
8.設定時區(從/usr/share/zoneinfo連結到/etc/localtime),以及設置 fstab.
9.安裝kernel, 若需要調整 kernel 參數,可以用 genkernel –config
# emerge -k gentoo-sources
# emerge -k genkernel
# genkernel
# emerge -k hotplug
# rc-update add hotplug default
10.安裝 log daemon, 有這幾種可以選: sysklogd, msyslog, syslog-ng metalog.
# emerge -k syslog-ng
# rc-update add syslog-ng default
11.安裝 cron daemon, 一樣也是有這幾種可選: dcron, fcron 和 vixie-cron
# emerge -k vixie-cron
# rc-update add vixie-cron default
12.檔案系統的相關工具: reiserfsprogs, xfsprogs, jfsutils, lvm-user
13.帳號,記得要設置 root 密碼,並且最好加入一個普通 user
# passwd
# useradd your_user -m -G users,wheel,audio -s /bin/bash
# passwd your_user
14.主機名稱以及網域名稱 /etc/hostname, /etc/dnsdomainname, /etc/hosts
15.網路設定 /etc/conf.d/net, 並把 eth0 加入開機順序中 rc-update add net.eth0 default , ethx 依此類推
16.調整鍵盤設定等, /etc/rc.conf
17. boot loader: grub 或 lilo,並修改 grub.conf 或 lilo.conf
# emerge -k grub
# grub
grub> root (hd0,0)
grub> setup (hd0)
18.把第二片的 portage 也放到硬碟中,並裝一些有的沒的
# mount /dev/cdrom /mnt/cdrom
# cp -a /mnt/cdrom/packages/* /usr/portage/packages/
# emerge -k xxxxx
19.最後的一些步驟,然後重開機啦
# etc-update
# exit
# reboot
🙂

滴滴答答與啦啦

滴滴滴
答答答
時間努力往前跑
我不由自主的被她往前推
啦啦啦
這就是人生
一個不得不前進的人生
一個不知不覺就會背負很多東西的人生
我看到你在我身旁跑著
於是向你說聲Hello
你對我點頭一笑
繼續向前~~
也看到有人跑不動因此跌倒或被壓扁
心中覺得可憐
可是仍然不得不向前
啦啦啦
這就是人生~~
充滿友情與愛的人生~~
充滿黑暗與悲哀的人生~~
你說不知道我在講什麼
其實我真的不知道我在講什麼
你可以看看就算了
也可以追問我
不過~~啦啦啦~~就這樣啦啦啦吧~~

Continue reading “滴滴答答與啦啦”