2019/08/25

AWS の Linux2 は最適化された(?)パッケージが用意されている

- CentOS7 - Apache2 - PHP7.3
- PostgreSQL *コマンドは sudo でなく root で実行している(root パスワードを別途設定済み)

yum アップデート

# yum update -y

Apache2

Apache インストール

# yum -y install httpd

サービス起動

# systemctl start httpd

*CentOS6系では chkconfig httpd on

自動起動設定

# systemctl enable httpd.service Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

自動起動設定確認

# systemctl is-enabled httpd

ec2-user 設定

/var/www/ を ec2-user が利用できるように設定する

ec2-user を apache に追加

# usermod -a -G apache ec2-user

/var/www の権限

デフォルトの DocumentRoot である /var/www の権限を ec2-user : apache に変更 ディレクトリ(775)とファイル(664) で利用できるようにする

# chown -R ec2-user:apache /var/www # chmod 2775 /var/www && find /var/www -type d -exec chmod 2775 {} ; # find /var/www -type f -exec chmod 0664 {} ;

*2775 の 2 は setgid

ec2-user で所属グループの確認

ec2-user を再ログインして確認

$ groups ec2-user adm wheel apache systemd-journal

PHP7.3

Amazon Linux2 用にパッケージが用意されており、PHP7.3 はここからインストールする。

Amazon Linux2 専用のパッケージ確認

# amazon-linux-extras list ..... # amazon-linux-extras info php7.3

インストール

# amazon-linux-extras install php7.3

mazon-linux-extras で足りないパッケージは、yum でインストールすると良い

Composer インストール

$ curl -sS https://getcomposer.org/installer | php All settings correct for using Composer Downloading... Composer (version 1.9.0) successfully installed to: /home/vagrant/composer.phar Use it: php composer.phar

/user/local/bin に移動

$ sudo mv bin/composer /usr/local/bin/composer

composer初期化

$ composer init Package name (/) [vagrant/vagrant]: Description []: Author [, n to skip]: Minimum Stability []: Package Type (e.g. library, project, metapackage, composer-plugin) []: License []: Define your dependencies. Would you like to define your dependencies (require) interactively [yes]? Search for a package: Would you like to define your dev dependencies (require-dev) interactively [yes]? Search for a package:

composer.json が作成される

composer install

$ composer install Loading composer repositories with package information Updating dependencies (including require-dev) Nothing to install or update Generating autoload files

PostgreSQL10

amazon-linux-extras

amazon-linux-extras では psql コマンドのみのインストールの模様

# amazon-linux-extras install postgresql10

yum インストール

# yum install -y postgresql-server postgresql-devel postgresql-contrib

サービス起動

# systemctl start postgresql # postgresql-setup initdb

自動起動設定

# systemctl enable postgresql.service

postgres ユーザで確認

# su - postgres bash-4.2$ psql -l could not change directory to "/home/ec2-user": Permission denied List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+-------------+-------------+----------------------- postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | .....

外部からのアクセス設定

パスワードで制御するかIPで制御するか、はたまたその他の方式かはセキュリティポリシーによって違うので割愛 (postgres.conf & pg_hba.conf 設定など)

AWS はセキュリティグループで PostgreSQLのポート設定しないと一切アクセスできない。

AWS セキュリティグループ

セキュリティグループ > EC2 に紐付いたグループ > インバウンド > 編集

AWS セキュリティグループ 上記の設定は 5432 に全ての IPを許可(CIDR形式)しているので、必要であれば IP制限する
(postgresパスワードや、pg_hba.conf で制限しても良い)

  2019/08/25
Python単体 と Anaconda は比較的衝突しやすいので、Anacondaを削除してみる

anaconda-clean のインストールと実行


$ conda install anaconda-clean
$ anaconda-clean

anaconda_backup の削除


$ rm -rf ~/.anaconda_backup

anaconda 本体の削除

環境によってパスが異なるが、which anaconda などでパスを確認して削除

$ cd ~/.pyenv
$ rm -rf versions
$ cd .pyenv/shims
$ rm -rf anaconda*

.bash_profile から環境変数の削除

~/.bash_profile に環境変数が追加されていた場合はこれを削除 ターミナルを再起動すると anaconda は動作しない

  2019/08/21

構成

centos7 ├ docker-compose.yml ├ docker │  ├ Docker用コンテンツ・設定など └ Vagrantfile

Vagrantインストール

macOS用のdmgをダウンロード Download Vagrant

初期設定

