ラック
Home > ブログ > 記事 > 2017年10月 > PHP Conference 2017 参加レポート

PHP Conference 2017 参加レポート

カテゴリ: セキュリティ,サーバ,プログラム,開発環境

PHP Conference 2017に参加したのでそのレポートを。

大田区産業プラザPiO

PiO全景。

PHP Conference

PHP Conferenceの案内

未来(とき)の鼓動

床に埋め込まれた時計。

大田区産業プラザPiO 内装

大田区産業プラザPiO 内装

内側の様子。昼と夜では様子が変わりますね。

以下、聞いたセッションの内容まとめ。セッション登壇者の名前は敬称略。

session25: PostgreSQLとPGroongaで作るPHPマニュアル高速全文検索システム

  • 須藤功平

  • PHPマニュアルの検索: @(エラー制御演算子)が引っかからない
    • 全文検索ではない
  • プログラミング言語用のチューニングが必要
  • 今回のテーマ: PHPマニュアルの全文検索の作り方
  • PostgreSQLのLIKE: 少ないデータ向け(400文字x20万件くらいなら1秒)
    • LIKEの欠点(一般): 「それっぽい」順のソートはできない
    • ユーザは先頭n件しか見ない
  • PostgreSQLのtextsearch: インデックス作る、が、言語毎にモジュールが必要(全文検索用のもの)
  • PostgreSQLのpg_trgm: ヒット件数が多いと遅くなる、「それっぽい」順のソートができない
    • pg_bignm: pg_trgmの日本語版
    • PGroonga: 全文検索エンジンGroongaのPostgreSQL版
  • PGroonga
    • 速い
    • 「それっぽい」順のソート可
  • GitHub - kou/php-document-search: PHP document search system based on Laravel, PostgreSQL and PGroonga
  • google慣れしたユーザは「seiki」で「正規表現」の予測変換とかが出てくれないと普通と思ってくれない。しきいが上がっている
    • 高速全文検索 + ソート
    • 検索キーワードハイライト
    • キーワード周辺テキスト表示
    • オートコンプリート
    • 類似記事検索
    • 同義語展開: @ → @ or エラー制御演算子 (同義の語彙に対して同じと判定)
  • 環境:
    • Laravel
    • PostgreSQL
    • PGroonga
  • 実際の作り方
    • PGroongaの初期化には下記コマンドを実行
CREATE EXTENSION proonga;
-- スーパーユーザで最初に実行する必要がある
  • インデックス作成: 主キー(id)入れるの大事
    • title, contentは検索で使うので。idはそれっぽい順のソートで必要
  • 諸々カスタマイズ
  • 類似マニュアル検索の実装(エラー制御演算子を検索すると、エラー関係の記事もレコメンドする、など)
    • idとtitleを1つの文字列にして、全体を検索。カラムのままではなくテキストにする
  • 参考: 文字情報の分析基盤 Mroonga | db tech showcase
  • 参考2: Groongaではじめる全文検索 | Official Website

まとめ

途中で耳慣れない単語が幾つも出てきて困惑しましたが、マイグレーションやシーダーはLaravelでの用語と後で分かりました。

本筋であるPGroonga(自分の場合はMroongaを使いたいのですが)は操作自体はわりに簡単に導入できること、また後からインストールすることも可能なようなので検討の可能性が高まりました。一方で、DBの管理に関わるので権限の問題からレンタルサーバでは導入は難しそうだと感じました。不明点がある程度はっきりしたので、適宜使えたら良いと思います。また、導入よりも導入後の運用コストも考えなければならないことは覚えておきたいです。

