Thursday, November 27, 2008

Android Plugin in Netbeans 6.5

Android for Netbeans 的 plugin 終於出現了,雖然 Android 官方網站只推出支援 eclipse 的 plugin ,但畢竟 Netbeans 也越來越多人使用,Google 應該也推出 Netbeans 的 plugin 才對,可能是 resource 不夠吧。

目前的 release 版本只能算是 beta 版,因為在 Linux 此 plugin 運作沒有問題,但在 Windows 上還要做些微的修改才能順利的使用此 plugin。以下為使用此 plugin 的步驟

1. 安裝 IDE 與 Android SDK 軟體
下載 NetBeans 6.5 並安裝到 d:\Java\NetBeans 6.5
下載 Android Windows SDK 並安裝到 d:\Java\android-sdk-windows-1.0_r1

2. 安裝 Android plugin
啟動 NetBeans 6.5,點選 Tools > Plugins > Settings > Add
















然後在 dialog 加入 nbandroid 的 URL http://kenai.com/downloads/nbandroid/updates.xml









這時候可以在 Available-plugin 中找到 Android 的 plugin 並按 Install 安裝
















3. Hello Word, Android
既然 plugin 裝好了,就順便寫一個初學者最常用的程式 Hello World。在 NetBeans 中按
File > New Project > Android > Android Application

















按 Next 會出現 New Android Application 的畫面,在此畫面,請填入如下畫面
















在畫面下面可以看見紅字部份,此部份是因為尚未設定 Android Platform 的關係,此時可以按 Manage Platforms > Add Platform... 來新增 Android Platform

















點選 Google Android Open Handheld Platform 按 Next,
在 Platform folder 選擇 d:\Java\android-sdk-windows-1.0_r1 後按 Next















按 Next 後,出現 Platform 的命名,在 Name 上用預設值按 Finish,Android Platform 便可新增完成

















按 Close 後,返回 New Android Application 後,Android Platform 會自動選擇

















按 Finish 後,就可以開始寫 Android 的 Hello World 程式了















將 Todo 那一行換成以下三行
TextView tv = new TextView(this);
tv.setText("Hello World, Android");
setContentView(tv);

PS : 請記得 import android.widget.TextView;

此時按 Run 會發現模擬器雖然跑出來了,但並不會將 Hello World deploy 到模擬器中
























這是因為此 plug in 有一個 bug,要修正此 bug ,可以手動修改 D:\projects\HelloAndroid\nbproject\build-impl.xml 檔將 line 466~468 換成以下內容





然後再按 Run ,便可以出現剛剛寫的 Hellow World, Android 畫面























4. 更改 skin
若想試試不同的 Android skin ,可以在 D:\projects\HelloAndroid\build.xml 中增加一個 property 去設定要用的 screen.skin 為何,在此我用的 skin 為 QVGA-P



則模擬器會出現 QVGA-L 型號的畫面
























PS : 寫此 blog 時,此 plug in 的修正尚未 publish

Monday, November 24, 2008

在 Ubuntu 8.10 安裝 apache 2.2 + ssl

# apt-get install apache2 openssl ssl-cert
# openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/apache.pem -keyout /etc/apache2/apache.pem
-----------
Country Name (2 letter code) [AU]:GB
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:London
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Debian
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:
Email Address []:
-----------

# chmod 600 /etc/apache2/apache.pem

# cd /etc/apache2/mods-enabled/
# ln -s ../mods-available/ssl.* .
# cd /etc/apache2/site-enabled/
# ln -s ../site-available/default-ssl .

modify ports.conf and add
LISTEN 443

NameVirtualHost *:443

# /etc/init.d/apache2 restart

Sunday, November 23, 2008

修理 nm-applet 在 ubuntu 8.10 無法顯示

安裝完 ubuntu 8.10 desktop 後,右上角的 network icon 不見了,經搜尋後,需經下列步驟的修正才能解決問題

1. 修改 /etc/dbus-1/system.d/NetworkManager.conf 和 /etc/dbus-1/system.d/nm-applet.conf 將 deny,改allow






2. 重新啟動 dbus
sudo /etc/init.d/dbus restart

3. 停止 NetworkManager
sudo /etc/init.d/NetworkManager stop

4. 刪除 /etc/network/interfaces 或是更名(rename)
sudo rm /etc/network/interfaces

5. 重新啟動 NetworkManager
sudo /etc/init.d/NetworkManager start

6. 重新登入

Thursday, November 20, 2008

