patorashのブログ

方向性はまだない

RailsにPR送ったらマージされた

Railsに含まれているgem web-consoleに自分のPRが取り込まれた🎉

github.com

感動を残しておくためにブログに書いとく。

事の始まり

先日、Rails 6.0.0 rc1でrails newして、ごにょごにょと進めていたら、ログに以下のメッセージが出ていた。

Cannot render console from Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255

今はWindowsからHyper-V上のUbuntuに接続して開発しているため、web-consoleがホスト側のIPを許可していないってことだった。早速ググって、設定を追加しようとした。

qiita.com

おー、これだこれだ…と思い、追加。

config.web_console.whitelisted_ips = '0.0.0.0/0'

そして、再度アクセスすると、まだログが出るじゃないですか。どういうことですか、これは…。

ソースコードを読みに行く

すると、最新のweb-consoleのコードでは、config.web_console.whitelisted_ipsではなく、config.web_console.permissionsを利用するようになっていた。

Railsアプリ側でwhitelisted_ipspermissionsに変更すれば、エラーログも消えて問題なくなった。

config.web_console.permissions = '0.0.0.0/0'

しかし、互換性を保つため、config.web_console.whitelisted_ipsも利用できるように見えていたんですよ、一見は。

initializer "web_console.permissions" do
  if permissions = config.web_console.permissions || config.web_console.whitelisted_ips
    Request.permissions = Permissions.new(permissions)
  end
end

しかし、上のほうでconfig.web_console.permissions = %w( 127.0.0.1 ::1 )って初期化されているため、config.web_console.permissionsnilになることは絶対になく、config.web_console.whitelisted_ipsが使われることはないことになっていた。これ今までのコードで設定していた人たちがRails6にアップデートしたら急にweb-consoleが使えなくなる地雷じゃない?というかバグじゃない?と思い、PRを作ってみることに。

Pull Request作成

ひとまず、上記のところの順番を逆にするだけのPRを作って送った。最初にconfig.web_console.whitelisted_ipsを評価してしまえばそれでいいからだ。

initializer "web_console.permissions" do
  if permissions = config.web_console.whitelisted_ips || config.web_console.permissions
    Request.permissions = Permissions.new(permissions)
  end
end

そしたら、「テストを追加してくれ」と言われたので、やろうとしたのだけれど、うまくいかなかった。railtieのテストでRailsの初期化をもう一度やる仕組みが定義されていたのだが、それに則るとconfig.web_console.permissionsが設定されていなくてnilになっており、もしwhitelisted_ipsに値を入れても評価されるかどうかのテストがあったとしてもパスしていただろう。つまりテストもバグってた。

どーしたもんかなー…と思い悩んでいたのだけれど、コードとテスト見ると、ループバックアドレス127.0.0.1のこと)はデフォルトで常に許可されるように定義されていたため、「あれ?これってconfig.web_console.permissions = %w( 127.0.0.1 ::1 )の初期値の定義いらないよな?🤔」と思い、初期値の行の削除とpermissionsの定義を行うメソッドを必ず実行するように修正した。

# config.web_console.permissions = %w( 127.0.0.1 ::1 ) は削除済み
initializer "web_console.permissions" do
  permissions = config.web_console.permissions || config.web_console.whitelisted_ips
  Request.permissions = Permissions.new(permissions) # ifが不要だったので外した
end

whitelisted_ipsを使ってもpermissionsが設定されることを確認するテストを追加して、コードを引用しながら拙い英語で頑張ってみたところ、マージされた!!😂Rails6には間に合う模様。嬉しい!!

感想

やってみるもんです。

トレイボーを貰った

誕生日だったので、妻に最近気になっていたトレイボーをプレゼントに買ってもらいました😊 トレイボーはヨギボーのトレイ付きクッションです。膝にPCを置いて作業をするとPCが熱くなったり、肩が凝ったりしていたので、楽な姿勢で安定して作業したかったのです。 届いたので早速レビューを!

箱はしっかりとしています!

f:id:patorash:20190516072127j:plain

プチプチで丁寧な梱包が行われていました。

f:id:patorash:20190516072159j:plain

緑のクッションと引っ掛かりのための両面テープ付きバーがありました。

