2008年11月8日 星期六

MySQL Master-Master

MySQL Master-Master Replication Manager(1) - 簡介 | Tsung's Blog
什麼是 MySQL Master-Master Replication Manager(MMM)?

* MMM (MySQL Master-Master Replication Manager) 是整合 Script 做 監控/管理 MySQL Master-Master replication cluster 的設定配置.
* Master-Master 的意思不是同時有兩台 Master 應付寫入的動作, 而是要做備援, 若 Master 死掉, 可於最短的時間內(幾秒內), 將備援的 Master 替換上線, 而這台備援的 Master, 平常也可以當 Slave (Reader).
* 當 Slave 的 Replication Failed 時, 會自動讓此 Slave 停止提供服務, 避免不同步的狀況發生.
* MMM 可解決 Master 死掉時, 需要停機或停止所有寫入的問題.

MMM 的特色

上述的事情, 只要在程式判斷 Master 死掉, 之後就永遠寫 Slave 等, 就可以做到(Master 回復時, 再手動去做切換), 但是 MMM 能夠多處理哪些東西呢? MMM 的設定/原理大概是怎麼樣呢?

* MMM 的基本設定是 Master-Master (就是兩台 MySQL Server 互相設對方為自己的 Master, 自己是對方的 Slave), 所以在任何一台正常回復, 會將資料自動透過 Replication 同步.
* MMM 能夠在 Master(db1) 死掉時, 在最短的時間, 自動切換到另一台當 Master(db2). 當 Master(db1) 回復時, 會直接當現在 Master(db2) 的 Slave, 不過不會直接上線, 要等資料 sync 同步後, MMM 才會允許手動設定上線.
* 另可參考: Typical Use Cases 使用情境(常見使用架構)

MMM 的運作原理

MMM 主要做法是 Master(db1), Master(db2) 設定固定 IP, 然後 Monitor 也設定一個固定 IP, 再來 Monitor 的設定再加上兩個 IP(Writer, Reader), 程式讀取/寫入 都是透過 Monitor 另外設的這兩個 IP, 當任何一台機器死掉(不管是 Reader/Writer), Monitor 會自動將 IP 設
到另一台機器上.

註: 透過 ARP(Address Resolution Protocol) 和 iproute 將 IP 指到另一台.

設定依正常設定, 兩台 MySQL Server 各設自己原本的 IP, Monitor 會依照設定檔另外再綁上各自讀寫用的 IP, 跟之前主要的差異是, 兩台
MySQL Server 要多跑 mmm_agent daemon, Monitor 要跑 mmm_mon daemon.

MMM 是透過下述 check MySQL servers 是否活著:

1. IP connectivity (fping)
2. MySQL connectivity (mysql connect and SELECT NOW())
3. MySQL IO and SQL threads status (SHOW SLAVE STATUS)
4. MySQL replication backlog - seconds behind master (SHOW SLAVE STATUS)

MMM 的官方資源

* MMM 官方網站說明: MySQL Master-Master Replication Manager
* MMM 下載: mysql-master-master - Google Code
* MMM 問答討論區: MySQL Multi Master Manager Development | Google Groups

MMM 的更多介紹、說明

* MySQL Master-Master replication manager released
* Master-Master Replication Example using MMM
* mysql-master-master wiki list- Google Code - 官方 Wiki 的說明文件
* Introduction - mysql-master-master
* MMM Documentation table of contents
* Using MMM to ALTER huge tables
MySQL Master-Master Replication Manager(2) - 環境建置、架設 | Tsung's Blog
前一篇 "MySQL Master-Master Replication Manager(1) - 簡介" 看完後, 再來就是要建置這個環境囉~(註: 目前 MMM 是 stable 1.0 版)

此文假設已經玩過 MySQL Replication, 所以 Replication 設定的部份不多做解釋, 若有不懂的, 可以參考: "MySQL 設定 Replication (Master - Slave)"
MySQL Master-Master Replication Manager 前置作業

MySQL Master-Master 的架構, 需要準備的資訊如下:

* 機器 3台以上(最少3台): 2台做 MySQL Server, 1台做 Monitor(監控機器可與 Apache 等共用即可).
* IP 5個以上(2N+1): MySQL Server 有幾台, 需要的 IP 是 MySQL Server 台數 x 2, 再加上 Monitor 要一個 IP.

MMM 前置作業手上該有的資訊:

* db-1 192.168.1.181
* db-2 192.168.1.182
* db-mon 192.168.1.183
* db-r 192.168.1.184 # 這個不用設進 db-1、db-2, db-mon 會自動設給它.(但需先決定db-1, db-2 哪台要先當 reader 或 writer)
* db-w 192.168.1.185 # 這個不用設進 db-1、db-2, db-mon 會自動設給它.(但需先決定db-1, db-2 哪台要先當 reader 或 writer)
* MySQL Replication 要設定的帳號: replication、密碼: slave.
* Monitor 存取 MySQL 需要的帳號: rep_monitor、密碼: RepMonitor.
* MySQL Agent 要設定的帳號: rep_agent、密碼: RepAgent.

開始之前, 除了上述該有的資訊外, 手上應該要有 3台機器, 3台機器設定分別如下:

* db-1 192.168.1.181
* db-2 192.168.1.182
* db-mon 192.168.1.183
* 若有要用到 mmm_clone, mmm_backup, mmm_restore 等功能, 需要 LVM 支援, 除此之外, 沒有 LVM 還是能正常監控/轉換等, 下述環境也是在沒有 LVM 的狀況下測試的.

MySQL Master-Master Replication Manager 環境建置、架設

下述設定參考自: Master-Master Replication Example using MMM (設定檔參考: Configuration Examples)

註: 下述環境、設定檔位置 是以 Debian Lenny 為主.
建置環境步驟

建置環境步驟主要如下述:

1. db-1, db-2 安裝 mysql-server
2. db-1, db-2 互設對方為 Master, 自己是對方的 Slave
3. 抓取 mmm 的檔案, 裝需要的 Package 後, 執行 install.pl
4. 設定 mmm_agent.conf 後, 於 db-1, db-2 跑 mmm_agent
5. db-mon 安裝需要的 Package 後, 執行 install.pl
6. 設定 mmm_mon.conf 後, 於 db-mon 跑 mmm_mon
7. 將 db-1, db-2 設定上線 mmm_control set_online db1, mmm_control set_online db2
8. 測試 mmm_control show 是否正常, 將 /usr/local/mmm/scripts/init.d, logrotate.d 設定到 /etc 去.
9. 使用 rcconf 設定開啟啟動即可.

實際執行步驟 - db-, db-2 互設 Replication, db-mon 建置
db-1 192.168.1.181

1. apt-get install mysql-server
2. vim /etc/mysql/my.cnf

# bind-address = 127.0.0.1
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log

3. /etc/init.d/mysql restart

做完此步驟, 請跳到 db-2 也先把此步驟做完.(順便抄下 db-2 的 show master status)

db-2 做完上述步驟後, 再繼續下面:

1. mysql -u root
2. mysql> GRANT ALL PRIVILEGES on *.* to 'rep_monitor'@'192.168.1.183' identified by 'RepMonitor';
3. mysql> GRANT ALL PRIVILEGES on *.* to 'rep_agent'@'192.168.1.181' identified by 'RepAgent';
4. mysql> GRANT replication slave on *.* to 'replication'@'%' identified by 'slave';
5. mysql> change master to master_host='192.168.1.182', master_port=3306, master_user='replication', master_password='slave'; # 文件上寫的做法
6. mysql> change master to master_host='192.168.1.182', master_port=3306, master_user='replication', master_password='slave', master_log_file='mysql-bin.000004', master_log_pos=98; # 我喜歡保守點的做法.(抓 db-2 mysql> show master status 資料)
7. /etc/init.d/mysql restart
8. mysql -u root
9. mysql> slave start;
10. mysql> show slave status \G

這樣子應該 Replication 已經設定完成, Master 是 db2, 自己是 Slave, 再下來就是架設 MMM 囉~

架設 MMM 步驟如下:

