2020-12-23

Steep by Steep(Day2)

 この記事は、ケーシーエスキャロット Advent Calendar 2020 23日目の記事です。


昨日は、naokishi の aws cli と jq コマンド でした。

今、AWS使ってるんですねー。もうWindowsアプリは開発していないのかな…?


さて、前回はエラーが増えたところで終わりました。

一度、リポジトリ にあるサンプルコードを実行してみようか…

ということで、コピペで実行してみると…



$ bundle exec steep check --log-level=fatal
lib/phone.rb:9:2: MethodBodyTypeMismatch: method===, expected=bool, actual=(bool | nil) (def ==(other))
  (bool | nil) <: bool="" false="" nil="" true="="> nil 
<: bool="" false="" nil="" true="=">
エラーが出ました... が、一昨日出ていたエラーとは違うし、
このメソッド以外のチェックは通っているようなので、
このエラーは置いておいて、メソッドの定義について確認してみます。

うーん…(コードを見比べている)

!!!

メソッドのパラメータだ!!!!
で、以下のようにコードを修正して実行してみると…

class User
  def initialize(no:, name:)                                                                                                
    @no = no
    @name = name
    @scores = Array.new
  end
  attr_reader :no, :name, :scores

  def add(score:)
    @scores << score
  end
end

$ bundle exec steep check --log-level=fatal
bin/main.rb:20:2: NoMethodError: type=singleton(::File), method=open (File.open(fpath, "w") {|fd| fd.write data })
bin/main.rb:22:24: ArgumentTypeMismatch: receiver=singleton(::Analyzer), expected={ :path => untyped }, actual=::String (fpath)
lib/analyzer.rb:6:2: MethodArityMismatch: method=(self) (def self.load(path))
lib/analyzer.rb:15:2: MethodArityMismatch: method=(self) (def self.parse_row(row))
lib/analyzer.rb:16:8: IncompatibleArguments: receiver=singleton(::User), method_type=(name: untyped, no: untyped) -> ::User (User.new(row["No"], row["Name"]))

メソッドの定義がSteepで解析されて、Userのエラーが消えました!!!

同じように、Analyzerも修正すると、

bin/main.rb:20:2: NoMethodError: type=singleton(::File), method=open (File.open(fpath, "w") {|fd| fd.write data })
bin/main.rb:22:24: ArgumentTypeMismatch: receiver=singleton(::Analyzer), expected={ :path => untyped }, actual=::String (fpath)
lib/analyzer.rb:16:8: IncompatibleArguments: receiver=singleton(::User), method_type=(name: untyped, no: untyped) -> ::User (User.new(row["No"], row["Name"]))

エラーが更に減った〜

出ているエラーが全部違うので、ここからは1つずつ確認していこう…


NoMethodError

これはRubyを使っているとよく見るエラーですが、RubyのNoMethodErrorではなく、TypeInference::MethodCall::NoMethodError です。

エラーとして検出されている場所は、`File.open()` のRubyのクラス。
Rubyのクラス検知して、エラーにされている???

うーん...  steep の `--verbose` オプション付けて、ログ出力してみるか…


bundle exec steep check --log-level=fatal --verbose --log-output="./check.log"

出力されたログを確認してみると、、、
あぁ、なるほど、ここのファイル読み込んでる。
で、File.rbs を見てみると…

なるほど、確かに `File.open()` が定義されていない…。
initialize が定義されているので、 `File.new()` に変えてみて、実行してみる。

bin/main.rb:22:2: UnexpectedBlockGiven: method_type=((::string | ::_ToPath | ::int), ?(::string | ::int), ?::int) -> ::File (File.new(fpath, "w") {|fd| fd.write data })
bin/main.rb:25:24: ArgumentTypeMismatch: receiver=singleton(::Analyzer), expected={ :path => untyped }, actual=::String (fpath)
lib/analyzer.rb:16:8: IncompatibleArguments: receiver=singleton(::User), method_type=(name: untyped, no: untyped) -> ::User (User.new(row["No"], row["Name"]))
お、エラーが変わった。(行数が変わっているのは、元のコードをコメントアウトして残しているため)

