網頁

2013年6月19日 星期三

Ubuntu 12.04 + valgrind 3.8.1

Valgrind 3.8.0 開始支援 Intel 的 AVX ,但是 Ubuntu 12.04 上面還是 3.7.0 所以就得裝 ppa 上面的。

照著這裡做的話不會遇到太大問題。
首先看哪個好心人有做對應版本的 package ,這裡找到 jtaylor
然後就裝吧:

apt-get install python-software-properties
add-apt-repository ppa:jtaylor/jtaylor
apt-get update
apt-get install valgrind

打完收工。

2013年6月11日 星期二

nginx + smokeping with fastcgi on FreeBSD

緣起


一直以來都會用 Smokeping 來監視各個機房的對外網路狀況,但 Smokeping 全由 perl 寫成,在某次大搬風之後遺失了設定,所以只能暫時跑著 CGI mode。但是剛剛實在是太誇張的慢了,等到 proxy 一直 timeout ,所以就決定還是來把乖乖設定好吧。

說來也有趣,當時的變動是把 lighttpd 換成 nginx,但不知道什麼原因,當時竟然為了要跑 smokeping 所以必須要借助 lighttpd 去跑 FastCGI  所以把 lighttpd 跑在 127.0.0.0:8080 然後用 nginx proxy 到 lighttpd,然後又好像 smokeping 的 FastCGI 哪裡沒設定好不會動,所以又只好變成了 在 lighttpd 上面跑 CGI mode (真的是脫褲子放屁加吃飽了撐著)

作法


大概看到有幾種方法讓 nginx 直接透過 FastCGI 處理 smokeping :
1) 用 p5-CGI-SpeedyCGI (參考 1)
2) 用 p5-Plack 透過 PSGI 來跑 perl-FastCGI (參考)
3) 用 p5-FCGI 和 p5-FCGI-ProcManager 來跑 perl-FastCGI (參考)

這邊是挑 2、3 來測,但 3 比較簡單一點也完工了,步驟大概是這樣:

1) 安裝需要的套件
cd /usr/ports/www/p5-FCGI && make install clean
cd /usr/ports/www/p5-FCGI-ProcManager && make install clean
cd /usr/ports/www/spawn-fcgi && make install clean
或是用 pkg :
 pkg install p5-FCGI p5-FCGI-ProcManager spawn-fcgi
2) 編輯 smokeping 的 fastcgi wrapper,vim /usr/local/smokeping/htdocs/smokeping.fcgi 檔案如下:
# -*-perl-*-

use FCGI;
use FCGI::ProcManager;

use lib qw(/usr/local/smokeping/lib);
use Smokeping 2.004002 ;

use CGI::Fast;
my $cfg = "/usr/local/etc/smokeping/config";
my $proc_manager = FCGI::ProcManager->new( {n_processes => 5} );
my $request = FCGI::Request();
$proc_manager->pm_manage();


while (my $q = new CGI::Fast) {
           Smokeping::cgi($cfg,$q);
   }

while($request->Accept() >= 0) {
         my $q = new CGI::Fast;
        $proc_manager->pm_pre_dispatch();
        Smokeping::cgi($cfg,$q);
        $proc_manager->pm_post_dispatch();
        exit(0);
}

3) 編輯啟動 fastcgi 的 script, vim /usr/local/smokeping/htdocs/spawn-smoke 檔案如下:
#!/bin/sh
/usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 你要的PORT\
-P /var/run/smokeping-fastcgi.pid -u www \
-f /usr/local/smokeping/htdocs/smokeping.fcgi

4) 修改 nginx.conf ,增加 smokeping 的設定
        
        location /smokeping/smokeping.cgi {
            error_log    /PATH_TO/smoke-error.log  info;
            access_log   /PATH_TO/smoke-access.log combined;
                fastcgi_pass 127.0.0.1:你要的PORT;
                fastcgi_param SCRIPT_FILENAME /usr/local/smokeping/htdocs$fastcgi_script_name;
                include fastcgi_params;

        }

        location /smokeping/ {
            error_log    /PATH_TO/smoke-error.log  info;
            access_log   /PATH_TO/smoke-access.log combined;

            alias /usr/local/smokeping/htdocs/;
        }
然後記得跑
        
/usr/local/smokeping/htdocs/spawn-smoke 
之後再把 nginx 跑起來就沒問題了。
UPDATE: 要自動啟動的話 改 rc.conf
spawn_fcgi_enable="YES"
spawn_fcgi_app="/usr/local/smokeping/htdocs/smokeping.fcgi"
spawn_fcgi_bindaddr="127.0.0.1"
spawn_fcgi_bindport="PORT"
Update: slave 設定
smokeping_enable="YES"
smokeping_flags="--master-url=http://MASTER.cgi --slave-name=SLAVENAME --cache-dir=/var/run/smokeping --shared-secret=SECRET"
另外,如果要讓機器自動跑起來的話,我是直接偷改 /usr/local/etc/rc.d/smokeping :
      

# Define these smokeping_* variables in one of these files:
#       /etc/rc.conf
#       /etc/rc.conf.local
#       /etc/rc.conf.d/smokeping
#
# DO NOT CHANGE THESE DEFAULT VALUES HERE
#
# smokeping_flags=""

smokeping_enable=${smokeping_enable-"NO"}
smokeping_pidfile=${smokeping_pidfile-"/usr/local/var/smokeping/smokeping.pid"}
smokeping_fcgi_pidfile=${smokeping_fcgi_pidfile-"/var/run/smokeping-fastcgi.pid"}
smokeping_logfile=${smokeping_logfile-"/var/log/smokeping.log"}
smokeping_user=${smokeping_user-"smokeping"}
smokeping_group=${smokeping_group-"smokeping"}

. /etc/rc.subr

name="smokeping"
rcvar="smokeping_enable"
load_rc_config $name
command="/usr/local/bin/smokeping"
command_args="--logfile=${smokeping_logfile}"
pidfile="${smokeping_pidfile}"
fcgi_pidfile="${smokeping_fcgi_pidfile}"

