娘を見る目が変わった話

写真


半年ほどバタバタ忙しかったプロジェクトが一段落して、気がついたら秋になっていた。
1歳2ヶ月になる娘の秋冬服がないというので、吉祥寺のデパートに行った時の話。


妻が買い物をしている間、娘と二人でデパートの屋上で遊んでいた。
もう自由に歩き回り、自分で勝手に楽しそうなものを見つけては突っ込んでいくので、危ないことには注意しつつ目の届く範囲で放し飼いにしていた。


周りには3歳くらいの男の子ともう少し小さい女の子も遊んでいた。
ちょっと寒いけど、和やかな休みの午後といった風情。


しばらくすると、娘はその子たちが気になりだしテクテク近寄っていった。
そして、宇宙語でなにか話しかけていると思ったら、急に男の子に突き飛ばされて娘は尻もちをついた。
泣くかなーと思ったけど泣かない。
男の子の母親が走ってきて、「ごめんなさい」と謝られた。
男の子は「oo君もちゃんとごめんなさいしなさい」と言われ、娘に向かって「ごめんなさい」と謝った。
すると、娘はにっこり笑ってペコリとお辞儀をした。
娘はまだ、言葉をしゃべることができない。
最近になって、ごく簡単なコミュニケーションっぽいことが少しだけできるようになってきたのに、親以外の人に対してこういう反応をするとは思っていなかったのでとてもびっくりした。


娘はただ何もわからず遊んでいただけなのかもしれないけど、傍から見ていた自分にはとても大人な対応に見えて、誇らしい気持ちになってしまった。
と同時に、その瞬間から今まであまり感じられなかった個性、人間らしさ、みたいなものを急に強く感じるようになった。
これがうまく表現できないのだけど、自分の中で確実に娘を見る目が変わった。

mixi Engineer BlogにPlannahについて記事を書きました

Plannahの紹介と、新プロダクト立ち上げにまつわるいくつかの開発話
5月からミクシィ社内ベンチャー的な取り組みであるイノベーションセンターに所属し、Plannah(プランナー)というサービスの技術責任者をやっています。
新しい環境で一からサービスを立ち上げるというのは、mixiという既に大きくなってしまったサービスの開発とは違った刺激があり、毎日とても楽しいです。
得られた経験は、このブログやmixi Engineer Blog、その他色々な場所で徐々に出していければいいなーと思っています。

なんか変だな

深刻な問題にぶち当たった時、あとで振り返ってみるとそれまでに「なんか変だな」と感じる瞬間があったことに気がつく。
あの時にあれはこれだったのか、みたいな。

じゃあなぜ、予兆があったのにスルーしてしまうのかというと、自分の場合は「これはあれが原因だと思うけど、今はそうなるのは当然だから問題ない」みたいに、自己完結して忘れ去ってしまうことが多い気がする。
その自己完結が実は間違っていた時、深刻な問題として表面化する。

じゃあどうすればよいかというと、気をつけるというのもひとつの手だけど、今でも気をつけているつもりなので「もっと気をつける」はあまり期待できない。
テストをしっかり書いて、そもそもそういうバグを出さないというのはひとつの理想だと思う。けど、出るときは出る。
事前に仕様書を書いて、仕様と成果物に違いがあればそれはすべてバグとすれば良いかもしれないけど、まあ、厳しい。
QAチームのような、自分以外のよく訓練された人達によるテストは効果があると思うが、今自分が置かれているような極少人数で開発をしているような状況だとなかなか難しい。
優秀なQAエンジニアは、「なんか変だな」や「違和感」をバグや疑問として起案するメンタルモデルを持っていると思っているのだけど、「身に付ける」とか「気がつけるようになる」みたいな方法しかないのだろうか。
それとも、機械的に抽出したり、自動化する方法があったりするのだろうか。

RDSでutf8mb4設定

http://kkurahar.github.io/blog/2013/03/17/rds-modify-parameter/
を参考に、コマンドラインツールから設定をしようとしたら、webのコンソールからも設定ができることに気がついたのでメモ。

やり方は簡単で、DB Parameter Groupsを新規作成し、作成したグループを選択して上の方にあるEdit parametersから編集するだけ。

Kiwiをjenkinsで動かしてCIする

今までGHUnitを使っていたのだけど、久しぶりに新しいプロジェクトで使おうとしたらXcode4.5以降でCLIから実行ができないバグがあって困った。
githubを見ると、Oct 25, 2012でコミットが途絶えている。

