write ahead log

ロールフォワード用

Laravel - Homestead環境でPostgreSQLを使う時のメモ

一応メモっとく.

Homesteadで環境は作ってある前提

プロジェクトを作る&バージョン確認

codeというプロジェクトを作成.

vagrant@homestead:~$ composer create-project --prefer-dist laravel/laravel code

バージョンは5.7.4

vagrant@homestead:~/code$ php artisan --version

PostgreSQLのバージョンを確認

vagrant@homestead:~/code$ psql --version
psql (PostgreSQL) 10.3 (Ubuntu 10.3-1)

とりあえずpsqlでつないでみる

  • ユーザーはhomestead
  • パスワードはsecret
  • データベースはhomestead

で最初から用意されていた.

vagrant@homestead:~/code$ psql -U homestead -h localhost
Password for user homestead:
psql (10.3 (Ubuntu 10.3-1))
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

homestead=#

Laravelの環境設定

.envに書いてあるので変更します.

vagrant@homestead:~/code$ pwd
/home/vagrant/code
vagrant@homestead:~/code$ vi .env

mysqlがデフォルトなのでpgsqlへ変更. ポート番号も変えておく.

#DB_CONNECTION=mysql
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
#DB_PORT=3306
DB_PORT=5432
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

マイグレーションしてみる

プロジェクト作成時に用意されるusersテーブルをマイグレーションしてみる.

vagrant@homestead:~/code$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table

確認

一式生成されていた.

vagrant@homestead:~/code$ psql -U homestead -h localhost
Password for user homestead:
psql (10.3 (Ubuntu 10.3-1))
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

homestead=# \d
                 List of relations
 Schema |       Name        |   Type   |   Owner
--------+-------------------+----------+-----------
 public | migrations        | table    | homestead
 public | migrations_id_seq | sequence | homestead
 public | password_resets   | table    | homestead
 public | users             | table    | homestead
 public | users_id_seq      | sequence | homestead
(5 rows)

homestead=#

とても簡単だ.良く出来ている.

Laravel標準の機能で認証フォームを作る

Homestead上のLaravel 5.7.4で試した.

Laravelには認証を実装するための機能が標準で付いてきています.

認証はどこでも必要になるので入門するには良いとっかかりということで, 利用してみました.

実装できる機能

標準でもこれだけ実装できます.

ほとんどのプロジェクトはこれで十分でしょう.

  • ユーザ登録
  • ログイン
  • ログアウト
  • パスワードリセット

プロジェクトの作成

Homesteadのデフォルトに合わせてcodeプロジェクトにしました.

$ composer create-project --prefer-dist laravel/laravel code

認証機能用コードのScaffolding

認証機能を使うには, まずはプロジェクトフォルダ直下で以下のコマンドを実行します.

$ php artisan make:auth

これだけで認証機能のベースになるコードが生成(Scaffolding)されます.

$ tree app/Http/Controllers
app/Http/Controllers/
├── Auth
│   ├── ForgotPasswordController.php
│   ├── LoginController.php
│   ├── RegisterController.php
│   ├── ResetPasswordController.php
│   └── VerificationController.php
├── Controller.php
└── HomeController.php

Authフォルダ以下とHomeController.phpが生成されています.

DBのマイグレーション

認証に使うユーザ情報はDBに保持します.

database/migrations以下を見ると先のコマンドで既にマイグレーションファイルが生成されています.

$ ls database/migrations/
2014_10_12_000000_create_users_table.php  2014_10_12_100000_create_password_resets_table.php

そのままマイグレーションします.

$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table

実行してみる

なんと実装はこれだけで, トップページへアクセスしてみると既にナビゲーションバーにloginとregisterの項目ができています.

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');

確認のために雑にページを作る

ログインしていないユーザがアクセスできないページが欲しいので, 雑にページを生成します.

PostsControllerを作ります.
(不要なアクションも含めresourceオプションで生成)

$ php artisan make:controller PostsController
Controller created successfully.

アクションを追加.

public function index()
{
    return view('posts.index');
}

public function create()
{
    return view('posts.create');
}

Postsのビューも用意して.

$ mkdir resources/views/posts
$ echo "index" > resources/views/posts/index.blade.php
$ echo "create" > resources/views/posts/create.blade.php

ルートも追加しておきます.

# routes/web.php
Route::get('/posts/', 'PostsController@index');
Route::get('/posts/create', 'PostsController@create');

認証による制御

ルートのフィルタ

ルートへのアクセスの可否を制御するには2つの方法があるっぽい.

ルート定義に記述

ルート定義にメソッドチェーンして, middleware('auth')を呼び出す.

# routes/web.php
Route::get('/posts/create', 'PostsController@create')->middleware('auth');
コントローラのコンストラクタに記述

ただし, この場合はコントローラのアクション全体に認証によるフィルタがかかる.

public function __construct()
{
    $this->middleware('auth');
}

認証済みか調べる

コントローラ内で簡単に調べられます.

use Illuminate\Support\Facades\Auth;

if (Auth::check() === true) {
    // ユーザーはログインしている
}

ログインユーザを調べる

