Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

週刊Railsウォッチ(20191210後編)Ruby 2.7の変更点記事、mrubyで動くmitamae、画像系コラボレーションツールほか

こんにちは、hachi8833です。もういくつ寝るとRuby 2.7が出るんでしょうか。

  • 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
  • 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
  • 毎月第一木曜日に「公開つっつき会」を開催しています: お気軽にご応募ください

今回も週刊Railsウォッチ第17回公開つっつき会を元にお送りいたします。お集まりいただいた多くの皆さま、ありがとうございました!😂🙇

Ruby

Ruby 2.7の変更点などなど


つっつきボイス:「ツイートの記事は、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.7: ハッシュからキーワード引数への自動変換が非推奨に(翻訳)

「Ruby 2.6で非推奨になっていた例のフリップフロップ..が実は2.6.4で復活していた!?」「え😅」「なくてもいいかもと言われていたフリップフロップ」「フリップフロップ全然使ってないしな〜解説無理😆」「どうやら意外に使われていたらしき☺️」

# 同記事より
10.times{|i| print i if (i==3)..(i==6)}
#=> "3456"

参考: Rubyのフリップフロップ - monamonamonad.github.io

Ruby: これはなくてもいいかも?と思う10の機能(翻訳)

「パイプライン演算子|>とメソッド参照演算子.:は既報通り2.7には入らないことになりましたね」「少なくとも2.7には入らないけど議論が進めば入るかも?🤔」


「あと以下のお片付けならぬお型付けアドベントが気になりました😆」「まだそんなに埋まってないかな😆」(注: その後エントリ増えてました😋)


「あとこちらもRuby 2.7や3の新機能がらみの記事です↓」「RubyConf 2019のMatzキーノートのまとめですね😋」

なおこの記事では以下のRubyパターンマッチング記事をおすすめしていました↓。また「MatzによるとRubyのパターンマッチングは遅いのでパフォーマンスに注意して賢く使いましょう」という記述がありました。

参考: Introduction to Pattern Matching in Ruby | Toptal


toptal.comより

Ruby 2.7のEnumerator#produceRuby 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? }
# => #

つっつきボイス:「ruby-jp Slackで2.7のproduceが盛り上がってました」「フィボナッチやってる😆」「もしかするとElixirあたりにも同じ名前のメソッドあったりするかな?関数型言語あたりで見たことあるような気がする🤔」「injectを別の方法でやってる感」「今日は残念ながら出席できなかったkazzさんにproduce見せたらかなり面白がってました😋」「うまく書ければはまりそう😋」

参考: instance method Enumerable#inject` (Ruby 2.6.0 リファレンスマニュアル)

後で2.7.0-preview3でproduceinjectをちょっと動かしてみました。

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]

Ruby: `each`よりも`map`などのコレクションを積極的に使おう(社内勉強会)


追いかけボイス: 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 - Wikipedia


busybox.netより

「gccすら入れられないような組み込み環境なんかでもBusyBoxさえ持ち込めば何とかなったりしますし、対応しているCPUアーキテクチャもやたら多くて、なかなか楽しい十徳ナイフ的なツールです🥰」


はみだし:「もともと以下の記事↓で紹介したdipというツールがRubyなしでも動くシングルバイナリも提供されていて、どうやってそのシングルバイナリをビルドしているのか知りたくて追っているうちにruby-packerを見つけました: ただdipではruby-packerを使っているのかどうかよくわからなくて😅」「dipのリポジトリを今ざざっと見た限りではわかんないですね〜😆」

docker-composeを便利にするツール「dip」を使ってみた

追記(2019/12/11)

情報ありがとうございます😂!TravisCIでruby-packerによるビルドをやってるようですね。

その他Ruby


同リポジトリより


つっつきボイス:「お、Faradayってず〜っとバージョンが0.いくつのままでしたね😆」「一度バージョンが1.0になった後戻ったような覚えありますけどっ😆」「Ruby 2.7に対応したら1.0にするということのようです」「ま自分はHTTPClient派ですけど🤣」「そういえばウォッチでも話題になりましたね(ウォッチ20180615)」

「Faradayってクローラーとか作るときに使うんでしたっけ?」「クローラーも作れると思いますけど、もっとリッチなことができます☺️」「Faradayはミドルウェアが使えますね↓」「そういえばあったわFaradayのミドルウェア」

「Faradayは直接使うより他のgemのdependencyで引っかかる印象があるんですよ: こっちのライブラリとあっちのライブラリがそれぞれFaradayの違うバージョンに依存してたりとか😭」「あぁ〜😳」

DB

PostgreSQLカンファレンス2019まとめ


postgresql.jpより


つっつきボイス:「そうだぽすぐれカンファレンスやってた!」「Togetterでセッションごとにまとめてくれているので見やすそう😋」「PostgreSQLカンファレンスは大規模ですよね: 特に Project Tsurugi(劔)の話↓とか」「つるぎ?」「これを主催している神林さんは日本のPostgreSQL界隈ではめちゃ強い人💪で、たしか未踏プロジェクトにも出てたと思います」「おぉ」「何度か会ったことありますけど、PostgreSQLをL1キャッシュレベルで高速化するような人でした😆」「つぇ〜🤩」

