Tatsuhiko Miyagawa's Podcast: ep11: Google I/O 2013 (kenn, mootoh)
収録時間 46:22 | Download MP3 (26MB)
Kenn Ejima さん (@kenn), Motohiro Takayama さん (@mootoh) を迎えて、Google I/O, Google Glass, Google Play Game Services などについて話しました。
番組へのフィードバックは Twitter にて @miyagawa またはハッシュタグ #bulknews にてお寄せください。
Show Notes
滑舌を鍛える必要がある >_<
小鳥メモメモ: 親になって仕事ができなくなった人がいたとしてもそれを責めないで
昔いたんだよ、そういう人が。 「こいつなんで仕事に本気出さねぇの!? マジで腹立たしい」 って思ってました。面と向かって説教とかしてたりもしました。
でも今はわかります。彼は家庭にフォーカスして、家庭に全力を尽くしていたんだな、と。 その範囲で、彼なりに精一杯仕事をしていたんだな、と。
だって親、大変だもん。
まだ小さい赤ちゃんや幼児は、ずっと注意を向けてないと何をしでかすかわからなくて危ないし、赤ちゃんや幼児はこちらの都合は全く関係なく彼らのペーズで動くし。 自分のペースで動けないだけでぐったりするよ。いつもあたふたしてるようなものだもの。
…
逆に言うと、まだ子どもを持たない若者たちがチームを組んで全速力で走りぬく、若いスタートアップが成功するのは統計的に多くなるのだろう。
Coursera, 2013 Q1

Coursera というオンライン学習サイトがある。錆びついたマシンガンで今を撃ち抜くべく、アルゴリズムの勉強をしていた。
- Algorithms, Part I by Kevin Wayne and Robert Sedgewick, Princeton University
- Algorithms: Design and Analysis, Part 1 by Tim Roughgarden, Stanford University
これら2つのコースをとっていた。 いずれも学部生向けで、6週間つづいた。修了したのでふりかえる。
フォーマット
どちらも、 Coursera の標準的な作法にのっとっている。すなわち、毎週講義のビデオが公開され、それは3-20分ほどに分割されていて見やすい。講義の資料およびビデオは PDF/mp4 でダウンロードでき、 iPhone/iPad/Android で好きなときに見れる。その週の講義についての理解度テストがいくつかと、プログラミングの課題がある。最終週には、最終試験もある。
Algorithms, Part I
所与のデータ構造を調べていく。どんな操作が必要なのか考え API を定めて例で確かめる。教科書をなぞっている感じ。 とはいえ、 Union-Find のデータ構造はこのコースをとるまで知らなかった。 CS の海は広い。
いささかゆっくりすぎるようにも感じられるスピードで講義はすすむ。って油断していると Balanced Tree あたりで足をすくわれる。 というかこの人が Red-Black Tree の考案者の一人なのか… CS の歴史は短いが深く、偉人がまだ存命であるのはすごいものだ。
理解度テストは紙に書いてみないと分からないものが多い。プログラミングの課題は Java でけっこうな分量のコードを書く。自動テストもしっかりなされ、メモリ消費/実行時間/コードのスタイル (!) なんかを総合的に問われる。
Algorithms: Design and Analysis, Part 1
けっこうなスピードで語られて、慣れてないとついていくのがきつい。慣れてくると、これくらいのスピードでやってくれた方が逆にリズムがつけられてよかったりする。不思議。ビデオの中、スライドに手描きで数式が描かれていき、授業を聴いている臨場感がある。黒板ぽい。インタラクティブ感があるとわかりやすいのだな。
Analysis が主なので、帰納法、背理法、確率の話など数学スキルが必要とされてなかなかへばる。
理解度テストは選択式が多く、プログラミングの課題は言語/プロセスは問われずに解だけを提出する。ぼくは Javascript/CoffeeScript で解いた。
こちらは、修了証がもらえる。資格マニアではないけれど、やった記録が残るのはやはりうれしい。

やりかた
平日は会社に行く前に少し課題をすすめ、帰ってから風呂で講義のビデオを観ていた。土日には、残っている課題に追われつつ、そこまでの復習を少しした。
Trello で進捗管理をしていた。二次元リストは直感的でよい。

