HMDT Blog | ページ 17

conferenceWithDevelopersで講演


conferenceWithDevelopersっていうカンファレンスが、今度の土曜日、2/23にあるんだけど。Webページによると、「conferenceWithDevelopersはiOS開発に携わる、すべての開発者に向けたカンファレンスイベントです。」ってことらしい。ちょっと漠然としてるよな。それはさておき、そこで1つセッションを担当します。

お題は『Dynamic Objective-C 2013』。Objective-Cをメインに話します。昔やってた連載『ダイナミックObjective-C』のノリでやろうかと。近年のObjective-Cに関する話題で、ランタイムよりの、比較的ディープな話をします。

23日の10:00スタート。場所は、六本木のGREEで。GREE行くの初めてだな。参加申し込みは、こちらから。まだ空席あるね。基本無料です。いや、課金もないと思うけど。

関係ないけど誰かがTwitterで、「タイトルの後ろにコロンがない」って言ってた。あぁなるほど、conferenceWithDevelopers:ってことね。引数は開発者の配列か。なら、completionブロックも付けたれ。ブロックの中身は懇親会ね。

音楽のある情景1.1公開、履歴とEvernote連携が追加


音楽再生履歴共有アプリ「音楽のある情景」、バージョン1.1が公開された。App Storeで無料で配信中。

1.1では、2つの新機能が追加されたよ。1つは、履歴機能。自分がiPhoneで再生した曲の、履歴を確認できるものだ。再生曲が、日付とともに確認できるよ。

そしてもう1つの機能は、この履歴をEvernoteにアップロードできるというもの。Evernoteに、自分の聴いた曲のリストを日々アップロードする事ができる。

実際にアップロードされたデータは、こんな感じ。

これで、ライフログ好きな人も使えるアプリになったね。

PDFでの、文字の位置取得


独自のPDFライブラリ実装は、テキストの抽出は、ほぼ完了。

最後まで残っていたのが、XObjectからのテキスト取り出し。PDFにはXObjectってのがあって、そこに別のPDFストリームを入れる事ができる。CGPDFでXObjectにアクセスすると、CGPDFStream型で取得できる。でも、こっからテキストを抽出するには、スキャンする必要があって、それにはCGPDFContentStream型が必要。どうすりゃ変換できるんだー、とうんうんうなった結果、CGPDFContentStreamWithStreamという関数があることを発見。これで万事解決。

ここまできてやっと、縦書きだろうが、ToUnicodeマップがあろうがなかろうが、テキスト取り出せるようになった。

次。次はテキストの位置。これが分かれば、検索してハイライトさせることができる。

ってことで、テキストの位置を上書きさせたのが上の図。文字毎に矩形で囲んでみた。なんとなくはできているな。後は、細かい問題を詰めていけばいい。

「音楽のある情景」バージョン1.1申請中


音楽再生履歴共有アプリ「音楽のある情景」、最初のバージョンアップである1.1を申請したよ。現在、審査待ち。

1.1では、2つの新機能を追加。1つは、履歴機能。これは、自分が聴いた曲の履歴を確認できる機能。

もう1つは、Evernote連携。先ほどの履歴を、Evernoteに投稿できる機能。1日ごとに集計するよ。これを使えば、自分がiPhoneで聴いた曲のリストを、Evernoteにどんどんアップして管理できるよ。

申請が通ったら、もう少し詳しく説明するね。

PDFの縦書き部分からテキスト抽出


最近続けているPDFの読み込み処理。縦書きPDFのテキスト抽出ができるようになってきた。

スクリーンショットは、縦書き表示があるPDFを読み込んで、PDF Kitと独自処理実装でテキスト抽出したもの。PDF Kitでは文字はとれるものの文章の体をなしていなけど、独自実装ではちゃんと文章になっている。

まだ問題はあるけど、まあ目処がついてきたかな。実装は、OS XとiOSに対応。

Map KitにPOI検索のためのMKLocalSearchが追加


Appleが、Map Kitを拡張してPOI (Point of Interest)を検索できるようにした、と発表。POIってのは、駅とか、飲食店とか、学校とかいった、地図上にある地形情報じゃないタイプのデータのこと。

APIが拡張されて、MKLocalSearch、MKLocalSearchRequest、MKLocalSearchResponseといったクラスが追加された。これを使うと、位置の領域や文字列を指定して、それに対応するMKMapItemを取得できるようだ。いままでも、CLGeocoderを使って似たような事ができていたけど、もっときちんとサポートされたらしい。iOS 6.1から使用可能。

