Hatena::ブログ(Diary)

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

2015-03-24

BLEと私

せっかく書籍を出すというありがたい機会にも恵まれたので、短いようで長い、BLEとの馴れ初めから書籍を出すまでの思い出を振り返ってみようと思います。



iOS×BLE Core Bluetoothプログラミング
堤 修一 松村 礼央
ソシム
売り上げランキング: 898


2013年・夏:Pebble をきっかけにスマホ連携ガジェットに興味を持つ

当時、シリコンバレーを拠点とするスタートアップ AppSocially で働いていました。


iOSアプリに友達招待機能を提供するSDKを開発していて、Facebook や Twitter 等のSNS連携が技術的な肝であり、Core Bluetoothや外部デバイスはまったく縁がなかったのですが、代表の高橋氏のところに届いたPebble *1 を見せてもらったのがそもそものきっかけだった気がします。



f:id:shu223:20150323140317j:image:w500



iOSのSDKも用意されていて自分でつくったアプリとも連携させられるというところにiOSエンジニアとして強烈に惹かれるものがあり、そこから「日本に戻ることになったらiOSと連携するガジェットを買い漁ろう」(当時アメリカでの住居はAirbnbを転々としていた&日本のアパートは引き払っていたので通販を利用しづらかった)という密かなワクワク感を抱き始めたのでした。


2013年9月:Arduino のワークショップに参加する → プチ挫折

諸々の事情で帰国することになり、まだリモートでAppSociallyの仕事はしていたものの、せっかく日本に帰ったので、週末は新幹線で都内まで出て行って(※福島の妻の実家に居候していた)ワークショップやハッカソンに参加するようにしていました。


で、自分で電子工作してガジェットつくれたら楽しいだろうなぁというのもあって、Arduinoのワークショップに参加したのですが、


f:id:shu223:20150323144716j:image:w400

記念すべき初のLチカ 2013.9.22


Lチカ *2 〜音声合成LSIを使ってしゃべらせる、というところを体験してみて、自分で好きなものをつくれるようになるまでの道のりは遠いということを痛感してしまったのでした。


2013年11月:iOS × 外部デバイスの連載を始める

自分でデバイスをつくるのは無理だ、という点はあきらめたものの、やはりガジェットまわりに興味はあったので、じゃあ「市販品で iOS SDK が用意されているもので楽しもう」ということで、自分の勉強をドライブするためにも、こういう連載を gihyo.jp の中の人の方に提案し、

無事企画が通り、連載開始となったのでした。


そしてこの連載の記念すべき第1回は konashi なのですが、本当にたまたまその掲載の前週、konashi を使ったワークショップに参加し、今回の共著者である松村礼央さんと初めてお会いしたのでした。(この時点ではまだBLEのビの字もわかってない


2013年12月:iBeacon の仕事が来る

Twitterでの繋がりで、iBeaconの仕事が舞い込んできました。



iOS+デバイス連携的なことに興味を持ち、連載を始めたりブログに書いてたりしてたのを知っていた MTL の @i2key さんからの絶妙のトスでした。ほんと何がやりたいとか書いとくといいことあると思いました。


これが後に火鍋レストランへのiBeacon導入につながっていきます。


2014年1月:BLEについて調べ始める

同じ頃、(NDAで書けないのですが、)とある新規ウェアラブルデバイス開発の相談がありました。で、「WiFiのようなインフラ無しで、ワイヤレスで通信したい」という要件に対して、じゃあ Core Bluetooth だろう、ってことで BLE について調べ始めたのでした。


これらの記事も今読むと相当やばい(誤解・間違いが多分にある)のですが、上原さんがやっている WF-BTLE グループに Bluetooth Low Energy と Bluetooth 4.0 を混同したトンチンカンな質問を投稿して丁寧にご回答いただいたのも確かこの頃です。


2014年2月:IRKit開発者の大塚さんからの叱咤激励

この頃、IRKitを出したばかりの大塚さんと飲む機会がありました。


そこで、「ハードウェア開発に興味あるけどハード側できないので、BLEに詳しくなってハードウェアプロジェクトでアプリ開発をやっていきたい」という話をしたら、最近のブログ記事の質が低い、というご指摘をいただいた流れからの)


「じゃあもっと勉強しないとね」(=まだそんなんじゃ通用しないよ)


というお言葉をいただき、もっと勉強しよう、と思ったのでした。


ちなみに本記事の趣旨からはそれますが、当ブログを始めるきっかけをくれたのも大塚さんです。


2014年3月:WHILLから仕事が来る

500startups時代に同期だった縁で、次世代パーソナルモビリティ「WHILL」からBLEを用いてWHILL本体と連携するiOSアプリ開発の話が舞い込みました。


(町田の開発拠点(当時)にて初めてWHILLに試乗。2014.4.5)


もともとWHILLというプロダクトもチームもすごくリスペクトしていて、しかも興味のあるBLE利用、ということで嬉しいオファーでした。最初のスカイプでCTO福岡さんが「CANが〜」と話し始めたときに「CAN????」となったのもいい思い出です。ウェブやアプリの開発現場とは何もかも違っていて、いろいろとカルチャーショックでした。


2014年4月:MoffのCTO米坂さんと会う

Qiitaのミートアップに参加した際、MoffのCTO米坂さんと初めてお会いし、Moffのアプリ開発のお仕事のお話をいただいたのでした。


当時Moffは、Kickstarterで目標の4倍となる金額を調達し話題をさらったばかりで、


f:id:shu223:20150323140032p:image:w600


それをFacebookのタイムラインでちょうど見かけたばかりで「おもしろいプロダクトだなぁ」と思っていた僕はもちろん飛びつきました。


2014年5月:書籍の執筆依頼

正確にはメールを頂いたのが4/28、初打ち合わせは5/1。僕の書いたブログ記事や連載記事を見て、フリーで編集者をされている大内さん(数々の技術書を出版されている)よりお声がけをいただきました。


一も二もなく飛びついた・・・というわけではなく、相当迷いました。


自分としては、「なぜ自分がBLEの本を書くのか?」というところにまだ答えを見いだせなかったからです。自分の知識の多くは上原さんをはじめ多くの方がWeb上に書いた記事やコードで勉強させてもらったわけだし、(ここまでの経緯をみるとよくわかると思いますが、)僕より詳しい人は大勢いるだろうし。


少なくともBLEの規格まわりについては自分は書けない、ということで大内さんが交渉してくれたのが共著者の松村礼央さんでした。


で、松村さんや大内さんとディスカッションを重ねるうち、

  • 「ペリフェラルとかキャラクタリスティックとか当初よくわからなかった」「BLE云々より、始めはただただガジェットいじりたかっただけ」というあたりの気持ちがよくわかる
  • 松村さんはkonashi、僕はWHILLやMoff等の実案件をこなしていて、そういう二人がタッグを組むのはいろいろと宿るものがありそう

