それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ディレクトリの中のファイルを「時刻」でソートする find と lsをつかって、最新のファイルだけを取り出す。

ls コマンドの場合

ls -t | head -n1

ls コマンドで、時刻順に並べることができるので、これを head と組み合わせれば出来る。

takuya@Gitlab:~$ sudo ls -lt  /var/opt/gitlab/backups/
total 92268132
-rw------- 1 git    git    43629199360 Apr 25 02:20 1587748340_2020_04_25_12.9.2_gitlab_backup.tar
drwx------ 7 git    git           4096 Apr  4 03:40 tmp
-rw-r--r-- 1 takuya takuya 47202314240 Apr  4 02:17 1585836147_2020_04_02_12.9.2_gitlab_backup.tar
-rw------- 1 git    git     3651025200 Apr  3 22:25 registry.tar.gz

ただし、取り出せるのは「basename」のファイル名です。

サンプル

takuya@Gitlab:~$ sudo ls -t  /var/opt/gitlab/backups/  | head -n 1
1587748340_2020_04_25_12.9.2_gitlab_backup.tar

find コマンドでやる場合

find コマンドでもできます。

最新の1件だけを取り出すには、head と組み合わせれば大丈夫かな。

find  /var/opt/gitlab/backups/ -type f  -printf "%T@ %p\n" | sort -nr| head -n 1

動作の原理について

find コマンドには printf のオプションがあって、これを使ってsort してあげれば、カンタンに実現できます。

takuya@Gitlab:~$ sudo find  /var/opt/gitlab/backups/ -type f  -printf "%T@ %Tc %p\n" | sort -nr
[sudo] password for takuya:
1587748816.6963751750 Sat Apr 25 02:20:16 2020 /var/opt/gitlab/backups/1587748340_2020_04_25_12.9.2_gitlab_backup.tar
1585934261.3147121750 Sat Apr  4 02:17:41 2020 /var/opt/gitlab/backups/1585836147_2020_04_02_12.9.2_gitlab_backup.tar
1585920302.0000000000 Fri Apr  3 22:25:02 2020 /var/opt/gitlab/backups/registry.tar.gz

find の場合は、パス名で返ってくる。 パスで取れるのは、ls に比べて便利かもしれない。

最新ファイルのフルパスがほしいときは、 find の引数にフルパスを入れてあげればいいのだから。

動作サンプル

takuya@Gitlab:~$ sudo find  /var/opt/gitlab/backups/ -type f  -printf "%T@ %p\n" | sort -nr| head -n 1 | cut -d' ' -f2
/var/opt/gitlab/backups/1587748340_2020_04_25_12.9.2_gitlab_backup.tar

参考資料

https://superuser.com/questions/294161/unix-linux-find-and-sort-by-date-modified

systemd タイマーの書き方。OnCalendarのtimer 設定の記述方法とチェック方法をおさらいする。cronの代替にするサンプル集

systemd の timer サービスの書き方で時間の指定が困る。

cron で日付や時間の指定をようやく覚えて自由自在に作ってたのに、systemd timer だと onCalendar です。crontabから覚え直しです。

cron書式と違うんですよね。onCalendarは独自です。

systemd.timer の例

OnCalendarは次のように timer ファイル使いますよね。

[Unit]
Description=Splattoon splatnet2ink timer

[Timer]
OnCalendar= hourly
RandomizedDelaySec=10
Unit = splatnet2statink.service

[Install]
WantedBy=default.target

関連記事 →  splatnet2statinkで stat.inkへアップロードをsystemd で自動化する。 - それマグで!

OnCalendar の書式

書式は次のようになっています。

OnCalendar=$DAY_OF_WEEK $YEAR-$MONTH-$DAY $Hour:$Minute:$Second

ただし、省略可能だったりするので、世間にはいっぱい書式が溢れている。

全部詳細なのは、公式ドキュメントを読んだほうが良いと思う

記述例

書式例のサンプルとか、作成方法を見たほうが早い

よく使いそうなもの

サンプル
毎週月曜 mon
毎週月水金 mon,fri,wed
毎日18時 18:00
毎木 15時 Thu 15:00

フルで書いた書式

サンプル
毎週月曜 Mon *-*-* 00:00:00
毎週月水金 Mon,Wed,Fri *-*-* 00:00:00
毎日18時 *-*-* 18:00:00
毎木 15時 Thu *-*-* 15:00:00

省略形のほうが読みやすいし、一瞥して理解しやすい。ただし、記述が面倒な感じありますね。

月末はちょっと特殊

特殊記号 チルダ ~ を使って月末から何日か計算する

サンプル
月最終日 *-*~1 18:*
月末2日前 *-*~2 18:*
5月最終火曜 Tue *-*~07
最終月曜日 mon *-*~07/1

最終曜日、これは最終日から -7を取得して、曜日 絞り込んでる、これで最終月曜日などを計算する。ハイフンは使えないので、代わりにチルダって覚えると良いです。

