RubyKaigi 2022 に参加してきた

RubyKaigi 2022

抜粋してトークの感想を列挙していく。フル参加していたはずなのに数が少ない理由はあとで述べる……

Ruby meets WebAssembly

今まで、Opal とかを使って Ruby で書いたコードを JavaScript に変換してブラウザ上で動かす、みたいなものは存在したけど、CRuby そのものがブラウザ上で動くという信じられない偉業について、その実現方法を解説してくれた講演だった。初日の最初のトークがこれなの、めっちゃすごいなって思った。後述する Code Puzzle も、この WebAssembly が使われていて、わしにとって今回の RubyKaigi を象徴するトークだった。

Making *MaNy* threads on Ruby

「あっちの言語では出来てることが、なんで Ruby では出来ないんだっけ?」みたいな感じで出来ない理由を列挙していって、それら一つ一つについて解決の糸口を探っていくと、だんだん「なんかできそうな気がしてきた」ってなってくる様子を見て、問題解決かくあるべしという気がしたし、憧れを持った。Ruby のすごいところの1つとして、Ruby ならではの機能とか改善をやりつつ、他言語の利点も強力に吸収していくところがあると思っていて、それが現れてるトークだった。

TRICK 2022 (Returns)

なんというか、言葉にならない感動が得られるコマだった…… やんちゃには芸術はわからぬ、であるにも関わらず、あれほど感動させられてしまう事に驚きを感じた……

Packet analysis with mruby on Wireshark – dRuby as example

Wireshark を Ruby で使いたいけど Lua とかでしか使えないので mruby が使えるようにした。という話なんだけど、やりたいことが明白で、とにかく自分がやるしか実現する方法がないし、やれば実現しそうだしやるしかない、という、営みのお手本みたいなトークで、見習いたいなと思った。

The Better RuboCop World to enjoy Ruby

人間と Ruby と、という感じの、とても考えさせられる良いトークだった。RuboCop がとても便利なツールである反面、人間との関係性を設計した上で使わないと、ある人間の人生にとっての Ruby という存在を歪めかねない一面をもっており、仕事でのことならそれが許されるのだろうか、もっとよく出来ないか、など色々と考えた。

Fast data processing with Ruby and Apache Arrow

普段、仕事で DWH を使っているので、Data Processing を Ruby でやるということに興味はあるものの、使っている DWH が BigQuery なので、Apache Arrow と関わる事がなくて寂しい。BigQuery と Ruby との間で Apache Arrow を使って何か得するような事が見つかったら何かをしたいと常々思っている事を再確認したトークだった。

Cookpad Code Puzzle for RubyKaigi 2022

スポンサーのクックパッドから提供されていた Ruby のパズルが面白すぎた…… RubyKaigi の会期中であるにもかかわらず、トークを聴く集中が途切れて、気がついたらパズルに取り組んでいる自分がいた…… Web Assembly の CRuby がブラウザ上で動いており、その上で課題を解いていくという、この RubyKaigi にピッタリのエンタメだった。

標準では func10 までが出題されており、エクストラステージとして func20 まで出題されていたが、ギリギリ会期中に func20 まで解くことができた。ただ、途中、何問かは出題意図を掴みきれないまま嘘回答で乗り切っており、会期が終わってから他の参加者と相談しながら正規の解き方を探った。でも、それもまた楽しかった。

どういう解き方をしたのか、Gists にまとめてあるので、興味のある人は見てもらったらよい。func10 までは公式の解説がでているけど、func20 までの解説は来週になるらしいので、それまでの間に自力で解きたい人は、ここで読むのをやめて、後日また見に来て欲しい。

