ログ日記

作業ログと日記とメモ

サーバーで使っている 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とか自作ツールにこの見た目と操作性が欲しい。

GHCJS + Template Haskell でハングアップ

hangs when linking Template Haskell 8.0/8.2 · Issue #668 · ghcjs/ghcjs · GitHub
このissueは見てたはずなんだけど、流し読みしていて頭に入ってなかった。

実際にTemplate Haskellを使ってみると問題が起きた。

なので再インストールする。
その前に、
https://n314.hatenablog.com/entry/2019/06/06/211205
ここで書いたhappyのエラー解消のために ghcjsのresolverがと同じバージョンで(プロジェクトのディレクトリで) stack install happyする。

その後に GHCJSを入れ直す。
(入れ直す必要あるかは不明。単にnodejsのバージョンを変えたあとにstack buildしたらコマンドが無い系のエラーで進まなくなり、どこでnodeのpath情報が使われているか分からなかったので。)

nodejs は nodebrew
https://github.com/hokaccha/nodebrew
で v8.9 を指定した。元々使っていたバージョンは10.15

stack setup --stack-yaml=js.yaml --ghcjs-boot-clean --reinstall

このコマンドでcleanしてghcjs-bootをやり直すことは出来るんだけど、どうやら解決しないっぽい。


tackで入れたghcjsのsetup-exe(例:~/.stack/setup-exe-cache/x86_64-linux/setup-Simple-Cabal-1.22.4.0-ghcjs-0.2.0.20151230.3_ghc-7.10.2)はビルド時に存在していたnodeコマンドのパスがshebangとしてハードコーディングされていて、~/.ghcjs/x86_64-linux-0.2.0.20151230.3-7.10.2/ghcjs/nodeファイルにもnodeコマンドのパスが書かれています。


ですので、ghcjsとツール群が認識しているnode.jsのパスも一緒に変更しないと、nodeコマンドが見つからないというエラーを吐くようになったり、いつまでも差し替え前のnodeコマンドを参照したりします。


必要最低限の修正に留めるのは調査するのが面倒だったので、今回は下記の3つを削除してからghcjsの再インストールを行う事で新しいnode.jsのパスを認識してもらう事にしました。

  • ~/.ghcjs
  • ~/.stack/setup-exe-cache/x86_64-linux/setup-Simple-Cabal-1.22.4.0-ghcjs-0.2.0.20151230.3_ghc-7.10.2
  • ~/.stack/setup-exe-cache/x86_64-linux/setup-Simple-Cabal-1.22.4.0-ghcjs-0.2.0.20151230.3_ghc-7.10.2.jsexe


これでnode.jsのバージョン管理システムを乗り換えたりしてnodeコマンドのパスが変わっても新しい方のパスを認識させることが出来ます。

ghcjsがnode.jsのバージョンによってはうまく動かない事への対処 - siphilia.github.io

なので全部消してからやり直し。
なんかしょっちゅう消したりインストールしたりしているな…。



Template Haskell を使って書いたコードは
https://github.com/nishimura/ghcjs-form-sample1/blob/31b79371e999f1ab5a270031e60be684a51adf1b/app/Generate1.hs
この辺。

GitHub Pull Request ではなく git request-pull

Linus

Git comes with a nice pull-request generation module, but github
instead decided to replace it with their own totally inferior version.

https://github.com/torvalds/linux/pull/17#issuecomment-5654674

Gitにはniceな pull-requestモジュールがあるのにGitHubは劣化版に置き換えた、と言っていて

I believe he's referring to git-request-pull.

https://github.com/torvalds/linux/pull/17#issuecomment-5660608

それは git request-pull のことらしい。
というのを読んだので、使い方のメモ。

git request-pull [-p] <start> <url> [<end>]

このコマンドでリクエストを生成する。例えば

% git request-pull origin/master https://github.com/nishimura/ghcjs-form-sample1 use-template-haskell
The following changes since commit 555c1c69f771b519e4c22a534f8d6b3837497361:

  Merge branch 'monad-trans' (2019-06-18 21:19:37 +0900)

are available in the git repository at:

  https://github.com/nishimura/ghcjs-form-sample1 use-template-haskell

for you to fetch changes up to 64b5751f8bb115e354054572b78488d4c2a81980:

  add code generator by template haskell (2019-06-21 20:17:40 +0900)

----------------------------------------------------------------
Satoshi Nishimura (1):
      add code generator by template haskell

 app/AppMain.hs   |  8 ++++----
 app/Generate1.hs | 45 +++++++++++++++++++++++++++++++++++++++++++++
 app/Generate2.hs | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 app/Helper.hs    | 46 ++++++++++++++++------------------------------
 package.yaml     |  1 +
 5 files changed, 125 insertions(+), 34 deletions(-)
 create mode 100644 app/Generate1.hs
 create mode 100644 app/Generate2.hs

こんな感じに、git log --stat のようなログが生成される。
ここにアップしたから受け取ってというメッセージになっている。


これを見てpullする人は、何か適当にブランチを切って書いてあるメッセージの通りにpullすれば良い。

git checkout -b work/merge1 555c1c69f771b519e4c22a534f8d6b3837497361

git pull https://github.com/nishimura/ghcjs-form-sample1 use-template-haskell

これで問題なければdevelopやmaster等にマージする。



分散バージョン管理っぽい。


Linusが時々タグ云々と言っているのは、git tagではなくて
とあるエンジニアの備忘log: git の Acked-by と Reviewed-by
ここの reviewed-by とかのこと?

CodeReview - SambaWiki
この辺りも詳しい。
Signed-off-by は git commit --signoff があるけど Reviewed-by などは手動だって。

自動化は
Elasticity: Adding Reviewed-by and Acked-by Tags with Git
こんな感じ。


これって一連のコミット(3コミットとか)をレビューしてマージする場合はrebaseとかでコメントを全部書き換えることになるのか。
この方針だとGPGのsignとかコミットに付けてもマージ時に全部消えるってことか。

GHCJS + Jsaddle

Jsaddleを動くようにした。
昨日書いた https://n314.hatenablog.com/entry/2019/06/06/210731 スタブはあまり意味はなかった。
理解は進んだけども。
webkit.idl などのWebIDLにDOMの定義があるから、そこから自動生成しているっぽい。
ということは、基本的にjsaddle-domはDOMの仕様を網羅しているということになる。


interoやreplでprintデバッグのようなことはせずに、素直にjsaddleをブラウザで動かした方が早い。

www.reddit.com
ここにもそのようなことが書いてあった。



というわけでサンプルを作った。
github.com
これは

github.com
ここのコードを持ってきたんだけど、そのままでは動かないから結構変更した。

hoogleしたりググったり、でも分かりづらいからghcjs-domのリポジトリ持ってきてgrepして直接ソースを見ることが多かった。
説明は無く型が合えば動くだろうっていう姿勢、なかなかつらいものがある。まあ実際に型が合えば動いたんだけど…。
Haskellerは割とカジュアルに互換性を崩すっていうものの一端を見た。

型チェックが厳しくて、createElementで生成したElementはイベントのターゲットにできない。イベントが扱えるのはHTMLElementなので。
いつもはNodeとかElementとかHTMLElementとか気にせず同じものとして扱ってたけども、違うものなんだよねえ…。Haskellを使えば他の言語のバグが見つかるっていうのはこういう感じなんだろうか。


せっかくなのでサンプルは少し変更してHTMLファイルを読み込むようにしている。
動作確認しやすく、既存のサイトの一部に組み込みやすいように。