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や他のフレームワークに任せるようになっている

2016-09-14

iOS 10の新機能のサンプルコード集「iOS-10-Sampler」を公開しました

iOS 10でも大量のAPIが追加されました。が、新しいAPIはどう使うのか、実際に何がどこまでできるのか、といった具体的なところが、英語のドキュメントやWWDCのセッション動画をながめているだけだと正直あまりピンときません。やはり実際にコードを書いて動かしてみるのが一番わかりやすい・・・ということで今年もつくりました!


iOS-10-Sampler


f:id:shu223:20160914063446j:image:w600


恒例の新機能のサンプルコード寄せ集めアプリです。ソースコードは GitHub に置いてあるので、ご自由にご活用いただけると幸いです。


使い方は Xcode 8 でビルドするだけ なので、デザイナーさんやディレクターさんもぜひお近くのエンジニアにビルドしてもらってください。


f:id:shu223:20160914072119j:image:w600


iOSももうかなり成熟してしまい、話題になる革新的な新機能とか、どの開発者にとっても嬉しい新機能というのはなかなかないわけですが、実装してみると思ったより簡単なので自分のアプリにも取り入れたくなったとか、他の誰も話題にしてないけど自分的には熱いみたいな機能もあったので、ぜひ一度お試しいただけると嬉しいです。


また、Samplerシリーズでは「余計な実装を混ぜずに、新機能のメリットをできるだけシンプルな実装で伝える」というところに気をつけています *1。コピペもしやすいと思うので、自分のアプリに取り入れて動かしてみるとより楽しいかもしれません。


今のところ18個のサンプルが入っています。随時追加していきます。機能追加プルリク大歓迎です!


以下各サンプルの紹介です。


Speech Recognition

新たに追加された Speech Framework を利用した音声認識のサンプルです。


f:id:shu223:20160914070235j:image:w405


Appleのサンプルをベースに、全58種類の対応言語を選択する機能を追加しています。


Looper

AVFoundationに新規追加されたクラス AVPlayerLooper を用いた動画のループ再生のサンプルです。


f:id:shu223:20160914070311g:image:left f:id:shu223:20160914070308g:image



このクラス自体はプレイヤー機能は持っておらず、AVQueuePlayer と AVPlayerItem のインスタンス、そしてループする範囲を示す CMTimeRange オブジェクトを渡して使用します。

public init(player: AVQueuePlayer, templateItem itemToLoop: AVPlayerItem, timeRange loopRange: CMTimeRange)

Live Photo Capturing

写真撮影用に追加された新クラス AVCapturePhotoOutput を使用したライブフォト撮影サンプルです。*2


f:id:shu223:20160914070434j:image:w200


Live Photo のビューワーは iOS 9.1 から使えましたが、今回から撮影もできるようになりました。


Audio Fade-in/out

すごーく地味だし、このAPIがなくてもできたといえばできたことなんですが、実際に使う人は多いかもしれません。AVAudioPlayerにフォードイン/アウトするためのメソッドが追加されました。

// Fade In
player.setVolume(1, fadeDuration: 3)

// Fade Out
player.setVolume(0, fadeDuration: 3)

これタイマーとかでやってた人は嬉しいんじゃないでしょうか。


Metal CNN Basic: Digit Detection

Metal Performance Shaders フレームワークに追加されたCNN (Convolutional Neural Network / 畳み込みニューラルネットワーク)を用いた手書き数字認識のサンプルです。*3


f:id:shu223:20160914070517g:image


この「Metal AcceleratedなCNN計算処理」は個人的には今回一番熱い新機能です。



Metal CNN Advanced: Image Recognition

上のサンプルに引き続き、Metal Performance ShadersのCNNを利用したリアルタイム一般物体認識のサンプルです。*4


f:id:shu223:20160914070509g:image


速くて見づらいかもしれませんが、ノートパソコン(notebook)→ リモコン(remote control) → iPhone(iPod)と認識しています。


Metal ShaderというぐらいなのでGPUで処理されます。6s利用ですが、処理速度も申し分なしでした。(ちなみにMetalはAppleのハードウェアに最適化されたグラフィックスAPIで、「OpenGLより最大10倍速い」と言われています)


ちなみにミスリードもあるかもしれないので念のためですが、「一般物体認識」という新機能があるわけではないです。本サンプルで使用しているモデルはImageNetデータセットを用いてInception v3ネットワークをTensorFlowで学習させたもので、新機能はあくまで「Metal(GPU)でCNN処理」という部分になります。


PropertyAnimator: Position

アニメーション用の新クラス、UIViewPropertyAnimatorを用いて UIView オブジェクトの位置と、背景色をアニメーションさせるサンプルです。


f:id:shu223:20160914070727g:image


画面上をタッチしたままグリグリと動かしてみてください。touchMovedが呼ばれるたびにアニメーションが追加するという単純な処理をやっているのですが、いい感じに追随してくれるのが今回のクラスがアニメーションの追加をいい感じにやってくれてる *5 おかげなのかなと。


PropertyAnimator: Blur

UIViewPropertyAnimator の `fractionComplete` を用いて UIVisualEffectView / UIBlurEffect のブラーをアニメーションさせるサンプルです。


f:id:shu223:20160914070720g:image


やってることは超シンプルで、`effect` プロパティから UIBlurEffect を削除する処理を UIViewPropertyAnimator に登録しておいて、

animator = UIViewPropertyAnimator(duration: 0, curve: .linear) {
    self.effectView.effect = nil
}

