聚會時間公告: 11月份聚會為11月15號星期六下午兩點在MocaMona / 講者:shawn Topic: Hello BIOS: EFI, an opensource firmware framework

十月 22, 2008
» MySQL Master-Master Replication Manager(完) - 問答

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

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

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

» MySQL Master-Master Replication Manager(2) - 環境建置、架設

前一篇 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 過來.

相關網頁

十月 20, 2008
» MySQL Master-Master Replication Manager(1) - 簡介

什麼是 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 的更多介紹、說明

七月 20, 2008
» 好文: Web Analytics 2.0

Web Analytics 2.0 是蠻不錯的觀念, 雖然看到這篇文章時, 已經過快一年了... Orz.

雖然說是去年的文章, 但是目前看來都還是走 Web Analytics 1.0 的方式, 2.0 的方式, 還不知道該怎麼起步, 先當作參考就是.

光看圖差異, 在 1.0 時都看 User click 來做猜測, 猜測 User 的使用行為. 而 2.0 時, 是靠 測試 / 傾聽顧客的聲音, 來做其他加強及改進. (感覺上, 一般公司都是從 2.0 往 1.0 邁進. XD), 詳細還是看下面的文章比較清楚.

Web Analytics 2.0 的 文章介紹:

三月 17, 2008
» 要使用 HTML link 來安裝 Debian/Ubuntu Package 如何寫

常常寫到要 apt-get install screen 等, 但是如果直接變成 link, 一點下去就可以直接安裝, 或許是個更快的方法. (apt-get install screen, 然後把 screen 變 link, 點選就會安裝 screen 的 package).

如果要寫上述的方式, 就會寫成如下:

  • apt-get install <a href=”apt:screen”>screen</a>
  • href 裡面寫的是 apt: package name 即可.

完成範例: apt-get install screen (點選 screen 就會跳出來問說是否要安裝, 若已經安裝, 則會通知已安裝過)

其它相關網頁

三月 12, 2008
» Javascript 的 Database: Taffy DB

Javascript 的 Database 是 一個很酷的 Idea, 但是, 好像又有點怪怪的.....

DB 的空間只有 10K, 這跟直接存在 Cookie 或存成 JS Array 比起來, 似乎沒有比較方便.

不過, 提供的 DB 處理倒是可以省掉不少工(ex: Find / Update / Insert / Remove / OrderBy ... 等). 先記起來, 之後再研究如何應用它~ :)

Javascript Database: Taffy DB : A JavaScript database for your browser

此 Taffy DB Library 的功能/限制

  • Under 10K!
  • Simple, JavaScript Centric Syntax
  • Fast
  • Easy to include in any web application
  • Compatible with major Ajax libraries: YUI, JQuery, Dojo, Prototype, EXT, etc
  • CRUD Interface (Create, Read, Update, Delete)
  • Sorting
  • Looping
  • Advanced Queries

Taffy DB 的 CRUD

  • Insert: friends.insert({name:"Brian", gender:"M", married:"No", age:52, state:"FL", favorite_foods:["fruit","steak"]});
  • Select: friends.find({state:["WA","MT","ID"], age:{less:50}}, [0,2]);
  • Update: friends.update({state:"CA", married:"Yes"}, {name:"Joyce"});
  • Delete: friends.remove({name:"Brian"});
  • OrderBy: friends.orderBy(["age", {"name":"asce"}]);
  • 詳細用法可見: Getting Started: Your first bite of Taffy

其它相關網頁

三月 7, 2008
» IE8 的 相容Quirks模式 Meta Tag(X-UA-Compatible)

Microsoft 推出了 Internet Explorer 8 Beta 1, 裡面有一個非常大的改變: 微軟:IE8 預設模式將支援網路標準, 節錄裡面幾點:

  1. 微軟宣布,IE8一推出時,就會以標準相容模式(standards compatibility mode)作為預設的成像引擎(rendering engine)。微軟先前已表示,新版瀏覽器可以通過Acid2 rendering測試。
  2. 就IE8而言,微軟計劃提供三種rendering模式:新的標準相容(standards-compliant)模式、IE7成像引擎、以及一個展示舊型網站的選項。因為新版瀏覽器改變了預設環境,若網站希望IE8沿用IE7的引擎,就必須在各自的網站編碼中加入一個標籤(tag)。

所以 IE8 的預設模式會如下(取自: IEBlog: The Default Layout Mode):

Acid2

依這篇文章 Internet Explorer 8 and Acid2: A Milestone 寫說 IE8 已經能正確將 Acid2 Face 畫出來, 關於 Acid2 可見下面連結:

X-UA-Compatible 參數

基本上 IE8 預設模式直接支援標準是很好, 但是另外一個問題是, 有數不清的 RD 要熬夜了... XD

