カテゴリー : 2013年 5月

TOKYO FMのTIME LINE出てきた


昨日、なぜかラジオに出演してきた。TOKYO FMの「TIME LINE」という番組。聴いていただけた方、ありがとうございました。聴けなかった方、TIME LINEのWebサイトからアーカイブとして聴く事ができるらしい。一週間は聴けるらしいので、興味ある方はお早めにどうぞ。

先週の火曜日くらいかな、TIME LINEスタッフの方から電話が来て、「大辞泉」の課金が面白いから出演してもらえないかという打診があった。やるぜ!と即答。無料アプリは宣伝してなんぼじゃ。

当日は、7時過ぎくらいに半蔵門にあるTOKYO FM入り。すでに番組は始まっていて、スタッフの方とあいさつして10分ほど打ち合わせ。出番である7:20分になったらブース入り。ペラペラとしゃべりまして、15分程度で終了。じゃお疲れさまでしたー、といってTOKYO FM出たのが8時前。滞在時間一時間もなかった。ラジオってすげー。なんというか、軽いぜ。こんな簡単に公共の電波に声のせちゃっていいんだろか。

オンエアされた中で、「パソコン版」について言及している箇所がある。ま、うちの会社の場合、パソコン版イコールMac版なんだけど。いまのiOS版大辞泉を、ほぼそのままの仕様で、Mac版を作ってリリースすることは、それなりに簡単にできる。うち、Mac得意だから。でも、需要あるかなぁ?たしかに個人的には、辞書をひきたくなるシチュエーションって、Macを使っているときなんだよね。

ちなみに、録音された自分の声を聴くと、転げ回って悶絶したくなりますな。

大辞泉1.0.1不具合騒動の顛末


先日、大辞泉1.0.1をリリースしたら、それが操作できないもので、急遽1.0.2に再度アップデートした、というゴタゴタがありました。1.0.1にアップデートしてしまい、操作不能状態に陥った方々、ご迷惑をおかけして申し訳ありませんでした。

で、なんでそんな問題が起こったか、起きた後どういう対応をとったのか、ということをここにまとめておきます。言い訳めいたものになるけど、反省をして、再発を防ぐためです。

結論から言うと、今回の事態の原因は弊社のミスです。アプリケーションファイルに、辞書のデータベースファイルが含まれていませんでした。これにより当然の事ながら、まったく検索不可能になりました。単純なミスでした。こういったミスを犯さないようにたくさんの防御策があるのですが、今回はそれらをすり抜けられてしまいました。それを検証します。

まず、大辞泉の開発体制ですけど、ソースコードは社内のSubversionで管理してます。Subversionっていうのは、バージョン管理システムと呼ばれるもので、複数の人間でソースコードを編集するときに、それを管理してくれるものです。リリースするときは、「ここまで!」というタイミングでしめきって、最終テストフェーズに移行します。このフェーズでは、リリース用ビルドを使って全員でテストを行い、致命的な問題なしと確認されたら、ビルドの作成およびAppleへの審査提出、って流れになっています。

で、最初に1.0.1のビルドを作ったときは、何の問題も無かったです。だけど審査提出後、緊急の修正を行う事になりました。これはバグが見つかった訳ではなくて、コンテンツ提供元からちょっとした修正をしてくれ、と要望が入ったためです。そこで、Appleへの審査を取り下げて(Developer Rejectと呼ばれる)、もう一回ビルドを作り直す事にしました。

だけど、1.0.1の開発が終わって、もう次バージョンである1.1の開発が始まっていました。Subversionで管理しているソースコードの本筋(trunkと呼ばれる)は、1.1開発状態です。そこで、1.0.1用のソースコードをフリーズした状態にしてあるものの方で(tagと呼ばれる)修正する事にしました。修正自体は簡単なもので、ここでバグは入りませんでした。ただし、落とし穴がいくつかありました。

まず、1.0.1フリーズソースコード上で作業したんですけど、こちらの構成にはソースコードのみがあり、辞書のデータベースファイルがコピーされていませんでした。これは、データベースファイルはとても大きいので、Subversionに入れるとストレージを圧迫してしまうのであえて外していたのです。結果、できあがったビルドはデータベースファイルが入っていませんでした。これが、落とし穴その1。

