Hatena::ブログ(Diary)

Over&Out その後 このページをアンテナに追加 RSSフィード Twitter

2013-12-31

2013年振り返り

今年は、仕事もない、海外に行きたいけどあてもない、というところから始まり、スペインに行って生活してみたり、シリコンバレーでの仕事にありつけたり、日本に戻ることになって奥さんの実家(福島)に居候することになったり・・・等々、今年は自分にとってエポックメイキングなことが多々あったので、自分にとって重要だったなーという出来事や行動を、時系列で振り返ってみます。


1月:無職になる。slideshareで営業活動

カヤックを辞めて無職になった最初の月。


「海外で働きたい」という理由で退職したものの、本当に何の当てもなかったので、とりあえず『ごはんとFlash』というイベントの有料LT枠を買って、プレゼンしました *1



「日本で受託開発の仕事をいただいて、それを海外に住みつつやる」という線も考慮しての営業活動です。当日のプレゼンではあまり反響がなかったのですが、slideshareにアップしてからバズリました。


あとはパスポートの更新やらなんやらの事務手続き関係と、書籍の執筆をしてました。


2月:スペインで生活してみる

この月の出来事といえば、なんといってもスペインはバルセロナに1ヶ月滞在してきたことです。


f:id:shu223:20131231102056j:image:w500

(1件目のアパートからの風景、2件目のアパートの内装)


観光もせず、ほぼアパートにこもってましたが、異国の空気を吸いながら普段通りの生活(制作活動)をする、というのは最高に贅沢で理想的な時間でした。


3月, 4月:執筆に邁進する

鎌倉は材木座のコワーキングスペース「Open Network Space」を個人で借りて、朝から晩まで(正確には晩から朝まで)ひたすら技術書の執筆にあたっていました *2


約370ページを執筆する作業は、書いても書いても終わりが見えず、偉い人たちからマサカリが飛んでくるんじゃないかとか、自分の書いた技術書をわざわざ2600円も出して買ってくれるもんなんだろうかとか、そもそも方向性はこれでいいんだろうかとか、いろいろな不安や気持ちのブレとひとり戦いつつ執筆と校正を続ける日々でした。


5月:書籍出版、セブ島語学留学、シリコンバレーへ

なんといっても初めての書籍の出版。

Amazonのレビューではなかなか厳しい評価もいただいているし、一理ありますが、やはり入門書ばかり多く出ている現状において、脱初級者〜中上級者向けに「こんなこともできるよ、あんなこともできるよ」という色々な引き出しを提示するという点では、本書は今も価値のある一冊だと思っています。


・・・ということを書き始めると、どんどん長くなったので、著書については下記記事に切り出しました。


そして著書と同じぐらいでかい出来事が、シリコンバレーのスタートアップ、AppSociallyにジョインしたこと。

f:id:shu223:20131231101139j:image:w500

(マウンテンビューでの通勤路。歩いてるだけで楽しかったです)


アメリカ行きが決まり、急遽1週間の短期語学留学に行ったりもしました。

明日から語学留学行きたいんですけど」といくつかの仲介会社に電話したら余裕で断られ、ダメ元で『支社つくってたらクビ』で有名な後輩ナツメグ氏に聞いてみたらセブで学校経営してる社長にネゴってくれて「明日からOKです」となって超頼もしかったです。


6月:本格的に渡米、ひたすら開発

いったん日本に帰り、鎌倉のアパートを引き払い、家具など諸々処分して、奥さんと一緒に改めて渡米。

f:id:shu223:20131231081309j:image:w500

(残ったのはトランクだけ、の図。最終日は段ボールベッド)


向こうではひたすら開発に邁進していました。


7月〜9月:アメリカ生活〜急遽帰国することに

半年分書いたところで既に長くなってしまったので、以降はざっと重要な出来事を列挙していきます。


DemoDay(7月)

数ヶ月にわたる500startupsのアクセラレータプログラムの総決算。

DemoDay in NewYorkにも同行し、はじめてニューヨークにも行きました。


f:id:shu223:20131231081123j:image:w500

(KickStarterオフィス。古いビルを改装してて超かっこよかった)


アメリカの大規模ハッカソンで入賞(9月)

24時間にわたってサンフランシスコにて開催されたハッカソン『TechCrunch Disrupt SF Hackathon 2013』に参加し、ぼっちで黙々と開発し、Mashery賞を受賞。

(はじめての英語プレゼン)


帰国、福島へ(9月)

プライベートな事情で帰国。しばらく帰らないつもりでアパートを引き払い家具も処分したので、奥さんの実家、福島へ。


iOS7 Sampler(9月)

iOS7が正式リリースされて数日後に、新しい機能がどういうものなのか、自分の勉強も兼ねてつくったもの。GitHubで1,829starがつく自分の中で一番のヒットリポジトリに。


10月〜12月:日本でのフワフワした日々

住所も、仕事内容も、何もかもが不透明で不確定な状態のまま過ごした日々。


福島⇔東京を往復する生活(10月〜11月)

AppSociallyの仕事を福島からリモートでやりつつ、せっかく日本に帰ったので、いろいろ勉強しようと、週末は都内の様々なワークショップやハッカソンに参加。ほぼ毎週新幹線に乗ってたので、交通費がやばかった。


「Qiita Hackathon」で、ベネッセのTangiblockを使ったアプリ開発を行い、優秀賞をいただきました。

(ワールドビジネスサテライトに10秒ぐらい出ました)


過去話をネタにいろいろ出る(11月)

話し方教室に通って臨んだ初めての講演。


発表スライドをslideshareにアップしたところ、

1000ブックマークを超える勢いでバズり、この勢いを逃すまいと、いろいろと自分の過去話を蔵出ししました。


個人名刺作成(11月)

敬愛するクリエイターであるねじさんに依頼し、iOS7対応の名刺を作成しました。


ひたすら勉強(12月)

1月〜11月まで色々新しい/画期的な出来事はたくさんあったけど、いちエンジニアとして、純粋な技術力の面の成長はどうだったかというと、やっぱり昨年までひたすらカヤックでアプリをつくりまくってたときの方が成長していたなという反省というか危機感みたいなものがあって、12月は「勉強する→ブログに書く」ということをひたすらやっていました。

f:id:shu223:20131231080957j:image:w500

(そのうちiBeaconなどいくつかは仕事に結びつきました)


いろんな人に会いに行く(12月)

一緒に仕事してみたいなぁ、という人に自分から会いに行って売り込む、ということをやっていました(現在進行形)。真鍋大度さんや、AR三兄弟の川田十夢さん等。ただ、まだあまり具体的な形にできてないので、まだまだ要努力です。


まとめと反省

こうして2013年はいろいろとあったわけですが、自分としては、今年はがんばったなーという満足感よりも、いままでコツコツと積み上げてきたものを今年いっぺんに放出してしまった、という感覚があります。とくに、技術的な面で今年は積み上げが少なかったなと。もっと平たく言うと、コードを書く時間が例年より少なかった。来年はそのへんを意識しつつ気を引き締めて地道に積み上げていこうと思います。


*1:このイベントの開始3時間ほど前に、「名刺がないと相手に連絡先を伝えられない!」と気付き、kinko'sの特急コースで名刺を作成して配布。この名刺はこの日以来配っていないレア名刺となっています。

*2:当時鎌倉の雪ノ下に住んでいたので、片道3kmを毎日徒歩で往復していたのですが、鎌倉の街は歩いてて心地いいので、この通勤時間も好きな時間でした。

2013-12-25

技術ブログで食えるのか?ブログ収益を整理してみました

「はてなエンジニアブロガー祭り」というイベントに登壇した際に、「ブログを続けてよかったことは何ですか?」という質問があって、

等々挙げてみたのですが、ふと頭をよぎったのが、ブログをやってて得られる「収益」(金銭とかモノとか)は実際のところどの程度あるのかなと。自分でも把握できてないので、整理してみました。


収益の大きい順に並べています。


前提となる数字

とりあえずいろいろな収益の前提となるであろう数字として、このブログのPVを紹介しておきます。


最近のPVはだいたい1ヶ月5万前後です。ヒット記事がある月で7万ぐらい。


1. Google Adsense

本ブログでは始めたばかりなのでまだ1ヶ月分のデータもありませんが、現在12/24までの収益データが出ていて、約xxxx円です *1。このペースだとだいたい今月はxxxx円ぐらいになりそう。


が、今月は更新頻度が高く、100ブックマーク以上の記事もあってこれなので、基本的には4000円/月あたりで落ち着くんじゃないかという気がしてます。


2. Amazonアフィリエイト

1ヶ月に1000円〜9000円。といっても9000円はピーク中のピークで、普通の月はだいたい2000円前後


つい最近書いて多くのブックマークがついた、

『上を目指すプログラマーのためのiPhoneアプリ開発テクニック iOS 7編』書評 - Over&Out その後

という記事の注文レポートをみてみると、12/24までのデータで、

  • ブックマーク数:114
  • 売れた数:21冊

です。書評記事をがんばって書いたとして、5ブックマークあたり1冊売れる、ぐらいの感覚でいるといいのかもしれません。1記事しかデータみてないので根拠なさすぎですが。ちなみに紹介料率は3%前後です。


