SimpleBoxes

海外でエンジニアとして働いて、ここ十年ほど毎日続けている、ある一つのこと

2003 年よりニュージーランドでエンジニアとして働き始めました。二年ほどスイスに引っ越していましたが、昨年よりまたニュージーランドに戻ってきています。

かれこれ 13 年ほど日本国外でソフトウェアエンジニアとして働いてきたことになりますが、2006 年半ばから毎日ずっと続けていることが一つだけあります。

それは

  • 簡単な作業日誌をつける

ことです。

自身の英語力の弱さをカバーするため、当時のチームリードに日報メールを送り始めたのがきっかけです。その後、メールを送るのは止めましたが、手元に日報として残して置くのは習慣になりました。

日報という形で始めたので、当初は日の終わり頃に書き出していましたが、それよりもその日のやることをリストアップした方が自分に合っていることに気付いて、日の始まりに書き出すというスタイルに落ち着きました。

形式

テキストファイルで箇条書きが記述できれば、形式はなんでも良いのですが、最近は Markdown のようなフォーマットで記述しています。

自分用のメモなので、基本はごく簡単な箇条書きです。例えば、以下のように……

# 09.05.2016 (Mon)
X-App ver 5.2
  - TICKET-1234 implement GA for a feature A
X-App automation
  - TICKET-1235 search feature
  - TICKET-1236 sucess path
Generic
  - coding guidelines

日付を見出しにして、その日にやることを書き出します。

ざっくりとプロジェクト単位で分類して、関連する項目を箇条書きします。開発の仕事に関係しない項目は Generic というカテゴリに記述しています。多くのミーティングはここに分類。

割り当てられたチケットへの対応についてはチケット番号を記述。以前はチケット番号だけでしたが、これだと他人である未来の自分には分かってもらえない可能性が高いので、最近はチケット番号と共にその内容も簡潔に記述するようにしています。

この記事を書くにあたって、十年前のログも見てみましたが、始めたばかりの頃は、上司への報告メールの下書きにもなっていたので、もう少し丁寧に書いていたようです。

基本はこれだけなんですが、普通にメモとしても利用したりするので、コードスニペットが貼り付けてあったり、作業手順の備忘録やミーティングの議事録などを追記したりすることもままあります。

欠点、のようなもの

明らかな欠点は日報を書く時間が取られるということ。

ちょっと覚えていませんが、最初の頃は今よりも丁寧に記述していたので、15 分以上かかっていたかもしれません。

前述の通り、ごく短い箇条書きに落ち着き、今では 5 〜 10 分程度の作業になっています。また、すでに毎朝のルーチンとして、やるべきことのひとつになっているので、個人的には「時間が取られる」とはあまり感じていません。

ログ自体はただのテキストファイルなので、十年分でも高々 500KB を少し上回る程度。

とは言え、プレーンテキストとしてはそれなりのサイズなので、単一のファイルでは、エディタによってはやや重荷になる場合があります。

ファイルが破損した場合も怖いので、大体二、三年に一つのファイルという形にしています (ここ最近はたまたまそのぐらいのスパンで転職しているので、一社一ファイルという感じ)。

ちなみにログファイルは常時開いた状態にしています。メインのテキストエディタに切り替えれば、そのファイルをすぐに確認できるようになっています。

利点、と思われるところ

やっていることは結果的に GTD (Getting Things Done) に近くなるんでしょうか。

  • やることが明確になる
  • やったことを確認することによる、進捗の見える化

という利点があるような気がします。

これを続けていると、自身の開発速度、タスクの割り込み頻度などがある程度把握できるようになります。その結果、タスクに対して作業見込み時間の見積もり精度が向上します。

あるタスクについて、どのぐらい時間をかけたのかというのは、git や svn などのバージョン管理システムのログを見たり、チケットの更新時刻を確認したりすることでも、判断することができます。

しかしながら、実際にはそのタスクに対して割り込みがあったのかもしれないし、前準備が必要だったのかもしれません。その点、自分でログを残しておくと、そういう外的要因を確認できる割合が高まります。

で、本当のところ効果はあるのか

正直なところ、分かりません。そうしなかった時との比較ができないので。

一日二日では違いを感じることは難しいとは思いますが、十年以上続けてきて (こうしてネタにもできましたし) 私には合っているルーチンだと思っています。

ソフトウェア開発でスクラムなどを適用していると、毎日スタンドアップミーティングをやったりしますが、その前の事前準備として役に立ったりします。

私が始めた十年前当時は、まだアジャルな開発手法を取り入れていませんでしたが、最近では採用しているところも多くなっていると思います。そういう点では相性は良いと思います。

はてなブックマーク - 海外でエンジニアとして働いて、ここ十年ほど毎日続けている、ある一つのこと

スポンサーリンク

ここ三、四年で利用している (利用した) ワイヤレスマウスの個人的まとめ

[写真] 所有マウス

左上から時計回りに

Logitech (ロジクール) と Microsoft のマウスしかありませんが、特にメーカー指定で選り好みしている訳ではなくて、日本だと手軽に手に入るであろうエレコム、バッファロー、サンワサプライなどのメーカーは私の在住しているニュージーランドでは手に入りづらいのが一番の理由です。

V470 Cordless Laser Mouse を利用してからというもの、基本的には何らかのワイヤレスマウスを利用しています。

MacBook Pro 13 (Early 2011) を購入してからはトラックパッドも以前よりも利用するようになりましたが、それでもやはりメインのポインティングデバイスはマウスです。

V470 Cordless Laser Mouse は四、五年前ぐらいに挙動不審になってしまい、それ以降いくつかのワイヤレスマウスを利用してきました。

ワイヤレスマウスに対しての基本的な利用基準は、あまり変わっていなくて

  • Bluetooth 対応
  • 光学式あるいはレーザー式のトラッキング
  • スクロールホイール
  • 2 ボタン以上のサポート

ボタンの数に特別なこだわりはありませんが、Mission Control の利用を考慮すると 3 ボタンは欲しいところ (左クリック・右クリック・センターボタン)。

多機能なマウスだと 4 つ以上のボタンがあることもありますが、あっても使うことがないので、あってもなくても気にしません (それがあることで価格が高くなるのであれば、ない方がいい)。

2016.08 現在のメインマウス

とりあえず、まず最初に現在メインとして利用しているマウスを先に言っておくと……

前者は Macbook Pro 13 (Early 2011) 用に、後者は会社で利用している Macbook Pro 15 (Mid 2015) 用に利用しています。

Apple Magic Mouse

まず、基本的なところで Apple からリリースされている Magic Mouse と Magic Trackpad

現在だと Magic Mouse 2 に置き換えられているようですが、使い勝手は従来の Magic Mouse とほぼ変わらないようです。

Apple 製なので、Macbook との相性は良いと思います。