session24: Robo を使ったモダンなタスク管理と自動化

  • 岸田 健一郎
  • 自動化していますか?
    • したいけど上手く行ってない、ちょっとやっている、程度が多そう
  • 自動化の流れ
    • 10年前: オブジェクト指向
    • 次: DDD
    • 次: アジャイル
    • 今: DevOps
  • 背景:
    • 早く市場に出す
    • フィードバックを得る
    • 安定した品質
    • 共通の会話
      • 社内で概念・知識を共通化・共有する
  • 自動化は目的ではなく手段
    • イージーな例外など、暗黙的になりがちな部分を防ぐ
      • コードレビュー
      • 静的解析
      • 自動テスト
      • 自動デプロイ
  • PHPでメジャーなもの
    • Jenkins
      • 例: PHPUnitを動かす
    • 昔: Phing
      • Apache Antなどから着想を得ている(Antと互換性ある)
        • XML定義なので書くのがツラい
  • 色々なツール
    • GNU Make
    • maven / ant
    • gradle
    • grunt
    • gulp
  • 整理
    • SSR
      • 今日のメインの内容
    • SPA
      • 今日の内容はフロントエンドとバックエンドが別のものはこちらに属す
  • PHPで有名なもの: Composer
    • Composerのscriptは簡単な命令は実行できるが、タスクランナーとしてはちょっと……
  • なので、Robo
  • できること
    • コマンドなどを自動実行
    • 平行タスク実行(gulpに影響を受けている)
    • テスト実行
    • ファイル更新のウォッチ(これもgulp影響)
  • デモ
  • prestissimo

まとめ

思想がgulpライクな印象だったので、gulpを使っている自分としては親近感が湧きました。
PHPをメインに使ったプロダクトではgulpだとやりづらい部分もあったので、そういった部分で使い分けができるとより作業が効率化するのではないかと期待できそうです。どこかで使いたいですね。

session04: 著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則

  • EGセキュアソリューションズ株式会社 徳丸浩
  • 脆弱性の分類と入力値の関係
  • 外部入力値の不適切な処理やディレクトリトラバーサルが多い
    • 外部入力値
      • 信頼関係の中で閉じた処理は影響が局所的
      • 外部入力値がある場合は信頼できない
    • ディレクトリトラバーサル
      • 外部入力値にパスを渡すと意図しないディレクトリまで参照される可能性がある
  • SQLインジェクション
    • プレースホルダで安全にSQL文を実行させる
  • プログラムの検証をすることも考えると、直前で対策が行われているような場合の方が良い(局所的に安全)
  • 値には2種類ある
    • どんな値でも安全に扱えるもの
      • SQLのプレースホルダ
      • HTMLの要素内容、属性値エスケープ
      • etc.
    • 値を信頼するしかないもの
      • SQL文そのもの
      • ソースコードそのもの
      • ログインユーザ名
      • etc.
  • 値を信頼するしかないもの、は扱いが難しい
    • どんな値も安全に扱える方法がある場合は、それを行う
      • SQL: プレースホルダ
      • HTML表示に漏れなくエスケープ
      • ヘッダインジェクションが発生しないライブラリを使う(最新のPHPなど)
      • etc.
    • 信頼できる値が要求される場合(プログラム、SQL文など)は…
      • 信頼境界の外に出さない
      • 一度外に出た値は信頼を回復できない
        • 認証・認可で信頼できることを確認
      • フィルタリングにより「真正ではないが無害にする」こともありうる
  • ケーススタディ
    • オブジェクトインジェクション
      • 信頼できない値にunserialize関数は使ってはいけない
        • jsonを使う
  • バリデーションは有効なときがある
    • 信用しすぎてはいけないが、有効なときがあるのでバリデーションはやっておくべき
  • 局所安全性を保つことは重要
    • 読みやすい・追いやすいコードは結果的にバグを生み出しづらく、セキュリティにも寄与する

まとめ

一般的な話から実際のケーススタディまで、幅広い範囲にわたるお話でした。概念的な話は、実際のプロジェクトに対して、全体を俯瞰してどこにリスクが存在するかを把握するために、実際のケーススタディは作りこむ中での対策や気づきとして使えるため、今後のプログラミングで今回のお話を上手く活用したいです。