黑鴉鴉的庫存 (工程師的思維)

身為一個工程師,並不容易了解庫存有多麼恐怖,因為我們看不到庫存數字與庫存價格,但我們往往是庫存的始作俑者,而一旦有了庫存,可以用來營運週轉的現金就會被咬住,如果沒有警覺,公司可能就快速進入慘澹狀況。

電影《當幸福來敲門》中,主角花光所有的積蓄買了「骨質疏鬆掃描儀」,然而機器賣得並不理想,幾乎一臺也賣不出去,後來主角甚至淪落到老婆跑了,付不出房租,只能帶著兒子在地鐵的廁所洗澡的困境。
看著這樣真人實事改編的電影,劇情可能很感人,但是主角一開始的悲慘命運卻很嚇人,不知道觀眾是否能深刻體會賣不出去的庫存所帶來的壓力,現實業界卻每天都上演著這樣嚇人的事情。常常聽人家說,神仙也賣不掉的是庫存,當公司開始堆積庫存,代表的是現金被積壓了,而且,也常常是惡夢的開始。

身為一個工程師,並不容易了解庫存有多麼恐怖,因為我們看不到庫存數字與庫存價格,但我們往往是庫存的始作俑者。有很多公司,研發單位做了產品,還沒有好好驗證,就開始出貨銷售,結果賣不出去變成庫存。也有的狀況是,研發出的東西沒有競爭力,或者一邊量產一邊修改,導致很多料件堆放在倉庫裡面也沒有人想起來,這筆錢就算是損失了。我曾經請教過一個學長,該怎樣教育研發人員降低庫存、減少呆料?學長說,首先要建立正確的庫存編碼方式,讓工程人員在設計的剛開始就查詢共用的零件,同時設計的產品中,能讓零件統一、共用,盡量讓每個研發人員使用的零件都相同,而不要各有各的習慣,這些講起來都是細節,我個人覺得總歸一句話──「就是要讓複雜的零件種類簡化」。

很多事情,在研發人員一個起心動念之下就會完全不一樣。有個朋友在一家以成本超低著名的公司上班,有一次剛好遇見他正在跟工程師討論新產品的電路設計,他很得意地跟我說,原本的設計需要用到70項零件種類,在他詳細比對,並且將該設計裡面可以使用統一規格的零件,都用同一規格取代之後,零件種類降低為50種。

我想不出這有什麼好得意的,他只好耐心解釋:「每一種零件,都是要量大價格才會低,如果我能把料件統一使用公司裡面量大的規格,或者因為統一料件之後讓該料件的採購數量放大,就可以大幅壓低成本!另外,統一之後也可以減少量產失誤、庫存雜亂、進貨複雜度等問題。」以前帶過我的前輩常常說:「好的研發人員,讓複雜的事情變簡單」,我漸漸明白其中的道理了。產品一開始設計的時候,如果沒有考慮以上細節,後面就會拉出一長串越來越複雜的人力物力,這些都是額外的時間與成本。

課堂上教授曾經問過,如果有一天,你想要買下一個工廠,那麼第一件事情你應該要看什麼?答案就是看庫存,因為那是企業經營好壞,文化優劣的第一表徵。但是,庫存並非全然不好,有些長輩反而因為累積了庫存,為了消化這些零件,逼得他們拼命去想、去找、去問,最後竟然成功開拓出商機,雖然那些庫存可能還是沒有賣出去,但是卻讓他們賺到遠超過那些庫存價值的財富。就像很多債臺高築,卻不輕言放棄的人,負債的壓力反而成為他們奮鬥的原動力,最後不僅還清債務,還賺到了新的人生。但這其實只是少數的特例。

時間拖得越久,庫存的實際價值會呈幾何級數遞減,尤其是高科技產業,新的產品不斷推出,倉庫裡的東西很快就失去價值。

我曾經有機會陪朋友去倒閉的公司倉庫搬貨,我的第一印象是,整個倉庫黑鴉鴉的都是過時的零件和零散量產尾數,我們找了半天,都找不到有價值的東西。那時候我朋友說,你知道這個倉庫裡面這些垃圾帳面價值是多少嗎?他伸出五個手指頭,五億,你信不信?不管我信不信,實際的價值可能連五萬都不到。