というところで、自分がBLEの本を書く、ということがハラオチしてやっと原稿書き始めたのがなんと5ヶ月後(!)の10月。。(その節はご迷惑をおかけしました)


2015年3月23日:書籍出版

長くなってしまったのでここで一気に時間が飛びますが、その後いろいろなBLE絡みのお仕事があり、

2014年11月あたりから開発案件を少しおさえて、書籍執筆に専念しはじめました。



そして2015年3月、そんな汗と涙の詰まった書籍が、ついに発売となりました!



BLEを使ったiOSアプリ開発の解説書です。480ページの大ボリューム!BLEについてはゼロから学べるようになっています。また、「ハマりどころ逆引き辞典」は僕が実際に案件の中でハマって書き溜めたものなので、参考にするとかなりの時間短縮になると思います


というわけで「既にCore Bluetoothでアプリ開発をしている」方も、「ちょっと興味あるけどハードル高そうでまだ手を出してない」という方も、どうぞよろしくお願いいたします!


iOS×BLE Core Bluetoothプログラミング
堤 修一 松村 礼央
ソシム
売り上げランキング: 626



*1:彼は Kickstarter でbackしてたのでいち早く入手していた

*2:LEDを光らせる。電子工作界のHello World的なもの

2015-03-23

『iOS×BLE Core Bluetoothプログラミング』という本を書きました

konashi 開発者の松村礼央さんと、iOS エンジニアの堤の共著で執筆させていただいた技術書「iOS × BLE Core Bluetooth プログラミング」がついに本日発売となりました!


iOS×BLE Core Bluetoothプログラミング


企画当初の予定ページ数(230ページぐらい)を大きく越え、480ページの大ボリュームになりました。企画が決まってからだと足かけ1年、共著の松村さんも僕も編集の大内さんも(おそらくDTPさんやデザイナーさんも)徹夜しまくりでデスマーチの様相を呈しつつ仕上げた労作なので、ぜひみなさまにポチッと・・・お願いしたいところではありますが、ニッチなテーマですし、価格も少々高めではあるので、本記事の内容紹介をご一読いただき、ピンとくるものがあればぜひお求めいただけると幸いです。



iOS×BLE Core Bluetoothプログラミング
堤 修一 松村 礼央
ソシム
売り上げランキング: 898


【電子版】(PDF・達人出版会)

iOS×BLE Core Bluetoothプログラミング
堤 修一, 松村 礼央
ソシム
発行日: 2015-03-23
対応フォーマット: PDF


書籍の概要

タイトルの通り、BLEを利用したiOSアプリ開発の解説書です。


大きく分けて2つのパートにわかれていて、

  • 最初のパート、第1章から第3章は、konashiの開発者である松村礼央さんによる執筆で、BLEという通信規格そのものについての解説
  • 第2のパート、第4章から第12章は、(iOSエンジニアである)堤による執筆で、Core Bluetoothを中心に、BLEを用いたiOSアプリ開発の解説

となっています。



各章の詳細項目は後述するとして、iOSにおける実装方法の解説だけじゃなくて、BLEの規格そのものについての解説もしっかり書いてあるのが本書のポイントのひとつで、そのあたりを堤が生半可な知識で書いても有用性が低いだろうということで、フィジカルなレイヤーから熟知されている松村さんとタッグを組ませていただいた、という経緯があります。


特筆すべきは松村さんが書かれた「3. BLEを理解する」で、なんとこの章だけで約150ページ(!)もあります。Bluetooth SIGによるドキュメント "Core Specification" は英語で約2700ページもあり、とても読める気はしないので、iOSエンジニア向けに噛み砕いて解説してくれているこの章だけでも個人的には「買い」だと思っています。



その他の概要・特徴紹介代わりに、「まえがき」に書いた内容を載せてみます。(赤字等の一部装飾はこの記事用に編集したもの。書籍自体は1色刷りです。)


まえがき

「BLEって何?」という質問に答えようとすると

  • 2.4GHz帯の電波を用いた–––
  • 超低消費電力を特徴とし–––

などなど、色々と説明すべきことがあるのですが、筆者(堤)のようなアプリ開発者の視点から端的にいうと、 「スマホアプリと外部デバイスをワイヤレスでつなげられる通信方式」 ということになります。


BLEという通信規格自体への興味はさておき、「スマホアプリと外部デバイスを連携させる」という分野に興味のあるアプリエンジニアの方は結構多いのではないでしょうか。

筆者も例外ではなく、そもそもBLEとの馴れ初めを振り返ると、「BLE」自体は意識せず、ただただ「iOSアプリと外部デバイスを連携させて何かやるのって楽しそう」という動機でkonashiを購入したのが始まりでした。


その後、次世代パーソナルモビリティ「WHILL」、ウェアラブルなおもちゃ「Moff」など、さまざまな案件にiOSアプリエンジニアとして関わらせていただくうちにBLEに関する知識も深まっていき、こうして書籍まで執筆させていただいているわけですが、ずっとベースにあったのは「スマホアプリと外部デバイスと連携させるのは楽しい」これに尽きます。


私個人のそういった経験もあり、「楽しそう」「つくってみたい」から入って、だんだんBLEのしっかりした知識もつくように構成したのが本書です。


たとえば、私は当初「セントラル」「ペリフェラル」「キャラクタリスティック」「アドバタイズ」という専門用語を難しく感じた経験があったので、4章「Core Bluetooth 入門」の序盤では、「周辺のBLEデバイスを探索する」「接続する」といったようになるべく専門用語を使わず説明するようにしています。


また、最初は「周辺のBLEデバイスを探索したい」だけなのに、そこでオプションの解説まで含めてしまうと、イベントディスパッチ用のキューの話やサービスによる絞り込みを行うかどうか、その場合バックグラウンドではどういった挙動になるか・・・といきなり新しい事柄が一度にたくさん出てきてしまい混乱のもとになるので、各項では新しく学ぶ事項を必要最小限にとどめ、後からより詳細を知りたくなったときに関連ページに飛べるよう、各項に「関連項目」の欄を設けています。


本書では、こういった「楽しそう」「つくってみたい」という気持ちを削がないための工夫を随所にしています。



松村・堤という実際にBLEプロダクトを開発した執筆陣がその経験に基いて書いているので、実践的な内容になっているのも本書のポイントです。


たとえば、「10. 開発ツール・ユーティリティ」で紹介しているツール群は、どれも筆者が日々の開発で使用しているものですし、「11. ハマりどころ逆引き辞典」は、筆者が実際に開発現場においてハマって大量の時間を食いつぶした汗と涙が凝縮されています。また本書の随所で、リファレンスなどからは汲み取りづらい注意点やポイントについて触れています。


