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 生活
- 物価が高い
- 雰囲気・治安は良い
- 英会話大変