WPP
CakePHP の migrations で外部キーを作る時は、unsigned にするといいかもしれない話

ある長年動いていた CakePHP 3 アプリを移行するために、一旦 CakePHP5 の tuta をやり始めたところだ。

Cake公式のチュートリアルはブログアプリをつくることになるのだが、DB の作成はベタで SQLを叩くようになっている。そのままやってももちろんいいし最短時間で目的の状態になるのだが、今回は移行時に使うことになるのであえて migrations を使ってみた。

で要点から、 migrations はデフォルトで、id フィールドを作ってくれるのですがそれが int(11) になっているようです。一方、migrations で integer でフィールドを作成すると int(10) になるのがデフォルトのようです。
となると結果として外部キーを作成するときにフィールドの桁数が合わずに作れずエラーになるという事象に遭遇したという話です。

ブログチュータで実際のコードはこんな感じになります。

ファイル名の先頭部分は日時を示します。 空のファイル自身もこんなふうに migrations で生成できます。
./app/bin/cake migrations create CreateUsers

でユーザーテーブルはこれです。

<?php
declare(strict_types=1);

use Migrations\AbstractMigration;

class CreateUsers extends AbstractMigration
{
    /**
     * Change Method.
     *
     * More information on this method is available here:
     * https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method
     * @return void
     */
    public function change(): void
    {
        $table = $this->table('users');
        $table->addColumn('email', 'string', [
            'default' => '',
            'limit' => 255,
            'null' => false,
            'comment' => ''
        ])
        ->addIndex(['email']);
        $table->addColumn('password', 'string', [
            'default' => '',
            'limit' => 255,
            'null' => false,
        ]);
        $table->addColumn('created', 'datetime', [
            'default' => null,
            'null' => false,
        ]);
        $table->addColumn('modified', 'datetime', [
            'default' => null,
            'null' => false,
        ]);
        $table->create();
    }
}

アーティクルテーブルはこうなりました。

user_id フィールドの signed を false にする必要がある。

<?php
declare(strict_types=1);

use Migrations\AbstractMigration;

class CreateArticles extends AbstractMigration
{
    /**
     * Change Method.
     *
     * More information on this method is available here:
     * https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method
     * @return void
     */
    public function change(): void
    {
        $table = $this->table('articles');
        $table->addColumn('user_id', 'integer', [
            'null' => false,
            'signed' => false,
        ]);
        // ->addIndex(['user_id']);
        $table->addColumn('title', 'string', [
            'default' => '',
            'limit' => 255,
            'null' => false,
        ]);
        $table->addColumn('slug', 'string', [
            'default' => '',
            'limit' => 191,
            'null' => false,
        ]);
        $table->addColumn('body', 'text', [
            'default' => null,
            'null' => true,
        ]);
        $table->addColumn('published', 'boolean', [
            'default' => false,
        ]);
        $table->addColumn('created', 'datetime', [
            'default' => null,
            'null' => false,
        ]);
        $table->addColumn('modified', 'datetime', [
            'default' => null,
            'null' => false,
        ]);
        $table->addIndex('slug', [
            'unique' => true
        ]);
        $table->addForeignKey('user_id', 'users', 'id',
            [
                'delete' => 'NO_ACTION', 
                'update' => 'NO_ACTION'
            ]
        );
        // $table->changePrimaryKey(['article_id', 'tag_id']);
        $table->create();
    }
}

tags テーブルはこうなる。

<?php
declare(strict_types=1);

use Migrations\AbstractMigration;

class CreateTags extends AbstractMigration
{
    /**
     * Change Method.
     *
     * More information on this method is available here:
     * https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method
     * @return void
     */
    public function change(): void
    {
        $table = $this->table('tags');
        $table->addColumn('title', 'string', [
            'limit' => 191,
        ]);
        $table->addColumn('created', 'datetime', [
            'default' => null,
            'null' => false,
        ]);
        $table->addColumn('modified', 'datetime', [
            'default' => null,
            'null' => false,
        ]);
        $table->addIndex('title', [
            'unique' => true
        ]);
        $table->create();
    }
}

Articles テーブルと同じように外部キーを保存するフィールドはアンサインドにする。

<?php
declare(strict_types=1);