use Illuminate\Support\Facades\Auth;

// ログインユーザーの取得
$user = Auth::user();

// ログインユーザーのIDを取得
$user_id = Auth::id();

ログイン後などのリダイレクト先の変更

デフォルトでは

/home

へリダイレクトされるが, カスタマイズできる.

app/Http/Controllers/Auth/

配下にある3つのコントローラの定義をそれぞれ変更すればよい.

  • LoginController
  • RegisterController
  • ResetPasswordController
# これを変える
protected $redirectTo = '/home';

ログアウトさせる

以下を呼び出す.

Auth::logout();

ビューを変える

resources/views/auth/にビューがあるので普通に変えればよいです.

言語化

resources/lang/enに

が出来ていました.

テスト

actingAsメソッドで認証できる.

public function testAccessSecurePage()
{
    $user = factory(App\User::class)->create();
    $response = $this->actingAs($user)
                     ->get('/posts/create');
    $response->assertStatus(200);
}

public function testDenySecurePage()
{
    $response = $this->get('/posts/create');
    $response->assertStatus(302);
}

参考

すごく良い翻訳ドキュメントがあった.

最初からこれを読めばよかった.

Github - laravel-ja/ja-docs-5.7

公式 - testing

Postgresのダンプの取得とリストアの方法

毎回忘れるので.

アーカイブ形式で取る場合の例を記載.

Fcオプションを外せばスクリプト形式(SQL出るやつ)になる.

バックアップ(ダンプ)の取得.

pg_dump -U [ユーザ名] -Fc -d [データベース名] > [保存先フルパス]

リストア

1. ユーザを作成
> psql -U postgres
postgres => CREATE TABLE [ユーザ名] WITH LOGIN PASSWORD 'パスワード';
2. DBを作成
> psql -U postgres
postgres => CREATE DATABASE [DB名] OWNER=[オーナーユーザ名]
3. ダンプを投入
pg_restore -d [DB名] -Fc -U [ユーザ名] [ダンプファイルのパス]

cオプションをつけると投入前に既存テーブルをdropする.

pg_restore -d [DB名] -Fc -U [ユーザ名] -c [ダンプファイルのパス]

CオプションをつけるとDBも作ってくれるらしいが使ったことない.

4. 確認
> psql -U [ユーザ名] -d [DB名]

gVimをWSL(Ubuntu)のターミナルとして使うためにやったこと

WindowsでWSLを使っていると大体の人が不満に思うのは, 恐らくターミナルエミュレータだと思う.

タブも使えないし, tmux使うとなんかズレるし.

そこで良いターミナルエミュレータを探していたんだけど, vimにterminalが入った事を思い出した.

案外良いのではないかと.

bashを開く

kaoriya版のgVimであれば

:terminal

でターミナルを開いた後に,

> bash

とコマンドを打つだけでWSLのbashが立ち上がる. (ただし, Windows10のwindows10 2018 april updateが必要だが)

ちょっと余談

何故かvim本家のインストーラで入れたgVimだとbashが呼び出せなかった.

:terminalで起動したコマンドプロンプトでsystem32のフォルダへ移動してdirコマンドで確認してもbash.exeだけ不可視になっている.

本家のインストーラをずっと使っていたので, できればこちらを使いたいのだが, 理由がわからなくて諦めモード.

知ってる人いたらコメント欲しいです....

フォントを入れる

Rictyを使っています.

_gvimrcに以下を追加.

" フォント設定:
"---------------------------------------------------------------------------
" Ricty12ポイント
set guifont=Ricty_Diminished:h12:cSHIFTJIS:qDRAFT
" 行間隔の設定
set linespace=1

ターミナルエミュレータの色を変える

これがわからなくて大変苦労した.

コマンドプロンプトbashの色は個人的にはキツイので, なんとかして変えたい.

Ubuntuでの変え方は既に分かっているのだけど, gVim上ではどう設定するのかがわからない.

割と諦めモードだった時に以下の記事を見つけて救われた.

Vim のターミナルウィンドウの文字色を設定する

専用のターミナルカラー設定変数があるらしい.

以下は上記の記事からの勝手な引用.16要素あるので#RRGGBB 形式で設定するそうで.

let g:terminal_ansi_colors = [
  \ "#0c0c0c", "#c50f1f", "#13a10e", "#c19c00",
  \ "#0037da", "#881798", "#3a96dd", "#cccccc",
  \ "#767676", "#e74856", "#16c60c", "#eadf84",
  \ "#3b78ff", "#b4009e", "#61d6d6", "#e8e8e8"
  \ ]

楽していい感じにしたい

色設定の方法はわかった.

しかし, 設定を作るのがだるい(怠け者).

誰か良い設定を作っていないかと徘徊を続けた所, gistに公開して下さっている方がいたので勝手に拝借した.

趣味が合う感じで良かったのでこのまま利用させてもらう事に.

キーマップを追加する

イチイチ長いので追加した.

特にホームに戻るのがめんどい.

" <Leader>ttで現在のウィンドウでWSL Bashを開く
nnoremap <Leader>tt :terminal ++close ++curwin bash -c "cd; bash -l"<CR>