f:id:patorash:20190516072254j:plain

恐らくバーを貼るとこんな感じになるかと思います(が、貼っていません) 溝がありますが、そこにはタブレットをひっかけることができます。動画を見るためにタブレットを持たなくていいのでいいですね!一度Kindle Fireで動画を見てみたのですが、とてもよかったです。

f:id:patorash:20190516072355j:plain

実際に使うとこんな感じです。ビーズクッションなので、平行にするだけでなく、傾けたりしても太ももにフィットして安定性がありますし、PCの熱さもないし、めちゃくちゃ快適です!普通のソファーがPCの作業机として使えます。猫背にならずにキーボードを打てるので肩凝りにもならなさそうです。

f:id:patorash:20190526182130j:plain

感想

椅子さえあればどこでも作業しやすくなりそうです。例えば、長時間移動の時とかに持っておくとよさそう!自宅で作業するのもいいですが、車で作業するとかにも使えそう。非常にいいものをプレゼントしてもらったなと思います👍

RubyでUTF-8のCSVをExcelに変換するコマンドを作った

お客様や社内の他の部署のメンバーとファイルのやりとりをすることってあると思うのですが、いつも大変なのが、CSVファイル。HerokuのDataclipsがバージョンアップされてExcel形式でダウンロードできなくなったので、仕方なくCSVでダウンロードして、Excel起動してインポートでそのCSVを取り込んで…ってやっていたのですが、ファイル数が多くなると、とても苦痛です。

それができるようなコマンドやサービスなりを探そうとしたのですが、いいのがなかったので、もう面倒だから自分でgemを作りました。

rubygems.org

実行コマンド付きのgemなので、CLIで利用可能です。

CLIで利用

$ csv2excel -f foo.csv # => foo.xlsxが作成される
$ csv2excel -f bar/baz.csv # => bar/baz.xlsxが作成される
$ csv2excel -d ./bar # => barディレクトリ内の全てのcsvファイルからxlsxファイルを作成する

Rubyのコードで利用

CSVクラスをオープンクラスしてメソッドを追加したので、利用も簡単。

require 'csv2excel'
CSV.to_xlsx(file: 'foo.csv') # => foo.xlsxが作成される
CSV.to_xlsx(dir: './bar') # => barディレクトリ内の全てのcsvファイルからxlsxファイルを作成する

まとめ

ほとんどgem axlsxのおかげです。でも我ながらめっちゃ便利で重宝しています。

WindowsでChromeが遅かったのはWindows Update(1803)が原因だった

Windows10のChromeで、はてなブログがとてつもなく重くなって大体見られない件で私は数か月ほど疲弊していました。そのため、WindowsではEdgeを使っていました。別にEdgeも悪くはないのですが、Chromeのほうが拡張機能を色々入れていて使いやすいのでやっぱりそちらを使いたいなと思って原因を調べ始めたら、どうもWindows Updateが原因で起きる模様。

www.anchumosaku.net

詳細は上記のブログに譲るとして、 Cryptographic Servicesを停止すれば改善するそうです。試しにコルタナでserviceと打って、サービスウィンドウからCryptographic Servicesを停止してみました。

f:id:patorash:20190517224948p:plain
Cryptgraphic Servicesの停止を行う

停止した状態で、はてなブログChromeで開いてみたところ、あっという間に開きました。今までの「応答がありません」はなんだったのか…。

ちなみにCryptgraphic Servicesの再起動でも症状は改善するそうで、再度起動させても確かにChromeでブログが見られました。これでいいかなとも思ったのですが、やけにファンが回り始めるので、やっぱり無駄に負荷が上がっているみたいだし、症状がまた起きるのもストレスなので、上記のブログに書かれていたレジストリの編集を行いました。レジストリの編集は自己責任で!バックアップはちゃんと取ってからやりましょう。

上記の記事に従って、Chromeの停止、Cryptgraphic Servicesの停止を行ってから、レジストリエディタを起動して作業していました。ここで、躓きます。上記の記事では、以下のように書いてありました。