スライダーの値に応じて `fractionComplete` を変化させています。*6

@IBAction func sliderChanged(sender: UISlider) {
    animator.fractionComplete = CGFloat(sender.value)
}

Preview Interaction

新クラス、UIPreviewInteraction で、3D Touchでピーク&ポップするサンプルです。


f:id:shu223:20160914070939g:image


Notification with Image

新しい通知のフレームワーク、UserNotifications framework を用いて、画像付きローカル通知を発行するサンプルです。


f:id:shu223:20160914033106j:image:w200:left f:id:shu223:20160914033113j:image:w200



Sticker Pack

iMessage のステッカーパックのサンプルです。


f:id:shu223:20160914032800j:image:w200


Messagesってメッセンジャーアプリとしてどれだけのシェアがあるの?という声も効きますが、ステッカーパックは画像をアセットカタログに入れていくだけの超超簡単実装なので、いい感じの画像を持っているアプリはやっといて損はないのかなと。


Core Data Stack

NSPersistentContainer を使うと Core Data の実装がシンプルになるよ、というサンプルです。


f:id:shu223:20160914034038j:image:w200


noliliさんよりpull requestいただきました!


TabBar Customization

UITabBarのバッジをカスタマイズするためのAPIが追加されました。*7


f:id:shu223:20160914034330j:image:w200


センスがなく、全然いい感じにカスタマイズできてないのが心残りですが。。


New filters

CIFilterで追加されたフィルタのサンプル。


f:id:shu223:20160914034350j:image:w200:left f:id:shu223:20160914034353j:image:w200



前回は豊作だったのですが、今回はちょっとしかありませんでした。。


New Fonts

新規追加されたフォントのサンプル。こちらも今回は少なく、4種だけ。*8


f:id:shu223:20160914034359j:image:w200


Proactive: Location Suggestions

NSUserActivityに新たに追加された `mapItem` プロパティを用いた "Location Suggestions" のサンプル。


f:id:shu223:20160914054654j:image:w200:left f:id:shu223:20160914071309j:image:w200



いわゆる「Proactive」というやつで、Appleから出てるサンプルがあるのですが、どの実装が何に効いているのか、というかこのサンプルをどう試すのか、というのがちょっとわからず(WWDCセッションをちゃんと見ればいいのかもしれませんが)、下記記事に助けられました。


Attributed Speech

AVSpeechUtterance に、NSAttributedStringを渡せるイニシャライザが新たに追加されたので、これを試すデモです。


NSAttributedString は文字列に色んな属性を指定できるわけですが、


これを音声合成の「Utterance」に渡せるということは、例えば、NSFontAttributeNameを用いてある範囲のフォントをboldにすると、その部分だけ強調されて発声されるとか、何か別の属性を使ってアクセントを制御できるとか、そういうことを期待したわけです。


が、結果は・・・何も起こりませんでした



同ツイートのメンションで岸川さんから `kCTLanguageAttributeName` で言語を切り替える、`kCTRubyAnnotationAttributeName` でルビをふる、といった文字列だけではなくて音声にも有用そうな属性を示唆いただきましたが、これらを試してみてもやはりあり/なしで違いは発声しませんでした。


何か私の実装が間違っているのかもしれませんし、プルリクをいただけるかもしれないので、サンプルとしては残してあります。


Haptic Feedback

iPhone 7のTapticEngineを利用するフィードバックのサンプルです。UI

ImpactFeedbackGenerator、UINotificationFeedbackGenerator、UISelectionFeedbackGeneratorの全てのパターンを試せます。


f:id:shu223:20170103172859j:image:w200


所感

箇条書きで。。

  • Notificationのカスタマイズ、ロック画面でプレビューは嬉しい
  • 標準で、ローカルで音声認識ができるようになったのも嬉しい
  • MPSCNNは熱いのでここはもっと勉強したい
  • iMessage app / Sticker Pack は当初まったく期待してなかったけど自分でやってみるとその簡単さとやっておいて損はない(親アプリがiOS 9でもok)という点で意外と熱い
  • UIViewPropertyAnimator、あまりワクワクするような新しさのあるものではなかったが、従来のものよりは便利なのでiOS 10以上のアプリでは普段使いすると思う
  • 3D TouchでPeek&Popは3D Touchデバイスが普及するまでは静観
  • Proactiveは今は静観
  • SiriKitは良いサンプルが思いつかず今回は入れなかった

デュアルカメラとか、Taptic Engine APIとか新デバイス系はまた後ほど。


おわりに

最初は個人的な勉強として始めたものがすっかり恒例になって、もうかれこれ4年もこれをやっています。


f:id:shu223:20160914061757j:image:w320


これがまぁなかなか大変で、それなりに時間がかかるので、周りの人には毎年「今年はやらないかも」とか毎年言ってて、なんだかんだやっぱり今年もつくってしまったという。







まぁ自分はやっぱり「新しいAPIが追加されると開発者としてできることが増える」のが好きなのと、(冒頭に毎年書いていることですが)自分で手を動かさないと全然理解できないというのがあるので、これはやっぱり続けた方がいいなと。


そんなわけで Apple Watch Series 2 が届いたら「watchOS-3-Sampler」もつくりたいと思います!


*1:Appleによる公式サンプルではアプリとしての体裁を整えるために新機能とは直接は関係ない実装がたくさん入っていたりしてややこしくなっているケースが多々ある

*2:Appleの「AVCam」サンプルをベースに、Live Photo撮影の実装だけを抜き出し、シンプルにしたもの

