アイスタイルは PHPerKaigi 2019 にゴールドスポンサーとして協賛!& 竹澤が登壇・相談会・PHPの現場に登場!そしてPHPerチャレンジ! #phperkaigi

PHPerKaigi2019

竹澤 です(通称ytake)。
2019/3/29-3/31に開催される PHPerKaigi 2019 に
弊社アイスタイルがゴールドスポンサーとして協賛しています。

そしてありがたいことに今回いくつかの企画と、
3/31の本編にも竹澤が登場・登壇させていただきます。

PHPの現場 公開収録

3/30 13:30からは・・

実は4回目の登場(?!)になりますが、
ゲストとして公開録音に参加させていただきます!

どんな話が飛び出すかは、当日のお楽しみ・・!
毎回テーマは決めていますが、内容は話しながら進んでいきますので、
どういう内容になるかはわかりません!

お楽しみに!

Laravel相談会

3/30 16:15からは・・

去年に引き続き、今年もLaravel相談会ということでIRTの司会を担当します。
IRTの主役はあくまで参加者の皆さんです!
参加者が少なければLaravelに関する様々なお話をその場の皆さんとできればと思います。
特に題材がなければ、扱うテーマは、、、

Laravelとテスト

Laravel使ってるけどテスト・・・
テスタビリティの高いコードとか、テストの文化、
こうしてます!みたいな話ができるといいなぁと思っています。

Laravelとアプリケーション設計

最近話題になることも多いですが、
自分たちのアプリケーション開発とフレームワークの付き合い方、など
みなさんで意見交換を是非できればと!

Laravel vs Lumen

これは去年も熱い議論が交わされたテーマでもあります。

Queueってどこまで使ってますか?

LaravelのQueueに纏わる話題が海外でもありましたが、
アプリケーションの規模と、マイクロサービス vs モノリシック
みたいなのも実は見え隠れするテーマです。
是非皆さんと熱い話ができればいいなぁ、と

wow

登壇

3/31 11:25からは・・

去年に引き続きHack界隈のお話をさせていただきます。
Hack HTTP Request and Response Interfaces

Hackには、HTTPの処理に関してPSR-7のように相互運用を可能にするためのインターフェースが存在します。
PSR-7と異なるインターフェースはなぜ用意されたのか、
PSR-7とHackのインターフェースの違いはなにか、
Hackでの実装例と他言語のHTTP処理を比べながら、リクエストレスポンスの表現について理解を深めるセッションです。

最近のHackの情報はなかなか目にすることがないと思いますので、
その辺を踏まえてHackのHTTPに関連するインターフェースについてお話しします。
こちらについてはすでに資料は公開済みです(多少変更は入ります)

Hackついでに

突然ですが最新版のHack、みなさん触ってみましたか?
せっかくなので少しだけHHVM4.0に触ってみましょう。

HHVM4.0以降でのみ実行できます。
環境がない方は、Docker等で実行してみましょう。
Dockerfileは以下のものを利用するとすぐに準備が整います。

FROM hhvm/hhvm:latest

RUN apt-get update
RUN DEBIAN_FRONTEND=noninteractive
RUN apt install -y dnsutils iputils-ping net-tools

RUN hhvm --version && php --version
RUN cd $(mktemp -d) \ 
 && curl https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

.hhconfig

Hackの開発を行う場合の設定です。
PHP自体はもう利用しませんのでfalseにしましょう。
他の設定は、destructの無効などです。

assume_php = false
enable_experimental_tc_features = no_fallback_in_namespaces
ignored_paths = [ "vendor/.+/tests/.+" ]
safe_array = true
safe_vector_array = true
disallow_destruct = true
disallow_stringish_magic = true
disable_primitive_refinement = true
unsafe_rx = false

composer.json / hh_autoload.json

次にcomposerで利用するライブラリです。
Hackではおなじみのものです。

  "require": {
    "hhvm": "^4.0",
    "hhvm/hsl": "^4.0",
    "hhvm/hsl-experimental": "^4.0",
    "hhvm/hhvm-autoload": "^2.0.0"
  },
  "require-dev": {
    "hhvm/hacktest": "^1.4",
    "facebook/fbexpect": "^2.5.2",
    "hhvm/hhast": "^4.0.0"
  }

