Boostnoteを複数端末で共有する方法
Boostnoteを使いはじめるのでMacBookAirとiMac両方でデータを同期するように設定する。
アプリディレクトリ~/Library/Application\ Support/boost
の中身を覗いてみると
どうやら共有する場合に必要そうなファイルは次の2つっぽい。
ファイル | 説明 |
---|---|
config.json | フォントとか設定のファイル |
local.json | ノートデータ |
ということなのでDropbox上へ実体を移してシンボリックリンクにしてしまおう。
# パスの設定 (hogehogeの場所は適当に) BOOST_PATH="$HOME/Library/Application Support/boost" DROPBOX_PATH="$HOME/Dropbox/hogehoge" # Dropbox上にBoostnoteの各種ファイルを配置するディレクトリを作成 # 共有先の端末ではディレクトリの作成はいらない、Dropboxで自然と同期される mkdir -p $DROPBOX_PATH/Boostnote SYNC_PATH="$DROPBOX_PATH/Boostnote" # ファイルを移動 # 共有先の端末では削除かどっかに退避しておく mv "$BOOST_PATH/config.json" "$SYNC_PATH" mv "$BOOST_PATH/local.json" "$SYNC_PATH" # シンボリックリンクの作成 ln -s "$SYNC_PATH/config.json" "$BOOST_PATH/config.json" ln -s "$SYNC_PATH/local.json" "$BOOST_PATH/local.json"
SublimeTextだとこんな感じ複数端末で編集してたりしても そんなに競合とかで困ったことないけど、 競合とかどうなるかわからないのでやる人は自己責任で。
GistBoxの代わりにBoostnoteを使うことにしてみた
コードスニペット管理のためにGistBoxを使ってたけど、 更新がとまっているせいかSwiftのシンタックスハイライトがちゃんとされないため代替を検討した結果、一旦Boostnoteでやってみることにした。
Boostnoteにした理由
Boostnoteにした理由は
- 他の選択肢と比べてデザインが好き
- 軽快
- リアルタイムプレビューより編集モードを抜けたらすぐにプレビューされる仕様の方が使いよさげ
あたり。
基本データはローカル保存で共有するためには一工夫必要そうだけど、 Boostnote自体はまだまだ若いみたいなので、これからに期待!
他の候補
Qiita&Kobito
Qiita&Kobitoにしなかった理由はデザイン。 今までもそれが理由でQiita自体も全然使ってなかった。(デザイン大事w)
でもKobitoからQiitaへ投稿するさいにGistへの保存が自動でできるのはいいなーと思った。 最近、ブログにコードスニペット的なものを登録するのも微妙だなぁと思っていたので、これを機にBoostnoteへスニペット登録するついでにQiitaへも投稿してみようかなと思う。一手間かかるから続くかわからないけど。
Marxico&Evernote。
昔からEvernote上にどうにかMarkdown形式のファイルを登録したかったけど、今は便利なサービスがある。
でもEvernoteはコード見たり編集したりするのには向いてなくてもともとスニペット類は保存してなかったから、このタイミングでもあえてEvernoteへ入れなくてもいいなぁと思い選択肢から除外。 餅は餅屋に。
SwiftでiOSカレンダーを使う
swift calendar
とかで検索すると独自UIを作る情報は検索されるけど、あんまりEventKitを使った情報が出てこなかった。
リファレンス上のデモもswiftのバージョンがないし。
Google Calendarの時も思ったけど、あんま情報ないんだよね。ライブラリー(?)の更新とかもあんまないし。カレンダーって人気ないのかな?w
バージョン
環境 | バージョン |
---|---|
Xcode | 7.3, 7.2 |
Swift | 2.2, 2.1 |
iOS | 9.3, 9.2 |
参照したドキュメント
EventKitのリファレンス
使い方
準備
EventStore経由であれこれするので、初期化
// EventStoreを初期化 let eventStore = EKEventStore()
カレンダーへのアクセス許可の取得
// 許可状況を確認して、許可されていなかったら許可を得る func allowAuthorization() { if getAuthorization_status() { // 許可されている return } else { // 許可されていない eventStore.requestAccessToEntityType(.Event, completion: { (granted, error) in if granted { return } else { print("Not allowed") } }) } } // 認証ステータスを確認する func getAuthorization_status() -> Bool { // 認証ステータスを取得 let status = EKEventStore.authorizationStatusForEntityType(.Event) // ステータスを表示 許可されている場合のみtrueを返す switch status { case .NotDetermined: print("NotDetermined") return false case .Denied: print("Denied") return false case .Authorized: print("Authorized") return true case .Restricted: print("Restricted") return false } }
カレンダーの一覧の取得
let calendars = eventStore.calendarsForEntityType(.Event)
イベントの一覧を取得
func listEvents() { // 検索条件を準備 let startDate = NSDate() let endDate = NSDate() let defaultCalendar = eventStore.defaultCalendarForNewEvents // ここではデフォルトのカレンダーを指定 // 検索するためのクエリー的なものを用意 let predicate = eventStore.predicateForEventsWithStartDate(startDate, endDate: endDate, calendars: [defaultCalendar]) // イベントを検索 let events = eventStore.eventsMatchingPredicate(predicate) }
イベントの新規登録
func addEvent() { // イベントの情報を準備 let startDate = NSDate() let cal = NSCalendar(identifier: NSCalendarIdentifierGregorian)! let endDate = cal.dateByAddingUnit(.Hour, value: 2, toDate: startDate, options: NSCalendarOptions())! let title = "カレンダーテストイベント" let defaultCalendar = eventStore.defaultCalendarForNewEvents // イベントを作成して情報をセット let event = EKEvent(eventStore: eventStore) event.title = title event.startDate = startDate event.endDate = endDate event.calendar = defaultCalendar // イベントの登録 do { try eventStore.saveEvent(event, span: .ThisEvent) } catch let error { print(error) } }
イベントの削除
func deleteEvent(event: EKEvent) { do { try eventStore.removeEvent(event, span: .ThisEvent) } catch let error { print(error) } }
フォーカスが外れたタイミングでキーボードを隠す
何もしなくてもフォーカスが外れたらキーボードは隠れてくれるものだと思ってたんだけどやってくれないんだね。
resignFirstResponder
を使ったりDid End On Exit
を使ったり方法があるみたいだけど、どのテキストフィールドでもフォーカス外れたらキーボード隠すならこれが一番っぽい?。
import UIKit class ViewController: UIViewController, UITextFieldDelegate { @IBOutlet weak var textField: UITextField! override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { view.endEditing(true) } }