レジストリの左ウィンドウのエクスプローラに一覧が表示されますので、「コンピューター\HKEY_CURRENT_USER\Software\Microsoft\SystemCertificates\Root」へ移動します。 ここで、Rootの下にあるProtectedRootsだけは権限により編集できないため、アクセス許可の設定を変更する必要があります。 上の画像のように(上記のサイトでは画像がある)、ProtectedRoots上で右クリックすると「アクセス許可」の項目があるので、アクセス許可ウィンドウを開き、今ログインしているユーザに「フル コントロール」を与えます。

しかし、アクセス許可を与えようとすると、アクセス拒否されるのです😰 「ProtectedRoots」をキーワードにして検索したら、以下の記事が見つかりました。

twig-jp.blogspot.com

所有者を変えなければいけない模様。

f:id:patorash:20190517231214p:plain
RrotectedRootsのアクセス許可から、詳細設定をクリック

f:id:patorash:20190517231506p:plain
SYSTEMになっていたら、所有者の変更をクリックする。

f:id:patorash:20190517231855p:plain
自分のアカウント名orメアドを入力して、名前の確認をクリックする

f:id:patorash:20190517232154p:plain
アカウント名に下線が引かれて表示されたらOKをクリックする

f:id:patorash:20190518105014p:plain
「ProtectedRoots のセキュリティの詳細設定」に戻るので、[ 継承の有効化(I) ] をクリックする

f:id:patorash:20190518105420p:plain
Rootを削除する

そして、OSの再起動を行います。

再起動後、Chromeはてなブログにアクセスしたところ、全く問題なし!やっと普通にChromeを使うことができそうです!😊

VSCodeのRemote Developmentプラグイン登場

このGWで最高のWindowsでの開発環境を作るんだ!と息巻いておりましたが、MicrosoftさんがVSCodeのRemote Developmentプラグインを発表しました。正直なところ、以下のブログを読んでいただければもう話は終わりです。

crieit.net

連休最後なのでとりあえず試してみるかーと思って試してみました。

試してみる

現在のところは、このプラグイン自体がベータ版のため、VSCode Insiders版でしか動かないので、VSCode Insiders版をインストールしました。

とりあえず、vagrant upした状態で、SSHの接続情報を出力させます。ユーザ名のところをusernameにしてますのでご注意ください。

PS > vagrant ssh-config
Host default
  HostName 192.168.100.2
  User vagrant
  Port 22
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile C:/Users/username/sources/github.com/patorash/ansible-provisioning-ubuntu-master/.vagrant/machines/default/hyperv/private_key
  IdentitiesOnly yes
  LogLevel FATAL

VSCodeでCtrl+Shift+Pでコマンドパレットを開き、Remote-SSH: Connect to Host...を選択して接続先を表示します。ない場合、Configure SSH Hosts...が表示されるので、それを選ぶと、SSHの接続先設定ファイルを選ばされるので、私はC:\User\username\.ssh\configを指定し、上記の設定をコピペして保存しました。その後、再度Remote-SSH: Connect to Host...を行い、defaultに対して接続をすると、新しいVSCodeのウィンドウが開き、Vagrant上で動くUbuntuに接続完了です。

あとはコマンドパレットからOpen Folderでプロジェクトフォルダを開けばOK。 VSCodeのターミナルを開くと、接続先のUbuntuのターミナルが開きました。完璧です。

rails sして速度を計測してみる

VSCodeとは直接は関係ありませんが、SMBでの共有フォルダと、共有フォルダではないUbuntu上のディレクトリで、全く同じプロジェクトをrails sしてみました。springが効いた状態で、初回表示ではありませんのであしからず。何度かページを表示した平均です。

環境 時間
共有なし 0.9秒
共有あり(SMB) 5秒

こうなってくると、Windowsからファイル共有せずに、VSCodeのRemote Developmentプラグインでファイル編集したほうがサクサク開発できそうです😊やっぱりLinux上でDockerを動かすと全然違うのだな…。

Windows & Vagrant & Hyper-Vでイケてる環境は?

  • VSCode Insidersを入れてRemote Development プラグインを入れる
  • VagrantUbuntuなどを入れる
  • 仮想スイッチを作る(内部)
  • WinNAT設定を行う
  • VMにIPを設定する
  • フォルダ共有は不要

でいいんじゃないかと思います👍

やり方は前回のブログを参照のこと。

