2014年11月5日

Google Calendar 與 Gmail 5.0

為了配合 Android Lollipop 的推出,Gmail 跟 Google Calendar 也翻新成 Material Design 的界面,順便加了一些新功能。

Google Calendar 5.0

  1. 跟 Google Now、Inobx、Google Keep 的 reminder 整合了。不知道Google Tasks哪時會被徹底關掉?
  2. App 可以顯示國家、宗教節慶但跟 Web 版的節慶行事曆無關。App 看得到 Web 的,反之不然。App 跟 Web 版的聯絡人生日是同一份,沒有上面這問題。
  3. 不知道為啥日期的顯示模式是「1天」跟「5天」,沒有「7天」或「工作日」模式。

Gmail 5.0…… 除了界面翻新、支援 IMAP、POP3 ,好像沒什麼特點。

想提早嘗鮮的可以從 APKMirror 下載(,這非 Google 官方途徑、後果請自負。)

是說,Google 的 app 界面設計可以一致點嗎?Gmail 的「設定」為什麼不像 Google Calendar、Inbox 一樣固定在側欄、永遠可見呢?(←單純因為label太多,捲到生氣、惱羞成怒)

2012年3月2日

[Android] 替 TextView 加上圖示

Android 的 TextView 除了顯示文字,還可以在上、下、左、右加上圖示。
透過程式,有三種方法:

TextView#setCompoundDrawablesWithIntrinsicBounds(int, int, int, int);
TextView#setCompoundDrawablesWithIntrinsicBounds(Drawable, Drawable, Drawable, Drawable);
TextView#setCompoundDrawables(Drawable, Drawable, Drawable, Drawable);

前兩個方法會完整顯示指定的 drawable;若使用最後一個方法記得要先呼叫 Drawable#setBounds() 指定 drawable 的顯示範圍。像這樣:

aDrawable.setBounds(0, 0, 60, 60);
textView.setCompoundDrawables(aDrawable, null, null, null);

2012年2月21日

[Android] 圓角框的陷阱

陷阱 1. 只有特定角落要圓角效果

作法:
指定預設值(「android:radius」)為大於 1 的值,再把不需要圓角的角落指定為「0dp」;
而且預設值不可以跟特定角落的圓角半徑值相同。

2012年1月9日

密碼應該怎麼存?

最近明文密碼的話題很紅,
決定來重貼以前關於密碼編碼(password hashing)的筆記:

  • 編碼(hash)時請記得加鹽(salt)
  • 不要整個系統都用一樣的 salt,請每次都以亂數方式產生。
  • 把 salt 跟 hash 放一起,不要分開存。
  • 結合方式最好可以有變化,
    例如:由明碼長度決定 salt 的插入位置。

用 PHP 寫起來大概像這樣:

$salt = substr(hash_func(uniqid(rand(), true)), 0, $saltLen);

$hash = hash_func($salt . $plain);

$saltStart = strlen($plain);
return substr($hash,0,$saltStart) . $salt . substr($hash,$saltStart+1);

另外,理想狀況是客戶端跟伺服器端間以加密方式(如,SSL)傳遞密碼。但是事情往往沒有這麼美好,沒辦法用 SSL 的話,可以參考〔延伸閱讀〕第 3 篇提到的「瀏覽器端 hash」。

@yllan 補充

密碼不要用 md5 比較好,要找比較難算的 hash function 例如 bcrypt 可以參數調整難易度。否則就算加了鹽,md5 還是很容易 crack

@yunglinho 補充: 《How To Safely Store A Password

  • Salts Will Not Help You
  • Use bcrypt

延伸閱讀:

  1. 密碼為什麼不能存「明文」? | 我的密碼沒加密
  2. A Basic Lesson in Password Hashing - seanmonstar
  3. hoamon's sandbox: 不應該在資料庫中紀錄使用者的明碼密碼

2011年6月24日

Radix Sort 搭配 Sleep Sort(Ruby 版)

看了 fcamel 的〈運用 radix sort 的概念加速 sleep sort〉,下午試著用 Ruby 改寫,順便拿掉暫存檔。但是相同 digit 的 thread 不一定照原本的順序結束,而變成 unstable sorting;我只好又加上「依 digit 分組」來避開這問題。

2010年6月29日

IE Bug:JavaScript 字串中有 HTML 註解

IE(5.5 ~ 8.0)會將下列片段中的灰色部分視為 HTML 註解而無法得到正確的 DOM:

2010年6月23日

[Android] 威寶 A688 在 Market 上找不到應用程式

最近在 Android Market 上了一支應用程式,
但是某些手機(如:威寶 A688)卻無法搜尋到此程式。

