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



2012年6月4日 星期一

[Android] Bitmap out of memory 一些解決法

使用 Bitmap 在讀取較大的原始圖片時,常會發生 Out of memory 的錯誤
即可以利用 Bitmap.Options 的參數設定來降低讀取圖片時所需要的記憶體
其中 Android Developer 官方所教導的方法是使用 isSampleSize 的方式來降低讀取圖檔時所需要的 memory

該參數大於 1 時
如 2 即表示回傳的解析度為 width /2 * height / 2 的圖檔
4 即表示回傳的解析度為 width /4 * height /4 的圖檔
依此類堆
因解析度少很多,故可以減少讀圖檔的 memory

這部份的 code 可以依自己需求修改,跟官方不太一樣
以下所計算的方式是將圖片縮到比想要的解析度大一點的最小縮圖,求在顯示時有較佳的解析度
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) 
{
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;
  
    inSampleSize = (int) Math.min(Math.ceil((float)width/(float)reqWidth),  Math.ceil((float)height/(float)reqHeight));

    return inSampleSize;
}

public static Bitmap decodeSampledBitmapFromFile(String fileName, int reqWidth, int reqHeight) 
{
    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(fileName, options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeFile(fileName, options);
}
ps: inJustDecodeBounds 的參數表示會讀取圖片的一些 info 但不會將圖檔本體讀進來
此時可以讀到圖檔的寬高並無法使用該圖檔去處理或顯示(因為沒讀進 memory)

不過竟然有這樣的參數
interface 應該有可能實現,直接讀取想要寬高的圖檔才對!?


Ref:http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

這樣的方式雖然可以大量減少 out of  memory 的問題
但還是有可能會發生
所以還是可以配合

bitmap.recycle();
System.gc();

來減少發生

更詳細與其他解法的 Ref:
http://givemepass.blogspot.tw/2011/11/blog-post_16.html
http://bluegray-javalearning.blogspot.tw/2011/07/android-out-of-memoryoom.html

2012年4月12日 星期四

[Apache] 在 windows apache2.2 編譯 mod_encoding

mod_encoding.c

環境
windows 7
visual studio 2010
apache2.2
apxs

1.
官網
http://webdav.todo.gr.jp/
http://gnuwin32.sourceforge.net/packages/regex.htm

下載
a. http://webdav.todo.gr.jp/download/mod_encoding-20021209.tar.gz
b. http://webdav.todo.gr.jp/download/experimental/mod_encoding.c.apache2.20040616a
c. http://gnuwin32.sourceforge.net/downlinks/regex-bin-zip.php (regex-2.7-bin.zip)

2.
a. 解開 mod_encoding-20021209.tar.gz
b. cd mod_encoding-20021209
c. 改名 mod_encoding.c 為 mod_encoding.c.bak
d. 複製 mod_encoding.c.apache2.20040616a 進來改名為 mod_encoding.c
e. 解開 regex-2.7-bin.zip
f. 複製 regex-2.7-bin/include/regex.h 到 mod_encoding-20021209/

3.
a. 建立目錄 mod_encoding-20021209/iconv_hook
b. 複製 mod_encoding-20021209/lib/iconv.h.replace 到 mod_encoding-20021209/iconv_hook/inconv.h
c. 複製 mod_encoding-20021209/lib/iconv_hook.h 到 mod_encoding-20021209/iconv_hook/iconv_hook.h

4. 修改 regex.h
windows 沒有的 sys/types.h 改為 stddef.h
將 #include <sys/types.h> 註解
加入 #include <stddef.h>

5. 修改 mod_encoding.c
a. 在 #include <httpd.h> 上加入 #include "regex.h"
b. 加入
#include <apr_strings.h>
#include "iconv_hook/iconv.h"

c. 修改 548 行
windows 沒有 index 改用 strchr 取代
if ((user = index(r->user, '\\')) == NULL)
改為
if ((user = strchr(r->user, '\\')) == NULL)

6. 修改 iconv_hook_eucjp.c、iconv_hook_mssjis.c、iconv_hook_ucs2_cp932.c、iconv_hook_utf8_cp932.c、iconv_hook_utf8_eucjp.c
(在 mod_encoding-20021209/lib)
windows 沒有 dirent.h 和 unistd.h
註解
//#include <dirent.h>
//#include <unistd.h>
加入
#include <windows.h>

7. 修改 identify_encoding.h
(在 mod_encoding-20021209/lib)
因為 windows 沒有 strcasecmp 和 strncasecmp 所以改用 stricmp 和 strncmp
加入
#define strcasecmp stricmp
#define strncasecmp strncmp

8. 使用 apxs 編譯

cd mod_encoding-20021209/
c:\apache2\bin\apxs -llibhttpd -llibapr-1 -llibaprutil-1 -c mod_encoding.c ./lib/iconv_hook.c ./lib/iconv_hook_default.c ./lib/iconv_hook_eucjp.c ./lib/iconv_hook_ja_auto.c ./lib/iconv_hook_mssjis.c ./lib/iconv_hook_ucs2_cp932.c ./lib/iconv_hook_utf8_cp932.c ./lib/iconv_hook_utf8_eucjp.c ./lib/identify_encoding.c

如果沒有 apxs 可以自行編譯,指令如下

cl.exe /nologo /MD /W3 /O2 /D WIN32 /D _WINDOWS /D NDEBUG -I"C:\apache2\include" /c /Fomod_encoding.lo mod_encoding.c
cl.exe /nologo /MD /W3 /O2 /D WIN32 /D _WINDOWS /D NDEBUG -I"C:\apache2\include" /c /Fo./lib/iconv_hook.lo ./lib/iconv_hook.c
cl.exe /nologo /MD /W3 /O2 /D WIN32 /D _WINDOWS /D NDEBUG -I"C:\apache2\include" /c /Fo./lib/iconv_hook_default.lo ./lib/iconv_hook_default.c
cl.exe /nologo /MD /W3 /O2 /D WIN32 /D _WINDOWS /D NDEBUG -I"C:\apache2\include" /c /Fo./lib/iconv_hook_eucjp.lo ./lib/iconv_hook_eucjp.c
cl.exe /nologo /MD /W3 /O2 /D WIN32 /D _WINDOWS /D NDEBUG -I"C:\apache2\include" /c /Fo./lib/iconv_hook_ja_auto.lo ./lib/iconv_hook_ja_auto.c
cl.exe /nologo /MD /W3 /O2 /D WIN32 /D _WINDOWS /D NDEBUG -I"C:\apache2\include" /c /Fo./lib/iconv_hook_mssjis.lo ./lib/iconv_hook_mssjis.c
cl.exe /nologo /MD /W3 /O2 /D WIN32 /D _WINDOWS /D NDEBUG -I"C:\apache2\include" /c /Fo./lib/iconv_hook_ucs2_cp932.lo ./lib/iconv_hook_ucs2_cp932.c
cl.exe /nologo /MD /W3 /O2 /D WIN32 /D _WINDOWS /D NDEBUG -I"C:\apache2\include" /c /Fo./lib/iconv_hook_utf8_cp932.lo ./lib/iconv_hook_utf8_cp932.c
cl.exe /nologo /MD /W3 /O2 /D WIN32 /D _WINDOWS /D NDEBUG -I"C:\apache2\include" /c /Fo./lib/iconv_hook_utf8_eucjp.lo ./lib/iconv_hook_utf8_eucjp.c
cl.exe /nologo /MD /W3 /O2 /D WIN32 /D _WINDOWS /D NDEBUG -I"C:\apache2\include" /c /Fo./lib/identify_encoding.lo ./lib/identify_encoding.c

link kernel32.lib /nologo /subsystem:windows /dll /machine:I386 /libpath:"c:\apache2\lib" /out:mod_encoding.so libhttpd.lib libapr-1.lib libaprutil-1.lib ./lib/identify_encoding.lo ./lib/iconv_hook_utf8_eucjp.lo ./lib/iconv_hook_utf8_cp932.lo ./lib/iconv_hook_ucs2_cp932.lo ./lib/iconv_hook_mssjis.lo ./lib/iconv_hook_ja_auto.lo ./lib/iconv_hook_eucjp.lo ./lib/iconv_hook_default.lo ./lib/iconv_hook.lo mod_encoding.lo

9. 複製 mod_encoding.so 到 apache2/modules/

10.
加入以下的 config 註解掉的為 web-dav 所用,依需求自行開啟

#LoadModule headers_module modules/mod_headers.so
LoadModule encoding_module modules/mod_encoding.so
#<IfModule mod_headers.c>
# Header add MS-Author-Via "DAV"
#</IfModule>
<IfModule mod_encoding.c>
EncodingEngine on
NormalizeUsername on
SetServerEncoding UTF-8
DefaultClientEncoding UTF-8 Big5
# AddClientEncoding "(Microsoft .* DAV $)" UTF-8 Big5
# AddClientEncoding "Microsoft .* DAV" UTF-8 Big5
# AddClientEncoding "Microsoft-WebDAV*" UTF-8 Big5http://www.blogger.com/img/blank.gif
</IfModule>


Ref
http://webdav.todo.gr.jp/
http://blog.makk.idv.hk/post/31/

[PHP] 在 centos6 將 PHP 5.3 降版至 5.2



1. 安裝 atomic  repository
wget -q -O - http://www.atomicorp.com/installers/atomic | sh
安裝完畢會看到 /etc/yum.repos.d/atomic.repo

2. 移除 php5.3 (如無安裝過即跳過此步驟)
yum remove php*

3. 安裝 php 5.2
php-5.2* php-mbstring-5.2* php-xml-5.2* php-ldap-5.2* php-gd-5.2* php-xml-5.2* php-pdo-5.2*

4.避免升級到 php 5.3
vi /etc/yum.repos.d/atomic.repo  或 /etc/yum.conf
加入  exclude=php-5.3*  (加在 [atomic] 內)


Ref: https://www6.atomicorp.com/channels/atomic/centos/6/x86_64/RPMS/










下面是舊方法~

rpm -qa | grep php
rpm -e --nodeps phpxxxx

32bit

wget http://www6.atomicorp.com/channels/atomic/centos/6/i386/RPMS/php-5.2.17-1.el6.art.i686.rpm
wget http://www6.atomicorp.com/channels/atomic/centos/6/i386/RPMS/php-cli-5.2.17-1.el6.art.i686.rpm
wget http://www6.atomicorp.com/channels/atomic/centos/6/i386/RPMS/php-common-5.2.17-1.el6.art.i686.rpm
wget http://www6.atomicorp.com/channels/atomic/centos/6/i386/RPMS/php-mbstring-5.2.17-1.el6.art.i686.rpm
wget http://www6.atomicorp.com/channels/atomic/centos/6/i386/RPMS/php-devel-5.2.17-1.el6.art.i686.rpm
wget http://www6.atomicorp.com/channels/atomic/centos/6/i386/RPMS/php-ldap-5.2.17-1.el6.art.i686.rpm
wget http://www6.atomicorp.com/channels/atomic/centos/6/i386/RPMS/php-gd-5.2.17-1.el6.art.i686.rpm
wget http://www6.atomicorp.com/channels/atomic/centos/6/i386/RPMS/php-xml-5.2.17-1.el6.art.i686.rpm
wget http://www6.atomicorp.com/channels/atomic/centos/6/i386/RPMS/php-pdo-5.2.17-1.el6.art.i686.rpm

rpm -ivh php-common-5.2.17-1.el6.art.i686.rpm
rpm -ivh php-cli-5.2.17-1.el6.art.i686.rpm
rpm -ivh php-5.2.17-1.el6.art.i686.rpm
rpm -ivh php-mbstring-5.2.17-1.el6.art.i686.rpm
rpm -ivh php-xml-5.2.17-1.el6.art.i686.rpm
rpm -ivh php-ldap-5.2.17-1.el6.art.i686.rpm
rpm -ivh php-gd-5.2.17-1.el6.art.i686.rpm
rpm -ivh php-devel-5.2.17-1.el6.art.i686.rpm
rpm -ivh php-pdo-5.2.17-1.el6.art.i686.rpm

yum install libXpm.so.4 libt1.so.5 autoconf automake

64bit

wget http://www6.atomicorp.com/channels/atomic/centos/6/x86_64/RPMS/php-5.2.17-1.el6.art.x86_64.rpm
wget http://www6.atomicorp.com/channels/atomic/centos/6/x86_64/RPMS/php-cli-5.2.17-1.el6.art.x86_64.rpm
wget http://www6.atomicorp.com/channels/atomic/centos/6/x86_64/RPMS/php-common-5.2.17-1.el6.art.x86_64.rpm
wget http://www6.atomicorp.com/channels/atomic/centos/6/x86_64/RPMS/php-mbstring-5.2.17-1.el6.art.x86_64.rpm
wget http://www6.atomicorp.com/channels/atomic/centos/6/x86_64/RPMS/php-devel-5.2.17-1.el6.art.x86_64.rpm
wget http://www6.atomicorp.com/channels/atomic/centos/6/x86_64/RPMS/php-ldap-5.2.17-1.el6.art.x86_64.rpm
wget http://www6.atomicorp.com/channels/atomic/centos/6/x86_64/RPMS/php-gd-5.2.17-1.el6.art.x86_64.rpm
wget http://www6.atomicorp.com/channels/atomic/centos/6/x86_64/RPMS/php-xml-5.2.17-1.el6.art.x86_64.rpm
wget http://www6.atomicorp.com/channels/atomic/centos/6/x86_64/RPMS/php-pdo-5.2.17-1.el6.art.x86_64.rpm

rpm -ivh php-common-5.2.17-1.el6.art.x86_64.rpm
rpm -ivh php-cli-5.2.17-1.el6.art.x86_64.rpm
rpm -ivh php-5.2.17-1.el6.art.x86_64.rpm
rpm -ivh php-mbstring-5.2.17-1.el6.art.x86_64.rpm
rpm -ivh php-xml-5.2.17-1.el6.art.x86_64.rpm
rpm -ivh php-ldap-5.2.17-1.el6.art.x86_64.rpm
wget http://mirror.centos.org/centos/6/os/x86_64/Packages/libXpm-3.5.8-2.el6.x86_64.rpm
rpm -ivh libXpm-3.5.8-2.el6.x86_64.rpm
wget http://mirror.centos.org/centos/6/os/x86_64/Packages/t1lib-5.1.2-6.el6.x86_64.rpm
rpm -ivh t1lib-5.1.2-6.el6.x86_64.rp
rpm -ivh php-gd-5.2.17-1.el6.art.x86_64.rpm
rpm -ivh php-xml-5.2.17-1.el6.art.x86_64.rpm
rpm -ivh php-pdo-5.2.17-1.el6.art.x86_64.rpm


vi /etc/php.ini
把 short_open_tag = Off 改成 On
service httpd restart

避免 yum 更新到 php 做以下設定
vi /etc/yum.conf
加入
exclude=php*

Ref :
http://linux-bloggers.blogspot.com/2011/09/downgrade-php-in-centos-6.html