2016年第3四半期振り返り
こんばんは、今週は、自分も体調悪く、休み、次男も保育園から呼び出し食らいました。@kjunichiです。
7月
mrubyでPythonを扱えるように取り組んだ。
- mrubyでPythonをやった。ふつうにPythonだとつまらないので、Julialang経由で。
- Julia->mrubyの仕組みを試作するもmruby-juliaにはコミット出来ていない。
- mrubyのコントリビューターになれた。
- Julialangでの並列処理に取り組み始めた。
記事
- mruby-juliaでPythonもmrubyから呼び出せるようになった
- Edge.jsで気になって、調べてわかったこと
- TLで「mruby」を検索したらmrubyのコントリビュータになれた
- mrubyでaobenchを動かし、GIFアニメを出力できるようにした
8月
- 並列処理やるも、対象としていた問題領域では、効果出ず。残念な結果。
- HTTPプロトコルの復習および、Keep Aliveな実装。
- mrubyのsimplehttpサーバーがSafariのPOSTに対応していないことですこしハマる
- glslをHSLで流すWebサービスを試作するも、記事化に辿りつけず。
- Riot.jsの勉強会に参加
記事
- GPUを使って、mrubyでのaobenchを更に速くした
- mruby-uuid作った
- hhvmをh2oと連携して動かす〜OSX編〜
- mrubyでHTTP/1.1のKeep-Aliveで複数回リクエストを出してみた
9月
kindleで自作アプリを入れて動かすことからはじまり、Cordovaでmrubyが動くプラグインをAndroid,iOSに対応させた。 3DデスクトップマスコットのGopheronを名実ともにGoで動くようにした。
両環境ともに、UNIXなAPIは利用制限が厳しく、結局AndroidならJava、iOSならCocoaを叩かないと、出来ることが少なく、
見たいな事になってしまうことが分かった。
- 10/2のGoオールスターズ2に向け、予習
- gopheronをgolangから制御できるようにした。
記事
関連記事
mrubyのFile.openをちょっと調べたメモ
おはようございます。最近、兄弟で、意気投合して、結構な時間遊んで、部屋を散らかし放題にしています。@kjunichiです。
背景
iOSでmrubyをCordovaのプラグインとして動かしていて、mruby-ioを加えて、ビルドしたが、 cordovaのカメラプラグインで撮影した画像ファイルのパスをmrubyで開こうとしたら、アプリが落ちた。
mrubyでのFile#openの詳細を知りたくなった。
解析結果
- file.rbにはopenが定義されていない。
- file.cにもopenは定義されていない。
困った。
- FileクラスはIOクラスを継承していることを知る
class File < IO
- IO.openはio.rbで定義されていた!
- IO.openの中身
io = self.new(*args)
なるほど、IO.newを呼んでいた
IO.newはCで定義されていた。()
mrb_define_method(mrb, io, "initialize", mrb_io_initialize, MRB_ARGS_ANY()); /* 15.2.20.5.21 (x)*/
- mrb_io_initializeをみる
mrb_value mrb_io_initialize(mrb_state *mrb, mrb_value io) { struct mrb_io *fptr; mrb_int fd; mrb_value mode, opt; int flags; mode = opt = mrb_nil_value(); mrb_get_args(mrb, "i|So", &fd, &mode, &opt);
あれ?FD前提だ!?
mrb_get_args(mrb, "i|So", &fd, &mode, &opt);
rubyの引数パースの第一引数が整数型で決め打ちされてる!
Rubyはオブジェクト指向だ
- Fileクラスの場合、IO.newではなく、File.newが呼ばれる!
- File.newを調べる
- File.newはfile.rbで定義されていた
def initialize(fd_or_path, mode = "r", perm = 0666) if fd_or_path.kind_of? Fixnum super(fd_or_path, mode) else @path = fd_or_path fd = IO.sysopen(@path, mode, perm) super(fd, mode) end end
fd = IO.sysopen(@path, mode, perm)
- IO.sysopenを調べる
mrb_value mrb_io_s_sysopen(mrb_state *mrb, mrb_value klass) { mrb_value path = mrb_nil_value(); mrb_value mode = mrb_nil_value(); mrb_int fd, flags, perm = -1; const char *pat; int modenum; mrb_get_args(mrb, "S|Si", &path, &mode, &perm); if (mrb_nil_p(mode)) { mode = mrb_str_new_cstr(mrb, "r"); } if (perm < 0) { perm = 0666; } pat = mrb_string_value_cstr(mrb, &path); flags = mrb_io_modestr_to_flags(mrb, mrb_string_value_cstr(mrb, &mode)); modenum = mrb_io_flags_to_modenum(mrb, flags); fd = mrb_cloexec_open(mrb, pat, modenum, perm);
fd = mrb_cloexec_open(mrb, pat, modenum, perm);
- mrb_cloexec_openを調べる
int mrb_cloexec_open(mrb_state *mrb, const char *pathname, mrb_int flags, mrb_int mode) { int fd, retry = FALSE; #ifdef O_CLOEXEC /* O_CLOEXEC is available since Linux 2.6.23. Linux 2.6.18 silently ignore it. */ flags |= O_CLOEXEC; #elif defined O_NOINHERIT flags |= O_NOINHERIT; #endif reopen: fd = open(pathname, flags, mode);
やっとたどり着けた。
関連記事
- mrubyでselfを呼び出されたメソッドのインスタンスとして実行するには
- rubyの代わりにmrubyをつかう→はやくならなかったorz
- mrubyでPostgres.appを使って、LOBも扱ってみた
- mruby-juliaでPythonもmrubyから呼び出せるようになった
- TLで「mruby」を検索したらmrubyのコントリビュータになれた
- mrubyでaobenchを動かし、GIFアニメを出力できるようにした
- GPUを使って、mrubyでのaobenchを更に速くした
- mrubyでHTTP/1.1のKeep-Aliveで複数回リクエストを出してみた
- cordovaのプラグインを作ってkindle fireでmrubyを動かしてみた
- mrubyのFile.openをちょっと調べたメモ
- iOSでもCordovaプラグインを作ってmrubyを動かした
- Windows(MSVC)でmrubyからGPU対応のTensorflowを動かせた
- mrubyでWebカメラを黒い画面にそのまま表示できるようにした
- WindowsでDLLを作ろうとしてmrb_context_runの歴史を調べた
- WindowsでmrubyからGoで作ったライブラリを呼び出して、Webカメラの画像をコマンドプロンプトに表示した
11年前の記事
9年前の記事
5年前の記事
4年前の記事
2年前の記事
Goオールスターズ2に行くので、gopheronをGo言語で動かせるようにした #websocket
おはようございます。奥さんが海外出張で、子供達と実家で過ごしていました。@kjunichiです。
Goオールスターズ2に行かせてもらえる
家族のGoogleカレンダーに駄目元で登録していたら、奥さんの許可が出て、行けることになった。
予習をすることにした。
gopheronとは
electronベースで3D表示にThree.jsを使って、Goのマスコットの3Dデータを読み込んでデスクトップにうろちょろさせる デスクトップアプリ。
子供達はこのキャラクターを「ごーふぁーくん」と読んで、そこそこ気に入っている。 (次男は、青いクマさんと認識してる節もあるが。。)
そもそものきっかけは、
を見て、自分でも作りたくなって始めた経緯があります。
予習内容
背景
Goのマスコットを使っているのに、Goのコードが全く入っていない状態が続いていた。
これではせっかくの勉強会に参加するのにまずいなぁ、ということで、lispからWebSocketを通してElectronを扱っている Ceramicを参考に、Go言語で同様の実装を試みた。
GoとEelectronの連携
Ceramic同様にWebSocketで実装することにした。が、その昔、疑似テザリングツールを自作した際に使った Socket.ioを使うことにした。
ハマりどころ
Go言語向けのSocket.ioのサーバーはすぐに見つかったが、クライアント用のライブラリがなかなか見つからなかった。 あれこれ試してようやく見つけた。
Goとは原因は関係なかったが、今回、gopheron本体に付属するクライアントもGo言語でSocket.ioを使って、任意のメッセージを コマンドラインから送れるようにしようとしていたが、いつまで経っても最初のメッセージが表示されてしまう現象が発生し、 これの解決に時間を取られた。
この問題の原因は、Socket.io周りではなく、受け取ったメッセージをThree.jsのテクスチャとして表示しているが、このテクスチャの 更新がコマンドラインから送信したメッセージで更新されたものになっていなかったのが原因だった。
まとめ
GoでもSocket.ioで手軽にWebSocketを扱えた。今回、Socket.ioサーバーを起動しつつ、Electronを起動するということをGoルーチンを初めて使って実装した。Goとつけて、関数を呼ぶだけで、本当にOKでびっくりした。
そんなわけで、Goオールスターズ2楽しみです。よろしくお願いします。