どうもマコピーです。 昨年に引き続きトークしてきました。
しゃべったこととしては、以下の2つ。
- 過去に行ったプロポと呼ばれるラジコンのコントローラの信号を模倣することで自動制御を行う
- MultiWiiというオープンソースのフライトコントローラが喋るプロトコルをPerlで実装して通信して自動制御を行う
またデモできなかったし、ソースコードは毎度のごとく整理してからアップしますが、去年は12月に公開という遅いスピードでしたので、欲しい方は催促をお願い致します。
聞いたトーク
メリークリスマス!
- Larry WallによるPerl6の機能紹介かなと思いきや、概念トークの香りがしつつ、概念が実体化されてPerl6へと消化されていく過程の話
- 時折ジョークがだいぶ混入してきて同時通訳の人も戸惑っていた気がするw
- 主軸はトールキンのホビット物語をPerl5、指輪物語をPerl6に関連付けて
Second System Syndorome
の話や、Perl5の資産がありながらも夢の様な言語、Perl6を作るのに何を捨てて何を受け継ぐか、という概念的な話でした。すごく物語チック。- 夢の様な言語、というのは僕は強力なGrammerやマルチスレッドなどを見てLL大統一言語(物理学の大統一理論になぞらえて)という言葉を発想してそれからなのだけれど
- 「成功した言語を作れるのは世界を作れる人」という趣旨の発言があったが、言語というのは世界であり、世界もまた言葉で表現されるんだなと、同人小説を書いている身としては感慨深い感じでした。特にLarryは言語学者であり、トールキンもまた言語学者なわけで、言語を作るのに必要な能力が言語を知り尽くす事であるならば、世界を作るのに必要な能力もまた言語を知り尽くすことであるわけで、それぞれプログラミング言語、ハイファンタジー小説と分野は違えど共通する点がいっぱいあるなってなってます。ちょっとグッときてて言葉が散らかっています。
- というわけで、Larryは予防線を張りまくっていたけれど、クリスマスにはベータ版が出るとのこと! それまでにはデカい3つの仕事があるけれどやってくぜ!っていう宣言で締めくくりました
Web由来の組み込みエンジニアの半年間のすべて 〜WebとiOSとBLEとハードウェアデバイスのこと〜
- 仕事でデバイス作るのって想像に容易くないぐらい大変だと思うんですが、聞いていると想像以上に大変だなあと
- 何が大変かというと、これは僕が普段サーバサイドでクライアントアプリを書いている人やデザイナー、ディレクターなど多くの職種がかかわる環境で働いている経験から、分業しつつ1個のものを作るっていうのはめちゃくちゃ大変で、特にまたがる領域なんかはお見合い落球とか押し付け合いとか意識が薄れるゾーンでもあって、でもそこが重要なんだけれど……みたいな感じです
- ハードウェアの場合、分業の領域は kazuphさんの場合だとメカ(機械機構や構造)、エレキ(電子回路)、ファームウェア(マイコンのソフトウェア)、APIサーバと分かれているようですが、漏らしていたのが「エレキの人がもう少しファームを書いてくれれば」というところ。僕は前仕事でやった時は回路引いてファーム書いてファームと通信するライブラリまで書いて、その上を他の方にお任せしたんですが、これはうまくいった。しかしこれはあくまで一般に出回る製品にする仕事ではなかったのでよかったのですが、この話だとAkerunは一般に出回る製品なわけです。相応のクオリティが要求されるし、求められるレベルも高い。のでそれぞれのプロがそれぞれの領域にすごく意識を集中している。そこでまたがる領域、この場合だとおそらく電気回路からの入力をマイコンで受けてそれを上位のレイヤーに引き渡すみたいなところだと思うんですけれど、そこはそれぞれが分からないと書けないので、両方出来る人が1人でやらない限りは、お互い歩み寄って意図を伝えて議論をして仕事しないといけないんですけれど、これがめちゃくちゃ難しい!!!!!!!
- ハード一人でやって来たけれど複数人でやるとこういうのも起こるんだなあという感想をいだきました
Perlで学ぼう!文系プログラマのための、知識ゼロからのデータ構造と計算量
- 僕は高校、大学とガチ理系なはずなんですが、コンピュータサイエンス出身ではなくずっと電気学科で回路図を見て計算をしていた人間なので、このあたりの計算量の話とかデータ構造の話とかはなあなあにしてきた部分ではありました。なあなあだけれどぼんやりでもWebエンジニアは出来るんだなと今思ったけれど、同僚に突っ込まれることはある……
- ほいでこのトークを聞いて連結リストとかB木の計算量がO(n)だったりO(log n)だったりするのは知識では知っていたのだけれどあらためて説明されて納得という形まで落とし込めたのはすごいよい体験だなと思った。
- あとデータ構造はどうすれば理解が深まるかという質問があって、僕の体験を話すと、去年pagerdっていうページャー専用DBなるネタ兵器を作ろうとしてそのときに手でDBを作るようなことをしたのだけれど、DBをイチから作るというのは結構よくて、目的にあった効率的なデータの持ち方というのを調べまくって考えるのでだいぶ良いです。マッチョですがおすすめいたします
PietでLISP処理系を書くのは難しい
- 若干僕はプログラミング言語愛好家的な面もあると思っているんですが、もっぱら実用的なやつを調べるばっかで、難解プログラミング言語に関してはノーマークだったわけですが、Pietはヤバイ。
- Pietって画像がソースコードで1ドット1ドットが命令になってドットの上をプログラムカウンター的な奴が走っていくっぽいんですが、今でも自分が何を言っているのかわからない程度の難解さかつ面白いトークでした
- これがソースコードですと言って、よくわからないドット絵(人間には何が描かれているのか理解できない)を毎回見せられるのがやばい
- さらにその上に独自にLisp処理系を実装しようとしている時点で、かなり先端を突っ走っているホビーと言える。とにかくやばい
- KMCという団体がなかなか謎で京大マイコンクラブと銘打っているのに会場にいる人間に入会を迫ってくるし、トークしている方がもっともおすすめできるPietのエディタがKMCに入らないと入手不可能という権威を誇っている。なおこのあと公開されたようです。
- Pietはやはり人間に難しいので、ニーモニック的なAltPietとも言うべき言語があるらしく、さらにそれを拡張したAltAltPietがあるらしく、ここが地獄の一丁目かと思えるが、ホビーなのでそんな状況でも楽しめる人間は大した種族だなあという発見をした
Perl6 on JVM: It works??
- Perl6は使えるのかどうか?という話
- Perl6の処理系の一つであるRakudo StarはJVM実装とMoarVMと呼ばれる独自のVM実装があり、これらが平行して開発が進められている、というのは冒頭のLarryの話でもありましたが、そのうちJVM実装は現時点で使い物になるのか?という検証
- 結果的に言えばWebアプリケーションでよく使われるであろうパーツ、例えばHTTPクライアントであったりDBであったり、そういったものは(一部難はあるが)ひと通り揃っている
- 一つどうしてもきになるのはやはり起動速度で、
perl6-j -e 'say "Hello"
とやるだけでも16秒ぐらいかかる。ちなみに僕の環境だと最新のRakudo Starでperl6-j --version
とやったら5秒かかる。 - Webサーバは起動しっぱなしなので起動時間がそこまで重要な要素になってくるかと思われるともしかしたら気にならないかもしれないし、多くの人が触っているJVMでJITが効くので起動しっぱなしアプリはもしかしたら速いかも。これは要検証ですね
Parallelism, Concurrency, and Asynchrony in Perl 6
- タイトルの通り並列、非同期、平行を軸にPerl6の機能を見ていくというもの
- Perl6はマルチスレッド言語です!!!! これは驚きとともに歓喜
- Perl5はスレッドを(まともには)扱えない。我々Perl5でアプリケーションを書いている人間でマルチコアを使いたい場合はforkを使っていた。コレはいろいろな面で良くていろいろな面で不利を抱えているのだけれど、そんな理由もあって僕はマルチスレッドを理解しやすく扱えるGolangを最近書いているというのもある。
- 宣言的に処理を書いたら勝手にパイプが組まれてストリーミングプロセッシング的なことが出来るという話があって「!?!?」となった。Perl6のスケジューラ氏が気になる。実用的かさておき夢っぽい。
- C#のasync/await的な機能があるが、もっと抽象化されているsupplyとかreact、wheneverというのがあり、これらは同期的な処理を非同期的な処理に変換しただろうかという発想で出てきたものらしい。wheneverはforループにあたる。PromisesとかChannel的な挙動も出来るのだけれど、わかりやすい、ここは桃源郷か? なおこのあたりがRakudo Starにマージされたのが5日前らしく、今のリリースパッケージには入っていないっぽい。
- このあとPerl6のOO的なコードが出てきてPerl5脳が機能停止したので、だいぶ読めない。class methodあたりはM族ライブラリ(Moose/Mouse/Mooなど)で使えるのでまあわかるが、
%!hash
ってなんだ!?- 調べたところ!がつくとprivate accessorになるっぽい
- 飛行機の席を取るときにマルチスレッドで並行で走ると同時に同じ席をとったりしてやばいよねーという話題で、そのときにメソッドをアトミックに実行する(おそらくarroundして入り口でロックを取り出口で外す)ようなふうにmixinしてくれる(mixinなのかはコードが読めないので憶測)やーつで、いかがそのソースコード。質疑応答で複雑ではないか?というのに対しすごく薄いと言う答えであったが、コード量はそうでもないがPerl6力が足りなくて読めない
- というわけでPerl6にすごく期待が持てるトークでした。たぶんリリースまでにいくつかのシンタックスの最適化とか機能の実装が入ると思いますが、そのあとに皆さん気になっているパフォーマンス改善の話がやってくると思うので、僕は座して待つ。
Profiling & Optimizing in Go
- bradfitz氏のGoプログラムのチューニングのライブコーディング
- 普段仕事でGoを書いているのですがよく「メモリアロケーションがー」とか「文字列連結がー」とか言われて、ふむふむなるほどと思いつつもぼんやりしていた理解なのですが、軽快なライブコーディングでちょっとだけ理解が進んだ気がする。
- 例えば
[]byte
をstringを受ける関数に投げるとき、しかもそれが複数の文字列を連結した渡したい場合ってよくあるんですけれど、お手軽にやるなら[]byte("hoge" + "fuga" + "bar")
みたいな感じにするんだけれどこれだと何回かメモリアロケーションが走ってメモリ確保にCPUがぶんどられてしまうので、それならfmt.Fprintf
でio.Writer
実装しているやつに一気に流し込もうや、って話とか、fmt.Fprintf
はinterface{}
で受けるのでそれだとreflect
が使われて遅いので裏技的にsync.Pool
使ってreflectを回避するとか(この方法はネタなので実際にはやらないでねとのこと)、そういう話でした。 - 便利ツールとしてpprofでcpuを使っているステートメントを見たり、同じくメモリも解析したり、さらに複数のベンチマーク結果を後から比較していい感じに出してくれるツールなどピリッと辛いツールが出てきてGo way〜って感じでした
その他
- YAPC終わりとみんな勘違いしているけれど、あくまで今の体制でのYAPCが終了なわけで誰かが挙手すれば続けられるという状況は実は2013年が終わった時とあんまり変わらないんじゃないかなあと思う。外から見れば
- で、今回の2000人規模がデカすぎて、準備の負荷が高いからもっと小さい規模でやるというのは結構な人から言われている意見で、それをポツポツやるのもいいと思う!!!
- ア、Yokohama.pmやらないと
- Beaconというのもやるらしく期待。僕はWebの人でもありMakerの人でもあると(自分で勝手に)思っているのだけれど、本来これら2つは別に明確に分ける必要はなくて双方が双方で歩み寄って干渉しあう事できないかなーと思っていたので、(もしかしたらそういうことじゃないかもしれないけれど)すごく期待。
以下は闇
今回の目標は「今喋りたいことを今喋る!」ということなんですけれど、それはお概ね達成出来ました。特にアナログスイッチを使った切替回路とかフェイルセーフの仕組みなどは実装した当時からコレをいつかどこかで話したいなーと思っていて、記憶からなくなる前に喋れたので良かったです。
でもちょっと喋りながら反応を見ていて思ったのが、聴衆が期待していたトークともしかしてだいぶ違っていたのでは?という点についてです。 民生のクアッドコプターのうち、やはりParrot社のものがソフトウェアからのハックがしやすく、そもそもLinuxを積んでWiFiが喋られる、さらにSDKまで公開されているものは他にありませんし、今回のトークには持ってこいかと思われます。 そうなんですが、僕はやるとなれば持てる技術を投入して自分が面白いと思える方向に突き進む人間でして、特に趣味となれば合理性をガン無視して面白軸で行くのですが、さてそれがあのタイトルで見に来た方の期待に沿ったトークであったかと言われると、ちょっと自己満足すぎたのではないかなあと思いました。
と長々と反省しておりますが、多くの人がよく分からないが面白く話す人もいるのでそっち方向に鍛えるか、それともこういう尖ったテーマを大勢の前で話すのは控えるか、という話になるなあと思いました。 そんなわけで、今は皆様の感想がなくて僕が卑屈になっていっている一方なので、感想をください。よくわからんかったとかでもいいので・・・
そういうわけで画面汚し失礼しました。