でも、データベースファイルが抜け落ちていれば、開発中に気付きそうなものです。ところが、iOSアプリの開発中は、デバイスにインストールするとき、すべてのファイルが置き換わるのではなく、更新されたファイルだけ上書きされます。なので、デバイスにある前のバージョンのデータベースファイルがそのまま使われてしまい、気付きませんでした。これが、落とし穴その2。

でも、みんなでテストすれば、誰がかが気付きそうなものです。ところが、この修正はほんとに軽微なもので、もうすでにみんな1.1の開発に没頭していたいので、テストを省略してしまいました。これが、落とし穴その3。結果的には、これが一番の問題でした。

こうして、新しく作られたビルドはデータベースファイルなしの欠陥品のまま、Appleの審査に提出されてしまいました。でも、Appleがレビューを行ってくれます。Appleのレビューチームにより、操作不能なアプリであればリジェクトされるはずです。いままでもいろんな理由でリジェクトされてきましたから。ところが、今回に限って、この操作不能アプリがスルッと審査を通過してしまいました。なんでや。これが、落とし穴その4。

でも、アプリがリリースされたらすぐ動作確認して、まずいと思ったら配信停止すれば、ユーザに被害が及ぶ前に止める事ができます。アプリのリリースは、審査終了後、自動的に公開するかマニュアルで公開するかを選択する事ができます。ところが、今回は一刻も早くリリースしたいと思って、自動公開にしてしまいました。これが、落とし穴その5。

ということで、いくつかのイレギュラーな事態と怠慢が重なって、操作不能なビルドがリリースされてしまいました。

続いて、リリース後の流れを追います。大辞泉1.0.1の審査通過したのが、5/26(日)の04:22。即時公開される。動作確認を行った弊社社員から緊急のSNSが送られてきたのが、05:48。飛び起きて事態を確認し、配信停止の処理を行ったのが、06:08。サポートページ、ブログ、Twitterなどで、1.0.1にアップデートしないよう告知。この時点で原因不明。事務所に移動して、開発環境およびリリースビルドを確認。こちらのミスだと分かって打ち拉がれたのが、07:30。修正して、テストを行って、1.0.2として再度審査提出、および緊急審査の要請(expedite review requestって呼ぶ)を行ったのが、08:30。その後、悶々とした針の筵の数日を過ごし、ようやく1.0.2が公開されたのが、5/29(水)。

初動があまり遅れなかったのと、日曜日の早朝という事が幸いして、広く出回る前に差し止める事はできました。それでも、2,000人以上の方がアップデートしてしまったようで、ほんとうに申し訳ないです。今後は、このようなことが発生しないように留意します。

とは言っても、究極の解決策という素敵なものは、ないと考えています。問題は常に起きます。ミスもどうしたって起きます。それが被害として出回らないように、弊社を含めて開発会社は幾重もの予防策を施しています。大部分は未遂で済みます。それでも、その隙間をすり抜けることは、絶対に起きます。すり抜けてしまったら、被害が広まらないように防ぎます。経緯を見直して、次回に役立てます。技術ってのは、その繰り返しです。それしかないです。しんどいですが、それしかないです。

大辞泉サポートページは、こちら
HMDT大辞泉Facebookページは、こちら

大辞泉1.0.2リリース!


大辞泉1.0.2がリリースされたよ!すべてのユーザの方におすすめのアップデートだ

まず、1.0.1で辞書の検索ができなかった不具合が修正された。1.0.1にアップデートしてしまったユーザの方々には、ご迷惑をおかけしました。

それに加えて、以下の修正が含まれている。

  • 本文検索のAND検索対応
  • 検索画面でのスクロール処理改善
  • 利用可能回数が回復しない事がある問題の修正
  • 『デジタル大辞泉』から追加コンテンツを引き継いだとき、ストアにおいて購入済みとする対応
  • 検索画面で長押しをしたときに操作できなくなることがある問題の修正
  • 他アプリからの検索連携に対応
  • 画面回転時にクラッシュすることがある問題の修正
  • 曖昧検索の改善
  • テキスト描画の改善
  • その他安定性の改善、動作速度の向上

こちらのページでも、詳しい内容が解説されているよ。

大辞泉サポートページは、こちら
HMDT大辞泉Facebookページは、こちら

大辞泉1.0.1にアップデートしないでください、追記:1.0.2の緊急申請中


5/26日8:30追記:App Storeの方に、1.0.2の緊急申請を行いました。アップデートはこちらをお待ちください。1.0.1にアップデートしてしまった方も、このバージョンで問題が解決します。