3. Gumroad

今までに3記事だけ、サンプルコードをGumroadで販売するということをやってみました。


気になる結果は・・・


というわけでざっくり1ヶ月あたり350円ぐらいです。


ちなみにサンプルを販売してみた記事のうちのひとつ、『「顔以外」のものを画像認識する』は記事自体は好評をいただき、100ブックマーク、240ストックされましたが、サンプルが売れた数は通算で 1 です。


そんなに売れないのがわかってるし、僕自身いろいろなOSSに助けられてきているので、

  • 多くの人に必要とされそうなものはオープンソースとして公開
  • ニッチでほとんどの人に必要なさそうなものはGumroad(を検討)

と切り分けています。ただやっぱり申し訳ない感じがする/面倒なことになると面倒、という気がしてしまって、結果としては滅多にGumroad販売を選択することはありません。


4. リンクシェア

アプリのアフィリエイト。多い月で200円、少ない月で1桁なので、ざっくり平均すると1ヶ月あたり100円ぐらい。


サービス終了するらしいので今後は0になる見込み *2


5. Amazonウィッシュリスト

何回か記事の中に忍ばせたり、サイドバーの一番下に置いたりしてみたのですが、正直全くといっていいほど何も送られてきません。今までに1度だけ、1円の文庫本をいただいたことがあるだけ。


僕自身がウィッシュリストから人に送ったりしないし、応援したくなるような年齢でもないので、これは致し方ないと思っています。


6. JOB Board

このブログはつい1年前までは100%技術的な記事だけだったので、読者の100%がiOS開発者(僕の直観調べ)でした。


読者層がわかりやすく、しかも転職市場でニーズのある層なので、「もしかしたら人材募集広告をここに貼ってもらったらいいかも」と思い、ほんの一瞬だけ、サイドバーでこっそり広告を募集したことがありました *3


まずは無料で募集するも、1件も応募なし。自分の本分ではないので拡散もしなかったし、1週間ぐらいで募集告知文をサイドバーから消してひっそりと終了。


まとめ

結論:食えるほどの収益はない

というわけで、アフィリエイトとか、Gumroadでのソース販売とか、そういう目先の収益のために労力を割くのは得策ではないということが改めて確信できました。あくまで技術力の向上や、発信の一環としてやるべきだなと。


そんな「Over&Out その後」を今後ともよろしくお願いいたします。


*1:アドセンス規約を考慮して具体的な金額を伏せました。

*2:代替サービスに置換すると率がよくなるとかどこかで見た気がしますが、面倒なので放置か、iTunesStore直リンクに戻すと思います。

*3:JOB Boardというサービスがあるわけじゃなく、そう呼んでいるだけです。実際に応募があったら、手動でバナーおよびテキストを載せるつもりでした。

2013-12-24

12月に書いた全40記事のまとめと2014年の抱負

今月はたくさんブログを書いたので、ジャンル別にまとめます(まだ12/24なので、もし年内に記事書いたら追記します)。


人気記事(20ブックマーク以上)に☆マークを、

とくに人気でもないけど埋もれるには惜しい記事には★マークを付けました。


画像/動画/音声処理

  • no title
    • 車やペット等、「顔以外」のさまざまな対象を検出する方法。ストック数は200超。

  

  

120fps Slow-Motion video recorded using AVFoundation.


デバイス関連(iBeacon等)

  


openFrameworks関連

仕事でかじっておく必要があったので、勉強をドライブするために「openFrameworks Advent Calendar」を立ち上げて毎日のように書いてたので記事がたくさんあります *1

  

vimeoで見る

  

  • no title
  • no title
  • no title
    • openFrameworksとofxOpenCvを使って、 iPhoneのカメラ入力をリアルタイム解析し、動いている物体を検出する サンプルを作成する手順。

  

  


Max/MSP/Jitter関連

こっちも勉強する必要があって「Max/MSP/Jitter Advent Calendar」を立ち上げたけど、全然書けませんでした。


その他技術系


その他

  



おわりに

11月に受けたインタビューで、

いま考えているのは、単なる「iOSアプリをつくれる人」から、「iOSアプリ開発者、堤 修一」という "色" を付けていくこと。


たとえば、今年始め、前職を辞めたばかりのころに、まだ海外で働くためのつてもなかったので、「海外に行って日本の仕事をやる」という可能性も考慮して、とりあえず仕事を募集してみたことがあるんですね。


その際、たくさんお仕事のお話はいただいたんですけど、どの依頼も、根っこに求められているのは労働力と技術力だけで、そこに僕のパーソナリティのようなものは必要とされてないな、と感じたんです。もちろんそれだけでも十分ありがたい話なんですが、僕としてはもっと、「個」の立ったエンジニアでありたいなと。人間的な面でも、技術的な面でも。


そんなわけで最近は、人生初の講演をして自分のことを話してみたり、ちょっと変わった個人名刺をつくったり、iOSアプリとデバイスの連携をテーマにした連載を始めたり、といったことをしています。それと、NTTデータやキヤノン時代に携わっていた画像処理や音声処理も、自分の強みとしてもっと前面に出していきたいと考えていて、そのあたりも今いろいろと進めています。

ということを言っていたのですが、こういう意図があって、今月は強みにしていきたい分野の勉強をしてアウトプットする、ということを強化してました。


実際のところどれも基本をなぞっただけで、強みとしてアピールできるところまでは全然至ってないのが反省点ですが、いままではずっと「興味はあるけど何もしてない」状態だったので、とりあえずそういう方向に向けてスタートが切れたという点では今月はいい動きができたなと思っています。引き続き精進します。


(2013.12.25追記)来年の抱負的な話

早速、興味がある/強みにしていきたいことのひとつ、『iOS+デバイス』関連(iBeacon)が実際に仕事につながりました。


興味があることについて調べる

発信する

仕事につなげる

より詳しくなる/新たに興味が湧いたものについて調べる

→ 発信する

→ 仕事につなげる


というサイクルを回していって、興味があることだけやって食べていけないか、というのが2014年にやってみたい試みであり、(今のところの)抱負です *2


あと、技術的に興味があることだけじゃなく、「人」もそうで、個人名刺をねじさんに依頼した件のように、一緒に仕事してみたいなーという人に自分からアポを取って一緒に何かやったりやらなかったりする、というのも今後やってみたいことの一つ。


というわけで来年もよろしくお願いいたします。


*1:ひとりアドベントカレンダー、勉強にはすごくいいです。

*2:今までも限りなく楽しいと思えることだけやってきた感はありますが、来年はさらに身軽に、柔軟に動いていこうかと。

2013-12-23

iBeaconに関してAppleの公式ドキュメントに書かれていたこと

"Location and Maps Programming Guide" というCoreLocationとMapKitまわりのApple公式のプログラミングガイドがあり、そこにはiBeaconまわりの情報が詳細に載っているのですが、いつも更新が遅い(もしくは更新されない)印象がある日本語版にも早々にこの更新が反映されています。


位置情報とマッププログラミングガイド


「領域を退出(exit)するときにしばらく時間をおいてからデリゲートメソッドが呼ばれる」とか「境界を連続して横切った際に、iOS側で何度もイベントが発生しないように制御している」といったiBeaconを試した人がよく言及している挙動についてもちゃんとこのドキュメントに明記されていて、有用な情報が多いと感じました。


というわけで以下に「これは」と思った情報を抜粋します。


フレームワーク内で隠蔽されている挙動に関する情報

バックグラウンドでの挙動

アプリケーションが実行していないときに、ある領域の境界線を横切ると、アプリケーションはそのイベントを処理するためにバックグラウンドで起動されます。同様に、イベントが発生したときにアプリケーションが一時停止中の場合、アプリケーションは動作させられて、イベントを処理するために短い時間(約10秒)が割り当てられます。


境界線横断時の緩衝距離について

システムは、境界線に加え、システムで定義された緩衝距離を越えるまで境界線の横断を報告しません。緩衝距離は、ユーザが境界線付近を移動しているときに、システムが大量の進入・退出イベントを立て続けに生成するのを防ぐための値です。


領域通知の条件について

iOSシミュレータまたはデバイスで領域観測コードのテストを行う場合は、領域の境界線が横断されてもすぐには領域イベントが発生しないことがあることを理解しておいてください。不確かな通知が行われるのを避けるために、iOSでは一定のしきい値条件が満たされないと領域通知を行いません。

特に、ユーザの位置が領域の境界線を横断し、この境界線から最小距離だけ離れてから、この位置を少なくとも20秒間保持しないと、通知は報告されません。

この距離のしきい値は、ハードウェアと現在使用可能な位置情報テクノロジーとによって決められています。たとえば、Wi-Fiが無効になっている場合、領域観測の精度は大幅に低下します。しかしながら、テスト目的の場合は、最小距離は約200メートルであると仮定することができます。


実装のヒント

