ログ日記

作業ログと日記とメモ

ImageMagickで縦横比を維持したまま画像をリサイズして左右に余白を追加する

convertのオプションが多くて複数回実行する必要があるみたいな記事もあるけど
http://imagemagick.org/discourse-server/viewtopic.php?t=11525

convert -size 400x600 xc:white page.jpgs -gravity center -composite output.jpgs

これを少し変えて

convert -resize 400x600 xc:white page.jpgs -gravity center -composite output.jpgs

でいけた。

CSRFのトークンはワンタイム?

今更な話なんだけど、トークンってワンタイムの必要あるんだっけ?と思ったのでメモ。


http://takagi-hiromitsu.jp/diary/20060409.html
https://blog.tokumaru.org/2011/01/anti-csrf-onetime-token-failure-case.html
この辺が話題になってたのって10年〜5年前か…そりゃ忘れる。


2016年更新版
https://qiita.com/mpyw/items/8f8989f8575159ce95fc

Debian stretch に Kubernetes をインストール

Docker Swarm は普通に動くようだったので Kubernetesも試した。


エラーでなかなか進まず色々試してたら汚れてきたのでカッとなってVMwareで新しい環境を作ってテストした。
テストだからって普段使いのLinuxで試さない方が良さそう。


taskselで全部のチェックを外してインストールした状態からスタート。

apt-get install ssh vim

ホスト名は k8smaster.k8s.dev で。


VMware fusionだとネットワークアダプタの詳細でMACアドレスを確認しつつ

sudo vi /Library/Preferences/VMware\ Fusion/vmnet8/dhcpd.conf
host vmnet-k8smaster {
        hardware ethernet 00:0C:29:CC:1D:30;
        fixed-address 172.16.87.11;
}

で固定IPにしておくとやりやすい。VMwareは一度タスクキルする。

/Applications/VMware Fusion.app/Contents/Library/vmrun -T fusion start \
  ~/Documents/Virtual\ Machines.localized/debian9.vmwarevm/debian9.vmx nogui

これでウィンドウ無しで起動できるけど面倒なので閉じるときのダイアログでバックグラウンド実行でもいいかなって。


初期設定など。

update-alternatives --config editor
# usr/bin/vim.basic を選択

apt install sudo
visudo

# 一般ユーザー ALL=NOPASSWD: ALL
sudo -i
ssh-keygen

cp .ssh/id_rsa.pub .ssh/authorized_keys
ssh k8smaster.k8s.dev

ローカルでも sshFQDN でログインできる必要がある?なんか認証エラーになったので。


http://d.hatena.ne.jp/n314/20180820/1534731160
前回の記事の通りやってDockerを入れる。最新版にk8sが対応していないみたいだけど多分大丈夫っぽいnoteがあったので最新版で。


スワップは使えないのでオフ。

cat /proc/swaps
swapoff -a
vi /etc/fstab

自動インストールしたけどswapオフにしてパーティション切れば良かった。


https://kubernetes.io/docs/setup/independent/install-kubeadm/

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

ちょっとしたアップデートでガラッと動作が変わるからholdしろってことだよね多分。

kubeadm init --pod-network-cidr=10.244.0.0/16

完了メッセージは後で実行する。
rootじゃなくて良い作業は一般ユーザーで実行する。と言ってもパスワード無しでrootになれる必要あるよね。どういう思想なんだろう。


export KUBECONFIG=/etc/kubernetes/admin.conf
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml

/etc/cni/net.d/ にファイルが作られる。
https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/


これ以上はアーキテクチャとか仕組みとかが分かってないとマニュアルコピペじゃ無理そうなので後でやる。クラウド環境をローカルで試そうと思ったらVMwareのゲストめっちゃ立ち上げないとダメだよね。みんな富豪的に全部クラウドでやってるのかな。こういう環境が必要な人は短期間インスタンス立ち上げるぐらいの費用は誤差なのか。
ここまでで docker ps で 16コンテナ立ち上がってるんだけど…。そのうちマイクロカーネルが流行らずモノリシックカーネルに変わってきている的なことにならないんだろうか。


削除メモ。
apt remove --purge kubelet kubeadm kubectl kubernetes-cni で消えないファイルを消す。

rm -rf /var/lib/etcd
rm -rf /etc/kubernetes/

rm -rf /var/lib/kubelet/
rm -rf /etc/cni/

Debian stretch で docker-machine

docker-machineのコマンドではdockerを自動インストールできない。
こういうことを自動的にやってもらうためにdocker-machineを使うと思っていたんだが…。


https://docs.docker.com/install/linux/docker-ce/debian/

apt-get install \
     apt-transport-https \
     ca-certificates \
     curl \
     gnupg2 \
     software-properties-common


souces.list.d/docker.list 追加

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

またはコマンドで。

add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
apt-get update
apt-get install docker-ce

各ホストにdocker-ceをインストールした後なら docker-machine create できる。


ローカルにもdocker-ceを入れる場合はローカルからローカルへのsshの設定もしておく。

Debian stretch で tsung

だいたい https://qiita.com/nishimura/items/f3ba8e051e2983ff743b ここの通りでいいんだけど、パッケージのパス設定が色々壊れている。


普通に実行すると

Starting Tsung
Log directory is: /home/user/.tsung/log/20180814-1449
Can't start ! {error,
                  {{badmatch,{error,enoent}},
                   [{ts_controller_sup,start_inets,1,
                        [{file,"src/tsung_controller/ts_controller_sup.erl"},
                         {line,105}]},
                    {ts_controller_sup,init,1,
                        [{file,"src/tsung_controller/ts_controller_sup.erl"},
                         {line,91}]},
                    {supervisor,init,1,[{file,"supervisor.erl"},{line,294}]},
                    {gen_server,init_it,6,
                        [{file,"gen_server.erl"},{line,328}]},
                    {proc_lib,init_p_do_apply,3,
                        [{file,"proc_lib.erl"},{line,247}]}]}} 