extra_commands="reload"
reload_cmd="smokeping_reloadcmd"
start_precmd="smokeping_startprecmd"
stop_cmd="smokeping_stopcmd"
status_cmd="smokeping_statuscmd"
spawn_smokeping_fcgi="/usr/local/smokeping/htdocs/spawn-smoke"

smokeping_reloadcmd()
{
        $command --reload
}

smokeping_statuscmd()
{
        if [ ! -e $pidfile ];
        then
                echo "pidfile does not exist. $name is not running?";
                exit 1;
        fi

        if pgrep -F $pidfile >/dev/null;
        then
                echo "$name is running.";
        else
                echo "$name is not running.";
                exit 1;
        fi
}

smokeping_stopcmd()
{
        if pgrep -F $pidfile >/dev/null;
        then
                kill $sig_stop `cat $pidfile`;
                wait_for_pids `cat $pidfile`;

                kill $sig_stop `cat $fcgi_pidfile`;
                wait_for_pids `cat $fcgi_pidfile`;
                rm -rf $fcgi_pidfile;
        else
                echo "$name is not running.";
                exit 1;
        fi
}

smokeping_startprecmd()
{
        if [ ! -e $smokeping_logfile ];
        then
                install -o smokeping -g smokeping /dev/null $smokeping_logfile || echo "ERROR: Could not initialize logfile at $smokeping_logfile.";
        fi
        if [ ! -e $fcgi_pidfile ];
        then
                $spawn_smokeping_fcgi;
                echo "starting smokeping fastcgi";
        fi
}

2013年5月18日 星期六

忘記 google play 的 keystore 密碼

如果您跟小弟一樣患了老年痴呆,怎樣想也想不起來 Google Play 的 Keystore 簽章密碼,然後一 Google 發現這是一件非常嚴重的事情的時候,也許這個好心人寫的 「android-keystore-password-recover可能可以讓你鬆一口氣 (如果密碼組成大概是有限區間的某些字串排列組合的話!)

跑了兩個小時,但他並沒有幫我找到密碼(但不代表他不管用!)。

因為當我覺得程式跑太慢,試圖修改程式以便更符合自己的密碼規則,然後開始思考該塞哪些 wordlist 的時候,不小心就被我想到原始的密碼了。

2013年5月9日 星期四

ubuntu 底下 ufw 作 rate limit

大概就是

ufw limit proto tcp from any to 1.2.3.4 port 1234,2234

就會對本機 IP 1.2.3.4 的 port 1234,2234 做出 30 秒只能連線六次的限制。
然後不用預設的30/6的話就不用上面那條,直接是 allow 然後手動改 /etc/ufw/before.rules

# Don't delete these required lines, otherwise there will be errors
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
# End required lines
之後加上
# Limit IP connection(s)
# Limit to 10 concurrent connections on port 80 per IP
#-A ufw-before-input -p tcp --syn --dport 80 -m connlimit --connlimit-above 300 -j DROP
# Limit to 20 connections on port 80 per 2 seconds per IP
#-A ufw-before-input -p tcp --dport 80 -i eth1 -m state --state NEW -m recent --set
#-A ufw-before-input -p tcp --dport 80 -i eth1 -m state --state NEW -m recent --update --seconds 1 --hitcount 20 -j DROP
更機車的設定可以參考這裡

2012年11月19日 星期一

在 windows 上面建立 android 開發環境 (eclipse adt + ndk)

因為有一隻熊太笨了,要編 android 的程式卻苦於沒有環境,所以這裡簡單記錄一下 android 開發環境(on Windows)的建造過程。

1.) 首先,你會需要 jdk。

2.) 然後安裝 Eclipse CDT。

3.) 在 Eclipse 裡面安裝 ADT(選 Help->Install New Software, Work with 填入 https://dl-ssl.google.com/android/eclipse/ 
    然後選 Developer Tools 跟 NDK Plugin)。

4.) 重新啟動 Eclipse 後會要你安裝 android sdk。

5.) 安裝 NDK。

6.) 下載需要的 cocos2d-x。

7.) 安裝 TortoiseSVN
然後來測試是否能夠編譯 C++ Project:

1.) 開啟 Eclipse,選 File->New->Project ,選 Android Project from Existing Code

2.) 選一個 Cocos2ds-X 的 Sample 匯入成 Project (這裡是 TestCpp)

3.) 會看到 Cocos2dxActivity cannot be resolved to a type 有三個錯誤,暫時解法是把 Cocos2d-X 目錄
中的 
    cocos2dx/platform/android/java 也 import 成一個 project。

4.) 在 TestCpp Project 上面按右鍵,選 Properties,找裡面的 Builders。

5.) 按 New 新增一個 Builder,然後路徑選 NDK 裡面的 ndk-build.cmd。

6.) 把 tab 切到 environment,新增 NDK_MODULE_PATH 變數,後面給兩個值 
    C:\android\cocos2d-2.0-x-2.0.4;C:\android\cocos2d-2.0-x-2.0.4\cocos2dx\platform\third_party\android\prebuilt 
    中間用分號隔開

7.) 建立完成後把 NDKBuilder 推到最上面

8.) Project -> Build Project 就會開始編譯。



更詳細的圖文請參考:這裡

UPDATE: 遇到 The import org.cocos2dx.lib cannot be resolved    錯誤的話,把  cocos2d-2.0-x-2.0.3/cocos2dx/platform/android/java 也 import 進來就好了,參考

2012年10月18日 星期四

HTC One X 斷電後進入 bootloader

昨天想把 unlock 過且刷過第三方韌體的 HTC One X 給 ruu 回原廠韌體(必須要重新 lock),結果遇到幾個問題,卡了好幾個小時,簡單記錄如下。

1) 本來想先 restore backup ,回到當初剛 root 完的狀態,但不知道為何卻一直卡在 One 的那個 load 畫面,那是處於 fastboot 失效且無 adb 的狀態,然後用三鍵斷電重開卻又無法進入,持續 bootloop。