そして松村の執筆した3章「BLEを理解する」では、超濃厚なBLE仕様に関する解説が展開されています。実案件においてBLEの特色を活かしたプロダクト設計をする際に、あるいはアプリエンジニアがハードウェアエンジニアと意思疎通する際に、これらの知識が役立ちます。



筆者はBLEと出会い、アプリの開発の楽しみがiOSデバイスの制約を越えて一気に広がったような感覚を得ました。読者のみなさまも、ぜひ、本書を片手に、iOS ✕ BLE の広大な可能性を楽しんでいただければ幸いです。


対象読者

本書は、iOSアプリ開発には慣れていることを前提としています。


したがって、Objective-C や Swift の言語そのものについてや、Xcode の一般的な操作方法、Gitやターミナルの基本的な扱い等々については解説を省略しています。UIKit や NSFoundation といった iOS SDK の一般的なフレームワークについても前提知識として取り扱っています。


逆に、BLEについては、知識ゼロからでOKです。


「BLEって何?」「何が嬉しいの?」という状態から読み進められるよう配慮し、構成してあります。


ゼロから入れるようにしつつも、かなり詳細な内容までカバーしているので、本書の内容をマスターすれば、実際に新規ハードウェア開発プロジェクトにiOSエンジニアとして入り、活躍することも可能かと思います。


経験者向けの見どころ

