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 で差し替える)
  • セキュリティフィックス
    • CPAN モジュールのセキュリティ問題は CPAN::Audit で

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 問題

  • ExtUtils::MakeMaker 等に Apple 独自のバッチ
    • CPAN から入れるとパスが...
    • plenv で入れてもパッチ当てないと...
    • system perl は使わない方が良さげ
  • CPAN の指標も着実に悪化中

@INC から . を外した件

  • RT に登録されているチケット 500 件中 300 件残っている

明るい話

  • grep.cpanauthors ...
  • Mojolicious 8
    • Mojo::URL のパラメータ合成に非互換あり
    • AdC あり
    • Mojo::AsyncAwait
    • OpenAPI 3.0 (実験的)
  • JSON::XS 4.0
    • allow_nonref がデフォルトで有効に
    • AdC に記事あり
    • JSON/JSON::PP も追随
    • boolean_values (Data::MessagePack 等の対応に期待)
  • PerlLanguageServer
    • CPAN 版がクラッシュするので GitHub 版を

Perl6

  • Perl 6.d リリース

    • 3 年振りのメジャーバージョンアップ
    • d = Diwali (ヒンドゥー教の祭?)
    • Rakudo 2018-11 版から
    • 変更点はあまり多くない (6.c に入っているため)
    • await をがスレッドをブロックしない
    • 廃止になった機能もいくつか
    • use v6.c
      • (Perl 5) と違って "以上" ではなく "固定"
      • 1 文目に書く
  • "Perl 6" って名前はどうなのか → Raku Perl 6 って書いてるけど...

  • Squashathon

  • Perl 6 performance analysis tooling

    • プロファイラを改善して見やすく
  • nqp::fork (Not Quite Perl)

  • Rakudo.js

    • master にマージ
    • 主戦場は node からブラウザに
    • 6pad (ブラウザで Perl 6)
      • 公式ドキュメントの説明もこれになる...?
  • p6env

    • コアなハッカー以外は Rakudo Star?
    • でも良さそう
  • Comma IDE

    • Perl 6 の IDE
    • 将来的に無料版も?
  • App::Perl6LangServer

    • Comma IDE がまだ有料なのでこっち試すのもあり
  • 2019年 の予定

    • MoreVM 最適化
    • 高速化
    • 並行・並列処理をより安全に
    • Cro
  • Larning Perl 6

    • 2018-08 に無事出版
  • 2019 の Perl イベント

    • German Perl Workshop - 3/6-8 (ドイツ)
    • Perl Toolchain Summit - 4 月
    • Perl Conferrence 2019 (USA)
    • PerlCon 2019 (ラトビア)

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

    • オンプレ → クラウド
    • クラウド上でもコンテナ上で動かすのは当然になってきている
    • 低スペマシンを並べる構成 → 高速に動く言語が良い
    • コンテナサイズは小さい方が起動が速い → ランタイムが不要 (バイナリ) の方が好ましい
    • 高速, 省メモリ
    • goroutine
  • コマンドラインツールとしてみた Go

Perl Monger が Golang を始めようとした時にハマったところ

  • CPAN がない
    • エコシステムは GitHub
    • CPAN Ruby gems や npm のような中央集権的サーバがない
    • ソムリエ的な人が会社に必要
    • modules2019
    • 将来的に Module Indexer を作る予定
    • CPAN Testers 的なものもできそう
    • ライブラリの DL は mirror も作成予定 (Go 1.13 でコアに)
  • $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
    • 複数の値を返せる
    • 関数は変数に代入可能
    • 関数を引数や戻り値にする時はシグネチャを書く必要あり
  • エラーハンドリング

    • 例外機構がない
      • panic() → recover()
      • panic は推奨されない (プロセスを終了するレベルの時のみ)
        • nil アクセス, 配列範囲外参照の場合くらい
      • エラー値は戻り値で返すことが推奨されている (rv, err := ...)
      • 最後の戻り値を error インターフェイスまたは bool に
      • log.Fatal で死ぬ
  • 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

    • モジュールインポート
      • core なら net/http
      • そうでないなら github.com/xxx/yyy
    • net/http なら http.Get(...) とするので, 汎用的な名前にすると被る → 別名にすることは可能
    • package のスコープ
      • sqlx のディレクトリ構成見るとほとんどフラットに置かれている
  • 制御構文

    • if, for は括弧なし
    • 条件演算子なし
    • for each → range
    • switch あり, break 不要
  • Struct

    • メソッド生やせる
  • interface

    • 満たすべき関数の定義
  • formatter, linter が良い