UnexpectedBlockGiven は、`File.new()` の定義は、Fileクラスを返す定義になっていて、blockを渡す定義がされていないからだな。なるほど、なるほど。

`File.open()` の行を以下のように結局書き換える。

   # rbs に File.open()が定義されていない
   # File.open(fpath, "w") {|fd| fd.write data }
   fd = File.new(fpath, "w")
   fd.write data
   fd.close
 

$ bundle exec steep check --log-level=fatal
bin/main.rb:26:24: ArgumentTypeMismatch: receiver=singleton(::Analyzer), expected={ :path => untyped }, actual=::String (fpath)
lib/analyzer.rb:16:8: IncompatibleArguments: receiver=singleton(::User), method_type=(name: untyped, no: untyped) -> ::User (User.new(row["No"], row["Name"]))
やった! main.rb で出ていた、Fileクラスのエラーが消えました!

ArgumentTypeMismatch, IncompatibleArgument


この2つのエラーですが、キーワード引数に変更した時の呼び出し側の修正をしていなかったことで出ていたエラーでした。

bin/main.rb 実行したらエラーになったので、修正したら、上記エラーはでなくなりました。(テスト書いてないから、こういうことになるんだよ…テスト大事)


エラーが出なくなったから、終わり!!!にはなりません。


なぜなら、rbsファイルには、`untyped` の宣言しかしていないのだから…

本番はこれからです。

rbsファイルに型を定義する

rbs ファイルを以下のように修正しました。
(Structを使ったクラスはとりあえず、untypedのまま)

class User
  @no: Integer
  @name: String
  @scores: Array[untyped]
  def initialize: (no: Integer, name: String) -> untyped
  def add: (score: untyped) -> untyped                                                                                      
end

class Analyzer
  def self.load: (path: String) -> Array[User]
  def self.parse_row: (row: CSV::Row) -> User
end

これで実行すると、、、

$ bundle exec steep check --log-level=fatal
sig/sample.rbs:11:28...11:36	UnknownTypeNameError: name=::CSV::Row

CSVクラスは、標準添付ライブラリのため、requireして使っているので、Steepfile のlibrary で追加します。

target :app do
  signature "sig"

  check "bin"
  check "lib"

  library "csv"                                                                                                             
end
そして実行すると、、、

$ bundle exec steep check --log-level=fatal
lib/analyzer.rb:9:30: IncompatibleAssignment: lhs_type=::CSV::Row, rhs_type=::Array[(::String | nil)] (row)
  ::Array[(::String | nil)] <: ::basicobject="" ::csv::row="=" ::object=""> ::BasicObject <: ::csv::row="" code="" does="" hold="" not="">
やっとそれっぽいエラーが出てきました。

エラーメッセージに、lhs_type, rhs_typeが出ていますが、lhs_type がrbsで定義している型、rhs_typeが想定している型が表示されています。

CSV.foreach() のブロック引数のrow は、実行すると、CSV::Rowのインスタンスとなり、parse_row()のパラメータに設定されるのですが、rbsのCSV.foreach() では、Array[String?] で定義されているようです。

rbsに合わせて、Analyzer.parse_row() の引数をArray[String?] とすると、今度はrow.headers でエラーになってしまう…

悩ましい…


そこで、CSVは、rbsを参考に使用しているメソッドの以下の定義を sig/sample.rbsに追加することにしました。(Steepfileのlibrary定義はコメントアウトしました)

class CSV < Object
  def self.foreach: [U] (String, ?::Hash[Symbol, U] options) { (CSV::Row arg0) -> void } -> void
end

class CSV::Row < Object
  alias [] field                                                                                                                                                               
end
実行してみると、、、
エラーがなくなり、Steepでの型解析は正常となったようです。

使ってみての感想

Rubyのクラスについては、rbsの定義を参照しているので、rbsに定義されていない型だとエラーになってしまうようです。
そのため、普段書き慣れている記述でエラーになるケースもあり、この小さなプログラムでも確認したりするのに、結構時間を使いました。

使ってみての感想は、「やっぱり型書くのは大変だな…」という印象が強いのですが、
IDEを使ってコードを書く時に型情報までSuggest表示されれば、
Rubyの経験があまりない人でも書きやすかったり、大人数のプロジェクトなどでは、プログラムの記述が揃うし、確かにバグは少なくなるような気がします。