session26: ここで差がつくエラー処理

  • ピクシブ株式会社 うさみけんた
  • 皆さん,500や503のエラーを起こしていませんか?
  • 入門書や記事のソースをコピペして起こしていませんか?
  • 内容
    • エラーと例外の基本概念
    • それらを制御する方法
    • 開発環境でうんざりしない方法
  • 参考: Online PHP editor | Run code in 200+ PHP & HHVM versions
    • オンラインのコードテストに使える
  • PHPにおいて
    • 5.x系まであったエラーの仕組み
    • 7.x系で例外を投げることが増えた
  • エラーとは?
    • PHPで異常状態を通知するための仕組み
      • Notice
        • indexを越えたところから値を取り出したり
        • 信号無視のような軽いイメージ
        • ただし、バグの温床なので無視することはオススメしない
      • Warning, Error
        • 何かが「間違っている」ときに発生
        • PHPのデフォルト設定ではWarningはそのまま処理が進む。Errorは止まる。
        • 一貫性がない
        • どちらでも直した方が良い
      • Deprecated, Strict
        • 非推奨、廃止予定や互換性が怪しい機能に対して発生
      • Fatal Error
        • 致命的なエラー
        • 明らかに不正な式など
    • 7で種類が整理された
  • 例外とは?
    • PHP5で追加された言語機能
    • 異常状態のときthrowで投げる
    • try catchで使う
    • 5ではExceptionまたはそれを継承したクラス
    • 7ではThrowableインターフェースと、Exceptionを継承しないError(クラス)とその派生クラス
      • まぎらわしいのでこのセッション中では「例外」とする
    • PHP5ではエラーだったが、7では例外になったものがある(混在しているので注意)
  • エラーハンドリング
    • dieやexitより、例外で書こう
      • その後の処理が一切できない
        • エラーメッセージを簡易的にしか伝えられず、ユーザインターフェースとして不親切
        • エラー後のデータの処理などをどうするのか
    • 発生したエラーをなんとかする
      • そこで処理を止める
      • or
      • 無理矢理続行する
        • エラーを何とかするチャンスは3つある
          • set_error_handler()
            • エラー発生時にこれに登録した関数が呼ばれる
            • Fatal Errorは捕捉できない
          • set_exception_handler()
            • 例外がtry catchで捕捉されなかったときにこれに登録した関数が呼ばれる
            • 呼び出された後は処理は停止
          • register_shutdown_function()
            • PHP終了時に必ず呼ばれる関数を登録
            • Fatal Errorを補足できるチャンス
    • error_reporting(): 出力するエラー(Warningか、Errorか、のような)の種類を設定
      • 5.3以下はStrictが発生しないので気をつけること
    • エラー処理には3つのチャンスがある
  • エラー対処
    • 可能な限り無視しない
    • Noticeが無茶苦茶多いときは緩めることも必要
    • 一気にリファクタリングするとエンバグが怖いので少しづつやる
  • エラー処理するためのフレームワーク: whoops

まとめ

意外と体系付けて知る機会がないので勉強になりました。Noticeとかわりと管理がずさんだったりするので注意するよう普及させたいです。

LT大会

Markdownで書けるCMS、Rubel。使ってみたいと思ったので特に印象に残りました。

全体のまとめ

PHP Conferenceは初めての参加でしたが、PGroongaの話が聞けたり、PHPに関して意外と知らないことへの発見や気付きが得られたので、非常に勉強になりました。Mroongaはいずれ使いたい。RoboとRubelはわりとすぐ試してみたいです。

ちょっと合間合間でコーディングしていたり、途中でSurfaceのバッテリが切れたりして内容に漏れがあったりするかもしれませんが、一応聞いたセッションは後で資料を読んで補完したつもり……です。

なお、資料一覧は以下にまとまっている模様。

タグ: イベント,php

 



関連する記事一覧