ログ日記

作業ログと日記とメモ

Debian stretch で MySQL 5.6 のアップグレード

本家のリポジトリを使ったMySQLの5.6.47 から 5.6.48 のアップグレードが失敗する。


/usr/bin/mysqld_safe のスクリプトが間違っているっぽい。
データディレクトリが /usr/data になってしまう。
OSもMySQLも古いバージョンだから、メンテされていないのかもしれない。

ファイルを書き換えたり色々試したけど、インストールの前後の処理で上書きされたり、post install が止まったりして不安定だった。

ln -s /var/lib/mysql /usr/data

取り急ぎリンクを張ってやり過ごした。


apt でエラーが出たときのコマンドメモ。

dpkg --audit
dpkg --configure --pending
apt --fix-broken install

色々案内されたけど、インストールスクリプトが間違ってたらどうしようもないよね。


apt install --reinstall mysql-server mysql-community-server ではうまくいかず、一旦removeしてinstallした。
パッケージを消してもデータはそのまま残ってるので後でinstallすれば使える。

PHPStan バージョン0.12.24から PDOStatementが Traversable でなくなってしまった件

ジェネリクスの実装が

@implements Traversable<array<int|string, mixed>>

で固定されるようになった。

FETCH_CLASSとジェネリクスを組み合わせていい感じにマッピングする方法が使えなくなって、ちょっとめんどくなってしまった。
都度 @var が必要になる。

一応報告しておいたけど。
https://github.com/phpstan/phpstan/issues/3509
closeされてしまった。

素のPDOStatementを使いつつがっつりクラス定義する人が居なくて、あまり認識されてないのかもしれない。

Let's Encryptで後からサブドメインを変更する

既に取得済みのSSLに、後からサブドメインを追加したくなった場合。

削除して再取得するしかないのかなと思ったけど、ドメイン名 common name の更新もできるようだ。
github.com

certbot certonly --force-renew --cert-name example.com -d example.com -d '*.example.com'

www.example.com を消してワイルドカードに変更した。
ドメインリストの最初のドメインがcommon name。

コマンドは素っ気ないけれど、最初に所有者チェックの方法の選択肢を聞かれて、その後に追加されるドメインと削除されるドメインの確認が表示される。

certbot certificates

このコマンドで確認ができる。

DDDのさわりをやろうとした

ちょっと一部だけ複雑なプログラムがあったので、PHPでDDDっぽいオブジェクト指向をやろうとした。
なかなか大変だった。


まず静的解析による型チェックは必須。
型が自動でチェックされないDDDは、適当に書き捨てたプログラムより分かりにくくなると思った。

パッケージプライベートかfriendが欲しい。インナークラスも欲しい。
油断すると層を飛び越えてnewしちゃう。
例外も層を飛び越えたくないから、一度catchで掴んで新しい例外で包み直してからthrowしたい。でもめんどくさいしもうJavaじゃないかっていうコードになる。

あとテンプレートエンジンは使わず素のPHPで書くことが必要。
元々phpstanを使い始めてからテンプレートエンジンのデメリットが目立ってきたところで、複雑なオブジェクトを扱い出すとテンプレートエンジンのデメリットがますます強調されてきた。
折角の型チェックがテンプレートエンジンを使うことによって全て無に帰す。これはよくない。


それからDIやORMで文字列を指定して何かを取得する処理は全てやめた方が良い。
json_decodeも危険だしデータをarrayに詰め込むなんてもってのほか。


これは結構な思考の転換が求められる。



ひとまずパッケージプライベートのような仕組みは必須レベルで必要な気がする。
余裕ができたらphpstanでパッケージのnamespace階層をチェックするextensionを作ろう。

PHPStan が早い

PHPStanのデフォルトのルールを変更したくて、どうすれば良いか分からなかった。
デフォルトの config.neon を変更する方法を教えてってissueに書いたら10分後に返信来た。
scopeClassを変更すればgetType()で何でもできるよ、でも全体で一つの拡張しか使えないから実験的な機能だよ、だそうだ。

それから次の週に、ArrayAccessのジェネリクスが動かないのでバグレポートした。
これも数時間で返信が来た。
それでバグじゃなくてfeature-requestに分類されて、もしかして結構後回しになっちゃうのかな?と思って次の週に自分でプルリクした。

正直実装方法が分からなくて不完全なコミットだった。プルリクにドラフトの機能があったんだね。そっちにすれば良かったと後で気付いたけど変更出来ず…。
コメントもらったり修正したりしてたら作者が関連コード見つけて解決してくれたっぽい。テストだけ取り込まれた。
その間も1日以内。

