YAPC::Okinawaに参加してきた

前夜祭

前夜祭で「綺麗なコードの書き方」についてLTしてきました。

(先週あったLTのイベント(okinawa-nuyaga)で話した内容をブラッシュアップして)
内容はタイトル詐欺で、ちょっと錯乱拡大解釈した、綺麗なコードについての話です。
out.bmp
https://github.com/tompng/executable_image
(perl、配列、リファレンスあたりからあんまり理解してなくて結構苦労した)

本編

sinya8282さんの文脈自由文法の話が楽しみだった&面白かった。
あとは最近気になってるGraphQL、Dan KogaiさんのPerl6の数字の話を聞いたり、勉強会・コミュニティの話聞いたり、 準備片付け、疲れで仮眠など。

GraphQLの話

client側よりの話だった
未来だと思うんだけど、既存のRDBRailsにどう載せるの、ってのが気になってる。
(N+1起きるでしょ、notificationsあたりの実装どうなってるの、繋ぎの別技術がしばらく要るのでは)
apollo serverが何をしてくれるものなのかわかってなかったりあまりついていけなかった。
backendのDB何使ってるんだろ

HTTP2の話(聞けなかった)

HTTP1がHTTP2より速いケース(パケットロス)もあるとか(をTLでちらっと見ただけ)
TCPが賢くないのが悪いような気がした。(だって同じ伝送路だよ、おかしい)
再送がすごく遅れてもいいから帯域ほしい、ってのはTCPのやってくれることとは目的が違うから
TCP以外の別のプロトコルが速いってことかな(TCP複数接続束ねたものを別のプロトコルと見立てたり)
HTTP2 over TCP vs HTTP1 over TCPx10

文法と曖昧さの話

プログラミング言語の曖昧さ
if elsif if else の最後の else はどのifにかかるのか
rubyだと method1 arg1,arg2,method2 do end の `do end ``はどっちにかかるか
ありえる構文木が複数あっても、最初に見つかった方を使うから1つに確定してると思うんだけど
昔それのバグ(ブロックが時々method2にかかる)踏んだりしたから、やっぱりなるべく無曖昧であってほしい。
C言語とか、仕様自体が曖昧(実行順序が未定義)とかなかったっけ?実行順序はまた別かもしれないけど。

無曖昧な言語の組み合わせが何通りあるかの話

s → ε | (s)s な書き換えでできる言語の例だと(= ((()()))() みたいな括弧が対応してるもの)
プログラム的には
組み合わせ(n文字) = Σ 組み合わせ(i文字) * 組み合わせ(n-2-i文字)
みたいに再帰的に計算したくなるけど、
S(z) = 1 + z*S(z)*z*S(z) # S(z)は母関数 組み合わせを係数にもつ多項式
でできるぽい。いきなりεを1に、|を+に置き換え出した時は頭の中に?が沢山並んだ。
(多項式の積を展開する部分がΣに、z*z(係数を2つずらす)が(n-2-i)の2つずらしに、1が再帰の終了条件に対応してそう)
表現が違うだけだけど四則演算が便利に使えてすごい(小並感 数学忘れてる感)
これが何にどう使えるのかあたりの話はよくわからなかった。

memo=[];
count = -> n {
  memo[n] ||= n.odd? ? 0 : n.zero? ? 1 : 0.step(n-2,2).sum{|i|count[i]*count[n-2-i]}
}

数値の話

1.2345 で書いた数値が全部floatじゃなくrationalになるのは、一見便利そうだけどあんまりメリットないよなー、とか
log(2)とかも全部floatじゃなくlogに2を渡したものとして内部で表現してたら面白いなーって話を他の参加者としたりした。

> 1/3 == Num(1/3)
True
> 1/3 == 0.3333333...(数十個)
False

がTrueにならなくて不思議だったけど(限界超えたらfloatになるんじゃないの?と)

0.33333333333333333333  #=> 0.33333333333333333333
0.333333333333333333333 #=> 0.33333333333333330372739
# (1行目より2行めの方が小さくなったように見えるけど<比較すると大小関係正しいので表示上の問題?)
(0.33333333333333333333).WHAT #=> (Rat)
(0.33333333333333333333*1).WHAT #=> (Num)
0.333333333333333*3 #=> 0.999999999999999 (Rat)
0.3333333333333333*3 #=> 1 (Rat) 正確な値じゃなくなった

なるほど?
大小関係逆転するのも見つけた。

my $a = 0.33333333333333333333333;
my $b = 0.333333333333333333333333;
say($a > $b) #=> True
(1/2**62/2).WHAT #=> (Rat)
(1/2**62/4).WHAT #=> (Num)

分母は64bitまで

ボランティアスタッフ

してきました。他イベントも含めボランティアスタッフをすること自体初めてで、かなり疲れた(今週体調よくなかったのが主因だけど)
ボランティアスタッフではないけど早めに会場に着いて手伝う、みたいな手軽なボランティアなら今後もやれそう(だけどそれじゃ回せないだろうからなー)

コアスタッフの皆さんありがとうございました。

来週は

沖縄Ruby会議02があるのでぜひ http://ruby.okinawa/okrk02/