原來是因為這隻程式用到相機功能,
所以產生出來的 APK 檔被自動地加上「自動對焦」的需求。
導致缺乏此功能的手機「莫名地」無法在 Market 上找到此應用程式。

解法很簡單,
在 AndroidManifest.xml 裡明確地將「自動對焦」設為非必須即可:

<uses-feature
        android:name="android.hardware.camera.autofocus"
        android:required="false" />

由於 2.0 以上的 SDK 才支援「android:required」屬性,
所以要改用 2.0 以上的 SDK 來編譯,並設定正確的「minSdkVersion」。


P.S. SDK 工具中的 aapt 可以查看 APK 檔實際上的 manifest 內容:

aapt dump badging $APK_PATH

2010年5月25日

僅匯出 SVN 修改過的的檔案

今天同事提出這個問題,把解法記下來備忘

我也用 svn diff --summarize 寫了個 one-liner;
但是沒想到要用 rsync,後半段長很醜。

2010年1月12日

讓 Nokia S40 手機與 Google 通訊錄同步

同步設定

功能表 → 設定 → 組態 → 個人組態設定 → 新增一個「同步處理」
  • 帳號名稱: 隨你高興 ———(1)
  • 伺服器位址: 「https://m.google.com/syncml」
  • 用戶名稱/密碼: Google 帳號與密碼
  • 通訊錄資料庫:
    • 資料庫位址: 「contacts」
    • 用戶名稱、密碼: Google 帳號與密碼
  • 使用首選連聯結點: 確認

開啟自動同步

功能表 → 設定 → 同步處理與備份 → 數據傳送 → 編輯「伺服器同步」
  • 同步處理資料: 通訊錄
  • 同步處理設定
    • 組態: 個人組態
    • 帳號: 步驟(1)設定的帳號名稱
    • 用戶名稱、密碼: Google 帳號與密碼
  • 自動同步處理: 選擇你要的同步週期

手動同步

如果不需要常常同步,那有兩種方式手動同步的方法:
  1. 功能表 → 設定 -> 同步處理與備份 -> 數據傳送 ->伺服器同步
  2. 功能表 → 通訊錄 -> 同步處理全部

註:同步處理只影響手機記憶體裡的通訊錄,不會影響 SIM 卡上的資料。

2009年12月10日

檢查 Google 未讀訊息的 Google Chrome 外掛

粒粒分明組

節省空間組

不過根據 LiveScience 的文章1,應該完全不要裝這些通知外掛才對。 :p


  1. Workers Should Turn Off Visual Alerts, Study Finds | LiveScience

2009年11月25日

Gmail 與 Google Reader 近日更新

離線版 Gmail 支援附檔

原本離線使用 Gmail 的時候無法上傳附件1,但最近加上了這項支援。
所以要寄檔案時不必先注意自己是不是處於連線狀態了。

還沒有開啟離線功能的人,可以從這裡開啟。

消息來源Official Gmail Blog: Send attachments while offline

Google 閱讀器(Google Reader)可顯示 favicon

一圖勝千文:

消息來源Let your subscriptions' personality come through


  1. 我沒有實際試過,這是轉述官方文章的內容。

2009年11月9日

什麼是 metaprogramming?

剛剛在 JavaScript的中介編程與反射能力示範 讀到兩個 metaprogramming 的範例。
我覺得其中 foreach() 的例子怪怪的。

先來看看維基百科上對 metaprogramming 的定義:

Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, ......

回過頭來看該篇文章所實作的 foreach()
它接受並調用一個函數(f)以及存取一個物件(this.props),但是並未產生或是修改到任何「程式」。
我不懂作者怎麼會拿它當作 metaprogramming 的例子。

不過文章中另外一個例子——accessor()——就是個很典型的 metaprogramming 範例。

2009年9月28日

[Android] 待辦事項(to-do)應用程式

最近買了新手機,第一件事情就是找好玩的遊戲趁手的工作事項管理軟體,若是針對 GTD 設計的更好。
以下是我這兩天的試用心得:

Astrid Task/Todo List - 單純的工作清單(task),可以設定 priority 與 tag。

  • 優點
    • 支援工作時間預估與追蹤(time estimation/tracking)
    • 到期日分為軟性與硬性兩種(absolute/goal due)
    • 單一 task 除了特定時刻的提醒(reminder)外還可以有週期性提醒(periodic reminder)
    • 支援重複性 task
    • 可以跟 RTM 同步
  • 缺點
    • 其實沒有什麼太大的缺點,只差在它不是專門針對 GTD 的概念設計。

