diary

0228

昨晩はJSONのマッパーを書いていました。とりあえず必要なものは作れたのでよかった。というか僕の気分としてはかなり便利に使えるものになったような気がするのだけど、いろいろのケースでどう振る舞うかは知らない。とりあえず今回の案件では十分だろう。

結局、APIの応答のスキーマをCoreDataとは分離した上で、そのいくつかをCoreDataに変換できるようヘルパを各ことにした。APIがRESTful?に書かれているから、スキーマの大部分はCoreDataにも現れるモデルで書ける。このことは圧倒的二度手間感を生むが、同時に変換を容易にする。完全な結合はSwift1.1時点では(コンパイラの不具合のため)不可能で、1.2では修正されていると聞くけれど、別にあえてそうすることもないのでは、という気もする。なにが返ってくるかわからないAPIをCoreDataに近づけすぎるのはたぶん不正解で、それを吸収するためにいろいろ気にしなきゃいけないのなら、そのためにクラスが挟まるくらいどうってことないのかもしれない。

今夜はそれに伴う書き替え(ほぼ終わっているけれど)をします。これでJSONエラーのハンドリングがいい感じにできるようになったので、今度はCoreDataのエラーハンドリングをちゃんとしようかな。昔書いたヘルパをそのまま使っていて、おおむねよく動いているのだけど、エラーを握りつぶす悪い癖がある。というかエラーを返せるようにできていない。クラッシュはしないけれど。


そういえば美容院の予約を入れました。記録によれば九ヶ月ぶりです。明日の夕方。どきどき。


0301

昨晩はJSONMapperによる書き替えを終わらせて、あといくらかリファクタリングをしました。でももうちょっとやりたいよね。もっと共通化できるはず。そうするメリットがあるかはともかく。
どうでもいいけど成功/失敗コールバックをcompletionに統合したのは失敗だった気がするよな。失敗はすっごいシンプルで定型的だから、失敗だけ隔離することにはメリットがある。まあこれを直すこと自体はそう難しくないし暇になってからやろう。

あとObjectiveCランタイムを触ってNSUserDefaultsへのアクセサを動的生成するのもいろいろ試したのだけど、やっぱりC構造体の一般的扱いが無理そうです。これはobjcの時から無理だったけどさらに無理になってる感じがある。構造体は値渡しなのでキャストでどうこうできるわけではないし、可変型?をどうこうするのは(ちゃんと調べてないけど)Swiftとobjcの互換性の問題でダメそう。結局一般に扱うのは諦めるほかなさそうです。うーん。まあ僕はこれそんなに使いたいと思って作ってるわけじゃないのだけども(とはいえ別に誰に頼まれたわけでもなく、単に練習問題として解いている)。


今日はTwitterクライアント作る計画のためにいろいろ調べごとしていました。OAuthのためのいろいろは昔自分で書いたものがあったのでそれを参考にすればよさそう。AFNetworkingにどのくらいそのまま載せられるかはまだわかっていないけれど、トークン取ってしまえばRequestSerializerでどうにでもなりそう。それより問題はUserStreamへの対応で、これはSessionManagerを継承していろいろオーヴァライドする必要がありそう。それより標準で対応していない理由が気になる。素朴なアプローチではうまくゆかないのだろうか?

夕方は美容室で髪を切ってもらいました。雑談がしんどかった。趣味とかありますかって言われていや〜本を読むのとかまあまあ好きですけどなんかこういうのって趣味感ないというか、そのために外出したりコスト払うわけでもないから話題にもならないし使えないですよね〜みたいな話をした。途中で思い出したけど僕は数学を趣味にしようと思っていたのだし、あと最近どう見てもプログラミングが趣味になりつつあるなと思った。まあでも、いずれにしてもこれ話題として不適切なのよね。共感のしようがないから。


なんか頭がぼうとしているので早めに寝たほうがいいかもしれません。やれやれ、この週末は多少具合がよかったと思ったらこれか。


0302

昨晩はOAuthのいろいろを移植しようとしていましたが、結局あまり進みませんでした。まあ、ゆっくりやればよい。


お昼から仕事。今日は比較的UI寄りの作業を進めました。テーブルをがりがり作ったりとか入力させたりとか。キーボードを避ける機構は昔考えたのを移植すればいいかしら(画面回転とかしないし)。あと、Unwind Segueがなかなか便利だったけれど、iOS8.0で壊れてるらしいから確認しなきゃ(いまのところ動いているのがなおさら不気味だ)。


さて、ちょっとだけ具合が悪く、具体的には親不知が腫れています。うーむ。


0303

昨晩はAFNetworkingにOAuthをしゃべらせるところまで書きました。トークン取得(ハンドシェイク?)とかは書いてないけど。まあそんなの最後にやればよいのです。
今夜はストリームを受信するところができたらいいと思うけど具合が悪いから早く寝るべきのような気もする。JSONのデシリアライズはSBJsonってのを使うのが適切らしい(ストリームデータに対応している)のだが、これはこないだ書いたJSONMapperと相性がどうかしらね。


お昼から仕事。ウィザード形式に連なる画面遷移。状態の受け渡しが本当にだるくて、オブジェクト一つに纏めたけどそれでもUUIDの受け渡しが八回くらい発生する。八回代入を書いている。とはいえコードがアレなだけで、処理としてはグローバルに置くよりはマシだと思う。
ちょうど関数プログラミングの本を読んでいるので、こういうときモナドがあるといいのになと思う。この場合はNavConに状態を持たせるのがいいのでしょうか。それはそれでやっぱり気味が悪い気もする。状態を受けることは明示的であってほしいのよな。だからやっぱりモナドか。