でも、やっぱりRubyは自由に書きたい…。

2020-12-18

Steep by Steep

 この記事は、ケーシーエスキャロット Advent Calendar 2020 17 日目の記事です。(ちょっと過ぎちゃったけど)

Ruby 3の静的解析機能の1つ。steep を使ってみようと思います。

 (styleが消えてコードが見にくい…)

リポジトリは、こちら

タイトルの Steep by Steep は、中学の頃流行った New Kids On The Block の "Step By Step" にかけてみました。

 


インストール

Rubyは、3.0.0-preview2を使っています。

steepのinstallをします。gem でinstallします。



$ gem install steep
Successfully installed steep-0.38.0
Parsing documentation for steep-0.38.0
Installing ri documentation for steep-0.38.0
Done installing documentation for steep after 2 seconds
1 gem installed
サンプルで使うコードです。 色々な型を試してみたかったので、設計面は無視したコードになっています。

lib/user.rb


class User                                                                                                                                                                             
  def initialize(no, name)
    @no = no
    @name = name
    @scores = Array.new
  end
  attr_reader :no, :name, :scores

  def add(score)
    @scores << score
  end
end

lib/analyzer.rb


require 'csv'                                                                                                                                                                          
  
class Analyzer
  @@score = Struct.new("Score", :subject, :score)

  def self.load(path)
    users = Array.new
    CSV.foreach(path, headers: true) do |row|
      users << parse_row(row)
    end

    users
  end

  def self.parse_row(row)
    u = User.new(row["No"], row["Name"])

    row.headers[2..-1].each do |subject|
      u.add @@score.new(subject.downcase, row[subject].to_i)
    end

    u
  end
end

bin/main.rb


LOAD_PATH << File.join(File.dirname(File.expand_path(__FILE__)), "../lib")                                                                                                            
  
require 'user'
require 'analyzer'

# 使用するデータ
data = <<-EOS
No,Name,English,History,Science
1,Akina,85,88,87
2,Bob,78,95,85
3,Candy,83,80,92
4,David,85,83,88
5,Emily,78,93,85
6,Fumiya,80,82,89
7,George,92,88,79 
EOS

それでは、実際に使ってみます



$ steep init
と入力すると、Steepfile が作成されるので、ここに定義をしていきます。

Steepfile


target :app do
  signature "sig"

  check "bin"
  check "lib"
end
これだけ定義して、まず実行してみます。

$ bundle exec steep check --log-level=fatal
bin/main.rb:20:2: NoMethodError: type=singleton(::File), method=open (File.open(fpath, "w") { |fd| fd.write data })
lib/user.rb:7:2: NoMethodError: type=self, method=attr_reader (attr_reader :no, :name, :scores)
エラーが出ました。
main.rbはおいておいて、Userクラスで、attr_reader に定義をしていないことを指摘しているようなので、定義を追加してみます。
定義ファイルは、sigフォルダの中に `.rbs`ファイルで書くとあるので、 sig/sample.rbs を作成して以下のように定義してみました。

class User                                                                                                                                                     
  @no: Integer
  @name: String
  @scores: Array[Score]
end
もう1度実行してみると、

sig/user.rbs:4:17...4:22        UnknownTypeNameError: name=::Score
エラーが変わりました。
ScoreというTypeがわからないというエラーが出ました。 

これは、Analyzerクラスの中でStructで定義しているからかな… ひとまず、先に進めるために `untyped` として、もう1回実行してみると、次のエラーに変わりました。

lib/user.rb:2:2: MethodArityMismatch: method=initialize (def initialize(no, name))
initializeの定義をしていないので、次はメソッドの定義をしていきます。


こんな感じかな(とりあえずuntyped)

class User
  @no: Integer
  @name: String
  @scores: Array[untyped]
  def initialize: (no: untyped, name: untyped) -> untyped                                                           
  def add: (score: untyped) -> untyped
end
実行してみると、、、