これらのデリゲートメソッド(注:`didEnterRegion:` と `didExitRegion:`)は、ユーザがビーコン領域に対して進入または退出を行うと必ずデフォルトで呼び出されますが、アプリケーションでこの動作をカスタマイズされることがあります。たとえば、ユーザがデバイスのディスプレイをオンにするまで、ユーザのビーコン領域への進入の通知を遅らせる場合があります。これを行うには、ビーコン領域の登録時に、ビーコン領域のnotifyEntryStateOnDisplayプロパティの値をYESに設定(そして領域のnotifyOnEntryプロパティをNOに設定)するだけです。ユーザに通知が何回も送信されるのを防止するには、領域への進入ごとに1回だけ位置に関する通知を配信するようにします。


このビーコンの配列(注:`locationManager:didRangeBeacons:inRegion:` の第2引数に入ってくる配列のこと)は、最も近くにあるビーコンが配列の先頭にあるように、デバイスからの距離によって整列されています。


ビーコンによる距離測定は、Bluetooth Low Energy無線ビーコンの検出に依存しているため、距離測定の結果は、ユーザがデバイスをどのように扱っているのかによって変わります。たとえば、デバイスがユーザのポケットやバッグの中にある場合やユーザがデバイス手の中で持っている場合、またビーコンと結ぶ直線距離の中に視界を遮るものがあるかどうかによって、距離測定の結果は変わってきます。アプリケーションによる距離測定の結果を一定に保つための方法の1つは、アプリケーションがフォアグラウンドある場合は、デバイスがユーザの手の中にある確率が高いため、アプリケーションがフォアグラウンドにある場合にのみビーコンとの距離測定を使用することです。


領域観測を利用したサービスに関する示唆

たとえば、特定のドライクリーニング店に近づいたら、アプリケーションでは、預けていてもう仕上がっている服を受け取るようにユーザに通知することができます。

passbookでクーポン配信、というユースケースは一番よく言われていますが、こういう場所に紐づいたアラートのようなユースケースもおもしろいと思いました。


あるデパートにおける顧客の体験を豊かにするための専用のアプリケーションでは、このデパートのすべてのチェーン店で同じ近接UUIDで観測を行いながら、各店舗をメジャー値とマイナー値によって区別するという使用方法があります。

ユーザがこのデパート位置にある入口の1つに近づくと、アプリケーションがそのことをユーザに通知します。さらにアプリケーションでは、異なるマイナー値を使用して同じ店舗内の別の売り場を区別することが可能で、位置に適したよりきめの細かい情報をユーザに提供できます。

UUID, Major, Minorをひとつのアプリケーションでどう使い分けるか、の一例としてわかりやすい。


関連記事

2013-12-22

「はてな エンジニアブロガー祭り」で登壇した際に話したことのまとめ

先日登壇させていただいた「はてな エンジニアブロガー祭り」ですが、多くの人が参加レポートをブログに書いてたので自分が書く必要はないなと思い、代わりに『「はてな エンジニアブロガー祭り」参加しましたエントリまとめ #エンジニアブロガー祭り - Over&Out その後』というエントリを書いたのですが、あまりにもリンクが多くなってしまって、全然登壇報告記事の代わりになってないので、改めてレポート記事の中からパネルディスカッションの自分の発言を抜粋してみます。


『はてな エンジニアブロガー祭り』に参加してきた #エンジニアブロガー祭り | Developers.IO」より

Q.ブログを書き始めたきっかけは?

自分のブログに書いたけど、技術ブログを始めた切っ掛けは技術者として自信を付ける、出来ればリーダー・マネジメントに行かずにエンジニアとしてやっていきたい。技術者界隈で存在感を発揮する為にまずはブログから初めてみようと、思い、いやいやながら始めました(笑)最初は乗り気では無かったw

技術的なことを書くと怖い人達がやってくるので、こっそり書こうと思った。内容が低いと上司にも言えないので、3ヶ月毎日書いたというのを認めてもらおう、その間は誰にも言わず。3ヶ月書いてから教えた。その間はなるべく知られないようにw

3ヶ月も書くと自信も出て来た。3ヶ月後で怖さはとれてきたが、自信はまだまだ。マサカリも飛んでこないしブクマもあんまだし。まぁそんなもんですね。

Q.ブログの書き方、どういう風に、いつ書いているのか?

どのへんで面倒になるか:今日とかだと折角登壇させて頂いたから書きたいけど、明日だと書かないだろうなwということでさっきある程度書きました。あとは写真など加えれば投稿出来るように。

iOS7など勝負記事を書くときは時間掛けるときもある。今日このタイミングで告知しないと!みたいな時は気合入れて書く。気合入れたけどイマイチ、な時も多々ある。勝率は6割程度。

気合を入れる記事は時間を掛けて、毎日書くようなものは空き時間で。お蔵入りになるようなものもある。オクラ入りの方が大半。

Q.前からブログを書いている方々の良さ、メリット

ブログを続けて良かったことについては...海外で働きたいというのもあった。知り合い居ないし特に宛ても無かったが、ブログで、カヤックを辞めたので、海外で働きたい旨を書いてたら海外で企業する日本人の方に連絡頂いた。エンジニアとして情報発信してきたおかげで初めてお会いする方にもブログ見てますと言われる事も多かった。ブログの存在意義はとても大きい。

Q.皆さん今まで書いた中で炎上したものは?

僕も無いです。開発に集中したいので発信する際は慎重に、友人に観てもらう等してチェックします。プログラミング素人の31歳が〜の際はチェックしてもらいましたね。

Q.はてな以外のサービスに移行しようかと思ったことは?

技術的なフットワークが悪くて、はてな以外のサービスを使おうと思ったこともあんまない。はてな記法は好き。はてぶも良いので気に入っている。デザインも凝る必要性がないのであんまり移る理由が無い。


はてな #エンジニアブロガー祭り に参加してきたよ - koogawa log」より

Q.ブログを始めたきっかけ
  • 最初は上司から言われて仕方なくブログを書いていた
  • 上司に認めてもらうため3ヶ月続けてみた
  • 最初は自身がなかったので、あまりSNSなどにはフィードしなかった(反応されたくなかった)
  • 3ヶ月続けることで自然と自信がついてきた
Q.ブログの書き方
  • 普段からメモを取ってフォルダに書きためている
  • そのままお蔵入りする記事も
  • 堤さんはディスカッション中もメモを取られているのが印象だった(koogawa感想)
Q.ブログを書いていてよかったこと
  • ブログ書いてることで執筆の話を頂いたり、いろいろな機会を頂いた
  • 自分の存在意義はブログにしか無い、と言っても過言ではない
Q.炎上したことはあるか?
  • 炎上しないようにとても注意をしている
  • ときには記事公開前に友人に見てもらうことも

2013-12-21

openFrameworksのofxOscアドオンでiOS/Macアプリ間連携を行うメモ

openFrameworks で OSC (Open Sound Control) を使うためのアドオン、ofxOsc を使用してアプリ間連携を行う方法のメモ。


送信側の実装

ホストアドレスとポートの定義

ローカルにあるアプリ同士連携させる場合はlocalhostでOK。

#define HOST "localhost"
#define PORT 12345

ネットワーク上にあるアプリ同士であれば、IPアドレスを指定する。

#define HOST "192.168.x.x"
#define PORT 8000
メンバ変数
ofxOscSender sender;
セットアップ
sender.setup( HOST, PORT );
メッセージ送信
ofxOscMessage m;
m.setAddress( "/mouse/button" );
m.addStringArg( "down" );
sender.sendMessage( m );

受信側の実装

ポートの定義

送信側の定義と合わせる

#define PORT 12345
メンバ変数
ofxOscReceiver receiver;
セットアップ
receiver.setup(PORT);
メッセージ受信
while(receiver.hasWaitingMessages()) {

    ofxOscMessage m;
    receiver.getNextMessage(&m);

    if(m.getAddress() == "/mouse/button"){
        mouseButtonState = m.getArgAsString(0);
    }
}

サンプルを試す

oFに付属しているサンプルを使用してみる。ごちゃごちゃ書いてるけど、要は Sender側にReceiver側のIPアドレスを定義するだけ。


Macアプリ同士

localhostでうまく通信できた。

iOSアプリ(Sender)、Macアプリ(Receiver)
  • Sender(iOS)側でMacのIPアドレスとポート8000指定
  • Receiver(Mac)側でポート8000指定

Macアプリ(Sender)、iOSアプリ(Receiver)
  • iOSデバイス(iPhone)の設定アプリから、 [Wi-Fi] -> iボタンタップでIPアドレス確認
  • Sender(Mac)側でiOSデバイスのIPアドレスとポート8000指定
  • Receiver(iOS)側でポート8000指定

iOSアプリ同士
  • Receiver側のiOSデバイス(iPhone)の設定アプリから、 [Wi-Fi] -> iボタンタップでIPアドレス確認
  • Sender(iOS)側でiOSデバイスのIPアドレスとポート8000指定
  • Receiver(iOS)側でポート8000指定

(oscSenderExample)


(oscReceiverExample)


2013-12-20

『上を目指すプログラマーのためのiPhoneアプリ開発テクニック iOS 7編』書評

加藤さんをはじめとする豪華執筆陣による名シリーズの最新刊です。


上を目指すプログラマーのためのiPhoneアプリ開発テクニック iOS 7編
加藤 寛人 西方 夏子 藤川 宏之 鈴木 晃 高丘 知央
インプレスジャパン
売り上げランキング: 1,885


