こもろぐ @tenkoma

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

55型有機EL TVとサウンドバーの感想

55型有機EL TV (OLED55C8PJA)

ヨドバシ.com - LGエレクトロニクス OLED55C8PJA [有機ELテレビ 55V型 4K対応 OLED55C8P]

1年前発売・有機EL 55型で一番安いLG製を購入。10年前に買ったSHARP製32型液晶からの買い換え。 NetflixとAmazon Prime, Youtube, Nintendo Switch用に。

良かったと思うところ

  • 黒が黒い
  • いままでPC接続でEIZO FlexScan 27.0インチ ディスプレイモニター (4K UHD/IPSパネル/ノングレア/ブラック/USB Type-C搭載/5年間保証&無輝点保証) EV2785-BKでNetflixを見てたけど、Safariで見ないと高画質にならないらしく不便でした。あとPCを操作しないといけないので、早く見たいとかながら見とかしにくい。そのあたりの障害が取り除かれました
  • Nintendo Switchをスリープ解除したらTVも起動してHDMIに自動切り替えしてくれるので楽
  • リモコンが変な形だけど、直立できるのは便利かもしれない
  • サウンドバーとHDMI 接続してる。両方がHDMI-ARCという仕様に対応してて、別途線を付けなくてもいいし、TVのリモコンでサウンドバーの音量を操作できる

いままであった32型液晶は過去7年くらい、地上波を見なくなって、ほぼ使ってなかったけど、これはNetflix, Amazon Prime, YouTube用に長く使えそうな気がします。 4Kはコンテンツがまだ少ないと感じる。Amazon Primeの4Kコンテンツは綺麗ですが、まだまだ数が少ない。

微妙なところ

  • 電気代。55型だし仕方ない…
  • フレーム補完機能。既定でオンですが、オフにしてます

サウンドバー

ヨドバシ.com - ヤマハ YAMAHA YAS-408(B) [MusicCast BAR 400 フロントサラウンドシステム]

薄型テレビはスピーカーが弱いらしい、ということで。あとSpotify ConnectとBlueToothスピーカー機能目当て。 いままで使っているスピーカーはGX-D90(Y) (色違いのGX-D90(B)はまだ新品を売ってる)を、大学のときから15年くらいPCスピーカーとして使っていて、壊れるまでこれでいいや、と思ってますが、TV用に別途欲しくなり。

良かったところ

  • TVの電源に連動して自動ON/スリープしてくれる
  • Spotify Connect は期待通り。PCでもスマホでも操作できて、スピーカーは同一のものが使える
  • iPhone/MacのiTunes/ミュージックアプリからの再生でも自動電源ON/スリープしてくれる
  • サブウーファー(いままで使ったことない)、いままで聞いてた曲を再生しても、聞こえなかった低音が出るので良かった。

微妙なところ

  • どうしようもないことかもしれないけど、Bluetooth 経由の再生開始に1秒強の時間がかかるのが気になる

ドラム式洗濯機 Cuble (NA-VG2300L-X) 感想

ヨドバシ.com - パナソニック PANASONIC NA-VG2300L-X [ななめドラム式洗濯機 Cuble(キューブル) 洗濯・脱水10kg/乾燥5kg 左開き プレミアムステンレス]

同僚に「ドラム式は人権だ」、と言われたので、高いものを買いました! ヨドバシカメラ秋葉原で28万円、ポイント差し引いて5年保証を付けて実質24万ちょいで購入。 洗濯物を入れてボタン2つ(電源、スタート)を押すと3時間後に乾燥して出てくる魔法の箱を手に入れた、という感じです。 10年ほど、ずっと部屋干ししていたので、以下の手間が無くなりました。

  • 洗剤を洗濯前に入れる手間
  • 洗濯後に干す手間
  • 乾燥後に洗濯物を取り込む手間

いままで使っていた縦型の洗濯機(8年前購入)にも乾燥機能は付いていましたが、シワだらけになったので、2, 3回使ってやめました。 ドラム式だからかシワも気にならなくて、毎回乾燥させてます。

電気代が増えたかどうかについては、まだよく分からないです。 同時期にテレビも買ったので、そちらでは増えてる気がします。

12年ぶりにまとめて家電を買った

いま使っているものがだいたい8〜12年使っているものばかりで、オーブンレンジと冷蔵庫は使えなくもなっている。 便利なものが出てきているらしいのでまとめて買い換えることにしました。勢いが大事…

すべてヨドバシカメラアキバかヨドバシ.comで買ったのでヨドバシのリンクも付けます。

商品を使ったら感想も書きたい。

ドラム式洗濯機

同僚にドラム式を強くお勧めされました。 洗濯物を干す必要がなくなると、自由な時間が増えるということらしいので、高価なものを買いました。

