Hatena::ブログ(Diary)

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

2017-11-20

サンフランシスコで就職して1年が経ちました

昨年9月28日に『フリーランスを休業して就職します』という記事を書いてサンフランシスコの会社に就職し、早1年が経ちました。


実際にはもう1年と2ヶ月ほど経ってまして、この2ヶ月間、何度も記事を書こうと思いテキストエディタを開きつつ、まとめきれずに途中で断念・・・ということを繰り返してました。ブログ記事1つにまとめるには多くのことがありすぎました。


レイク・タホに別荘を借りて会社のみんな(とそのファミリー)で連休を過ごしたり、同僚の帰省(ミズーリ州)についていってサンフランシスコとは全く違うアメリカを体験したりといった「楽しい思い出」もあるし、英語について色々と試行錯誤したり学んだりしたこともあるし、会社でどんな感じで仕事してるか/現地でどう生活してるかというのもあるし・・・ということを書いてると永遠にまとまらなそうなので、本記事では「入社を決めた当初の目的に対しての達成度はどうか」というあたりについて書こうと思います。


f:id:shu223:20170616204618j:image:w600

(オフィスの屋上でビールの図)


状況のおさらい

まずは前提となる状況について書いておきますと、

  • 2016年10月、サンフランシスコのスタートアップ「Fyusion」にiOSエンジニアとして就職
  • ビザはH-1B
  • 僕がちょうど30人目の社員
    • 今は40人ぐらい?
  • 入社時点では日本人は僕ひとり
    • 今はリサーチ(研究開発)チームに日本人の同僚が一人います。

詳細は冒頭にも挙げた昨年の記事に書いてあります。


Fyusion入社の目的:欲しいスキルが得られそうだった

これも昨年の記事に書いたことですが、謳歌していたフリーランスをやめてFyusionに就職することにした理由は、シンプルに言うと「欲しいスキルが得られそうだったから」です。


具体的には以下の4つ。

  • コンピュータビジョン
  • 3Dプログラミング
  • 機械学習
  • 英語

で、Fyusionは

  • CEOは、3D点群処理のオープンソース・プロジェクト「Point Cloud Library (PCL) 」の設立者であり、OpenCVのコミッタでもある
  • 他のファウンダー陣・メンバーも、ロボット工学・3Dコンピュータビジョン・機械学習とかの博士号もってる人がゴロゴロ(スタンフォード等の名門だったり、CVPRベストペーパーを取った人もいたり)
  • 提供しているサービスもそれらの技術をベースとしている
  • もちろん英語を使う

というわけで、完璧に条件が揃っていたので、これはもう行くしかないということで入社を即決しました。


プラス、これはスキルというよりは経歴面での話ですが、「サンフランシスコの会社で働き、ちゃんと通用した」という実績が得られるのは、もし今後またフリーランスをやる際にも、海外の会社に対して安心材料になるかなと考えていました。


この1年での達成度:技術面

まず、3Dプログラミング・機械学習については、結構達成感があります。いや、どちらも初心者レベルなのですが、何年も前から興味がありつつ、結局ほとんど手を付けられなかった分野で、少なくともスタートを切ることができた、というのは自分にとって非常に大きい。


3Dプログラミングは、ワールド座標とかそういう3Dの基本のキも知らないところから、アプリ内でもSceneKitを利用した機能を実装できたし、ここでSceneKitをさわってたおかげで書籍でARKitについて書くことができました*1


機械学習については、弊社の優秀なリサーチエンジニアが、学習させたモデルをMetal Performance Shaders(MPSCNN)を使ってiOSデバイス側で動かすところまでやってしまうので、残念ながら社内の仕事では自分の出番がほぼなかったのですが、自分にそのへんの仕事がまわってくるようにと、

といったことができたので、スタート地点としては満足です。


コンピュータビジョンに関しては、正直なところ知見が深まった感はあまりありません。そのへんのコアなアルゴリズムはリサーチチームが実装(C++)を含めて担当するし、その中身を聞いて理解するにはアカデミックな知識も英語力も不足しているので、及び腰になってしまいます。とはいえこの分野で新たに知ったことも多いし、機械学習もこの分野に関連してるので、進んだといえば進んだといえるかも。


あと、当初の目標としては考えてなかったですが、弊社はプロダクト内でMetalをガッツリ使ってるので、実務でMetalを使う機会があったのもよかったです。OpenGL ESには以前から興味がありつつ手を付けられてなかったので、同じくGPUインターフェースレイヤのMetalをいじれるようになったのは自分にとってかなり大きい収穫でした。


この1年での達成度:英語

これは・・・アメリカの会社で働いているという観点でみると、かなりダメだと思います。いまだにミーティングでのみんなの議論(自分以外 vs 自分以外)についていけません。日本語でも口数が多い方ではないので、そもそも会話の絶対量が少ない。この感じだとあと3年いても無理な気がします。


