2011年6月9日 星期四

[Linux] 安裝 PostgreSQL、PostGIS 和 pgRouting @ Ubuntu 10.04

上一次用 PostgreSQL 已經是一年多前了,那時是研究 HadoopDB 啦。


最近要使用 PostgreSQL 都忘光光了,就順便再筆記一次,這次用到一些跟圖資相關的 plugin,搞得有點久,果然隔行如隔山啊。


參考資料:


Installing PostgreSQL 8.4, PostGIS 1.4.1, and pgRouting 1.0.3 on Ubuntu 9.10 (Karmic Koala)


Installation - Open Source Routing Library


安裝環境:


Ubuntu 10.04 server 64-bit


流程:


安裝相關環境,雖然只是一道指令,但裝了非常多東西,下載都要一陣子


$ sudo apt-get install postgresql postgresql-server-dev-8.4 postgis proj libgeos-dev libboost-graph-dev libcgal-dev cmake build-essential postgresql-8.4-postgis


安裝 The Genetic Algorithm Utility Library (GAUL)


下載 gaul-devel-0.1849-0.tar.gz


$ tar -xvf gaul-devel-0.1849-0.tar.gz
$ cd gaul-devel-0.1849-0
$ ./configure --disable-slang
$ sudo make install


安裝 pgRouting


$ wget http://download.osgeo.org/pgrouting/source/pgrouting-1.05.tar.gz
$ tar -xvf pgrouting-1.05.tar.gz
$ cd pgrouting-1.05
$ cmake -DWITH_TSP=ON -DWITH_DD=ON .
$ sudo make install


設定相關環境(非必要):


解決 ERROR:  could not load library "/usr/lib/postgresql/8.4/lib/librouting_tsp.so": libgaul.so.0: cannot open shared object file: No such file or directory 問題


$ sudo vim /etc/ld.so.conf.d/libgaul.conf
/usr/local/lib/
$ sudo ldconfig


調整 psql 使用權限,讓 192.168.x.x 連進來的可以不作權限確認


$ sudo vim /etc/postgresql/8.4/main/pg_hba.conf

# IPv4 local connections:
host    all         all         127.0.0.1/32          md5
#host    all         all         127.0.0.1/32          password  
host    all         all         192.168.0.0/16        trust


使用範例:


$ createdb -U postgres -E UNICODE template_postgis
$ createlang -U postgres -d template_postgis plpgsql
$ psql -U postgres template_postgis < /usr/share/postgresql/8.4/contrib/postgis.sql
$ psql -U postgres template_postgis < /usr/share/postgresql/8.4/contrib/spatial_ref_sys.sql
$ psql -U postgres -c "SELECT postgis_lib_version();" template_postgis
 postgis_lib_version 
---------------------
 1.4.0
(1 row)
 
$ createdb -U postgres -E UNICODE -T template_postgis mydb
$ psql -U postgres mydb < /usr/share/postlbs/routing_core.sql 
$ psql -U postgres mydb < /usr/share/postlbs/routing_core_wrappers.sql 
$ psql -U postgres mydb < /usr/share/postlbs/routing_topology.sql 
$ psql -U postgres mydb < /usr/share/postlbs/routing_tsp.sql 
$ psql -U postgres mydb < /usr/share/postlbs/routing_tsp_wrappers.sql


iPhone app 購買紀錄、查詢已買過的程式

iTunes Updates iTunes Purchased


記得很早以前,凡事下載過的 app 都會收到 Apple 寄來的信件通知,可以用來當做記錄,但過了一陣子變成只有付費過的軟體,最後,變成查詢之前已購買的程式,是透過 iTunes 軟體對指定的 app 進行 review ,如果可以寫評論,代表已經買過,但這種作法真的很累。


今天無意間開起 iPod touch 時,看到 iTunes 顯示 Updates 資訊,點入後發現有 Purchased 清單!真是太好了,看來是跟 iCloud 的此服務的公開有關。如此一來我就不用像以前那樣苦命記錄 - 好用的、免費的或曾經限時免費過的 iPhone App。


2011年6月3日 星期五

當自己的伯樂

20110509-sunny


晚餐在一間充滿高中生的麵店,從高中生口中才得知,原來暑假就快到了!最近一直跟著手邊的計畫進度跑啊跑,差點忘了夏天就要到來。壅塞的列車上,聽著一群人正準備去屏東玩呢,口中還談論著前陣子去泰國玩的點滴,無意間聽到它們的對話內容,其實年紀跟我差不多大,工作也在竹科呢,倒是生活規畫的不錯,遊山玩水。


這周有幸參加一場聚會,算是第一次真的接觸美商而不是看看別人在台上報告。瞧瞧以前認識的學長找到了伯樂的喜悅,很讚,還有會場人脈間的緣分跟八卦。隨後在信件一來一往中,讓我回想起不少事情。