ヨドバシ.com - パナソニック PANASONIC NA-VG2300L-X [ななめドラム式洗濯機 Cuble(キューブル) 洗濯・脱水10kg/乾燥5kg 左開き プレミアムステンレス]

ドラム式洗濯機 Cuble (NA-VG2300L-X) 感想書きました。

冷蔵庫

12年前にリサイクルショップで購入したものが最近壊れたので。 上にオーブンレンジを載せられて、自動製氷機能がついてるものがAQUAしかなかったです。

ヨドバシ.com - AQUA アクア AQR-SV24H(K) [冷蔵庫(238L・右開き)ヴィンテージブラック]

買ってから3週間後

まだ飲み物くらいしか入れてない。自動製氷は便利。

オーブンレンジ

同じく12年前にリサイクルショップで購入したものが最近壊れたので。

ヨドバシ.com - シャープ SHARP AX-CA450-W [ウォーターオーブン ヘルシオ 18L 1段調理 ホワイト系]

まだレンジ機能しか使ってない

テレビ

Netflix とNintendo Switch用で、地上波はあまり見ないと思います。

ヨドバシ.com - LGエレクトロニクス OLED55C8PJA [有機ELテレビ 55V型 4K対応 OLED55C8P]

サウンドバー

ヨドバシ.com - ヤマハ YAMAHA YAS-408(B) [MusicCast BAR 400 フロントサラウンドシステム]

コードレス掃除機

ダイソン 掃除機 コードレス Dyson Cyclone V10 Fluffy SV12FF SV12 FF

ダイソン 掃除機 コードレス Dyson Cyclone V10 Fluffy SV12FF SV12 FF

ヨドバシ.com - ダイソン Dyson SV12FF [Dyson V10 Fluffy コードレススティッククリーナー ニッケル/アイアン/コッパー]

コードレスは便利。重いけどハンドクリーナーにもなる。集塵部分が丸見えなので、定期的に捨てられる。 付属のアタッチメントを付け替えるとベッドの掃除もできる。有名な白い粉(ハウスダスト)が取れるので週1で掃除するようになる。

PHPerKaigi 2019にて「PhpStormでコードを理解する技術」というテーマで発表しました

2019年3月29〜31日にかけて開催されたPHPerKaigi 2019の2日目に発表してきました。

KeynoteファイルもDropboxで公開します。 こちらは、そのうち削除するかもしれません。

この発表はイベントの少し前に公開した以下の4記事+補足記事で説明した話を15分のダイジェスト版という位置づけで発表しました。

PHPプロジェクト向けの定番IDEであるPhpStormに使い慣れていくと、「コードを理解する」というシンプルな目的のためでも多くの機能を使ってると思ったので、それをまとめるだけでもコンテンツになりそうだな、と思って応募しました。

発表にあたりいろいろな先人の記事を参考にし、Twitterで知らなかったテクニックを教えて頂きました。特に5名の方にあらためて感謝いたします。

PHPerKaigi 2019に参加して

参加者同士の交流を促進するための仕掛けがよく練られていてすごいと思いました。特によいと思ったのが

  • PHPerチャレンジ
  • (去年に引き続き)Interactive Round Table
  • お茶会(懇親会)でのボードゲーム

です。ボードゲーム以外参加できませんでしたが…。

2週間くらいまえからブログ記事で作っていったのですが、肝心のスライドが前日まで完成せず、1日目はずっともくもくコーナーで資料作成していたため、セッションの聴講や参加者とのコミュニケーションができず辛かったです、次は事前に準備をして望みたいです。

PhpStorm でコードを理解する (テストコードを読む・実行する・書く編)

(※諸事情によりテスト実行の準備を省略している、後で加筆したい。)

テストコードを読む

もし、前述のフィボナッチ数列を出力するコードにテストコードがあれば、コードを実行しなくても理解できた可能性が高い。テストコードは、欠陥の検出につかうツールでもあり、コードの振る舞いについて表現したドキュメントにもなるからだ。

フィボナッチ数列を出力するコード(再掲)

<?php
// nazono.php
function nazono() {
    $a = 0;
    $b = 1;
    for ($i = 1; $i <= 10; $i++) {
        $l = $a;
        $a = $b;
        $b += $l;
        print "$a\n";
    }
}
nazono();

nazono() 関数がどのように使われているか調べようとして、定義箇所で、Command+B (Mac), Ctrl+B (Win)を押したときに、テストコードが引っかかったらラッキーかもしれない。移動してみよう。

f:id:tenkoma:20190324201231p:plain
nazono() 関数がテストコードから呼び出されていたら…

ちなみにテストコード例。

<?php
namespace Nazono\Tests\Unit;

require_once __DIR__ . '/../../nazono.php';