とはいえ、入社以前の自分から比べてどうか、という観点だと、飛躍的に向上したともいえます。表現の引き出しは増えたし、チャットではわりと苦もなくコミュニケーションできてます。相手が少しゆっくり話してくれて、話すべき明確な用事(タスクとか、仕様とか)があれば、ちゃんと意思疎通できます。ほんの数年前まで2,3行の英語メール書くにも辞書引きながら10分とかかけてたのを思うと、また入社面接でも相手の言ってることが5%も理解できなかったのを思うと、大きな進歩だなと。


ただ、これまではどうも技術に逃げてしまってたところがありました。英語の勉強より技術の勉強、楽しい会話ができなくても技術で認めてもらえばいい、と。

これだとせっかくの「英語を使わざるを得ない環境」がもったいないので、会話量を増やすべく対策を打っていこうと思います。


この1年での達成度:実績面

まず、1年以上は働く、というのは目安として考えていました。日本と比べて社員をクビにしやすいアメリカでは、実力不足の社員はやはり切られます。1年いれば、ちゃんと通用した、といえるんじゃないかなと。これは達成です。


それとは別に「会社で技術力が認められている」ことが客観的にわかりやすい事実として、プロモート(昇進)しました。


採用時は Lead Software Engineer だったのが、Senior Principal Engineer になりました。


f:id:shu223:20171120075700j:image:w500

(新しくしてもらった名刺)


収入も当初のものから年収にしてn百万円上げてもらったので、サンフランシスコの会社で働き、貢献し、評価されている、というわかりやすい証明ができてよかった、と思っています。



ちなみにうちの会社、CEO、CTO、SVP Engineering、SVP Webのファウンダー陣全員が現役バリバリでコード書きます。これの何がいいって、エンジニアが正当に評価される、という実感がハッキリあります。


たとえばある時期、僕はiOSリポジトリのコードを抜本的に改善すべく、iOSチームメンバーのマインドから変えていかないと、ということでレビュー依頼が自分に振られていないものまで結構細かくコメントをつけていたことがありました。頼まれてもないのに人のコードにケチをつけるというのは下手したら相手から嫌われかねないし、自分でコード書いて新機能とかを実装する方がよっぽど楽しいのですが、どうしても必要だと思った(汚染が広がる一方なのを食い止めたかった)のでやってました。


で、そんなある日、CEOから「いつもグレイトなレビューをありがとう!」っていうメッセージが。


CEOがプルリクのレビューコメントを見て、しかもその良し悪しが評価できるって、良くないですか?これはやはり経営陣が現役でコード書いてるならではかなと思います。「昔はバリバリ書いてた」でも厳しいでしょう。あの機能をつくったとか、そういう見えやすい仕事以外での貢献も評価される環境はエンジニアにとって非常に働きやすいなと。


まとめ

まとめると、

  • 技術面・・・手応えあり
  • 英語・・・もっと話さないといけないけどそれでも進歩はあった
  • 実績面・・・アメリカで通用してるぞという明確なものが得られた

という感じで、ここまでの進捗は上々です。


ただこれはコミュニケーション力に難のある僕に対するファウンダー陣や同僚の理解/協力があってこその結果で、「おれはもう世界のどこでもバリバリやれる」という自信がついたかというと、まったくそんなことはないわけで。会社にも、アメリカにももっと食い込んでいけるようにならないとなぁ、というのが今後の要努力ポイントです。


*1:ARKitは、レンダリングはSceneKitや他のフレームワークに任せるようになっている

2014-12-09

機械学習はじめの一歩に役立つ記事のまとめ

「機械学習」というワードになんとなく惹かれつつも、具体的にやりたいことがあるわけでもないので、手を動かすことなくただひたすら「いつかやる」ために解説記事やチュートリアル記事を集める日々を過ごしていたのですが、このままじゃイカン!と no title に参加登録してみました。


が、やはり何もしないまま当日を迎えてしまったので、お茶濁しではありますが、せめて「機械学習ってどんな手法やライブラリがあって、どんな応用先があるのか?」というあたりをざっくり把握して最初に何をやるのか方向付けをするためにも、たまりにたまった機械学習系の記事をいったん整理してみようと思います。


機械学習の概要

特定のライブラリや手法の話ではなく、機械学習全般に関する解説。


no title


冒頭に、

  • 初めて機械学習を聞いた⼈人向けです
  • 数式を使いません
  • ガチな⼈人は寝てて下さい

とある通り、機械学習ってそもそも何?どう嬉しいの?というところがスタート地点である自分にとってすごくありがたかったスライド。


ざっくり目次的なものをまとめると(かなり抜粋)、

  • 機械学習って何?
    • 例: スパム判定、商品推薦、コンピュータ将棋・囲碁・チェス
    • その他適用分野
    • 機械学習が向かないタスク
    • ルールベースとの比較
  • 機械学習って何してるの?
    • 教師あり・教師なし学習とは?両者の目的の違い
    • 線形分類器(図解がわかりやすかった)