lib/user.rb:2:2: MethodArityMismatch: method=initialize (def initialize(no, name))
lib/user.rb:9:2: MethodArityMismatch: method=add (def add(score))
エラーになってしまいました… 


Analyerクラスが定義されていないことによる影響かな…と頭をよぎったので、Analayzerクラスも定義してみます。

class User
  @no: Integer
  @name: String
  @scores: Array[untyped]
  def initialize: (no: untyped, name: untyped) -> untyped
  def add: (score: untyped) -> untyped
end

class Analyzer
  def self.load: (path: untyped) -> Array[User]
  def self.parse_row: (row: untyped) -> User
end
実行してみると、、、

$ bundle exec steep check --log-level=fatal
bin/main.rb:20:2: NoMethodError: type=singleton(::File), method=open (File.open(fpath, "w") {|fd| fd.write data })
bin/main.rb:22:24: ArgumentTypeMismatch: receiver=singleton(::Analyzer), expected={ :path => untyped }, actual=::String (fpath)
lib/analyzer.rb:6:2: MethodArityMismatch: method=(self) (def self.load(path))
lib/analyzer.rb:15:2: MethodArityMismatch: method=(self) (def self.parse_row(row))
lib/analyzer.rb:16:8: IncompatibleArguments: receiver=singleton(::User), method_type=(name: untyped, no: untyped) -> ::User (User.new(row["No"], row["Name"]))
lib/user.rb:2:2: MethodArityMismatch: method=initialize (def initialize(no, name))
lib/user.rb:9:2: MethodArityMismatch: method=add (def add(score))
エラー増えた… 


リポジトリ内の sig/project.rbi も確認してみたのですが、定義の仕方がおかしいわけではなさそうです… 

もう少し中身を確認した方がよさそうなので、日を改めて取り組んでいきたいと思います。

2020-12-13

Rails Girls Gathering JapanのKeynoteで話しました

この記事は、Rails Girls Japan Advent Calendar 2020 の13日目の記事です。

昨日は、Rails Girls Gathering Japan でした。

Rails Girls  Gathering Japanとは

新型コロナウィルス感染症の影響で、2020年のRails Girls イベントは、2月以降開催することが難しい状況となっている中で、オンラインで何かできることを…ということで、これまでRails Girls に参加されたGirlsの皆さんや、コーチ、スポンサー、オーガナイザーとスタッフの方々によるLT大会です。


昨日は、裏で忙しくしていたこともあり、改めてハッシュタグ #rg_gathering_jp を追いましたが、皆さんに楽しんで頂けたようで、とても嬉しく思います。
正直こんなにたくさんの方に参加して頂けるとは思っていませんでした。
改めて、Rails Girlsというコミュニティは、みんなに愛されているんだなぁと感じました。


このイベントの企画をした経緯などは、スタッフのAdvent Calendarの記事で話してもらえるかもしれないので、ここでは省略します。


今回、初めてキーノートで話す機会を頂き、「As You Like It」というタイトルでお話ししたので、その話をしたいと思います。

As You Like It

タイトルにした、"As You Like It" という言葉は、今でも仲良くしている大学時代の先生から卒業前最後の授業で贈られた言葉です。
キーノートで何を話そうかと考えた時に、これから社会へ出ていく私達に先生が贈ってくれたこの言葉を伝えたいと頭に浮かびました。


今年は、新型コロナ感染症の影響で外出なども制限され、会いたい人にも会えない期間が長く続き、自分でも気づかぬうちにストレスが溜まっていたりします。
私自身もお家時間を楽しんではいますが、今度いつ仲間と会えるんだろう…と考えると、今の先が見えない状況では、やはりネガティブな気持ちになってしまうことがあります。

SNSで発信される誰かのアウトプットが、自分はできていないというプレッシャーに感じてしまったり、「今日も私は何もしなかった」という罪悪感のような感情を感じてしまうこともありますが、だからこそ、「As You Like It」(お好きにどうぞ)という言葉を思い出し、
「私の人生だから、私らしく、私の好きなように」と思うようにしています。

「強い」とかに縛られず「自分らしく、好きなように、楽しんでもらいたい」という気持ちをうまく伝えられていたらと思います。

私にとってのRails Girls 

