網頁

2015年4月20日 星期一

合併多個 Subversion 成一個 Git

轉換成 Git 的方法可以看這篇,這篇其實是先轉成 git 後,然後用 git 合併起來

方法一:subtree add

git subtree add --prefix=DIR1 git://git.repo.1 master
git subtree add --prefix=DIR2 git://git.repo.2 master
git subtree add --prefix=DIR3 git://git.repo.3 master
git subtree add --prefix=DIR4 git://git.repo.4 master

這是最簡單快速的方法,如果不介意看到一個新增目錄的 commit 出現的話。

 參考:http://stackoverflow.com/questions/1425892/how-do-you-merge-two-git-repositories

方法二:cherry-pick

這個做法會改寫原來 repo 的歷史紀錄,所以先 clone 一份出來測試。
mkdir temp
cd temp
git svn clone svn://repo1/
git svn clone svn://repo2/
git clone /path/to/repo3
git clone /path/to/repo4
然後到每個 repo 裡去調整目錄,這裡最簡單的作法是把它搬到某個 dir 裡:
git filter-branch --index-filter 'git ls-files -s | perl -pe "s{\t\"?}{$&SUB_DIR/}" |GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info && if test -f "$GIT_INDEX_FILE.new"; then mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE; fi' HEAD
參考:

轉移 Subversion 到 Git

準備

安裝 git svn
pkg install git-subversion-2.3.5

建立對應的使用者列表

在 svn project 目錄下,轉出 author.txt
svn log --xml | grep author | sort -u | perl -pe 's/.*>(.*?)<.*/$1 = /' > author.txt
把 author.txt 轉換成需要的格式如下:
john = john 
foo = foo 
kevin = kevin 
johnny = johnny 

轉換 svn 到 git repo

 git svn clone --trunk=/ --no-metadata --authors-file=author.txt svn://svn.my.doman/SVN-REPO-NAME NEW-GIT-REPO.git
這裡強烈建議!強烈建議!強烈建議! 不要過 http_dav_svn,就算沒跑 svnserve ,設定一下跑起來不過是五分鐘以內的事,可以省掉很多奇怪的問題,尤其是當你是陳年的 repo 不知道裡面塞了什麼鬼東西的時候。
接下來砍站,把整個 repo 抓下來:
 git svn fetch 
如果你不聽話或是情非得已過 http_mod_dav 然後出錯了,那就重複跑到結束吧。

刪除過大檔案


現在 svn 已經成功的轉成 git 了,在 NEW-GIT-REPO.git,要把它丟上 github 了嗎?
先別急,先砍一砍裡面太肥的檔案吧。
Github 目前是超過 50 MB 會跳警告,大於 100 MB 會跳錯誤。
所以參考官方網站的說明,用 BFG 來砍最簡單:

安裝 jre

pkg install openjdk8-jre-8.40.25_3

下載 bfg

fetch http://repo1.maven.org/maven2/com/madgag/bfg/1.12.3/bfg-1.12.3.jar
java -jar bfg-1.12.3.jar --strip-blobs-bigger-than 50M NEW-GIT-REPO.git/
git reflog expire --expire=now --all && git gc --prune=now --aggressive

塞上 github

去 github 上面把專案開好,然後照他給的下:
git remote add origin git@github.com:myORG/myProjectDir.git
git push -u origin master

萬一還是太大

如果你看到
Counting objects: 82461, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (29301/29301), done.
remote: fatal: pack exceeds maximum allowed size
error: pack-objects died of signal 132.00 GiB | 2.53 MiB/s
代表這一次的 commit 還是超過大小,只好拆開來塞:這裡有教你這麼做:
git push -u origin HEAD~1000:refs/heads/master
git push -u origin HEAD~500:master
git push -u origin master
不過我的 revision range 語法一直看不懂所以我改成
git push -u origin 某個commit的hash:refs/heads/master
git push -u origin 另外某個commit的hash:master
git push -u origin master
因為 git push 後面給某個 commit 的意思是,把這個 commit 之前都 commit,所以分開塞就可以啦。 至於怎麼找這段呢,就:
git log --pretty=oneline
萬一你發現,連塞一個 commit 都不行的話,那就恭喜你啦!!!那個 commit 太大啦.... 想辦法把那個 commit 分解一下吧....



 參考資料


2015年4月8日 星期三

DDNS on FreeBSD 10

最近種花電信在特價推 300M/100M ,於是弄了台 Brix GB-BXBT-1900 來玩,對於這種小板子就是無法抗拒。題外話,在台中丟的是 GB-BXi3H-4010 質感跟大小跟功能贏很多,當然比較貴一點點,不過有兩組 sodimm 跟 msata + HDD 還比較小台,唯一要注意的是沒有 D-SUB。

