その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

【書評】Prototyping Lab 第2版 ―「作りながら考える」ためのArduino実践レシピ

著者の小林 茂 先生、およびオライリー・ジャパン社より『Prototyping Lab 第2版 ―「作りながら考える」ためのArduino実践レシピ』をご恵贈いただきました。



Arduinoを使ったチュートリアル・レシピをまとめたクックブックで、約7年前に刊行された同名の書籍の大幅改訂版です。2017年1月に刊行されたばかりで、Amazonで購入できます。


Prototyping Lab 第2版 ―「作りながら考える」ためのArduino実践レシピ (Make: PROJECTS)
小林 茂
オライリージャパン
売り上げランキング: 32,308


Kindle版はないようですが、オライリーの公式サイトにて電子版を購入することもできます。

書籍の概要 / 目次

本書はタイトルに「プロトタイピング」とある通り、ハードウェアで何かつくりたいものが浮かんだときに、Arduino & Processing でサクッとつくってみようという考え方の実践手法を紹介する本です。


なので、◯◯(プロダクト名)みたいなものをつくってみよう、みたいな話ではなくて、互いに組み合わせて再利用しやすいレシピをメインに構成されています。

  • 入力
    • レシピ 1:自然光の明るさを測りたい
    • レシピ 2:距離を測りたい(赤外線センサ)
    • レシピ 3:距離を測りたい(超音波センサ)
    • レシピ 4:振動を測りたい
    • レシピ 5:直線上の位置を測りたい
    • レシピ 6:圧力を測りたい
    • レシピ 7:曲がり具合を測りたい
    • レシピ 8:温度を測りたい
    • レシピ 9:傾きを測りたい
    • レシピ 10:動きを検出したい
    • レシピ 11:方位角を測りたい
    • レシピ 12:人が動いたことを検知したい
    • レシピ 13:何かがタッチしたことを検出したい
    • レシピ 14:タッチパネルを使いたい
  • 出力
    • レシピ 15:光をコントロールしたい
    • レシピ 16:モノを叩いて音を出したい
    • レシピ 17:モノを振動させたい
    • レシピ 18:モノを動かしたい(角度を変える)
    • レシピ 19:DCモータをコントロールしたい
    • レシピ 20:DCモータをコントロールしたい(センサによるコントロール付き)
    • レシピ 21:小型のディスプレイで情報を提示したい
    • レシピ 22:AC100V機器のオンオフをコントロールしたい
    • レシピ 23:サウンドを再生したい
  • データ処理
    • レシピ 24:入力から不要な変動を取り除きたい
    • レシピ 25:アナログ入力をデジタル的にいくつかの範囲に分割したい
    • レシピ 26:ある状態になった後、一定時間が経過してから処理を行いたい
    • レシピ 27:環境ごとにセンサの値をキャリブレーションしたい
    • レシピ 28:ある状態になった瞬間に処理を行い、その後一定時間の変化を無視したい
    • レシピ 29:複数の入力がある状態にマッチしたかどうか判断したい
    • レシピ 30:時間変化を伴う入力があるパターンにマッチしたかどうかを判断したい
    • レシピ 31:状態遷移をわかりやすく記述したい
  • ネットワーク接続
    • レシピ 32:スマートフォンと無線で接続したい
    • レシピ 33:ローカルなトリガによりネットワーク上でアクションを起こしたい
    • レシピ 34:ネットワーク上のトリガによりローカルでアクションを起こしたい

そんなわけで、ひとつひとつのレシピを順番にやっていくという読み方よりも(それもいいと思いますが)、何かつくりたいものを頭に思い浮かべつつ、その要素技術となるレシピをピックアップして読んでいく、という読み方ができるようになっています。


もちろん、レシピを紹介するクックブックパートの前には、ArduinoやProcessingの開発環境のセットアップから、

  • Arduino IDEのセットアップ
    • Arduinoについて
    • ドライバのインストール
    • Arduino IDEの起動と動作確認
  • Processing IDEのセットアップ
    • Processingについて
    • ProcessingでArduinoボードと通信するための準備

(2章:開発環境を整える)


電子回路の基礎(それこそオームの法則から)、揃えておくと便利な電子部品や工具の紹介、

  • 電子回路の基礎知識
    • 電圧〜電流〜抵抗
    • オームの法則
  • 実際に回路を組んでみよう
    • ブレッドボードとジャンパワイヤ
    • 主な電子部品について
    • 実際に回路を組んでみよう
    • オームの法則、ふたたび
    • スイッチで LEDをオン/オフする
  • 自分のツールボックスを整備しよう
    • そろえておくと便利な電子部品
    • そろえておくと便利な工具
    • ブレッドボード以外で利用できるモジュールについて
    • センサ用ケーブルの作り方

(3章:電子回路の基礎と最初の一歩)


そしてArduinoの基本的なチュートリアルがあります。

  • Arduinoの基礎知識
    • スケッチの基本的な構造とデジタル出力
    • PWMによるアナログ出力
    • デジタル入力
    • アナログ入力
    • Arduinoボードに LCDを接続する
    • LCDを自分でシールド化する
  • Arduino+PCで使う
    • Processingの場合
    • Arduino IDEを拡張する
    • ライブラリを追加する
    • ボードを追加する

(4章:Arduinoチュートリアル)


