分類彙整: Mac

在 macOS 與 iOS 上安裝 Game Boy 模擬器

最近看了《俄羅斯方塊:版權之戰》這部電影,看完後興起了想買一台二手 Game Boy 的念頭,不過又怕買了後,玩沒幾次就放在一旁生灰塵了,所以後來決定先用 Game Boy 模擬器玩玩 Game Boy 遊戲。

Apple TV+ 上的《俄羅斯方塊:版權之戰》

接下來要介紹在 macOS 與 iOS 上安裝 Game Boy 模擬器:OpenEmu (macOS)、Provenance (iOS)。

閱讀全文

發票對獎相機

延續上個月的練習,我利用 Apple Vision Framework 的文字檢測與辨識功能,寫了一個統一發票的對獎 app,目的是用來對獎傳統的統一發票

傳統的統一發票沒有 QR code,所以我採用檢測文字的方式去檢測發票號碼,然後再比對有沒有中獎。

原始碼:https://github.com/kyumdbot/TaiwanReceiptLottery

Demo 影片:

Apple Vision Framework 試玩

這個月幾乎都在玩 Apple 的 Vision Framework,並寫了幾個 Demo app,分別有:

◎ 人臉檢測與 Object 檢測(查看原始碼):

◎ 手部姿勢檢測(查看原始碼):

◎ 手寫數字檢測(查看原始碼):

我覺得電腦視覺真的太好玩了,可以做很多有趣的應用,而且 Apple 已經推出 ARM 版 CPU 的 Mac 電腦了,希望 Apple 也能出一款體積比 Mac mini 還小的 Mac nano,用 ARM Mac 搭配 Vision Framework 與 CoreML 來做應用,應該會很有競爭力吧 (? 🤔 ,而且 macOS 的 GUI 比較容易寫的說(跟 GTK 相比)…

好書推薦:《人工智慧開發實務 – 使用 Swift》

Practical Artificial Intelligence with Swift 繁體中文版

最近看了《人工智慧開發實務 – 使用 Swift》這本書,覺得這本書寫的真不錯。

不像其他有著艱澀數學與演算法的 Machine Learning 書籍,這本書是屬於實戰類型的書,只用了第十章稍微說明了那些可怕的 ML 演算法,其他章節則教你如何使用 Apple 系統內建的 framework 來做電腦視覺 (Vision)、自然語言處理 (Natural Language)、聲音分析 (Sound Analysis),語音識別 (Speech) 等功能,還有如何使用 CreateML 等工具來訓練自己的 ML 模型。

而且這本書提供了大量的範例程式碼,所以可以很容易的把那些功能運用在現有的 App 上。

這本書真的大推呀!👍 👍 👍

Taipei Maps – 台北生活的工具地圖

我寫了一個 Mac 版的地圖 app:Taipei Maps。

這個 app 目前使用了這些資料集:

  • 公共飲水機
  • 自來水直飲臺
  • Taipei Free 熱點
  • 自行車停放區
  • 垃圾清運點位 (垃圾車)
  • 行人清潔箱 (垃圾桶)
  • 台北市公廁
  • 新北市公廁
  • 郵局營業據點

可在地圖上查看這些資料的位置與相關資訊。

程式碼在此:https://github.com/wlmaplab/TaipeiMaps

老 MacBook 裝 x86 Raspbian

最近把老舊的 MacBook 2010 的 RAM 加到 8GB,然後把作業系統改裝 Raspberry Pi Desktop (x86 Raspbian),有這台機器又活起來的感覺!嗯…也許是我還蠻習慣 Raspbian 的關係吧 (?

不過因為 MacBook 的螢幕太亮,而 LXDE 沒有內建調整螢幕亮度的軟體,所以需要自己手動更改螢幕亮度值,螢幕亮度的設定檔通常會放在 /sys/class/backlight/{顯卡類型之類的}/ 目錄裡面,例如我的 MacBook 2010 的螢幕亮度設定檔就放在 /sys/class/backlight/nv_backlight/ 裡,設定檔名稱通常是叫做 brightness,同個目錄下還會有一個叫做 max_brightness 的檔案,這個檔案可以看亮度最大值是多少,像我的 max_brightness 裡的數值是 100,所以我在修改 /sys/class/backlight/nv_backlight/brightness 的數值時,範圍就是 0 ~ 100。

要更改螢幕亮度時,用 nano 或是 vim 開啟設定檔,然後修改數值即可:

$ sudo nano /sys/class/backlight/nv_backlight/brightness

不過每次這樣改好像有點不直覺 (其實是我都會忘記設定檔的目錄路徑 XD),所以我寫了一個 GUI 小程式,用來調整我的 MacBook 2010 的螢幕亮度:https://github.com/kyumdbot/rpd-brightness

Kotlin’s Nullable vs. Swift’s Optional

最近在學 Kotlin 與重學那個學過但沒有學會過的 Swift,發現 Kotlin 的 nullable 與 Swift 的 Optional 非常像,大概有 87 分像吧 (不能再低了)? 所以我做了個對照表:

補充說明:

  1. 使用 ?.as? 運算子時,傳回值的型態一樣會是 nullable (Kotlin) / Optional (Swift),所以對傳回值的後續處理一樣要用 nullable (Kotlin) / Optional (Swift) 的方式對待之。 (心法:只要傳回值有可能出現空值 ( null / nil ),那個傳回值就會是一個 nullable / Optional 。)
  2. Swift Optional 的驚嘆號 ( ! ) 表示直接把 Optional 變數解包並當成有值去對待,所以當變數是空值 (nil) 的時候,對空值調用方法 (或者說:發送訊息) 時當然會當掉,因為空值無法響應那個方法。例如這行程式:str!.uppercased(),當 str 裡是一個 String 的時候,對它調用 .uppercased() 方法是沒問題的,可是當 str 裡是 nil 的時候,這時就會出錯了,因為 nil 沒有 .uppercased() 這個方法,所以會當掉。Kotlin 的 !! 符號是非空斷言 (Not-Null Assertion),告訴編譯器這個地方出現的值不會是 null,所以編譯器會把它當成非空型態去處理,但是,如果這個值不幸是 null 的話,就會拋出一個例外。
  3. Kotlin nullable 與 Swift Optional 不一樣的地方在於:Kotlin nullable 不是一個實際的 Type,例如這行 Kotlin 程式:var str : String? 表示 str 實際上的 Type 會有兩種情況:String 或 null,所以 str 變數的值有可能是一個字串,也有可能是一個空值。但是在 Swift 裡,這行程式:var str : String? 表示 str 的 Type 是一個 Optional,str 變數的值就是一個 Optional,只是這個 Optional 裡的內容可能是一個字串,也可能是一個 nil。也就是説:當一個變數的值可能出現空值時,Swift 用 Optional 去封裝那個變數;但在 Kotlin 裡,把變數宣告成 nullable 的型態時,只是在告訴編譯器,這個變數有可能出現空值 (所以這個變數的 Type 實際上可能會出現兩種情況),然後編譯器就會對這個變數做可空型態的檢查,確保程式碼裡有把出現空值的情況考慮進去。