解法:這是按法的問題,在三鍵強制斷電重開的時候,似乎馬上接著只按volum down 並不會偵測到。而應該改成三鍵重開按完,下面三個按鍵燈閃爍時先放掉 volum up,然後過一下子再放開 power ,即可進入 bootloader 。

2) 找不到快速的 ruu 載點,不是要註冊收費就是很慢

後來在 htcruu 找到.exe,然後在 這裡 找到 2.17 的台版 ruu。

3) ruu 更新一直失敗,卡在錯誤的 bootloader

這裡有兩個原因,一個是要用 fastboot oem readcid 對照看看抓的版本是不是一樣,我本來抓 Asia-TW 但後來發現手上版本都是 TWM,瞎忙了一陣子。

然後用 fastboot getvar all 看一下
E:\OneX\Android\Tools1.26>fastboot getvar all
(bootloader) version: 0.5a
(bootloader) version-bootloader: 1.12.0000
(bootloader) version-baseband: 1.1204.104.14
(bootloader) version-cpld: None
(bootloader) version-microp: None
(bootloader) version-main: 2.17.709.2
(bootloader) serialno: HT258W1A0919
(bootloader) imei: 353043057600408
(bootloader) product: endeavoru
(bootloader) platform: HBOOT-T30S
(bootloader) modelid: PJ4610000
(bootloader) cidnum: HTC__621
(bootloader) battery-status: good
(bootloader) battery-voltage: 3848mV
(bootloader) devpower: 59
(bootloader) partition-layout: None
(bootloader) security: on
(bootloader) build-mode: SHIP
(bootloader) boot-mode: FASTBOOT
(bootloader) commitno-bootloader: None
(bootloader) hbootpreupdate: 2
(bootloader) gencheckpt: 0
all: Done!
finished. total time: 0.827s 

注意當中的 HBoot Version ,這裡的版本如果比 ruu 裡面就的話就會報 bootloader 錯誤。 解決方是參考mobile01 上的 (8/23) One X RUU回復/Recovery/OTA相關教學 自己做一個專屬的 ruu 來就 ok 了。


2012年10月12日 星期五

在 hicloud 遭遇的狀況

最近因為遇到一些問題,所以開始 survey 往雲端發展的環境,目前在 hicloud 降價之後,價格到具有競爭力的階段(之前是 In/Out 合併計算,每 GB NTD 15,降價後只算 Out,每 GB NTD 3),目前待了一個月左右,有一些有點麻煩的問題。

由於線上是 VM 環境(vmware),所以資源共用是一件很合理的事情,但如果當我們的 VM 跟其他大戶放在一起,便會有很恐怖的事情發生。

圖中可以看到,Disk I/O 忽然在 12 點過後就進入瘋狂的 busy 狀態,在這個狀態下大部份的 CPU Time 都跑去做 IO Wait,所以 Load Average 莫名飆高,而整個跟 Disk 有關的動作都完全被卡死。

這個狀態持續了快 18 個小時,最後在連續三張 Ticket 以及好幾次電話之後才解決。

如果是一般的 Web Application,那只會暫時慢一下,沒有太大影響。但由於我的 Socket Server 是直接呼叫 MySQL C API ,在這裡則會直接 blocking,然後就會 Out of Service。

在這種 workload 都還算 micro 的狀況底下就出這種包,實在是有點誇張。

PS: 在當時,連一個大概十萬筆有 Index 的資料,下去做 query 限制三十筆輸出,都可以花上 20 多秒鐘?! 這不會太誇張嗎?

所以當時對 ext4 的檔案系統有稍微調整一下。

1: 取消 access time 更新
2: 延長 write-back 的時間

(參考)

# 把 /etc/fstab 加上 noatime 跟 data=writeback

tune2fs -o journal_data_writeback /dev/sdaX

UUID=9ee7afff-654d-123c-b936-fe96354bec0c /               ext4    errors=remount-ro,noatime,data=writeback 0       1
# /etc/sysctl.conf 加上延長 writeback 時間

vm.dirty_writeback_centisecs = 360000


本來想把 ext4 的 journal 關掉,但是看了看好像不妥,尤其是需要 unmount/fsck ,我又是 root partition ,就放棄了。

看來目前能做的就是

1) 盡力讓 Database 有效率(快)一點,把不用的資料丟進 archive
2) 想辦法讓 server 對 MySQL 的存取變成 Asynchronous I/O,就算 MySQL 塞住也不要 blocking。
3) 求神拜佛希望 cloud 環境不要再出狀況了 (嘆)

2012年10月11日 星期四

在 Blogger 上用 Google Code Prettify 顯示程式碼

blog 荒廢了好長一段時間,還是習慣 wordpress 裡面 rich editor 的寫作方式,但是實在是受不了自己 maintain 機器那種一陣子爆炸一次之後就再那邊焦頭爛額的慘劇,但 wordpress.com 裡面的客製化域名又是年費計算,感覺不太爽,所以索性把 blog 移到 blogger 上來。

遇到的第一個問題就是貼 code 的部份,印象中在 zeroplex 那邊有看過,本來跟他問是用什麼方法貼的,但三更半夜的誰有閒情逸致待在電腦前呢,大概只有 ㄐㄒㄈ資深工程師 還在公司埋頭苦幹吧?

Google 了一下看到了 在 Blogger 文章中利用 CSS Block 及 Google Code Prettify 顯示程式碼這篇文章,照著做也確實是可以運作的,而且當中的 background image 偷偷從 zeroplex 那邊偷了 base64 encode的 gif 直接藏在 template 中也挺方便, 不過 onLoad 放在 <body> 中會造成整頁一直卡住 Loading 的問題,會讓網頁速度拖慢,有點討厭。

剛剛又稍為找了一下發現在 stackoverflow 裡面的這篇解答提供了一個比較方便的解法,也不需要改動太多的 template code,作法如下:

先把自己想要的 Design 給選好,然後進到 Blogger 的 Design 頁面選[編輯HTML]在 <head> 後面貼這段:

<link href="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" language="javascript" src="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js"></script>
<script type="text/javascript" language="javascript" src="http://google-code-prettify.googlecode.com/svn/trunk/src/lang-css.js"></script>
<script type="text/javascript">
    document.addEventListener('DOMContentLoaded',function() {
        prettyPrint();
    });
