2010年12月2日

Git初探

程式開發過程中,其中一項困擾莫過於版本的控管,若未採用任何的版本控制系統,一般的控管方式是將專案資料夾整份複製再搭配日期命名作備份,若你曾採用過這種方式,那無非是場噩夢,隨著開發時程的進行,將導致複製過多重複的檔案,程式開發人員也必須對各版本所作修改或新增的檔案,作清楚且完整的註記說明,否則除非程式開發人員有驚人的記憶力,不然專案的版本控管也毫無用處,若多人開發採用此種方式,雖非不可行,但困難度肯定比撰寫系統程式碼還難上數倍。

Git是:
  • Git 是由林納斯·托瓦茲為了更好地管理linux核心開發,而創立的分散式版本控制/軟體配置管理軟體。
  • Git 採用了分散式版本庫(distribution repository)的方式,不須伺服器端的軟體支援,使原始碼的發布和交流極為方便。
  • Git 速度很快,這對於諸如 Linux kernel 如此大的項目很重要。
  • Git 最為出色的是它的合併追蹤(merge tracing)能力。
  • Git是Ruby on Rails、Android等知名專案的版本控制系統,而你也可以透過 Git對這些專案進行自有版本的開發。
Git的特色:
  • Distributed development.
  • Strong support for non-linear development.
  • Efficient handling of large projects.
  • Cryptographic authentication of history.
  • Toolkit design.
Git學習資源:

NetworkManager加入至面板

透過Ubuntu面板上的NetworkManager小圖示,可快速執行網路連線,但某次不小心把面板上的NetworkManager給移除,花了一個多小時搜尋資料,才重新將其加入至面板,代價不少,特此發文以作紀錄(XD)。

步驟:
在面板上按右鍵,選取「加入面板」選項,再選取「程式狀態通知區」項目,即可顯示。


2010年11月24日

建立第一個Android應用程式


透過前文『於Ubuntu 10.04建置Android開發環境』,已將Android的開發環境建置完成,本文將示範如何建立第一個Android應用程式,至於第一個應用程式,不免俗還是HelloWorld,XD。

1.切換eclipse的perspective
  • 1.1 eclipse執行時的預設perspective為Java EE,將其切換為Java。
  • Main Menu -> Window -> Open Perspective -> Java
    
2.建立AVD(Android Virtual Device)
  • 2.1 Android應用程式必須於Android平台手機或AVD模擬器上方能執行,在此建立一個AVD以執行開發的應用程式。
  • Main Menu -> Window -> Android SDK and AVD Manager -> Virtual Devices -> New
    
  • 2.2 參數設定說明
    • Name:AVD的名稱,可自行命名。
    • Target:使用的Andorid SDK版本。
    • SD Card:設定SD Card的記憶體大小為128MB。
    • Hardware:透過New按鈕,給定裝置的記憶體大小為128MB,預設為96MB。


3.新增Android Project
  • 3.1 新增步驟
  • Main Menu -> File -> New -> Android Project
    
  • 3.2 參數設定,請參考下圖,其中,Package Name請加入網域名稱命名,避免應用程式上傳至Market時,發生名稱重複之問題。

  • 3.3 專案新增完成後,若產生Build Path錯誤,請將gen底下的R.java刪除,程式會自動重建R.java。

4.執行HelloWorld應用程式
  • 4.1 執行步驟
  • Main Menu -> Run -> Android Application
    
  • 4.2 執行結果

本範例尚寫到任何程式,就完成HelloWorld應用程式,讀者是否充滿信心,XD。

2010年11月15日

『於Ubuntu 10.04建置Android開發環境』筆記