*3:本サンプルは、Appleの「MPSCNNHelloWorld」サンプルをベースに、不要な実装を除去しシンプルにしたもの

*4:本サンプルのモデルデータと、ネットワークの実装は、Appleの「MetalImageRecognition」サンプルをベースにしています

*5:WWDC16のセッション216でそんな感じのことを言ってました

*6:この手法は、こちらのコードで知りました: https://github.com/manuelCarlos/IOS10-Animate

*7:これらの追加APIについては、こちらの記事で知りました: no title

*8:しかもFutura、AmericanTypewriterは従来からあるfamilyの太さ違い

2016-02-01

第2回フリーランス海外遠征と2016年の生存戦略

1/12〜30の19日間、とあるスタートアップのお手伝いでドイツの首都ベルリンに行ってまいりました。


f:id:shu223:20160201082426j:image:w600

(今回の雇い主、Norman氏と、ベルリン大聖堂前にて。)


「あれ、前も行ってなかったっけ?」と思ったかもしれませんが昨年11月に行ったのは同じドイツでもバンベルクという都市で、今回とはお手伝いした会社も別です。


きっかけ

昨年9月にベルリンに行った際にお会いした方よりご紹介いただきました。今回お手伝いした会社のCEO、Norman氏がiOSエンジニアを探してるという話が出た際に、僕のことを思い出して繋いでくれたと。


「フリーランスです、iOSが得意です、海外のお仕事大歓迎です」と何ができる/やりたい人かをなるべく多くの人に言っておくといいことあるなぁ、とあらためて思いました。


条件面の調整

既にNorman氏の中でタスクリストとスケジュールが決まってて、

  • 全日程分の報酬
  • +航空券
  • +住居

最初のメールで明示されていました。


僕を使うかどうか判断するための面接みたいなものはなく、たぶんLinkedInプロフィールやGitHubアカウントでスクリーニング的なことは完了していたものと思われます。


で、少しだけ金額面で交渉させてもらって *1、あとはスケジュールについて「順調にいけばそんなな感じのスケジュールで進むかもしれないけど、大抵なんやかんや想定外のことが起こるものなので、全部のタスクはできないかもしれないよ」というところは事前に言って承知していただきました。(このあたりの見積もりの考え方は こちらの記事 にも書きました)


やったこと

例によって詳しい内容はconfidentialですが、もちろんiOSアプリ開発ではあります。


利用技術的にはわりとオーソドックスなもの(一般的なUI+画像処理+ソーシャル機能)なので、漫然と作業すると既存スキルでの時間の切り売りになってしまうので、なるべくSwift的な書き方で書くようにとか、技術的にも何かしら得るものがあるように意識して作業してました。


あと数年ぶりに In-App Purchase の実装をしたのも勉強になりました。*2


勤務時間は8:30〜17:30ぐらい。後述するように僕が住んでいたところがオフィスでもあるので、朝Normanが来て、一緒に仕事して、17:00〜17:30のキリがいいところで彼が帰る、という感じでした。 *3


前倒しで作業を終えてフリータイムに

当初の予定では 12日間 + 残りはフリータイムというスケジュールでしたが、10日目で前倒しで作業が無事完了したので、余った2日分はお金いらないのでそこもフリータイムにしてほしい、と申し出ました。


というわけでまるまる1週間を自由に過ごせることになり、現地のSwift勉強会に行ったり、


f:id:shu223:20160130094423j:image:w600


あとは去年から始めたもののなかなか手を付けられてなかったプライベートな開発をやったりしてました。ひとりだとどうしてもサボってしまいがちなので、現地で起業した日本人スタートアップのオフィスに毎日のようにお邪魔して作業させてもらったり、知り合いのエンジニアをさそってもくもく開発したりしてました。観光とかは結局ほとんどしませんでしたが、超有意義に過ごせたと思っています。


暮らし

オフィスが普通に住めるアパートなので、そこに住まわせてもらってました。ベルリンの一等地にあるビルの最上階にあり、見晴らしもよく、シャワーやら何やらすべて完備で最高に快適でした。


f:id:shu223:20160201083129j:image:w600

(オフィス兼宿。ベッドはロフトにあります)


食事は周囲にレストランがたくさんあるので、毎日「今日は○○料理が食べたい」みたいな感じでリクエストして、Normanにおすすめの店に連れて行ってもらう、みたいな感じで飽きることがなく、食生活の面でも充実してました。


英語

最近海外案件を受けるようにしているのは、単純に海外に行くのが楽しいし嬉しい、という以外に、ずっと苦手意識のある英語をそろそろ何とかしないと、ということで自分を英語を使わざるをえない環境に追い込むという目的もあります。


たかが2週間ちょっとでいきなり飛躍的に英語力が向上するわけもないのですが、マシになってきた気はします。Normanと飲みにいってわりと込み入った話をしたり。この仕様はこうこうこういう理由でおかしいからやめたほうがいい、と進言したり。


まぁ、彼が文脈を大いに汲んで理解してくれる、というところも大きいですが。。


ただやっぱりまだまだです。相手がこちらに歩み寄りつつコミュニケーションしてくれる、という前提の上であれば大丈夫なのですが、そうでないケースでの雑談とかはまだまだ厳しいです。引き続き機会を増やしていこうと思います。


課題

