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

2011年12月9日 星期五

[Android] Caused by: android.content.ActivityNotFoundException

雖然使用 eclipse ui 來建立 androidMainifest.xml 新的 activity 時還是會出現以下錯誤訊息

Caused by: android.content.ActivityNotFoundException: Unable to find explicit activity class have you declared this activity in your AndroidManifest.xml?

解決方法是手動修改 AndroidManiftest.xml 內的 android:name 輸入完整的 package namespace 含 class


以動態桌布為例

<service
android:name="your.package.namespace.TestLiveWallpaper"
</service>
<activity
android:name="your.package.namespace.TestLiveWallpaper"
</activity>

動態桌布的 xml 內的 android:settingActivity 也需要改成這樣

<wallpaper xmlns:android="http://schemas.android.com/apk/res/android" android:settingsActivity="your.package.namespace.TestLiveWallpaper"
/>

2011年12月5日 星期一

[Android] 取得螢幕解析度

繼承 activity 時

Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();


不是 activity 時

Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();

2011年11月30日 星期三

[MAC OS] 好用的移除軟體程式 AppCleaner

AppCleaner
啟動 appCleaner 後,將想要的移除的軟體拖到 appCleaner 即可

ref:
官網: http://www.freemacsoft.net/
介紹: http://briian.com/?p=6870

[Android] 使用 Eclipse 開發 Android 抓不到 assets 內的檔案

使用 Eclipse 開發 Android
明明在 assets 資料夾內有檔案
在getResources().getAssets().open("filename");
卻總是抓不到
是因為檔案不能直接從檔案總管丟入, 必須由 eclipse 加入才會在打包時加入
所以個人解法是
在 assets 選 import 的方式把檔案加進來

可以使用以下片段程式確認 assets 內容

String[] list = getResources().getAssets().list("");
if (list != null)
{
  for (int i=0; i < list.length ; ++i )
  {
    Log.d("Assets:", list[i]);
  }
}