筆者的Android開發環境建置,主要是參考『[新手完全手冊] 建立 Android App 開發環境於ubuntu 10.04』(Milochen's Blog)文章中的步驟,Milo Chen的解說很詳細,讀者可連結過去參考,在此只紀錄本人的建置流程。

1.切換權限
  • 1.1 Milo Chen建議以root權限,建置開發環境
  • 1.2 權限切換指令
  • $ sudo su
    
2.確認Ubuntu安裝的版本與位元
  • 2.1 確認安裝版本指令
  • # lsb_release -a
    
  • 2.2 確認版本位元指令
  • # getconf LONG_BIT
    
3.根據Ubuntu的版本與位元下載軟體
  • 3.1 JDK  (筆者下載:jdk-6u22-linux-x64.bin)
  • 3.2 Android SDK  (筆者下載:android-sdk_r07-linux_x86.tgz)
  • 3.3 eclipse  (筆者下載:eclipse-jee-galileo-linux-gtk-x86_64.tar.gz)
4.將下載的三項檔案移至/opt/下

5.解壓縮檔案與更改權限
  • 5.1 JDK
  • # chmod a+x ./jdk-6u22-linux-x64.bin (chmod更改檔案存取權限)
    
    # ./jdk-6u22-linux-x64.bin
    
  • 5.2 Android SDK
  • # tar xvf android-sdk_r07-linux_x86.tgz (tar解壓縮指令)
    
  • 5.3 eclipse
  • # tar -zxvf eclipse-jee-galileo-linux-gtk-x86_64.tar.gz
    
    # mv eclipse eclipse-x86_64
    
6.安裝ia32-libs
  • 6.1 Android SDK為32位元,若於64位元系統執行32位元執行檔,須安裝ia32-libs
  • 6.2 安裝指令
  • # apt-get install ia32-libs
    
7.建立連結
  • 7.1 建立eclipse內的JRE連結
  • # cd /opt/eclipse-x86_64
    
    # ln -s /opt/jdk1.6.0_22/jre ./jre
    
  • 7.2 設定Android-SDK Tool和JDK bin的路徑
  • # export PATH=/opt/jdk1.6.0_22/bin:/opt/android-sdk-linux_x86/tools:${PATH}
    
8.啟動eclipse
  • 8.1 啟動指令
  • # GDK_NATIVE_WINDOWS=1 /opt/eclipse-x86_64/eclipse
    
  • 8.2 建立eclipse啟動檔,可將底下內容儲存為一個 ***.sh ,爾後以root權限直接執行***.sh,即可開啟eclipse,無須再入輸入長串的指令
  • #!/bin/sh
    
    export PATH=/opt/jdk1.6.0_22/bin:/opt/android-sdk-linux_x86/tools:${PATH}
    
    GDK_NATIVE_WINDOWS=1 /opt/eclipse-x86_64/eclipse
    
9.設定android eclipse環境
  • 9.1 初次開啟eclipse,會顯示Welcome畫面,於Welcome標籤按『X』,即可關閉。
  • 9.2 安裝Android Developer Tools Plugin
  • Main Menu -> Help -> Install New Software
    
    • 9.2.1 點選『Add』按鈕
    • 9.2.2 Name欄位輸入『AndroidDeveloperTools』(可任意名稱)
    • 9.2.3 Location欄位輸入『https://dl-ssl.google.com/android/eclipse/』
    • 9.2.4 勾選全部選項進行安裝
  • 9.3 安裝完成後,點選『Restart』重新啟動eclipse。
  • 9.4 設定 Android SDK Location
  • Main Menu -> Windows -> Preference -> Android
    
    • 9.4.1 SDK Location欄位設定『/opt/android-sdk-linux_x86』
  • 9.5 安裝Android SDK or API
  • Main Menu -> Window -> Android SDK and AVD Manager -> Avaliable Packages
    
    • 9.5.1 勾選全部選項進行安裝
以上步驟已完成Android開發環境的建置,後續將介紹如何於 eclipse 中建立 Android 新專案。

2010年11月14日

如何於ubuntu 10.04收聽廣播

以前於windows系統是透過mediaU收聽網路廣播,但最近對Ubuntu越用愈上癮,今天開機也直接進入Ubuntu系統,照以往方式開啟網路廣播,但系統卻無法自動取得mmsh套件(XD),這時只能請教Google大神,在凍仁的Ubuntu筆記(有豐富Ubuntu資料的網站)找到解決的方法,參考文章為Can't find MMSH codeces for Chrome on Ubuntu

解決mmsh問題步驟

  1.  新增套件
sudo vi /etc/apt/sources.list (以vi編輯器開啟sources.list )
.....
deb http://packages.medibuntu.org/ maverick non-free free # Media Code(將此行加入至sources.list檔案內的最底)

  2.  新增認證金鑰
sudo apt-key adv --recv-keys --keyserver wwwkeys.eu.pgp.net 0C5A2783

  3.  安裝非自由的解碼引擎
sudo aptitude install non-free-codecs
在執行此步驟,Terminal可能會出現『無法和 tw.archive.ubuntu.com:80 (140.112.8.139) 連線』的錯誤訊息,求助google大神,其可能原因為tw.archive.ubuntu.com已停止提供服務,可透過修改『軟體來源』解決此問題,於『系統->管理->軟體來源->原始碼下載至』進行修改(筆者更換為:mirror.nttu.edu.tw/ubuntu)。
重新再次執行指令,即可執行套件更新。

修改原始碼下載來源


透過mediaU收聽廣播


透過安裝Google Chrome的Taiwan Radio Tuner套件,收聽廣播

2010年11月11日

『海削小人』削鉛筆機

前天看到博客來天下系列書籍有5折優惠,就忍不住開始將書放入購物車,等把有興趣的5折書,下訂完後,金額已經快900元了,不小心又看見滿1499元,就可以獲得『海削小人一筆』削鉛筆機,克制不住內心的渴望,開始連7折、79折的書都開始下訂,此時博客來又寄來一封信,滿2000元送200元購物金,為了得到購物金,最後的結帳金額為2170元(囧),共計九本書。

下訂完,就期待這包裹會有多大呢,昨天下班就趕緊領錢去家裡附近的7-11取貨,以下是我跟店員的對話。
  • 金髮店員:拿貨嗎?(不要問我為什麼店員會記住我的名字,因為我平常就很敗家)
  • 我:恩。(OS:拿貨?這店員背景好像不單純)
  • 金髮店員:總共2170元。
  • 我:掏錢付款。
  • 金髮店員:收錢結帳。
  • 我:整理錢包當中。
  • 金髮店員:要拆開嗎?
  • 我:啥?
  • 金髮店員:幫你拆開?
  • 我:不用,謝謝。(OS:拆開是要驗貨嗎,果然背景不單純(XD))

九本書的包裹,果然博客來不是泛泛之輩阿,箱子尺寸很齊全。



九本書的真面目(沒拍好、照片糊了)



這一切都是為了他,小人退散吧(XD)


常買書的舉動,相對以前是有比較收斂了,還記得有一次,取完書後,在包裹背後發現一張紙條,是7-11女店員,想跟我當朋友,為了證明我不是嘴泡,我還有把紙條留著(XD),不過從那之後我就很少在博客來買書了,直到最近那家店,店長、店員都換新後,才又開始買書,沒想到名字又被記住了,我該低調了(XD)。

2010年11月10日

「Ubuntu 10.04」使用體驗

最近嘗試使用Ubuntu(Linux)作業系統,真的有些愛不釋手,圖形化的安裝介面,降低了安裝的門檻且簡化了流程。Ubuntu安裝完成後,其內含的應用程式也足夠因應平常所需,PDF 檔案可直接開啟瀏覽,OpenOffice 文書軟體已安裝在內,美工、影音、網路等項目也有豐富的應用程式支援,須自行安裝的應用程式頗少,且這些應用程式都是「Free」的。

筆者是將Ubuntu 10.04版安裝在ThinkPad X200筆電,採用Wubi安裝方式,將Ubuntu與Windows 7 安裝於同一磁碟區,無須分割新的磁碟區且日後若要將Ubuntu移除,也可直接透過Windows介面將其移除,非常人性化的安裝方案,頗適合初學者。

令人擔心的硬體驅動方面,系統完全支援,無須手動安裝,網路連接的方式與Windows 7同樣便利,應用程式的使用,也相似於Windows環境的操作,學習曲線並不高,若對電腦的使用,僅是用於上網、娛樂、簡單的文書處理與影像編輯等,Ubuntu會是不錯的作業系統選擇。

  • 簡潔的作業系統桌面

  • 上網、MSN無國界

  • 文書處理非難事

2010年11月9日

『槓桿學習全攻略』讀後感




槓桿學習全攻略
時間最少成效最大的終極學習術

作者:本田直之
譯者:詹慕如




你以為出了校園就可以不用再學習了嗎,那你可能得失望了,學校裡的學習,充其量只是用以取得進入職場的門票,而真正的學習這時候才正要開始,你的付出與努力,將決定你往後的成就與生活。

學校裡的課程,對於學習的項目提供了明確的方向,學習的成果也具有評量的基準,各個課程也有結束的段落;反觀,於職場或社會的學習,就必須仰賴自我的抉擇與實踐,讓自身時時刻刻保持競爭力並適應變化迅速的環境,而不致慘招淘汰。

工作就已經夠讓人勞累了,那如何在身心俱疲的下班時間及難得的假日時光,進行學習呢,且又該如何選定學習的方向及擬定學習的策略呢,作者『本田直之』於本書『槓桿學習全攻略』,以槓桿的概念與作法,提供了不錯的建議與作法。

不論任何的學習,作者都建議,於學習的起初都必須確立學習的目標,而目標的訂定必須盡量具體化或數字化,像是業績在一年內提升多少百分比,或是三個月內能與外國人進行交談等目標,目標訂定後,則以設定的時間,以倒逆的方式進行時程的規劃,並盡量有循環複習的可能,以强化記憶。

作者於書中也強調在確立學習方向,必須先客觀省思現有的條件,並以能實際應用為目的,千萬別想什麼都學或訂下不切實際的目標,有輸出才能彰顯輸入的價值,透過體驗小成果的累積,才能持續不斷的學習。

書中有些觀念或技巧都值得學習的,並不因時間的更迭,而過時或不適用。在這資訊多元與情報泛濫的時代,資訊取得已不是問題,而是如何篩選有用的資訊與情報,才是必須學習與關注的,透過相關書籍的閱讀,以汲取前人的寶貴經驗,可減少自我摸索的時間與錯誤的嘗試,藉融入各方的優點,以建構自身的學習法則。

2010年11月5日

Mate初探 – Part2


本文將導入Mate Framework改寫『Mate初探 - Part1』的示範例。

專案應用程式架構
  • 應用程式架構分為business(models)、maps(controllers)、views三個層面,而events package用於存放自訂事件。

Event
  • 使用者於下拉式選單選定欲轉換之幣別,並按下轉換按鈕後,應用程式將廣播自訂事件(dispatch event);自訂事件內包含參考國家及目標國家幣別之屬性。
  • CurrencyConvertorEvent.as
  • package com.asfusion.mate.currencyConvertor.events
    {
        import flash.events.Event;
        
        public class CurrencyConvertorEvent extends Event
        {
            public static const Convert: String = "CurrencyConvertEvent";
            
            public var fromCurrency : String;
            public var toCurrency : String;
            
            public function CurrencyConvertorEvent(type:String, bubbles:Boolean=true, cancelable:Boolean=false)
            {
                super(type, bubbles, cancelable);
            }        
        }
    }
    

View
  • 應用程式的介面設計,與『Mate初探 - Part1』相同。
  • CurrencyConvertorPanel.mxml
  • <?xml version="1.0" encoding="utf-8"?>
    <s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
             xmlns:s="library://ns.adobe.com/flex/spark" 
             xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300">
        
        <fx:Script>
            <![CDATA[
                
                import com.asfusion.mate.currencyConvertor.events.CurrencyConvertorEvent;
                
                [Bindable]
                public var currency:String;
                [Bindable]
                private var currencyList:Array=["EUR","JPY","KRW","TWD","USD"];
                
                // perform the action - dispatch an event
                private function currencyConvert() : void {
                    currency="";
                    var currencyConvertorEvent:CurrencyConvertorEvent = new CurrencyConvertorEvent(CurrencyConvertorEvent.Convert);        
                    currencyConvertorEvent.fromCurrency = this.fromCurrency.selectedItem.toString();
                    currencyConvertorEvent.toCurrency=this.toCurrency.selectedItem.toString();                
                    dispatchEvent(currencyConvertorEvent);                
                    this.currencyStr.text=this.fromCurrency.selectedItem+" convert to "+this.toCurrency.selectedItem + " : " ;
                }
            ]]>
        </fx:Script>
        
        <mx:Form>
            <s:Group>
                <s:layout>
                    <s:VerticalLayout verticalAlign="middle" horizontalAlign="center"/>
                </s:layout>
                <mx:FormHeading label="幣值轉換"/>
                <mx:Spacer height="5"/>
                <mx:FormItem label="參考國家">
                    <mx:ComboBox id="fromCurrency" dataProvider="{currencyList}"/>
                </mx:FormItem>
                <mx:Spacer height="3"/>
                <s:Label text="轉換為"/>
                <mx:Spacer height="3"/>
                <mx:FormItem label="目標國家">
                    <mx:ComboBox id="toCurrency" dataProvider="{currencyList}"/>
                </mx:FormItem>
                <mx:Spacer height="3"/>
                <s:Button width="60%" label="轉換" click="currencyConvert()"/>
                <s:Group>
                    <s:layout>
                        <s:HorizontalLayout verticalAlign="middle" horizontalAlign="center"/>
                    </s:layout>
                    <s:Label id="currencyStr"/>
                    <s:Label id="convertCurrency" text="{currency}"/>
                </s:Group>            
            </s:Group>        
        </mx:Form>
    </s:Group>
    
    

Event Map
  • Event Map相當於應用程式的控制中心,用於監聽各廣播事件(dispatched event),並執行相關處理(handling)。
  • 本示範例的Event Map將監聽CurrencyConvertorEvent.Convert事件類型,當該事件類型被監聽到,將執行EventHandlers標籤內的程式碼。
  • 執行程序首先將呼叫CurrencyConvertor Web Service服務,傳入event.fromCurrency及event.toCurrency作為參數,若服務呼叫成功,則將幣別轉換後的值,儲存至CurrencyManager類別(model)的currencyValue屬性。
  • Injectors標籤則為將CurrencyManager類別的currencyValue屬性值,設定給CurrencyConvertorPanel類別(view)的currency屬性,用以展示幣別轉換後的值。
  • MainEventMap
  • <?xml version="1.0" encoding="utf-8"?>
    <EventMap xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" 
              xmlns:mx="library://ns.adobe.com/flex/mx" xmlns="http://mate.asfusion.com/">
        
        <fx:Script>
            <![CDATA[
                import com.asfusion.mate.currencyConvertor.views.CurrencyConvertorPanel;
                import com.asfusion.mate.currencyConvertor.events.CurrencyConvertorEvent;
                import com.asfusion.mate.currencyConvertor.business.CurrencyManager;
            ]]>
        </fx:Script>
    
        <fx:Declarations>            
        <!-- Debugger -->
        <Debugger level="{Debugger.ALL}" />    
        
        <!-- CurrencyConvertorEvent.Convert -->
    
        <EventHandlers type="{CurrencyConvertorEvent.Convert}" debug="true">        
            <WebServiceInvoker wsdl="http://www.webservicex.net/CurrencyConvertor.asmx?WSDL"
                               method="ConversionRate"
                               arguments="{[event.fromCurrency,event.toCurrency]}" 
                               debug="true">
                
                <resultHandlers>
                    <!-- store the last price from the parsed results -->
                    <MethodInvoker generator="{CurrencyManager}" 
                                   method="storeCurrency" arguments="{resultObject}"/>
                </resultHandlers>
                
            </WebServiceInvoker>
        </EventHandlers>        
        
        <!-- Injectors -->        
        <Injectors target="{CurrencyConvertorPanel}">
            <PropertyInjector targetKey="currency" source="{CurrencyManager}" sourceKey="currencyValue" />
        </Injectors>
        </fx:Declarations>
    </EventMap>
    

Model
  • CurrencyManager類別透過storeCurrency方法,將服務回傳的幣別轉換值儲存至currencyValue屬性。
  • CurrencyManager
  • package com.asfusion.mate.currencyConvertor.business
    {
        public class CurrencyManager
        {
            [Bindable]
            public var currencyValue:String;
                
            public function storeCurrency(convertValue:Number):void {
                currencyValue = convertValue.toString();
            }
        }
    }
    

Main Application 
  • 應用程式的執行點,將Event Map與View包含在內。
  • CurrencyConvertorMate.mxml
  • <?xml version="1.0" encoding="utf-8"?>
    <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
                   xmlns:s="library://ns.adobe.com/flex/spark" 
                   xmlns:mx="library://ns.adobe.com/flex/mx" 
                   xmlns:maps="com.asfusion.mate.currencyConvertor.maps.*" 
                   xmlns:views="com.asfusion.mate.currencyConvertor.views.*" minWidth="955" minHeight="600">
        
        <fx:Declarations>     
           <!-- Event Maps -->    
           <maps:MainEventMap />    
        </fx:Declarations>
    
        <!-- Views -->    
        <views:CurrencyConvertorPanel />
        
    </s:Application>
    

2010年11月4日

Mate初探 – Part1


最近參與的專案,將導入Mate Framework,在此將Mate的重點及學習資源稍作整理。

Mate為何(What is Mate)?
  • Mate是標籤式與事件驅動的Flex框架(Flex framework)。
  • Flex應用程式主要是透過事件(events)進行元件或物件間的溝通,而Mate將使得處理這些事件變得簡單,不論是從伺服端取得資料或事件被觸發。
  • Mate也提供DI( dependency injection)機制,讓應用程式達到鬆耦合的目標,而Mate同樣是具有MVC概念的框架。

Mate專案必須要有的項目
  • 一個或以上的事件(自訂或內建)。
  • 一個或以上的Event Map。

建置Mate專案的一般步驟:
  1. 將Mate.swc加入至專案。
  2. 建立一個繼承至EventMap的類別。
  3. 將該event map加入至主應用程式內。
  4. 建立一個自訂事件。
  5. 於某處,廣播該事件(dispatch the event)。
  6. 於event map新增 EventHandlers用以監聽與處理廣播的事件。
  7. 執行在EventHandlers區塊內的相關程序。
  8. 依需要,重複4-7的步驟。

以示範例作Mate的基礎介紹:
  • 使用者透過介面的操作,可進行幣值的轉換,幣值轉換為採用CurrencyConvertor Web Service服務。
  • 傳統上的寫法,為將介面、處理程序、資料儲存都寫在主應用程式內(main application),該程式撰寫手法,雖直觀與簡便,但介面與處理程序的緊密結合,將不易於應用程式的維護與後續擴充,也無法透過分工方式進行多人開發。
  • 導入Mate,以MVC架構開發應用程式,將能改善元件或物件間的高度耦合,以解決上述問題。



傳統寫法
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
        <s:WebService id="currencyService" wsdl="http://www.webservicex.net/CurrencyConvertor.asmx?WSDL"
                      result="resultHandler(event)" fault="faultHandler(event)"/>
    </fx:Declarations>

    <fx:Script>
        <![CDATA[
            import mx.controls.Alert;
            import mx.collections.ArrayCollection;
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;
            
            [Bindable]
            private var currency:Number;
            [Bindable]
            private var currencyList:Array=["EUR","JPY","KRW","TWD","USD"];
            
            private function clickHandler():void{
                currencyService.ConversionRate(fromCurrency.selectedItem,toCurrency.selectedItem);
            }
            
            private function resultHandler(event:ResultEvent):void{
                this.currency=Number(event.result);
                this.currencyStr.text=this.fromCurrency.selectedItem+" convert to "+this.toCurrency.selectedItem + " : " ;
                this.convertCurrency.text=this.currency.toString();
            }
            
            private function faultHandler(event:FaultEvent):void{
                Alert.show(event.fault.message,event.fault.faultCode);
            }            
        ]]>
    </fx:Script>

    <mx:Form>
        <s:Group>
            <s:layout>
                <s:VerticalLayout verticalAlign="middle" horizontalAlign="center"/>
            </s:layout>
            <mx:FormHeading label="幣值轉換"/>
            <mx:Spacer height="5"/>
            <mx:FormItem label="參考國家">
                <mx:ComboBox id="fromCurrency" dataProvider="{currencyList}"/>
            </mx:FormItem>
            <mx:Spacer height="3"/>
            <s:Label text="轉換為"/>
            <mx:Spacer height="3"/>
            <mx:FormItem label="目標國家">
                <mx:ComboBox id="toCurrency" dataProvider="{currencyList}"/>
            </mx:FormItem>
            <mx:Spacer height="3"/>
            <s:Button width="60%" label="轉換" click="clickHandler()"/>
            <s:Group>
                <s:layout>
                    <s:HorizontalLayout verticalAlign="middle" horizontalAlign="center"/>
                </s:layout>
                <s:Label id="currencyStr"/>
                <s:Label id="convertCurrency"/>
            </s:Group>            
        </s:Group>        
    </mx:Form>    
</s:Application>

以Mate改寫的作法,將於下篇文章『Mate初探 – Part2』作介紹。

2010年11月1日

『民國100年大泡沫』讀後感




民國100年大泡沫
財富即將重分配,央行沒告訴你的真相

作者:王伯達




你是否曾感到困惑或無奈,為何辛勤的工作,所賺得的薪水卻永遠不夠花用,買房子像是個遙不可及的夢想,生兒育女再也不是件簡單的事,這背後是誰推升了物價的飆漲,卻把我們口袋的錢變薄了,在這本『民國100年大泡沫』,或許可以找到些答案。

作者以近幾年來,台灣『外匯存底』的現象,來說明為何民國100年,台灣經濟體將面臨大泡沫,1929年的美國大蕭條、日本失落的十年、亞洲金融風暴、1990年台灣的萬點泡沫,都與外匯存底快速且鉅額累積有一定的關聯,作者將此稱為『外匯存底的詛咒』。

在電視新聞播報,偶爾可聽聞台灣的外匯存底又創新高,就播報的內容與語氣,彷彿是政府的一項功績;央行緊釘匯率修理熱錢,彷彿就是正義使者的化身,打擊邪惡的投資客,藉以伸張正義,但事實是否就如你我所聽所聞,書本封面的「央行沒告訴你的真相」,是否表示了某些真相是我們所未曾知曉的。

作者並非預言家,而是在書中藉由扎實的數據資料與分析,說明台灣這次大泡沫的成因為何,以及泡沫破滅後,隨之而來的蝴蝶效應,美國次貸風暴所演變的全球金融風暴,重創世界經濟,台灣的經濟也正逐步從風暴後復原,但是否能再禁得起大泡沫的考驗,令人擔憂,而藉由作者本書的出版,匯率政策這個以往禁忌的話題,也逐步受到關切與挑戰,近期財金或新聞節目也以台灣是否會面臨泡沫,進行議論。

你還在聽投顧老師口沫橫飛的報名牌嗎,別再緣木求魚了,整體經濟方向的掌握,才是致富的關鍵,現今你我都處在大泡沫之中,該如何參與此次的財富重分配,「你」準備好了嗎。

2010年10月26日

Flash Builder "Burrito" Preview Release

Adobe Labs在10/25發布新一代的Flash Builder ,目前為Preview版,代號為Burrito(捲餅??)。

該版本的特性如下:
  • Developing mobile and multiscreen applications
  • Accelerated coding for Flex and ActionScript projects
  • Improved designer/developer workflow
  • Updated platform support and improved performanc

Developing mobile and multiscreen applications

        透過Burrito內建的Adobe Flex “Hero” SDK,Flash Builder將可同時開發Web、Desktop及Mobile應用程式,Mobile應用程式除有優化的元件可供使用外,在程式發布(launch)及除錯(debug)也有良好的支援。

Accelerated coding for Flex and ActionScript projects

        程式碼樣板(code templates)的提供與程式碼相關操作的支援(如C#自動產生getter/setter),可加速應用程式的開發與提升生產力,除標準的樣板外,也可透過匯入的方式,使用其他套件樣本,如robotlegs等。

Improved designer/developer workflow Flash

        Catalyst下一版本代號為Panini,也於10/25發布,目前也為Preview版,Panini與Burrito的結合,將增進現有應用程式的設計與開發流程。

Updated platform support and improved performance 

        對支援Flash Builder的平台進行更新,Flash Builder Burrito相對於先前版本的效能也有大幅的提升。

參考資料:

2010年10月22日

如何更換Flash Builder的瀏覽器(Web Browser)設定

Flash Builder在執行Run/Debug時,會以預設的瀏覽器開啟應用程式,若要更換開啟的瀏覽器設定,步驟如下:
Window(功能表) -> Preferences -> General -> Web Browser

2010年10月21日

as3Signals初探

開發Flash或Flex系統時,覺得AS3內建的事件不甚好用嗎,那as3signals或許是一個不錯的解決方案。

AS3內建事件的相關評論,可參考:
as3Signals 是Robert Penner針對AS3內建的事件 (built-in events),所提出的一種新架構,該架構簡化了物件(或元件)間透過事件溝通的程序。

as3Signals概念摘錄
  Signals: Think Outside the Event.
  • Signals are light-weight, strongly-typed AS3 messaging tools.
  • Wire your application with better APIs and less boilerplate than AS3 Events.
  Concept
  • A Signal is essentially a mini-dispatcher specific to one event, with its own array of listeners.
  • A Signal gives an event a concrete membership in a class.
  • Listeners subscribe to real objects, not to string-based channels.
  • Event string constants are no longer needed.
  • Signals are inspired by C# events and signals/slots in Qt.
以一個簡單範例作說明,當Radio的massage屬性被設定訊息後,Radio會dispach事件,並由BroadcastListener進行監聽(listener)與回應。

一般寫法:
RadioEvent類別:必須自訂事件
package
{
    import flash.events.Event;

    public class RadioEvent extends Event 
    {
        public static const BROAD_CAST:String = "broadcast";
        public var message:String;
    
        public function RadioEvent(type:String, message:String, 
            bubbles:Boolean = false, cancelable:Boolean = false) 
        {
            super(type, bubbles, cancelable);
            this.message=message;
        }
    
        override public function clone():Event 
        {
            return new RadioEvent(this.type, this.message ,
                this.bubbles, this.cancelable);
        }
    }
}

Radio類別:dispatch event
package
{
    import flash.events.EventDispatcher;
    
    [Event(name="broadcast",type="RadioEvent")]
    
    public class Radio extends EventDispatcher 
    {
        public var eventObject:RadioEvent;
        private var _message:String;
        
        public function get message():String 
        { 
            return _message; 
        }
        
        public function set message(value:String):void
        {
            _message = value;
            eventObject=new RadioEvent("broadcast", _message);
            this.dispatchEvent(eventObject);
        }
    }    
}

BroadcastListener類別:listener
package
{
    public class BroadcastListener
    {    
        public function onBroadcastHandler(event:RadioEvent):void
        {
            trace('Heard message: ' + event.message);
        }
    }
}

SignalsHelloWorld類別:設定Radio物件的message屬性
package
{
    import flash.display.Sprite;
    
    public class SignalsHelloWorld extends Sprite
    {
        private var radio:Radio;
        private var broadcastListener:BroadcastListener;
    
        public function SignalsHelloWorld()
        {
            this.radio=new Radio();
            this.broadcastListener=new BroadcastListener();
            radio.addEventListener(RadioEvent.BROAD_CAST, 
            this.broadcastListener.onBroadcastHandler);
            radio.message="Hello World, Kolen!";                
        }
    }
}

使用as3signals的寫法:
SignalsRadio類別:透過Signal類別dispatch event
package
{
    import org.osflash.signals.Signal;
    
    public class SignalsRadio 
    {
        private var _message:String;
        public var broadcast:Signal;
        
        public function SignalsRadio()
        {
            broadcast = new Signal(String);
        }
        
        public function get message():String 
        { 
            return _message; 
        }
        
        public function set message(value:String):void
        {
            _message = value;
            broadcast.dispatch(_message);
        }
    }    
}

SignalsBroadcastListener類別:listener
package
{
    public class SignalsBroadcastListener
    {    
        public function onBroadcastHandler(message:String):void
        {
            trace('Heard message: ' + message);
        }
    }
}

SignalsHelloWorld類別:設定Radio物件的message屬性
package
{
    import flash.display.Sprite;
    
    public class SignalsHelloWorld extends Sprite
    {
        private var radio:SignalsRadio;
        private var broadcastListener:SignalsBroadcastListener;
        
        public function SignalsHelloWorld()
        {            
            this.radio=new SignalsRadio();
            this.broadcastListener=new SignalsBroadcastListener();
            radio.broadcast.add(this.broadcastListener.onBroadcastHandler);
            radio.message="Hello World, Kolen!";                
        }
    }
}

物件間的溝通是不是變簡單了呢,而本範例僅用到Signal類別,尚有DeluxeSignalNativeSignal兩種類別,待後續再作介紹。

as3signals的學習資源

2010年7月7日

『告白』讀後感




告白

作者:湊佳苗
譯者:丁世佳




一位四歲女孩的溺水意外事件,其新聞價值或許可在地方報紙的社會版面占據一小角落,但過不了多久,這則新聞的印象將會被眾人遺忘,失去摯愛的悲慟也僅會殘留給事故者的親人。森口一位單親媽媽的國中教師,獨立撫養著女兒,女兒就像是她的天使,如此的純真可愛,直到某一天,她女兒意外溺死在自己任教學校的游泳池內,就像這世界上任何時刻任何地點可能發生的意外一樣,霎時可能讓人感到一絲憂傷,但本質上卻是平淡無奇。

如果這是一場單純的意外事件,那傷心難過就只有自責不已與悲慟莫名的母親,但這整起事件卻是一個計畫性的謀殺,兇手則是被害者母親的學生,身為被害者母親與學生導師的兩種身分,你會選擇自私的負仇或是無私的原諒。「告白」這書名,恰如其名,每一篇章都是由某人以自身的觀點進行事件與遭遇的告白,老師、殺人兇手、同班同學、溺愛兒子等角色,是非對錯該怎麼界定,怨恨與寬恕又該如何抉擇。

兩百多頁的份量,與單純的事件主軸,卻激起了內心深處的漣漪,不願正視的人性,怨恨、渴望、妒忌、虛榮、從眾、偏見,無時無刻都存在,只是穿上不同的戲服,演出不同的劇本罷了。人性是善或惡,爭論千年卻仍無結果,別人善惡我們不在乎,但多數時間毫無疑問地我們自認為自身的人性是光明的,但事實真是如此嗎,你用以檢驗人性的那把尺,是否律定了呢?

2010年7月5日

『巴斯特的耳朵』讀後感



巴斯特的耳朵
Busters Oron
 
作者:瑪莉亞.恩尼斯坦
譯者:李佳純



在看過網路上對本書的熱烈推薦,以為在閱讀的起初,就能引起興致,但在持續看了五分之一的篇幅後,只感到困惑和煩躁,書的內容到底想傳達些什麼,我無法有任何一絲絲的體會,但仍就斷斷續續的讀著。

漸漸的,某些感觸在心中發了芽,這本書的主軸是,一種讓人不寒而慄的現實與真實的,人們總希望透過愛人或被愛,以獲得救贖或重生,得不到渴望的愛,讓人絕望,但愛的太多太滿,又令人窒息。書中的主角伊娃從小就無法得到母親的愛與認同,無論她如何的努力,只有母親尖酸刻薄的挑剔,彷彿她跟她母親只有一人能活著留在這世上,所以伊娃七歲時就決定殺死她母親。

約翰一個擁有把冰山融化能力的人,時常把愛掛在嘴邊,從他口中所說出的話語,是多麼的真切與不可憾動,但打從底子裡約翰是個懦弱的人,他害怕孤獨,所以他選擇了以他為生活全部的女人作為訂婚對象,但約翰又無法忍受只活在她就是一切生活的世界裡,他害怕並選擇退縮。

伊娃從小冰凍自己情感的人,計畫著對母親的復仇,但偶然的愛情慢慢融化了在她體內的冰塊,讓她感覺到她是值得被愛與擁有愛,就算她母親從沒喜歡過她也無所謂,但讓人無法相信,愛情背叛了她,情人的蜜語就像是利刃,無情的凌遲她,她只得再次冰凍自己的傷口和情感,並把過錯都歸咎於她的母親。

蘇珊,伊娃的女兒,伊娃給她無限的愛,無論女兒如何使的壞,她只是告訴她女兒,她愛她,並請求女兒的原諒,直到伊娃與她女兒的一次聚餐中,她女兒赤裸裸的控訴她母親剝奪了她吵架的能力,因為她知道,無論她如何反抗,母親都會以愛之名,請求她的諒解。

愛還真是讓人難以捉摸,現階段我也無法明瞭愛的意義。或許愛人或被愛,是無法獲得救贖或重生的,因為我們始終是我們自己,愛人或被愛,只是不想承擔後果的藉口,因為把任何後果都推給是愛造成的,是合理的、可接受的。因為愛妳,所以我放棄了,因為你不愛我,所以我要傷害妳折磨妳,愛這字還真是擁有無窮的魅力和威力,到最後,你知道自己為何而愛了嗎??


2010年4月20日

『希望這家公司永遠在──日本最值得珍惜的5家企業』讀後感




 希望這家公司永遠在──日本最值得珍惜的5家企業
 坂本光司



工作的意義為何,是我最近反覆思考的問題,除了獲取薪酬與完成工作的成就感外,似乎缺少了什麼。你喜歡你的公司或工作嗎?到了該工作的時候,你是充滿活力還是全身倦怠呢?你是否有好好服務你的客戶呢?在這講究獲利的社會與年代,企業追求的是業績與利潤,而員工則是被視為會計成本的項目,顯少被視為資本,對於客戶的服務也常是以公司利益為出發點,華麗的口號和表象,取代了樸實的服務和優質的產品。

企業的文化和願景,影響著底層的員工,以照顧員工為優先的企業,員工必能為公司全力以付,注重社會責任大於利潤的公司,員工在工作上也較能謹守本份,不易作出傷害公司名譽的情事。『希望這家公司永遠在』是「坂本光司」從6000家企業,發掘最值得珍惜、與頌揚的5家公司,這5家公司符合坂本光司所提出的「對五個人的使命與責任」的條件,這五個人指的是員工、員工的家人、下游廠商、顧客,以及地方社會。讀到日本理化學工業雇用身障者的那一段,想像著身障者因為從工作中獲得滿足與快樂,那份感動是無法言喻,現今企業肯雇用身障者的比例偏低,更遑論為他們改變作業程序,但日本理化學工業僱用了占員工七成比例的身障者,也依他們的狀況與能力,擬定新的作業流程,何其感人。

伊那食品工業則是讓我驚豔的公司,這是一家以追求員工幸福為目標的公司,而非企業的利潤,但在追求員工幸福的同時,該企業也創下連續四十八年的增收增益紀錄,不在經濟好景時,隨意擴張規模,以避免在景氣轉壞時,面臨裁員的窘境。中村復健器材則是生產高品質的義肢與復健器材,這種以傾聽及服務弱勢族群的理念,吸引日本各地的人前來求職,其客戶也遍佈世界各地。柳月則是以串連人與人、心與心的經營哲學經營著甜點事業,以提供給客戶最好品質的甜點與服務,讓客戶感到幸福與溫暖為其理念,對北海道的這個地方社會,也默默奉獻其心力。杉山水果店則是靠著創意與行動,經營著水果禮盒店,以客戶需求為己任,讓客戶感到幸福與快樂是其經營的方針與要旨。

『希望這家公司永遠在』是企業經營者可考慮閱讀的書,當一切都回歸到真、樸,公司與員工才能創造雙贏,雙方不再是諜對諜的對立關係,而是為服務客戶、貢獻社會一同努力的人,讓員工找到努力的方向與遠景,才能為企業創造出龐大且超乎預期的利潤。

2010年2月21日

『丟掉50樣東西,找回100分人生』讀後感



丟掉50樣東西,找回100分人生
Throw Out Fifty ThingsClear the Clutter, Find Your Life

蓋兒.布蘭克




丟掉、丟掉,只要丟掉50樣東西,就能找回100分的人生,聽起來多令人感到振奮與鼓舞,唯一的疑問是真的有用嗎?稍微靜下心想想,有些東西(回憶)當你再看見它或想起它時,它是否會影響你的情緒,讓你鬱悶或煩躁?如果答案是肯定,那就下定決心,把它丟了吧,那你的內心必定會有某些層面的改變,讓你以更積極樂觀的方式來看待人生。

人們總是在有意或無意間保留了些實質的或無形的東西,有些東西可以為我們帶來愉悅或美好的回憶,而有些東西則是讓我們感到沉重或悲傷,作者『蓋兒.布蘭克』就是要大家丟棄這些讓你感到負面的東西,以改變你的人生。在本書中,作者以自身為例子,敘述其所決定丟掉的50樣東西及理由為何,你只要在閱讀中跟隨作者的腳步,決定你所要丟棄的東西,這些丟棄的過程將能有助於你釐清與規劃人生的目標。

執行到最後你會發現,這些丟掉的東西,實質是與我們的內心與情緒相牽連,有些是我們逃避不願面對的事情,而有些卻是我們緊抓不放,不願承認已事過境遷的事務,我們不時讓這些想法與情緒禁錮我們的心靈與身體,以至於無法以正面的思考或態度去經營我們的未來與人生。決定丟掉有形的物品或無形的情緒,其實重點在於肯去面對,承認這些事物的影響,然後選擇改變它們,讓人生朝向我們認為更好的方向前進。

或許念舊是人的天性,但若保留的是令人悲痛或不堪的記憶,那就試著丟掉吧,或許做起來很難,或許你就像我一般,連要丟掉不成對的襪子,都要考慮半天,試想著如果有一天有另一雙襪子也不成對時,那就剛好可再配對成雙的話,相信我過沒多久,你就會把那該死的單隻襪子忘記放在哪或藏在哪。有形的東西,眼睛一閉就可以丟掉了,但無形的東西,就算你在腦海或心中,決定不下萬次要把它丟棄或忘記,它有時還是會偷偷的出現並困擾著你,不過沒關係,你曾經把它給丟掉過,這次它再出現,你一定也有能力和辦法,再次把它丟掉,因為你知道該如何面對它。

丟掉、丟掉,把負面的東西通通丟掉,就像作者所言的,『這有什麼難的?不過是丟東西』,試著去丟掉讓你煩惱與不悅的事,剛開始或許很難抉擇,但慢慢你就會上手,並感受過程中所給予你的衝擊與回饋。

圖片來源:博客來書籍館

2010年1月28日

『酋長大人的星光大道』讀後感

  


『酋長大人的星光大道』
  給自己30歲的禮物,到迦納去當行銷志工
 
  好端端著

  開啟文化出版 




某日在噗浪上,有個「從南崁溪到幾內亞灣」的介紹噗,吸引了我的好奇與注意,透過對該篇部落格文章的閱讀,當下讓我感覺到好端端﹝本書的作者﹞的勇氣,同時也對我沉悶的工作情緒帶來些朝氣與鼓舞,從此定期收看好端端的部落格也成為我的例行性工作。

『酋長大人的星光大道』,是本書作者好端端,為了改變生活的現狀與突破自我,毅然辭去竹科的工作,一個人去迦納從事志工旅行,並在當地的Adstyle廣告公司作為期一個月的行銷志工。書中的內容除了針對迦納的地理景觀及風俗民情作介紹外,最重要的還是好端端這一個月的行銷志工服務歷程。

好端端透過參與廣告公司的企劃案,將本身的行銷專業及經驗,與該廣告公司的員工進行分享與交流,進而更激發自身的創意及企劃潛能,書中以生動的圖文方式紀錄了這些企劃案的企劃過程和內容。

閱讀是一件愉悅的事,尤其是能在閱讀的過程中,獲得某些啟發或力量。閱讀本書除了讓我感受到作者的勇氣,和她想在當地作些什麼的精神外,也讓我對志工旅行的本質及案件的企劃,有初步的瞭解與認知,書的編排及內容,以類似圖文漫畫的方式呈現,生動也富含層次,非常推薦給各位閱讀本書。

圖片來源:博客來書籍館


2010年1月17日

『這輩子,只能這樣嗎?』讀後感



   『這輩子,只能這樣嗎?』

     肯尼斯.克利斯汀著




你曾想過改變自己嗎,讓自己的生命變得更有意義,或是提升生活的品質,每個人應該都曾有過這樣的念頭,或懷有自己自身的夢想,但人類的生理和心理是很特別,雖然我們明確知道改變是對我們有益,但意識卻會不時閃過抗拒的念頭,說服我們放棄改變,就像天使與惡魔分別在你耳邊呢喃,此時就端看你改變的意志有多強烈。

本書的主題為在探討自我設限的高潛質族群,內容列舉了低成就高潛質族群的人格特質、自我挫敗及抑制潛能的行為模式,並提供一項精進的計畫,包含了15項任務,用以協助該族群改變自我並達成夢想。作者以臨床的實例及易懂的敘述,闡述書中的內容,未有艱澀難懂的理論或語句,讓人閱讀起來,感覺不至沉重與枯燥。

對於改變或精進,作者特別強調計畫和時間的重要,唯有適切的計畫才能不致背離方向,尊重時間才能有效率的達成目標,作者在書中也並非一昧提出改變所能夠帶來的成功和益處,相對的也表明改變會帶來某些狀況或問題,請改變者必須作好面對的準備與心態的調整,作者此種兼顧一體兩面的思考與實際的考量,是讓我覺得公正與欣賞的地方。本書的內容很札實與豐富,想要改變自己,但卻苦無方法的人,推薦閱讀本書,可透過書中循序漸進的任務,達到改善積習的效果。

改變不能僅是口頭說說或心中所想,改變必須是身體力行並要能堅持到底,過程或許會充滿猶疑或者感到些微痛苦,初期的成效也可能不彰,但透過不斷的努力與堅持,最終一定能有所收穫,並達到自我成長。今年我也必須為自己訂下目標,善加利用時間,期許自己能有所轉變並自我成長。上帝讓每個人都擁有獨特的特質,問題只是你發掘與善加利用了沒。

圖片來源:博客來書籍館