Python / scikit-learn

Python で機械学習しよう!(環境構築 on Mac編) - もろず blog

Mac 上に Python で数値計算、機械学習を行うための環境構築の手順。全編スクショ付きですごくわかりやすいです。(が、あくまで環境構築手順だけで、実際に機械学習を行ってみるところまではカバーされていません)


インストールする数値計算、機械学習ライブラリは以下の4つ。

  • NumPy

数値計算を効率的に処理するためのライブラリです

配列の操作がとても簡単になるので、行列計算には必須っぽいです

  • SciPy

様々な科学計算が実装されたライブラリです

内部でNumPyを利用しています

  • matplotlib

グラフ描画のライブラリです

内部でNumPyを利用しています

  • scikit-learn

機械学習に関する様々なアルゴリズムが実装されたライブラリです


機械学習の Python との出会い — 機械学習の Python との出会い

NumPy や SciPy などの科学技術計算モジュールの具体的な使い方を学べるチュートリアル。PDF版やePub版も用意されていて、もはや書籍。


前書きにもある通り、機械学習のごくごく初歩的な話とか、Pythonのごくごく初歩的な話は省略されているので、はじめの二歩目ぐらいに目を通すとよさそうです。

このチュートリアルでは,いろいろな機械学習の手法を Python で実装する過程をつうじて,NumPy や SciPy など科学技術計算に関連したモジュールの具体的な使い方を説明します. 機械学習の手法についてはごく簡単な説明に留めますので,詳細は他の本を参考にして下さい. また,クラスなどのプログラミングに関する基礎知識や,Python の基本的な文法については知っているものとして説明します.


(目次)

  • はじめに
    • 本チュートリアルの方針
  • 単純ベイズ:入門編

最初に実装するのは,特徴量がカテゴリ変数である場合の単純ベイズ (Naive Bayes) です. この単純ベイズの実装を通じて,NumPy / SciPy を用いた行列・ベクトルの初歩的な扱いについて説明します.

    • NumPy 配列の基礎
    • 単純ベイズ:カテゴリ特徴の場合
    • 入力データとクラスの仕様
    • 学習メソッドの実装(1)
    • 予測メソッドの実装
  • 単純ベイズ:上級編

単純ベイズ:入門編 で実装した NaiveBayes1 クラスを,NumPy のより高度な機能を利用して改良します. その過程で,NumPy の強力な機能であるブロードキャストの機能と,この機能を活用する手順を紹介します.

    • クラスの再編成
    • 単純ベイズの実装 (2)
    • 配列の次元数や大きさの操作
    • ブロードキャスト
    • クラスの分布の学習
    • 特徴の分布の学習
    • 実行速度の比較

pythonの機械学習ライブラリscikit-learnの紹介 - 唯物是真 @Scaled_Wurm

Python の機械学習ライブラリ scikit-learn のチュートリアル。scikit-learn でできること(機能)がカタログ的に紹介されています。


それぞれの機能について簡単なサンプルコードと実行結果が示されているので、色々とつまみ食い的に試してみるのによさげ。

  • サンプルデータの自動生成

sklearnにはIrisなどのトイデータセットやサンプルデータの自動生成などの機能もあります。

(0のデータ)

  • 線形SVMによる二値分類

データをトレーニング用とテスト用に分けて、トレーニングデータで訓練したモデルでテストデータを予測してみます。

  • 分類結果の評価

分類器で得られた推定結果がテストデータとどれぐらい一致しているかでモデルの評価を行います。

  • クロスバリデーション(交差検定)

上のほうで二値分類を試すときにデータをトレーニング用とテスト用に分解しました。しかし、データを分けるとそれぞれに使えるデータが少なくなってしまいます。

クロスバリデーションではデータをいくつかに分割して、1個をテスト用、残りをトレーニング用に使ってスコアの計算をします。このとき分けられたデータのすべてがテストに選ばれるようにくりかえし評価を行い、そのスコアの平均を使って評価をします。

  • グリッドサーチ

適切なパラメータを選ぶのによく使われるのがグリッドサーチという方法で、これはいくつかのパラメータの組み合わせを実際に試して評価関数を計算し、スコアがよかったパラメータを選ぶというものです

  • 不均衡データ

ラベルごとのデータ数が大きくアンバランスなデータだと学習がうまくいかないときがあります。たとえば正例:負例=1:100とかだったりすると、十分なデータがあっても訓練したモデルはすべてを負例に分類してしまったりします。こういうときはクラスに対する重み(LinearSVCならclass_weight)を変えたりresample関数を使ってトレーニングデータ内の比率が1:1に近くなるようにアンダーサンプリングやオーバーサンプリングをしたりすると結果がよくなることがあります。

  • 特徴量の抽出

