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

接下來要介紹在 macOS 與 iOS 上安裝 Game Boy 模擬器:OpenEmu (macOS)、Provenance (iOS)。
閱讀全文最近看了《俄羅斯方塊:版權之戰》這部電影,看完後興起了想買一台二手 Game Boy 的念頭,不過又怕買了後,玩沒幾次就放在一旁生灰塵了,所以後來決定先用 Game Boy 模擬器玩玩 Game Boy 遊戲。
接下來要介紹在 macOS 與 iOS 上安裝 Game Boy 模擬器:OpenEmu (macOS)、Provenance (iOS)。
閱讀全文原本的《台北城垃圾桶地圖》是用 Objective-C 寫的,我上個月練習 SwiftUI 時,用 SwiftUI 重寫了《台北城垃圾桶地圖》,並重新上架到 App Store。
最近看了《人工智慧開發實務 – 使用 Swift》這本書,覺得這本書寫的真不錯。
不像其他有著艱澀數學與演算法的 Machine Learning 書籍,這本書是屬於實戰類型的書,只用了第十章稍微說明了那些可怕的 ML 演算法,其他章節則教你如何使用 Apple 系統內建的 framework 來做電腦視覺 (Vision)、自然語言處理 (Natural Language)、聲音分析 (Sound Analysis),語音識別 (Speech) 等功能,還有如何使用 CreateML 等工具來訓練自己的 ML 模型。
而且這本書提供了大量的範例程式碼,所以可以很容易的把那些功能運用在現有的 App 上。
這本書真的大推呀!👍 👍 👍
最近我利用政府資料開放平臺的「全國郵局即時振興三倍券販賣存量」資料集,寫了一個地圖 app,順便練習一下 Swift。😌
程式碼在此:https://github.com/wlmaplab/TW-3000Map。
最近把以前一個用 B4i 寫的 iOS app 用 Swift 重寫,功能是:用 iPhone 的 Touch ID 解鎖自己的電腦。這個程式的原理很簡單,是用一塊 arduino 模擬成 HID Keyboard,然後 iOS app 透過 BLE 把密碼傳送給 arduino 裝置,接著 arduino 裝置再把密碼輸入到電腦,利用這種方式解鎖電腦。
HID Keyboard 的部分,以前是用 Blend Micro 來做,這次則改用 Arduino Nano 33 IoT 來做。
以下是 Demo 影片與 Source code 連結:
程式碼已放到 GitHub 上:https://t.co/9tGDOg3b4s
— 頑皮柴之助 (@riddle_ling) June 16, 2020
最近在學 Kotlin 與重學那個學過但沒有學會過的 Swift,發現 Kotlin 的 nullable 與 Swift 的 Optional 非常像,大概有 87 分像吧 (不能再低了)? 所以我做了個對照表:
補充說明:
在寫地圖應用的 App 時,有時候需要用到利用座標(經緯度)去查詢那個點的地址,這時可以這麼寫:
#pragma mark - MKMapViewDelegate
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
// 取得 MapView 中心點座標:
CLLocationCoordinate2D center = [self.mapView centerCoordinate];
NSLog(@"緯度:%f, 經度:%f", center.latitude, center.longitude);
CLGeocoder *ceo = [[CLGeocoder alloc] init];
CLLocation *loc = [[CLLocation alloc] initWithLatitude:center.latitude longitude:center.longitude];
[ceo reverseGeocodeLocation:loc completionHandler:^(NSArray *placemarks, NSError *error) {
CLPlacemark *placemark = [placemarks objectAtIndex:0];
if (placemark) {
// 這個 Dictionary 有地址的相關資訊:
NSLog(@"addressDictionary %@", placemark.addressDictionary);
NSLog(@"region: %@",placemark.region);
NSLog(@"country: %@",placemark.country);
NSLog(@"locality: %@",placemark.locality);
NSLog(@"name: %@", placemark.name);
NSLog(@"ocean: %@",placemark.ocean);
NSLog(@"postalCode: %@",placemark.postalCode);
NSLog(@"subLocality: %@",placemark.subLocality);
NSLog(@"完整地址: %@", placemark.addressDictionary[@"FormattedAddressLines"][0]);
NSLog(@"City: %@", placemark.addressDictionary[@"City"]);
NSLog(@"Name: %@", placemark.addressDictionary[@"Name"]);
} else {
NSLog(@"Could not locate");
}
}];
}
如果是想輸入地址,然後用地址查出座標呢?可以這麼寫:
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:@"台灣臺北市信義區市府路1號" completionHandler:^(NSArray *placemarks, NSError *error) {
if (error) {
NSLog(@"%@", error);
} else {
CLPlacemark *placemark = [placemarks lastObject];
NSLog(@"緯度:%f, 經度:%f", placemark.location.coordinate.latitude, placemark.location.coordinate.longitude);
}
}];
參考來源:
有時候開發 iOS App 時,因為某些考量,會讓整個頁面使用 HTML 頁面,而不是使用原生的 iOS 畫面,但是此 HTML 頁面又必須與原生的 code 互動。例如:我們現在有一個會員註冊頁面使用 HTML 頁面,當註冊成功時,必須通知 App 跳轉頁面,這時我們可以讓 HTML 頁面在註冊成功時,呼叫一個叫做 RegisterOK() 的 JavaScript 函數,當這個函數被調用時,我們呼叫一個 Objective-C 函數或是方法,然後開啟其他的 iOS 頁面,這時可以這麼做:
先包含 JavaScriptCore.h
標頭檔:
#import <JavaScriptCore/JavaScriptCore.h>
使用 JavaScriptCore 跟 UIWebView 互動:
#pragma mark - UIWebView Delegate
//...
- (void) webViewDidFinishLoad:(UIWebView *)webView {
// 透過 KVC 取得 JavaScriptContext
JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
context[@"RegisterOK"]= ^() {
NSLog(@"Call RegisterOK()");
// 執行一些動作,例如跳轉頁面:
//...
};
}
Apple Inc. 為 C、C++、Objective-C 等語言加入了 Block 這個非標準的擴充功能。
簡單來說,Block 是一種可以當作變數傳遞的函數,而且具有 Closure(閉包)
特性。
Closure 是指一個包裹了區域變數的函數物件。
有一種常見的三元運算符用法如下:
NSString *aString = nil;
NSString *outString;
outString = aString ? aString : @""; //=> outString: ""
aString = @"Hello";
outString = aString ? aString : @""; //=> outString: "Hello"
對於這種三元運算符用法,GCC C Extension 增加了可省略中間運算式的 ?: 運算符來縮短這種寫法,用法如下:
NSString *aString = nil;
NSString *outString;
outString = aString ?: @""; //=> outString: ""
aString = @"Hello";
outString = aString ?: @""; //=> outString: "Hello"
我在《 Java 程序員修煉之道》這本書裡看到這種運算符稱作貓王運算符(Elvis operator)
:
因為這個符號看起來明顯很像貓王鼎盛時期梳的大背頭
重點來了,我寫這篇筆記只是想說:貓王運算符這個名字真是太可愛了! >////<