ちょっとだけOSSデビューした

目的

OSS活動に興味があったが、全然できてなかった。

ちょうど、会社でイベントがあったので、参加してみた!

OSS Gateミートアップ for Red Data Tools by Speee - connpass

学んだことをメモする。

kou さんに感謝...

やったこと

Red dataset にデータセット追加

github.com

他の修正見ながらコピペでやってみた。いかに自分が、変数名とかコメントとか、英語とかそこまで意識してないんだなーというのが分かった...

そしてpushするときの緊張感が違った...

通常業務でも甘えずに、人様に見せても恥ずかしくないコードを書かないといけない。

red-arrow の slice が、hashを受け取るようにする

github.com

table.slice(1..8)

みたいなIDでの絞り込みは既にできてたけど、

table.slice(count: 1..8)

のように、カラムを指定して、絞り込みはできてなかったのでそれを追加した。

ハマったこと(学んだこと)

解決できなくて、kou さんに教えてもらった

begin less range を使おうとすると、エラーが起きる

こんな感じに書けるとあったんだが、自分の環境ではできなかった。

{ count: ..8 }

最終的に、ruby2.7から入った機能だと知り、なんなくできた...

Railsとか、Nuxtとかのフレームワークの修正はある程度追ってたけど、ruby の version up を全然追ってなくてダメだなと気づけた...

Rangeの最後の値を確認する方法がわからない

{ count: 8.. }

としたときに、この値がendlessかどうかを判断したかった。

Range.lastを使うと、cannot get the last element of endless range こういうエラーが起きて詰まった。

結局、Range.endを使えば良いだけであった。

Range#end (Ruby 3.0.0 リファレンスマニュアル)

このドキュメントを見た感じ、endとlastが同じように見えたから、phpでよくある、名前が違うだけで中身は一緒かなと思ったけど、そんなことはなかった

C言語読めないけど、雰囲気的にこっちがendで、

ruby/range.c at master · ruby/ruby · GitHub

こっちがlast(引数がない時はendと同じ挙動だけど、引数渡すと挙動が変わる)

ruby/range.c at master · ruby/ruby · GitHub

ドキュメントにちゃんと違うものとして、書いてあるから、何故そう思い込んだのか自分が不思議...

複数条件での絞り込み方法がわからない

ここのメソッドを修正するのが今回の目的だった。

arrow/table.rb at master · okadakk/arrow · GitHub

もともと、以下のように書けるようになっていたので、この機能を使えばいいことは分かった。

@table.slice do |slicer|
  slicer.count >= 8
end

このメソッドは、 こういう動きをしているから、これをそのまま書くようにしたら、一応動いた。

slicers = []
slicer = Slicer.new(table)
slicers << (slicer[count] >= 8)

# 省略: slicersを用いて、filterする

コード的には、ここで、「[]」メソッドを実行して、(知識では知ってたけど、こういうコードをしっかり読んだの初めてで楽しかった)

arrow/slicer.rb at master · okadakk/arrow · GitHub

ここに到達して、Table Classの「[]」メソッドを実行して、

arrow/column-containable.rb at master · okadakk/arrow · GitHub

Columnインスタンスが生成されて、これがColumnConditionに渡される。

arrow/column.rb at master · okadakk/arrow · GitHub

そして、そこで「>=」メソッドが実行されて、GreaterEqualCondition が返ってくる。

arrow/slicer.rb at master · okadakk/arrow · GitHub

このGreaterEqualCondition Classは、Condition Classを継承していて、「&」メソッドを実行すると、二つのCondition Classを同時にfilterで利用できる。

arrow/slicer.rb at master · okadakk/arrow · GitHub

よって、複数条件での絞り込みができるって形だった。下のように書くとできる。

slicers = []
conditions = []
slicer = Slicer.new(table)
conditions << (slicer[count] >= 8)
conditions << (slicer[name] == 'okadak')
slicers << conditions.inject(:&)

# 省略: slicersを用いて、filterする

こんな感じのコードを一から自分で書けるようになりたい!

おまけ: そもそも実行環境が作れない

$ cd ruby/red-arrow
$ bundle install
$ bundle exec rake test

で、実行できるはずなんだけど、できなかった。

下のようにすると解決できた。

# homebrewで、標準でインストールできる依存ライブラリのVersionが古いので、最新をとってくる
brew install apache-arrow --head
brew install apache-arrow-glib --head

# packageのpath指定が間違えていた?? ちょっとよく分かってないからまた調べたい。
export PKG_CONFIG_PATH="/opt/homebrew/opt/openssl@1.1/lib/pkgconfig"

ネットで調べたら、みんなばんばんエラーメッセージを質問してて、それにkouさんが答えてて、そのIssueを読んで解決ができた。

こういう風に詰まったところを、Issueにあげてもらえるのは助かるなーと思った。自分もそういう風に慣れていきたい。

感想

綺麗なコードとは何かみたいなのが少しづつ分かってる感覚がある。

あと、他のライブラリがどうやってできてるかみたいな想像が少しできるようになった。

まだまだ能力不足であり、学びが多い。もっと勉強する。