分類器のモデルの入力(データのベクトルによる表現)をどうやって作るかという話


no title

scikit-learn のチュートリアルスライド。


スライドというメディアの特性上、コードは少なく図が多いので、上の「pythonの機械学習ライブラリscikit-learnの紹介」に出てくる機能の補助資料として読むとよさそうです。


Deep Learning

no title

ずっと「ディープラーニング」というキーワードは「何かすごそう」ぐらいに気にはなってて意味はわかってなかったのですが、冒頭の説明が超わかりやすかったです。

つまるところ、Deep learningの特徴は「特徴の抽出までやってくれる」という点に尽きると思います。

例えば相撲取りを判定するモデルを構築するとしたら、普通は「腰回りサイズ」「マゲの有無」「和装か否か」といった特徴を定義して、それを元にモデルを構築することになります。ちょうど関数の引数を決めるようなイメージです。

ところが、Deep learningではこの特徴抽出もモデルにやらせてしまいます。というか、そのために多層、つまりDeepになっています。

具体的には頭のあたりの特徴、腰のあたりの特徴、そしてそれらを複合した上半身の特徴・・・というように、特徴の抽出を並列・多層に行って学習させて、それでもって判定させようというのが根本的なアイデアです


deep learning の代表的なライブラリも挙げられていました。

  • pylearn2
  • Caffe
  • nolearn
  • deepnet
  • yusugomori/DeepLearning

通常なら最新の実装も搭載されているpylearn2、画像認識ならCaffeらしいです(経験者談)。


研究やとりあえず試してみる場合に必要になる学習データを提供してくれているサイトのリストもまとめられていて、即ストックさせていただきました。


最後に pylearn2 を用いた実践手順もあり。


no title


いろいろなところからリンクされていたスライド。Deep Learning の手法について図解でわかりやすく解説 ・・・されているはずなのですがちょっとよくわからなかったのでまた読もうと思います。


no title

専門家向けではなく、一般向けに Deep Learning について説明してくれているスライド。


no title

たぶん全然はじめの一歩ではないのですが、かなり詳しく書かれていて、実装についても追記される(2014年12月9日現在未完とのこと)なので、deep learning がちょっとわかってきた頃にまたあとで読むと勉強になりそうだなと。


no title


Python の Deep Learning ライブラリ、THeano を使用して手書き文字認識。前段の Deep Learning 自体の解説も噛み砕かれていて、わかりやすそうです。


no title

Deep Learning ライブラリ、THeano のチュートリアル。


Weka

機械学習(データマイニング)ソフトのWeka。Mac版もあり。*1



とある知り合いの大学院生が使っていて、GUIをポチポチしていくだけであらかじめ実装されている各種アルゴリズムによりデータが自動分類されていくという様子を目の当たりにして、今度自分も試してみよう、と思い記事だけ集めて今に至ります。


@PAGES サービス終了のお知らせ

インストール〜実際にデータを分析するまでのチュートリアル。全編スクショ付きで非常にわかりやすそうです。Windows版ですが、たぶんMacでもほぼ同じかと。


決定木をつくる、入力データを用意する、のあたりはあらかじめ用意されているサンプルデータを使用するのですぐに試せるし、分析結果の見方も解説されているので、とりあえずプログラミングなしで体験してみるのによさそうです。


社会人MBA?技術者編
  • どうマイニングする?
  • 決定木分析?
  • 決定木分析?-1
  • 決定木分析?-2
  • 決定木分析?予測する
  • 決定木分析?因果関係を知る
  • 記憶ベース推論?
  • 記憶ベース推論?
  • ニューラルネット
  • 複数の分析を行う
  • アソシエーション分析?
  • アソシエーション分析?
  • ROC曲線とlift chart 補足1
  • 補足 研究開発部門での使用
  • 関連リンク集
  • データマイニング入門

リンク先に、これらの内容を再構成してまとめられたPDFもあります。


はじめてのweka勉強会 −修正版− - sleeping vote

arff形式のデータをテキストエディタで自分でつくってみる、クラスタリングするプログラムを書いてみる、ちょっとソースをいじって手法を変えてみる、といった方法が説明されていて、Wekaを使う第2歩目ぐらいによさそうです。


応用・実例

機械学習は手法も応用も多岐にわたるので、具体的な応用・実用例も集めています。


Googleの猫認識 (Deep Learning) - 大人になってからの再学習

ディープラーニングの記事を見ていると、事例として必ず出てくる、Googleの猫認識の話(ネコという概念を、コンピュータがYoutubeの動画を見続けることで自動学習したという話)について、この記事では、Deep Learning がどのように用いられているか、を噛み砕いて解説してくれています。



