続・るりまの開発環境をDockerで作ってみた

はじめに

昨日書いた記事の続編です。

gamelinks007.hatenablog.com

Dockerを使い、るりまの開発環境(+プレビュー環境)を作ってみました。

環境構築

以下のDockerfileをまず作成します。

FROM ruby:latest

WORKDIR /home

COPY ./ ./

RUN gem install bundler:1.17.2 bitclust-core bitclust-dev refe2 rack

あとはdocker build . -t ruremaを実行してイメージをビルドします。

docker build . -t rurema

次に、docker run --rm -it -p 3000:3000 rurema bashを実行してイメージにアクセスします。

docker run --rm -it -p 3000:3000 rurema bash

あとはアクセスしたDockerコンテナ内で以下のコマンドを実行すればOK

bitclust setup
bitclust statichtml -o tmp
cd tmp
ruby -run -e httpd . -p 3000

ホストのマシン側でlocalhost:3000にアクセスするとこんな感じでビルドしたるりまが表示されます。

f:id:gamelinks007:20200824173109p:plain

あとはVSCodeなどでコンテナにアクセスするなどして編集すればOKそうです(もしくはvimとか入れてコンテナ内で編集するとか)

るりまのビルド環境をDockerで作ってみた

結論

以下のDockerfileでビルド環境はできる

FROM ruby:latest

WORKDIR /home

COPY ./ ./

RUN gem install bundler:1.17.2 bitclust-core bitclust-dev refe2 rack

きっかけ

今日参加したTama.rbでるりまのビルド環境が構築し辛いという話を聞いたのがきっかけ。

tamarb.connpass.com


docs.ruby-lang.org


で、Dockerfileで雑にビルド環境ができないか試してみた。

使い方

使い方は簡単。るりまのソースコード(doctree)内に以下の記述でDockerfileを作る。

FROM ruby:latest

WORKDIR /home

COPY ./ ./

RUN gem install bundler:1.17.2 bitclust-core bitclust-dev refe2 rack

あとはdocker build . -t ruremaでビルドするだけ。

docker build . -t rurema

あとはビルドしたイメージにアクセスして、HTMLなどをビルドするディレクトリを作ってそこへbitclust statichtml -o buildみたいな感じでビルドすればOK。

ビルドしたものをホストのマシンで見る場合はポートの設定をして、ビルドしたイメージ内でrackなどをインストールしてビルドしたHTMLをレンダリングすればみれる(はず……。試していないのでわからない……)

RubyでRubyを実装する時の罠

結論

複数のクラスを実装しているRuby内部のCコードでbuiltinをいくつか組み合わせるとビルドできなくなる。

RubyRubyを実装する

最近のRubyは「Ruby自体をRubyで実装することで高速化できる」という場面がある。

その辺の詳しいことは以前記事にまとめたのでそちらを参照して頂ければと思います。

gamelinks007.hatenablog.com

で、そういったケースでちょっとした罠があるので未来の自分用にメモとして記事にしてみた。

起きたこと

TrueClassRubyで実装することで高速化できるというチケットを少し前に投げてた。

bugs.ruby-lang.org

パッチも作成してPull Requestで投げたんだけど、CIで軒並み死んでいるということに……(ローカルでちゃんとテスト回してないからこういうことになる……)

テストが落ちた原因としてはbootstraptest/test_insns.rbString#freezeが再定義されていたため。

実は高速化にあたって文字列をfreezeして返すような以下のコードを書いてた。

class TrueClass
  #
  # call-seq:
  #   true.to_s   ->  "true"
  #
  # The string representation of <code>true</code> is "true".
  #
  def to_s
    "true".freeze
  end
end

このコードだとfreezeが再定義されているケースで期待した動作にならなくなってしまうのだった……。

そこで、Ruby内部のC関数を呼び出す実装に変更してみた。

class TrueClass
  #
  # call-seq:
  #   true.to_s   ->  "true"
  #
  # The string representation of <code>true</code> is "true".
  #
  def to_s
    Primitive.attr! 'inline'
    Primitive.cexpr! 'true_to_s(self)'
  end
end

肝はPrimitive.cexpr! 'true_to_s(self)'で、このコードでCで定義された関数を実行している(厳密には、このRubyコードをもとにCの関数が新しく定義され、それを実行しているみたい)

あとはビルドすればOKだろうと思い、ビルドすると関数が再定義されているというエラーが発生。

sh@MyComputer:~/rubydev/build$ make benchmark/trueclass.yml -e COMPARE_RUBY=~/.rbenv/shims/ruby -e BENCH_RUBY=../install/bin/ruby
compiling ../ruby/compile.c
compiling ../ruby/object.c
In file included from ../ruby/object.c:4665:
../ruby/trueclass.rbinc:21:1: エラー: ‘mjit_compile_invokebuiltin_for__bi0’ が再定義されました
   21 | mjit_compile_invokebuiltin_for__bi0(FILE *f, long index, unsigned stack_size, bool inlinable_p)
      | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from ../ruby/object.c:4664:
../ruby/kernel.rbinc:42:1: 備考: 前の ‘mjit_compile_invokebuiltin_for__bi0’ の宣言はここです
   42 | mjit_compile_invokebuiltin_for__bi0(FILE *f, long index, unsigned stack_size, bool inlinable_p)
      | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: 警告: 認識できないコマンドラインオプション ‘-Wno-self-assign’ です
cc1: 警告: 認識できないコマンドラインオプション ‘-Wno-parentheses-equality’ です
cc1: 警告: 認識できないコマンドラインオプション ‘-Wno-constant-logical-operand’ です
Makefile:424: recipe for target 'object.o' failed
make: *** [object.o] Error 1