緊急のご連絡およびお願いです。本日、App Storeより大辞泉1.0.1が公開されましたが、これにアップロードするとすべての機能が使えなくなるという問題が確認されています。

すべてのユーザの方は、バージョンアップを行わないよう、お願いします。

原因は現在究明中です。

ご迷惑をかけて大変申し訳ありませんが、よろしくお願いします。

大辞泉、総合ランキングで2位まで来た!


大辞泉、iPad無料の総合ランキングで2位まで来た!

あと、1つ!でもAngry Birdかー。強そうだなー、くそう。

売り上げの方も、辞書カテゴリだと3位まで上がってきています。ガッツリ使いたい人は、ちゃんと課金して使ってくれています。ありがたいです。

大辞泉サポートページは、こちら
HMDT大辞泉Facebookページは、こちら

大辞泉のためのレンダリングエンジン、Sayori


先日、『大辞泉』のデザインは紙に近くなったって話をした。明朝、ゴシックなど様々なフォントを混在させて誌面を作っている。

これって、紙やWebのデザインやっている人にはごく当たり前のことだけど、プログラムを組む人にとっては悪夢のような仕様だ。iOSでは文字を描画する基本的な部品として、UILabelというクラスが用意されている。これ、基本は同一フォントしか描画しない。いちおう、iOS 6からフォント混在したリッチテキストも描画できるようになった。でもNSAttributedString使わないといけないんだよなぁ。あれ、めんどくさいんだよなぁ。そもそも、今回の仕様は、約物字詰めあるし、ルビあるし、なにより縦書きあるし。UILabelとNSAttributedStringじゃ力不足だ。

じゃ、HTMLか?たしかに、HTMLとCSSなら、きちんと記述する事はできる。ルビはrubyタグで。縦書きはCSSのwriting modeで。でもその表示を行うWeb Kitが、どうにもイマイチ。いやもちろん、Web KitはWebブラウザとして使うなら、なんの問題はないよ。でも今回は、リッチテキストを表示するためのラベル的な使い方をしたいんだ。それだと、重いし、内部に簡単にアクセスできないし。ひとことで言えば、too muchだ。自転車でちょっとコンビニ行きたいだけなのに、新幹線を持ってくるようなもんだ。

ならば作るしかない!無いものは作る、がエンジニアの思想だ。というわけで、自前のHTMLレンダリングエンジンを開発した。それが、Sayoriレンダリングエンジンだ。ちなみに名前は、うちの会社は伝統的にプロジェクト名に魚の名前を採用するため、こうなった。

Sayoriレンダリングエンジンでは、SYLabelというクラスを提供している。UILabelのように、画面に文字を描画するものだ。通常のテキストではなくて、HTMLとCSSを指定できる。こんな感じで使う。

SYLabel* label;
label = [[SYLabel alloc] init];
label.html = @"<html><body><h1>りんご</h1><p>バラ科の落葉高木。また、その果実。</p></body></html>";
label.css = @"h1 { font-size: 2em; font-weight: bold; } p { line-height: 1.5em; }";
[label sizeToFit];
[self.view addSubview:label];

どうよ?!便利でしょう。

UIWebViewと比較すると、軽量である事、同期的に動作する事が、差異になる。UIWebViewの非同期動作は、ブラウザとして使う分にはいいんだけど、ユーザインタフェース部品として使うときはやっかいだからね。

また、内部の構造にObjective-C APIでアクセスできるのも便利だ。UIWebViewだとJava Scriptしか手段がないから、もう面倒でしょうがない。

その他にも、ルビ、縦書き、縦中横、約物字詰め、均等割付け、リンク、テーブル表示、グリフID指定なんかにも対応。けっこう独自の拡張している。

とにかく軽量だし使いやすいんで、『大辞泉』のあらゆるところで使っているよ。

このエンジン、公開するのはやぶさかではないんだけど、サポートの手間が大変な事になりそうなので、躊躇中。

大辞泉サポートページは、こちら
HMDT大辞泉Facebookページは、こちら

大辞泉はフラットデザインか?


新しい『大辞泉』、あちらとかこちらとかで取り上げてもらって嬉しいけど、ソシャゲ風の課金の話が中心だよね、やっぱり。課金モデルは大きい話題だけど、それはアプリを使う上での入り口でしかない。『大辞泉』が『デジタル大辞泉』のバージョンアップではなく、まったく新しいアプリにしたのは、ユーザエクスペリエンスの分野でたくさんの変革を行ったからだ。そっちの方も、ポツポツと紹介してくね。