</script>
然後進到 自訂->進階-> Add CSS,加入這段:

pre.code {
  display: block; /* fixes a strange ie margin bug */
  font-family: Courier New; 
  font-size: 10pt; 
  overflow:auto; 
  background: #f0f0f0 url(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAASwCAYAAAAt7rCDAAAABHNCSVQICAgIfAhkiAAAAQJJREFUeJzt0kEKhDAMBdA4zFmbM+W0upqFOhXrDILwsimFR5pfMrXW5jhZr7PwRlxVX8//jNHrGhExjXzdu9c5IiIz+7iqVmB7Hwp4OMa2nhhwN/PRGEMBh3Zjt6KfpzPztxW9MSAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzB8HS+J9kUTvzEDMwAAAABJRU5ErkJggg==) left top repeat-y;
  border: 1px solid #ccc;
  padding: 10px 10px 10px 21px;
  max-height:200px;
  line-height: 1.2em;
}
之後只要用 <pre class="code prettyprint">要顯示的 code</pre> 就可以顯示了。

Happy Blogging !

2012年9月11日 星期二

ubuntu 筆記

最近因為某些原因,所以開始測試國內的雲端環境,挑選的是中華電信的 hiCloud 服務,前面一些跌跌撞撞的紀錄就不多說了;簡單講,本來選了以為會比較好用的 CentOS 結果卻非常不順手,用了三天毅然決然把環境換為 ubuntu,直接 apt-get update 然後 do-release-upgrade -d 把原來的 ubuntu 10.04 升到 12.04 。玩了一陣子下來,果然順暢多了。
但是卻發現 hiCloud 目前無法自己製作 image deploy,所以只好把該記的記下來。
下面就是一些重新演練的環境紀錄,供以後參考。

基本環境設定


先安裝 sshd、vim、screen

apt-get install openssh-server
apt-get install vim
apt-get install screen

設定目前機器的網路環境

vim /etc/network/interfaces
iface lo inet loopback
auto lo

auto eth1
iface eth1 inet dhcp

改成
iface eth0 inet static
address 192.168.1.100
netmask 255.255.255.0
gateway 192.168.1.1

升級系統


大致上是 apt-get update , apt upgrade 就可以解決。 一開始我是會用 apt-get 的 mirror 功能讓他自動依區育去挑 mirror,方法為在 /etc/apt/source.list 的最前面加上
deb mirror://mirrors.ubuntu.com/mirrors.txt precise main restricted universe multiverse
deb mirror://mirrors.ubuntu.com/mirrors.txt precise-updates main restricted universe multiverse
deb mirror://mirrors.ubuntu.com/mirrors.txt precise-backports main restricted universe multiverse
deb mirror://mirrors.ubuntu.com/mirrors.txt precise-security main restricted universe multiverse
但不幸遇到 tw.archive.ubuntu.com 掛掉的問題的話,就到 官方mirror列表找自己的地區然後是Up to date的,這裡我是選國網自由軟體實驗室的mirror,然後把 /etc/apt/source.list 改成
#

# deb cdrom:[Ubuntu-Server 12.04.1 LTS _Precise Pangolin_ - Release amd64 (20120817.3)]/ dists/precise/main/binary-i386/
# deb cdrom:[Ubuntu-Server 12.04.1 LTS _Precise Pangolin_ - Release amd64 (20120817.3)]/ dists/precise/restricted/binary-i386/
# deb cdrom:[Ubuntu-Server 12.04.1 LTS _Precise Pangolin_ - Release amd64 (20120817.3)]/ precise main restricted

#deb cdrom:[Ubuntu-Server 12.04.1 LTS _Precise Pangolin_ - Release amd64 (20120817.3)]/ dists/precise/main/binary-i386/
#deb cdrom:[Ubuntu-Server 12.04.1 LTS _Precise Pangolin_ - Release amd64 (20120817.3)]/ dists/precise/restricted/binary-i386/
#deb cdrom:[Ubuntu-Server 12.04.1 LTS _Precise Pangolin_ - Release amd64 (20120817.3)]/ precise main restricted

# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://free.nchc.org.tw/ubuntu/ precise main restricted
deb-src http://free.nchc.org.tw/ubuntu/ precise main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb http://free.nchc.org.tw/ubuntu/ precise-updates main restricted
deb-src http://free.nchc.org.tw/ubuntu/ precise-updates main restricted

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://free.nchc.org.tw/ubuntu/ precise universe
deb-src http://free.nchc.org.tw/ubuntu/ precise universe
deb http://free.nchc.org.tw/ubuntu/ precise-updates universe
deb-src http://free.nchc.org.tw/ubuntu/ precise-updates universe

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb http://free.nchc.org.tw/ubuntu/ precise multiverse
deb-src http://free.nchc.org.tw/ubuntu/ precise multiverse
deb http://free.nchc.org.tw/ubuntu/ precise-updates multiverse
deb-src http://free.nchc.org.tw/ubuntu/ precise-updates multiverse

## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
deb http://free.nchc.org.tw/ubuntu/ precise-backports main restricted universe multiverse
deb-src http://free.nchc.org.tw/ubuntu/ precise-backports main restricted universe multiverse

deb http://security.ubuntu.com/ubuntu precise-security main restricted
deb-src http://security.ubuntu.com/ubuntu precise-security main restricted
deb http://security.ubuntu.com/ubuntu precise-security universe
deb-src http://security.ubuntu.com/ubuntu precise-security universe
deb http://security.ubuntu.com/ubuntu precise-security multiverse
deb-src http://security.ubuntu.com/ubuntu precise-security multiverse

## Uncomment the following two lines to add software from Canonical's
## 'partner' repository.
## This software is not part of Ubuntu, but is offered by Canonical and the
## respective vendors as a service to Ubuntu users.
# deb http://archive.canonical.com/ubuntu precise partner
# deb-src http://archive.canonical.com/ubuntu precise partner

