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 のバッテリーの都合でメモありません (充電部屋ほしかった...)

(番外編) ノベルティ

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 から “.” が削除

    • CPAN クライアント と Test::Harness をアップデートすること
    • PERL_USE_UNSAFE_INC = 1 で一時対処可能
    • do と require は ‘./〜’ で指定
    • use lib ‘.’ はカレントディレクトリを最優先させるので良くない → FindBin で対処

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 (一文字)
      • ≦ (一文字)
      • 肌色修飾子等の見掛け上の文字数
  • 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 を学ぶには

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 その他の情報ソース

  • Weekly changes in and around Perl6
  • twitter @perl6org
  • Youtube の Perl6 ビデオ
  • 次時バージョン (github の v6d.pod)

2017 後半の Perl イベント

質疑

  • ‘.’ が消えた理由
    • Debian で tmp にあるパッケージ… (書けなかった)

[A] ウェブセキュリティの最近の話題早分かり (GUEST: 徳丸 浩 さん)

  • 侵入事件の話

メルカリ CDN キャッシュからの漏洩

  • 数年に 1 度ある (別人問題)
  • A さんが見るものを B さんが見てしまったというやつ

  • CDN の仕様をチェック

    • Cache-Control: private
  • (デモ) 徳丸さんが佐藤さんに

    • よくわかる PHP のサンプル (実は脆弱性があるが今回は触れない)
    • キャッシュがよく効くように proxy_ignore_headers を書き換えた
      (nginx で作る簡単キャッシュサーバ構築)
    • 佐藤さんの情報がキャッシュされていて, 徳丸さんが見えてしまう
    • ログアウトされない
    • PHP 側ではセッションを使うとキャッシュ無効になる
      → キャッシュサーバ側で問題があるかは別

WordPress脆弱性 (6万以上のページが改竄された)

  • アップデートで脆弱性があることが伏せられていた
  • 影響が大きいため, 1 週間遅れで情報公開

  • (デモ) worldpress を改竄

    • ただの HTML から ‘id=1x’ を送る

GMO ペイメントゲートウェイへの不正アクセス

  • 3/7 公開, 3/10 でアップデート

    • 対応としては十分早い
    • でもやられた
  • Struts 2 (S2-045) (中国で盛ん?)

  • 情報キャッチを早く (セキュリティクラスタは早い段階で騒いでいた)

    • アップデート
    • 止める (OCN は一晩止めた)
  • SELinux

  • (demo) ウェブシェルを動かす

    • Content-Type に問題がある
    • shell.js を動かす

Movable Typeプラグイン

  • ケータイキット最新版 における OS コマンドインジェクションの道の脆弱性を利用し, 本件システムへ遠隔操作プログラムを設置

  • (demo) ケータイブログで web-shell を設置

    • ガラケーは機種で解像度が違うので, 画像を加工する機能がある
    • 画像変換のツール?に web アクセス
    • すでにweb shell 設置完了?
    • adminer (PHP の DB 管理ツール) を使う (実際に使れたもの)

      • PHP ファイル 1 つでお手軽
    • convert コマンド (imagemagic) のコマンドパラメータの問題

      • バリデーションしていなかった
      • perl では安全に使える

パイプドビッツの個人情報流出

イプサ (資生堂子会社) のクレカ情報漏洩

  • 決済代行会社を利用していたが, デバッグモードでデバッグログに情報が残っていた

    • 本番モードは情報が出なさすぎる
    • デバッグモードじゃないと解析ができないのでどうしても使いたい (本来はクレカ情報はでないようにすべき)
  • サーバサイドインクルード (Apache 等の機能) の使い方に問題があった

    • コマンド実行できるのでレンサバでは禁止されていることが多い
  • (demo) SSI を利用して侵入

    • XSS は許容する, とかしてしまう
    • js の代わりに SSI を送信
      • サーバ側で web shell を DL

まとめ

  • 原因
    • 設定不備によるもの
    • ソフトウェアの脆弱性
  • どちらにも注意が必要

[B] コンテナを「守る」仕組みから、中身を理解しよう! (近藤うちお さん)

Rubyist - コンテナとかセキュリティとかの話 - Linux のコンテナは基本的に, 特殊なプロセスとして実装

プロセス

  • fork (複製) → execve(変身) で新しいプログラムを実行
  • プロセスの属性 (/proc 以下で確認できる)

  • fork() と exec() の間で属性を変更してコンテナ的属性を持つように

  • コンテナ : システムコールを用いて OS リソースの隔離, 機能制限, 権限分離をしたもの

ソフトウェア

システムコール

  • chroot(1)

  • unchroot を防ぐ

    • capability (権限を落とす)
    • seccomp
    • pivot_root

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 とか
  • DAC 後に MAC のポリシーが適用され, リソースへのアクセスが強制コントロールされる

  • AppArmor (MACミドルウェア)

  • 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 側のエラーメッセージ

  • HTTP Status Code
  • API Response
  • 管理画面上の表示
  • Facebook Graph API
    • API のオープンプラットフォーム
    • fbtrace_id によるエラー情報の提示・トラッキング

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 感覚で使えてコンパクト
  • 大きなものと小さなものの間

Mojolicious::Plugin::AutoRoute

  • 静的なページの get をいちいち書くのは手間
  • auto ディレクトリの中にファイルを配置すれば, 自動的にルーティング
    • Render::Maybe
  • 多言語 (PHP) の機能を Perl に取り込んでみる

GitPrep

  • GitHub 的なやつ
  • Perl
  • Mojolicous と cpanm を活用して簡単に
  • git には perl が付いている
  • Perl の互換性を活かせる
  • Perl の強みを活かす

SPVM (static perl virtual machine)

  • 静的型
  • VM で実行
  • Perl から簡単に呼びだせる

  • 数値計算と配列演算の高速化

    • PDL 使う? XS 使う? うーん…
      • 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 のライブラリ

  • JS Ruby PHP は HP 見ればあるが Perl はない
  • GraphQL::Tiny (仮称) を作った

[A] 福岡の IT 企業, 開発現場の未来 (GUEST: 縣俊貴さん, 大谷祐司さん, 小田知央さん, 高山温さん, 田中章道さん)

ヌーラボ

スカイディスク

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

  • 便利にテストしたい

  • モンキーパッチばっかりになる

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-application

  • Table Driven Test

  • DSL にする

LT 長野雅広 さん

LT Masayuki Matsuki さん

LT 高山温

  • BugBounty.jp を使って脆弱性報奨金制度

LT codehex

  • YAPC::Okinawa 3/2, 3/3 @OIST

LT nasa9084

Sponsor Session

DeNA のエンジニアの話

  • やたらと「そのサービス (機能) 誰が何をしたいのか」にうるさい
    • 誰が使いたいのか
    • ビジネスモデルはどうなのか
  • 障害対応の執念が異常
  • github のコメントスレッドがやたら長い
  • 面接の評価コメントがやたらと詳しい
  • 新しいツールをいつの間にか入れている
  • 結構どっかに出かけていく (楽しそう)
  • イクメンが多い

  • サービスのことを一番に考える

  • 新しいもの面白いものに敏感
  • 丁寧なフィードバック
  • 仕事だけでなく家族も大事に

Keynote: (山本 竜三 さん)

  • ぬーらぼ

    • Backlog
    • Cacoo
    • TypeTalk??
  • NY オフィス

  • NY 生活
    • 物価が高い
    • 雰囲気・治安は良い
    • 英会話大変