まずはデザインの話からいこうか。いま世の中では、iOS 7の登場を控えて、フラットデザインの話題がにぎやかだよね。iOS 7でフラットになるかどうかは噂でしかないけど、いままでのSkeuomorphismから変えてくるのはきっと確実だろう。

この、なんべん見てもスペルを覚えられない「Skeuomorphism」デザイン、現実世界をエミュレートしたデザインって意味らしいんだけど、いままでのiOSデザインの規範の1つであった。だから、『デジタル大辞泉』もそれを踏襲していた。特にiPad版ではその傾向が顕著。辞書の「本」としての形をそっくり模倣していたんだ。でも新しい『大辞泉』では、この路線はやめる事にした。

やめた理由は、トレンドとしてSkeuomorphismが衰退するということもあったけど、メインの理由は、どうしても複雑度が上がり拡張性が低くなってしまうから。たとえば、『デジタル大辞泉』のデザインでは、画面を切り替える「タブ」の機能を本の「爪」になぞらえたんだけど、これだとそのメタファーに引っ張られて数を増やすのが容易じゃないんだよね。だから、モダンなメニュー構造にした。

ただ、Skeuomorphismじゃないからフラットにしたのか?と言われると、それはちょっと違うかもしれない。確かに、結果としてフラットな感じにはなっている。でもこれは、別のデザインコンセプトによるものだ。それは、「脱テーブル」だ。

「テーブル」は、iOSのユーザインタフェースの中で最も基本的なものだ。あらゆるアプリで使われている。iOSアプリのデザインとは、テーブルをリッチに見せるものである、と言ってもいいかもしれない。『デジタル大辞泉』でも、検索された見出し語を表示するために使っていた。

新しい『大辞泉』では、見出し語と同時に語意も表示するという仕様にした。ということで、最初に考えたのはこんな感じのデザイン。

うーん、確かに語意も確認できるけどさ、なんかちっちゃいし、文字数も少ないから見づらいよな。じゃあ、もう少し行の高さを高くしてみるか。でもそれだと、語意が短いとスカスカになっちゃうし、一画面に表示できる量が減る。

ここで行の高さにしばられているのは、テーブルでは基本的にすべての行の高さが同じ、なのが前提になっているから。可変行高のテーブルも実現できるんだけど、パフォーマンスが著しく落ちる。辞書みたいに、1000行のテーブルが必要な場合は現実的ではない。

この段階で、テーブルを捨てることを決断した。そもそも、縦書きもやろうと考えていたんで、テーブルと相性が悪い事は分かっていた。どうにかしてごまかそうかと思っていたけど、決別した。

じゃあテーブルは使わないとして、もっと自由にデザインを考えたら、どんなのがいいだろう?他のアプリを参考にしたり、いろいろ検討したんだけど、最終的にたどり着いたのは、書籍の大辞泉の誌面だった。そう。紙の辞書の電子化を行っていたはずなのに、結局紙に帰ってきてしまった。

検索画面のデザインへの要求は、限られた画面領域に、見やすく多くの情報を詰め込むことだ。でも実はこれって、紙の辞書がずっと長い間やってきたことだった。その知見に敬意を払い、たくさん参考にさせてもらった。まず見出し語は太字のゴシック、表記は太字の明朝にする。改行せずに本文を続けて、太さはレギュラー。改行するときは、1文字分インデントする。字間も詰める。なるほど。見やすい。すげー見やすい。

この見た目を得ると、いままでのアプリ的なユーザインタフェースが野暮ったく見える。こんな見せ方をしていた時期もあったけど、やっぱやだよね、これ。

セパレータやディスクロージャが、邪魔に感じる。これらは項目が分かれている事を示すためにあるんだけど、タイポグラフィの力ですでにそれは実現されている。だから取っ払っちまえ。

できたー。うん?気付いてみたらフラットだな。ということで、脱テーブルの下あるべき姿を追い求めたら、結局フラットになっちゃった、てとこです。

大辞泉サポートページは、こちら
HMDT大辞泉Facebookページは、こちら

夢荘にてさんで、大辞泉紹介


夢荘にてさんで、新しい大辞泉を紹介していただきました。ありがとうございます。夢荘にてさんは、Mac時代からの老舗サイト。よく読んでいるサイトに紹介していただくと、嬉しいね。