ある程度 BLE および Core Bluetooth の経験がある人にとっても、BLEの規格自体について説明している3章(松村さん執筆)は相当学びがあると思われます。(#僕は新しく勉強になることだらけでした。。)


また僕が執筆したiOSプログラミングのパートにも、何か新しい発見はあるかもしれません。「ペリフェラルへの再接続」「状態の保存と復元」など、Core Bluetooth では「知らなくても大抵の実装ケースにおいて問題ないが、知らないと損」なことが多くありますし、「Service Changed」サービスへの対応方法等、ググってもあまり具体的な実装方法が出てこない(2015年3月堤調べ)事項についても書いてあります。


実案件でBLEさわりはじめてるけどまだあまり自信がない、という方には11章「ハマりどころ逆引き辞典」が役立つと思います。実際に堤が数々の実案件でハマりつつ書き溜めてきた内容なので、かなりの時間短縮になるのでは、と思っています。


各章の概要と目次:Part1. BLE編

ここから具体的な目次を紹介していきます。各引用テキストは章扉にあるものです。


Part 1 は、松村さんによる「BLEという通信規格そのもの」についての解説です。iOS云々は抜きにして、まずBLEってなんぞや?というところを知るためのパートです。


1. はじめに

BLE(Bluetooth Low Enery)は、

従来のBluetoothとはどう異なるのでしょうか?

本章ではBLEのイメージをざっくりつかんでいきます。

  • 1-1. BLEとは何か

2. BLEをとりあえず体験する

BLEを使ったiPhoneとデバイスの通信を体験してみましょう。

本章ではツールキット「konashi」を使って、

まず用意されたアプリからkonashiを操作してみましょう。

後半では、konashi SDKを使って、自作アプリも作ってみます。

  • 2-1. konashiでBLEを体験する
  • 2-2. 初級編:konashiをとりあえず体験する
  • 2-3. 中級編:konashiをiOS-SDKを利用して制御する

3. BLEを理解する

本章では、BLEの規格をわかりやすく解説していきます。

iOSデベロッパーとしてどう仕様を読み解けばいいかも随所に明記していますので、

実装に役立てることができます。

  • 3-1. BLEの概要
  • 3-2. BLEの構造
    • 3-2-1. BLEのプロトコルスタック(アーキテクチャ)
    • 3-2-2. ATT(Attribute Protocol)
    • 3-2-3. GAP(Generic Access Profile)
    • 3-2-4. GATT(Generic Attribute Profile)
  • 3-3. BLEのネットワークトポロジー
    • 3-3-1. ブロードキャスト型トポロジー
    • 3-3-2. 接続型トポロジー
  • 3-4. BLEでのネットワークと通信の制御
    • 3-4-1. Bluetoothの無線仕様とPHY層(LE Physical)
    • 3-4-2. LL 層(Link Layer)
    • 3-4-3. LL 層における注意点
    • 3-4-4. Bluetooth Device Address
    • 3-4-5. AdvertisingとScanning
    • 3-4-6. Connection
  • 3-5. L2CAP(Logical Link Control and Adaption Protocol)によるパケットの制御
    • 3-5-1. L2CAP層(Logical Link Control and Adaption Protocol)
  • 3-6. BLEのパケットフォーマット
    • 3-6-1. Basic Packet Format
    • 3-6-2. Advertising Channel PDU
    • 3-6-3. Advertising PDU
    • 3-6-4. Scanning PDU
    • 3-6-5. Initiating PDU
    • 3-6-6. Data Channel PDU
    • 3-6-7. CRC(Cyclic Redundancy Check)
    • 3-6-8. L2CAP層でのパケットフォーマット
  • 3-7. LL層における通信のやり取り
    • 3-7-1. Bluetooth Device Addressによるフィルタリング
    • 3-7-2. Advertising Channelにおける通信
    • 3-7-3. Data Channelにおける通信
  • 3-8. GAP(Generic Access Profile)の詳細を知る
    • 3-8-1. GAPとは何か
    • 3-8-2. GAPによる「役割」の管理
    • 3-8-3. ModeとProcedure
    • 3-8-4. GAPによる「動作」の管理
    • 3-8-5. GAPによる「セキュリティ」の管理
  • 3-9. ATT(Attribute Protocol)とGATT(Generic Attribute Profile)の詳細を知る
    • 3-9-1. ATTとは何か
    • 3-9-2. Attribute の構造
    • 3-9-3. ATTサーバ/クライアントの対応するメソッドとPDU
  • 3-10. GATTとService
    • 3-10-1. Service の構造
    • 3-10-2. Characteristic の定義
    • 3-10-3. GATTによるService Changed、Characteristic
    • 3-10-4. GAPによるService、Characteristic
    • 3-10-5. GATT プロファイルのAttribute Type の一覧
    • 3-10-6. GATT プロファイルで利用できる機能
  • 3-11. iOSエンジニアのBLEあんちょこ
    • 3-11-1. Bluetooth Accessory Design Guidelines for Apple Products
    • 3-11.2. BLEはなぜ低消費電力なのか
    • 3-11.3. Core Bluetoothにおける20octet が何を示すのか

各章の概要と目次:Part2. iOSプログラミング編

Part 2 は、(iOSエンジニアである)堤による「BLEを用いたiOSアプリ開発」の解説パートです。


4. Core Bluetooth入門

本章から「iOSプログラミング編」として、Core Bluetoothの実装方法を解説していきます。

本章では、はじめの一歩目として、周辺のBLEデバイスを探索し、発見したデバイスに接続する、

そして接続したデバイスとデータのやりとりを行う、というBLEの通信の一連の流れを、

基本事項だけに絞って解説します。

  • 4-1. 周辺のBLEデバイスを検索する
  • 4-2. BLEデバイスに接続する
  • 4-3. 接続したBLEデバイスのサービス・キャラクタリスティックを検索する
  • 4-4. 接続したBLEデバイスからデータを読み出す(Read)
  • 4-5. 接続したBLEデバイスへデータを書き込む(Write)
  • 4-6. 接続したBLEデバイスからデータの更新通知を受け取る(Notify)

5. ペリフェラルの実装

前章「Core Bluetooth入門」では、スキャン、接続、データのやり取りなど、

セントラルとしてふるまうアプリの基本的な項目について解説しました。

本章では、ペリフェラルとしてふるまうアプリの実装方法、

すなわちiOSデバイスをペリフェラルとする方法について解説します。

  • 5-1. セントラルから発見されるようにする(アドバタイズの開始)
  • 5-2. サービスを追加する
  • 5-3. サービスをアドバタイズする
  • 5-4. セントラルからのReadリクエストに応答する
  • 5-5. セントラルからのWriteリクエストに応答する
  • 5-6. セントラルへデータの更新を通知する(Notify)

6. 電力消費量、パフォーマンスの改善

本章では、Apple の「Core Bluetooth プログラミングガイド」の

「ベストプラクティス」について書かれているパートをベースにしつつ、

関連事項や注意点などを加えながら、

「低消費電力」「パフォーマンス向上」につながる実装方法を解説していきます。

  • 6-1. スキャンの最適化
    • 6-1-1. スキャンを明示的に停止する
    • 6-1-2. 特定のサービスを指定してスキャンする
    • 6-1-3. できるだけスキャンの検出イベントをまとめる
  • 6-2. ペリフェラルとの通信の最適化
    • 6-2-1. 必要なサービスのみ探索する
    • 6-2-2. 必要なキャラクタリスティックのみ探索する
  • 6-3. ペリフェラルとの接続の最適化
    • 6-3-1. 接続の必要がなくなり次第すぐに切断する/ペンディングされている接続要求をキャンセルする
    • 6-3-2. ペリフェラルに再接続する
  • 6-4. イベントディスパッチ用のキューを変更する(セントラル)
  • 6-5. アドバタイズの最適化
  • 6-6. イベントディスパッチ用のキューを変更する(ペリフェラル)

7. バックグラウンド実行モード

本章では、Core Bluetoothで実装したBLEの機能をバックグラウンドで動作させる方法と、

バックグラウンドにおける制約(できること/できないこと)について解説します。

また「状態の保存と復元」という、非常に強力な機能についても詳細に解説します。

  • 7-1. バックグラウンド実行モードへの対応方法
    • 7-1-1. 対応方法1:Capalities パネルを利用
    • 7-1-2. 対応方法2:info.plistを直接編集
  • 7-2. バックグラウンド実行モードの挙動
    • 7-2-1. バックグラウンド実行モードでできること
    • 7-2-2. バックグラウンドにおける制約(ペリフェラル・セントラル共通)
    • 7-2-3. バックグラウンドにおける制約(セントラル)
    • 7-2-4. バックグラウンドにおける制約(ペリフェラル)
  • 7-3. アプリが停止しても、代わりにタスクを実行するようシステムに要求する(状態の保存と復元)
    • 7-3-1. バックグラウンド実行モードだけでは問題となるケース
    • 7-3-2. 「状態の保存と復元」機能でできること
    • 7-3-3. 実装にあたっての注意点
    • 7-3-4. セントラルにおける「状態の保存と復元」機能の実装方法
    • 7-3-5. ペリフェラルにおける「状態の保存と復元」機能の実装方法
  • 7-4. バックグラウンド実行モードを使用せず、バックグラウンドでのイベント発生をアラート表示する

8. Core Bluetoothその他の機能

本章では、これまでの章では説明していないさまざまなAPI や、

それを利用した実装方法について解説していきます。

「その他」といっても、ペリフェラルへ再接続する方法や、

UUIDやアドバタイズメントデータの詳細、サービス変更を検知する方法など、

BLEを利用したアプリ開発をしていると避けては通れない重要事項が多くありますので、

ひととおりおさえておくことをおすすめします。

  • 8-1. ペリフェラルに再接続する
    • 8-1-1. 既知のペリフェラルへの再接続
    • 8-1-2. 接続済みのペリフェラルに再接続する
    • 8-1-3. 再接続処理のフロー
  • 8-2. Bluetoothがオフの場合にユーザーにアラートを表示する
  • 8-3. UUID 詳解
    • 8-3-1. CBUUIDの生成
    • 8-3-2. 16ビット短縮表現
    • 8-3-3. CBUUIDの比較
    • 8-3-4. ペリフェラルのUUIDについて
  • 8-4. アドバタイズメントデータ詳解
    • 8-4-1. アドバタイズメント・データの辞書で使用されるキー
    • 8-4-2. アドバタイズメントデータの制約
  • 8-5. CBPeripheralのnameが示す「デバイス名」について
  • 8-6. 静的な値を持つキャラクタリスティック
  • 8-7. サービスに他のサービスを組み込む〜「プライマリサービス」と「セカンダリサービス」
    • 8-7-1. セカンダリサービスとは?
  • 8-8. サービスの変更を検知する

9. Core Bluetooth以外のBLE関連機能

iOSでは、Core Bluetooth以外にも、さまざまな機能やフレームワークでBLEが用いられています。

ANCSやiBeaconなど、いずれもiOSアプリの可能性を広げる重要な機能ばかりです。

本章では、それらの「iOSにおけるCore Bluetooth以外のBLE関連機能」について解説します。

  • 9-1. iOSの電話着信やメール受信の通知を外部デバイスから取得する(ANCS)
    • 9-1-1. ANCSとは?
    • 9-1-2. ANCS のGATT
    • 9-1-3. ANCS の実装方法
  • 9-2. iBeaconとBLE
    • 9-2-1. ビーコン=アドバタイズ専用デバイス
    • 9-2-2. iBeaconのアドバタイズメントパケット
    • 9-2-3. Core Bluetoothに対するiBeaconのアドバンテージ
    • 9-2-4. BLEの知見をiBeacon利用アプリの開発に活かす
  • 9-3. MIDI 信号をBLEで送受信する(MIDI over Bluetooth LE)
    • 9-3-1. CoreAudioKit
  • 9-4. BLEが利用可能なiOSデバイスのみインストールできるようにする
    • 9-4-1. Required device capabilities
    • 9-4-2. これまでに販売されたiOSデバイスのBLE 対応状況一覧

10. 開発ツール・ユーティリティ

本章では、BLEを利用したiOSアプリ開発に役立つ開発ツールや、

コマンドラインユーティリティを紹介していきます。

  • 10-1. 128ビットUUIDを生成するコマンド「uuidgen」
  • 10-2. 開発に便利なiOSアプリ「LightBlue」
  • 10-3. Apple 製開発用ツール「Bluetooth Explorer」
  • 10-4. 「PacketLogger」でBLEのパケットを見る

11. ハマりどころ逆引き辞典

iOSでBLEを利用するアプリを開発していると、

「スキャンで見つからない」「つながらない」といった場面はよく出てきます。

通信相手が新規開発デバイスだとそちらを疑いたくなることもありますが、

iOS側でのよくある実装ミスや勘違いというのも多くあります。

また、原因の判断方法や対処法を知っていれば一瞬で解決できるところを、

それらを知らずに、さまざまな検証やコードの修正のトライ&エラーで

時間を費やしてしまう、といったこともよくあります。

本章では、そんなiOS×BLE開発におけるよくあるトラブルと、

その解決のためのチェックポイントについて解説します。

  • トラブル1:スキャンに失敗する
  • トラブル2:接続に失敗する
  • トラブル3:サービスまたはキャラクタリスティックが見つからない
  • トラブル4:Writeで失敗する
  • トラブル5:キャラクタリスティックの値がおかしい
  • トラブル6:バックグラウンドでのスキャンが動作しない
  • トラブル7:バックグラウンドのペリフェラルが見つからない
  • トラブル8:セントラルの「状態の保存と復元」に失敗する
  • トラブル9:ペリフェラルの「状態の保存と復元」に失敗する
  • トラブル10:iBeaconが見つからない

12. BLEを使用するiOSアプリ レシピ集

これまでの章では、何らかのAPI や機能を説明するための単機能サンプルを提示してきましたが、

ここではそれらの機能を横断的に扱うアプリのレシピを提示し、その実装のポイントを解説します。

4つのレシピはiOS×BLEの分野において人気のある題材を集めつつ、

本書の内容がまんべんなく復習できるような内容にしてあります。

  • レシピ1:心拍数モニタアプリ
  • レシピ2:活動量計デバイスとアプリ
  • レシピ3:ジェスチャ認識ウェアラブルデバイス&アプリ
  • レシピ4:すれちがい通信アプリ

Appendix. BLEを使ったサービスを開発するということ



以上、書籍の目次でした。



書籍についてのFAQ

以下、本書について、よく聞かれる質問です。

Swift?Objective-C?

Part 2 は、ほとんどの節についてダウンロードサンプルを用意しています。(今数えたら、Part 2 だけで Xcode プロジェクトの数が 52 個ありました。)


で、セントラル・ペリフェラルの基本事項の解説にあたる4章・5章については ObjC・Swift 両方のサンプルを用意し、掲載しています。


その後の章についてはObjCをベースに解説しています。


konashiがないと読み進められない?

いくつかの例でkonashiを使ってますが、もちろん、お持ちでなくても全然大丈夫です。iPhone同士で通信する、Macと通信する、SensorTagを使う、といった諸々の代替方法も紹介しています。


f:id:shu223:20150323092420p:image:w600

(本書内の図版で使用している各種BLEデバイスの模式図)


BLE、用語がややこしくて敬遠している

筆者も、「ペリフェラル」とか「キャラクタリスティック」といった用語が難しそうで、ずっと敬遠してました。Core Bluetooth編の最初の章(4章)序盤では、なるべくそういう用語を使わないように「周辺のデバイスを探す」「接続する」といった感じで解説しています。(このあたりの配慮については、上に載せた「まえがき」もご参照ください)


BLE云々はよくわからないけどとにかく何かつくってみたい

いきなり12章のレシピからはじめてみるのも手です。「心拍数モニタアプリ」「活動量計デバイスとアプリ」「ジェスチャ認識ウェアラブルデバイス&アプリ」「すれちがい通信」とiOS✕BLEの分野において人気のある題材を集めつつ、本書の内容がまんべんなく復習できるようなサンプルにしてあります。関連項目もまとめてあるので、つくりながら必要に応じて戻って学習する、という学習スタイルも可能です。


BLEデバイスを買わないと気分が出ない

たとえば12章の「レシピ1. 心拍数モニタアプリ」「レシピ2. 活動量計デバイスとアプリ」はデバイス側をiPhoneで代用するレシピにしているので、(気分は出ないかもしれませんが)専用デバイス無しですぐに試してみることができます。また「レシピ4. すれちがい通信」も、iPhone同士で試せるレシピです。


「Bluetooth Low Energyをはじめよう」とどっちを買っていいかわからない

僕も買いました!原著も持ってましたが、和書も改めて。良書です。


Bluetooth Low Energyをはじめよう (Make:PROJECTS)
Kevin Townsend Carles Cufi Akiba Robert Davidson
オライリージャパン
売り上げランキング: 1,674


それぞれのAmazonのカテゴリの違いが、書籍のベクトルの違い・棲み分けを表しているかと思います。

  • Bluetooth Low Energyをはじめよう・・・カテゴリ:自作パソコン
  • iOS×BLE Core Bluetoothプログラミング・・・カテゴリ:モバイルプログラミング

目次を見ても内容のかぶりはほとんどなく、ボリューム的にもだいぶ違いがあります(そのぶん価格帯もちがう)。


f:id:shu223:20150322191754j:image:w300


なので、個人的には両方購入しても損はないと思いますが、ざっくり、

  • BLE という技術全体の概要を把握したい方・・・「〜をはじめよう」
  • BLEを使ったiOSアプリの実装に興味がある方・・・本書

みたいな感じかなと。


高い

すいません、価格はおさえたかったのですが。。なにぶんニッチな技術分野なもので、初回発行部数少なめなのと、ページ数やらの関係で、これぐらいになってしまうとのことです。このあたりは筆者側ではほとんどどうにもできない大人の世界のことなので、なにとぞご理解を。。


評判など

iOS x BLE Core Bluetooth プログラミング - maaash.jp

IRKit開発者による大塚さん( @maaash )によるレビュー記事。

BLEを使いiPhoneと通信するハードウェアを開発しようとする時、

まず身につけるべきは、問題が起きた時の切り分け能力だと思う。


iPhone側はアプリから見るとCoreBluetoothという抽象化したレイヤなので、

アプリ開発者は「scanFor…してるのに見つからないよ?」

デバイス側では「advertiseしてるよ?」

となった時にすぐパケットロガーを出せると話が早い。


この辺もちゃんと10章,10-3,10-4で書いてあってすばらしい。

実戦をこなしている著者陣ならでは。

ふわっとiOSアプリの作り方を解説するだけではなく、BLEについて詳しい3章があるのが心強い。

ハードウェアを作るならば、Bluetooth4の仕様を読むことになるだろう。

だが Core_V4.0.pdf は2302ページもあってしんどい。


そんなときにまずこの3章を日本語で読んで挑めるとかなりスムーズになるだろう。 自分も仕様はところどころピックアップして読んだだけなので、3章はいざという時のためにあたためておきたい。


Amazonのレビュー

BLEを使うサービス開発に関わる人必読の1冊, 2015/3/22


BLEをサービスに活用するにはどうすればいいのか?という一貫した視点で、BLEの通信規格とiOSのCoreBluetoothフレームワークの2つの基礎知識をしっかり解説しています。


開発対象がiOSではなくAndroidでも、またアプリやハードの直接の開発者でなくても、BLEを使った何かを考える方には、必読の1冊です。


iOSアプリ開発では、開発方法だけではなく、トラブルに遭遇したときに、なぜそうなるのかありうる原因の逆引きが書かれています。分野をまたぐ開発では、なにかうまくいかない時に、通信を含む全てを知っていないと原因すら思いつけません。一方で、通信規格やSDKがしっかりしているので、開発者が陥りやすいトラブルは数える程度しかありません。筆者の開発実務経験があるから、逆引きを書かれたのだろうと思います。


BLEを使ったいろいろなものを手がけられてきた方々の対談がAppendixとして収録されています。BLEを使ったサービスを考えるときに外せない考え方や原則みたいな、まだ構造化できない不定形の知識がこの対談にまとまっていると思いました。BLEを使うサービス開発は、どうしても形あるハードウェアに目を奪われます。ですが、Appendixと1章を何度か読み返していると、BLEはリモコンじゃないんだな、とか、なぜ1章でサービスという単語が度々使われているのかが、すっとわかる気がします。


IoTという単語が話題になる2015年、"つながる"を強く主張する発表が続くと思います。しかし、IoTの強力な1手段でもあるBLEの本質は、つながることよりも、つなげない使い方や、つながったり切れたりする利用場面を思うことが重要なのだなと、読んでいて思いました。


『iOS×BLE Core Bluetoothプログラミング』の評判まとめ - Togetterまとめ

買えるところ

Amazon

iOS×BLE Core Bluetoothプログラミング
堤 修一 松村 礼央
ソシム
売り上げランキング: 898



リアル書店

下記リンクから、本書の近隣のリアル店舗における在庫の有無が調べられます。


https://takestock.jp/book/4883379736/search/


(新宿紀伊國屋書店での松村さんのツイート)


(2013.3.31追記)電子書籍版

多くのお問い合わせをいただいていた 電子書籍版(PDF)も出ました!!!!達人出版会さんよりご購入いただけます。


iOS×BLE Core Bluetoothプログラミング
堤 修一, 松村 礼央
ソシム
発行日: 2015-03-23
対応フォーマット: PDF


こちらからサンプルが読めます。


ちなみに、ソシムの本書の読者サポートページの「正誤情報」から、該当ページだけ修正PDFがダウンロードできるのですが、こちらも購入検討用サンプルとして見ていただくといいかもしれません。



2015-02-14

WatchKitを実際にさわってみてわかったこと@iOSオールスターズ勉強会 #dotsios

本日開催された「iOSオールスターズ勉強会」という勉強会に登壇させていただいた際の資料です。



※Keynoteでつくってpdfで書きだしてアップしたので、残念ながら埋め込んでいた動画が見れなくなってます


概要

スライドを見るのが面倒な方々のために、ざっくり概要を書いておきます。

1. アニメーション編

WatchKit App 側に入れてある「Staticな」リソースを使用するアニメーションは `setImageNamed:` と `startAnimatingWithImagesInRange〜` を使えば高速にアニメーションできるのですが、WatchKit App の Asset Catalog にない「Dynamicな」リソースを使用する場合はどうアニメーションを実装すべきか?という話。

  • フレームごとの UIImage オブジェクトを生成して、NSTimer で一定間隔ごとに `setImage:` する、というのはパフォーマンス的に全然アウト、それらのフレーム画像をキャッシュするのもプログラミングガイドに非推奨と明記されている
  • UIImage の `animatedImageWithImages:duration:` を利用してひとつの Animated な UIImage オブジェクトを生成してから `setImage:` するのが正解。

f:id:shu223:20150214162258g:image


2. テキスト入力編

こういうアニメーションする3D絵文字とか、


f:id:shu223:20150214162259g:image

(Apple Storeの動画より)


音声入力とか、Smart Replies(フレーズを選択して返信)


f:id:shu223:20150214162300p:image:w400

(同じく、Apple Storeの動画より)


WatchKit から利用可能なのか?できるとして、どうやって実装するのか?という話。


3. カスタムUI編

Appleによるヒューマンインターフェースガイドラインに載ってたこういうUI、


f:id:shu223:20150214162301p:image:w600


こういう Core Graphics でやりたくなる感じの描画できるの?どうやるの?という話。


他に紹介したのは、

  • カスタムフォント
    • 普通にできた

f:id:shu223:20150214162302p:image:w240


  • オーバーレイ

- WKInterfaceObject は、UIView の subview 的にインターフェース同士を重ねられない

- UIEdgeInsets 的なものもない

- → WKInterfaceGroup に設定できる背景画像を利用する

f:id:shu223:20150214162303p:image:w240


  • origin の調整

- WKInterfaceObject には、(UIView における) frame.origin 的なプロパティがない

- → WKInterfaceGroup を活用するとそれっぽく調整できる

f:id:shu223:20150214162304p:image:w240


WatchKitTrials

WatchKitにまつわる諸々の試行錯誤サンプルをまとめたリポジトリです。


https://github.com/shu223/WatchKitTrials

(近日push予定)


余談:ボツネタ集

個人的にはいままでで一番の大舞台だし、他の登壇者の方も濃くて役立ちそうな話をしてくれそうな方々ばかりなので、発表内容は結構悩みました。。


  • ボツネタ1. 「iOSのセンサ処理 再入門」

もう iOS も 8 になって、Swift という新言語まで登場しちゃって、どんどん進化していきますが、最近になって意外とわかってないなーと気付いたのが、もうかなり昔からある加速度センサとかジャイロスコープの値の処理の方法。


たとえば、iPhone をブンッと振ると、振っている間に加速度センサの値が大きく動くんじゃなくて、止めた瞬間にピークが立ち、直後に反対方向にまたピークが立ちます。これらをどう処理するのが定石なのか?とか。


あと、ユーザー加速度とか重力とかクォータニオンとかオイラー角とか、それらを扱うための Core Motion とか GLKit とか。


ボツ理由:結局のところ自分は興味があるだけで専門分野ではないので、大舞台で不正確なことをいってしまう恐れがありやめました。


  • ボツネタ2. 「今日から始めるBLE」

スライドの最後のページでも告知している通り、『iOS x BLE プログラミング 〜Core Bluetooth 徹底解説〜』(仮)という著書が来月発売予定なので、宣伝も兼ねられるのと、本書いたばかりなので自信をもって話せるということで、この方向性も検討しました。


ボツ理由:BLEとか外部デバイス連携の話って、iOSエンジニアの中でも興味がある人が限られるので、400人の前で話す話じゃないなー、ということでやめました。


  • ボツネタ3. 「iOSのバックグラウンドでできることできないことのまとめ」

Core Bluetooth の機能に、「状態の保存と復元」という、アプリが停止しても(プロセスが殺されても)iOS が BLE の処理のそのまま引き継いで、必要に応じてアプリを起こしてくれる という超強力なものがあり、各バックグラウンドモードの機能とか制約を知ることは非常に有意義だなーと。バックグラウンドモードも位置情報とかオーディオとかいろいろあって、リファレンスとかプログラミングガイドをそれぞれ熟読したわけじゃないし。


ボツ理由:さまざまなバックグラウンドモードについて詳しく調べるのが大変なのであきらめました。


※ちなみに Core Bluetooth の「状態の保存と復元」については拙著に詳しく書いたので興味のある方は是非!


iOS×BLE Core Bluetoothプログラミング
堤 修一 松村 礼央
ソシム
売り上げランキング: 1,106


おわりに

スライドに書いたこと以外にも、通知機能の検証がシミュレータでどこまでできるかとか、WatchKit Extension 側にも Parse SDK を入れて親アプリと同じユーザー(アカウント)になってデータのやりとりをするとか、いろいろ「実際にさわってみてわかったこと」があったのですが、発表時間は20分しかないので、今回は見た目的にわかりやすい話に絞りました。


他の発表者の方々の話も非常に勉強になりました。参加者のみなさま、主催の dots. と登壇者のみなさま、どうもありがとうございました!


2015-01-31

独立してから第4四半期目の実績まとめ

2014年11月〜2015年1月にフリーランスとしてやらせていただいたお仕事をまとめました。


3ヶ月毎にまとめつづけて今回で4回目、すなわち独立して一周年!!!!なわけですが、振り返り的なことは昨年の暮れに書いたばかりなので、今回はさらっと。


(過去のまとめ)


書籍執筆

この3ヶ月の仕事量を請求書ベースで数えてみると合計で37人日。平日だけで考えても丸1ヶ月ぐらいは休んでた計算になります。(3ヶ月でざっくり60営業日として)


が、もちろん休んでたわけじゃなくて、むしろ土日祝日・大晦日・元旦関係なく働いておりました。


何をそんなにがんばってたかというと、ずっと前からブログでもたまに触れてた「iOS✕BLEの書籍」を書いてたのでした。


「ページ数が足りない・・・」*1と夢に見たりもしましたが、どうにかこうにかひと通りは書き上げ、初校→修正→再校→修正→三校→修正・・・とあと何往復かすれば無事書店に並びます。


またタイトルや発売日等、詳細が決まり次第お知らせしたいと思います。


(2015.3.18追記)

タイトル、発売日決まりました!


iOS×BLE Core Bluetoothプログラミング
堤 修一 松村 礼央
ソシム
売り上げランキング: 1,106


Macアプリ開発(Moff)

Moffのお仕事で、Mac OS Xアプリを開発しました。iOSでリリース済みのMoffアプリのMac版・・・ではなくて、Moffのアルゴリズム検討で用いる社内用ツール的なアプリです。


f:id:shu223:20150203075136p:image:w600


初めてのMacアプリでしたが、手馴れている ObjC + Xcode で書けて、それでいて何か新しい世界が拓けていく感じがするという、すごく楽しい体験でした。


【新規】とある新ウェアラブル案件

詳細は会社自体が何らかのプレスリリースとか出すまで控えたいと思いますが、BLEと音声処理が絡んでて、かなり楽しい案件。


【新規】とあるロボット案件

こちらも詳細はまだ控えます。BLE絡み。


【新規】とあるWatchKit案件

こちらも詳細は秘密ですが、WatchKitを使う案件。


色々と「実際にさわってみてわかった」知見がたまってるので、今度登壇させていただく「iOSオールスターズ勉強会」ではそのあたりの話をさせていただこうかと。


WHILL

アップデート版の開発。ちょっとWHILL本体の方が忙しそうで、月に1〜2人日のスローペースでした。


新しいリリースはないのですが、WHILLの注目度のおかげで、お手伝いしたアプリがTVに出ることもしばしば。


中でもこれはメチャメチャ嬉しかったです。



12月5日放送のダウンタウンの番組『教訓のススメ』でWHILLが紹介され、スタジオで蛭子さんが乗るWHILLを松ちゃんがアプリから遠隔操作する、という場面がありました。


僕の実装したアプリを松ちゃんが操作した、ということは、松ちゃんのタッチ操作を僕が書いたプログラムが処理し、実行したわけで、ある意味僕はついに松ちゃんと会話した!といっても過言ではないのではないでしょうか!!!!(キモくてすいません)中学生の頃ごっつを毎週録画しては2,3回観てたダウンタウンの洗礼をもろに浴びた世代として光栄至極です。

当時のFacebook投稿より)