class NazonoTest extends \PHPUnit\Framework\TestCase
{
    public function testNazono()
    {
        // 実コードを呼び出す
        nazono();
        // 想定した出力
        $expectOutput = <<<OUT
1
1
2
3
5
8
13
21
34
55

OUT;
        $this->expectOutputString($expectOutput);
    }
}

期待される出力がテストコードに書かれている。 コードを実行した結果をみるのと同じ効果が得られるのがわかると思う。

テストを実行する・書く(変更する)

  • Mac: Shift+Ctrl+R, Win/Linux: Shift+Ctrl+F10

上記のテストを実行してみる、成功したら、「生きた」テストであることがわかる。

f:id:tenkoma:20190324205815p:plain
PhpStorm から NazonoTest テストを実行した

失敗したら、実コードかテストコードのどちらかが間違っている可能性がある。*1

もしプログラムの正しい振る舞いが分かっていれば、テストコードか実コードを変更することで、実コードへの理解が深まるかもしれない。 テストを書くのが楽になる機能に「Auto-test」がある。有効にすると、ファイル変更を検知して、自動で再テストしてくれる。

f:id:tenkoma:20190327001651p:plain
Auto-test ボタン

もし複雑なコードを良く理解しないといけない場合、テストがコードを理解するためのツールになると思う。

目次

*1:それ以外の、テストのセットアップができていない可能性もある

PhpStorm でコードを理解する (コードを実行する編)

コードを実行する

コードを見ただけでは、全体的に何をやっているのかわからない、ということがよくあると思う。 例えば、以下のコードは何を出力しているコードでしょうか? (変数名などは意図的に不親切な感じにしてある)

<?php
// nazono.php
function nazono() {
    $a = 0;
    $b = 1;
    for ($i = 1; $i <= 10; $i++) {
        $l = $a;
        $a = $b;
        $b += $l;
        print "$a\n";
    }
}
nazono();

プログラムを眺めただけで分かる人もいれば、ずっと見ていてもわからない人もいるかもしれない。 今回は、実行・デバッグしてみてプログラムを理解する方法について解説する。

Run 機能を使ってスクリプトを実行する

まず、新規プロジェクトを作成し、nazono.php を保存する。素朴にphpコマンドで実行してみると以下のように出力される。 10番目までのフィボナッチ数を出力するプログラムだった。(わかりにくくするために再帰を用いていない)

$ php nazono.php
1
1
2
3
5
8
13
21
34
55

PhpStormと連携するCLI環境をDockerで用意してからProjectパネルで nazono.php を右クリックし、「Run 」とRunパネルに以下のように表示される。

f:id:tenkoma:20190323181543p:plain
Docker環境でPHPスクリプトを実行する

ここまでは、少ない設定でPHPスクリプトが実行できるようになることを示したかっただけで、Debug 機能の説明で本題に入る。

Debug 機能でスクリプト実行中の状態を確認しながら実行する(デバッグ実行)

理解しづらいコードを、デバッグ機能を使ってプログラム実行中の状態を確認しながら理解する方法について説明する。もし、手元にPHPデバッグ環境がない場合はXdebugでデバッグできる最低限のWebサーバを用意するの手順で準備してほしい。

PHPプロジェクトの多くはWebプロジェクトなので、ブラウザからアクセスしてデバッグしてみる。

f:id:tenkoma:20190324145634p:plain
PhpStorm プロジェクトの状態

[Xdebugでデバッグできる最低限のWebサーバを用意する]で準備した状態は上記のようになっていて、docker-compose up -d でコンテナを起動し、 http://localhost:8000/nazono.php にアクセスすると以下のように表示される。

f:id:tenkoma:20190324150349p:plain
ブラウザから http://localhost:8000/nazono.php を実行

ではリモートデバッグしてみる。

  • PhpStorm右上のf:id:tenkoma:20190324150534p:plain:w28をクリックしf:id:tenkoma:20190324150530p:plain:w31の状態にする(Xdebugの通信を受け付ける状態にする)
  • nazono.php 10行目右側をクリックしを表示する(ブレークポイントを作る)

この状態でもう一度ブラウザからアクセスするとブレークポイント行背景が青くなり、プログラム実行が一時停止していることがわかる。

f:id:tenkoma:20190324172152p:plain
10行目でブレークしたところ

ブレークすると、Debugパネルで変数の状態を確認できる。またエディタ上で変数が変化したときにその行の右側に内容が表示される。

ループで実行されていることを理解するために、一時的に各ループごとの $i, $a, $b の値をログに残したくなったら、ログ機能がつかえる。

10行目のブレークポイントを右クリックして「More」を選ぶとダイアログが表示されるので以下のように入力する

f:id:tenkoma:20190324174520p:plain
Breakpointsダイアログ

  • 「Evaluate and log」をチェックし、"\$i=$i, \$a=$a, \$b=$b" と入力し、「Done」で閉じる

