Rails Girls Gathering Japanに参加した感想

はじめに

この記事は2020年ふりかえりアドベントカレンダー 12日目です。昨日の記事は Rubyで文字コードを扱うコードを書くときに便利なメソッド集 - Qiita です。

Rails Girls Gathering Japan とは

Rails Girlsとはより多くの女性がプログラミングに親しみ、アイデアを形にできる技術を身につける手助けをするコミュニティです。 世界各国で開かれており、日本では Rails Girls Japan として各県で開催されています。

Rails Girls - Japanese

今回は Rails Girls Japanとして初めてのオンラインイベントとなる Rails Girls Gathering Japan が zoom で開催されました。「Rails Girls Effect」というテーマの LT 会でした。

Rails Girls Gathering Japan - railsgirls-japan | Doorkeeper

LTの感想

どれも素敵な発表でした! Rails Girls が素敵なコミュニティだということがよくわかりました。聞いているうちに「私もこれからやっていくぞ!」という元気をいただいて、参加してよかったなぁと思いました。 運営の皆様、登壇者の皆様、素敵な機会をいただきありがとうございました。

いくつかピックアップして感想を書きます。

『RailsGirlsが私にくれたもの』harukusさん

speakerdeck.com

この発表で特に印象に残っているのが、「コミュニティに居るだけでは参加しているとは言えないんじゃないか。フィヨルドブートキャンプのアプリでコミュニケーションをとったり、ミートアップで他の受講生と話したり、自分からアクションを起こすことがコミュニティに参加するということなんじゃないか」というところです。本当にそのとおりだと思います。

少し話は変わりますが、全てがオンラインで開催されるようになって、良くも悪くも「見るだけ」「聞くだけ」しやすくなったと思います。コロナ以前は、例えばフィヨルドブートキャンプのミートアップであれば立食での懇親会があり、その場にいれば否が応でも自分からアクションを起こす機会がありました。

それがオンラインのミートアップになると、アクションを起こさなくても結構その場に居られるというか、なにか話さなきゃ!話したい!と思うことは少なくなったように感じます。私のような人見知りにはそれは結構ありがたいと同時に、なんとなく全然喋らない状態になってしまうこともあります。話したくないわけではないんですが、腰が重くなってしまうというか。。オンラインはアクションを起こさなくても情報がたくさん届くため満足してしまいがちなのかな、と思います。

でも、そんなオンラインでも勇気を出してアクションを起こすと楽しいんです!分からないところを質問したり、雑談タイムで雑談したり、地域Rubyコミュニティで話したりLTしたりするのは楽しいことです。自分の考えが人に届いて、誰かが返答してくれるのは素敵なことだと思います。はるかすさんが意識的にアクションを起こしているのすごくいいなぁと思い、私もどんどんアクション起こしていくぞー!と思いました。

『これ好き!から始める世界』べこさん

speakerdeck.com

べこさんのこれ好き!楽しい!続けたい!が溢れててめちゃくちゃ良かったです。

始めることに年齢は関係ないし、長期的に見て続けていければいいんだし、やりたくなったら再開したらいいんだし、っていう言葉にすごく励まされました。

最近細く長くやっていきたいなぁと思っています。今はフィヨルドブートキャンプ生で時間があるのでやりたいことを楽しくできているのですが、働き始めると余裕がなくなりそうですこし不安に思っています。慣れない生活、分からないことがいっぱい、今までのように平日日中ゆったり学習はできない、となると自分はちょっと凹みそうだな、と心配していました。

ですが今日のべこさんのLTで、いっときお休みしても、再開したら続けていることと同じ!と聞いて、入社してしばらくは慣れることに精一杯でも、また慣れてきたらやりたいことやればいいじゃない〜ってちょっと落ち着いた気持ちになれました。続けていきたい気持ちを後押ししてくれるような元気をもらってとってもありがたかったです。ありがとうございます。

まとめ

とりあえずやっていきとして積んでいるキーボードを組んでいこうと思います!

reline のテストを実行

はじめに

この記事は2020年ふりかえりアドベントカレンダー 11日目です。これを書いているのは12月14日ですが、あまり気にしないことにしました。昨日の記事は サロゲートペアとRubyのStringについての覚書 - いまブログ です。

先日 Ruby の標準添付ライブラリの reline に PR を送って無事マージされました。

reline のテストについて教えていただいたので書き残しておきます。

reline の概要

reline は GNU readline を Ruby で再実装したライブラリです。 Ruby の標準添付ライブラリとして Ruby 同梱されています。

