YYPHP#56「竹原のコードのIssueを見る、LinuxコマンドやApacheの設定をどうやって学んでる？『return falseを返すのか、例外を投げるのか』その使い分、PHPにも転用できるJavaの知識、技術書典5に参加してみての感想・体験談、Laravelの何がすごいのか、YYPHP推薦図書 (技術書典5)」

これは2018年10月12日に開催したPHPerイベント[YYPHP#56]のイベントレポートです。

[YYPHP]は一言で「PHPerの部室」です。PHPについて、雑に、ゆるく、ワイワイ話し合う集いです。毎回お題を決めずに雑談を出発点にいろいろなことを突発的にやります。集まった人でコードリーディングをすることもあれば、一緒に開発ツールを触ってみたり、フレームワークについての情報交換をすることもあります。開催はほぼ**毎週**、高田馬場にて。

[YYPHP#56]: https://yyphp.connpass.com/event/103258/
[YYPHP]: https://yyphp.connpass.com/
YouTubeでの配信映像はこちら-> [#YYPHP #56【PHPの情報交換・ワイワイ話そう・仲間作り・ゆるめ・にぎやかめ】](https://youtu.be/tK1YgaoRqeY)

![](https://qiita-image-store.s3.amazonaws.com/0/889/0051f99f-b555-6064-fcc9-3280e5543a1a.png)

## 参加者13名(うちリモート5名)

* PHP歴
    * 1年未満: 3名
    * 1年: 1名
    * 2年: 2名
    * 6年: 1名
    * 10年以上: 3名
    * 不明: 3名

## 竹原のコードのIssueを見る

* [コードを良くする · Issue #1 · nouphet/get-connpass-member-list](https://github.com/nouphet/get-connpass-member-list/issues/1)

```php
<?php
require_once("./phpQuery-onefile.php"); // todo: require, require_onceなどは関数ではなく言語構文なのでカッコを書かない

// 取得したいwebサイトを読み込み
$site=$argv[1]; // todo: $siteではなく$urlのほうがいいのでは？
// todo: 代入式の左辺と右辺の間に半角スペースがあったりなかったり、スペースが2こ連続したりしているところが気になる
$site =  $site . 'participation/#participants'; // todo: アンカー(#)はHTTPリクエストでは効果がないため必要ないかも
$html = file_get_contents("$site"); // todo: 文字列変数展開する必要がないので、$siteをそのまま渡せる
// todo: ちゃんとするなら $html が false のときのエラー処理が必要
// 取得したい情報を記述
$doc = phpQuery::newDocument($html);

// todo: 処理の途中に関数を宣言するより、宣言は宣言、処理は処理でまとめ、宣言→処理の順にしたほうがバグりにくい
function get_list($list) { // todo: 関数名get〜は戻り値がある関数を表すのが慣習なので、ここではそれを避けた名前のほうがいい(print_listなど)
    $lines = explode("\n", $list);
    foreach($lines as $line) {
        $line = trim($line);
        if (!empty($line)) {
            echo '* ' . $line . "\n";
        }
    }
    echo "\n";
}
```

## LinuxコマンドやApacheの設定をどうやって学んでますか？

* 質問の背景
    * LinuxのコマンドとかApacheのWebサービスを立てるときの設定を現場でやっているが、そういうのをみんなどうやって学んでるのか聞きたい。
    * Linuxコマンドは入門しにくいイメージがあるのでお聞きしたい。

* コマンドは使う回数を増やすしかない。慣れ。
    * 素振りみたいなもの
* マイサーバを立てて弄り倒す
    * やってみるのが一番
* LAMP環境を作ってみる
* Macでもコマンドラインを使って練習する
    * GitをCLIでやったり
* GUIを使わない縛り
* Ubuntu環境をメインマシンにする(X window systemを使わない)
* 最初はマウスを抜きました
* Linux from scratch (http://www.linuxfromscratch.org/)
* [［改訂第3版］Linuxコマンドポケットリファレンス | 沓名 亮典 |本 | 通販 | Amazon](https://www.amazon.co.jp/%EF%BC%BB%E6%94%B9%E8%A8%82%E7%AC%AC3%E7%89%88%EF%BC%BDLinux%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%9D%E3%82%B1%E3%83%83%E3%83%88%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9-%E6%B2%93%E5%90%8D-%E4%BA%AE%E5%85%B8/dp/4774174041/ref=pd_lpo_sbs_14_t_1?_encoding=UTF8&psc=1&refRID=HRVWY3VKGWWQ17GCD8B8)
    * こんなコマンドあるのか〜というのを知ると使いたくなる
* ベテランの人の操作をみて、学ぶ
    * historyコマンドで出てくるものを知る
    * 先輩が操作したサーバのhistoryを見て盗む
    * 「突撃、隣のhistoryコマンド」

## return falseを返すのか、例外を投げるのか、その使い分を知りたい

* 自分が処理書いていて、問題が発生したとき、return falseを返すのがいいのか、例外を投げるべきなのか知りたい。
* 想定されるものは戻り値にして、それ以外は例外がいいのでは？
* 実装されていないといけないものは例外
* 例外じゃないとできないこと
    * 広域ジャンプ
    * function A が B を呼び出す、Bが C呼び出すとき
        * CからAにジャンプできる
* 本当に例外的な状況には例外を使う
    * もうむりぽっていうとき
    * DBにつながらない
    * ファイルシステムがいっぱい
    * プログラムの中ではどうにもならないとき
* エラーログに残す必要があるとき
    * ユーザ入力が正しくないとかは例外じゃない
    * DBにつながらないとかはログに残したい
* exitと置き換え
    * その後の処理をしても意味無い状況になったときが例外
    * 例えば日付書式になっているかはcheckdate()関数を使えば良く、例外に投げる必要はない
* PHPは大きなくくりとして、runtime exceptionとlogic exceptionがある
* [PHP7 で堅牢なコードを書く - 例外処理、表明プログラミング、契約による設計 / PHP Conference 2016 - Speaker Deck](https://speakerdeck.com/twada/php-conference-2016)
* SPL例外……PHPがデフォルトで提供している例外
* falseを返すのは、何がエラーになったのかがわからないので、処理用のクラスを作って、そこに投げる
* [PHP: 例外 - Manual](http://php.net/manual/ja/spl.exceptions.php)
* [PHP でどのように Exception/RuntimeException/LogicException を使い分けるか - Qiita](https://qiita.com/tanakahisateru/items/e3e24f3825c4ba0c60e6)
* falseを返すのはおすすめしない
    * 理由
        * falseが何を意味しているのかが暗黙的だから
        * 戻り値の型宣言がしずらくなるから
            * `function hoge(): int | bool` みたいな複数の型を返す型宣言がPHPではできないため、mixedだらけになってしまう
    * 代わりに、成功オブジェクトか問題オブジェクトを返すようにするといい
        * 以下サンプルコード

```php
interface Result {
    public function isValid(): bool;
}

final class Failure implements Result {
    public function __construct(string $reason) {
        $this->reason = $reason;
    }
    public function isValid(): bool { return false; }
    public function getReason(): string { return $this->reason; }
}

final class Success implements Result {
    public function isValid(): bool { return true; }
}

final class DateValidator {
    public function validate(string $value): Result {
        if ($this->isValidDate($value)) {
            return new Success();
        } else {
            return new Failure("なんかおかしい");
        }
    }
    private function isValidDate(string $value): bool;
}

$validator = new DateValidator();
$result = $validator->validate('2018-10-12');

if (!$reuslt->isValid()) {
  return $result->getReason();
}

if ($result->isValid()) {
  // 後続処理
}
```

* [ポケモン例外ハンドリング : まだプログラマーですが何か？](http://dotnsf.blog.jp/archives/1061565357.html)

## PHPにも転用できるJavaの知識について

* 型宣言、戻り値の型
* interfaceとかオブジェクト指向のコード
* PHPとJavaの共通点を学んでいくことで、JavaからPHPに来たときに役立つようにする
* オブジェクト指向の本はサンプルコードがJavaなことが多いから、PHPerもJavaを知っておいたほうがいい
* Java10はモダンでいい言語
* Kotolinでcoroutineがサポートされる
* Go2でgenericsがサポートされる
* JavaはPHPより良い言語？
    * 大規模はJavaのほうが向いている
    * 3人以上エンジニアがいたらJavaのほうが向いている？
* JavaからPHPに来たとき自由すぎてどう書いていいかわからなかった
* [Basics - Kotlin Programming Language](https://kotlinlang.org/docs/reference/coroutines/basics.html)
* 型づけを丁寧にやっていくといい

## 技術書典5に参加してみての感想・体験談

### このすみさん

* YYPHPを見て買いに来てくれた人がいた
* 書くのにどのくらい時間がかかったか？
    * 9月の土日をすべて使った (140ページ)
* 途中執筆が疲れてビール飲みながら書いてた
* 最初に10章分目次を作って、その中で何を語ろうか箇条書きして書き始めた

### プラムザさん

* 会社で執筆したので経費(印刷代など)を気にしなくていいのでやりやすかった
* 会社のプロモーションにするためにやったので、儲けることは考えてなかった
* 100部以上売れた
    * 初回は80部が普通

### reoring

* 手伝ってるだけで出版してないし、ちょっとしか書いてないから……

## Laravelの何がすごいのかを聞きたい

* なんでこんなに流行ってるのか聞いてみたい
* Laravelエキスパート養成読本によれば([Laravelエキスパート養成読本[モダンな開発を実現するPHPフレームワーク！]：書籍案内｜技術評論社](http://gihyo.jp/book/2015/978-4-7741-7313-9))
    * アメリカで熱狂的な拡散者がいる
        * Laracastの人
        * 無償でPHPやエディタの使い方を広めている
    * 日本でなぜLaravelがファーストチョイスに入っているかはなぜかわからない
        * Laravel以外の選択肢がないと思う
        * CakeのドキュメントよりもLaravelのドキュメントのほうが読みやすい
* Cakeと比べるとファイル名を気にしなくてよくて自由
* フレームワークを選ぶときの観点
    * コミュニティのデカさ
        * 大きいと聞ける人が多い
        * 扱える人が多いので外注しやすい
        * 情報の多さ
    * エコシステムがちゃんとしているのが良い
        * コミュニティが大きいとしっかりしている
    * Laravel Newsというサイトがあって、毎日新しいニュースを出してくる
        * https://laravel-news.com/
* Laravel自体のソースコードの読みやすさ
* Collectionがすごい
* スタートアップでよく使わないといけないログインや決済の機能がLaravelの公式っぽいパッケージで入ってる("battery included"なところがいい)
    * Railsだと自分で選定しないといけなが、Laravelだと迷わなくていいから使い出しやすい
    * https://laravel.com/docs/5.7/billing
* バージョンアップのときは大変じゃないか？
    * マイナーバージョンアップだと、ここをこうしろというマニュアルも一緒に公開されるので、そのとおりやればいいのでそんな大変じゃない
    * アップデートされるたびについていけばやりやすいと思う
* 最近はVue.jsからLaravelに来る人がいる
    * フロントエンドをやってて、データどうするかとなったときにLaravelが選択肢に入る

## YYPHP推薦図書 (技術書典5)

* [絶対に挫折させないアプリ開発　はじめてのLaravel - plumsa - BOOTH](https://booth.pm/ja/items/1048008)
* [#マンガでわかるDocker ② 〜開発環境を作ろう編〜 ダウンロード版 #技術書典 5 - 湊川あいの、わかば家。 - BOOTH](https://booth.pm/ja/items/1036317)
* [マンガ #告白に学ぶHTTPステータスコード 〜エラー編〜 #技術書典 5 - 湊川あいの、わかば家。 - BOOTH](https://booth.pm/ja/items/1036373)
* [技術書を書く人のための得する制度、損する行動 - masuipeo - BOOTH（同人誌通販・ダウンロード）](https://masuipeo.booth.pm/items/1039971)
* [PHP中級者を目指す 〜言語を使いこなすための本〜 - このすみ堂 - BOOTH（同人誌通販・ダウンロード）](https://konosumi.booth.pm/items/1025112)
* [エンジニアアンチパターン 〜失敗に学ぶエンジニアリング〜 - このすみ堂 - BOOTH（同人誌通販・ダウンロード）](https://konosumi.booth.pm/items/1025135)

## YYPHPは毎週やってます

PHPについてワイワイ話したい方は、[YYPHPのイベント情報](https://yyphp.connpass.com/)をチェックしてみて下さい。

以上、YYPHPのレポートでした。次回もワイワイやっていきたいと思います！ では、また来週！