大辞泉が使いやすく変身、そして回数制限付き無料、これまでのユーザーは回数制限解除

 最初の画面が検索になったのでスッキリ感が出たようです。これまでは紙を電子版に置き換えたようなゴチャゴチャしたスタート画面でした。やはり紙と電子版ではアプローチが違って良いはず。それに変身しました。それと、画像や動画も豊富、これも電子版のメリット。

そう。以前の『デジタル大辞泉』からは、大きくデザインコンセプトを変えた。いま流行の言い方をすれば、Skeuomorphismからフラットデザインへ、ってことになるかもしれないけど、ただのフラットじゃなくて、そこには色々と込められているものがある。それについては、また別のポストで。

大辞泉サポートページは、こちら
HMDT大辞泉Facebookページは、こちら

大辞泉1.0.1をApp Storeに申請


『大辞泉』アプリ、公開されて間もないんだけど、バージョン1.0.1をApp Storeに申請した。最初のバージョンである1.0申請後、すぐに1.0.1の開発にとりかかっていたからね。

1.0.1での修正項目は、以下の通り。

  • 本文検索のAND検索対応
  • 検索画面でのスクロール処理改善
  • 利用可能回数が回復しない事がある問題の修正
  • 『デジタル大辞泉』から追加コンテンツを引き継いだとき、ストアにおいて購入済みとする対応
  • 検索画面で長押しをしたときに操作できなくなることがある問題の修正
  • 他アプリからの検索連携に対応
  • 画面回転時にクラッシュすることがある問題の修正
  • 曖昧検索の改善
  • テキスト描画の改善
  • その他安定性の改善、動作速度の向上

いくつか補足しよう。「本文検索のAND検索対応」は、1.0では本文検索をするとき、2つ以上の語句を指定しても、ANDとしてしてされていなかった。それを、きちんと対応。たとえば、「ドイツ 詩人」を1.0と1.0.1で検索すると、次の通り。左が1.0、右が1.0.1ね。

「検索画面でのスクロール処理改善」は、スクロールにちょっともたつく感じがあったのを修正。これでキビキビと動くようになった。「利用可能回数が回復しない事がある問題の修正」は、文字通りの問題で、今回のアプリでは致命的な問題。修正しました。すいませんでした。

「他アプリからの検索連携に対応」は、どちらかというと開発者向けの機能。URLを使って、他のアプリから大辞泉で検索する事ができる。URLスキーマは、「hmdaijisen」だ。これに関しては、現在詳しいドキュメントを用意しているので、しばしお待ちを。

「曖昧検索の改善」は、棒引きに対する処理を改善した。たとえば、「iPhone(アイフォーン)」を検索するとき、1.0は「あいふぉおん」ではひっかからなかったのが、1.0.1では対応した。

その他、細かな修正や改善が含まれている。

審査にどのくらい時間かかるかは、これはもうApple任せなので分からないけど、5日から10日の間かなぁ。公開された暁には、アップデートをお願いします。

さぁて、1.1の開発にとりかかるぞ。

大辞泉サポートページは、こちら
HMDT大辞泉Facebookページは、こちら

『デジタル大辞泉』から追加コンテンツを引き継いだときの注意点


新しい『大辞泉』アプリは、その前身にあたる『デジタル大辞泉』から、各種引き継ぎを行える。まず、『デジタル大辞泉』を購入済みのユーザは、利用可能回数の制限無し!履歴とブックマークも引き継げる。そして、追加コンテンツである『大辞泉プラス』と『日本の歳事記』の購入履歴も引き継げる、んだけど、ちょっとそれについて注意を。

追加コンテンツの引き継ぎを行うと、『大辞泉』でそれらを利用できるようになる。確認するには、設定画面の「検索する辞書コンテンツ」の項目を確認してほしい。ここにあるスイッチボタンが使用可能なら、無事コンテンツが引き継げた、ということだ。

でも、ここで注意してほしい事がある。バージョン1.0では、購入履歴が無事引き継げても、ストア画面における追加コンテンツの項目は購入済みにならない。これは、App Store上では『大辞泉』と『デジタル大辞泉』は別物として扱われているからだ。したがって、ここで購入ボタンを押してしまうと、別途課金されてしまう。購入履歴の引き継ぎを行った方は、購入をしてしまわないように注意してほしい。

次のバージョンでは、購入履歴を引き継いだ場合でも、購入済みになるように変更を行います。

大辞泉サポートページは、こちら
HMDT大辞泉Facebookページは、こちら