write ahead log

ロールフォワード用

シェルのリダイレクトで混乱したときに

混乱してきた.

stackoverflowの回答が簡潔でよかったので表にしておく.

コマンド シンタックス 意味
> ディスクリプタ > ファイル名 ディスクリプタの内容をファイル名へ
>& ディスクリプタ >& ファイルディスクリプタ ディスクリプタの内容をディスクリプタへ
&> cmd &> ファイル名 cmdの標準出力とエラー出力をファイル名へ
&>> cmd &>> ファイル名 cmdの標準出力とエラー出力をファイル名へ(追記)

最後の2つがあるから, いつも混乱する気がする...

エクスプローラから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でもどうにも現象が収まらなかったので上記で解決した.

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

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

ホストで以下を実行.

vagrant plugin install vagrant-vbguest

ゲストで以下を実行.

# yum update kernel -y
# yum install kernel-devel gcc -y

ゲストをリロード.

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

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