幸好 M$ 也有提供快速解法(就是說, 來不及改的, 就先把下面 META Tag 塞進去, 畫面應該就不會大爆炸), 取自 Windows Internet Explorer 8 Beta 1 for Developers: Technology Overview(Developer whitepaper), 下載此 Developer whitepaper 的 doc 檔, 裡面有說明 META 的 X-UA-Compatible 可以設定讓 IE8 採用舊的模式, 模式/參數目前有以下幾種:

  • IE=5: "Quirks" mode
  • IE=7: "Standards" mode
  • IE=8: Internet Explorer 8 Standards mode
  • IE=edge: Uses latest standards that Internet Explorer 8 and any future versions of the browser support. Not recommended for production sites.

範例 (記得 META Tag 要擺在 <header></header> 中)

  • <meta http-equiv="X-UA-Compatible" content="IE=8" >
  • <meta http-equiv="X-UA-Compatible" content="IE=7" >
  • 我猜有不少網頁都要用此 <meta http-equiv="X-UA-Compatible" content="IE=5" > 模式, 如果是用這種 Quirks 模式的, 盡量找個時間<strike>重寫</strike>重新設計規劃吧~~ XD

其它相關網頁

二月 26, 2008
» 在網頁嵌入 MSN/GTalk/Y! Messenger/Gabbly 即時聊天模組

要在 Blog 或 網頁上即時與使用者互動, 最快的大概就是放個聊天室.

看到 Google 也把 Gtalk 的即時聊天的嵌入程式 擺出來, 順便把其它的一起整理出來, 挑平常喜歡的用吧~ :)

下面整理出來的有 M$ 的 MSN, Google - Gtalk, Yahoo! - Y! Messenger, Gabbly Chat 

二月 21, 2008
» Amazon S3 使用和操作(s3cmd/PHP class)

Amazon S3 是付費的網路磁碟服務, 而且可以透過 Web 直接將檔案拉下來, 沒有最低消費, 用多少收多少, 單純做備份, 收費算是蠻便宜的, 有興趣可以用 Amazon Web Services Simple Monthly Calculator 算算看(我算自己的資料備份, 一個月下來應該不用 $100 台幣).

