Swift で MagicalRecord を使う手順メモ

CocoaPods で MagicalRecord をインストール

Podfile に

pod "MagicalRecord"

を追加し

pod install

でインストール。

<アプリ名>-Bridging-Header.h に

#import <MagicalRecord/CoreData+MagicalRecord.h>

を記述して、Swift から MagicalRecord を使えるようにする。

なお、Bridging-Header を作る手順は先日の記事で書いた。

xcdatamodeld を作成

プロジェクト作成時に CoreData を使う選択をしていれば、 <プロジェクト名>.xcdatamodeld ファイルが作成されているので、 Xcode でエンティティを定義する。 その際、エンティティに対応する NSManagedObject サブクラスも指定。

f:id:griefworker:20141023000747p:plain

NSManagedObject のサブクラスを作成

プロジェクトに NSManagedObject のサブクラスを追加する。 先ほど作成したエンティティに対応するクラスを Swift で生成。

import Foundation
import CoreData

@objc(Favorite)
class Favorite: NSManagedObject {

    @NSManaged var login: String
    @NSManaged var owner: String
    @NSManaged var name: String
    @NSManaged var slug: String
    @NSManaged var createdAt: NSDate
    @NSManaged var updatedAt: NSDate
    @NSManaged var order: NSNumber

}

CoreData スタックのセットアップ

MagicalRecord を使って CoreData を初期化するコードを AppDelegate に記述する。 Xcode が生成した CoreData 関連のひな形は削除。

import UIKit
import CoreData

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDelegate {
    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // CoreData スタックを初期化
        MagicalRecord.setupCoreDataStackWithStoreNamed("Bitissues.sqlite")

        // ...省略...

        return true
    }

    // ...省略...
}

これで準備完了

あとは Objective-C のときと同様に MagicalRecord が使える。 試しに、NSFetchedResultsController を取得してみるコードがこちら。

import Foundation
import CoreData

extension Favorite {
    class func fetchAllWithLogin(login: String, delegate: NSFetchedResultsControllerDelegate?) -> NSFetchedResultsController {
        let predicate = NSPredicate(format: "login = %@", login)
        return Favorite.MR_fetchAllSortedBy(
            "order",
            ascending: true,
            withPredicate: predicate,
            groupBy: nil,
            delegate: delegate
        )
    }
}

Swift で CocoaPods を使う

RubyMotion で作ったアプリを Swift で作り直すことにした。 手始めに、Swift でも CocoaPods のライブラリを使えるようにしてみる。

CocoaPods でライブラリをインストール

Swift プロジェクトのルートディレクトリで

pod init

を実行し Podfile を生成。

Podfile には、試しに

pod "AFNetworking"

を追加してみる。

pod install

を実行すればライブラリがインストールされ、Podfile.lock と .xcworkspace ファイルが出力される。

Bridging-Header.h を作成

.xcworkspace ファイルを Xcode で開いて、 <プロジェクト名>-Bridging-Header.h ファイルをプロジェクトに追加する。

// 例:SwiftSample-Bridging-Header.h

#import <AFNetworking/AFNetworking.h>

Build Settings でファイルを設定。

f:id:griefworker:20141019221329p:plain

これで Swift から CocoaPods のライブラリが使えるようになった

ちょっと試してみる。

f:id:griefworker:20141019221344p:plain

補完候補にちゃんと AFNetworking のクラスが表示された。 AFNetworking のクラスを使っても、ちゃんとビルドが通る。

Vim script テクニックバイブル

自分は .vimrc に設定を記述する程度の、ドが付く Vim script 初心者。 Vim プラグインは使うのみで、書いたことも無ければ、ソースコードもほとんど読んでない。 だけど、Vim を使っているからには、Vim script を書けるようになった方がいいな、 とは思っていた。

そんな中、Vim script だけを扱ったマニアックな書籍がついに発売され、 ようやく重い腰を上げた。 テクニックバイブルという名前が付いていて、300ページ超あるけど、 内容は Vim script 初心者向け。 文字が大きいので、プログラミング経験がある人ならスラスラ読める。

本書の構成はざっと

  • Vim script の基本的な構文と Vim での使い方
  • Vim プラグイン開発実践
  • Vim 組み込み関数リファレンス、
  • デバッグ手法やライブラリといった実践テクニック

となっていて、Vim script 入門書であり、クックブックでもあり、API リファレンスでもある。 1 冊で 3 度おいしい。

中でも一番の注目は、Vim プラグイン開発の章。 実はこれが目的で購入してたりする。 「保存時に自動的に行末の空白スペースを削除するプラグイン」を題材に

  • ユーザー設定による副作用を回避する定型コード
  • 関数でプラグインの機能を実装
  • Exコマンドを実装
  • キーマッピングを実装
  • オプション変数を用意
  • ヘルプを作成