patorash.hatenablog.com

vagrantは必要?という気もしますが、VMへのSSH接続とか、プロビジョニングとかが容易になるので、使ってもいいんじゃないかなと思います。

Vagrant + Hyper-V + Ubuntu18.04でRailsを動かせた

ずっとWindowsでの開発環境構築を試しているのですが、とりあえずベストではないにしてもベターまで来たかなと思うのでメモを残します。過去のトラブルはこちら。

patorash.hatenablog.com

patorash.hatenablog.com

なお、Hyper-Vを使わずにVirtualBoxを使うほうを強くお勧めします!(ハマりどころが少ないだろうから)

VagrantHyper-Vを選ぶ際のTips

VagrantでプロバイダをHyper-Vにすることができますが、制限事項がかなり多いです。

フォルダ共有にはsmbを選んだほうがよさそう

フォルダ共有はNFSがいいという意見がネットでは多いのですが、どうもVirtualBoxだとうまく動くみたいなのですが、Hyper-Vだと動かない模様。試行錯誤したのですが、私にはわからなかったため、smbを使って共有しています。以下のissueでは、Hyper-VだったらSMBでいいという話になっているみたいでした。

github.com

また、SMBでフォルダ共有を行う場合は、vagrant upを実行する都度、Windowsにログインするためのユーザ名とパスワードの入力を求められるので、これを最初はVagrantfileに直書きしていたのですが、vagrantのdotenvプラグインがあるとのことだったので、これを使うようにしました。

vagrant plugin install dotenv

これで、.envファイルにログイン情報を移動させることができます。

SMB_USER = "" # Windowsのユーザ名
SMB_PASS = "" # Windowsのパスワード

そして、これを使うようにVagrantfileを編集します。

# -*- mode: ruby -*-
# vi: set ft=ruby :
Dotenv.load # 追加

Vagrant.configure("2") do |config|
  config.vm.box = "bento/ubuntu-18.04"
  config.vm.provider "hyperv"

  config.vm.synced_folder "~/vagrant",
    "/vagrant",
    create: true,
    type: "smb",
    mount_options: ["vers=3.0"],
    smb_password: "#{ENV['SMB_PASS']}",
    smb_username: "#{ENV['SMB_USER']}"

  # 略
end

これでOK…と思ったら、ところがどっこい、vagrant upするとホストのIPが見つからないというエラーで共有できませんでした。これは、接続する仮想スイッチのネットワークをパブリックとワークからプライベートネットワークにすれば解決しました。上のほうに載せている過去記事を見ていただければと思います。

Vagrantのポートフォワーディングは使えない

とりあえずこれで、Windows側とHyper-V上のUbuntuでフォルダ共有できたので、Vagrantfileを修正してポートフォワードするようにして、Ubuntu側でRailsを起動してみました。

# 追加
config.vm.network "forwarded_port", guest: 3000, host: 3000, host_ip: "127.0.0.1"

が、うんともすんとも言いません…。調べてみると、どうもHyper-Vの場合はネットワークの設定は全て無視されるようです。 なので、上記の設定は何の意味もない模様。

では、Hyper-Vの場合はどうすればいいのか?Windows側でポートフォワーディングの設定を行う必要があります。参考にちょうどよいページがありました。

4thsight.xyz

これを参考に、設定してみます。192.168.212.51は、VM側に設定されているIPです。

netsh interface portproxy add v4tov4 listenport=3000 listenaddress=127.0.0.1 connectport=3000 connectaddress=192.168.212.51

これで、VM側の3000番ポートがホスト側にポートフォワードされるようになりました。Windowsのブラウザでhttp://localhost:3000にアクセスしたら、Ubuntuで起動中のRailsアプリにアクセスできました!なお、Railsアプリを起動するときはbin/rails s -b 0.0.0.0を忘れずに!!

これで、とりあえずやった!というお気持ちを表明。

Hyper-Vの仮想スイッチ(Default Switch)は使えない

ここで、過去にPCを再起動したらVMのIPが変わっていたことを思い出しました。

ということで、Windowsを起動すると仮想スイッチのDefault SwitchのIPがコロコロと変わり、全く意味がない模様。

yamanxworld.blogspot.com