OpenLoopz Free

  • 優點
    • 位置、時間、聯絡人三種特別的情境(context),
      可以根據手機現在的時間地點調整工作項目(action)的顯示順序。
    • 支援階層式 action ,有子項目的 action 會自動被視為 project。
  • 缺點
    • Action 是新增順序排列,且無法調整
    • 被刪除的 action 不會真正被清除,有時候會干擾正常操作

Shuffle - 典型的 GTD 工具,有 inbox、project、context 三種主要檢視模式。

  • 優點
    • 會自動挑選 project 內到期日最早的項目為 next action,不必特別設定
    • 畫面比較好看,可以設定 context 的顏色與 icon,一目瞭然。
    • 「Due actions」 檢視模式,列出今天、一週內,一個月內的工作項目。
    • 「Save and new」可快速新增多筆 action
    • 可將資料同步到 Google Calendar
  • 缺點
    • Project 只能用來作 action 的分類 ,沒有太多細節可以設定
    • 一個 action 只能指定一個 context。
    • 無法只設定 due date,一定要同時指定 start date。

最後是 Shuffle 以使用流暢性取勝!


另外還有兩套我沒有花很多時間試的:

ActionComplete
還沒多人推薦的 GTD 軟體,搭配 AC Inbox 應該會很方便;但是我完全看不懂它介面上的中文詞彙,所以就放棄了。
myGTD
介面太花,我連功能都沒試就關掉了。
這邊還有其他軟體的簡介。

2009年8月17日

政治指南針:政治偏左,經濟偏右

剛剛做了政治指南針這個測驗。
傾向跟我自己的認知差不多,不過程度比我想像中的低很多。


就某種意義來說,我其實是個騎牆派。 :p

2009年8月16日

[Plurk] 透過 MSN 收發噗浪

不知道為什麼 Plurk 把即時通訊機器人(IM Bot)的設定藏在很奇怪的地方。
我簡單地整理了一下,提供給有需要的人。 :)

首先點左上的的通知


然後切換到「提示2」


「現在就開始吧」!


選取一個即時通訊服務(MSN、Yahoo 即時通、Google Chat等)


選擇好後,別忘了輸入你的帳號,然後按下「Sign Up」!



一切沒問題的話,你會收到噗浪機器人加你為好友的通知。
將它加為好友,並告訴它你的噗浪帳號(以 MSN 送出你的 Plurk 帳號),就大功告成了!

以後你只要傳 MSN 訊息給這個機器人,它就會將你的訊息發佈到噗浪上;
有新的噗它人也會即時通知你。

後續使用細節可以參考:

2009年8月6日

[Design Patterns] 論 Template Method 與 Strategy (下)

前一篇文章提到:採用 Design Patterns 書中對 Template MethodStrategy 的(形式)定義,很難在動態語言中區隔兩者的不同。
是因為這兩個 pattern 在本質上是相同的呢,或者是有其他的判斷方式?讓我們回過頭去看看先前被我忽略掉的部分--pattern 的目標/意圖--能不能回答這個問題。

根據 C2 Wiki,Template Method 的目標為「定義一個演算法的骨架,將其中的某些步驟延遲到子類別才決定」(*1)。也就是說此 pattern 應該要具備「(固定的)演算法骨架」與「(未決定/可變動)的演算法步驟」兩個要素,其中「步驟」的主要作用在於實現該演算法,且其具體內容應該要遵循「骨架」的規範或限制。

Template Method 的「骨架」除了抽象類別的形式,也可以由定義了「步驟」規範的介面與使用該介面的 client 所組成;而原本由子類別提供的具體「步驟」內容則由實作該規範介面的類別提供。事實上,這樣的形式反而更接近 Wikipedia 上的描述(*2)。
那麼這種非抽象類別的形式,會不會也是 Strategy pattern 呢?

C2 Wiki 對於 Strategy 的目標描述是「定義多個演算法,各別封裝這些演算法,並讓它們可以互換」(*3)。所以其特徵為「一組彼此獨立且可互換的演算法」,至於使用這些演算法的 client 部分並不在此 pattern 討論的範圍內。

在前述非抽象類別形式的 Template Method pattern 中實作了「步驟」規範介面的類別其實可以視為 Strategy pattern 的一種;不過「骨架」部分則不在 Strategy pattern 範圍中。所以兩個 pattern 在這種形式下是互相合作,而非表示相同的概念。

結論呢?上面就寫了半天,我實在沒辦法做什麼有力的結論了。
簡單說一下心得:雖然 pattern 的說明與呈現通常著重在形式上,但在學習形式的同時,應該要瞭解其中每個部分所扮演的角色與具備的特性。最好可以再進一步瞭解 pattern 隱含的精神。就像張無忌學太極一樣,學到把招式都忘記你就成功了!!(開始亂掰了……)