use Migrations\AbstractMigration;

class CreateAticlesTags extends AbstractMigration
{
    /**
     * Change Method.
     *
     * More information on this method is available here:
     * https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method
     * @return void
     */
    public function change(): void
    {
        $table = $this->table('aticles_tags');
        $table->addColumn('article_id', 'integer', [
            'null' => false,
            'signed' => false,
        ]);
        $table->addColumn('tag_id', 'integer', [
            'null' => false,
            'signed' => false,
        ]);
        $table->addColumn('created', 'datetime', [
            'default' => null,
            'null' => false,
        ]);
        $table->addColumn('modified', 'datetime', [
            'default' => null,
            'null' => false,
        ]);
        $table->addForeignKey('tag_id', 'tags', 'id', [
            'delete' => 'NO_ACTION', 'update' => 'NO_ACTION'
        ]);
        $table->addForeignKey('article_id', 'articles', 'id', [
            'delete' => 'NO_ACTION', 'update' => 'NO_ACTION'
        ]);
        $table->create();
    }
}

これで DBの構築はできたが、先に進んだ所で間違いがあれば修正していくかもしれない。

flatpak でインストールしたアプリ起動すると org.kde.Platrome がないと怒られる

これは定番ネタなのかもしれませんが、知らなかったのでポストします。
結論からいうと flatpak で kde ランタイムが不足しているときにインストールしたって話です。恐らく同様にランタイム不足のエラーの時同じような対応で行ける気がします。

数週間前から Linux Mint のデスクトップ環境をメイン PC として作業しているのですが、flatpak で gitty というアプリをインストールした時のことです。LM メニュー()から起動しようとしてもどうにも立ち上がってきません。

仕方ないのでラウンチャアイテムのプロパティを見てみると ’/usr/bin/flatpak run –branch=stable –arch=x86_64 –command=gittyup com.github.Murmele.Gittyup’ というコマンドを実行しているのがわかります。おもむろに実行すると。。。

$ /usr/bin/flatpak run --branch=stable --arch=x86_64 --command=gittyup com.github.Murmele.Gittyup
error: runtime/org.kde.Platform/x86_64/5.15-21.08 not installed

kde 関連のライブラリが不足しているようです。

Bing のcopilot がいうには、’flatpak repair –user’ や ‘sudo flatpak update’ すればいい的なこと言っていますが実施しても変わらずです。

参考リンクを見ながら適当にイントールしてみます。

flatpak install で怒られたライブラリをしていすれば良いようです。

$ flatpak install org.kde.Platform
Looking for matches…
Similar refs found for ‘org.kde.Platform’ in remote ‘flathub’ (system):

   1) runtime/org.kde.Platform/x86_64/5.13
   2) runtime/org.kde.Platform/x86_64/5.10
   3) runtime/org.kde.Platform/x86_64/5.12
   4) runtime/org.kde.Platform/x86_64/5.11
   5) runtime/org.kde.Platform/x86_64/5.15
   6) runtime/org.kde.Platform/x86_64/5.14
   7) runtime/org.kde.Platform/x86_64/5.15-21.08
   8) runtime/org.kde.Platform/x86_64/5.15-22.08
   9) runtime/org.kde.Platform/x86_64/5.15-23.08
  10) runtime/org.kde.Platform/x86_64/6.2
  11) runtime/org.kde.Platform/x86_64/6.3
  12) runtime/org.kde.Platform/x86_64/6.4
  13) runtime/org.kde.Platform/x86_64/6.5
  14) runtime/org.kde.Platform/x86_64/6.6
  15) runtime/org.kde.Platform/x86_64/6.7
  16) runtime/org.kde.Platform/x86_64/5.9

Which do you want to use (0 to abort)? [0-16]: 7
Info: org.kde.Platform//5.15-21.08 is end-of-life, with reason:
   We strongly recommend moving to the latest stable version of the Platform and SDK
Applications using this runtime:
   com.github.Murmele.Gittyup