ちょっと悩んだけど、せっかくなので別のテストフレームワークを試してみることにした。
最近(今頃になって)RSpecすごいなーと思うことがあったので、BDDなKiwiを使ってみることにした。

半日くらいハマりながら、jenkinsで動かす所まで来たのでメモ。

kiwiを動かす

まずはkiwi wikiを参考に、kiwiを動かせるようにする。
https://github.com/allending/Kiwi/wiki/Getting-Started-with-Kiwi-2.0

環境は、Xcode4.6.1

Cocoa Podsが入っている前提で。
kiwiSampleという新規プロジェクト作成。
プロジェクト作成時に、include unit testsにチェックを入れておくと、TARGETSにkiwiSampleTestsというユニットテストターゲットができている。
この状態で、cmd+Uすると単体テストが実行される。

次に、Xcodeを閉じる。
Podfileという名前のファイルを、kiwiSample.xcodeprojと同じ階層(プロジェクトのroot)に作成する。
中身↓

# Podfile

# Select the appropriate platform below
platform :ios
# platform :osx

#
# Some other entries might already exist in the file
# ...
#

# Add Kiwi as an exclusive dependency for the AmazingAppTests target
target :kiwiSampleTests, :exclusive => true do
   pod 'Kiwi'
end

保存したら、pod install

$ pod install                                                                                                          (master✱)
Analyzing dependencies

Cocoapods 0.18.1 is available.

Downloading dependencies
Installing Kiwi (2.0.6)
Generating Pods project
Integrating client project

[!] From now on use `kiwiSample.xcworkspace`.

[!] The target `kiwiSampleTests [Debug]` overrides the `FRAMEWORK_SEARCH_PATHS` build setting defined in `Pods/Pods-kiwiSampleTests.xcconfig'.
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.

[!] The target `kiwiSampleTests [Debug - Release]` overrides the `FRAMEWORK_SEARCH_PATHS` build setting defined in `Pods/Pods-kiwiSampleTests.xcconfig'.
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.

入った。

プロジェクトrootにkiwiSample.xcworkspaceというファイルができているので、開く。
この状態でcmd+Uすると、自分の環境ではエラーが出た。

clang: error: no such file or directory: '/Users/kenjikinukawa/Library/Developer/Xcode/DerivedData/kiwiSample-dmefjsutstmowmevdnpeufzrwtvw/Build/Intermediates/PrecompiledHeaders/Pods-kiwiSampleTests-prefix-ekzmocesgielqsbgusghojymigra/Pods-kiwiSampleTests-prefix.pch.dia'
Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang failed with exit code 1

試行錯誤の末見つけた解決方法は、
http://stackoverflow.com/questions/9457510/apple-llvm-compiler-3-1-error-clang
で、具体的には、
f:id:k_kinukawa:20130412001218j:plain
上の写真のOther C FlagsのDebugの方に何も書いてないので、-DNS_BLOCK_ASSERTIONS=1を入れてやる。
すると、cmd+Uでテストが実行できるようになる。
kiwiSampleTestフォルダの中に、SampleSpec.mというファイルを作成する。
中身は↓。

#import "Kiwi.h"

SPEC_BEGIN(MathSpec)

describe(@"Math", ^{
    it(@"is pretty cool", ^{
        NSUInteger a = 16;
        NSUInteger b = 26;
        [[theValue(a + b) should] equal:theValue(43)];
    });
});

SPEC_END

cmd+Uでテストが実行され、[FAILED], expected subject to equal 43, got 42 というエラーが発生する。
これでkiwiを動かす準備は整った。

jenkinsでテストする

jenkinsは動いている前提で。
http://9elements.com/io/index.php/continuous-integration-of-ios-projects-using-jenkins-cocoapods-and-kiwi/
を参考に。

kiwiSampleTestsのBuild PhasesでRun Scriptの中身を
https://gist.github.com/mbinna/4492087
に書き換える。

f:id:k_kinukawa:20130412002605j:plain
kiwiSampleをDuplicate > Duplicate onlyで複製して、名前をCommandLineUnitTestsに変更する。
Build Settingsの検索窓でkiwiSample copyで検索するとproduct name等が引っかかるので、CommandLineUnitTestsに修正する。
XcodeのProduct > Scheme > Manage Schemesを開くと、kiwiSample copyがあるのでここもなおす。