ボタンやホイールの代わりにトラックパッドを組み込んだようなマウスで、マウス表面がタッチセンサーになっています。二本指ジェスチャーなどで Mission Control を利用できたりします。

無線形式Bluetooth
トラッキングレーザー
大きさ(縦) 11.35 cm x (横) 5.71 cm x (高) 2.16 cm
重さ55 g (電池なし)
106 g (電池あり)
99 g (Magic Mouse 2)
電池寿命?

前後左右対称な形状で、突起物などもないため、前後が逆さまになっていた時、触っただけでは分かりません。マウスを動かしてみるか、Apple ロゴの向きや位置で確認する必要があります。

平べったい形状のため、利用中は常に手のひらとマウスの間に空間ができるような形になります。私はそれが少し気になって、メインマウスとしては利用できませんでした。

ちなみに Magic Mouse と Magic Trackpad は、前職の会社支給での利用なので、現在所有していません。

Apple Magic Trackpad

別記事でも触れたとおり、ユニボディな MacBook に搭載されたトラックパッドは、それまでのトラックパッドとは一線を画すと言っても過言ではないほど使い勝手が向上されています。

それを単独な形で切り出したのが Magic Trackpad で、使い勝手はほぼ同等。MacBook に搭載されているものより一回り大きいので、その分向上しているとも言って良いかもしれません。

無線形式Bluetooth
大きさ(縦) 11.0 cm x (横) 13.0 cm x (高) 1.80 cm
重さ136 g (電池なし)
184 g (電池あり)
電池寿命?

メインで利用しないのは単に MacBook を利用している限り、とりあえず Trackpad は常に利用できるから。

Apple Magic Trackpad 2

後継の Magic Trackpad 2 は利用したことがありませんが、Force Touch 対応・充電池内臓でより使い勝手が増しているかもしれません。

無線形式Bluetooth 4.0
大きさ(縦) 11.49 cm x (横) 16.0 cm x (高) 1.06 cm
重さ231 g
電池寿命?

MacBook Pro 13 (Early 2011) のトラックパッドは Force Touch に対応していないので、Magic Trackpad 2 が利用できると嬉しいのですが、接続には Bluetooth 4.0 が必要で、私の所有している MacBook Pro 13 (Early 2011) では、そのままでは利用できません。

Microsoft Sculpt Touch Mouse (日本語サイト)

[写真] Sculpt Touch Mouse

Logitech V470 マウスが挙動不審だった際に、代替候補として購入。

特徴的なのはホイール部分のインタフェースで、ここが縦長のタッチセンサーになっています。クリックすると、センターボタンとして、なぞるとホイールとして利用できます (縦方向・横方向) 。

なぞった時に振動によるフィードバックがあるのも特徴。マウス側で勝手にやっているため、マウスの電源を入れてなぞれば フィードバックを感じることができます。

無線形式Bluetooth
トラッキングBlueTrack
大きさ(縦) 9.55 cm x (横) 6.5 cm x (高) 3.5 cm
重さ62 g (電池なし)
117 g (電池あり)
電池寿命9 ヶ月

どのレビューを見ても触れてありますが、やはり一番の難点はタッチセンサーの操作性。素早くなぞった時にホイールがしばらく回り続けるような慣性動作をサポートしたりしていますが、感度の調整不足なのか全体的に反応が微妙な感じ。

ホイール部のタッチセンサーが Magic Mouse や Trackpad 並の感度だったら、すごく良くなりそうなのに、この点が至極残念 (ソフトウェアで感度を変更できるようですが、Mac には対応していない模様)。

ホイールを使わず 3 ボタンマウスとしてなら、普通に使えるので、サブマウスとして時折使用する感じになっています。

Logitech M555b (日本語サイト)

[写真] M555b

挙動不審になってしまった Logitech V470 マウスの代替として購入。

繭型の V470 と比べて、ややのっぺりした感じの形状になっています。前述の Microsoft Sculpt Touch Mouse とは異なり、物理的なマウスホイールがあるマウスですが、二つのモードを切り替えることができるようになっているのが特徴的です。

慣性動作モードでは回した時のクリック感がなくなり、勢いよく回すことができます。長い文書を一気にスクロールしたい時などに有効。通常動作モードでは回した時に、クリック感があり、回した分だけホイール動作させることができます。

ホイール自体を押すとホイール動作モードの切り替えることができます。動作モードの切り替えにホイールボタンが使われるので、センターボタンがホイール直下に分かれて実装されています。

無線形式Bluetooth
トラッキングレーザー
大きさ(縦) 9.9 cm x (横) 5.8 cm x (高) 3.4 cm
重さ69 g (電池なし)
120 g (電池あり)
電池寿命2.5 ヶ月

ホイールがセンターボタンとして利用できないのには少し慣れが必要かもしれません。私はすぐに慣れました。ホイールの慣性動作はなかなか気持ちよいです。

慣性動作をサポートしている影響なのか、電池寿命が短いのが気になります。案外すぐに電池を交換しなくちゃいけない感じ。

しばらくメインのマウスとして利用していましたが、若干挙動不審気味なため、現在は後継機種の M557 を使っています。

Microsoft Designer Bluetooth Mouse (日本語サイト)

[写真] Designer Bluetooth Mouse

Logitech M555b/M557 をメインのマウスとして利用するようにしましたが、自宅と会社とそれぞれにマウスを置いておきたいと思って見つけたのが Microsoft Designer Bluetooth Mouse です。

とてもシンプルなデザインで、表面はつや消し処理されいるのか、光沢がありません。ベタベタ指紋がついたりしないし、触り心地がとても良いです。

ホイールは細いですが、金属製で剛性はしっかり。ホイールのチルト (横方向) には対応していません。電池用の蓋には爪などなく、磁石で付く仕様になっています。

ボタンが若干の静音設計になっているようで、しっかりしたクリック音はありますが、他のマウスと比べると低音かつ小音です。

無線形式Bluetooth 4.0
トラッキングBlueTrack
大きさ(縦) 10.7 cm x (横) 6.01 cm x (高) 2.6 cm
重さ57 g (電池なし)
80 g (電池あり)
電池寿命6 ヶ月

使い勝手は (良い意味で) とても普通。個人的には高さがあともう少しあると嬉しいかなとは思いますが、使用感には特に影響していないと思います。

利用するには Bluetooth 4.0 が必要なため、MacBook Pro 13 (Early 2011) では利用できないのが残念。そのため、MacBook Pro 13 用のメインマウスとしては利用できません。

Logitech M557 (日本語サイト)

[写真] M557

前述の M555b の後継機種が M557 です。ホイールの慣性動作がなくなった代わりに、ホイールがセンターボタンとして利用でき、また電池寿命が 12 ヶ月と大幅に伸びたのが特徴です。

おそらくホイール機構の単純化の影響でしょう、M555b と比べて本体重量もおよそ 10 g 程度軽くなっています (持ち比べると、マウス前方が軽くなっているのが分かります) 。