原因

Rubyの実装(Cのコード)では一つのソースコード内にいくつかのRubyのクラスが定義されていることがある。
例えばobject.cではObjectクラスのほかNilClassやTrueClassなども定義されている。

今回は既にKernelモジュールの一部メソッドがRubyで実装されており、そこへ追加でTrueClassを別ファイルで実装したのがまずかった。

RubyRubyを実装した場合、ビルド時にRubyのコードをもとに.rbinc拡張子でCのコードが自動生成される。
その.rbincをCのコード内でインクルードすることでRubyで実装したメソッドを実行できるようにしている。

つまり今回の場合は以下のような形で二つの.rbincをインクルードしていた。

#include "kernel.rbinc"
#include "trueclass.rbinc"

これがまずい背景としては自動生成されたCコードの関数名がかぶってしまっているため。
なので、上記のようにインクルードすると#include "trueclass.rbinc"の部分で関数の再定義が起きてしまう。

つまり、RubyRubyを実装する場合は基本的にCコード(object.cなど)に対して、Rubyのコードと.rbincが一つづつセットでないとエラーになるということ。

対処法

原因がはっきりしたので対処法をアレコレ考えてみた。
まあ、結論から言えば「自動生成されているCの関数名が重複しなければいい」ので、重複しないように修正した。

RubyのコードをCコードに変換しているのはtool/mk_builtin_loader.rbというファイルになる。

で、このファイルの中で定義されているmk_builtin_headerメソッド内でCコードへの自動変換を行っている。

