YAPC::Tokyo 2019 に行ってきました!
ks-yuzu です. 大阪でのスタッフ参加, 福岡での一般参加に引き続き, 3 回目の YAPC 参加でした.
今回も福岡の時同様, 学生交通費支援制度を利用させて頂きました. 学生交通費支援スポンサー様, ありがとうございました!
どのトークも面白いものばかりで, やっぱり YAPC は良いですね! 次回は未定とされているものの, 懇親会で○○でやるという話も出たようで, ぜひ参加したいところですね!
今回もトークのメモを (スライドが見つかったものはその URL も) 備忘録として, 以下に残しておきます.
11:20 ~ 12:00 2019年冬のPerl (hall) - charsbar
https://speakerdeck.com/charsbar/perl-2019-winter
5.28
- 異なる種類のハンドルはエラーに
- ヒアドキュメントの終端の省略は不可
- 文字列用のビット演算子 (&.)
- perl -i がより安全に
- ファイルが壊れにくく
- ファイルディスクリプトタ枯渇問題
- 正規表現中の { の扱い
- 一部, エラーから deprecated に差し戻し
- サブルーチンシグネチャの再修正
- sub f :lcalue ($a, $b) { ... } に戻る
- mst さんによる Babble (App::sigfix) という切り替えモジュール
- PPR を利用
- .pmc による新旧両対応 (filter::util::call で差し替える)
- セキュリティフィックス
5.30 (変更点少ない)
- パフォーマンス
- Unicode 11
- /.{m,n}/ の n が 倍増
- UTF8 の API がいくつか廃止
- セキュリティフィックス
- エラーになるもの
- 正規表現中の一部の { (混乱を避けるためにほとんどはそのまま)
- grapheme 以外のデリミタ
- $*, $#
- $[ (配列のインデックス最小値) の非ゼロ指定
- my $foo if 0; (state 変数の代用)
- :utf8 ハンドルに対する sysread/syswrite
- File::Glob::glob
- dump -> Core::Dump
OSX Mojave 問題
@INC から . を外した件
- RT に登録されているチケット 500 件中 300 件残っている
明るい話
Perl6
Perl 6.d リリース
Squashathon
- オンラインで集まってバグ修正するハッカソン
Perl 6 performance analysis tooling
- プロファイラを改善して見やすく
nqp::fork (Not Quite Perl)
- スレッドメインなので, fork はなかった
Rakudo.js
- master にマージ
- 主戦場は node からブラウザに
- 6pad (ブラウザで Perl 6)
- 公式ドキュメントの説明もこれになる...?
p6env
- コアなハッカー以外は Rakudo Star?
- でも良さそう
Comma IDE
App::Perl6LangServer
- Comma IDE がまだ有料なのでこっち試すのもあり
2019年 の予定
- MoreVM 最適化
- 高速化
- 並行・並列処理をより安全に
- Cro
Larning Perl 6
- 2018-08 に無事出版
2019 の Perl イベント
11:20 ~ 11:40 チームが前に進み続けるために僕たちが考えたこと - papix
https://speakerdeck.com/papix/yapc-tokyo-2019
12:10 ~ 12:50 Perl to Go - xaicron
Go で Web アプリケーションを書く流れをざっくり掴む
なぜ Go か
Web サーバとしてみた Go
コマンドラインツールとしてみた Go
Perl Monger が Golang を始めようとした時にハマったところ
- CPAN がない
$GOPATH から逃れられない
- 開発はこの下で
- あらゆるライブラリが $GOPATH の下に置かれる前提
- 1.8 では $HOME/fo がデフォルト
- 1.12 では go mod で変わるかも?
ライブラリの管理方法がむずかしい (二転三転)
- Go のモジュールはバージョニング全然されてない
- go get は master 取ってくるだけ
- タグ切ってるものほとんどない
- go mod で, semver を使うようになるので...
Web アプリケーションを書くときのライブラリの管理
- いろいろ変わってきた → go mod が core に入ったのでこれに?
オーサリングツールがない
- go xxx か Makefile でかんばる
- Minilla とか ExtUtils::MakeMaker 的なものがない → そのうち...?
Go と Perl の言語仕様の相違点
変数と型
- 変数は camelCase
- 型あり, 別の型には代入できない
- 配列 (固定長) とスライス (可変長) → スライスを使っておくと良い
- 文字列は UTF-8
- struct があるので map (hash)
関数
- func(args) ret { ... }
- PascalCase で public
- camelCase で privaate
- 可変長引数 ok
- 複数の値を返せる
- 関数は変数に代入可能
- 関数を引数や戻り値にする時はシグネチャを書く必要あり
エラーハンドリング
defer
- defer func() で現在の関数から抜ける時に func() を実行する
- Scope::Guard に似ている
- dismiss できない
- 関数を抜けた時のみ
- if や for の中で defer した時の挙動に注意 (関数を抜けた時?)
- エラーを返すやつを defer する時は無名関数でエラー処理するやつを渡す
goroutine
- go func() するだけで別スレッド処理できる
- goroutine 同士は channel でやりとり
- AnyEvent, Coro と同じようなかんじ
context.Context
- 一連の処理の中で任意のデータを入れて引き回す, キャンセル処理を波及させる等
- Amon2, Catalyst 等の $c 的な
- core
package
制御構文
- if, for は括弧なし
- 条件演算子なし
- for each → range
- switch あり, break 不要
Struct
- メソッド生やせる
interface
- 満たすべき関数の定義
formatter, linter が良い
Web API
- net/http でクライアント/サーバ両方
- goroutine 勝手にしてくれる
- http2
middleware (Plack 的な)
14:00 ~ 14:40 Perl5の静的解析入門 機械と人間双方の歩み寄りによる平和編 (room1) - macopy
https://speakerdeck.com/mackee/the-static-analysis-of-perl5
- 方法1: 正規表現
方法2: 途中まで perl に任せて AST を利用する
- perl では AST 抽出は難しい
- go/parser, RubyVM::AST 等は本物の処理系が parse してくれる
実行できる状態 (オペコード) に近づく程, ソースコード上の情報は抜け落ちていく
トークン位置
- 変数の宣言位置がわかるetc
実行時に型バリデーションする場合, 実行するまで成功するかわからない
- テストパターンをしっかりと用意しないといけない
機械の力を借りて間違いのないコードを書く
Compiler::Lexer
- XS で書かれたトーカナイザ
- AST ではなくトークン列
Perl::Lexer
PPR (Pattern-based Perl Recognizer)
(例) プライベートメソッドじゃなかったらバリデーションしてるかどうか
人間側の歩み寄りも必要
- 1 つの記号が複数の意味を持つ場合がややこしい
greppability
- 狙ったコードを grep できるか
- メソッド名を動的に組み立てている
- このメソッドどこで使っているかがわかるように
イミュータブル変数等のモダン言語の機能/制約を導入
機械にも人間にも優しいコードは Perl のサブセットになる
ハウスルール
- こういう書き方はうちでは驚きがいっぱいだから変えたほうが...
- PPR でチェックできる
14:50 ~ 15:10 PerlプログラムでPerlプログラムを修正する方法 - Kang-min Liu @gugod
https://hackmd.io/p/HJR2jzJ-N#/
LINE Fukuoka でサーバサイド
Perl::Critic
- Perl のコードを評価する
- ProhibitStringyEval (https://metacpan.org/pod/Perl::Critic::Policy::BuiltinFunctions::ProhibitStringyEval)
- ProhibitConditionalDeclarations (https://metacpan.org/pod/Perl::Critic::Policy::Variables::ProhibitConditionalDeclarations)
- Perl::Critic::TooMuchCode (https://metacpan.org/pod/Perl::Critic::TooMuchCode)
- dead code (未使用の定数, 関数, インポート, ハッシュキー/値, 多重定義の関数) チェック
perlcritic + reviewdog
- CI でコードレビュー
- docker image あり
p5-nitpick ("小さいゴミを取り除く" の意)
- https://github.com/gugod/p5-nitpick
- 未使用の変数等を自動等
GUEST: 広木 大地
https://speakerdeck.com/hirokidaichi/2tufalsedxtoji-shu-de-fu-zhai-yapc-tokyo-2019
- (途中から)
組織構造とソフトウェア
よくすることができる = 交換可能
選択肢を持つ側が強い, 持たない側が弱い
- 恋愛
- その人に属人化した組織からの給与
システムのコントローラビリティレベル
技術的負債の最たる例は, システムのコントロール性の喪失 (ホールドアップ)
- 下請けにホールドアップされるとかよくある?
- 技術的負債による損失は兆円単位にも
「技術的負債」と言う原因
- 見えないことが原因
- 高価な自転車のタイヤ交換が高くてもわかるけど, もらった自転車の場合ばびっくりする
- 医者が「死にそう」って言えば信じる
- エンジニア言ったことを信じてもらえなかった → 非対称性
- 非機能要件として比べられる価値になっていれば問題なかった?
専門家とイノベーションのつまみ
- 発展すると職能型になる
- コンピテンシートラップ
DX
15:40 ~ 16:20 Perlでも分散トレーシングしたい! - AWS::XRayによる解析とその実装 - fujiwara
https://speakerdeck.com/fujiwara3/yapc-tokyo-2019
分散トレーシング
Google の Dapper 論文 (2010)
- 分散システム (1 リクエストにいくつものサブシステムが RPC する場合, 今でいうマイクロサービス)
- 分散トレーシングで可視化
Trace: 複数の Span を含む 有向非巡回グラフ
- Span: 名前, 開始時刻, 終了時刻, コンテキスト(ID, 親, etc.), タグ, ログ
分散トレーシングの実装/仕様
どうやってトレースするか (2通り)
- アプリケーションに手を入れてデータを取る
- 言語に依存
- アプリケーションの内部の挙動もトレースできる
- サービスメッシュ: サービスメッシュのデータブレーンを経由する
- 言語に非依存
- アプリケーションの内部の挙動はトレースできない
- アプリケーションに手を入れてデータを取る
AWS X-Ray
AWS の分散トレーシングのマネージドサービス
マネージドサービスなのでトレースを送るだけ
- deamon が UDP :2000 を listen してるのでデータを投げるだけ
30 日保存, 重量課金
UDP なので...
- トレースするためにアプリケーションが遅くならない
- daemon が落ちていても影響しない
Perl で X-Ray
- Perl 用の SDK はない
- API を叩くモジュールはある Paws::?
- AWS::XRay (JSON を UDP で投げるだけ)
- capture $name, sub { トレースするコード }
- ネストすると親子関係にできる
- Plack::Middleware::XRay
- 起動時にトレースを開始してくれる
- トレースを仕込むのめんどくさい
- Devel::KTYProf がある
- use するだけで DB とか LWP のログを出してくれる
- ロガー差し替えできる
- logger("Devel::KYTProf::Logger::XRay") で自動 capture
- Devel::KTYProf がある
X-Ray による ASUCON8 本線問題の解析例
本線問題
手順
プロセスをまたいだ追跡の仕組み
AWS::X-Ray の内部実装
- トレースしたいところで現在の Root, Parent が必要
- Model に引数としてセグメントを渡さなくて良い
Perl の魔法のひとつ local (perldoc -f local)
- ダイナミックスコープ (呼出し元でスコープが決まる)
- 親子関係のセグメントの表現に都合が良い
- そのブロックから呼出されている間だけ変数の値を変更
- 例外でも何でも抜けたら復元される
Trace-ID, Segment-ID を local で保持
コストの話
- 直接コスト: 課金額
- 100万トレース: 5ドル
- 100req/sec → 1296 USD
- 1秒毎に最初のリクエストと, それ移行の 5% のみをトレース
間接コスト: アプリケーションのパフォーマンス劣化
ほぼパフォーマンス劣化しない
- 1 トレース 2ms (トレースを送信しないなら 0.1ms)
まとめ
16:30 ~ 16:50 ISUCON8予選問題作成の裏側 - karupanerura
karupanerura さんによる ISUCON8 の...
普通の工夫をしたら勝てるように
目的を阻害する行為を出来なくする
技術的アプローチをなるべく制約しない
- 金で解決させない (外部リソース NG)
製品で使えないようなアプローチを (なるべく) 使わせない
- 再起動試験 etc.
スコア化の難しさ
- 優れたものとそうでないものの差をつける (難易度, スコア計算, 負荷のかけ方)
レベルの調整機構
本線ではシェア機能 (by @fujiwara) が導入された
ちゃんと完成させる
- 趣味時間だけだと無理
- マイルストーン (テストプレイ, 合宿)
- 雑に集まれる場を用意する
楽しい問題にするために
解ける問題にするために
- 実際に解く (上記 URL 参照)
- etc
言語移植
- shell
- フロントに良せる
- etc
16:50 ~ 17:10 多くのCPAN Authorに育てられ、息をするようにCPANモジュールを書けるようになり、そして分かったこと - Songmu
http://songmu.github.io/slides/yapc-tokyo-2019/#0
以下, PC のバッテリーの都合でメモありません (充電部屋ほしかった...)
(番外編) ノベルティ
- トートバッグを支える技術: https://job-draft.jp/articles/332