このシリーズは毎回買っていて、iOS5プログラミングブックに関しては紙の書籍を持っていたにも関わらず、そのあと達人出版会で電子版が販売されているのを発見してさらに買い直した、というぐらいお世話になっています。


今回はありがたいことに @hkato193さんより献本いただきましたので、気合い入れてレビュー記事を書きたいと思います。


ちなみに本日より発売です。一部大型書店などでは昨日から並んでいるようです。


(隣に並んでいる達人のナントカという本も脱初級者〜中級者向けにオススメです)


# 余談ですが、紀伊国屋新宿本店ではiOS技術本の著者が自らPOPを書かせてくださいと名乗り出るというムーブメントが起きつつあります。


勉強になった項目

どこが参考になった、みたいな話は個人の興味とか今現在やってる仕事とかに依存するのであまり普遍性のない情報かもしれませんが、以下個人的に勉強になった項目です。

1-1. iOS7の概要

一見、「そのあたりは知ってるからもういいか」と読み飛ばしそうになるのですが、よく読むと、非常に細かいレベルで新機能が紹介されています。たとえば、『1-1-9 カメラと画像処理』のカスタムコンポジタの話や、現状できることとできないことの話、音楽データのアプリ間通信の話などなど。


また、OpenGL ES 3.0についても初めて知りました。現状ではA7プロセッサを搭載した iPhone5s / iPad Air / iPad mini retina の3機種でのみ利用可能とのことです *1


3-2. UIKit Dynamicsの応用

おもしろいけど使い道が。。」という声もチラホラ聞くUIKit Dynamicsですが、ここでは「UIKit Dynamicsを利用したCollection Viewレイアウト」や「UIKit Dynamicsを利用した画面遷移」といったUIのレイアウトや動きに物理演算を利用する事例が示されています。『Chaptor 02 画面遷移』の内容も関連するので、iOS7の新機能をまとめて学べて1粒で2度おいしいサンプルだなと思いました。


4-3. 高度なテキスト表現

気になった項目:

  • 非表示領域を設定することでテキストの回り込みを細かく調整する
    • 非表示領域に画像を埋め込める=画像に対する回り込みも細かく調整できる
  • マルチカラムレイアウト
  • テキストへのエフェクト

5-1-3. Background Fetchの実行タイミング

Fetch実行のタイミングはシステムに委ねられているので、実際にいつ実行されるか、というのはブラックボックスです。


この項では、実際に動作させてFetch実行トリガやFetchが実行されないケースなどが具体的に検証されており、非常に参考になります。


5-3. Multipeer Connectivity

Multipeer Connectivityはググればいくつか実装情報が見つかりますし、iOS7 Samplerにもサンプルが入っていますが、この本ではMultipeer Connectivityだけで27ページも割かれています。


この機能が入ることで従来のP2Pの役割を担っていたGameKitのGKSession等はDeprecatedになったという点でも重要な新機能だし、これだけの詳細情報は貴重かと思います。


6-3-6. SKCropNode

しばらくゲームをつくる予定がないのでSpriteKitはまるっと飛ばしそうになったのですが、この項の図を見てページをめくる手が止まりました。


マスク用画像の不透明領域の形状に応じてノードを切り抜いてくれるクラスのようです。もしかしてCoreGraphicsかUIKitにもこういう挙動をするクラスもしくは設定値があるんでしょうか?あとで調べてみようと思います。


7-2. Core Bluetooth

iOSデバイス同士のBLE通信の実装方法。iOS6までのAPIでの実装方法はサンプルや解説記事がありますが、本書ではiOS7の新しいAPIを用いる方法が示されているので、参考になります。


7-3-1. マップカメラ

iOS7 Samplerでは地図を3D表示するサンプルを示しましたが、この項では地図の3Dビューにおけるカメラを制御する方法が示されています。


A-1. 旧バージョンからの移行ポイント

iOS7でステータスバーを非表示にしたかったら Info.plist で [View controller-based status bar appearance] をNOにする、ぐらいの認識しかなくあまり深く考えたことがなかったのですが、「図8-3. ステータスバーの管理方法」という図を見て、なるほど、こういうロジックで各設定がステータスバーの表示/非表示を決定していたのか、と初めて知りました。


また「UIAlertViewへのサブビュー無効化」「バックグラウンドタスク持続時間の大幅短縮」もここで知りました。


A-2. 64bit対応 / A-3. Apple LLVMコンパイラとiOS7 SDK

まとまった情報ありがたいです。


とくにアーキテクチャやコンパイラ関連は(ドキュメント読んでもよくわからなかったりするので、)こうして日本語で平易に書いてくれると助かります。


全体的な感想

このシリーズはiOS7やiOS6と、iOSのバージョン番号がタイトルにつくので誤解されてる方も多い気がするのですが *2、現バージョンにだけ役立つ一過性の情報ではなく、他の書籍やwebでは得難い、ずっと役立つ貴重な詳細情報が得られるシリーズです。


たとえば、つい先日も『iOSの動画処理について学べる日本語書籍のまとめ』という記事を書きましたが、結局動画処理について入門から一歩踏み込んだ情報を扱っているのはこのシリーズの本ばかりでした。


このあたりは、執筆を陣頭されている加藤さんも記事に書かれています。


畑さんが陣頭だったiOS4本のときから、最新iOS SDKの優れた(&長く使える)機能を深く掘り下げて説明するのをポリシーに書いてきました。それぞれ白紙の状態から始め、その折々で内容を厳選しているので、シリーズで重複して説明している箇所はほとんどないのが特長です。

つまり、


「iOS5本を持っているからiOS6本は差分程度しか得るものはないでしょ」


なんてことや、


「iOS6本を買ったからiOS5本とかもういいや」


なんてことはないわけです、はい。


(中略)


ご覧のとおり、シリーズを通して様々な技術が、重複も少なく説明されているのが見て取れます。また、他書籍ではあまり紹介されていない技術(Collection Viewやプライバシー保護、Core Motion、ムービー編集、などなど)なんかもてんこ盛りになっていますね。iOS4本(図中)もiOS5本も、まだまだ役立つ情報がたくさんあることも分かります。

Untitled


というわけで、本書を含むシリーズ全部オススメです。


上を目指すプログラマーのためのiPhoneアプリ開発テクニック iOS 7編
加藤 寛人 西方 夏子 藤川 宏之 鈴木 晃 高丘 知央
インプレスジャパン
売り上げランキング: 1,885


iPhoneアプリ開発エキスパートガイド iOS 6対応
加藤 寛人 藤川 宏之 高丘 知央 西方 夏子 吉田 悠一 関川 雄介
インプレスジャパン
売り上げランキング: 16,950


iOS5プログラミングブック
インプレスジャパン (2012-08-23)
売り上げランキング: 25,214


iOS4プログラミングブック
畑 圭輔 加藤 寛人 坂本 一樹 藤川 宏之 高橋 啓治郎 沖田 知彦 柳澤 昇
インプレスジャパン
売り上げランキング: 85,081


関連記事


*1120fps動画撮影(SLO-MO)やM7等、こういう一部のデバイスだけで使える特別な機能は個人的にwktkしてしまいます。

*2:だからiOSxプログラミングブックという名前をやめたのかなと。覚えやすくて好きだったのですが。。

2013-12-19

iBeaconの実装に役立つ記事の逆引きリファレンス

iBeacon関連のAPIはそんなに多くなく複雑でもないので、実装の参考になる日本語記事はわりと出そろっている *1、という印象を個人的には持っています *2


というわけで、 こういうことをやりたいときはここを見ろ! という逆引きリファレンス的な切り口で 実装に役立つ日本語記事 を紹介していきたいと思います。


iBeaconに興味あるけど何から始めていいかわからない場合にはこの順番に見るといいよ、というオススメの順番にもなっています。


コードなしでとりあえず試してみる

AppStoreで普通にダウンロードできるアプリを使って、まずはiBeaconを体験してみましょう という記事。


アプリはEstimote製ですが、EstimoteのBeaconsを持っている必要はなく、iPhoneもしくはiPad2台を使って試せます。


自分で実装して動かしてみる

まずはこの記事のとおりに一通り実装して、


こちらの記事を参考に修正すると、2台のiPhoneを使用して、一方をビーコン(Peripheral)、もう一方を監視側(Central)として iBeacon の挙動を試すことができます。


ちなみにこのとおりに実装したものが、iOS7の新機能のサンプルコードを約20種詰め込んだオープンソースアプリ、 iOS7 Samplerに入っています。


バックグラウンドで動くようにする

Background ModesのLocation Updatesにチェックを入れましょう。


バックグラウンドにおける挙動の詳細な解説あり。


Estimote Beacons

Estimote SDK
Estimote SDKを使用せずBeaconsを検出する

どこかの誰かがどうにかして見つけたEstimoteのUUIDがのってるので、これを使うとEstimote SDKなしでBeaconsを検出できます。実際やってみるとあっさりうまくいきました。


現状Estimote SDKは単なる1:1のラッパーなので、このUUID使って標準SDKだけで実装するのは汎用的でいいかと思います。もちろん、今後Beaconsに既についている加速度センサや温度センサの情報にもアクセスできるようになるので、Estimote専用につくっていくのもありです。