あと最近知りましたが、WHILLのUSのサイトに、アプリの紹介ページができてました。


f:id:shu223:20150203075137j:image:w400


アプリはご好評をいただいているとのことです。


SmartDrive

こちらも引き続き。リリース間近なので集まってガッと集中してやろう、ってことで開発合宿に行ってきました。



開発は捗ったしご飯は美味しかったしで大変よかったです。


その他

めでたいことが多い3ヶ月でした。


TechCrunchハッカソンに「特別参加エンジニア」として参加&入賞!

あの増井さん(@masuidrive)と並んで、「特別参加エンジニア」としてTechCrunchハッカソンに呼んでいただきました。


iOSエンジニアのイベントでもないので、99%の参加者の皆様は「誰?」という感じだったと思いますがが、講演とかするわけじゃなく、普通に一緒に参加者としてチームに入ってハックする役回りなので、ひたすら手を動かして、徹夜もして楽しかったです。


f:id:shu223:20150203084837j:image:w500

(賞もいただきました!)



「Yahoo クリエイティブアワード」グランプリ!!!!

「Yahoo! JAPAN インターネット クリエイティブアワード 2014」で僕の名刺が超ありがたい賞をいただきました。


f:id:shu223:20141127080832j:image:w600



WBS(ワールドビジネスサテライト)出演!


