Swift で enum を扱う際にハマった問題です。確認は Xcode6 beta4 で行っています。

Swift の enum は AnyObject 型変数に代入できない

Swift では enumAnyObject 型の変数に入れることができません。コンパイルエラーになります。Any 型なら代入できます。

1
2
3
4
5
6
7
8
9
10
11
enum SomeType: Int {
    case None = 0
    case Something
}

let something = SomeType.None
something                                     // Enum Value

let anything: AnyObject = SomeType.Something  // error: type 'SomeType' does not conform to protocol 'AnyObject'

let any: Any = SomeType.Something             // Enum Value

Swift の enumAnyObject protocol を実装していないので、AnyObject 型の変数に入れることが出来ません。

ReactiveCocoa とかと組み合わせるときにこまる

これの何が不便かというと、enum は UIKit でよく使われていて、ReactiveCocoa を Swift で使う際に enum で設定する例えば UITableViewCellAccessoryType なんかを使いたい場合にコンパイルエラーになってしまいます。

1
2
3
4
5
6
7
8
9
// これはコンパイルエラーになる
RAC(self, "cell.accessoryType") = RACObserve(self, "viewModel.checked").map { ($0 as Bool) ? UITableViewCellAccessoryType.Checkmark : UITableViewCellAccessoryType.None }

// こうしないといけない。。
RACObserve(self.viewModel, "checked")
    .subscribeNext { [weak self] arg in
        let checked = arg as Bool
        self!.accessoryType = checked ? .Checkmark : .None
}

既存の Objective-C ライブラリで id が使われている箇所が、Swift では AnyObject に対応するので、 Closure 等で id を引数に取ったり、id を戻り値にしていたりする箇所が AnyObject になってしまい、 enum を利用することができません。

変数に代入するだけなら Any 型にすればいいんですが、既存ライブラリとの連携では難しそうです。 1 これ、何かやり方ないんでしょうかね。。ReactiveSwift 待ちかなぁ


  1. Any 型にすれば代入できることを @takabosoft さんに教えてもらいました。ありがとうございます!

Apple が新しいプログラミング言語 Swift を2014年の WWDC で発表しました。言語仕様自体は色々なモダンプログラミング言語のいいとこ取りのような感じです。独特な仕様もいくつかあるのでおぼえがきしておきます。

なお、Swift で作成したアプリは iOS8 と OS X Yosemite がリリースされた時点で審査に入れるようです。

Xcode6 Beta4 で Swift コンパイラでの minimum target が iOS7 と OS X10.9 に制限されました

Introducing Swift

※ Xcode6 Beta4 を元に記載しています。

Titanium Alloy で SNS 認証 (OAuth) をアプリ側で行う方法のまとめです。

iPhone や Android だと、アプリスキーマ (例: snsnet://twitter)を使ってブラウザのリンクからアプリを立ち上げることができます。 この仕組を使って、アプリ内でブラウザを立ち上げるのではなく、アプリのブラウザを使って OAuth 認証を行い、アプリに戻ってくるということができるようになります。

ここで紹介するやり方は、iPhone と Android の両方で使える方法ですが、一部ブラウザ側の画面を閉じるためにサーバサイドが必要になります。 また、Facebook は認証後の戻りURL (redirect_url) にアプリスキーマを利用することができませんので、Facebook 連携を行うのもサーバサイドが必要です。

まぁ、Facebook に関しては、Titanium にすでにモジュールが組み込まれていて、簡単に認証を行えるようになっているので、わざわざアプリのブラウザを使って認証を行う必要もないんですけど。。

Passenger で Rails アプリを動かすときに、assets:precompile 済みの gz ファイルを返すようにする apache の設定方法例のメモ。

いただき物です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<VirtualHost *:80>
   # ...
   <LocationMatch "^/assets/.*$">
     # Some browsers still send conditional-GET requests if there's a
     # Last-Modified header or an ETag header even if they haven't
     # reached the expiry date sent in the Expires header.
     #Header unset Last-Modified
     #Header unset ETag
     FileETag Size
     # RFC says only cache for 1 year
     ExpiresActive On
     ExpiresDefault "access plus 1 year"

     SetEnv no-gzip

     RewriteEngine on
     #RewriteLog /tmp/rewrite.log
     #RewriteLogLevel 15
     # Make sure the browser supports gzip encoding before we send it
     RewriteCond %{HTTP:Accept-Encoding} \b(x-)?gzip\b
     RewriteCond %{REQUEST_FILENAME}.gz -f
     RewriteRule ^(.+) \$1.gz [L]
   </LocationMatch>

   <FilesMatch \.css\.gz$>
       ForceType text/css
       Header set Content-Encoding gzip
   </FilesMatch>

   <FilesMatch \.js\.gz$>
       ForceType text/javascript
       Header set Content-Encoding gzip
   </FilesMatch>
</VirtualHost>
タイトル
インフラデザインパターン ~安定稼動に導く127の設計方式
著者
株式会社NTTデータ (著), 杉原 健郎 (著), 吉田 一幸 (著), 岩崎 賢治 (著), 三浦 広志 (著), 吉田 佐智男 (著)
出版社
技術評論社
Amazonで購入する

本書は、インフラの技術者たちがあみ出した設計方式を概念化・抽象化して名前をつけたインフラのデザインパターンを紹介するものです。 プロジェクトマネージャ、システム企画や導入の意思決定を行う人、インフラの設計や評価を行う人のために技術書になっています。

本書の特徴として次の点があげられます。

  • 全てのデザインパターンは特定の製品に依存していない
  • 要件定義や基本設計などの上流工程で使うことを意識して構成されている

本書には、パターンの特徴を把握しやすいように簡潔な図がそれぞれのパターンに用いられています。 プロジェクトに必要な要点からインフラの設計が導き出せるようになっています。

127のパターンが挙げられていて、インフラのパターンにそんなにあるのがびっくりですが、一通りパターンを抑えるだけでも結構なボリュームになります。 が、それだけインフラ設計は細かく、大事なポイントを抑える必要があるということです。 インフラ設計を担当するエンジニアにオススメの一冊です。

GitHub Pages を Naked Domain(サブドメインをつけない hamasyou.com みたいなやつ)で運用する場合の手順です。

GitHub Pages をサブドメイン(www.hamasyou.com みたいなやつ)で運用する場合は、DNS サービスの CNAMEhamasyou.github.io に設定すれば問題ないのでこの記事は読む必要がありません。

hamasyou.com はムームードメインで取得していますので、ムームードメインを元に説明します。が、ムームードメインに限らず、Apex Alias を設定できない DNS サービスを使うときの参考にしてください。 なんでこんな事をメモするかというと、GitHub Pages を独自ドメインで運用する際に Apex Alias を使わないと 302 Found のステータスコードが返ってきて、SEO 的に嫌なのと Facebook のシェアで404 Not Found が出てしまう からです。

Fix 302 Redirect Response For GitHub Hosted Site

別に 302 Found がでても構わないっていうひとは GitHub Pages のヘルプを参考にしてやってみてください。

Setting up a custom domain with Pages - GitHub Help

アイデアを思いついたときに Web サービスを作ってスタートアップする手順メモです。Rails 編としていますが、たぶん別のバージョンは書かないでしょう。。

手順は思いついた順(というか、前に作ったサービスの手順)で書いていますので、抜け漏れとかあると思いますがコメントあればよろしくおねがいします。

ちなみに、最近作ったサービスはこちら。よかったら使ってみてください。

Web上のメディアのすべてにヤジを飛ばすサービス - 野次る