MacとiBeacon

Macアプリのつくりはじめからの解説があります。


AndroidとiBeacon


位置推定

「フィンガープリンティング」という手法で、RSSIから位置(二次元座標)を推定する話。


その他実装情報

Appleのドキュメントに書かれていたiBeacon関連の有用な情報のまとめ。

とくにcocos2d向けに特殊な実装が必要なわけでもなさそうです。


(おまけ)実際に動かしてみての精度/挙動に関する言及

逆引きリファレンスというコンセプトからは外れますが、実装してみた方による挙動や精度に関する言及も集めてみました。

  • didExitRegion: メソッドについては、領域の外へ出てから約 35 秒程のタイムラグの後に呼び出されてしまいます。もちろんここで出している 35 秒という値は、あくまでも実験結果の値ですので、環境によっては全く別な結果になる可能性もあります。おそらく、境界部分をすぐに行ったり来たりした時に、毎回 didExitRegion: と didEnterRegion: を交互に呼ぶ必要もないという事を考えての仕様なのではないかと思います。
  • proximity が Unknown になった場所で 40 秒程待った時に、didExitRegion: は呼ばれるのかということを行いました。その結果 didExitRegion: が呼ばれることはありませんでした。これも実測値でしか無いのですが、出入りを監視する範囲と、proximity が Far から Unknown になる範囲はずれているのでは無いでしょうか。

NFCとかと比べると近距離での感度が悪い。特にproximityの値を判定した場合に、めちゃくちゃ近い距離なのに、3秒後ぐらいにやっとImmediateと判定されるレベル。これがiBeaconの仕様なのか、iOS7のCoreLocationAPIの制約なのか、EstimoteBeaconのハードのせいなのか不明。


*1:ちゃんとAPIリファレンスと付き合わせて確認したわけではありませんが。。

*2:なのでQiitaのアドベントカレンダーでは、斜め下に逃げるかたちでこんな記事を書きました。

2013-12-18

iOSの動画処理について学べる日本語書籍のまとめ

昨日『AV Foundationで120fpsスローモーション動画撮影を実装する』という記事を書いたのですが、動画まわりの処理もオーディオと同様、基本的なところから一歩踏み込もうとすると途端に難しく、web上の情報も少ないと感じました。


この辺りはこれから勉強していきたいので、まずは情報収集、ということで、関連する技術情報が載っている書籍を列挙してみました。


動画処理といっても、撮影、編集、エフェクト、エンコード/デコード(書き出し/読み出し)etc...と多岐にわたりますが、とにかくそのあたりに関するものは何でもOK、ただしMPMoviePlayerControllerを使った動画再生と、UIImagePickerControllerを使った動画撮影については対象外 *1 としました。


ちなみに動画処理の観点からのオススメ順にならんでおります。


なお、いずれも自分が購入済みのものです。今後購入したら追記するかもしれません。


iPhoneアプリ開発エキスパートガイド iOS 6対応

iPhoneアプリ開発エキスパートガイド iOS 6対応
加藤 寛人 藤川 宏之 高丘 知央 西方 夏子 吉田 悠一 関川 雄介
インプレスジャパン
売り上げランキング: 68,347


『7-1 AVFoundationを使った撮影』で、15ページにわたってAVFoundationを用いた動画撮影まわりの機能についての解説があります。


冒頭でまず、AVFoundationのキャプチャセッションについての図解入りのわかりやすい説明があり、これがかなり勉強になります。


以降はiOS6で強化された機能についての解説なのですが、動画まわりに関連する事項が多く、他の書籍にはないレア情報満載です。

  • 暗い場所での撮影
    • センサー感度のブースト(発刊当時はiPhone5のみ対応)
    • トーチの光量調整
  • AVFoundationによるリアルタイム顔認識
  • Core Imageによる顔のトラッキング
  • 手振れ補正

リアルタイム顔認識は、単にCoreImageでの顔認識処理が内部的に高速化されたので毎フレーム顔認識かけても大丈夫、という話かなと思ったのですが、そうではなくて、AVFoundationでの動画撮影処理において、AVCaptureMetadataOutputオブジェクトをセッションに追加しておくことで、顔検出の結果がメタデータとしてリアルタイムに得られる、というものでした。知らなかった!


iOS4プログラミングブック

iOS4プログラミングブック
畑 圭輔 加藤 寛人 坂本 一樹 藤川 宏之 高橋 啓治郎 沖田 知彦 柳澤 昇
インプレスジャパン
売り上げランキング: 32117


『3-3 ビデオの編集とエクスポート』で、AV Foundationを用いたビデオの編集とエクスポートの方法について31ページにわたって解説されています。


さっと挙げると、以下のような事項が解説されています。

  • 動画の結合
  • 動画のエクスポート
  • 動画に演出効果(フェードイン/フェードアウト/クロスフェード)を加える
    • ビデオトラックの半透明合成
    • オーディオトラックの音量調整
  • ビデオに画像や文字を合成する
    • CALayerとビデオを合成し、CoreAnimationから文字や画像を制御する、という話
    • Core Animationとの同期再生
    • 合成されたビデオのエクスポート

参考になる情報満載です。


また、さらに第4章『アセットを使ったフォト/ビデオへのアクセス』もiOSで動画処理するなら不可欠な解説です。


刊行からだいぶ時間も経っているし、何より"iOS4"と銘打たれてはいますが、上記のような内容について、iOS7向けに解説しなおしてくれている日本語書籍があるかというとたぶんないと思いますし、今Amazonのページを見てみると中古であればだいぶ安く買えるので、買いかと思います。


iOS5プログラミングブック

iOS5プログラミングブック
加藤 寛人 吉田 悠一 藤川 宏之 西方 夏子 関川 雄介 高丘 知央
インプレスジャパン
売り上げランキング: 88968


動画に関連するのは、『9-1 AssetsLibrary』のあたり。iOS4との違いを中心に詳細に解説されています。


iOS Core Frameworksテクニカルガイド

iOS Core Frameworksテクニカルガイド
Shawn Welch
インプレスジャパン
売り上げランキング: 242494


AVFoundationを使った動画撮影について載っていますが、基本的な事項のみです。


まとめ

列挙してみてびっくりしましたが、手元にあるiOS関連書籍33冊のうち、動画処理に関する情報が載っているのは上記の4冊しかありませんでした。なんと情報の偏っていることか。。*2


AVFoundationに特化した解説本か、動画まわりの処理に特化したレシピ本があれば細く長く売れそうな気がしますが、いかがでしょうか? > @hkato193 さん!!


関連記事


*1:APIとしてシンプルだし、ググればいくらでも出てくるので。。

*2:今回対象外にした、MPMoviePlayerControllerを使った動画再生とUIImagePickerControllerを使った動画撮影を扱っているものは結構ありました。そういう意味でもやっぱり偏ってる。

2013-12-17

AV Foundationで120fpsスローモーション動画撮影を実装する

iPhone5sだけのスペシャルな機能として、秒間120コマでの高速撮影 があり、標準カメラアプリではこれを利用した スローモーション動画撮影機能 が可能となっています。



これに類する機能をAVFoundationで実装できないかやってみたところ、うまくいったので、その方法を紹介します。


できたもの

サンプルアプリをGitHubにアップしております。



スクショ下部にあるように、 デフォルト / 60fps / 120fps を切り替えられるようになっています。


このアプリを使って撮ったものがこちら *1


120fps Slow-Motion video recorded using AVFoundation.


(中盤をスローモーションにしています *2。)


実装方法

わりと複雑な処理になったので、AVFoundation関連の処理を全部ラップしたクラスをつくりました。


そのラッパークラス『AVCaptureManager』を使うと、下記のように3行で実装できます。

1. 初期化
self.captureManager = [[AVCaptureManager alloc] initWithPreviewView:self.view];
2. 録画開始
[self.captureManager startRecording];
3. 録画停止
[self.captureManager stopRecording];

停止したときに撮影した動画を保存する、とかはデリゲートメソッドを使用します。そのあたりはサンプルをご参照ください。


また今はこのサンプルの用途しか考慮されてないAPIになっているのですが、これから動画処理とかは積極的にやっていくので、随時拡張していく所存です。


ラッパーを使わない実装

大部分はAVCapture〜で動画撮影する場合の一般的な処理で、120fps実装ならではのポイントは AVCaptureManager の次の部分に集約されています。

AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceFormat *selectedFormat = nil;
int32_t maxWidth = 0;
AVFrameRateRange *frameRateRange = nil;

for (AVCaptureDeviceFormat *format in [videoDevice formats]) {
    
    for (AVFrameRateRange *range in format.videoSupportedFrameRateRanges) {
        
        CMFormatDescriptionRef desc = format.formatDescription;
        CMVideoDimensions dimensions = CMVideoFormatDescriptionGetDimensions(desc);
        int32_t width = dimensions.width;

        if (range.minFrameRate <= desiredFPS && desiredFPS <= range.maxFrameRate && width >= maxWidth) {
            
            selectedFormat = format;
            frameRateRange = range;
            maxWidth = width;
        }
    }
}

