カフェでプログラミングしてる風（でも何もやってない）php版

こんにちは！

久しぶりの投稿になります。kamotetuです。

[こちらの記事](https://qiita.com/torifukukaiou/items/b70dc5476762225cd4a2)を読んでたら、まだphpがなかったので作ってみました。

後発ですが、そんな大した内容ではないので暇つぶしに読んでもらえたらと思います。

あと、英語苦手なので、ターミナルに出力される英語はニュアンスで感じ取ってください。

php7.3
os mac

### 実際の挙動

![ezgif.com-gif-maker (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480146/ffa7dfc0-f2fd-1748-cf8c-e7a6db5f46e6.gif)


こんな感じになります。

processて何のプロセスやねんて感じですが、まぁIT知らない人が後ろから覗き込んだら「おぉ!?」てなるんじゃないかと。
あと、イメージしたのはdockerのbuildとhomebrewのインストールをイメージしました。
まー似てるか似てないかは皆さんの判断に任せます。

で、このままでは普通なので、たまにエラーが発生するようにしました。

![ezgif.com-gif-maker (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480146/b4ea2801-d7d5-8214-adec-bf3581558fca.gif)

いい感じになんかのファイルのエラー箇所っぽい出力がされてますね。

で、エラーが発生したら、修正するか尋ねられますので、yかNを入力します。

Nを入力したらプログラムは終了します。

yを入力したら修正コードを入力します。

コンソール上で修正コードを打ち込むて実際あるのかわかりませんが、まぁ仕事してる感が出るんじゃないかと。

![ezgif.com-gif-maker (3).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480146/349f01ff-c5cf-3ddf-c3ba-ddff8a8e00b6.gif)

録画に焦ってy/nを求める箇所で適当な文字列を入力して弾かれてますが、まぁちゃんとy/Nの制御ができていると言うことで。

で、たまに出るerrorを修正(適当に入力すると直る)しつつ一定の確率で処理が終了します。

![ezgif.com-gif-maker (4).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480146/fc85a8fc-16f2-cfcc-fa79-25ad33575d2b.gif)

終わり間際にもう一度実行しますか的なy/Nを求められますが、お腹いっぱいならNを入力します。

![ezgif.com-gif-maker (5).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480146/74c4f369-d856-c9e6-2609-2aba1f00e574.gif)

Have a nice day!と元気付けてくれたあと処理が終了します。

ちなみにyを入力すると、Start the process...から再スタートします。
コーヒーが飲み終わってなかったらyを入力してください。

という感じです！


### こだわったところ

エラーが発生したときのエラー箇所を表示するところをそれっぽくしました。
多分プログラマーなら同じようなものを何度も目にしているはず。

あと、「カフェでプログラミングしてる風」シリーズを全部ではないですが読ませていただいて、「実際に手を動かして仕事している風」なプログラムは[キーボードをかたかたするだけでコーディングしてそうなやーつ](https://qiita.com/YottyPG/items/e988ebacab94a8f4645f#3-%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%82%92%E3%81%8B%E3%81%9F%E3%81%8B%E3%81%9F%E3%81%99%E3%82%8B%E3%81%A0%E3%81%91%E3%81%A7%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%97%E3%81%A6%E3%81%9D%E3%81%86%E3%81%AA%E3%82%84%E3%83%BC%E3%81%A4)だけかなーと感じたので、ちょいちょい対話式にターミナルを操作していたら、否応でもキーボード触って仕事している風になるのかなと感じたので、リアルにやらないことでも、知らない人が見たらすげーて思うような仕様にしてみました。
(追記)[カフェでプログラミングしてる風（でも何もやってない）JSコード](https://qiita.com/sparrow42/items/8fefe317c926404b31bf)こちらの記事も手を動かす感じとなってましたね！

あとは、homebrewでちょいちょい出てくる🍺 <-こいつを意識して羊🐑 を出力するようにしてみたというのと、出力する文字列を一度に全て表示するのではなく、一定の時間差で文字列を表示するようにすることで、processの#の出力とそうでない出力にメリハリをつけたところです。(ちょっと何言ってるか分からない方は以下のソースコードをコピペして実際にターミナルで確認していただけると嬉しいです！)

### ソースコード

ソースコードは以下になります。

```process_start.php
<?php

const SECS = [
    10,
    100,
    1000,
    10000,
    10000,
    10000,
    20000,
    30000,
    40000,
    50000,
    100000,
    300000,
];

$pound = '#';
$string = '';
$first = true;
$echo_installing = false;
$echo_install_completed = false;
$while = true;
$count = 0;
$loop = true;

echoColorMessageAnimation("Preparing for wake up");
echoPeriodThreeTime(1000000);
echo "\n";

while (true) {
    echoColorMessageAnimation("Do you want to start the process? y/N\n");
    $input = fgets(STDIN, 4096);
    if (preg_match('/\An|no\z/i', $input)) {
        echoColorMessageAnimation("bye!\n");
        die();
    } elseif (preg_match('/\Ay|yes\z/i', $input)) {
        break;
    } else {
        $input = str_replace("\n", '', $input);
        echoColorMessageAnimation("$input is not accepted.\n");
    }
}

while ($loop) {
    echoColorMessageAnimation("Start the process");
    echoPeriodThreeTime(500000);
    echo "\n";
    $start_time = microtime(true);
    while ($while) {
        if ($first || $echo_installing) {
            $id = 'ID: ' . substr(str_shuffle('ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz0123456789'), 0, 10);
            echoColorMessageAnimation($id . ' run the process...', '0;32');
            echo "\n";
            $first = false;
            $echo_installing = false;
        }

        for ($i = 0; 50 > $i; ++$i) {
            usleep(SECS[array_rand(SECS)]);
            echo getColorMessage($pound, "1;30");
        }
        if (mt_rand(1, 10) % 10 === 0) {
            echo getColorMessage(" [error]\n", '1;31');
            $row_number = mt_rand(1, 999999);
            $error_view = '';
            for ($m = 1;5 >= $m;++$m) {
                if ($m === 1 || $m === 5) {
                    $error_view = $error_view . " $row_number\n";
                } else {
                    $text = substr(str_shuffle("ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz0123456789"), 0, mt_rand(10, 20));
                    $spaces = str_repeat(" ", $m * 2);
                    if ($m === 2 || $m === 4) {
                        $error_view = $error_view . " $row_number$spaces$text\n";
                    } else {
                        $error_view = $error_view . getUnderLineMessage("\u{27a4}" . "$row_number$spaces$text\n");
                    }
                }
                ++$row_number;
            }

            echo $error_view;
            echo "\n";

            while (true) {
                echoColorMessageAnimation("Do you want to fix the error? y/N\n");
                $input = fgets(STDIN, 4096);
                if (preg_match('/\An|no\z/i', $input)) {
                    echoColorMessageAnimation("bye!\n");
                    die();
                } elseif (preg_match('/\Ay|yes\z/i', $input)) {
                    echoColorMessageAnimation("Please enter the correction code.\n");
                    fgets(STDIN, 4096);
                    echoColorMessageAnimation("Checking the code");
                    echoPeriodThreeTime();
                    echoColorMessageAnimation("The error was successfully resolved!");
                    break;
                } else {
                    $input = str_replace("\n", '', $input);
                    echoColorMessageAnimation("$input is not accepted.\n");
                }
            }
        }
        echo getColorMessage(" [ok]\n", '0;36');

        $string = '';
        if (mt_rand(1, 10) % 3 === 0) {
            $echo_install_completed = true;
            ++$count;
        }
        if ($echo_install_completed) {
            echoLine('-');
            echo "\n";
            $time = microtime(true) - $start_time;
            $time = substr((string)$time, 0, -5) . "sec";
            echoColorMessageAnimation($time, '1;34');
            echo "\n";
            echoColorMessageAnimation("Completed the process for $id", "0;32");
            echo " \u{1f411}\n";
            $echo_install_completed = false;
            $echo_installing = true;
            echoLine();
            echo "\n";
            $start_time = microtime(true);
            if (mt_rand(1, 100) % 3 === 0) {
                $while = false;
            }
        }
    }
    usleep(300000);
    echoColorMessageAnimation("Total $count process have been successfully.\n");
    usleep(300000);
    echoColorMessageAnimation("Creating cache");
    echoPeriodThreeTime(1500000);
    echo "\n";
    echoColorMessageAnimation("Cache created successfully.\n");
    usleep(1000000);
    echoColorMessageAnimation("All processes is completed successfully.\n");

    while (true) {
        echoColorMessageAnimation("Would you like to run it again? y/N\n");
        $input = fgets(STDIN, 4096);
        if (preg_match('/\An|no\z/i', $input)) {
            $loop = false;
            break;
        } elseif (preg_match('/\Ay|yes\z/i', $input)) {
            $echo_installing = false;
            $echo_install_completed = false;
            $while = true;
            $count = 0;
            break;
        } else {
            $input = str_replace("\n", '', $input);
            echoColorMessageAnimation("$input is not accepted.\n");
        }
    }
}

echoColorMessageAnimation("Have a nice day!\n", "0;33");

function echoPeriodThreeTime(?int $micro = 1000000, ?string $color = "1;36")
{
    for ($j = 0;3 > $j;++$j) {
        usleep($micro);
        echo "\033[" . $color . "m.\033[0m";
    }
}

function getColorMessage(string $string, ?string $color = "1;36")
{
    return "\033[" . $color . "m" . $string . "\033[0m";
}

function echoColorMessageAnimation(string $string, ?string $color = "1;36", ?int $micro = 10000)
{
    $array = str_split($string);
    foreach ($array as $value) {
        usleep($micro);
        echo getColorMessage($value, $color);
    }
}

function echoLine(?string $string = "=")
{
    for ($k = 0;50 > $k;++$k) {
        echo $string;
        usleep(10000);
    }
}

function getUnderLineMessage(string $string)
{
    return "\033[4m" . $string . "\033[0m";
}

```

ベタベタのphpコードでクソコードかと思う方もいると思いますが、クソアプリなので許してください。

###実行する環境のイメージ

モーニングブレイクでのカフェでの一幕をイメージしました。

朝カフェに訪れ、おもむろにpcを開き、このプログラムを実行し、ちょいちょい発生するerrorをキーボードを操作して解消している姿を、後ろに座っている方に見せつければ、何となくその日のモチベーションが上がるんじゃないかと思います。

### 終わりに

ということで、phpをコンソールで実行できる環境のお持ちの方は、適当なphpファイルにこのコードをコピペして、朝カフェに行って、コーヒーを飲みながら実行してモチベーションを高めてください！