画像認識によって焼きたてパンの種類を判断できるレジ装置
  • 購入客がパンをトレーに載せてレジ横にあるカメラの下に置くと、BakeryScanが撮影画像を基に、パンの種類を自動判断
  • 準備作業として、パン1種類につき10個分の写真を撮影してBekaryScanに読み込ませる
    • BakeryScanが10個分の画像から、あんパンやメロンパンなど種類ごとの「画像モデル」を自動的に生成
  • 大きさや形、色、表面の状態、テクスチャーといった画像モデルの「特徴」は、B開発元があらかじめ100種類ほど設定
  • 特徴の「重み」については、店が読み込ませたパンの画像データを機械学習して、BakeryScanが自動調整

低解像度の画像から、自動車のナンバープレートのナンバーを識別
  • あるナンバープレートの画像について、高解像度のデータと低解像度に圧縮したデータをペアとして読み込ませて機械学習を行い、ナンバープレートの圧縮パターンの「辞書」を作成
    • この辞書を逆引きすることで、低解像度の画像から高解像度の画像を類推・生成
  • 自動車のナンバープレートのほか、人間の顔の圧縮パターンも機械学習させた
    • 低解像度の監視カメラ画像の解像度を高め、写った人物の顔写真を正確に推測

(元記事より)

英文の誤りを見つけ出し、ネイティブが書いたかのような文章に校正
  • Lang-8が大量に保有する、非ネイティブである学習者が書いた「誤った文章」と、ネイティブの指導者が校正した「正しい文章」のペアのデータを利用
  • これらペアのデータを100万件以上提供してもらい、機械学習させた
    • 間違いのパターンや、その正答パターンをモデル化
    • こうしたモデルを、新たな「間違った英文」に適用することで、誤り箇所とその正答候補を探し出す
  • 現在の校正精度は36.2%
    • 言語学者が人力でデータをつくり、機械学習させる従来手法の校正精度は23%程度だった
    • データの件数を100倍以上に増やすことで、校正精度を13ポイント高めた

大規模AV画像データベースと類似顔画像検索を用いたAV検索システム

「顔画像をもとに似た顔の人が出ているAVを検索するシステム」について書かれた論文。

類似する顔の検索には、HOG 特徴 という特徴量を使用しているとのこと。

実装言語は Python、使用ライブラリは OpenCV, SciPy, Numpy。


指し手を「機械学習」することで将棋アルゴリズムを自動生成
  • 最新の将棋プログラムのアルゴリズムは、コンピュータがプロ棋士による数万局の対局データ(棋譜)を分析し、指し手を「機械学習」することで自動生成されたもの
    • 過去の将棋プログラムのアルゴリズムは、プログラマーが将棋の知識と経験を駆使して手作りしていた
  • ある局面の有利さや不利さを、その局面の「特徴」と「重み」の積の合計として数値化
    • 特徴とは、駒の種類や数、位置関係、王将の危険度といった要素
    • 特徴ごとに重みが設定してあり、「金」なら400点、「飛車」なら700点、王将の近くに敵の駒がある場合はマイナス500点といった具合
  • 機械学習によりこれらの重みを自動調整

no title

Ruby の naivebayes を使用。


あと、「フィードデータをためる方法」で触れられている Fastladder が気になりました。


no title

scikit-learn で線形分離。


no title

K-Means クラスタリング


no title

OpenCV の分類器作成

  • Boosting でのモデル作成
  • LBP特徴量を使用

ちなみにこのテーマについては前段として昨年書いたこの記事もよろしければ併せてお読みください:


no title

言語は Ruby、単語抽出に mecab 使用。

  • 記事に含まれる単語をmecabで抽出
  • → その記事のいいね!数に応じてその単語にポイントを付与
  • → 単語ごとに出現数とポイントをデータベース化して教師データとする

no title

no title

東京都議会議員選挙の党派マニフェストを自動分類したよ - sleeping vote

2009年7月12日投開票の東京都議会議員選挙において、主要6党(自民党、民主党、公明党、共産党、幸福実現党、生活者ネットワーク)の会派マニフェストに書いてある内容を品田方式と呼ばれる選挙研究で使う分類カテゴリに従い、分類したもの

分類作業は、stiqが研究している自然言語処理と機械学習*1の方法を用いて自動分類コーディングシステムを構築し、それを使っています。

具体的なシステムの仕組みは、論文にかかれているとのこと。


500 Internal Server Error

近年、自称作曲家・佐村河内守氏と外見の酷似した人物が増加し、彼らと佐村河内氏とを自動的に見分けるシステムの開発が望まれている。一方で、佐村河内氏は作曲時と謝罪会見時で大きく外見的に変化することが知られており、佐村河内氏を見分けるシステムはそのような変化に頑健である必要があるため、実現は容易ではない。本プロジェクトでは、高度なコンピュータ技術を活用し、佐村河内氏を適切に見分けるシステムを開発する。


