2011年7月16日土曜日

退職しました

昨日、ヌーラボを退職しました。

ヌーラボに入社したことは、私の転換期だったと思います。

前職は java ..といっても Swing ばかり7,8年触っていたのですが、ヌーラボではSwingは一切触りませんでした。
seasar2 や、cubby, velocity, jsp ... を使った、いわゆる一般的なWEBアプリを作ったり、Eclipse Pluginを作ってみたり、BlackBerryのアプリを作ってみたり、Flash を作ってみたり、携帯のアプリを作ってみたり、iPadのアプリを作ったり、スマートフォン向けのWEBアプリを作ったり...
会社のメンバーもオープンで活動している方が多く、そんな中で "うっはー 私も頑張らねばな" と思う日々を過ごせました。
また、個人活動としても AdobeAIR を使って 空うさぎ を作成したり、iPhone用のBacklogクライアントとして CrossBacklog を作ったりしました。
特に、空うさぎ は個人的に作成したアプリの中では今のところ代表作。
前職の時に比べたら、いろんなことをしたなー。

残念だったのは、
一人での開発が多かった点。
結局、何かお仕事を完了後、振り返りしたり、打ち上げでぱーっと飲みにいく という事はあまり無かった。
自分がやったお仕事の打ち上げというのは結局1回もなかったような...忘れているだけ?

もう一つの残念というか反省点は、コレ という成果を残せなかったこと。
私は若くはないので残せないといけないのですが... スイマセン。

チームでの開発がしたい とか みんなで向上していきたい というのが、ヌーラボに入った時からの一つの目標というか、希望だったので、最初の頃は勉強会を提案してやってみたりしたのですが尻切れトンボになっていました。

モクモクとお仕事をしつつ、思いがだんだん変わってきた..というより気づいてきました。
チームでの開発がしたいと思っていましたが、それは漠然と同じ会社の人と としか思っていなかったのが考え足らずだったのだな と。

チーム内でプログラマの仲間がいれば、相談できるし、なにかと安心 というのは確かにあって、それを期待していた自分もいました。また、チームは遠隔地ではなく一緒の場所で作業を行いたいという思いも強かった。(前職はずっとそうでしたので)

ですが、小さい会社で請け負う小さい案件では、複数人のプログラマが携わることは少なくなります。
時代の流れ的も短納期、少金額 で行う案件が増えてきており、要件が固まっていないのに期間が少ないという傾向があるので、一人の方がやりやすい場面も多い。
逆に、一人で2,3個並行してガシガシやっていかないとツライ時代ですよね。

とわいえ、大きいお仕事はあまり興味が湧かない。
とわいえ、一人で仕事するのは寂しい。

では、どんなチームだとよいのか? と考えたとき、
違う能力、違う目線を持つ人同士でのチーム開発である方がワクワク楽しいのではないかと。
特に小さい規模では、能力の種類差は大きければ大きいほど効率が良いのではないかと。

ヌーラボでは「コラボレーションカンファレンス」というイベントを数回開催していて、その際に "コラボレーションとは?"という議題のワールドカフェを行ったのですが、コラボレーションという言葉でイメージするものは、「全く違う会社や業種の人が集まって、+α のものを作り出す」という話が良く出てきました。そんな感覚のチームって楽しそうだなぁと。

大きい案件の場合、DBに強い人、サーブレット層に強い人、UI層に強い人... とか特徴のある人同士 かつ お互いが尊敬しあっている と楽しくお仕事できたりしますよね。
それが小さい案件の場合は、もっとカテゴリが大きく括られるのだろうと思います。

そんな中... PLACES(WEBデザイン会社)からお声を頂いて、転職を決意しました。
今まで、システム開発会社にばかりいたので、WEBデザイン会社は正直考えた事は無かったのですが、うるうる考えていた思いとも一致するし、長年プログラムを書いているのでプログラマ一人の状況でもやっていける...というかやっていかなあかんやろう と。
また、チャレンジしていきたい方向性が一緒だという事、PLACESの社長さんとは似ている所が多いなぁ と以前から思っていた事 も要因として大きいです。

PLACESは入社当時にはヌーラボと同じ事務所内にあったので、当初から仲良くさせて頂いていました。
ヌーラボに入社しない限り、PLACESに入社というのはあり得なかっただろうなと思います。
そう思うと、不思議なご縁だなーと思います。
ヌーラボ入社前にたまたま行ってみたCSSniteに登壇していたPLACES社長が、事務所に現れてびっくりした のはいい思い出です。

今後は、
7月中はぷーたろう した後、8月からPLACESに入社予定です。

ヌーラボ在職期間は2年半でした。
短い間でしたが、大変お世話になりました。
• • •

2011年7月10日日曜日

iPhoneアプリ開発-画面遷移のアニメーション

前回、設定画面ではフリップのアニメーションで画面遷移することが多いみたい と書きましたが、
実際どんなことが標準で用意されているのか?をまとめてみたいと思います。

