『Interval Reminder』開発録 #3(finish)
インターバルリマインダーが配信開始しました。
続きを読む『インターバルリマインダー』 開発録#2
進捗
文字列のパースを済ませた
ペンを持ってる I have a pen. おまえだれだ Who are you?
のようにひとつのTextViewに対して、一行ずつ和文と英文を交互に書いていって、それを2つ1セットとして処理して通知登録をするという処理。
// テキストのパース処理 func parseText() -> [(jp:String, en:String)] { let text = remindTextField.text // 一行ずつ処理して、配列にセットにして処理する var lineIndex = 1 var arr:[(jp:String, en:String)] = [] var tmp = (jp:"", en:"") text?.enumerateLines{ (line, stop) -> () in if (lineIndex%2 != 0) { // 奇数の時(和文列の時) tmp.jp = line } else { // 偶数の時(英文列の時)、タプルを配列に追加 tmp.en = line arr.append(tmp) } lineIndex += 1 } // 和文と英文をセットにした配列を返す print(arr) return arr }
通知の発行
trigger = UNTimeIntervalNotificationTrigger(timeInterval: timeinterval , repeats: true)
のようにリピート設定にした一定間隔での通知処理をしたのだが、通知を登録した時点で一発目が発火されてしまって意図した動作にならない。
60秒間隔通知の設定であれば、登録後の60秒後に1発目の発火が来てほしいのだが、登録した瞬間に通知が来てしまう。
調べても原因がわからず、同じような現象にハマっている人がいたがバグのような事を言われているが詳細不明。
これは実機でならなかったらOKにするが、実機でも同様の現象が起きたら解決すべき課題となる。
挑戦しようとしたが諦めたこと
和文と英文を交互に同一のテキスト上に配置するという、ややプログラマ向けの仕様のため、TextViewの背景に、2行で英語と日本語のワンセットという意図が伝わる背景画像(スクロールしてもテキストと一緒にスクロールされる)を設置したかったのだが、情報不足のため今回は断念。
iPhoneアプリ:『インターバルリマインダー』開発録#1
概要
- 英文と和訳を登録して定期的にランダムにリマインド通知してくれる
- 英語学習のお供に
- 通知では英文か和文かの片方だけを見せて、タップすると両方表示の画面へ飛ぶ
忘却曲線にもとづいて定期的に思い出す作業をサポートしてくれるアプリ。
導入ライブラリ検討
- Realm
- DZNEmptyDataSet
- Chameleon
- Permission Scope
- Hero
- Onboard
- RxSwift
- Timepiece
- CustomKeyboardTextField
- fastlane
導入決定
- Realm
- Chameleon
- Permission Scope
- Onboard
- fastlane
初日の成果
Realmを用いたデータ永続化に成功。
レコードを1件しか使用しないので、別にRealmを使う恩恵は薄いが、UserObjectsをそのまま使うのには面倒を感じていたし、次回以降のために後学として採用。
let realm = try! Realm() var appdata: AppData = AppData() override func viewDidLoad() { super.viewDidLoad() // データの読み込み(データはひとつしか持たないので常に.first) if realm.objects(AppData.self).first != nil { appdata = realm.objects(AppData.self).first! // ---(1) } else { // データが存在しない場合、作成しadd print("データが存在しないので作ります") appdata.text = remindTextField.text appdata.remindInterval = 1 appdata.remindType = RemindType.EnglishToJapanese.rawValue try! realm.write() { realm.add(appdata) } } // 中略 // キーボード終了メソッド func textViewShouldEndEditing(_ textView: UITextView) -> Bool { // ここに保存と通知登録の処理(Writeの中でデータを代入するだけでよい) try! realm.write() { // ---(2) appdata.text = remindTextField.text appdata.remindInterval = 1 appdata.remindType = RemindType.JapaneseToEnglish.rawValue print("書き込み処理完了") } // 中略 class AppData: Object { dynamic var text = "" dynamic var remindType = RemindType.JapaneseToEnglish.rawValue dynamic var remindInterval = 1 } enum RemindType: Int { case JapaneseToEnglish = 0, EnglishToJapanese = 1 }
(1)データの読み込み
レコードデータがないのに普通にappdata = realm.objects(AppData.self).first!
で代入しようとするとエラーになった。
(2)データの更新
キーボードが終了した時にレコードを更新する処理。 writeメソッドのブロックの中でプロパティに代入するだけで書き込みが行われるらしい。簡単で便利。
展望
今回のアプリ提出にはfastlaneというものを使ってみようと思う。
CIツールを使うつもりはないけど、証明書関連で便利そうなので、その単体の機能だけでも使えるのか検証したい
【最短・最速・最小限】Herokuで動かすSlack Botの作り方まとめ
初めてSlackで動くBotを作ったが、とりあえずそんなに凝ったものはいらなくて、以下の要件を満たしていればよかった。
- 特定の言葉に反応
- スケジュールで定期的に特定の言葉を投稿
たったこれだけのことだが、断片的な情報しかなく、まとまったページがなくて意外と苦労したので決定版として記録。
このページの対象
- Heroku(Node.js)とBotkitとSlackを使用
- HerokuもBotokitもよくわからない
- BotkitをHerokuでCron実行する方法を知りたい
- このページの対象
- 前提
- 参考にしたページ
- BotkitとHubotの違い
- SlackでBotを作成しAPIを取得する
- Herokuにログインしアプリを作成する
- HerokuはGithubを経由しなくても直接デプロイできる
- サンプルをダウンロードする
- node modulesのインストール
- Botを動かしたいチャンネルへ招待する
- ローカルでテストする
- Herokuへアップ
- Heroku Schedulerアドオンを追加し、Botのサーバーを寝かせないようにする
- スケジュールの登録
- 補足:チャンネルIDを特定する
- 追記:平成29年2月22日