まず、海外で仕事して毎回感じることですが、いつもと違う国にいるというだけで、いつもと同じような仕事をしててもめちゃくちゃ楽しいです。たとえば、Auto Layoutの制約をポチポチ貼ってるだけでも「うぉー楽しい!」って思います。こういう高揚感は大事にしていきたいなと。


一方、これもベルリンだけでなくシリコンバレー等に行っても毎回感じることですが、「無力感」があります。仕事をやってみたりハッカソンに出てみたりして、技術的には大丈夫だと思ってますが、誰も僕のことを知らないし(知名度以前に知り合いがいないという意味で)、そういう僕がベルリンに行ったところで、現地の他のスタートアップの方から「会いたい」とか言われることはありません。ミートアップに出ても誰にも話しかけられないし、ましてや人に紹介されることもありません。


で、自分から現地のスタートアップにアポとって会いに行ったり、ミートアップで話しかけたり、といったことをすればいいのですが、それで仕事をゲットできたとしても、それは理想的な状況ではないのです。


これまで僕は数々の魅力的なBLE関連プロダクトに(多くの場合はゼロからアプリを開発するところから)関わらせていただきましたが、


たとえば僕がニュースとかで海外のそういう系の魅力的なプロダクトを知ってからその会社に自分を売り込むのではもう遅くて(メディアに出て話題になっているということはある程度開発が進んでいるか完了しているケースが多い)ファウンダーが資金調達して本格的に開発をしようとするタイミングであちらから見つけてもらえるようにならないといけない。


海外から見つけてもらうためのチャネルをつくる

LinkedIn や AngelList で人を探す場合は大抵「住んでいる場所」でフィルタされてしまうし、このブログとかQiitaとか登壇資料といった僕のアウトプットは日本語ばかりなので、そもそも海外から見つけてもらうためのチャネルが今はない状況。


GitHubアカウントは現状でも多少そういう感じの機能をしてくれてますが、

iOS Samplerシリーズのスター数に関して言えば、スクリーニングフェーズで僕が悪くないエンジニアであることを判断する材料ぐらいにはなってると思うものの、海外に住んでるエンジニアを選ぶ「きっかけ」になるほどの効力はない、と思っています。エンジニアにとって役立つ内容なので多くのスターをもらえてはいるものの、要素技術でみれば誰にでもつくれるものではあるので。


逆に、watchOS-2-Samplerはそんなにスターついてないけど、「(現時点ではニッチな)watchOS 2の開発経験のあるエンジニア」というところで海外から僕を選ぶ「きっかけ」になってくれたわけで、そういうリポジトリを増やしていかないと、と。


長々と書きましたが、2016年の方針としては、もっと海外のお客さんに自分を見つけてもらえるように、

  • 英語でブログを書く
  • 「ニッチスキルに関わる」OSSをGitHubに積極的に上げていく
  • 海外にいったらLT枠とかに応募してみる

といったあたりをがんばっていきます。


*1:海外オファーはレアなので最初に提示された価格でも受けたとは思いますが、普段よりもかなり低めのだったので一応

*2:数年前にローカルにまとめてた実装手順のメモがあったのですが、その頃のコードの酷いこと。。

*3:僕のプライベートを邪魔しないように気遣ってくれてるのか、いつもいそいそと帰る。あと絶対にいきなり部屋に来たりしない

2016-01-05

ディープラーニングの有名ライブラリ5種を最短距離で試す半日コース(TensorFlow, Chainer, Caffe, DeepDream, 画風変換)

「いつか勉強しよう」と人工知能/機械学習/ディープラーニング(Deep Learning)といったトピックの記事の見つけてはアーカイブしてきたものの、結局2015年は何一つやらずに終わってしまったので、とにかく一歩でも足を踏み出すべく、本質的な理解等はさておき、とにかく試してみるということをやってみました。


試したのは、TensorFlow、Chainer、Caffe といった機械学習およびディープラーニングの代表的なライブラリ/フレームワーク3種と、2015年に話題になったディープラーニングを利用したアプリケーション2種(DeepDream、chainer-gogh)。


f:id:shu223:20160105091448j:image:w600

(DeepDreamで試した結果画像)


タイトルに半日と書きましたが、たとえばTensorFlowは環境構築だけなら10分もあれば終わるでしょうし、Chainerなんてコマンド一発なので5秒くらいです。Caffeは僕はハマりましたが、うまくいった最短手順を書いているので、同じ環境の方はすんなりいくかもしれません。


おすすめは、Chaffe&DeepDream(要Caffe) は飛ばして、TensorFlow, Chainer&画風変換を試すコースです。環境構築にハマらないので簡単に終わると思います(実行時間はかかりますが)。僕のように「気にはなってたけど全然触ってない」という方はぜひ今日の昼休みにでもお試しください!


試した環境:

  • Mac OS X 10.11.1 El Capitan
  • Xcode 7.2 インストール済み

TensorFlow

2015年11月に発表された、Google製の機械学習ライブラリ。「テンソルフロー」と読むそうです。同社のサービスでも実際に使われているとのこと。

よく話を聞く音声認識や翻訳だけでなく、Googleフォトの被写体認識や顔認識、ウェブ検索結果の最適化、Gmailのメール分別、新生メールソフトInboxの自動返信文作成、さらにYouTubeや広告事業まで、ほとんどのプロダクトを支える新たな根幹技術となっています。

