在 macOS 上使用名片型 LED 字幕機

前兩週在逛光華商場的時候,看到店家在賣一種名片型的 LED 字幕機,想想如果在身上或是桌上有一塊這樣的玩意,顯示一些文字/圖案,應該還頂有意思的,就買了兩組回家當做玩具。

這玩意看起來稱呼很多種,我後來在網路上看了一下,以這一則網路拍賣來說,就還有「LED跑馬名牌」、「LED名片」、「LED名牌」、「LED胸牌」、「LED電子名片」等稱呼—販賣這種商品的店家還頂多的,甚至看起來型號都一樣,不太了解這個業界,也不知道是同一個工廠有很多個代理商,還是說有很多家都在生產,但是共用同一個設計。

這類字幕機價格在台幣五六百元之譜,有紅、藍、黃、綠等多種顏色,我買來的這組解析度為 12×48 pixels,但是好像還有一種更小一點的,解析度是 11×44 pixels。在裝置上可以容納八條訊息,可以用後方的按鈕決定要切換到哪一條訊息,後面還有磁碟以及別針,可以讓你貼在鐵器或是別在身上。

機器上也提供 USB 接頭,除了拿來充電之外,連接電腦之後,還可以透過軟體修改字幕機裡頭的內容,但軟體這部份其實有點麻煩。

Continue reading

在 Mac OS X/iOS 上指定中文排序

前一陣子遇到一個需求:我們現在有一個 array,裡頭是一堆中文字串,現在我們想要讓這些中文字串按照一些個定的中文索引方式排序,像是使用筆劃、拼音…等等。搞了半天,發現只要在 compare 的時候,選擇特定的 NSLocale 就好了,但是蘋果自己的文件中,居然對於有這些 Locale 可以設沒什麼著墨,顯然很多時候光看蘋果的文件是不夠的。

我們先來看段使用筆畫排序的程式碼:

NSArray *a = @[
	@"落魄江湖載酒行",
	@"楚腰纖細掌中輕",
	@"十年一覺揚州夢",
	@"贏得青樓薄倖名"];
NSLocale *strokeSortingLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh@collation=stroke"];
a = [a sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
	return [obj1 compare:obj2 options:0 range:NSMakeRange(0, [obj1 length]) locale:strokeSortingLocale];
}];
for (NSString *s in a) {
	NSLog(@"%@", s);
}

Continue reading

在桌面應用程式中使用 WebKit (5) - Mobile Safari 的 Plug-in

這一篇的內容對很多人來說大概沒什麼用,因為就算照著這篇提到的東西,寫了點程式出來,實際上也沒多少機會可以在使用者的裝置上應用,可是呢,只要討論 Cocoa,好像大部分人都興趣缺缺,談到 iPhone 卻又興致盎然。

※ iOS 的 WebKit Plug-in 基本上是一樣的

前一篇提到,我們可以直接在 Xcode 當中,透過 Xcode 本身所提供的專案範本,產生 WebKit Plug-In 專案,我們現在來做點好玩的事情。-我們把原本專案裡頭所有跟 Cocoa 相關的東西都拿掉,像是 Import Cocoa Framework 的地方,改成 Import UIKit,NSView 改成 UIView,NSRect 改成 CGRect,把 Base SDK 從 Mac OS X 改成 iPhone Simulator,在 iPhone 上面沒有定義 WebPlugInViewFactory,我們先拿掉,或是自己定義一個,裡頭只要宣告 + plugInViewWithArguments: 即可。

Continue reading

在桌面應用程式中使用 WebKit (3) - JavaScriptCore

前一篇最後簡略提了一下 JavaScriptCore Framework。JavaScriptCore 是 WebKit 的 JavaScript 引擎,目前的實作就是代號叫做 SquirrelFish,吉祥物是一隻長相恐怖的祕雕魚。

一般來說,在 Mac OS X 上,我們想要製作各種網頁與 Native API 程式互動的功能,大概不會選擇使用 JavaScriptCore,因為現在寫 Mac OS X 的桌面應用程式,多半會直接選擇使用 Objective C 語言與 Cocoa API,各種需要的功能,都有像在前兩篇提到的 Obj C 方案-使用 WebKit Framework 中的 WebScriptObject 與各種 DOM 物件。

Continue reading

在桌面應用程式中使用 WebKit (2) - JavaScript 與 Objective C 的溝通

在寫 JavaScript 的時候,可以使用一個叫做 window 的物件,像是我們想要從現在的網頁跳到另外一個網頁的時候,就會去修改 window.location.href 的位置;在我們的 Objective C 程式碼中,如果我們可以取得指定的 WebView 的指標,也就可以拿到這個出現在 JavaScript 中的 window 物件,也就是 [webView windowScriptObject]。

這個物件就是 WebView 裡頭的 JS 與我們的 Obj C 程式之間的橋樑-window 物件可以取得網頁裡頭所有的 JS 函數與物件,而如果我們把一個 Obj C 物件設定成 windowScriptObject 的 value,JS 也便可以呼叫 Obj C 物件的 method。於是,我們可以在 Obj C 程式裡頭要求 WebView 執行一段 JS,也可以反過來讓 JS 呼叫一段用 Obj C 實作的功能。

Continue reading

在桌面應用程式中使用 WebKit (1) -雜論,以及用 Objective C 操作 DOM

不久前公司信箱收到封信。來信的這位朋友說,他這幾年做網站做得非常膩,也覺得非常無趣,所以想要改做 Mac 軟體。

想改做桌面軟體好擺脫 Web,這種想法老實說不怎麼現實,首先呢,如果現在是想要做 iPhone 還是 iPad,可能還有點道理,以目前的 Mac 軟體環境來看,做 Mac 軟體大概就像寒天飲冰水,光是靠「不想做 A 所以來做 B」這種理由,實在不知道可以維持多久的熱情。國際巨星李奧納多.狄卡皮歐在電影《全面啟動》裡頭就告訴我們,光是負面情感,是沒有辦法真正深植想法的,今天做 Web 覺得煩了,誰知道哪天又覺得做什麼別的也煩了。

而且,做桌面軟體也不可能擺脫 Web。姑且不論 Google Chrome OS、Palm WebOS 這種擺明就要用 Web 技術實作桌面或行動裝置作業系統上的應用程式架構,或是 Adobe 提出像 AIR 這種用 Flash、HTML 與 JavaScript 就可以寫桌面應用程式的方案,現在哪一套桌面應用程式,幾乎都有或多或少的 Web 整合。

Continue reading