メドピア開発者ブログ

集合知により医療を再発明しようと邁進しているヘルステックカンパニーのエンジニアブログです。読者に有用な情報発信ができるよう心がけたいので応援のほどよろしくお願いします。

RubyKaigi2018 速報 !! ( 6/2 最終日)

他の「RubyKaigi2018 速報!!」まとめ ( 6/2 13:50 ) RubyKaigi2018 速報 (5/31 1日目)!! - メドピア開発者ブログ
RubyKaigi2018 速報 !! ( 6/1 - 1つ目 ) - メドピア開発者ブログ
RubyKaigi2018 速報 !! ( 6/1 - 2つ目) - メドピア開発者ブログ

Design pattern for embedding mruby into middleware

speakerdeck.com

Cで書かれたソフトウェアの拡張や設定をRubyで書くことが出来るのでは?と考え様々なミドルウェアについて、mrubyで拡張等を行ってきた。

なぜmruby?

  • rubyで書きたい、mrubyの限定された機能が都合が良かった。
  • 今までC言語で書かないといけないため難易度が高かったが、敷居が低く効率が良い。

どうやって組み込むか?

注意点

  • メモリ管理
  • パフォーマンス
  • 使いやすさ

Design Pattern

multi process, multi thread

  • ミドルウェアのスレッド単位でmrb_stateを組み込むことが大事
  • でもそんな単純じゃない、mrb_stateを作る処理が重いのでパフォーマンスに影響が出てしまう。。。
  • mrb_stateとbyte_codeの共有方式が重要

non-blocking

  • ミドルウェア側でnonblockな実装がされていてもmrubyがnonblockになっていないため、そこでパフォーマンスに影響が出てしまう。
  • できるだけmrubyの処理をnonblockで実装させる、blockする処理はミドルウェアのイベントループを優先して、その処理のコールバックによって再開するようにしてあげる。

Build your own tools

http://rubykaigi.org/2018/presentations/shugomaeda.html#jun02

スライド:

slide.rabbit-shocker.org

内容

自由なソフトウェアの話

  • FLOSS (Free Software and Open Source Software)
  • Web ApplicationにはFLOSSが多く含まれている
  • SaaSS (Service as Software Substitute) はあまり好きではない
  • ローカルでできるものはローカルでやりたい

自作したツールの数々

様々な自作アプリに関する紹介でした。最近キーボード自作する人多いですね!

ツールを自作するために必要なもの

  • モチベーション、時間、スキル
  • 自分に自信を持つ
  • 好きなテーマ(自分が使いたいもの)を見つける
  • 飽きる前に動く状態に持っていくために小さく作ろう
  • EmacsはEditorMACroS、つまり拡張可能なエディタ、そういう意味だとvimも同じ。仲良くしよう!

感想

テストは変更しやすくするためのものなので、書きすぎて逆に変更に弱くならないように書きすぎないというのはそのとおりだと思いました。

Deep into Ruby Code Coverage ( 6/2 13:50 )

  • テストが無いコードやデッドコードを検出するのにカバレッジは重要
  • DeepCoverageを使うと分岐のカバレッジをかなり細かくとれる(ruby本家のカバレッジよりも細かい!)
  • 実装は結構大変だった

感想

  • とりあえず試してみたい
  • そもそもruby2.5のカバレッジをまだ使っていなかった…

The Method JIT Compiler for Ruby 2.6 ( 6/2 13:00 )

http://rubykaigi.org/2018/presentations/k0kubun.html#jun02

スライド:

speakerdeck.com

現状のJIT状況

  • すごいバグってる! 
  • 並列にCIが走るとこけてしまう…

RubyのJITコンパイラ

バイトコード->Cのコード->コンパイル->バイトコード

ポータビリティ

Mingwで最適化をおこなったらなんかうごくようになった

パフォーマンス

  • ベンチマーク
  • 去年 : 5倍
  • 今(preview2): 5.7倍
  • 遅くなる場合がある。
    ファミコンは早くなるのにRailsだと遅くなるケースがある…

おそくなる仮設

  • longjump c言語のraiseみたいなもの call cache メソッドキャッシュが聞かない時(キャンセルされた時。再定義など。railsだとけっこうある)

  • JITコンパイルのオーバーヘッド thread間の転送(ロックなどのコスト) そんなに気にしなくて良さそう

  • JIT-ed
    全部nilを返すだけのmethodでなぜか遅くなる… 1メソッドあたり2Mバイト消費する(soファイル。なぜ2Mも) 1個のsoファイルにメソッドをいっぱいつっこめば速くなるがどうやるか

