2012年12月4日 星期二

[CSS] CSS 選擇器

筆記起來...
ref: http://www.w3.org/TR/CSS2/selector.html




PatternMeaningDescribed in section
*Matches any element.Universal selector
EMatches any E element (i.e., an element of type E).Type selectors
E FMatches any F element that is a descendant of an E element.Descendant selectors
E > FMatches any F element that is a child of an element E.Child selectors
E:first-childMatches element E when E is the first child of its parent. The :first-child pseudo-class
E:link
E:visited
Matches element E if E is the source anchor of a hyperlink of which the target is not yet visited (:link) or already visited (:visited). The link pseudo-classes
E:active
E:hover
E:focus
Matches E during certain user actions. The dynamic pseudo-classes
E:lang(c) Matches element of type E if it is in (human) language c (the document language specifies how language is determined). The :lang() pseudo-class
E + FMatches any F element immediately preceded by a sibling element E.Adjacent selectors
E[foo]Matches any E element with the "foo" attribute set (whatever the value). Attribute selectors
E[foo="warning"]Matches any E element whose "foo" attribute value is exactly equal to "warning". Attribute selectors
E[foo~="warning"]Matches any E element whose "foo" attribute value is a list of space-separated values, one of which is exactly equal to "warning". Attribute selectors
E[lang|="en"]Matches any E element whose "lang" attribute has a hyphen-separated list of values beginning (from the left) with "en". Attribute selectors
DIV.warningLanguage specific. (In HTML, the same as DIV[class~="warning"].) Class selectors
E#myidMatches any E element with ID equal to "myid".ID selectors

[PHP] PHP 型態比較表

筆記起來...
ref: http://php.net/manual/en/function.empty.php


Comparisons of $x with PHP functions
Expression gettype() empty() is_null() isset() boolean : if($x)
$x = ""; string TRUE FALSE TRUE FALSE
$x = null NULL TRUE TRUE FALSE FALSE
var $x; NULL TRUE TRUE FALSE FALSE
$x is undefined NULL TRUE TRUE FALSE FALSE
$x = array(); array TRUE FALSE TRUE FALSE
$x = false; boolean TRUE FALSE TRUE FALSE
$x = true; boolean FALSE FALSE TRUE TRUE
$x = 1; integer FALSE FALSE TRUE TRUE
$x = 42; integer FALSE FALSE TRUE TRUE
$x = 0; integer TRUE FALSE TRUE FALSE
$x = -1; integer FALSE FALSE TRUE TRUE
$x = "1"; string FALSE FALSE TRUE TRUE
$x = "0"; string TRUE FALSE TRUE FALSE
$x = "-1"; string FALSE FALSE TRUE TRUE
$x = "php"; string FALSE FALSE TRUE TRUE
$x = "true"; string FALSE FALSE TRUE TRUE
$x = "false"; string FALSE FALSE TRUE TRUE


Loose comparisons with ==
TRUE FALSE 1 0 -1 "1" "0" "-1" NULL array() "php" ""
TRUE TRUE FALSE TRUE FALSE TRUE TRUE FALSE TRUE FALSE FALSE TRUE FALSE
FALSE FALSE TRUE FALSE TRUE FALSE FALSE TRUE FALSE TRUE TRUE FALSE TRUE
1 TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
0 FALSE TRUE FALSE TRUE FALSE FALSE TRUE FALSE TRUE FALSE TRUE TRUE
-1 TRUE FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
"1" TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
"0" FALSE TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
"-1" TRUE FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
NULL FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE TRUE TRUE FALSE TRUE
array() FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE
"php" TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
"" FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE


Strict comparisons with ===
TRUE FALSE 1 0 -1 "1" "0" "-1" NULL array() "php" ""
TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
1 FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
0 FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
-1 FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
"1" FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
"0" FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
"-1" FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
NULL FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
array() FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE
"php" FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
"" FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE

2012年11月27日 星期二

[伺服器管理] inotify + rsync 完成即時同步資料

inotify 是個強大的檔案監控系統
可以監控所指定目錄下所有檔案變化,包含新增,刪除,修改...等事件

