大辞泉1.1申請中、および新機能紹介|手書き認識


大辞泉1.1、App Storeに申請したよ!審査は通常一週間くらいだけど、今回はWWDCを挟むので、遅くなるのではないかと予測。

で、1.1の新機能紹介なんだけど、いちばんの目玉は手書き認識機能の搭載だ。デジタル大辞泉にはついていたんだけど、ライセンスの関係などで搭載がちょっと遅れた。

手書き認識を使えば、読み方が分からない漢字でも手書きで入力する事ができる。たとえば、「鬱」という漢字の読み方が分からないとしても!

こうやって手書きで入力することができるぜ。え?手書きの方が大変だって?ごもっとも。

手書き認識機能は、ライセンスの関係上、追加アドオンとしての販売になる。デジタル大辞泉から移行してきた方は、例によって、無料で使う事ができるよ。

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

大辞泉1.1新機能|半透明語釈表示


大辞泉1.1の新機能を前倒しで紹介のコーナー。今日は、語釈の半透明表示。

付録にある「画像」では、いろんな画像をフルスクリーンで見る事ができて、かつ語釈をオーバーラップさせて表示する事ができる。このオーバラップされる語釈の背景が、黒の半透明になった。

ぐだぐだ説明するよりも、まずは見てくれ。

どうだい、かっこいいだろう!辞書というよりは、百科事典みたいだ。

これにより、画像を確認しながら語釈を読む事ができるよ。

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

WWDCアプリ公開


App StoreにてWWDCアプリ公開。

とりあえず落として入れてみたけど、当然のごとく、今の段階では非公開情報は出てこない。セッションの多くは、「Session to be Announced」でまだ告知されていない。

今回は例年よりもSession to be Announcedが多いような気がする。つまり、新フレームワークや新サービスが多く登場するということ。ソフトウェア開発者的に、今年は期待できそう。

しっかし、セッションの半分以上が非公開で人集めるカンファレンスって、ものすごいよな。いつも思うけど。

大辞泉1.1新機能|テキスト選択


大辞泉、1.1の申請準備中。今日はちょっと厳しそうだが、数日中には出せるはず。

1.1の新機能を少し紹介しよう。まずは、テキスト選択。ま、正直に言えば、新機能というよりは1.0で間に合わなかった残機能の実装といったところだ。

iOSの一般的な選択手法だ。長押しでルーペ表示。ドラッグで範囲選択。

選択したテキストに対しては、コピー、検索、アクティビティを開いて他辞書連携などができる。

もちろん、縦書きでもできるよ。

大辞泉って、WWDCも載ってんのね。すごいね。ちなみに、Google IOは載ってなかった。

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

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ページは、こちら