github.com

reline のテスト

rake testrake test_yamatanooroti で実行できます。

rake test

rake test を実行すると RakefileENCODING_LIST に定義されているエンコーディングでテストが実行されます。とても便利です。

❯ rake test

Test Encoding: Shift_JIS
Loaded suite -e
Started
...........................................................................................................................................
.............................................................................................................
Finished in 0.291866 seconds.
-------------------------------------------------------------------------------------------------------------------------------------------
248 tests, 2670 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
100% passed
-------------------------------------------------------------------------------------------------------------------------------------------
849.71 tests/s, 9148.03 assertions/s

Test Encoding: EUC-JP
Loaded suite -e
Started
...........................................................................................................................................
.............................................................................................................
Finished in 0.256047 seconds.
-------------------------------------------------------------------------------------------------------------------------------------------
248 tests, 2670 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
100% passed
-------------------------------------------------------------------------------------------------------------------------------------------
968.57 tests/s, 10427.77 assertions/s

Test Encoding: UTF-8
Loaded suite -e
Started
...........................................................................................................................................
...............................................................................................................
Finished in 0.232133 seconds.
-------------------------------------------------------------------------------------------------------------------------------------------
250 tests, 2710 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
100% passed
-------------------------------------------------------------------------------------------------------------------------------------------
1076.97 tests/s, 11674.34 assertions/s

Test Encoding: Windows-31J
Loaded suite -e
Started
...........................................................................................................................................
.............................................................................................................
Finished in 0.235805 seconds.
-------------------------------------------------------------------------------------------------------------------------------------------
248 tests, 2670 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
100% passed
-------------------------------------------------------------------------------------------------------------------------------------------
1051.72 tests/s, 11322.92 assertions/s

rake test_yamatanooroti

yamatanooroti というgemを使い、仮想端末上でテストを実行します。

github.com

yamatanooroti を使うには、 libvterm 、gem vterm をインストールします。

$ brew install libvterm
$ gem install vterm

rake test_yamatanooroti でテストを実行できます。

サロゲートペアとRubyのStringについての覚書

はじめに

この記事は2020年ふりかえりアドベントカレンダー 10日目です。これを書いているのは12月14日ですが、あまり気にしないことにしました。昨日の記事は .irbrc で irb で使える独自メソッドを定義する - いまブログ です。

TL;DL

サロゲートペアは16ビット固定長で FFFF 外の文字を表現するために生まれた文字の表現方法です。

サロゲートペアが問題になるのは UTF-16 だけの話です。UTF-8 等では可変長のためこの表現方法を取っておらず、問題になりません。

おことわり

私は Unicode の歴史的経緯がよくわかっていないので正しい理解でないかもしれません。ですが、折角書いたり聞いたりしたのでまとめておきます。何か気になる点があれば、コメント、 twitter 等で連絡いただけるとありがたいです!

あらまし

フィヨルドブートキャンプの Slack で、 String55296 という数値を << で追加すると見慣れぬエラーになるという投稿がありました。

s = ""
s << 55296
# Main.rb:2:in `<main>': invalid codepoint 0xD800 in UTF-8 (RangeError)

その後別の方が調査して 0xD800サロゲートペアのコードポイントであると分かりました。

そこでサロゲートペアとはなんだろうということで調べてまとめて、以下の文をフィヨルドブートキャンプの Slack に投稿しました。(一部投稿時から編集しています)

サロゲートペアとは

サロゲートペアは Unicode が16ビットでは足りなくなったために生まれた、上位サロゲートと下位サロゲートを組み合わせて1つの文字を表現するための方法です。UTF-16 で使われています。他の Unicode エンコーディングでは使われていません。

もともと Unicode は16ビットの 固定長 として誕生しました。16ビットなので、16進数で 0000 〜 FFFF の65536文字を格納できます。

しかし、世界中の文字を格納するには65536文字では足りないことが分かりました。

そこで既存の固定長を前提にしているシステムを壊さないようにしつつ文字をもっと格納するためにサロゲートペアという仕組みがとられました。

サロゲートペアは上位サロゲートと下位サロゲートから構成されています。例えば「𠮷」(吉ではなく、土に口がついている字)を見てみます。 「𠮷」のコードポイントは U+20BB7 です。

> "𠮷".unpack("U*").each { p _1.to_s(16) }
"20bb7"

「𠮷」は、上位サロゲートが「D842」下位サロゲートが「DFB7」のコードポイントで出来ています。コードポイントから上位サロゲート・下位サロゲートを計算する方法は wikipedia とかに載っているので興味があれば...