この機能は、日本とロシアでは非サポートらしい。そりゃそうだよなー。マップのデータは、地形データはともかく、POIデータの無茶苦茶っぷりは酷すぎるからな。ものすごくAppleに好意的に考えれば、現在日本のPOIデータは絶賛改修中なのでもう少し待ってね、というメッセージ。普通に考えれば、日本のPOIデータもうどうにもならなかいから非サポート、放置する、というメッセージ。

iOS 6の地図の酷さについては、先日ちょっと検証をしてみた。日系ソフトウェアっていう雑誌があって、いまそこで連載をしているんだけど、それの次号(4月号)の記事にまとめるために。酷い酷いと言われていたけど、改めて調べてみたら、まぁーやっぱり酷かったね。興味のある方は、そちらを読んでみてください。

viewWillLayoutSubviewsが意図せず再帰呼び出し


UIViewControllerにviewWillLayoutSubviewsってメソッドがある。ビューコントローラが管理しているビューが再レイアウトされるときに呼び出されるもので、iOS 5から追加された。

このメソッドって、UIViewControllerが直接管理しているviewのframeが変更されたときだけ呼び出されると思っていたら、そのsubviewで再レイアウトが必要なときにも呼び出されちゃう事があるのね。しかも、すぐその場で。

デバッグ中にぶち当たった問題は、viewWillLayoutSubviewsの中でUIButtonの背景画像を変更したら、それがボタンの再レイアウトを誘発したらしく、その場で再びviewWillLayoutSubviewsが呼び出された。再帰的に。マジですかー。そんなもん、想像してなかったよ。

まぁ、なんべん呼び出されても大丈夫なようにはしてるんだけど、気持ち悪いよなー。

DropTalk HDがランキング1位獲得


昨日公開されたDropTalk HDですが、早速ランキング1位を獲得しました。イエィ!教育カテゴリの、トップセールスランキングで。iPad全体の有料ランキングでも、36位くらいまでいってた。

いやー、これは嬉しいです。このアプリは、エンタテイメントでもないし、万人向けでもない、特定の人たちに向けて開発されたものです。それがちゃんとランキングに顔を出してくるという事は、必要としている人たちがいて、その人たちに届いたんだ、と思っています。

プログラマやってて良かった、と思う瞬間ですな。

DropTalk HDが公開


dropletプロジェクトと共同で開発しました、VOCAアプリDropTalkのiPad版である、DropTalk HDがApp Storeで公開されました。

公開記念で、通常価格3,000円のところを、2,500円でセール中です。

長らくお待たせしてしまいましたが、機能的にはとてもいいものに仕上がったと自負しております。ユーザの方からのフィードバックがありますと、嬉しいです。

PDFとの格闘はToUnicodeへ


先日、PDFからテキスト抽出するためにCIDからUnicodeへのマップを作っている、と書いたら、「Fontディレクトリに含まれているToUnicodeを使うべし」というコメントをいただいた。

まったくもってその通りで、PDFの仕様書には、テキストを取得するにはToUnicodeを使えばいいよ、と書いてある。だけど、これは必須項目ではないので、巷にあふれているPDFファイルには、ToUnicodeが含まれているものもあれば、含まれていないものもある。というか、含まれているの見た事ねーよ!

と嘆いたら、「Appleの開発者向け日本語ドキュメントには含まれているよ」とのコメントが。早速確かめてみると、あったよ!これかー。なので、それをサンプルとしてToUnicode取得とストリームスキャンのためのコーディングをしている。

ちなみにこのPDFは、Creatorは不明。ToUnicodeが含まれていないPDFは、CreatorがAdobe Acrobatだったりする。Acrobat、貴様、ちゃんと入れとけよ。

CGPDFだと、Fontディレクトリから、ToUnicodeストリームを取得するところまでは、APIを使ってできる。でも、このストリーム(CGPDFStream型)からは、生データを取得できるのみでそれ以上のサポートはなし。あとは手作業で取っていくしかない。シクシク。ちなみに、PDFページのストリームを表すCGPDFContentStream型だと、もうちょっとサポートがあって、operatorのパースまでしてくれる。

でも、標準のAPIに機能が用意されてなくとも、その場ですぐにC言語にスイッチして低レベルのアクセスができるってのは、ほんっとに嬉しいし安心感がある。Objective-Cの最高の強みは、C言語をサブセットとして持っている事だね。スクリプト言語やマネージドコードとかいった輩は、どうにもならない檻の中だ。