せっかくnetshでポートフォワードの設定を書いたのに、台無しです…。こうなると、自分で仮想スイッチを定義するのがよさそうです。しかし、自分で作った仮想スイッチだとVMにIPの割り当てを行ってくれず、VM側でIPを設定する必要がある模様。なんとか自動でIPをふる方法を調べていたのですが、見つからなかったので、公式の言う通りにしてみます。

docs.microsoft.com

仮想スイッチの作成とNATの設定

以降の処理は、PowerShellで、管理者権限で。まず、Switchを作ります。

New-VMSwitch -SwitchName "VagrantNAT" -SwitchType Internal

次に、Switchの情報を見ます。ifIndexが必要な情報となります。

Get-NetAdapter

Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
----                      --------------------                    ------- ------       ----------             ---------
vEthernet (VagrantNAT)    Hyper-V Virtual Ethernet Adapter #2          10 Up           00-15-5D-8F-1B-31        10 Gbps
# 他は省略

次に、仮想スイッチにIPを割り当てます。今回は192.168.100.1にしました。-InterfaceIndexに先ほどのifIndexの値を指定します。

New-NetIPAddress -IPAddress 192.168.100.1 -PrefixLength 24 -InterfaceIndex 10

次に、NATネットワークを作ります。

New-NetNat -Name VagrantNATnetwork -InternalIPInterfaceAddressPrefix 192.168.100.0/24

これで、ネットワークは完成です。VMへのIPの割り当ては別途VMに入って行います。

VM側のIP設定を行う

VMはとりあえずvagrant upを行います。IPは割り当てられませんが、作業にはvagrant sshが使えるので問題ありません。

vagrant sshを使ってVMの中に入り、IPを設定します。Ubuntu18.04からIPの設定方法が変わった模様です。

jyn.jp

sudo vi /etc/netplan/01-netcfg.yaml

これで、以下のように設定しました。

network:
  version: 2  
  ethernets:
    eth0: 
      addresses:
        - 192.168.100.2/24
      gateway4: 192.168.100.1
      dhcp4: false
      nameservers:
        addresses:
          - 8.8.8.8

nameserversは、192.168.100.1にしたらapt-getに失敗したので、8.8.8.8にしています。 そして、netplanの設定を反映します。

sudo netplan apply

これで、VMに固定IPが設定されました。

ポートフォワードの設定をやり直し

既存の設定は意味がないので、resetで削除し、先ほど登録したVMのIPでポートフォワードの設定をやり直します。

netsh interface portproxy reset
netsh interface portproxy add v4tov4 listenport=3000 listenaddress=127.0.0.1 connectport=3000 connectaddress=192.168.100.2

これで完了!VM側でRailsアプリを起動したところ、http://localhost:3000でアクセスできました🎉🎉🎉

なお、PCを再起動しても問題ありませんでした!ただ、Vagrant自動起動にしていたらSMBの共有に失敗していたので、vagrant reloadしたらうまくいきました。

まだまだ開発環境としては問題がありそうなのですが(SMB上にRailsアプリを置いてrails sすると遅い…)、とりあえず動かせたので、よしとします。

RubyKaigi2019に参加してきた

元号が令和になりました。GW楽しんでいますでしょうか? さて、10日以上過ぎてしまいましたが、4月18日~20日に福岡で開催されたRubyKaigi2019に参加してきましたのでそのことについて書こうと思います。

弊社からは私を含む3名が参加しまして、岡山から車で移動しました。道中は仕事のこととか話しつつ、大体6時間くらいで到着しました。

0日目

前日入りしたのですが、その日はLINE 福岡さん主催のLINE Developer Meetupに参加しました。

line.connpass.com

LINEさんのオフィスに行ってみたかったというのが主なところでしたが、監視に関する発表を聞き、懇親会ではElasticの大谷さん(@johtani)にご挨拶することができたのでよかったです。担当プロジェクトでElasticsearchを使っているのですが、困っているときにたくさんのアドバイスを頂いて助かっています😃ElasticStackを使った監視にも、かなり興味が湧いたので、個人のプロジェクトとかでやってみたいと考えています。