PSR-4。。。と思う方も多いと思いますが、
hhvm-autoloadが各クラスファイルをみてよしなにクラスマップを生成してくれます。
PSR-4指定をしたい場合はそのまま記述しましょう。

hh_autoload.jsonは下記のものでOKです
*testは本サンプルでは書きません

{
  "roots": [
    "src/"
  ]
}

ディレクトリ構造

ディレクトリ構造は下記の通りになります。

├── composer.json
├── hh_autoload.json
├── src

準備ができたら composer update or composer installを実行します。

Sealedで制限する

少し前のHackから追加されたsealedを使って継承・実装に制限をかける事ができます。
今回は下記のようにします。
ファイル名は Challender.hackです。

拡張子を.hackにすると、<?hh // strictを書かなくても、
常時strictになります。
これはPHPサポートが切れた4.0から導入されました。
一気にPHPっぽい何か、というのがなくなったように見えますね(?)

namespace PHPerChallenge;

use namespace HH\Lib\{Str, Vec};

<<__Sealed(Hex::class, Binary::class)>>
abstract class Challenger {
  protected vec<string> $v = vec[];

  public function generate(): string {
    return Str\join(Vec\map($this->v, ($v) ==> $this->convert($v)), '');
  }

  protected function convert(string $v): string {
    return '';
  }
}

hslを使って簡単なvecの処理を行い、文字列として出力します。
Sealedで記述されたクラスのみ直接の継承が許されています。

Hexクラス実装

いくつかの16進数を用意して
convertメソッドをOverrideして変換処理を記述します。

namespace PHPerChallenge;

use function hex2bin;

final class Hex extends Challenger {

  protected vec<string> $v = vec[
    "23",
    "69",
    "73",
    "74",
    "79",
    "6c",
    "65",
    "5f",
    "3c",
    "3f",
    "68",
    "68"
  ];

  <<__Override>>
  protected function convert(string $v): string {
    return hex2bin($v);
  }
}

クラスファイルはsrc/Hex.hackとして作成します

Binaryクラス実装

同じように2進数の変換を用意します。

namespace PHPerChallenge;

use namespace HH\Lib\{Str, Math};
use function pack;

final class Binary extends Challenger {

  protected vec<string> $v = vec[
    "100011",
    "1101001",
    "1110011",
    "1110100",
    "1111001",
    "1101100",
    "1100101",
    "1011111",
    "111100",
    "111111",
    "1101000",
    "1101000"
  ];

  <<__Override>>
  protected function convert(string $v): string {
    return pack("H" . Str\length(Math\base_convert($v, 2, 16)), Math\base_convert($v, 2, 16));
  }
}

クラスファイルはsrc/Binary.hackとして作成します

TokenGneratorクラス

Challengerクラスを継承したクラスを利用できるようにコンストラクタで制限を与えましょう。

namespace PHPerChallenge;

final class TokenGenerator {

  public function __construct(
    private Challenger $c
  ) {}

  public function toString(): string {
    return $this->c->generate();
  }
}

これで準備はOKです。

EntryPoint

HackをCLIで実行できるようにします。
実行したい関数に<<__EntryPoint>>Attributeを記述すると、
そのまま実行してくれます。
Goなどのmain関数と同じものです。
この辺りは少し前のHHVMから利用できます。

require_once __DIR__ . '/vendor/hh_autoload.hh';

<<__EntryPoint>>
function main(): noreturn {
  $token = new \PHPerChallenge\TokenGenerator(new \PHPerChallenge\Hex());
  echo $token->toString();
  exit(0);
}

プロジェクトルート直下に main.hackファイルを作成して記述しましょう。
実行する前にhhvm-autoloadに作成したクラスを追加するために下記コマンドを実行します。

$ hhvm ./vendor/bin/hh-autoload.hack

エラー等が発生していないければOKです。
気になる方は hh_clientコマンドを実行し、
Typechekcerで最後に型検査をしておきましょう。

*コマンドを実行せずともVSCodeなどでHackプラグインを利用していると、
Language Server機能でリアルタイムに型チェックを行います。
コンパイラみたいなものです。

No errors!が出ていればバッチリです。

実装した処理は

$ hhvm main.hack

で実行します。
実行できましたか?

それではPHPerKaigi2019でお会いしましょう!

PHPerトークンはどこかに隠されています

アイスタイルCTO 開発で好んで使う言語はPHP, Hack, Go, Scala 好きな財団はApacheソフトウェア財団 github twitter