Sunday, August 17, 2008

部落格離線編輯軟體 - Windows Live Writer 的使用

這篇大概是寫個自己的一些朋友看的。其實自己並不算是部落客,所以一直覺得能寫出有豐富內容,以及一堆圖、一堆引用的文章,總覺得是非常厲害而且用心的事。最近開始了在這的一些文章後,便試著找些工具來輔助。果然我之前像是個井底之蛙一樣,發現目前的部落格的編輯功能已經有很大的進步,尤其是有所見即所得(WYSIWYG)的離線編輯軟體這回事。並沒有特別去研究其中特別的技術與協定之類的,不過之前花了一些時間在找,所以這邊就整理一下,目前自己在用的一些軟體與 plugin。

離線編輯軟體(Offline Blog Editor)

就目前 Google 出來的結果,有找到二個離線編輯軟體,室覺大家比較常用的。

  1. Zoundry Raven (或 Zoundry )
  2. Window Live Writer (有人簡稱 WLW。感覺好像是個特別的表情符號@@")
Zoundry Raven

Zoundry Raven 的頁面編輯功能較多,而且就介面來說,其實我比較喜歡。另外更重要的是,Media Storage 可以結合 Flickr,當然另外還有 Picasa、Custom FTP、Ripway FTP、Image Shack、Live Journal ScrapBook。這些 storages 應該是在 publish 時,主動上傳電腦中的圖檔並 link,不過似乎不行直接從現有 online 上撈出來插入,其實又有點可惜。另外「所見即所得」的部份,只有像一般編頁編輯,並沒辦法套用到線上的 CSS 。

這是 Zoundry Raven 的主畫面。可以把線上的文章都 download 離線觀看或備份。

Zoundry Raven

這是 Zoundry Raven 的編輯畫面。底下的 toolbar icons 可以看出有很多功能。不過站上的 CSS 並沒辦法立即套上預覽。

Zoundry Raven Editor

WIndows Live Writer

Windows Live Writer 頁面編輯的功能相對少,對 img tag 的設定則少了 title 可以設定(或許對 IE 來說,只要設定 alt 就好了吧 ><)。 至於圖片上傳 (picture upload),則只支援 blog services 本身所提供的(blogger 本身並沒有),或是 ftp。不過主要的好處是線上的 Theme(CSS) 會馬上套用在編輯環境,所以可以馬上知道瀏覽的結果如何。像圖中底下的 code snippet 部份。也是可以馬上看得到效果。再者還支援了 plug-in 以及其開發環境。所以網路上找得到一些好用的 plug-in 來增強原本不足的功能。

Windows Live Writer

WIndows Live Writer 的 Open 畫面。可以修改之前舊的 post。

Zoundry Raven - Open

WIndows Live Writer 的 preview 畫面。整個 blog 的 layout 都可以顯示出來,非常的有爽感。

Zoundry Raven - Preview

至於下載 WIndows Live Writer 的 plugin 主要有幾個地方

plug-ins 與其他輔助軟體

其實上面大概就可以猜到,最後筆者是決定使用 Windows Live Writer。只要是圖片上傳的問題能變的簡單,Windows Live Writer 就會是很好的工具。以下是另外輔助用的軟體及 plugin

SnagIt+Friendly.Flickr for WLW plugin

用 SnagIt 除了抓螢幕本身能力本來就強,主要是可以直接單鍵上傳至 Flickr。官網有更詳細的說明,不過要 SnagIt 8 以上才有的功能。

SnagIt Editor

接著你可以直接使用 Friendly.Flickr for WLW plugin,來插入圖片。所以只要結合 SnagIt 與 Friendly.Flickr,先把圖放上 Flickr,再取出直接使用 plugin 插入線上圖片即可。

Writer - Insert Friendly.Flickr

底下是 Friendly.Flickr 的使用範例。

Writer - Friendly.Flickr plugin

Friendly.Flickr

其實 Friendly.Flickr 則是國人開發的非常好用的 Flickr 工具。除了 Flickr 一般的上傳外,在抓取各圖集、圖等的連結(Links) 或管理是非常的方便工具。有用 Flickr 的人,這是一個必推的殺手級工具。plugin 版則與原來的程式版本,畫面其實幾乎是一模一樣。所以你也可以從 Friendly.Flickr 來拿出圖片連結的 html。

Friendly.Flickr

要貼上 WLW 就選 Edit -> Paste Special… –> HTML,即可。

Writer - Paste Special

其實最早的 Writer Plugin for Flickr 應該是 Flickr4Writer WLW plugin 的 。而Friendly.Flickr 參考了 Flickr4Writer,改了 bug,增加了功能。

Code Snippet WLW plugin

另一個 Code Snippet WLW plugin 是我找到對於 code formatter 比較完整且好用的 plugin。不喜歡的話可以自己再找找,網路上是蠻多的。

Writer - Friendly.Flickr plugin

Wednesday, August 13, 2008

置換 Android 預設的 intents (applications)

Android 開放的軟體平台,讓使用者可以選擇並安裝自己想要應用程式。其實就連原本裝置上的預設應用程式都可以被置換。只是翻了 Android Document 並沒找到任何的置換方法(小弟眼拙 ><)。後來才知道直接在 AndroidManifest.xml 直接設定要處理的 intent 即可。置換之後,會在執行此 intent 時,跳出視窗來選擇要直接的 Activity。

實作

AndroidManifest.xml 的設定如下:

   1: <activity android:name=".contact.TestContactActivity" android:label="@string/app_name">
   2:     <intent-filter>
   3:         <action android:name="android.intent.action.MAIN" />
   4:         <category android:name="android.intent.category.LAUNCHER" />
   5:     </intent-filter>
   6:     <intent-filter>
   7:         <action android:name="android.intent.action.VIEW" />
   8:         <category android:name="android.intent.category.DEFAULT" />
   9:         <data android:mimeType="vnd.android.cursor.dir/person" />
  10:     </intent-filter>
  11: </activity>

7-9 行就是宣告處理 view contacts 的 intent,在此則執行我們定義的 TestContactActivity。

TestContactActivity 則是很簡單顯示 intent 的 Activity:

   1: public class TestContactActivity extends Activity {
   2:     @Override
   3:     public void onCreate(Bundle icicle) {
   4:         super.onCreate(icicle);
   5:         setContentView(R.layout.main);
   6:         TextView tv = (TextView) findViewById(R.id.context);
   7:         tv.setText(getIntent().toString());
   8:     }
   9: }

結果

先執行 Dailer Dailer 後,在 Recent calls 中按下menu,如下:

View contacts

點選 View Contacts 後,接著就會出現 Select Activity 的畫面

Select Activity...

點選 TestContactApp,結果如下

intent replace result

查看 logcat 可以了解大致執行的過程。

   1: W/ActivityManager(  694):   Starting intent: Intent { action=android.intent.action.VIEW data=content://contacts/people launchFlags=4 comp={android/android.app.ResolveListActivity} }
   2: I/ActivityManager(  694): Done launching {android/android.app.ResolveListActivity}: 1021 ms
   3: D/ActivityManager(  694): Stopping: HistoryRecord{400b0ec0 {com.google.android.phone/com.google.android.phone.DialerActivity}}
   4: I/ActivityManager(  694): Starting activity: Intent { action=android.intent.action.VIEW data=content://contacts/people launchFlags=20 comp={com.omachi.test/com.omachi.test.contact.TestContactActivity} }
   5: D/ActivityThread(  795): Performing launch of ActivityRecord{4001b6b0 token=android.os.BinderProxy@40038cf8 {com.omachi.test/com.omachi.test.contact.TestContactActivity}}
   6: I/ActivityManager(  694): Displayed activity {com.omachi.test/com.omachi.test.contact.TestContactActivity}: 865 ms
   7: I/ActivityManager(  694): Done launching {com.omachi.test/com.omachi.test.contact.TestContactActivity}: 970 ms
   8: I/ActivityManager(  694): Removing activity: Intent { action=android.intent.action.VIEW data=content://contacts/people launchFlags=4 comp={android/android.app.ResolveListActivity} }

在 start intent 時,是指定執行 ResolveListActivity ,也就是選擇要執行 Activity的畫面。轉到 TestContactActivity時,launchFlags 則加上了 FORWARD_RESULT_LAUNCH(16) 。

結語

其實 Android 手機並未出現,到時在手機真正的情況是如何並不知道。不過可以了解到,Android 是想要讓使用者連手機預設的應用程式都可以換為自己使用。不過還是有幾點的問題啦

  1. 每次執行 intent 都要選一次:目前看來,之後應該是會有地方可以設定預設執行的應用程式才對。不然實用性會大大降低。
  2. 事情沒這麼簡單:其實已經很多人在對 Android 平台的 phonebook 產生興趣。不過因為 phonebook 與手機本身的整合度一定是極高,而且現有的 contacts content provider 是無法抽換的,dailer 的 call log 的資料也是在裡頭。所以在與現有 ap 做整合時,還是會有一定的困難度。
  3. 難搞的電信商:很多電信商的手機大都會綁死很多的規格,對這些這麼開放的規格,到時可能會有多少另外的限制,還真的是走著瞧。當然前提是如果他們肯用 Android 平台的話。