2011年2月21日 星期一

[Android] Install an App in Android

1.從Android外部安裝
foobar@ubuntu:~$ adb install app.apk
將安裝到/data/app目錄下,並建立{yourapp.package.main}目錄

2.從Android內部安裝
foobar@ubuntu:~$ adb shell
# pm install /path/to/app.apk
將安裝到/data/app目錄下,並建立yourapp.package.main目錄

3.從Android外部上傳後,由系統(PackageManager)啟動時自行安裝
foobar@ubuntu:~$ adb push app.apk [/data/app | /system/app]
如果push到/system/app下,則無法透過系統設定中的Manage applications移除,如果push到/data/app下,使用者可移除該app

reference: What does `adb install' do under the hood?

2011年2月20日 星期日

[Tips] GPG error on Ubuntu

這幾天要做apt-get update一直發現錯誤,原本想說更新source.list就解決了,後來才發現原來錯誤訊息是GPG error,就順手更新了一下...

$ sudo apt-get update
W: A error occurred during the signature verification. The repository is not updated and the previous index files will be used.GPG error: http://deb.opera.com stable Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY A2019EA84E7532C8

W: Failed to fetch http://tw.archive.ubuntu.com/ubuntu/dists/lucid/Release.gpg  Could not connect to tw.archive.ubuntu.com:80 (140.112.8.139). - connect (110: Connection timed out)

以為是tw.archive.ubuntu.com不穩,想說改到別的mirror site,從大神那邊剛好看到這篇

先備份舊的source.list
$ cd /etc/apt
$ sudo mv source.list source.list.orig
建立新的source.list
$ sudo vim source.list
deb http://free.nchc.org.tw/ubuntu/ maverick main restricted
deb-src http://free.nchc.org.tw/ubuntu/ maverick main restricted

deb http://free.nchc.org.tw/ubuntu/ maverick-updates main restricted
deb-src http://free.nchc.org.tw/ubuntu/ maverick-updates main restricted

deb http://free.nchc.org.tw/ubuntu/ maverick universe
deb-src http://free.nchc.org.tw/ubuntu/ maverick universe
deb http://free.nchc.org.tw/ubuntu/ maverick-updates universe
deb-src http://free.nchc.org.tw/ubuntu/ maverick-updates universe

deb http://free.nchc.org.tw/ubuntu/ maverick multiverse
deb-src http://free.nchc.org.tw/ubuntu/ maverick multiverse
deb http://free.nchc.org.tw/ubuntu/ maverick-updates multiverse
deb-src http://free.nchc.org.tw/ubuntu/ maverick-updates multiverse

$ sudo apt-get update
W: A error occurred during the signature verification. The repository is not updated and the previous index files will be used.GPG error: http://deb.opera.com stable Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY A2019EA84E7532C8

W: Failed to fetch http://deb.opera.com/opera/dists/stable/Release  

更新&發佈GPG key
$ sudo gpg --keyserver keyserver.ubuntu.com --recv A2019EA84E7532C8
$ sudo gpg --export --armor A2019EA84E7532C8 | sudo apt-key add -
$ sudo apt-get update

2011年2月9日 星期三

[應用程式] Step by Step Setup of Boa with PHP

Environment:Ubuntu10.4 LTS

一、編譯Boa
1.安裝必要的library
Lex(A Lexical Analyzer Generator)和Yacc(Yet Another Compiler-Compiler)
$ sudo apt-get install bison
$ sudo apt-get install flex
如果沒有安裝bison,在編譯時將會出現錯誤訊息如
yacc  -d boa_grammar.y
make: yacc: Command not found
make: *** [y.tab.c] Error 127
如果沒有安裝flex,在編譯時將會出現錯誤訊息如
yacc  -d boa_grammar.y
gcc  -g -O2 -pipe -Wall -I.   -c -o y.tab.o y.tab.c
y.tab.c: In function 'yyparse':
y.tab.c:1295: warning: implicit declaration of function 『yylex'
lex  boa_lexer.l
make: lex: Command not found
make: *** [lex.yy.c] Error 127

2.下載Boa原始檔
$ cd ~
$ wget http://www.boa.org/boa-0.94.13.tar.gz
$ tar zxvf boa-0.94.13.tar.gz

3.先查看一下原始檔,注意原始檔的變化
$ cd boa-0.94.13/src
$ ls
acconfig.h     boa.h         check_struct_for.m4  configure.in  globals.h    Makefile.in   read.c      sublog.c
aclocal.m4     boa_lexer.l   compat.h             defines.h     hash.c       mmap_cache.c  request.c   timestamp.c
alias.c        buffer.c      config.c             escape.c      index_dir.c  parse.h       response.c  util.c
boa.c          cgi.c         config.h.in          escape.h      ip.c         pipe.c        select.c    webindex.pl
boa_grammar.y  cgi_header.c  configure            get.c         log.c        queue.c       signals.c

4.configure
$ ./configure

5.編譯,將會出現錯誤
$ make
...
gcc  -g -O2 -pipe -Wall -I.   -c -o util.o util.c
util.c:100:1: error: pasting "t" and "->" does not give a valid preprocessing token
make: *** [util.o] Error 1

6.修改Boa的原始檔
$ vim compat.h
120 #define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
改成
120 #define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff

7.再次編譯,並檢查編譯完成後的檔案
在編譯的過程中,有些c的source和header會動態產生,例如config.h, lex.yy.c, y.tab.c, y.tab.h,而完成編譯後,也會產生boa和boa_indexer等兩個二進位執行檔
$ make
$ ls
acconfig.h     boa_lexer.l          compat.h       configure.in  hash.o       Makefile      read.c      signals.o    y.tab.h
aclocal.m4     boa.o                config.c       defines.h     index_dir.c  Makefile.in   read.o      sublog.c     y.tab.o
alias.c        buffer.c             config.cache   escape.c      index_dir.o  mmap_cache.c  request.c   sublog.o
alias.o        buffer.o             config.h       escape.h      ip.c         mmap_cache.o  request.o   timestamp.c
boa            cgi.c                config.h.in    escape.o      ip.o         parse.h       response.c  timestamp.o
boa.c          cgi_header.c         config.log     get.c         lex.yy.c     pipe.c        response.o  util.c
boa_grammar.y  cgi_header.o         config.o       get.o         lex.yy.o     pipe.o        select.c    util.o
boa.h          cgi.o                config.status  globals.h     log.c        queue.c       select.o    webindex.pl
boa_indexer    check_struct_for.m4  configure      hash.c        log.o        queue.o       signals.c   y.tab.c

8.編譯完成,啟動Boa
由於設定檔預設在/etc/boa目錄下的boa.conf,如果不存在,需手動複製過去,否則會出現錯誤訊息
$ sudo ./boa
Could not chdir to "/etc/boa": aborting
$ sudo mkdir /etc/boa
$ sudo ./boa
Could not open boa.conf for reading.
$ sudo cp ../boa.conf /etc/boa
$ sudo ./boa
由於Boa的log預設寫入到/var/log/boa下,若該目錄不存在會出現錯誤訊息
[10/Feb/2011:06:40:54 +0000] log.c:73 - unable to dup2 the error log: Bad file descriptor
$ sudo mkdir /var/log/boa

9.啟動Boa,檢查連線狀態(Boa預設綁在所有IP的80上)
$ sudo ./boa
$ netstat -nutlp
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -    

10.為了方便啟動/停止/重啟Boa,我寫了一個簡單的shell script幫助管理
$ vim ~/boa.sh
#!/bin/bash
BOA=~/boa-0.94.13/src/boa

start(){
    $BOA
}

stop(){
    PID=`pidof boa`
    kill $PID
}

restart(){
    stop
    start
}

case "$1" in
    stop)
        stop
        ;;
    start)
        start
        ;;
    restart)
        restart
        ;;
    *)  
        echo "{start|stop|restart}"
esac
$ chmod 755 ~/boa.sh
使用方式
$ sudo ~/boa.sh {start|stop|restart}


二、編譯PHP for Boa
1.下載PHP原始檔
$ cd ~
$ wget http://tw2.php.net/distributions/php-5.3.4.tar.gz
$ tar zxvf php-5.3.4.tar.gz

2.configure
在不確定PHP在Boa上能編譯進多少功能的情況下,先停用大多數的功能吧
$ cd php-5.3.4
$ ./configure --disable-all

3.編譯
由於PHP在Boa只能以CGI的方式執行,因此我們只要編出php-cgi就可以了
這意思是說將PHP編譯成CGI解譯器,如此一來每次有PHP Script被解譯時,網站伺服器就衍生出(spawn)一個PHP解譯器的實體,由它負責解譯該Script,但是這種方式會降低執行效能
$ make
$ ls -al sapi/cgi/php-cgi
-rwxr-xr-x 1 owen owen 8786495 2011-02-10 05:03 sapi/cgi/php-cgi


三、將PHP以CGI的方式執行
1.寫個顯示組態的PHP網頁
$ sudo vim /var/www/info.php
<?php
phpinfo();
?>

2.修改cgi-bin的虛擬路徑
$ sudo vim /etc/boa/boa.conf
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
改成
ScriptAlias /cgi-bin/ /var/www/cgi-bin/

3.將php-cgi複製到cgi-bin目錄下
$ sudo cp ~/php-5.3.4/sapi/cgi/php-cgi /var/www/cgi-bin

4.以瀏覽器檢視該網頁
如果url的路徑包括cgi-bin,那麼Boa就會以cgi的方式處理,並把它後面的參數變成cgi的命令參數去執行,因此瀏覽的網址為 http://your.host.ip/cgi-bin/php-cgi/info.php
502 Bad Gateway
The CGI was not CGI/1.1 compliant. 
檢查error_log
$ sudo cat /var/log/boa/error_log
[10/Feb/2011:16:24:37 +0000] cgi_header: unable to find LFLF
從這訊息看不出真正的錯誤原因,因此我們在/etc/boa/boa.conf裡多加上CGI的log
$ sudo vim /etc/boa/boa.conf
CgiLog /var/log/boa/cgi_log
重新啟動Boa
$ sudo ~/boa.sh restart
再用瀏覽器檢視該網頁,http://your.host.ip/cgi-bin/php-cgi/info.php,並檢查cgi_log
$ sudo cat /var/log/boa/cgi_log
<p>This PHP CGI binary was compiled with force-cgi-redirect enabled.  This
means that a page will only be served up if the REDIRECT_STATUS CGI variable is
set, e.g. via an Apache Action directive.</p>
<p>For more information as to <i>why</i> this behaviour exists, see the <a href="http://php.net/security.cgi-bin">manual page for CGI security</a>.</p>
<p>For more information about changing this behaviour or re-enabling this webserver,
consult the installation file that came with this distribution, or visit 
<a href="http://php.net/install.windows">the manual page</a>.</p>
這段錯誤主要的意思就是因為以CGI模式執行PHP程式有可能造成安全上的問題,因此預設編譯php-cgi是會開啟force-cgi-redirect的設定...
* 解決方式之一,是在configure時關閉此一設定(--disable-force-cgi-redirect),但是這招只在5.2以下的版本有用,5.3的configure就沒有此一選項
* 解決方式之二,就是在php.ini設定此一選項,預設php.ini的位置在/usr/local/lib下
$ sudo vim /usr/local/lib/php.ini
[PHP]
cgi.force_redirect = 0
在php.ini設定中的cgi.force_redirect,是因為有些網站伺服器(如Apache)在設定Action指令時,會將http://your.server.ip/protected/script.php這類請求重導至http://your.server.ip/cgi-bin/php/protected/script.php,其中的php就是PHP的CGI解譯器執行檔,前者會檢查protected目錄的存取行為,而後者如果本身有指定,它就不會去檢查這各被保護的目錄,這就可能發生安全性的問題,因此可利用--enable-force-cgi-redirect修正,並配合--enable-discard-path=/path/to/php-cgi(版本4.x以下有用),或是在php.ini設定cgi.redirect_status_env=/path/to/php-cgi

5.重新啟動Boa後以瀏覽器檢視該網頁將可看到PHP的組態設定

將PHP以CGI執行的方法可能還有一個,使用原生的cgi模式解析,雖然我沒成功完成,但是步驟大概如下
1.加入cgi的解析
$ sudo vim /etc/boa.boa.conf
AddType application/x-httpd-cgi .cgi

2.撰寫info.cgi
$ sudo vim /var/www/cgi-bin/info.cgi
#!/usr/local/bin/php-cgi
<?php
phpinfo();
?>

3.修改成可讀寫的權限
$ sudo chmod a+x /var/www/cgi-bin/info.cgi

references:
* The Lex & Yacc Page
* Linux系統編譯boa-0.94-13出錯信息問題
* 在嵌入式Linux架設Boa Webserver
* 嵌入式boa服務器移植
* boa with php

2011年1月20日 星期四

[Tips] 基本的備份指令

當然,*nix上面有很多指令都可以做壓縮/打包的,也是複雜到不行
可是大部分我在用的大概就是tar或gzip或rar或zip,但今天遇到一個用上述方法都會出現的問題,只好改用cpio備份

Archival
$ find | cpio -ov > [file|device]
Extraction
$ cpio -idv < [file|device]
NAME
       cpio - copy files to and from archives

SYNOPSIS
       cpio {-o|--create} [--verbose] {-i|--extract} 

2011年1月11日 星期二

[Android] Compile Android module

1.add environment variables
$ cd /path/to/android
$ cd build
$ . envsetup.sh
$ help
Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment:
- croot:   Changes directory to the top of the tree.
- m:       Makes from the top of the tree.
- mm:      Builds all of the modules in the current directory.
- mmm:     Builds all of the modules in the supplied directories.
- cgrep:   Greps on all local C/C++ files.
- jgrep:   Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir:   Go to the directory containing a file.

Look at the source to view more functions. The complete list is:
add_lunch_combo cgrep check_product check_variant choosecombo chooseproduct choosetype choosevariant cproj croot findmakefile gdbclient get_abs_build_var getbugreports get_build_var getprebuilt gettop godir help isviewserverstarted jgrep lunch m mm mmm pid printconfig print_lunch_menu resgrep runhat runtest setpaths set_sequence_number set_stuff_for_environment settitle smoketest startviewserver stopviewserver systemstack tapas tracedmdump

2.using mmm to compile module under root path
$ cd /path/to/android
$ mmm external/ping
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.2.1
TARGET_PRODUCT=generic
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=MASTER
============================================
target Non-prelinked: ping (out/target/product/generic/symbols/system/bin/ping)
Install: out/target/product/generic/system/bin/ping

2.or using mm to compile module under module path
$ cd /path/to/android
$ cd development/samples/NotePad
$ mm
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.2.1
TARGET_PRODUCT=generic
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=MASTER
============================================
Copying: out/target/common/obj/APPS/NotePad_intermediates/classes-full-debug.jar
Install: out/target/product/generic/system/app/NotePad.apk
Copying: out/target/common/obj/APPS/NotePadTests_intermediates/classes-full-debug.jar
Install: out/target/product/generic/data/app/NotePadTests.apk

2.or using make to compile module under root path
$ cd /path/to/android
$ make Phone
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.2.1
TARGET_PRODUCT=generic
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=MASTER
============================================
Install: out/host/linux-x86/bin/aapt
Install: out/host/linux-x86/bin/aidl
Copying: out/target/common/obj/JAVA_LIBRARIES/core_intermediates/classes-full-debug.jar
Install: out/host/linux-x86/framework/dx.jar
Install: out/host/linux-x86/bin/dx
Copying: out/target/common/obj/JAVA_LIBRARIES/ext_intermediates/classes-full-debug.jar
Copying: out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes-full-debug.jar
Copying: out/target/common/obj/APPS/Phone_intermediates/classes-full-debug.jar
Install: out/host/linux-x86/framework/signapk.jar
Install: out/host/linux-x86/bin/zipalign
target Package: Phone (out/target/product/generic/obj/APPS/Phone_intermediates/package.apk)
 'out/target/common/obj/APPS/Phone_intermediates/classes.dex' as 'classes.dex'...
Install: out/target/product/generic/system/app/Phone.apk

[Tips] Ubuntu安裝完成後常裝的軟體

最近常不小心砍掉我的家目錄,有些東西重複在做蠻討厭的,就把一些東西放到雲端上紀錄吧 XDDD
# development tool
sudo apt-get install sun-java5-jdk sun-java5-plugin sun-java6-jdk sun-java6-plugin eclipse   # java
sudo apt-get install gcc-4.1 gcc-4.3 gcc-4.4 g++-4.1 g++-4.3 g++-4.4 autoconf automake       # c/c++
sudo apt-get install libgtk2.0-dev libwebkit-dev                                             # gtk
sudp apt-get install gtkterm minicom putty                                                   # serial port utility
sudo apt-get install meld kdiff cscope ctags                                                 # programing utility
sudo apt-get install bootchart pybootchartgui                                                # boot analysis utility
sudo apt-get install ant maven2                                                              # java project utility
sudo apt-get isntall gpm                                                                     # deivce driver
sudo apt-get install procmail uboot-mkimage                                                  # uboot

# kernel
sudo apt-get install fakeroot build-essential makedumpfile kernel-package crash kexec-tools makedumpfile kernel-wedge build-dep dos2unix squashfs-tools                   

# data recovery
sudo apt-get install e2fslibs e2fslibs-dev e2fsprogs
Download extundelete

# android
sudo apt-get install git-core gitweb gnupg flex bison gperf build-essential zip curl  zlib1g-dev gcc-multilib g++-multilib x11proto-core-dev libx11-dev libncurses5 libncurses5-dev libc6-dev libreadline-dev libreadline6-dev
sudo apt-get install bison flex gettext patch build-essential texinfo                        # toolchain

# system administration
sudo apt-get install vncviewer gtkvncviewer xtightvncviewer                                  # vnc
sudo apt-get install ncdu htop                                                               # system utility
sudo apt-get install chkconfig sysv-rc-conf                                                  # service utility
sudo apt-get install vsftpd samba smbfs samba-tools smbclient openssh-server                 # service
sudo apt-get install filezilla wget bareftp ftp gftp-common gftp gftp                        # ftp
sudo apt-get install wireshark nmap                                                          # security

# emulator
sudo apt-get install qemu uml-utilities                                                      # qemu
sudo apt-get install busybox                                                                 # busybox
sudo apt-get install virtualbox                                                              # virtualbox
sudo apt-get install wine                                                                    # win32 emulator
Ubuntu Software Center -> PlayOnLinux                                                        # PlayOnLinux

# utility
sudo apt-get install shutter smartmontools preload prelink localepurge apt-file              # misc
sudo apt-get install pdfedit gs pdftk                                                        # pdf
$ gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=firstANDsecond.pdf -dBATCH first.pdf second.pdf usage

# lamp
sudo apt-get install libtool libltdl-dev libgnutls-dev libssl-dev fig2ps libgpg-error-dev libgpg-error0 libexpat1 libexpat1-dev libxml2 libxml2-dev libgcrypt11 libgcrypt11-dev libmcrypt4 libmcrypt-dev mcrypt libt1-5 libt1-dev libfreetype6 libfreetype6-dev libjpeg62 libjpeg62-dev libxpm4

# Qt4
sudo apt-get install libqwt5-qt4 libqwt5-qt4-dev pyqt4-dev-tools python-qt4 python-qt4-dev python-qwt5-qt4 qsource-highlight libqt4-dbg libqt4-dbus libqt4-declarative libqt4-designer libqt4-dev libqt4-gui libqt4-help libqt4-network libqt4-script libqt4-scripttools libqt4-sql-sqlite libqt4-webkit-dbg libqt4-xml libqt4-xmlpatterns qt4-demos qt4-demos-dbg qt4-designer qt4-dev-tools qt4-doc qt4-doc-html qt4-qmake libqt4-assistant libqt4-core libqt4-webkit qt4-qtconfig

# development lib
sudo apt-get install emacsen-common exiv2 exuberant-ctags gdebi-kde graphviz install-package kate kdebase-runtime kdebase-runtime-data kdelibs-bin kdelibs-data kdelibs4c2a kdelibs5 kdelibs5-data kdepimlibs-data kdepimlibs5 kdesudo kpackagekit kubuntu-debug-installer libakonadiprivate1 libattica0 libavahi-qt3-1 libboost-program-options1.40.0 libclucene0ldbl libdbusmenu-qt2 libexiv2-6 libiodbc2 liblua50 liblualib50 libmng1 libmodplug0c2 libmpcdec3 libmysqlclient16 libpackagekit-glib2-12 libpackagekit-qt-12 libphonon4 libplasma3 libpolkit-qt-1-0 libqca2 libqt3-mt libqt4-assistant libqt4-dbus libqt4-designer libqt4-help libqt4-network libqt4-opengl libqt4-qt3support libqt4-script libqt4-scripttools libqt4-sql libqt4-sql-mysql libqt4-svg libqt4-test libqt4-webkit libqt4-xml libqt4-xmlpatterns libqtcore4 libqtgui4 libsoprano4 libssh-4 libstreamanalyzer0 libstreams0 libxcb-shape0 libxcb-shm0 libxcb-xv0 libxine1 libxine1-bin libxine1-console libxine1-misc-plugins libxine1-x mysql-common oxygen-icon-theme packagekit packagekit-backend-apt phonon phonon-backend-xine plasma-scriptengine-javascript polkit-kde-1 python-kde4 python-packagekit python-qt4 python-sip shared-desktop-ontologies software-properties-kde soprano-daemon ttf-dejavu ttf-dejavu-extra update-manager-kde virtuoso-nepomuk libelf-dev libdw-dev asciidoc binutils-dev

[Vim] .vimrc

筆記一下我目前在用的.vimrc

"=== basic ==="
filetype plugin on        "plugin enable
filetype indent on        "auto indent

"=== encoding ==="
set encoding=utf-8        "enc
set fileencodings=utf-8,gbk,big5,cp950,gb18030,gb2312   "fenc
set termencoding=utf-8    "tenc

"=== editing ==="
syntax on
set nocompatible
set backspace=indent,eol,start
set shiftwidth=2
set tabstop=2
set softtabstop=2
set expandtab
set ic                    "ignorecase
set ru                    "position
set nu                    "line number
set hls                   "hlsearch
set confirm
set wrapscan
set history=1000
set laststatus=2
set statusline=%4*%<\%m%<[%f\%r%h%w]\ [%{&ff},%{&fileencoding},%Y]%=\[Position=%l,%v,%p%%]

"=== buffer ==="
set clipboard+=unnamed

"=== color scheme ==="
set t_Co=256
colorscheme blackbeauty   "for java
colorscheme leo           "for c/c++

"=== vim ==="
autocmd FileType java runtime! autoload/javacomplete.vim
autocmd Filetype java setlocal omnifunc=javacomplete#Complete
autocmd Filetype java set completefunc=javacomplete#CompleteParamsInf
inoremap   
inoremap   

"=== tab ==="
nmap tc :tabnew
nmap te :tabedit
nmap tm :tabmove
nmap tk :tabclose

"=== folding ==="
set foldenable
set foldlevel=10000