参加する人が私からどんな話を聞きたいのか、想像がつかなかったので、Asakusa.rbで @neko314 に聞いてみたところ、「Rails Girls のサポートをやっていくモチベーションがどこにあるのかを聞いてみたい」と言われました。
当日、@cobachieにも同じく聞いてみたら、同じ返答でした。(みんな不思議に思ってるんですね…)

それで、昔昔の私がRubyを書き始めた頃の話などをしました。
あの頃の私のように、今もどこか倉庫の片隅で、一人でRubyを書いてる人がいるかもしれない…と思うことが、モチベーションにもなっている部分もあります。

Rails Girlsを通して私が伝えていきたいこと 

Rubyコミュニティの素晴らしさは、たくさんありますが、
Rails Girls などのRuby歴が浅い人には、
案外世界は狭い(一歩勇気を出せば、超えていける)ということを
是非知ってもらいたいと思っているので、そのお話をしました。

(キーノートをお願いした松田さんに交番までついて行ってもらったり、角谷さんに
財布拾ってもらったりしました…ありがとうございます!)

最後に 

初キーノート、うまく伝えたいことが伝えられたかどうかわからないけれど、
Rails Girls Gathering Japanは、楽しんでもらえたようで、本当によかったです。

LTに登壇して頂いた方々、ありがとうございました!
みんな素晴らしいLTでした!
久しぶりにお会いできた方もいて、とても嬉しかったです。


2019-12-25

Rails Girls Japan 2019年まとめと2020年の予告

この記事は、Rails Girls Japan Advent Calendar 2019 25日目、最終日の記事です。

昨日は、 @cobachie さんによる「[RubyKaigi2020]まつもとのすゝめ 」でした。
松本のお店が色々紹介されていて、RubyKaigi期間中じゃ回りきれない!!!と思った方は、是非ふらりと行ってみるといいと思います。
金曜帰りにふらりと松本に行って、松本のBARを堪能。翌朝バスで15分の浅間温泉に行って、近くの水そば(水で食べるおそば)を堪能して帰ってくるプラン…どうです?最高でしょ?



さて、最初に自己紹介をしておきます。
@emorimaです。Rails Girls Tokyo 3rd, 4thのオーガナイザーです。2015年からRails Girls Japanのメンバーで、国内開催のRails Girls のサポートを行っています。

今日は、2019年 国内開催のRails Girlsのまとめと、来年 2020年の予告をしたいと思います。

Rails Girls Japan 2019 まとめ

2019年に国内で開催されたRails Girlsイベントは、計10回の開催となりました。


四国で初めての開催となる、Ehime 1stと、来年RubyKaigiが開催される長野県でのNagano 1st(長野県初の開催は、2015年開催のShiojiri 1st)の開催がありました。

昨年1stを開催したOkinawaとSendaiでも2ndが開催され、1stのオーガナイザーや、スタッフの方々が2nd開催を繋げてくれました。(素晴らしい!!!)
また、Fukuokaでも4年ぶりとなる2ndが開催されました!

2012年からの開催回数もまとめてみました。

国内でのRails Girls開催回数

ここ数年は、年10回程度開催されています。定期的(? Rails Girlsはやりたい! という方がいた時に開催されるので、定期という表現は少し違うかも...)に開催されている都市の他に、新しい都市での開催も増えているように思います。

国内開催50回!

2012年に国内で初めて開催された Tokyo 1stから8年目。
2019年5月開催のNagano 1stで、国内開催50回を迎えることができました! 🎉

Rails Girlsのイベントは各都市でイベントロゴを作成しているのですが、そのロゴを使って50回開催記念で、グッズを作りたいという話があり、 @atttsumi(RubyKaigi2020デザイナー!)が開催50回記念のロゴを作ってくれました。そして、@thatblue_plus(Sendai 1st, 2nd オーガナイザー) が色々グッズを作ってくれました!

中でも、これまでの各イベントのロゴを使ったTシャツはとても気に入ってます! (過去のイベントのオーガナイザーの方々にロゴの使用許可の確認も行いました!)



 Rails Girls 50回開催記念 T-shirts
こちらのTシャツや、その他のグッズは、suzuri で購入できます!