Leaderはこういう時便利だ.

特有の操作を少し覚える

:terminalはかなり良いのだが, 若干操作に癖がある.

バインド 機能
CTRL-W . 端末内にCTRL-Wを送る
CTRL-W CTRL-\ 端末内にCTRL-\を送る
CTRL-W N 端末からノーマルモードへ戻る
CTRL-W " {reg} レジスタ {reg} の内容を貼り付け

慣れなので大したことはない.

さらに詳細はドキュメントに載っている.


ここまででかなり良くなった.

しばらくこれで仕事してみる.

WSLでVagrantを使う際のメモ

VagrantもWSLから使いたい.

公式サポートはしていないようだけど, アルファ版で機能提供されているようなので使ってみた.

VirtualBoxのインストール

ここからダウンロード

ホストになるWindowsVirtualBoxをインストールする.

これはWSLは関係ない.

WSL上にVagrantをインストール

Ubuntu(WSL)を開いて, ダウンロードしてインストール. Vagrantは普通のdebian向けのものを使えばいい.

$ curl -OL https://releases.hashicorp.com/vagrant/2.1.2/vagrant_2.1.2_x86_64.deb
$ dpkg -i vagrant_2.1.2_x86_64.deb

環境変数を設定

WSLで使うための環境変数が用意されている.

変数名 内容
VAGRANT_WSL_ENABLE_WINDOWS_ACCESS WSLからVagrantを使う時は"1"を設定
VAGRANT_WSL_WINDOWS_ACCESS_USER Windows側のユーザ名

これを.profileにでも書いておいてやる.

export VAGRANT_WSL_ENABLE_WINDOWS_ACCESS="1"
export VAGRANT_WSL_WINDOWS_ACCESS_USER="twinbird"

シェルを再起動.これで使えるようになる.

ハマりポイント

ストアアプリのUbuntu18.04ではうまく動かなかった.

ストアアプリのUbuntuとUbuntu18.04の違いがよくわかってない.
(いや, もちろん18.04にはなってるんだけど)

パスの引継も18.04ではうまくいっていないし, とりあえずUbuntu(無印)を使うのが無難っぽい.

Homestead環境をWSL(Ubuntu)上で用意した時のメモ

忘れそうなので, とりあえずざっとメモ.

vagrantをWSL上に入れる

別記事にした.

Homesteadのインストール

WSL(ubuntu)で作業.

$ git clone https://github.com/laravel/homestead.git
$ bash init.sh # Homestead.yamlが生成される. 必要なら生成ファイルを変更する.
$ ssh-keygen -t rsa # 必要なら.Homestead.yamlのkeyとファイル名を合わせる
$ vagrant up
$ vagrant ssh
$ composer create-project --prefer-dist laravel/laravel code # Homestead.yamlのデフォルトはcodeなのでとりあえずcodeで試す

192.168.10.10へホストからブラウザでアクセスして動作を確認.

プロジェクト名を変えるときにはHomestead.yamlのfoldersとsitesを変えれば良い.

WSLでVagrantを動作させる事自体も特に戸惑わないので今後はWSL上でやろうと思う.

VimpleNoteを使ってvimでSimplenoteを使う

Simplenoteは必要なものがわかっているとても良いサービスです.

テキストの編集と検索しかできませんが, 多くの端末から利用できます.

しかし惜しいことにvimから編集できません.

これを解決するプラグインsimplenote.vimがあります.

こちらも素晴らしいですが, python依存は避けたいところです.

と思っていたら, なんとvimscriptで書き直したVimpleNoteという物があります.

例によってid:mattnさんの作品です.

導入

Vim8でWindows10 Home WSL上へ導入していきます.

VimpleNoteは以下に依存しています.

WSLであればcurlが入っているので, 必要なものをgitでcloneするだけです.

こちらの記事にもあるようにvim8からはプラグイン管理が楽になって助かります.

$ cd /home/twinbird/.vim/pack/mypackage/start
$ git clone https://github.com/mattn/vimplenote-vim.git
$ git clone https://github.com/mrtazz/simplenote.vim.git

設定

.vimrcへ以下を追加します.

let g:VimpleNoteUsername = "[Simplenoteのユーザ名]"
let g:VimpleNotePassword = "[Simplenoteのパスワード]"

dotfilesなどでパブリックな場所にvimrcを補完している方は別ファイルにした方が良いでしょう.

" 上述のletを記載したファイルを読み取る
source .vimplenoterc

使い方

ノーマルモードで叩くだけです.

コマンド 動作
:VimpleNote -D 現在のバッファのノートを削除
:VimpleNote -d ノートをゴミ箱へ
:VimpleNote -l ノートの一覧を表示
:VimpleNote -n 現在のバッファから新しいノートを作る
:VimpleNote -t 現在のバッファにタグをつける
:VimpleNote -u バッファのノートを更新

wコマンドで保存すれば更新してくれるし, 非常に便利です.

強いて言えばSimplenote自体のセキュリティがシンプル過ぎるので, 2段階認証が欲しいという気はしないでもないですが.