Linux kernel 需要 2.6.13 以才能有支援

故可以利用其機制 + rsync 在發現檔案系統有變化時即執行 rsync 來做同步

rsync 是個好用且強大的同步備份軟體,但可惜的是他在同步時通常是全目錄一起比較後 Diff 把 Diff 部份傳輸,如果檔案很多時,將會消耗許多系統資源。

所以利用 inotily + rsync 來降低其消耗資源,也可以達到即時同步

以下範例將實現將一台 Master 的網頁資料同步至另一台 Slave Server


rsync 遠端同步

將 master 資料(/var/www/myweb) 同步至 slave (/var/www/myweb)
ssh 192.168.1.2
rsync -avz  root@192.168.1.1:/var/www/myweb  /var/www/
(會要求輸入密碼,如不想輸入密碼請建立 ssh-key 並在指令加上 -e "ssh -i [key-path]")

ps一般情況不需即時同步,即可以使用 crontab job 來做定時同止
1 3 * * * /usr/bin/rsync -avz  -e "ssh -i /root/.ssh/priv-key" root@192.168.1.1:/var/www/myweb  /var/www/

上述的 rsync 已經是使用 ssh 登入再做 rsync 可以不用架 server,如果需求上有需要 rsync server 可以參考最後一段。


再來安裝 inotify來做即時監控並同步資料

Master:
1. 安裝 inotify
    a. 請至 https://github.com/rvoicilas/inotify-tools/wiki/ 下載 inotify-tools
    b. 將 inotify-tools-3.14.tar.gz 上傳至 master
    c. tar -zxvf inotify-tools-3.14.tar.gz
    d. cd inotify-tools-3.14
    e. ./configure
    f. make
   g. make install
2. 使用以下指令測試監控目錄 (/var/www/myweb)
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M:%S' --format  '%T %w%f %e' --event modify,create,move,delete /var/www/myweb
(可以使用另個 ssh 登入並在該目錄下新增刪除檔案)

完整 event 可參考

http://linux.die.net/man/7/inotify
http://en.wikipedia.org/wiki/Inotify

3. 建立 script 用於啟動監控並即時同止
    a. vi  inotify-tools.sh

    加入以下內容

#!/bin/sh
src='/var/www/myweb'
dest='/var/www'
host='192.168.1.2'

/usr/local/bin/inotifywait -mrq --timefmt '%Y-%m-%d %H:%M:%S' --format  '%T %w%f %e' \
 --event modify,create,move,delete $src | while read date time file event
    do
        # echo $date $time $file $event
        # cmd="rsync -arq --delete $src $host::backup$dest" old command
        cmd="rsync -avz $src root@$host:$dest"
        # echo $cmd
        $cmd
    done




4. 開機時自動啟動
vi /etc/rc.d/rc.local
在後面加入
/root/inotify-tools.sh &
#請依據您放 inotify-tools.sh 的目錄修改

ps.如果不使用 rsync 亦可以使用 nfs + mount 的方式來處理
僅需將  cmd="rsync -avz $src root@$host:$dest"此行的指令
最後 root@$host:$dest 修改為 mount Slave上來目錄路徑即可




(option) 利用 rsync server 來同步資源 

Slave: (登入 Slave)
1. yum install rsync xinetd

2. vi /etc/xinetd.d/rsync
內容
service rsync
{
disable = no #改為 no
socket_type    = stream
wait                = no
user                = root
server              = /usr/bin/rsync
server_args      = --daemon
log_on_failure  += USERID
}
#並加入以下內容
[backup]   #表示在使用rsync指令時目錄代號 (與 samba 設定相似)
path = /var/www   #表示實際指向的目錄
uid = root
gid = root
hosts allow = 192.168.1.0/24  #充許的存取的 host,請依 ip 需求修改
read only = no

3. service xinetd restart

Master:
此時即可將 master 資料(/var/www/myweb) 同步至 slave (/var/www/myweb)
  rsync -arq --delete /var/www/myweb 192.168.1.2::backup/