家裡用的就沒特別去申請固定 IP ,然後種花電信又老奸巨猾, 100M 以上的故意不給請 PPPOE 配發的偽固定 IP。沒關係,沒做啥大事業,用 no-ip 搞定,結果沒想到第二天就 GG 了,根本就不知道配去哪根電線桿了,於是只好來自幹吧。

目標:client 可以透過 bind 的 dynamic update 機制自動向 dns server 更新自己的 ip 。

參考來源

做法:

Server:


pkg install bind910
mkdir -p /usr/local/etc/namedb/keys
cd /usr/local/etc/namedb/keys
產生所需密鑰
dnssec-keygen -b 512 -a HMAC-SHA512 -v 2 -n HOST my.domain.
vim /usr/local/etc/namedb/named.conf
key my.domain. {
        algorithm "HMAC-SHA512";
        secret "COPY FROM PRIVATE KEY";
};

zone "my.domain" {
        type master;
        file "../dynamic/zone.fwd.my.domain";
        also-notify { SLAVE_DNS_IP;};
        allow-transfer { SLAVE_DNS_IP;};
        allow-update{
                key my.domain;
        };
};

Client:

pkg install bind-tools
把 Server 產的 Key 想辦法(用SCP)送回 client
vim update.sh
#!/bin/sh
MYNS="host.my.domain"
NSSERVER="ns.my.domain"
KEY="KeyPATH.private"
NOW_IP=`ifconfig tun0 | grep inet | cut -d ' ' -f 2`;
OLD_IP=`nslookup -type=a $MYNS | tail -n 3 | grep Address | cut -d ' ' -f 2`;

if [ $OLD_IP != $NOW_IP ]
then
echo "update IP: $NOW_IP to DDNS Server"
echo "server $NSSERVER " >> /tmp/.ddns.$$
echo "update delete $MYNS. A " >> /tmp/.ddns.$$
echo "update add $MYNS. 30 A $NOW_IP" >> /tmp/.ddns.$$
echo "" >> /tmp/.ddns.$$
nsupdate -k $KEY < /tmp/.ddns.$$
rm /tmp/.ddns.$$
fi
exit 0
然後 vim /etc/ppp/ppp.linkup 
HiNET:
  !bg /PATH_TO_THE_SCRIPT/updatens.sh
當中 HiNET 是 /etc/ppp/ppp.conf 裡面對應的 Label 搞定收工。

2014年12月31日 星期三

讓 OSX 下的 smbd follow symbolic links

在 /System/Library/LaunchDaemons/com.apple.smbd.plist 加上

        /usr/sbin/smbd
        -no-symlinks  

然後
$sudo launchctl unload  /System/Library/LaunchDaemons/com.apple.smbd.plist
$sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.smbd.plist

2014年12月5日 星期五

在 OSX 下面開 samba

照著說明手冊沿路開一開會發現沒辦法選 user ,也無法 smbpasswd -a 所以找了一下。
連這種東西都需要密技的阿。

pwpolicy -u SomeUser -sethashtypes SMB-NT on
dscl . -passwd /Users/SomeUser "UserPassword"

來源

2014年11月27日 星期四

OSX 下的 ls color

灰白的世界令人不喜悅。
 所以加點顏色吧,已經習慣的配色,假設有換 csh 在 .cshrc 裡面加上
        setenv CLICOLOR 1
        setenv LSCOLORS ExGxFxdxCxDxDxBxBxExEx

2014年11月17日 星期一

在 OSX 上開機後自動啟動 vs-mda-remote

本來想得很簡單,應該是 /etc/rc.local 寫一下就好了沒想到還要轉一個大彎去用 launchd。

其實也不難,只是要翻一下文件跟範例,有需要的就笑納吧。
新增 /Library/LaunchDaemons/vs-mda-remote.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key><string>VsMdaAgent</string>
    <key>ProgramArguments</key>
        <array>
        <string>/usr/local/bin/node</string>
        <string>/usr/local/bin/vs-mda-remote</string>
        <string>--secure</string>
        <string>false</string>
        <string>--serverDir</string>
        <string>/Users/VsMdaAgent/remote-builds/builds</string>
        </array>
    <key>KeepAlive</key><true>
    <key>LaunchOnlyOnce</key><true>
    <key>UserName</key><string>VsMdaAgent</string>
  </dict>