LINEさんの懇親会では寿司とピザが出てきて、イケてる会社の勉強会って感じでした。LINEの中の方とも多少お話することができまして、LINEはRubyはほとんど使ってなくて、バックエンドはJavaとKotlinと伺いました。なので、「あー、RubyKaigiあるんだなぁ」くらいの感じでした。

1日目

博多駅周辺にホテルを取っていたので、移動は3日間ともSmartHRさんがスポンサーをされていたシャトルバスで移動しました。これはとてもありがたかったです🙏

Ruby3について

Ruby3x3に向けての取組について、Keynoteと途中経過レポートで聞くことができました。Matzは型を書きたくないので、型アノテーションのような仕組みは使いたくないとのことで、型プロファイルを行って型ファイル(拡張子はrbi)を自動生成するようにしたいとのことでした。2.6でMJITが入ってRubyの性能は上がったけれどRailsで遅くなったりと、なかなか高速化の道は難しそうです。あとは並行性を良くするための取組についてもありましたが、GuildやAutoFiberなど、既にありそうな名前と競合していて、名前付けも難しい…。

社内報告会をしたときに、「sorbetみたいに型アノテーションを書くことで、処理を手堅くしたいところだけでも使えたらすごくいいのにな」という意見もありました。

OpenAPI3について

OpenAPIはあまり詳しくなかったのですが、APIの話なので聞きに行ってみました。OpenAPI3はAPI Schemaファーストで開発をするための仕組みで、OpenAPI3でスキーマを定義すると、サーバサイド、クライアントサイドでの開発が捗るという話でした。

  • OpenAPI3はRESTの拡張のため、既存の資産を生かせる。RailsはRESTベースなので導入しやすい。
  • 実装にスキーマ定義を守らせるための仕組み(gem committee)を導入し、実装が乖離しないようにすることができる。
  • openapi_parserを使って定義ファイルからRubyObjectに変換できる。

今ちょうどGraphQLを使ったAPI実装をしている最中なのですが、これを知っていたらOpenAPI3でもよかったかなという気持ちになりました。ただ、不要なフィールドを渡さないような仕組みがRESTだとないような気がしているので、やはり自分の利用にはGraphQLのほうが合ってたかなとは思います。

RMagickについて

Rubyistならほぼ誰しもがお世話になっていると思われるRMagickのお話でした。RMagickはRubyKaigi2019現在、最新は3.1.0となっていて、不具合をかなり潰したので最新のRMagickと最新のImageMagickを使ってほしいとのこと。今回は2系から3系に上げるときに行ったことについての発表でした。

  • MacWindowsのインストールでこけないようにした
  • メモリに関する不具合をたくさん潰した

とのことでした。MacでRMagickを入れようとすると、結構な頻度でエラーが起きていたのですが、homebrewで入れたImageMagickを検知してエラーを起きにくくしたということでした。Windowsも似たような感じだったかと思います。メモリの不具合に関しては、メモリリークが発生していたパターンの紹介や、ImageMagick自体のメモリリークの不具合を報告したりなどをされていたということでした。そのissueもcloseされて新バージョンがリリースされていたので、6系の最新のImageMagickを使うのがやはりよいそうです。

7系への対応は今年いっぱいくらいかかりそうで、6系と7系の対応をどうするかでメンテナで意見が分かれているけれど、1つのバージョンで6系、7系両対応のほうが優勢らしいです。

これもまた社内勉強会では、「メンテナが大変になるし、バージョン分けてもいいんじゃないか?」という意見がありました。

GraphQLについて

決済サービスのSQUAREでGraphQLを使ったという話だったのですが、メインどころの話はGraphQLの型定義が膨大な数に及ぶのでメタプログラミングした、という話のように思えました。方針としてはわからなくはなかったのですが、そこでメタプログラミングするとGraphQLの型ファイルドキュメントを作りにくいから微妙だなと感じました。せめて型定義ジェネレータを作るほうが筋がいいのでは?🤔

オフィシャルパーティー