画面遷移で行える以下のパターンを説明します。
1. 子階層のレベルの画面に遷移
2. 兄弟階層のレベルの画面に遷移
3. 全く違う画面に遷移(設定画面など)

1. 子階層レベルの画面に遷移

子階層に移動するには UINavigationController を使って遷移していきます。
UINavigationControllerの標準の動きは "右から左の方向へ push" することにより遷移していきます。

実際のコードはこれ。
[self.navigationController pushViewController:myController animated:YES];

これを使うと、NavigationBar (画面上部のヘッダ部分) が引き継がれ、
左のボタンは、前画面へ戻るボタンが自動的に追加されます。
ボタン名称は、前画面の画面タイトル(Navigationのタイトル)になります。

子階層の画面に遷移するときは、これ以外の動きのパターンは基本使わないかな..と思います。
が、スライド動作で、親画面にもどる 動作をコードで追加したい場合とか自分で組み込みたくなるときがあります。
そんな場合は、私はCATransitionを使っています。

CATransition *transition = [CATransition animation];
transition.duration = 0.4;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromLeft;
[self.navigationController.view.layer addAnimation:transition forKey:nil];
[self.navigationController pushViewController:setting animated:YES];

上記の例は "左から右へ push" です。
設定は type と subtype があり、
typeは
kCATransitionFade
kCATransitionMoveIn
kCATransitionPush
kCATransitionReveal
subtypeは
kCATransitionFromRight
kCATransitionFromLeft
kCATransitionFromTop
kCATransitionFromBottom
があります。組み合わせでかなり細かく設定できますね。

※ただ、これ以外にもっと楽な方法が有りそうな気もしなくもない... もっとよい方法があれば教えてください!
※CATransition ですが QuartzCore に入っているので、ライブラリを設定し、#import でインポートしておく必要があります。

2. 兄弟階層のレベルの画面に遷移

この場合は、コンテンツの内容により、画面遷移のアニメーションは変わる可能性があります。
前画面が一覧画面で、現画面がその詳細画面 という場合には、
前のコンテンツへの移動は 上から下へのpush
次のコンテンツへの移動は 下から上へのpush
が自然な気がします。

また、本の1ページのイメージの画面では
前のページへの移動は 左から右へのpush
前のページへの移動は 右から左へのpush
が自然ですね。

このパターンの場合、画面のレイアウトは同じで、中身のコンテンツ(文字列とか)を再描画し直すというパターンが多いかと思います。
そんなときは画面遷移とは言わないかもしれませんがw

Viewを単純に切り替えたい場合は、アニメーションは独自でゴリゴリ書くときもあるとおもいますが、表示中のViewに対して addSubView してあげる感じでしょうか。
その場合のアニメーションの指定は、前述のCATransitionが使えます。

CATransition *transition = [CATransition animation];
transition.duration = 0.4;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromLeft;
[self.navigationController.view.layer addAnimation:transition forKey:nil];
[self.view addSubview:myController.view];

この場合、NavigationBarは同じものが表示されます。

3. 全く違う画面に遷移(設定画面など)

設定画面などは現在表示しているコンテンツとは全く違う情報を表示することになります。
どんなパターンがあるか...はアプリによりますが、設定画面のようなものと仮定すると、モーダル画面として使う事になるのがほとんどなのでそのパターンで説明します。

その場合は、NavigationController の
[self.navigationController presentModalViewController:myController animated:YES];
を使用します。
標準の動きは "下から上へのpush" です。
このアニメーションを変えるには、このコードの前に遷移先のViewControllerに対して modalTransitionStyle を設定します。
modalTransitionStyle は 以下の種類があります。

UIModalTransitionStyleCoverVertical : 下から上へのpush
UIModalTransitionStyleFlipHorizontal : フリップ (画面がくるっと回りながら遷移)
UIModalTransitionStyleCrossDissolve : ディゾルブ (元画面がだんだん薄くなって先画面がだんだん濃くなる)
UIModalTransitionStylePartialCurl : ページカール ※v3.2以上 (マップアプリの右下のボタンの動き)

画面遷移した後、元画面に戻る場合は、遷移先画面で
[self dismissModalViewControllerAnimated:YES];
を行います。
戻る場合にも同じようなアニメーションをかけてくれます。かしこい。

presentModalViewController を使う場合は、元々表示されていたNavigationBarは表示されなくなります。
全く違う画面が表示されるから...ですね。

でもモーダル画面でもヘッダ(NavigationBar)は表示したいというときがあります。
そのときはNavigationBarを新たに作って設定してあげます。
遷移先画面のレイアウト時に行うのではなく、NavigationControllerを作って、そのControllerで遷移をする方がスマートかと思います。

UINavigationController* navigation = [[UINavigationController alloc] initWithRootViewController:myController];
[self.navigationController presentModalViewController:navigation animated:YES];

こんな感じ。


ながながと書いてしまった。。
• • •