1. apt-get install libproc-daemon-perl libalgorithm-diff-perl libdbi-perl libdbd-mysql-perl # for perl
2. apt-get install iproute
3. wget http://mysql-master-master.googlecode.com/files/mmm-1.0.tar.bz2
4. tar xvf mmm-1.0.tar.bz2
5. cd mmm-1.0
6. ./install.pl
7. cp /usr/local/mmm/etc/examples/mmm_agent.conf.example /usr/local/mmm/etc/mmm_agent.conf
8. vim /usr/local/mmm/etc/mmm_agent.conf # 下述只將修改部份列出

cluster_interface eth0

# Define current server id
this db1
mode master

# For masters
peer db2

# Cluster hosts addresses and access params
host db1
ip 192.168.1.181
port 3306
user rep_agent
password RepAgent

host db2
ip 192.168.1.182
port 3306
user rep_agent
password RepAgent

9. mmmd_agent # 執行 agent, 或者 /usr/local/mmm/scripts/init.d/mmm_agent start
10. ps aux | grep mmmd

root 16115 0.0 0.0 41936 6904 ? S 15:02 0:00 perl /usr/local/sbin/mmmd_agent

11. 修改完成的設定檔參考可下載: mmm_agent.conf
12. 再來就繼續下述 db-2 的設定囉~

db-2 192.168.1.182

1. apt-get install mysql-server
2. vim /etc/mysql/my.cnf
3. # bind-address = 127.0.0.1
server-id = 2
log_bin = /var/log/mysql/mysql-bin.log
4. /etc/init.d/mysql restart

做完此步驟, 再回 db-1 繼續. (順便抄下 db-1 的 show master status)

1. mysql -u root
2. mysql> GRANT ALL PRIVILEGES on *.* to 'rep_monitor'@'192.168.1.183' identified by 'RepMonitor';
3. mysql> GRANT replication slave on *.* to 'replication'@'%' identified by 'slave';
4. mysql> GRANT ALL PRIVILEGES on *.* to 'rep_agent'@'192.168.1.182' identified by 'RepAgent';
5. mysql> change master to master_host='192.168.1.181', master_port=3306, master_user='replication', master_password='slave'; # 文件上寫的做法
6. mysql> change master to master_host='192.168.1.181', master_port=3306, master_user='replication', master_password='slave', master_log_file='mysql-bin.000004', master_log_pos=98; # 我喜歡保守點的做法.(抓 db-1 mysql> show master status 資料)
7. /etc/init.d/mysql restart
8. mysql -u root
9. mysql> slave start;
10. mysql> show slave status \G

這樣子應該 Replication 已經設定完成, Master 是 db1, 自己是 Slave, 再下來就是架設 MMM 囉~(下述步驟與上面一致, 只有設定檔有差異而已)

架設 MMM 步驟如下:

1. apt-get install libproc-daemon-perl libalgorithm-diff-perl libdbi-perl libdbd-mysql-perl # for perl
2. apt-get install iproute
3. wget http://mysql-master-master.googlecode.com/files/mmm-1.0.tar.bz2
4. tar xvf mmm-1.0.tar.bz2
5. cd mmm-1.0
6. ./install.pl
7. cp /usr/local/mmm/etc/examples/mmm_agent.conf.example /usr/local/mmm/etc/mmm_agent.conf
8. vim /usr/local/mmm/etc/mmm_agent.conf

cluster_interface eth0

# Define current server id
this db2
mode master

# For masters
peer db1

# Cluster hosts addresses and access params
host db1
ip 192.168.1.181
port 3306
user rep_agent
password RepAgent

host db2
ip 192.168.1.182
port 3306
user rep_agent
password RepAgent

9. mmmd_agent # 執行 agent, 或者 /usr/local/mmm/scripts/init.d/mmm_agent start
10. ps aux | grep mmmd

root 8837 0.0 0.0 41936 6904 ? S 15:02 0:00 perl /usr/local/sbin/mmmd_agent

11. 修改完成的設定檔參考可下載: mmm_agent.conf

db-mon 192.168.1.183

1. apt-get install libproc-daemon-perl libalgorithm-diff-perl libdbi-perl libdbd-mysql-perl # for perl
2. apt-get install iproute
3. apt-get install subversion # 目前 1.0 stable 的 mmm_mon 程式有 bug, 所以需要直接 checkout trunk 的來用
4. svn checkout http://mysql-master-master.googlecode.com/svn/trunk/ mysql-master-master-read-only
5. cd mysql-master-master-read-only/
6. ./install.pl
7. cp /usr/local/mmm/etc/examples/mmm_mon.conf.example /usr/local/mmm/etc/mmm_mon.conf
8. vim /usr/local/mmm/etc/mmm_mon.conf

email root@localhost # 修改成有狀況要通知的 Email.

host db1
ip 192.168.1.181
port 3306
user rep_monitor
password RepMonitor
mode master
peer db2

host db2
ip 192.168.1.182
port 3306
user rep_monitor
password RepMonitor
mode master
peer db1

# Mysql Reader role
role reader
mode balanced
servers db1, db2
ip 192.168.1.185, 192.168.1.184

# Mysql Writer role
role writer
mode exclusive
servers db1, db2
ip 192.168.1.185

9. /usr/local/mmm/scripts/init.d/mmm_mon start
10. mmm_control show
11. mmm_control set_online db1 # 讓 db1 上線
12. mmm_control set_online db2 # 讓 db2 上線
13. mmm_control show # 看到下述就成功了~

Config file: mmm_mon.conf
Daemon is running!
Servers status:
db1(192.168.1.181): master/ONLINE. Roles: reader(192.168.1.185;), writer(192.168.1.185;)
db2(192.168.1.182): master/ONLINE. Roles: reader(192.168.1.184;)

14. 修改完成的設定檔參考可下載: mmm_mon.conf

設定 log rotate

下面這些步驟分別在 db1, db2, mon 設定即可.

1. cp /usr/local/mmm/scripts/logrotate.d/mmm /etc/logrotate.d/
2. vim /etc/logrotate.d/mmm