毎月の最終金曜日とか業務に使えそうですよねー

ただし、毎月25日だとか26日だとかは、祝日の計算が入ってくるので、細かいところはプログラムでやるしか無いですよね。

定期的書式

省略形の 定期系書式

onCalendar 同等のフル書式 日本語での意味
minutely *-*-* *:*:00 毎分
hourly *-*-* *:00:00 毎時
daily *-*-* 00:00:00 日次
monthly *-*-01 00:00:00 月次
weekly Mon *-*-* 00:00:00 週次
yearly *-01-01 00:00:00 年次
quarterly *-01,04,07,10-01 00:00:00 四半期ごと
semiannually *-01,07-01 00:00:00 半期ごと

書式を調べる方法 systemd-analyze calendar

省略形や、サンプルで書式をアレコレと試行錯誤するために、テストツールがあります。

このコマンドで書式が正しいか調べることができます。

systemd-analyze calendar 'Thu 15:00'

systemd でタイマーを作って、書式がおかしいとエラーになったときに役に立つコマンドです。

たとえば、次のようなうろ覚えの省略形を試すと、解析されて結果が取れます。

誤ったOnCalendar記述の例

エラーになることがわかります。どうすれば良いのかの提案はありません。

takuya@:~$ systemd-analyze calendar 'Thu 15'
Failed to parse calendar specification 'Thu 15': 無効な引数です

正しい記述の例

正しく記述できると、フル書式ではどう書くのか、また、次に実行される時刻を押してくれます。

takuya@:~$ systemd-analyze calendar 'Thu 15:00'
  Original form: Thu 15:00
Normalized form: Thu *-*-* 15:00:00
    Next elapse: Thu 2020-04-30 15:00:00 JST
       (in UTC): Thu 2020-04-30 06:00:00 UTC
       From now: 6 days left

日付のチェックが出来るところがとても有能だと思います。crontab / cron だと日付のチェックが面倒だし。

まとめ

OnCalendar は DOW Y-M-D H:i:S でかく。
OnCalendar は systemd-analyze calendar で省略形の書式試す。

関連記事

systemd の タイマーは enable してもstart をしないと動かない - それマグで!
splatnet2statinkで stat.inkへアップロードをsystemd で自動化する。 - それマグで!

参考資料

https://wiki.archlinux.org/index.php/Systemd/Timers

systemd.time

splatnet2statinkで stat.inkへアップロードをsystemd で自動化する。

splatnet2statink で戦績を保存したい。

かれこれ2ヶ月くらいスプラトゥーン2から離れている takuya ですこんばんは。

2020年のコロナウイルス感染症騒動で、ちょっと暇になってしまったので、スプラトゥーンを復活しようと思っています。リングフィットアドベンチャーも届いたのですが、スプラトゥーンには中毒性があって面白いですよね。

しばらく使ってなかったので iksm_sessionが切れてしまってので、再発行と自動取得をまとめてsystemd で作り直します。

戦績を保存する。

splatnet2statinkを使って、戦績をstat.inkに保存していきます。

ソースコードの取得

ソースコードを取ってきます。

git clone git@github.com:frozenpandaman/splatnet2statink.git
cd splatnet2statink

これでsplatoon2 のデータを扱えます。

python の環境を作ります。

最初に pipenv 環境を作ります。 pipenv 環境がない場合は pythonとpip を用意して pip install pipenvをしておきます。

cd splatnet2statink

export PIPENV_VENV_IN_PROJECT=1
pipenv install 
pipenv shell 

pipenv 環境下で作業をします。

最初に依存モジュールを用意しておきます。

(splatnet2statink) pip install -r requirements.txt

セッションキーを用意します。

初回起動でセッションキーを登録します。

stat.ink のセッションキーを用意しておいて、初回起動で登録します。

(splatnet2statink) ./splatnet2statink.py
splatnet2statink v1.5.4
Generating new config file.
stat.ink API key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default locale is en-US. Press Enter to accept, or enter your own (see readme for list).
ja-JP
Pulling data from online...
Blank cookie.

続けて、iksm_session を取り出します。

httpsから始まる URLが表示されるので、これを MacOS Safariに貼り付けます。 (最新版の Chromeではリダイレクト先がローカルになるのでエラーになりました。)

Make sure you have fully read the "Cookie generation" section of the readme before proceeding. To manually input a cookie instead, enter "skip" at the prompt below.

Navigate to this URL in your browser:
https://accounts.nintendo.com/connect/1.0.0/authorize?state=XXXXXXXXXXXXXXXXXXXXe_challenge_method=S256&theme=login_form

Log in, right click the "Select this account" button, copy the link address, and paste it below:

Safariでログインして アドレスをコピー

アドレスをコピーして コンソールに貼り付けます。

PCならリンクを右クリック

貼り付けたらアップロードが始まる。