XcodeのProduct > Scheme > Edit Schemesを開く。
f:id:k_kinukawa:20130412003512j:plain
左のBuildを選択した状態で、下の方の+を押す。
kiwiSampleTestsを選択してAdd。

コマンドラインからXcodeのテストを呼び出す方法として、シミュレーターを利用する手があるらしく、参考ページそのままios-simを使う。

$ brew install ios-sim

ここまで来たら、コマンドラインからkiwiを実行できる。

xcodebuild -sdk iphonesimulator \
             -workspace kiwiSample.xcworkspace \
             -scheme CommandLineUnitTests \
             -configuration Debug \
             RUN_APPLICATION_TESTS_WITH_IOS_SIM=YES \ ONLY_ACTIVE_ARCH=NO clean build 2>&1

ビルドが走り、ログの途中にテスト結果が出力されている。

/bin/sh -c /Users/kenjikinukawa/Library/Developer/Xcode/DerivedData/kiwiSample-dmefjsutstmowmevdnpeufzrwtvw/Build/Intermediates/kiwiSample.build/Debug-iphonesimulator/kiwiSampleTests.build/Script-9AB6D732171706DC00791D61.sh
[DEBUG] Test Suite 'All tests' started at 2013-04-11 15:41:13 +0000

[DEBUG] Test Suite '/Users/kenjikinukawa/Library/Developer/Xcode/DerivedData/kiwiSample-dmefjsutstmowmevdnpeufzrwtvw/Build/Products/Debug-iphonesimulator/kiwiSampleTests.octest(Tests)' started at 2013-04-11 15:41:13 +0000
Test Suite 'KWSpec' started at 2013-04-11 15:41:13 +0000
Test Suite 'KWSpec' finished at 2013-04-11 15:41:13 +0000.
Executed 0 tests, with 0 failures (0 unexpected) in 0.000 (0.000) seconds
Test Suite 'KWTestCase' started at 2013-04-11 15:41:13 +0000

[DEBUG] Test Suite 'KWTestCase' finished at 2013-04-11 15:41:13 +0000.
Executed 0 tests, with 0 failures (0 unexpected) in 0.000 (0.000) seconds
Test Suite 'MathSpec' started at 2013-04-11 15:41:13 +0000

[DEBUG] Test Case '-[MathSpec Math_IsPrettyCool]' started.

[DEBUG] 2013-04-12 00:41:13.702 kiwiSample[53905:c07] + 'Math, is pretty cool' [PASSED]

[DEBUG] Test Case '-[MathSpec Math_IsPrettyCool]' passed (0.027 seconds).

[DEBUG] Test Suite 'MathSpec' finished at 2013-04-11 15:41:13 +0000.
Executed 1 test, with 0 failures (0 unexpected) in 0.027 (0.028) seconds
Test Suite 'kiwiSampleTests' started at 2013-04-11 15:41:13 +0000

[DEBUG] Test Case '-[kiwiSampleTests testExample]' started.
Test Case '-[kiwiSampleTests testExample]' passed (0.000 seconds).
Test Suite 'kiwiSampleTests' finished at 2013-04-11 15:41:13 +0000.
Executed 1 test, with 0 failures (0 unexpected) in 0.000 (0.000) seconds
Test Suite '/Users/kenjikinukawa/Library/Developer/Xcode/DerivedData/kiwiSample-dmefjsutstmowmevdnpeufzrwtvw/Build/Products/Debug-iphonesimulator/kiwiSampleTests.octest(Tests)' finished at 2013-04-11 15:41:13 +0000.
Executed 2 tests, with 0 failures (0 unexpected) in 0.028 (0.029) seconds

[DEBUG] Test Suite 'All tests' finished at 2013-04-11 15:41:13 +0000.
Executed 2 tests, with 0 failures (0 unexpected) in 0.028 (0.030) seconds

Finished running tests with ios-sim

あとはjenkinsでgitからcloneしてきて上のコマンドを実行すれば自動的にビルドとテストが走る。
ただ、このままだとテストがコケた時にもjenkinsは検知してくれない。
参考ページの最後の方に書いてある、OCUnit2JUnitを入れた。
プロジェクトrootにGemfileを作成。

source 'https://rubygems.org'

gem 'ocunit2junit', '~>1.2'

ruby1.9が入っている環境で、bundle installすると、OCUnit2JUnitがインストールされる。
この状態で、先ほどのスクリプトを書き換えてjenkinsに実行させる。