/opt/mmm/var/*.log { 修改成 /usr/local/mmm/var/*.log
olddir /opt/mmm/var/old 修改成 olddir /usr/local/mmm/var/old

設定開機自動啟動
db1, db2 設定開機自動啟動

1. cp /usr/local/mmm/scripts/init.d/mmm_agent /etc/init.d/
2. apt-get install rcconf
3. rcconf
4. 選取 mmm_agent 即可

mon 設定開機自動啟動

1. cp /usr/local/mmm/scripts/init.d/mmm_mon /etc/init.d/
2. apt-get install rcconf
3. rcconf
4. 選取 mmm_mon 即可

再下來就只要會 mmm_control show, mmm_control set_online, mmm_control set_offline 即可.
當機/重開機的 SOP

若有重開機等狀況, 檢查步驟:

1. mysql -u root # 看 MySQL 是否有啟動, 若沒啟動 /etc/init.d/mysql start
2. ps aux | grep mmm # 看 mmm_agent 或 mmm_mon 是否有啟動, 若沒啟動 /etc/init.d/mmm_[agent|mon] start
3. 再來在 mon 的機器下: mmm_control show, 若沒上線, 發現已經在 AWAITING_RECOVERY 狀態, 就可以 set_online 讓他上線囉~

測試

1. db1, db2 mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON *.* TO 'mmm'@'%' IDENTIFIED BY 'mmm_password';
2. db1, db2 mysql> FLUSH PRIVILEGES;
3. 寫程式去對 192.168.1.184, 192.168.1.185 做寫入/讀取的動作, 並試著重開等看看反應~
4. 註: 目前測試狀況, 機器死掉時, 在 2秒內就會自動切換過去. :)

MMM LVM 設定

因為機器安裝時沒設 LVM, 所以沒辦法測試, 不過需要安裝的 Package 和設定大概如下:

1. apt-get install lvm2 dmsetup mdadm reiserfsprogs xfsprogs
2. MMM LVM 設定範例: mmm_lvm.conf # 此設定範例需要另外建立 /backup, /mmm_snapshot 目錄
3. 設 LVM 可以直接在 db2 將 db1 的資料 clone 過來, ex: db2# mmm_clone --host db1 --clone-mode master-master # db2 的 MySQL 會幫你停掉, 然後再 scp db1 data 過來.

相關網頁

* MySQL Master-Slave架構下使用MMM的必要性
* 實踐:使用MMM搭建Mysql集群
* MySQL Replication Manager
MySQL Master-Master Replication Manager(完) - 問答 | Tsung's Blog
MySQL Master-Master Replication Manager(完) - 問答

MySQL Master-Master Replication Manager 完結篇, 就來做個問與答吧~(這三篇文章都是 MMM 1.0 版)

不知道什麼是 MySQL Master-Master Replication Manager(MMM) 的, 請先看下述文章:

* MySQL Master-Master Replication Manager(1) - 簡介
* MySQL Master-Master Replication Manager(2) - 環境建置、架設

MMM 的問與答

將其中一台 MySQL 關掉, Mon 該如何動作?

1. Mon 會自動把 IP 轉到另外一台, 等 MySQL 回復後自然會還原.
2. mmm_control show # 若沒有自動還原
3. mmm_control set_online db1 # 將沒有還原(假設是 db1)那台的設定上線.

先將 mmmd_agent kill 掉, 再把 MySQL kill 掉, 然後再把 MySQL start, Mon 會如何動作?

1. 因為 Mon 是自動去連 MySQL 的, 所以不會因為 mmmd_agent 砍掉而有影響, MySQL kill 掉時, Mon 一樣會知道那台是掛掉的,(master/HARD_OFFLINE)
2. 此時於 另外一台 MySQL 寫的資料, 於此台 MySQL start 時, 會自動寫入, 不過 Mon 無法將這台回復的機器登記入可以讀寫,(master/AWAITING_RECOVERY)
3. 因為這台的 mmmd_agent 還沒起來, 沒辦法知道是否已經跟上 replication 沒.
4. 所以要先啟動 mmmd_agent, Mon 再 mmm_control set_online db1.

Mon 的 mmmd_mon kill 掉, 對其它有沒有影響?
沒有影響, /usr/local/mmm/scripts/init.d/mmm_mon start 即可.
Master 測試重新開機 shutdown -n -f -r now

重新開機完後的處理步驟:

* 於 重開機的機器(Master)
1. /etc/init.d/mysql start # 這種重開法, MySQL 不一定能正常啟動.
2. ps aux | grep mmm # 看 mmmd_agent 是否有正常啟動.
* 於 Mon 的機器
1. mmm_control show # 會發現啟動後, master 的狀態會由 HARD_OFFLINE -> AWAITING_RECOVERY
2. mmm_control set_online db1 # 讓它啟動接受服務.

Mon 測試重新開機 shutdown -n -f -r now

重新開機完後的處理步驟:

於 Mon 的機器

1. ps aux | grep mmm # 看 mmm_mon 是否有正常啟動, 沒有正常啟動就執行 /etc/init.d/mmm_mon start
2. mmm_control show # 看監控的機器是否都還正常

Master 死掉, 然後造成 Reader 和 Writer 互換, 若 Mon 重新啟動會回復原始設定嗎? 若不會, 想要互換要怎麼換?

1. 不會回復原始設定, 用的是最後跑的狀態.
2. 想要將設定的互換, 步驟如下:
1. master mysql restart
2. slave mysql> start slave;
3. 這樣子就會互換了 (因為 Master MySQL restart, Slave 那台 replication 會停掉, 所以 Mon 會將所有 IP 都指向 Master, 再將 Slave replication 搞定, 就會再把 reader 指回 slave 了)
3. 設定互換的另一種方法, 就是把另外一台先設 mmm_control set_offline, 再 set_online 即可.
4. 設定互換的另一種方法, 使用 mmm_control move_role writer db1, 設定設回 Writer 去.(不過此方法我測試似乎不會動)

寫入, 讀取應該要用的IP, 要用本機IP 還是設定的 db-r, db-w IP?
寫入/讀取要用的 IP, 是要用設定的 db-r, db-w 的IP, 設定的 db-r 的 IP(只要 Writer 沒有指到此 IP), INSERT/UPDATE/DELETE 的動作會把你擋掉, 會出現 "ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement" 的錯誤訊息.(不過 CREATE/DROP Table 等動作不會被擋掉.)
在 Master 上的 mmm/bin/* 有很多檔案, 要怎麼讓他可以使用?

要先讓它有存取 MySQL 的權限, 於 mysql> 就這樣子下: (帳號/密碼/IP 請自行修改)

1. mysql> GRANT ALL PRIVILEGES on *.* to 'rep_agent'@'192.168.1.181' identified by 'RepAgent';
2. mysql> GRANT ALL PRIVILEGES on *.* to 'rep_agent'@'192.168.1.182' identified by 'RepAgent';
3. mysql> FLUSH PRIVILEGES;
4. 不過 mysql_deny_write 並不會讓它不能寫入.(此程式會幫你執行: set global read_only=1, 不過 CREATE/DROP 還是可以使用. XD)

想要一台 Mon 管理多台 agent 要怎麼設定?

1. 將 /usr/local/mmm/etc/mmm_mon.conf 改名成 mmm_mon_c1.conf
2. 就可以 mmm_control @c1 show 來管理 c1 的 Cluster, 就可由此來做其它 Cluster 的 Mon 設定囉~

mmm_control 哪些狀態可以將機器 set_online?
master/AWAITING_RECOVERY 或 master/ADMIN_OFFLINE 的狀態.
mmm_contorl 全部狀態有哪些?

mmm_control show 會看到機器有下述的狀態: (原文可見: HowToUse - mysql-master-master)

* master/ONLINE - 此機器沒有任何問題, 正常執行.
*
* master/AWAITING_RECOVERY - 此機器的 MySQL 可能有重開, 並沒有被設定上線, 於 replication 跟上進度後(若 replication 有損壞的狀況, 需自行修復), 使用 "mmm_control @C1 set_online 機器名稱" 的命令讓他上線.
* master/ADMIN_OFFLINE - 管理者設定讓這台機器下線.
* master/HARD_OFFLINE - 此 MySQL 是沒辦法 ping 到, 可能是網路問題或者機器當掉或重開等等.
* master/REPLICATION_FAIL - MySQL 的 replication error. 遇到先修復 replication 的狀況, 才能讓它再上線.
* master/REPLICATION_DELAY - MySQL 死掉時, 可能 MMM 自動移動 reader 的角色到 Master 去, 但是 Reader 起來後, Replication 還根不上進度, 需要等它跟上才能恢復上線.

於 lvm 的環境下, 如何快速建立一台 Master (Master-Master) 架構?

1. LVM 安裝: apt-get install lvm2 dmsetup mdadm reiserfsprogs xfsprogs # LVM 詳細安裝步驟可參考: A Beginner's Guide To LVM
2. 設定好 /usr/local/mmm/etc/mmm_lvm.conf
3. 就可以於 db2# mmm_clone --host db1 --clone-mode master-master (此指令會將 db2 的 MySQL 停掉, 再 scp 過來)
4. 註: 不過這個我也沒試過.

讀取都是透過 Mon 指定的那兩個 Writer/Reader 的 IP, 但是 Mon 死掉的話, 會不會就無法寫入/讀取?
不會, 因為 Mon 是透過 Address Resolution Protocol (ARP), 而 ARP 在每台機器是都會有暫存區, 存: "IP <-對應-> Mac Address" 的資料, 所以 Mon 死掉在 ARP Cache 過期前, 都不會有影響.

常見 FAQ

* FAQ - mysql-master-master - Frequently asked questions.
10 Most Sought-after Skills in Web Development - NETTUTS
1. Framework knowledge
2. Widget development
3. Custom CMS themes
4. CMS Customizations and plugin development
5. PSD to XHTML services.
6. Javascript Plugin creation
7. Facebook/MySpace applications
8. iPhone applications
9. Ecommerce integration
10. Flash and Actionscript Knowledge

Web2.0生產力之探討

Web2.0生產力之探討 - MMDays
Web2.0主要的想法,就是希望讓使用者同時也是生產者,譬如說 Wikipedia,除了讓使用者閱讀,使用者也可以貢獻內容,如果是文字以外的內容,譬如說影像或音樂,Web2.0也希望成為一個平台,讓使用者容易產生或重製內容的工具。然而除了內容共同製作、重新製作會產生著作權的問題之外,經濟面上的考量,大概是就獲利的部分了。首先必須讓使用者有動機來生產內容,其次,即使使用者願意不收代價貢獻內容,提供平台的第三者又要怎樣子獲利?除了廣告模式,目前似乎還沒有很好的商業模式 (business model) 。本篇文章也先不談到這個部分,不過先談談商業模式的前一步,Web2.0生產力的分析。也許透過對Web2.0生產力特性的分析,我們可以把Web2.0如何生產內容看的更清楚,進而有機會想到除了廣告模式之外,有哪一種新的商業模式可以在Web2.0網站上實行。

那麼,使用者會怎樣子透過Web2.0的方式來分享和貢獻內容呢?在這邊我分成三大部分來探討:(1) 使用者圍繞既有內容外圍產生新的內容。(2) 使用者透過分割重組方式產生新的內容。(3) 產生內容對於獲利可能的關鍵步驟。

使用者圍繞既有內容外圍產生新的內容

使用者可以根據已經產生的內容,來製作新的內容。根據新產生內容的多寡以及難易度,大約分成下面幾類:

(1) 瀏覽行為或是推薦書籤

這類內容提供了最基本的內容,對於使用者來說產生這個內容也最為容易,因為一邊瀏覽一邊就可以產生出來,不用額外花費力氣。譬如說最多人瀏覽的新聞,搜尋引擎的熱門關鍵字,推薦或收藏部落格文章,以及分享網頁書籤等等。這些推薦內容不用額外花力氣,幾乎只要幾秒鐘就能產生,其作用也是在一堆資訊中作為一種過濾的功能,讓資訊消費更有效率。雖然這些新產生的資訊不像原來的資訊那麼多,但是對於使用者來說,舉手之勞何樂不為,負擔也不大。

(2) 進一步的推薦說明或相關討論

對於一則新聞或是其他數位內容,閱讀瀏覽之後的心得,可能會用文字的方式來分享,短到一句推文或是twitter留言,長一些像是討論區中的回應,對於使用者來說,需要稍微花一些時間來產生,但是因為是使用者本身本來就有話要說,因此付出的時間對於使用者來說負擔不會太大,產生出來的回應則是比剛才純粹的推薦稍微豐富一些。經過機器的處理蒐集,這部分或許可以應用長尾理論來產生新的內容。

(3) 詳細的討論文章或是出版書籍

這部分就不是一般讀者每個人都能做到的,通常是學有所長,該領域的專家,才有辦法掌握相關基礎知識 (domain knowledge),作詳細專業的評論,或是由原來的內容作為靈感來源,產生新的創作等等。這部分內容產生者只有專家,而且需要比較大的成本才能夠產生。

因此從 (1) 到 (3) ,能夠生產內容的使用者個數越來越少,所需要的成本越來越多,但是生產出來的內容資訊性也越來越高。然而我們也可以想辦法,讓 (1) 的生產者能夠在負擔不改變的情況下,慢慢往 (3) 移動,要用什麼方法呢?或許可以再思考一下。

使用者透過分割重組方式產生新的內容

使用者除了根據既有內容來生產新的內容,也可以切割舊有的內容,重新組織後形成新的內容,根據切割的程度,可以分成下面幾類。

(1) 完整內容的重組

內容本身沒有被切割,只是將同性質的內容放在一起,或是組織成時間上的序列。譬如說一場舞會,DJ依照會場的氣氛,交錯播放激烈或緩慢的舞曲。同一個地點不同時間或是不同角度的照片,可以依照地區來擺放,讓大家透過地區的方式來觀賞不同角度的照片,或是穿越時空觀看歷史照片。也可以根據一個特別的事件,像是出外遊玩的照片,大家一起分享在同一個相簿等等。這些都是使用者重製自己內容,產生新的內容的例子。但是對於原來的內容切割比較少,產生的新資訊也就沒有特別多,比較屬於一種索引 (index) 的分享創作行為。

(2) 主題式重組

Wikipedia 是根據一個個條目,將每個人腦海中的知識,或是網路上找到的資料,重製成新的一個網頁,專門說明某一個主題 (topic)。因此,照片、音樂、影片,是否也有這種根據主題進行切割重組的內容產生方式呢?文字知識有主題,但是影片比較沒有這種重製方式,譬如說製作一個新的影片,主題是「跳傘」,然後開始把每一部電影找過來,只要裡面有「跳傘」的片段就剪下來,最後重組成新的影片。然而會有幾個問題,首先就是比需要有方便的剪接編輯工具,再來是這個新製作出來的內容 — 跳傘影片,是否能夠成為有趣的內容呢?是否會有人願意走進電影院,然後觀賞連續兩小時的跳傘畫面,而且是從各部電影的片段剪接而成呢?因此,除了文字知識之外,影片、音樂、照片,似乎比較沒辦法進行主題式重組,除了著作權和編輯工具的方便性問題以外,製作出來的新內容,似乎沒有很大的資訊價值?

(3) 材料式切割

投影片簡報,或是發表文章的時候,有時候都會需要插圖來輔助說明,或是讓讀者印象更加深刻。因此數位內容的材料切割,是另外一個需求。然而要使用者自己把每一張相片,剪下有意義的材料,除了不方便,可能也不是非常有趣。因此,這部分就需要倚賴機器的自動化來幫忙,譬如說各種過濾演算法 (filter) ,可能有辦法自動剪下人臉、或是各項物品。在需求這一端,也可以自動化,譬如說文章寫到電腦,可以跳出各種電腦的照片,還可以指定是哪一種形狀或背景的電腦照片。因此這部分比較需要軟體技術上的突破,讓供給端可以方便地分享內容的各個有意義的部分,需求端也可以用文字以外的方式,來搜尋多媒體的材料 (components)。

(4) 基本元素式切割

這一部分主要是想探討切割的方式,以及切割對分享的影響。如果我們努力切割,文字內容可以切割成一句話,或是一個單字。相片內容可以切割成一個256色的亮點,音樂內容可以切割成每一個單音音符。切割到這麼小的時候,比較沒有著作權的問題,就像我們不能申請某個單字的專利,除非是商標,某個音樂的音符也不能申請專利,某個亮點也不能申請專利。然而,切割到這麼小的時候,似乎也失去原來內容的性質。譬如說一首歌把每一個音符都切開,剩下一堆音符的累積,之間的速度關係和節奏變化關係,在切割的過程中就消失掉,而這也是一首歌具有資訊價值的部分。因此在這邊只是想探討,如果要Web2.0重組內容,怎樣子切割原來的內容,才不會把內容切成失去原來的性質,變成音樂裡面的音符一樣,這個時候可能機器亂數產生,同樣可以重製內容了,因為機器也可以隨意輸出各種音符的組合。

(5) 相關工具連結

因為上面 (1) 到 (4) 點,都需要有相關工具,才有辦法編輯重組,因此就到 MMDays 的 Wedex 服務尋找了一下,目前似乎圖片的工具比較多,影片次之,音樂部分就比較少一些了。在下面重覆貼一下給各為參考:

圖片薦推:

* Diggirl : 美女圖片薦推
* PHOTOREE:依個人喜好推薦照片

漫畫/對白創作:

* VeryXD : 對白惡搞
* Bubblr: 利用 Flickr 來製作對白連環漫畫
* toonlet: 創作連環漫畫
* Comiqs: 創作連環漫畫
* ComicJuice: 創作連環漫畫
* FlipFrames: 將圖片加上相框以及對話
* ToonDoo: 提供大量的素材來製作漫畫
* Comeeko: 製作自己的漫畫影印出來, 或是印在馬克杯/T-Shirt 上面
* BubbleShare: 將圖片加上相框以及對話
* iBubble: 將圖片加上相框以及對話

圖片編輯:

* Picnik: 圖片修改, 加入特效
* WebPicTool: 圖片修改, 加入特效, 加入外
* LUNAPIC: 圖片修改, 加入特效
* Picture2Life: 圖片修改, 加入特效
* ANIMOTO: 產生特效 Slideshow, slideshow 的變化會跟著音樂節拍變動
* Splashup: 圖片修改, 加入特效
* PikiPimp : 將圖片上面加入一些物件
* PicHacks: 產生左右對稱的圖片
* PhotoNote: 產生相框, 加入註解
* Pictogame: 自己創作圖片小遊戲
* 戲樓: 主題圖片收集
* PictureTrail: 照片儲存、Slideshow、社群
* retrievr: 以手繪方式找相關圖片或是以圖找圖
* sketchplanet: 錄製畫圖的過程
* ComicsSketch: 錄製畫圖的過程
* likebetter: 透過照片來知道朋友的喜好
* Vidoop: 用圖片做密碼
* 音樂小畫家 MusicPainter: 鼓勵創作分享和協同(collaborative)音樂創作為目標而設計的網路遊戲。



產生內容對於獲利可能的關鍵步驟

分析了可能重製內容、創造內容的生產方式之後,稍微分享一下一些關鍵步驟,對於 Web2.0 的獲利或許會有幫助。因為目前內容通常會免費提供,但是創造內容卻需要花費力氣。除此之外,經營者也希望有所獲利,但是數位化的內容因為容易複製,怎樣子才能把虛擬的數位內容資訊,轉換成可以吃的實體金錢呢?

(1) 獲利與成本的平移關係

首先想先坦討一下平移關係。如果說一間房子的房租是5000元,那麼賺到5000元,和租到一間房子但是免費不用錢,兩者相等,只不過租房子的例子裡面,限定要租房子而不能享受其他事情。因此我在想對於使用者來說,免費的內容,就如同賺到了錢一樣,讓虛擬的數位內容和實體的錢,至少有了一個流通的管道。然而對於生產者來說,卻好像租出去一間房子,卻收不到錢。如果生產者可以把房子拿回來,享受房子,那麼就如同有收到錢一般了。如果生產者本身也能夠享受內容,而且剛好也是他要享受的內容,那麼也算是有賺到錢了。

(2) 機器生產力的發揮

第二項困難在於數位內容容易複製,因此獲利有困難。然而既然複製是因為機器的發明,讓複製變的容易,也就是消費端可以更加容易,生產端不也是可以運用機器,讓成本降低呢?尤其是人工智慧 (Artificial Intelligence) 的應用,不管是之前切割需要的演算法,或是蒐集分散各處的推薦文字,都可以是讓生產成本變低,進而讓複製這件事情成為合理的消費方式的方法。

(3) 使用者透過網路共同創作產生的成本無限小可能性

除了機器的幫忙,獲利和成本的平移關係,網路聯繫眾多使用者的方式,也可以變成聯繫眾多生產者的方式。也許會說,《世界是平的》這本書已經提過這個想法,然而這邊我主要是想結合前面提到的分割重組概念,當分割到很小的一件事情,對於使用者來說,成本可以忽略。但是積沙成塔之後,產出的內容具有資訊價值,即使可以複製,平移之後仍舊能夠回饋獲利給生產者,消費者仍舊是免費消費。

目前的情況是希望使用者可以複製、又可以免費消費,但是生產者又能夠有實質金錢獲利,似乎是要馬兒好又要馬兒不吃草,但是現在經過網路集合眾多生產者,有了分割重組的生產內容概念、有了獲利成本平移的想法、有了機器幫助講低生產成本的想法,或許可以產生無限小成本的情況,就像微積分裡面遇到的無限小 (epsilon),放在分子的時候可以當成 0 ,放在分母的時候又不等於 0 。現在我還沒有很明確想出要怎樣子做才能產生這種無限小的情況,不過前面各種生產力的分析,像是創造內容的負擔程度分析,以及分割重組內容的切割程度分析,或許就是產生這種無限小情況的前一步驟,提供給各為參考,如果各位看懂這個想法,或許也可以一起思考一下,如何創造出這種分子等於 0 ,分母又不等於 0 的神奇的無限小 (epsilon) 概念!
會考零分至大學畢業之路 | 亞特蘭提斯 .NET Atlantis
- 出來做事都已經差不多有8年,其實我很明白「識做人勝過識做事」。現實世界, 就算再有能力,一項工作都要有「人」參與,就會涉及人事,不是每個人都會盡量和自己配合,而自己亦不可能配合到每個人。
遇到一些麻煩友,出100%努力只會有50%收獲,不一定要推卸責任,互相卸膊,但這時候就正好需要冷靜和變通。

有時我會覺得,誰在乎你有如何強勁的Programming能力,如何用PhotoShop畫到一幅山水畫,甚至你讀書時有多少個[A],說到底做是 - 你做什麼職位?月入多少?
向來冶國冶民,玩弄朝野的人都不一定高材生,在一間公司做管理層亦不一定是MBA,之所以為什麼通常感覺[下屬會比上司叻],可能只是因為你的工作量比他還要多而已。
香港電腦業的曙光 | 亞特蘭提斯 .NET Atlantis
我相信近期找Programming工作的人應該很吃香,我月頭接受Offer後,之前已經前後5個Interview電話打給我,今天那一個更主動問我幾多錢人工,說加多$1000,問我有沒有興趣。原因我不清楚,比我高學歷的人多的是,比我Dev能力強的人都多的是。最後我拒絕了他,因為我暫時都覺得現在的工作還可以,而且我現在 Main Field 是寫PHP,由ASP.NET/C# => PHP感覺就好似搾開Ferrari 轉搾Taxi 咁(大概是咁比喻..),更容易,但很有趣,習慣一下就可以了~而且呢幾個月搵工都覺得其實香港PHP P仔需求很大,誰說是Java/.NET分天下,所以我都想襯呢次操下PHP。 但其實心裡的確是有一陣歡喜,因為第一次嚐到給人挖角的滋味。

其實呢兩個幾月,我應該算是了解電腦業的就業市場 (Yes,電腦業,我唔鐘意用IT呢個字),每天都看JobsDB,奴供處,Career Times,JobMarket,招職,Classified Post ,其實Programming工作還是On Demand,相信是中上層開始(PM,BA,SA)有危機,始終人工都是有返咁上下,可以見到JobsDB其實就算唔係Agency既工,Job AD依然都好多,但很多公司根本請不到Programmer,很多廣告我也重複看了很多遍。相信原因有兩點:

1. 大專大學的電腦科,都不是有太多人選擇,其實呢一行遲早出現斷層。做開果班,你冇返咁上下人工都請唔郁佢,Fresh Grad既,又未必可以Handle到,很多公司根本唔願意花時間去Train人或者俾新人花時間去Pick up,但公司很多都眼高手低。

2. 向來開發工作就是介乎於[專業]同[不專業]之間,門檻的確是很低,你HD/Asso畢業,已經可以去找P仔工,但有如個個人話什麼PHP易學,VB易明,入門門檻是低,但又有幾多人可以摸到天花板???換句話說,僱主都眼花撩亂,畢竟Interview一個應徵者都要花時間的。

greenshot_2008-10-08_22-57-31.jpg

1,2兩點其實是互相矛盾,但幸好是,我眼中所見,幾年前要求的IT超人(C,C++,J2EE,SE,ME, C#,ASP.NET,VB,PHP,Perl…)已經好少,正所謂百屌成才,呢樣o野起好多電腦行業討論區已經屌左好多年,現在終於有改善,無論如何,雖然我學歷還是很低,指教大學生似乎很點太過…但畢竟自己都打滾了那麼久,我建議有意加入電腦業的同學仔,最重要是心中富有,穩打穩扎才能起淡市中殺出條生路,搵工向來都是在[大海]中,你和公司的Mix and Match,只要你不是拎住個學位就想混飯吃,有真材實料,Interview時,識就識,唔識就要話唔識,你自知自己有料到,自然表現得有信心,Interviewer自然就會對你有好感,其實我相信見什麼工作都好,Interviewer不是想聽你的花言巧語,而且就算給你騙得過,實際做落就見真章,其實見工的本質就是這樣。
亞特蘭提斯 - .NET Atlantis
記得10年前左右我學VB6時,很多人說VB6學壞手勢,話學Delphi好,當然呢o的已經係歷史話題。但前排睇左幾篇Blog文,話PHP是次選語言,不會是初學者的首選,我都很同意,亦令我想起”學壞手勢”呢四隻字。

PHP的問題,其實在於太過寬鬆,好似近排我工作上是寫PHP就有很多令我出奇的情況。

Google in education

在下【阮瑪莉】: 第一次探訪Google Office in HK
剛去完Google在Times Square的Office開會,是我好期待的一天,不過最唔開心的是,因為Office未正式發佈,所以不可以影Office內的環境。

今日的題目是『如何在香港教育界推動運用Google』,講真,自己真係之前並未有唸過這個問題,應該係無唸過自己可以有機會去唸這個題目。不過神來之筆,在會上卻是我發表得最多意見。在回家的路上在想:是不是不久的將來,Google在香港教育界的發展,真的會如我今日說的這樣發展呢?於是很想把今日『吹』的都寫下來做個記錄。

1. 一般的教師工作坊不是主力
因為這類型的教師工作坊,單是我和同事上年在教師培訓行事曆開的已有7次,另外Google自己開了3次(截至今日),本年度(下星期三)EDB將會再開,還未計在計劃中的Teachers Refreshment Training Course(因為我真的是未有時間去寫)…不是已經夠了嗎?而且要30、30一次的搞,要搞到何時才可以建立好一般教師使用Google的practics?

2. 要推Google Apps及Mobile Learning
在學校推任何事,以現在的教師工作量和壓力情況來講,要行得快只有一個方法-由上而下。
對象是校長或IT panel,一個IT panel決定申請一個Google Apps戶口,校內的五、六十個老師即時自動會收到一個Google Apps user account,就算單是用於Admin都會經校內各行政會、校務會向老師發佈及推動,效果都可以說是即時的。
要學校決定使用Google Apps,第一個吸引點,就是全校每人一個7Gb(截至今日)的email account,試想一間學校老師、職員連學生1千個戶口,已經幫學校免費維持了一台7Tb的Mail Server,當然學校也需要考慮到日後離校老師、學生的backup安排及security問題。至於一個Apps account內包括其他例侞calendar、docs、sites的products,都只是錦上添花。
但另一個不容看輕的吸引點,就是Mobile Learning,現在間間學校都架設了wifi的基建,但其實絕大部份學校都未能好好利用這個wifi環境,做到mobile learning。除了因為欠缺硬件的設備外,另一個問題就是欠缺有關的軟件及網上配套。看過不少學校嘔心瀝血製作自家的wap版或PDA版網站做mobile learning活動,又或是寫個QEF比十幾萬那間"醫卡"寫個mobile版,但長遠仍是欠缺延展性及升級能力,學校總不能長期負擔人力或財力的消耗。但Google在Mobile applications上已經很成熟,在不同的device上更有很多API或其他軟件的配套,可以補之不足外,更是【免費】,這一點相信是學校上位者最喜歡的一點。這個【免費】的字詞,在Google來說,更包括【免費不停升級】和【免每年的maintance fee】。
現今資訊科技的世界實在走得快到不可言喻,『家家練鋼』的時代不得不過去,所以在我來看,最平(其實是免費),最有彈性及發展潛力的mobile learning軟件配套現在只得一個選擇 - 就是Google。

3. 做大型Seminar,邀請press的參予
開了多次工作坊,不得不承認,絕大部份教育界的同工,對Google的認識是很少、很少。做小型的工作坊,希望用三個小時把一個老師對Google的認知由零推至『運用於學與教』,實際的成效我很懷疑,但反面的例子,例如覺得太快、不明白,跟不到,課程設計太緊迫,應該改為九個小時的課程...等等的評語,我都在評估問卷中見過不少,也曾經被這些字句打沉過。不竟Yahoo早在十多年前,已經開始發展香港的市場,先入為主,壟斷的情況就像Microsoft一樣。要引起一般教師的關注,最好的方法是做大型的Seminar,內容只要講成效和結果就好。邀請媒體報導及發新聞稿,使學界大部份老師先從傳媒中對Google獲得一個基本印象,之後有興趣再研究的,相信不難在搜尋器內一按,便會得到很多想知的答案。
我其實不明白這是否Google的作風,搞了這麼多次教育研討會,卻不見到一個媒體報導過這件事。老實講,我是蠻喜歡的,就是不會雷聲大,雨點小,一味嘩眾取寵,不過可惜的是,這種宣傳手法往往是最見效的。

4. 先做Google School in HK,再搞 Google Certificated Teachers
要在香港的學界推行任何東西,先要了解現在香港學界最大的挑戰,就是學生人數減少,學校面臨縮班及殺校,學校為求自保及不被淘汰都要爭取各種的殊榮。Google身為全球十大品牌之一,在免費的情況下,相信各校長是不會介意成為Google School的一份仔,但最重要的是,此計劃有透過傳媒讓整個學界也知道Google School in HK是一回甚麼事,而且正所謂物以罕為貴,最好有限額之類。
在我來說,我是很希望Google搞Google Certificated Teachers的,因為我這個Google fan都很想成為其中的一份子。但在整體環境而言,大部份的同行,如非必要,都不想去爭多一個名銜,因為有時間不如去睡多兩個鐘(否則會做到痴線)。加上這此終是虛名,對找工作沒有實質價值,除了一小撮IT愛好者有興趣外,很難推動其他一般老師也參予。但最怕是某校長認為如果全校老師都有這個名銜是對學校名譽有所提升,於是一聲令下要全體老師參予....可怕!可怕!!!這是我最不願見到的情景,所以就算要推,也要從詳計議不能把美國那套直搬過來。

5. Google的Support
要使用Google的products,其實support或網上教學都有很多,但絕大部份不是Google所出的,Official的support,就是『說明』及『Official blogs』,雖然Google Apps也有 Google Apps for Administrator Support,但都要用英文email等兩、三個星期回覆,實在不是香港人的節奏。尤其在開通Google apps 的 Domain ownership及mail exchange record這兩方面,學校的技術人員,其實都是很需要貼身及即時的協助及資詢,我想這方面的支援,很難假手於人,還是Google要自己想想如何爭取到人力資源比較好。

6. 角色界定
短短的半年,眼看教城又開了一個與Google Groups for HK Educators ,一個Google for HK Educators sites及教城的IT-in-Ed網誌。突然由無變有,更是不止一個,度度地方都想要人氣,想要回應,希望搞到共建,但在香港的教育界,從來搞forum或groups都是死路,因為仍未被工作吸乾精力的人,已經寥寥可數。所以我想要把Google for HK Educators的Group搞得像HKBC或HKG達的人氣咁好,是很難。如希望教師能自動自覺把有關使用Google的教案、例子或成果upload 分享就更難,要收集這些content,最可行的方法是舉辦獎勵計劃或Google Certificated Teachers計劃等。誰想增加自家的content就誰去舉辦,說起來也合理。不過在我個人角度看來,這十年來教城的歷史已在教師心目中建立了一定的印象,很難與Google這個品牌比併。再講,其實在用者而言,最不希望有幾個不同平台,個個差不多,不知去邊個好。要參予者能夠分享,放低自己來共建,我想舉辦單位也可好好相議好有關平台及角色定位。
正所謂『瘦田無人耕,耕開有人爭』,上年就只有EDB(ITE)搞Google的workshop及seminar,今年除了Google自己聯合HKEdCity搞,還聽到有出版商、傳媒都想搞與Google Products有關的項目,雖然我也高興大家對這個題目覺得有趣,但也是有所擔心,最怕是Google甚麼也應承,變得商業化,雖然我知道Google本身就是一間商業公司.....



6 回應:

生化人 said...
我正在想及有關教城於Technology的整體方向及發展, 細閱文中內容,亦知道應用Google的路仍是漫長,但作為提升整體教師資訊科技應用及能力,是十分重要。雖然,教城在這半年多,在新的管理下,不斷的努力,但在應用及發展的人力及資源,是難以和ITE 或Google 相比的;但重要的是,我們在資訊科技教學應用上,願意成為一個響導,將這些有效的應用推介至各教師。
10/12/08 10:36 AM

Marie said...
其實近年教城的進步和改進的確是很令人鼓舞的,不過錯是錯在教城這十年的歷史遺留下來的陰影,阻礙了教育界同工的視線。不過無論如何,教城在教育界的角色是無可取替的,其中一個成功的因素,就是它擁有了『學校概覽』和九成全港學校、學生的登記戶口和資料。
10/12/08 10:30 PM

Chris Chan said...
其實最大問題係咪可以同教統局既其他system 統合到,好似 果 d 學生評估咁,可能硬性規定要 submit 去某個 system ,用 google app email account or google doc 係唔得既,咁已經令到老師要 maintain 兩套 system ,學生亦都要分開兩邊咁 check 野

其實 google app education 有無彈性可以寫到插件去令到佢可以同其他 system 互通,如果可以的話,對香港既教育界幫助會比提供一個 7G 既 email 了
10/13/08 7:15 PM

生化人 said...
其實這也是可能的,大家可到she.com一看,他們的e-mail已轉換為gmail。若能使學生及教師應用相關email,配合Google Apps等應用,這也是十分好的配合。我們雖然知道改革之路仍是漫長,但那怕用盡下一個十年的時間,再把名聲建立,因為有我們、你們及他們的互相合作,一定會做得更好。創業難,守業更難,在故有觀念下重新振作也許更難,但我深信我們必能做到。共勉之!
10/14/08 5:13 AM

方潤 said...
教育城本來就是政府成立的,當然可以在學校推開來。

要推廣新東西,沒有政府強力推行,當然不可能很快做得到。
10/15/08 9:06 AM

Captain said...
我想要在學界推google,關鍵並非在於開多少埸seminar/workshop的問題,因為唔sustainable。要快速推行,不如行舊路,像當年全民學習BIT, IIT, UIT時代。當年IT在學界是一件新事物,現在的WEB 2.0何嘗不是? IT發展一日千里,老師的IT知識已經outdated,現在每天都有新application推出,要老師追application是不可能。我們現在要改變的是老師的mindset。試問一個舊思維如何可以應付新世代的學習需要呢?   
10/20/08 10:04 AM

2008年11月7日 星期五

Accumulator (I kill you later)

投資者分享閣: 石SIR教用ACCUMULATOR
ACCUMULATOR是甚麼? 其實是衍生工具(賭博工具)的產品。有人持有大量貨,怕市急跌,想沽,但又怕沽後股價仍升,於是就用這方式找人接火棒。
Decumulator (秋田農莊)
運 作 跟 Accumulator 相 反

近 期 大 市 轉 弱 , 很 多 Accumulator 主 要 掛 鈎 股 份 相 繼 失 守 重 要 支 持 位 , 不 少 投 資 者 接 收 股 票 實 貨 後 即 在 市 場 上 沽 售 , 令 大 市 更 添 沽 壓 。

Decumulator 與 Accumulator 同 樣 是 透 過 運 用 期 權 獲 利 , 不 過 兩 者 期 權 結 構 相 反 , 所 以 玩 法 剛 好 倒 轉 。

Decumulator 是 在 行 使 價 水 平 ( 溢 價 位 置 ) 買 入 設 有 終 止 條 件 的 價 內 認 沽 期 權 及 沽 出 價 外 認 購 期 權 , 前 者 令 投 資 者 可 以 溢 價 定 期 定 額 沽 售 正 股 , 當 正 股 價 觸 及 終 止 條 款 , 產 品 即 告 完 結 。

程式設計師的格言 | Tsung's Blog

程式設計師的格言 | Tsung's Blog
1. 每天有24小時。
所謂的「今天之內」,是指到明天早上為止。
2. 程式不會照自己所想的跑。只會照所寫的跑。
3. 需求規格在程式寫完後才會敲定。
基本規格要客戶看到成品後才會決定。
詳細規格要使用者用過後才會確定。
4. 我對軟體設計的方式導出的結論,有兩種方式。
一是把軟體設計得單純到很明顯不會有缺陷,
不然就是把軟體設計得複雜到沒有明顯的缺陷。
- C.A.R.Hoare
5. 程式碼不要在開發現場寫! 去客戶那寫!
除錯不要在期限前做! 上線後再做!
6. 畫面是藍色的!
(國際太空站太空人重新安裝 Windows NT,日誌中的名句)
7. 先說「沒辦法」的人贏。
8. 有意見的話你寫
9. 要殺一個程式設計師不需要刀,改三次規格就好
10. 首先要先懷疑別人,被懷疑的人或許會把問題解決掉。
(註:通常會「先懷疑自己」)
11. 開發沒有終點。只有釋出(release)。
12. 無論規格多晚才能確定,結案期限永遠不會變。
這是所謂的「期限守恆定理」。
13. 客戶總是覺得水跟追加需求是不用錢的。
14. 付錢愈計較的客人愈囉唆。
15. 在排定開發行程時,總是視而不見一些連小學生都會的算數。
業務部門總是一堆不知道1+1=2的人。
16. 一個人掛了大家都掛了。
17. bug過了一晚可能就變成規格了。
18. 好的規格找一個天才不如找三個凡人。
爛的規格找一百個凡人不如找一個天才。
19. 客製軟體中30%的價格用在確認規格上。
30%用在修改規格上。
30%用在找bug。
結果初期規格反映在價格上占的比例只有10%。
20. 對客戶來說SE是部下,程式設計師是家畜。
對SE來說客人是錢,對程式設計師來說顧客是看不見的病毒。
除了弄完程式以外,沒有其他驅除的辦法。
21. 顧客想受SE喜歡,要自己了解到系統開發需要時間與金錢,早點確定規格。
SE想受顧客喜歡,則要讓程式設計師討厭自己。
22. 很多SE跟程式設計師都暗自想著有錢有閒的話什麼系統都想自己動手做,
不過都沒這種機會。
23. 品質的劣化程度依規格改變的次數與規模而定。
24. 業務是認為空想能夠實現的夢想家。
SE則是深信任何障礙都能突破的冒險家。
程式設計師則是被夢想家和冒險家拋到漆黑海裡的漂流者。
25. 有才能的程式設計師第一次看到設計細節時,要先理解程式的目的。
接下來要設法讓SE了解到以指定的方法、工時並無法完成這個工作。
26. 程式是運氣與直覺堆砌而成的奇蹟。
若不具備這兩者,不可能以這樣的工時實現這樣的規格。
修改規格是對奇蹟吐槽的褻瀆行為。
而追加修改則是相信奇蹟還會重現的無謀行動。
27. 程式設計師聽了「把自己當作顧客去著想!」而開始思考。
啊,像夢一樣。
28. 對於因為興趣而寫程式的人來說,所謂的技術是程式語言能力。
對於因為工作而寫程式的人來說,所謂的技術是邏輯思考能力與人際溝通能力。
程式語言可以看著手冊溝通,客戶不行。
29. 程式系統在交貨之前會不斷縮小。
先用元件定義取悅老闆。
再拿經費概算要部長妥協現實的方案。
在運用會議中,課長會嘗識減少自己責任範圍。
在細節會議中,負責人會把範圍縮到自己記得的部分。
30. SE需要持久力,程式設計師需要爆發力。
31. 準時離開公司,工作會變多。
32. 完美的程式需要完美的時間與金錢。
聽說揮霍著美國的國家預算的NASA,也覺得時間跟錢不夠。
33. 詳細設計要在程式碼的註解裡做完。
註解是唯一的自衛手段,至少要讓自己看懂。
34. 還有時間看程式碼的話就執行他。
CPU跑得比腦細胞快。至少這時候可以休息。
35. 程式的異常該稱為「bug」還是「規格上的限制」是看期限還剩多久決定的。
36. 所謂便服日,好像社會上把他叫做假日
(註) 日本有些公司會有所謂便服日(不用穿西裝的日子),通常是星期五,但…
37. 地獄持續一段時間後,充滿殺氣的怒吼會變多。
再持續一段時間,說話會變少但牢騷會變多,壟罩在凝重的氣氛裡。
再持續下去,反而會海闊天空,四周洋溢充滿活力的聲音。
這種狀態稱為「Programmer’s High」,也是倒下來的人開始出現的時候。
38. 遠處的火災一定燒到這裡。
39. 禱告,然後 “工作” 吧。(修道院的標語)
40. 程式不是用腦記的,要用身體記住。
41. 明天能放假的話死了也罷。
42. 外面有下雨耶,昨天開始下的嗎?
43. 心若不廢掉(消極),身體會廢掉。
若不讓自己殘忍,自己會被殺。
44. 客戶會說謊,業務會作夢,SE會做白日夢。
程式設計師則惦惦。(愈來愈自言自語)
45. SE總是不講理的(unreasonable)說「沒有辦不到(impossible)」,
業務總是沒辦法(impossible)說「沒道理(unreasonable)」。
46. 規格書就像航海圖,客戶則是洋流。洋流陰晴不定,航海圖就變垃圾。
程式設計師必須在沒有航海圖的海上憑自己的力量找到大陸。
47. 再嘮嘮叨叨下去也是要付錢的。
48. 多想個10秒鐘,你可以不說「嗯,這個做得到」。
49. 人是無法從別人失敗記取教訓的動物。
砍成本、改規格、加需求、趕上線,從來沒有人從眾多失敗中記取教訓。
50. 老手用來提振精神的魔法格言:
「不過比起以前來說算是…」
新人用來提起幹勁的魔法格言:
「把這件工作做完的話…」他們還不知道工作是沒有終點的。
51. 所謂交案期限,是指開發現場從公司換到客戶那裡的日子。
52. 程式、SE、經理不是職種。是職責。
53. 業務是最難搞的客戶。
54. 能夠迅速想到解法的程式設計師太多了。
他們能用一分鐘想到方法,用一天去寫程式。
不需要花一小時想到解法,再用一小時去寫程式。
- Jon Bentley
55. 漂亮的規格,可以從沒有bug出現看出來。
明明爛的就是設計,為什麼是這樣…
56. 上線後的除錯才叫做bug。
57. 追加需求確定後交貨期限就無法確定,
交貨期限確定後追加需求就無法確定。
這稱為「追加需求與交貨期限的測不準原理」。
58. 除三個錯就會冒出一個錯。
這稱為bug的無窮迴圈。
59. 不祥的預感總會實現。
不過程式設計師不會去煩惱不祥的預感,那是SE的工作。
60. 要解決地獄的辦法,就是客戶把錢交出來。
61. 不懂電腦的操作者是發現bug的天才。而且無法重現。
62. 每次開會就更改規格的客戶,
他的操作手冊要等到操作寫好的程式後才能寫出來。
63. 搞不懂的時候,Currency(長整數)比Interger(整數)好用。
Variant(字串、數字都能存的萬能變數)又比Currency(長整數)好用。
安全第一。
(VB程式設計師如是說)
64. 啊,那是微軟的規格。
65. 程式設計師所不滿的規格也一定會讓客戶不滿。
(這是說程式設計師覺得難寫的地方常常是SE溝通有落差)
66. 程式設計師需要的技能,
包括交涉、時程管理、業務分析、提案、設計、程式語言、架構、維護、使用。
SE需要的技能則減掉程式語言、架構、維護與使用。
專案經理需要的能力則再減掉業務分析、提案與設計。
業務需要的能力再扣掉時程管理。
67. 正因為健康,才能做不健康的事。
68. (這個不是 bug 嗎?)
規、規格、是規格啦。不過有一點跟規格不太一樣啦。
69. 那是你說的規格。
70. 開發室沒有窗戶,那是因為以前…
71. 即使爛了也是規格。
72. SE: 真沒辦法。
PG: 也沒註解。
(碰到不知道是誰寫的程式,大家都束手無策的狀態)
73. 為什麼你不能兩三下解決掉他啦。
因為之前兩三下搞定的東西也被你兩三下就否定了。
74. 不會動的bug就只是普通的bug。(會動的bug則能視為規格)
75. 今天好好清理bug,bug應該死光了吧。
咦?Windows也死了唷。
76. 客戶不會去想最壞的情況。要他面對最壞的情況,他會認為是漫天開價。
SE則會顧慮最壞的情況,準備應付最壞的情況。
程式設計師比誰都早預料到最壞的情況,而無視最壞的情況。
77. 唯一不產生bug的方法,就是不寫程式。
第二好的方法,就是在時程跟人員確定之後的每次改規格,都重新檢視過整個專案。
78. 共同責任是程式設計師的責任。
管理職?那是啥?好吃嗎?我沒吃過耶。
79. 如果可以改行的話,想找個準時下班不叫「逃跑」的工作。
80. 對職業程式設計師來說,漂亮的程式是單純而自然的邏輯、簡單而基本的指令、豐富的註解,
也就是新手程式設計師也能馬上動手改的程式。
而要寫出這樣的程式,需要單純、簡單、美麗的規格。
但可惜客人總是喜歡搞很複雜。
81. 設計者應該是不該要求製作者製作出超過設計以上內容的吧…
82. 無論是做的比規格書裡的多,還是只照規格書裡的寫,SE都會找程式設計師的碴。
所以程式設計師只做規格書裡的寫的內容。
83. SE對程式設計師說的「常識」每三小時變一次。
84. 自己看規格書。不能跑的是規格。
85. 「沒辦法」是要看把一天當多少小時來算。
一天常常指的是3人日,一個月常常是指4.5人月喔。
86. 工時要減掉一半的單體測試與一半的系統測試,
而交貨期則要另外加上上線後的兩個月。
87. 能拿到錢的規格變更稱為「受理項目」,
拿不到錢的規格變更則稱為「SE的規格確認失誤」。
程式設計師是這麼看的。
88. 累了。我想睡了。可以回家嗎。
(累了吧,我也累了。好累喔怎麼了。反正就是規格啦,管他的)
89. 試圖降低成本的話,為了配合預算,品質會下降,不過漫天開價做出來的品質也不見得好到哪裡去。
90. REDO到底該怎麼唸一直搞不懂。是利斗嗎、李度嗎、R E D O嗎,難道是 red 零 嗎? 拜託加上注音吧。
(譯註:我比較煩惱 Linux)
91. 有人在程式碼註解裡寫日記。像「今天是雨天…」,「想回家…」之類的。甚至還有「修改日: 2003/10/10 不能同意你更多」這種註解出現。說到這個,好像也看過「吃大便」這樣的註解。
92. 小學生時第一次看到電腦
國中時第一次學會怎麼用
高中與大學學會程式語言
出社會後才發現自己走錯路
93. 「不要讓老闆當業務比較好」
94. 說來說去,要去研究根本不知道為什麼會動的東西為什麼不會動了,找拿破崙來也沒搞頭。

ex 系列

1. 就算程式裡沒bug,編譯器會有bug。
就算編譯器沒bug,OS會有bug。
就算一切都沒bug,客戶會決定什麼是bug。
2. 規格與規格書是不同的東西。
3. 比期限更重要的是靈感與睡眠。
4. 比知識與經驗重要的是手冊與時間。
5. 能動就好了,能動的話…
6. 過了三天就是別人寫的程式碼。
7. (大搜查線系列)
規格變動不是在會議室裡發生的!是在現場發生的!
8. (大搜查線系列)
異常不是在模擬測試時發生的!是上線後才會發生的!
9. 漂亮的設計三天或許就膩了
骯髒的設計三天就習慣了
10. bug與規格是一體兩面
11. 電腦裡沒有bug,bug常在人心。
12. 無論怎麼檢查,不管怎麼確認,上線前一晚就是睡不著。(RFC968)
13. 估價需要1%的經驗與99%的直覺
14. 沒有什麼事情比直接讓找不到任何bug的程式直接上線還要可怕的了。
15.
* 『程式設計師』=能將SE條理不通的說明翻譯成程式碼的高手
* 『SE』=與客戶討論改寫規格書、與程式設計師討論後再改寫規格書,程式出貨後還要繼續改寫規格書的人
* 『PM』=每天修改自己定下的行程表的人
* 『業界老鳥』=臉色蒼白缺乏表情的人
* 『外包』=幫不會寫程式的正職員工寫程式的人
* 『coding』=複製貼上的工作
* 『單體測試』=指開始寫程式
* 『除錯』=把程式碼註解掉的工作
* 『新同事』=在火燒屁股的專案火上加油的人
* 『出貨日』=把只完成一半的系統上線的日子
* 『末班電車』=業界平均的下班時間
* 『颱風假』=一年一度可以準時下班的業界假日
16. 當誰寫的程式碼跑出bug時,那個人大概都不在了(墨菲定理?)
17. 最終手段
「重開機」
意外的常常都很有效
18. 最強藉口
以前「那是硬體的極限」
現在「那是Windows的規格」
19. 「程式碼的可信度,不會比寫的人還可信。」

Interesting Maths Wiki items

Proof that 22/7 exceeds π - Wikipedia, the free encyclopedia
Proof that 22/7 exceeds π
Proof that π is irrational - Wikipedia, the free encyclopedia
Proof that π is irrational
Proof by exhaustion - Wikipedia, the free encyclopedia
Proof by exhaustion, also known as proof by cases, perfect induction, or the brute force method, is a method of mathematical proof in which the statement to be proved is split into a finite number of cases, and each case is proved separately. A proof by exhaustion contains two stages:
Tetration - Wikipedia, the free encyclopedia
In mathematics, tetration (also known as hyper-4) is an iterated exponential, the first hyper operator after exponentiation

Human Development Trends

Gapminder - Human Development Trends, 2005
Human Development Trends, 2005

http://www.gapminder.org/fullscreen.php?file=GapminderMedia/GapTools/HDT05L/application.swf