KTM 690DUKEをレンタルした
どうもお久しぶりです。
軽い!
法定速度内なら鬼加速
とにかく熱が凄い!
3000回転以下は使い物にならない
というわけで総評
Swiftつらいことまとめ
XCode Beta1出た時に勉強のためにMasterDetailなテンプレートからプロジェクトを作成して色々試しているんですが、辛いことが多いのでメモしておきます。
XCodeの補完が辛い
対処法:コメントから日本語を削除。デフォルトで作成されるコメントに年が入ってるのでグレップして削除。辛い。
ブロック内でweak, unownedが使えない
謎。playgroundやと動くwww
なので、
@lazy var hoge = {//初期化のためのクロージャ }()
でいいのにクロージャ内でdelegate = selfする系だとわざわざ初期化関数を作る。辛い。
privateが無い
最初はどうでも良いか〜って思ってたけど、インスタンス変数が外部からセットされることを前提にしているのか、内部で使いまわすために定義されているのかが分からなくなってくる可能性大。
ここらへんはObCのヘッダと実装ファイルにプロパティ宣言を分けるやつ好きだったんですけどね〜。
関数の補完が謎
引数なしの関数を定義して、補完機能を使って書こうとすると
func hoge() -> String { return "hoge" }
みたいな関数を定義してると、hoge(self: クラスの型)でしょ?という謎補完をしてくる。そしてそのままコールすると引数たりんよエラーが出る。どこ見に行ってるんだろう・・・
self.で呼んであげると動くけど、補完が効かないので、一旦hogeで補完して頭にselfを付けるという作業をしています。辛い。
nilを返すのにimplicityUnwrapするapiがある
Swift - ImplicityUnwrapOptional型な戻り値の関数の扱い方 - Qiita
Qiitaの方には回避方法を書いたんですが、Objective-Cなnilも返すapiをそのまま移植したのか知りませんが、戻り値の型定義がImplicityUnwrapOptionalだったりするので、ランタイムエラーになるやつがある。nil返す可能性あるんだったら素直にOption型でいいんじゃないかなぁ。辛い。
(追記)for-inが辛い
Objective-C時代のコレクションは何でもかんでも突っ込めたのですが、Swift先生は型に厳しいのでこういうことをします。
var set = NSMutableSet() set.addObject("h") set.addObject("o") set.addObject("g") set.addObject("e") for str: AnyObject in set { if let _str = str as? String { println(_str) } }
で、コレをCLLocationManagerのmonitoredRegion(戻り値: NSSet!)に対してやろうとしたらXCodeが100%クラッシュしやがるので、完全にやる気なくなりました。
まとめると
今すぐやらなくても良い言語な気がしてきました...(こういうのを書いてあわよくば解答を得ようとするスタイル...つらいなぁ〜
MailCore2についてメモ(iOS)
iOS用メールクライアントを作るにはコレ使えばいいのかな?というライブラリ。
とりあえずGmailに対してIDLEセッション貼って、変更があった場合にだけメッセージ取得的なことはできたのでその手順
手順
2.先ほどのMCOIMAPSessionに対してidleOperation命令を実行。対象のメールサーバーに更新があったら、引数で渡したブロックに対してコールバックされる
3.ヘッダー情報のみが欲しい場合はセッションに対してfetchMessagesByUIDOperationWithFolder:の方をコール(rangeをセット出来、配列がかえってくるので、TableViewにセットすればメールの一覧リストが作れる)
4.コンテンツが欲しい場合はセッションに対してfetchMessageByUIDOperationWithFolder:をコール。uid(IMAPのプロトコルに準拠したやつ)で特定するので、フェッチした際に自分がどこまでフェッチしたかを覚えておく。
未検証だが、uidに関してはログ吐くと、next uidが取得出来るので、それ使えばfetchする必要ないかも。
IMAP IDLE (RFC2177)
29minごとに通信して、死ぬのを回避してね!って書いてある...僕クライアントアプリ作るわけじゃないからポーリングでいい気がしてきた...
AppleProgrammingメモ2
今回はCoreDataのチュートリアルがあったので、それについてコメント。
Cocoa Programming L29 - Core Data 1 - YouTube
Cocoa Programming L30 - Core Data 2 - YouTube
メモ
- プロジェクト作成時にDocumentBaseとCoreDataの両方にチェック
- 拡張子がxcdatamodeldのファイルが作られるので、そいつにエンティティを定義してやる
- テーブルViewとそのカラムに対応するDetailViewがある
- Viewからのイベント及びViewへの値のアサインをArrayControllerの機能とバインディングで完了する(ここ一回時前で実装してみないと便利すぎて詳細がわからない・・・)
- ファイルへのエクスポート、インポートもできる
- undo, redoにも対応
- Objective-Cを一行も書かずに終了
感想
前回紹介した、DocumentBasedApplicationを先にやっておくといいと思います。
前回は、自前でNSCodingを実装して、シリアライズをしてファイルに保存というのが、xcdatamodeldに記述してしまえば書く必要がない(そりゃそうだ)という差があります。便利だなあ。
AppleProgrammingメモ
あえてCocoa Applicationプログラミングを始めたのでメモ。 iOSアプリと比べてなかなかサンプルが少ないのですが、この外人さんの動画はわりとよさ気なので、面白かったやつからメモしていきます。
Cocoa Programming L35 - NSViewController - YouTube
- オーソドックスにAppDelegateがNSWindowを持つ。
- windowのxibにAppControllerを定義
- AppControllerはPop Up Buttonからイベントを受け取り、自身が持つViewControllerを切り替える
- 実際の描画内容は、抱えるViewControllerに任せる。
Cocoa Programming L20 - NSTableView Bindings - YouTube
- Document Base Application
- KVC準拠のエンティティを作成
- ArrayControllerをモデルコントローラーとして使用する(標準部品)
- Cocoa Bindingにより、コーディングなしに追加/削除をviewから受け取り、モデルを操作して再度viewに反映することができるサンプル
Cocoa Programming L22 - Saving Documents - YouTube
- 上記で作成したDocument Base Applicationの状態をファイルに保存/読み込みができる
- NSCodingプロトコルを実装するとシリアライズ/デシリアライズできる
- NSDocumentクラスは、NSCoding準拠のオブジェクトをファイルに入出力できるので、状態保存ができる
古い動画は書き方が今と異なっていたりしますが、そこはよしなに補完ということで。
Vagrant+Chef-soloでplay frameworkが動くところまで作ってみた
Amazon.co.jp: 入門Chef Solo - Infrastructure as Code eBook: 伊藤直也: Kindleストア
をひと通り読んだので、習作として、play! frameworkが動作可能な環境をvagrant上のcentOSに構築するchef-soloを書いてみたので公開します。
https://github.com/assaulter/vagrant-play
ポイントとしては、vagrant up一発で起動するのではなく、ちゃんとcookbookを取得してきてknifeで料理するところをコマンド打たせるところかなー()
計6発叩かないといけないのと、Vagrantfileおよびvagrant pluginでコマンドを省略できるのは知ってるので、次回はコマンドを短縮するところをやろうと思います。
RailsでAPIサーバー用プロジェクトを作成する
仕様
タスクをjson形式でやりとりする。
API
タスク一覧:GET /tasks タスク(個別):GET /tasks/:id タスク登録:POST /tasks タスク更新:PATCH /tasks/:id 削除:DELETE /tasks/:id
Rails-API Gemを使ってプロジェクトを作成する
こちらを仕様すると、View周りのassets等が排除されたシンプルなRailsプロジェクトが作成されます。
View周りはMV*なJSのフレームワークに任せるっていうの、最近流行ってるんですかね?
gem を追加する gem install rails-api rails-apiを用いてプロジェクトを作成する rails-api new todo_api
好みに応じて、Gemfileを編集し、bundle installする。
僕はテスト用にfactory_girl_rails, rspec, rspec-railsを追加しました。
テーブル作成 rails g scaffold task name:string rake db:migrate
これでコントローラも作成されます。というかこの時点で
Chrome Web Store - Advanced REST client
等を使って叩くと動きますw
あとは
# create時にpostされたパラメータに対して適用するメソッド def task_params allow = [:name] params.require(:task).permit(allow) end # POST /tasks # POST /tasks.json # params example # {"task": # {"name": "sample"} # } def create @task = Task.new(task_params) if @task.save render json: @task, status: :created, location: @task else render json: @task.errors, status: :unprocessable_entity end end
一応ガードをかけておきます。
次はFactory girlを使ったRSpecの書き方かな・・・