#!/usr/bin/env bash

bundle install

xcodebuild -sdk iphonesimulator \
           -workspace kiwiSample.xcworkspace \
           -scheme CommandLineUnitTests \
           -configuration Debug \
           RUN_APPLICATION_TESTS_WITH_IOS_SIM=YES \
           ONLY_ACTIVE_ARCH=NO \
           clean build 2>&1 | bundle exec ocunit2junit

ビルド後の処理のJUnitテスト結果の集計に、test-reports/*.xmlを書いて保存する。
テストの成功、失敗がグラフで出力されるようになる。

思ったこと

ios-simが出てきたあたりで、あれ、これってもしかしてGHUnitもコマンドラインからGUIテスト起動できるんじゃないかな、と思ったけど試していない。
あと、ios-sim使って動いているせいか、試しにテストの中でUIFontのインスタンスを作成しても問題ありませんでした。
実は、GHUnitをCLIから実行していた時、UIKitのテストを実行するとクラッシュしてました。
これは、UIKitがシミュレーターに依存しているからで、同じくシミュレーターに依存しているKeychainなんかもGHUnit CLIからいじることができませんでした。
GUIからは問題なく実行できるのですが、いちいち手動でテスト動かすのは非常に面倒でした。
ios-simが裏で動いているためなのか、もしかすると上のような制限はなくなるかもしれません。
もしそうならとても嬉しい!
これからガッツリ試します。

なんか、長いことモヤモヤしていたことも解決されそうで、明日からスッキリ開発を進められそうです。

自分がここ数年実践している花粉症対策

要約すると、「耳鼻科行け」。

自分は、物心ついた頃から重度の花粉症でした。
アレルギーテストをすると、スギ、小麦、その他色々のアレルギー反応数値が残念な感じです。
発症すると、比喩でも何でもなく、くしゃみ鼻水が止まらなくなります。
そうなってしまうと、頭はぼーっとし鼻はヒリヒリしてまともな生活ができません。
甜茶、ヨーグルト、鼻うがい、ツボといった民間療法は試しましたが、気休めにしかなりませんでした。
数年前までは、市販の薬を飲んでいましたが、口がカラカラに乾く、眠くなる、何故か効かない時がある、といった不満を抱えていました。
ところが、ある時耳鼻科に行って治療をし始めたところ、劇的に症状が軽くなりました。

花粉症シーズンが劇的に楽になった

数年前、IPA未踏ソフトウェア事業に採択され開発に取り組んでいた時、「また花粉症が始まると、開発に集中できなくなって困るな」と思いました。
そこで、近所の耳鼻科に行って相談したところ

  • 花粉症の症状は、シーズンが始まる手前から薬を飲んでおくと重症化せずに済ませられる
  • 一旦炎症を起こしてしまうとそのまま悪化が続いてしまう
  • 市販の薬は量が調整できないし、合う合わないがある
  • 自己流で色々やってないで、もっと早く医者に来ればよかったのに

とアドバイス頂きました。
薬を処方してもらい、シーズン前から飲み始めたところ、例年に比べて劇的に症状が楽になりました。
(ちょっと鼻づまり気味、くしゃみがたまに出る、程度)
上に挙げた不満な点も起きませんでした。
それ以来、毎年花粉症シーズンが始まる前に病院で薬を処方してもらい、乗り切っています。

今年も行ってきた

1月23日に耳鼻科に行って来ました。
その時の話によると、今年も2月中旬から飛び始めるので、2月頭くらいから治療を始めるのが良いとのことでした。
自分の場合は毎年、2月中は毎週通い、3月4月は2週間に一度、薬だけもらうような流れです。
医者に通うのは面倒ではありますが、あの苦しみにくらべれば屁でもありません。
鼻の粘膜を焼くとか花粉を注射するとか色々な対策があるみたいですが、ちょっと怖いので自分にはこれが丁度いいと思っています。


花粉症は症状がくしゃみと鼻水だけなので適当に対処しがちですが、自分にとっては生活に支障をきたす厄介な病気でした。
今思えば当たり前なのですが、早いところプロに診てもらうのが一番だと思います。
治療を始めるなら今のタイミングが良いらしいので、花粉症に苦しんでいる方は自己流で試行錯誤するよりも、一度耳鼻科で相談してみたらいかがでしょうか。