剛剛從Chrome要列印一份文件時, 發現一件有趣的事, 在選擇印表機時, 發現我的手機也在清單當中
原本在Android下解析JSON內容, 大多用JSONObject和JSONArray, 這兩個是很簡單的JSON parser, 只要將字串(String)傳入即可
不過, 這跟在用DOM解析XML是有類似的問題, 解析文件是一氣呵成, 必須要把所有內容先走過一遍, 也需要更多的記憶體來儲存, 這對於解析較大的文件是一個大問題, 必須要花費更多時間和空間, 而且如果所需要的資料就算只是整份文件中間的一小部分, 還是得先把整份文件走完, 在XML, 可以用SAX來解決這問題, 但Android要到API level 11(Honeycomb) 才新增了JsonReader這個算是JSON界的SAX的解決方案
JsonReader類似SAX, 也是一種streaming parser, 並不用一次讀出所有字串內容, 它要的只是個Reader, 但不太像SAX屬於事件驅動(event driven)的方式, 它應該比較像token consuming, 它定義了幾類基本的JsonToken, 它也有BEGIN(END)_OBJECT, BEGIN(END)_ARRAY這種類似SAX中startElement, endElement, 但卻沒類似SAX的startDocument
解析一個JSON物件的程式碼如下:
{username:"Bob", age: 14, sex: "m"}
解析一個物件, 要從beginObject開始(陣列則是beginArray), endObject結束, 接著透過一個while loop一個個走過這物件內所有的token, 說實在的, 不是很好debug, 你必須要先知道下一個要處理的token是啥類別, 以上面的例子為例, 物件內第一個token是”username”, 這是一個JsonToken.NAME, 因此要用nextName來處理, 搞錯了就會出錯, 還不容易知道錯哪, 而上面那例子裡的”else”也是必須的, 拿掉的話, 在endObject就會出錯, 因為這段程式並沒去處理”sex”, 因此處理完sex這個名字後, 並未消化掉”m”這個值(JsonToken.STRING), 而是直接endObject, 這會產生一個IllegalStateExceptionreader.beginObject();
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("username")) {
username = reader.nextString();
} else if (name.equals("age")) {
followersCount = reader.nextInt();
} else {
reader.skipValue();
}
}
reader.endObject();
最近科技界比較流行的戲碼是: Google要把Google Reader給送上斷頭台了
這齣戲有點輕肥皂劇的感覺, 先是Google公布要把Reader給喀嚓了, 再來就是一堆重度使用者叫苦連天, 一堆原本吃Google reader豆腐的服務跳出來說要接手實作替代方案, 緊接著是Google reader的Product manager 在Quora上爆料Google都把人抽去做Google+, 再來就是有重量級的部落格重炮轟擊Google關掉受歡迎的東西卻拿人力去開發沒用的東西(Google+), 對於這樣的評論, 個人是認為”言重了”, 我自己本身的觀點跟這些是有點相反的, 不過我的觀點不主流, 這篇也不是為了談這個, 只是先行加點小小囉嗦… :P
Google Reader停了, 對原本的重度使用者以及使用到他的服務比如說feedly, 應該是重傷不少, 對我個人而言, 影響不大, 我在幾年前早把我消耗資訊的習慣, 從Reader轉到Twitter了, 個人認為Twitter也是一個很好的消化資訊的管道
不過, 先不管Reader和Twitter…你聽過Google有一個跟Reader同質性相當高的服務叫Google Currents嗎? 這是一個在這一年內(應該是吧)的新服務(中文譯名是有點矬):
以往Twitter的search API是不需要任何認證, 也不需要設定啥App ID或啥consumer key的, 不過, 在API 1.1之後, 這就改了
因為1.1, search也列入rate limit的追蹤囉, 所以使用search API也要做認證(Authentication), 但由於search api的使用情境, 不見得一定需要使用者登入, 有些做資料分析的應用也有可能會用到, 所以強制用OAuth就有點不是很合理, 所幸, 除了用OAuth以外, 這類的API也可以使用Application-only authentication:
iOS和Mac OS的應用程式裡都有個info.plist放置著應用程式相關的設置, 用Qt開發Mac應用程式時, 這個檔是在編譯時自動產生, 因此幾乎是固定內容
但還是有需要在info.plist內加入額外的內容, 比如說Retina display的支援(NSHighResolutionCapable), 預設並沒有, 因此還是有需要做自訂的info.plist
作法並不難, 在專案檔(通常是 xxxx.pro)內加入下面的內容:
mac {QMAKE_INFO_PLIST = XXXX.plist}
前陣子買了一台Retina display的mac book pro, 興沖沖的把一切都設定好後, 正很滿足的想要用這漂亮的畫面開始工作時, 一打開Eclipse後, 一整個傻眼, 字變糊變鋸齒, 看來Eclipse對Retina display並沒有很好的支援, 查詢過各方資料後, 所幸還有救(不然就想投奔到別的IDE去了)
http://bit.ly/TT9RFS
這篇文章裡面使用到了BitmapShader做圓角的效果, 使用這方法, 如果drawRect的大小比原先大的話, 會根據Shader.TileMode來畫出不同的效果:
Shader.TileMode.CLAMP (效果: 尾端拉長) —
等了那麼久, 蝴蝶終於飛來了, 實在有點歷經波折呀~~~
去年的生日禮物是耳機 (AKG K-701) , 今年則是因為原本戴的FOSSIL錶打球的時候壞了,修又差不多買新的一半以上的錢(壞的好嚴重呀), 備用的錶的錶帶又常常脫落戴的不舒服, 所以就打算換隻錶
本來是看SEIKO, CITIZEN, 看金城武跟王力宏代言看起來蠻帥的, 日本錶功能又多, 科技感濃厚, 就有點感興趣, 不過直到昨天, 跑去看007電影Skyfall, Bonds戴的Omega也蠻帥的呀, 不過自己平常對錶沒啥研究, 不知道, 這還真是我買不起的高貴, 買不起Omega還是繼續跑去專櫃看了SEIKO, CITIZEN, 實際上看了實物, 還是失望了, 這不是我想要的型, 才發現我喜歡的並不是這麼濃的科技感, 而是比較古老一點的機械
再逛了一下瑞士的錶款, 還真一個比一個高貴, 好像只有TISSOT是外型跟價位還是我可以接受的, 所以今天就找了老婆, 小遠跟我去敗了這隻 - TISSOT PRC 200機械錶, 這還真是我戴過最貴的(羞), 也是第一隻機械錶
紅黑色的外盒: