福野泰介の一日一創 - create every day

すぐ作れる力で備える。一日一創のきっかけ、3.11 - Swift4で点字テーブルアプリ

2018/03/11
#swift #braille 

7年前の2011年、必要なものをすぐに作ることができなかった悔しさが、2012年の一日一創の原動力。
あのときには存在しなかったオープンデータが、今は日本中にある。
開発力を持った子供たちがどんどん誕生している。

久々にiPhoneネイティブアプリをSwiftで作ってみる。
Swift入門から3年、当時Swift2だったものはSwift4になっている。
時代に合わせてどんどん変わる言語を使うには、webと自ら学ぶ力、大事。

動作確認を兼ねて、点字を覚えるためのアプリを作成。
点字と書いた点字アイコン。

タップしたら、体表点字化させるなど、何か作ると、追加でいろいろ改造したくなる。


Xcodeの新規プロジェクト作成画面、"Argumented Reality App"を選ぶと、すぐにできちゃうARアプリ。

当初は有料でしか開発できなかったiPhoneアプリ、今は無料なのでMacとiPhoneを持っていれば子供でも気軽に開発可能。
[Xcode][iOS] 有料ライセンスなしでの実機インストール 全工程解説! | Developers.IO
あると楽しい、すぐ作れる力!

点字テーブルアプリのプログラム(ViewController.swift)

// // ViewController.swift // tenji1 // // Created by Taisuke Fukuno on 2018/03/12. in Swift4 // CC BY http://fukuno.jig.jp/ // import UIKit class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { var tableView:UITableView! /* 2800 ⠀ ⠁ ⠂ ⠃ ⠄ ⠅ ⠆ ⠇ ⠈ ⠉ ⠊ ⠋ ⠌ ⠍ ⠎ ⠏ 2810 ⠐ ⠑ ⠒ ⠓ ⠔ ⠕ ⠖ ⠗ ⠘ ⠙ ⠚ ⠛ ⠜ ⠝ ⠞ ⠟ 2820 ⠠ ⠡ ⠢ ⠣ ⠤ ⠥ ⠦ ⠧ ⠨ ⠩ ⠪ ⠫ ⠬ ⠭ ⠮ ⠯ 2830 ⠰ ⠱ ⠲ ⠳ ⠴ ⠵ ⠶ ⠷ ⠸ ⠹ ⠺ ⠻ ⠼ ⠽ ⠾ ⠿ https://ja.wikipedia.org/wiki/%E7%82%B9%E5%AD%97 */ let sections = ["数字", "アルファベット", "ひらがな", "記号"] let data = [ ["1 ⠂", "2 ⠆", "3 ⠒", "4 ⠲", "5 ⠢", "6 ⠖", "7 ⠶", "8 ⠦", "9 ⠔", "0 ⠴" ], ["A ⠁", "B ⠃", "C ⠉", "D ⠙", "E ⠑", "F ⠋", "G ⠛", "H ⠓", "I ⠊", "J ⠚", "K ⠅", "L ⠇", "M ⠍ ", "N ⠝", "O ⠕", "P ⠏", "Q ⠟", "R ⠗", "S ⠎", "T ⠞", "U ⠥", "V ⠧", "W ⠺", "X ⠭", "Y ⠽", "Z ⠵" ], [ "あ ⠁", "い ⠃", "う ⠉", "え ⠖", "お ⠊", "か ⠡", "さ ⠱", "た ⠕", "な ⠅", "は ⠥", "ま ⠵", "や ⠌", "ら ⠑", "わ ⠄", "を ⠔", "ん ⠴" ], [ "数字 ⠼", "アルファベット(外字符) ⠰", "濁音符 ⠐", "半濁音符 ⠠", ] ] override func viewDidLoad() { super.viewDidLoad() tableView = UITableView() tableView.frame = view.frame tableView.delegate = self tableView.dataSource = self tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell") tableView.tableFooterView = UIView(frame: .zero) view.addSubview(tableView) } func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return 40 // セクションヘッダの高さ } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 20 // セルの高さ } func numberOfSections(in tableView: UITableView) -> Int { return sections.count } func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return sections[section] } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return data[section].count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) cell.textLabel?.text = data[indexPath.section][indexPath.row] //cell.accessoryType = .disclosureIndicator //cell.accessoryView = UISwitch() // スィッチ return cell } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { print(indexPath) // セルタップ時 let alert: UIAlertController = UIAlertController(title: "tenji", message: data[indexPath.section][indexPath.row], preferredStyle: UIAlertControllerStyle.alert) let btnok: UIAlertAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: { (action: UIAlertAction!) -> Void in print("OK") }) alert.addAction(btnok) present(alert, animated: true, completion: nil) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }

iPhoneインラインアセンブラ入門、64bit Armマシン語はじめのいっぽ

2016/08/17
#Arm #swift 

IchigoJamもiPhoneも同じArmのCPU、IchigoJamでマシン語を覚えたらiPhoneでも使ってみましょう。今回の対象は、64bit化したArm64(Armv8)対応のiPhone5s以降です。ネットや書籍での資料には32bit時代のものも混在しているので注意が必要です。(iPhone Wikipedia)。

Swiftにはインラインアセンブラ機能はまだないようなので、Objective-CでGameをテンプレートに選び、次の行を viewDidLoad の [super viedDidLoad]; の後に追加します。

__asm__ volatile ("mov x0, x0");

※__asm__ はインラインアセンブラ、volatile で最適化を停止
エミュレーター向けだとコンパイルエラーになります。(IntelがArmライセンス取得とのことなので、MacBookへのArmv8組み込みにも期待!まずはApple-Aの生産から?詳しい解説記事


iPhoneでArm64マシン語、動きました!
(3Dの飛行機はサンプルのままで、今回のアセンブラでの動作とは無関係です)

mov x0, x0 は、レジスタX0の内容をレジスタX0に入れる(つまり、ほぼ何もしない)というマシン語を生成します。やっかいなことにこのコードはMacのiPhoneエミュレーターでは動きません。iPhoneエミュレーターはArmのCPUまでは動かしてくれないようです。実機向けにコンパイルすると動きます。(Arm64では64bitになったレジスタをRではなくXで呼ぶようになった様子)

Objective-Cでの変数との足し算をやってみます。

long num = 1; __asm__ volatile ( "mov x1, #1 \n\t" "add %[n], %[n], x1 \n\t" : [n] "+r" (num) : : "x1" ); NSLog(@"res: %ld\n", n);

コンソールに結果として 2 と表示されます。mov x1,#1 でレジスタX1に1を入れ、add命令で%[n]というコンパイラ任せなレジスタX?にX1の値を加えます。IchigoJamマシン語入門では X1=1 と表記していました。

最初のコロンの後 [n] "+r" (num) で、Objective-Cの変数numを%[n]というレジスタに割り当てて、読み書き"+"するよと指定しています。

三番目のコロンの後の "x1" で、インラインアセンブラ内で X1 レジスタを使用すると宣言して、前後のプログラムと干渉しないようにコンパイラに指定します。

これで基本はOKですね!
より詳しい解説は、こちら「Arm GCC Inline Assembler Cookbook」など参照ください

せっかくなので、アセンブラならでは機能を使った便利な関数を作ってみます。

- (unsigned long)rbit:(unsigned long)n { __asm__ volatile ( "rbit %[n], %[n] \n\t" : [n] "+r" (n) ); return n; }

rbitというのは、64のbit列を反転する命令です。普通に計算すると結構手間ですが、マシン語なら1クロック、0.1nsecで計算します!(参照、Arm64(Armv8) Assembly Programming (08) 分岐命令

iPhone(Armv8)とIchigoJam(Armv6-M)との比較です。

IchigoJamのCortex-M0のThumb-2命令とも互換性あるiPhone6sですが、浮動小数やSIMD命令など性能をフルに活かすならArm64マシン語プログラミングへのステップアップがオススメです!レジスタもたくさんあるので作るのも楽!

参考
- Arm64(Armv8) Assembly Programming (00)(とっても詳しいRAM64解説)
- 連載、IchigoJamではじめる、Armマシン語入門
- 連載、iPhoneゲームづくりからはじめる、Swift入門

スマホグラス、neo-plugがつないだメガネとスマホで目覚ましGlassをプロトタイピング

2016/05/30
#megane #swift #KidsIT 

メガネハッカソンでおもしろかった、スマホメガネ。
寝そうになったら震えるメガネのプロトタイプは、neo-plugと3Dプリンターでスマホをメガネにくっつけていました。


こちら動画へのインデックス
寝そうになったらメガネが震えます
加速度センサーとかついているしスマホをつけちゃえばいいじゃん(デモ直前)

実際試してみようと、傾いたら震えるアプリをiPhone用にSwiftでつくってみました。
MezamashiGlass - GitHub
CMMotionManagerを使った加速度センサーの値取得、AudioToolboxを使ったバイブのサンプルとしてどうぞ!
※背景色を変更しようとしていますが、なぜかうまくいってません!!

import UIKit import CoreMotion import AudioToolbox class ViewController: UIViewController { let motionManager = CMMotionManager() override func viewDidLoad() { super.viewDidLoad() // 加速度センサーON motionManager.accelerometerUpdateInterval = 0.3 // 0.3秒間隔で取得 motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue()) { data, error in guard data != nil else { print("err: \(error)") return } print("x: \(data!.acceleration.x) y: \(data!.acceleration.y) z: \(data!.acceleration.z)") // 加速度に応じて背景色を変える if (abs(data!.acceleration.x) > 0.2) { self.view.backgroundColor = UIColor.redColor() AudioServicesPlayAlertSound(kSystemSoundID_Vibrate); } else { self.view.backgroundColor = UIColor.whiteColor() } } } override func shouldAutorotate() -> Bool { return false // 自動回転OFF } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }

Swift、シンプルでいいですねっ!
2014年から急速に進んだ子供のパソコン離れ、こんなに楽しいツールに触れずに育つなんてもったいない!
小中高校生のパソコンや携帯電話利用率の実態(不破雷蔵) - 個人 - Yahoo!ニュース

「消コレ」以外の3チーム+αの発表動画、こちらです。

neo-plug+スマホのスマホメガネ、夢が広がりますね!
縦に接続すれば高画質カメラがついたメガネもシミュレート可能!
ちょっと軽めな iPhoneSE や、iPod touch が活躍しそう


今日のHana道場にはIntel、SAP、さくらインターネットからのお客様!(photo by Hana道場)


子供たちにも人気なネット接続デバイス、さくらIoT Platformの先行体験できちゃうかも!?

3Dプリンター、スマホアプリ、電子工作などで、わいわい遊ぶ子供たち。
創造する遊びは、最高の学びです!

iPhoneをIchigoJamのキーボードとして使う方法 - konashi(BLE)とSwiftとIchigoJam

2016/05/25
#konashi #IchigoJam #swift 

Bluetooth4.0を使ったお手軽フィジカルコンピューティングを実現するkonashiとの出会いが、電子工作再開のきっかけになりました! スーファミのコントローラーにつなげたり、いろいろやっている内に出会ったマイコンLPC1114、IchigoJam実現へとつながりました。


いよいよ今週末と迫ったメガネハッカソンに向けて、カドマックさん製、konashi互換のKoshianを使ったBLE小型ボードを入手したので早速接続!

以前SwiftでつくりかけていたKonashi接続用プログラムを現状Swiftに合わせてリメイク。konashiでは無事動作しました!(KoshianではなぜかUARTの通信速度設定が効かず難航中)

IchigoJamのコントロールやプログラムが、iPhoneからでもできちゃいます。BluetoothキーボードをiPhoneにつなげば普通にプログラミングもできそうですね!

特殊なキーは、ESCボタンだけつけていますが、どうぞいろいろと改造してみてください!
ソースコード(Swiftのプログラム)は、オープンソース、GitHub「IchigoRemote」に置きました!


新世代のメガネを創る!「メガネハッカソン
塚本教授に講評いただけます!(ウェアラブル新時代セミナー(HMDミーティング in 鯖江)連動)

ひなんメモ、避難所をローカルに保存するiOS9アプリ(Swift)

2016/04/15
#opendata #swift #SPARQL 

ひなんメモ(Webアプリ版)は、Webのオフラインアプリケーションの仕様頼みだったのに、 その機能はすでに廃止予定になっていて、iPhoneのSafariではもう動かなくなっていたので、Swift版つくってみました。(ソース on GitHub / Code for Fukui


現在位置をCLLocationManagerとiOS9で追加されたrequestLocationを使って位置情報を取得、その付近の避難所をodpからSAPRQLを使ってJSONで取得し、UITableViewを使ってリスト表示。 項目タップで地図が開きます。 取得したデータはCoreDataを使って端末内に保存しておき、クリアされない限り保持します。


ひさびさのSwift、以前書いた自分のブログ見てもアシスタントエディターを忘れていたので、図を追加。 実機で動作させようとしたら、バージョンが合わず、MacOSのアップデート、Xcodeのアップデート、設定、ライブラリ、Swiftの文法変更への対応など、なかなか手間取りました。 最近の開発環境は、がんがん更新されるので、初心者のプログラミング学習用途には向きません。
(伝統の++がSwift3では無くなる様子「【Swift3対応】Swift2.2以降のfor文法の書き方まとめ | ゆとりっち」)

実用化するにはまだ遠い「ひなんメモ」ですが、ぜひお好きなように改造しちゃってください!
ひなんメモ、ソース on GitHub / Code for Fukui

PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> select ?s ?name ?lat ?lng { ?s rdf:type ; rdfs:label ?name; geo:lat ?lat; geo:long ?lng. filter(?lat<35.95 && ?lat>35.93 && ?lng<136.19 && ?lng>136.17) filter(lang(?name)="ja") }

(緯度経度の範囲を指定して避難所を日本語で取得するSARQLのクエリー)

5分でできるオリジナル鯖江論手川排水機場水位表示iPhoneアプリ / Swift2入門

2015/11/18
#KidsIT #opendata #swift #SPARQL 

5分でつくった前回のアプリ、複数の画面を持つタブアプリにして、河川水位を追加します。 今回は、SPARQLを使いますが、コピペするだけなので、とりあえずつくるだけなら簡単です。


前回は、Single View Application を選びましたが、今回は Tabbed Applictaion を選択します。

FirstViewController には、PM2.5を表示する形にして、SecondViewController に鯖江市からリアルタイムオープンデータとして公開されている「論手川排水機場」の水位を表示させましょう。

まずは、超簡単な SPARQL にアクセスするテストを動かしてみます。viewDidLoad 内に、下記を書いて実行してみます。

let sparql = "select * { ?s ?p ?o } limit 10" let base = "http://sparql.odp.jig.jp/data/sparql?output=json&app=dev2&query=" let surl = base + sparql.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())! if let url = NSURL(string: surl) { let session = NSURLSession.sharedSession() let task = session.dataTaskWithURL(url, completionHandler: { (data, response, error) in if let ns = NSString(data: data!, encoding: NSUTF8StringEncoding) { let s = String(ns) print(s) } }) task.resume() }

ポイント
- sparql.odp.jig を前回手順を参考に、アクセスできるようにしておきましょう
- sparql.stringByAdd.. で、URLのパラメータ用に変換しています (例 ? -> %3F)
あとは、前回の通信方法と一緒です。実行すると、JSONという構造化されたデータで結果が返ってきます。

最新の水位データを取得するSPARQLに差し替えて、実行してみましょう。
※SPARQLについて気になったら、SPARQL入門をどうぞ!

let sparql = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n" + "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n" + "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>\n" + "PREFIX dct: <http://purl.org/dc/terms/>\n" + "PREFIX odp: <http://odp.jig.jp/odp/1.0#>\n" + "\n" + "select ?created ?value {\n" + " ?s rdf:rest rdf:nil;\n" + " rdf:type odp:WaterLevel;\n" + " <http://schema.org/spatial> <http://odp.jig.jp/jp/fukui/sabae/waterlevelsensor/1>;\n" + " dct:created ?created;\n" + " rdf:value ?value.\n" + "}\n"

返って来たJSONから特定の値を取得するためのコードを、通信後呼び出される completionHandler 内に追加します。

let s = String(ns) print(s) do { let json = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as! [String: AnyObject] if let results = json["results"] as? NSDictionary { if let bindings = results["bindings"] as? NSArray { if let value = bindings[0]["value"] as? NSDictionary { if let value2 = value["value"] as? String { print(value2) dispatch_async(dispatch_get_main_queue()) { self.rmeter.text = value2 + "cm" } } } } } } catch let error as NSError { print("Failed to load: \(error.localizedDescription)") }

ポイント
- NSJSONSerialization というものを使ってJSONデータをプログラムに取り込みます
- if let を使ってツリー構造を順番にほどいていって、目的の値を取得し、表示しています

PM2.5と水位、タブで切り替えて最新データが見られるアプリ「sabaenow」の第一弾のできあがりです。

Swiftを使って、SPARQLでいろいろとデータを取得しアプリがつくれそうな気がしてきましたね!
odp SPARQLコンソールを使って、あれこれクエリーをお試しください!
データをざっと見てみるには、SPARQLKnockerがオススメです。

Swift2入門
- 5分でできるオリジナル鯖江PM2.5濃度表示iPhoneアプリ
- 5分でできるオリジナル鯖江論手川排水機場水位表示iPhoneアプリ

参考図書
- Amazon.co.jp: Swiftではじめる iPhoneアプリ開発の教科書 【Swift 2&Xcode 7対応】【特典PDF付き】 (教科書シリーズ): 森 巧尚: 本
- Amazon.co.jp: オープンデータ時代の標準Web API SPARQL (NextPublishing) 電子書籍: 加藤 文彦, 川島 秀一, 岡別府 陽子, 山本 泰智, 片山 俊明: Kindleストア

5分でできるオリジナル鯖江PM2.5濃度表示iPhoneアプリ / Swift2入門

2015/11/17
#KidsIT #opendata #swift 

福大のキャリア教育の講義で紹介したステキな格言「犬も歩けば棒に当たる
何かおもしろいものを創ったら、もしくは、何か行き詰まったら、知らない世界へでかけてみましょう。
犬さえ当たる棒、人ならもっとすごいものに当たるはず!


学生からの質問、スマホアプリの上達のコツ、回答はただ一つ「たくさんつくること」

オープンデータに関心持ってくれてうれしかったので、鯖江市PM2.5濃度の勝手オープンデータを使ったアプリのつくり方を紹介します。 Macさえあれば、Xcodeのインストールを除けば、つくる作業は5分もかかりません。


1. Xcode, File, New, Project
2. iOS, Applictaion, Single View Application
3. Project Name "SabaePM25"
4. Main.storyboard, 右下の部品いろいろから Label を設置

左上の再生ボタンを押すと実行され、ラベル付きのシミュレーター上でアプリが動きます。


5. 右上アシスタントエディターに切り替え
6. Labelを右クリック、New Referecing Outlet の右側をViewController.swift内へドラグアンドドロップし、pm25と名付ける
7. viewDidLoad() 内、super.viewDidLoad() 後に pm25.text = "-umg/m3" と追加

ラベルをプログラムで書き換えられるようになりました。

8. 更に下記を続ける

if let url = NSURL(string: "http://sabae.club/pm25/1/fukui/sabae.txt") { let session = NSURLSession.sharedSession() let task = session.dataTaskWithURL(url, completionHandler: { (data, response, error) in if let ns = NSString(data: data!, encoding: NSUTF8StringEncoding) { var s = String(ns) s = s.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) // trim dispatch_async(dispatch_get_main_queue()) { self.pm25.text = s + "μg/m3"; } } }) task.resume() }

警告機用につくった簡易WebAPIで鯖江のPM2.5の値を取得して、ラベルpm25に設定しています。

9. HTTP通信できるように設定する
iOS9よりHTTPSではない通信は遮断されてしまいます。回避するために下記のように設定します。
左のプロジェクト、Supporting Files > info.plist
App Transport Security Settings (Dictionary) を追加、
その子要素に、Exception Domains (Dictionary) を追加、
さらにその子要素に、ドメイン名 sabae.club (Dictionary) を追加、
ドメインの子要素として、NSExceptionAllowsInsecureHTTPLoads (Boolean) を追加し、YES に設定

10. できあがり!後は好きな様に飾り付けましょう!

今回参考にしたのは、PCN大阪のメンバー森巧尚さんによるSwift本です。
Amazon.co.jp: Swiftではじめる iPhoneアプリ開発の教科書 【Swift 2&Xcode 7対応】【特典PDF付き】 (教科書シリーズ): 森 巧尚: 本

今回のポイントは、completionHandlerが通信が終了しだい実行されることと、dispatch_asyncを使って通信スレッドからラベルを操作できるメインスレッドに処理を渡しているところです。 きちんと理解するには、コンピューターのハードウェアやOSなどがどう作られているかの知識が必要です。

ひとまずありのままに受け入れ、推測でどんどん進めるか、シンプルな環境IchigoJamで基礎からやるか、どちらが良いかは本人次第、一概にどれが良いとは言えません。 大事なのは、続けられること。宝くじの当選確率は、買う枚数と比例します。

楽しく続けられるコトがあれば、チャンスをつかむ確率は大幅にアップします。
プログラミングは、パソコンさえあれば無限にトライできる最高の環境、活用しましょう!

Swift2入門
- 5分でできるオリジナル鯖江PM2.5濃度表示iPhoneアプリ
- 5分でできるオリジナル鯖江論手川排水機場水位表示iPhoneアプリ

学び方を学べ!IchigoからApple、Xcode Playgroundのススメ

2015/07/13
#IchigoJam #swift #KidsIT 

鯖江で好評開催中のIchigoJamプログラミングスクール。 いつの間にかMacを手に入れるこどもが続出。日本は全国的にこどものパソコン利用時間が減ってる今、鯖江の子、チャンス!


(日曜開催した特別回、IchigoJam BASIC入門、小さい子はレゴテクニックシリーズ、卒業生はSwiftやロボット電子工作)


思いついたものをサクサクつくるためと、俺パソコンできるかもという優越感が手軽に味わえる、キーボードのブラインドタッチ。 プログラミングの入門にもおすすめなタイピングゲームを打ち込み、挑戦中。いろいろ改造して遊んでくれてました。(5歳からのブラインドタッチ、タイピングゲームLV1


プログラミングへの情熱が親に伝わり、晴れてMacを買ってもらったこどもにおすすめ、Xcode Playground。
Xcode は、無料のiPhone/iPad/Macの開発ツール。起動後でてくるPlaygroundを使うと、IchigoJam BASICや、progrunのように プログラムを書いたその瞬間から実行して結果を出してくれます。

IchigoJam では、扱えない大きな数、小数、数学関数、文字列が扱えますよ!('\'の入力は、option+¥)
PRINT は、swiftでも print(またはprintln)。まずは、下記入門サイトや本など見ながらいろいろ遊んでみましょう!
第1回 Swiftを学ぶための情報源とPlayground:Swift移行時に引っかかりそうなことを解決する!|gihyo.jp … 技術評論社
Swift | Swift言語を学ぶ
Swiftで書いてみよう!
・・・その後は、Swift入門その1へ(Swiftバージョン違いで動かない?)

学び方を学べたら卒業のIchigoJamプログラミングスクール、毎週火曜日開催中!
こどもも大人も大歓迎!

sabota、iBeaconを使った新しい図書館センサー稼働開始!

2015/04/27
#iBeacon #sabae #sabota #swift 

JK課メンバーの不満から生まれた、図書館空席チェックアプリ、sabotaもしJKが「インパクトマッピング」を読んだら)。センサー故障も、利用者からの要望多いらしく、改修リニューアルとなりました。

コスト重視で赤外線を使ったセンサーIchigoJamを使ったシステムでスタートするも、センサー破損と不調をくりかえし、磁気センサーを経て、iBeaconバージョンをテスト。しばらくすると落ちてしまうことと省電力化の課題を残していました。

MyBeaconを使った半量産対応と、取り付け方法の課題を解決したと鯖江市役所の方から連絡あって、本日設置となりました!


新sabotaシステム!iBeaconが使うBluetooth4.0の電波が届きやすい場所に移設。


鯖江市役所開発の100均で3つで100円のタッパー&ネジ止めシステム!
数ヶ月、うまくいけば1年毎の電池交換もラクラク!


いくつかのステップを通じてオープンデータにする旧sabotaの流れ


iBeaconと無線LANを使ってぐっとシンプルになりました


旧システム、回収してまた別のシステムへの素材とします


新システム、1つ1,000円のAplix MyBeacon Fun MB005 Ac に、光センサーを加えたもの

多量の線材を回収して、ひとまず撤収。現在稼働しているセンサーは両端と中心の3箇所のみ、残りの設置を行って、sabotaバージョン2の本稼働となります!

iPadで動かしているアプリは、Swiftでつくっています。GClueさん公開のiBeaconのサンプルをベースに、Swiftの現バージョンで動くように更新したソースコードがこちら(ViewController.swift)。図書館センサーで使っているUUIDに変更しているので、図書館で試してみるとおもしろいです。

info.plist の Information Property List に NSLocationAlwaysUsageDescription という Key に Type=String で、位置情報利用許可メッセージを加えるのを忘れずに!(詳しくは、同GClueさん公開のiBeaconのサンプル

SPARQLを便利に使うクラスをつくる / ゲームづくりから始めるSwift入門 その3

2015/02/04
#swift #opendata #SPARQL 

SPARQLを使った簡単なゲームをつくった前回。今回はいろいろなオープンデータを取り出してプログラム内で活用できるように、便利なクラスというものを作ってみましょう。


(今回つくる、SPARQLでオープンデータを取ってきて、一覧表示するプログラム)

クラス(class)とは、データやデータに関連するプログラムに、名前を付けてまとめたものです。ある程度まとまったプログラムをIchigoJam BASICでいうGOSUB/RETURNを使ったサブルーチンや、Swiftでいうfuncを使った関数でまとめると便利なように、クラスは関係するデータやプログラムをまとめておけます。つくったクラスは、他のプログラムをつくるときに流用できて便利です。これをオブジェクト指向プログラミングといいます。

UITableView という、一覧や表形式で表示するのが便利なクラスを使って、実験してみます。
1. Xcode、メニュー、File、New、Project、iOS Application、Single View Application、Next
2. Product Name に POIview、Language を Swift、Devices を Universal にして、Next、保存するフォルダを選択してCreate
3. 左のファイル一覧から「ViewController.swift」を選択し、全部消して、下記を入力(バックスラッシュ"\" = option+¥)


(参考「逆引きSwift(iOS編)」)

4. メニュー、File、New、File、iOS Source、Swift File、Next
5. POIview/POIView フォルダを選択し、Save As に SPARQL と書き、Create
6. 下記、SPARQLとSwiftのプログラムを橋渡しするクラスを打ち込む


7. ▶ボタンまたはcommand+Rで実行すると、どこかの場所名がずらっと並んだら成功です!
8. SPARQLのquery(問い合わせ文)を書き換えたり、表示方法を変えたりしてみましょう
9. SPARQL.swiftを、前回つくったゲームに活用してみましょう

SPARQL.swift には、このようにXMLというコンピューター言語で返ってくるSPARQLからの返答文をプログラムに渡す機能がプログラミングされています。println を使って、その動きを確認してみるのもオススメです。


説明書がA4一枚で収まるIchigoJam BASICと違い、iOS向けSwiftの説明書(言語リファレンスiOSドキュメント)はとても膨大で、ひとつひとつ読んでいくのは大変です。なので、つくりたいものを決め、それに使えそうなものを調べて、何を使うかの目星を付け、いろいろと試しながらつくっていくことをオススメします。悩む経験を積めば積むほど速く楽しくつくることができるようになりますよ!

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / high-res profile image