星期一, 6月 22, 2009

如何使用 SyntaxHighlighter

版面配置 -> 修改HTML, 捲到最後

</body></html>


再把下面這段程式加入上面那段之前
















星期五, 6月 19, 2009

OOPS?! rdiscount is not working on Windows

雖然我所使用的NB是Windows, 但因為我一直是連上server side (Ubuntu)去安裝系統與修改程式, 我的NB上並沒有開發RoR的環境, 因此一直沒發現這個問題, 一直到我們家的工程師試圖要在他的電腦上安裝測試環境才發現這個問題: rdiscount這個gem裝不起來!!!

他把這情況跟我回報, 我本來一直以為是他沒設定好或是有gem安裝順序造成的相依性問題, 但在我試圖幫他安裝卻還是一直出現錯誤, 後來努力一陣搜尋之後才發現:

rdiscount不能在Windows平台上運作?!?!

沒錯... 只要你拿到的程式有使用到這個gem, 那就暫時不要想能在Windows上執行了

細節可以參考下列的討論[1] [2] [3], 最無言的是有人問說rdiscount on Windows不work怎麼辦? 其中一個很OOXX的回覆是 rdiscount 只能在Mac and GNU/Linux systems運作喔, Windows請找替代方案...

那ridscount又是甚麼呢? ridscount是Markdown的一種實作, 簡單來說, 就是讓你想輸出在web page的文字 轉換成不會造成HTML crash的字元的一個小程式.

感覺RoR就是一個Windows不friendly的東西, 我不愛Windows, 但是這種平台支援程度我覺得算是很基本的. 系統環境以Windows為主的公司要使用RoR可千萬要三思. 我想rdiscount應該不會是不支援的唯一特例.

目前我所看到的RoR developers都是使用Mac Book, 且Ruby從TIOBE上看來與Mac OS X的成長正相關, 使用族群的特性也許該特別注意一下囉!

星期一, 6月 15, 2009

RoR中時區處理的問題

問題一開始是出現在一段很簡單也很常需要使用的程式碼, 程式希望撈出該年月所含括的資料. 資料庫裡面存的時間時區是UTC.

我們原先從vendor得到的程式碼如下, 但是運作一直不是很正常, 撈出來的資料總是有問題, 但vendor卻始終認為該程式碼沒有錯誤.

date1 = Date.new(year, month, 1)
date2 = Date.new(year, month, -1)
self.find(:all, :conditions => ["start_at >= ? and start_at <= ?", date1.beginning_of_day, date2.end_of_day] )

要求fix bug未果, 不得以只好自己動手, 台灣的時區是UTC+8, 因此當我們想要撈出所有台灣時區2009/6的資料時, 所需要下的SQL stmt其實是 2009-06-01 00:00:00+0800與2009-06-30 23:59:59+0800等同於2009-05-31 16:00:00+0000與2009-06-30 15:59:59+0000不幸的是, 上面這段程式碼並無法正常的運作.


>> puts Time.zone
>> puts date1.beginning_of_day.zone
>> puts date1.beginning_of_day
>> puts date1.beginning_of_day.to_s(:db)
>> puts date1.beginning_of_day.in_time_zone(Time.zone).zone
>> puts date1.beginning_of_day.in_time_zone(Time.zone)
>> puts date1.beginning_of_day.in_time_zone(Time.zone).to_s(:db)
>> puts Date.parse("2009-6-01T00:00:00+00:00").beginning_of_day.in_time_zone(Time.zone).strftime("%Y-%m-%d %H:%M:%S")


=> (GMT+08:00) Taipei
=> CST
=> 2009/06/01 12:00 AM
=> 2009-06-01 00:00:00
=> CST
=> 2009/06/01 12:00 AM
=> 2009-05-31 16:00:00
=> 2009-06-01 00:00:00

=> (GMT+10:00) Hobart
=> CST
=> 2009/06/01 12:00 AM
=> 2009-06-01 00:00:00
=> EST
=> 2009/06/01 2:00 AM
=> 2009-05-31 16:00:00
=> 2009-06-01 02:00:00

=> (GMT+00:00) UTC
=> CST
=> 2009/06/01 12:00 AM
=> 2009-06-01 00:00:00
=> UTC
=> 2009/05/31 4:00 PM
=> 2009-05-31 16:00:00
=> 2009-05-31 16:00:00