海外iOS技術書籍にレビュアーとして参加

"Learning iOS 8 for Enterprise" という本。GitHubのiOS8-Samplerがきっかけでご依頼いただきました。



レビュアーということで、バイオグラフィーを載せていただきました。


おわりに:2年目の抱負

つい先週、「モイめし」というツイキャスを運営するモイ代表の赤松さんとの対談番組に出させていただいた際に、赤松さんに不意に尋ねられた際の回答。

いろいろと悩んでいるところではありますが、昨年も目の前の仕事を頑張っていったら何となく良い方向に流れていったので、今書いている本をきっちり書いて、抱えている仕事をきっちりして、それをきっちり発信するということを粛々とやっていきたいと思っています。


というわけでとくに具体的な戦略はないのですが、世の中の流れを見つつ自分の興味に正直に、粛々とやっていきたい所存です。引き続きよろしくお願いします!


*1:ひたすらMarkdownで書いてて、自分がどのくらい書いたのか最後にDTP作業が入るまで把握が困難。技術書はコスト的に一定ページ数以上ないと出せない

2014-12-29

フリーランスを1年やってみて考えが変わったこと

お客さん仕事はわりと早いうちに納まったのですが、原稿書きがまったく納まる気配がないので、(現実逃避として)今年1年をふりかえろうと思います。


