Boostnoteを複数端末で共有する方法

Boostnoteを使いはじめるのでMacBookAirとiMac両方でデータを同期するように設定する。

b00st.io

アプリディレクトリ~/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でやってみることにした。

b00st.io

Boostnoteにした理由

Boostnoteにした理由は

  • 他の選択肢と比べてデザインが好き
  • 軽快
  • リアルタイムプレビューより編集モードを抜けたらすぐにプレビューされる仕様の方が使いよさげ

あたり。

基本データはローカル保存で共有するためには一工夫必要そうだけど、 Boostnote自体はまだまだ若いみたいなので、これからに期待!

他の候補

Qiita&Kobito

Qiita&Kobitoにしなかった理由はデザイン。 今までもそれが理由でQiita自体も全然使ってなかった。(デザイン大事w)

でもKobitoからQiitaへ投稿するさいにGistへの保存が自動でできるのはいいなーと思った。 最近、ブログにコードスニペット的なものを登録するのも微妙だなぁと思っていたので、これを機にBoostnoteへスニペット登録するついでにQiitaへも投稿してみようかなと思う。一手間かかるから続くかわからないけど。

qiita.com

kobito.qiita.com

Marxico&Evernote

昔からEvernote上にどうにかMarkdown形式のファイルを登録したかったけど、今は便利なサービスがある。

でもEvernoteはコード見たり編集したりするのには向いてなくてもともとスニペット類は保存してなかったから、このタイミングでもあえてEvernoteへ入れなくてもいいなぁと思い選択肢から除外。 餅は餅屋に。

marxi.co

SwiftでiOSカレンダーを使う

SwiftiOS標準カレンダーを使う方法をメモ。

swift calendarとかで検索すると独自UIを作る情報は検索されるけど、あんまりEventKitを使った情報が出てこなかった。 リファレンス上のデモもswiftのバージョンがないし。

Google Calendarの時も思ったけど、あんま情報ないんだよね。ライブラリー(?)の更新とかもあんまないし。カレンダーって人気ないのかな?w

バージョン

環境 バージョン
Xcode 7.3, 7.2
Swift 2.2, 2.1
iOS 9.3, 9.2

参照したドキュメント

EventKitのリファレンス

developer.apple.com

プログライミングガイド

https://developer.apple.com/jp/documentation/EventKitProgGuide.pdf

使い方

準備

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)
    }
}