if (selectedFormat) {
    
    if ([videoDevice lockForConfiguration:nil]) {
        
        NSLog(@"selected format:%@", selectedFormat);
        videoDevice.activeFormat = selectedFormat;
        videoDevice.activeVideoMinFrameDuration = CMTimeMake(1, (int32_t)desiredFPS);
        videoDevice.activeVideoMaxFrameDuration = CMTimeMake(1, (int32_t)desiredFPS);
        [videoDevice unlockForConfiguration];
    }
}

処理の内容としては、

  • AVCaptureDevice の formats プロパティから使用可能なフォーマットのリストを取得
  • その中から所望のfpsを満たすものを探索
    • 同じfpsなら幅がより大きい方をとる
  • 見つかれば AVCaptureDevice の activeFormat プロパティにセットする

ということを行っています。


Special Thanks!!

@hkato193 さんにTwitterで諸々教えていただきました。ありがとうございました!


上を目指すプログラマーのためのiPhoneアプリ開発テクニック iOS 7編
加藤 寛人 西方 夏子 藤川 宏之 鈴木 晃 高丘 知央
インプレスジャパン
売り上げランキング: 2,641


関連


AVFoundationを使うレシピは、下記書籍にもいくつか書いたのでもしよろしければ。


『iOSアプリ開発 達人のレシピ100』という本を書きました - Over&Out その後


*1:寒かったので外に出てすぐ目の前にあったこれを撮影しました。

*2:本当に120fpsなのかというのはわかりづらいかもしれませんが、Photoshopにimportして確認もしたので間違いないです。

2013-12-16

「はてな エンジニアブロガー祭り」参加しましたエントリまとめ #エンジニアブロガー祭り

12月14日(土)、品川にて開催された「はてな エンジニアブロガー祭り」というイベントの参加報告エントリのまとめです。 *1


「ブロガー祭り」と銘打たれているイベントだけにすごい量。。他にも「書いたよ!」という方がいらっしゃいましたら、 @shu223 までご一報ください!


その他

Togetter
登壇しました
登壇します
公式

*1:一応、追加時点でのブックマーク数順に並べてあります

2013-12-15

「登壇しました」エントリ下書きを公開してみる #エンジニアブロガー祭り

昨日、品川にて開催された「はてな エンジニアブロガー祭り」というイベントに、ゲストスピーカーとして登壇させていただきました。


「エンジニアブロガー」と銘打った祭りなので、ここはやはり「登壇しました」エントリを書いた方がいいだろう、ということで、


万全を期して、登壇前に既に記事の下書きを書き始めていました。


が、パネルディスカッション後すぐに懇親会が始まり、会が終わって帰宅して布団に直行したので、結局書かずじまい。起きたら 参加されたみなさまの詳細なレポート記事がたくさん上がっていた ので、もう書かなくていいかなーと。。


下書き

というわけで、会場で書いていた下書きをここで晒してみます。


「はてなエンジニアブロガー祭り」で登壇してきました

本日、品川にて開催された表題のイベントに、ゲストスピーカーとして参加してきました。

「ブログとエンジニアと私」というテーマで、モデレータである id:takahashim さんの仕切りのもと、 id:a666666 さん、 id:hyoshiok さん、 id:t-wada さんとパネルディスカッションさせていただきました。


(写真)


話したこと

(後ほど追記します)


話せなかったこと

(後ほど追記します)


所感

(後ほど追記します)


関連記事

- 基本的にめんどくさいブログの更新をどうやって続けてきたか。

-前に書いてたブログのダイジェスト版。

- ブログをコツコツ続けてた窓際エンジニアの話。


あんまり中身がないですが、こんな感じで下書きを用意してありました。


勉強会とかイベント参加記事は見てもらいやすいので、なるべく書くようにしてます。


で、懇親会のあとはほぼ間違いなく書けない&後日だと鮮度が自分的にも薄れて書かなくなってしまうので、だいたいイベント中に書いてしまうことが多いです。


「後ほど追記します」記法

上に載せた下書き、重要な部分が

(後ほど追記します)

ばかりでほとんど中身がないことにお気付きかと思います。


もちろん、あとで追記するつもりでこう書いてあるのですが、こういうイベント記事のように、「アップすべきタイミングに賞味期限がある」場合はこの状態のまま出してしまうこともあります。


お蔵入りにするよりは中途半端でも出した方がいいと思ってるので、僕はよく使います *1


まとめ

イベント参加記事は多くの人に見てもらいやすいから書いた方がいいけど後からだと面倒になるので自分はこんな感じで会場にいる間に書いてます、という話でした。


他の発表やLT、懇親会含め、「はてな エンジニアブロガー祭り」楽しかったです。運営スタッフの皆様、出演者の皆様、参加者の皆様、ありがとうございました!


#余談

参加者が86名とのことで、名刺をパンパンに詰めていったのですが、

(before)


結局、出演者同士で交換した以外では2枚しか捌けませんでした。。

(after)


精進します。


*1:イベント記事以外でこの「後ほど追記します記法」をよく使うのは、アドベントカレンダーとか、もう出かけないといけないときとか。

2013-12-14

openFrameworksを使わずにアドオンだけ使えないか検討してみる

PerfumeのモーションキャプチャデータをiOSアプリで動かす 際に使用したアドオン『ofxBvh』のソースを見てみると、

他のアドオンやライブラリにも依存してなくて、ソースも500行程度

と、意外とシンプルで、しかもあまりoFの機能に深く依存してないように見えました。


自分の場合、iOS SDK / Objective-C を母国語とすると、oF / C++ というのは外国語であって、「ObjCを覚えなくてもC++で書ける!」とかはメリットではないし、 oF はラッパーとして必ずしも質がいい実装ばかりではない ので、必要なアドオンだけ oF 抜きで使用 できれば、それに越したことはありません *1


というわけで、ofxBvhを例にとり、普通の(oFを使用しない) OpenGL プロジェクトで使うためにどの程度修正すればいいのか、検討してみます。


(※ no title 14日目の記事です)


ofXXXXの洗い出し

まずは ofxBvh.{h,cpp}に含まれている ofXXXX という型やクラスを洗い出してみます。

  • ofVec3f
  • ofMatrix4x4
  • ofQuaternion
  • ofToDataPath()
  • ofBufferFromFile()
  • ofGetFrameNum()
  • ofGetLastFrameTime()
  • ofSetColor()
  • ofCircle()
  • ofInRange()
  • ofToFloat()
  • ofSplitString()
  • ofToInt()

ofxBvh.{h,cpp} で定義されているものは除外しています。


それぞれの実装内容を確認

洗い出したクラスやメソッドの実装内容を確認・・・しようと思ってましたが、洗い出してみたクラス名やメソッド名を見ると、 よくあるユーティリティ的なクラスやメソッドばかり なので、何か 特別な専門知識を要する処理とかはなさそう です。


というわけで、ソースの確認はここでは省略。


結論

アドオンによっては可 かと。言い換えると、 oFに依存している部分を自分で書き換えるのに高度な専門知識や労力は必要なさそう です。


ofxBvh のように便利な(門外漢にとっては自分ではどう実装してよいかわからない)アドオンが、oFにとらわれず汎用的に使えるとなるとかなりありがたいです。


次の機会には実際にoF抜きのOpenGLプロジェクトで使ってみるところまでやってみようと思います。


*1:使わないでいいサードパーティ製ライブラリは使わない方がいい、というのはoFに限らず普遍的な話かと。

2013-12-13

PerfumeのモーションキャプチャデータをiOSアプリ内で動かしてみる

話題に遅れること1年半、例のPerfumeのモーションキャプチャデータを動かすことをやってみようと思います。


といっても、データと一緒に oF のサンプルアプリが既に公開されてるようなので、それを試しつつ、iOSで動くように改修しつつ、 どんな実装になってるのかざっと把握する という感じで見ていきます。


(完成品のスクショ)


ちなみに、no title の13日目の記事になります。


モーションキャプチャデータとサンプルをダウンロード

モーションキャプチャデータはこっちから、oFサンプルはここからダウンロードできます。


サンプルアプリのビルド

適当なサンプルプロジェクトを開いて、Base SDKをlatestに変更したのちビルドしてみると、'tr1/memory' file not found エラーが出る。


で、 [header search path] に

/usr/local/Cellar/boost/1.49.0/include

をrecursiveで追加してみると、さらにコアっぽいところからのエラーが大量に湧き出してくる。


何となくこっちに突っ込んでいくと時間を不毛に浪費してしまう気がしたので、方針変更、emptyExampleから自分でサンプルアプリを構築することにしました。


サンプルアプリをつくり直す

emptyExampleからのつくりなおす手順です。せっかくなので、iOS向けにつくります。


1. ofxBvhアドオンの導入
  • ofxBvhフォルダをaddons配下にコピーする
  • ofxBvhをプロジェクトのaddonsグループに追加する
  • ダウンロードしてきた3つのbvhファイルをプロジェクトに追加する

2. testApp.h
  • ofxBvhのヘッダをinclude
#include "ofxBvh.h"
  • メンバ変数追加
vector<ofxBvh> bvh;
ofEasyCam cam;
3. testApp.mm

もとのexample-bvhからコピーします。そんなに長くないので、すぐコピーできるはず。bvh[x].load("xxxx.bvh")のところだけ、ファイル名に合わせて変更します。