反省
フォーラムというのがあり、生徒同士でテストコードを共有しあったりして助け合う。自分は助けてもらってばかりだった。助ける側にまわりたい。
復習がなかなか追いつかない。理解度テストは復習のひとつにはなるのだけれど、1週間もすれば忘れてしまいがちだ。最終試験はまた遠すぎるし。復習をもっとうまくやれるようにできればよいなー。
2つ並行にやってみて。
どちらも初級向けとのことで、内容はかぶるところがいささかあった。どうやってアルゴリズムを解析するのか、どんなデータ構造とアルゴリズムを学ぶのか。ラッキーなことに、片方で理解が甘かったところをもう一方で補うことができた。
2つが限度。それぞれのコースに、週ごとに要求する時間が書かれていて (Workload) 6-10hrs, 5-7hrs とあるのだけれど、ぜんぜんそんなことなくてプログラミング課題やるだけで土日がまるまる潰れたりした。おまけに、カゼひいたり日本に旅行してたりして、取り組めない日が後半多かった。バッファをみておかないと。そして、遅れるにつれてモチベーションは下がる。ずるずると。学生の頃に覚えがあるでしょう?
他とくらべて
オンライン学習は流行りであり、 Kahn Academy や edX, Codeacadamy などがある。 Codeacademy はコード学習サイトなので、じっさいにコードを打ち込んで REPL でインタラクティブに学習できるのがステキ、あとバッヂや継続日数とか数えられてて Gamification やーという印象がある。 Coursera は魅力的なコースが多くガチムチなのがよい。スケジュールもばちっと決まっているし、コミットすることが求められてる。
次
上で2つが限度とかゆってたくせに Q2 では3つとっている。 Diversity ということで、違うジャンルをとってみた。 Gamification, Human-Computer Interaction, Algorithms, Part II. どこまでうまくいくか…
BlueTooth Headphone for running
@mootoh 腰ベルトはなんだかなあ。。いい感じのBluetooth Earphoneなんでしたっけ?
最初に使ってたのは Jabra CLIPPER. 手持ちの有線イヤフォンを無線化できるのがよい。丸首 T シャツなんかの首周りにつけてた。音飛びもほとんどしなかった。難点は、クリップが固くてを挟むのに苦労すること、けっこうディレイがあること (Youtube とか見てると lip sync しない)。 新型が出てる ので試してみては。
次に使ってたのは Motorola S10. 一体型であり、人によっては頭の形に合わないかもしれない。自分にはうまくフィットしなかった。しばらく使っていたら電源が入らなくなって放置してる。
いちばん最近使ってるのは、 DENON の AH-W150BU Exercise Freak In-Ear Headphones. かっこいいし、バンドが紐状なので頭の形に左右されない。そこそこフィットする。Bluetooth 3.0 だからなのか、 iPhone から電池残量が見えたりしておしゃれ。ただし、腰ベルト なんかに iPhone 5 を入れて走ってるとすさまじく音飛びする。肩近くに iPhone 5 をもっていって走ると音飛びしない。電波がだいぶ弱い感じ。じっさい
> For the best performance, you should avoid keeping your smartphone in your pocket while using your headphones, as Bluetooth connectivity can be weakened when your smartphone’s battery is low or when clothing or the human body blocks the signal. Wearing your smartphone in an armband can ensure better reception and make accessing controls easier.
とか書かれてある… 昨日 Nexus 4 から使っていたら、ズボンのポケットにいれてても音飛びしなかった。
みたいな感じです > @tksohishi
Home server, 10 years ago.
さいきんやっているライフハックは、 iPhone を裏返しておくというものだ。ひとつの通知が集中を容易に削ぐ。イヤフォンを指して音も消す。 iOS6 の Don’t Disturb モードは、大多数のアプリには何ら効果がないのだ。
あれほど望んだ Push Notification から逃げ惑う。近づいては離れる。世界と自分との距離感を感じることができるとしたら、それはスマートフォンと言える。
Setting Property is Case Insensitive
さいきんコードレビューで指摘されて首をかしげたこと。
lower case で始まる名前の property に値を代入するところで、 property name を upper case にしていた。 あーはいはいタイポタイポ、と思いながら、あれ? でもこれコンパイル通ってたじゃないの。それは奇妙だ。
ちゃんと動いているのか
% clang --version
Apple clang version 4.1 (tags/Apple/clang-421.11.66) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin12.2.0
Thread model: posix
ふつうの clang さん。
% clang -Wall -pedantic -Wextra -c case.m
a.m:28:8: warning: unused variable 'a' [-Wunused-variable]
A *a = [A new]; // will show "Yay"
^
a.m:26:14: warning: unused parameter 'argc' [-Wunused-parameter]
int main(int argc, char **argv)
^
a.m:26:27: warning: unused parameter 'argv' [-Wunused-parameter]
int main(int argc, char **argv)
^
3 warnings generated.
特に代入文に対する警告もなし。実行してみると
% ./a.out
2013-01-19 15:16:43.918 a.out[4980:707] value = Yay
ちゃんと代入されている。おやおや。
何がおこっているのか
clang に c++ のコードをはかせてみる。 (参考: @niw さんのNSURLConnection の深堀り話)
% clang -Wall -pedantic -Wextra -rewrite-objc -c a.m
出力はこんなのになり、 setter method は
static void _I_A_setLowercaseString_(struct A * self, SEL _cmd, NSString *lowercaseString) { ((struct A_IMPL *)self)->lowercaseString = lowercaseString; }
とつくられている。 setter method の呼び出しは
((void (*)(id, SEL, NSString *))(void *)objc_msgSend)((id)self, sel_registerName("setLowercaseString:"), (NSString *)&__NSConstantStringImpl_a_m_0); // use upper case in setter => ok
になった。なのでちゃんと lowercaseString に値が代入される。
clang はきっと
self.LowercaseString = ...を見て、ああこれは setter method, property name は LowercaseString, じゃあ setter method name は setLowercaseString, あぁあるある…
と考えているのだ。
じゃぁ混ぜると
lowercaseString と LowercaseString っていう property をつくってみるとまずいんじゃなかろうか。
% ./a.out
2013-01-21 13:28:54.279 a.out[11571:707] value = UPPER
2013-01-21 13:28:54.281 a.out[11571:707] value = (null)
ん、残念な結果になる。そもそもほとんど同じ名前の property をつくることはないと思うけれど…
今回コードレビューで指摘されたのは、幸いにも問題にはなっていなかった。テキストエディタのコード補完に頼っていた結果、 LowercaseString っていう class name と lowercaseString っていう property name の違いに気づかないのは、コードの意味を解析しないテキストエディタではありがちなこと。
Objective-C は一見単純なコードの下でいろんなことが起こっていて、下の層に潜って理解したい。しかし -rewrite-objc という clang のコマンドラインオプションは man clang してもでてこないもので、要するに探究心の強い友人がいると便利だという話です。
コマンドラインから iPhone Simulator でアプリを起動するには tmux の外から
/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone\ Simulator.app/Contents/MacOS/iPhone\ Simulator -SimulateApplication path_to_your_app/YourFavouriteApp.app/YourFavouriteApp
おおこれは神だと思ってさっそくやってみたら
% /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone\ Simulator.app/Contents/MacOS/iPhone\ Simulator -SimulateApplication ~/Library/Developer/Xcode/DerivedData/abc-adhplhpbuuwaarcttikvnrpjodtf/Build/Products/Debug-iphonesimulator/CIApp.app/CIApp Could not open job overrides database at: /private/var/db/launchd.db/com.apple.launchd/overrides.plist: 13: Permission denied launch_msg(): Socket is not connected
なんぞ… ぐぐってもひっかからない。
もしや、と思って tmux の外から同じコマンドを叩いてみたら、なんの問題もなくできた。前に GNU screen でも似たようなことがあったからなー。
QA@IT公式ブログ: 2013年、ITエンジニアは英語を学ぶべきか?
あと Job Interview で議論できる程度の英会話力がますます必要になるだろうな。あけましておめでとうございます。21世紀が始まって干支が一巡してしまいました。「ITエンジニアは英語を学ぶべきか」という問いに、今さら「ノー」と答えるヒトは少数派でしょう。答えはもちろんイエスです。ただ、問題は「どの程度?」ということです。
程度問題なので、以下の2つは極論として却下しましょう。
- 英語なんてできなくてもコードで話せるから不要(不要論)
- 英語ができないと、もはや技術について行けない(終末論)
…
「夜は短し歩けよ乙女」には Tumblr に通じるものがあると思う。