# You can call `func1`
p func1(0) #=> 1
p func1(1) #=> 2
p func1(2) #=> 3
# Can you tell how `func1` is defined?
# Hint: def func1(n) = n + ???
# Define `answer1` that works like `func1`
def answer1(n)
n.succ
end
view raw answer01.rb hosted with ❤ by GitHub
# Congrats! You've solved the first puzzle!
# Next, challenge func2!
p func2("Hello") # => ??? (press "Run Ruby" to see output)
p func2("world") # => ???
def answer2(str)
str.upcase
end
view raw answer02.rb hosted with ❤ by GitHub
# Next, challenge func3!
p func3(1)
p func3(2)
p func3(3)
def answer3(n)
n.succ.times.to_a
end
view raw answer03.rb hosted with ❤ by GitHub
# Still want to play?
# You may want to try func4
# This call raises an error!
# Try to find a correct way to call it.
func4{9}
def answer4(&f)
f[] + 42
end
view raw answer04.rb hosted with ❤ by GitHub
p func5(0)
p func5(1)
p func5(2)
p func5(0,2)
def answer5(a, b=1)
a + b
end
# Hint: Check the parameters
view raw answer05.rb hosted with ❤ by GitHub
def answer6(n)
case
when n < 10 then n
else
n2 = eval(n.to_s.chars.join('+'))
n2 < 10 ? eval(n2.to_s.chars.join('+')) : answer6(n2)
end
end
0.upto(1000) do |n|
func, ans = func6(n), answer6(n)
puts "#{func == ans ? 'OK' : '—-NG'} n: #{n}, func: #{func}, ans: #{ans}"
end
view raw answer06.rb hosted with ❤ by GitHub
p func7(0)
p func7(1)
p func7(2)
# Hint: Try to pass non-Integer!
def answer7(n)
n.succ
end
view raw answer07.rb hosted with ❤ by GitHub
# Hint: %b
def answer8(n)
sprintf("%b", n).chars.select{|c| c == '1'}.size
end
1.upto(1000) do |n|
f = func8(n)
a = answer8(n)
p [n, f, a]
end
view raw answer08.rb hosted with ❤ by GitHub
# Can you tell what string is replaced?
# Hint: Pass a spy (or mock) object to func9
class Hoge
def gsub(a, b)
p [a, b]
end
end
def answer9(s)
s.gsub("u-g0t-me", "yikes")
end
((%w[foo bar baz])+[Hoge.new]).each do |c|
res = func9(c)
p [c, res]
end
view raw answer09.rb hosted with ❤ by GitHub
def answer10(reset=false)
if reset
@counter = nil
end
@counter ||= –1
@counter += 1
end
p func10(true)
p answer10(true)
view raw answer10.rb hosted with ❤ by GitHub
def answer11(o)
o.hash
end
view raw answer11.rb hosted with ❤ by GitHub
def answer12(n)
n.
to_s.
chars.
sort.
chunk_while{|i,j| i==j}.
to_a.
map(&:size).
reduce(:*)
end
view raw answer12.rb hosted with ❤ by GitHub
TABLE = Encoding.list.map{|e|e.to_s[0..1]}
def answer13(n)
TABLE[n]
end
view raw answer13.rb hosted with ❤ by GitHub
def answer14(n)
case n.to_s
when '0' then 'Z' # Zero
when '10' then 'T' # Ten
when '1000' then 'T' # Thousand
when /^(2|3)/ then 'T' # Two, Twenty Three, Thirty
when /^(4|5)/ then 'F' # Four, Five, Forty, Fifty
when /^(6|7)/ then 'S' # Six, Seven, Sixty, Seventy
when /^8/ then 'E' # Eight, Eighty
when /^9/ then 'N' # Nine, Ninety
when '11' then 'E' # Eleven
when '12' then 'T' # Twelve
when '13' then 'T' # Thirteen
when '14' then 'F' # Fourteen
when '15' then 'F' # Fifteen
when '16' then 'S' # Sixteen
when '17' then 'S' # Seventeen
when '18' then 'E' # Eighteen
when '19' then 'N' # Nineteen
when /^1/ then 'O' # One
end
end
0.upto(1000) do |i|
f, a = func14(i), answer14(i)
next if f == a
p [i, f, a, f == a]
end
view raw answer14.rb hosted with ❤ by GitHub
TABLE = Object.constants.sort.map{ |s| s[0..1] }
def answer15(n)
TABLE[n]
end
view raw answer15.rb hosted with ❤ by GitHub
def answer16(&f)
return false if f.parameters.empty?
f.call do
true
end
end
view raw answer16.rb hosted with ❤ by GitHub
def answer17(msg)
JS.eval("alert('#{msg}')")
end
view raw answer17.rb hosted with ❤ by GitHub
def answer18(s)
a = s.scan(/\d+/)
b = s.scan(/[^\d]+/)
pair = s.match?(/^\d/) ? [a,b] : [b,a]
pair.reduce(:zip).flatten.compact.map { |s|
case s
when /\d+/
s.to_i
else
s.split(//)
end
}.flatten
end
view raw answer18.rb hosted with ❤ by GitHub
def polandnize(ast)
case ast
in String => s
return s
in ['value', Integer]
return ast
else
# do nothing
end
case ast.children
in [Array, nil, node]
polandnize(node)
in [Integer => n]
['value', n]
in [node1, operator, node2]
[operator.to_s, node1, node2].map { |n| polandnize(n) }
in [next_ast, nil]
polandnize(next_ast)
end
end
def answer19(a)
ast = RubyVM::AbstractSyntaxTree.parse(a.map(&:to_s).join)
polandnize(ast)
end
view raw answer19.rb hosted with ❤ by GitHub
def solve(input)
case input
in ["value", Integer => n]
["value", n]
in [String => op, ["value", Integer => a], ["value", Integer => b]]
solve(["value", eval("#{a} #{op} #{b}")])
in [String => op, Array => a, Array => b]
solve([op, solve(a), solve(b)])
in [String => op, ["value", Integer] => a, Array => b]
solve([op, a, solve(b)])
in [String => op, Array => a, ["value", Integer] => b]
solve([op, solve(a), b])
in [String => op, ["value", Integer] => a, ["value", Integer] => b]
solve([op, solve(a), solve(b)])
end
end
def answer20(input)
solve(input)[1]
end
view raw answer20.rb hosted with ❤ by GitHub

Ruby Music Mixin 2022

RubyKaigi の最終日の夜、ピクシブ社のRuby Music Mixinというイベントに参加させて貰った。結構前から、ライブハウスで色んな音楽を聴くのが好きだったんだけど、ここ2、3年は色々あって遠ざかっており、このイベントで久しぶりに良い気持ちになって嬉しかった。盆踊りサークルモッシュみたいな謎な集団行動が発生する感じ、とても懐かしかったです。

行き帰り

今回、どうやって三重県津市まで行って帰って来るか、非常に悩んだ。というのも、地図を見ていると名古屋の南あたりに、いかにもショートカット出来そうな湾があって、調べてみると実際に伊勢湾フェリーというフェリーが運航されていて、とても楽しそうだったからだ。

伊勢湾フェリーを使うとなると、新幹線を中途半端な駅で降りないといけないし、港まで行く渥美半島の鉄道はすべて各駅停車で大変そうすぎる。伊勢湾フェリーの仕様を見ていると、バイクや車を積むことが出来るとある。わしは原付二種のスクーターを所持しているので、スクーターで行けばスクーターごと向こう岸に渡ることができて便利そう。これは機運なのでは?と思った。

ここまで書いていて、それは嘘だなぁって思う。結局、要するに、面白そうだったので原付二種のスクーターで三重まで行って帰ってきた。詳細は Twitter のハッシュタグにまとまっているので、興味のある人はのぞいてみてほしい。 やんちゃの旅

行きは、9/6 の 13:00 に家を出て、湯河原の Airbnb の宿で一泊。翌朝 9/7 の 07:00 くらいに出発して、19:00 くらいに三重の宿に着いた。帰りは 9/11 の 07:00 くらいに宿を出て、23:45 くらいに家に着いた。いわゆる強行軍というやつだ。

道中、一番辛かったのは一部のバイパス道の途中が自動車専用道路に指定されているせいで、125cc 以下の車両は強制的に下ろされてしまい、信号待ちのキツイ道を延々と走らされるという事に現地で気づいたことだった。イイカンジで流れている道の途中で「ここから先は遠慮してくれるか?」って看板が出て下ろされて、降りたところに「9km先でまた合流させてあげるから頑張ってねw」って看板が出てるのを見たときの感情はしばらくのあいだ忘れられないだろう。

行きはまだしも、帰りを1日でやりきろうとしたのは失敗だった。神奈川に入ってから家までの道中、かなりの疲労感があったし、危険だった。かといって中途半端なところで臨時で宿を取るという決断もできず、最初から富士市とか御殿場市で一泊する予定にすべきだったなという反省がある。

自動 二輪車でフェリーに乗ったのは初めてだったけど、とても楽しかったので、総じて成功ではある。次回、似たようなことをやることになったときには、今回の反省を活かして、イイカンジにやっていきたいと思った。

やんちゃハウス

2017 年から、やんちゃハウスという、RubyKaigi 期間限定のシェアハウスを主催しているんだけど、今回、3年ぶりにやんちゃハウスを実施した。やんちゃハウス2022は色々な事を加味して、3LDKの家をAirbnbで借りて3人でシェアするというスカスカ構成にした。今までのやんちゃハウスでは家にある布団の数だけRubyistを詰め込んでワイワイやる、というスタイルだったので家を借りる費用を頭数で薄めることが出来るメリットがあったが、今回は四泊25,000円くらいになってしまい、下手すると普通のビジネスホテルの方が安かった可能性すらある。

そこまでして、どうしてやんちゃハウスを実施したのかというと、一回中断してしまうと、再開するハードルが上がるだろうから、という理由だった。種火程度でも残っていれば、またあの頃のやんちゃハウスが戻ってくるかもしれないし、あるいは未来の違う形のやんちゃハウスが現れるかもしれない。それらの可能性が潰えないように、こじんまりでも実施したというのが今回のやんちゃハウスだった。

ところで、やんちゃハウス2023について。RubyKaigi 2023 は松本で開催されると予告されたわけだけど、これは 2020 のリベンジであり、やんちゃハウス2020のリベンジでもある。なので2020の時に借りようとしていた家にはオファーを出していて、少しずつ準備は進んでいる。もう次の話が進んでいるんだなぁ。

あと、年内に RubyWorld Conference 2022 というイベントが島根県松江市で行われる事になっていて、こちらで『やんちゃWorldハウス2022』というのをやろうかという話が進んでいる。マジか、という感じ。今後、募集開始するとしても1枠しか残ってないので、もしも強い興味を持っている人がいたら、公募が始まる前にネジ込みに来て欲しい。

まとめ

こころもち
カテゴリー: 未分類 | コメントする

RubyKaigi 2019 へ参加してきた

0 日目

永和システムマネジメントのクルーズに参加した。
ウィスキーをロックで頼んだらコップになみなみとウィスキーを注がれたのが面白かった

1 日目

The Year of Concurrency

matz
このあとのトーク群の予習をするのに良いセッションだった
Ruby 3 が去年より具現化しているということを感じた

Ruby 3 Progress Report

Matz & the Ruby Core Team
前から思ってたけど、記号とか予約語を「地上げする」っていう表現が好き過ぎる

Terminal Editors For Ruby Core Toolchain

@aycabta

irb に multiline editor を入れる話。
この人は、超巨大な yak shaving をコツコツやっている人で、本当に尊敬に値する。
この取り組みはもっと知られるべきだと思う。というか、Ruby 2.7 が出たらみんなが知ることになって、その時のみんなの驚く顔が楽しみというのがある。

Pragmatic Monadic Programing in Ruby

joker1007
Pure な Ruby だけを用いて、Ruby にモナドの機能を顕現させる降霊術を披露していて、控えめに言って黒ミサだった。
Asakusa.rb の隣の席で Joker さんが準備をしているとき、ずっとうんうん唸りながら黒魔術を練っていたのを見ていたけど、どうやら思い描いていたような発表が出来たようで、良かった。

Compiling Ruby to idiomatic code in static languages

聴いてたけどよく分からなかったす

Pattern matching – New feature in Ruby 2.7

パターンマッチ、もっともっと先の話になるかと思っていたら、すぐ目の前まできていて、マジか〜ってなった
case hoge in [_, String => a] end みたいな AS パターンとか、Ruby でこういう風になるとは思ってなかったので意外だった(まだ確定はしてないけど)

Official Party

中洲川端商店街をジャックして酒を飲みまくるという異常な催しだった
食べ物の列が凄くてありつけなかった分、たくさんの酒を飲んだ

2日目

All bugfixes are incompatibilities

様々なパッチをバックポートをし続けるにあたっての判断基準がしっかりあって、安心感がすごかった
途中、わしが報告したバグのチケットのスクショが出てきて、うおっ!ってなった

Better CSV processing with Ruby 2.6

秒速さん、めっちゃ楽しそうだった
CSV には伸びしろが沢山あった(ある)んだな

Ovto: Frontend web framework for Rubyists

流石にちょっと使ってみたくなるくらい凄かった
ちょっとした早押しクイズアプリくらいなら、これで書いても何も問題無いのでは

RubyData Workshop

Red Data Tools の人達がみんな楽しそうで良かった

The fastest way to bootstrap Ruby on Rails

コンテナという概念に縛られず、プロセスを自在に操って管理していくという部分がしっかりしていてすごいなと思った

What is Domain Specific Language?

どのようなメタプロを用いれば、どのような内部 DSL が実現できるか、ということを聞いていた

Lightning Talks

全部面白かったんだけど、The TracePoint Bomb! を見た瞬間に全部吹き飛んでしまって、頭痛くなるまで笑った

コード懇親会

@hanachin_ さん達と一緒に Redmine のソースコードを動かしたり読んだりしていたら、なんかみんなテストが通らないという現象に遭遇して調べていた

3日目

Ruby Committers vs the World

みなさん、今の Ruby より、未来の Ruby に目を向けているなと感じた
識者同士の議論を見ていると、わしには思いも寄らない観点が沢山出てきて勉強になる

Running Ruby On The Apple II

まさか assembly で Ruby(nruby) の実装をやってくるとは思ってなくて、とにかく凄すぎるという感想しか無い
現代までのコンピューターの発展が早すぎて、レガシーなコンピューターは、すぐギャグになってしまう

Play with local vars

滅茶苦茶面白かった
ローカル変数へのバインド方法クイズ、正規表現の名前付きキャプチャを知ってたのに出てこなくて悔しかった
Vim で発表されてたんだけど、めちゃくちゃな速度でライブコーディングしてて、わしもちゃんと開発環境にこだわらないと、いつまで経っても効率が出ないなと思った

The send-pop optimisation

明らかに不要な処理を省いて手数を減らしていく、しかも自動で、という取り組みを、再帰的に発生する yak shaving をこなしながら進めていく偉大な話だった

途中で分からなくなって呟いてたら教えて貰った

def hoge(x)
  x.times do |i|
    return 0
  end
end

p hoge(42) #=> 0

def hoge(x)
  x.times &-> (i) do
    return 0
  end
end

p hoge(42) #=> 42

def hoge(x)
  f = -> (i) do
    return 0
  end

  x.times(&f)
end

p hoge(42) #=> 42

def hoge(x)
  f = Proc.new do |i|
    return 0
  end

  x.times(&f)
end

p hoge(42) #=> 0

lambda と Proc の違い、引数の扱いの違いしか覚えてなかったけど、メソッドを抜けるかどうかというのもあるのか……

Optimization Techniques Used by the Benchmark Winners

とにかく最適化への執着がすごくて、freeze が出来るならしないと気が済まないみたいなのから始まり、しまいには謎の(謎では無いが)数字を使ったコードが出てきて、これで速くなるのは分かるな?って言われても、分かるけど分からなかった……
3日目の最後のセッションだったわけだけど、もうめちゃくちゃ眠くて、意識が飛びそうになるんだけど、数分に一回、衝撃的なスライドが出てきて強制的に覚醒させられる、みたいなのを繰り返して死ぬかと思った。

アフターパーティー

arm TresureData の提供で、良い感じのクラブを貸し切りにして楽しんだ
ウィスキーをロックで頼んだらコップになみなみとウィスキーを注がれたのが面白かった

やんちゃハウス

やんちゃハウスについては思うところがあるので、別のエントリで詳しく書くつもり

まとめ

Ruby 3 が顕現しそうという実感が出てきてワクワクする RubyKaigi だった

カテゴリー: 未分類 | コメントする

RubyKaigi 2018 に参加してきた

なんだ

RubyKaigi 2018 に参加してきた。

毎日飲み歩いたり牛タンを食べたりするためだけに行ったわけではないので、聞いた講演についてのメモを書いておく

1日目

Matz

keynote

ことわざをテーマにして話が進んでいった

「名は体を表す」からの `Object#then` の流れが鉄板すぎて笑ったw

アーロン

Analyzing and Reducing Ruby Memory Usage

アーロンの発表は、いつも自分の仕事の中で見つけた問題点について真面目に計測、調査を行って、根本的な原因までたどり着いてパッチを書くという事をしていて、本当にすごい。尊敬している

自分で書いたパッチと同じ内容が5年前にポストされていたのを見つけて、そちらをマージしたという落ちには笑ったけど、冷静に考えてみると、それはすごい事だぞという感じだった

joker & moris

Hijacking Ruby Syntax in Ruby

息がぴったりの Asakusa.rb の二人の発表を見た

この二人は他の言語にも詳しくて、すぐに「あの言語にあるあれ、Ruby にあれば便利なのにな」とか言って作り始めるし、Ruby の隅から隅まで使って動くところまで実現してしまうのがすごい

この内容でも、まだ中級編らしいので、2019 にどうなってしまうのか、いまから楽しみという感じだ

Piotr さん

TTY – Ruby alchemist’s secret potion

これ、結構すごくて、コマンドラインツールを WEB アプリケーションとかデスクトップアプリケーションみたいなものに見立てて、MVC みたいな考え方をコマンドラインツールに適用したフレームワークを作った、みたいな話だったと記憶してる

バルク転送のプログレスバーを同時に複数本 AA でシェルに表示するデモとか、見応えがあった

そのっつさん

Fast Numerical Computing and Deep Learning in Ruby with Cumo

CUDA を Ruby から使うための Cumo というライブラリを作っている話を聞いた

Numo の 75 倍、速くしましたって言ってて、すごく便利そうだなと思いましたまる

GPU のメモリーを欲しいだけ適宜切り出すための BFC という仕組みを再実装しているとか、そういう話だった気がする。こういう作れば出来そうだったから作ったら出来ましたみたいなやつ、すごい

iwao さん

Exploring Internal Ruby Through C Extensions

Ruby の C Extension を書くためのチュートリアルみたいな内容から、Ruby の内部についての話を聞いた

Ruby の組み込みライブラリとかは良く出来ているので、速度を求めて C 拡張を書いても、大抵太刀打ちできないという話をしていた。振り返ってみると、これが最終日のこくぶんさんの話の落ちの伏線になっていて面白い

LT

だいたい面白かったんだけど、最後に usa さんが赤いツノをつけて出てきて Ruby が毎年死ぬという話をした印象が強烈で、ほぼそれしか覚えてない

2日目

すとうさん

My way with Ruby

すとうさんプロダクトの博覧会という感じの話を聞いていた

必要なものを作り続けていたら、めっちゃたくさんできてた、みたいなの、本当にすごい

すとうさんから生まれる自由ソフトウェアが、確実に社会を豊かにしていて、尊敬する

Kirk さん

It’s Rubies All The Way Down

これ、なんか、ほとんど分からなかった……

ささださん

Guild Prototype

Ruby 3 に提案されている並列処理をサポートする仕組みの話を聞いていた

guild 間のメッセージング、現状の感じだと治安を維持したまま書く自信がない気がする…… 受け取るべきでないものを受け取ったり、してしまいそう……

これで書いたコードをどうやってテストしていけばいいのか、いまいちイメージが湧かなくて困る……

せきさん

extend your own programming language

Ruby で作る Ruby、についての話

この本、一通り写経しただけで、改造とかはしなかったので、わしもなんか変な機能を入れたりして楽しんでみたいなと思った

soutaro さん

Ruby Programming with Type Checking

Steep という型管理のシステムについて

型の scaffold みたいなので型定義をゴソっと作ってくれるんだけど、だいたい any 型な中、`hoge?: boolean` みたいに ? がついてたら boolean をとりあえず候補にしてくれるのがちょっと賢いと思った

udzura さん

コンテナ技術、プロセス制御技術を駆使して、1つのサーバーに何万ものサービスを収容して運用していくための研究についての話を聞いていた

未来のコンピューティング環境について、かなり先を見据えて取り組んでるんだなという感じだった

まめさん

Type Profiler: An analysis to guess type signatures

`1..` みたいな終端を指定しない range を作った話を聞いていた

なるほど、えんどうれすレンジ……

コミッターたち

Ruby Committers vs the World

わいわいしていた。`Object#then` どうなってしまうの……

3日目

Benoit さん

Parallel and Thread-Safe Ruby at High-Speed with TruffleRuby

めっちゃ NES(OptCarrot) を動かしてた

NES が起動してから、数秒間は 10fps くらいしか出てないのに、JIT が効いてくると 200fps くらいまでブーストされて笑った

定数からなる処理をするようなコードがどんどんシンプルになって、最終的に定数になるのがすごかった

ITOYANAGI さん

IRB Reboot: Modernize Implementation and Features

IRB を良くする話を聞いていた

英語の発表だったけど、わしにとっては大変聞き取りやすい英語でよかった(RubyKaigi 2018 で聞いた中で一番聞き取りやすかった)し、導入から本題へのつなぎも最高に面白くて、話すのが異常にうまいなと思った

REPL の中で、文や式が続いてるのか、終わってるのかを判定したり、今、何レベルのネストなのか、というのを知るのは地味に大変というような話だった

ITOYANAGI さんのすごいところは、みんなが「ここのダメな部分は、もう、こういうもんだから仕方ないね」みたいな感じになってるところについて「いやいや、やればいいだけだから」みたいな感じでゴンゴン修正して改良を実現してしまうところで、めっちゃすごいなと思っていつも見てる

こくぶんさん

The Method JIT Compiler for Ruby 2.6

こくぶんさんの JIT への取り組み方、すでに Ruby の中にあるものはあるだけ有効活用しながら、本当にやらないといけないことにだけ注力して結果を出していてすごいなと思う

GC を気にしながら C 実装を追加するより、JIT が効いた Ruby クラスを使う方が速かった、つまり C langage is dead. って落ちは本当に最高だった

Shugo さん

Build your own tools

shugo さんプロダクトの博覧会というような話だった

そして自由ソフトウェア

ようちゃん

How to get the dark power from ISeq

ようちゃんはいつも新しいことにチャレンジしていてすごい

オブジェクトとして組み上げた ISeq を実行するデモ、良く考えるとすごいなと思った

デモが成功した時に最初に拍手したの、わしわし

TRICK

人外魔境という感じの発表会だった

優勝の「予約語だけで書いてエラーにならず、かつなにもしない」みたいな虚無のプログラム、発想がすごすぎて笑った

FINAL とは言ってたけど、もしまたやるなら、エントリーだけでもしたいなという気持ちになった

やんちゃハウス

2017 の広島に引き続き、Airbnb で家を借りて、9 人でシェアして4泊していた。みなさんの予想に反して、毎日 03:00 には就寝していたし、だいたい、全員毎日朝一の講演には間に合っていたようだ

会場からも仙台駅からも遠かったので、居住者以外のお客さんは1名しか来られなかったけど、それはそれでよかったんじゃないかなという気がする

様々な条件が整えば、来年も実施しようかなとは思っているので、気になる人は情報をチェックしてほしい

まとめ

最近 TypeScript を使っていて、型+エディタの機能の良さというのは分かっているつもりだったんだけど、本質的な型の議論について、実のところ全然意味がわかってないんじゃないかと言う気がしているので、ちょっと近いうちに型について語れるくらいになろうという気持ちになった。型について語らないと

カテゴリー: 未分類 | コメントする

ISUCON7 に参加してきた

結論

  • tagomoris さん、joker1007 さんと共に、意気揚々と参加したものの、敗退した
  • モリスさんのレポート -> ISUCON7予選で敗退した – たごもりすメモ
  • joker さんのレポート -> 如何にしてAsakusaから来た面々はISUCON7の予選に敗北したのか – joker1007’s diary
  • yancya がやっていたこと

  • DB のインデックスのチェック
  • 各 SQL の EXPLAIN をチェック
  • MySQL の設定見直し
  • アプリケーション内の N+1 クエリの解消
  • 結局、あんまりコミットできていなくて、N+1 も解消漏れがあったのを最後の方で気づいて着手したものの、書き終わったのは Time up 後だった

    競技中の様子

  • 配られたサーバーへ ssh で接続しに行くときに、全員で一気に繋ぎに行って、何回か認証ミスったら ban されてしまって、めっちゃワタワタしてた。予め GitHub のチーム用リポジトリの Wiki に公開鍵を集めて「最初の接続はシュッとノータイムでやっちゃおうね」って言ってただけに、ここで出鼻をくじかれて手に汗をかき始めた
  • ほぼ初手で「画像を DB に BLOB で入れてんのは無理でしょ」となって、モリスさんが「画像は Nginx でいいかんじに配信するようにするので任せて」といってサッと実現していた(が、この時の作業方法が敗因になるとは、このとき誰も思わなかったのであった)
  • joker さんは「未読管理は RDB じゃなくて Redis でしょうね。任せろ」という感じで未読管理部分の引きはがしをバリバリやっていた
  • わしは一通りインデックスのチェックをしていたけど、結局インデックスが足りなかったのは基本的には2箇所くらいだったので、ぺぺっとインデックスを足したりしていた。そのあと、N+1 クエリを解消する為に「なんでも1SQLでやろうとするマン」をやっていた
  • 敗因

    モリスさんとジョーカーさんの blog の方に詳細に書いてあるけど、アイコンへのリクエストに対して適切に(適切に、とは) 304 を返せなくて回線が詰まってしまったため、ベンチマーカーの負荷レベルが上がりきらなくて、スコアも上がらなかったという事。最終的にスコアは 90,000 〜 110,000 くらいにとどまった

    反省

    手が遅かった

    振り返ってみると、わしがやってたことって遅くとも最初の3〜4時間で終えてないといけないくらいの量だったので、単純に手が遅いなと思った。他のメンバーのコミットで手元の環境が動かなくなってしまったりしてハマったりしてたけど、なんか場がピリピリしてたので気軽に「助けて」と言いづらかったのが結構辛かった

    WEB の事に疎かった

    競技が終わって、他のチームから画像の件について「こういうことだったんだよ」って言われれば「あー」とはなるんだけど、普段、そんなにタイトな WEB サービスを運営していないので、そういうことに自ら気づくという力が本当に無いなと実感した

    やんちゃが足りなかった

    なんかベンチマークを実行するときに「負荷をかけるサーバーを3つの中からいくつでも選択して下さい」って書いてあるのを見て「ということはロードバランサーとかでアクセスするのかな」と思ったんだけど、特に他のメンバーにその話題を振ったりしなかった。なんか忙しそうだったし。結果論でしか無いけど、もしこんな感じの雑談をしていたら「ロードバランサーね、うーん、あー、CDN!?」みたいになったかもしれない

    画像を各サーバーに配るときの話をしていたとき「rsync とかでやるのかな」と思ったんだけど言ってなくて、もし言ってたら「あー、timestamp あー」ってなったかもしれない

    ベンチマークの実行が結構サクサクできて快適だったし、何の用も無いのに適当にバンバン実行して、たまにふざけてサーバーを1つだけ選択してベンチを流してみたりしてみれば良かった。これも結果論だけど、もしも1サーバーだけを対象に実行していたら、画像ファイルが1種類につき1ファイルしかないので、304 をモリモリ返す事が出来て、3台の時よりもスコアが上がったかもしれない。そこで「あー?あー!」って気づけたかもしれなかった

    チームに誘われたとき「普段 Asakusa.rb で一緒だし、慣れたメンバーで作業するのが良いんだよ。だから来て」と言われて参加したのに、実際競技が始まったら、借りてきた猫のようになってしまって「少しでも、わしができる SQL について貢献しよう」みたいな感じで小さくまとまってしまった。6時間経過時点くらいで「ここらで30分くらいビール休憩しようぜー」とか言えれば、何かが変わったかもしれないとか、色々考えてしまう

    思ったことをバンバン口に出していくことが必要だったと、悔やんでも悔やみきれない。これは開発現場に限らず、今までの人生、いろんな局面を振り返ってきて、散々身に染みてきたことのはずだったのに生かせていなくて辛い。「思ったことをバンバン口に出していく」これをさらに心に刻む yancya であった

    しめくくり

    ISUCON 運営の皆様、大変勉強になりました。良い機会をつくって頂き、ありがとうございました

    tagomoris さん、joker1007 さん、大変楽しい会に誘って頂き、ありがとうございました。楽しかったし、勉強になりました

    カテゴリー: 未分類 | コメントする

    大江戸Ruby会議06の早押しクイズのツールを作った

    概要

    大江戸Ruby会議06の「フルタイムコミッター大戦」という企画のために、早押しクイズアプリを作ったという話です。淡々と小学生の日記みたいな感じで綴っていきます

    コードはここにありますので、興味があれば読んでみてください。結構小さく作れました

    経緯

    3/14 の Asakusa.rb のミートアップで、なんかガチャガチャやってる人がいたので、のぞいて見たら、早押しクイズのギミックを作ろうとして苦労してるようでした(コメント欄で Amazon Dash と Action Cable を使って作ろうとしている様子がうかがえる)

    ただ、なんか Dash ボタンは遅延がひどくて(1〜10秒)「こりゃダメだね〜」って感じでした

    スイッチ

    そこで「Dash ボタンもナウいですが、多分、これもまだナウいですね」って感じで、Nintendo Switch を取り出して、まず一時間くらい動作確認をしました

    Nintendo Switch の両側についている着脱可能なコントローラー「Joy-Con」は、それぞれを Bluetooth 接続で PC に Gamepad として接続できるという話を聞いたことがあったので、試してみることにしました

    横にあるペアリングボタンを長押しすると、Mac の bluetooth 管理ウィンドウに Joy-con(R) みたいな名前で出てきたので、あとは「ペアリング」ボタンを押すだけでペアリングできました

    Gamepad API

    Joy-Con を Gamepad として接続できたまでは良いけど、こっから、例えば各ボタンをキーボードのキーに割り当てるアプリとかを使って割り当てた上で、その状態を前提に早押しアプリを作るのは面倒くさそうです

    そこで色々悪あがき的にググって見つけたのが Gamepad APIでした。

    これこそ、まさに「顧客の求めていたもの」という感じの API だと思ったので、早速 Chrome を開いて、コンソールで`navigator.getGamepads()` を叩いてみました。すると、ちゃんと [Gamepad, null, null, null] みたいな Array が返ってきましたので「うおー、すごい。これはいける感」という感じでテンションが上がりました

    requestAnimationFrame で Gamepad API を呼びまくれば、Gamepad として認識してるデバイスのボタンやスティックの状態を取得できるというものなので、Joy-Con に限らず、Gamepad ならなんでも使えます

    誰が作るの

    気がつくと 22:00 を回っていたので「そろそろ帰ります〜」と言って帰ろうとしたんですが、ふと気になって「あの〜、この Joy-Con 使った早押しアプリ、実現できそうなのは分かったけど、誰が作るんですかね」って言ったら「さぁ〜、誰ですかねぇ(チラッチラッ」って感じだったので「あ、はい」という感じでした

    「リポジトリがあるならプッシュしていくんで」って言ったら、秒で「(ガチャガチャガチャ!)作りました!owner にしておきましたよ!」って言われて、すごく早いなと思いました(小並感

    最初の進捗

    帰宅して、早速作り始めましたが、それっぽいものは本当にすぐにできました

    翌日には、ほぼ早押しの形になっているようです

    GitHub ID を入力したらシュッと GitHub アイコンが出てくるようにしたら面白いかなと思って、そういう風にしました

    新たな要件

    他のメンバーと相談していると、ソラシティ(大江戸Ruby会議06の会場)のネットワークの状況があてにならないとのことで、アイコンの取得についてはインターネットを使わなくてもできるようにした方が良さそうということになり、これが最初の issueとなりました

    ローカルの index.html を開いて起動するというコンセプトだったので、色々制約があり、結果的にすごい力技で解決しました

    issue/2

    「ジャストアイディアです」って普通に使ってる人を初めて見て笑いました

    得点の管理は簡単だったのでシュッと出来ました

    音のある世界

    会場のスピーカーにつなぐ事ができそうとのことだったので、SE も追加することにしました

    早速、Garageband を使って適当な SE を作って PR にしてみました

    すると「クイズといえばウルトラクイズですよね〜、ウルトラクイズっぽい音が出たらな〜」みたいなコメントが来て「で〜す〜よ〜ね〜」という感じになりました

    その後の様子です

    結果的には結構近い仕上がりになったと自負しています

    とりあえず、誰かに見せたい

    本番は2日後ですが、当日参加しない人に見せて自慢したくなったので、姫乃たまさんのイベントに行って、そこで飲んでいた人たちに見せびらかそうとしました

    するとどうでしょう。なんと Joy-Con がペアリングできない

    Mac の Bluetooth 管理画面を見ると、大量の Bluetooth デバイスの名前がズラっと並んでいて「あっ、これは多分混線的なやつだ」と思って、ちょっとよけたところでペアリングして、こと無きを得ました

    その場にいた人たちには結構ウケたので、これはいけるぞという気持ちになれました

    そして本番へ

    フルタイムコミッター大戦の直前、嫌な予感がしていた

    しかし尿意が訪れていたので、ピューっとトイレに行ってサッと帰ってきた

    すると、案の定、演台の前でわちゃわちゃしているメンバーたち曰く「ペアリングができない」

    二日前に通った道だわー、かーっ、通ったわー

    慌てず、サッと Mac と Joy-Con を外に持っていって、みんなで一つ一つペアリングして戻ってきました

    そして始まるフルタイムコミッター大戦

    フルタイムコミッター大戦、早押しクイズをやるとしか聞いてなかったけど、どう見ても超次元な早押しクイズになってて死ぬほど楽しかった

    Asakusa.rb

    なんか楽しいイベントがちょくちょく発生して楽しいので、東京の東側の人はもちろん、そうでない人にも、いろんな人に訪れてほしいコミュニティです。Asakusa.rb いいよ Asakusa.rb

    カテゴリー: イベント | コメントする

    Wake on LAN の思い出

    これは、自宅サーバの思い出 Advent Calendar 2016 19 日目の記事

    例によって、使い古した自作デスクトップパソコンに Linux をインストールして、自宅サーバーとして運用していた時期がある

    当時、パソコンは自宅では自作 PC、外では ThinkPad という感じで生活していた

    ThinkPad には PHS を付けて出先でもインターネットに繋がるようにしていたが、出先でも自宅の ADSL 回線と PC を使った作業をしたくなることがあった

    そんな時、役に立ったのは、Wake on LAN という仕組みだった。Wake on LAN は自宅サーバーに SSH で接続して、Wake on LAN スクリプトを実行すると、自宅の LAN 中にマジックパケットがブロードキャストされ、あらかじめ設定を仕込んでおいたデスクトップ PC が起動するというような仕組みだ

    Wake on LAN を知った時はとても感動して、意味もなく出先から何度も起動と終了を繰り返したりしていたものだ

    そして、今思い返すと、出先からデスクトップ PC にリモートデスクトップで接続して、一体どんな作業をしていたのか、全く思い出せない。実は必要なかったのではないか

    という思い出を自宅サーバの思い出 Advent Calendar 2016という企画を見て思い出したが、今の自宅で試してみようとしたところ、「所有パソコンが全て WiFi 接続なので誰も Wake できない」という現実と向き合い、思い出は思い出なんだなという感傷に浸った昨日の誕生日であった

    カテゴリー: パソコン | コメントする

    JAM Akihabara

    この記事はメイド Advent Calendar 2016 の 18 日目の記事です

    実は、わしはメイド喫茶にそんなに詳しくなくて、唯一 JAM Akihabara という店にだけ通っています

    初めて JAM に行ったのはいつだったか、過去の日記を漁っていたら記録が出てきました。ちょうど 12 年前、2004 年 12 月 19 日の 02:30(深夜営業)でした。当時、ThinkPad X31 PHJ を買ったばかりで、意味もなく、外出先でパソコンをいじりたい盛りだったので、ちょうどいいスペースを探していたのでした。そして 12 年経った今も大して変わっておらず、JAM で MacBook Pro をいじっているのでした

    (当時の写真)ThinkPad とリラックマ

    ここから、なぜ 12 年間も JAM に通い続けたのかという理由を延々と書く予定だったんですが、WiFi が使えてパソコンしやすいから、以外の理由があんまり出てこなくて困ってます

    まぁ、メイドが「ニャンコロピー♫(もっと追加注文しろコラ)」みたいな感じで絡んできて作業の邪魔になる、という事が全く無いのがありがたいです。※他のメイド喫茶の悪いイメージを元に書いています

    あ、すごい偶然なんですけど、今日、わしの誕生日です。毎年、みなさまのおかげで生かされております。毎度どうもありがとうございます

    カテゴリー: 未分類 | コメントする

    RubyKaigi 2016 に行ってきたの

    ガーっと RubyKaigi 2016 を振り返っていく

    セッション

    Ruby3 Typing

    「絶対に型を書きたくないでござる」について

    流行に流されず、Ruby らしい型のありかたを模索して、後悔の無いようにしたいという気概を感じた

    dRuby in the last century.

    なんか途中からハンズオンっぽい感じになって、久しぶりに dRuby 触った

    やっぱり dRuby って神がかったソフトウェアだなって再確認した

    Welcome to haconiwa – the (m)Ruby on Container

    英語での発表だったの、凄かった。

    matsumotory さんの事好き過ぎでは

    A proposal of new concurrency model for Ruby 3

    Thread より間違えにくい Guild についての説明

    オブジェクトへのアクセス権をやり取りしながら処理を進めていくみたいなやつ

    Isomorphic web programming in Ruby

    Ruby でサーバーもフロントエンドも書いちゃうぞというやつのライブコーディング

    Vim によるライブコーディング、本当に凄かったので後で聞いてみたら、かなりの練習を要していて、直前まで時間内に収まるように内容を削ったりしていたらしい。

    「電気グルーヴみたいに、ピエール瀧みたいな奴に喋らせれば、ライブコーディング側はコーディングに集中出来るかもね?」って言ったら「じゃあお前がピエール瀧やれ」って言われた

    Unifying Fixnum and Bignum into Integer

    2.4.0-preview1 で試したら、本当に

    1.class #=> Integer

    1.is_a?(Bignum) #=> true

    になってた

    Fearlessly Refactoring Legacy Ruby

    旧実装と新実装の振る舞いを比較しながら、キチンと差異が無いようにリファクタリングしていく術を紹介していて「あっ、あっ」って感じで身が引き締まります感が出た

    How to create bindings 2016

    こちらもライブコーディングという感じに bindings を実際に作ってみて説明するスタイルの講演だった

    「えっ?えっ?」という感じで2行くらいしか書いてない Ruby プログラムが C ライブラリの bindings として動いていて、会場中がザワザワしてた

    Exploring Big Data with rubygems.org Download Data

    BigQuery と聞いて、どんなもんじゃろと思って聴講した

    BigQuery の GitHub open data、そういやそんなのもあったなと思って、打ち上げの LT(後述)のネタに使わせてもらった

    Modern Black Mages Fighting in the Real World

    とにかく、強敵が現れる度に、さらに凶悪な黒魔術を編んでいく活動についての紹介

    「何よりも強い何かが必要」のところでテンションがマックスになったw

    最後には黒魔術を正当化する良い話で締まった

    Optimizing Ruby

    「部分的に 400 倍速くなりました」で、つかみはバッチリ

    ひとまず最適化を施して実行して、最適化が意味なくなるような再定義があったら実行し直せばいいという感じ

    話を聞いていると、まだまだ伸びしろがありそうな気がしてきて、本当に Ruby3×3 に向かっているんだなという感じだった

    Dive into CRuby

    「VC++ 2015 で隠されてしまった構造体、でも必要だから仕方なく機械語を頑張って読んで特定した」的な、昔の鬼女スレの人達みたいな事を言ってて怖かった

    pid2line.rb っていうツールが、なんか凄そうだから凄そうって感じだったけど、後から解説してくれているブログを読んで、多少分かった。

    すでに実行してしまっているプログラムの状態を調べられるとか、夢みたいに便利で凄い

    できごと

    アフターパーティーで LT やった

    応募者多数、会場の撤収時刻厳守、日本語分からない人多数、という状況につき「日本語での LT は後回し&3分間でよろw」という条件になってしまった

    超早回しで発表したものの、何人かは楽しんでくれたみたいなので良かった

    発表資料はこちら

    川の治安問題

    アフターパーティーの後「いつものメンバーで2次会行っても、せっかく京都まで来た甲斐が無いよな」と思って、1度離脱して面白そうな集まりが発生するのを待ってた

    祇園の辺りをパトロールしながら Twitter を見ていたら、面白そうなオーラを放つツイートを発見したのでいt(日記はここで途切れている)

    とにかく酷かった

    ふりかえり

    色んな人と話をしたり、LT 準備を通じてコードやテキストをゴリゴリ書いたり、まぁ充実した5日間だった。

    細かい事だけど、毎晩色んな人と飲み歩くのは良いとして、翌朝以降に誰かと会ったときに「昨晩誰と飲んで何時に帰った」みたいな話ばかりするのは時間がもったいないのでやめたい。だって、カンファレンスのときに毎晩飲み歩くのは当たり前なので「実は風呂入って歯みがきして寝たんですよw」って言ってるようなもんでしょ

    カテゴリー: 未分類 | コメントする

    yancya の糖質制限日記

    この日記は糖質制限 Advent Calendar 2015の18日目の記事です

    最初にしくじった話

    夏頃、思い立って炭水化物を全く取らないってのをやってみた

    どんどん体調が悪くなって、ふらふらして倒れそうになって、命の危険を感じた

    結局このあと、滅茶苦茶暴飲暴食した

    というわけでいきなり無計画に無理な感じではじめると危なそうという事がわかった

    あとから成功した話

    とりあえず、無理なくやるにはどうしたら良いか、かみさんが考えて下記のような運用をしてくれた

    (1)朝食は普通に食べる

    (2)昼食(お弁当)はご飯を半分にする

    (3)夕飯は白米抜き

    これは結構功を奏して、腹回りの脂肪がモリモリ減っていって、11 月の健康診断では腹囲はメタボ域を外れ、BMI も 22 になった

    ただ、これには毎日退勤の後に虎ノ門から秋葉原まで5kmのウォーキングをしていた効果も大きいと思われる

    油断してリバウンドした話

    健康診断が終わった後、調子に乗ってラーメンとかスイーツとか食べまくってしまって今にいたる(3kg 増)

    「食欲の秋」とか言って自制心が無くなると、ろくなことにならない

    まとめ

    警察の指導に従って、極力糖質を抜きつつ、チートデイで対応するというのを一度やってみないと「糖質制限やったことある」とは言えない気がしてきた

    わしのやってたのは糖質制限ではなかったのではないだろうか

    以上

    12 月 18 日

    今日はわしの誕生日なんですが、毎年「ウィッシュリストに入れてるからには読めよ」などと言いながら難しい本を送りつけて下さる方が続出しております。ほんと勘弁して欲しいですね

    カテゴリー: 未分類 | コメントする

    絵本の作者買い

    この記事は、お子さん、どんな本読んでる? Advent Calendar 2015 の 18 日目の記事です

    今年のヒット絵本

    とりあえず、今年のヒット絵本について、紹介しておこうと思います

    『うどんのうーやん』やはりこれですね。chezou さんのどんな子供も好きになる、「うーやん」を広めるたった1つの方法でも紹介されていましたが、本当に頭おかしくて最高の絵本です。

    他にも、おなじ岡田よしたか先生の『ちくわのわーさん』と『こんぶのぶーさん』というシリーズ作品も大変頭がおかしくて最高です

    結局、『うどんのうーやん』が家で大ヒットしてから、本屋に行く度に「あっ、この絵は!」とか「うーやんっぽい!」という事で『わーさん』『ぶーさん』も購入することになったわけです

    さらに、別の出版社の岡田よしたか先生作品『はずかしがりやの バナナくん』という本も、購入しました

    読書家のみなさんなら「作者買い」というのは日常茶飯事かと思いますが、絵本の世界にもそれがあって、それどころか子供は作者名がわからなくても表紙の絵柄で「あれっぽい!」「それっぽい!」という感じで指摘しますので、特に顕著なのではないでしょうか。現に、我が家には現在岡田よしたか先生作品と、せなけいこ先生(『ねないこだれだ』の)作品で溢れています

    そんなこんなで、絵本の頃から「作者買い」をする癖を付けて、この先の豊かな読書ライフに繋げて欲しいなと願うばかりです。以上!

    12 月 18 日

    今日はわしの誕生日なんですが、毎年「ウィッシュリストに入れてるからには読めよ」などと言いながら難しい本を送りつけて下さる方が続出しております。ほんと勘弁して欲しいですね

    カテゴリー: 未分類 | コメントする