def mk_builtin_header file
  base = File.basename(file, '.rb')
  ofile = "#{file}inc"

  # bs = { func_name => argc }
  code = File.read(file)
  collect_iseq RubyVM::InstructionSequence.compile(code).to_a
  collect_builtin(base, Ripper.sexp(code), 'top', bs = {}, inlines = {})

  begin
    f = open(ofile, 'w')
  rescue Errno::EACCES
    # Fall back to the current directory
    f = open(File.basename(ofile), 'w')
  end
  begin
    if File::ALT_SEPARATOR
      file = file.tr(File::ALT_SEPARATOR, File::SEPARATOR)
      ofile = ofile.tr(File::ALT_SEPARATOR, File::SEPARATOR)
    end
    lineno = __LINE__
    f.puts "// -*- c -*-"
    f.puts "// DO NOT MODIFY THIS FILE DIRECTLY."
    f.puts "// auto-generated file"
    f.puts "//   by #{__FILE__}"
    f.puts "//   with #{file}"
    f.puts '#include "internal/compilers.h"     /* for MAYBE_UNUSED */'
    f.puts '#include "internal/warnings.h"      /* for COMPILER_WARNING_PUSH */'
    f.puts '#include "ruby/ruby.h"              /* for VALUE */'
    f.puts '#include "builtin.h"                /* for RB_BUILTIN_FUNCTION */'
    f.puts 'struct rb_execution_context_struct; /* in vm_core.h */'
    f.puts
    lineno = __LINE__ - lineno - 1
    line_file = file

    inlines.each{|cfunc_name, (body_lineno, text, locals, func_name)|
      if String === cfunc_name
        f.puts "static VALUE #{cfunc_name}(struct rb_execution_context_struct *ec, const VALUE self)"
        lineno += 1
        lineno, str = generate_cexpr(ofile, lineno, line_file, body_lineno, text, locals, func_name)
        f.write str
      else
        # cinit!
        f.puts "#line #{body_lineno} \"#{line_file}\""
        lineno += 1
        f.puts text
        lineno += text.count("\n") + 1
        f.puts "#line #{lineno + 2} \"#{ofile}\"" # TODO: restore line number.
        lineno += 1
      end
    }

    bs.each_pair{|func, (argc, cfunc_name)|
      decl = ', VALUE' * argc
      argv = argc                    \
           . times                   \
           . map {|i|", argv[#{i}]"} \
           . join('')
      f.puts %'static void'
      f.puts %'mjit_compile_invokebuiltin_for_#{func}(FILE *f, long index, unsigned stack_size, bool inlinable_p)'
      f.puts %'{'
      f.puts %'    fprintf(f, "    VALUE self = GET_SELF();\\n");'
      f.puts %'    fprintf(f, "    typedef VALUE (*func)(rb_execution_context_t *, VALUE#{decl});\\n");'
      if inlines.has_key? cfunc_name
        body_lineno, text, locals, func_name = inlines[cfunc_name]
        lineno, str = generate_cexpr(ofile, lineno, line_file, body_lineno, text, locals, func_name)
        f.puts %'    if (inlinable_p) {'
        str.gsub(/^(?!#)/, '    ').each_line {|i|
          j = RubyVM::CEscape.rstring2cstr(i).dup
          j.sub!(/^    return\b/ , '    val =')
          f.printf(%'        fprintf(f, "%%s", %s);\n', j)
        }
        f.puts(%'        return;')
        f.puts(%'    }')
      end
      if argc > 0
        f.puts %'    if (index == -1) {'
        f.puts %'        fprintf(f, "    const VALUE *argv = &stack[%d];\\n", stack_size - #{argc});'
        f.puts %'    }'
        f.puts %'    else {'
        f.puts %'        fprintf(f, "    const unsigned int lnum = GET_ISEQ()->body->local_table_size;\\n");'
        f.puts %'        fprintf(f, "    const VALUE *argv = GET_EP() - lnum - VM_ENV_DATA_SIZE + 1 + %ld;\\n", index);'
        f.puts %'    }'
      end
      f.puts %'    fprintf(f, "    func f = (func)%"PRIdPTR"; /* == #{cfunc_name} */\\n", (intptr_t)#{cfunc_name});'
      f.puts %'    fprintf(f, "    val = f(ec, self#{argv});\\n");'
      f.puts %'}'
      f.puts
    }

    f.puts "void Init_builtin_#{base}(void)"
    f.puts "{"

    table = "#{base}_table"
    f.puts "  // table definition"
    f.puts "  static const struct rb_builtin_function #{table}[] = {"
    bs.each.with_index{|(func, (argc, cfunc_name)), i|
      f.puts "    RB_BUILTIN_FUNCTION(#{i}, #{func}, #{cfunc_name}, #{argc}, mjit_compile_invokebuiltin_for_#{func}),"
    }
    f.puts "    RB_BUILTIN_FUNCTION(-1, NULL, NULL, 0, 0),"
    f.puts "  };"

    f.puts
    f.puts "  // arity_check"
    f.puts "COMPILER_WARNING_PUSH"
    f.puts "#if GCC_VERSION_SINCE(5, 1, 0) || __clang__"
    f.puts "COMPILER_WARNING_ERROR(-Wincompatible-pointer-types)"
    f.puts "#endif"
    bs.each{|func, (argc, cfunc_name)|
      f.puts "  if (0) rb_builtin_function_check_arity#{argc}(#{cfunc_name});"
    }
    f.puts "COMPILER_WARNING_POP"

    f.puts
    f.puts "  // load"
    f.puts "  rb_load_with_builtin_functions(#{base.dump}, #{table});"

    f.puts "}"
  ensure
    f.close
  end
end

今回関数名が重複している箇所はf.puts %'mjit_compile_invokebuiltin_for_#{func}(FILE *f, long index, unsigned stack_size, bool inlinable_p)'なのでこれを以下のように変更した。

f.puts %'mjit_compile_invokebuiltin_for_#{func.hash.abs}(FILE *f, long index, unsigned stack_size, bool inlinable_p)'

funcは呼び出されたCの関数名などが文字列で渡されており、それをハッシュ値に変換している。absを使っているのは値がマイナスの際にエラーになるのを回避するため。

あとは、自動生成された関数を呼び出せるようにする箇所を以下のように修正する。

f.puts "    RB_BUILTIN_FUNCTION(#{i}, #{func}, #{cfunc_name}, #{argc}, mjit_compile_invokebuiltin_for_#{func.hash.abs}),"

こちらも同じように文字列をハッシュ値にしている。

補足

「なぜこれで関数名が重複しないのか?」と疑問が湧くかもしれないので、補足する。

Rubyで書いた実装はビルド時にCのコードへと変換されるんだけど、これはそれぞれのファイルごとに処理される(今回ならkernel.rbtrueclass.rbは別々に処理される)

そのため文字列をハッシュ値に変換するのがそれぞれのファイルで実行される形になる。
で、Rubyで文字列のハッシュ値に変換する場合は実行するごとに値が異なるので値が同じにならないということ(まあハッシュ値の衝突とかは起こる可能性も考慮しなきゃなんだけども……)

なので、こういった修正でビルドができるようになる。

Ruby 2.7でのSEGVの件

結論

Ruby 2.7で以下のコードがSEGVする。

p **1


以下のコミットでmasterでは修正済み。

github.com

ただ、まだバックポートはされていない模様。

ちなみにバグ報告のチケットとしてはこちら

bugs.ruby-lang.org

Ruby 2.7でのSEGV

Ruby 2.7では以下のコードでSEGVが発生する。

p **1

原因としては **1 がキーワード引数として解釈されているため。

原因

**1 のケースだと 1 の部分がリテラルとして解釈されている。
そのため compile.cリテラルを処理している箇所でうまく処理がされず、SEGVが起きている模様(この辺の話はコミッタのmameさんからruby-jpで聞きました。誠にありがとうございます)

なので、以下のようにHashかどうかをチェックするようにすることでSEGVを回避しているみたい。

int empty_kw = nd_type(kw) == NODE_LIT && RB_TYPE_P(kw->nd_lit, T_HASH); 

RB_TYPE_P は第一引数に渡した値と第二引数に渡した値を比較して同じものかを判定している。
今回の場合でいくとHashかどうかをチェックしている感じ。

これによりHashではない値(今回の場合だと数値のリテラルとか)を渡した場合で例外が発生するようになった。

学び

compile.c がどういう処理で使われているかわからなかったんだけど、今回リテラルの処理とかに使われていると知れたのは良かった。
またデバッグしていく中でSEGVが起きている箇所と原因は判明してたけど、それ以外の個所で修正可能な内容だったので視野を広く持つべきだなあと思った。

RubyでRubyを高速化できるかもしれない話

結論

RubyRubyを高速化できるかもしれない話です。
半分は調べた内容のメモ用で書いてます。

どういうこと?

現在開発中のRubyでは一部の実装をRubyで書くことができるようになっています。(ちなみに、Ruby 2.7ではいくつかのメソッドがRuby(とC)で実装されています)

詳しい話は、RubyKaigi 2019 での ko1さんのこのセッションを見ていただければと思います。

youtu.be

ざっくりいうと、キーワード引数やCコード内で例外処理でよしなにしているケースではRubyで実装したほうが速くなることがあるという感じです。

ちなみに、最近ではいくつかのメソッドを完全にRubyで実装するというケースもあります。(Integer#to_iとか)
今回はそのケースを紹介します。

高速化できるケース

具体的に速くなるケースとしては

  • freezeされたオブジェクト(インスタンス)を返すメソッド
  • 返す値が固定(必ずtrueを返すなど)

この二件が同時に満たされたときですね。

freezeされたオブジェクト(インスタンス)が速いのはまあ何となくわかります。
ですが、返す値が固定というのは「どうしてだろう?」となりますね。

なぜ高速化するのか?

これはおそらくですが、Rubyのメソッドキャッシュによるものではないかと思います。
Rubyにはインラインメソッドキャッシュというキャッシュがあります。

インラインメソッドキャッシュとは、以下のようなコードがあった時「実行されるメソッドの定義は常に同じだろう」と考え、それをキャッシュしておくことで高速化するというものです。

5,times{ puts :hoge }

つまりメソッドが返す値が固定である場合、インラインメソッドキャッシュが効きやすく高速になるということです。

ちなみに、インラインメソッドキャッシュの詳しい内容は以下の記事などを読んでいただければと思います。

magazine.rubyist.net

http://rvm.jp/yarv/imc.presentation.pdf

qiita.com

具体例

以下のようなコードで大体1.3倍くらいとかの高速化ができます。

class TrueClass
  def to_s
    "true".freeze
  end
  alias_method :inspect, :to_s

  def |(bool)
    true
  end
end

ちなみに、ベンチマークはこんな感じです。

benchmark:
  to_s: |
    true.to_s
  inspect: |
    true.inspect
  or: |
    true | false
loop_count: 1000000

これを ruby 2.8.0dev (2020-08-20T04:24:55Z master 6509652c13) [x86_64-linux]にパッチとして当ててベンチマークを実行すると以下のような結果になりました。

sh@MyComputer:~/rubydev/build$ make benchmark/trueclass.yml -e COMPARE_RUBY=~/.rbenv/shims/ruby -e BENCH_RUBY=../install/bin/ruby
# Iteration per second (i/s)

|         |compare-ruby|built-ruby|
|:--------|-----------:|---------:|
|to_s     |     66.001M|   91.927M|
|         |           -|     1.39x|
|inspect  |     70.464M|   97.220M|
|         |           -|     1.38x|
|or       |     61.434M|   86.484M|
|         |           -|     1.41x|

compare-rubyがパッチを当てる前のもので、built-rubyがパッチを当てたものです。
おおよそ1.3~1.4倍くらい速くなりそうです。

おわりに

ほかにもいくつかのメソッドをRubyを高速化できるかもしれないのでベンチマークなどを取りつつパッチを投げたい。

備考

さっそくパッチ投げてみた

bugs.ruby-lang.org

パッチを投げてたけど、テスト回すの忘れてたのでCIで落ちまくってた……

RubyのナンパラでSEGV

結論

Ruby 2.7ではこのコードでSEGVする模様(WSL2 上の Ubuntu 18.04で確認)

[1, 2, 3, 4].map{ _1 **3 }

やりたかったこと

Ruby 2.7から導入された numbered parameter を使って配列内の数値を3乗したものを作ろうとした。
が、SEGVが起きてしまった。

sh@MyComputer:~/rubydev/bugs$ ruby -e "[1, 2, 3, 4].map{ _1 **3 }"
-e:1: [BUG] Segmentation fault at 0x0000000000000007
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux]

-- Control frame information -----------------------------------------------
c:0004 p:0006 s:0016 e:000012 BLOCK  -e:1 [FINISH]
c:0003 p:---- s:0010 e:000009 CFUNC  :map
c:0002 p:0005 s:0006 e:000005 EVAL   -e:1 [FINISH]
c:0001 p:0000 s:0003 E:000d00 (none) [FINISH]

-- Ruby level backtrace information ----------------------------------------
-e:1:in `<main>'
-e:1:in `map'
-e:1:in `block in <main>'

-- Machine register context ------------------------------------------------
 RIP: 0x00007f8030a95a52 RBP: 0x00007f8030fd8f30 RSP: 0x00007ffc361da270
 RAX: 0x00007f8030ed9090 RBX: 0x0000000001195650 RCX: 0x0000000000000000
 RDX: 0x0000000000000007 RDI: 0x0000000000000000 RSI: 0x00007f8030fd8f30
  R8: 0x00007ffc361da590  R9: 0x000000000000001f R10: 0x000000000000000e
 R11: 0x00007f8030a9a330 R12: 0x00000000011e8fd8 R13: 0x0000000000000002
 R14: 0x00000000011f1d68 R15: 0x0000000001243c20 EFL: 0x0000000000010202

-- C level backtrace information -------------------------------------------
/home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7(rb_vm_bugreport+0x573) [0x7f8030abc9f3] vm_dump.c:755
/home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7(rb_bug_for_fatal_signal+0xe7) [0x7f80308e4b47] error.c:658
/home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7(sigsegv+0x49) [0x7f8030a1b819] signal.c:946
/lib/x86_64-linux-gnu/libpthread.so.0(__restore_rt+0x0) [0x7f80303ea890]
/home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7(CALLER_REMOVE_EMPTY_KW_SPLAT+0x8) [0x7f8030a95a52] vm_insnhelper.c:1996
/home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7(CALLER_REMOVE_EMPTY_KW_SPLAT) vm_insnhelper.c:1983
/home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7(vm_call_cfunc) vm_insnhelper.c:2535
/home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7(vm_call_method+0xcb) [0x7f8030aaa3cb] vm_insnhelper.c:3053
/home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7(vm_call_method_missing+0x172) [0x7f8030aaa682] vm_insnhelper.c:2744
/home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7(vm_call_method+0x12e) [0x7f8030aaa42e] vm_insnhelper.c:3013
/home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7(vm_sendish+0x96) [0x7f8030aa2b13] vm_insnhelper.c:4023
/home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7(vm_exec_core) insns.def:801
/home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7(rb_vm_exec+0x16c) [0x7f8030aa879c] vm.c:1920
/home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7(invoke_block_from_c_bh+0x168) [0x7f8030aacd73] vm.c:1044
/home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7(vm_yield) vm.c:1179
/home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7(rb_yield_0) vm_eval.c:1227
/home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7(rb_yield_1) vm_eval.c:1233
/home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7(rb_yield) vm_eval.c:1243
/home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7(rb_ary_collect+0x5c) [0x7f803085595c] array.c:3065
/home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7(vm_call_cfunc_with_frame+0x4d) [0x7f8030a9571c] vm_insnhelper.c:2514
/home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7(vm_call_cfunc) vm_insnhelper.c:2539
/home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7(vm_call_method+0xcb) [0x7f8030aaa3cb] vm_insnhelper.c:3053
/home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7(vm_sendish+0x23) [0x7f8030aa2bcd] vm_insnhelper.c:4023
/home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7(vm_exec_core) insns.def:782
/home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7(rb_vm_exec+0x16c) [0x7f8030aa879c] vm.c:1920
/home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7(rb_ec_exec_node+0xaa) [0x7f80308e957a] eval.c:277
/home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7(ruby_run_node+0x4a) [0x7f80308eec2a] eval.c:335
/home/sh/.rbenv/versions/2.7.0/bin/ruby(main+0x5b) [0x40090b] ./main.c:50

-- Other runtime information -----------------------------------------------

* Loaded script: -e

* Loaded features:

    0 enumerator.so
    1 thread.rb
    2 rational.so
    3 complex.so
    4 ruby2_keywords.rb
    5 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-linux/enc/encdb.so
    6 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-linux/enc/trans/transdb.so
    7 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-linux/rbconfig.rb
    8 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/compatibility.rb
    9 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/defaults.rb
   10 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/deprecate.rb
   11 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/errors.rb
   12 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/version.rb
   13 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/requirement.rb
   14 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/platform.rb
   15 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/basic_specification.rb
   16 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/stub_specification.rb
   17 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/util.rb
   18 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/text.rb
   19 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/user_interaction.rb
   20 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/specification_policy.rb
   21 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/util/list.rb
   22 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/specification.rb
   23 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/exceptions.rb
   24 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/bundler_version_finder.rb
   25 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/dependency.rb
   26 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/core_ext/kernel_gem.rb
   27 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-linux/monitor.so
   28 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/monitor.rb
   29 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb
   30 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/core_ext/kernel_warn.rb
   31 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems.rb
   32 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/path_support.rb
   33 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean/version.rb
   34 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean/core_ext/name_error.rb
   35 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean/levenshtein.rb
   36 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean/jaro_winkler.rb
   37 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean/spell_checker.rb
   38 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean/spell_checkers/name_error_checkers/class_name_checker.rb
   39 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean/spell_checkers/name_error_checkers/variable_name_checker.rb
   40 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean/spell_checkers/name_error_checkers.rb
   41 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean/spell_checkers/method_name_checker.rb
   42 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean/spell_checkers/key_error_checker.rb
   43 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean/spell_checkers/null_checker.rb
   44 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean/formatters/plain_formatter.rb
   45 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean/tree_spell_checker.rb
   46 /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean.rb

* Process memory map:

00400000-00401000 r-xp 00000000 08:30 1094561                            /home/sh/.rbenv/versions/2.7.0/bin/ruby
00600000-00601000 r--p 00000000 08:30 1094561                            /home/sh/.rbenv/versions/2.7.0/bin/ruby
00601000-00602000 rw-p 00001000 08:30 1094561                            /home/sh/.rbenv/versions/2.7.0/bin/ruby
01193000-01569000 rw-p 00000000 00:00 0                                  [heap]
7f8029dce000-7f8029fbe000 r--s 00000000 08:30 630711                     /lib/x86_64-linux-gnu/libc-2.27.so
7f8029fbe000-7f802aa90000 rw-p 00000000 00:00 0 
7f802aa90000-7f802b47d000 r--s 00000000 08:30 1036292                    /home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7.0
7f802b47d000-7f802b494000 r-xp 00000000 08:30 630748                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f802b494000-7f802b693000 ---p 00017000 08:30 630748                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f802b693000-7f802b694000 r--p 00016000 08:30 630748                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f802b694000-7f802b695000 rw-p 00017000 08:30 630748                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f802b695000-7f802b697000 r-xp 00000000 08:30 1093292                    /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-linux/monitor.so
7f802b697000-7f802b896000 ---p 00002000 08:30 1093292                    /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-linux/monitor.so
7f802b896000-7f802b897000 r--p 00001000 08:30 1093292                    /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-linux/monitor.so
7f802b897000-7f802b898000 rw-p 00002000 08:30 1093292                    /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-linux/monitor.so
7f802b898000-7f802b89a000 r-xp 00000000 08:30 1093377                    /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-linux/enc/trans/transdb.so
7f802b89a000-7f802ba9a000 ---p 00002000 08:30 1093377                    /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-linux/enc/trans/transdb.so
7f802ba9a000-7f802ba9b000 r--p 00002000 08:30 1093377                    /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-linux/enc/trans/transdb.so
7f802ba9b000-7f802ba9c000 rw-p 00003000 08:30 1093377                    /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-linux/enc/trans/transdb.so
7f802ba9c000-7f802ba9e000 r-xp 00000000 08:30 1093322                    /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-linux/enc/encdb.so
7f802ba9e000-7f802bc9d000 ---p 00002000 08:30 1093322                    /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-linux/enc/encdb.so
7f802bc9d000-7f802bc9e000 r--p 00001000 08:30 1093322                    /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-linux/enc/encdb.so
7f802bc9e000-7f802bc9f000 rw-p 00002000 08:30 1093322                    /home/sh/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-linux/enc/encdb.so
7f802bc9f000-7f802bca0000 ---p 00000000 00:00 0 
7f802bca0000-7f802bd41000 rw-p 00000000 00:00 0 
7f802bd41000-7f802bd42000 ---p 00000000 00:00 0 
7f802bd42000-7f802bde3000 rw-p 00000000 00:00 0 
7f802bde3000-7f802bde4000 ---p 00000000 00:00 0 
7f802bde4000-7f802be85000 rw-p 00000000 00:00 0 
7f802be85000-7f802be86000 ---p 00000000 00:00 0 
7f802be86000-7f802bf27000 rw-p 00000000 00:00 0 
7f802bf27000-7f802bf28000 ---p 00000000 00:00 0 
7f802bf28000-7f802bfc9000 rw-p 00000000 00:00 0 
7f802bfc9000-7f802bfca000 ---p 00000000 00:00 0 
7f802bfca000-7f802c06b000 rw-p 00000000 00:00 0 
7f802c06b000-7f802c06c000 ---p 00000000 00:00 0 
7f802c06c000-7f802c10d000 rw-p 00000000 00:00 0 
7f802c10d000-7f802c10e000 ---p 00000000 00:00 0 
7f802c10e000-7f802c1af000 rw-p 00000000 00:00 0 
7f802c1af000-7f802c1b0000 ---p 00000000 00:00 0 
7f802c1b0000-7f802c251000 rw-p 00000000 00:00 0 
7f802c251000-7f802c252000 ---p 00000000 00:00 0 
7f802c252000-7f802c2f3000 rw-p 00000000 00:00 0 
7f802c2f3000-7f802c2f4000 ---p 00000000 00:00 0 
7f802c2f4000-7f802c395000 rw-p 00000000 00:00 0 
7f802c395000-7f802c396000 ---p 00000000 00:00 0 
7f802c396000-7f802c437000 rw-p 00000000 00:00 0 
7f802c437000-7f802c438000 ---p 00000000 00:00 0 
7f802c438000-7f802c4d9000 rw-p 00000000 00:00 0 
7f802c4d9000-7f802c4da000 ---p 00000000 00:00 0 
7f802c4da000-7f802c57b000 rw-p 00000000 00:00 0 
7f802c57b000-7f802c57c000 ---p 00000000 00:00 0 
7f802c57c000-7f802c61d000 rw-p 00000000 00:00 0 
7f802c61d000-7f802c61e000 ---p 00000000 00:00 0 
7f802c61e000-7f802c6bf000 rw-p 00000000 00:00 0 
7f802c6bf000-7f802c6c0000 ---p 00000000 00:00 0 
7f802c6c0000-7f802c761000 rw-p 00000000 00:00 0 
7f802c761000-7f802c762000 ---p 00000000 00:00 0 
7f802c762000-7f802c803000 rw-p 00000000 00:00 0 
7f802c803000-7f802c804000 ---p 00000000 00:00 0 
7f802c804000-7f802c8a5000 rw-p 00000000 00:00 0 
7f802c8a5000-7f802c8a6000 ---p 00000000 00:00 0 
7f802c8a6000-7f802c947000 rw-p 00000000 00:00 0 
7f802c947000-7f802c948000 ---p 00000000 00:00 0 
7f802c948000-7f802c9e9000 rw-p 00000000 00:00 0 
7f802c9e9000-7f802c9ea000 ---p 00000000 00:00 0 
7f802c9ea000-7f802ca8b000 rw-p 00000000 00:00 0 
7f802ca8b000-7f802ca8c000 ---p 00000000 00:00 0 
7f802ca8c000-7f802cb2d000 rw-p 00000000 00:00 0 
7f802cb2d000-7f802cb2e000 ---p 00000000 00:00 0 
7f802cb2e000-7f802cbcf000 rw-p 00000000 00:00 0 
7f802cbcf000-7f802cbd0000 ---p 00000000 00:00 0 
7f802cbd0000-7f802cc71000 rw-p 00000000 00:00 0 
7f802cc71000-7f802cc72000 ---p 00000000 00:00 0 
7f802cc72000-7f802cd13000 rw-p 00000000 00:00 0 
7f802cd13000-7f802cd14000 ---p 00000000 00:00 0 
7f802cd14000-7f802cdb5000 rw-p 00000000 00:00 0 
7f802cdb5000-7f802cdb6000 ---p 00000000 00:00 0 
7f802cdb6000-7f802ce57000 rw-p 00000000 00:00 0 
7f802ce57000-7f802ce58000 ---p 00000000 00:00 0 
7f802ce58000-7f802cef9000 rw-p 00000000 00:00 0 
7f802cef9000-7f802cefa000 ---p 00000000 00:00 0 
7f802cefa000-7f802cf9b000 rw-p 00000000 00:00 0 
7f802cf9b000-7f802cf9c000 ---p 00000000 00:00 0 
7f802cf9c000-7f802d03d000 rw-p 00000000 00:00 0 
7f802d03d000-7f802d03e000 ---p 00000000 00:00 0 
7f802d03e000-7f802f0e8000 rw-p 00000000 00:00 0 
7f802f0e8000-7f802f384000 r--p 00000000 08:30 140826                     /usr/lib/locale/locale-archive
7f802f384000-7f802f56b000 r-xp 00000000 08:30 630711                     /lib/x86_64-linux-gnu/libc-2.27.so
7f802f56b000-7f802f76b000 ---p 001e7000 08:30 630711                     /lib/x86_64-linux-gnu/libc-2.27.so
7f802f76b000-7f802f76f000 r--p 001e7000 08:30 630711                     /lib/x86_64-linux-gnu/libc-2.27.so
7f802f76f000-7f802f771000 rw-p 001eb000 08:30 630711                     /lib/x86_64-linux-gnu/libc-2.27.so
7f802f771000-7f802f775000 rw-p 00000000 00:00 0 
7f802f775000-7f802f912000 r-xp 00000000 08:30 630774                     /lib/x86_64-linux-gnu/libm-2.27.so
7f802f912000-7f802fb11000 ---p 0019d000 08:30 630774                     /lib/x86_64-linux-gnu/libm-2.27.so
7f802fb11000-7f802fb12000 r--p 0019c000 08:30 630774                     /lib/x86_64-linux-gnu/libm-2.27.so
7f802fb12000-7f802fb13000 rw-p 0019d000 08:30 630774                     /lib/x86_64-linux-gnu/libm-2.27.so
7f802fb13000-7f802fb1c000 r-xp 00000000 08:30 630721                     /lib/x86_64-linux-gnu/libcrypt-2.27.so
7f802fb1c000-7f802fd1b000 ---p 00009000 08:30 630721                     /lib/x86_64-linux-gnu/libcrypt-2.27.so
7f802fd1b000-7f802fd1c000 r--p 00008000 08:30 630721                     /lib/x86_64-linux-gnu/libcrypt-2.27.so
7f802fd1c000-7f802fd1d000 rw-p 00009000 08:30 630721                     /lib/x86_64-linux-gnu/libcrypt-2.27.so
7f802fd1d000-7f802fd4b000 rw-p 00000000 00:00 0 
7f802fd4b000-7f802fd4e000 r-xp 00000000 08:30 630734                     /lib/x86_64-linux-gnu/libdl-2.27.so
7f802fd4e000-7f802ff4d000 ---p 00003000 08:30 630734                     /lib/x86_64-linux-gnu/libdl-2.27.so
7f802ff4d000-7f802ff4e000 r--p 00002000 08:30 630734                     /lib/x86_64-linux-gnu/libdl-2.27.so
7f802ff4e000-7f802ff4f000 rw-p 00003000 08:30 630734                     /lib/x86_64-linux-gnu/libdl-2.27.so
7f802ff4f000-7f802ffce000 r-xp 00000000 08:30 123859                     /usr/lib/x86_64-linux-gnu/libgmp.so.10.3.2
7f802ffce000-7f80301ce000 ---p 0007f000 08:30 123859                     /usr/lib/x86_64-linux-gnu/libgmp.so.10.3.2
7f80301ce000-7f80301cf000 r--p 0007f000 08:30 123859                     /usr/lib/x86_64-linux-gnu/libgmp.so.10.3.2
7f80301cf000-7f80301d0000 rw-p 00080000 08:30 123859                     /usr/lib/x86_64-linux-gnu/libgmp.so.10.3.2
7f80301d0000-7f80301d7000 r-xp 00000000 08:30 630843                     /lib/x86_64-linux-gnu/librt-2.27.so
7f80301d7000-7f80303d6000 ---p 00007000 08:30 630843                     /lib/x86_64-linux-gnu/librt-2.27.so
7f80303d6000-7f80303d7000 r--p 00006000 08:30 630843                     /lib/x86_64-linux-gnu/librt-2.27.so
7f80303d7000-7f80303d8000 rw-p 00007000 08:30 630843                     /lib/x86_64-linux-gnu/librt-2.27.so
7f80303d8000-7f80303f2000 r-xp 00000000 08:30 630835                     /lib/x86_64-linux-gnu/libpthread-2.27.so
7f80303f2000-7f80305f1000 ---p 0001a000 08:30 630835                     /lib/x86_64-linux-gnu/libpthread-2.27.so
7f80305f1000-7f80305f2000 r--p 00019000 08:30 630835                     /lib/x86_64-linux-gnu/libpthread-2.27.so
7f80305f2000-7f80305f3000 rw-p 0001a000 08:30 630835                     /lib/x86_64-linux-gnu/libpthread-2.27.so
7f80305f3000-7f80305f7000 rw-p 00000000 00:00 0 
7f80305f7000-7f8030613000 r-xp 00000000 08:30 630874                     /lib/x86_64-linux-gnu/libz.so.1.2.11
7f8030613000-7f8030812000 ---p 0001c000 08:30 630874                     /lib/x86_64-linux-gnu/libz.so.1.2.11
7f8030812000-7f8030813000 r--p 0001b000 08:30 630874                     /lib/x86_64-linux-gnu/libz.so.1.2.11
7f8030813000-7f8030814000 rw-p 0001c000 08:30 630874                     /lib/x86_64-linux-gnu/libz.so.1.2.11
7f8030814000-7f8030bbe000 r-xp 00000000 08:30 1036292                    /home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7.0
7f8030bbe000-7f8030dbe000 ---p 003aa000 08:30 1036292                    /home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7.0
7f8030dbe000-7f8030dc4000 r--p 003aa000 08:30 1036292                    /home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7.0
7f8030dc4000-7f8030dc7000 rw-p 003b0000 08:30 1036292                    /home/sh/.rbenv/versions/2.7.0/lib/libruby.so.2.7.0
7f8030dc7000-7f8030de2000 rw-p 00000000 00:00 0 
7f8030de2000-7f8030e09000 r-xp 00000000 08:30 630683                     /lib/x86_64-linux-gnu/ld-2.27.so
7f8030e86000-7f8030eaa000 r--s 00000000 08:30 630835                     /lib/x86_64-linux-gnu/libpthread-2.27.so
7f8030eaa000-7f8030ed9000 r--s 00000000 08:30 1094561                    /home/sh/.rbenv/versions/2.7.0/bin/ruby
7f8030ed9000-7f8030fde000 rw-p 00000000 00:00 0 
7f8031000000-7f8031007000 r--s 00000000 08:30 130054                     /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
7f8031007000-7f8031009000 rw-p 00000000 00:00 0 
7f8031009000-7f803100a000 r--p 00027000 08:30 630683                     /lib/x86_64-linux-gnu/ld-2.27.so
7f803100a000-7f803100b000 rw-p 00028000 08:30 630683                     /lib/x86_64-linux-gnu/ld-2.27.so
7f803100b000-7f803100c000 rw-p 00000000 00:00 0 
7ffc359de000-7ffc361dd000 rw-p 00000000 00:00 0                          [stack]
7ffc361ed000-7ffc361f0000 r--p 00000000 00:00 0                          [vvar]
7ffc361f0000-7ffc361f2000 r-xp 00000000 00:00 0                          [vdso]


中止

原因

おそらく、_1がメソッドと解釈されているのが原因くさい。
ちなみに、masterでは以下のようなエラーになる

sh@MyComputer:~/rubydev/bugs$ ruby -e "[1, 2, 3, 4].map{ _1 **3 }"
-e:1:in `block in <main>': no implicit conversion of Integer into Hash (TypeError)
        from -e:1:in `map'
        from -e:1:in `<main>'

このことから_1がメソッドと解釈されていることが分かる。
なぜかと言えば、**3がキーワード引数としてメソッドに渡されていると解釈されているためだ。

ちなみに_1**3との間にあるスペースを取り除くと意図したとおりに動作する。

sh@MyComputer:~/rubydev/bugs$ ruby -e "p [1, 2, 3, 4].map{ _1**3 }"
[1, 8, 27, 64]

また、_1.**3でも同様に動作する(メソッド呼び出しと解釈されるため)

sh@MyComputer:~/rubydev/bugs$ ruby -e "p [1, 2, 3, 4].map{ _1.**3 }"
[1, 8, 27, 64]

まとめ

とりあえず、Ruby 2.7 でSEGVするのはまずいのでチケットを作っておこうかと思う。
あと、パッチが作れないかコードを読んでいこうかな(多分、pase.yとか読まなきゃだろうしで怖い……)

Hamada.rbがそろそろ一周年迎える話

Hamada.rbがそろそろ一周年を迎えるので、やりはじめたきっかけとかまとめとこうと思い、つらつらと書いてみました。

 

Hamada.rbって?

 

島根県浜田市にある地域.rbです。多分、島根県西部では唯一の地域.rb。

 

hamadarb.connpass.com

 

また島根県西部のIT系コミュニティとしては唯一定期開催しているところだと思う(以前は、いわみくと!という会が月一でやってたんですが、最近はやってない……)

 

島根県浜田市って?

 

島根県内では三、四番目くらいの規模の都市で、主な産業は水産業

 

ja.wikipedia.org

 

だいたいスーパーに行けば質のいいアジとかノドグロとか買えるので魚が好きな人には天国かもしれない。

あと、意外と温泉も多いし、日本酒の酒蔵とかもある。

 

 

なんではじめたの?

 

理由の一つは、近隣の勉強会とかが無いため。

いわみくと!という会もあるにはあるんだけど、Hamada.rbをはじめるころにはあまり開催されなくなってた。

 

また、島根県内でRubyの勉強会に参加する場合は松江まで移動しないといけないなかった。

 

matsue.rubyist.net

 

 

浜田市からだと車で3時間くらいとかかかるので、参加しにくかった。

 

そういう理由から「浜田にもRubyのコミュニティ欲しいなぁ」と思って、はじめました。

 

普段やってること

 

基本的にHamada.rbはもくもく会に近いので、大体Rubyに関係することを何かしらやってます。

Rubyを勉強し始めた人とか、仕事でRailsをやりたい人とか来てましたね。

 

 

時々雑談とかもありますが、だいたいRubyのことを話してます。ときどきRails関係とか。

新型コロナウイルスの流行前は、どちらかといえばRails関係の話とかが多かった印象。

 

新型コロナウイルスが流行し始めたころからオンラインに切り替えて開催しています。

たぶんしばらくはオンラインで開催することになりそう。

 

あと、Ruby Hacking Challengeというものを同時開催してます。

 

hamadarb.connpass.com

 

CRubyの実装を読んだり、Hackしたりしてます。最近はこっちのほうが参加者が多くなってきている感じですね

もともとはクックパッドで開催されていたもので、公開されているテキストを使いつつ開催させて頂いています。

 

rhc.connpass.com

 

この場を借りて感謝申し上げます。

 

気を付けてること

 

基本的にゆるくやりたいので、ゆるい感じになるように気を使ってます。

初参加の人が緊張してそうなら雑談ぶち込むとかしてますね(オンライン開催になってからは顔が見えないときもあるので、ちょっと難しくなった……)

 

それと、強制はしないことですね。

 

たとえば、オンライン開催だと顔が見えた方が良いケースもあります(表情が見えるので声のトーンだけだとわからないものが分かったり)。

ただ、カメラをオンにしたくない人とかいますし、カメラをオンにできないこともあったり。

なので、その辺は参加者に任せてます(何も考えていないとも言う)

 

たぶんこれは僕が強制されるのが嫌いなのも影響してそうです。

 

 

今後の目標

 

浜田Ruby会議とか開催出来たらいいなぁと思ってます。

少なくとも酒と魚が旨いので懇親会とか盛り上がりそうなので。

 

あとはRailsGirlsとかも開催できればいいなと思ってますね。

 

ただ、どちらも今後の情勢次第なので難しそうかもしれませんが……。