## Uncomment the following two lines to add software from Ubuntu's
## 'extras' repository.
## This software is not part of Ubuntu, but is offered by third-party
## developers who want to ship their latest software.
# deb http://extras.ubuntu.com/ubuntu precise main
# deb-src http://extras.ubuntu.com/ubuntu precise main
如果覺得太麻煩,網路上有自動產生器可以用。

建構網頁環境

安裝網頁伺服器(Lighttpd)

apt-get install lighttpd

安裝資料庫(MySQL)

apt-get install mysql-server

安裝 php

apt-get install php5-fpm

安裝 phpmyadmin

apt-get install phpmyadmin

將 php5-fpm 改成 unix-socket

vim /etc/php5/fpm/pool.d/www.conf

* 找到以下將 listen 換成 php5-fpm.sock *

; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific address on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all addresses on a
;                            specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
;listen = 127.0.0.1:9000
listen = /tmp/php5-fpm.sock
vim /etc/lighttpd/conf-enabled/15-fastcgi-php.conf

* 將 lighttpd 的 fastcgi module 改成跑 fpm sock *

fastcgi.server += ( ".php" =>
        ((
                "socket" => "/tmp/php5-fpm.sock",
                "broken-scriptfilename" => "enable"
        ))
)

遭遇錯誤

需要MDB2

Failed opening required 'MDB2.php':
解法
apt-get install php-mdb2

需要DataObject

Failed opening required 'DB/DataObject.php':

解法

pear install DB_DataObject
pear install MDB2_Driver_mysqli

需要php5-geoip

[plugin] modifier 'geoip_country_code_by_name' is not implemented:

解法
apt-get install php5-geoip

安裝開發環境

安裝GCC

apt-get install gcc 

安裝G++

apt-get install g++

安裝GDB

apt-get install gdb

安裝 GMake

apt-get install make 

安裝subversion

apt-get install subversion

安裝 Google Protobuf

apt-get install protobuf-compiler libprotobuf-dev

安裝 Boost C++ Library

apt-get install libboost-all-dev

安裝 Poco C++ Library

apt-get install libpoco-dev

安裝 MySQL C API 

當出現錯誤訊息找不到 mysql.h:
apt-get install libmysqlclient-dev

安裝 CMake

apt-get install cmake 

安裝 samba

apt-get install samba
pdbedit -a USERNAME

設定 ulimit

vim /etc/security/limits.conf 
*               soft    core            -1
*               soft    data            33554432
*               soft    fsize           -1
*               soft    memlock         -1
*               soft    nofile          40960
*               soft    rss             -1
*               soft    stack           524288
*               soft    cpu             -1
*               soft    as              -1
*               soft    locks           -1
root            hard    core            100000

設定 core dump filename

echo "%e.core.%s.%t"> /proc/sys/kernel/core_pattern

永久寫入 vim /etc/sysctl.conf
kernel.core_pattern=%e.core.%s.%t 

換掉 default editor

update-alternatives --config editor

備份與還原 

安裝進度條

每次當我們在 unix-like 上執行某些操作,例如傳檔案、壓縮、解壓縮,總是很難知道現在還要等多久,所以可以透過pv 這支程式幫我們顯示進度條。
apt-get install pv

備份資料庫

mysqldump -u username -p --add-drop-table --create-options --routines --default-character-set=utf8 DATABASE_NAME | pv | bzip2 -cq9 | pv > BACKUPFILENAME.sql.bz2

還原資料庫

pv BACKUPFILENAME.sql.bz2 | bunzip2 > BACKUPFILENAME.sql
pv BACKUPFILENAME.sql | mysql -u username -p DATABASE_NAME

雜七雜八

看目前裝了什麼套件,類似FreeBSD 裡的 pkg_info

dpkg-query -Wf  '${Installed-Size}\t${Package}\n' | sort -n
或是
sudo sed -ne '/^Package: (.*)/{s//1/;h;};/^Installed-Size: (.*)/{s//1/;G;s/n/ /;p;}' /var/lib/dpkg/status | sort -rn

2012年2月24日 星期五

到底是 programmer 還是雜耍工

有感:程式設計師在除錯的時候就像偵探一樣,必須鉅細靡遺的抽絲剝繭。

這一個禮拜幾乎都在做偵探在做的事情。起因是有個 flash 在測試環境連 amfPhp 的 Server 測試起來都沒啥問題,一到線上環境就會莫名其妙的亂卡。卡的時間還很詭異的都是五的倍數。

於是第一個當然就是懷疑線上跟開發環境的版本問題啦。
所以一開始就把 lighttpd 版本,換呀換, php 版本換呀換,結果問題還是存在。

那不然應該就是,線上的 load 過高?可是圖表看起來一切都還好阿。於是一連串由可能懷疑的都懷疑了。先是懷疑 fastcgi process spawn 的速度,然後又懷疑是不是 fastcgi handler,所以也換了好幾種 fastcgi 的模式,也用了 php內建的 php-fpm ,結果依然照舊。

後來發現這個恐怖的 amfphp 竟然會一直抽插 lighttpd ,每個 rpc call 都要 connect 一次,於是開始覺得會不會是 lighttpd 的 fastcgi handler 不夠力,會 queue 住,之後發現也不是,然後又開始懷疑該不會是 socket 有問題吧.....。

到最後能調的都調過了,其他網頁的速度也明顯的加快許多,可是還是一樣,莫名其妙會卡。

好吧,那應該不是 server 的問題了,乖乖的抽絲剝繭看看吧。

所以就乖乖的進 php 裡面用,「夾擠法」去找出到底卡在哪。最後發現卡在兩個點,一個是在 amfphp 的 auth 模組,一個是在 class 模組。

trace 進 auth 模組裡面發現裡面有用到 session ,不會吧,難道這種流量 io 就撐不住了嗎?於是把 php 的 session 丟到 ramdisk ,情況依舊。後來找到 session 相關的問題有人提到session lock 要注意。 我也乖乖的改了,還是一樣。

