Engineer as a Lifestyle @tenkoma

What We Find Changes Who We Become -- Peter Morville著『アンビエント・ファインダビリティ 』

LEDデスクスタンド

パナソニック LEDデスクスタンド クランプタイプ ダークグレー SQ-LC516-K

パナソニック LEDデスクスタンド クランプタイプ ダークグレー SQ-LC516-K

引っ越して、机で本が読みにくい環境になってしまったので買った。 スイッチが根元にあって遠いけど、たいして気にならないので満足。

USB切り替え器

買った。

FOSTEX ボリュームコントローラー ハイレゾ対応 PC100USB-HR2をMacBook ProとNintendo Switch で共有するために買ったけど、キーボードもSwitchで使えるようになって便利になった。

PHPカンファレンス仙台2019で「PhpStormとPHPUnitを連携してユニットテスト作成を楽にする」を再発表しました

2019年1月26日(土)に開催されたPHPカンファレンス仙台2019に参加してきました。

一般参加の予定でしたが、2日前に登壇キャンセルで代打を募集されていたので、応募して話せることになりました。

内容は2018年12月にPHP勉強会で話したものと同じで、時間に合わせて説明をゆっくりにしたり、わかりにくそうなところに説明を追加したりしました。

ただ直前にいそいで修正したので、説明につまったところがあったかなー、とは思います。 また、テスト時にデバッグするところでブレークしなくて、説明した機能を見せることができませんでした。 セッション後に調査したところ、 Test Frameworksの設定で説明した、Localという設定を削除してなかったのが原因だったようで、削除したらちゃんとブレークしました。

次なにか発表するときは動画にしようかと思います。

PHPカンファレンス仙台、とても楽しかったです!ありがとうございました。

(発表の最後の準備で睡眠時間が確保できず、懇親会の後すぐホテルの部屋に戻ってしまったのが心残り…)

2018年に買った物まとめ

満足度高い順で。

27インチ 4Kモニタ, USB-Cで給電可能

外部モニタをずっと使って無くて2003年に買ったEIZO L465しか家に無かったので買った。 ベゼル1cm以下、USB Type-CでMBP 15インチを給電できる。 Nintendo Switch もHDMI接続で使ってる。 すごく作業しやすくなった。 不満があるとすれば

  • USB Type-Aポートが2つだけど4つは欲しかった
  • MBP とNintendo Switchを切り替えることがよくある。入力が5つあるが3つは使ってないので、入力切り替えで、使わないポートには切り替わらないようにできたらいいのにと思った。

くらい。

オカムラ オフィスチェア コンテッサ(メッシュ)+ウレタンキャスター

オカムラ オプションパーツ ウレタンキャスター (5個セット) G93107X

オカムラ オプションパーツ ウレタンキャスター (5個セット) G93107X

こしをだいじに。 オフィスでアーロンチェアを使ってるけど、背もたれを傾けて固定できたほうが便利だと思ったのでこちらを選択。 長時間座って作業できます。不満なし。 2月に買ったときは ¥175,050 だったが、¥9,000ほど値上がりしてた。

ドライヤー

パナソニック ヘアドライヤー ナノケア ピンクゴールド EH-NA99-PN

パナソニック ヘアドライヤー ナノケア ピンクゴールド EH-NA99-PN

ドライヤーで髪を乾かす習慣がなかったけど、ちゃんと乾かすようになった。 ドライヤーは風量が大事ですね。

電動歯ブラシ

Amazon プライムデーで購入。 歯の裏側を磨くのがすごく楽になった。

NAS + HDD4つ

WD HDD 内蔵ハードディスク 3.5インチ 2TB WD Red NAS用 WD20EFRX SATA3.0 5400rpm 3年保証

WD HDD 内蔵ハードディスク 3.5インチ 2TB WD Red NAS用 WD20EFRX SATA3.0 5400rpm 3年保証

Time Capsule で毎回バックアップ失敗するようになったので、渋々NASを検討して、これを購入。 コントロールパネルにブラウザでアクセスできて、何ができるのかわかりやすかった。 バックアップにしか使ってないけど、用途がふえたら、HDDの容量を増やしていくかも。

加湿器