といっても「こういうお仕事をやりました」的なのは3ヶ月ごとにまとめているので、

ここでは主に、独立して最初の1年目 *1 を振り返ってみて「フリーランスになってみると意外だったこと」「考えが変わったこと」「やりかたを変えたこと」あたりの話を書こうと思います。


出勤した方が楽しい

独立当初は、フリーランスという働き方のメリットのひとつが、「場所・時間の自由」だと思っていて、必要な打ち合わせのとき以外は、家とか、自分が入居しているコワーキングスペースで作業するようにしていました。


で、お客さんもほとんどの場合それでいいと言っていただけるのですが、今は逆に、僕の方から「オフィスで一緒に仕事させてほしい」とお願いしています。


その理由としては、

  • お客さんにすぐ確認できる・・・優先度や不明点を確認でき、作業の無駄が減る
  • 遠隔でのコミュニケーションが苦手・・・誤解を与えない言い回しに苦労したり、でもそのあたりをサボるとお互い不要にイラッとしたり
  • 温度感がわかる・・・直接話したり、一緒にランチしたりする中でその会社の状況とか雰囲気とか、やろうとしていることが実感値として理解できる
  • 集中できる・・・やはり1人でやるより緊張感がある
  • 見積もりレス・・・後述

などなどあります。


寂しくない