</plist>
然後測試一下:
啟動
launchctl load -F /Library/LaunchDaemons/tw.com.skymirror.vs-mda-remote.plist
停止
launchctl load -F /Library/LaunchDaemons/tw.com.skymirror.vs-mda-remote.plist
看一下 /var/log/system.log 有沒有錯誤訊息,然後 netstat -an |grep 3000 看有沒有跑起來。重開看看運作正不正常。

2014年11月4日 星期二

Mac mini server 2010 上 16G

最近因為工作需要,回去把之前塵封已久的 Mac mini server 2010 拿出來重新整理。

把主系統碟換上 SSD ,然後順便找了 16G (8G*2) 的 RAM 來換。

結果沒想到 2011 可以用的 DDR3-1333 8G 裝上之後竟然是給逼逼逼。 但是裝一條卻能正常抓到 DDR3 1333 * 8G ,一整個很詭異。 排列組合下,插 8G(1333)+4G(1066),有時候是抓到 1333 8G 有時候是抓到 1066 12G ,就想是不是因為 > 8G 跑 1333 會有問題。 然後不小心看到 這篇 所以就用了 Taiphoon burner 把其中一條的頻率降成 1066,果然就搞定收工了。

這麼說來,其實好像不太需要特別買 for apple 的,只要知道參數自己買時價的 memory 燒一燒就好了 (?)

2014年10月20日 星期一

升級到 ruby 2.1 遇到 could not find a temporary directory

如果在升級 ruby 到 2.1 之後撞到這種錯誤訊息:
/usr/local/lib/ruby/2.1/tmpdir.rb:34:in `tmpdir': could not find a temporary directory (ArgumentError)
就把 /tmp 的 Sticky bit 加上去吧
chmod +t /tmp
最近怎麼老是被 server 咬呢 :~~

2014年10月15日 星期三

FreeBSD 上 uwsgi 的 Ruby plugin

卡了一下,發現他其實不會編出 rack_plugin.so ,老闆說他是參考這篇做的,所以簡單說就是:

cd /usr/ports/www/uwsgi
make patch
vim work/uwsgi-2.0.7/buildconf/default.ini
make install clean
這樣 uwsgi 就可以用 rack 惹
default.ini 目前長這樣:
[uwsgi]
main_plugin = python,rack,gevent
inherit = base

2014年7月31日 星期四

解決 redmine 透過 sendmail 送信結果被 google 擋掉的方法

本來是照著 redmine 官方的這篇 EmailConfiguration 做設定,後來不知道又為什麼死掉了,不小心看到直接把 sendmail 換成  SecureSSMTP 的方法,就做個紀錄。

從 redmine 的設定將 E-Mail 用 Google Apps 寄出:
  
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      enable_starttls_auto: true
      address: "smtp.gmail.com"
      port: 587
      domain: "your.domain"
      authentication: :plain
      user_name: "youraccount@your.domain"
      password: "yourpassword"

中間有個小插曲,因為 configuration.yml 的設定不可以用 tab ,而且有前後順序的問題,寫在上面的 production: 就是不會動,後來搬到 default: 裡面就好了。有遇到神秘現象的朋友可以看看是不是這問題。

一勞永逸直接把 sendmail 換成 SSMTP 之後設定檔改成這樣:
  
  email_delivery:
    delivery_method: :sendmail
    sendmail_settings:
      arguments: '-i'
後看一看 maillog 有這常運作的話就可以收工了。 這樣總不會又被 google 把信丟到黑洞裡去了吧.....。

2014年7月29日 星期二

解決 pkg 在舊版 FreeBSD 會 No valid repository found 的問題

如果 FreeBSD 版本比較舊(這裡遇到的狀況是 9.2),就算裝了最新的 pkg 還是會吐 No valid repository found ,這時候就要:
mkdir -p /usr/local/etc/pkg/repos
vim /usr/local/etc/pkg/repos/FreeBSD.conf

---
FreeBSD: {
  url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
  mirror_type: "srv",
  enabled: yes
}
---
然後就可以愉快的使用 pkg 了。

ref: here

2014年7月17日 星期四

Upgrade FreeBSD to 9.3-RELEASE

當一個剛被放出來的笨蛋總要複習一下,乖乖地看 Release NoteHandBook
  • 升級現有 9.1 到 9.3
    freebsd-update upgrade -r 9.3-RELEASE
    freebsd-update install
    
  • 更新 portmaster / pkg
    portmaster portmaster pkg
  • 更新所有套件
    portmaster -a
  • 要注意的是 redmine 在更新的時候出現 ASCII-8BIT TO UTF-8 的問題,是因為偷懶直接用舊的設定檔。升級到 2.5.2 之後的 database adaptor 要換成 mysql2。

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 了。