ここでは CentOS7 を作成する
$ mkdir vagrant $ cd vagrant $ vagrant init centos/7
Vagrantfile が作成される 以後はこのディレクトリで操作する

vagrant 起動

$ vagrant up
VirtualBox の CentOS7 が起動 初回はCentOS7イメージをダウンロード&インストール
$ vagrant box list centos/7 (virtualbox, 1905.1)
Vagrant Box

vagrant 停止

$ vagrant halt

vagrant 再起動

$ vagrant reload

仮想マシン破棄

$ vagrant destroy

ネットワークブリッジ

固定IPも設定できるが、とりあえず DHCP でBridgeで設定する
config.vm.network "public_network"
ちなみにIP固定は
config.vm.network "public_network, ip: "IPアドレス"
Vagrant を再起動すると、どのネットーワークか聞かれるので、利用したい番号を入力
$ vagrant reload ==> default: Checking if box 'centos/7' version '1905.1' is up to date... ==> default: Clearing any previously set network interfaces... ==> default: Available bridged network interfaces: 1) en0: Wi-Fi (AirPort) 2) p2p0 3) awdl0 4) en3: Thunderbolt 1 5) en1: Thunderbolt 2 6) en4: Thunderbolt 3 7) en2: Thunderbolt 4 8) bridge0 9) en5: USB Ethernet(?) ==> default: When choosing an interface, it is usually the one that is ==> default: being used to connect to the internet. default: Which interface should the network bridge to

ネットーワークを指定

ブリッジするネットーワークがわかっている場合は、Vagrantfile で指定できる(名称は筐体によって異なる)
config.vm.network "public_network", bridge: "en0: Wi-Fi (AirPort)"

SSH接続

$ vagrant ssh

OS確認

$ cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core)

root & vagrantユーザ

sudo

$ sudo su
パスワード不要 ※sudoにはパスワードは設定しない事

su

$ su
パスワードはvagrant

vagrant

$ su vagrant
パスワードはvagrant

ifconfigインストール

デフォルトでは ifconfig が利用できないのでインストール
# yum install net-tools
ifconfig で確認すると DHCPで IP が割り振られている
$ ifconfig eth1: flags=4163 mtu 1500 inet 192.168.11.9 netmask 255.255.255.0 broadcast 192.168.11.255

DockerCompose インストール

Vagrantで docker-compose を起動する場合、vagrant-docker-compose が必要
$ vagrant plugin install vagrant-docker-compose

VirtualBoxイメージのメモリ&CPU設定

Vagrantfile ファイルに記述

  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048"
    vb.cpus = "2"
  end

共有フォルダ設定

ホストOS(Mac)とゲストOS(VirutalBox上のOS)ディレクトリを共有する場合 vagrant-vbguest が必要 VirtualBox での共有ディレクトリと同じで、
mount -t vboxsf -o uid=ユーザ,gid=ユーザ,dmode=0777,fmode=0666 共有フォルダ名 マウントパス
といった Vagrantfile ファイルに基づいて設定してくれる

vagrant-vbguest インストール

$ vagrant plugin install vagrant-vbguest $ vagrant vbguest $ vagrant vbguest --status [default] GuestAdditions 6.0.10 running --- OK.

Vagrantfile 設定

共有ディレクトリ vagrant のパーミッションを変更する
config.vm.synced_folder ".", "/vagrant", mount_options: ['dmode=775','fmode=666']

vagrant plugin 確認

$ vagrant plugin list vagrant-docker-compose (1.3.0, global) vagrant-vbguest (0.19.0, global)

Vagrantfile 設定

config.vm.synced_folder "./docker", "/vagrant/docker"

  2019/08/20

インストール

$ docker pull postgres

確認

