yps並走記録　Task3 　SQL：テーブル作成（復習）バッチ作成（復習）～php.ini設定～GitHubにファイルをアップロード

早くも３週目になりました、yps
今回はなるべくリアルタイムで課題をやりながらログを取っていきたいと思います。

##まずはSQL周りの復習

###MySQLのエンコード設定を直します

エンコード設定をutf8mb4に戻す(mysql cliから日本語扱えるようにutf8にしてた）
`sudo vi /etc/my.cnf`

最終行に以下を追記

```
[client]
default-character-set=utf8mb4
```

編集を保存し、mysqlを再起動
`sudo systemctl restart mysql`

###練習で使うデータをダウンロード
`cd /tmp`
`sudo yum install wget`
`wget http://tech.pjin.jp/wp-content/uploads/2016/04/worldcup2014.zip`
`unzip http://worldcup2014.zip`

データの確認
`ls -la worldcup2014.sql`

###データベース作成
MySQLにログインして…
`mysql -u root -p （パスワードを入力）`

データベースを作成
`create database worldcup2014db;`

使うデータベースにDLしたデータを指定
`use worldcup2014db;`
`source ./worldcup2014.sql;`

テーブルを表示して確認
`show tables;`

###確認用バッチ処理とコマンドを作成していきます
参考：[バッチ処理とは？](https://www.imkk.jp/blog/what-is-batch-processing.html)

Laravelでモデルを作成（参考：https://blog.codecamp.jp/php_mvc01）
`php artisan make:model Models/Player`

作成したモデルを確認
`ls -la app/Models/Player.php`

バッチ記述用のファイルを作成
`php artisan make:command TestCommand`

作成したファイルを確認
`ls -la app/Console/Commands/TestCommand.php`


ここからは
**1. SSH接続したVS Codeを使って**
**2. /var/www/html/ypsフォルダ（Laravelのプロジェクトファイル）**
で作業していきます

app/console/commandsのCommands.phpファイルに以下を記述

```php:Commands.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\Models\Player;

class TestCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'test_command';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Test Command';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        $players = Player::get();
        foreach($players as $player) {
            echo $player->name."\n";
        }
        return 0;
    }
}
```

保存したらターミナルで以下のコマンドを打って確認

キャッシュをクリア
`php artisan config:clear`

上記で作成したバッチコマンドを入力
`php artisan test_command | head`

無事選手名が表示されればＯＫ

###MySQL日本語が打てない問題の一先ずの対応　＝　sqlファイルを作成して読み込ませる
どうしてもコマンドを使って行う場合の対応。
≒基本的にLaravelを使ってSQLは操作するので特に問題はなさそう？

一時ファイルに移動
`cd /var/tmp`
sqlファイルを作成
`vi get_players.sql`

以下を記述

```
use worldcup2014db;
select * from players where name = '酒井';
```

ターミナルで下記を打ってパスワードを入力
`mysql -u root -p  < ./get_players.sql`

**酒井選手が２桁表示できればＯＫ**
（ファイルに出力したい場合は　`mysql -u root -p  < ./get_players.sql > ./out.txt`）

**～MySQLの復習＆バッチ作成ここまで～**

----------------

##php.iniファイルを編集
主にPHPをアプリケーションで使用する際に日本語で文字化けしたりしないような設定をしていくようです。

**※事前に `sudo yum install colordiff -y` で差分を見られるようにしておく**

###[参考リンク](https://affiwork.net/php-settings/)を見ながらphp.iniの設定を編集
`sudo vi /etc/php.ini`

まずはデフォルトのエンコーディングがUTF-8に…

default_charset = "UTF-8"

しかしこれ、あとで調べたら5.2以降のPHPはデフォルトでUTF-8になってるみたい…ということで設定要らんかったのかorz

気を取り直して、mbstringの探しつつ確認をしていきます。
[mbstring]の設定は一番下の方にありました…

`mbstring.language = Japanese` //コメントアウトを外す
`mbstring.encoding_translation = Off` //コメントアウトを外してoffにする
`mbstring.detect_order = auto` //コメントアウト外す

※参考リンクが古いためか、ブログ記事では手動で設定するような記述になっているがautoのままでいいみたいです
（多分ＰＨＰのバージョンの関係）
`date.timezone = Asia/Tokyo`

PHPのバージョンが表示されてしまわないように変更
`expose_php = Off`

パフォーマンス関連の設定
`memory_limit = 128M` これはデフォルトの設定なので確認だけ

ポストリクエストのマックスサイズを128Mに変更
`post_max_size = 128M`

ファイルをアップロードする際のマックスサイズをPOSTに合わせて128Mに変更
`upload_max_filesize = 128M`

ついでにエラーログの設定もしておきましょう
`error_log= "/var/log/php_errors.log"`

全部できてれば…
`colordiff -u /etc/php.ini.org /etc/php.ini`って打てば

```
--- /etc/php.ini.org	2020-07-07 18:04:58.000000000 +0900
+++ /etc/php.ini	2020-07-31 23:28:50.392713681 +0900
@@ -373,7 +373,7 @@
 ; threat in any way, but it makes it possible to determine whether you use PHP
 ; on your server or not.
 ; http://php.net/expose-php
-expose_php = On
+expose_php = Off
 
 ;;;;;;;;;;;;;;;;;;;
--- /etc/php.ini.org	2020-07-07 18:04:58.000000000 +0900
+++ /etc/php.ini	2020-08-01 01:02:55.357913512 +0900
@@ -373,7 +373,7 @@
 ; threat in any way, but it makes it possible to determine whether you use PHP
 ; on your server or not.
 ; http://php.net/expose-php
-expose_php = On
+expose_php = Off
 
 ;;;;;;;;;;;;;;;;;;;
 ; Resource Limits ;
@@ -584,6 +584,7 @@
 ; http://php.net/error-log
 ; Example:
 ;error_log = php_errors.log
+error_log = "/var/log/php_errors.log"
 ; Log errors to syslog (Event Log on Windows).
 ;error_log = syslog
 
@@ -690,7 +691,7 @@
 ; Its value may be 0 to disable the limit. It is ignored if POST data reading
 ; is disabled through enable_post_data_reading.
 ; http://php.net/post-max-size
-post_max_size = 8M
+post_max_size = 128M
 
 ; Automatically add files before PHP document.
 ; http://php.net/auto-prepend-file
@@ -842,7 +843,7 @@
 
 ; Maximum allowed size for uploaded files.
 ; http://php.net/upload-max-filesize
-upload_max_filesize = 2M
+upload_max_filesize = 128M
 
 ; Maximum number of files that can be uploaded via a single request
 max_file_uploads = 20
@@ -919,7 +920,7 @@
 [Date]
 ; Defines the default timezone used by the date functions
 ; http://php.net/date.timezone
-;date.timezone =
+date.timezone = Asia/Tokyo
 
 ; http://php.net/date.default-latitude
 ;date.default_latitude = 31.7667
@@ -1533,7 +1534,7 @@
 ; language for internal character representation.
 ; This affects mb_send_mail() and mbstring.detect_order.
 ; http://php.net/mbstring.language
-;mbstring.language = Japanese
+mbstring.language = Japanese
 
 ; Use of this INI entry is deprecated, use global internal_encoding instead.
 ; internal/script encoding.
@@ -1571,7 +1572,7 @@
 ; automatic encoding detection order.
 ; "auto" detect order is changed according to mbstring.language
 ; http://php.net/mbstring.detect-order
-;mbstring.detect_order = auto
+mbstring.detect_order = auto
 
 ; substitute_character used when character cannot be converted
 ; one from another
```
ってなるはず（らしい）

そしてコンソールに戻ってphpのエラーログファイル作成＆設定を行います
`sudo touch /var/log/php_errors.log`
`sudo chown nginx:nginx /var/log/php_errors.log`

ここまでできたら設定反映のためにphp-fpmとnginxを再起動
`sudo systemctl restart php-fpm`
`sudo systemctl restart nginx`

**～php.iniの設定ここまで～**

----------

##Gitインスコ＆GitHubとの連携
参考までに予備知識：https://qiita.com/moonbass630/items/383fc8300a83784e4c82


###まずはgitをインストール
`sudo yum install git -y`
ディレクトリをLaravelのプロジェクトに移動して…
`cd /var/www/html/yps`
gitをinitします（意味が分からない方のための参考リンク：https://26gram.com/git-init）
`git init`

###ブラウザでGitHubを開いて新規リポジトリ作成
1. Newボタンを押して新規作成
2. リポジトリをPrivateに
3. gitignoreにLaravelを追加
4. create Repositoryを押して
4. add readme.mdをクリックして完了
5. リポジトリの画面の右側のCodeボタンをクリックして
6. Clone with SSHと書かれたところに書いてあるgit@github.comから始まるリポジトリのurlをコピー

※GitHubにはすぐ戻ってくるのでブラウザは開いたままが推奨

###Gitの設定ファイルを記述
ターミナルでまたLaravelのプロジェクトファイルへ戻ります
`cd /var/www/html/yps/`

Gitの設定ファイルを編集
`sudo vi .git/config`

下記を記述します

```
[remote "origin"]
    url = "リポジトリのurl" //作成時にコピーしたもの
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[user]
    name = 自分のgithubユーザー名
    email = 自分のメアド
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
```

###接続用の秘密鍵を作成
`ssh-keygen -t rsa -b 4096 -C "自分のメアド"`
enterを押して
パスワードを2回入力

下記コマンドを打って表示される文字列をコピーしておく
`cat ~/.ssh/id_rsa.pub`

###GitHubに文字列を登録
1. 右上のアイコンを押してアカウントメニューを表示
2. Settings ⇒ SSH and GPG keys
3. New SSH keyをクリック
4. Titleは適当なものをつける
5. Keyと書いてあるところに上記（`cat ~/.ssh/id_rsa.pub`コマンド）で表示されたキーを張り付け
6. Add SSH keyを押すと登録完了

###GitHubをリモート登録

ターミナルでLaravelプロジェクトフォルダに戻ります
`cd /var/www/html/yps/`

差分ファイルを全てステージングして、マスターブランチにpush
`git add .`
`git commit -am "initial"`
`git push origin master`
yesを入力してパスワードを入力すればソースコードの登録完了。

###develop / feature ブランチを切る
参考リンク：https://qiita.com/Naoki206/items/e5520453f92dcd4274f1

参考リンクを見ながらdevelopブランチとfeatureブランチを切る
`$git branch` 現在のブランチの確認
`$git branch develop` developブランチ作成
`$git checkout develop` developブランチへ移動
`$git push origin develop` リモートに反映

**～git導入＆GitHub連携ここまで～**

-------

Masterから分岐させて開発終了後にmergeを使ってmasterブランチへ取り込むことによってgitではバージョン管理をする…
Gitは一応Progateでいじって、Qiitaでも初心者向けの記事読んだりしてたけど、今回色々いじってようやく仕組みが腑に落ちた感あるな～

今回はまとめ作ってたらすんごい時間になってしまったのでこの辺で…
次回はＷＰ導入していじるみたいです。

今まで色々やってきたことの解像度が大分上がってきて楽しくなってきたぞ～（夜中のテンション）