write ahead log

ロールフォワード用

エクスプローラからMSYS2を開いてついでにvimも開けるようにする

VirtualBoxと一緒にWSL使ってるとどうにもネットワークの調子が悪いので, 切り分けのために一度MSYS2生活に戻ることにした.

ただ, 右クリックのコンテキストメニューからターミナルが開けないのはどうにも具合が悪い.

さらに言うといくつもvimを入れたくないので, MSYS2のもの一本にしたい.

というわけでレジストリをいじった.

レジストリ変更用のファイルを作成

以下のファイルを作成.

(msys2here.regとか, 適当なファイル名で)

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shell\MSYS2HERE]
@="MSYS2 Here"

[HKEY_CLASSES_ROOT\Directory\Background\shell\MSYS2HERE\command]
@="C:\\msys64\\msys2.exe"

[HKEY_CLASSES_ROOT\*\shell\openWithMsysVim]
@="OpenWithVim"

[HKEY_CLASSES_ROOT\*\shell\openWithMsysVim\command]
@="C:\\msys64\\msys2.exe vim \"%1\""

これで右クリックのコンテキストメニューに「MSYS2 Here」と「OpenWithVim」が追加される.

あと, 環境変数の引継ぎとかもしたかったので, バッチファイルを変更しようとしたら, 以前と違って専用のiniファイルに切り出されたらしい.

C:\msys64\msys2.ini

というファイル名になっていた. 一部のコメントアウトをアンコメントする.

MSYS=winsymlinks:nativestrict
#MSYS=error_start:mingw64/bin/qtcreator.exe|-debug|<process-id>
CHERE_INVOKING=1
MSYS2_PATH_TYPE=inherit
MSYSTEM=MSYS

これで随分使いやすくなった.

Laravelで画像をリサイズする際のメモ

Laravel 5.7で試した.

intervention/imageを使った.

他にも透かしを入れられたりと便利.

基本的に上記の公式を見るのがよい. 以下は怠けたいとき用.

composerでパッケージのインストール

$ composer require intervention/image

laravelのconfigへ追記

config/app.phpへ以下を追記.

$providers変数へ以下を追加する.

 $providers = [
        ...
        Intervention\Image\ImageServiceProvider::class,
        ...
    ];

$aliasesも追記しておく.

 $aliases = [
        ...
        'Image' => Intervention\Image\Facades\Image::class,
        ...
    ];

コントローラーのコード

コントローラーにこんなコードを書いた.

$file = $request->file('foo'); // fooってパラメータ名で取得
$x = 300; // 300px
$y = 300; // 300px

// 画像をリサイズ
$img = \Image::make(file_get_contents($file->getRealPath()));
$img->resize($x, $y, function($constraint) {
    $constraint->aspectRatio(); // アスペクト比を保つ
});
$img->save($file->getRealPath());

// 他のストレージへ保存
$file->storeAs($save_path, $filename, 'public');

Laravelでcomposer使うとやたらIt is unsafe to run Dusk in production.と言われる時の対処

なんか前も同じ事やった気がするのでメモっとく.

composer installとかcomposer updateをすると以下のメッセージが出てくる.

It is unsafe to run Dusk in production.

本番環境でDusk入れるなあぶねーぞだそうだ.うん.そうだね.

対処

composer.jsonに以下を追記した.

     "extra": {
         "laravel": {
             "dont-discover": [
+                               "laravel/dusk"
             ]
         }
     },

昔見た時にはrequire-devへduskの記述を書けばよいってのがあった気がするんだけど.(っていうか名前的にそうじゃね?)

require-devでもどうにも現象が収まらなかったので上記で解決した.

追記

php初心者過ぎて全くわかってなかった.

productionでコンポーザ使う時にはオプション付けないといけないらしい.

$ composer install --no-dev

vagrantでcentos7を使ったときに共有フォルダが使えなかったのでやったこと

shared_folderあんまり使わないから困った. カーネルモジュールがいるのかな?

ホストで以下を実行.

vagrant plugin install vagrant-vbguest

Vagrantfileに以下を書く.

config.vm.synced_folder ".", "/vagrant",type:"virtualbox"

ゲストをリロード.

vagrant reload

Laravelでビューの独自ヘルパ関数が欲しいときにはどうすればいいのか

わからん.

が, とりあえず調べてみると説得力あるのが以下だった.

teratail の回答

要は「Laravel公式でもヘルパ関数が用意されているんだから, その実装方法を見習え」ということっぽい.

確かにLaravelには豊富なヘルパ関数がある.

単純に実装する

この方法で実装するなら以下のサイトの「Composerでオートロードする方法」みたいな感じだろうか.

Laravel 5へ自作のヘルパー関数を追加するベストプラクティス - 綺麗に死ぬITエンジニア

確かにシンプルでいい.

というか仕事で使った.

名前空間切りたいんですが

しかし, なんでもかんでもグローバルってのも.

と思ってみていたらbladeには@injectという記法があるらしい.

Blade Templates - Laravel