ps一般情況不需即時同步,即可以使用 crontab job 來做定時同止

1 3 * * * /usr/bin/rsync -arq --delete /var/www/myweb 192.168.1.2::backup/

2012年11月9日 星期五

[IE10] 快速解決 Windows 8 IE 10 相容性問題



在網頁的 header 加入以下 meta 即可
<meta http-equiv='X-UA-Compatible' content='IE=9' >
or
<meta http-equiv='X-UA-Compatible' content='IE=9; requiresActiveX=true' >

IE=Value 表示 ie 預設使用的文件模式

value=5 表示使用 quick模式
value=7,8,9,10 表示使用對應的標準模式,ex: IE=9 即表示使用 IE 9 標準模式
value=Edge 表示使用該瀏覽器支援的最新版本的文式模式,故 IE 9  會使用 IE 9 模式、IE 10會使用 IE 10 模式

此方僅只是令 IE 10 可以快速的相容您目前系統
但無法完全解決問題,最好方法還是針對 IE 10 做最佳化


Reference : http://www.iefans.net/ie10-ie9-jianrongxing-faq/


另外由於 Windows 8 的 Desktop IE 10 與 Metro IE 10 是不同的兩個 ie
Metro IE 10 本身不支援 Flash 和 ActiveX
所以如果有使用 Flash 和 Active X 在 Metro IE 10 是無法正常瀏覽的
故加上 requiresActiveX=true 來提示使用都需要使用 Desktop IE 10

Reference : http://www.windows7hacker.com/index.php/2012/02/how-to-tell-ie-10-to-switch-from-metro-style-to-desktop-version/


Metro IE 10 Agent
Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)

Desktop IE 10 Agent
32bit : Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)
64bit : Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)

Reference:http://www.codeproject.com/Articles/269356/Internet-Explorer-10-User-Agent-Strings-On-Windows?display=Print



2012年8月18日 星期六

[MAC OS] 快速在 MAC 安裝 notepad++

Wine:
Unix 上執行 windows 程式軟體

Mac 環境需要
Intel x86 的 cpu
x11 (Snow Leopard 以上內建)


1. 安裝 Wine Bottler (已經 wine 包裝在內)
下載 Wine Bottler : http://winebottler.kronenberg.org/

直接點取,將 wine 和 wine bottler 拖至 appliaction



2. 下載 notepad++ zip package
請至官網 http://notepad-plus-plus.org/

unzip notepad++


直接點取 notepad++.exe 會彈出 Wine 視窗
選取 Run directly in .... (我是直接使用 /User/account/Wine Files)



go 即可執行 notepad++


3. 安裝 notepad++ plugin
直接下載將 dll 放進 notepad++ plugin 目錄內
目前安裝了 function list、hex editor 均可使用



ref:
http://www.youtube.com/watch?v=ZeYA3goZwY4
http://wiki.ubuntu-tw.org/index.php?title=Wine
http://www.winehq.org/

2012年8月16日 星期四

[MySQL] MySQL Replication (master slave)

以下實作一個範例為將 Master's Mysql 內的 test 資料庫同步至 Slave's Mysql 內的 test 資料庫


Master:
1. vi /etc/my.cnf
    加入
    server-id=1
    log-bin=/var/lib/mysql/mysql-bin #mysql 會根據這麼 log 檔去同步資料
    binlog-do-db=test  #設定那個 database 做同步, 在這裡以 test 為例
2.重新啟動 MySQL
   service mysqld restart
3.匯出 test 資料庫的資料(加 -l 是要把目前 table lock 起來再輸出)
   mysqldump -l -u root -p test > test.sql
4.將sql傳送到 slave 的機器上
   scp test.sql root@192.168.1.2:~/test.sql
5.進入MySQL command mode
    mysql -u root -p
6.建立一個做為 replication 的帳號密碼
   在此是建立一個帳號為 replication 密碼為 abc123 為例
    mysql> CREATE USER 'replication'@'%' IDENTIFIED BY 'abc123';
    給予 replication 帳號擁有 replicaiton 的權限
    mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';