無線形式Bluetooth
トラッキングレーザー
大きさ(縦) 9.9 cm x (横) 5.8 cm x (高) 3.4 cm
重さ60 g (電池なし)
112 g (電池あり)
電池寿命12 ヶ月

形状・機能は M555b をそのまま踏襲していて、ホイールの慣性動作が利用できないという以外の点では使い勝手は M555b と同等。電池寿命が大幅に伸びたのは大きいです。交換すれば一年程度はもつので安心感があります。

Bluetooth 4.0 が必要ということもなく、MacBook Pro 13 (Early 2011) でも利用できるので、現在メインマウスとして利用しています。

Logitech MX Anywhere 2 (日本語サイト)

[写真] MX Anywhere 2

MX Anywhere 2 は Logitech の高級マウスの一つです。モバイル用と謳っていて、同じく高級マウスに分類される MX Master と比べると小ぶりで機能も抑えられています。

仕様を見ると、ほんの少しだけ M557 よりも大きいみたいですが、丸みを帯びた形状もあって、M557 よりも若干小ぶりに感じます。電池寿命は 2 ヶ月と M555b よりも短いんですが、充電池内臓で USB ケーブルを使って充電しながらでも利用できるので、個人的にはほとんど気になりません。

さすがに上位機種らしく、M555b 同様のホイールの慣性動作もサポートしていますし、切り替えボタンで一々ペアリングしなくてもサッと接続先マシンを切り替えることができる機能もあります (3 機種まで登録可能) 。

Bluetooth 4.0 が必要ですが、Logitech の Unifying 接続にも対応しているので、USB ポートをひとつ使ってしまう覚悟があれば、とりあえず MacBook Pro 13 (Early 2011) でも利用できます。

無線形式Bluetooth 4.0 / Unifying
トラッキングレーザー
大きさ(縦) 10.03 cm x (横) 6.16 cm x (高) 3.43 cm
重さ106 g
電池寿命2 ヶ月

Microsoft Designer Bluetooth Mouse のようなつや消しボディで触り心地が良く、加えて厚みが適度にあり、丸みを帯びた形状で M555b/M557 よりも手にフィットする感じで、さすが上位機種という使い勝手です。

MacBook Pro 13 (Early 2011) には Bluetooth で接続できないので、MacBook Pro 15 (Mid 2015) 用のメインマウスとして利用しています。

(おまけ) Microsoft Wireless Mouse 1000 (日本語サイト)

[写真] Wireless Mouse 1000

ワイヤレスマウスですが、USB レシーバを使うタイプですので、私のメインマウスには利用していません。ただ、USB 接続できるマウスを手元に置いておくと結構便利で、案外重宝しています。

Microsoft Wireless Mouse 1000 は Wireless Desktop 850 というキーボード・マウスのセット製品の一部です。単体で売っているのかどうかは分かりません。

無線形式2.4 GHz 帯ワイヤレス (USB レシーバ)
トラッキング光学式
大きさ(縦) 11.1 cm x (横) 5.6 cm x (高) 3.7 cm
重さ120 g (電池あり)
電池寿命8 ヶ月

無難なデザインで、やや重たい印象はありますが、使い勝手はいたって普通。可もなく不可もなくと言ったところ。

はてなブックマーク - ここ三、四年で利用している (利用した) ワイヤレスマウスの個人的まとめ

スポンサーリンク

Evernote 5.7 Mac で新しくなったプレゼンテーションモード

Evernote Mac 版 ver 5.7 が先日リリースされました。

[画像]Evernote 5.7 (Mac) が 10 月末にリリースされました。

このバージョンでは、Evernote Mac 版 ver 5.3 より搭載されたプレゼンテーションモードがバージョンアップされています。

プレゼンテーションモードはプレミアム (あるいはビジネス) 会員向けサービスですが、フリー会員でも 30 日間、一切の機能制限なく試用することができます。

[画像]新しいプレゼンテーションモードではレイアウト画面が追加されました。

レイアウトの編集

これまでのプレゼンテーションモードには、ノートに挿入された水平線を「改ページ」のように扱うという機能がありました。

新しいプレゼンテーションモードでは、水平線はそのまま水平線として扱うようになりました。改ページのような「区切り線」は新しく実装されたレイアウト画面で追加・編集できるようになります。

プレゼンテーションスクリーン右上にあるボタンが「レイアウト」ボタンです。

レイアウトを開くと、プレゼンテーションの縮小版が表示されて、表示したい箇所にさっとジャンプすることができます。

レイアウト画面右側に青いドットが表示されているのが分かるでしょうか。これは区切り線が挿入できるポイントを示しています。

マウスカーソルを持っていくと、どの位置に区切り線が挿入されるのか表示されます。そのままクリックすれば、区切り線が挿入されて、プレゼンテーションがその場で更新されます。

[画像]区切り線の追加は「+」ボタンで、追加した区切り線は「−」ボタンで行えます。

すでにある区切り線の横には「-」ボタンが表示されていて、それを押すとその区切り線を削除できます。区切り線はマウスでドラッグすることができて、区切り線の位置を変えたり、前後の区切り線と合わせたりすることでレイアウト調整ができます。

テーブル表示のサポート

Evernote Mac 版 ver 5.6 でエディタの機能が大きく改善されました。テーブルがより簡単に編集できるようになり、イメージのサイズも簡単に微調整できるようになりました。

これまでのプレゼンテーションモードでは、テーブル表示が崩れてしまったりすることがありましたが、大幅に改善さています。

[画像]テーブルの表示が大幅に改善されています。

イメージ表示のブラッシュアップ

これまでノートに貼り付けられたイメージは、プレゼンテーションモードでは画面中央に左右マージンをとって表示するような形で表示されていましたが、新しいプレゼンテーションモードでは、可能な限り大きく表示するようになりました。

特に縦長のイメージは、以前のプレゼンテーションモードでは常に画面に収まるように縮小されて表示されていました。新しいプレゼンテーションモードでは、この動作が変更されて、横幅が十分にある縦長のイメージに対しては、画面をはみ出して表示するようになっています。

[画像]縦長イメージも端から端まで使って表示するようになっています。

ウェブサイトのスクリーンショットなどで、スクロールする画面をくっつけたような縦長のスクリーンショットを見かけることがあると思いますが、そのようなスクリーンショットはとても自然に表示されることになります。

画面をはみ出してしまった縦長のイメージは、クリックすると縮小表示に切り替えることができますし、エディタ上で画像のサイズを変更すると、プレゼンテーションモードでもそれをそのまま利用するので、十分に小さくすれば、画面をはみ出さないように設定することもできます。

イメージ・テーブルの見出しと説明文

区切り線を調節することで、イメージやテーブル前後の文節を見出しや説明文として設定できるようになっています。