「会社には仲間がいるが、フリーランスは1人でやるので、寂しい」


独立前は僕もそう思っていたのですが、意外とやってみると逆の印象を受けました。

  • フリーランスでも結局開発体制としてはチームの一員であることに変わりはないので、「一緒につくっている仲間」という感は会社のときと同様にある
  • 個人的なコミュニケーションも仕事に繋がったりするので、勉強会や飲み会に行く時間が以前よりもっと有意義に感じるようになった

といった理由から、独立前よりもコミュニケーションや人付き合いは活発になった感があります。


個人でも楽しい案件に関われる

フリーランスになるにあたって迷いが少しあって、その理由のひとつが「会社の大看板に来る仕事の方が楽しいんじゃないか」というものでした。実際、カヤック時代にやった仕事はどれもおもしろくて、やりがいがあって、実績になるものだったので。


で、蓋を開けてみると、今年やらせていただいた仕事はどれもおもしろくて、やりがいがあって、実績にもなるものばかりでした。


今年は運がよすぎただけかもしれませんが、とにかく粛々と腕を磨いて、ちゃんとやりたいこととかやったことをアピールし続ければ個人でも道は開けるものだなと。


見積もりを(あまり)しなくなった

見積もりが結構苦手でして。。


たいていの場合、見積もり時点でUIデザインとか、動き(遷移とかタップしたときのギミック的なもの)とかって決まってることってほとんどなくて、でもiOSアプリの場合そこがそもそも開発の肝だったりするわけで。標準UIコンポーネントのプロパティをいじる範囲で済むなら3分だけど、自分でカスタムUIコンポーネントつくるなら丸1,2日かかるかもしれないとか。


で、ほとんどの場合、企画書にある情報だけだと


「1人日〜3人月ですね」*2


とか答えたくなるわけですが、お客さんに対してそういうわけにもいかないので、


「ここはどうしますか?たとえばこうしたい場合、選択肢としてはAとBがあって、それぞれメリット・デメリットは・・・」


とかやりたいことを引き出すことが必要になり、そういう不明確なところを質問にまとめたり、A案・B案みたいな枝分かれをさせつつ語弊や認識違いのないように・・・と回答を整理していくと、見積もりだけで8時間とか平気でかかってしまいます。


かといってざっくり見積もるとトラブルの元になるのでよくない、かといってお客さんからすると見積もりがないと始まらない、最初からUIデザインや詳細要件が明確になっていてほしいというのも無理がある。。



そんなわけで、最近は「お客さんのところに行って1日作業して、その日数 ✕ 人日ぶんいただく」という稼動日ベース方式でやっています。いつどれぐらいお客さんのところに行って作業するかは、その時々でお互いの状況や残りタスクの量を見て相談する感じで。


このやり方だとお客さん側にもいろいろとメリットがあると思っていて、

  • 状況にあわせて仕様とか優先順位を日々変更できる
  • 見積のバッファみたいなものが入ってこないので、無駄が少ない

みたいなことがあるかと。


ただこれって、「堤の1日の作業」に対するお客さんの信頼ありきなので、最初は1人日でどれぐらいできそうか、みたいな目安は提示したりはします。



ちなみにプロトタイプ系の案件は例外で、規模的に数人日レベルのものは十分見通しが立つので、お客さんに不明事項を確認して普通に見積もり出してやってます。*3


おわりに

先にもちょっと書いたように、もともとフリーランスになるにあたって迷いもあったわけですが *4、約1年やってみた今となっては、働き方としてかなり自分に向いてるんじゃないか、と感じています。

  • 自己責任で、自分の働き方・生き方を自由度高く選択できる
  • 自分の行動の結果が、自分にダイレクトに返ってくる

というあたりがやっててとても心地いいなと。


というわけで2015年も引き続きフリーランスとしてがんばっていく所存ですので、どうぞよろしくお願いいたします!ではみなさま良いお年を。


*1:ちなみに2014年2月に独立しました。

*2:標準コンポーネントを並べるだけで、「それっぽく」つくるだけなら結構1日でできたりしますよね

*3:あと、今はスタートアップのお仕事が多いのでたまたまこれで成立しているだけで、もうちょっと規模の大きい会社とお仕事させていただく場合は普通に見積もりレスなんて無理かもしれません。

*4:独立の経緯について話したインタビュー: http://prosheet.jp/blog/engineer/4641/

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 |