Web API

  • net/http でクライアント/サーバ両方
    • goroutine 勝手にしてくれる
    • http2
  • middleware (Plack 的な)

  • DB は DBI 的なやつ (database/sql) がある

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
  • 実行時に型バリデーションする場合, 実行するまで成功するかわからない

    • テストパターンをしっかりと用意しないといけない
  • 機械の力を借りて間違いのないコードを書く

  • PPI (https://metacpan.org/pod/PPI)

    • Pure Perl だけで Perl コードをパースして...
    • ドキュメントを生成する
    • PDOM からコードに書き戻すことができる
    • 解析のための構造 (実行するための構造ではない)
    • でも遅い (1175 行, 6.8 sec)
  • Compiler::Lexer

    • XS で書かれたトーカナイザ
    • AST ではなくトークン列
  • Perl::Lexer

    • perl の内部 API を叩いている
  • PPR (Pattern-based Perl Recognizer)

    • Perl のコードのパターンを定義して検知できる正規表現を作る
    • my は組込み関数なので PerlBuiltinFunction で, 空白は PerlOWS で一致させる等
  • (例) プライベートメソッドじゃなかったらバリデーションしてるかどうか

    • 関数定義から関数名とブロックを抜き出す
    • 関数名がアンダースコア始まりならスキップする
    • validator の定義
    • あとは warning, テスト fail 等自由に

    • 場合によっては誤検知

      • 引数を取らない関数
      • attribute, subroutine signature
      • 引数バリデーション以外の validator
    • Smart::Args を使うように置換

    • LST で引数リスト

    • Perl::Critic PPI を使ったチェッカー

    • Perl::Lint Compiler::Lexer を使ったチェッカー
  • 人間側の歩み寄りも必要

    • 1 つの記号が複数の意味を持つ場合がややこしい
  • greppability

    • 狙ったコードを grep できるか
    • メソッド名を動的に組み立てている
    • このメソッドどこで使っているかがわかるように
  • イミュータブル変数等のモダン言語の機能/制約を導入

  • 機械にも人間にも優しいコードは Perl のサブセットになる

  • ハウスルール

    • こういう書き方はうちでは驚きがいっぱいだから変えたほうが...
    • PPR でチェックできる

14:50 ~ 15:10 PerlプログラムでPerlプログラムを修正する方法 - Kang-min Liu @gugod

https://hackmd.io/p/HJR2jzJ-N#/

GUEST: 広木 大地

https://speakerdeck.com/hirokidaichi/2tufalsedxtoji-shu-de-fu-zhai-yapc-tokyo-2019

  • (途中から)
  • 組織構造とソフトウェア

    • 組織構造はコニュミケーション構造
    • 組織構造とシステムが似る? (コンウェイの法則)
      • 悪い組織構造は悪いシステムを埋む
      • 取り引きコスト理論
        • 何かを実現する時にやる人を見つける, 管理する...
        • 発注しても安いならする. ないと困るなら M&A する?
        • 隣りの部署の人に頼めば安いのに, 外注した方が安い状態はよくある
    • 組織設計とアーキテクチャ
      • 組織とシステムは相互に影響する
      • コンウェイ作戦 (取り引きコストが低い組織を作って, それに合わせて開発)
  • ビジネスのアーキテクチャ, ソフトウェアのアーキテクチャは相互に依存

  • よくすることができる = 交換可能

  • 選択肢を持つ側が強い, 持たない側が弱い

    • 恋愛
    • その人に属人化した組織からの給与
  • システムのコントローラビリティレベル

  • 技術的負債の最たる例は, システムのコントロール性の喪失 (ホールドアップ)

    • 下請けにホールドアップされるとかよくある?
    • 技術的負債による損失は兆円単位にも
  • 「技術的負債」と言う原因

    • 見えないことが原因
    • 高価な自転車のタイヤ交換が高くてもわかるけど, もらった自転車の場合ばびっくりする
    • 医者が「死にそう」って言えば信じる
    • エンジニア言ったことを信じてもらえなかった → 非対称性
    • 非機能要件として比べられる価値になっていれば問題なかった?
  • 専門家とイノベーションのつまみ

  • 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 が落ちていても影響しない

PerlX-Ray

  • Perl 用の SDK はない
  • API を叩くモジュールはある Paws::?
  • AWS::XRay (JSONUDP で投げるだけ)
    • capture $name, sub { トレースするコード }
    • ネストすると親子関係にできる
  • Plack::Middleware::XRay
    • 起動時にトレースを開始してくれる
  • トレースを仕込むのめんどくさい
    • Devel::KTYProf がある
      • use するだけで DB とか LWP のログを出してくれる
      • ロガー差し替えできる
        • logger("Devel::KYTProf::Logger::XRay") で自動 capture

X-Ray による ASUCON8 本線問題の解析例

  • 本線問題

    • 仮想通過取引サービス ISUCOIN
    • ブラックボックスで提供され, https でリクエストを送る
    • 開発サーバを改善して高速化
    • 裏側は Blackbox になっている (要するにマイクロサービス)
  • 手順

    • Perl 実装に AWS::XRay を埋め込む

    • 初期実装は docker-compose なので Dockerfile を用意

    • app.psgi を上記 use する
    • ベンチを実行するとトレースが見れる
      • レスポンスの分布, エラー率が等見れる
    • 遅いとこを選択してトレースを見る

      • どの API が遅いか分かる
      • リクエストを選ぶと, どの処理が遅いかわかる
      • 遅い処理の詳細を見る (SQL のクエリ, メタデータを確認)
    • DB は slowlog でできるけど, API 呼出しも解析できる

    • isubank (銀行 API) に手を入れると外部 API も含めてトレースできる
      • API (Go) で XRay sdk を追加
      • Perl 側で X-Amzn-Trace-ID ヘッダを追加

プロセスをまたいだ追跡の仕組み

  • リクエスト開始時に X-Amzn-Trace-ID を発行
  • 受け取った方がヘッダを引き継ぐ
  • X-Ray コンソールでトレースが連結して表示される

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)

