こもろぐ @tenkoma

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

広告:本ブログで紹介している書籍等商品の紹介でAmazonアソシエイトを利用していることがあります。

PhpStorm でコードを理解する (経緯をたどる編)

PhpStorm でコードを理解する (コードを読む・構造を知る編)の続き。

経緯をたどる

コードを理解するために、コードが変更された経緯を理解するのが有効なこともある。そんなときに使える機能をまとめる。

Git連携

Git連携のLog機能・History機能(ファイル・ディレクトリの変更履歴)も便利だが、経緯をたどるために便利なのがAnnotate機能。

Annotate機能(git blameと同等)

  • ショートカットキー未設定・エディタの右端の行番号を右クリックして「Annotate」を選択

コード行ごとに最終変更日時・変更者が確認できる機能。「バグを埋めだ犯人捜し」に使うわけじゃないよ!

f:id:tenkoma:20190321175735p:plain
Git Annotate機能

日付・変更者名をクリックすると、同じコミットで変更したファイル一覧が表示できる

f:id:tenkoma:20190321180600p:plain
Annotate → Paths Affected in Revision

Annotateで表示される各行は右クリックするとコミット・リビジョンに関連付いたいくつかの操作ができるようになっている。

f:id:tenkoma:20190321185323p:plain
Annotate 右クリック

  • Show Diff: その行が最後に変更されたときのファイル変更(Diff)を表示
  • Annotate Revision: その行が最後の変更されたときのファイルを表示
  • Annotate Previous Revision: その行が最後の変更される直前のファイルを表示

GitHub連携

「Find in Pull Request」プラグイン

GitHub.com / GitHub Enterprise を上流リポジトリで使い、プルリクエストを使った開発をしているなら、コード変更の経緯を知るのにこのプラグインが便利。

エディタ行で右クリックして「Find Pull Request」を選択

f:id:tenkoma:20190321183119p:plain
Find Pull Request機能

getAlias() が変更されたプルリクエストのfiles 3.4 Remove more deprecated function calls by antograssiot · Pull Request #10009 · cakephp/cakephpにジャンプした。

目次

次はコードを実行する編

PhpStorm でコードを理解する (コードを読む・構造を知る編)

プログラムコードを書くとき、多くの時間を「コードを理解する」ことに費やしていると思う。

PHPコードを読み書きするのに、なぜPhpStormを使っているのか考えたとき、デバッガやバージョン管理が統合されていることも理由としてあるが、コードを理解しやすくするために多くの機能が備わっていることも理由の一つだった。

「PHPコードを理解する」という視点でPhpStorm の便利な機能をまとめてみると面白そうだなぁ、と思ったのでまとめてみる。 (PHPコードの文法をある程度理解している方向け)

分類

雑多に説明するより、とりあえず分類してみるとわかりすくなると思ったので4つに分ける。

コードを読む・構造を知る

コードを理解するのに最も基本的で必須なのがコードを読むこと。 また全体像を大雑把に把握するためにプログラムの構造を知ることも必要になってくる。 そのための機能を紹介する。

コードジャンプ

  • Mac:Command+B, Win: Ctrl+B
  • Command または Ctrl を押しながらシンボル(クラス名・メソッド名…)をクリック

大きく2つの機能がある

  • クラスやメソッドを利用してる箇所から定義元にジャンプする機能
  • 定義元から、利用する箇所を一覧・ジャンプする機能

f:id:tenkoma:20190317194745p:plain
定義元から利用箇所にジャンプする

コードが1ファイルで完結しないとき(チーム開発だと自然とそうなると思う)、読み込んでいるコードを理解したくなることはよくある。 サードパーティーライブラリのコードを理解したくなることもよくある。 そんなときコードジャンプを多用しながら構造を理解する。ジャンプ前のコードに戻るときは Mac:Command+[, Win: Ctrl+Alt+←

Quick Definition

Mac:Option+Space, Win: Shift+Ctrl+I

f:id:tenkoma:20190413213136p:plain
Quick Definition

メソッド呼び出し先のファイルに移動する前にコードをちょっとだけ確認したいとき使える

File Structure (ポップアップ) / Structure パネル

File Structure (ポップアップ): Mac:Command+F12, Win: Ctrl+F12

f:id:tenkoma:20190413204916p:plain:w300
File Structure (ポップアップ)

Structure パネル: Mac:Command+7, Win: Alt+7

f:id:tenkoma:20190317193032p:plain:w300
PhpStorm Structure パネル

クラスやインターフェイスのプロパティ・メソッドを一覧できる。 どんなメソッドを持っているのか把握するのに使う。 継承したメソッドを表示することもできる。 移動するときに一時的に表示したいなら、File Structure (ポップアップ), 常時表示させたいならStructure パネルで。

クラス・メソッドを開く(ナビゲート機能)

クラス・メソッド名は分かってるけど、ファイルツリーから辿るのは面倒くさい。

  • クラス: Mac:Command+O, Win: Ctrl+N
  • シンボル(クラス・メソッド・プロパティ): Mac:Command+Alt+O, Win: Shift+Ctrl+Alt+N

f:id:tenkoma:20190317201228p:plain
シンボルを開く(ナビゲート機能)

クラスやメソッドにアクセスしたいとき、覚えておくと全文検索(Find in Path)より楽になる。

クラス階層を表示(Show Diagram)

Mac:Command+Alt+Shift+U, Win: Shift+Ctrl+Alt+U

f:id:tenkoma:20190317202018p:plain
Show Diagram機能

あまり使ったことは無い。クラス階層が深いとき、全体像を理解するのに使えるかも。メソッド・プロパティを表示することもできる。

呼び出し階層を表示 (Call Hierarchy)

Mac:Ctrl+Opt+H, Win: Ctrl+Alt+H

f:id:tenkoma:20190413210842p:plain:w300
Hierarchy: callers (呼び出し元)

f:id:tenkoma:20190413210923p:plain:w300
Hierarchy: callees (呼び出し先)

メソッドの呼び出し元、呼び出し先をツリー表示して、たどれる機能

次は「経緯をたどる」編

目次

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など)