コマンド解説：今何やったの？

雑な投稿ですが、
環境構築とかで迷ってる人の助けになればと思います。

projectという、オープンソースのパッケージをダウンロードした前提です。

```
$ cd project

$ cd              ← ホームディレクトリに戻る
$ cd project      ← projectフォルダへ移動する。
$ pwd             ← 自分が今ドコにいるのかを確認する。
```

「cd」でFinderで言う所の「フォルダ移動」です、
自分がどのフォルダを今触るかを変えます。

ちなみに、入力が面倒な時は「cd 」と入力した後で、Finderで移動したいフォルダを
ターミナルにドラッグ＆ドロップすると、カンタンに入力できます。


```
$ rm -f .gitignore
$ rm -rf  /directly   ←ディレクトリを削除する時
```
上は「`.gitignore`」を削除するコマンドです。`-f`は確認なしで削除する意味です。
`rm` は「remove」で、 `-f` は「force」の頭文字。

```
$ git init
```
新規作成もしくは初期化コマンド。「ココはgitで管理しますよ」宣言です。
オープンソースのパッケージを公式ページからダウンロードしたリポジトリなどには、
公式の`git`の設定があるので、自分用に使う場合に初期化する必要があります。

```
$ git remote add origin git@bitbucket.org:company_name/my-project.git
```
リモートリポジトリの追加です。↑URLは`github`だったりしますが、基本同じ。
オンライン上のこのリポジトリとやり取りしますよ、ということです。

```
$ git fetch origin
```
「フェッチ」は、ファイルは更新されないけど、リポジトリは更新されます。
自分のローカルに持ってる`master`が古くなっちゃったな（もしくは新規で作った）
という時に最新の情報にするために使います。

```
$ git reset --hard origin/master
```
コミットを取り消す時などに「`git reset`」をよく使います

# 間違えてコミットしちゃった！

```
$ git log -1
commit 12345678901234567890
Author: nishi
```

# 消しちゃう！
```
$ git reset --hard 12345678901234567890
```
そのあと

```
git reset --hard origin/master
```

を使うと、強制的にリモートブランチと同じになります。
「もはや何をどう操作したかも覚えてないけど、ローカルがこんがらがってしまった！」
って時に、強制的に`github(またはbitbucket など)`と同じにしてくれるものです。

```
$ git remote set-head origin master
```
ローカルにHEADがない（何もコミットがされてない）という時にHEADを設定するコマンド。
HEADとは「今どのブランチ・どのコミットの状態を見てるか」という事です。
`git branch` で、時々masterでもdevelopでもない所にHEADが行っちゃって

```
$ git branch
* [HEAD detached at xxxxxxxx]
   master
   develop
```

みたいなエラー（ヘッドが行方不明）になることがあります。
適当なブランチをcheckoutしたり、`git/HEAD`をいじって見たりで治ったりします。

------
## Docker

次はdocker（docker-compose）ですが、

```
$ docker compose up -d
```

`docker compose up`は複数の「コンテナ」を同時に、
しかも連携が取れた状態で起動します。

`php`と`mysql`コンテナを同じ仮想サーバーの中に立ててくれる感じです。
`-d`はオプションで、バックグラウンドで起動する意味。
作業する時、ターミナルをいちいち別窓で開いたりしなくてよくなります。


# 他によく使うコマンドはコレ。
```
$ docker compose down
$ doccker compose ps
```
#イメージもろとも削除
```
$ docker compose down --rmi all --volumes
```

# 難解なチャットを翻訳する
`「コンストラクタのタイプヒントでのDIによりエラーになる」`
専門用語は結構 「初心者殺し」 なので、
コマンドではないのですが「むずい！」と思うので解説します。

### 「DI」って何？ 
→ `Dependency injection`「依存性の注入」のこと。
最近のプログラムは「このソースは他のアレとコレを参照（依存）しています。」
と「静的評価」（＝動かす前にチェック）してからプログラムを処理していく感じです。

```php
//↓インターフェイスを定義
interface Fuga
{
    public function Piyo();
}

class Hoge{
   private $service;          //↓型   ↓変数
   public function __construct(Fuga $foo)
      {
          $this-> bar = $foo;
      }
  public function Piyo()
      {
          $this-> bar ->Piyo();
      }
}
            ↓Fugaを実装したクラス
class Service implements Fuga
{
    public function Piyo()
    {
        // 処理
    }
}
```

## コンストラクタって何？
`__construct` ← これがPHP7の「コンストラクタ」です。
コンストラクタの意味は「最初に実行するやつ」です。
「Fuga」を実装したクラスの「オブジェクト」が渡ってきたら実行できる。…むずいかも？