テキストでイメージ (テーブル) を挟み込むような形になるように区切り線を追加すると、イメージ (テーブル) 上部のテキストは見出しに、イメージ (テーブル) 下部のテキストは説明文として設定されて、それぞれ見た目が変わります。

[画像]区切り線を調整することで、イメージやテーブルにキャプションをつけることができるようになりました。

その他の改善点

外観のアップデート

タイトル表示やテキストの表示フォントがデザインし直されています。

[画像]新しくなったプレゼンテーションのデザイン

残念ながら、日本語での表示は以前とあまり大きく変わらないのですが、左右のマージンや行間なども微調整されていて、以前よりもさらにスッキリとした見栄えになっている感じがします。

表示フォントのサイズ変更

以前のプレゼンテーションモードでは、表示フォントサイズはほぼ固定でした。

新しいプレゼンテーションモードでは、表示フォントサイズを三段階で切り替えることができるようになりました。

スペースキー動作の改善

以前のプレゼンテーションモードでもスペースキーで下に移動、シフト + スペースキーで上に移動という動作になっていました。

[画像]スペースキーによる画面移動

以前のプレゼンテーションモードでも、区切りや貼り付けられたイメージを認識して、それがうまく表示されるように移動するという動作になっていましたが、新しいプレゼンテーションモードでは、その動作の精度が改善されています。

はてなブックマーク - Evernote 5.7 Mac で新しくなったプレゼンテーションモード

スポンサーリンク

さぁ、楽しいバグ取りの時間だ — バグに対してのワークフロー

現職でも前職でも JIRA というバグトラッキングシステムを使っています。

バグが報告された時にどのようなフローで処理するかをざっとまとめてみました。

チケットの発行

報告のあったバグはシステムに登録されます。

登録されたひとつひとつのバグはチケット (ticket) と呼ぶことが多い感じです。

以前の会社では issue とも言っていました。JIRA のシステム上では issue となっています。

ちなみに英語では、"raise a ticket (an issue)", "create a ticket (an issue)", "make a ticket" と言ったりしています。

バグの報告内容

  • 概要 (Summary)
  • テストしたソフトウェアバージョン
  • テストしたハードウェアならびに OS とそのバージョン
  • 再現手順
  • スクリーンショットやムービー

バグは再現性があるかどうかが肝で、再現する手順が明らかならば、そのバグは八割方直ったも同然です。

バグに対してのアクション

プロジェクトの進行状況や日程などによって変わりますが、バグが報告された際、すぐに修正作業に入ることはまれです。

  • レポーター (Reporter)

    バグを報告した人。テスターでなくてもバグの報告者になりえますが、テスターがレポーターになることが多いです。

  • ディスパッチャー (Dispatcher)

    バグの優先順位を決めたり、割り当て分担を決める人。テクニカルリーダーがこの役目を担うことが多いのですが、プロジェクトマネージャーやシステムエンジニアがチケットの割り当てを行うこともあります。

  • 担当者 (Assignee)

    バグの修正作業を行う人。当然ながら開発者 (デベロッパ) がバグ修正を行うことが多いです。

基本的な流れとしては、

  1. レポーターからバグの報告を受ける
  2. ディスパッチャーが各開発者の負荷や開発範囲を考慮して、それぞれのバグを開発者に割り当てる
  3. 開発者がバグを修正する

という形になります。

トリアージと優先順序

もちろん報告されたバグは全て直すのが理想ですが、リリース日程がタイトな場合には、全てのバグを直すのが事実上不可能なことがあります。

その場合、報告を受けたバグに優先順位をつけて、どのバグから優先的に修正するか、もしくは、修正しないことにするか (修正するにしても次のバージョンアップで修正する) などを決めていきます。

以前勤めた職場では、優先順位決定プロセスを「トリアージ (triage)」と呼んでいました。

災害などの非常事態に行う医療トリアージから来ています。

例えば、優先順位としては、以下のようなものが挙げられます。

順位 内容
P1 緊急。アプリケーションがクラッシュするなど、このバグのために他のテスト作業や開発業務ができない。深刻なセキュリティの脆弱性など
P2 重要。リリース前に直すべきバグ。アプリケーションが要求仕様通りに動作していない
P3 不具合だが回避方法がある、ミススペルや翻訳不備などのローカライゼーション系不具合、などの緊急度の低いバグ
P4 見た目だけの問題や微妙な挙動の一貫性不備、などの動作そのものには影響しないバグ

これは一例ですが、基本的な優先順位の意味付けはチーム内で共有しておく必要があります。

優先順位に付いている「P」は priority の略。

トリアージは以下のようなメンバーで行います。

  • テクニカルリーダー (あるいは、プロジェクトマネージャ)
  • システムエンジニア (あるいは、デザイナー) : 仕様作成者
  • テストリード
  • シニアソフトウェアエンジニア

これに (チケット内容の詳細を確認するため) レポーターが参加したり、実装の詳細をしっているエンジニアが参加したりする場合があります。

ソフトウェアリリース

バグに対してのワークフローからは少し脱線しますが、バグの優先順位はソフトウェアのリリースと関連付けられる場合あります。

ソフトウェアのリリースに関しては、正式公開されるまで

  • 基本仕様の実装完了 (Feature Complete)
  • アルファ版 (Alpha)
  • ベータ版 (Beta)
  • リリース候補版 (Release Candidate)

というような内部リリースの段階を踏みます。

リリース予定日から逆算してスケジュールを組むことが多いと思いますが、この内部リリースの大まかな定義 (目標) として、優先順をつけられたバグの数を使うことがあります。

つまり……

リリース 内容
Feature Complete 仕様実装がほぼ完了。新規機能追加を基本的に行わず、テストフェーズに移行
Alpha 最優先のバグ (P1) = 0。追加仕様の実装
Beta 重要なバグ (P2) = 0
Release Candidate その他、バグを可能な限りなくす。P3 バグ = 0 が目標

内部リリースのフェーズに応じて、その時点で残っているバグの優先順位の見直しが行われます。

場合によって、緊急度の低いいくつかのバグは次期バージョンに持ち越しされることもあります (defer)。

チケットの状態

報告されたチケットは、担当者に割り当てられるまではディスパッチャーが預ります。

チケットの状態 (status) にはおおよそ以下のように分類されます。

状態 内容
公開 (Open) チケットを受理。修正作業に入る前の状態
作業中 (In Progress) 担当者が当該チケットの修正作業中
修正済 (Resolved) 担当者がバグを修正し、テスターに検査依頼
完了 (Closed) テスターが修正内容を確認し、修正の承認が終了した状態

会社やプロジェクトによっては、更に以下のような状態が追加されている場合もあります。

状態 内容
新規 (New) Open の前段階。担当者に割り当てられる前の状態。New がない場合は、Open が New を兼ねる
検査中 (Testing) Closed の前段階。テスターが修正内容を検査中。Testing がない場合、Resolved が Testing を兼ねる