$ docker images postgres REPOSITORY TAG IMAGE ID CREATED SIZE postgres latest c3fe76fef0a6 6 days ago 313MB $ docker inspect postgres [ { "Id": "sha256:c3fe76fef0a611a53dfc8d3ca21fa51bf8ba03cf84c593e50dfe6cc830c69de6", "RepoTags": [ "postgres:latest" ], ....

起動

初回起動

$ docker run -d --name postgres -p 5432:5432 postgres

2回目以降

$ docker start postgres

起動確認

$ docker ps
もしくは
$docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f44a3f9f944a postgres "docker-entrypoint.s…" 13 minutes ago Up 5 seconds 0.0.0.0:5432->5432/tcp postgres
Macからホスト:0.0.0.0 で接続可能となる

Mac の psql コマンドを利用

psqlコマンドを直接利用するために、HomeBrewでPostgreSQLをインストール
$ brew install postgresql
確認
$ psql --host 0.0.0.0 -l --user postgres List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+------------+------------+----------------------- postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 | ....

Docker の psql コマンドを利用

Dockerにログイン

$ docker exec -ti postgres bash

Docker上で操作

# su -u postgres $ psql --version psql (PostgreSQL) 11.5 (Debian 11.5-1.pgdg90+1) postgres@f44a3f9f944a:/$ psql -l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+------------+------------+----------------------- postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 | ...

  2019/08/09
入力フォームからの Request をバリデートする。 FormRequest を利用すると Controller に処理を記述しなくても事前にバリデートしてくれる。

FormRequestファイルの生成

$ php artisan make:request UserStoreRequest
app/Http/Requests/ にファイルが作成される
class UserStoreRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true; //デフォルトで false になっている
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        //バリデートのルールを記述
        return [
            'name' => ['required', 'min:3', 'max:64', 'unique:users'],
            'email' => ['required', 'min:4', 'max:255', 'unique:users'],
            'password' => ['required', 'min:4', 'max:16'],
        ];
    }

    public function messages(){
        //rules に対応したメッセージを記述
        return [
            'name.required'  => '名前を入力してください。',
            'name.min'       => '名前は3文字以上で入力してください',
            'name.max'       => '名前が長すぎます',
            'name.unique'       => '名前は既に登録されています',
            'email.required'=> 'Emailを入力してください。',
            'email.min'     => 'Emailが短かすぎます',
            'email.max'     => 'Emailが長すぎます',
            'email.unique'       => 'Emailは既に登録されています',
            'password.required'=> 'パスワード入力してください。',
            'password.min'     => 'パスワードは4文字以上で入力してください',
            'password.max'     => 'パスワードは32文字以内で入力してください',
        ];
    }
}

Controller 設定

引数のクラスを Request から UserStoreRequest に変更すると FormRequest が自動的にバリデート処理をする validate エラーが発生すると、即時に全画面にリダイレクトする
    public function store(UserStoreRequest $request)  //UserStoreRequest にクラス名を変更
    {
        //UserStoreRequest で validate エラーが発生すると、以降の処理は実行されない
        $request->session()->put('request', $request->all());
        try {
            User::create($request->validated());
            return redirect('user');
        } catch (QueryException $e) {
            return back()->withInput();
        }
    }

Blade でエラー表示

FormRequest で発生したエラーは、自動バインドされた $errors で記述する。
@if (count($errors) > 0)
<ul>
  @foreach ($errors->all() as $error)
  <li>{{ $error }}</li>
  @endforeach
</ul>
@endif

自分自身を除外する

UPDATE で 自分自身はユニークを除外する必要がある場合、Rule::unique() を利用する。
    use Illuminate Validation Rule;
    .....
    public function rules()
    {
        return [
            'name' => [
                'required', 'min:3', 'max:64',
                Rule::unique('users')->ignore($this->id),
            ],
            'email' => [
                'required', 'min:4', 'max:255',
                Rule::unique('users')->ignore($this->id),
            ]
        ];
    }

  2019/08/09
Debian9系だとNode.jsのバージョンが古く npmもインストールできないので、パッケージを更新してからインストールする。

# curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
# aptitude installl nodejs
# nodejs -v
v10.16.2
# npm -v
6.9.0

  2019/08/09
try-catch でエラー検出する場合、namespace内でException を待ち受けするため「 Exception」と記述する必要がある。

Laravel の QueryException を検知する場合

    use  Illuminate Database QueryException;
....
    public function store(Request $request)
    {
        try {
            $user = new User;
            $user->fill($request->all())->save();
        } catch ( QueryException $e) {

        }
    }
QueryException

  2019/08/08

Middleware を利用して、ルートをグループ化し、共通事前処理を行う

Middleware生成

app/Http/Middleware/ にMiddlewareファイルを生成


$ php artisan make:middleware HelloMiddleware

ルートの設定(routes/web.php)

- Route::middleware に Middlewareクラスの配列を設定
- group() の引数は無名関数とし、各Routeを記述

Route::middleware([HelloMiddleware::class])->group(function() {
    Route::get('/hello', 'HelloController@index')->name('test');
    Route::get('/hello/user/{id}', 'HelloController@user')->where('id', '[0-9]+');
    Route::get('/hello/bye', 'HelloController@bye');
    Route::get('/hello/other', 'HelloController@other');
});