config.txt が作成されて アップロードが出来るようになる。

Log in, right click the "Select this account" button, copy the link address, and paste it below:
npf71b963c1b7b6d119:/XXXXXXXXXXXXXXXXXXXXXXXXyTTNw-B

Wrote session_token to config.txt.
Attempting to generate new cookie...
Wrote iksm_session cookie for たくや to config.txt.

config.txt は重要

config.txtに保存されたセッションキーで認証しているので、config.txtをバックアップしておく。

systemd に登録する。

systemd で定期的に、splatoon2 の戦歴とサーモンランの履歴を取り出して保存します。

サービスファイル splatnet2ink.service ファイルを作成

モニタリングを起動して放置していると、なぜだか上手くイカないので、1時間に一回起動して戦歴をチェックする。

ガチマッチもレギュラーマッチもどう頑張っても1時間に50件の保存上限を超えるプレイをできないので、これでいける *1

[Unit]
Description=Splattoon splatnet2ink

[Service]
WorkingDirectory=/home/takuya/.splatnet2statink
ExecStartPre=/home/takuya/.splatnet2statink/.venv/bin/python /home/takuya/.splatnet2statink/.venv/bin/pip install --upgrade pip
ExecStartPre=/home/takuya/.splatnet2statink/.venv/bin/python /home/takuya/.splatnet2statink/.venv/bin/pip install --upgrade -r  /home/takuya/.splatnet2statink/requirements.txt
ExecStartPre=/usr/bin/git pull
ExecStart=/home/takuya/.splatnet2statink/.venv/bin/python    /home/takuya/.splatnet2statink/splatnet2statink.py -r
ExecStartPost=/home/takuya/.splatnet2statink/.venv/bin/python    /home/takuya/.splatnet2statink/splatnet2statink.py -r --salmon

#Restart=always
#RuntimeMaxSec=600
; User=takuya
; Group=takuya
[Install]
WantedBy=default.target

タイマーファイル splatnet2ink.timerを作成しておく

[Unit]
Description=Splattoon splatnet2ink timer

[Timer]
OnCalendar= hourly
RandomizedDelaySec=10
Unit = splatnet2statink.service

[Install]
WantedBy=default.target

systemd に登録する。(ユーザーごとの systemd )

ユーザー空間なら、次のところにファイルを作って起動する。

mkdir -p ~/.config/systemd/user/
## または
mkdir -p /etc/systemd/user/

systemdをリロードして unit を登録

systemctl --user daemon-reload

起動してチェック

systemctl --user start splatnet2statink.service
systemctl --user status splatnet2statink.service
systemctl --user start splatnet2statink.timer
systemctl --user status splatnet2statink.service

有効化

systemctl --user enable splatnet2statink.service
systemctl --user enable splatnet2statink.timer

戦歴があるとモチベーション維持に良い。

戦歴をずっと眺めることで、反省点がわかる。

なにより成績が向上しているとモチベーションアップに役立つ。

動画を撮影したりすると動画撮影の検索インデックスとしても使える。便利。

2022-07-20

splatoon のika log の更新は、毎日起動してないと、数日でセッションが切れてしまうので注意。

参考資料

イカ参考資料です。

ユーザー毎の systemd を使ってシステム全体設定と個人用設定を分ける。 - それマグで!

https://github.com/frozenpandaman/splatnet2statink#cookie-generation

https://tkgstrator.work/?p=26857

【簡易版】Windowsだけでsplatnet2statinkを使ってスプラトゥーン2の戦績をstat.inkに自動で登録する【導入/利用編】 – バニラソルト

*1: 複数台のニンテンドースイッチで同一アカウントでプレイしない限り大丈夫

指定したファイルが存在するフォルダを指定する

画像が入ったフォルダを取り出したい。

Nextcloud を触っていて、画像が散らばってしまった。なので、画像大量に入ったフォルダを調べることにする。

となると、どんな方法が良いか思案したが、一番手っ取り早いのは find コマンドだろう

find コマンドでjpg が含まれるフォルダを探す

find してさらに find する感じにしてみた。

#!/usr/bin/env bash

IFS=$'\n'
for i in $( \find .  -mindepth 1 -maxdepth 1  -type d ) ; do
  [[ $( \find $i -type f -iname '*.jpg' | wc -l  ) == 0 ]] && continue;
  echo $i;
done

たくさん画像があるフォルダを探す。

条件をちょっと変えれば、100枚以上の画像があるフォルダを探すってのもできるね。

#!/usr/bin/env bash

IFS=$'\n'
for i in $( \find .  -mindepth 1 -maxdepth 1  -type d ) ; do
  [[ $( \find $i -type f -iname '*.jpg' | wc -l  ) == 100 ]] && continue;
  echo $i;
done

もっといい方法がありそうなんだが、ぱっと思いつかなかった。 GNU コマンドなら --include 等があるからできそうな気もするんだけど。

