ログ日記

作業ログと日記とメモ

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とした場合のスコアも設定する。
フォロワーのフォロワーを何回層までたどるかという設定もあったら良いかもしれない。



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

サーバーで使っている Debian を buster にアップグレードしたログ

ひとまずPHPPostgreSQLMySQLRailsRedmine)、Apache が入っているstretchのサーバーをアップグレードする。

第4章 Debian 9 (stretch) からのアップグレード


まずPHP7とPostgreSQLのために使っていたリポジトリコメントアウト。Dockerも

# php7.1
# deb https://packages.sury.org/php/ stretch main

# postgresql 10
# deb http://apt.postgresql.org/pub/repos/apt/ stretch-pgdg main

# deb [arch=amd64] https://download.docker.com/linux/debian stretch stable

うーん。PostgreSQL のパッケージは大丈夫だろうか。
PostgreSQL公式だしDebian流になっていたら問題は起きないと思うが。


sources.list.d にあるnodesource.list も stretch 指定なのでコメントアウト
yarn.list は stable になっていたのでそのまま。


自動更新しているはずだけれど、念のため stretch の状態で更新

apt update
apt upgrade
apt autoremove

sources.list を stretch から buster に変更してアップグレード。

apt update
apt-get upgrade
apt full-upgrade

apt-get はtypoじゃないよね。apt-get と apt を交互に使うことに若干の不安が残るがそのまま実行。
質問はだいたいデフォルトで

  • /etc/init.d/ssh
  • /etc/apt/apt.conf.d/50unattended-upgrades
  • /etc/apt/listchanges.conf

は新バージョンに更新した。
自分で変更した箇所は差分を見て後で手動で適用する。


今回はApacheの設定ファイルの書式が変わるようなこともなく、jessie の時代から残っているphp5 が削除されるようなこともなく、大きな問題は起きなかった。
…と思いきや、ruby が 2.3 から 2.5 になってRedmine 3.4が動かない。これがあるからRails系は嫌なんだよな…。


仕方がないのでアップグレードする。
アップグレード - Redmineガイド

cd /opt/redmine
wget http://www.redmine.org/releases/redmine-4.0.4.tar.gz
tar xvzf redmine-4.0.4.tar.gz