オフィシャルパーティーは川端商店街を貸し切っての、400mの懇親会場で商店街を練り歩きながら好きなところでご飯や飲み物をもらって好きなテーブルで話をするという感じでとてもダイナミックなイベントでした。しかしこれがめちゃくちゃ良くて、普通の広い一間の懇親会よりも交流がしやすかったですし、外国人の方々は商店街でお土産を買うことができるし、オフィシャルパーティー終了後に近くの飲み屋に移動することも簡単なのでその付近にたくさんのお金が落ちるという仕組みで最高じゃないかと思います(運営の皆さんはそのぶん大変だとは思いますが!)

ふだんから人見知りの私ですが、いつもよりオープンな会場だったので、フォロワーの方とお話できたり、そのつてで大阪・京都界隈の方たちともお話できたり、以前に自分のgemにPRをしてくださった、はてな@onkさんとお話できたのでよかったです。

2日目

2日目と3日目は会場で朝食が食べられるように、Medleyさんが朝食スポンサーをされていました。今回は朝食を会場でいただくことができて助かりました。明太子がおいしかった!

Rubyの安定版のメンテナンス

Rubyの安定版のメンテナをされている@nagachikaさんのKeynoteでした。安定版のメンテナを募集とのことと、メンテナとして気を付けていることや失敗談などを共有してくださいました。こういう方々に支えられているのだなと、感謝しきりでした。

CrystalBall

テスターの方の発表でした。プロジェクトが大きくなってくると、テスト対象のファイルも膨大になり、テストにかかる時間も長くなります。それを、gitの変更点からテスト対象を絞り込んで該当しそうなテストのみを実行するという仕組みとしてCrystalBallを作ったということでした。

これはテスト戦略としてはとても素晴らしいと共感しました!変更点だけになれば相当なテスト時間を削減できます。ただ、全体テストが不要になるわけではないので、ローカルでテストを実行する場合はCrystalBallでテストを行い、CIに全体テストを任せる、ということなのかなと思いました。入れてみてもいいなと考えています。

フロントエンドフレームワーク Ovto

OvtoはhyperappをRubyで書けるJSトランスパイラーのOpalで移植したフレームワークです。発表者のyharaさんがDIYをするために作成されたとのことで、今回の発表はOvtoの2人目のユーザーを作るためとのことでした。「ちょっと最高のフレームワークができたので共有したくて」という感じで和やかに始まりましたが、私もOvto使ってみたいなぁ~と思いました。

フロントエンドをRubyで書く意味って?と言われそうですが、Rubyで書けたら面白いじゃん!と思うので、個人プロジェクトとかで試してみようかなと思います。 なお、Ovtoについては、るびまに記事が上がっています。

magazine.rubyist.net

TruffleRubyでChrome DevToolsを使ったデバッグ

Chrome Devtools Protocolというプロトコルがあり、それを使うとChrome Devtoolsのデバッガを使ってどんな言語でもデバッグできるらしいです。私の解釈ですが、GraalVMで動作する言語であれば、Chrome Devtools Protocolを使うことができるのでデバッグが容易になった、ということだと思いました。RubyのオブジェクトがChrome Devtools上で見られるようにJSのオブジェクトにうまくマッピングされていてすごい!と感じました。

LT

LTはどれも面白かったのですが、印象に残っているのは、Unicode元号ライブラリの令和対応のやつでした。あとmrubyを搭載した人工衛星が飛ぶという話。

PRTimes Drinkupに参加

2日目はPRTimesさんが主催のドリンクアップに参加してきました。LT枠で申し込んでいたため、LTしましたが、プロジェクタの後ろのほうで話すことになったり、会場がガヤガヤしていてあんまり聞こえてなかったみたいでした😭しかし、それキッカケで話すことができた方もいましたし、やってよかったなと思います。いろんな方と話すことができて楽しかったです!PRTimesさん、ありがとうございました!

実のところ、LTするから緊張しすぎてあんまりご飯が喉を通らなかったため、終わってからとんこつラーメンを食べに行ってきました。やはり博多、めっちゃうまかったです。

3日目

Committers VS the World

事前に集めた質問にRuby Committerさん達が答えてくれるという恒例のセッションでしたが、Rubyの進歩についてとか、記法どうする?とかの話題で面白かったです。マルチバイト文字(絵文字)で遊ぶやつ、いいですね~。

🍣 = Sushi.new