といった、Vim プラグインを作って公開するまでの一連の流れが掴めた。

実践テクニックの章では、Vim にデバッガ機能が搭載されていて、 ブレークポイントをセットできることを知れたのが大きい。 :echomesg を使ったプログラマお馴染みプリントデバッグでやるしかないと、 勝手に思い込んでいた。 デバッグが捗るに違いない。

本書を読めば、簡単なプラグインを書けるところまではたどり着ける。 実用的なプラグインを書くためには、そこからさらに勉強が必要。 公開されている Vim プラグインソースコードを読むのが一番良さそうだ。

まだアイデアが無いけど、Vim プラグインを書いてみたくなった。 利用している Vim プラグインソースコードを手本に勉強して、 アイデアが閃いたときに備えるとしよう。

PAUL

天神で買い物した帰りに小腹が空いたので、 三越地下 2F にある PAUL でパンを買ってみた。 そういえば PAUL でパン買うの初めてかも。

f:id:griefworker:20141011153426j:plain

定番のクロワッサン。 ちょうど焼き立てを買えたので、家についてもまだ温かかった。 外はパリッ、中はもっちり。 バターの風味が程良い。 生地が甘く感じた。

f:id:griefworker:20141011153449j:plain

こちらも定番のパン・オ・ショコラ。 チョコチップがややビターで、カフェオレによく合う。

f:id:griefworker:20141011153527j:plain

3つめのクイニーアマンは結構甘かった。 デザートやおやつに丁度いい。

パンのサイズはメゾンカイザーの方が大きくて食べ応えあったけど、 クロワッサンの味は PAUL の方が好みだな。

関連ランキング:パン | 西鉄福岡駅(天神)天神南駅天神駅

ActiveRecord enums で列挙型の値を取り出す方法

Rails のモデルで次のように列挙型を定義した場合

class Customer < ActiveRecord::Base
  enum payment_system: { credit_card: 1, bank_transfer: 2 }
end

列挙型の値を取り出すときは次のように書く。

Customer.payment_systems[:credit_card] #=> 1

ビューやヘルパーで使うからメモしておく。

『Chef 実践入門』読書メモ

読了。 Chef Server の章は流し読み。

第1章

  • Infrastructure as Code
    • インフラをコード(= Chef のレシピ)で記述し Github で管理

第2章

  • chef-solo は Chef のスタンドアロン
  • コードで書いたサーバー設定の手順が「レシピ」
  • レシピに必要なデータやファイルをまとめる入れ物が「クックブック」
  • クックブック群を含む、Chef の実行に必要なファイルをまとめる入れ物が「リポジトリ」または「キッチン」
  • knife はリポジトリを操作するツール
  • knife-solo は Chef を chef-solo 環境で実行するためのユーティリティツール
  • Chef で管理するサーバーのことを「ノード」
  • ノードの状態を JSON で記述したものが「Node オブジェクト」

第3章

  • 「リソース」は service, package, template といった部品
  • 「Attribute」はテンプレートやレシピで参照できる key-value の値を管理する仕組み
  • 「Ohai」は Chef がシステム情報を取得するのに使っている Ruby ライブラリ
  • Attribute はノードの属性
  • 各ノードで共有したいデータには「Data Bug」を使う

第4章

  • Berkshelf を使ってコミュニティクックブックをインポートできる
  • 複数ノードへ chef-solo を実行する場合
    • xargs を使う
    • capistrano や fabric といった外部ツールを使う
    • Chef Server を使う

第5章

第6章

  • 特に無し

第7章

  • Test Kitchen
    • Chef のクックブックをテストするためのツール
    • Vagrant と組み合わせて、複数の OS や OS のバージョンでクックブックをテストできる
  • Test Kitchen では Minitest、Serverspec でテストを記述できる
  • さらに Jenkins を使ってクックブックでも CI

第8章

  • 従来のサーバー構築手順やスクリプトをクックブック化するところから始める
  • コミュニティクックブックを参考にする
    • Opscode
    • Basecamp
  • Foodcritic を使えばクックブックを検査できる
  • Chef でアプリケーションをデプロイしたい場合
  • Chef の拡張

第9章

  • Chef Server のメリット
    • Search 機能でロールなどを絞り込める
    • クックブックの同期作業がいらない
    • Chef Client をデーモンとしても扱える

第10章

  • 各ノードで chef-client コマンドを一括実行
    • tomahawk を使う
    • または knife ssh を使う
  • 大量物理サーバーをセットアップ

技術書を電子書籍で購入できるサイト

技術書は重いし場所をとるので、 既に電子書籍が出ていればそれを買い、 無ければ紙の本を買うようにしたい。 電子書籍の方が紙の本よりも安いことが多いし。

そこで、技術書の電子書籍を購入できるサイトを探してみた。