TensorFlow の特徴は、データフローグラフとして表せればなんでも処理でき、その気になればローレベルのオペレータも手書きできる汎用性、Googleの実製品で使われる高いパフォーマンス、CPUでもGPUでも走りノートPCから巨大なデータセンターまで同じコードで動きモバイル端末にもデプロイできるスケーラビリティ、計算機科学の研究から実プロダクトまで扱える効率性、ドキュメンテーションやサンプルが揃いPythonでもC++でも書ける扱いやすさなどなど。


オープン化の狙い

ライセンスは商用利用も可能な Apache 2.0 で、自社製品のコアにもなっているこんなすごいものをなぜ Google はオープン化したのか?というところは気になるところです。

TensorFlowをオープンソース化することで、学術研究者からエンジニア、趣味として取り組むユーザーまで、あらゆる人々の機械学習コミュニティーが、研究論文よりも動作するコードを介してアイデアを格段にすばやく交換できるようになると期待している。これが機械学習に関する研究の促進につながり、最終的に技術がすべての人々にとってより適切に機能するものになるだろう。さらに、TensorFlowの応用分野は機械学習だけにとどまらない。タンパク質のフォールディングから宇宙データの処理にいたるまで、非常に複雑なデータの解明に取り組むあらゆる分野の研究者らにとって有用であるかもしれない。


Googleいわく、機械学習はこれからの画期的なプロダクトや技術に欠かせない重要な要素となるもので、世界中で研究が進められているものの、標準となるツールが存在していないことが課題。Google では TensorFlow を研究者から学生、製品開発者まで使える標準ツールとして提供することで、機械学習や機械知能そのものの研究と普及を加速したい考えです。


環境構築手順(所要時間:10分)

OS X El Capitan (10.11.1) へのインストール手順です。


1. pip をインストール

$ sudo easy_install pip

2. Virtualenv をインストール

$ sudo pip install --upgrade virtualenv

3. Virtualenv 環境を作成(下記コマンドだと `~/tensorflow` につくられる)

$ virtualenv --system-site-packages ~/tensorflow

4. つくった環境をアクティベート

$ source ~/tensorflow/bin/activate

→ コマンドプロンプトが変わる


5. TensorFlow をインストール

(tensorflow)$ pip install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.5.0-py2-none-any.whl

Successfully installed numpy-1.10.2 six-1.10.0 tensorflow-0.5.0


以上です。


動作確認:Hello World を実行してみる

スクリプトを作成し、適当なファイル名で保存します。

import tensorflow as tf
import multiprocessing as mp
 
core_num = mp.cpu_count()
config = tf.ConfigProto(
    inter_op_parallelism_threads=core_num,
    intra_op_parallelism_threads=core_num )
sess = tf.Session(config=config)
 
hello = tf.constant('hello, tensorflow!')
print sess.run(hello)

TensorFlow 環境で実行します。

(tensorflow)$ python {ファイル名}.py

実行結果:

I tensorflow/core/common_runtime/local_device.cc:25] Local device intra op parallelism threads: 4

I tensorflow/core/common_runtime/local_session.cc:45] Local session inter op parallelism threads: 4

hello, tensorflow!


参考ページ:


手書き数字を学習してみる

TensorFlow オフィシャルページに、「MNIST For ML Beginners」という手書き文字データセットを利用したチュートリアルがあります。

f:id:shu223:20160105090618p:image

(MNISTデータセット)


ここでは一番手っ取り早そうな、公式チュートリアルのコード(GitHubにある)を実行する方法を試すことにします。


ソースコードを clone してきて、

$ git clone --recurse-submodules https://github.com/tensorflow/tensorflow

fully_connected_feed.py の30,31行目を次のように修正します。*1

  • 修正前
from tensorflow.examples.tutorials.mnist import input_data
from tensorflow.examples.tutorials.mnist import mnist
  • 修正後
import input_data
import mnist

fully_connected_feed.py を実行します。

$ cd tensorflow/
$ python tensorflow/examples/tutorials/mnist/fully_connected_feed.py 

MNISTデータセットを手動でダウンロードしたりする必要はなく、このスクリプトがデータセットの取得からモデルの学習までやってくれます。


実行結果:

Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.

Extracting data/train-images-idx3-ubyte.gz

//中略

Step 0: loss = 2.32 (0.025 sec)

Step 100: loss = 2.19 (0.003 sec)

Step 200: loss = 1.97 (0.003 sec)

//中略

Step 1900: loss = 0.46 (0.004 sec)

Training Data Eval:

Num examples: 55000 Num correct: 49489 Precision @ 1: 0.8998

Validation Data Eval:

Num examples: 5000 Num correct: 4534 Precision @ 1: 0.9068

Test Data Eval:

Num examples: 10000 Num correct: 9019 Precision @ 1: 0.9019

データセットのダウンロード、トレーニング、テストデータでの評価が行われています。最終的な精度は約90%。


参考ページ:


学習結果を可視化する TensorBoard を試す

なんと、学習結果をグラフにしてくれたり、モデルをビジュアライズして表示してくれる TensorBoard というものも用意してくれているようです。


学習経過のログデータのあるディレクトリを絶対パスで指定 *2 して `tensorboard` コマンドを実行すると、

$ tensorboard --logdir=/Users/xxxx/xxxx/tensorflow/tensorflow/data

TensorBoard が起動します。

Starting TensorBoard on port 6006