このようなエラーになる。


パッケージのバグらしい。
https://github.com/processone/tsung/issues/169

cd /usr/lib
mkdir share
cd share
ln -s /usr/share/tsung .
cd ..
ln -s /usr/lib/x86_64-linux-gnu/tsung .

本来はrootで基本のpathいじるよりはパッケージのバグを直した方がいいと思うけど。


あと tsung_stats.pl で生成したhtmlでJavaScriptが足りなかったのでコピー

cp /usr/share/tsung/templates/style/dygraph-combined.js report-dir/style/

Chrome拡張のトップレベルでawaitしたいけど出来ないっぽい

例えばbackground.js のトップレベルで chrome.storage.sync.get を待つために await すると定形通りのエラーになる。

Uncaught SyntaxError: await is only valid in async function

まあそうだよね。


オプション画面で設定した値を使ってイベント登録したいんだよね…。
仕方がないので基本的に localStorage を使うようにして、違うPCとの同期のために chrome.storage.sync と localStorage を同期するようなコードを書いた。

window.addEventListener("storage", () => {
  // 新しい設定値で再初期化
  const opts = getOptsFromLocalStorage();
  init(opts);

  // 他のブラウザと同期
  chrome.storage.sync.set({key: opts});
});

chrome.storage.onChanged.addListener((e, ns) => {
  // ブラウザ間の同期で(も)呼び出される
  setOptsToLocalStorage(e.key.newValue);
});

chrome.storage.sync.get({'key': []}, function(val){
  // localStorageより sotrage.sync が新しい場合に備えて

  const opts = getOptsFromLocalStorage();
  if (opts == val.key)
    return;
  setOptsToLocalStorage(val.key);
  // 必要???
});

最後の処理は必要か分からなかった。起動してないときに storage.sync の内容が変わった場合は onChanged は発火するんだろうか。
調べればいいんだけど、毎回拡張の公開 => しばらく待つという手順が大変。どうやってブラウザ間の同期のテストをすればいいんだろう。

現在見ているページに関連するRedmineのチケット一覧を表示するChrome拡張機能「Related Redmine」

Chrome拡張のページ:
https://chrome.google.com/webstore/detail/related-redmine/kmgkdpnmpjmncggngjcinmkfacbgaecj



画像は、バグったよーっていうGmailのURLに反応してチケット一覧を出す例。


設定例
https://github.com/nishimura/related-redmine
設定画面が正規表現や変数設定で初心者お断りな感じだけれど、Redmineを拡張で更にカスタマイズしようと思うような人なら問題ないよね。



過去のRedmineの記事
https://qiita.com/GEROMAX/items/85ee816f9fe6c5eb331f#subtask-list-columns-plugin
この辺とか
http://forza.cocolog-nifty.com/blog/2018/06/redmine-fe93.html
この辺の関連記事とか、結構読んでたんだけど、どうも自分の欲しいものが無いし自分の使い方はちょっと違うっぽい。
元々少人数で使っていたけど、もう今は環境が変わって一人用Redmineでやってる。


数人で使っていた頃も、具体的なやり取りは口頭やメールなどを使っていてチケット上でコミュニケーションはしていなかったし、メモ書きやまとめた文章もMediawikiGoogle Driveを使っていた。
あと何か綺麗なグラフが欲しいときは画像かPDFにして渡していて、偉い人にログインしてもらうというのはやってなかった。


そんな感じで完全なタスク管理ツールとして使っていたわけだけれども、一人になってからはオーバースペックなので利用をやめていた。
そしてしばらく経ってみて、自作ツールを作ったりしつつ、平行して進む課題がいくつもあると、やっぱり一人でもRedmineを使った方が良いと思い始める。


今は時々メール、あと基本はBacklogを使っている。
Backlogはプログラマー以外でも使いやすい便利なツールなんだけど、Gitを連携して細かく課題を分割して登録してってやると見づらくなってしまった。
コミュニケーションツールとしてBacklogを使うなら、Git連携やタスク整理は他のツールにした方が主要な会話のログが流れず使いやすいと感じた。


そんなわけで、Backlogの課題を親チケットとみなして、プログラマー以外は見ないような細かいチケット、やり取りログではなく作業ログとしてのチケットはRedmineに隔離することにした。
それで、カスタムフィールドを使ってIDやURLにリンクを付ければRedmine側からBacklogへの連携はすぐ出来る。不満ならカスタマイズもできるし。
逆の連携は、Backlog側にリンクを手動で書いたり別途連携ページを作ったり、のようなちょっと面倒な方法しか思い付かなかった。
もっと1クリックでサクッと連携したい。


という背景があって、Backlogの課題を表示中に拡張アイコンをポチッとすれば関連するRedmineのチケット一覧が出るようにした。
あとたまにメールでも別の仕事が来るので最初の画像のようにGmailにも対応できるようにした。
他にもWikiとかGithubとか決まったURLがあれば何でもいけるはず。一つのURLで複数の話題が流れるチャット系は無理かも。





Chrome拡張を初めて作ったけれど、今のJavaScriptってもう別言語になってるんだね。普段はjQueryなのでね…。
async/awaitの便利さにびっくりしたりアロー関数でthisを気にせず書いたり…。ブラウザ対応をChromeだけ考えればいいのがとてもやりやすかった。