引っ越す前から使っていたパナソニックの加湿器(FE-KLG03)だと、フルパワーでも加湿量不足を感じたので購入。 5リットル入るので、平日だと1日はもつ。 常に静音モードでつかってます。

Kindle Oasis

Kindle Oasis、電子書籍リーダー、防水機能搭載、Wi-Fi、8GB

Kindle Oasis、電子書籍リーダー、防水機能搭載、Wi-Fi、8GB

画面切り替えが速い。薄い。 せっかく買ったけど、あんまり使ってない。マンガを読みたいときだけは使う。

新訳版テスト駆動開発をPHPで写経した

f:id:tenkoma:20190109215900p:plain

テスト駆動開発

テスト駆動開発

旧訳(ピアソン)版をJavaで写経したことはあったけど、PHPではなかったので、正月に読んでいた。コードはGitHubに。

github.com

第Ⅰ部 他国通貨は完了。

第Ⅱ部 xUnitと付録B フィボナッチは気が向いたら写経しよう。

PHP で実装してみて

変数やプロパティの型宣言がないので、変更を省略した箇所が多い。 (ただしプロパティはPHP7.4で型宣言の機能が追加される予定(PHP: rfc:typed_properties_v2)なので、1年後はさらに型のエラーが利用できるはず) クラスをキャストするという概念もないので省略した。

HashMap に当たる機能が見つけられなかった。PHP: SplObjectStorage - Manualを利用してHashMap に近いものを実装しようかと思ったが写経の途中だったのでやめた。

assertEquals() は型チェックをしてくれないし、 assertSame() でオブジェクトの equals() を使ってくれないので、assertTrue()

$this->assertTrue($five->times(2)->equals(Money::dollar(10)));