Slave:
1. 建立一個 test 資料庫
    mysql -u root -p
    mysql> CREATE DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
2. 匯入資料
    mysql -u root -p test < test.sql
3. vi /etc/my.cnf
    加入
    server-id=2 #不能重複
    log-slave-updates                 #告訴 slave 去 master 抓資料
    log-bin=mysql-bin
    binlog_format=mixed
    relay-log=hostname-relay-bin
    replicate-do-db=test             #需要同步的 database name
    master-connect-retry=60      #取得資料發生錯誤多久重試嘗試(以秒單位)
    read-only=1                      
#很重要, 將 slave 的資料庫設為唯讀, 因為如果資料表格發生衝突時, 該資料表將不會再同步。另外要注意的是此選項對於 root 和擁有 replication 的帳號沒用, 這些帳號還是有寫入權限
4. service mysqld restart
5. mysql -u root -p
    修改 slave 的設定值
    mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.1',
                MASTER_USER='replication', MASTER_PASSWORD='abc123';
    這裡帳號密碼請填入 master 所建立的
    清空原設定 以下指令是如果原本有建立過replication可用此指令清除資料
    mysql> CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0;
6. 啟動 slave
     mysql> SLAVE START;
7. 確認是否有啟動
     mysql> SHOW SLAVE STATUS;
    必須看到以下 2 個狀能為 Yes
    Slave_IO_Running Yes
    Slave_SQL_Running Yes
    如不是 Yes 請查看 /var/log/mysqld.log


    為你的系統建一個普通的帳密(上述如果開放寫入, 發生衝突即無法同步)
     mysql> CREATE USER 'test'@'%' IDENTIFIED BY 'eabc123';
    給予 test 帳號存取 test 資料庫權限
     mysql> GRANT ALL ON test.* TO 'test'@'%';


ref:
http://homeserver.com.tw/%E7%86%B1%E9%96%80%E6%9B%B8%E7%B1%A4/mysql-master-slave/
http://blog.wu-boy.com/2008/12/mysql-%E5%AF%A6%E5%81%9A-mysql-master-master-replication-%E5%90%8C%E6%AD%A5/

2012年7月31日 星期二

[Python] Windows 下快速安裝 Apache+Mysql+python

1. 快速安裝 apache + mysql + php + phpMyAdmin
首先到 http://www.appservnetwork.com/
下載 AppServ 執行安裝

 2. 安裝 python 到 http://www.python.org/download/
下載 python 2.x (or python 3.x)

 3. 安裝 mysql-pyhone 模組 到 http://www.lfd.uci.edu/~gohlke/pythonlibs/
下載 MySQL-python-1.2.3.win32-py2.7.‌exe or (MySQL-python-1.2.3.win32-py3.2.‌exe)
(這是 32 位元版本, 如是 64 位元是 MySQL-python-1.2.3.win-amd64-py2.7.‌exe )
執行安裝
再到 python shell
執行 import MySQLdb
如沒錯誤訊息就表示完成

4. 使用 cgi 模式
修改 httpd.conf
拿掉 LoadModule cgi_module modules/mod_cgi.so 註解
在 addHandle 加入 .py
AddHandler cgi-script .cgi .py
重開 apache

建立 C:\AppServ\www\test.py
輸入以下內容 (注意第一行請指向安裝 python 的目錄內的 python.exe)


#!C:\Python27\python.exe -u
# -*- coding: utf-8 -*-

print "Content-Type: text/html\n"
import MySQLdb

db = MySQLdb.connect(host="db_host", user="db_user", passwd="db_password", db="db_name")
cursor = db.cursor()

cursor.execute("SELECT * FROM table_name")
result = cursor.fetchall()

for record in result:
    print record[0],"<br>"


打開瀏覽器 http://localhost/test.py




ref
http://blog.xuite.net/autosun/study/42871538-%5BUbuntu%5D+%E5%AE%89%E8%A3%9D+Apache2+%2B+Python+%2B+MySQL
http://wiki.python.org/moin/CgiScripts