Rails Girls Japan 2020 予告

2020年開催予定

既に、以下の開催予定があり、イベントページも公開されています。

1月 Nagoya 5th
2月 Ehime 2ndTokyo 13th 

12/25(水)現在、全てのイベントの参加者募集中です!
また、上記以外では、Kagoshima 1st開催に向けて、準備中です。

Rails Girls 開催のお知らせや、その他のお知らせは、こちらのRails Girls Japan
アカウントで告知しますので、是非フォローしてみてください!

また、「私の都市でも開催して欲しい!」というご意見は、@emorima までmentionしてみてください。何か考えます!

RubyKaigi 2020 参加支援

お待たせしました! 昨日の @cobachieさんからも予告のあった、RubyKagi 2020参加支援のお知らせになります。
Rails Girls Japanでは、RubyKaigi 2020 参加支援を行います。
応募方法等については、こちら にまとめてありますので、ご確認ください。

最後に

こうしてRails Girls を毎年10回近く開催できているのは、
「やりたい!」と言ってくれるオーガナイザーの方と、手伝ってくれるスタッフ、
時には遠征してくれるコーチの方々、
そしてスポンサーがいるからこそと思っています。

Rails Girls に参加することで、地域Rubyコミュニティの方々と繋がりができ、地域Rubyコミュニティや、RubyKaigiなどに参加する女性が少しでも増えればと願っています。

2020年も各都市での開催、待っていてください!

2019-12-04

初めてのmruby on m5stack(環境編)

この記事は、ケーシーエスキャロット Advent Calendar 2019 4日目の記事です。 3日目の昨日は、garamanのくずし字を読む(概要編) でした。 (Advent Calendar 参加ありがとう!!!) そういえば、つい先日のニュースでくずし字の解読にAIが参入しようとしているニュースも出てましたね! さて、今日は、m5stackでmrubyを動かしてみたいと思います。 実は、夏休み前に買ってセットアップして、mruby以外は動くのを確認していました。 が、やっぱり、Rubyistとしてはmrubyを動かしたい。 では、早速やっていきましょう。

mrubyインストール

mrubyリポジトリ から clone します。
$cd (作業したいディレクトリ)
$ git clone https://github.com/mruby/mruby.git
$ cd mruby
rake -T で、色々コマンドが確認できます。
emorima@emorima-ThinkPad:~/repo/mruby$ rake -T
rake all             # build all targets, install (locally) in-repo
rake api_doc         # generate yard docs
rake capi_doc        # generate doxygen docs
rake clean           # clean all built and in-repo installed artifacts
rake clean_api_doc   # clean all built docs
rake clean_capi_doc  # clean all built docs
rake clean_doc       # clean all built docs
rake deep_clean      # clean everything
rake doc             # generate document
rake gitlab_config   # create build configurations and update .gitlab-ci.yml
rake gitlab_dockers  # recreate docker images for GitLab builds
rake test            # run all mruby tests
rake view_api        # clean all built docs
rake view_capi       # clean all built docs
rake all でbuildしたら、バージョンを確認します。
$ rake all

 ...(省略)...

$ ./bin/mruby -v
mruby 2.1.0 (2019-11-19)

USBドライバ インストール

Kernelバージョンを調べて、該当するOSのドライバをここからダウンロードします。  ダウンロードしたzipを解凍して、make installします。(エラーが出たら必要なlibraryをinstallします。)

m5stack ファームウェア書き込み

ちょっと夏に何かを書き込んだままだったので、一度クリアする意味でもファームウェアの書き込みをします。 m5stackをUSBケーブルで、PCを繋いで、/dev/tty* を確認します。 (私のPCでは、/dev/ttyUB0 で繋がっていました)  ファームウェアを書き込むために、esptool をインストールします。
$ pip install esptool
m5stackの最新のファームウェアをダウンロードし、ファームウェアの書き換えを行います。
$ esptool.py --chip esp32 --port /dev/ttyUSB0 erase_flash
$ esptool.py --chip esp32 --port /dev/ttyUSB0 write_flash \
--flash_mode dio -z 0x1000 m5stack-20180516-v0.4.0.bin
書き込みが終わると、m5stackが自動的に起動します。