LXC・LXD のコンテナのポートを外部に公開する docker expose的なやつ

lxc で外部にポートを公開する。

docker だと expose で手軽にできるんだけど、LXCだとiptables使えとか forwarding しろとかめんどくさいので、もっと簡単にポート転送できるものがないか調べた。

プロキシで飛ばせる

たとえば、nginx-container があって、ホスト側のIPを内部にそのまま出すには。

lxc config device add nginx-container my-https proxy  listen=tcp:192.168.12.10:443 connect=tcp:10.185.93.215:443 bind=host
lxc config device add nginx-container my-http proxy  listen=tcp:192.168.12.10:80 connect=tcp:10.185.93.215:80 bind=host

簡単な図解

クライアント 
 →Lxc ホスト 192.168.12.10:80 (転送
   → Lxcゲスト  10.185.93.215:80

追加するときは

lxc config device add $LXC_CONTAINER_NAME $PROXY_DEVICE_NAME proxy  \
   listen=tcp:$LXC_HOST_IP:$LXC_HOST_PORT \
   connect=tcp:$LXC_CONTAINER_IP:$LXC_CONTAINER_PORT bind=host

削除するときは

lxc config device remove $LXC_CONTAINER_NAME $PROXY_DEVICE_NAME

設定の確認

lxc config show nginx-container

これで設定されているプロキシ転送を確認することが出来る。もうすこし楽ちんでも良さそうなものだが。

lxc config proxy お手軽。

proxy で nginx のコンテナを作ってポート転送しておけば、LXCの内部側にいくらでもサービス用にコンテナを起動できて便利。

macvlan や bridge で共有してると、だんだんIPやポートが膨大になってきて頭がおかしくなりそうなので、nginx で一旦中継しちゃうのが便利。

nginx は、比較的なんでも転送できるので、sshpostfix などでも転送できるでちょっとしたルーター代わりにあげておくと便利。

一点だけ問題がある。

lxc のプロキシ設定は、プロキシ先を「IP」で指定しなくちゃいけない。lxc 自体が再起動して、IPが変わると動作しなくなることがあるので注意。

IPが不意に変わることが在り、大混乱を発生させるので、まじで注意。

参考資料

https://hnakamur.github.io/blog/2018/07/05/port-forwarding-using-lxd-proxy/

2020-12-30 更新

削除する方法も併せて書いた

libvirt + qemue の kvm 仮想マシンで画面を持たないコンソールのVMをぱぱっと作成して コンテナみたいに使う

VMがヘビィだ

docker とか LXC 使ってると、VMがヘビィに感じることがある。もっと手軽に仮想マシンを使いたいななどと思う。

UbuntuDebian仮想マシンで新規で作って、コンソールでテキストで扱えれば嬉しいわけです。

SSH経由で、VMを作成

SSHのテキストベースで、仮想マシンを作成し、そのまま コンソールでインストールするコマンド

virt-install というコマンドでぱぱっとVMを作成して、そのままインストールを開始できる。

ubuntu の場合

virt-install \
--name ubuntuLTS \
--ram 30029 \
--disk path=/var/lib/libvirt/images/ubuntu-1910.qcow2 \
--vcpus 4 \
--virt-type kvm \
--os-type linux \
--os-variant ubuntu18.04 \
--graphics none \
--location 'http://archive.ubuntu.com/ubuntu/dists/bionic/main/installer-amd64/' \
--extra-args "console=tty0 console=ttyS0,115200n8"

debian の場合

debian ならこんな感じだろうか。

virt-install \
--name ubuntuLTS \
--ram 30029 \
--disk path=/var/lib/libvirt/images/debian10.qcow2 \
--vcpus 4 \
--virt-type kvm \
--os-type linux \
--os-variant debian10 \
--graphics none \
--location http://ftp.kddilabs.jp/pub/Linux/distributions/Debian/debian/dists/buster/main/installer-amd64/ \
--extra-args "console=tty0 console=ttyS0,115200n8"

インストール画面はSSH経由で

SSHCLIでテキストでインストールで切るので便利。

f:id:takuya_1st:20200401075852p:plain

f:id:takuya_1st:20200401081159p:plain

tasksel で openssh-server を選ぶのを忘れないように

インストール時に、openssh-server を選ばないと、ログインできなくて詰みます。もちろんネットワーク設定が必須です。無いと詰み。

grub を無理やり変更すれば可能だけどめんどくさいので、 openssh-server のインストールを忘れないように。

インストール後に grub を編集します。

シリアル コンソール を使えるように、 grub を設定しておきます。

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
##
GRUB_CMDLINE_LINUX="console=tty1 console=ttyS0,115200"
GRUB_TERMINAL="console serial"
GRUB_SERIAL_COMMAND="serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1"

grub を更新しします。

sudo update-grub

これで、virsh からコンソールアクセスができる

virsh console ubuntu-vm

または

virsh
console ubuntu-vm

でコンソールでログインができるようになる。VGA関連をバッサリ削れるのでだいぶ手軽に使えるようになる。

f:id:takuya_1st:20200401133345p:plain

その他の方法

似たような方法でも、同じような目的を達成する事ができます。

Ubuntuクラウド イメージ vmx Debian のクラウド イメージ qcow LXC /docker など

これらを使えば、コンソールで起動するVMを確保することができる。

軽量なコンテナでも良いんだけどVMが良いというときなど、TPOに合わせて使い分けていきたい。 何でもかんでもDockerが最高というわけでもないので

参考資料

Creating Virtual Machines on KVM with virt-install

https://cloud.debian.org/images/cloud/

lxc でコンテナへファイルを送信(コピー)する。

lxc で ホストからコンテナへファイルを送信する。

LXC は lxc の file コマンドでファイルをコピーすることができる。

takuya@:~$ lxc file push ~/.vimrc  ${CONTAINER}/root/

ただし! 末尾の スラッシュを除外すると面倒になるので注意。

takuya@:~$ lxc file push .vimrc  ${CONTAINER}/root
Error: Path already exists as a directory: File too large

/root の中にコピーしようと思うと、末尾のスラッシュを入れないと、ファイル名として解釈されてしまう。

すごくオペレーションミスになりやすいので注意。

gitlab を lxd/lxc などの仮想マシンに入れようとしてエラー

apt install gitlab-ce したらエラーになった。

 * execute[load sysctl conf kernel.sem] action run
      [execute] * Applying /etc/sysctl.d/90-omnibus-gitlab-kernel.sem.conf ...
                * Applying /etc/sysctl.d/90-omnibus-gitlab-kernel.shmall.conf ...
                * Applying /etc/sysctl.d/90-omnibus-gitlab-kernel.shmmax.conf ...
                sysctl: permission denied on key 'kernel.sem'
                sysctl: permission denied on key 'kernel.shmall'
                sysctl: permission denied on key 'kernel.shmmax'
                sysctl: permission denied on key 'fs.protected_hardlinks'
                sysctl: permission denied on key 'fs.protected_symlinks'
                * Applying /etc/sysctl.d/99-sysctl.conf ...
                * Applying /etc/sysctl.d/protect-links.conf ...
                * Applying /etc/sysctl.conf ...

      ================================================================================
      Error executing action `run` on resource 'execute[load sysctl conf kernel.sem]'
      ================================================================================

エラーになる。

Running handlers:
There was an error running gitlab-ctl reconfigure:

gitlab_sysctl[kernel.sem] (postgresql::enable line 81) had an error: Mixlib::ShellOut::ShellCommandFailed: execute[load sysctl conf kernel.sem] (/opt/gitlab/embedded/cookbooks/cache/cookbooks/package/resources/gitlab_sysctl.rb line 46) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '255'
---- Begin output of sysctl -e --system ----
STDOUT: * Applying /etc/sysctl.d/90-omnibus-gitlab-kernel.sem.conf ...
* Applying /etc/sysctl.d/90-omnibus-gitlab-kernel.shmall.conf ...
* Applying /etc/sysctl.d/90-omnibus-gitlab-kernel.shmmax.conf ...
* Applying /etc/sysctl.d/99-sysctl.conf ...
* Applying /etc/sysctl.d/protect-links.conf ...
* Applying /etc/sysctl.conf ...
STDERR: sysctl: permission denied on key 'kernel.sem'
sysctl: permission denied on key 'kernel.shmall'
sysctl: permission denied on key 'kernel.shmmax'
sysctl: permission denied on key 'fs.protected_hardlinks'
sysctl: permission denied on key 'fs.protected_symlinks'
---- End output of sysctl -e --system ----
Ran sysctl -e --system returned 255

sysctl の値がおかしい。

つまり、 lxc 内部から、sysctl を実行できないことに起因するっぽい

LXC のゲストとホストがあり、インストールをした直後の LXC ホストにLXCゲストを入れてて gitlab を apt install しようとしたら起動する

root@lxc-container $ exit
root@lxc-host# sysctl -e --system
root@lxc-host# lxc console  lxc-container
root@lxc-container $ sudo gitlab-ctl reconfigure

他にも sysctl 関連で次のようなエラーが出る。

execute[load sysctl conf net.core.somaxconn] action run
      [execute] * Applying /etc/sysctl.d/90-omnibus-gitlab-kernel.sem.conf ...
                * Applying /etc/sysctl.d/90-omnibus-gitlab-kernel.shmall.conf ...
                * Applying /etc/sysctl.d/90-omnibus-gitlab-kernel.shmmax.conf ...
                sysctl: permission denied on key 'kernel.sem'
                sysctl: permission denied on key 'kernel.shmall'
                sysctl: permission denied on key 'kernel.shmmax'
                sysctl: permission denied on key 'fs.protected_hardlinks'
                sysctl: permission denied on key 'fs.protected_symlinks'
                * Applying /etc/sysctl.d/99-sysctl.conf ...
                * Applying /etc/sysctl.d/protect-links.conf ...
                * Applying /etc/sysctl.conf ...

      ================================================================================
      Error executing action `run` on resource 'execute[load sysctl conf net.core.somaxconn]'
      ================================================================================

他の対処法があったり

lxc のゲストに自身の sys 設定を許可する設定をするとか

$ lxc config set container-name security.privileged true
$ lxc config set container-name raw.lxc "lxc.mount.auto=sys:rw proc:rw cgroup:mixed"
$ lxc config get container-name raw.lxc
lxc.mount.auto=sys:rw proc:rw cgroup:mixed
$ lxc start container-name 
$ lxc exec container-name 'sysctl -w kernel.shmmax=17179869184'

privileged で特権を入れてあげても良いかもしれない。

LXC のホスト側から sysctl をガッツリ変えたものをシェアするとか

 /etc/sysctl.conf /etc/sysctl.d/*.conf | sysctl -e -p - 

lxc つかうとこういう事が起きるんですね。

最終的に

ホスト側に sysctl で次の値を設定して

takuya@m75q-1:~$ sudo sysctl -p
kernel.shmall = 4194304
kernel.shmmax = 17179869184
kernel.shmall = 4194304
kernel.sem = 250 32000 32 262
net.core.somaxconn = 1024
kernel.shmmax = 17179869184

ゲスト側に privellege と read/write を仕込んで無事動きましたね。

ただ、gitlab の更新が来たら、また動かくなったので

LXCで動かすのは不可能だと思いました。

関連資料

https://askubuntu.com/questions/831481/how-to-set-lxc-mount-auto-in-lxd

https://forum.proxmox.com/threads/installing-gitlab-into-lxc-container-sysctl-kernel-shmmax.49388/

IPアドレスから地域判定するgeoipをipinfoで実現する。香川県判定

ipinfo というサービスがありまして。

ここに、リクエストを投げると、JSONで位置情報をくれる。

curl ipinfo.io
$ curl https://ipinfo.io/json

{
  "ip": "49.105.999.999",
  "hostname": "mo49-105-999-99999.fix.mopera.net",
  "city": "Tokyo",
  "region": "Tokyo",
  "country": "JP",
  "loc": "35.6910,139.7679",
  "org": "AS9605 NTT DOCOMO, INC.",
  "postal": "101-0047",
  "timezone": "Asia/Tokyo",
  "readme": "https://ipinfo.io/missingauth"
}

/json にリクエストを投げるとリクエスト元のIPアドレスで情報が返ってくる。

指定したIPの都道府県情報を得る

GETのPATHにIPアドレスを含めることで指定したIPアドレスの地域情報を得ることができる。

curl https://ipinfo.io/49.111.111.XXX/json

指定したIPが香川県かどうか調べる

そうです。地域判定が必要なのは、香川です。kagawa を判定しないといけません。

[[ $( curl https://ipinfo.io/49.111.111.111 | jq .region ) == 'kagawa' ]]

nginx と組み合わせます。

nginx に cookie アクセス制限を取り付けて、cookie未発行なら、香川チェックを受けてもらいます。

https://takuya-1st.hatenablog.jp/entry/2018/05/08/182127

findコマンドでファイルの所有ユーザーを調べ所有者を間違っているファイルを探す。

find コマンドで、自分以外の所有者のファイルを探す。

ユーザーがtakuya 以外のファイルやディレクトリを探す。

find .   -not -user takuya

指定した所有者のファイルを探す。

not を外せば、所有者を限定してファイルを探す。

find .   -user takuya

オーナーではなく -user です。

指定したユーザーグループを探す

重ねがけが出来ます。

find .   -user takuya -and -group takuya

ユーザー設定が意図通りになっていないものを探す。

find .  -not -user takuya -and -not -group takuya

また、指定した所有者以外になってるものを探す。

find .  -not -user takuya -and -not -user www-data

and と or と not を組み合わせる

条件を組み合わせると、ファイルのオーナーやグループを限定して除外したり検索ができるので find コマンドの適用範囲は広がると思う。

-and XXX 
-and -not XXX
-or -not XXX
-or XXX

find コマンド 関連記事

すぐわかるfindコマンドの使い方 - それマグで!

find コマンドで所有者やグループが条件マッチするファイルを探す - それマグで!

Amazonで横幅が広がったパソコン向け表示になってしまったのをスマホサイトに戻す。PC→スマホ、スマホ→PC

アマゾンでスマホ向けサイトに戻したい。

Amazonを見ていると稀に、iPadなどタブレットがPC表示になってしまったりする。スマホでPC版サイトを開いたらスマホ版に戻れなくなったって割とあるんですよね。

f:id:takuya_1st:20200324155822p:plain:w320

スマホサイトに戻すには

モバイルサイトに戻すリンクをクリックします

リンク →モバイル表示: https://www.amazon.co.jp/gp/anywhere/site-view.html?&opt=mobile

もとに戻すには、リンクをクリックするだけす→ モバイルサイト・リンク

PCサイトを閲覧するには

リンク→ PC表示 : https://www.amazon.co.jp/gp/anywhere/site-view.html?&opt=desktop

リンクは、最下段にあります。

スマホで表示中に、パソコン向け表示→モバイル表示にもとに戻すには、一番下にあるリンクをクリックすればいいのですが、とてもタッチしにくいので、リンクを覚えておくほうが便利だと思います。

f:id:takuya_1st:20200324160611p:plain

文字が小さいので見にくい?

見にくいのは、拡大縮小である程度見ることが出来ます。

パソコン向け表示だと、多少は見にくいですが、検索結果で広告が見やすかったり、商品詳細が1ページで済むので操作が少なくなる良さもあります。上手に使い分けてみてはいかがでしょうか。

アプリ版は、複数タブを開けないのでとても不便ですね。

もっとカンタンに iOSショートカットで!

amazonスマホ表示に戻す ショートカット

AmazonをPC表示にする ショートカット

telnet / openssl を用いて pop3/pop3s のサーバーの疎通を確認する。

pop3 サーバーにtelnet でアクセスする

telnet  pop3.myserver.example.com 110 

over tls /ssl の場合は、openssl を使う

SSL/TLS を経由した暗号化通信をする場合は、openssl コマンドを使います。次の例は、googlegmailpop3 over ssl したときのアクセス例です。

openssl s_client -connect pop.gmail.com:995 -crlf

POP3でログインする。

+OK  ready for requests from 
USER USERNAME@myserver.example.com
+OK send PASS
PASS MY_PASSWORD
+OK Welcome.
STAT
+OK 260 4516798

入力待ちになったら、まずユーザー名を呈示します

USER ユーザー名@ドメイン{enter}

ユーザー名がOKならサーバーから +OK が返ります

+OK 

次にパスワードを入れます

PASS MY_SECRET{enter}

するとサーバーからOKが返ります。

+OK Welcome.

コマンドが間違っていると サーバーから ERRが返ります。

-ERR

応答を+/-だけ見ていればいいのでラクですね。

何件あるか

STAT

STAT を送信すると、件数が表示されます。( gmail の場合 迷惑メールやゴミ箱も併せて表示されるので、250 件前後になるそうです。)

メールの一覧

LIST

一覧が表示されます。 . ピリオドが来るまでが一覧と番号です。 UIDL (Unique ID Listing) でも可能です。

メールの取得

メールの取得は TOP か、RETR を使います、が、RETR は その名の通りRETREIVE で取り出して削除してしまうのであまり使いません。( gmail のpop サーバーはエラーになる。)。

メールを取り出します。メール取得は本文の行数分処理されます。

No. 260 を先頭から1000行取り出す例

TOP 260 1000

指定した行数に満たない場合は、有るだけ出てきます。これも . ピリオドが来るまで、データが転送されます。

メールのヘッダがほしいときは 0 を指定すると楽です。

TOP 260 0

接続の終了

終了には次の文字列を送信します。

QUIT

無事切断されました。

quit
+OK Farewell.
read:errno=0

実際の接続例

f:id:takuya_1st:20200323192014p:plain

gmail の pop接続した場合の注意点

最新の250件程度が表示されますが、スレッド表示されてないなど、GmailのWEBからみた表示とは異なります。

「250 件ほど」のメッセージのリストが提供される理由: POP クライアントから Gmail に対してメッセージのリストが要求されると、まだ POP でダウンロードされていない、日付の古い順に 250 件のスレッドが Gmail で取得されます。Gmail のスレッドは複数のメッセージで構成されている場合もあるため、メール クライアントでダウンロードされる個別のメッセージ数は通常 250 件よりも多くなります。 https://support.google.com/a/answer/6089246?hl=ja

POP3

そういえば、最近はPOPって使わなくなりましたね。IMAP / SMTP を直接叩いたことはあるんですが、popは長いこと触って無いなと思って改めてためしました。 とてもシンプルですね。

参考資料

POP3(Post Office Protocol version 3):インターネット・プロトコル詳説(7) - @IT

関連資料

IMAP の場合 telnet(openssl)でIMAPプロトコルを喋ってGmailに命令を出す。 - それマグで!

SMTPの場合 SMTP の認証プロトコルを手作業で確認する - それマグで!

docker のイメージやコンテナを削除する. まとめて全削除

docker でストレージが圧迫される

docker build とか docker hub でイメージ取得してるとありがち。ストレージ圧迫される。

全部のコンテナを削除する

docker rm $( docker ps -a -q )

全部のイメージを削除する

 docker image rm  $( docker images -q )

依存関係に注意。

ただし、イメージには依存関係がある。ubuntu を使ってる XXXイメージを消そうととするなら、ちゃんと先に使ってるXXXを消す必要がある。まとめて指定すれば依存関係は内部でチェックして問題なければ解決して削除する。

また、イメージとコンテナに依存関係があって、起動中や終了してるコンテナで利用されてたら、削除する事はできない。

コマンドのポイント

docker ls -a -q 
docker image ls -q 

オプションで -q をつけるのがポイント。ここ大事なので試験に出ます。

echo  $(  date   ) 

コマンドのドルマーク $( ) は、カッコの中身を先に実行して、その結果をコマンドの引数にします。改行やスペースで文字区切りされて引数として渡されます。

その他チェックするもの

ボリュームもチェックしておくといいです

docker volume ls 

容量不足に泣かされないでも、docker build は速くしたい→キャッシュサーバー

docker build をためしたり、dockerfile を作るときに大量につくってしまったり、ストレージを圧迫される事が多かったのでメモ

もし、削除しても専用のキャッシュサーバーを作っておくと手速い

また、ubuntu など apt を頻繁に回すときは apt-cacherを使うapt-cacherで docker buildを速くする - それマグで!

関連資料

PhpStorm/WebStorm/IntelliJ IDEA など でUndo(やり直し)回数を増やす.

Jetbrains の phpstorm 愛用してますが、アンドゥ回数が不満です。

不満で仕方ないです。コードをリファクタリングしてるときとか、ちょっと戻したり、ちょっと進めたり、undo/redo の Ctrl-Z(⌘-z)をめっちゃ押します。

でも、履歴件数が少なすぎます。いつもああああ戻れない。って焦ります。

アンドゥの代わりに、そのために git でまいかい gitでコミットしたり stash するのも不便です。マージとrebase だらけでヒストリもカオスになったり。 (git の勉強にはなるんだけどさ)

Undo 回数は増やせます。

「やり直し(もとに戻す Ctr-Z ⌘-Z) 」 の回数は増やせます。

それは IDEレジストリ(registry ) にあります。

Find Action をひらく

Find Action ( CMD-Shift-A ) から f:id:takuya_1st:20200319024624p:plain

レジストリ ( registry) を探します。

f:id:takuya_1st:20200319023952p:plain

レジストリの undo 項目を探します。

初期値(デフォルト値)は100 ですが、任意の回数に増やすことが出来ます。 f:id:takuya_1st:20200319023936p:plain

検索しづらい

アンドゥやレジストリという、WindowsやDockerのキーワードと「モロ被り」なのでちょっと検索がしにくいです。特にGoogle

これは docker 設定

こういうのが検索に掛かってきて、ちょっと不便ですね。

設定方法を忘れたときは、 「Android Sttudio やり直し回数 履歴」だとか、「やり直し 回数 phpstorm 」だとか、検索結果に妙に特徴のでる製品名を選んだらいいと思います。

レジストリ やり直し intellij」だと本当にひどい目に合う。キーワードから類似語だと認識される、窓OSのアフィブログまみれになります。

f:id:takuya_1st:20200319025011p:plain f:id:takuya_1st:20200319023956p:plain

参考資料

Is there a way to increase the undo history size? – IDEs Support (IntelliJ Platform) | JetBrains

PHPStormでUndo回数を増やす件 - uzullaがブログ

https://youtrack.jetbrains.com/issue/WI-21306?_ga=2.191367971.824244746.1584552897-6632410.1584552897#comment=27-639779

指定サイズのファイルを作る方法 ( head 編 )

任意の指定サイズのファイルを作る方法

head を使う場合。

takuya@~$ head -c 100k /dev/urandom > out
takuya@~$ ll out
-rw-r--r-- 1 takuya staff 100K 2020-03-18 13:59 out

ランダム( /dev/urandom) から読み出して、指定サイズを作ります。 head は -c でサイズ指定が出来ます。

色々なサイズ

1M ( 1024*1024 )のサイズを読みだした場合

takuya@~$ head -c 1m /dev/urandom > out
takuya@~$ ll out
-rw-r--r-- 1 takuya staff 1.0M 2020-03-18 14:01 out
takuya@~$ \ls -l out
-rw-r--r-- 1 takuya staff 1048576  3 18 14:01 out

1G ( 1024* 1024 * 1024 ) のサイズを読みだした場合

takuya@:~$ ll out
-rw-rw-r-- 1 takuya takuya 1.0G 2020-03-18 14:02 out
takuya@:~$ \ls -l  out
-rw-rw-r-- 1 takuya takuya 1073741824  3月 18 14:02 out

少数 0.1m や 1g が指定できないので、それをしたいときは bash の四則演算を使って計算すればいい

takuya@:~$ head -c $(( 1024 * 1024 * 2 / 10   )) /dev/urandom > out

他の方法

他の方法は、過去記事を参考にしてください。

windows なら fsutil 、 linux なら dd を使う方法もあります。

参考資料

  • man head