void testApp::setup(){	

    ofSetFrameRate(60);
    ofSetVerticalSync(true);
    
    ofBackground(0);
    
    bvh.resize(3);
    
    // setup bvh
    bvh[0].load("aachan.bvh");
    bvh[1].load("kashiyuka.bvh");
    bvh[2].load("nocchi.bvh");
    
    for (int i = 0; i < bvh.size(); i++)
    {
        bvh[i].play();
        bvh[i].setLoop(true);
    }
}

void testApp::update(){

    for (int i = 0; i < bvh.size(); i++)
    {
        bvh[i].update();
    }
}

void testApp::draw(){
	
    glEnable(GL_DEPTH_TEST);
    
    ofEnableBlendMode(OF_BLENDMODE_ALPHA);
    
    cam.begin();
    
    for (int i = 0; i < bvh.size(); i++)
    {
        bvh[i].draw();
    }
    
    cam.end();
}

完成品(動画)

vimeoで見る


実装してて知ったこと/気付いたことのメモ

BVHファイル

モーションキャプチャデータのフォーマットの一種らしい。

BVH ファイル形式とは,Biovision 社が提唱したモーションキャプチャデータファイルフォーマットです.現在,Alias Motion Builder をはじめ,3ds MAX の Character studio,Poser などの様々な商用3Dキャラクタアニメーションソフトでもサポートされています.BVH ファイルの特徴を以下にまとめます.


テキスト形式で記述

  • 座標系は右手系.XYZ 各軸の扱い(どの軸が鉛直方向に対応するか等)は任意.
  • 関節ノードに関する情報を記述.
  • 関節回転はオイラー角形式で記述.
  • 回転角度の単位は Degree
  • キャラクタのスケルトン階層構造を記述するHIERARCHY部と,動作データを記述するMOTION部の2つから構成

tmps.org -&nbspこのウェブサイトは販売用です! -&nbsptmps リソースおよび情報より)


ofBvh
  • loadメソッド内で呼んでいる ofToDataPath なるメソッドがとってくるパスをデバッガで追ってみると、MacOSだと ../../../data で、iOSだとバンドル直下だった
  • bvhを解釈して、再生するところまでこれでやってくれてるっぽい
  • 他のアドオンやライブラリにも依存してなくて、ソースも500行程度

ofEasyCam

初めて知ったのでどういうものなのか今度調べてみる。


参考記事



2013-12-12

シリアル通信クラス ofSerial のソースをのぞいてみる

なにやらハード/デバイスの世界では、外部連携するのにシリアル通信を用いることが多いようです。たとえば、Arduino がそうだし、ロボットアームとかもシリアル通信で動きのデータをリアルタイムにやり取りするものもあるらしいです。


シリアル通信が「シリアルにデータを送ること」とうのはわかるのですが、具体的に考え出すとモヤッとしてしまう部分があり、シリアル通信についてもうちょっと具体的な雰囲気をつかむべく、 最近勉強している openFrameworks ではシリアル通信がどう実装されているのか、ofSerial のソースをちょっと見てみました。


前述した通りシリアル通信のしくみとか規格とかをよく知らないので、あくまでざっとみて、気付いた点だけ。


(※ no title 12日目の記事です)


Linuxのシリアル通信ライブラリを使用

ヘッダで、termios.hってのをincludeしてる。

#include <termios.h>

ググってみると、『Linux標準のシリアル通信用Cライブラリ』とのこと。


read/write処理はシンプル

readByte のコードから、エラーチェックとか、win向けコードとかを省くと、以下のようにシンプルになる。

int ofSerial::readByte(){

    unsigned char tmpByte[1];
    memset(tmpByte, 0, 1);

    int nRead = read(fd, tmpByte, 1);

    return (int)(tmpByte[0]);
}

writeByte も似たようなもので、read/write 処理では特殊なことはしていない(termiosの関数を呼んだり、何らかの規格に準拠した処理を行ったりはしていない)。


setupでアレコレしている

長いので載せないが、 ofSerial::setup(string portName, int baud) のコードを見ると、ここで termios.h の関数を呼んでて、ハードや規格に準拠した処理もここで行われている。シリアルポートを開いたり、云々。


まとめ

oF のシリアル通信クラス ofSerial のソースを素人目でざっと見てみて、

  • termios という Linux 標準のシリアル通信用ライブラリを使用している
  • 規格とかハードにまつわるアレコレは setup メソッド内で行われている
  • read/writeは普通のバッファからの読み取り/書き込み処理

ということがわかりました。


ちなみに当然ながらこのクラスは oF の iOS 向けディストリビューションには含まれてなかったです。


2013-12-11

BLEデバイスと技適 〜EstimoteのBeaconsを使うと逮捕されるのか〜

という発表を、本日クックパッドさんのTips共有会 "potatotips" *1 の第2回でしてきました。



Tipsというか、 個人輸入したBLE対応デバイスの技適の取り扱いに関して、識者の方々に相談して得た情報 を共有してきた感じで、結論もまだモヤッとしております。


みなさまも法令遵守の上、楽しいBLEデバイスライフを!


*1:参加者全員が5分ずつTipsを発表する。Android/iOS開発者混合。

2013-12-09

ブログを三ヶ月毎日続けるためにやったこと

先週、タイムラインにこんな記事が流れてきました。



タイトルを見て、ちょうど僕が 初めての講演 をさせたいただいた内容の、「ブログを3ヶ月間毎日更新した」というところでちょうど一致してるので、分野は違えど同じような感覚なんだなぁと。




で、ありがたいことに上のスライドは約2週間で9万人近い人に見ていただき、それからというもの

  • 「あのスライドを見てブログをはじめた」
  • 「再開した」

というご報告をいただくことがしばしばあります。


まずは始めた/再開したというだけでも意義のあることだと思うのですが、「続ける」というのは、始めるのとは違った難しさがあるものなので、自分の場合は どうやって地道に技術ブログを続けることができたか というコツみたいなものを書いてみたいと思います。


# Blog #blogadvent Advent Calendar 2013 - Adventar 9日目の記事です。


ブログを書くために書かない

僕が続けてこれた最大にして唯一のコツはこれ(↑)になります。


「ブログを書く」というのは基本的に面倒 *1 なので、ブログを更新するために何かを書こうとするとなかなか続きません。


なので僕は、ブログを書こうと思っていたらもう書けていた となるようにしていました。


どういうことかというと、

  • 開発中に、調べるついでにメモをとる
  • → (気が向いたら)それをブログにアップする

というノリでやる、ということです。


具体例

たとえば、iOSアプリをつくっていて、さあ申請するぞとアップしようとしてみたら、なんかエラーが出たとします。エラーには、"An error occurred uploading to the iTunes Store" とか書いてあって、よくわからん、と。


そういう場合、ググりますよね。僕はググります。


で、ググる前に、テキストエディタでファイルを新規作成して、

#アップロード時に An error occurred uploading to the iTunes Store エラーが出た場合の対処方法

と、とりあえずタイトルだけ書いておきます。


で、"An error occurred uploading to the iTunes Store" でググる。


なるほどー、と思う情報があれば、URLをさっきのテキストファイルにコピーしておきます。

#アップロード時に An error occurred uploading to the iTunes Store エラーが出た場合の対処方法




で、有力情報があれば、それもコピペしておいたり。試してみたらその方法ではだめだったり。


そんな感じでできあがったメモ、アップしてみると、



これな感じで記事のできあがりです。


最初のころはがんばって書いたところでアクセスもないし、ツイートで知らせたりもしてなかったので、ほとんどの記事がこんな感じでした。スクリーンショットとかも面倒なのでほとんど貼らず。他者にはわかりにくいなーというところの説明も補充せず。ほんとに自分用メモをアップしただけという感じ。


それでも、続けていればコンテンツが増え、Google経由で誰かしらが訪れてくるようになり、記事も自然とこなれてきます(このあたりのブログを続けてよかった話は上のスライドに書きました)。


それでもめんどくさい

はい、それでもめんどくさいです。


でも毎日開発はするし、ちょっとややこしい調べ物をするときにはだいたいメモをとるので、僕のローカルフォルダには、数百のブログ記事化されることのなかったテキストファイル達が眠っています。


f:id:shu223:20140112235103j:image:w500


名前もちゃんとつけてない *2 ので、どれがどんな内容だかわかりませんし、一つ一つ確かめるには数も多いのでおそらく2度と振り返ることもありません。でも、ちゃんと名前をつけて管理しようと思ったらそれも面倒になってしまいそうなので、適当な名前つけて適当なフォルダに放り込んでます。


それぐらい、自分に負担をかけないという方針でやってきました *3 。基本的に業務でいっぱいいっぱいだし、ブログはあくまで副産物なので。


まとめ

技術ブログを続けるには、「さーブログ書くぞ!」と気負って書くと面倒になって書けないので、開発中にメモをとる、そのメモをアップする、ぐらいの感覚で更新すると続けられるかもしれません、という話でした!


*1:いろいろと心理的ハードルがある

*2:デフォルトの名前に、適当に数字を打ち込んで保存してます。