### タイプヒントって何？
「型宣言」のことです。この例文だと「Fuga」っていう「型」で変数「$foo」を
受け取りますよ〜っていうこと。「型」っていうといろいろ話がややこしいんですが。
「インターフェイス型」というか、「データ形式ひと塊」を「インターフェイス」という。

### 依存性(dependency)って何？
静的評価しない`Javascrpt`で例えるならば、「jQueryプラグイン」がある時に
「`jQuery`(=依存しているライブラリ）」がなかった時、もちろん動かないんですが、
ブラウザに「`$ is not defined`」って出るだけで、`html`や`css`は見えたりします。
これ「依存性を解決してないまま実行してる」って事です

「依存性を評価する」ということは
参照してる関数から「例外」とか「`NULL`」が返ってきたとかで、
動かないようになります。


###静的評価って何？
「プログラムがブラウザで動く前」にエラーを返します。
なので「受け取るはずの変数が空っぽだ、引数の数や型が違う」などは、
ブラウザで動く前に、エラーとして弾かれてしまう感じです。

なので、下記のような一見何やってるか分からないコマンドがあるとして、

```
$ mv ./app/Controller/X.php ./app/Controller/X.php.txt
$ mv ./app/Controller/Y.php ./app/Controller/Y.php.txt
$ mv ./app/Controller/Z.php ./app/Controller/Z.php.txt
$ mv ./app/Controller/A.php ./app/Controller/A.php.txt
$ mv ./app/Controller/B.php ./app/Controller/B.php.txt
$ mv ./app/Controller/C.php ./app/Controller/C.php.txt
$ mv ./app/Controller/D.php ./app/Controller/D.php.txt
$ mv ./app/EventListener/F.php ./app/EventListener/F.php.txt
```

読み方：`mv フォルダ/ファイル名1 （半角スペース） フォルダ/ファイル名2`
`mv`は「ファイル名1をファイル名2っていう名前にして移動する」＝「名前の変更」です。
一旦PHPファイルじゃなくて、テキストファイルにして、
DIで評価されないようにしてるって事です。


-----

```
$ docker compose exec container bash -c "app/console XXX:YYY"
```
このコマンドは

`docker compose exec container` と "`app/console` と `XXX:YYY`"
に分けて読んで下さい。

左は「`docker-compose`」のコマンドで、
右のやつは「`Symfony`」というか、使ってるパッケージの独自のコンソールコマンドです。
`app/console`の中に入ってる`XXX:YYY`というコマンドを叩いてます。

「Symfony」はPHPフレームワークです。
「Laravel」は、なんとなく聞いた事があると思いますが、アレ系の一種です。

ガチガチの型、というか規約のある書き方で、
誰が書いてもだいたい一緒のコードになります。


`docker-compose`の環境で使う場合、コンテナに入らなくても叩けます。

```
$ docker-compose exec コンテナ名 bash -c '(ココに挟んで使うとdockerの中でのコマンドが使えます)'
```

----

メモリ設定を`php.ini`に書きます。

```
$ echo 'memory_limit = 1G' >> dockerbuild/php.ini
```
デフォルトが128MBになっているので、
`php.ini`ファイルに上限1GBまで使うように書いています。

`echo 'テキスト' >> ファイル`
エディタで開いて一行追加して保存するのと同じ事です。
この`php.ini`ファイルは、dockerをbuildする時のみ読み込まれるものです。

```
$ docker-compose down
```
一度コンテナをおとします。

```
$ docker-compose up --build -d
```
今度は`--build`を付けて起動します。
※もう一回`Dockerfile`の内容でビルドするので時間かかります。

↓リネームした場所を元に戻すコマンド

```
$ git checkout ./app/DIRECTORY_NAME/
```
通常、「`git checkout ブランチ名`」などでリモートのブランチを持ってきたりしますが、
「`git checkout （ディレクトリ指定）`」で、そのフォルダ以下だけを持ってくる事ができます。

##レコードを追加
これは`SQL`の話です。このままターミナルに打ち込んでも動きません。
`docker-compose exec`で、MySQLコンテナの中で叩くのですが、
それ大変だとおもうので、Sequelとか起動して使うのオススメです。

カラム追加をするSQL（`INSERT`）は
`INSERT INTO テーブル（カラム1、カラム2） VALUES （値1、値2）`
というような書き方をします。

```
INSERT INTO `dtb_XXX` (`id`, `type_id`, `code`, `name`, `create_date`, `update_date`, `discriminator_type`)
VALUES
	(1, 2, 'custom', 'custom', '20XX-XX-XX 10:14:52', '20XX-XX-XX 10:XX:XX', 'discriminator_name');
```
対象のデータベースに、一行レコードが追加されます。

以上です。