=> (GMT-10:00) Hawaii
=> CST
=> 2009/06/01 12:00 AM
=> 2009-06-01 00:00:00
=> HST
=> 2009/05/31 6:00 AM
=> 2009-05-31 16:00:00
=> 2009-05-31 06:00:00

剛看到Taipei部分的結果, 還以為使用date1.beginning_of_day.in_time_zone(Time.zone).to_s(:db)這段是可以正常運作的, 但是多測了幾個時區之後, 發現還是有問題, 無論設定任何時區, 永遠都得到2009-05-31 16:00:00這樣的值

而唯一會變動的兩個值是date1.beginning_of_day.in_time_zone(Time.zone)和Date.parse("2009-6-01T00:00:00+00:00").beginning_of_day.in_time_zone(Time.zone).strftime("%Y-%m-%d %H:%M:%S"), 但很奇怪的是, 這兩個數值變動的基礎都是先減8小時之後再計算與台灣地區的時差, 即使第二段程式是直接提供一個"2009-6-01T00:00:00+00:00"的時間, 希望能得到一個UTC時間之後再作計算, 但結果依然是失敗的.

後來在網路上好一陣搜尋之後, 才赫然發現這是個bug (or issue?)
https://rails.lighthouseapp.com/projects/8994/tickets/2479-inconsistant-time-zone-handling

文中的例子如下, 可以看出Date有時區處理的問題:


>> Date.today.beginning_of_day
=> Fri Apr 10 00:00:00 -0500 2009
>> Time.zone.now.beginning_of_day
=> Fri, 10 Apr 2009 00:00:00 CDT -05:00
>> Date.today.beginning_of_day == Time.zone.now.beginning_of_day
=> true

>> Person.all :conditions => [ "created_at > ?", Date.today.beginning_of_day ]
=> Generated SQL => SELECT * FROM "people" WHERE (created_at > '2009-04-10 00:00:00')

>> Person.all :conditions => [ "created_at > ?", Time.zone.now.beginning_of_day ]
=> Generated SQL => SELECT * FROM "people" WHERE (created_at > '2009-04-10 05:00:00')


簡單說就是要用Time來取得的時間才會是你要的, 因此將原先的程式修改為下面這樣就搞定啦!


fmTime = Time.zone.local(year, month, 1, 0, 0, 0)
toTime = Time.zone.local(year, month, -1, 23, 59 ,59)
self.find(:all, :conditions => ["start_at >= ? and start_at <= ?", fmTime, toTime] )

>> puts Time.zone
>> puts fmTime.to_s(:db)
>> puts toTime.to_s(:db)


=> (GMT+08:00) Taipei
=> 2009-05-31 16:00:00
=> 2009-06-30 15:59:59

=> (GMT+00:00) UTC
=> 2009-06-01 00:00:00
=> 2009-06-30 23:59:59

=> (GMT-10:00) Hawaii
=> 2009-06-01 10:00:00
=> 2009-07-01 09:59:59

如此終於搞定一個邏輯上很簡單處理的bug... RoR還是讓我很無言...

星期六, 6月 13, 2009

SVN小記

SVN Create Repository

> sudo svnadmin create /opt/svn/test

設定檔修改