我身邊也有一位學弟正準備踏出社會,倒也對未來的不確定性,迷網、擔憂,其實,我也何嘗不是如此呢?子曰,三十而立、四十而不惑,前者不難達成,倒是資訊的流通想要不惑很難。


起初接觸美商的心情,有點被成員的背景與對學長的崇拜影響,我一開始還滿擔憂,因為找不到任何切入的角色參與聚會,論身分沒身分,論技術沒技術 XD 到了會場附近,反而是跟守衛閒聊時,才開始覺得就把它當作朋友間的聚會吧,說真的,玩 RPG 還滿有用的,到酒館、聚會場逛逛聊聊,有助於對環境的了解喔。所以啊,倒是換個角度去了解創業中的公司。什麼美商不美商,並不是重點。


創業,我的認知有兩種模式,一種是以最少的錢成立公司,接著擔憂著水庫水位開始游擊戰撐過去,往後有錢了再想其他好玩的事,另一種則是跟別人要了一大筆錢,至少夠一年或兩年的研發。恰好我待的公司算是靠近後者,以計畫為單位,卻必須想辦法讓上頭的人買單,才可以做自己想做的事。


最後有感,其實也存在另一種創業叫做投資自己,就像設法讓公司的價值上升,投資自己則是讓自身價值增加,而價值絕對不只有金錢可以衡量。在這樣的情境下就不會陷入迷惘或空轉的生活了,並且生活不只是賺錢,還可以是為親人、家庭、寵物甚至社會喔。我想,我腦袋終於比較清楚了!別老是囔囔著創業或是對別人投以羨慕眼光,想辦法把握現有資源並妥善使用,別忘了自己也是個能加值的場域,加油吧!創業不是喊喊口號的,想像個老闆招攬著人才前,先把自己的能力提升吧。


啊,忘了一提,這次聚會的另一個技術觀點,那就是做服務絕對不要一直想著新技術的 spec ,有時設法脫離新技術甚至違反也沒關係的,對使用者來說,方便遠勝於高超的技術。這也是我在此次聚會上最大的收穫。


2011年5月29日 星期日

找到船長了嗎?還是要自告奮勇呢?


上周看到海賊王的動畫劇情,魯夫跟艾斯小時候的故事,恰好談到關於大家都想當船長的事,最後則是碰到一位老船長,道述著船長,是一種讓大家想要跟著他的人。並不是強硬出來誰要當船長就能當得上的。


最近常閒聊收集資料,如果船長當作創業來說,在大公司當船員所獲得的並不會少於自己當船長出來闖蕩時,那還有什麼理由想當船長呢?因為只想做自己想做的事嗎?我覺得這樣的念頭還不太夠。例如創業時,發現自己的構想實踐後無法立足於大海時,這時候不就會變相去找其他支持航海的資源,例如接 case 做事等,那不就久而久之又變成去幫別人做事,而不是自己真的想做的事,甚至習慣於這類利益收穫而迷失自我呢?


船長啊,真的是不可強求的。目前讓我想到的是碩班老闆,每次個人 meeting 後,談完都會莫名地被打氣一般,或許這就是一種霸氣吧!出社會後,反而比較常看到別人如何推拖、選擇,鮮少那種彼此鼓舞的場景,剩下的大概是八卦的分享或是洗腦吧 XD


草帽海賊團,成員彼此的目標不同,但如果能找到一種方式共同付出與收成,那就真的是太棒了,碰到的話,真的要珍惜。



Android 開發筆記 - 使用 Facebook SDK

android-fb


在 Android 上使用 Facebook SDK 比在 iOS 上麻煩了一點,也算是安全性在高了一點點。


相關資料:



細節:


所有操作流程可以在 Facebok Developer - Mobile Apps 找到。發布 Android apk 時,將拿著一把鑰匙進行簽名的動作,因此在 Facebook Developer 頁面上,可以填寫用哪一把 key 作簽名,代表只有使用此把 key 簽名的 app 才能使用你的 Facebook api key 進行存取。


例如 OAuth 的使用是要有一對 key-pair 的,使用時一把擺在 server site ,另一把擺在 client 端使用,但要用在 Mobile 端時就會很不安全,因為兩把 key 都會寫在 app 裡,變相就是都存在 client 端。以 iOS 來說,雖然編譯的成果是 binary 檔案,但用特殊工具還是可以設法找到字串,不一會兒兩把 key 就被拿到了!至於Android 上可以參考 Android 開發教學筆記 - 關於反組譯 Android 程式,還真的不用 30 秒就搞定!只需幾個步驟就把 apk 檔打開將程式碼看個清楚了,更別說兩把 key 在哪 XD