Middleware ファイルに共通処理を記述

ルートで Middleware をルートすると、handle($request, Closure $next) が呼ばれるため Request をバインドしておく

    public function handle($request, Closure $next)
    {
        $hello = 'Hello! This is Middleware!!';
        $bye = 'Good-by, Middleware...';
        $data = [
            'hello' => $hello,
            'bye' => $bye
        ];
        $request->merge($data);
        return $next($request);
    }

Controller ファイルで Middlewareを利用

Middlewareでバインドした Request を利用

    public function index(Request $request)
    {
        $data = ['msg' => $request->hello];
        return view('hello.index', $data);
    }

    public function bye(Request $request)
    {
        $data = ['msg' => $request->bye];
        return view('hello.index', $data);
    }

  2019/08/08
Middlewareを利用したルートグループ化と異なり、処理を実装しないルーティングに便利 ネームスペースを省略できる

namespaceファイルの生成

Controllers/namespace/Controllerファイル を作成し、namespaceを設定 例として、App/Http/Controllers/Sample を namespace
namespace App\\Http\\Controllers\\Sample;

use App\\Http\\Controllers\\Controller;
use Illuminate\\Http\\Request;

class SampleController extends Controller
{

    public function index(Request $request)
    {
        $data = ['msg' => 'Sample index'];
        return view('hello.index', $data);  #hello/index.blade.php を作成済
    }

    public function other(Request $request)
    {
        $data = ['msg' => 'Sample Other'];
        return view('hello.index', $data);  #hello/other.blade.php を作成済
    }

}

ルート設定

namespace() でグループ化し、各ルートを設定
Route::namespace('Sample')->group(function() {
    Route::get('/sample', 'SampleController@index');
    Route::get('/sample/other', 'SampleController@other');
});

  2019/08/07

ルートの設定で、Route::get(...)->name(名前) を指定しておくと、コントローラ側の redirect()->route(名前) でリダイレクトできる。

redirect() の引数を記述しない場合に便利

web.php

    public function index()
    {
        $data = ['msg' => 'This is HelloController index'];
        return view('hello.index', $data);
    }

    public function other()
    {
        return redirect()->route(名前);
    }

HelloController.php

Route::get('/hello', 'HelloController@index')->name(名前);
Route::get('/hello/other', 'HelloController@other');
AWS CLI と jq でインスタンス一覧を整形して表示
React と Laravel7 のプロジェクトを作成する
Homebrewインストール-2020年版
3直線で囲まれた範囲塗りつぶし
PuLP で線形最適化問題を解く
カスタムのペジネーションを作る
node-sass を使って sass をコンパイルする
Log ファサードでSQLログを分離して書き出す
いちから始める Docker - 複数のコンテナを使う - (2020年)
いちから始める Docker - docker-compose を使う - (2020年)
AWS ECR を使ってみる
Laravel7 でマルチ認証
Mac に AWS Client を設定する
Laravel 7 リリース
v-html でHTML表示する
Laravel で Vue コンポーネントを使う
Laravel で Nuxt.js を使ってみる(Docker環境)
いちから始める Docker -コンテナをビルド- (2020年)
いちから始める Docker -起動してみる- (2020年)
Mac で MySQL(8系)
composer で vendor がインストールできない
Eloquent の日付を Carbon で扱う
webpack 4 入門(npm編)
[Mac]容量を減らす
DIコンテナはじめ
freee SDKを Laravel で使ってみる
freee API を使ってみる
Segueを利用しない画面遷移
Xcode11.3 で XVim2 を利用する
Codable で JSONを読み込み
Webpack入門(yarn編)
MacからLaradock PostgreSQLで接続エラー
Dockerで不要なコンテナ・イメージを削除
Mac で Laradock の構築
yarn インストール&プロジェクト作成
Laravel 6.x 構築(Homestead編)
Composer インストール
nvm インストール
npm install が Mac でエラー
HTMLタグでカーソルが同時処理(ミラーリング)されてしまう
DI(依存性注入)
[Ubuntu]Let's Encryptで無料の証明書を利用する
[Apache]Apache2.4のアクセス制限が変更
[Ubuntu]rootのログインとsudo権限追加
タミヤ マイコンロボット工作セットをMacに接続してみた
pgAdimn4 でブラウザで開けなくなる
Java8 を HomebrewとjEnvで構築
Android Studio環境構築 2019
ロケールの再構築
vagrant グループに Apacheを追加