この状態でデバッグ実行すると、DebugパネルのConsoleタブに変数の状態が出力される。

f:id:tenkoma:20190324175328p:plain
Consoleパネル

ConsoleパネルはREPLを兼ねていて、任意のPHPコードをその場で実行できるし、コード補完も効く。

コードを実行しながらコードを読んでブレークしてさらにコードを実行する…そんな試行錯誤でコードを理解する機能になっている。

目次

次はテストコードを読む・書く編

PhpStormと連携する必要最小限のDocker環境を作る

PhpStormネタをまとめるときに、Docker環境の設定の話は分離しておきたいと思ったので独立した記事にする。

はじめに

Docker を利用すると、Dockerfileやdocker-compose.ymlを使って、PHPアプリ開発環境の設定を手軽にチームで共有できるため、プロジェクトのコードをgit cloneしたあとにすぐ起動できる環境を用意するのに適している。 またPhpStormは、Dockerを使って用意したPHPアプリ開発環境と連携できる機能がある。 そこで、PhpStormの連携機能や、PHPコード自体を手軽に試せるよう、シンプルなPHP CLI環境とXdebugデバッグできるWebサーバ環境について説明する。

目次

PhpStormと連携するCLI環境を用意する

f:id:tenkoma:20190324015022p:plain
php:7.3-alpine でPHPスクリプトを実行する

標準で組み込まれていない拡張が不要であれば、Dockerfile や docker-compose.yml をつくる必要はない。

設定方法

f:id:tenkoma:20190323180544p:plain
DockerでPHP実行環境を用意する

  1. Preferences を開く
  2. 左メニューでPHPを選ぶ
  3. CLI Interpreter 右側の 「...」 を選ぶ
  4. CLI Interpreterダイアログで 「+」 を選び、「From Docker, Vagrant, VM, Remote... 」を選ぶ
  5. Configure Remote PHP Interpreterダイアログで、「Docker」を選び、Image name に php:7.3-alpine と入力
  6. OK を3回選びPreferencesを閉じる(Dockerイメージのダウンロードとコンテナ起動が行われる)

設定後、最初の画像のように実行するのは Docker のコマンドで言えば

docker run -it -v `pwd`:/opt/project php:7.3-alpine php /opt/project/phpinfo.php

が近そう。

Xdebugでデバッグできる最低限のWebサーバを用意する

f:id:tenkoma:20190324021419p:plain
XdebugデバッグできるWebサーバを含むDocker環境

PHP (Docker Official Images) にはXdebugがインストールされていないので、 Dockerfile で、カスタマイズしたコンテナをつくる。(なるべく Unofficial なイメージは避けたい) また、ホストディレクトリをコンテナにマウントする設定を docker-compose.yml に書く。(必須ではないが、PhpStormの設定をするときにPath Mappingを自動的に読み込んでくれるので)

設定方法

まずプロジェクトフォルダに以下の Dockerfile, docker-compose.yml, php.ini を保存する

Dockerfile

FROM php:7.3-apache

RUN apt-get update \
  && pecl install xdebug \
  && docker-php-ext-enable xdebug

docker-compose.yml

version: "3.7"
services:
  web:
    build: ./
    volumes:
      - ./:/var/www/html:cached
      - ./php.ini:/usr/local/etc/php/php.ini:cached
    working_dir: /var/www/html
    ports:
      - "8000:80"

php.ini

[xdebug]
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20160303/xdebug.so
xdebug.remote_enable = On
xdebug.remote_autostart = On
xdebug.remote_host = host.docker.internal

設定確認用に phpinfo.php をつくっておく。

phpinfo.php

<?php
phpinfo();

2行目の行番号右をクリックしてブレークポイントを追加しておく。(赤い丸🔴が表示される)

Terminal を開いて、プロジェクトフォルダに移動し、 docker-compose up -d と実行すると、Webサーバのコンテナが起動する。 次にPhpStorm右上の「Start Listening for PHP Debug Connections」をクリックする。

f:id:tenkoma:20190323194352p:plain
Start Listening for PHP Debug Connectionsというボタン

🚫のようなアイコンが無くなった状態で http://localhost:8000/phpinfo.php にアクセスすると以下のようなウインドウが開くので、「Accept」を選ぶ。

f:id:tenkoma:20190324022237p:plain
Incoming Connection From Xdebugウインドウ

先ほど作ったブレークポイントの行背景が青くなったら設定成功。以下のように実行中のグローバル変数が見られるようになっているはず。

f:id:tenkoma:20190324021419p:plain
XdebugデバッグできるWebサーバを含むDocker環境

Webアプリケーションだし、DBサーバも欲しいとき

Laradock を使ってみるのがよさそう。

環境構築の理解を深めるためにtenkoma/cakephp3-app-skeletonをつくってみた。説明は省略。

目次