担当者 (開発者) のアクション

担当者はバグを修正して、テスターに「修正済 (Resolved)」として渡す役目を担いますが、単にソフトウェアを変更して「修正」する以外にもいくつか取りうるアクションがあります。

状態 内容
修正完了 (Fixed) ソフトウェアを変更し、バグを修正した
再現不可 (Cannot reproduce) 報告されたバグが再現できないため修正が困難。レポーターないしテスターに差し戻し
重複 (Duplicated) 他のチケットとしてすでに報告されている
修正不可 (Won't fix) 外部要因 (ハードウェアあるいは OS もしくはサードパーティライブラリ) による制限により修正不可能
仕様 (By design) 「それは仕様です (Working as intended)」

先述した通り、バグは再現性が非常に重要です。開発者の環境で再現できれば、そのバグは八割以上直ったのも同然とも言えます。

「再現できない (I could not reproduce/replicate it)」場合は、レポーターもしくテスターに差し戻して手順や条件の見直しをしてもらいます。

フロー概要図

以上を踏まえて、ざっと図にまとめると以下のようになります。

[図] チケットに対するワークフロー

人物っぽいシンボルについては

  • D : 担当者。主に開発者が担う。
  • L : ディスパッチャー。主にテクニカルリーダーが担う。
  • T : テスター。修正されたバグを検査する

のようになります。

レポーターは前述のとおり、テスターが担うことが多いのですが、必ずしもテスターがレポーターになるという訳ではありません (バグの報告は誰でもできます) 。

はてなブックマーク - さぁ、楽しいバグ取りの時間だ — バグに対してのワークフロー

スポンサーリンク

Tinted image for UIImage

[画像]画面に表示するイメージ画像に色付けしたい……。

iOS のアプリケーションでハイライト状態などを示すため、生成した画像イメージに対して色付けしたいときがあります。

UIView には tintColor というプロパティがあって、色付けが簡単にできそうなのですが、イメージを表示する UIImageViewtintColor を設定しても何も変わりません。

そこで以下のようなヘルパークラスを用意して利用しています。

@interface SBLImageHelper
/**
 *  Generates an image which is tinted with a given color.
 *  @param image - an image to be tinted
 *  @param color - tint color
 *  @return an instance of UIImage
 */
+ (UIImage *)tintedImageFromImage:(UIImage *)image
                        withColor:(UIColor *)color;
@end


@implementation SBLImageHelper

+ (UIImage *)tintedImageFromImage:(UIImage *)image
                        withColor:(UIColor *)color
{
  UIImage *output = nil;
  CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);

  if (UIGraphicsBeginImageContextWithOptions != NULL)
  {
    UIGraphicsBeginImageContextWithOptions(image.size,
                                           NO,
                                           image.scale);
  }
  else
  {
    UIGraphicsBeginImageContext(image.size);
  }

  CGContextRef context = UIGraphicsGetCurrentContext();

  // -- flipping geometry
  CGContextTranslateCTM(context, 0, image.size.height);
  CGContextScaleCTM(context, 1.0, -1.0);

  // -- setting up blend mode
  CGContextSetBlendMode(context, kCGBlendModeNormal);

  // -- first drawing the image
  CGContextDrawImage(context, rect, image.CGImage);

  // -- then setting up mask and fill the color
  CGContextClipToMask(context, rect, image.CGImage);
  CGContextSetFillColorWithColor(context, color.CGColor);
  CGContextFillRect(context, rect);

  output = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();

  return output;
}

@end

次のように使います。

UIColor *tintColor = [[UIColor redColor] colorWithAlphaComponent:0.5];
UIImage *originalImage = [UIImage imageNamed:@"sample"];
UIImage *tintedImage = [SBLImageHelper tintedImageFromImage:originalImage
                                                  withColor:tintColor];

Objective-C にはカテゴリーという既存のクラスを拡張するための仕組みがありますが、すでにあるメソッドと同じ名前のメソッドを追加すると、どっちのメソッドが利用されるか分からなくなってしまうという強烈な副作用があります。

ですので、個人的にはあまりオススメしませんが、UIImage のカテゴリーとして拡張するバージョンだと以下のようになるでしょうか。

@interface UIImage (SBLImageHelper)
/**
 *  Generates an image which is tinted with a given color.
 *  @param color - tint color
 *  @return an instance of UIImage
 */
- (UIImage *)imageWithTintColor:(UIColor *)color;

@end


@implementation UIImage (SBLImageHelper)

- (UIImage *)imageWithTintColor:(UIColor *)color
{
  UIImage *output = nil;
  CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);

  if (UIGraphicsBeginImageContextWithOptions != NULL)
  {
    UIGraphicsBeginImageContextWithOptions(self.size,
                                           NO,
                                           self.scale);
  }
  else
  {
    UIGraphicsBeginImageContext(self.size);
  }

  CGContextRef context = UIGraphicsGetCurrentContext();

  // -- flipping geometry
  CGContextTranslateCTM(context, 0, self.size.height);
  CGContextScaleCTM(context, 1.0, -1.0);

  // -- setting up blend mode
  CGContextSetBlendMode(context, kCGBlendModeNormal);

  // -- first drawing the image
  CGContextDrawImage(context, rect, self.CGImage);

  // -- then setting up mask and fill the color
  CGContextClipToMask(context, rect, self.CGImage);
  CGContextSetFillColorWithColor(context, color.CGColor);
  CGContextFillRect(context, rect);

  output = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();

  return output;
}

@end

この記事は qiita.com の内容を再掲載したものです。

はてなブックマーク - Tinted image for UIImage

スポンサーリンク

スイス・チューリッヒに引っ越しました

知っている人もいると思いますが、およそ十年間暮らしたニュージーランドを離れ、今年 7 月よりスイス・チューリッヒにて生活を始めました。

[写真] リンデンホフの丘からチューリッヒ旧市街を眺める

カリフォルニア、いわゆるシリコンバレー、を拠点とするクラウド系サービスを提供している IT 企業のチューリッヒオフィスで、ソフトウェアエンジニアとして働いています。

「ニュージーランドからスイスに引っ越します」と言うと驚く人が多いんですが、場所はどちらかと言うと付随的なもので、やってみたいお仕事を選んだら、働く場所がたまたまスイスだったという感覚が近い感じがします。

もちろん、そこで生活していく以上、もっとも影響のある要素のひとつなので、考えられる可能性などを家族と相談した上で決めました。

[写真] チューリッヒ中央駅・車は当然ながら左ハンドル右側通行

スイスで働くためには就労ビザが必要なります。今回、ビザの申請から最終的な承認が下りるまでにおよそ三ヶ月かかりました。

ビザ申請は採用決定後に行われます。採用の決定を受けたものの、スイス行きが確定しない (それもいつ確定するか分からない) という宙ぶらりんな状態が続きました。