*3:最近は、読んでくれてる人も多くなってきたので、メモベースでアップするにしても以前よりもしっかりめに情報を入れることが多くなりました。

2013-12-08

達人出版会で買えるiOSアプリ開発関連の電子書籍一覧

達人出版会から出ているiOS関連書籍では、『iOS5プログラミングブック』と、『エキスパートObjective-Cプログラミング』を購入済み(どちらも超良書なので紙で持っててさらに電子版も購入)なのですが、改めてサイトを見てみるとかなりの数が出ています。達人出版会から出ているものだけじゃなく、インプレスやマイナビ等の他出版社からの委託販売もあるので、実に多様です。


個人的には技術書はスマホやタブレットだけじゃなくPCでも見たいので、汎用的なPDF版が買えるのは嬉しい限り。


というわけで、以下に『達人出版会で買えるiOSアプリ開発関連の電子書籍一覧』をジャンル別に載せていきます。


入門


Xcode 4ではじめるObjective-Cプログラミング 改訂第2版
大津 真
ラトルズ
発行日: 2013-08-05
対応フォーマット: PDF, EPUB


やさしくはじめるiPhoneアプリ開発の学校
森 巧尚
マイナビ
発行日: 2012-10-30
対応フォーマット: PDF


中上級者向け

iOS5プログラミングブック
加藤寛人, 吉田悠一, 藤川宏之, 西方夏子, 関川雄介, 高丘知央
インプレスジャパン
発行日: 2012-07-10
対応フォーマット: PDF



iOS SDK プログラミング・リファレンス【Foundation/UIKit編】
大森智史, 中野洋一
マイナビ
発行日: 2013-02-15
対応フォーマット: PDF


デザイン

フラットデザインの基本ルール
佐藤好彦
インプレスジャパン
発行日: 2013-11-26
対応フォーマット: PDF


その他

cocos2d-xによるiPhone/Androidアプリプログラミングガイド
清水 友晶
マイナビ
発行日: 2013-06-17
対応フォーマット: PDF


iPhone/Android 「通知機能」プログラミング徹底ガイド
神原健一, 高橋和秀, 山田暁通
マイナビ
発行日: 2013-12-07
対応フォーマット: PDF


facebookアプリケーション開発ガイド
株式会社鳥人間 郷田まり子
KADOKAWA/アスキー・メディアワークス
発行日: 2011-10-24
対応フォーマット: PDF


ヒットするiPhoneアプリの作り方・売り方・育て方
川畑 雄補, 丸山 弘詩
マイナビ
発行日: 2013-07-27
対応フォーマット: PDF


2013-12-06

【iOS7】AsyncImageView が arm64 でクラッシュする件

AsyncImageView を arm64 で動かすと EXC_BAD_ACCESS でクラッシュする件の対処法です。


結論から言うと、objc_msgSend をキャストするよう修正すればOKです。


たとえばこれを、

objc_msgSend(connection.target, connection.success, image, connection.URL);

こうします *1

((void(*)(id, SEL, id, id))objc_msgSend)(connection.target, connection.success, image, connection.URL);

情報ソース

objc_msgSend 関数の修正方法については、公式ドキュメントの『64ビット移行ガイド』で説明されています。

An exception to the casting rule described above is when you are calling the objc_msgSend function or any other similar functions in the Objective-C runtime that send messages. Although the prototype for the message functions has a variadic form, the method function that is called by the Objective-C runtime does not share the same prototype. The Objective-C runtime directly dispatches to the function that implements the method, so the calling conventions are mismatched, as described previously. Therefore you must cast the objc_msgSend function to a prototype that matches the method function being called.


Listing 2-14 shows the proper form for dispatching a message to an object using the low-level message functions. In this example, the doSomething: method takes a single parameter and does not have a variadic form. It casts the objc_msgSend function using the prototype of the method function. Note that a method function always takes an id variable and a selector as its first two parameters. After the objc_msgSend function is cast to a function pointer, the call is dispatched through that same function pointer.

Converting Your App to a 64-Bit Binary


その他

あとでプルリク送ってみようと思いますが、本家リポジトリはiOS7リリース後の更新はなく、マージしてくれないかもしれません。


ちょうど何日か前に、




こんなやり取りがあったのですが、やっぱり SDWebImage に乗り換えた方がいいかなと、今回の件で思いました。


メンテされてるかどうか、はOSSの善し悪しの判断基準としてトップに来ると思いますが、iOSの場合はとくに『メジャーアップデート後にメンテされているか』が重要かなと。


*1:これ以外に、何カ所かあります。引数の数に合わせてキャストの記述を変更してください。

2013-12-05

バイナリに arm64 アーキテクチャが含まれているかを確認する

xcrun コマンドを使用します。

$ xcrun lipo -info <path_for_binary>

たとえば AppSocially SDK について調べてみると、

$ xcrun lipo -info AppSocially.framework/Versions/A/AppSocially

下記のように、出力されました。

Architectures in the fat file: AppSocially are: armv7 armv7s i386 arm64 

armv7, armv7s, arm64 と、i386(シミュレータ用)のアーキテクチャに対応していることがわかります *1


lipo コマンドと、-info オプションについて

lipo とその -info オプションについて man コマンドで調べると

$ man lipo

下記のように説明されています。

lipo - create or operate on universal files
-info  Briefly list the architecture types in the input universal  file
         (just the names of each architecture).

lipo コマンドは ユニバーサルファイルを生成、操作する もの、 -info オプションは ユニバーサルファイルに含まれているアーキテクチャの種類のリストを出力する もの、とのことです。


参考記事

確認方法は下記記事を参考にしました。


また 32bit/64bit 同梱バイナリ生成にあたってのビルド設定については、下記記事を参考にしました。



*1:AppSociallySDKのarm64対応版は、12/5 AM11現在は未リリース

2013-12-04

Max/MSPの様々なGUIパーツ

button


クリックするとbangを出力する


dial


まわすと、その角度に応じた値を出力する


slider


スライダー


gain~


指数関数で値が増大するスライダー


kslider


クリックしたキーに応じた値が出力される

dropfile


オブジェクト内にファイルをドラッグ&ドロップすると、そのファイルの **フルパスのメッセージ** を出力する


panel


リファレンスによると "Colored background area". つまり入力によって見た目(色とか、角丸とか、影とか)を変えられる背景エリアとして用いるオブジェクト。


textedit


編集可能なテキストエリア。入力した文字列をメッセージとして出力する。


その他

Buttons, Interfaces, Sliders のカテゴリにあるものをざっと載せておきます。





画面見れば済むんですけど、こんなにあるよ、ということで。


2013-12-03

Max/MSPの便利な操作方法・ショートカット

こちらの記事でやったような、オブジェクトを置いたりつないだり編集したりといった、ごくごく初歩的な操作以外に、 開発してたら頻繁に必要になりそう な操作方法を調べてみました。


オブジェクトを揃える

揃えたいオブジェクトを選択 し、 cmd + Y


これが


こうなります。


参考:Karappo Interaction Lab. » #012 : パッチコードとかオブジェクトの位置を揃えるショートカット


リファレンス/ヘルプ参照

パッチをunlockしている状態で、オブジェクトを選択し、optionキーを押しながらクリック。


こんなのが出てくる。



パラメータのプリセット

presetオブジェクトを使用する。


参考:no title


プレゼンテーションモード

  • 選択したオブジェクトだけを画面上に残して、余計な部分は隠してしまう ことができる
  • パッチをunlockして編集している状態で、オブジェクトを選択し、[option] + クリックでメニューを表示して、その中から”Add to Presentation” を選択
  • 画面下のPresentation Modeボタンを押すと、登録したオブジェクト以外は表示されなくなる

参考:no title


その他のショートカット

Help -> Tips and Shortcuts で確認できる

  • プレゼンテーションモード
    • Option-command-E で Patching/プレゼンテーションモードが交互に切り替わる

2013-12-02

Max/MSPの入門レシピいろいろ

こちらでとりあえずインストールして音を出せたので、もう少しいろいろやってみます。


まずは こちらのページに載っているパッチを忠実に作成してみました。


音程を変化させる


これ、組むのは簡単でしたが、いちばん上のNumberオブジェクトの数値をどうやったら編集できるのかわからなくて困りました。


あれこれいじってみた結果、

  • プロジェクトを保存
  • 鍵アイコンをクリックしてロック
  • Numberクリックすると三角のとこが黄色くなる

この状態でキーボードから数値を入力できることがわかりました。


音量を変化させる

「*~」オブジェクトを使用します。



左の入力と右の入力のゲインをかけ算 するもので、乗算オブジェクトの ボックス内の数値は初期値 のようです(なので、右の値が0でも音は出る)。


2つの音を混ぜる

「+~」オブジェクトを使用します。



左の入力と右の入力を足し算、要は 和音 になります。


波形を表示する

scopeオブジェクトを使用。



溢れまくってますが、Inspectorからレンジの調整をしたりしないといけないっぽいです。


まだまだ『イントロダクション、Max/MSP Jitter入門』にはいろいろな入門者向けのパッチが載っていますが、基本的な操作方法と、オブジェクトの種類とはつかめてきたのでここらへんで。


2009 | 08 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2018 | 02 |