方便操作 Amazon S3 的工具

  • S3Fox Organizer for Amazon (S3Fox) - Firefox addones 但是用這個要注意, 特別是有目錄在 List 時, 等於是有多少檔案, 會查詢多少次, 但是可用於驗證檔案是否有丟上去等等.
  • s3cmd - Python 寫的 Amazon S3 client, 詳細介紹可見: s3cmd (Amazon S3 CLI)
  • php-aws - Google Code - PHP 存取 Amazon S3 的 class, 可以輕鬆寫存取程式. (要抓取程式: svn checkout http://php-aws.googlecode.com/svn/trunk/)

s3cmd 的使用:

  1. 申請完 Amazon S3 帳號後會拿到兩組 key,一組是 access_key,一組是 secret_key
  2. $ s3cmd --configure 設定 access_key 和 secret_key
  3. $ s3cmd mb s3://BUCKET_NAME (Create Bucket)
  4. $ s3cmd put /PATH/FILENAME s3://BUCKET_NAME/FILENAME (將檔案上傳到 Bucket 內)
  5. $ s3cmd del  s3://BUCKET_NAME/FILENAME (刪除檔案)

要讓人可以下載, 使用 -P 的參數

  1. $ s3cmd put -P /PATH/FILENAME s3://BUCKET_NAME/FILENAME # 可公開下載
  2. 下載處會在: http://s3.amazonaws.com/BUCKET_NAME/FILENAME 或 http://BUCKET_NAME.s3.amazonaws.com/FILENAME

使用 php-aws 寫的簡易 Script

  1. 程式詳見: push-to-s3.phps
  2. class.s3.php 取自 svn checkout http://php-aws.googlecode.com/svn/trunk/
  3. 修改此檔案中的 define 參數, 就可以 push-to-s3.php abc.tgz 操作(再簡易修改即可於網頁上傳資料時, 順便多傳一份去備份或取用)
  4. 何謂 Bucket 和 Object, 意思就是這樣: http://s3.amazonaws.com/$bucket/$object

關於 Amazon S3 的其它應用

  1. Building a Small Business Backup System Using Amazon S3
  2. 設定 media.DOMAIN_NAME CNAME 成 media.DOMAIN_NAME.s3.amazonaws.com, 就可以 media.DOMAIN_NAME/FILENAME 直接存取, 詳細可見: Scalable Media Hosting with Amazon S3
  3. (這是拿Amazon S3 當自己的 Web server 來存取使用, 當然 資料傳輸費的錢還也是要付的)

其它相關網頁

二月 13, 2008
» CSS 改變選取文字的顏色(CSS3 - 目前 Firefox/Safari only)

選取文字的顏色, 想要做修改, CSS3 有規範修改的方法.

下述範例轉載自: Overriding The Default Text Selection Color With CSS

語法:

::selection {
    background: #ffb7b7; /* Safari */
}
::-moz-selection {
    background: #ffb7b7; /* Firefox */
}

Example:

p.red::selection {
    background: #ffb7b7;
}
p.red::-moz-selection {
    background: #ffb7b7;
}

這種設定可以玩什麼, 可見: Text + Image + CSS3 = Crazy Delicious (此網站和上述語法在 IE 無法顯示效果)

一月 24, 2008
» GIMP 的圖片影像智慧型縮圖

通常如果要做縮圖, 不等比例縮小就會很糟糕, 但是如果我只要縮此圖片的高度, 或此圖片的寬度, 其它的要維持不變, 要怎麼做?

之前看到一個很神奇的演算法(Seam carving), 可以移除圖片中不重要的區域, 讓圖片縮小, 又不會影響到比例~ 有興趣可以看:

看完這個後很心動, 很想拿來"用" (註: 不是"實作", 我應該還沒那麼振作.. XD).

現在才知道 Gimp 有 Plugin 實做 Seam Craving 的演算法: Liquid Rescale, 詳細可見此篇文章: GIMP 的智慧型影像尺寸調整功能.(感謝 蔡志浩老師 的 詳細圖文解說)

其它相關網頁

一月 16, 2008
» 好文: DVD +R -R 的差異

以前對燒錄片還算蠻熟的, 但是到 DVD 的時代, 完全跟它脫節了~

下面的解說很多, 相信很多人一定只想知道, 到底要買 +R 還是 -R, 不用知道原理的, 所以先直接說結論:

照文章說明的, 染料 和 反射層 相同的話, 買 DVD +R 就對了~ (文章說 -R 比較便宜, 但是我去買時, 價位都一樣哩~)

買 DVDR 都會看到 +R -R, 但是到底要買哪種, 通常就是買一片回去燒燒看, 不挑片就是好.

不想這麼盲目的話, 這篇文章有詳細的解說: [教學] +R和 -R 最大的差異

想知道差別的再繼續往下讀吧~ 下面摘錄此文章的幾個重點:

  • +R採用頻率較高的wobble(引導軌是會搖擺or抖動的,這抖動就叫wobble) 817,4kHz,其定址是利用在預刻凹軌處,wobble的相位調變來達成,此方式的訊號辨識率比-R來的好,且製造過程的金屬模板較-R來的不複雜(引導軌圖形)。符合了+R聯盟講的,易高倍寫,易生產製造…等。
  • -R wobble頻率為140,6kHz,定址是直接在凸軌處預刻定址訊坑,此種addressing方式,訊號辨識度較差,當倍速一拉高時,會有定址不易的情形!故-R要高倍燒錄困難度較高!
  • 保存性無關+-R,其決定關鍵是染料 - 這個是不管 CD/DVD 都一樣, 染料和 CD 本身的品質才是重點.

一月 14, 2008
» 修正 CSS 對於 float 區塊, 使用 clear:both 無效的解法

CSS 的 float 使用起來蠻方便的, 但是使用完後, 那塊空間就等於是消失, 所以需在下面加 clear:left / clear:right / clear:both (我通常都直接 clear:both 就是了~), 但是有時後會遇到寫 clear:both, 但是沒有任何作用的狀況.

這篇文章也是早就想寫, 正好看到 修正因為 float 導致區塊無法撐開的問題 這篇, 該說明的都說很齊全, 所以直接來寫寫結論就好了~~ :P

我現在 CSS 都會規畫一個 "/* common */" 的區塊, 那邊就會定義一些共用的 class, 和 clear 相關的就是下述:

.clear {zoom:1; clear:both;}
.clear:after {content:''; display:block; clear:both; visibility:hidden; height:0;}

主要就是這兩段, 遇到 float 完後, 要清除的地方, 寫個 <p class="clear"></p> 就可以了~ :P

不過, 上述的第一段 ".clear {}" 這段, 有些人是不用加的, 或者只有寫 ".clear{zoom:1;}" 而已, 但是我使用起來就是有些問題, 所以還是把 "clear:both;" 都加上去.(跟下述的寫法有些不同的地方, 我現在也解釋不出來, 總之先都記著, 遇到或許就知道了.. XD)

想知道為何要寫那麼多東西, 請參照下述兩篇:

直接摘取他們的結論, 就是加 clearfix 的 class 即可, 跟我上面目前用的有點不同, 但是差異我現在還不清楚, 要再測試看看, 他們的寫法應該周全很多:

.clearfix:after {
    content: ".";
    display: block;
    height: 0;
    clear: both;
    visibility: hidden;
}

.clearfix {display: inline-block;}

/* Hides from IE-mac \*/
* html .clearfix {height: 1%;}
.clearfix {display: block;}
/* End hide from IE-mac */

其它相關網頁

一月 10, 2008
» Facebook Develop 第二步: 填寫 Application 設定

Facebook 加入 Developer 第一步 之後, 來寫寫 Facebook Apps 吧~

先到 Facebook | Developers, 然後 點選 右上角的 Set Up New Application, 再來就是填表囉~ 

下述只列出特別要填寫的(採用 FBML, 拉外部網頁的方式), 其它都先依 預設值 即可:

  1. Application Name: 你的 Application 要叫什麼名字
  2. Check here to indicate that you have read and agree to the terms of the Facebook Platform.: TOS, 勾就對了.. XD
  3. Callback Url: 你的程式放的路徑, 只能列到目錄為止, ex: http://domain/test/ , 不能填 http://domain/test/index.php.
  4. Canvas Page URL: Facebook 在 Apps 要叫什麼名字, 之後可以 http://apps.facebook.com/YOUR APP NAME/ 連到.
  5. Can your application be added on Facebook?: 要選 Yes, 不然沒辦法把 Application 加到 facebook 的個人頁面去.(選 Yes 後, 下面又會多列很多選項可以選)

下面的選項是 Can your application be added on Facebook? 選 Yes 後才會有的(Installation Options):

  • Who can add your application to their Facebook account?: Users 勾起來, 並選取 All Pages

若還在開發階段, 不想讓其它人看到:

  • Developer Mode: 勾選
  • Private Installation: 勾選

再來 Save 即可完成.

其它選項:

  • (Integration Points) Side Nav URL: 你想要把 Application 哪頁列在左邊 Nav 欄, 填寫 http://apps.facebook.com/YOUR APP NAME/ 即可.

之後如果要再修改這些, 就照如下:

  1. Facebook | Developers
  2. Set Up New Application 下面有 My Applications, My Applications 下面有 See My Apps, 選 See My Apps
  3. 找到要修改的 Application name, 點 Edit Settings 即可.

PS: 若不使用拉外部網頁的方式, Callback Url 那些可以不用填寫, 直接試 下面的一些 Define FBML 等的設定值 就可以看到簡單的 Hello World 版本囉~

PS: 若完成後, 要 Submit Application 去給大家使用, 要先找五個人加入使用, 才能 Submit .. 

 

一月 9, 2008
» 自動幫 Javascript / CSS 檔加上版本編號

上個星期才解決這個自動加版本編號的問題, 結果今天就看到一篇寫這類的文章, 真心痛, 這篇文章出來的太晚了.. :~~

推薦好文: Automatically Version Your CSS and JavaScript Files

通常要讓網站速度加快, 有其中一個就是為 static file(css, js, 或 image .. 等) 打上很長的過期時間(ex: 10年), 然後只要不按 Ctrl + F5, 那這些檔案瀏覽器是不需要重新再下載一次的, 這樣子 Server 自然省頻寬, Client 瀏覽的速度也會快很多.

我的做法是下述三種:(也算是過程吧, 從 1 -> 2 -> 3)

  1. filename + svn version (用 Apache mod_rewrite 指到 filename)
  2. filename.css 壓縮後, filename + svn version 變成 filename-123.css
  3. filename.css 壓縮後, filename_min + ?v=svn version 變成 filename_min.css?v=123

第一種方法 就跟那篇文章寫的差不多, 基本上就是現在的檔案, 然後前端直接拉 svn version 產生 filename-123.css, 然後不管 filename-***.css, 一律都是 rewrite 到 filename.css, 但是缺點是, 這檔案沒有經過壓縮, 比較耗頻寬.

第二種方法 的缺點是, 如果我 push 完後, 別人是點選 Search engine 的 Cache 功能, 那就會抓到舊的 filename-123.css, 但是這個檔案, 我通常是壓縮完另外產生的, 所以並不在 svn 裡面, 因此只要有新版的 push, 那這個檔案就消失了, 自然就抓不到此 css.

最後採取的是第三種做法, 就是把 filename.css 先壓縮後產生 filename_min.css, 然後前端去噴 ?v=svn version, 這樣子使用 Search engine Cache 進來, 一樣可以拉到 filename_min.css(只是 ?v= 後面參數不一樣), 後面的參數不同, 瀏覽器就會認為是一個新的檔案, 就會重新抓取, 這樣子自然就把前面的所有狀況都處理掉囉~

結論就是, 這個要做自動化還真麻煩, 基本上那篇文章早點寫出來, 就可以省掉不少時間~(不管是哪種方法, 基本要寫的東西都差不多, 只是 呈現 與 操作 上的不同罷了) .. XD

十二月 18, 2007

Tsung's Blog
Tsung
Tsung's Blog is about »