以下2つの手法を適用したとのこと。

Fisher Vector Faces [Simonyan et al. BMVC 2013] では、一般の物体の認識に用いられる Fisher Vector (FV) と呼ばれる手法を顔画像へと適用し、顔のパーツを明示的にモデリングせずに、高精度の識別結果を記録した。顔の領域を検出し、顔の向きを合わせるなどの前処理を行った後は、ただ通常の物体認識と同様の手続きを適用するのみである。

DeepFace [Taigman et al. CVPR 2014] は Facebook 社の発表した研究であり、「ほぼ人間並みの識別能力を実現した」として大きな注目を集めた。こちらでは、顔検出と向きの補正を行った後に、Deep Convolutional Neural Networks (DCNN) と呼ばれる手法を用いて識別を行う。こちらも一般の物体の認識に用いられる手法であり、一部に独自の改良を施してはいるが、処理の大筋は顔画像に限るものではない。


(すごい精度・・・!)


*1データマイニングと機械学習を混同するのはよくなさそうで、Wekaはどっちかというとデータマイニングの文脈っぽいですが、せっかくなので一緒に整理しておきます。

2014-04-21

【改訂版】BLE112 / 113 の開発環境を Mac に構築する

iOSデバイス同士とか、既製プロダクトと BLE で通信する場合は Core Bluetooth フレームワークが扱えれば問題ないのですが、新規でウェアラブルデバイスや、iOSと連携する何らかのガジェットとかを開発しようとすると、プロジェクト内の立場上は「iOS エンジニア」だとしても、ある程度 BLE モジュール側のことも知っていないと、ハード屋さんとの意思疎通がなかなか難しい場合があります。(相手がCore Bluetooth等、iOS側に精通していれば話は別ですが。。)


メジャーな BLE モジュールである Bluegiga の BLE112、BLE113 は、「開発キット」 (Development Kit) というものが販売されています。



これらは、ディスプレイ・USBインターフェース・バッテリーボックス・デバッガ・確認用のセンサ等々、BLEモジュールの開発・検証に必要な諸々がボードにビルトインされており、細々と部品を集めて回路を組んだりしなくても、買ってすぐに BLE モジュールのファームウェア開発を始められるようになっています。


ここでは、このDevelopment Kitを使ってBLEファームウェアを開発するのに必要な環境を Mac 上に構築する手順をまとめておきます。


工場出荷時点の Development Kit

BLE112 / BLE113 Development Kit は、購入して電源を入れるだけで、下記のように ディスプレイに温度が表示されます。


f:id:shu223:20140419213520j:image:w400

(工場出荷状態の BLE112 Development Kit)


アドバタイジングも開始されているので、BLExplr や自前 Core Bluetooth 実装等で確認することもできます。


Windows の仮想環境を用意する

関連ツールの何もかもが Windows 版しか用意されてないので、とにかく Windows 環境が必要になります。


ここでは 無料 の仮想化ソフト VirtualBox を用いて、Windows の仮想環境を Mac OSX 上に構築します。


基本的に下記ページの手順通りでうまくいったのですが、


一点だけ違ったのは、 初回起動時に Virtual Disk Image を求められる ことでした(ちなみに私が使用したVirtualBoxのバージョンは 4.3.10 です)。


インストールメディア(Windowsのインストールディスク)の Virtual Disk Image は下記のように作成します。

  1. OSのインストールメディアをドライブに入れる
  2. Disk Utility を起動して [New Image] (→ .dmg ファイルが生成される)
  3. 2で作成した .dmg ファイルを `~/Library/VirtualBox` に置いておく。

あとはダイアログで上記 .dmg ファイルを選択すれば、インストールが始まります。


BGScriptの開発環境を用意する

BGScript 専用のIDE、みたいなのはないので、既存の Windows 用テキストエディタ "notepad++" をカスタマイズして使用します。


notepad++をインストール

ググれば本家ダウンロードサイトも出てきますし、Bluegiga の Documentation and Software のページ からもダウンロードできます。


途中でPlugin フォルダを有効にするかどうかのチェックボックスがあるので、有効にしておきます。


シンタックスハイライトやコード補完が効くようにする

notepad++で、BGScript 編集時にシンタックスハイライトやコード補完が効くようにします。


Bluegiga の Documentation and Software のページ から

[PC Tools] > [BGScript Syntax Highlighting for Notepad++]

をダウンロードし、下記手順を踏みます。

  1. Notepad++ を起動
  2. Notepad++のメニューから [Language] > [Defined your language...] を選択
  3. [Import...] をクリックし、 "userDefineLang_BGScript.xml" ファイルを選択
  4. "BGScript.xml" ファイルを '<NPP-Install-Dir>\plugins\APIs' にコピーする
  5. notepad++ を再起動

Bluetooth Smart Software and SDK をインストール

Bluegiga の Documentation and Software のページ から