後來跟 clark 討論的時候他看了看程式碼,蹦了一句話,那應該是每次用完 session 就先強制 close 掉就好。於是我又乖乖跑回去改 code ,結果還是卡。就當一籌莫展的時候無意間看到,咦?auth 模組真的不會卡了耶!所以 session lock 莫名的就被修好了。到這裡已經用了三天。

之後又繼續 trace class 模組,到最後發現產生的地方在 new 物件的地方花費很久,這就束手無策百思不得其解了好一陣子。不會要我對線上環境 gdb 吧?這根本沒搞頭阿。不小心被我找到一個東西:http://xdebug.org/,這東西真是太銷魂了阿。

一丟進去,就算是線上環境也還好,馬上就可以看到是卡在哪裡。

class 模組馬上看到是在兩個點,跑進去追根究柢後,一個是 pear 的問題,一個卡在 mysqli 的 connect ,一量馬上發現,原來問題是出在 mysql slave ,都顧著調 master ,結果是 slave 的 connect 有時候會卡。

還好,找到問題,收工。

但是那堆 pear 還是沒辦法解決阿......哀嚎中。

2011年9月20日 星期二

FreeBSD on EC2

一些玩 FreeBSD on EC2 的筆記,免費的 Free Usage Tier 因為速度比較慢所以都直接裝 package ...

剛登入馬上去生 user :
mkdir -p /home
adduser
把 user 加進 wheel 群組裡

然後更新一下系統
freebsd-update fetch install

裝一下基本的 package
pkg_add -r vim-lite screen subversion cmake rsync

然後到 ec2 panel 裡面把 ip bind 好,firewall 該設定的搞定,就有一台 FreeBSD box 了!

---
不過不是我在說,他真的很慢...
---
Unix Benchmark Utility v.0.3
Copyright (C) July, 1999 PhysTech, Inc.
Author: Sergei Viznyuk <sv@phystech.com>
http://www.phystech.com/download/ubench.html
FreeBSD 8.2-RELEASE FreeBSD 8.2-RELEASE #0: Thu Aug  4 15:39:43 UTC 2011     root@ip-10-17-5-252:/usr/obj/i386/usr/src/sys/XEN i386
Ubench CPU:    66222
Ubench MEM:    25839
--------------------
Ubench AVG:    46030

2011年8月8日 星期一

擷取檔案中的部份行數

把檔案切八斷的方法,在找了一段時間之後由偉大的鹿小滑提供....

sed -n '30001,40000p' filename


2010年5月5日 星期三

用 ramdisk 加速 freebsd 編譯 ports 的速度

剛剛在很苦命的編譯 ports , 機八鴨提供了一個很有用的方式,就是把編譯過程中會產出的 object file 全都塞到 RAMDISK 中(反正現在 RAM 都很大也不知道拿來做什麼),加上 FreeBSD 8 的 ports 開始支援多核心的 make jobs 編譯,速度可說真是飛快。

作法很簡單:

先蓋一個 RAMDISK (這裡是開 512M, 可以自己調整)
/sbin/mdmfs -M -S -o async -s 512m md0 /tmp/portsobj

然後讓他能寫入
/bin/chmod 777 /tmp/portsobj

接下來去 /etc/make.conf 把 obj 會產生的目錄指過去
WRKDIRPREFIX=/tmp/portsobj

然後去編看看,就會發現速度差很多。
然後懶人大法當然是要 shell script 一下:
#!/bin/sh

case "$1" in
create)
/sbin/mdmfs -M -S -o async -s 512m md0 /tmp/portsobj
/bin/chmod 777 /tmp/portsobj
echo "512M ramdisk created on md0 and mounted on /tmp/portsobj"
exit 0
;;
destory)
/sbin/umount /tmp/portsobj
/sbin/mdconfig -d -u 0
echo "ramdisk umounted from /tmp/portsobj and destory from md0"
;;
*)
echo "Usage: `basename $0` {create|destory}" >&2
exit 64
;;
esac

然後機八鴨還好心建議不要直接打 make install clean 而是用先用 pkg_add 把 package 裝完,然後再用 portmaster -bDGtw -m FORCE_PKG_REGISTER=yes 來升級,那他每次在編完每一個 ports 後都會自動清掉 obj 而不是像原本的 ports system 會全部裝完成功後才 clean。

2009年11月7日 星期六

APTOS Design LAB 的 ADA-U21W

這幾天鴨子在物色他的喇叭,恰巧在 crazymike 看到APTOS Design LABADA-U21W放送,於是就手滑不小心跟進了。

當中的小插曲是:最近勸拜成功,林大哥看到我幫家弟買得小黑 T400 PU9 品像不錯價格誘人,就也叫我幫他處理一台來。並且連自取也不用了,直接貨到付款寄到指定地點。然後又很剛好得我在 crazymike 填的送貨地點是同一個,又非常碰巧的,crazymike 跟 T400 賣家都是用相同的宅配,所以到貨的那天早上,先是接了宅配的電話

宅配:「請問是林先生嗎,這裡未您送貨到付款,款項為 XXXXX ,請問您在指定的送貨地點嗎?」
我:「(睡臉惺忪)哦,有,送過去就好了。」

然後起身打給林大哥,請他去收貨,轉頭繼續睡。過沒多久,林大哥打回來:「喂,黑咧頭家美賣捏~瓦嘎咩電鬧歌頌哇冷ㄟ啦吧~金夙昔捏~(那個老闆不錯哦,跟他買電腦還寄了兩組喇吧來哦,很不錯哦)」。瞬時之間從床上笑到床下,因為那是我等了好幾天的 ADA-U21W 阿。

這組東西其實很有趣,他是走 USB 介面直接吃 USB Audio Device 然後把聲音播放到喇叭上,然後由主要的機身扮演著 USB DAC + Amplifier ,推動兩個被動式音箱且「不需外接電源」。會引起我興趣的地方其實是因為現在我的位置上只有耳機,但我不太喜歡耳機聽過久,雖然有 5021 掛在牆上,但是一般時間又不好意思開泰大聲,需要一組用來放音樂用的。尤其是,最好是能獨力只播音樂,其他的系統、城市音效都可以不要播放。這樣看來,獨立的USB Audio Device 剛好符合規格呢!