試しに Hello Worldしてみる

簡単な "puts 'Hello World!'" だけのプログラムを動かしてみます。 以下のコードをhello_world.rb に保存します。
puts "Hello World!"
そして、以下のコマンドでコンパイルし、autorun.mrb を作成します。
$ mrbc -o autorun.mrb hello_world.rb 

出力されたautorun.mrb をMicroSDに書き込み、m5stackに挿して、再起動!!!!

 ....あれ、表示されない...

通常の起動画面が表示されているだけ...

次こそは、"Hello World!" へ!

2019-12-01

鹿児島Ruby会議01で話してきた

このエントリは、ケーシーエスキャロット Advent Calendar 2019の1日目の記事です。

Advent Calendar 何を書こうかな...と思っていて、何かgemでも読んでその話しでも...と思っていたんですが、
鹿児島Ruby会議01 でお話しする機会を頂いたので、その話しを書きたいと思います。

鹿児島Ruby会議01

2019年11月30日 鹿児島Ruby会議01で、「Rails Girlsのお話や、初めての方向けのコミュニティについてなどお話」というタイトルでお話してきました。



招待講演をするというのは、人生初だったので、自分の話しでよいのか?とか、また時間が余りすぎるんじゃないか?とか、準備している期間は悶々と考えていました。(悶々としている間に福山雅治さんの30周年ライブチケットの予約を逃しました...)

鹿児島Ruby会議は、「プログラミング言語Rubyを通して越境する」というお題でした。
2014年にDevLOVE Advent Calendar 「越境」というお題でblogを書いていたので、
読み返してみたり、その頃に発表したslideを見返したりする中で、あの時の自分の気持ち、Passionを思い出したら、資料準備もできました。

ただ、当日の朝に、発表練習をしようとしたら、rabbitのallotted-time が、3022322:05 となっていて、rabbitの起動パラメータに指定してもダメだったので、発表時にはうさぎが爆速でゴールすることに…


発表した後の懇親会で、「よかったよ」と言われたのが、本当に嬉しかったんですが、
自分の行動が誰かに喜んでもらえる嬉しさが、
私の行動の原動力になっていると、思った回でした。


今年は、自分はどんな新しい「越境」をできたのか、、、

来年あたりに結果が出そうな何かを始めたけれど、まだまだ道のりは険しい…といったところです。


鹿児島Ruby会議01の余韻で終わりたいので、今日はこのくらいで。

2019-05-03

RubyKaigi2019に参加して、エモリハウスを企画して、WTMKyushuに参加した

2019/04/18~20に福岡国際会議場で開催された RubyKaigi2019 に参加して、翌日に Women Techmakers Kyushuに参加してきました。
また、今年もエモリハウスを企画したので、平成の頃の話になりますが、簡単にまとめておきたいと思います。

RubyKaigi2019に参加した

RubyKaigiは、ご存じのように世界からRubyistが集まる国際技術カンファレンス。

毎年最終日には、脳の疲労が激しくて、ぐったりしているんですが、
今年はなんと、4トラック!!!
まずセッション選ぶのにとても悩みました。
(コピーロボットが欲しい...)

フルで見ると、3日目の集中力がもたないことが経験上予想できたので、
適度に休憩取りながらとなりました。

細かなセッションの感想は書きませんが、
見たどのセッションも、最高に楽しかったので、
見れなかったセッションもとっても気になる!!!
ということで、動画配信を期待して待っています...

今回は、1月に cobachieさんと会った時に、「RubyKaigiまでに『Rubyのしくみ』読みたいと思っててー」という話をしていたので、「んじゃ、一緒に読もうよ」という話になり、yadaitaさんと毎週輪読会をやり、読み終えていたのですが、
Aaron、笹田さん、国分さんのお話を聞くのに、基礎知識としてとても役立ちました!

Rubyのしくみ Ruby Under a Microscope
Pat Shaughnessy(著), 島田浩二, 角谷信太郎(訳)
オーム社
発行日: 2015-02-10
対応フォーマット: PDF


エモリハウスを企画した


