Jupyter와 Ruby 커널의 통신을 들여다 보았습니다.

소개



안녕하세요.

Jupyter와 IRuby 커널이 어떤 통신을하고 있는지 관찰하고 싶다고 생각한 적이 없습니까?

여기에서는 Ruby 커널과 Jupyter가 어떤 통신을 하고 있는지 간단한 방법으로 관찰하고 싶습니다.


정책은 다음과 같습니다.

방법



  • Flammarion 의 윈도우를 시작한다.
  • dRuby 서버를 세워 Flammarion에 자유롭게 쓸 수 있도록 해 둔다.
  • 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로 실행하면 아래와 같은 창이 표시된다고 생각합니다.


    그리고는, f.puts "hoge" 계속하면, 정보를 순차적으로 표시할 수 있는 간이 표시판으로서 사용할 수 있습니다.
    물론, Flammarion에는 여러가지 기능이 붙어 있어, 보통의 GUI 툴 킷과 같이, 버튼을 표시하거나,
    f.button("Click Here!!!") {f.puts "You clicked the button!"}
    



    쉽게 본격적인 그래프를 표시하거나
    f.plot(5.times.map{|t| {y:100.times.map{rand * t}}})
    



    순식간에 마쓰에의 지도를 표시하거나와 마법 같은 기능이 준비되어 있습니다.
    f.map("松江")
    



    Flammarion에 탑재되어 있는 메소드를 표 형식으로 표시해 봅니다.
    f.table (f.methods - Object.methods).each_slice(4).to_a
    



    이것은 좋은 의미에서 상당히 미친 도구가 아닐까요?

    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
    



    prepend를 사용하여 FfirzmqAdapter 클래스 앞에 원숭이 모듈을 배치했습니다. 이렇게하면 ffi-rzmq 어댑터를 통한 통신이 원숭이 메서드를 통해 Flammarion에 표시됩니다. 다른 어댑터를 사용하는 경우도 대체로 같은 느낌으로 할 수 있다고 생각합니다.

    이런 식으로 Jupyter에서 행해지고 있는 통신이 Flammarion의 윈도우에 표시되면 성공입니다.



    덧붙여 여기에서는 IRuby와 Jupyter의 통신에 직접 변경을 가하고 있으므로, typ 하거나 하면 Ruby 커널이 행방불명이 되어, 2번과 통신을 할 수 없게 됩니다. 그 경우는 어쩔 수 없기 때문에 커널을 재기동합니다.

    여러가지 개선 여지는 있습니다만, 첫회이므로, 이런 느낌이라고 생각합니다.

    이 기사는 이상입니다.

    좋은 웹페이지 즐겨찾기