當一切就緒的時候,將 usb 插上電腦,看到他跳出偵測裝置,成功安裝標準驅動,一切安好。但是打開音樂播放器卻無法播放,臉綠了一半。最近不會運氣這麼好吧,連這都中大獎阿?還好我有兩組,在拿另一個來試,還是一樣。不會吧,又是 Windows 7 64bit 的錯嗎?還好我還有 32 bit版,測了,還是不會動,都可以看到裝置卻沒聲音。所幸在把旁邊的 windows xp 拿來測,咦,一切正常?生氣了,在拿出 ubuntu 測,也一切 OK?

真是奇怪, USB Audio Device 是走標準的東西沒道理其他會動獨缺 Win7 壞事吧。於是搞了一個下午,也換了 ASIO driver ,硬上有的沒的驅動,都不會動,但是看著 XP 卻播的虎虎生風。搞到最後發現解法了。

如果你也是 ADA-U21W ,或是 Biforst 的 Bu20360 的產品,在 Windows 7 下遇到有裝置沒聲音的話可以試試看這個解法:

sound-1
到控制台開啟「聲音」

sound-1

在 USB Audio Device 選內容,切到增強功能,勾選「停用所有增強」

然後就過著幸福快樂的生活吧。

Related Info Here.

2009年9月10日 星期四

pf.conf + pppoe 造成錯誤而無法載入 pf rule 的解法

如果遇到 PF + PPPOE 一起混著用的時候,又有 Lan connection ,有時候會開起來後 pf rule 完全沒被載入。這問題的起因就是,當 pf 先載入的時候 PPPOE client 還沒有把 daemon 跑起來,除了不知道 gateway 的 IP 外有可能連 Interface 都還沒出現。如果是 Interface 還沒出現的話,只要把該 interface (通常 pppoe 會是 tun0) 用括號包起來,像是:
ext_if_fttb="tun0"
nat on $ext_if_fttb inet from $internal_net to {!$internal_net,!$sparq_net} -> ($ext_if_fttb)

這樣 pf 就不會檢查 $ext_if_fttb 是不是存在,而如果有用到 PPPOE 的 gateway 的話則可以換成:
gw_if_fttb="(tun0:peer)"

這樣就不用每次重開完之後還要手動進去 pfctl -f /etc/pf.conf 了。

2009年9月4日 星期五

2008年11月26日 星期三

莫名其妙被婊

在 FreeBSD 7.1 PRELEASE 底下做比較複雜的網路環境,結果要讓 rsync + ssh 從其他網路跑進來撈備份的時候遇見很奇怪的問題:

明明就是通的,但是卻是慢到非常的誇張,比原先的線路還離譜。本來以為是 pf 擋到不該擋的,叫出 tcpdump 來看半天發現沒錯;又想說是不是走錯路,交叉測了很久也看不出啥端倪。最後比對正常跟有問題的 tcpdump 也看不出啥鬼。結果在對照[正常]組時發現:

02:52:39.274108 IP bad-len 0
02:52:39.304782 IP bad-len 0
02:52:39.334036 IP bad-len 0
02:52:39.335331 IP bad-len 0

這種東西,好奇 google 一下發現這篇,結果發現我也中大獎 -_-||

sysctl net.inet.tcp.tso=0

從此過著幸福快樂的日子......!@#$%^& .......

2008年6月30日 星期一

*NEVER* remove coreutils

不小心為了解決 gentoo 下的 block 問題而 remove 了 coreutils 浪費很多時間 -_-像這種東西應該要提示使用者萬萬不能 remove 的阿…倒數完了就 remove 沒啥太大作用吧 (翻桌)
所以稍微 note 一下, 別再不小心幹掉 coreutils 了 :~

NOTE: 如果不小心發生一樣的慘狀,就去 package server 撈 binary 回來救吧

  1. wget coreutil-X.XX-rN.tbz2 from http://tinderbox.dev.gentoo.org/default-linux/

  2. cp coreutil-X.XX-rN.tbz2 /usr/portage/packages/All
    (HINT: 如果沒這目錄的話應該可以用 $PKGDIR 來指定)

  3. emerge -K coreutils

  4. emerge --unmerge mktemp

  5. emerge system


UPDATE: 剛看到 *這裡* 也有一樣的討論串...

2008年6月11日 星期三

mu-wordpress

由於不想維護太多份的 wordpress code (之前手上有四份左右),很久之前就想要換成 mu-wordpress 。但是以前怎麼找都找不到 wordpress.com 那邊用的 nightly build 的 subversion repo 又懶得自己從 tarball import ,所以就一直找藉口沒動。直到暑假某次無意中終於發現了神秘的位置,才又想起這件事。

題外話:打到這裡 FireFox BonEcho 2.0 nightly build 0930 連續當了兩次,當我正在懊惱我還沒裝 AutoSave Plugin 時,發現竟然大部分已經被存成草稿,只漏了一句,不過馬上又當了一次。(不過 Firefox 2 真的速度快很多!)wordpress 真是太酷了。

事實上之前已經有敢死隊衝過 mu-wordpress 了,可是後來跑一跑之後這位胸毛男說,mu-wordpress 的資料表那樣建太機車了,看他不爽,於是就又跳槽去 lyceum ,所以害我很猶豫是要跟隨胸毛男的 技術支援,還是跟 mu-wordpress 就好。 反正到最後也不知道怎麼搞的,我就去 svn co 下了 mu-wordpress ,然後玩到現在。事實上,mu-wordpress 已經把大部分的工作都做的很懶人,以前還需要自己去動 wp-config.php ,現在根本就全部都在 web 上面點一點之後就可以動了,並且目錄權限不對他也會幫你檢查,然後很貼心的告訴你指令該怎麼打。既然胸毛男之前也寫過「wordpress 多人板安裝手札」其實這裡大概也不需要介紹,反正都是很直覺的點一點填一填。我是選用 sub-domain 的方式,原因有機會以後再說,所以對應的 DNS 以及 WEB Server 都需要做些對應的設定。

例如在 BIND 當中的話可以直接用 WILDCARD record 來設定:
* CNAME blog