現状

Rails遅くなるから控えて。いろいろ改善しつつはある

navive code

  • GCCがもろもろめんどさを引き受けてくれる
  • われわれはインライン化に精を出せる

インライン化

  • Cコンパイラに最適化をしてもらうためにインライン化が必要
  • 条件
    メソッド定義
    呼び出しコードをJITコンパイラが更新できる
    cacheのinvalidation

インライン化のターゲット

  • Rubyから呼び出されたものはまだ簡単
  • Cから呼び出されたものは難しい
    やればできるけど保守性が下がる

もしRubyがcより早かったら?

  • プロトタイプはある 「C language is dead」

f:id:motsat:20180602133351j:plain

感想

JITによる高速化をめざしたもの。言語の中の人はバイトコードまでおっかけていろいろなアプローチで高速化を試みていてありがたいと思った。 また、Cよりも速くなるケースを作れるという話は単純にすごい。

Reirb: Reborn Irb ( 13:00〜)

概要

irbを作り直している話。

最近のirb

  • 開発が長く停止
  • 似たようなアプリが出てきた
  • Reish(URubyistのためのnixシェル)を開発している過程で、irbを作り直すためのアイデアを思いついた!

Reishの説明(機能)

  • job control
  • reidline
  • smart completion

↑Reirbは上の機能を使える。というかソースコードをかなり再利用してる。

Reirbの字句解析

Ripperを使っている。 irbではRipperを使っていないため、字句解析が不十分。

字句解析とは

irb(main):002:1> p 1
irb(main):003:1> end
1
=> 1

上記のようにstatementを解析し、宣言の終わり(式の終わり)に実行するようにしてくれるやつ?

Ripperとは

  • ruby の Parser

Job-Control

  • ^Z
  • fg, bg, jobs
irb(main):002:1>  p 1
irb(main):003:1>  sleep1
irb(main):003:1> end

上記の時にZで止める機能

reidline

  • readlineの複数行編集可能版
irb(main):002:1>  p 1
irb(main):003:1>  sleep1
irb(main):003:1> end

上記を1行ずつだけでなく、複数行に渡って同時編集できる

  • history
  • messages

Completion

現在実装中

  • bash/zsh風のcompletionを実現したい (edited)

Grow and Shrink - Dynamically Extending the Ruby VM Stack ( 6/2 10:50- )

http://rubykaigi.org/2018/presentations/sugiyama-k.html#jun02

  • 最近Goとか並列処理が得意な言語が増えてきたので、RubyVMのスタック拡張の改修を行っている

  • スタック拡張についてStretchCallStackChainringという2つの手法の紹介

  • 成果として、メモリ使用量の40%程度の削減に成功
  • 今後の課題としては、さらなる性能向上と幅広いテスト環境での検証をしていく

Ruby code from the stratosphere - SIAF, Sonic Pi, Petal ( 6/2 10:50- )

成層圏から来たRuby code http://rubykaigi.org/2018/presentations/kn1kn1.html

スライド:

github.com

  • Sonic Pi 大人から子供まで、Rubyで音楽を簡単につくれるソフトウエア
  • 内部でpetalという言語(Rubyライク)
  • Rubyコードでマリオの名曲を再現できている…
  • petal
    cps 2 # 1秒に2サイクル
d1 'bd*8' # bdという音を8回 * 1鳴らす
d1 'bd*64 [bd]' # 入れ子もできる
d1 'v' , n: 'irand 2 8' # 乱数もある
d1 'v', rate: 0.5 # 音の高さや逆回転などの制御
  • Euclidean rhythm
d1 'bd(5,8)' # 全体を8として、5を分散させる(太鼓っぽい!)
  • 音声ログから、その音声を再現することも可能
    それに音を追加したり

感想

Rubyコードの簡潔な部分が、曲作りや設定にすごく生かされていると感じた。 GUIな作曲ツールと、このツールで作った曲で作りたいものや出来上がるものがけっこう変わってきそう。

tech.medpeer.co.jp


(☝︎ ՞ਊ ՞)☝︎是非読者になってください


メドピアでは一緒に働く仲間を募集しています。 ご応募をお待ちしております!

■募集ポジションはこちら

https://medpeer.co.jp/recruit/entry/

■開発環境はこちら

https://medpeer.co.jp/recruit/workplace/development.html