既然庫存這麼可怕,為什麼還會有庫存?除了研發人員沒有將各類設計好好統一整理整頓之外,經營者的內控也大有問題──量產剩餘的尾數料件沒有歸回原位,產品的編號錯亂,同一種零件有好幾種編號,更可怕的是做到一半的半成品亂堆,沒有人知道該怎樣處理。當我們眼中只有看到訂單,卻沒有看到品質,或者只想著擴充,忽略掉驗證,套一句老人家的話:就是貪心。

「誰想要這樣?還不都是被騙的!」雖然說被人家騙,買了貨客戶卻取消訂單,但是如果這個產品夠好,其實也不愁賣不掉吧?如果當初有考慮到公司的體質,不好的交易條件無法接受,也就不用硬吞吧?我們都想讓公司上市上櫃賺很多錢,但是在這之前需要思考公司的口袋有多深?各個環節是否能認真思考把事情變簡單?

一旦有了庫存,可以用來營運週轉的現金就會被咬住,如果沒有警覺,難免就落入惡性循環直到財務出現狀況。只是看報表是不會有感覺的,有空常去倉庫走走,翻翻那些塵封的零件,心理一定會有感觸的。

要體驗庫存的壓力很簡單,去五分埔買一些衣服到網路上去賣,殺價競爭與賣不出去的焦急感很快就來到,即使對你而言衣服可能只是不到1, 000元的投資。但是倉庫那些黑鴉鴉的庫存,至少都是百萬千萬的損失呢!

參考連結
http://www.ithome.com.tw/itadm/article.php?c=52063

Tips for Ubuntu Server Configuration

1. Change computer name
step 1. modify /etc/hostname
step 2. modify /etc/hosts

PS : If /etc/hosts is not modified, X windows will have trouble.

Wednesday, November 19, 2008

讓裝過 desktop 的 Ubuntu Server 啟動進入 console mode

1. 新增一個檔案 /etc/inittab 內容如下
id:3:initdefault:

2. 更改啟動服務
$ mv /etc/rc2.d/S30gdm /etc/rc2.d/K30gdm

Tuesday, November 18, 2008

在 Ubuntu 8.10 安裝 Oracle 11g

最近因買了一台 Core Duo 2 的 notebook, 於是就分割了一塊硬碟區域裝 Ubuntu 8.10 版本,至於為何會裝 8.10 版, 因為它的 kernel 支援我的無限網卡, 完全不用再安裝其他軟體

在台灣, 最常用的 database 就是 mssql, oracle, mysql。 在 linux 下安裝 mssql 是不可能的事,除非用 VM 去模擬 Windows 環境。 看了一下 Oracle 的安裝手冊,全部都是英文的,於是想在安裝的時候順便把過程用中文寫下來,便於日後參考。安裝步驟如下

1. 下載 oracle 11g 版本 (安裝版本為 linux_11gR1_database_1013.zip),這裡需提醒你必須要註冊成為 oracle 的使用者才能下載,註冊是免費的

2. 用 root 進入
$ sudo su -

2. 安裝額外的 package 給 oracle 用
# apt-get install gcc make binutils gawk x11-utils rpm alien ksh lsb-rpm

3. 因為 Ubuntu 的預設 shell 是 sh,需改成 bash
# ln -sf /bin/bash /bin/sh
# ls -l /bin/sh

3. 建立群組與使用者
# addgroup oinstall
# addgroup dba
# addgroup nobody
# usermod -g nobody nobody
# useradd -g oinstall -G dba -p password -d /home/oracle -s /bin/bash oracle
# mkdir /home/oracle
# chown -R oracle:dba /home/oracle
# ln -s /usr/bin/awk /bin/awk
# ln -s /usr/bin/rpm /bin/rpm
# ln -s /usr/bin/basename /bin/basename
# mkdir /etc/rc.d
# for i in 0 1 2 3 4 5 6 S ; do ln -s /etc/rc$i.d /etc/rc.d/rc$i.d ; done

4. 建立 Oracle 專用目錄
# mkdir -p /u01/app/oracle
# chown -R oracle:dba /u01

. 解壓縮 linux_11gR1_database_1013.zip 到 /u01 下


6. 加入以下參數到 /etc/sysctl.conf
fs.file-max = 65535
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 1024 65535
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 262144


7. 將下列參數加到 /etc/security/limits.conf
oracle soft nproc 2047
oracle hard nproc 16383
oracle soft nofile 1023
oracle hard nofile 65535

8. 將下列參數加到 /etc/pam.d/login
session required /lib/security/pam_limits.so
session required pam_limits.so

9. 重新啟動 Ubuntu Server 開機