然後在對應的 APACHE 上面也要有對應的 VHOST 設定:
<VirtualHost *:80>

ServerAdmin admin@domain.tld
DocumentRoot /path/to/mu-wordpress
ServerName blog.domain.tld
ServerAlias *.domain.tld
ErrorLog /path/to/logs/httpd-error.log
CustomLog /path/to/logs/httpd-access.log combined

<Directory />
AllowOverride None
Order Deny,Allow
Deny from all
</Directory>

<Directory “/path/to/mu-wordpress”>
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>

# RedirectMatch 301 (*) http://xxx.domain.tld$1
LogLevel debug

</VirtualHost>

然 後接下來就可以直接從 SiteAdmin panel 開始 add user/add blog 了。因為我要轉的 blog 其實並不多且版本差異沒很大(最舊的也有 WP1.6) ,所以我直接用 export/import 的方式解決。如果沒有跟在 SVN 後面當白老鼠的,可能還沒有 import/export 功能怎麼辦?沒關係,有好心人幫我們做成了 「WordPress-to-WordPress Import Plugin」,不過如果你版本真的太舊,裝了 plugin 也不行的話,那看是先升級一下,或是直接從 DATABASE 裡面轉換囉。

值 得一提的是,一開始我 export 的檔案很大,大概快 5MB ,我還沾沾自喜說,哇,我真會寫,寫這麼多喔。後來 import一直死在奇怪的地方,才把 XML 打開看,才發現原來他會連 SK2 擋下來的 SPAM (只要還沒刪掉)一起 EXPORT ,於是如果先去 SK2 清一下然後再 EXPORT ,就只剩下 880kb 。在轉換過程中大至上順利,除了一開始又發生 table 的 charset 沒弄對的問題(看來還是得在 ports.conf 裡面強制把 mysql 預設成 UTF-8,我以為 5.x 預設就已經是了沒想到還跳回去 LATIN1),另外還有 cdst 上面那淫魔荒廢已久的 blog 一整個早就爛了,查一下才發現是「MySQL 5.0.15 亂碼」這篇提到的問題,處理一下也很順利完成。

最 後比較麻煩的部份是之前放在 uploads 目錄底下的檔案,雖然可以直接 cp 一份過來(丟到 wp-content/blogs.dir/ID裡面),不過網頁路徑要對應換成相對的「/files/2006/…」,一開始 inport 的時候沒發現,不然就在 xml 檔案裡面全部掃一次再匯入就好了。

至於以前很擔心的 plugin / theme倒是沒遇到很大的問題, K2 可以正常的使用,除了需要改一下下面這檔案以外:
Index: app/includes/info.php
===================================================================
— app/includes/info.php (revision 192)
+++ app/includes/info.php (working copy)
@@ -115,16 +115,17 @@
$posts_per = 1;
}

- if (strpos($wp_version, ‘2.1′) === false) {
+ if (strpos($wp_version, ‘2.1′) === false && strpos($wp_version, ‘mu’) ===false) {
$search = ‘/FROM\s+?(.*)\s+?GROUP BY/siU’; // Wordpress 2.0.x
} else {
$search = ‘/FROM\s+?(.*)\s+?ORDER BY/siU’; // Wordpress 2.1
}

另外,SK2 好像也正常,雖然說現在還沒看到 spam 進來 XD,剩下的就見招拆招囉。

喔 還有,我又惡搞了本來兩個很好看的 theme ,現在被我搞得不三不四噁心八啦,但是我還是不禁要念,為什麼可以這麼機車,同樣的語法在 IE 跟 Firefox 看的感覺就不一樣!一整個暴走之後只好祭出 try and error 大法亂調,所以現在就產生出這個很奇怪的東西出來啦。(沒辦法,原來的雖然好看但是我一整個完全無法接受 fixed width 的東西,所以又浪費了半天在搞 CSS)。

最後,因為暫時沒空去看 mu-wordpress 的 code ,所以我先把 blog.cookys.org 送 redirect 到這裡來了,還請多加包涵。

UPDATED: 剛剛晃了一下 Lyceum 官方網站 ,忽然瞭解為啥胸毛男的 pagerank 忽然變這麼高了。原來 Whatup 為 Lyceum 貢獻這麼多了,那沒去投靠免費技術支援好像是個錯誤的決定? XD。

2007年5月9日 星期三

could not listen on UDP socket: permission denied



自從家裡的老 server 爆炸,然後應爹娘要求儘速處理,於是展開移山倒海 shift 大法,把比較省電且輕巧的小白 (AM2 X2 3800+) 給帶回去暫時先把網路搶通後就沒空理他,今天上去一看發現 message 一直出現:
May 9 04:19:11 soul named[960]: could not listen on UDP socket: permission denied
May 9 04:19:11 soul named[960]: creating IPv4 interface tun0 failed; interface ignored
May 9 05:19:11 soul named[960]: could not listen on UDP socket: permission denied
May 9 05:19:11 soul named[960]: creating IPv4 interface tun0 failed; interface ignored
May 9 06:19:11 soul named[960]: could not listen on UDP socket: permission denied
May 9 06:19:11 soul named[960]: creating IPv4 interface tun0 failed; interface ignored
May 9 07:19:11 soul named[960]: could not listen on UDP socket: permission denied
May 9 07:19:11 soul named[960]: creating IPv4 interface tun0 failed; interface ignored
May 9 08:19:11 soul named[960]: could not listen on UDP socket: permission denied
May 9 08:19:11 soul named[960]: creating IPv4 interface tun0 failed; interface ignored
May 9 09:19:11 soul named[960]: could not listen on UDP socket: permission denied

詢問了 google 大神之後發現大概是 這麼一回事 ,所以就乖乖的照著 mac_portacl(4) 去把 kernel configuration 的 options MAC 加進去,然後到 /boot/loader.conf 加入 mac_portacl_load=”YES” 接著照著 handbook 的 example 依樣畫葫蘆塞進 sysctl security.mac.portacl.rules=uid:53:udp:53,uid:53:tcp:53 然後重新啟動囉。