[Software Releases] > [Bluetooth Smart Software and SDK v.1.2.2] 

を選び、インストールします。


USBドングルを認識させる

Development Kit に付属している BLE112 USB ドングルを Mac に接続します。


VirtualBoxのWindows環境をシャットダウンさせた状態で、 [Settings] > [Ports] の USB タブを選択し、USB Device Filters に Bluegiga Low Energy Dongle を追加します。


※これをやらないと、仮想環境側にドングルを認識させようとしたときに "USB device in use by someone else" とエラーが出ます(参考記事:linux - Virtualbox: "USB device in use by someone else" error, how to make (mac) host let go? - Stack Overflow


いったんUSBドングルを抜いて、仮想環境を起動し、USBドングルを挿し直すと、ドライバのインストールが開始されます。


デバイスドライバのインストールに成功したら、ドングルは抜いてもOK。


CC Debugger を Windows 側に認識させる

CC Debugger は、BLE112 / 113 (で使用している TI のチップ)のデバッグを行ったり、プログラムを書き込んだりするためのデバイスです。


BLE113 の開発キットでは、CC Debugger は、Development Kit にビルトイン されています。


BLE112 開発キットの場合は、下記のように接続します。


f:id:shu223:20140419214117j:image:w500

(CCデバッガをBLE112開発キットに接続した状態)


そしてボードと Mac を接続し、VirtualBox メニューから

[Devices] > [USB Devices] > [Texas Instruments CC Debugger [xxxx]]  

を選択します。


Windows(仮想マシン)側でデバイスドライバのインストールが開始され、完了すると、デバイスマネージャーで Cebel controlled devices が確認できるようになります。


動作確認

ライセンスキーを控えておく

僕のように、手順を無視して TI の Flash Programmer から書き込んだりすると、License Keyが消えBluegigaにRequestを送って返信を待つ という面倒なことになるので、念のため License Key を控えておきます。


Bluegiga BLE SW Update Tool の "Info" をクリックすると、License Key が表示されます。


f:id:shu223:20140422065155j:image:w482


ビルド&プログラム書き込み

C:\Bluegiga\ble-1.2.2-100\example フォルダか、Bluegiga の Documentation and Software のページ からダウンロードできる Examples から、適当なプロジェクトを選び、BGScriptのプロジェクトファイル(拡張子 .bgproj)を Bluegiga BLE SW Update Tool で開きます。


諸々問題なければ Update ボタンをクリックすればビルド&プログラム書き込みが行われます。


2014-04-19

BLE112 / 113 の開発環境を Mac に構築する

【2014.4.21追記】

本記事は、(記事内にもある通り)不要な手順や推奨できない手順が混じっているので、改めて下記URLに書き直しました。


【改訂版】BLE112 / 113 の開発環境を Mac に構築する


以下は、記録として残しておきますが、正しい手順としては上の記事をご参照ください。



iOSデバイス同士とか、既製プロダクトと BLE で通信する場合は Core Bluetooth フレームワークが扱えれば問題ないのですが、新規でウェアラブルデバイスや、iOSと連携する何らかのガジェットとかを開発しようとすると、プロジェクト内の立場上は「iOS エンジニア」だとしても、ある程度 BLE モジュール側のことも知っていないと、ハード屋さんとの意思疎通がなかなか難しい場合があります。(相手がCore Bluetooth等、iOS側に精通していれば話は別ですが。。)


そんなわけで、Bluegiga の BLE113 の「開発キット」 (Developer Kit) を注文してみました。



・・・のですが、その翌日(これを書いてる今日)に仕事で BLE112 の開発キットを借りることができたので、さっそくそっちで開発環境構築〜動作確認までを試してみたので、その手順をまとめておきます。


BLE113 の開発キットはまだ到着してないのですが、112と基本的にやることは同じだと思います。


工場出荷時点の BLE112 Development Kit

BLE112 Development Kit は、購入して電源を入れるだけで、下記のように ディスプレイに温度が表示されます。


f:id:shu223:20140419213520j:image:w400


アドバタイジングも開始されているので、BLExplr や自前 Core Bluetooth 実装等でも確認することもできます。


Windows の仮想環境を用意する

関連ツールの何もかもが Windows 版しか用意されてないので、とにかく Windows 環境が必要になります。


VirtualBox で Windows 環境をつくる

無料 の仮想化ソフト VirtualBox を用いて、Windows の仮想環境を Mac OSX 上に構築します。


基本的に下記ページの手順通りでうまくいったのですが、


一点だけ違ったのは、 初回起動時に Virtual Disk Image を求められる ことでした(ちなみに私が使用したVirtualBoxのバージョンは 4.3.10 です)。


インストールメディア(Windowsのインストールディスク)の Virtual Disk Image は下記のように作成します。

  1. OSのインストールメディアをドライブに入れる
  2. Disk Utility を起動して [New Image] (→ .dmg ファイルが生成される)
  3. 2で作成した .dmg ファイルを `~/Library/VirtualBox` に置いておく。

あとはダイアログで上記 .dmg ファイルを選択すれば、インストールが始まります。


BGScriptの開発環境を用意する

BGScript 専用のIDE、みたいなのはないので、既存の Windows 用テキストエディタ "notepad++" をカスタマイズして使用します。


notepad++をインストール

ググれば本家ダウンロードサイトも出てきますし、Bluegiga の Documentation and Software のページ からもダウンロードできます。


途中でPlugin フォルダを有効にするかどうかのチェックボックスがあるので、有効にしておきます。


シンタックスハイライトやコード補完が効くようにする

notepad++で、BGScript 編集時にシンタックスハイライトやコード補完が効くようにします。


Bluegiga の Documentation and Software のページ から

[PC Tools] > [BGScript Syntax Highlighting for Notepad++]

をダウンロードし、下記手順を踏みます。

  1. Notepad++ を起動
  2. Notepad++のメニューから [Language] > [Defined your language...] を選択
  3. [Import...] をクリックし、 "userDefineLang_BGScript.xml" ファイルを選択
  4. "BGScript.xml" ファイルを '<NPP-Install-Dir>\plugins\APIs' にコピーする
  5. notepad++ を再起動

Bluetooth Smart Software and SDK をインストール

Bluegiga の Documentation and Software のページ から

[Software Releases] > [Bluetooth Smart Software and SDK v.1.2.2] 

を選び、インストールします。


SmartRF Flash Programmer をインストール

BLE112 / 113 は Texas Instruments (TI) のチップを使用しています。このチップのFlashメモリにプログラムを書き込むためのソフトウェア、Flash Programmer をインストールします。


http://www.ti.com/tool/flash-programmer


CC Debugger を Windows 側に認識させる

CC Debbuger は、BLE112 / 113 (で使用している TI のチップ)のデバッグを行ったり、プログラムを書き込んだりするためのデバイスです。


f:id:shu223:20140419214117j:image:w600

(CCデバッガをBLE112開発キットに接続した状態)


CC Debugger を USB で接続し、VirtualBox メニューから

[Devices] > [USB Devices] > [Texas Instruments CC Debugger [xxxx]]  

を選択します。


Windows(仮想マシン)側でデバイスドライバのインストールが開始され、完了すると、デバイスマネージャーで Cebel controlled devices が確認できるようになります。


動作確認

BGScriptのビルド

BGScript をビルドします。

下記のように bgbuild.exe をコマンドプロンプトから実行するだけです。

C:\Bluegiga\ble-1.2.2-100\bin\bgbuild.exe {プロジェクトファイル.bgproj}

BGScriptのプロジェクトは、C:\Bluegiga\ble-1.2.2-100\Example にいろいろとあります。

ビルド成功すると、 .hex ファイルが生成されます。これがチップに流し込むファイルです。


プログラムを書き込む

注意!!!License KeyがないとBLEのアドバタイジングが停止します。


前述した手順で作成した .hex ファイルを、下記ページのように Flash Programmer から書き込むことができます。


が、冒頭に書いた通り、この方法だと、BLEのアドバタイジングが停止します。


このページ に書いてある通り、

If you're using SmartRF to flash your project, that may be causing a problem with your license key. Using SmartRF does erase the license key from the module, which is specified in the third paragraph of this Knowledgebase article: https://bluegiga.zendesk.com/entries/22442106--HOW-TO-Using-the-BLE...

TI's SmartRF software can flash firmware to BLE113, but the license key is proprietary to Bluegiga, and SmartRF does not and cannot include the key while re-flashing firmware. The easiest way to pull your current key is to connect your module to your CC Debugger, open BLEUpdate, and click Info. If you could post the module's serial and license key, someone from Bluegiga could verify it, or provide you with a valid license key.


というわけで、ライセンスキーを入手して、Flash Programmer ではなく Bluegiga BLE SW Update Tool で書き込みを行うのが正しい手順のようです。。


ライセンスキーを入手する

ライセンスキーは Bluegiga BLE SW Update Tool の "Request license key" をクリックして申請フォームに飛ぶことができます。


f:id:shu223:20140419215011j:image:w488


申請したらすぐに送付されるわけではなく、Bluegigaからの返信を待つ必要があります。。(僕はイマココ)


工場出荷時のファームに戻す

Bluegiga の Documentation and Software のページ からダウンロードできる Examples の中に、DKBLE112_factory というプロジェクトが入っています。全く同じものかはわかりませんが。。


ただ、このファームを Flash Programmer で書き込んでも ライセンスキーがないとBLEのアドバタイジングは開始されない ので、とにかくライセンスキーを入手するまではファーム更新しないのが良さそうです。


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

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 |