在 Facebook 上頭,對 Android 來說,需使用簽署 apk 的資訊跟 Facebook api key 共兩個資訊,在 iOS 則是使用 Facebook api key 而已。在 app 裡存放 facebook api key 的缺點是存在被別人盜用的機會,所以在 Android 上算是相對安全一點點點點,因為還包含簽署的 apk 資訊。


所需的軟體:



流程:


開啟 Eclipse 後,先把下載的 facebook-android-sdk 匯入


[File] -> [New] -> [Projeect] -> [Android Project] -> Create project from existing source ,此例是  C:\facebook-facebook-android-sdk-5d44d0c\facebook ,並按 Finish 結束


facebok_sdk_lib


建立 FB Test Project,版本應該可以隨意,在此使用 Android 2.2 版:


fb_test


並且設定編譯時使用 facebook-android-sdk:


點選 Project 後,選 [Project] -> [Properties] -> [Android] -> [Library] -> 透過 Add 新增 com_facebook_android


com_facebook_sdk


撰寫相關測試的程式碼:


package com.test.fb;

import android.app.Activity;
import android.os.Bundle;
import com.facebook.android.*;
import com.facebook.android.Facebook.*;


public class FB extends Activity {
    private Facebook facebook = new Facebook("Your_Facebook_API_Key");
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        facebook.authorize( this, new DialogListener(){
@Override
public void onComplete(Bundle values) {
// TODO Auto-generated method stub
}
@Override
public void onFacebookError(FacebookError e) {
// TODO Auto-generated method stub
}
@Override
public void onError(DialogError e) {
// TODO Auto-generated method stub
}
@Override
public void onCancel() {
// TODO Auto-generated method stub
}
        });

    }
}


設定 AndroidManifest.xml 新增 android.permission.INTERNET 權限:


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.test.fb"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".FB"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>


上述就是程式碼的設定部分,只是編譯完跑在模擬器上,只會顯示一下下 Loading 的頁面,就結束了,主因是還未設定對應的 key:


facebook_test_not_ready


接著進行設定 Facebook API Key 的使用,須到 Facebook Developer 頁面上,對你自己新增的 Facebook App 新增 Android Hash Key:


facebook_key_hash


至於新增 Android Hash Key 的方式,主要參考簽署 apk 所用的 key ,假設沒有特別設定,那預設數值可以在 Eclipse -> [Windpw] -> [Preferences] -> [Build] 查看到 Default debug keystore 資訊,預設是在 C:\Users\id\.android\debug.keystore 位置 (Win 7) ,並且在 Signing Your Applications | Android Developers 可得知預設的資訊:


Keystore name: "debug.keystore"
Keystore password: "android"
Key alias: "androiddebugkey"
Key password: "android"
CN: "CN=Android Debug,O=Android,C=US"


所以,接著須要使用 kyetool 和 openssl 來建立 Android Hash Key 啦,我把 openssl 解壓縮在 C:\openssl\bin\openssl.exe 裡頭,連續動作:


"C:\Program Files\Java\jdk1.6.0_25\bin\keytool.exe" -exportcert -alias androiddebugkey -keystore C:\Users\id\.android\debug.keystore | | C:\openssl\bin\openssl.exe sha1 -binary | C:\openssl\bin\openssl.exe base64


輸入 keystore 密碼:android


就會產生一組 Android Hash Key,例如 dsfDFjakldEajdlfad+ha783j4g= 這種訊息,把它填入 Facebook App 之 Android Hash Key 欄位即可。


補充一下,如果你使用的 keystore 是自己產生的,那請自行更改對應的位置,以及使用 Custom debug keystore 吧( Eclipse -> [Windpw] -> [Preferences] -> [Build] ),不然就是建立 Android apk 時,改成手動簽名,相關資訊:


建立自己的 apk-key:


"C:\Program Files\Java\jdk1.6.0_25\bin\keytool.exe" -genkey -v -keystore C:\Path\your-apk-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000


並填寫相關資訊


手動 apk 簽名:


"C:\Program Files\Java\jdk1.6.0_25\bin\jarsigner.exe" -verbose -keystore C:\Path\your-apk-key.keystore C:\Users\id\workspace\YourProject\bin\YourProject.apk your_alias_name


手動安裝 apk:


"C:\Program Files (x86)\Android\android-sdk\platform-tools" install C:\Users\id\workspace\YourProject\bin\YourProject.apk


若軟體已存在,則使用 -r 指令重裝:


"C:\Program Files (x86)\Android\android-sdk\platform-tools" install -r C:\Users\id\workspace\YourProject\bin\YourProject.apk


最後,如果運行的結果還是沒有呈現出來,請參考 Android 開發教學筆記 - 模擬器無法建立網路連線 這篇,去新增 dns-server 資訊。可以在 onError 裡,使用 TextView 把錯誤訊息印出來:


com.facebook.android.DialogError: The Connection to the server was unsuccessful.


fb test error