いつ確定するか分からないので、準備や告知をどのタイミングで始めるか決めかね、正直辛かったです。

ビザが下りて、スイス行きが確定してからは、前職にて退職願提出から始まり、引っ越しの手配、各所へのお知らせ、日頃よりお世話になっている友人などにご挨拶、ニュージーランドの持ち家に関しての諸手続き、……などなど、とにかくやることが盛り沢山。

娘や嫁さんの頑張りのお陰でどうにかこうにかスイス入りにこぎつけたという感じです。

[写真] チューリッヒ中央駅・博物館通り

参考になるか分かりませんが、スイス行きが確定するまでの流れを軽くまとめると……

2012.09 上旬
申し込み。 CV (職務経歴書) の送付
2012.10 中旬
スイスでの就労ビザ取得困難との判断で一度断られる
2012.12 中旬
先方より再連絡
2013.01 上旬
Skype で技術面接 (一次)
2013.01 中旬
Skype で技術面接 (二次)
2013.01 下旬
Skype で技術面接 (三次)
2013.01 下旬
人事の方と電話面接
2013.02 中旬
Skype にて面接。正式にオファーを受ける
2013.02 下旬
オファーにサイン
2013.03 上旬
就労ビザ申請手続き開始
2013.03 下旬
ビザに必要な書類の送付
2013.04 上旬
スイス連邦当局よりビザ承認
2013.04 下旬
申請者の就労ビザの最終承認
2013.05 下旬
申請者の家族のビザ最終承認
2013.07 中旬
スイス入り
2013.08 上旬
ネコ・家族のスイス入り

就職応募先がスイス、本社はカルフォルニアで、私自身はニュージーランド。面接は基本的に Skype を通して行いました。

2 月頃、こちらのネットワークの調子が非常に悪い時期があって、その時だけ電話での面接でしたが。

これまでにも何度か Skype を通して面接を行ったことはありますが、これほど立て続けに面接をしたのは初めての経験でした。

技術面接では Google ドキュメントのような共同編集できるオンラインツールを使って、コーディングの問題に回答したりもしました。

ビザ最終承認の後、スイス入りまで飛ばしていますが、前述のとおり、怒涛の勢いで色んな行事やら手続きが詰まっています。

[写真] チューリッヒ中央駅にて

スイスにはこの先、どのぐらい滞在することになるかは分かりませんが、とりあえずしばらくはこの新しい場所で生活していくことになります。

十年間暮らしたニュージーランドは、素晴らしい友人にも恵まれ、とても快適に過ごすことができました。お世話になった方々、ありがとうございました。スイスに移ってもよろしくお願いします。

[写真] チューリッヒ大聖堂

はてなブックマーク - スイス・チューリッヒに引っ越しました

スポンサーリンク

Re: 今日のiPhoneホーム画面

salchuさんの「今日のiPhoneホーム画面」に触発されて、私もホームスクリーン晒し。

この間、日本でお会いした時には iPhone 持っていなかったので、お見せできなかったですものね。多分、iOS6 でのホーム画面はこれが最終形になるかと。五つの画面をひとまとめにしてしまったので、見づらくてごめんなさい。

[画像] iOS6 でのホーム画面

スクリーン 1
Apple 標準アプリのみ。"Podcast" は、半標準ということで。
スクリーン 2
ソーシャル系・日常で利用するアプリ。左に赤系・右に青系を置いてます。
スクリーン 3
Apple, Google, Evernote を順に並べて、自作アプリもここに。
スクリーン 4
辞書系・読書系のアプリ。
スクリーン 5
銀行関連・乗り換え案内関連。あといくつか普段あまり利用しないやつも。

傾向として……

  • フォルダはあまり使わない。
  • 同系色はまとめたい。
  • よく利用するアプリほど下に配置したい。

といった感じでしょうか。

地図は標準 Map と Google Map を半々で利用する感じ。これまでのところ、標準の Map で使いづらいとか困ったとかあまり感じたことがないので、特に Google Map じゃないとダメという感じではないです。

二ページ目は左側の赤系・右側に青系と決めているんですけど、そのせいであまり使わない mixi とか Foursquare が入ってしまっているのはご愛嬌。Gmail, ATOK Pad, Facebook, Dropbox は、ビューワとしてほぼ毎日使ってます。

iOS7 になると、おそらくまた構成が変わると思うので、この状態があと何日もつかは不明ですけれども。

あ、ちなみに iOS で最も頻繁に使っていると思われるアプリは Settings (設定) です。カメラはもっぱらロックスクリーンからアクセスするのでどこに置いても変わらないという。

はてなブックマーク - Re: 今日のiPhoneホーム画面

スポンサーリンク

mi 3.0.0b1 - mi ver 3 のファーストベータ

多機能エディタ mi の新バージョン ver 3 の最初のベータ版が公開されました

ver 3 になって Cocoa フレームワークを利用したアプリケーションとして作り直されています。

そのため Maximizer のような Cocoa アプリケーションにしか効かない SIMBL プラグインも利用できるようになっています。フルスクリーンで mi が利用できるように。

UI のアピアランスが大きく変更されました。Cocoa フレームワークを利用したこと影響も大きいのでしょう、全体的にモダンな UI に変わっています。

[画像] mi ver 3 - インタフェースが刷新されました。

アウトラインは「見出しリスト」という形で従来からサポートされていましたが、それが強化されて、セクション毎に折畳みができるようになっています。

モダンなエディタらしく (?) 選択されたテキストなどに対して、同一ファイル内に存在する同じワードが全てハイライト表示されたりします。

モードや設定などは ver 2 から引き継がれますが、設定ファイルは別に保存されているので併用も可能です。

私の環境ではモード毎に設定されているツールに割り当てていたキーバインドの一部が引き継がれませんでしたが (一部、新規追加されたデフォルトのキーバインドと被っていたせいかもしれません)、概ね以前のままの状態でそのまま利用できる印象です。

英語リソースの対応はまだのようで、英語環境で立ち上げると英語と日本語が交じったインタフェースになってしまうのはご愛嬌。…… ver 2 から引き継がれたメニューやインタフェースは英語化されていて、新規に追加された分が英語化されていないという感じの状態になっています。

アプリケーション設定・モード設定が大幅に見直されてとても分かりやすくなっています。

[画像] mi ver 3 - 設定ウィンドウが大幅に刷新されています。

特にカラー設定は「カラースキーム」という csv ファイルで定義されるようになり、インポート・エクスポートが簡単にできて管理しやすくなっています。インタフェースも分かりやすい。

ver 2 では subversion などバージョン管理システムで管理されたファイルに対して差分表示を行う機能がありましたが、ver 3 では、差分表示機能そのものが大幅に強化されて、自動保存による履歴差分や他のファイルの差分表示などもサポートするようになっています。

