non vorrei lavorare

昔はおもにプログラミングやガジェット系、今は?

2016年第3四半期振り返り

こんばんは、今週は、自分も体調悪く、休み、次男も保育園から呼び出し食らいました。@kjunichiです。

7月

mrubyでPythonを扱えるように取り組んだ。

記事

8月

  • 並列処理やるも、対象としていた問題領域では、効果出ず。残念な結果。
  • HTTPプロトコルの復習および、Keep Aliveな実装。
  • mrubyのsimplehttpサーバーがSafariのPOSTに対応していないことですこしハマる
  • glslをHSLで流すWebサービスを試作するも、記事化に辿りつけず。
  • Riot.jsの勉強会に参加

記事

9月

kindleで自作アプリを入れて動かすことからはじまり、Cordovaでmrubyが動くプラグインAndroid,iOSに対応させた。 3DデスクトップマスコットのGopheronを名実ともにGoで動くようにした。

両環境ともに、UNIXAPIは利用制限が厳しく、結局AndroidならJavaiOSなら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);

やっとたどり着けた。

関連記事

11年前の記事

9年前の記事

5年前の記事

4年前の記事

2年前の記事

Goオールスターズ2に行くので、gopheronをGo言語で動かせるようにした #websocket

おはようございます。奥さんが海外出張で、子供達と実家で過ごしていました。@kjunichiです。

Goオールスターズ2に行かせてもらえる

家族のGoogleカレンダーに駄目元で登録していたら、奥さんの許可が出て、行けることになった。

予習をすることにした。

gopheronとは

electronベースで3D表示にThree.jsを使って、Goのマスコットの3Dデータを読み込んでデスクトップにうろちょろさせる デスクトップアプリ。

子供達はこのキャラクターを「ごーふぁーくん」と読んで、そこそこ気に入っている。 (次男は、青いクマさんと認識してる節もあるが。。)

そもそものきっかけは、

qiita.com

を見て、自分でも作りたくなって始めた経緯があります。

予習内容

背景

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楽しみです。よろしくお願いします。

f:id:kjw_junichi:20161002072141p:plain

関連記事