@inject('変数', 'クラス名') 

とすればDIできる.なんかやりたい放題な気もするけど.

試しにやってみる

Laravelプロジェクトを作って, serviceディレクトリと雑なサービスをつくる.

$ mkdir app/Services
$ vi app/Services/MoneyFormatService.php

とりあえずフォーマットするメソッド生やす.

# app/Services/MoneyFormatService.php

<?php

namespace App\Services;

class MoneyFormatService
{
    // 金額をフォーマットする雑なメソッド
    public function moneyFormat(float $money)
    {
        return "¥" . number_format(floor($money));
    }
}

雑にビューを作る.

{{-- resource/views/sample.blade.php --}}

@inject('formatter', 'App\Services\MoneyFormatService')

サンプルだよ.

<p>{{ $formatter->moneyFormat(1000) }}</p>

ルートも雑に作る.

# route/web.php

Route::get('/sample', function() {
    return view('sample');
});

実行結果

サンプルだよ.
¥1,000

無秩序にドメイン特化なヘルパ関数を作りまくるよりはいいかもしれない.

汎用的なものは最初の参考例通りグローバルとして用意して,
あとはきちんとサービスを用意して必要に応じてDIすりゃいいということだろうか(知らんけど)

そもそもLaravelってDIきちんと使えないとダメなフレームワークっぽいんだけど, 雑魚の私にそこまでできるかという問題.

Kindle for PCをUbuntu 18 LTSに入れる方法

Ubuntuを上げたので.

Ubuntuのバージョン

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.1 LTS"

wineを入れる

$ sudo apt install wine-stable
$ wine --version
wine-3.0 (Ubuntu 3.0-1ubuntu1)

wineを設定

$ winecfg

上のコマンドを入れるとウィンドウが開くのだが, 文字化けがひどい.

とうふがたくさん出る.

wineの設定(日本語設定)

$ sudo apt install -y winetricks
$ winetricks

ウィンドウが開くのでフォントをインストールするっぽい選択肢からckjfontsをインストールする.

インストールエラーが出たけど「OK」押しまくってたら普通に動いた. (wineのプロセスを殺せみたいなエラーだったような...)

wineの設定(再び)

$ winecfg

ウィンドウが開いて日本語が出ることを確認.

「Windowsバージョン」はWindows10にした.

Kindle for PCのダウンロード

Amazonの最新版をダウンロードしても動かなかった.

調べるとUbuntu16で同様の現象に遭遇した場合, 古いバージョンなら動くらしい.

そんなもの配布しているのかと思ったが, なんか怪しい場所で配布していた.

uptodown - Kindle for PC - 1.16.44025

インストール

ダウンロードディレクトリで以下を実行.

$ wine kindle-for-pc-1-16-44025.exe

とりあえず動いて日本語の本も読めた.

Laravelで複数フィールドを組み合わせてバリデーションした時のメモ

FormRequestを使ってバリデーションを書いていた時に, ややこしい条件でバリデーションをかけたくなった.

個別のフィールドに対して検証するのではなく, フィールド2つ以上を組み合わせて検証とか, DBの値を使ってとか.

単一のフィールドそれぞれの検証なら, よくあるサンプルだと以下のように書く.

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class HogeRequest extends FormRequest
{
    [...]

    /**
    * 検証ルール定義
    * (field1と2は必須)
    */
    public function rules()
    {
        return [
            'field1'   => ['required'],
            'field2'   => ['required'],
        ];
    }

    [...]
}

しかしまぁ, 現実は込み入っているので,

  • field1が1~10なら
  • field2は20~30のみ入力可能

とかややこしい分岐が入ったりする.
(これは思い付きのかなり適当な例だけど)

そんな時には自分でメソッドを定義して検証できる.

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class HogeRequest extends FormRequest
{
    [...]

    /**
    * 検証ルール定義
    * (field1と2は必須)
    */
    public function rules()
    {
        /**
        * 検証用の関数
        *   $attribute: 検証中の属性名
        *   $value    : 検証中の属性の値
        *   $fail     : 失敗時に呼び出すメソッド?
        **/ 
        $validate_func = function($attribute, $value, $fail) {
            // 入力の取得
            $input_data = $this->all();

            // 条件に合致しなかったら失敗にする
            if (1 <= $input_data['field1'] && $input_data['field1'] <= 10) {
                if ($input_data['field2'] < 20 || 30 < $input_data['field2']) {
                    $fail('範囲外です.'); // エラーメッセージ
                }
            }
        };

        // ルール定義
        return [
            'field1'   => ['required'],
            'field2'   => ['required', $validate_func],  // 上記のルールを使う
        ];
    }

    [...]
}
もう少し調べてみると

なんかruleの追加やバリデーション定義も割と簡単にできそう.

laravel5.6, 5.7 独自のバリデーションルールを追加しよう! - のるぼるのるの

あと, ある程度の複雑さならsometimes使えば対処できそう.
(そもそもたくさんルールがあるので)

Laravel5.5 - バリデーション

修業が足りない.