[画像] mi ver 3 - 新規に追加された差分表示機能。

私の環境では Retina ディスプレイでの表示を確認することはできませんが、アプリケーション内のリソースを見ると一部アイコンなどはベクター画像が利用されたりしていて、Retina 表示にも対応しているようです。

アプリケーションアイコンも前掲の通り刷新されました。「ミミカキ」がなくなっていますが、最大サイズ (1024 x 1024) で見るとハイライトペンのところに、さりげなく「MI3」の文字が……。細かい。

[画像] mi ver 3 - アプリケーションアイコンに隠された (?) MI3 の文字。

アイコンでキャプチャされている書類は、なんらかのソースコードに見えます。なんだろう……。コードスタイルから見ると c++ っぽい感じのコード。

まだざっとしか利用していませんが、安定して動作しています。パフォーマンスに関しては今のところ従来と同等な印象ですが、大きなファイルを開いたり、マルチファイル検索などの比較的重めな処理は行っていないので、これから確認という感じです。

ver 3 ではフリー版・有料版・AppStore 版とリリースされる予定ですが、今回ざっと紹介した機能のどこまでフリー版のものか、有料版のものかなどの詳細はまだ分かりません。ともあれ今後の展開にとっても楽しみです。

はてなブックマーク - mi 3.0.0b1 - mi ver 3 のファーストベータ

スポンサーリンク

汎用コードを複数の iOS アプリケーション開発で共有利用する手法

いくつかの iOS アプリケーションを開発していると、自然と共有できるコードが増えてきます。

そうした共有可能な汎用コードを複数のアプリケーションのプロジェクトで利用する方法はいくつか考えられます。

アプリケーションのプロジェクトに組み込む

別リポジトリで管理している汎用コードを svn externals や git submodule などを使ってリンクして、それをそのままアプリケーションのプロジェクトに組み込みます。

svn や git などバージョン管理ソフトウェアの機能だけを利用しているので、仕組み自体はとてもシンプルになります。

構成はシンプルになりますが、その分運用でカバーしなくてはいけない点があります。

  • 汎用コード部分のビルドがアプリケーションのプロジェクトに依存するので、汎用コード部分の独立性を保つのに注意が必要。

  • 汎用コード部分でファイルの追加・削除があった場合、それを参照している全てのアプリケーションプロジェクトを逐次変更しなくてはならない。

  • 汎用コードを利用する新規アプリケーションプロジェクトを作成して、リンクしたリポジトリを取り込む際、ターゲットに含めるファイルとそうでないファイルの切り分けが必要。

総じて独立性が乏しい分、手順が増える傾向があります。

静的ライブラリとして生成する

汎用コード部分を静的ライブラリとして作成して、アプリケーションのプロジェクトにライブラリとして登録します。

静的ライブラリを作成するプロジェクトファイルがアプリケーションのプロジェクトとは独立した形で作成されるので、アプリケーションのプロジェクトに依存することなく、ビルド・ユニットテストを行うことができます。

Xcode は外部プロジェクトもプロジェクトに組み込めるので、アプリケーションをビルドする際に都度静的ライブラリを生成するような形で運用することも可能です。

Xcode の基本機能だけで完結しますし、手順もそれほど難しくはないのですが、イメージや xib などのバイナリリソースが静的ライブラリには、そのまま組み込めないという制約があります。

イメージなどのバイナリリソースは静的ライブラリとは別にアプリケーションのプロジェクトに組み込む必要があります。

その場合、汎用コード部分で利用されるリソースファイルの追加・削除の手間は前述の組み込み型と同等になります。

フレームワークとして生成する

静的ライブラリではリソースは組み込めないのですが、フレームワークという仕組みを利用するとリソースも込みでライブラリを生成することができます。

UIKit などはフレームワークの形で配布されて、ほぼ全てのネイティブ iOS アプリケーションで利用されています。

汎用コード・リソースの共有化という点では最適な方法なのですが、Xcode の標準な方法ではサポートされないという欠点があります。

Mac OS X 向けアプリケーションに対してはフレームワーク生成がサポートされていますが、iOS プラットフォームではサポートされていません。

iOS ユニバーサルフレームワークなどを利用すると iOS プラットフォーム向けフレームワークを作成することができます。

github での説明を見ても分かる通り、現状ではややハック的な運用にならざる得ないようです。Fake Framework という仕組みではバンドルを利用していたりするみたい。

静的ライブラリをリソース込みで生成する

拙作 SBPullToRefreshHeaderView のようにリソース込みな汎用コードがある場合、リソースがあるのでやはりフレームワークを使う方法になると思います。

ハック的な運用を避けて、Xcode 標準な機能だけでなんとかならないか、と探していたところ、Compiling Image Resources into a Static Library という記事を見つけました。

静的ライブラリにはバイナリリソースは組み込ませんが、バイナリを C コードの形でダンプしてコンパイルしてしまえば、データとして組み込むことが可能になります。

  1. イメージなどのバイナリを xxd -i コマンドを使って C コードに変換
  2. コード化されたデータを UIImage など Objective-C クラスに変換するローダーを生成
  3. リソースはローダーを介して読み込む

Compiling Image Resources into a Static Library では、イメージだけ処理していますが、同様に nib ファイルも処理できます。具体的な手順については後日改めて。

はてなブックマーク - 汎用コードを複数の iOS アプリケーション開発で共有利用する手法

スポンサーリンク

Fastbook は UIWebView でも軽快に動作する件

iOS 版 Facebook の実装が HTML5 アプリケーションからネイティブアプリケーション (CocoaTouch フレームワークを使ったアプリケーション) に変更されたのは記憶に新しいところ

それに対して「Facebookのモバイルアプリが失敗した理由は HTML5 のせいじゃない。HTML5 でサクサク動く Facebook アプリを作って見せた Sencha Touch 開発チーム」という記事がありました。

元ネタは The Making of Fastbook: An HTML5 Love Story (以下、元記事) です。

簡単に言うと、「HTML5 だから遅いんじゃないよ、デモアプリケーション Fastbook のようにネイティブアプリケーション同等な (むしろそれを上回る) パフォーマンスでるよ」ということになるでしょうか。

動画も挙がっていて、自信の程が伺えます。

これに対して、いくつか指摘が挙がっています。

え?これSafariじゃね?WebViewとSafariじゃあスピード全然違うよ

[→はてなブックマーク - hazisarashi のブックマーク - 2012年12月20日]