また本書の冒頭にArduinoでプロトタイピングを行うことでどのような実際のプロダクトがつくられたか、という作品紹介パートがあり、実際に各作品においてArduinoや3Dプリンタを利用したプロトタイピングの過程が紹介されていて、こんなものがつくれてしまうのか、と読んでいるだけでワクワクさせてくれます。

  • Orphe(株式会社 no new folk studio)
  • BOCCO(ユカイ工学株式会社)
  • MESH(ソニー株式会社 MESHプロジェクト)
  • 光枡(光枡プロジェクト)
  • 形骸化する言語(菅野創、やんツー)
  • METCALFシリーズ(きゅんくん)
  • NO SALT RESTAURANT(NO SALT RESTAURANT制作委員会、 aircord)
  • IRKit(大塚雅和)
  • HACKberry(イクシー株式会社)
  • ベゼリー(チームベゼリー)


(Sonyの「MESH」もArduinoから始まった)



そして、本書全体的に言えることですが、二色刷り(一部カラー)で、きれいな図が多用されていて、わかりやすく、読みやすいです。


(本として美しいので、(電子も便利だけど)個人的には紙でずっと持っていたい)

第1版との違い

初版が出版された2010年5月から執筆時点で6年経過していたそうなので、状況は何もかもが変わっています。


個人的に所有している第1版と比べてみると、まず冒頭の「作品紹介」パートは全面的に刷新されています。第1版はメディアアート的な「作品」が100%を占めていたのに対し、第2版では「製品」(量産品)が数多く紹介されています。この6年の歳月が、「Arduinoを用いたプロトタイピング」という手法を確実に浸透させ、製品を世の中に送り出すようにまでなったんだなぁと思うと感慨深いものがあります。


また2010年5月というと、iOSはまだiPhone OS 3(iOSですらない)。Core Bluetoothが最初に入ったのがiOS 5なので、BLE(Bluetooth Low Energy)はまだ浸透するどころか規格がどうのこうのというフェーズだったかと思います。そんなわけで第2版では「BLEを利用してスマートフォンと無線通信」するサンプル(レシピ32)が今回追加されています。


またWi-Fiで無線通信してウェブサービス(myThings/IFTTT/Beebotte)と連携するサンプル(レシピ33と34)や、Raspberry PiやNode-RED、3Dプリンタを使用するプロトタイピングの実例を紹介する章(第9章)も、今回新たに追加されたものです。


その他にももちろんArduino/Processingのサンプルも現行バージョンに全面更新されていますし、Arduino IDEに追加された新機能の説明も追加されています。

個人的にやりたいこと

レシピの総まとめとして、『自律型 2輪ロボットをつくる』という実践の章があります。実際にアイデアをどうやってハードウェアのプロトタイプに昇華するかという具体例を示してくれる章です。


最近友人のiOSエンジニアが「強化学習」の勉強のためにそういうものをラズパイでつくっていて、

めっちゃ楽しそう、って思ってたので、これは是非やってみたいなぁと。

おわりに

Arduinoのチュートリアル・レシピをまとめたクックブック『Prototyping Lab 第2版 ―「作りながら考える」ためのArduino実践レシピ』をご紹介させていただきました。


パラパラと眺めていると「つくりたい」モチベーションがムクムクと湧いてくる本です。初心者にもわかりやすく書かれていますので、ハードウェアを絡めたものづくりに興味のある方はぜひ一度手にとってみてはいかがでしょうか。


Prototyping Lab 第2版 ―「作りながら考える」ためのArduino実践レシピ (Make: PROJECTS)
小林 茂
オライリージャパン
売り上げランキング: 32,308

【書評】iPhoneアプリ開発講座 はじめてのSwift

現在の最新開発環境である Xcode 8、Swift 3 対応のiOSアプリ開発入門書iPhoneアプリ開発講座 はじめてのSwift』を、著者の諏訪様・出版社のSBクリエイティブ様よりご恵贈いただきました。




昨年12月に発売されたばかりで、Amazonで購入できます。Kindle版もあります。


iPhoneアプリ開発講座 はじめてのSwift
諏訪 悠紀
SBクリエイティブ
売り上げランキング: 45,845

他の入門書との違い