cp redmine-3.4.6/config/database.yml redmine-4.0.4/config/
cp redmine-3.4.6/config/configuration.yml redmine-4.0.4/config/
cp -r redmine-3.4.6/files/* redmine-4.0.4/files/
cp -r redmine-3.4.6/plugins/* redmine-4.0.4/plugins/

chown -R www-data:www-data redmine-4.0.4

cd redmine-4.0.4

bundle install --without development test
bundle exec rake generate_secret_token

cp -a ../redmine-3.4.6/public/themes/farend_fancy public/themes/

sudo -u www-data bundle exec rake db:migrate RAILS_ENV=production

to_prepareでエラーが出る。
[docker/redmine4.0.1]プラグイン"easy gantt"を入れようとすると怒られる - Qiita
Undefined method 'to_prepare' for ActionDispatch::Callbacks:Class (NoMethodError) · Issue #1666 · ruby-grape/grape · GitHub
手動修正はつらそうだったので、やっぱりrubyのバージョンを戻すことにする。
戻すと言っても以前のrubyは残っているので、参照先を変えるだけ。

ln -i -s /usr/bin/ruby2.3 /usr/bin/ruby
vi /etc/apache2/mods-enabled/passenger.conf

cd redmine-3.4.6
rm Gemfile.lock

bundle install --without development test

sudo -u www-data bundle exec rake db:migrate RAILS_ENV=production

無事復活した。


reboot して起動確認。

reboot

cat /etc/debian_version 
uname -a


あと jessie のサーバーがあるので jessie => stretch => buster をやるか、デスクトップを buster に上げるか。
取り敢えず疲れたので今日はここまで。


古いjessieのサーバーには Ruby が入っていなかったのでこちらも更新する。
その代わり mingw や qt 等のC開発系が入っていた。メインで使っているのはPHPPostgreSQL。あとバックアップサーバーとしてデータ置き場になっている。
wheezy から jessie にしたサーバーなので古い設定が色々残っているかもしれない。


やってみると

最小アップグレード(stretch) => フルアップグレード => 再起動 => 最小アップグレード(buster) => フルアップグレード

でスムーズにいった。
特にこれといって問題は起きず。
むしろ独自リポジトリPHPの最新版(当時 7.2)を入れていた先ほどのサーバーよりPHPもが新しくなってしまった。
PHP5.6 から 一気に PHP7.3 にバージョンアップされた。


PostgreSQLは本家とDebianで同じバージョンだった。
PostgreSQLは旧バージョンが残ったまま、11が5435で動いている。(9.1 9.4 9.6 11 のクラスターがある)

sudo -u postgres psql postgres -p 5432 でメインのDBを確認して、11にアップグレードする。

pg_dropcluster 11 main --stop
pg_upgradecluster -v 11 9.4 main

これでPostgreSQL 9.4から11へのデータ移行が完了した。とてもスムーズである。


PHPPostgreSQLの更新でWebの体感速度がかなり速くなった。

Google Closure Library の UI と調べもの

What UI rendering systems are used by Google with closure library, and why are these not open source?
goog.ui.* は古いまま更新されていない。
最近のGoogleのサービスのUIはオープンソース化されていない。


Touch support for goog.ui.menu?
goog.uiは現在活発に開発されていないので他のライブラリを使った方が良い。


html5history and query parameters
html5history のクエリパラメーターが正しく処理されない。
goog.HTML5History with query params
ちょっとしたコードで簡単に解決はできる。


UI系は自分たちでやってくれってことかな。
ちなみにGoogle Groups はGWTで作られているっぽい。


Google Search、Gmail
・Closure Compiler
・Closure Library
 ・MochiKit
・JsActionっぽいフレームワーク
などが使われているようだ。


例えば Gmail の /scs/mail-static/_/js/k=gmail.main.ja.〜〜〜 のJavaScriptには Closure Library の debug/debug.js にある $googDebugFname という文字列があるし、

function(b,c,d,e,f,g){kq(d)||(d&&(j2a[0]=d.toString()),d=j2a);for(var k=0;k<d.length;k++){var l=Cp(c,d[k],e||b.handleEvent,f||!1,g||b.Lb||b);if(!l)break;b.Ce[l.key]=l}return b};

というコードは goog.events.EventHandler.prototype.listen_ 関数のコンパイル結果に見える。

UI以外は普通にClosure Libraryが使われているようである。


他に Lovefield というのものあった。SQLっぽくデータを操作するライブラリらしい。

Is Lovefield production quality?

Yes. As of May 2016, Inbox by GMail heavily relies on Lovefield to perform complex client-side structural data queries. Google Play Movies & TV has shipped with Lovefield for almost two years.

https://github.com/google/lovefield/blob/master/docs/FAQ.md

LovefieldがClosure Libraryを使っているので、良いサンプルになるかもしれない。
と言っても利用しているライブラリは

goog.require('goog.Promise');
goog.require('goog.array');
goog.require('goog.asserts');
goog.require('goog.iter');
goog.require('goog.labs.userAgent.browser');
goog.require('goog.math');
goog.require('goog.structs.Map');
goog.require('goog.structs.Set');
goog.require('goog.userAgent');
goog.require('goog.userAgent.platform');
goog.require('goog.userAgent.product');

が全てだった。

Redmineのガントチャートを画面いっぱいに表示する

RedmineガントチャートはPDFとpngでダウンロードできるけど、結局Webをスクリーンショットするのが一番綺麗なので。

    $('#wrapper').css({'overflow': 'visible'});
    $('#sidebar').hide();
    $('#content').css({'width': 'auto'});
    $('#gantt_area').css({'overflow': 'visible'});
    $('#content table').css({'width': ''});

中のoverflow:scroll をやめて、ブラウザのウィンドウ全体を横スクロール出来るようにする。


View customizeプラグインなら issues/gantt のパターンに

$(function() {
  var $button = $('<button>拡大</button>');
  $('#query_form').after($button);

  $button.on('click', function(e){
    $('#wrapper').css({'overflow': 'visible'});
    $('#sidebar').hide();
    $('#content').css({'width': 'auto'});
    $('#gantt_area').css({'overflow': 'visible'});
    $('#content table').css({'width': ''});
  });
});

のように書く。


スクリーンショットは、ChromeのDevToolでデバイスツールバーを出してレスポンシブ表示にして全てが収まる縦横と倍率を調整して…という手順で撮る。
まだちょっとめんどくさい。
ちょうど良いサイズにするには、Responsiveにして3000 x 2000 のように入力して、画面の端をドラッグして縮める。

タスク管理ツールRepsonaに登録してみた感想メモ

これを読んだ。
note.mu

タスク管理ツールって理想のものが全然なくて自作しがちだよね…と思いながら。
度々調べるけど良いものがなくて、たぶん欲しい機能があるものはMS Projectになる。でも大規模用すぎるので他を探すことになる。

repsona.com

使ってみた(30分くらい)。


取りあえず気になったところ。

・保存ボタンが無いのが分かりづらい(というか勝手に保存しないでほしい、あちこち編集してやっぱりやめる場合はどうすれば…)
・タグを複数追加するとき、一度フォーカスを外す必要がある?
・プロジェクトから招待したとき、招待された側がプロジェクトに参加していない?
・サブタスクの日程が自動調節されるRedmineの方が好み(ただしRedmineは自動調整しすぎなので自動計算ボタン+関連タスクのどのタスクをベースにするかが欲しい)
・編集した履歴、バージョンが欲しい

・ユーザー登録せずに「会社1 Aさん」の名前に担当させたりボールを渡したい
・誰がボールを長期間ロックしているのかガントチャートに欲しい
ガントチャート目的でタスクを50とか入れたときに他の機能が使えるか不安がある


そもそも自分は人にフォーカスするよりタスクにフォーカスしてほしかったのかもしれない。一人でも使いたいし、想定ユーザーではなかったっぽい。

グラフ系、マウスを使う系の操作はかなり良い。
Redmineとか自作ツールにこの見た目と操作性が欲しい。