Safariとかずるすぎワロタ。WebviewはSafariの約3.3倍遅いんですが、Webviewで動かすとどうなるんでしょうね(ゲス顔

[→はてなブックマーク - fikah のブックマーク]

同様に元記事のコメントでも……

The demo is really promising, but it is in MobileSafari. When you make an iOS app, you can only use WebView, which is a second-class and slower browser.

[意訳] デモはとても前途有望だけれど、MobileSafari で動いているね。iOS アプリを作る時には WebView しか使えなくて、それは遅いブラウザになってしまうよ。

[→元記事コメント @hlb]

A sticking point with iOS is that embedded WebKit (in Facebook’s old native app) performs horribly compared to Mobile Safari (what Sencha used here) due to Apple's selfish hoarding of the Nitro JavaScript engine.

[意訳] 問題は Facebook の前バージョンでも利用されてた組み込み WebKit で、このデモで使っている Mobile Safari よりもひどく遅いけど。Apple の勝手な囲い込みで Nitro JavaScript エンジンは使えないから。

[→元記事コメント @Ron Waldon]

Mobile Safari では Nitro と呼ばれる JavaScript エンジンでスクリプトが処理されるのですが、CocoaTouch フレームで利用できる UIWebView ではその高速な JavaScript エンジンが (セキュリティ上の理由から) 使われません。

私もこの点 (デモが Safari 上で動いている) は少し気になっていました。

それに対して、Sencha Team のメンバーの何人かが答えています。

@hlb the issue is NOT JavaScript. It's the DOM. The DOM engine is the *same* for both use cases.

[意訳] @hlb JavaScript が問題ではないんだ。DOM が問題で、DOM エンジンは (Safari も UIWebView も) 同じなんだよね。

[→元記事コメント @Jay Garcia]

@hlb Simply save the app to your homescreen to force it to use a WebView.

[意訳] @hlb ホームに置くと、WebView を使うようになると思う (iOS 5.1 以降では Mobile Safari を利用するようになったという指摘あり)。

[→元記事コメント @Jamie Avins]

@Ron Waldon It doesn't matter for such apps like this. Again as we mentioned the bottleneck is never JavaScript execution. We wrapped the app in native webviews for you to try it out yourself: github.com/extjs/fastbook

[意訳] @Ron Waldon このアプリではそこは問題にならないんだ。(これまで) 指摘している通り、ボトルネックは JavaScript の実行にあるわけではないから。ネイティブな webview で実装した例を github に挙げたので、試してみてね。

[→元記事コメント @Jacky Nguyen]

Jacky Nguyen さんと Jamie Avins さんは動画にも登場されています。

コメント受けて、WebView を使った利用例が github に公開されました

コードは実にシンプルで、

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    
    UIWebView* view = [[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
    [self.window addSubview:view];
    [view loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://fb.html5isready.com/"]]];
    [self.window makeKeyAndVisible];
    return YES;
}

メインのコードはこれだけ。UIWebView を作って http://fb.html5isready.com/ を開いているだけです。

動作させてみると、私が思っていた以上に速い。iPhone 4S / iOS 6.x で確認。確か iOS6 から WebView に対して動作割当メモリが増えたので、それも影響している可能性あり。

UIWebView 上の WebKit でも、スクロールとかきびきびと軽快に動作します。

iOS のアプリケーションとしては、ステータスバーをタップしてもトップにスクロールバックしない、ローディングアニメーションが表示されるべきところで表示されない、未実装な機能 (例えば検索機能) がある、などブラッシュアップが必要な部分はありますが、デモアプリケーションとしてはなかなか興味深い。

もっともこれでもって「HTML5 使うべき」とも言えない部分もあって、

スクロール速度だけを取り上げても。Facebookのエンジニアが指摘した第一の問題はそこじゃないですよね。クラッシュの原因が解らない等 http://lists.w3.org/Archives/Public/public-coremob/2012Sep/0021.html

[→はてなブックマーク - Teshのブックマーク]

という Tesh さんのブックマークコメントや

The premise of this argument is wrong. It's not a simple question of "slow" versus "fast." Application performance is only one factor in building an HTML5 app. Device support, engineer productivity, testability, measurement, tooling/debugging, and native integration are all points that should be factored in. Anyone who has burnt the hours trying to debug a perf issue on a device that doesn't support Webinspector knows this pain. As does anyone who has gotten the bug report about the keyboard not popping up correctly on insert random Android 2.X no one has ever heard of here. As does anyone who has gotten the layout performance awesome in one test environment only to test another and find it terrible. The argument that HTML is ready while the device landscape is not is pretty fraught.

As far as fast goes, even as well done as this demo is, the scrolling framerate is noticeably slower on the Nexus 4 compared against the native application. I feel like all the demo is proving is what we already knew - somethings can be done reasonably well in HTML while many other can't. I'm a person who would rather have the web win. I'm pretty sure it will win in time. It's a pretty clear fact that until the browsers/webviews get faster and/or the device's have faster hardware, HTML is the second best option for smartphones.

[意訳] 議論の前提が違っているよね。単に「遅い」か「速い」という問題じゃない。アプリケーション性能は HTML5 アプリを構築するひとつファクタに過ぎないよ。どのデバイスをサポートするか、エンジニアの生産性、テストのしやすさや計測しやすさ、ツールの使い勝手、デバッグのしやすさ、ネイティブなサポート、など全てのファクタを考える必要がある。ウェブインスペクタをサポートしないデバイスでパフォーマンスをデバッグするのがどんなに大変か知っている人はいる?Android 2.X でキーボードが正しく表示されずにランダムな文字が入力されてしまうというバグレポートを見たことがある人は?あるテスト環境では素晴らしく性能がいいのに、別の環境ではめちゃくちゃだというのを経験したことがある人は?この議論を実際デバイスを横向きにして見ると見づらいという事実についてはどう?

[意訳] 速さという点に関しては、このデモはとても良くできている。スクロールのフレームレートは Nexus 4 で見るとネイティブアプリに比べて遅いけど。このデモは Sencha Team が HTML に関して深く理解している (そしてそれは他の多くの人はできない) こと証明しているに過ぎないと思うんだ。私個人的にはむしろ web が勝って欲しいし、いつかその日がくると信じているけれども、それはブラウザとデバイスが十分に速いというの明快になった時で、HTML はスマートフォンに対して二番目にベストなオプションだと思う。

[→元記事コメント @Jackson Gabbard]

元記事に寄せられた Jackson Gabbard さんのコメントのご指摘の通り、単純に速い・遅いという問題ではなくて、もちろんそれはとても重要な部分ではあるけれども、あくまでも全体の一部の問題でしかありません。

ツールの使いやすさ、デバッグのしやすさ、習得に対する敷居の低さ、などはソフトウェアを恒常的にメンテナンスする上で、重要なポイントになってきます。

Objective-C が習得に対して敷居が低いかどうかはまた別の議論になってしまいそうですが、ネイティブサポートのため、ハック的な知識がなくてもある程度の性能はいけるという印象はあります。もちろん実装次第ですけれども。

これは SenchaTitanium だけでなく、他のクロスプラットフォームなフレームワークでも大きな課題になっているポイントのような気がします。

はてなブックマーク - Fastbook は UIWebView でも軽快に動作する件

スポンサーリンク

1/24