そして、大きなニュースとしては、Rubyリポジトリsvnからgitになるとのことでした。RubyKaigi後のやりとりを見ているとgitになってからのほうが大変そうでしたが、慣れるまでの時間だと…いいな…。

Numbered Parametersに関しては、私はGroovyやKotlinと同じくitがいいのですが、itはRSpecで使っているからという意見もあって、難しそう…。

(1..10).map { @1 * 10 } # 現在の候補は@1の模様
(1..10).map { it * 10 } # 個人的にはこれがいい

巨大なアプリケーションのコードのクリーンアップ

Cookpadの中の人による、成長したアプリケーションのコードの削除についてのお話でした。CookpadRailsになって10年が経ち、削除した機能などがあるのだけれど、コードベースでは残ってしまっているものが多数あるとのこと。それを削除するための取組についてでした。

面白かったのが、使われていないコードをあぶりだすため、処理が実行されたらログを出すようにするのにRubyコミッターにRuby自身のコードに処理を仕込んでもらった、というところでした。これぞ、コミッターを会社で雇っている実践的な活用法ですごい!と思いました。自分的には「その発想はなかった!」と唸りました。

あとはoneshot_coverageという行単位で実行されたらログを出すやつも紹介されていて、よさそうでした。SimpleCov形式で実行結果がみられるのが便利そう。 これらの取組によって、CookpadRailsアプリの起動が1.5秒改善されたとのことで、地道な改善は大事だなと思わされました。

WebAPIクライアント開発のベストプラクティス

今回のRubyKaigiで個人的に一番よかったのは@sue445さんの、この発表でした。

WebAPI Clientを作るための知見がめっちゃ詰まっていてとてもよかったです!👌WebAPI Clientの責務やどこまで面倒を見るか等は、ついついやりすぎてしまう場合がありそうなので、参考になりました!私もこれから担当製品のWebAPIとそのClientを作っていかなければなーと思っていたところだったので気を付けたいと思います。faradayを使ったことが多分なかったと思うので、今後はfaradayを使っていくようにしようと思いました。

dRubyワークショップ

なんとなく気になっていたdRubyのワークショップに参加。Rubyのオブジェクトを異なるプロセス間で受け渡して処理が実行できるという不思議さ…。うーん、本当に不思議。

dRubyの本を読んでもわからないところがあったら、もう一冊買ってくださいって言っててウケました😂

The send-pop optimization

@shyouheiさんのRubyの最適化のお話でした。Rubyは処理毎に必ず返り値があるのだけれど、必ずしもそれを利用することがないため、Ruby側で返り値を利用していない場合は返り値を返す処理を実行しないようにすれば速くなるのではないか?という仮定で取り組んだとのことでした。

ベンチマークの結果、遅くなる処理もあったけれど突出して速くなる箇所もあったとのことで、採用されたそうです(たしか)。しかし、Railsの起動には0.3秒程度遅くなったとのこと。返り値を使っているかの検証処理が挟まれたため、仕方がないのかもしれませんが、動き出したらトータルでは速くなるのかな~?と思います。

Keynote

データベース用のライブラリであるSequelの作者の方のキーノートでしたが、最適化の鬼という感じで「これはもうRubyである必要があるのか???」と思いながらも楽しく(?)見ていました。出てくるコードがすべてハチャメチャでした。

閉会

あっという間の3日間でしたが、とても楽しく、とても刺激的でした。次回は長野県の松本市とのことだったので、来年どうやって行こう?🤔と今から悩んでいます!運営の皆様、お疲れ様でした&ありがとうございました!

全体を通して

我々はRubyというプログラミング言語と通して知り合い、そしてRubyKaigiで一同に集まり、ここで直接ご本人に会って感謝を伝えることができたりする貴重な機会でもあるので、人見知りだからといって恥ずかしがっているのはほんまに勿体ないなーとヒシヒシと感じました。今回は結構頑張ってお世話になっている様々な方にご挨拶できましたし、アフターパーティーにあぶれた人たちで集まって飲み屋さんに行って交流できたりもしたので、充実したRubyKaigiとなりました。

昼食の屋台や、コーヒーを頂いたり、スポンサーブースで色々お話できたことなど、本当にたくさん楽しませていただきました。新たな試みが多くて思わず人に話したくなるカンファレンスでした!