というふうに書いた。(第4章 意図を語るテスト by tenkoma · Pull Request #6など)

CakePHP3 アプリケーションのためのDocker開発環境を作ってみた

CakePHP Advent Calendar 2018 - Qiita 24日目の記事になります。

先日、第133回 PHP勉強会@東京で「PhpStormとPHPUnitを連携してユニットテスト作成を楽にする」というテーマで発表しました という記事を書きました。 そのとき、利用したサンプルアプリケーションとして tenkoma/cakephp_cms を使ったのですが、デモを簡単にするためにDocker環境を作ったので紹介します。

サンプルアプリケーション tenkoma/cakephp_cmsは去年のCakePHP Advent Calendar 2017 - Qiitaに投稿したCakePHP 3 のチュートリアルにユニットテストを追加する (1), (2)で使ったものです。

Docker設定の概要

Docker環境の設定はshin1x1さんのPhpStorm + Docker for Mac(docker-compose)での PHPUnit と Remote Debug の設定 - Shin x Blogをベースとして以下の変更を加えてあります。

  • CakePHP3アプリケーションに必要な intl拡張をインストール
  • MySQLコンテナを追加
  • 設定ファイルを手動で編集しなくても、環境が作れるように環境変数を docker-compose.yml に記述
  • その他細かい調整

使い方

git clone https://github.com/tenkoma/cakephp_cms.git
cd cakephp_cms

でリポジトリを取得して使います。以下のコマンドが使えます。

  • make 起動してcomposerパッケージインストール(make up + make install)
  • make up 起動
  • make install composerパッケージインストール
  • make migrate データベースマイグレーション
  • make test テスト実行
  • make clean 終了

MySQLデータベースのデータは dbdata/ 以下に保存されるので、リセットしたい場合は、make clean して dbdata/ を削除してください。

設定ファイル

以下、設定ファイル一式です。

docker-compose.yml

docker-compose up -d, docker-compose down に必要な大本の設定です。

version: "3.7"
services:
  web:
    build: ./docker/web
    environment: &app-environment
      DATABASE_URL: "mysql://my_app:secret@dev-db/my_app?encoding=utf8mb4&timezone=UTC&cacheMetadata=true"
      DATABASE_TEST_URL: "mysql://my_app:secret@dev-db/test_myapp?encoding=utf8mb4&timezone=UTC&cacheMetadata=true"
      PHP_IDE_CONFIG: "serverName=localhost"
    volumes:
      - ./:/var/www/html:cached
      - ./docker/web/php.ini:/usr/local/etc/php/php.ini:cached
    working_dir: /var/www/html
    ports:
      - "8000:80"
  php-cli:
    build: ./docker/web
    environment:
      <<: *app-environment
    volumes:
      - ./:/var/www/html
      - ./docker/web/php.ini:/usr/local/etc/php/php.ini
    working_dir: /var/www/html
  dev-db:
    image: mysql:5.7
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
    hostname: dev-db
    container_name: dev-db
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: my_app
      MYSQL_USER: my_app
      MYSQL_PASSWORD: secret
    volumes:
      - ./docker/mysql:/docker-entrypoint-initdb.d:cached
      - ./dbdata:/var/lib/mysql:cached
    ports:
      - "3306:3306"
  composer:
    build: ./docker/composer
    volumes:
      - ./:/app:cached
      - ./docker/web/php.ini:/usr/local/etc/php/php.ini:cached
    working_dir: /app

docker/composer/Dockerfile

Composer パッケージのインストールが早くなるよう、composerコンテナにhirak/prestissimo: composer parallel install pluginを追加しました。

FROM composer

RUN composer global require hirak/prestissimo

docker/mysql/001_initialize_database.sh

MySQL の公式コンテナは1つ目のデータベースは環境変数で指定できるのですが、それ以上は指定する方法がなさそうだったので初回起動時に作成するためのものです。

#!/bin/sh

echo "CREATE DATABASE IF NOT EXISTS \`test_myapp\` ;" | "${mysql[@]}"
echo "GRANT ALL ON \`test_myapp\`.* TO '${MYSQL_USER}'@'%' ;" | "${mysql[@]}"
echo 'FLUSH PRIVILEGES ;' | "${mysql[@]}"

docker/web/Dockerfile

webとphp-cliコンテナのためのDockerfileです。CakePHPアプリ向けにintl拡張、pdo_mysql拡張を追加して、ドキュメントルートを変更しました。

FROM php:7.2-apache

RUN apt-get update && apt-get install -y --no-install-recommends \
        nano \
        libicu-dev \
    && rm -rf /var/lib/apt/lists/*

RUN docker-php-ext-install intl \
    && docker-php-ext-install pdo_mysql \
    && pecl install xdebug \
    && docker-php-ext-enable xdebug

ENV APACHE_DOCUMENT_ROOT /var/www/html/webroot

RUN a2enmod rewrite

RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf

docker/web/php.ini

デバッグの切り替えをBookmarkletで制御したかったのでautostart をOffにして、idekeyを有効にしてあります。

; timezone
date.timezone = Asia/Tokyo

; error reporing
log_errors = On
error_log = /dev/stderr

; xdebug
xdebug.remote_enable = On
xdebug.remote_autostart = Off
xdebug.remote_connect_back = Off
xdebug.remote_host = docker.for.mac.localhost
;xdebug.remote_port=9000
xdebug.idekey=phpstorm

Makefile

migratetest を追加しました。

all: install up
.PHONY: all

up:
  docker-compose up -d
.PHONY: up

install:
  docker-compose run composer install --ignore-platform-reqs --no-interaction
.PHONY: install

migrate:
  docker-compose run php-cli bin/cake migrations migrate
.PHONY: migrate

test:
  docker-compose run php-cli ./vendor/bin/phpunit
.PHONY: test

clean:
  docker-compose down
.PHONY: clean

第133回 PHP勉強会@東京で「PhpStormとPHPUnitを連携してユニットテスト作成を楽にする」というテーマで発表しました

CakePHP Advent Calendar 2018の3日目でCakePHP2 アプリでも PHPUnit と PhpStormを連携させるという記事を書きました。 実はこの連携と、連携することによってテスト作成が楽になる、という話は意外と知られていないのでは、と思い、PHP勉強会では初めての20分枠で発表することにしました。(PHPカンファレンス2018の会場から参加登録しました 笑)

20分枠でしたが内容を詰めていく内に以下の内容を削りました。

少し早口だったと思いますが20分に収まって良かったです。

日本PHPユーザ会のみなさん、参加してくださったみなさん、会場を提供していただいたGMOインターネットさん 発表の場をいただき、ありがとうございました!