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
YAPC::Fukuoka 2017 HAKATA に行ってきた!!
少し遅くなりましたが…
帰ってブログを書くまでが YAPC !!
前回の YAPC::Kansai 2017 OSAKA ではスタッフでしたが,
今回は参加者として楽しませて頂きました!
Kansai の時は前夜祭・懇親会は参加できなかったので, 今回は参加すべく前日入り.
前夜祭は途中から参加させて頂いたのですが, 着いた瞬間,
(お酒入っててお祭りっぽい分?) 当日をはるかに上回る熱気に驚きました 笑
前日の LT も面白かったですが,
もちろん当日のトークも, 新しい Perl の話, セキュリティの話, テストの話 etc. と
興味深いものばかりでした.
福岡までの旅費を支援して下さった, 学生交通費支援スポンサーの
Farmnote様, こだまリサーチ様, 面白法人カヤック様, サポーターズColab様,
そして, YAPC::Fukuoka 運営の皆様, 本当にありがとうございました!
以下, 話を聞きながらとったなんとなくメモ (+ 見つかったスライド URL) です.
[A] 2017年夏のPerl (charsbar さん)
Perl5 5.26.0 で壊れる可能性
- encodeing プラグマの挙動 (Filter => 1 を使う)
正規表現中の { の扱い (先頭の場合のみ例外)
- /\${[^}]*}/
@INC から “.” が削除
Perl5 5.26 の新しい機能
- レキシカルサブルーチン → モンキーパッチに便利?
- ヒアドキュメントがインデント可能 (<<~)
- Unicode 9.0 のサポート (絵文字とか増えた)
- サブルーチンシグネチャが速くなった
- @{^CAPTURE} 特殊変数 (キャプチャした結果のリスト)
- %{^CAPTURE} 特殊変数 (名前付きキャプチャ)
Perl5 5.28 で廃止予定
- 異種ハンドルの共有は禁止
- ヒアドキュメントの終端は省略不可
- 継承元の AUTOLOAD 禁止
Perl6
- perl, compiler, VM 3 種類のバーション
- perl6 -V の充実
- CPAN Testers を Perl6 でもしたい
- パフォーマンスや安定性の向上
- 低レベルな (VM 等) が改善
- テストがないものは実装があっても仕様ではない
- ドキュメントではなくテスト (ROAST) を確認
- I/O のテストとドキュメントが用意された → I/O まわりの仕様が決定
- Unicode サポート
- Perl6 は特にこだわっている (同じくらい力入れているのは swift くらい)
- 「」(半角)
- ×
- 2乗 (一文字)
- 1/5 (一文字)
- ≦ (一文字)
- 肌色修飾子等の見掛け上の文字数
- Perl6 は特にこだわっている (同じくらい力入れているのは swift くらい)
- Perl5 ユーザがやりがちなミスは, 実行に教えてくれる (length, \N, etc.)
- 2017.5 からは Perl5 とは無関係なミスも教えてくれる
- perl6-js が (Node.js 7.x で) かんたんにコンパイルできる
- エコシステム? (840 くらい)
- Ecosystem Toaster (最近のコミットでどの程度エコシステムが壊れたか確認)
- Perl6 のモジュール App::Mi6 (panda は開発終了)
- 最新 zef
- Rakudo 2017.02 からは 6.c(?) 非互換の nonblocking await が入っている
perl6 を学ぶには
- perl6 のアドベントカレンダー
- perl6 入門 (perl6intro)
- RosettaCode
- 公式テスト
- perl6.org
6.c 対応の書籍
- Perl 6 at a Glance
- Think Perl 6 (pyton から perl6)
- Migrating to Perl 6 (perl5 から perl6 7 月半ば)
- Learning Perl6
- Perl 6 Fundamentals
- Searching and Parsing with Perl 6 Regexes
- Web Application Development in Perl 6 (webapp)
- Using Perl 6 (初心者向け)
- Perl 6 Deep Dive (中・上級者▽むけ)
perl6 その他の情報ソース
2017 後半の Perl イベント
質疑
- ‘.’ が消えた理由
- Debian で tmp にあるパッケージ… (書けなかった)
[A] ウェブセキュリティの最近の話題早分かり (GUEST: 徳丸 浩 さん)
- 侵入事件の話
メルカリ CDN キャッシュからの漏洩
- 数年に 1 度ある (別人問題)
A さんが見るものを B さんが見てしまったというやつ
CDN の仕様をチェック
- Cache-Control: private
(デモ) 徳丸さんが佐藤さんに
WordPress の脆弱性 (6万以上のページが改竄された)
- アップデートで脆弱性があることが伏せられていた
影響が大きいため, 1 週間遅れで情報公開
(デモ) worldpress を改竄
- ただの HTML から ‘id=1x’ を送る
GMO ペイメントゲートウェイへの不正アクセス
3/7 公開, 3/10 でアップデート
- 対応としては十分早い
- でもやられた
Struts 2 (S2-045) (中国で盛ん?)
情報キャッチを早く (セキュリティクラスタは早い段階で騒いでいた)
- アップデート
- 止める (OCN は一晩止めた)
(demo) ウェブシェルを動かす
- Content-Type に問題がある
- shell.js を動かす
Movable Type のプラグイン
ケータイキット最新版 における OS コマンドインジェクションの道の脆弱性を利用し, 本件システムへ遠隔操作プログラムを設置
(demo) ケータイブログで web-shell を設置
パイプドビッツの個人情報流出
イプサ (資生堂子会社) のクレカ情報漏洩
決済代行会社を利用していたが, デバッグモードでデバッグログに情報が残っていた
- 本番モードは情報が出なさすぎる
- デバッグモードじゃないと解析ができないのでどうしても使いたい (本来はクレカ情報はでないようにすべき)
サーバサイドインクルード (Apache 等の機能) の使い方に問題があった
- コマンド実行できるのでレンサバでは禁止されていることが多い
(demo) SSI を利用して侵入
- XSS は許容する, とかしてしまう
- js の代わりに SSI を送信
- サーバ側で web shell を DL
まとめ
- 原因
- 設定不備によるもの
- ソフトウェアの脆弱性
- どちらにも注意が必要
[B] コンテナを「守る」仕組みから、中身を理解しよう! (近藤うちお さん)
Rubyist - コンテナとかセキュリティとかの話 - Linux のコンテナは基本的に, 特殊なプロセスとして実装
プロセス
- fork (複製) → execve(変身) で新しいプログラムを実行
プロセスの属性 (/proc 以下で確認できる)
fork() と exec() の間で属性を変更してコンテナ的属性を持つように
- unshare
- chroot
- prctl
- コンテナ : システムコールを用いて OS リソースの隔離, 機能制限, 権限分離をしたもの
ソフトウェア
- Docker/Moby (Go - libcontainer)
- LXC (C言語)
- Haconiwa(mruby + C binding)
- jailing, agr (Perl)
- vagga (Rust)
システムコール
Linux namespace
- OS のリソースを分離できる
一部だけの移動も可能 ($ ip nets exec)
(demo) PID を分離
- Linux::Clone を使用
- 12 行
cgroup (Control Group)
- プロセスをグルーピング
- グループ毎にリソースの状態を確認・制御する機能
- libcgroup croutpfs からアクセスできる
制御できる対象毎のサブシステムがある
fork bomb 攻撃
- 母艦 OS 全体のプロセス数には上限がある
- たくさんプロセスを立てて, 全体を止めることが可能
- rlimit でプロセスツリー毎の制限もできるが…
- pids subsystem
- 最大プロセス数の制限
- 簡単に fork bomb を防げる
kernel capability
Linux Kernel Capability
- root の権限の一部をプロセスに付与・制限
- 時間セット・シグナル・再起動だけできるとか
- ケーパビリティセット
- (e.g.) 一般ユーザで80番をリスンしたい
- setcap(8) で file capabilityes を与える
- CAP_NET_BIN_SERVICE (1024 番以下をリスンする権限)
- (e.g.) 制限付きコンテナ内 root
- chroot とかできないように
Docker でもケーパビリティの設定がある
privileged を安易に使わない
- privileged で全(?)ケーパビリティを与えることができる
- seccomp 等で権限は絞りこまれているので簡単には問題は置きない
- とはいえ, 問題がおきないわけではない
seccomp
MAC
- Mandatory Access Control (強制アクセス制御)
(⇔ 任意アクセス権限 - ファイル owner ごとにアクセス権限を絞る一般的方式) - SELinux とか
docker では docker-default というプロファイルが当てられる
まとめ
- コンテナは特殊なプロセス
- docker はいい感じにしてくれる
- 参考: スイスチーズモデル
- しっかりと中身を理解してハマりどころを回避しよう
質疑
- 専用のユーザを使わない利点
[A] はてなブログ最近の開発テクニックと最新の開発風景のご紹介 (hitode909 さん)
- はてなブログ安定開発のコツ
point
- ViewModel
- (e.g.) サイドバーのクラス
- React
- 難しいことは react で
- 管理画面はクロール不要, 動的なとこが多い
- propType でデータ構造チェック
- 文字列ではなくタグ単位で扱える
- 静的解析
- デバイス別にちょっと違うのでコピーとかしがち → 静的解析
- XRT
- ネスト数チェック → 大きいとこは整理する
- ブロックの切り出し
- 不要なフラグ・重複がわかる
- 表現力の弱いところでは頑張らない
- perl, js に寄せる
- 連続的移行
- 一般的概念
失敗したら戻せる
デザイナー
毎日コードレビュー
- リリース判断 bot (更新, 時間・曜日を考慮)
[A] Web Application Good Error Messages (and Bad Error Messages) (moznion さん)
エラーメッセージ
- 基本的に人間が読む
- 異常系の処理
エラーメッセージの用途
- 状況
- 解決のてがかり
- サービスの健康度の指標
エラーメッセージ周りの問題
- 書き方がいまいち…
- 後手に周りがち
- 異常系を書くコスト (軽視されがち)
エラーメッセージの特性
次元
- 1 次元 (エラーコード, 識別子)
- 他のエラーとの区別
- 2 次元
- 状況 (何が起こっているかの提示)
- 3 次元
- リカバリ・再現情報 (対処・解決の手法の提示)
方向性
- なぜ出すのか → 必要がなければノイズ
- 何を出すのか (次元にも関連)
- いつ出すのか (レベル, 量)
- 失敗すると膨大な量に
- どこに (誰に) 出すのか (ログ収集, UI)
- エンドユーザ
- 開発者
- ロガー
ライフサイクル
- 短寿命
- その場での対処 (e.g. 電波が悪い)
- 即応
- 長寿命
- 根本的な解決に利用
- ログ・メトリクス的 (エラーの流速を監視してアラート)
- あとで検索できる
良いエラーメッセージ
- 何が起きているかわかる (必須)
- 簡潔であること (好ましい)
- 対処手段が提案されていること (最高)
- その場の問題を妥当する
- 利用者のストレス軽減 → ユーザ体験
- 解決手段が提案されていること (最高)
- 根本的修正の助けになるメッセージ
- 開発者向け
- 長命ライフサイクル
悪いエラーメッセージ
- まったくわからない
- Something wrong
- どうすれば
- Inbalid parameter
- Query is too big
- 情報量が多すぎる
- stack trace が膨大
- クリスマスツリー現象 (エラーで画面がピカピカしてどこから見るかわからない)
真に悪いエラーメッセージ
- そもそもない
- 間違えたメッセージ
client 側のエラーメッセージ
server side 側のエラーメッセージ
Exit Status
git のエラーメッセージは 3 次元的 (解決方法が提案される)
- 昔 push -f が… (真に悪いエラーメッセージ)
エラーメッセージを書く
- 次元の高い情報を示す
- 見た人が泣かないように
- 目的を明確に
- 誰が見るのか
- 出ししぶらない
- 常に書くのは難しい
- コストと相談 (ペイするとこは手厚く)
エラーメッセージ翻訳
- 受け取り手にふさわしい内容に変換
- サーバ内部エラーをユーザに示す
- 他のサービスからのエラーをどう返すか
- client へのエラーメッセージにスタックトレースをつっこむ
- めちゃくちゃ便利
- release で無効化するのを忘れないように
[A] cpm (GUEST: 鍛治 匠一 さん)
cpm の特徴
- 速い
- ワンライナーでインストール (curl -SL … | perl - install -g)
Prebuilt
- 一度ビルドしたものは取っておく
モジュールインストールの機会は増えつつある
- プロジェクト毎のモジュール管理, Carton の登場
- CI の浸透
- インフラのクラウド化
[B] 未来志向のCPANモジュール開発 - アイデアを生み出し実装する方法 (木本 裕紀 さん)
Object::Simple
- 大きなものから小さなものを切りだす
- 真似してみる (mojolicious の非同期 IO の仕組みとかわかる)
DBIx::Custom
- SQL 感覚で使えてコンパクト
- 大きなものと小さなものの間
- DBI (基盤) と DBIx::Class (完全な抽象化) の中間
Mojolicious::Plugin::AutoRoute
- 静的なページの get をいちいち書くのは手間
- auto ディレクトリの中にファイルを配置すれば, 自動的にルーティング
- Render::Maybe
- 多言語 (PHP) の機能を Perl に取り込んでみる
GitPrep
SPVM (static perl virtual machine)
- 静的型
- VM で実行
Perl から簡単に呼びだせる
数値計算と配列演算の高速化
- PDL 使う? XS 使う? うーん…
- XS の問題
- 難しい
- メモリリーク
- モジュール化できない → 再利用できない
- XS の問題
- PDL 使う? XS 使う? うーん…
- サーバ管理とか Web 開発は得意
- 数値計算と配列演算は言語使用上向いていない
- Perl の強みを活かして弱みを弱める
[B] Web API の未来 (Takatsugu Shigeta さん)
Web API の歴史
- (2010 年〜) REST に対して JSON で返ってくるのが今流
- (2005 年〜) REST-XML
- (2000 年〜) XML-RPC (RPC を HTTP で)
- (それ以前) RPC (外のリソースを使う)
サーバ
- インターナルからインターネット
- 共通のフォーマット (json)
クライアント
- 専用ソフトからブラウザ
- C から js
REST
- サーバサイドはシンプル
- クライアントは複雑 (高速化のため)
- 非同期 IO
- ローカルキャッシュ
GraphQL
Operations (3 つの操作)
- query (データ問い合わせ)
- mutation (データ操作)
- subscription (データ更新通知)
事例
- GitHub
Relay (クラサバのフレームワーク, react 使ってうまくやる)
敷居は高くない
[ client ] ⇔ [ GraphQL Proxy ] ⇔ [ AP server ] [ DB ] [外部サービス]
Falcor (中間のレイヤ)
- クラサバ両方に入れて json でやりとり
Web API の未来
GraphQL のライブラリ
[A] 福岡の IT 企業, 開発現場の未来 (GUEST: 縣俊貴さん, 大谷祐司さん, 小田知央さん, 高山温さん, 田中章道さん)
ヌーラボ
スカイディスク
- IoT, クラウド, HW も自社で
GMO ペパボ
ピクシブ
- 創作文化を盛り上げるサービス (pixiv)
- エンジニア: 150 * 0.7 人
- 5 人前後でのチーム開発
- チームでの裁量が大きい
- みんなでマストドン立ち上げて遊んだり
オンサイト
- Web の運営 (コンサルではなく, オペレーションまでやる)
- SNS の運用, EC サイトの運営 (クライアントは発送するだけ)
- 社員: 15 人 + バイト 30-40 人 + パート (エンジニア?)
(テーマ2) なぜ今, 福岡なのか?
- サービスの拠点が増えてきて盛り上がってきている
- 5 年前くらいから (LINE とか大きい会社来てから)
web サービスの運営は東京じゃなくてもよい
エンジニアが快適に生活できる
- 大都市よりリラックスできて, コミュニティはしっかりある
- 自転車通勤とかしやすい
(テーマ3) 将来に向けて, 目指すこと
[B] 新時代のテストフレームワークTest2 (akiym さん)
Perl でテストを書く
- Test::More
- 内部で Test::Builder を使用
- Test::Deep
- データ構造を複雑に比較したい
- Test::Fatal (Tet::Exception)
- 例外が発生した, していない
- Test::Mock::Guard
- 特定スコープで処理を変える
- Test::Warnings
- 特定のスコープでの warning を捕捉
- 意図しない warning が出てないか
Test::Class
- 環境変数 TEST_METHOD を使ってry
便利にテストしたい
- モンキーパッチばっかりになる
Test2
- 5.26.0 以降は 1.30+ が標準で入っている
- テストのテストがしやすい
- 拡張しやすい
- テスト失敗時のレポートがしやすい
Test::Builder 自体が Test2::API で書かれている
基本的に互換性あり
- Test::More はそのままいける
移行の注意
- use utf ハックはやめる
- use Test::Plugin::UTF8 を t/test.pm に
- Test::Class のruntest の自動化はやめる
- Hook::AfterRuntime を使用する
- デストラクタを利用した黒魔術
- Test::Pretty は動かない
- Test::Warnings は動かない
Test2 でテストを書く (Test2::Suite)
- use Test2::V0 (string, warnings, 必要なモジュールインポート)
- is と like で簡単に書ける
fail の出力が見やすい
mock も書きやすい
add, override
- before, after, around
- excption, warning
Test2 の注意
- 乱数のシード
- T2_RAND_SEED で指定
- isa_ok と ref_ok
テストをまとめる
- 1 つ上の呼出し元
- Test2::API context
- Test2::Plugin::??
- コードを出力?
- Test2::DeepLike
- Test::Deep のように使える
スキップしていいテスト、スキップしてはいけないテスト 〜速さと信頼を兼ねたテストコードを構築する術〜 (macopy さん)
- テストがどんどん肥大化してきてつらい
- リリース当初 C0 90%
- 現在不明
- フルスペックのソシャゲサーバって複雑
- ついつい便利関数で統合テストしてしまいがち (DB にアクセスとかするとなお遅い)
.pm 24 万行 / .t 26 万行
もはや「テストを書こう」の時代ではない
- テストは書いて当然
- いかに上手くやるか
なぜテスト
更新しやすいのはサーバ側
- クライアント側は申請が必要 → 遅くなる
- 重要な部分はサーバ側 (緊急修正はサーバ側)
- 「独自 API のブラウザ」
リリース前にフルテストはかけたい
- テストには助けられる
- 新機能 → デグレーション
- マスタデータのテスト
- 止まると損失 大
- ユーザ離れ
- テストには助けられる
テストに 30 分もかかる → 失敗できない (デプロイのタイミング制約)
(高速化する話)
https://speakerdeck.com/mackee/need-for-speed-of-testing-in-perl5-web-applicationTable Driven Test
- DSL にする
LT 長野雅広 さん
LT Masayuki Matsuki さん
LT 高山温
- BugBounty.jp を使って脆弱性報奨金制度
LT codehex
- YAPC::Okinawa 3/2, 3/3 @OIST
LT nasa9084
- emacs の話
Sponsor Session
DeNA のエンジニアの話
- やたらと「そのサービス (機能) 誰が何をしたいのか」にうるさい
- 誰が使いたいのか
- ビジネスモデルはどうなのか
- 障害対応の執念が異常
- github のコメントスレッドがやたら長い
- 面接の評価コメントがやたらと詳しい
- 新しいツールをいつの間にか入れている
- 結構どっかに出かけていく (楽しそう)
イクメンが多い
サービスのことを一番に考える
- 新しいもの面白いものに敏感
- 丁寧なフィードバック
- 仕事だけでなく家族も大事に
Keynote: (山本 竜三 さん)
ぬーらぼ
- Backlog
- Cacoo
- TypeTalk??
NY オフィス
- NY 生活
- 物価が高い
- 雰囲気・治安は良い
- 英会話大変