こんにちは、hachi8833です。もういくつ寝るとRuby 2.7が出るんでしょうか。
- 各記事冒頭にはでパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
- 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です
- 毎月第一木曜日に「公開つっつき会」を開催しています: お気軽にご応募ください
今回も週刊Railsウォッチ第17回公開つっつき会を元にお送りいたします。お集まりいただいた多くの皆さま、ありがとうございました!
Ruby
Ruby 2.7の変更点などなど
Link: Ruby 2.7 の変更点 – 復活したものや入りそうで入らなかったもの – @tmtms のメモ https://t.co/19jxkaPDiC
— Yukihiro Matsumoto (@yukihiro_matz) December 1, 2019
つっつきボイス:「ツイートの記事は、2.7で復活した機能や入りそうで入らなかった機能の話で、2つ目はjnchitoさんのQiita記事です」「Ruby 2.7でさらに速くなるのが期待できますね: Railsをちゃんと書いていれば、常に最新のRubyにするだけでRailsが速くなりますし」「ですね」
「まあRubyの新機能を業務コードで率先して使うかどうかはまた別の話ですけどっ」「」「新しい機能はやっぱり楽しいんですけど、よっぽどうまくいくことがわかるまでは業務コードで使うのはためらいがある」「作り捨てのバッチあたりでならやってみてもいいかも」
「キーワード引数の非シンボルキーは、例のキーワード引数の絡みで復活してましたね」「2.7で挙動が少し変わるようです↓」
# 同記事より
def hoge(*a, **k)
p a
p k
end
# (略)
# Ruby 2.6.2
hoge("a"=>1, b: 2)
#=> [{"a"=>1}]
#=> {:b=>2}
# Ruby 2.7
hoge("a"=>1, b: 2)
#=> []
#=> {"a"=>1, :b=>2}
「Ruby 2.6で非推奨になっていた例のフリップフロップ..
が実は2.6.4で復活していた!?」「え」「なくてもいいかもと言われていたフリップフロップ」「フリップフロップ全然使ってないしな〜解説無理」「どうやら意外に使われていたらしき」
# 同記事より
10.times{|i| print i if (i==3)..(i==6)}
#=> "3456"
参考: Rubyのフリップフロップ - monamonamonad.github.io
「パイプライン演算子|>
とメソッド参照演算子.:
は既報通り2.7には入らないことになりましたね」「少なくとも2.7には入らないけど議論が進めば入るかも?」
「あと以下のお片付けならぬお型付けアドベントが気になりました」「まだそんなに埋まってないかな」(注: その後エントリ増えてました)
「あとこちらもRuby 2.7や3の新機能がらみの記事です↓」「RubyConf 2019のMatzキーノートのまとめですね」
なおこの記事では以下のRubyパターンマッチング記事をおすすめしていました↓。また「MatzによるとRubyのパターンマッチングは遅いのでパフォーマンスに注意して賢く使いましょう」という記述がありました。
参考: Introduction to Pattern Matching in Ruby | Toptal
Ruby 2.7のEnumerator#produce
(Ruby Weeklyより)
# 同記事より
Enumerator.produce([0, 1]) {
|base_1, base_2| [base_2, base_1 + base_2]
}.take(10).map(&:first)
#=> [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
# 同記事より
# ある月から平日に該当する日を取得
Enumerator.produce {
Date.today+rand(30)
}.detect{ |date| !date.sunday? || !date.saturday? }
# => #<Date: 2019-11-15 ((2458803j,0s,0n),+0s,2299161j)>
つっつきボイス:「ruby-jp Slackで2.7のproduce
が盛り上がってました」「フィボナッチやってる」「もしかするとElixirあたりにも同じ名前のメソッドあったりするかな?関数型言語あたりで見たことあるような気がする」「inject
を別の方法でやってる感」「今日は残念ながら出席できなかったkazzさんにproduce
見せたらかなり面白がってました」「うまく書ければはまりそう」
参考: instance method Enumerable
#inject` (Ruby 2.6.0 リファレンスマニュアル)
後で2.7.0-preview3でproduce
とinject
をちょっと動かしてみました。
Enumerator.produce([1, 1]) {|base_1, base_2|
[base_2, base_1 + base_2]
}.take(10).map(&:first)
#=> [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
(0..7).inject([1, 1]) {|fib, i|
fib << fib[i] + fib[i+1]
}
#=> [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
追いかけボイス: Haskellのiterate
関数がRubyのEnumerator#produce
にちょっと似てるかもしれないと教わりました。
参考: The Fibonacci sequence - HaskellWiki
-- wiki.haskell.orgより
fibs = map fst $ iterate (\(a,b) -> (b,a+b)) (0,1)
mitamae: mrubyでやれるitamae
# 同リポジトリより
# cat recipe.rb
include_recipe 'included'
directory '/tmp/etc'
file '/tmp/etc/hello' do
content 'This is mitamae'
end
template '/tmp/etc/config.yml' do
source 'config.yml.erb'
end
つっつきボイス:「この間BPSの社内Slackに貼っていただいたヤツです」「そうそう、mrubyで動くこのmitamaeをこの間知って、Rubyがなくても単独バイナリとして動かせるのがいいなと思いました」
「itamaeだとitamaeを動かすためにRubyをインストールする必要があったりして大変です」「itamaeはいわゆるIaaC(Infrastructure as a Code)的なサーバーのプロビジョニングツールで、設定をRubyのコードで書くと↓実行するだけで一発でプロビジョニングできて、いい感じに差分管理もできます」
# https://github.com/itamae-kitchen/itamae/wiki/Definitionsより
define :install_and_enable_package, version: nil do
v = params[:version]
package params[:name] do
version v if v
action :install
end
service params[:name] do
action :enable
end
end
「スクラッチのサーバーなんかだとRubyが入ってなかったりしますし、制約が厳しいOSだったりすると既存のRubyのバージョンが恐ろしく古いこともあるので、Itamaeを動かすためにRubyをどうやってインストールしようか考えるのが面倒」「」「そういうことを考えないで済むという点でこのmitamaeはいいなって思った次第です」「mrubyのいい使い方」「まだ動かしてないんですけど、READMEを見た感じではitamae ssh
が入ってないぐらいで後は普通のitamaeが動きそう」「コミットを見るとk0kubunさんがほとんどやってるみたいですね」「社内ではansibleが主流なんですけど、itamae使うならこれがいいかな〜」
追記(2019/12/10)
本記事タイトルで「mitamae gem」となっていたのは誤りでした。「mitamae」に修正しました。
ruby-packer: Ruby CLIをシングルバイナリに
つっつきボイス:「まだ試していませんが、こちらはCRubyでシングルバイナリをコンパイルするようです」「CRubyでやったらどんだけバイナリでかくなるのやら」「どこまでリンクするかですよね」「やってみないとわかりませんが20MBぐらいになるのかな?」
後で雑にやってみました。63行程度のRubyコードをrubyc subtract.rb -o subtract
したところ怒涛のようにCのコンパイルが走って11MBになりました。Go言語で書くのとさほど変わらないぐらいのバイナリサイズという印象です。試していませんがRailsも一応コンパイルできるようです。
-rwxr-xr-x 1 hachi8833 staff 11M 12 10 12:20 subtract
-rwxr-xr-x 1 hachi8833 staff 1.1K 12 20 2018 subtract.rb
シングルバイナリについて
「Rubyのシングルバイナリか〜、気持ちわかる」「READMEによると、この辺のライブラリがビルドに必要っぽい↓」
- gdbm
- libffi
- ncurses
- openssl
- readline
- yaml
- zlib
「Linuxの内部に関わる話ですけど、このruby-packerはいわゆるライブラリに依存しないシングルバイナリをビルドできるというもののようですね: Rubyに限らず一般にプログラムはOSに入っているreadlineやらlibxmlといったライブラリを動的リンクして使うことがよくあります」「ふむふむ」「そういう動的にリンクされるライブラリは、Macだと拡張子が.dylib、Linuxだと.so、Windowsだと.dllになりますが、やってることは同じですね」
「そうしたライブラリに依存するプログラムは、ライブラリのバージョンが変わったりライブラリがなくなったりすると不具合が出たり動かなくなったりするので、それらを1個のバイナリに全部焼き込んで依存しないようにしたシングルバイナリという形態のプログラムには一定の需要があります」「おぉ」「その分バイナリのサイズはでかくなりますけど、その代わり同じOSならライブラリ構成とかが全然違っていても入れるだけで動かせます」
BusyBoxは便利
「この手のシングルバイナリで有名なのはBusyBoxというヤツ↓」「これ知らなかった」「BusyBoxは、lsとかsshみたいにサーバー管理に必要そうなLinuxコマンドとかがひととおり何でも入っているシングルバイナリのツールで、面白いのはコマンドのシンボリックリンクをBusyBoxバイナリにリンクしておけば呼ばれ方に応じて振る舞いが変わるところ」「こんないいものがあったなんて」
- サイト: BusyBox
「gccすら入れられないような組み込み環境なんかでもBusyBoxさえ持ち込めば何とかなったりしますし、対応しているCPUアーキテクチャもやたら多くて、なかなか楽しい十徳ナイフ的なツールです」
はみだし:「もともと以下の記事↓で紹介したdipというツールがRubyなしでも動くシングルバイナリも提供されていて、どうやってそのシングルバイナリをビルドしているのか知りたくて追っているうちにruby-packerを見つけました: ただdipではruby-packerを使っているのかどうかよくわからなくて」「dipのリポジトリを今ざざっと見た限りではわかんないですね〜」
追記(2019/12/11)
> ただdipではruby-packerを使っているのかどうかよくわからなくてhttps://t.co/tlDMymG6hf
この辺見る限り使ってそうhttps://t.co/X5E6gbwnQs— Kota Yoshitsugu (@_yoshitsugu) December 10, 2019
情報ありがとうございます!TravisCIでruby-packerによるビルドをやってるようですね。
その他Ruby
- リリース: Release Faraday v0.17.1 · lostisland/faraday — Faradayがもうすぐ1.0になるらしい
つっつきボイス:「お、Faradayってず〜っとバージョンが0.いくつのままでしたね」「一度バージョンが1.0になった後戻ったような覚えありますけどっ」「Ruby 2.7に対応したら1.0にするということのようです」「ま自分はHTTPClient派ですけど」「そういえばウォッチでも話題になりましたね(ウォッチ20180615)」
- リポジトリ: nahi/httpclient: ‘httpclient’ gives something like the functionality of libwww-perl (LWP) in Ruby.
「Faradayってクローラーとか作るときに使うんでしたっけ?」「クローラーも作れると思いますけど、もっとリッチなことができます」「Faradayはミドルウェアが使えますね↓」「そういえばあったわFaradayのミドルウェア」
「Faradayは直接使うより他のgemのdependencyで引っかかる印象があるんですよ: こっちのライブラリとあっちのライブラリがそれぞれFaradayの違うバージョンに依存してたりとか」「あぁ〜」
DB
PostgreSQLカンファレンス2019まとめ
- Togetter: PostgreSQLカンファレンス2019 - Togetter
- サイト: PostgreSQL Conference Japan 2019 (2019-11-15) | 日本PostgreSQLユーザ会
つっつきボイス:「そうだぽすぐれカンファレンスやってた!」「Togetterでセッションごとにまとめてくれているので見やすそう」「PostgreSQLカンファレンスは大規模ですよね: 特に Project Tsurugi(劔)の話↓とか」「つるぎ?」「これを主催している神林さんは日本のPostgreSQL界隈ではめちゃ強い人で、たしか未踏プロジェクトにも出てたと思います」「おぉ」「何度か会ったことありますけど、PostgreSQLをL1キャッシュレベルで高速化するような人でした」「つぇ〜」
クラウド/コンテナ/インフラ/Linux/Serverless
今年のre:Invent
- サイト: AWS re:Invent 2019
つっつきボイス:「re:inventちょうど今やってますね〜(注: つっつき中)」「やってるやってる〜」「既にいくつか記事も出てるので少し貼ってみました↓」「re:inventは自分もまだ追いかけられていませんが、重要なイベントなので後でキャッチアップして社内でre:inventサーベイするつもりです: EC2 Image Builder↓もよさそうですし」
- 元記事: EC2のイメージ作成を劇的に効率化するEC2 Image Builderが発表されました! #reinvent | Developers.IO
- 元記事: AWS、機械学習のための統合開発環境「Amazon SageMaker Studio」提供開始。コード、ノートブック、データセットをひとつのツールで。AWS re:Invent 2019 - Publickey
「CodeGuru↓とか興味ある」「自動でコードレビューするやつでしたっけ」「でもお高い〜100行あたり0.75ドルだから、Railsのコードをうっかりかけたら死にそう」「死ねる」「インデント直すとかでも1000行で7.5ドルか〜」「よさそうだけどCodeGuru破産コワいし、今ならCodeClimateみたいな他のサービスの方がコストが安定しそうではありますね」
Buildpacksとは
- サイト: Heroku buildpack | Heroku
- 元記事: コンテナ標準化時代における次世代Buildpack『Cloud Native Buildpack』について - Qiita
- サイト: Cloud Native Buildpack Documentation · Cloud Native Buildpack Documentation
つっつきボイス:「Buildpackはそこそこ前からあるようですが、どのぐらい普及しているんでしょう?」「Herokuは前からBuildpackやってますけどね」「上のスライドも開けてみたらBuildpackの話で、それで知りました」「まあDockerfileがこれだけ普及しましたし、Dockerfileは中身を追いかけられるのがいいところですし(追いかけるのつらいけどっ)」
その他インフラ
FROM nginx:alpine
RUN apk add curl
HEALTHCHECK --interval=5s --timeout=3s CMD curl -f http://localhost/ || exit 1
つっつきボイス:「おぉ〜HEALTHCHECKは知らなかった」「どういうものなんでしょう?」「docker ps
するとこうやって表示できるのね↓」「どこかで使えそう」「おかしくなるとまずDockerリスタートしちゃいますけどっ」
$ docker ps --format "table {{.Image}}\t{{.Status}}\t{{.Names}}"
IMAGE STATUS NAMES
kakakakakku/nginx:base Up 19 seconds (unhealthy) nginx05
kakakakakku/nginx:base Up 27 seconds (healthy) nginx04
kakakakakku/nginx:ng Up 11 minutes (unhealthy) nginx03
kakakakakku/nginx:ok Up 11 minutes (healthy) nginx02
kakakakakku/nginx:base Up 11 minutes nginx01
CSS/HTML/フロントエンド/テスト
Adbe XDのプラグイン
Mimic
URLを入力するだけで既存のWebサイトからXDプロジェクトに色、フォント情報、画像情報を一覧化してくれるプラグインです。
とか
VizzyCharts
csvファイルから数値を読み込んで、折れ線グラフ、円グラフ、棒グラフの3パターンが作成できます。
が社内デザインチームで色めき立っていました。
つっつきボイス:「VizzyChartsはCSSから値を読み込んでグラフを生成…ってExcelでできるのでは」「」「まあそれをXDだけでできるのがいいところかも」
「今日お集まりの方の中でAdobe XD使ってる方は…いないっぽい: デザイナーからはどういうフォーマットでデザインを受け取ってます?」「やっぱりXDですね」
「自分たちはZeplin↓使うことが多いかな」
- サイト: Zeplin
「うちはFigma↓ですね」「これ知らなかった」「オンラインではよさそう」「これはXDで作ってFigmaにアップするんでしょうか?」「いえ、Figmaのデスクトップアプリがあるのでそこで作ってそのままプロトタイピングまでやれます」「へぇ〜」「マイクロインタラクションやイージングとかはそんなに突き詰められないんですけど、オンラインで同期書き込みできるので同じものを複数人で見ながら操作したりできるのがいいですね」「Zeplinもそれができるのがありがたいです」「Googleスプレッドシートみたい」
「少し変わった使い方としては、スクラムのカンバンをFigmaで作ってそのままFigma上で使ったりしてましたね」「おぉ〜そんな使い方が」「いわゆるカンバン機能みたいにして使うと」「デザインツールというよりコラボレーションツールみたいですね」「まあライフハックというか、draw.ioとかcacco.comみたいな感じで図形を編集しながらオンラインでやりとりできます」「カクー?」「caccoは日本のサービスですね」
「あとはGoogleというかG SuiteのJamboard↓も付箋をいっぱい貼れて便利ですね」
「こういうコラボレーションツールもいろいろあるのでどれを使うか悩ましいですよね」(以下延々)
言語・ツール
新機能あれこれ
つっつきボイス:「今回は細かめの新機能を見繕ってみました」
「gitに入った機能ですか」「あ〜、こうやって文字単位でもdiffを出してくれるのね↓」「RubyMineみたいなIDEにはもうある機能だと思いますけど」「gitでできるとCIでもやれたりするのはよさそう」
「BPS社内SlackでGitHubのコードジャンプに喜びの声が上がってました↑」
#slack 最近のauto formatをdisableする設定 pic.twitter.com/i4nCz0zt9C
— matsubokkuri / Minedia, Inc. CTO (@matsubokkuri) December 3, 2019
「みんなが待ち望んでいた機能」「Slackのオートフォーマット機能のせいでこれまでどんだけ生産性が落ちていたかと」「Slackに何か貼り付けるとおかしなことになったりして、どうやったらこれを殺せるかSlackチャネルで真剣に相談してましたし」
その他
\e[i
がポイント
つっつきボイス:「これも楽しい記事」「ターミナルソフトウェアが制御文字をどのぐらい扱うかという話ですね」「BEL
文字とか、最近だとベルの代わりに画面が一瞬ピカッと光るとかもありますね」
参考: ベル文字 - Wikipedia
「昔々だとLinuxでとても時間のかかるコマンドを実行するときは最後にベルを鳴らしたりしましたね: ベル文字だとPCの基板上にあるスピーカーを直接鳴らすので、たとえばデータセンターでディスプレイを切り替えて作業していてもベルが鳴ってくれるんですよ」「そういえば私もベル鳴らすコマンドを作ってシェルに入れました↓」
# Mac用
afplay /System/Library/Sounds/Glass.aiff
リニエンシー制度
つっつきボイス:「リニエンシー制度はちょっと前から日本にも導入されているらしいんですけど、談合を最初に白状した会社はお目こぼしにすることでいわゆる囚人のジレンマを解決するというものだそうです」「通報にインセンティブを付ける発想ですね」
番外
電池なしで動くものたち
つっつきボイス:「デイリーポータルZのこの記事面白かった!」「機械式計算機の使い方が誰もわからないオーパーツというかロストテクノロジー状態から使い方を模索していくのがサイコーです」「ちょっと長いですけど」「実はマニュアルこっそり持ってたってことは…ないかさすがに」
「こちらの人工ニューロンも電池が要らないデバイスということで」
マイクロチップ型の「人工ニューロン」が世界で初めて誕生(イギリス) https://t.co/6u8c1bvZb2 pic.twitter.com/sWKBNqbEoh
— 科学ニュースメディア@ナゾロジー (@NazologyInfo) December 4, 2019
後編は以上です。おかげさまでつっつき後の親睦会も大勢で盛り上がりました。ありがとうございます!
おたより発掘
pmq20/ruby-packer知らなかった。書き慣れたRubyでサクッとCLIツール作成が捗るかな / 1件のコメント https://t.co/qDNI28FVvI “週刊Railsウォッチ(20191210後編)Ruby 2.7の変更点記事、mrubyで動くmitamae gem、画像系コラボレーションツールほか” (3 users) https://t.co/dF8dLpq8cG
— (@tkmkg8m) December 11, 2019
バックナンバー(2019年度第4四半期)
週刊Railsウォッチ(20191209前編)Pumaのphased-restartとUnicornのgraceful restart、RailsのTZハックが不要になった話ほか
- 20191204後編 Rubyコードをトランスパイルするruby-next、Cloud Run正式リリース、2019年Web年鑑レポート、V言語ほか
- 20191202前編 Rails 6のimplicit_order_columnはカスタマイズ可能、rubocop-rails 2.4.0リリース、Capistrano記事ほか
- 20191119後編 メソッド参照演算子が廃止、GitHub新機能続々、平成Ruby会議、GitHub OAuthバイパスほか
- 20191118前編 ActiveJob引数のログ抑制、RailsガイドProプランお試し、ファイルアップロードのレジュームgemほか
- 20191112後編 invisible gemで可視性を変えずにパッチ当て、スライド:「型なし言語のための型」、自然言語の言語名を推測ほか
- 20191111前編 Active Recordモデルをprivateで封じ込める、心折れないRailsスキーマ管理、Railsセッションをクロスドメイン共有ほか
- 20191106後編 holiday_japan gemで日本の祝日判定、小さい関数が有害になるとき、Gitブランチのファジー検索ほか
- 20191105前編 Rails 6のデフォルト設定解説、DHHも消したいaccepts_nested_attributes_for、スライド『実践Railsアプリケーション設計』ほか
- 20191029後編 Ruby 2.7.0-preview2、tapping_device gemとhumanize gem、平成Ruby会議ほか
- 20191028前編 RailsにSTI用メソッドsti_class_forとpolymorphic_class_forが追加、RuboCopを変更箇所だけにかけるgem、strftime書式生成サイトほか
- 20191021 Rails 6でhas_many関連の修正やSprockets 4.0対応、Shrine 3.0がリリース、Minitestスタイルガイドほか
- 20191015 スライド「Rails Performance issues and Solutions」を見る、dirtyに*_previously_was が追加、Sidekiq 6.0.1ほか
- 20191008後編 Ruby 2.7のInteger#[]でバイナリチェック、rubyzip gemは強力、13KBのJavaScriptゲームほか
- 20191001後編 RedisとRubyをつなぐredis-object gem、Fullstaq Rubyの新バージョン、COUNT(*)とCOUNT(1)の速度ほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp Slackなど)です。