epubcheckで「mimetypeファイルエントリが存在しないか、アーカイブの先頭以外の場所に存在しています.」

epubcheckというEpub向けのW3C製の構文チェッカーがあります。 実行するとありがたい指摘をしてくれるのですが、次のエラーだけは原因が分かりませんでした。

$ java -jar epubcheck.jar ~/tmp/main.epub 
EPUB version 3.2 のルールを使って検証します.
ERROR(PKG-006): /home/Artisan/tmp/main.epub(-1,-1): mimetypeファイルエントリが存在しないか、アーカイブの先頭以外の場所に存在しています.

チェックは終了しましたがエラーが検出されました
メッセージ: 0 件の致命的エラー / 1 件のエラー / 0 件の警告 / 0 件の情報

EPUBCheck 完了

調べたところ、次のようなやりとりを発見。

github.com

どうやら、mimetype を圧縮せずに zip し、その後その他のリソースを圧縮して追加せよとのことらしい。 詳細はよくわからんが、次のようにすればOKらしい。本当はしっかりオプションを理解しないとだめなんだろうけど…。

$ zip -X0 ../main.epub mimetype
$ zip -9 -r ../main.epub META-INF OEBPS

PHPのマジックメソッド

__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() および __debugInfo() があるみたい。

https://www.php.net/manual/ja/language.oop5.magic.php

ここでは、__toString()__invoke() の使い方を簡単に説明する。

__toString()

クラスが文字列に変換される際の動作を決めるもの。

__invoke()

オブジェクトを関数としてコールされる際に呼び出されるもの。

<?php
class TestClass
{
    public function __toString()
    {
      return 'toString() is called.';
    }

    public function __invoke()
    {
      return 'invoke() is called.';
    }
}

$class = new TestClass();
echo $class;
echo $class();

出力結果

toString() is called.invoke() is called.

MySQLにパスワード無しでログインする

ただし、絶対に開発環境などセキュリティが担保されているところで利用してね。

my.cnfに次のように設定する。

[mysqld]
skip-grant-tables

sudo systemctl restart mysql

などでMySQLを再起動させる。

MySQL8でユーザーを作成して全ての権限を付与する

バージョン間の差異なのかうまくいかないことが多いのでまとめておく。

mysql> create user 'your-user'@'%' identified  by 'your-password';
Query OK, 0 rows affected (0.01 sec)

mysql> create database `your-db-name`;
Query OK, 1 row affected (0.01 sec)

mysql> GRANT ALL PRIVILEGES ON `your-db-name`.* TO 'your-user'@'%';
Query OK, 0 rows affected (0.01 sec)