当初からワールドワイドに展開♪とかうそぶいていたのに、なにこのありさま?アメリカ向けにはバーコードスキャン機能禁止ってしないとならない?ちなみにRedLaserはこちらも100%認識してました。それでも、ちまちまとカイゼンカイゼンを勧めた結果、多少まともに洋書は読めるようになったけど、こんどは日本の本の認識率が下がりだした。あっちを立てればこっちがたたず。手詰まり状態で悶々とした日を数日過ごしたので、いっそのこととおもい、バーコード認識部、正確にいえば画像を取り込んでから2値化補正するまでの部分を、まったく新しい方法で実装し直すことにした。それまでは画面を10分割くらいして、ちまちまドットを数えていたのだが、この新しい方式は分割は3つ。ドットもちまちまカウントするのではなく、X軸の各位置(dot)をY軸方向に全部加算して得られた値からバーコードを内部的に再構成してから、それのドットを数えるようにした。これが大正解!!日本のバーコードもアメリカのバーコードもほぼ問題なく読めるようになった。稀に間違いがあるよう(経験則からいって1〜2%程度かな)だけど、それも再度バーコードスキャンしてみればちゃんと読める。希望の99%はほぼクリアされただろう。なにが良くなったかって、全体の計算量が減ったので、すごく反応がよくなったこと。レスポンスがいいので使っていてストレスがない。バーコードをちょっとかざすだけでサクっと読んでくれる。(もちろんオートフォーカスがちゃんと焦点をあわせていることが前提だが)RedLaserのバーコードスキャナと比べれば、もちろんまだまだ負けてるけど、負けすぎていない。いうことで、この新しい方法を正式に採用し古いバーコードスキャンルーチンは捨ててしまい、これをいれたものをビルドしてAppleにアプリ申請した。申請のreviewがいつから始まってどうなることか、まだ先のことはわからんけど、とりあえずiPhoneアプリ第一弾は提出できた。思いのほかバーコードの認識率がいいので、これを使った第2、第3のアプリの構想もはじめたので乞うご期待!というわけで、これが現在の本業なのです。この投稿へのリンクそしてバーコードの読み取り機能さて、最大の目玉機能であるバーコードスキャンの件。下調べはamazonアクセス実験なんかと並行して実施してたけど、amazon接続がうまく行くことを確認したので、本格的にバーコードの読み取り機能をつけていこうとした。下調べ中にわかったんだけど、iPhoneのバーコード読み取り機能ってアプリで販売されている。(RedLaser)しかも、このアプリは大ヒットらしく、TechCrunchにこの件について記事になっていたくらいだ。それから、このアプリの会社は、このバーコードスキャン機能を有償でライブラリ提供しているようで、会社のwebサイトにライセンス料金が書いてあった。$50最低$2,5005万本以上売ったら、そこからパーセンテージでライセンス料ね。$2,500はきびしーー。仕事がなくて貧乏になっているのに、ここで払える金なんぞありません!とはいえ、バーコード読み取り機能がついてないと、当初の構想の達成にはならないので、最悪、金を払ってでもライセンスを受ける覚悟だけ決めて、まずは自分でバーコードスキャン機能を作ってみることにした。バーコードとはどのようなもので、ISBNとはどのようなもので、ISBNとバーコードとはどんな風に絡んでいるのか?ってのをwebなどで調べて、それぞれの規格を把握。これをもとにバーコードの読み取りコードを書いていこうとしたのだけで、その前にiPhone固有の大問題が発覚した。SDKアプリケーション開発ガイド」にはiPhoneカメラのリアルタイムでの画像取り込み、処理の方法がまったく書いてない。カメラで写真やムービーを撮る方法はいくらでも解説がありサンプルコードが存在するのに、カメラ機能だけ有効にして写真をとらずに表示されているカメラの映像をプログラムに取り込む方法がまったくわからなかったのだ。これはバーコードスキャンするほうからすると致命的な問題。バーコードの写真をいちいち撮影した上でそれをアプリに読ませて認識されるなんてしたくないじゃない?バーコードにカメラをかざしたら「ピッ!」とかいって即でamazonに飛びたいじゃない?いやぁ、延々調べましたよ。セカイカメラやUStreamアプリ、それに上記のRedLaserもリアルタイムで画像処理してるんですよ。その公式APIが存在しない。まじで途方にくれました。その探しいる途中ですごくヒントになるwebの書き込みを見つけました。これですべてわかりましたよ。!カメラのリアルタイム画像を取り込むAPIはまったく存在しないのです。そんなものはもともとないんですよ!カメラの画像を取り込むのではなく、カメラが写したiPhone上の画像を連続でキャプチャすればいいわけだ。キャプチャもAPIがあるわけでもなく、いま現在iPhoneに写っている画像のビットマップメモリを直接参照(実際には一旦、別のCGImageにコピーしたものだけど)すればいいわけです。実はこの機能も非公開APIなのだけどUStreamが審査を通過してからはその利用が暗黙のうちにOKになったようで、おかげでセカイカメラやそれにつづくAR/VR/リアルタイムカメラエフェクトなアプリも軒並み審査を通過している。すごく合点がいきました。いっきに視界が晴れ上がった気がしました。その機能をつかってバーコードをキャプチャし、仕様書をもとにオリジナルで考えたアルゴリズムでバーコードデータをリアルタイムで2値化、補正してみることにした。画像のが上半分が実際にリアルタイムスキャンしているバーコード。その中段にあるのが2値化直後の画像。下段、タブバーの上にある細い白黒画像が実際にバーコードとして認識させようとして補正を加えたもので、非常に鮮明にバーコードが二値化された。これをバーコードの規格(JANコード)にそって読み出すと、ISBNコードを取得することができた。いま、世界はオレを中心に廻っている!」と、いつもの勘違いを味わっていました。その後に、まさかあんなことがおきようとは。ちなみに、このバーコードの読取コーディングをはじめてから実際にISBNが読めるようになるまで約2日くらい。この投稿へのリンク謎のamazonへのアクセス失敗さらに続くのだがwそうなってくると、目的はしっかりしたので、手段を決めて、ひとつづつ解決していけばいいわけです。ここまでくれば50%はできたも同然。amazonのAPI使ったことないのでその使い方の習得と、iPhoneでのバーコードスキャン機能。APIへのアクセス方法を調べて実際にやってみることに。これはそんなに難しくなかった。amazonはすでにAWSのEC2をつかっていたりするのでデベロッパとして登録済み。amazonサイトを漁って必要なドキュメントを読んだり、webで解説している人たちのサイトを参考にして自分でもAPIつかってamazonにアクセスしてみることにした。iPhoneのコードで書くと基本的なところでツマズいた時に原因の切り分けができない可能性あるので手馴れたPHPでwebサービスとして実験コードを書いてみた。資料もあるしPHPのコーディングは慣れているのであっという間に完成。EC2のサーバを借りているのでそこに設置して実験してみた。amazon.co.jpにISBNをItemの引数としてアクセスしてみると見事にamazonで表示される情報が引き出せた。これは楽勝!と、おもいきや、なんかうまく引き出せない場合もある。同じISBNなのに、うまくできるときとできないときがあり、原因がわからない。ちなみにamazon.comやamazon.co.ukへのアクセスではこのような状況は発生せず、毎回、すべてうまくアクセスできた。amazon.co.jpだけ、なんかダメみたい。webで同じ様な境遇が人がいないかと調べたけど、こんな症状はみつからないので、仮説をたてた。仮定1.amazon.co.jpのAPIリクエストを受けるサーバは複数台ある。(これは仮定ではなくて実際そうだとおもう)仮定2.そのサーバは地域もしくはIPアドレスでフィルタされる設定がされている。ルータとかでフィルタされているかもしれない。(実際、アクセスしてくるIPアドレスでブロックしていて、amazonからの接続を拒否されているwebサービスもあったらしい)仮定3.私が実験しているサーバのIPアドレスもしく地域(us東海岸)がそのフィルタにひっかかっている。IPアドレスはEC2から払い出しされたものなので可能性はある。仮定4.で、そのフィルタの設定はamzonのサーバ間で共有、統一されていない。それぞれでは発生しなかったため、amazon.co.jpだけの固有の問題だと思われる。ことでIPアドレスを変えればうまく行くだろう。他にグローバルIPアドレスは持っていないので実験はできないけど、これを問題にしている人が見つからないということから、非常に稀な現象であろうと。1つでも仮定が崩れれば問題なくアクセスできるであろう。こんなことでいつまでも時間とられれていても仕方なのでね。APIの使い方はわかったのでそれをもとにObjective-CでiPhoneに実装してみたところ、もちろん、アクセスに失敗することなどなく、すべてうまくいきました。仮説成立!めでたしめでたしwちなみに、この時点でISBNコードの手入力でブックレビューを表示するところまでは成功している。これ1月の中旬ごろのことだと記憶している。ここまでくれば機能的には70%はできたも同然状態でしょうか。最悪、バーコードスキャンのプログラムが失敗しても製品としては言い訳がたつくらいの機能はついています。本当にほしいのはISBNバーコードをサクっとスキャンしてレビュー表示する機能です。本題はこれからだっ!!!注)http://twitter.com/ohneta_/status/8064153065http://twitter.com/ohneta_/status/8064154887ここらへんで結論をtweetしてるけど、これはiPhoneで実際にamazon.co.jpにアクセスした結果をもとにして確証を得たあとの発言です。miniを購入してデベロッパ登録もした。仕事がなくて貧乏なのに年会費1万なにがしとか取られるんだよなぁ。それでMacの操作になれてみたり、ドキュメント読んだり、知人からいただいた本でiPhoneやcocoaフレームワークに慣れてみたり、、、。何を作るか決めてはいなかったのだけど、基本事項を習得していった。3GSをゲット!この日から本格的にiPhoneアプリ開発を開始です。SDKアプリケーション開発ガイド」は読んでおくべきだなと思い、和歌山県で最大の本屋さんに出向いて購入。いったついでにiPhone関連の本も何冊か仕入れておこうとおもって、いろいろ漁っていたのだけど、どの本がいいのかよくわからなかったので、その場で持参したiPhoneでamazonのブックレビューを読んで選んでいた。その時、ピンっ!ってきたのよ。実用書とかって実際どれがいいのかってわかんないじゃない?目的はわかっているのだけど手段がわからないから参考にしようとして本を買って読むのだけど、その本自身に書いてある手段がどれくらい参考になるのか、って自分じゃまだ理解できていない場合がほとんどでしょ?だからamazonのブックレビューとかとても参考になるし、参考にしてもらいたいとの思いで書く人もいるわけです。選択肢の本がいっぱいあると、そのブックレビューを見るためにamazonで検索するにも結構な労力が必要じゃない?と思ったわけです。iPhoneなんか画面小さいからさらに苦労が多いわけですよ。本にISBNついてるんだから、それ入力で即目的の本のブックレビュー読めたらうれしくね?ってのが最初の発想。実際、amazonの検索ワードにISBN入れれば一発で検索されるんだけど、ブックレビューだけ読みたいのだからamazonの他の情報は邪魔なわけです。専用アプリでサクっと表示できたらいいのになー。ISBNっていま出版されている本にはすべてバーコード印刷されている(ここ大事です!試験にでますよ!ww)のですよ。欲しくね?少なくとも、いまの俺はすごく欲しいぞ!!という連鎖反応がおきて、頭のなかでアプリの構想が決定してしまいました。これ思いついたときに、すんごく興奮していっしょに行っていた嫁さんに話たんだけど、反応はいまいちw。少なくとも俺は欲しいし、俺が欲しいと思うくらいだから、世界中で100人や200人くらいは欲しがるだろうと。ニッチすぎるかもしれないけど、でも欲しがる人はいるだろうと思い、嫁さん要望のマルチタイマーアプリは置いといて、自分の構想のアプリ開発を強行決定!(@自分の中で)したのでした。これ、去年の12月28日くらいの話です。tweetその後といまなにしてるの?いやぁ、最後にブログ書いてからすでに3ヶ月近く経ってしまった。盛大にバグってるまま公開放置してたから、もうだれも使ってくれてないようだ。実際自分でも使ってないし。その本業のほうなんだけど、いまさらながらiPhone/iPodのアプリ開発を始めたのです。去年の夏くらいから受注の仕事が全くなくなってしまって、収入の見通しがたたなくなってしまい、世の中不景気なので営業かけたところでそうそう受注仕事があるわけでもないし、現在住んでいる地域ではそんなもの壊滅的な状態。「こんな時こそ自分中心でできるものを作っておくべきだよな」とおもい、以前に作っていたwebサービスの展開を考えたり、現場復帰をちょっと希望している組み込み系マイコンやFPGAを触ってみたりとしていたのだけど、どうせやるならワールドワイドに展開したいの思いが強いので、今更ながらiPhone/iPodのアプリ開発をやってみることにした。3GSに機種変して実際に触ってみて面白かった。昔とった杵柄でMacの(Macで)プログラムを書くこと(といってもSystem8ぐらいまでだが)に抵抗はないし、NeXTだってちっとは触っていたので、どうにかなるでしょう。(11)お誕生日だった。AppStore/utilitiesの新着トップだ!で、つぎ。無事販売開始されたようです。(13)uruwaseeのこと?ohnetaこんにちは。