1. Template Method Pattern (C2 Wiki)
2. Template Method Pattern (Wikipedia)
3. Strategy Pattern (C2 Wiki)

[Design Patterns] 論 Template Method 與 Strategy (上)

昨天在 Plurk 上面回了 fcamel 一段話(*1):
我以為 "template method" 改用組合就是 "strategy" 了 :p
不過我想會分成兩種 pattern ㄧ部分也是因為靜態語言的特性使然吧
由於 Plurk 會限制字數,不太適合發表長篇大論。所以我打算透過這系列文章把想說的東西表達清楚一點,並且討論一下這兩個 pattern。

Design Patterns 對這兩個 pattern 的描述如下:
Template method
defines the skeleton of an algorithm as an abstract class, allowing its subclasses to provide concrete behavior.
Strategy
allows one of a family of algorithms to be selected on-the-fly at runtime.
在這樣的定義下,如果採用組合(composition)的形式,自然不會是 Template Method Pattern。而不論在靜態或動態語言中組合關係都是可以在執行時期才決定的。所以我認為(在上述的定義下):「"template method" 改用組合就是 "strategy" 了」。

在靜態語言中,類別的內容必須在執行時期前就確定。因此提供 Template Method Pattern 中具體行為的子類別自然不會落在 Strategy Pattern 的範疇中。反之,由於動態語言允許執行時期修改類別定義,而讓一個類別有可能同時被用來實現這兩個 pattern。這是我回文後半段所沒說清楚的部分。

當然,前面論述採用了比較狹義的 pattern 定義;而且我只討論了 pattern 的形式,而忽略套用 pattern 的動機(也就是 pattern 所想解決的問題)。但這些已經超過原本 Plurk 回文想說的內容,所以我將這部分留在後續文章中討論。(謎之音:擺明就是要拖稿嘛)


1. 這則 plurk 在

2009年7月20日

利用 Posterous 記錄閱讀網站時的筆記與心得

這次要來介紹一個 blog 系統—Posterous

它主打的特點是:不用註冊,只要發 E-mail 就可以張貼網誌。詳細步驟與功能介紹請參考重灌狂人的<Posterous 用Email寫部落格,自動貼圖、嵌入音樂、影片>

我只補充一個比較少被提到的功能:書籤列小工具(bookmarklet)。它可以將你選取(或是它自己偵測到)的圖片、影片、文字加到你要張貼的文章中。所以我現在都利用它在瀏覽網頁時作筆記或整理心得。

不過 Posterous 的 bookmarklet 連結與說明有一點難找,懶得找的人可以直接點這裡

如果你不知道怎麼把 bookmarklet 加到你的瀏覽器,請參考該頁右邊綠色區塊的說明;
實際使用方式,請點該頁左邊三個「Show me how」。
(請原諒我懶得製作圖文並茂的教學 :P)

因為 Posterous 實在太方便了,我又懶得把我放在 Posterous 的內容再整理到這邊來,所以看來這邊又要乾一陣子了。 :P

2009年7月11日

網頁瀏覽紀錄 7/8 ~ 7/10

嗯...我懶得分類。我盡量把類似的主題放在比較靠近的地方。

2009年7月8日

[書摘] Don't make me think - 如何設計好網站

我還沒真正看過《Don't make me think - 如何設計好網站》這本書,
以下內容是節錄自 10 Usability Lessons from Steve Krug’s Don’t Make Me Think
  • 易用性(usability)代表的是...
    確保某樣事物可以正常地運作,讓經驗與能力在平均水準的人可以沒有困難地使用它並且達到被預期的功效。

  • 網站(web application)要能自我詮釋
    網站的作用與使用方法應該要能夠不言自明、顯而易見。

  • 不要讓我思考
    不要讓使用者去猜你的網站上有哪些功能、或是該怎麼用。

  • 不要浪費我的時間
    多數人是為了節省時間而使用網路。

  • 使用者依戀著「上一頁」按鈕
    使用者在網站做了錯誤的操作,他們不會覺得有什麼大不了的,而會試著按幾次「上一頁」來修正錯誤。

  • 我們是習慣的動物
    找到一個有效的方法,就算還有更好的方法也不要去改變。

  • 沒有閒聊的時間
    使用者不是來閒聊的,使用者只想要立刻找到他們要的東西。

  • 不要忘了搜尋功能
    有些使用者進到新網站的第一件事情就是找搜尋框在哪。

  • 提供概念上的網站地圖(site-map)
    使用者不在乎網站上的功能與內容實際上放在哪裡;
    他們只想知道他們自己在概念上/流程上的哪個位置。

  • 讓回到首頁變得容易
    這樣使用者迷路時才知道可以從哪邊從頭來過。

延伸閱讀