Info: org.freedesktop.Platform.GL.default//21.08 is end-of-life, with reason:
   org.freedesktop.Platform 21.08 is no longer receiving fixes and security updates. Please update to a supported runtime version.


        ID                                             Branch                Op            Remote             Download
        ID                                             Branch                Op            Remote             Download
 1. [✓] org.freedesktop.Platform.GL.default            21.08                 i             flathub            129.8 MB / 129.8 MB
 2. [✓] org.freedesktop.Platform.openh264              2.0                   i             flathub              1.8 MB / 1.5 MB
 3. [✓] org.kde.Platform.Locale                        5.15-21.08            i             flathub              1.2 MB / 348.0 MB
 4. [✓] org.kde.Platform                               5.15-21.08            i             flathub            327.7 MB / 311.1 MB

Installation complete.

無事起動しました!

flatpak はなんとなく避けていましたが、そろそろ使い方を覚えないといけないな、と思った出来事でした。

参考

Problems Updating Flatpak Via Terminal: org.kde.Platform – Fedora Discussion

Linux Mint 21.3に docker インストール

定番ネタのひとつですが、apt-key が DEPRECATED らしいのでそれに対処したのでメモする

Linux Mint はほぼ Ubuntu と考えて問題ないのだが公式にも Mint は Ubuntu バージョンの環境変数が違うよ。と指摘されている。

素直に書き換えると、にこうなる。

$ sudo apt-get update
$ sudo apt-get install ca-certificates curl
$ sudo install -m 0755 -d /etc/apt/keyrings
$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
$ sudo chmod a+r /etc/apt/keyrings/docker.asc

$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$UBUNTU_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt-get update

しかしこのやり方だと apt update で warrning が出る。調べると apt-key が DEPRECATED なことに関連しているらしい。

man apt-key してみると、公開鍵を /etc/apt/trusted.gpg.d に置くのが正解のようだ。

そうすると、docker.list の中の signed-by= の場所がずれてしまうが、同フォルダの他のソース設定ファイルをみると signed-by はなくてもよさそうなので削ってみる。

$ sudo mv /etc/apt/keyrings/docker.asc /etc/apt/trusted.gpg.d/

; signed-by を削除
$ sudo vi /etc/apt/sources.list.d/docker.list 
deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable
:wq

これで apt update 時に warning (ワーニング ? ウォーニング ? どっちが正しい ?) が出なくなった。

最初からやるには、 キーを取ってくるときに、trusted.gpg.d に置けばいいと思う。

Mint のバージョンが異なると相当する Ubuntu のコード名が変わるのだけであとは同じ。コード名は最初のスクリプトが示す通り /etc/os-release を見ればわかる。

参考

Install Docker Engine on Ubuntu | Docker Docs

Linux Mintにdockerを入れる #Docker – Qiita

Wine を OS が英語モードのまま日本語表示する

internet には Wine に fakecjk とか ipafont とかのフォントを入れて日本語化するという tips を見つけることができます。

しかし、OS が英語モードで動作しているときはそれだけでは、日本語を表示できない。

というのも Linux コンソール(用語が間違っているかもしれない)の設定が日本語になっていないので環境変数正しくを設定する必要があるようです。

$ LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja" wine ./WINAPP.EXE

; あるいは
$ export LANG=ja_JP.UTF-8
$ export LANGUAGE="ja_JP:ja" 
$ wine ./WINAPP.EXE

毎回入力するのは面倒なので 環境変数を設定した上で wine を起動するスクリプトを書くのがいいだろう。

Synology NAS の 5001 ポートを何とかする

Synology の NAS では Web アプリが 5001 で待受けをしています。制限のゆるいネット環境では恐らくなんの問題もなくアクセスできるでしょう。

しかし会社等 PROXY 経由でインターネットに抜ける環境などの制限がきついネットワークでは 5001 ポートにアクセスできないことがあります。逆向きにいうと 443 ポートでないと自由に外に抜けられないことが多いということです。

そんなときに NAS のリバースプロキシを使って解決することができます。

手順

  1. コントロールパネルを開きます。
  2. ログインポータルから Advanced を開きます。
  3. Reverse Proxy をクリックします。
  4. Create ブタンをクリックします。
  5. イメージのように
    Source側
    Protocol: HTTPS
    Hostname: 新サブドメイン.自分のDDNS (例 dsm.ZZXXYY.myde.me 適宜アジャストしてください。)
    Port: 443
    Destination側
    Protocol: HTTPS
    Hostname: localhost
    Port: 5001
    と設定します。
  6. ブラウザで https://dsm.ZZXXYY.myds.me にアクセスして DSM の Web が表示するはずです。