/opt/svn/test/conf/svnserver.conf
[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz

/opt/svn/test/conf/passwd
[users]
admin = admin
user1 = user1
user2 = user2
test = test

/opt/svn/test/conf/authz
[groups]
Admin = admin
User = user1, user2
Test = test1

[/]
@Admin = rw
@User = r

[/web]
#讓@Test只能讀寫/web下面的東西
@Admin = rw
@User = r
@Test = rw

星期五, 6月 05, 2009

RoR的restful_authentication plugin在IE 8上的問題


今天網站在作測試時, 有人反映IE 8無法正確的導到login畫面, 而會跳出這個畫面, 找到原因是因為IE 8有時會送出空的HTML Accept header而使得程式跑到format.any這個區塊, 因此會造成跟其他瀏覽器不一樣的情況.

一個簡單的修改方法是將lib/authenticated_system.rb中原本這段
def access_denied
respond_to do |format|
format.html do
store_location
redirect_to new_session_path
end
format.any do
request_http_basic_authentication 'Web Password'
end
end
end

改為下面這樣, 因為我們暫時沒有其他的format, 所以使用format.any來作判斷
 def access_denied
respond_to do |format|
format.any do
store_location
redirect_to new_session_path
end
end
end
這樣就可以正確的進入login畫面囉.

星期日, 5月 17, 2009

JUnit 4.x初體驗

JUnit 4.x之後可使用Annotation, 因此已可將程式碼與測試程式碼混雜在同一個.java檔, 也不再需要extends TestCase, 但為了避免混亂, 還是將測試程式碼分開來比較好

建立測試程式的方式也很簡單, 使用Eclipse, 在想要撰寫測試程式碼的.java檔上按右鍵, 然後[New -> Other... -> Java -> JUnit -> JUnit Test Case]


選取JUnit 4, 要放置的路徑, 以及勾選一些希望自動產生的程式碼


勾選一些要測試的method

完成後就可以看到測試程式檔已經產生, 也帶有一些自動產生的method區塊並有著下列的Annotations之一

@BeforeClass => 產生class的實例之前呼叫, 為static method, 同一個測試class只會呼叫一次
@AfterClass => 銷毀class的實例之後呼叫, 為static method, 同一個測試class只會呼叫一次
@Before => 一個測試method會產生一個測試class實例, 因此每個測試method執行都會呼叫一次
@After => 一個測試method會產生一個測試class實例, 因此每個測試method執行都會呼叫一次
@Test => 測試method, 可以不用testXXX()當prefix, 但建議還是使用.

注意: 因為一個測試method會產生一個測試class實例, 因此若有變數需要在不同method之間傳遞, 要先將變數宣告為static才行.

要執行此測試程式的方法有兩個
  1. 在測試程式上按右鍵, [Run As -> JUnit Test]
  2. 在專案上按右鍵, [Run As -> JUnit Test], 這樣會執行這專案內所有的測試程式, 要注意!

星期五, 5月 15, 2009

將JMeter改為英文介面


JMeter若不設定的話, 會使用作業系統的預設語系, 一直看到那殘破不缺的中文, 實在是很令人扼腕, 而且時有時無的翻譯常常會讓人看不出所代表的是甚麼東西...

今天花了不少時間在玩弄JMeter, 雖然可以透過功能列來作語系的設定, 但總是會看到中英文夾雜的狀況, 而且每次重新啟動都要再修改一次, 終於忍不住將它改成啟動時就跑英文介面, Disable=不致能...真的很囧...


修改的方法很簡單.

[bin/jmeter.properties]
language=en

加上這行再重新啟動就可以囉.

慢慢上手後, 覺得真的不錯用, 雖然不像XXXrunner那麼強大, 但作為Web系統的功能測試已很足夠, 也可以做壓力測試, 功能選項中有Remote Start的選項, 雖然還沒研究要如何設定, 不過看來要做強度很大的分散式壓力測試也不是難事.

JMeter samplers include:

  • FTP Request
  • HTTP Request
  • JDBC Request
  • Java object request
  • LDAP Request
  • SOAP/XML-RPC Request
  • WebService (SOAP) Request

星期三, 5月 13, 2009

GWT初體驗

GWT stands for Google Web Toolkit.

最近真的很多初體驗... 目前考慮要不要把Spring也拉進來體驗一番...

言歸正傳, 我想大家都知道關聯性資料庫通常是系統效能的瓶頸, 增加資料庫伺服器數量對於運算能力的增加有限, 更換資料庫更是一場災難, 還好我們可用Hiberante之類的架構來改善這些問題. 但Web UI的部分呢? AJAX解決了不停換頁所造成的頻寬浪費, 但是卻依然遭遇各家瀏覽器對於HTML, JavaScript, CSS支援程度不一的問題, 解決這類問題可說是相當煩人又曠日廢時, 因此更該使用一些框架來增加開發效率, 畢竟很多狀況都有人幫忙測試過了.

雖然我對於HTML, JavaScript, CSS皆有一定的熟悉度, 但我對JavaScript一向不太喜愛, 因此JQuery, Ext, Yahoo UI Library, Rico... 等方案都不在我的選擇之中, Flash/ Flex解決方案也曾接觸過, 但ActionScript很類似JavaScript, 因此也出局.

而GWT透過Java程式來產生JavaScript的方式就很符合我的需求, 相容性交給Google的工程師去傷腦筋, 除了GWT之外, JSF, ZK其實也算某種程度滿足我的需求, 但因為Android是公司的重點目標, 我目前認為GWT與Android的UI開發經驗是可以互通的, 再加上GAE也可使用GWT, 因此選擇GWT.

從安裝SDK到開啟第一個專案, 根據GWT官網上的 Quick Start 基本上沒有問題. 不過後來想自己修修改改的時候就遇到問題了, 枉費我這次有比較努力看一下文件...

  • Module, Endpoint, .gwt.xml, .nocache.js不太好搞懂, 我花了不少時間才覺得掌握了一點, 現在可以在一個html上讀入兩個Modules, 使用兩個Endpoints
  • GWT (client)並不完全支援J2SE與J2EE規格
  • GWT可運用RPC架構來處理事務, server端的程式就不受上述的限制
  • 建立專案時所帶的範例程式碼可以幫助你了解RPC的運用, 而若想快點感受GWT的威力, 我推薦SDK裡面的Mail範例

一個html上讀入兩個Modules, 使用兩個Endpoints的畫面

明天來評估要用GWT直接呼叫Web Services還是要透過RPC來實作.

星期一, 5月 11, 2009

Hibernate設定連接池的問題

設定連接池時, 遇到兩個問題

1. Hibernate並未使用所設定的C3P0連接池, 出現下列訊息
INFO [org.hibernate.connection.DriverManagerConnectionProvider] - Using Hibernate built-in connection pool (not for production use!)

解決方法是在hibernate.cfg.xml裡面加入這行
<property name="connection.provider_class">
org.hibernate.connection.C3P0ConnectionProvider
</property>


2. 連接池程式無法正確使用Log4J的錯誤訊息
log4j:WARN No appenders could be found for logger (com.mchange.v2.log.MLog).
log4j:WARN Please initialize the log4j system properly.

雖然說warning不是很要緊, 但是看到這樣的訊息還是讓我很想處理掉這個狀況.

解決方法很簡單, 在log4j.properties裡加入這行

log4j.logger.com.mchange.v2=INFO, A1

P.S. A1是我設定的appender

星期五, 5月 08, 2009

Hibernate初體驗

資料庫一向是我特別有興趣的部分, 但Hibernate卻一直沒好好研究與使用, 除了是對於自己既有技能的依賴, 另外也是不想因為framework而失去某些彈性. 但現在Hibernate支援了JPA(EJB3.0規格中的重點之一), 所以系統若需要分散式架構時也可以很容易的擴充, 另外JPA也可以使用在GAE上, 因此現在學習使用Hibernate可說是非常有利的時機點.

我先閱覽了 良葛格學習筆記, 受益良多, 也對於Hibernate有一個快速的認識 (這幾年來, 我應該是第四次看這個網站上的Hibernate介紹了, 站主真的很用心, 更新的也很快).

不過接下來的實作練習還是吃了不少苦頭, 因為
  • 我不喜歡重頭開始刻程式, 所以看到Hibernate Tool可以從資料庫反轉產生code就覺得非用不可
  • 我並不想認識原來的Hibernate, 也就是還需要*.hbm.xml的寫法
  • Hibernate的JPA實作包括 Annotations 和 EntityManager, 我並不清楚這兩者的關係以及與EJB的關聯性
  • 我也沒搞懂persistence.xml 和 hibernate.cfg.xmlx兩者的關係以及與EJB的關聯性, 連要放哪個目錄下都不知道
  • 一堆相依的libraries也沒搞懂
  • 因為需求的關係, 目前我只想使用Tomcat, 並不想使用JBoss/ Glassfish
  • 我不想使用command line來跑Ant之類的東西, 一心只想使用Eclipse來操作
  • 我甚至也不知道Hibernate可以不在AP server/ Web server跑, 哈哈
  • 我一向沒看完使用者手冊的習慣... 真糟糕的習慣...
綜合以上就讓我吃足了苦頭, 雖然後來都搞清楚了, 也發現在良葛格學習筆記中其實大部分都已說得很清楚, 不過這樣try-error的過程中也算是快速累積經驗吧, 哈哈...

另外試著跑自己想要的SQL statement和子查詢, 結果也是ok的.

初體驗的結論是, 目前看來一切都很不錯. 要繼續深入研究下去囉!

星期二, 5月 05, 2009

GAE初體驗

今天終於拿到GAE for Java的使用許可

因為我們已經全部使用Eclipse當作開發工具, 所以透過 http://code.google.com/appengine/docs/java/tools/eclipse.html 所介紹的步驟來安裝 Google Plugin for Eclipse, 這邊不贅述.

我是使用 Eclipse 3.4 (Ganymede) for J2EE的版本. 安裝好之後工具列上會多三個小圖示


點第一個小圖示可以產生一個新的GAE project.




產生出來的專案可以馬上部屬到申請的GAE空間, 最簡單的方法是按那個長得像小飛機的按鈕.




上傳前必須填一些認證資料.




接著要設定application ID, 其實也就是申請時所設定的 http://xxx.appspot.com/ 的那個xxx. 一個人可以設定10個.




ok, 現在可以上傳了



上傳需要花一點時間, 上傳完成後就可以看看甚麼也沒做就完成的東西啦.


接著就是要找時間玩一下其他支援的功能囉. 開小飛機的初體驗還蠻有趣的 :D

星期一, 5月 04, 2009

關於GAE中用來儲存資料的兩個標準 (JDO, JPA)

話說昨天看了一下GAE的說明得知, 若要在GAE上儲存資料必須要使用JDO或JPA這兩種技術... 但是其實這兩種技術我都不會, 哈哈~ 一直都還在用很老舊的架構 Session Bean <-> DAO <-> JDBC <-> DB, 因為我喜歡使用很華麗的SQL statement來提高資料存取的速度, 曾經我也使用過Entity Bean來開發J2EE的系統, 那根本是場災難... 也造成我一直對於所謂的frameworks有點敬而遠之 (Struts, Webwork, Spring, Hibernate... etc), 且也不希望增加版本更新的困擾 (光Tomcat要不要upgrade都可以讓我考慮好幾天), 因此都只有大概看看文件, 了解一下這些frameworks存在的必要性而已.

Anyway, 在GAE上儲存資料必須要使用JDO或JPA這兩種標準, 所以我今天花了點時間研究一下, Google上是採用 Datanucleus的solution, 但這時還不曉得這個solution是甚麼, 接著上網查到 http://en.wikipedia.org/wiki/Datanucleus中有這一段: DataNucleus Access Platform is the persistence layer behind Google App Engine for Java. 原來這個 plateform同時支援JDO跟JPA兩個標準, 因此想用哪個就用哪個囉.

另外也看到Hibernate主要是JPA的實作, 因此若使用JPA可算是有摸蜆仔兼洗褲的作用. 以後若有機會使用Hibernate的話, 不妨就使用JPA來儲存資料吧.

不過看到以下那一堆unsupported features... 很多features我看不太懂是甚麼意思, 不過不能join不能aggregrate?! 不會吧~~ 那我要資料總筆數怎麼作咧... 還是說有method可以用? 看來只好等空間拿到手再來好好試用一下.

Edit 1: 剛又多研究了一下, 知道資料總筆數要用 datastore.prepare(query).countEntities()來取得, 也就是說, 基本上資料應該已經全部從資料庫給拉出來了, 這樣若有需要作報表系統的話, 效能堪慮阿...

Unsupported Features of JDO

The following features of the JDO interface are not supported by the App Engine implementation:

  • Unowned relationships. You can implement unowned relationships using explicit Key values. JDO's syntax for unowned relationships may be supported in a future release.
  • Owned many-to-many relationships.
  • contains() syntax for query filters on Collection fields. You can test that a multi-valued property (a Collection field) has a value using an equality filter: collection == "value"
  • "Join" queries. You cannot use a field of a child entity in a filter when performing a query on the parent kind. Note that you can test the parent's relationship field directly in query using a key.
  • JDOQL grouping and other aggregate queries.
  • Polymorphic queries. You cannot perform a query of a class to get instances of a subclass. Each class is represented by a separate entity kind in the datastore.
  • IdentityType.DATASTORE for the @PersistenceCapable annotation. Only IdentityType.APPLICATION is supported.
  • There is currently a bug preventing preventing persistent fields on superclasses from being saved to the datastore. This will be fixed in a future release.


Unsupported Features of JPA

The following features of the JPA interface are not supported by the App Engine implementation:

  • Owned many-to-many relationships, and unowned relationships. You can implement unowned relationships using explicit Key values, though type checking is not enforced in the API.
  • "Join" queries. You cannot use a field of a child entity in a filter when performing a query on the parent kind. Note that you can test the parent's relationship field directly in query using a key.
  • Aggregation queries (group by, having, sum, avg, max, min)
  • Polymorphic queries. You cannot perform a query of a class to get instances of a subclass. Each class is represented by a separate entity kind in the datastore.

星期六, 5月 02, 2009

看來挺有搞頭的Google App Engine

今天忙著在GWT, Ext-GWT, ZK中奮鬥,想了解到底哪一個AJAX framework比較適合我們公司使用, 目前看來是使用GWT多少可以與Android上的開發經驗相結合.

但突然想到如何與視覺化介面設計師 (據說是高級系統美工的雅稱)配合的問題, 畢竟這是web系統開發通常最痛苦的地方所在, 在網路上瀏覽資料, 似乎有還不錯的解法, 不過這不是本篇的重點, 重點是突然發現Google App Engine (GAE)這個有趣的東西, GAE剛滿周歲不久 (一年後才發現, 哈哈), 更巧的是最近剛開始開放支援Java, 也可以支援cron (scheduled tasks). 資料儲存則可以用Java Data Objects (JDO) 和 Java Persistence API (JPA), 還有其他的服務如Memcache, Expand URL FetchURL Fetch, Expand Mail, Expand Images, Expand Google Accounts, 感覺功能相當完整, 以前蠻難找到可以作Java hosting的虛擬主機, 免費的更少, GAE看來提供一個很不錯的解決方案.

使用 Android + RESTful + Google Data API + GAE 組合出有價值的服務, 看來不是夢阿!

其實覺得自己的行為還蠻像internet spider的 XD

GeoAlarm Lite小小更新版放上Android Market遇到的問題

可能是因為SDK1.5釋放的關係, 今天要放上新版的GeoAlrm Lite時遇到一點小問題.

Market requires the minSdkVersion to be set in AndroidManifest.xml.

訊息很清楚, 解決方法看來也很簡單.

我先在 AndroidManifest.xml的manifest下面加上
<uses-sdk minsdkversion="1">
但是不work...好吧~ 那換
<uses-sdk minsdkversion="1"></uses-sdk>
看看...也不work @#$%@#$%...再試試看
<uses-sdk android: minSdkVersion="1"/>
...終於成功了~


新版的GeoAlrm Lite多了四種radius可以選擇囉... 應該有方便一點吧. 哈哈

一開始key有問題會一直force close所造成的評價傷害... 還真的要花很多時間來提升... 乾脆砍掉重練算了...

星期五, 5月 01, 2009

久違的資訊焦慮症

最近一下子要接觸很多的資訊與技術, 這對於半放下技術許久的我來說, 從PM又跳回technical leader甚至是回到programmer的感覺很微妙, 最近接觸的東西如下:

  • Android (SDK1.5剛出... 還沒真的使用)
  • Ubuntu (Linux也很久沒摸到了...其實應該說是Server都很久沒碰到了...)
  • Redmine (還蠻有趣的專案管理系統, 也是Ruby開發的, 不過用套件還是輕鬆點)
  • Web Services, SOAP, RESTful, JSON...
  • MySQL (好久沒用...何況本來就普通熟而已, 我一向比較喜歡PostgreSQL, 因為跟Oracle比較像)
  • Ruby, RoR
  • Apache Active MQ
  • Tomcat, Apache...etc
  • Funambol
  • ZK, GWT (好吧~ 我承認這是我自己加上來的, 不全是因為討厭RoR...而是我希望架構上pure Java... XD)

我一直認為技術不是重點, 重點在於應用本身帶來的價值, 但是一個應用要創造價值, 就要能整合各種技術... 以前在大樹底下好乘涼, 資源豐富, 沒特別感覺到整合各種技術的難度... 這次真的很爽... 樣樣都要自己來... 當然好處是很多東西都是自己決定的, 各種想法能得到驗證也算是收穫的一種, 但我是個single thread的人, 不停的在各種技術切換學習真的讓我覺得精力耗盡...

我想, 資訊焦慮症似乎又悄悄的找上我, 睡很晚, 起很早, 迫不及待打開電腦, 在網路上不停的找各種資料來看... 自己想想都覺得很病態...

這不是我想要的生活, 但現在的情況下卻又避免不了, 很無奈... 只能希望趕快度過這段時間囉! 加油!

星期三, 4月 29, 2009

Ruby...無言的part 1

之前為了混口飯吃, 在別間公司鬼混了一陣子, 因此自己的公司將網站外包給某個廠商來開發, 沒想到竟然是用RoR來開發... 這下可好, Ruby只聽過但沒接觸過... Rails更是陌生... 只知道是一種開發的框架... 但公司沒有這方面的人才, 且最近系統要上線, 之後必須要自家維護, 但我的工程師們又都很忙, 沒辦法只好硬著頭皮自己來了 :(

對於Ruby的聽聞印象是超完美的OO語言... blahblah, 這類讚美之詞就不多說了, 網路上很多... 但是真的接觸Ruby之後, 還真是驚訝於它的...詭異語法... 老實說我實在不知道怎麼欣賞它的美. 我想這是我才疏學淺之故 ><" 廢話不多說... 還是研究怎麼入門吧!

雖然不懂Ruby的美, 但自認還是個懂點程式的人, 因此首先想看的是語法上的差異. 不可避免的先到官網逛逛 http://www.ruby-lang.org/zh_TW

再看看如何從其他語言到Ruby, 我選擇的是Java
http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/

恩... 根據文件的說法, 差異點不多, 安心了不少
http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/to-ruby-from-java/

還很貼心的有線上測試器... 不過這種command line的coding方式讓我有點恐慌...
http://tryruby.hobix.com/

接著研究Ruby User's Guide, 到此總算是看到Ruby的語法了, 不過我沒預期到接下來是無言的開始 http://www.rubyist.net/~slagell/ruby/index.html
怎麼在畫面上印出五次test?
=> 5.times{puts "test"}
讓字串重複相加五次
"test"*5
=> "testtesttesttesttest"
只能說我真的很不習慣吧... 對我來說Ruby有太多的符號, 以及感覺像程式糖衣的東西... 繼續無言的學習中...

星期二, 4月 28, 2009

Google正式發佈Android 1.5 SDK, Release 1

下載網址在這
http://developer.android.com/sdk/1.5_r1/index.html

升級步驟如下:
  • Install the SDK
  • Update Your Eclipse ADT Plugin
  • Update Your Projects
  • Migrate Your Applications
http://developer.android.com/sdk/1.5_r1/upgrading.html

記得要先Uninstall先前的ADT plugin再裝新的, 否則會有錯誤.

星期一, 4月 20, 2009

使用ksoap2-android來呼叫WebServices的問題

最近開發中的軟體要跟server端溝通, 目前決定的架構要使用Web Services來當作溝通的通道. 我跟據以前的經驗, 請我們家的engineer去survey如何使用ksoap2-android這個library, 但是他跟我說新版的lib一直有問題, import進eclipse就會出錯...

上網查了一下, 在ksoap2-android的專案網站上就有提到相關的問題, 不過幸好有人找到問題點並提供解決方法了. 問題出於ksoap2-android-2.2-jar-with-dependencies.jar裡面有兩個.class檔重複了, 因此解決的方法也很簡單, 就是砍掉其中一個就可以囉!

星期五, 4月 17, 2009

Sixnology在 Android上的最新力作-VibrateMaster

隨著 GeoAlarm上線, 但是因為第一次放程式到Android Market上, 有蠻多事情與預期不同, 程式出了一些問題... 有點沮喪... 因此突發奇想寫了這個 VibrateMaster.

VibrateMaster是個很簡單的程式, 用到的其實是 GeoAlarm程式的一部分, 因此只花了很短的時間就完成了. 功能也很單純, 就是讓你玩手機的震動功能.

我的夥伴說一定要提醒大家一件事情, 那就是: 請記得你的手機不防水:P 至於為什麼要提醒這點, 那就請大家上討論區來問問他啦 :D

http://groups.google.com.tw/group/vibratemaster

GeoAlarm Lite放上 Android Market囉!















Want to have a nice sleep on the bus/train without passing your destination? Want to think about things freely without keeping checking where you are? GeoAlarm Lite is your savior! Just double click your destination on the map and create a GeoAlarm. Your GeoAlarm will be fired while you enter the area surrounding (500 meters) your GeoAlarm's location.

NOTICE:
- In Lite version, a GeoAlarm will expire after 5 hours and can only be fired once.
- GeoAlarm works well, even if it's not on the screen.