iOSアプリ開発の入門書は数多出ているわけですが、本書の特長としては、表紙にも、[著者の諏訪様による紹介記事](http://dev.classmethod.jp/smartphone/iphone/wrote-swift-book/)にも

何がわからないか? に対して真摯に向き合い、熟考し、執筆しました。

とある通り、解説がめちゃくちゃ丁寧です。


たとえば、iPhoneアプリ開発を行うためには、プログラミング言語であるSwiftを学ぶ必要があるわけですが、その前段階として、

  • 「プログラムとは」
  • 「プログラミング言語とは」
  • 「コンピュータがプログラムを理解する仕組み」
  • 「iPhoneアプリ開発のためのプログラミング言語『Swift』」

と、Swiftを学ぶ理由に至るまでを順を追って、実に丁寧に説明してくれます。



そしてなんとも図表/イラストが豊富


(この丁寧さ、「読者を絶対に突き放さないぞ!」という著者様の意志を感じます)


オールカラーで、ほぼ全ページに図が入っています。



あと素晴らしいと思ったのがこういうところ。



ソースコードについての解説、普通の技術書では、インラインのコメントで済ませちゃうと思うんですよ。こういう感じで。

// Carクラスをインスタンス化し、プロパティに値を代入する
let car = Car()
car.mileage = 200
car.usedFuel = 10

// FuelEfficiencyプロトコルに準拠したインスタンスとして扱う
・・・(ソースコード省略)


それを上の写真にあるような感じで全編でソースコードの要点を図っぽく示しているところ、これは実に手間暇かかってるなーと。



そして、筆者の諏訪さんは超有名なクラスメソッド社の技術ブログで非常に多くの投稿(累計406投稿!)をされている方なので、文章が非常に読みやすいです。


Amazonのレビューにもこう書かれていました。

外国人の私でもす一回でわかるぐらいのやさしい日本語で書いています。とてもわかりやすいです、プログラミング経験ゼロの方にオススメです。

目次

  • CHAPTER01 プログラミングの基礎知識
  • CHAPTER02 プログラミングを始めるための準備
  • CHAPTER03 Swiftの基本的な文法
  • CHAPTER04 Swiftとオブジェクト指向プログラミング
  • CHAPTER05 Swiftの発展的な文法
  • CHAPTER06 iOSアプリ開発入門
  • CHAPTER07 iOSアプリ開発レシピ
    • Recipe01 電卓アプリ
    • Recipe02 タイマーアプリ
    • Recipe03 マップアプリ
    • Recipe04 図鑑アプリ
    • Recipe05 写真ビューアアプリ

それぞれの詳細については、著者様ご自身による解説記事に詳しいです。

まとめ

最新の Xcode 8 / Swift 3 対応のiOSアプリ開発入門書「iPhoneアプリ開発講座 はじめてのSwift」を紹介させていただきました。気になる方はぜひAmazonの「なか見!検索」で試し読みしてみたり書店でチェックしたりしてみてください!


iPhoneアプリ開発講座 はじめてのSwift
諏訪 悠紀
SBクリエイティブ
売り上げランキング: 45,845


普通の机を昇降式スタンディングデスクにする(Loctek M1Bレビュー)

なんと、、、GitHub経由で海外から製品レビューの依頼が来ました。Loctekというブランドの、普通の机の上に置いて昇降式のスタンディングデスクのようにできる製品です。


(イメージ図)


以前『【サンフランシスコ・エンジニア生活】弊社のオフィス紹介』という記事に書いたのですが、僕が働いているFyusion社のオフィスは電動のスタンディングデスク完備でして、


(赤丸で囲んだボタンで昇降する)


これが非常に快適なので東京の自宅 *1 にも欲しい(※オフィスと自宅からのリモートワークが半々ぐらいの割合である)と思って検討したこともあるのですが、こういう電動式の自動昇降デスクは15万〜25万円が相場で、手が出しにくいなと思ってたのでした。


そんな折に表題の通り海外の会社から「GitHubであなたのことを知りました」「製品を送るからレビューしてくれない?」という打診があり *2

I konw you from Github and your work on programmes is really great!

I am here to ask if you could make a review for our sit-stand work station with your using experience.

We'll send you sample without any costs of you for your review.

普通の机が昇降式スタンディングデスクになるなんてまさに欲しかったものなので、二つ返事でOKしたのでした。



日本のAmazonでも取り扱っているので、普通にポチッと購入できます。




レビュー用には上記の「Loctek 座位・立位両用スタンディングデスク 高さ12段階調節付 27インチ ブラックM1B」の他に、「ロックテックLoctek フルモーションガス圧式モニターアーム USB3.0ポート付き 10-30インチ対応 D8」も送ってくれました。


使ってみました

まず、普段の自宅での作業机はこんな感じです。



外部モニタは昔から使ってないのと、メイン機がラップトップ(Macbook Pro)なのと、サンフランシスコのオフィス行ったりコワーキングスペース行ったり(フリーランス時代は)お客さんとこ行ったりで基本的には作業道具は全部持ち歩くので、机に常設されてるものは電気スタンドと電源タップぐらいです。



そこに「M1B」と「D8」が届きました。



どーーーーん、という感じです。Loctek社のスタンディングデスクはサイズがS(M1B/M1W)、M(M2B/M2W)とあり小さい方を選んだのですが、箱だけ見ると相当な威圧感。。



箱から取り出して置いてみました。組み立てはほとんどありません。*3



サイズ的にはちょうど良い気がします。重みがある代わりに安定感があります。




横にあるレバーでガス圧(普通のオフィスチェアの昇降と同じしくみ)で昇降できます。



シューッと気持ちよく、力もいらず簡単に上がります。



高さ12段階ということで、ちょうどいい高さに調整できます(写真は中間ぐらい)。やはりランチ後の眠くなる時間帯はスタンディングにできると便利です。



金属製で質感の安っぽさは全然なく、角を取った丸みを帯びたデザインなので角が身体に当たって痛いとかもなくてなかなか快適です。




モニターアームD8はモニター側がまだ準備できてなくて *4 のですが、このM1Bの天板はモニターアームを取り付けられるようになっているようです。


まとめ

普通の机を昇降式スタンディングデスクにするM1B / M1W、ガス圧式でしっかりつくられてる感があり、素材的にもデザイン的にも高級感があり、そのわりにお値段は電動昇降デスクとくらべて遥かにリーズナブル(2017年3月現在、Amazonで29,800円)なので、電動昇降デスクを買うのはハードルが高いけど既存の机を昇降式にしたい、という方はぜひご検討いただくといいんじゃないでしょうか。



そのデスクに取り付けられるモニターアームもどうぞ。



*1:自宅といっても40平米未満の賃貸アパートです

*2:typoありますが原文ママ

*3:キーボードを置く台を取り付けられますが、僕は外部キーボード使ってないので取り付けず。

*4:買ったけど取り付けアタッチメントがまだ届いてない

try! Swift Tokyo 2017で「クライアントサイド・ディープラーニング」というLTをしました #tryswiftconf

先週開催された "try! Swift Tokyo 2017" にて、"Client-Side Deep Learning" というタイトルでLTしました。発表資料はこちら。



ディープラーニングは強力なコンピューティングパワーが必要なので、従来はモバイルデバイスでやるものではなかったのですが、iOS 10でMetal Performance Shadersフレームワークに追加された新たしいAPIにより、クライアントサイドのGPUで学習済みCNNの計算を行えるようになったという話です。


その話前もしてたんじゃ・・・と思われるかもしれませんが、今回は自分でモデル作成からアプリ実装まで一通りやってみた上で話をしていたので、僕の中では大違いでした。まぁ、5分のLTなのでそこで得た知見や具体的な実装についてはあまり話せませんでしたが。。


実際にLTの中でライブデモもやりました。手元のネームプレートにあるSwiftロゴの認識に見事成功しました。


(Photo by @inamiy


緊張かライブデモの恐怖かわかりませんが手がプルプル震えるし、学習データはオレンジバックの白抜きのお馴染みのロゴ画像が中心で、木製ネームプレートに立体的に刻印されたロゴはそもそも今回作成したモデル的には認識が難しいということもあったのですが、無事うまくいって良かったです。


手が震えてたのが逆に良かったというフィードバックもちょこちょこいただきましたw




ちなみにこちらはライブデモがうまくいかなかったとき用に用意しておいた動画:


(try! Swiftの会場で撮ったもの)


niwatakoさんによる聞き起こし記事:

実装について詳細を知りたい方は

MPSCNNについては記事をいろいろ書いてます。今回の実装に関係ありそうな話はこのへん。


デモ作成にあたって自分でも自分の記事を何度も見返しました。書いといて良かった。。

LTの難しさ

今回は5分しかないLT枠だったわけですが、「何を話さないか」はそれこそ開催前日ぐらいまで悩んでました。色んなものを泣く泣く削りました。

  • 自己紹介
    • せっかく日本中、世界中から700人ものSwift/iOSエンジニアが集まっているわけだから、自分をアピールしたい
    • が、発表の流れの中で不可欠なものではないのでカット
  • 弊社での事例紹介
    • うちの会社はそれこそiOS 10が出た直後にMPSCNNを利用した機能をリリース*1していて、それを紹介したい気持ちはあった
    • が、それをやると付随して説明することが増えてしまうのでカット
  • CNNとは何か、ディープラーニングとは何か
    • CNN、CNN言いまくってるし、タイトルにDeep Learningとあるので、説明しないわけにはいかない
    • この概念は短く説明しても「わかったような、わからないような」にしかならないし、今回の趣旨的にそこをハッキリ理解することは重要ではないので、思い切って"Something great"(何かすごいもの)っていう理解でいいです、ってことにした
  • 実装コードの紹介
    • ちゃんと実装した上で話してるし、try! "Swift"なのでコードは出したかった
    • CNNについての説明なしに、CNNを構築するコードを出しても「既にわかってる人にしかわからない」のでカット

どこかのカンファレンスのCfPに応募して完全版で発表したいなーと思ってます。

発表の様子(2017.4追記)

プロの方によるオフィシャル写真が公開されたので記念に載せておきます。


(セットアップ中)


(はじまりました!固い。。)


("Something great")


(手がプルプル震えながらも無事ライブデモ成功!)


(プレッシャーから解放された顔)



後日(これを書いてる今日)、初日に機械学習の話をされていたAlexis Gallagherさんと、サンフランシスコのお寿司屋さんでランチしてきました。(ごちそうさまでした!)



AlexisさんはTopology EyewearのCTOなのですが、そのオフィスがなんと僕の働いているFyusionのオフィスとわずか3ブロック違いという。


Topology Eyewearは顔をスマホで撮って3Dモデルを作成し、そのモデル上で自分にあったメガネを検討して注文までできるサービス。技術的にもメガネユーザーとしても非常に興味深いです。

その他余談

CfPについて

今回のLTはCfP(Call for Proposal)によって選ばれたわけですが、競争率は7〜8倍あったそうです。


僕は自慢ではないのですが(自慢ですが)国内にしろ海外にしろCfPはほぼ毎回通ってまして、書く際に意識しているポイント等を下記トークの中で話したので、もしよろしければ見てみてください。


ちなみに、タイトルは"Client-Side Neural Network"の方が適切なのでは、という声もありましたが、それはその通りでそのタイトルも候補にはあったのですが、「キャッチーさ」を重視して現行のものにしました。

英語

海外から多くのスピーカー/聴講者が集まる本カンファレンスで、サンフランシスコで働いている僕が日本語で話しはじめてズッコケた人もいるんじゃないかと思うのですが、日本での開催だし、素晴らしい同時通訳もあるし、上述の通り直前まで発表内容がfixできずにいたし、デモはそれこそ当日まで作ってたし、というわけで、英語での発表は早々に諦めてました🙇🏻 *2


こうしてある程度割り切る判断ができるようになったのも前進だ、とか思ってましたが、やっぱり他の日本人スピーカーの方々が堂々とした英語でプレゼンしてるのを見て心に響くものがあったのも事実。来年またチャンスがあればがんばりたいと思います。

弊社チームメンバーとの思い出

うちの会社から僕を含めて4人、try! Swiftに参加してました。


(開催前日、全員集合。渋谷dots.さんにて。この後Ninjaレストランへ)


(配布バッグに入れてもらったチラシ)


3人はサンフランシスコから、1人はブラジルからの参加で、そのブラジルの彼は動画ミーティングではずっと顔を合わせていたものの、直接会うのは初めてだったので、感慨深いものがありました。


(ロボットレストランからのゴールデン街)


チームで長い時間を一緒に過ごせたのも開発合宿的で良かったです。

try! Swiftの感想

セッション内容については、わりと、「デキる」人達からは、辛口の意見を聞きました。内容が浅い、とか。で、僕はどう思ったかというと、自分のトークの準備(主にデモの実装)をまだやってたのと、気持ちがフワフワしてたのとで、実はほとんど聞けてません。後ほど復習します。


が、来年もまたやって欲しいかというと、ぜひやってほしい派です。やっぱりこうして日本中・世界中からSwift/iOSエンジニアが集まって、一つの場・時間を共有するというのは代えがたい体験です。僕はWWDCに求めるものはセッションでもラボでもなく、iOSエンジニアのお祭り的な空気感だということに気付いてWWDCのチケットがなくても毎年SFに行くようになったのと同様に、try! Swiftもそういう価値があると思います。Swiftについての知見を得られる、ということ以外に、このカンファレンスが日本のSwift/iOSエンジニアコミュニティに与えている影響は相当あるんじゃないかと。


これだけの規模のカンファレンス、早朝の準備から夜のパーティが終わるまで、しかもそれが3日間と、主催・運営された皆様の労力は想像を絶するものかと思います。頭が下がるばかりです。素晴らしいカンファレンスを開催していただき、どうもありがとうございました!


*1:僕が実装したわけではない

*2:海外スピーカーの発表も、去年は「お、この人の英語は聴きやすいしちょっと同時通訳なしでがんばってみようかな」とかやってましたが、今年は最初からがっつり同時通訳レシーバーに頼りました

それでもCourseraの機械学習コースをオススメする理由

先日、オンライン学習サイトCourseraの機械学習コース "Machine Learning by Stanford University" を修了しました。


(感動のエンディング動画)


ただ、機械学習に興味があって情報収集を始めてる人にとって、「Courseraの機械学習コースがおすすめですよ」という話は


「はい、知ってます


という感じではないでしょうか。


僕もそんな感じで、幾度となく人や記事に同コースを薦められたりしつつ、たぶん2年ぐらいスルーし続けてきたと思います。


しかし約2ヶ月前、ひょんなきっかけから本講座を始めてみて、やはり評判通り最高だったと思うと同時に、僕と同じような感じでこのコースが良いらしいと知りながらもスルーし続けてる人は多いんじゃないかと思いまして、(おせっかいながらも)自分の脳内にあった「やらない理由」を列挙しつつ、「いや、それでもやった方がいいですよ」というのを書いてみたいと思います。

「スタンフォードの授業」レベル高そう

世界最高峰のスタンフォード大学の授業、いくら「入門です」と言われても、


「それはレベルの高い中での入門でしょ?」


と思ってました。技術書を読んでもさっぱり頭に入ってこない人の気持ちなんてわからないでしょうよ、と。


いえ、この授業はサルでもわかります。・・・とは言えません


やっぱり数式がたくさん出てきて何言ってるのかわからなくなります。眠くなります。でも少なくともスタンフォードに入学できる程の世界最高峰の前提知識が必要ってことはないです。


高校レベルの数学、プログラミングが出来れば前提知識としては十分で、Andrew先生は数式の意味を説明するのがめちゃくちゃうまいです。項を削ぎ落としてシンプルにしたところから、順序立ててその数式の性質を説明してくれて、それが機械学習でどう役立つのか、という話をしてくれるので、納得感・腹落ち感があります。


そして時には、「この数式の意味はわかってなくても偉い人が実装したライブラリ使えば機械学習はできるから大丈夫だ」と言ってくれたりもします。わからない人の気持ちがわかってる先生だなと随所で感じます。

わからない分野の話を、英語で学ぶなんて...

全編に日本語字幕があります。自動翻訳の気持ち悪い日本語ではなくて、ボランティアによる自然な日本語です。


当初僕には「英語の動画を日本語字幕で見るのは何か負けた感がある」「英語で観ると英語の勉強にもなって一石二鳥」という変なこだわりもありましたが、

  • 機械学習を学ぶのが先決
  • (英語で観ることで)心理的ハードルが高くなって講座をやらなくなっては本末転倒

と開き直って全て日本語で観ました。

その後色々なオンラインコースが出てきてるし、もっと良いのがあるんじゃない?

このコースがいつからあるのかわかりませんが、たぶん2012年にはもうあったと思います。今では最初から日本人が日本語で解説している講座もあるでしょうし、ディープラーニングまでカバーしているものもありますし、評価が高いものもあります。


このコースが優れている点として、Andrew先生の説明がわかりやすい、実践的な内容である、といったことがよく挙げられますが、それらももちろん良いわけですが、


毎週のプログラミング課題の提出が義務付けられている


という点で、僕は他のオンライン講座と比べて圧倒的に良いと思いました。


動画で学んだニューラルネットワークとかレコメンドシステムを自分で実装して、毎週提出する必要があります*1


これが本当に素晴らしくて、

  • 動画を見てよく理解できなくても、自分でプログラムを書いてみるとよく理解できる
  • 動画を見て理解できたと思っていても、自分でプログラムを書いてみると理解が曖昧だった部分が浮き彫りになることがある
  • ちゃんと学んだという実感がある

という効果があると感じました。他のオンライン講座ではあまりこの形式は見たことなくて、どんなに動画が良くても、結局これがないと意味ないような、とさえ思います*2



ちなみに最近、『ゼロから作るDeep Learning』という書籍がとても評判が良く、これでゼロから学び始めた/学ぼうと思っている、という人も多いと思います。


ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
斎藤 康毅
オライリージャパン
売り上げランキング: 65


僕も最近買って読んでみて、この本の「手を動かして自分で実装してみる」というコンセプトの良さに通ずるものが、このCourseraの機械学習コースもある、と思いました。上述しましたが学んだことは全て自分で実装することになるので。


ちなみにこの本とCourseraの機械学習コースは(被る部分もありますが)カバーする範囲が違うので両方ともやって損はないと個人的には思います。ディープラーニング本はディープラーニングに到達するための要素技術/知識を最短距離で学ぶ感じですが、Coursera機械学習コースはもっと機械学習の基本事項を広く網羅する感じです。*3

OctaveじゃなくてPythonでやりたい

「今機械学習やるならPythonだし、なぜOctave・・・?」というところで避けてしまう人も多いかもしれません。


もちろん僕もOctaveは初めて触りましたしこの講座以外でもう触ることもないんじゃないかとさえ思いますが、Octave独自の使い方とか記法を学ぶ、というオーバーヘッドはほとんどなかったと思います *4


プログラミング課題でやった実装は自分で中身を理解している(どういう関数を使っているか、なぜそういう計算をしているか)ので、つくったものをあとから他の言語やフレームワークに移植するのも簡単そう、と思っています。

今忙しいから落ち着いたらやろう

ここまで読んで、「良さそうだな」って思った方もいらっしゃるかもしれません。でも同時に「今忙しいので、落ち着いたらやろう」と思った方は多いんじゃないかなと推察します。仕事は毎日あるし、エンジニアは学ぶことは他にもいくらでもあるし。


僕もそうでした。仕事もプライベートもめちゃめちゃ忙しかったし、優先的に学ぶべき技術も他にあったので、「1ヶ月後ぐらいには今よりは落ち着いてるはずだからそのときに」って思いかけたのですが、ふとコースのカリキュラムを見て考えが変わりました。


「ニューラルネットワークぐらいはちゃんと理解したいな」と思っていたのですが、本コースでニューラルネットワークについて学ぶのはWEEK4, 5。ちゃんと1ヶ月後に受講開始したとして、順当に進めて、ニューラルネットワークの基礎を学べるのがその1ヶ月後。


この機械学習/ディープラーニングが盛り上がってる中、最低でもあと2ヶ月は自分はスタート地点にすら立てていないことになるのか、と愕然とし、すぐに始めることにしたわけです。


当初は修了することは重視してなかったので、いきなりニューラルネットの章だけやることも考えました。が、本コースのカリキュラムは知識が積み上がっていくようにデザインされていて、序盤の「線形回帰」とか「ロジスティック回帰」で学んだ知識はその後の章のあらゆる部分に関係してきたので、最初から通しでやってよかった、と思っています。

続けるコツ

こうやっておすすめしているわけですが、機械学習で何かをやる具体的な予定があるわけでもなく、仕事もプライベートも普通に忙しい、という状況においては実際のところ完走するのはなかなか大変なんじゃないかと思います。


僕は第1週目は「機械学習の歴史」みたいな流し見しても良い内容だろうと思って最初は気軽に始めてみたのですが、最初の動画だか2つ目の動画だかでもういきなり数式がバリバリ出てきて面食らった記憶があります。普通に気が重いです。


そんな中でも続けられた理由が3つほどあるなと思うので参考までに書いておきます。

1. 中間目標があった

当初は完走するつもりはなくて、とりあえず第5週のニューラルネットワークまではやろう、と思っていました。


で、第5週目までやって、修了証書が欲しいわけでもなかったのでやめてもよかったわけですが、その先のカリキュラムに「次元削減」「レコメンドシステム」等いくつか学びたい項目があったので、もうちょっとやってみるか、と。


8週目ぐらいまでやったとき、最後の第10週、第11週はプログラミング課題がないことに気づきました。実質あと2週がんばれば完走じゃん!と。


そんなこんなで、中間目標を見ているうちに完走できた、という話です。

2. 「挫折したらもう一生オンライン講座で勉強できない体になる」という意識があった

自分の性質上、一度自分の意志を折った前例をつくってしまうと、もうダメなんですよね。そこが基準になってしまう。


「今週めっちゃ忙しいけど、一週でもサボったらもうこの講座をやることはないだろう」


「この講座を完走しなかったら、もう一生どんなオンライン講座も完走することはないだろう」


極端だと思われるかもしれませんが、人生を40年近くやってきて実際そんな感じだったので、「ここでオンライン講座という貴重な学習の選択肢を失うわけにはいかない」という思いで後半は進めていました。

3. 適度に飛ばしながら進めた

例えば(上述した通り)Octaveの書き方の動画は飛ばしましたし、前半には結構あるテキストによる解説とPDFは全部飛ばしましたし、プログラミング課題の"optional"問題も容赦なく飛ばしました。やった方がいいのは間違いありませんが、挫折するよりは前に進んだほうがいいので。

まとめ

というわけでCourseraの"Machine Learning"、おすすめです!


*1:自動ですぐに採点されるようになっています

*2:宿題として課されなくても自分で手を動かして学べる人は別

*3:個人的には、先にCourseraの方をやり、後からこの本で(既に知っているところは飛ばしつつ)やった方がわかりやすいのでは、と思いました。

*4:序盤でOctaveの使い方の動画があるが、ほとんど飛ばして、テストと課題で必要になる度にググる、という方法で十分乗り切れました

「シリコンバレーで働くエンジニアと考える、これからのキャリア」という授業をしました

オンライン動画学習サービスSchoo(スクー)で、「シリコンバレーで働くエンジニアと考える、これからのキャリア」と題した授業をさせていただきました。*1


撮影を生放送で行い、視聴者参加型で行う授業でした。もちろんキャリアに正解なんてないし、キャリア観も人によって千差万別なので、僕が何かを教える、というよりは、まずは僕の経験や考えを共有して、あとはコメント・質疑応答ベースでみんなで考えていきましょう、的なコンセプトです。


講義

最初に30分(ホントは20分の予定だったのですが🙇🏻)の講義パートがありました。


講義資料はこちら。*2


  1. 自己紹介(僕のキャリアの変遷をざっと説明)
  2. 僕のキャリア観(理想)
  3. その実現のために意識していること4つ


という3段構成です。


以下に簡単に抜粋します。

自己紹介(キャリアの変遷)

20代は大企業志向 → ベンチャー → スタートアップ → フリーランス → いまは30人ぐらいのスタートアップ


給与の変遷グラフというちょっと生々しい話もあります) *3

僕のキャリア観
  • グリーンカードを取得し、海外に移住したい
  • いずれは起業し、世界を変えたい
  • 技術で世界を良くしたい

いずれも素晴らしいことだと思うけど、そこを目指しているかというとそうでもない



時流や自分の興味が移り変わる中で、その時々でおもしろいと思える選択肢を取れる自分でありたい


→ 言うのは簡単だけど、実践するのはなかなか大変

  • 同じ程度の成功では達成感を感じられない
    • かといってより大きい成功をし続けるのは簡単ではない
  • 同じことをやっていると飽きる
    • アプリをつくることが「無条件に」楽しい、という時代はとうに過ぎた
    • 海外で仕事してテンション上がっても3日で慣れる
  • 新しい技術を短時間でマスターするような天才でもない


「おもしろがり続ける」のは大変!

そんなキャリア観の実現のために意識していること4つ

1. 勉強を仕事に繋げる

  • 新たな刺激のある仕事を獲得するために、新しい技術を習得する必要がある
    • 短時間でマスターするような天才ではない
    • 必要に迫られてない勉強を継続することは難しい
  • 20時間の法則:未経験の人から見ると「すごい!」っていうぐらいのレベルにはなる
  • 自分の得意領域と組み合わせれば、仕事を獲得できる
    • フルタイムで経験を積める
    • 仕事だから続けられる!稼げる!


2. "Searchable"になる

  • おもしろい仕事が来るポジションにいるには?
    • 求人が出たり、プロダクトが話題になるタイミングで自分からアクションするのでは遅い
    • おもしろい人がおもしろいことを始めるタイミングで声をかけてもらいたい
  • 「自分が何ができる人で、何をやりたい人か」を示し、それを必要とする人に見つけてもらえるようにする


3.「許容できるリスク」を知る

  • 技術力だけ追い求めても上には上がいてキリがない
    • ので、何か別のところで違いを出したい
    • 自分の経験上、ちょっとした「行動力」で意外な程に違いが出る
  • 他人はなかなかやらない「ハイリスク・ハイリターン」な行動があるとして、そのリスクを「自分は」許容できるのであれば、それは自分にとって「ローリスク・ハイリターン」な行動となる
  • → リスクを取らずにリターンを得られる
  • 例:英語も話せないのに海外に飛び込む「不安」は自分にとって許容できるリスク
  • 逆の例:車を運転して事故るかもしれないというのは他人にとって許容できるリスクのようだが僕にとっては許容できないリスク(怖くてできない)


4. 引き際も大事

  • モチベーションMaxで取り組むほうが雇い主/自分双方にとって良い
  • おもしろい仕事をやってるときは遊びの予定よりも仕事の方がおもしろい
  • 日曜夜に残念な気持ちになるなら黄色信号
  • → 引き際も大事

質疑応答

残りの時間は質疑応答でした。やはりキャリアについてはみなさん気になるところが多いようで、授業が延長されるぐらいにコメント、質問をたくさんいただきました。


実際のQ&Aはスクーで見ていただくとして、以下に目次を載せておきます。

  • アメリカに行った理由
  • Q.英語はどのようにして身につけたのでしょうか?
  • Q.日本と海外で働くのどちらが面白いですか?
  • Q.アメリカの就職事情は?スタートアップへの就職で大切なポイントはどこでしょうか?
  • Q.質問です!海外で仕事することに関して奥様から反対とか無かったのですか?
  • Q.シリコンバレーだからこそ日本と環境面で何が異なるかを知りたいです。
  • Q.アメリカで求められるエンジニアってどんな人ですか。データ分析?人工知能?
  • Q.現在、海外で働きながらフロントエンジニアを目指していますが、カヤック時代は一日に何時間、プログラミング学習をしていましたか?(平均睡眠時間が8時間と仰っていたので)
  • Q.シリコンバレーで起業する準備としてするべきことを教えてください。
  • Q.堤さんがエンジニアとして海外に居ても日本に居ても1日の中で最も大切にしていることは何でしょう
  • Q.シリコンバレーにおいて、エンジニアのキャリアはどういうものがあるのですか?ずっとプログラマーのままの人もいらっしゃいますか?
  • Q.日本とアメリカでは開発に対する考え方(リスク等)に違いがあると思います。その考え方の違いについてお話を伺いたいです。
  • Q.面白い仕事をどのように探し続けているですか?教えて頂けますか?
  • 受講生の皆様へのメッセージ

撮影風景

スタジオはこんな感じでした。


(カメラが3台、モニタも3台、でかい照明もあります)


スタジオに行くまで、普通のハンディカムみたいなので撮影するもんだと思ってました。。こういう本格的な撮影は初めてなので、楽しかったです。

関連記事/参考資料

本授業に関連する記事をまとめておきます。

おわりに

スクーの皆様、生放送に参加していただいた皆様、どうもありがとうございました!

(スクーのみなさんと)


最後に改めて授業へのリンクを載せておきます。


*1:僕が働いてるのはサンフランシスコであってシリコンバレーには含まれないらしいのですが、僕自身も最近知ったぐらいなので、そこらへんは許容していただけるとありがたいです😅

*2:スライド共有サービスにアップしてブログに載せてもいいかはスクーさんに確認済みです

*3:こうやってみると今が一番高くて「さすがアメリカ!」ってなるかもしれませんが、僕のアメリカでの評価はまだまだで、1日単価でいうと日本でのフリーランス時代の方が少し多いぐらいでした。フリーランス時代はお客さん仕事は6〜7割にして、残りの時間を新しい技術の勉強や書籍の執筆に充てていたので、年収としては今より低くなっています。

Metalのコンピュートシェーダに関する諸々

Metal の compute shader について。随時書いていきます。

[[ thread_position_in_grid ]] って何?

こういう感じで、カーネル関数の引数から受け取れるやつ。

kernel void
add_vectors(const device float4 *inA [[ buffer(0) ]],
            const device float4 *inB [[ buffer(1) ]],
            device float4 *out [[ buffer(2) ]],
            uint id [[ thread_position_in_grid ]])
{
    out[id] = inA[id] + inB[id];
}


変数名としては id, gid, tid となっているのをよく見かける。


Metal Shading Language Specification / Guide』によると、

thread_position_in_grid identifies its position in the grid.

とシンプルに書かれている(4.3.4.6 Attribute Qualifiers for Kernel Function Input)。


これだけじゃその名前が表現している以上のことがわからないのでグリッドやスレッドの説明も引っ張ってくると、

When a kernel is submitted for execution, it executes over an N-dimensional grid of threads, where N is
one, two or three. A thread is an instance of the kernel that executes for each point in this grid, and
thread_position_in_grid identifies its position in the grid.

Threads are organized into threadgroups. Threads in a threadgroup cooperate by sharing data through
threadgroup memory and by synchronizing their execution to coordinate memory accesses to both
device and threadgroup memory. The threads in a given threadgroup execute concurrently on a
single compute unit12 on the GPU. Within a compute unit, a threadgroup is partitioned into multiple
smaller groups for execution.

ちょっとよくわからない。。


ここの回答にわかりやすい説明があった。

`thread_position_in_grid` is an index (an integer) in the grid that takes values in the ranges you specify in `dispatchThreadgroups:threadsPerThreadgroup:`. It's up to you to decide how many thread groups you want, and how many threads per group.

In the following sample code you can see that `threadsPerGroup.width * numThreadgroups.width == inputImage.width` and `threadsPerGroup.height * numThreadgroups.height == inputImage.height`. In this case, a position in the grid will thus be a non-normalized (integer) pixel coordinate.


なるほど、`dispatchThreadgroups:threadsPerThreadgroup:` を呼ぶときに渡すサイズ(`threadsPerGroup`と`numThreadgroups`)によって「グリッド」の範囲が決まり、`thread_position_in_grid` はそのグリッド内のインデックスを保持する、と。

テクスチャのサイズを取得

カーネル関数が、たとえば以下のように定義されていれば、

kernel void computeShader(texture2d<float, access::read> tex [[ texture(0) ]],

この引数texに渡されてくるテクスチャのサイズは、

    float w = tex.get_width();
    float h = tex.get_height();

という感じで取得できる。