ニューラルネットワークを使って、ものの集まりの中から部分集合Aを判別することに成功したとする。しかしこのときこのニューラルネットワークのどこを見てもAのA性と本質的に関係あるような部品は見つけられない。このことは、証明という考えかたと正面から対立している。
証明できないものにどこまでを任せられるか、が今後の人類の課題だろう。自動運転車だったり、医療行為だったり。責任を負わせられるかどうかという話でもある。しかし負わせられないのなら、人間が代わりに負うことになるのなら、それは結局人間がやったほうがいいという話になるだろう。人間が負える責任の量には限度がある。あるいは責任という概念は耐用年数にきているのかもしれない。


0304

昨晩はふわっとTwitterのUserStream APIを叩いたらふわっと結果が返ってきたので安心して寝ました。一晩放置したところ20MBくらい受信して、メモリ使用量は定常状態(6MB程度)だったので、これはどうやらうまくいっているらしい。今日はパースします。CoreDataに入れるとかはまた別に考えないと(そもそもCoreDataなのか未定、でもまあ一番手軽だしな)。あとどう抽象化するかとか。


お昼から仕事。ぐるぐる回るインジケータとかカスタムダイアログとか。通信中にぐるぐる出したりエラーだったらダイアログだしたり、なんだかちゃんとしたアプリらしくなってきました。


さて、今夜は上述のストリームクライアントにパーサを繋ぐ作業かなあ。あいかわらず親不知が腫れてる。でも気分はそこまで悪くないや。


0305

昨晩はTwitterのストリームを簡単にパースしました。こないだ書いたJSONMapperに投げ込んだらまあまあ動いたけど、そういえばこいつは任意属性の子属性の必須属性が存在しないときに(変換はしつつ)エラーを返すんだなってことと、必須属性が存在しなくても残りを全部確認するのは無駄だよな、と思ったのでこれはそのうち直します(特に後者)。いろんな種類のオブジェクトが流れてくるときに判別するためにいちいち全属性探してたら時間がもったいない。

で、一応動いてはいるのだけど、どうもメモリリークがあるので困っています。これはなんか行儀の悪い方法でマルチスレッドしてる(コンソールアプリとして動かそうとするとRunLoopを作るとかで謎が多い)から変則的な事が起こっているのか、普通に書きかたが悪くて循環参照があるのか、切り分けをこれからします。今日はもう遅いしそれだけかなあ。


お昼から仕事。地味目なUI作りと画面遷移コンテナの書き直し。コンテナ書き直しのほうはだいたい完了したけど、いろいろ同期取ったりするところは未完成。明日やろう。

ところで、リリースビルドの時だけ起こる不具合が見つかったので地獄のような気分です。どこが壊れているのかはわかったけど、直しかたはまだわからない。リリースビルドは冗談抜きで数分かかるからデバッグがほんとうにつらい。


0306

お昼から仕事。画面構造の書き直しの続き。とりあえず元の動作+αくらいのことは再現できたし、さらなる改善の道筋も見えているのでとりあえず一旦このくらいで。あとはモデルオブジェクトのライフサイクルの管理をいろいろ検討しました。一筋縄ではゆかないけれど、とりあえず十分な機構ができた、はず。
そういえば昨日見つけたリリースビルドでしか発現しない不具合はどうにか解決しました。Array.mapでやると壊れるのでfor-inにしました。うーむ。


そういえばなんだか忘れていたのだけど、週末です。TwitterAPI叩いたりRedmineプラグイン試したりかなー。そういえばメモリリークの件はSwift1.2の不具合であることがはっきりしました(devforumに最小コードがあった)。autoreleasepoolがちゃんと動いていないようです。
結局データの永続化をどうしようか迷っています。いや、永続化だけならCoreDataで文句ないんだけど、表示とかのことを考えるとちょっと悩ましいかも。とはいえ最初は普通のCoreData Stack(これも最近ちょっと新しい構成の話を聞いたので調べたいけど)で普通のFRCで、100万件くらいさばけるのか試してから、かしら。

Redmineプラグインは、会社の社内ツールを便利にしたいよね〜って話が発端で、まあ優先度は低いけどやっとくとなにかとよさそう。最近は自動化と可視化と知識共有がテーマです。


0307

昨晩はプラグインの開発用にRedmine環境を立てたりしていました。Dockerでズドン、というのが理想だったのでとりあえずそうしたのだけど、プラグインの開発で中をいじるのにはまったく不向きだとわかったので(そういえばそうだ)結局macに置きました。まあgit cloneしてジャーンという感じなので簡単。

で、中身はRailsなのでプラグインもジェネレイタでズドンと出てきてコントローラとビューを書いたらジャーンとチケット一覧が出せたりして手軽でした。うーん、このアッサリさ、やっぱりプラグインの仕事じゃないのかもしれない。プロジェクトページにタブ増やす方法ってこれしかないと思うのだけども。
それより、可視化のほうはd3.jsに手を出してみようと思っているので、こっちはいろいろ試す必要がありそうです。とりあえずそっちの勉強かな。

そういえば、中退した大学院の研究室で、同期が卒業するので追い出しコンパがあるらしく、僕もどう?と誘われました。今更どんな顔して、とも思ったのだけど、けっこう上の人が誘ったら?って言ってくれたらしいので、じゃあ行きましょう、という感じ。僕はあの研究室でついになにも意味ある成果を出さず逃亡したけれど、それでもこうして誘ってくれるのは、ありがたいことだなあ、と思う。ありがたい。


さて、今夜はTwitterからの応答をCoreDataに仮で投げ込んでみるところと、d3.jsの実験かなあ。