laravel 6.x 確認画面を挟んだstorage画像の保存処理

Laravelでは画像はstorageフォルダに格納する
Webからのアクセスを許すには、public/storageからstorage/app/publicへシンボリックリンクを張る必要がある
https://readouble.com/laravel/6.x/ja/filesystem.html

### 駄目な例
moveコマンドで、public配下に格納

UsersController.php

if($file = $request->file('file')){
            $name = $file->getClientOriginalName();
            $file->move('./images/tmp/', $name);
            $inputs['path'] = $name;

### 格納先・読み込み元をstorageに修正
$ php artisan storage:link
// ./public/storageが./storage/app/publicへのリンクとなる

UsersController.php

if($file = $request->file('file')){
            $name = $file->getClientOriginalName();
            // $file->move('./images/tmp/', $name);
            $file->storeAs('./public/images/tmp/', $name);
            $inputs['path'] = $name;

confirm.blade.php

<img src="{{ $inputs&#91;'path'&#93; ? asset('/storage/images/tmp/' . $inputs&#91;'path'&#93;) : 'https://placehold.jp/100x100.png' }}" class="img-icon">

確認画面で戻るボタンが押された場合は、Storage::deleteで削除する。確認画面で登録完了ボタンが押された場合は、画像の前部にCarbonでtimestampを付けて、prdフォルダに移動させる。画像のpathはDBに格納する。

UsersController.php

use Illuminate\Support\Facades\Storage;
use Carbon\Carbon;
public function store(Request $request)
    {
        $action = $request->get('action');
        $inputs = $request->except('action');

        if($action == '戻る'){
            Storage::delete('public/images/tmp/'.$inputs['profile_img']);
            return redirect()->action('UsersController@create')->withInput($inputs);
        }
        $timestamp = Carbon::now()->timestamp;
        $path = $timestamp.'_'.$inputs['profile_img'];
        Storage::move('public/images/tmp/'.$inputs['profile_img'], 'public/images/prd/'.$path);
        return 'done';
    }

ドキュメントを読む限り、storageに格納した方がファイルシステムの使う上で都合が良いように見えます。

Laravel6.x バリデーションのエラーメッセージを日本語化

### 初期(デフォルト)のメッセージ
./config/app.php

'locale' => 'ja',

$ php artisan make:request CreateUserRequest
CreateUserRequest.php

public function authorize()
    {
        return true;
    }
public function rules()
    {
        return [
            'name' => 'required',
        ];
    }

UsersController.php

public function confirm(CreateUserRequest $request)
    {
        return $request->all();
    }

view.blade.php

@if ($errors->has('name'))
  <br><span class="error">{{ $errors->first('name') }}</span>
@endif

エラーメッセージ
validation.required

### 英語のメッセージを複製
./resources/lang/ja/validation.php を作成
./resources/lang/en/validation.php の内容を ja/validation.php に複製

エラーメッセージ
The name field is required.

### 日本語メッセージにカスタマイズ
./resources/lang/ja/validation.php

'required' => ':attributeは必須です。',
'attributes' => [
        'last_name'=>'名前',
    ],

エラーメッセージ
名前は必須です。

バリデーションの仕様、メッセージに関しては、Wiki・Excelなどでステークホルダー全員で共有しながら管理することが多いでしょう。大規模なアプリケーションになるとバリデーションの数も増えてくるので、管理方法も工夫したい。

フーリエ変換

import numpy as np
from scipy.fftpack import fft
import matplotlib.pyplot as plt

N = 2**20
dt = 0.0001
f1, f2 = 5, 8
A1, A2 = 5, 0
p1, p2 = 0, 0

t = np.arange(0, N*dt, dt)
freq = np.linspace(0, 1.0/dt, N)

y = A1*np.sin(2*np.pi*f1*t + p1) + A2*np.sin(2*np.pi*f2*t + p2)

yf = fft(y)/(N/2)

plt.figure(2)
plt.subplot(211)
plt.plot(t, y)
plt.xlim(0, 1)
plt.xlabel("time")
plt.ylabel("amplitude")

plt.subplot(212)
plt.plot(freq, np.abs(yf))
plt.xlim(0, 10)
#plt.ylim(0, 5)
plt.xlabel("frequency")
plt.ylabel("amplitude")
plt.tight_layout()
plt.savefig("01")

ちょっと待て、
scipyって何?
matplotlibの基本的な使い方は?

ベクトルの内積

対応する成分同士を掛け算してそれらの和を取る
ベクトルとベクトルの内積はスカラーになる
内積の記号はが多い

直行条件とは、なす数が90°(cos90°=0)

法線ベクトル:全ての接線と直交するベクトル

Your PostgreSQL is too old

[vagrant@localhost ipa]$ yum list installed | grep postgres
postgresql.x86_64 8.4.20-8.el6_9 @base
postgresql-devel.x86_64 8.4.20-8.el6_9 @base
postgresql-libs.x86_64 8.4.20-8.el6_9 @base
postgresql96.x86_64 9.6.15-1PGDG.rhel6 @pgdg96
postgresql96-devel.x86_64 9.6.15-1PGDG.rhel6 @pgdg96
postgresql96-libs.x86_64 9.6.15-1PGDG.rhel6 @pgdg96
postgresql96-server.x86_64 9.6.15-1PGDG.rhel6 @pgdg96

psqlが8.4を読み込んでいるため、「Your PostgreSQL is too old」のエラーが出る

まず、psqlにログインして、実行ファイルを探します
[vagrant@localhost ipa]$ su – postgres
パスワード:
-bash-4.1$ which -a psql
/usr/bin/psql

node.js, npmバージョンアップ

[vagrant@localhost ~]$ nvm install v10.12.0
Downloading and installing node v10.12.0…
Downloading https://nodejs.org/dist/v10.12.0/node-v10.12.0-linux-x64.tar.xz…
######################################################################## 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v10.12.0 (npm v6.4.1)
[vagrant@localhost ~]$ nvm use v10.12.0
Now using node v10.12.0 (npm v6.4.1)

[vagrant@localhost ~]$ node -v
v10.12.0
[vagrant@localhost ~]$ npm -v
6.4.1

空チェックをして型チェック

nullかチェックをして、その後、型チェックを行う

$var = "2019/04/01";

if(empty($var)){
	echo "値を入力してください";
} else{
	if(preg_match("/^[a-zA-Z0-9]+$", $var)){
		echo "英数字で入力してください";
	} else {
		echo "合格";
	}
}

うむ、nullかどうかはオブジェクトにしたいですな。

正規表現 英数記号:\s!-~

英字:[A-Za-z]

$var="My name is Tom";
echo preg_match("/[A-Za-z]/", $var);

数字:[0-9]

$var="My name is Tom, 19years";
echo preg_match("/[0-9]/", $var);

英数字:[A-Za-z0-9]

$var="今年の桜は綺麗ね";
echo preg_match("/[A-Za-z0-9]/", $var);

英数記号:!”\#$%&@'()*+,-./_

$var="hoge@gmail.com";
echo preg_match("/[\#$%&@'()*+,-._]/", $var);
$var="hoge@gmail.com";
echo preg_match("/[\s!-~]/", $var);

あれ!? ”\#$%&@'()*+,-._”と”\s!-~”、一緒だ。
すげーーーーーーーーーーーー