(You can navigate to http://localhost:6006)


で、このURLにブラウザからアクセスするとGUIが表示され、


学習回数とxentropy_mean(交差エントロピー)の関係を示すグラフや、


f:id:shu223:20160105090658j:image:w400


モデル(ニューラルネットワーク)を可視化したものを見ることができます。


f:id:shu223:20160105090721j:image:w538


More

Chainer

Preferred Networks社が開発したニューラルネットワークを実装するためのライブラリ。2015年6月公開。特徴としては、

  • Python のライブラリとして提供
  • あらゆるニューラルネットの構造に柔軟に対応
  • 動的な計算グラフ構築による直感的なコード
  • GPU をサポートし、複数 GPU をつかった学習も直感的に記述可能

が挙げられています。


TensorFlow との比較

上記特徴を見ると TensorFlow とポジショニング的には似ているように見えたので、どんな違いがあるのかググッてみました。

たぶんできることそのものに大きな違いはないんだろうけど、Chainerの場合マルチGPUにするときには自分でGPUの管理をしなきゃなんないのが、TenrorFlowだともうちょっとラクなのかなあと思ったりする。


TensorFlow、GPU使うのにリビルドが必要で、そのためにbazelが必要で、そのためにJava8が必要で、しかもGPUにCC3.5以上の制約があるみたいで、使えるなら使えば?感が凄い。同じPythonならChainerの方が敷居が低く感じる。


TensorFlowはDistBeliefの2倍の速いそうなのですが、Chainerはそれを上回っていました。

記述量的にはそこまで変わらないですし個人的にはChainerの方が扱い易いというのが感想です(慣れの問題だとは思いますが。)。


TensorFlow,Chainerとも精度は同じでした。そもそもMNISTは問題が簡単なのでDeep Learningでなくても高い精度が出るそうです。実行時間はChainerの方が速かったのです。


インストール手順(所要時間:5秒)

公式ドキュメントに Install Guide というページがあるのですが、Ubuntu, CentOS 向けに書かれているようなので、Mac向けのはないかなと探してたら、本家Webサイトに QUICK START という項目がありました。


やることは

$ pip install chainer

これだけ。


Successfully installed chainer-1.5.1 filelock-2.0.5

素晴らしい!


手書き数字を学習してみる

公式リポジトリにサンプルが用意されています。cloneしてきてスクリプトを実行するだけ。

$ git clone https://github.com/pfnet/chainer.git
$ python chainer/examples/mnist/train_mnist.py

MNISTデータセットのダウンロードと、学習、テストが行われます。

load MNIST dataset

Downloading train-images-idx3-ubyte.gz...

(中略)

epoch 1

graph generated

train mean loss=0.190947790003, accuracy=0.942850003242

test mean loss=0.0990746175707, accuracy=0.96930000484

(中略)

epoch 20

train mean loss=0.0104963570454, accuracy=0.996966669559

test mean loss=0.102703116325, accuracy=0.982000006437

最終的な識別精度は98%になったようです。


More

Caffe

C++で実装されたディープラーニングのオープンソースライブラリ。カリフォルニア大学バークレー校の研究センターBVLCが中心となって開発、C++・Python・MATLABで利用可能。


具体的な公開日はわかりませんが、ChainerやTensorFlowの登場以前から存在する分、ネットで見つかるおもしろそうなディープラーニングを利用した研究や試みはCaffeをベースにしたものを多く見かける気がします。


環境構築手順(所要時間:約4時間)

所要時間は個人差(環境差)があると思いますが、確実にTensorFlowやChainerよりは時間がかかると思います。依存ライブラリが多く、その中にはインストールの待ち時間が長いものがありますし、各自の環境に依存した設定を手動で行う必要があるので、そのあたりでハマることもあると思います。また個人的にはnumpyのバージョンが違うというエラーにかなり悩まされました。


GPUが絡むとハマりそうなのでCPUモードで、インストールしていきます。PyCaffeも入れます。


1. 諸々インストール

$ brew install --fresh -vd snappy leveldb gflags glog szip lmdb
$ brew tap homebrew/science
$ brew install hdf5 opencv
$ brew install --build-from-source --with-python --fresh -vd protobuf
$ brew install --build-from-source --fresh -vd boost boost-python
$ brew install openblas

※1 opencv のインストールはかなり時間がかかります。

※2 OpenBLAS は入れなくてもいいそうですが(Macでは標準でBLASが入っているとのこと)、この後の手順で Makefile の `BLAS_INCLUDE` のパスを修正したりしてから make を実行しても `fatal error: 'cblas.h' file not found` が出てしまうので、入れることにしました。


2. caffe をclone してきます。

$ git clone https://github.com/BVLC/caffe.git

3. Makefile.config を雛形からコピーしてきて、編集します。

$ cd caffe
$ cp Makefile.config.example Makefile.config

  • `# CPU_ONLY := 1` のコメントアウトを外す
  • `BLAS := atlas` を `BLAS := open` に変更する
  • 以下のコメントアウトを外す
# BLAS_INCLUDE := $(shell brew --prefix openblas)/include
# BLAS_LIB := $(shell brew --prefix openblas)/lib
  • `PYTHON_INCLUDE` のパスを自分の環境に合わせて書き換える *3
    • 修正前
PYTHON_INCLUDE := /usr/include/python2.7 \
    /usr/lib/python2.7/dist-packages/numpy/core/include
    • 修正後
PYTHON_INCLUDE := /usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/include/python2.7 \
    /usr/local/lib/python2.7/site-packages/numpy/core/include/


4. ビルド&テスト。

$ make clean
$ make all -j4
$ make test -j4
$ make runtest

ここでエラーがでなければインストール成功です。

[ PASSED ] 927 tests.


5. caffe/python フォルダに移動し、PyCaffe に必要なライブラリをインストールします。

$ cd python/
$ for li in $(cat requirements.txt); do sudo pip install $li; done 

6. PyCaffe のビルド

$ cd ../
$ make pycaffe
$ make distribute

7. Caffe用の環境変数を設定します。~/.bashrc に下記を追記し、

export PYTHONPATH={caffe/pythonのパス}:$PYTHONPATH

`source ~/.bashrc` で反映します。


8. 動作確認

PythonのインタプリタからCaffeをimportしてみて、問題が起きなければOK。

$ python 
>>> import caffe

ちなみに本記事では最終的にうまくいった手順のみを書いていますが、大いにハマったトラブルシューティングの過程も別記事として書いておきました。


参考ページ:


DeepDream

ここからひとつレイヤーは上がって、ディープラーニングライブラリ/フレームワークを利用した応用アプリケーション的なものをいくつか試してみます。


DeepDream は 2015年7月にGoogleが公開 したOSSで、

画像から少しでも見覚えのある物体を見つけ出し、それを再構成して出力する

人工神経回路網は10〜30のレイヤーから構成されており、1枚目のレイヤーは画像の情報をインプットして「角」や「端」を探し、2枚目・3枚目と続くレイヤーは基本的な物体の情報を把握、最終的なレイヤーが情報を組み立てて物体が「何か」を判断する、という仕組みです。

というもの。


環境構築の手順(所要時間:10分)

要Caffe(インストール手順は上述)。Caffeさえ入っていればさっくり試せます。


1. iPython notebook を入れます。*4

$ pip install ipython
$ pip install ipython[notebook]

2. Caffe のあるフォルダと同階層に DeepDream のソースを clone します。

$ git clone git@github.com:google/deepdream.git

3. ここ から学習済みのcaffeモデルをダウンロードし、{caffeのパス}/models/bvlc_googlenet/ に保存します。


試す

cloneしてきたdeepdreamフォルダに移動し、iPython notebookを起動します。

$ cd deepdream
$ ipython trust dream.ipynb
$ ipython notebook

ブラウザが立ち上がるので、dream.ipynb を選択して、上部にある再生ボタンをポチポチ押していき、最後まで到達したらしばらく待っていると・・・ deepdream/frames/ フォルダに結果画像が 0000.jpg, 0001.jpg, ...と出力されていきます。


f:id:shu223:20160105091354j:image:w600

(左:0000.jpg と、右 0010.jpg)



手っ取り早く好きな画像で試したい場合は、sky1024px.jpg にリネームして同じ場所に置いておけばOKです。または dream.ipynb の画像名を指定している箇所を編集します。


さわやかな食事風景が、

f:id:shu223:20160105091426j:image:w600


こうなりました。

f:id:shu223:20160105091448j:image:w600



参考記事:


画風変換アルゴリズム chainer-gogh

mattya氏が2015年9月に公開した、Deep Neural Networkを使って画像を好きな画風に変換できるプログラム。


Chainerを利用。アルゴリズムの元論文は A Neural Algorithm of Artistic Stlye


環境構築の手順(所要時間:1分)

1. ソースを clone してきます。

$ git clone https://github.com/mattya/chainer-gogh.git

2. モデルを下記URLからダウンロードし、cloneしてきた chainer-gogh フォルダ配下に置きます。


実行する

お手軽にCPU実行してみます。コンテンツ画像(input.png)とスタイル画像(style.png)を用意して chainer-gogh フォルダ配下に置き、スクリプトを実行するだけ。

python chainer-gogh.py -m nin -i input.png -s style.png -o output_dir -g -1

f:id:shu223:20160105091523j:image:w600

(左:input.png、右:style.png)


f:id:shu223:20160105091655p:image

(結果画像)


今後の展望

今回は環境構築と既に用意されているサンプルを実行してみただけなので、次のステップとしては、下記記事の例のように、OpenCVを活用して自前データセットつくって、Chainer なり TensorFlow なりで画像識別をやってみたいと思っています。

ただデータセット収集はそれなりに時間かかりそうなので、下記記事のように既存のデータセットを Chainer および TensorFlow に食わせるところから始めるのが現実的かも。


また、iOSエンジニアとしては、モバイルデバイスでの利用についても模索したいと思っています。

あらかじめ学習済みモデルを用意して識別専用として利用するだけなら可能なのか、学習機能自体をモバイル側でやってみたらどんだけ重いのか(そもそもできるのか)とか。TensorFlow は「モバイル端末にもデプロイ可能」と謳ってますし。


あと、画像以外にも、自然言語処理への利用等も試してみたいです。


おわり。


*1:これをやらないと、実行時に "ImportError: No module named examples.tutorials.mnist" というエラーが出ます。

*2:パスが間違ってても TensorBoard は起動するのですが、アクセスしてもグラフ等は表示されません。

*3:`/usr/include` が最近のOSXでなくなってることに関しては、`$ xcode-select --install` をすればいいみたいなのですが、古いコマンドラインツールをダウンロードしないといけないっぽく、あまりXcodeまわりの環境をいじりたくないので直接pythonのincludeパスを指定するようにしました

*4:なぜか ipython: command not found になったので こちら を参考にインストールしなおしました

2015-12-31

フリーランス2年目の振り返りと反省

2014年2月に独立して、ほぼ2年が経ちました。今日は大晦日ということで、2015年の仕事やらプライベート活動やらを振り返ってみたいと思います。

仕事

今年は全部で13社の開発をお手伝いさせていただきました。


多くの企業様と関わらせていただきましたが、合計10人日以上お手伝いしたのはうち4社だけで、1日や2日だけのところもあります。


・・・という話をするとたまに誤解されることもあるのですが、僕はアドバイザー・コンサル的な仕事はやってなくて、手を動かしてプログラムを書く仕事だけをやっています。(技術顧問としてプレスリリースがあった Sansan さんでも、普通にBLE関連機能の開発をしつつ、ちょっとミーティングにも同席したりもしますという感じでお手伝いさせていただいています)


自分のフリーランスとしての働き方・考え方等はこちらの記事に書いてあります。


f:id:shu223:20151231175554j:image:w400

大晦日(今日)に届いたBONX!


イベント・勉強会への登壇

技術勉強会

新しい技術を勉強しなきゃとは思いつつも誰からもプレッシャーがないフリーランスという身なので、勉強会発表ドリブン *1 で興味のあることを勉強するようにしています。

自分の勉強のためにやっていることではあるのですが、毎回新しく調査して、サンプルつくって検証して、というところからやってるので、調査・発表資料作成を合わせると、丸1日〜3日ぐらいかかっていて、お仕事との兼ね合いが毎回大変です。。


イベント登壇

こっちは技術勉強会とは目的がちょっと違ってて、どっちかというと「iOSアプリ開発を頼める誰か」ではなく「iOSエンジニア堤」を立てたい的な意味合いで、お声がけいただければできるだけ出るようにしています。

ただ自分のトーク力は「いかにもエンジニア」レベルで、話を聞きに来ていた方から次の登壇の依頼が来て・・・と繋がっていかないので、このへんは出させていただくからにはもっとしっかりしないとなぁ、と。


インタビュー等

プライベートワーク

書籍執筆

順番的に記事の下の方での登場になってしまいましたが、BONXと並んで今年一番時間をかけた仕事の一つ。

本気か冗談か、「本の印税で儲かってるんでしょ〜」と言われることがありますが、技術書なんてもともと部数が出ないジャンルで、その中でも Bluetooth Low Energy という超ニッチな分野。どう転んでもベストセラーにはならないでしょうし、開発仕事を数日やった方が儲かる、というレベルです。そして人にもよると思いますが、本を書くというのはかなりの苦行で、開発仕事の方が遥かに楽しいです。本書も例によってかなりの難産でした。。


そんなニッチな本著ですが、この分野に参画する人達の間で地道に売れ続け、なんと増刷の運びになりました。達人出版会さんで販売されている電子書籍版もアップデートされています。サンプルも Swift 2 / Xcode 7 / iOS 9 対応済み です。


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


オープンソース

今年新規公開したもの。


iOS-9-Sampler は GitHub の Trending (要はStarランキング)の Daily / Weekly / Monthly すべてで1位、つまり世界1位を獲得しました。


Trending1位は iOS7-Sampler, iOS8-Sampler, AnimatedTransitionGallery につづいて4度目です。


サンプラーシリーズは(たかがサンプル集とはいえ)地味に大変で、ほっとくと仕事でスケジュールを埋めてしまうので、あえてこれらに取り組む日を確保しておいて開発を進めつつ、正式リリース日が発表されたらその日もオフにしてブログ公開とGitHubでのソース公開に備えたりしてます。


リリース前の感覚として、iOS 9 はあまり開発者の興味を集めてない気がして、iOS-9-Samplerもあんまりニーズないかもなぁ。。とか思ったりしてましたが、出してみると例年通りの反響があり、やはり時間をかけて準備した甲斐があったなと。というわけできっと iOS-10-Sampler もやると思います。


あと Google/Eddystone のコントリビュータになったり、


もちろん過去にアップしたリポジトリのメンテも。


ハッカソン参加

ハッカソンは体力の消耗が激しいので、基本的にもうあまり出てないのですが、海外の場合はmeetupとかに出て英語コミュニケーションをがんばるよりもハッカソンに出て実力を示したほうが早いということで、営業的な意味で出ています。


幸いにもどちらも受賞することができました。


プライベート開発
  • とあるカジュアルゲームアプリ
    • 友人と週末に開発を進めている
    • 月1日できるかできないか、ぐらいの開発ペースなのでいつリリースできることやら。。

反省

  • ブログをあまり書かなかった

制作実績や、勉強会での発表については書かないともったいないので書いてましたが、それ以外の日常の開発で得た開発ノウハウについてはほとんど書けず。12月になってアドベントカレンダードリブンで何記事か書いたぐらい。


この メモをアップするメソッド でブログ書きまくってた頃とは色々状況が違うので、今にフィットする方針を考え直さないと、と思っています。


  • 新しい専門領域を開拓できなかった

2014年はBLEというちょっとニッチだけどあまりそこで経験・実績のある人がいない分野を開拓することができました。今年は「海外から仕事を受ける」という新しい挑戦は始まったものの、そしてBLEに関してはより深掘りできたものの、「新しい技術的な強みの獲得」という面ではあまり何もできなかったなと。(今年よくやった新しい分野の仕事として「watchOS」もあるのですが、こちらは技術的な面ではあまり強みとはいえないと思っています)


足がかりはいくつかできたので、来年がんばります。


来年の抱負

当面は海外のお仕事をがんばります。年明けからベルリンに *2 行ってきます!



*1:発表ネタをつくらなきゃというプレッシャーを自らに課す

*2:バンベルクのスタートアップとは別の、新しいお客さんとのお仕事

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 |