余談ですが、実は RubyString"\unnnn"または "\u{nnnnn}" でコードポイントから文字に変換する機能があります。(nは16進数の数値。{}つけないほうは4桁までしか入りません)

試しに先程の 55296 を 16進数 D800 に直して表示しようとしてみると、同じ invalid Unicode codepoint というエラーになります。

irb(main):030:0> 55296.to_s(16)
=> "d800"
irb(main):032:0> "\ud800"
Traceback (most recent call last):
        3: from /Users/mi/.rbenv/versions/2.7.1/bin/irb:23:in `<main>'
        2: from /Users/mi/.rbenv/versions/2.7.1/bin/irb:23:in `load'
        1: from /Users/mi/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/irb-1.2.7/exe/irb:11:in `<top (required)>'
SyntaxError ((irb):32: invalid Unicode codepoint)
"\ud800"
   ^~~~

もっと Ruby の String とエンコーディングの話

フィヨルドブートキャンプに投稿したバージョンでは、以下の文を入れていました。その後教えていただいて誤りがあると分かったので教えていただいた内容を簡単にまとめます。

上位サロゲート、下位サロゲートは1文字では文字として成り立たないため、s << 55296 のようにStringに挿入しようとすると「変なもの入れてますよ!!」とエラーがでるのだと思います。

"\uD800" とは何をしているのか

これは String オブジェクトを __ENCODING__ に指定されたエンコーディングで作成する処理です。

疑似変数 __ENCODING__スクリプトエンコーディングを持っており、最近の環境では UTF-8 が多いかと思います。

"あ" のように ' " で文字列をくくると RubyString オブジェクトを生成します。このとき、 疑似変数 __ENCODING__エンコードされた String オブジェクト を生成します。

エンコードするときに壊れた文字データが入っていた場合は例外を出します。このため、上位サロゲート文字の "\uD800" は1文字では文字として成り立たないためエラーになっていました。

やり方を変えて、String.new するときに encoding 情報を渡すとエンコードされないため例外になりません。RubyString に壊れた文字をもたせること自体は問題なく、 ""String オブジェクトを作成したときにエンコードが走り正しい値かチェックされていたことが原因で例外を吐いていたということが分かりました。

String.new("\xD8\x00", encoding: Encoding::UTF_8)
=> "\xD8\u0000"

.irbrc で irb で使える独自メソッドを定義する

はじめに

この記事は2020年ふりかえりアドベントカレンダー 9日目です。これを書いているのは12月12日ですが、あまり気にしないことにします。昨日の記事は Hamada.rb #16 に参加 - いまブログ です。

今日は以下のツイートで教えていただいた内容についてまとめます。

.irbrc とは

irb の設定ファイルです。ホームディレクトリに置くと、どこから irb を起動しても読み込まれます。ホームディレクトリに .irbrc がない場合、カレントディレクトリの .irbrc , irb.rc , _irbrc , $irbrc を順番にロードしようと試みます。

ちなみに Ruby 2.7 からの irb は、複数行編集、シンタックスハイライト、入力履歴など便利な機能がたくさん追加されてとても使いやすく便利になりました。 irb を使うなら Ruby 2.7 以上の環境で使うことをおすすめします。

.irbrcRuby スクリプトなので中に Ruby のコードを書くことができます。

また、 irb の設定値も定義できます。詳細はこちらを参照してください。

library irb (Ruby 2.7.0 リファレンスマニュアル)

class IRB::Context (Ruby 2.7.0 リファレンスマニュアル)

irb に独自メソッドを定義したくなった

さて irb を使うときに特定のメソッドを頻繁に呼び出しすることがあります。

例えば、私は文字コードを確認することが多いためこのようなメソッドを頻繁に使います。

"🐈".ord.to_s(16)
=> "1f408"

このように each_codepoint にブロックを渡す処理もよく書きます。

 "☃️".each_codepoint { p _1.to_s(16) }
"2603"
"fe0f"
=> "☃️"

ord each_codepoint の詳細についてはこちらの記事に書きましたので、もし興味があればご覧ください。

Rubyで文字コードを扱うコードを書くときに便利なメソッド集 - Qiita

これらは決まりきった書き方で、一々入力するのがとても面倒でした。 Dash というアプリでスニペットを登録するか悩んでいたところ、twitter で .irbrc でクラス拡張すればいいんじゃない? と教えてもらったのでそうすることにしました。

.irbrc でクラス拡張(オープンクラス)する

Ruby では組み込みライブラリも自由に書き換えることができます。

今回は String クラスに便利メソッドを定義しました。

~/.irbrc

class String
  def each_codepoint16
    each_codepoint { |s| p s.to_s(16) }
  end

  def ord16
    ord.to_s(16)
  end
end

irb を起動すると、特に何も読み込みしなくても定義したメソッドを呼び出せます。便利!

❯ irb
irb(main):001:0> "🐈".ord16
=> "1f408"
irb(main):003:0>  "☃️".each_codepoint16
"2603"
"fe0f"
=> "☃️"

クラス拡張ですので、既存のメソッドの上書きや、バージョンアップで同名のメソッドが追加されると挙動がおかしくなる可能性があります。

独自メソッドを定義する際は、 Ruby に追加されなさそうなメソッド名にしておくと良いと思います。

参考資料

Hamada.rb #16 に参加

この記事は2020年ふりかえりアドベントカレンダー 8日目です。昨日の記事は yarn install 時の gyp: No Xcode or CLT version detected! を解消する - いまブログ です。

島根県浜田市Ruby コミュニティ、 Hamada.rb に参加しました。現在はオンラインで開催されています。

hamadarb.connpass.com

同時に Ruby Hacking Challenge in Hamada.rb も開催されています。

hamadarb.connpass.com

Ruby 3.0 preview-2

今日はちょうど Ruby 3.0 preview-2 がリリースされたので、リリースノートをみんなで読んでいました。

www.ruby-lang.org

リリースノートのリンク切れを見つけ、勉強会中に PR を立てている方がいました。

www.ruby-lang.org 用のリポジトリがあると知らなかったので勉強になりました。

github.com

github.com

bundled gems ?

リリースノートにこんな一文がありました。

以下のライブラリが新たに bundled gems になりました。Bundler から利用する場合は Gemfile に明示的に指定してください。(中略) 以下のライブラリが新たに default gems になりました。rubygems.org からアップデート可能です。

bundled gems と default gems とはなんでしょうか?

調べてみたところこういった違いがあるようです。

ライブラリ 扱い
標準ライブラリ Builtin libraries, 組み込みライブラリとも呼ぶ。 require 不要で使える Array, String など
標準添付ライブラリ Ruby に同梱されているライブラリ。 require すれば使える。 bundled gems と default gems に分かれる。 -
bundled gems Ruby に同梱されているが、gem uninstall ができる gem 。Bundler から使う場合は Gemfile に指定する minitest など
default gems Ruby に同梱されており、gem uninstall できない gem 。 rubygems.org からアップデート可能 irb, reline など

間違っていたらご指摘ください🙏

試しに reline をアンインストールしてみようとしたら怒られました。

$ gem uninstall reline           
Gem reline-0.1.5 cannot be uninstalled because it is a default gem

ちなみに bundled gems と default gems はこちらで定義されています。

ruby/bundled_gems at ruby_2_7 · ruby/ruby

ruby/sync_default_gems.rb at master · ruby/ruby

参考資料

bundled gem と default gem の違い - @znz blog

bundled gem と default gem の違いの具体例 - @znz blog

irb のバグ

以前から気になっていた irb のバグっぽい挙動を相談しました。

他の方も同じ挙動が確認できたこと、自力で直すのが大変そうなこと(Ruby で書かれている irb ならともかく、 CRuby 本体の Warning 周りに原因があると私にはお手上げです)、Ruby 3.0 リリースまでに直っていてほしいと思ったことからチケットを起票しました。

Hamada.rb は CRuby の貢献フローになれている方が多く、いろいろアドバイスいただいてすぐに起票できました。

詳細はこちらをご覧ください。

bugs.ruby-lang.org

英語書くのにとても悩んで時間がかかりました。チケットを書く時間の90%は英語で悩んでいた時間と言っても過言ではありません。リーディング・ライティング力を身に着けたいです。

今日はこんなところで。

yarn install 時の gyp: No Xcode or CLT version detected! を解消する

この記事は2020年ふりかえりアドベントカレンダー 7日目です。昨日の記事は GitHub CLIでgistを作成する - いまブログ です。

rails new とか rails s 時に yarn install --check-files を促され、 gyp: No Xcode or CLT version detected! で落ちたときの対処法です。

例えばこんなエラーメッセージ

$ rails new taskleaf -d postgresql
中略
gyp info spawn args ]
No receipt for 'com.apple.pkg.CLTools_Executables' found at '/'.

No receipt for 'com.apple.pkg.DeveloperToolsCLILeo' found at '/'.

No receipt for 'com.apple.pkg.DeveloperToolsCLI' found at '/'.

gyp: No Xcode or CLT version detected!
gyp ERR! configure error 
gyp ERR! stack Error: `gyp` failed with exit code: 1
gyp ERR! stack     at ChildProcess.onCpExit (/Users/ku-jaku/.nodebrew/node/v12.8.0/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:344:16)
gyp ERR! stack     at ChildProcess.emit (events.js:203:13)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:272:12)
gyp ERR! System Darwin 19.3.0
gyp ERR! command \"/Users/ku-jaku/.nodebrew/node/v12.8.0/bin/node\" \"/Users/ku-jaku/.nodebrew/node/v12.8.0/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js\" \"rebuild\"
gyp ERR! cwd /Users/ku-jaku/ku-jaku/2019fjordbootcamp/taskleaf/node_modules/fsevents
gyp ERR! node -v v12.8.0
gyp ERR! node-gyp -v v5.0.3

途中に出ているのでわかりにくいのですが、 gyp: No Xcode or CLT version detected! と出力されています。

解消法

Xcode を再インストールします

$ pkgutil --packages | grep CL
# 何も表示されないことを確認
$ sudo rm -rf $(xcode-select -print-path)
$ xcode-select --install

参考資料

GitHub CLIでgistを作成する

はじめに

この記事は2020年ふりかえりアドベントカレンダー 6日目です。昨日の記事は Rubyにはオブジェクトを汚染する仕組みがあった - いまブログ です。

GitHub CLIとは

GitHub 公式が提供している CLI ツールです。コマンドラインから Pull Request や issue を管理したり、 gist を作成できて便利です。

cli/cli: GitHub’s official command line tool

GitHub CLI では gist の作成、確認、編集、削除ができます。つまり好きなエディタで gist に上げたファイルを操作できます!

とてもシンプルに gist 管理ができて便利だったので使い方を紹介します。

GitHub CLI のインストール

macOS の場合は homebrew でインストールできます。

$ brew install gh

LinuxWindows などの環境のインストール方法は README に書いてあります。 cli/cli: GitHub’s official command line tool

GitHub CLI のコマンドは gh で呼び出せます。

インストール後、 適当な gh コマンドを打って GitHub アカウントにログインしてください。

$ gh issue list 

gist を作成

コマンド

$ gh gist create [<filename>... | -] [flags]

-p オプションを指定しない場合 secret gist が作成されます。

オプション

-d, --desc      # gist の詳細を記入
-p, --public   # gist を public で作成
-w, --web       # 作成した gist をブラウザで表示

サンプルコード

$ gh gist create test.txt -w
- Creating gist test.txt
✓ Created gist test.txt
Opening gist.github.com/afe55d913bad0dc92f1c41c0f7392f97 in your browser.

$ gh gist create test.txt -d "説明" -p -w
- Creating gist test.txt
✓ Created gist test.txt
Opening gist.github.com/061e2ce872d3e331d1e2f054bd478363 in your browser.

gist の一覧を確認

gist id、説明文、ファイル数、公開状態、最終更新時間を確認できます。

コマンド

$ gh gist list [flags]

サンプルコード

$ gh gist list                           
061e2ce872d3e331d1e2f054bd478363  説明            1 file  public  less than a minute ago
afe55d913bad0dc92f1c41c0f7392f97  test.txt        1 file  secret  about 3 minutes ago

gist を確認

cat コマンドのように gist を表示できます。

コマンド

$ gh gist view {<gist id> | <gist url>} [flags]

サンプルコード

$ gh gist view 061e2ce872d3e331d1e2f054bd478363 
説明
GitHub CLI でアップロードしたサンプルファイルです。

markdown の場合少し色がついた状態で表示されます。

gist を編集

エディタで gist を開いて編集できます。

コマンド

$ gh gist edit {<gist ID> | <gist URL>} [flags]

エディタが開いて gist を編集できます。使うエディタは環境変数 EDITOR を参照しています。

サンプルコード

$ gh gist edit 67353016314581ed675e40e7f89ea422 

$ EDITOR="nano" gh gist edit 67353016314581ed675e40e7f89ea422 

私の環境では、EDITOR="code" (VSCode) を指定するとうまく編集できませんでした。

gist を削除

gist を削除します。特に確認メッセージなどは出てこないので注意してください。

コマンド

$ gh gist delete {<gist ID> | <gist URL>} [flags]

サンプルコード

$ gh gist delete 67353016314581ed675e40e7f89ea422    

参考資料