解説

リバースプロキシの設定では外側のプロトコル、ホスト名、ポートの組をどこか他に流すという設定をします。

ところで NSA ホスト名は Synology の DDNS で振り出されるサブドメインを利用していることが多いと思います。自分の環境では、myds.me のサブドメインが振り出されています。ここではダミーサンプルとして ZZXXYY という名前を使用します。実際にはご自分で決めたサブドメインになっているはずです。

ここがポイントなのですが、Synology のDDNS は自分で決めた ZZXXYY の更にしたのレベルのサブドメインを作ってもちゃんと NASに向けて名前解決してくれます。DDNS の内部では * で全部のサブドメインを受けてくれているようです。

要するに、dsm.ZZXXYY.myds.me としても自分の NAS に向けてアクセスしにくるということです。

この tips がインターネットを検索しても見当たらないので記事にしました。せっかく NAS 使用していてもリバースプロキシ使ったらいいのにと思う記事が多く、少しでも知識が広まってくれれば嬉しいです。

Linux Mint を英語モードのままで Mozc を設定する

インターネットで割とよくあるネタではあるのですが、ちょっとハマったので記事にします。
結果からいうと一旦、日本語表示にして設定するというものです。

ハマった状況というのは、Linux Mint を英語モードでインストールしました。

その状態で参考リンクの内容を実行しても日本語を入力できませんでした。

apt でインストールされているモジュール群を確認するも正しい状態のようです。

ふと、日本語表示にしてからやってみたらどうなる? と思いたいたち実行するとあっさりあっさり日本語入力がアクティブになりました。その状態のまま英語表示に変更すると日本語入力ができるようになりました。

という駄話でした。

参考

超簡単!Linux Mint Google日本語入力mozcのインストール方法 | ビバ!Linux

Fcitx – ArchWiki

Linux Mint のスワップファイルを大きくする

今朝、Linux のノートPCをレジュームで起動するとどうやらスワップファイルがパンパンになっているようでほとんど操作ができない状態に陥った。free -h すると 2GB のスワップファイルを使い切っていてどうにも処理が進まない様子だ。

なので、スワップファイルを大きくすることにした。

; もともとあるスワップファイルが swapfile という名前だったので適当に変えた
$ sudo fallocate -l 4G /swapspace

$ sudo chmod 600 /swapspace
$ sudo mkswap /swapspace
$ sudo swapon /swapspace

$ sudo swapoff -v /swapfile

このままだと再起動するとスワップを認識しなくなるので、/etc/fstab に追記する

/swapspace  none  swap  defaults  0  0

これでしばらく様子をみることにしよう。

参考

Linux Mint 21にスワップスペースを追加する方法

スワップ – ArchWiki

CakePHP で .env を使う方法

CakePHP では .env に設定値を逃して env() で読み込むことができると Cookbook: 構成設定 – 5.x に説明されている。だがしかし、説明のとおり.env.example を.env にコピーしても反映されない。(Cookbook は、.env.default となっているが実際のファイルは、.env.examlpe となっている。んー。)

検索すると Qiita にそれっぽいのがあったのでやってみるとビンゴだった。

bootstrap.php の中で .env をロードする処理がコメントアウトされているためだった。

/*
 * See https://github.com/josegonzalez/php-dotenv for API details.
 *
 * Uncomment block of code below if you want to use `.env` file during development.
 * You should copy `config/.env.example` to `config/.env` and set/modify the
 * variables as required.
 *
 * The purpose of the .env file is to emulate the presence of the environment
 * variables like they would be present in production.
 *
 * If you use .env files, be careful to not commit them to source control to avoid
 * security risks. See https://github.com/josegonzalez/php-dotenv#general-security-information
 * for more information for recommended practices.
*/
if (!env('APP_NAME') && file_exists(CONFIG . '.env')) {
    $dotenv = new \josegonzalez\Dotenv\Loader([CONFIG . '.env']);
    $dotenv->parse()
        ->putenv()
        ->toEnv()
        ->toServer();
}

今回、.env ファイルに DB 周りの設定を逃してみた。