10. 先用 oracle 登入後,執行以下命令以安裝 11g。因不支援 zh_TW:UTF-8 的語系,必需先改成 zh_TW:Big5 在執行安裝程式
$ cd /u01/database
$ export LANG=zh_TW:Big5
$ ./runInstaller -ignoreSysPrereqs

11. 這時候英文版的安裝畫面會出現,繼續執行安裝
Next >> Operating System group name = dba >> Standard Edtion >>
Name=oraubuntu, Location /u01/app/oracle/product/11.1.0/oraubuntu

12. 畫面跳到檢查系統需求,這時候將所有的 check box 勾選成 user verified.

13. 按 Next 繼續,然後選擇 "Install Software Only"

14. 按 Next 繼續,將所有 group 選 "dba"

15. 按 Next 繼續,再按 Install 開始正式安裝

16. 經過兩杯 coffee 時間,終於出現下一個畫面,安裝程式需要你用 root 執行兩個 script 分別為
/u01/app/orsInventory/orainstRoot.sh
/u01/app/oracle/product/11.1.0/oraubuntu/root.sh

17. 用 root 執行完這兩個 script 後按 OK,整個安裝就算完成了

18. 此時只有安裝完 oracle ,但尚未建立資料庫,在建立資料庫之前,必須先安裝幾個 package 再建立資料庫
# apt-get install libaio1 lesstif2 libmotif3

19. 用 root 建立 script 以便在開機時啟動 oracle 資料庫
# cat /etc/init.d/oracledb
===============================================================
#!/bin/bash
#
# /etc/init.d/oracledb
#
# Run-level Startup script for the Oracle Listener and Instances
# It relies on the information on /etc/oratab

export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/11.1.0/oraubuntu
export ORACLE_OWNR=oracle
export PATH=$PATH:$ORACLE_HOME/bin

if [ ! -f $ORACLE_HOME/bin/dbstart -o ! -d $ORACLE_HOME ]
then
echo "Oracle startup: cannot start"
exit 1
fi

case "$1" in
start)
# Oracle listener and instance startup
echo -n "Starting Oracle: "
su $ORACLE_OWNR -c "$ORACLE_HOME/bin/lsnrctl start"
su $ORACLE_OWNR -c "$ORACLE_HOME/bin/dbstart $ORACLE_HOME"
touch /var/lock/oracle
echo "OK"
;;
stop)
# Oracle listener and instance shutdown
echo -n "Shutdown Oracle: "
su $ORACLE_OWNR -c "$ORACLE_HOME/bin/lsnrctl stop"
su $ORACLE_OWNR -c "$ORACLE_HOME/bin/dbshut $ORACLE_HOME"
rm -f /var/lock/oracle
echo "OK"
;;
reload|restart)
$0 stop
$0 start
;;
*)
echo "Usage: `basename $0` start|stop|restart|reload"
exit 1
esac

exit 0
=======================================================================
# chmod a+x /etc/init.d/oracledb
# update-rc.d oracledb defaults 99

20. 用 oracle 開始建立資料庫
$ export ORACLE_HOME=/u01/app/oracle/product/11.1.0/oraibex
$ export PATH=$PATH:/u01/app/oracle/product/11.1.0/oraibex/bin
$ dbca

21. 接下來按 Next >> "Create Database", Next >> Next

22. Global Database Name : vmid , SID : vmid

23. 不要選擇 "Configure Enterprise Manager" 再按 Next

24. password 統一用 "oracle" ,再按 Next

25. 選 File System ,再按 Next

26. 選第一個,"Use Databaes File Location from Template" 再按 Next

27. 將 archive 功能 disable 再按 Next

28. 選擇 "Sample Schema" 再按 Next

29. 在 "Character Sets" 選 "Unicode" 再按 Next

30. 選 "Keep default security settings" ,再按 Next

31. 將 "Enable automatic maintenance tasks" disable 後,再按 Next

32. 再按 "Next" >> "Finish" >> "ok" 後 vmid 的資料庫開始建立

33. 建立完成後按 "exit" 離開,此時資料庫建立完成

34. 測試資料庫連接
$ export ORACLE_ID=vmid
$ sqlplus system/oracle

若可以連進去,便是成功

35. 開機時啟動 oracle 並可連接,需編輯 /etc/oratab
intrepid:/u01/app/oracle/product/11.1.0/oraibex:N
並將 N 改為 Y

36. 重新啟動 server ,如此才能從外部連接 oracle