まとめ

  • 障害解析に有用
  • AWS X-Ray はマネージドで簡単
  • サンプリング設定間違えるとお金が...

16:30 ~ 16:50 ISUCON8予選問題作成の裏側 - karupanerura

  • karupanerura さんによる ISUCON8 の...

  • 普通の工夫をしたら勝てるように

  • 目的を阻害する行為を出来なくする

  • 技術的アプローチをなるべく制約しない

  • 金で解決させない (外部リソース NG)
  • 製品で使えないようなアプローチを (なるべく) 使わせない

    • 再起動試験 etc.
  • スコア化の難しさ

    • 優れたものとそうでないものの差をつける (難易度, スコア計算, 負荷のかけ方)
  • レベルの調整機構

    • マニュアル指定: ベンチマーカーの負荷の切り替えができる (参加者がわからない)
    • 自動指定: タイムアウトを許容する必要がある
  • 本線ではシェア機能 (by @fujiwara) が導入された

  • ちゃんと完成させる

    • 趣味時間だけだと無理
    • マイルストーン (テストプレイ, 合宿)
    • 雑に集まれる場を用意する
  • 楽しい問題にするために

    • 単なる作業にしない (N+1外すだけとか)
      • 関連機能の制約を満たしつつ高速化
    • 工夫の余地がない (作業スピードの競技になる)

    • 言語選択の有利不利

      • ネイティブコードが吐けると有利
      • 静的型付け言語を選択したら勝てるのは面白くない
  • 解ける問題にするために

    • 実際に解く (上記 URL 参照)
    • etc
  • 言語移植

    • shell
    • フロントに良せる
    • etc

16:50 ~ 17:10 多くのCPAN Authorに育てられ、息をするようにCPANモジュールを書けるようになり、そして分かったこと - Songmu

http://songmu.github.io/slides/yapc-tokyo-2019/#0

以下, PC のバッテリーの都合でメモありません (充電部屋ほしかった...)

(番外編) ノベルティ