それで次の日にはマイナーバージョン上がった版がリリースされてた。(リリースページに名前があるよ!)

進むの早すぎない?というか作者の返信が早いし活動もずっとやってる感じがある。
次回があればもう少しまともなプルリクにしようと思うけども、ソース読んで理解するより早く開発が進んで追いつけない気もする。

DBでSQLのテーブル名に別名を付けるときのルールと複数形

データベースのテーブル名を複数形にするかどうか、作るたびに悩む。
Qiita の記事 https://qiita.com/siinai/items/d4274c95fcdde3fd7295 のコメント欄に良いリンクがあった。

SELECT id, name, description FROM products product
WHERE product.name = ‘foo’ AND product.description = ‘bar’
https://medium.com/@fbnlsr/the-table-naming-dilemma-singular-vs-plural-dc260d90aaff


過去に書いた記事*1 を見返していて、そこのリンクにも同じような記事があった。

テーブルに別名を付ける場合、テーブル名の単数形を使用する

SQL の命名規約とフォーマット - ぐるぐる~

Railsとは無関係の文脈だと思うけど、こういう派閥も昔からあったのか。このときは流し読みでスルーしていた。
 
T1 とか tbl_kbn とかは以ての外だけど、この複数形を単数形にする別名のルールは良いかもしれない。

 

SELECT * FROM Customers AS Customer WHERE Customer.FirstName = 'John' - Customers refers to the whole table while Customer refers to the current row.

visual studio - Database tables naming, plural or singular - Stack Overflow

こちらも古いけど複数形テーブルに単数形の別名を付けている。

sql - Table Naming Dilemma: Singular vs. Plural Names - Stack Overflow
こっちは単数形推しで理由がまとまっている。


自分は最初のQiitaの

「テーブル」自体が「複数」そのものではない

テーブルの名前って複数形?単数形? - Qiita

とか
最後のstackoverflowの

Reason 1 (Concept). You can think of bag containing apples like "AppleBag", it doesn't matter if contains 0, 1 or a million apples, it is always the same bag. Tables are just that, containers, the table name must describe what it contains, not how much data it contains. Additionally, the plural concept is more about a spoken language one (actually to determine whether there is one or more).

sql - Table Naming Dilemma: Singular vs. Plural Names - Stack Overflow

とかと同じで単数形にしている。


かと言って複数形にすることは無いかというと、そうでもない。
例えば何らかの理由でファイルに書くようなアプリケーションの設定項目をDBに保存するときは application_settings というただ一つの行のみを持つテーブルを作るかもしれない。
これは the application settings であり、一つの行に複数の設定が詰まっているので意味的に複数形がしっくりくる。行が複数ということではない。

他にも、category_attributesのように何かの情報を詰め込んだ行を持つテーブルは複数形にするかもしれない。
そう考えると全体的に単数形や複数形に統一するという考えとは相反することになりそうだ。

検索エンジンとSNSが合体した全文検索エンジンが欲しい

ブックマークしたページから数回層だけリンクをたどって後で検索できるようなものはないだろうか。

スコア計算はGoogle以前のものでもいい。
キーワードの回数、割合、単語の近さとか。

URL スコア 巡回リンク階層
https://news.yahoo.co.jp/ 2 5
https://b.hatena.ne.jp/user/ 20 3
https://qiita.com/my_favorite_user 10 3
https://example.com/ 5 10

こんな感じで、昔のホームページ保存ツールみたいにURLとリンク順回数を指定したらクロールしてほしい。
Chromeの拡張からポチっとすれば、デフォルトのスコアとリンク階層で登録できれば尚良い。

追加で、キーワードのスコアも設定できると良い。

キーワード スコア
プログラミング 5
PHP 10
Linux 10
affi.example.com -100
ad.example.com -100

textContentじゃなくてタグも全て検索対象として扱うようにして、アフィリエイトリンクがある記事はスコアを下げることもできるような感じで。

これで、自分だけの精度の高い検索エンジンができないだろうか。

クロールしたデータを一人しか使わないのはもったいないので、他の人が見てる情報も検索したい。

フォロー スコア
my_favorite_user 1.5
linux_user 0.5
wordpress_user 0.5
life_user 0.5
spam_user -1

こんな感じでフォローしたユーザーのクロールデータも検索できるようにして、自分を1とした場合のスコアも設定する。
フォロワーのフォロワーを何回層までたどるかという設定もあったら良いかもしれない。



というような妄想をさっきふと思い付いた。