こんな感じでホスト名やDB関連のパラメータを設定すると

export DB_HOST="maria"
export DB_ROOT="root"
export DB_ROOT_PASS="DBPASSWORD!"
export DB_NAME="CAKE_DATABASE"
export DB_USER="user"
export DB_PASS="PASSWORD"

app_local.php で env() で読み込む

return[
// 一部抜粋

  'Datasources' => [
        'default' => [
            'host' => env('DB_HOST', null),
            'username' => env('DB_USER', null),
            'password' => env('DB_PASS', null),
            'database' => env('DB_NAME', null),
            //'schema' => 'myapp',
        ],

// 抜粋終わり

CakePHP のドキュメントは割とわかりやすいので嫌いではないが、app_local.php や .env 周辺の説明は相変わらずファイル名の間違いや記述の不足があってわかりにくい。

このへんなんとかならないかな。

参考

CakePHP3で.envファイルを有効化する #PHP – Qiita

docker 内のcakephp ローカルサーバにアクセスできない時

超小ネタ。docker 内に cakephp 5 を入れてとりあえず面倒なので、Webサーバなしで軽く試そうと思い cake のローカルサーバを起動するも外部からアクセスできない現象に遭遇した。

もちろん docker -p や docker-compose.yml ports は正しく構成しています。

答えは、コンテナ内でローカルサーバを起動した画面にすでにありました。

; app に cakephp5 をインスールしています。ご自分の環境に読み替えてください。
# app/bin/cake  server 

Welcome to CakePHP v5.0.6 Console
-------------------------------------------------------------------------------
App : src
Path: /var/www/app/src/
DocumentRoot: /var/www/app/webroot
Ini Path: 
-------------------------------------------------------------------------------
built-in server is running in http://localhost:8765/
You can exit with `CTRL-C`
[Sun Mar 24 10:27:49 2024] PHP 8.3.3 Development Server (http://localhost:8765) started

cake server が localhost にバインドしているので、外からはアクセスできない状態ってことを暗に示しています。

これを動作するようにするには、0.0.0.0 にバインドします。お好みで -p でポートを変更してもいい。

# app/bin/cake server -H 0.0.0.0 

考えてみれば当たり前のことで、 Docker はホストとは別のネットワークを生成します。この時、コンテナ内の localhost へアクセスできません。 0.0.0.0 にバインドするってことは、コンテナにあるすべての NIC で待受することになるので、アクセスできるようになったってことだと思われる。

Android Studio 2023.2.1の “Gradle JDK” から重複項目を削除

Android Studio で Gradle の JDK をダウンロードすると、複数同じ項目が表示されることがある。それを削除する方法です。

参考のくまねこさん記事の内容をやりたいのだが、かの記事は Mac の場合のパス名になっています。自分は今開発機にしているのが Linux Mint なのでパスが異なるのでそれを調べた。要は jdk.table.xml はどこにあるかってことです。

その Gradle の設定画面は、以下の操作で開いた画面のことです。

  1. File メニュー > Settings を選び Settings ダイアログを表示します。
  2. Build, Execution, Deployment > Build Tools > Gradle と左のツリービューをたどり
  3. Gradle JDK: ドロップダウンリスト

ここのことです。

[ここに画像をいれること]

Download JDK でもともと存在する JDK と同じものを指定するとホームディレクトリにダウンロードして名前に (2) とか付加される仕組みのようです。

で、 jdk.table.xml ファイルってどこにあんのよ? って話ですが、ヒントは Android Developer のページにありました。

Troubleshoot Android Studio  |  Android Developers このページによると設定ファイルはホームディレクトリの.config 以下にあるようです。

探してみると /home/mnishi/.config/Google/AndroidStudio2023.2/options フォルダに jdk.table.xml はありました。

見つかった XML ファイルを慎重に編集して Android Studio を再起動すると反映されます。

XML なのでカッコの対応崩れるときっとろくでもないことがおきます。きちんとバックアップとってからいじりましょう。

にしても、Android Studio の環境構築は繊細でやっぱり好きになれない。

参考

Android StudioでGradle JDKのバージョン一覧の整理 – Zenn くまねこさん

Troubleshoot Android Studio  |  Android Developers