今年もエモリハウスを企画しました。
昨年の応募フォームは、私が適当にGoogle Formで作ったのですが、今年はcobachieさんがかっこよく作ってくれました。(感謝!)

その効果か、最初の10名という予定人数がすぐ埋まってしまい、更に問い合わせもあったので、宿を移動して 17名の方に参加して頂きました。

エモリハウス2019参加者の皆さん + あんずちゃん... (写真撮影: 炬燵さん)

エモリハウスは、女性のRubyKaigi参加者でワイワイしよう!企画です。

「一人で、馴染みのない街のビジネスホテルに泊まって、知り合いのいない技術カンファレンスに参加する」

というのは心理的ハードルが高いように思うので(20代の頃の私だったら、参加していないと思います...)、誰かと一緒ならRubyKaigiに参加したいと思っている人が、参加してもらえるといいなぁくらいの気持ちで私はやっています。

今年のエモリハウスはこんな感じでした。
  • RubyKaigi前にリモート飲み会をやって顔合わせをした
    • 自己紹介をした後、宿の情報などの連絡とか、RubyKaigiどれ見る~?みたいな話をした
    • 途中、台所でつまみを作り出す youchanがいた
    • あっという間に2時間が過ぎた
  • みんな自由に行動していた
    • Day0 🚢パーティ、🍜パーティ行く人がいて、参加しなかった(できなかった人)でもつ鍋食べに行った
    • Day2 特に予定がないメンバと、yuryuさん、ぷぽさんとも合流して飲みに行った
    • Day3 パーティー後、みんなそれぞれ行動していた(一蘭の🍜とかslackにあがってきて美味しそうだった。私は行っていない...)
    • 宿の隣のうどんBarが美味しいらしく(しかも混んでいる)、うどんを食べに行って閉店まで堪能するメンバが毎晩いた(私は行っていない...)
  • 今回もゲストハウス貸し切りは便利だった
    • 鍵は暗証番号入力で、宿泊期間中変わらないので楽
    • ゲストハウスのスタッフの人に地元情報を色々教えてもらった
    • 寝室では水しか飲めないので、飲食する人はロビーに集まる感じになるので、そこでコミュニケーションが取れるようになっていた
    • 5部屋あったので、生活リズムなどを合わせて部屋割りをした
      • 初めて参加の方は色々な人と話せるように大部屋
      • 2階部屋への階段が急なので、お酒を飲んでも階段の昇降が問題なく行える人を選抜して2階部屋にした
      • 朝早い方(スポンサーやヘルパーの方)、夜遅い方は優先的に1階
      • あんずちゃんと同室のnyancoさんと炬燵さんが、あんずちゃんと一緒に行動してくれていた(感謝!)
    • ロビーまでは宿泊者でない人も入れるので、ぷぽさん、ぱんさん、sayatamさんが遊びに来てくれた
  • お酒のイメージが強いようですが、飲んでない人ももちろんいる
RubyKaigi初日、「初めてRubyKaigi参加する人もいるし、みんなで行くか~」と集団登校したのが、個人的にはいい思い出です。

そして、こんな感じのエモリハウスですが、、、

RubyKaigi2020のエモリハウスもやります!


既に仮予約してあります。
今年ほど規模は大きくないです。
サイト更新したら、Twitter で連絡します!

Women Techmakers Kyushu IWD19 に参加した (RubyKaigi2019 Day 4)

RubyKaigi2019の翌日、Women Techmakers Kyushu という女性限定のITイベントがあり、そこで Rails Girls についての紹介をしてきました。

参加者 20名以上いて、Rails Girls を知っている方が、5名程度。
Rubyを使っている人が3名くらいしかいないという状況でした。
スタッフとして、Rails Girls Kitakyushu参加者で、エモリハウス2018の参加者の @HappyK514 さんがいたので、とても心強かったのでした。

話した内容は、Rails Girls Japanとしての取り組みや、Affirmative Action などRails DMでお話した内容を少しまとめてお話しました。




私は東京で仕事をしていることもあり、毎日どこかで勉強会が開催されている身近な環境があるけれど、地方の場合、コミュニティが少ないこともあり、勉強会の開催が少ないので、オンラインのやつに、もっと注力して立ち上げたいと思いました。