3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JupyterとRubyカーネルの通信をのぞいてみた

Last updated at Posted at 2019-05-19

はじめに

こんにちは。

JupyterとIRubyカーネルがどんな通信をしているのか観察してみたいなあと思ったことはありませんか?

ここでは、RubyカーネルとJupyterがどのような通信をしているのか、簡単な方法で観察してみたいと思います。
image.png

方針は以下のとおりです。

方法

  1. Flammarion のWindowを立ち上げる。
  2. dRubyサーバーを立てて、Flammarionに自由に書き込めるようにしておく。
  3. IRubyのコードをちょっと書き換えて、通信のたびにFlammarionに書き込む。

ターミナルの標準出力でも大丈夫ですが、あとで応用がききそうなのでFlammarionを使います。

Flammarionの紹介

 Flammarionを知っている人はほぼいないと思うので説明が必要でしょう。FlammarionはelectronとChromeを使って手軽にGUIを作れるイケてるツールです。Rubyのお気軽GUIツールというとShoesを思い浮かべる人がいるかもしれませんが、Flammarionは情報をどんどん表示していくパネルのようなつかい方が向いてます。

使い方はこんな感じです。

require 'flammarion'

# Flammarionを立ち上げる
f = Flammarion::Engraving.new
f.puts "hello world!"

上記をpryやirbで実行すると、下記のようなウィンドウが表示されると思います。
image.png

あとは、f.puts "hoge" つづければ、情報を逐次的に表示できる簡易表示版として使えます。
もちろん、Flammarionにはいろいろな機能がついていて、普通のGUIツールキットのように、ボタンを表示したり、

f.button("Click Here!!!") {f.puts "You clicked the button!"}

image.png

簡単に本格的なグラフを表示したり

f.plot(5.times.map{|t| {y:100.times.map{rand * t}}})

image.png

あっという間に松江の地図を表示したりと、魔法じみた機能が用意されています。

f.map("松江")

image.png

Flammarionに搭載されているメソッドを表形式で表示してみます。

f.table (f.methods - Object.methods).each_slice(4).to_a

image.png

これは良い意味でかなりクレイジーなツールではないでしょうか。

dRubyサーバーを立ち上げる

dRubyもまた古くからある魔術感のあふれるツールですが、私はそんなにスキルが高くないので今回使うのはその機能の表面だけです。ここではFlammarionのウィンドウを立ち上げて、dRubyのフロントオブジェクトとしてセットします。これでIRubyカーネルからFlammarionに書き込めるようになります。

require 'drb/drb'
require 'flammarion'

# Flammarionを立ち上げる
f = Flammarion::Engraving.new

# サーバを起動する
DRb.start_service("druby://localhost:8787", f, :safe_level => 1)
# DRb のスレッドが終了するのを待つ
DRb.thread.join

IRubyに細工をする

ここではRubyのオープンクラスをつかって、Jupyter上から、IRubyに細工をします。ai は awesome_print における inspectです。

require 'drb/drb'
require 'colorize'
require 'awesome_print'

module Monkey
  @@f = DRbObject.new_with_uri("druby://localhost:8787")
  def send(sock, data)
    @@f.puts sock.ai.colorize(:blue)
    @@f.puts data.ai.colorize(:green)
    super(sock, data)
  end
 
  def recv(sock)
    msg = super
    @@f.puts msg.ai.colorize(:yellow)
    msg
  end
end

IRuby::SessionAdapter::FfirzmqAdapter.prepend Monkey

image.png

prependをつかって、FfirzmqAdapterクラスの手前にモンキーモジュールを配置しています。これによって、ffi-rzmqアダプターを経由する通信は、モンキーのメソッドを経由するので、Flammarionに表示されるようになります。他のアダプターを使っている場合も、だいたい同じような感じでできると思います。

こんなかんじでJupyterで行われている通信がFlammarionのウィンドウに表示されれば成功です。

image.png

なお、ここではIRubyとJupyterの通信に直接変更を加えているので、typoしたりするとRubyカーネルが行方不明になり、2度と通信ができなくなります。その場合は仕方ないのでカーネルを再起動します。

いろいろ改善余地はありますが、初回なので、こんな感じだと思います。

この記事は以上です。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?