クラウド/コンテナ/インフラ/Linux/Serverless

今年のre:Invent


reinvent.awseventsjapan.comより


つっつきボイス:「re:inventちょうど今やってますね〜(注: つっつき中)」「やってるやってる〜😋」「既にいくつか記事も出てるので少し貼ってみました↓」「re:inventは自分もまだ追いかけられていませんが、重要なイベントなので後でキャッチアップして社内でre:inventサーベイするつもりです❤️: EC2 Image Builder↓もよさそうですし」

「CodeGuru↓とか興味ある😋」「自動でコードレビューするやつでしたっけ」「でもお高い〜💸100行あたり0.75ドルだから、Railsのコードをうっかりかけたら死にそう😆」「死ねる😇」「インデント直すとかでも1000行で7.5ドルか〜😅」「よさそうだけどCodeGuru破産コワいし、今ならCodeClimateみたいな他のサービスの方がコストが安定しそうではありますね☺️」

Buildpacksとは


つっつきボイス:「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ですね☺️」


adobe.comより

「自分たちはZeplin↓使うことが多いかな」


zeplin.ioより

「うちはFigma↓ですね」「これ知らなかった😳」「オンラインではよさそう😋」「これはXDで作ってFigmaにアップするんでしょうか?」「いえ、Figmaのデスクトップアプリがあるのでそこで作ってそのままプロトタイピングまでやれます」「へぇ〜」「マイクロインタラクションイージングとかはそんなに突き詰められないんですけど、オンラインで同期書き込みできるので同じものを複数人で見ながら操作したりできるのがいいですね😋」「Zeplinもそれができるのがありがたいです🙏」「Googleスプレッドシートみたい」


figma.comより

「少し変わった使い方としては、スクラムのカンバンをFigmaで作ってそのままFigma上で使ったりしてましたね」「おぉ〜そんな使い方が😳」「いわゆるカンバン機能みたいにして使うと😆」「デザインツールというよりコラボレーションツールみたいですね😋」「まあライフハックというか、draw.ioとかcacco.comみたいな感じで図形を編集しながらオンラインでやりとりできます😋」「カクー?」「caccoは日本のサービスですね」


cacoo.comより

「あとはGoogleというかG SuiteのJamboard↓も付箋をいっぱい貼れて便利ですね😋」


gsuite.google.comより

「こういうコラボレーションツールもいろいろあるのでどれを使うか悩ましいですよね😄」(以下延々)

言語・ツール

新機能あれこれ

つっつきボイス:「今回は細かめの新機能を見繕ってみました😋」

「gitに入った機能ですか」「あ〜、こうやって文字単位でもdiffを出してくれるのね↓」「RubyMineみたいなIDEにはもうある機能だと思いますけど😆」「gitでできるとCIでもやれたりするのはよさそう😋」


同記事より


「BPS社内SlackでGitHubのコードジャンプに喜びの声が上がってました↑」


「みんなが待ち望んでいた機能🎉」「Slackのオートフォーマット機能のせいでこれまでどんだけ生産性が落ちていたかと😆」「Slackに何か貼り付けるとおかしなことになったりして、どうやったらこれを殺せるかSlackチャネルで真剣に相談してましたし😆」

その他

\e[iがポイント


つっつきボイス:「これも楽しい記事😋」「ターミナルソフトウェアが制御文字をどのぐらい扱うかという話ですね☺️」「BEL文字とか🛎、最近だとベルの代わりに画面が一瞬ピカッと光るとかもありますね⚡️」

参考: ベル文字 - Wikipedia

「昔々だとLinuxでとても時間のかかるコマンドを実行するときは最後にベルを鳴らしたりしましたね😆: ベル文字だとPCの基板上にあるスピーカーを直接鳴らすので、たとえばデータセンターでディスプレイを切り替えて作業していてもベルが鳴ってくれるんですよ🛎」「そういえば私もベル鳴らすコマンドを作ってシェルに入れました↓😆」

# Mac用
afplay /System/Library/Sounds/Glass.aiff

リニエンシー制度


つっつきボイス:「リニエンシー制度はちょっと前から日本にも導入されているらしいんですけど、談合を最初に白状した会社はお目こぼしにすることでいわゆる囚人のジレンマを解決するというものだそうです」「通報にインセンティブを付ける発想ですね☺️」

参考: 囚人のジレンマ - Wikipedia

番外

電池なしで動くものたち


つっつきボイス:「デイリーポータルZのこの記事面白かった!😋」「機械式計算機の使い方が誰もわからないオーパーツというかロストテクノロジー状態から使い方を模索していくのがサイコーです😆」「ちょっと長いですけど😆」「実はマニュアルこっそり持ってたってことは…ないかさすがに😆」


「こちらの人工ニューロンも電池が要らないデバイスということで🔋」


後編は以上です。おかげさまでつっつき後の親睦会も大勢で盛り上がりました🍻。ありがとうございます!

おたより発掘

バックナンバー(2019年度第4四半期)

週刊Railsウォッチ(20191209前編)Pumaのphased-restartとUnicornのgraceful restart、RailsのTZハックが不要になった話ほか

今週の主なニュースソース

ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp Slackなど)です。

Ruby Weekly


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。