それマグで!

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

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

github actionでテストを自動実行する例

github のActionでテストを実行する例をつくりました。

https://github.com/takuya/github-action-sample-testing-code

テストの設定

github action を実行するには、レポジトリにディレクトリとYAMLを作成します。

## レポジトリの作成
mkdir my-repo
cd my-repo
touch README.md
git init 
git add README.md
git commit -m initial
git remote add origin git@github.com/xxxx/xxxx 
## actions の設定ファイルを設置
mkdir -p .github/workflows/
touch .github/workflows/actions.yml
## push で起動する
git add .github
git push origin master

テスト実行する

アクションの記述例はシンプルにしてあります。

name: build and test

on:
  push:
    branches:
      - master
  
jobs:
  build_and_test:
    runs-on: ubuntu-latest

    steps:
      - name: checkout
        uses: actions/checkout@v2
      - name: composer install
        shell: bash
        run : |
          composer install  -q --no-ansi --no-interaction --no-scripts --no-progress
          composer dump-autoload
      - name : run
        shell : bash
        run : |
          vendor/bin/phpunit
          

github アクションの限界

action は主に ubuntu-latest のgithub が用意したインスタンスが利用されます。

node や npm/yarn や webdriver などほしいと思うものは一通りインストール済みなので、無理せず既存のインスタンスを活用するのがいいかともう。

自分のdocker イメージを利用するのは少し手間なので、docker イメージを利用するなら circleCIのほうが楽かもしれない。

実行結果バッジ

実行結果バッジは次のようなURLで画像を取得できる。

https://github.com/takuya/cronjob-alternative/workflows/test%20src/badge.svg

URLの構造は次の通り。

https://github.com/takuya/{$レポジトリ名}/workflows/${ジョブ名}/badge.svg

ジョブ名のところには、yaml の最上位で指定した name が入る。

次のようなYAMLの場合は build and testになる。スペースは%20 になる。URLエンコードされる。

name: build and test

on:
  push:
    branches:
      - master
  

github actionsは動作がメチャクチャ速いので活用できる範囲で使っていきたい。

参考資料

https://flutter.takuchalle.dev/posts/how-to-test-on-github-actions/

cronをWEB管理するソフトを作りました。

cron の代替を作りました。

github.com

f:id:takuya_1st:20210917182720p:plain

経緯

cron(自動実行プログラム)の管理が煩雑でした。

増え続けるcrontab。ここ数年管理が崩壊していました。systemd.timer や google app scripts なども増えるし、ラムダ系で実行してたりいろいろな所で、タイマー(カレンダー)による実行が溢れかえる。手軽に作れる一方でエラーログを確認したりがめんどくさいので放置してて実行してるけど動いてないスクリプトとかもあり全容把握が困難でした。

散らばる cron / systemd.timer

crontab による管理は、3つの箇所に別れます。

システム(/etc/cron.d/) root ( /var/spool/cron/crontabs/root ) そして個人ユーザー ( /var/spool/cron/crontabs/$USER ) の3つに別れます。この時点でいい加減に管理していると大変。

最近は、systemd.timer が増えてきました。 systemd.timer は systemd.service とペアになっているので、ファイルが複数に分かれます。さらに、ユーザー空間の systemd ( systemd --user )もあります。ログ管理や任意実行は平易化したが、ファイル管理は煩雑になりました。

ここに、lxd/docker/vbox などの仮想環境のcronが加わると管理は不可能になります。

散らばる通知・ログ

大変なのはログと通知の管理です。スケジューラーがコケたときに通知くるけどcron などは > /dev/null とか > /var/log/my-job.log みたいにログファイルに書くしかなくて困る。エラー時の実行ログと正常ログを見たいのに、実行ログと実行時間から推察してログをたどるのが面倒だった。

crontab 書くのめんどくさい

ちょっとした分岐が書きたい

crontab で実行しようとすると、スクリプトいったん実行可能なファイルにして書き出す必要があって、条件分岐をかくのが大変だし、実行ファイルを一箇所に集めて管理とか大変だ。crontab 見ても何が実行されるのかパット見わからないことが多くて困る。

一時停止が大変

ジョブがエラーになってるときなど、一時停止したいときコメントアウトで対応してるとコメントアウトだらけになって、何がなんだかわからなくなった。

crontab の実行予定がわからない。

大量にあるとスクロールしながらひと目見て、cron 書式から次回実行はいつなんだというのがわかりにくい。ソートしたい。

ssh経由でリモート実行したい

cron を一箇所に集めて、sshでリモート実行ちゃえばある程度解決する。SSHで実行するとなると環境変数ssh-agentを書いて環境変数をうまく扱う必要がある。するとスクリプトファイルを使って実行するがcrontabファイルで完結しなくなる。

cron 限界じゃね?

というわけで、cronは5~10件が限界じゃね?別の何かが必要じゃないかと思いました。

webで管理したい。

webでcronの実行予定とスクリプト本文を編集できたらいいじゃん。

web管理機能を探したけど

いいものが見つからなかった。ジョブスケジューラは高機能すぎる気がするしjenkinsとかはCI/CDツールだし。どうも用途に合わないので、laravelでcron書式をつかったスケジュール実行ができるのでそれを応用して作りました。

ソフトウェア仕組み

root で スケジュール実行用のワーカーを常駐させて、毎分単位で実行するべき処理を探しては実行する。

このソフトウェアの限界

毎分単位で処理を探して、プロセスをforkしてジョブを実行するので、1000件くらいが上限だと思われる。

このソフトの特長

WEBから編集ができます。

一時停止状況がわかるように

コメントアウトの代わりに一時停止状況がわかるように

f:id:takuya_1st:20211004210305p:plain

次回実行の予定がわかるように

cron表記を日本語表記にして次回実行がわかるようにしておいた。

f:id:takuya_1st:20210917182425p:plain

実行ごとに結果がわかるように

実行ごとにSTDOUT/STDERRを保存するように。また実行時間も測定し、スケジュール全体の見直しに活用できるようにしました。

f:id:takuya_1st:20210917182531p:plain

スクリプト本文の直接記述

crontab が1コマンド(1行)で記述しなくちゃいけなくて改行を入れてるとおかしくなるのでとても不便なので、

改行やコメントを書けるようにして、直接記述できるようにしして、実行シェルをbash以外から選べるようにしておいた。現在はbash/phpを選べます。sh/rubyは行けそうなのでそのうち対応しようと思います。pythonはちょっと難しいかも。

f:id:takuya_1st:20211004210436p:plain

インストールと取得はgithub

Github に公開しておきます。

github.com

とりあえず試す用のdockerも用意しました。

docker pull ghcr.io/takuya/cronjob-alternative:latest
docker run --rm -p 5000:80 ghcr.io/takuya/cronjob-alternative:latest

cronといってますが、cron表記を使うだけで、crontabの編集を一切やりません。実行するワーカーはcronとは別にじぶんで起動して使います。

multipass のubuntu で dockerd を動かして外部から接続できるようにする。

multipass に docker を入れる。

multipass を windowsでインストールすると、HyperVの仮想マシンで起動します。

choco install multipass 

windowshyper-V で起動したubuntu に docker を入れる。

sudo snap install docker 

mutipass な ubuntu の docker(dockerd) が外部接続を受けるようにする。

dockerd の起動設定を変える。

[Service]
# ExecStart=/usr/bin/snap run docker.dockerd  
ExecStart=/usr/bin/snap run docker.dockerd  -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

書き換えコマンド。

sudo vim /etc/systemd/system/snap.docker.dockerd.service
# または
# sudo systemctl edit snap.docker.dockerd.service

リロード

sudo systemctl daemon-reload
sudo systemctl status snap.docker.dockerd.service

外部(Windows/Mac)からmultipass のdocker に接続する。

multipass の仮想マシンtcp://172.17.231.118:2375 でlisten しているので、そこへ接続する。

DOCKER_HOST=tcp://172.17.231.118:2375 /usr/bin/docker run --rm hello-world

docker コマンドをインストールする。

dockerd を除いた、docker コマンドだけをインストールするには

wsl v1 のDeibanの場合。

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo   "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
## 
sudo apt install docker-ce-cli

windows内に複数の仮想環境が乱立するが、TCP経由でdockerd を使うと選択肢が多く、比較的インストールがスムーズに終わることがわかる。

Windows内部の構造を単純に考えると次のようになる。

windows 内部
   - multipass 
       - ubuntu 
   - wsl
     - v1 
       - debian 

docker-desktop でお手軽なんだけど、docker-desktop 版をいれるとwslv2 になるのでめんどくさいんですよ。

別ホストのdockerをTCP経由で操作する

docker は自PCに入れなくても動作します。

docker コマンドの接続は次のようになっています。

docker-cli ---- fd(sock) --- docker-host

docker は api 経由で動作しているので、TCP経由でも接続できます。

docker-cli ---- tcp(sock) --- docker-host

tcp 接続でdocker を使う。

tcp://192.168.2.10:2375 で起動したdockerへ接続する。

DOCKER_HOST=tcp://192.168.2.10:2375 /usr/bin/docker ps -a

docker daemon ホストを tcp://192.168.2.10:2375 で起動する。

TCP経由でリッスンし起動する。

/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --containerd=/run/containerd/containerd.sock  

systemd の記述を変える。

/etc/systemd/system/multi-user.target.wants/docker.service

ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --containerd=/run/containerd/containerd.sock

リロード再起動

sudo  systemctl daemon-reload
sudo systemctl restart docker.service

活用法

WindowsでDockerを使うときは茨の道なので、TCP経由で起動するといいです。

wsl → localhost:2375  → Windows Docker 
wsl → localhost:2375  → HyperV Docker
wsl → 172.16.11.11:2375  → multipass ubnuto docker

参考資料

bashスクリプトで標準入力か引数のどちらかを取得する

STDINか引数を処理するコマンドを作りたい。

たとえば、次のようなコマンドを作りたい。

標準入力があるときは、標準入力を使い、それ以外は引数を使う。

echo AAA | to_lower
to_lower AAA

to_lower の例。

ヒアストリングに展開すれば楽ちんです。

<<< ${@:-$(</dev/stdin)}
#!/usr/bin/env bash
tr "[:upper:]" "[:lower:]" <<< ${@:-$(</dev/stdin)}

{$@} が引数で引数があるときは引数を使い、ないときは$(</dev/stdin) で標準入力を探しに行く

参考資料

https://stackoverflow.com/questions/19619490/how-to-read-stdin-when-no-arguments-are-passed/19619634#19619634

openwrt で IPアドレスが変わるまで再接続(IPガチャ)

openwrt でpppoe を再接続

再接続して、IPアドレスが変わるまで、PPPoEガチャをする。

IPアドレス判定がおかしいとき。

IPアドレスによる地域判定や、IPアドレスで「ブロック」されたときに、再接続する。

今どき、ipv4 をブロックリストに追加したり、地域判定でごちゃごちゃするのはありえないと思うんだけどさ。

ネットワーク関連のコマンド。

/lib/functions/network.sh にネットワーク関連のコマンドが用意されているのでそれを読み込む。

source   /lib/functions/network.sh

現在のIPアドレス

ネットワークコマンドから、現在のIPアドレスを取得できる。

  source   /lib/functions/network.sh
  network_flush_cache
  network_find_wan WAN_IF
  network_get_ipaddr IP_ADDR "${WAN_IF}"

再接続

PPPoEの再接続は ifup/ifdown でできる。

引数は、pppoe の接続名になる。

  ifdown ocn_pppoe;
  ifup ocn_pppoe;

IPアドレスを変えるまで無限ループにする。

#!/usr/bin/env bash


function get_current_ip(){
  . /lib/functions/network.sh
  network_flush_cache
  network_find_wan WAN_IF
  network_get_ipaddr IP_ADDR "${WAN_IF}"
  echo $IP_ADDR
}
function reconnet_pppoe(){
  # >&2 echo ${FUNCNAME[0]}
  ifdown ocn_pppoe;
  ifup ocn_pppoe;
  wait_reconnect
  # >&2 echo reconnect_end
}


function wait_reconnect() {
  IP_ADDR=` get_current_ip `
  while [[ -z $IP_ADDR ]]; do

    IP_ADDR=` get_current_ip `

    # >&2 echo IP_ADDR=$IP_ADDR
    if (( i++ > 60  ));  then
        # >&2 echo wait give up
        break
    fi
    sleep 1
  done

}



function main(){

  PREV_IP=` get_current_ip `
  while (( cnt++ < 100 )); do

    # echo $cnt
    reconnet_pppoe;
    # >&2 ip addr show pppoe-ybb

    CURR_IP=`get_current_ip`

    echo old_ip=${PREV_IP} ,new_ip=$CURR_IP
    ## ip 変わるまで再接続
    if [[ ! -z $CURR_IP ]] && [[ $PREV_IP != $CURR_IP ]] ;then
      break
    fi
  done

  echo done
}


main

bitwardenのインストール

bitwardenを動かしてみる。

構成、Ubuntu 20.04 に lxc コンテナを用意し、lxc コンテナ内部に docker インストール、docker 上に bitwarden を入れた

bitwarden on docker on lxc on ubuntu 20.04 です

lxc の準備

snap install lxc 

LXC 仮想マシン準備

name=bitwarden
lxc launch ubuntu:20.04 $name --storage bt01
lxc config set $name security.privileged true
lxc config set $name security.nesting true
lxc restart $name
lxc shell $name

docker 準備

apt update 
apt upgrade -y 
apt install docker-compose -y
docker run --rm hello-world

作業用ディレクト

cd 
mkdir sample 
cd sample

bitwarden サーバー

curl -s -o bitwarden.sh \    https://raw.githubusercontent.com/bitwarden/server/master/scripts/bitwarden.sh \
    && chmod +x bitwarden.sh
./bitwarden.sh install
./bitwarden.sh start

インストールID

https://bitwarden.com/hostにアクセス

  • Installation Id: a5dd017f-ca06-xxxxx
  • Installation Key: mPYQiuxxxx

インストールIDを生成してインストールを認証して持らう。

再インストール

再インストールや失敗時にやり直す場合は、先にbwdataを除去しておく。

rm -rf bwdata
./bitwarden.sh install

バックアップ

./biwarden stop
rclone bwdata xx:/backup

証明書

証明書は、letsencrypt を certbot するけど、自動取得がNAT内部だと動かないので、最初は自己署名証明書にしておくのがベター

自分インストールの物を使う。

Chromeの拡張で自分のサーバーを使うには、次のボタンを押す。

インストールのログ

root@bitwarden:~/sample# ./bitwarden.sh install
 _     _ _                         _
| |__ (_) |___      ____ _ _ __ __| | ___ _ __
| '_ \| | __\ \ /\ / / _` | '__/ _` |/ _ \ '_ \
| |_) | | |_ \ V  V / (_| | | | (_| |  __/ | | |
|_.__/|_|\__| \_/\_/ \__,_|_|  \__,_|\___|_| |_|

Open source password management solutions
Copyright 2015-2021, 8bit Solutions LLC
https://bitwarden.com, https://github.com/bitwarden

===================================================

bitwarden.sh version 1.42.3
Docker version 20.10.7, build 20.10.7-0ubuntu1~20.04.1
docker-compose version 1.25.0, build unknown

(!) Enter the domain name for your Bitwarden instance (ex. bitwarden.example.com): bit.exampmle.com

(!) Do you want to use Let's Encrypt to generate a free SSL certificate? (y/n): n

(!) Enter the database name for your Bitwarden instance (ex. vault):

1.42.3: Pulling from bitwarden/setup
Digest: sha256:a85998defed50c28dcd477c1b196df9282e0f46c18dfb5d0f5378833fe02f81e
Status: Image is up to date for bitwarden/setup:1.42.3
docker.io/bitwarden/setup:1.42.3

(!) Enter your installation id (get at https://bitwarden.com/host): a5dd017f-ca06-xxx-xxx-xxxxxxxx

(!) Enter your installation key: mPYQiuHnxxxxxxxxx

(!) Do you have a SSL certificate to use? (y/n): n

(!) Do you want to generate a self-signed SSL certificate? (y/n): y

Generating self signed SSL certificate.
Generating a RSA private key
..................++++
...........................................................................................................................................................................................................................................................................++++
writing new private key to '/bitwarden/ssl/self/bit.example.com/private.key'
-----
Generating key for IdentityServer.
Generating a RSA private key
...................................++++
.........................................++++
writing new private key to 'identity.key'
-----

!!!!!!!!!! WARNING !!!!!!!!!!
You are using an untrusted SSL certificate. This certificate will not be
trusted by Bitwarden client applications. You must add this certificate to
the trusted store on each device or else you will receive errors when trying
to connect to your installation.

Building nginx config.
Building docker environment files.
Building docker environment override files.
Building FIDO U2F app id.
Building Asset Links For Fido2.
Building docker-compose.yml.

Installation complete

If you need to make additional configuration changes, you can modify
the settings in `./bwdata/config.yml` and then run:
`./bitwarden.sh rebuild` or `./bitwarden.sh update`

Next steps, run:
`./bitwarden.sh start`

起動チェック

起動したら、IPアドレスへアクセスする。 http://docker-nginx.local:8080/ にアクセスして起動チェックする。

ポートフォワーディング

docker コンテナへのポートフォワーディングを設定する。

リッスンするポートをここで指定する。

bitwarden/bwdata/config.yml

url: https://mybitwarden.example.tld
generate_compose_config: true
generate_nginx_config: true
http_port: 11080
https_port: 11443
compose_version:
captcha: false
ssl: false

ssl は letsencrypt でできるが、証明書の管理は面倒くさいので、cloudflareで受けるか、自前のnginxでSSLリバースプロキシを構成した。

管理者メールとメール設定

ログインと新規登録、パスワード紛失時のリカバリにメールを使うのでSMTPサーバーを設定する。

管理者ログイン(といってもユーザーの削除くらいしかできない、ユーザーのデータを見ることは出来ない)

bitwarden/bwdata/env/global.override.env

globalSettings__mail__replyToEmail=mybitwarden@example.tld
globalSettings__mail__smtp__host=smtp.example.tld
globalSettings__mail__smtp__port=465
globalSettings__mail__smtp__ssl=true
globalSettings__mail__smtp__username=mybitwarden@example.tld
globalSettings__mail__smtp__password=XXX_smtp_password_XXX
globalSettings__disableUserRegistration=true
globalSettings__hibpApiKey=REPLACE
adminSettings__admins=admin-user@example.tld

ドメイン名+SSL経由でアクセスする

あとは、リバースプロキシを設置してドメイン名でアクセスできるように設定する。

これは、インストールではないので、割愛。

bitwarden self-hostedの制限事項

organization ( 組織 ) は作れない。この点を除けば通常の利用とほぼ同じである。

ファイルの添付もできないが、ほとんど困らない。キャッシュカード、マイナンバーカードや、免許証などは、写真で添付せずに番号を入れておけばいいだけだ。

Macの設定のアップデート通知のバッジを省略する。

MacOSの通知バッヂを省略する

macOSの新バージョンの実験台にされるのはいやなので少し前のバージョンを使ってます。 しかし、通知アイコンがずっとアップデートを通知してくるので消したいです。

defaults write com.apple.systempreferences AttentionPrefBundleIDs 0 && killall Dock

これで、preference の dock から red badge を消すことが出来る

f:id:takuya_1st:20220325030501p:plain

もとに戻せるのか?

戻せます

defaults write com.apple.systempreferences AttentionPrefBundleIDs 1 && killall Dock

コマンドを実行するだけでいいのは便利よね。

参考資料

https://apple.stackexchange.com/questions/344278/how-can-i-disable-the-red-software-update-notification-bubble-on-the-system-pref?rq=1

https://osxdaily.com/2020/05/12/disable-red-badge-icon-system-preferences-macos/

s3互換ストレージminio をインストール(2021版)

minio のインストール

最近バージョンアップしたので最新版(2021-09-27現在)で起動やり直したのでメモ、

  • 管理画面にダッシュボードがついた
  • 管理画面のポートが変更になった。
  • 管理画面とストレージのポートが別れた。

管理画面とストレージを別々に起動するのは地味に迷惑なので困った。

あと管理画面でユーザー系の機能が追加されて、軽量なストレージではなくなった。

個人では使わない機能が追加されてるが、S3代用として十分に使えるものになった印象。

公式マニュアルがdocker からpodman に変わった。

docker での起動

docker 起動は、公式マニュアルではとてもシンプルに記述しているが、実際に動かすには、ポートとユーザー環境変数と永続化ボリュームが必要であった。

IMAGE=minio/minio
NAME=minio
PORT_EXPOSE=80801
PORT_WEB_EXPOSE=8080
VOLUME_PERSIST=$( realpath ./data )
docker run -d
    --rm
    --name $NAME
    -p $PORT_EXPOSE:9000
    -p $PORT_WEB_EXPOSE:9001
    -v $VOLUME_PERSIST:/data
    -e MINIO_ROOT_PASSWORD=$MINIO_ROOT_PASSWORD
    -e MINIO_ROOT_USER=$MINIO_ROOT_USER
    $IMAGE server /data   --console-address ':9001'

イメージのレポジトリは、dockerhub か redhatレジストリ quay.io のどちらかを使う。

#dockerhub
minio/minio
# quay.io
quay.io/minio/minio

サクッと停止起動用のスクリプトにしておく。

#!/usr/bin/env bash
# https://takuya-1st.hatenablog.jp/
## : vim

cd $( dirname $( realpath $0 ) )
DIR=$(pwd)


NAME=minio
PORT_WEB_EXPOSE=8080
PORT_EXPOSE=8081
VOLUME_PERSIST=$( realpath ./data )
DOCKER_ID_CMD="docker ps -q  --filter name=$NAME"
IMAGE=minio/minio

MINIO_ROOT_USER=xxxxadminxxx
MINIO_ROOT_PASSWORD=xxxxxxpasswordxxxx


function stop(){
    if [[ ! -z $( $DOCKER_ID_CMD ) ]] ; then
      echo  $NAME is already started. stopping...
      docker stop $( $DOCKER_ID_CMD )
      while [[ ! -z $( $DOCKER_ID_CMD ) ]] ; do
        sleep 1
      done
      echo done

    fi
}
function update(){
  CMD="docker pull $IMAGE "
  echo $CMD
  $CMD

}

function start(){
  CMD="docker run -d
    --rm
    --name $NAME
    -p $PORT_EXPOSE:9000
    -p $PORT_WEB_EXPOSE:9001
    -v $VOLUME_PERSIST:/data
    -e MINIO_ROOT_PASSWORD=$MINIO_ROOT_PASSWORD
    -e MINIO_ROOT_USER=$MINIO_ROOT_USER
    $IMAGE server /data   --console-address ':9001'
  "

  echo $CMD
  $CMD
}


case $1 in
  start)
    start
    ;;
  stop)
    stop
    ;;
  update)
    update
    ;;
  *)
    stop
    update
    start
    ;;
esac

nginx でプロキシする。

複数ドメインをつけるとめんどくさいので、同一ドメインでサブディレクトリで運用したいが、管理画面をサブディレクトリにするのは面倒だったので。ドメインを別に設定した。

管理画面 http://s3admin.example.com/
ストレージ http://s3.example.com/

nginx の設定を作る

## 2021-09-27 takuya

server {

  listen 80;
  server_name s3admin.example.com;
  server_tokens off;

  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Host $http_host;

    proxy_connect_timeout 300;
    # Default is HTTP/1, keepalive is only enabled in HTTP/1.1
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    chunked_transfer_encoding off;
    proxy_pass http://docker.lxd:8081;
  }

}
server {

  listen 80;
  server_name s3.example.com;
  server_tokens off;

location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Host $http_host;
    ##
    chunked_transfer_encoding off;
    proxy_set_header Connection '';
    proxy_http_version 1.1;
    proxy_buffering off;
    proxy_cache off;
    rewrite ^/storage(.*)$ $1 break;
    proxy_pass http://docker-host.lxd:8080;
  }

}

これで、/storage/へのアクセスがS3アクセスになる。

以前のminio のデータもちゃんとそのまま見える。ただ公開範囲や権限は設定し直しになった。 f:id:takuya_1st:20210927224400p:plain

アップロードとダウンロードをテストする

mc ( minio client )がインストールされたdocker があるのでこれを使ってアップロードしてみる。 これで、取得とテスト実行ができる

docker run --rm minio/mc ls play

実際に使ってみる。

docker run  --rm -it  --entrypoint=/bin/bash  minio/mc

minio S3ホストへの接続設定

endpoint=https://s3.example.com/
accesskey=fuheejuShaogae2gggggggggg
secret=ier8Ayaesieghggggggg
mc alias set myS3 \
$endpoint $accesskey $secret

バケットの作成

mc mb myS3/aaa

バケットの一覧

mc ls myS3

ファイルのアップロード

mc cp myS3 hello.txt myS3/aaa/

バケットをpublic に

 mc policy set public myS3/aaa

あとはブラウザから見てみよう

curl https://s3.example.com/aaa/hello.txt

行けそうですね。

参考資料

リモートデスクトップの設定と起動を設定するコマンド

リモートデスクトップの設定と起動

Windowsリモートデスクトップを有効にする設定の場所がわかりにくいのでメモ

設定→システム→リモートデスクトップの順にたどる。

f:id:takuya_1st:20210927135150p:plain

Win10に搭載されている設定メニューにコントロールパネルみたいに「パス」がなくなったのは設計上大問題ですわ。

コマンド

Enable-NetFirewallRule -DisplayGroup "Remote Desktop"
PS C:\Windows\system32> Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server'-name "fDenyTSConnections" -Value 0
PS C:\Windows\system32> Enable-NetFirewallRule -DisplayGroup "Remote Desktop"
PS C:\Windows\system32>
PS C:\Windows\system32>

windowsの再設定

windowsの再設定

2021-08-18 に設定した

scansnap のフォルダを消すのに苦労したのでメモ

連絡先を消す

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{56784854-C6CB-462B-8169-88E350ACB882}\PropertyBag]
"NoCustomize"=dword:00000001
"ThisPCPolicy"="Hide"

保存したゲームを消す

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{4C5C32FF-BB9D-43b0-B5B4-2D72E54EAAA4}\PropertyBag]
"ThisPCPolicy"="Hide"

ミュージックを消す

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{a0c69a99-21c8-4671-8703-7934162fcf1d}\PropertyBag]
"BaseFolderId"="{4BD8D571-6D19-48D3-BE97-422220080E43}"
"ThisPCPolicy"="Hide"

ビデオを消す

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{35286a68-3c57-41a1-bbb1-0eae73d76c95}\PropertyBag]
"BaseFolderId"="{18989B1D-99B5-455B-841C-AB7C74E4DDFC}"
"ThisPCPolicy"="Hide"

ScanSnapフォルダを消す

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{591C1901-C0DA-4776-8450-F9806F6E9687}]
@="ScanSnap Folder"
"AppID"="{3DB87E3A-2490-49DA-BA7C-5931849992CE}"
"InfoTip"="ScanSnap Folder"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{591C1901-C0DA-4776-8450-F9806F6E9687}\DefaultIcon]
@="C:\\Program Files (x86)\\PFU\\ScanSnap\\SSFolder\\x64\\SSFolder.DLL,0"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{591C1901-C0DA-4776-8450-F9806F6E9687}\InprocServer32]
@="C:\\Program Files (x86)\\PFU\\ScanSnap\\SSFolder\\x64\\SSFolder.DLL"
"ThreadingModel"="Apartment"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{591C1901-C0DA-4776-8450-F9806F6E9687}\ProgID]
@="SSFolder.ShellFolderImpl.1"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{591C1901-C0DA-4776-8450-F9806F6E9687}\Programmable]

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{591C1901-C0DA-4776-8450-F9806F6E9687}\ShellFolder]
"Attributes"=dword:f8000000
"wantsFORPARSING"=""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{591C1901-C0DA-4776-8450-F9806F6E9687}\TypeLib]
@="{8D4FB007-2F3F-4C51-BD10-D39D5445C59B}"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{591C1901-C0DA-4776-8450-F9806F6E9687}\VersionIndependentProgID]
@="SSFolder.ShellFolderImpl"

3Dオブジェクトを消す

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{31C0DD25-9439-4F12-BF41-7FF4EDA38722}]
"Category"=dword:00000004
"FolderTypeID"="{b3690e58-e961-423b-b687-386ebfd83239}"
"Icon"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,\
  00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,69,00,\
  6d,00,61,00,67,00,65,00,72,00,65,00,73,00,2e,00,64,00,6c,00,6c,00,2c,00,2d,\
  00,31,00,39,00,38,00,00,00
"LocalizedName"=hex(2):40,00,25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,\
  6f,00,6f,00,74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,\
  00,5c,00,77,00,69,00,6e,00,64,00,6f,00,77,00,73,00,2e,00,73,00,74,00,6f,00,\
  72,00,61,00,67,00,65,00,2e,00,64,00,6c,00,6c,00,2c,00,2d,00,32,00,31,00,38,\
  00,32,00,35,00,00,00
"Name"="3D Objects"
"ParentFolder"="{5E6C858F-0E22-4760-9AFE-EA3317B67173}"
"PreCreate"=dword:00000001
"RelativePath"="3D Objects"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{31C0DD25-9439-4F12-BF41-7FF4EDA38722}\PropertyBag]
"ThisPCPolicy"="Hide"

jpeg と png だとどれくらいサイズが変わるのか

jpegpng だとどれくらいサイズが変わるのか

単純に変換だけしたとき。

takuya@DESKTOP-2ALDRO3:/mnt/c/Users/takuya/Desktop$ convert sample.jpg  -quality 100 out.png
takuya@DESKTOP-2ALDRO3:/mnt/c/Users/takuya/Desktop$ convert sample.jpg  -quality 100 out.jpg
takuya@DESKTOP-2ALDRO3:/mnt/c/Users/takuya/Desktop$ ll out*
-rwxrwxrwx 1 takuya takuya 1.2M Aug 21 00:47 out.jpg
-rwxrwxrwx 1 takuya takuya 2.1M Aug 21 00:47 out.png

png は圧倒的に不利なので、「パレット化」する。

convert sample.jpg -strip -define png:compression-level=9 -define png:compression-filter=0 -define png:compression-strategy=0  -type Palette out.png

パレット化するとだいぶ無駄が減る。

ll out.*
-rwxrwxrwx 1 takuya takuya 550K Aug 21 00:49 out.jpg
-rwxrwxrwx 1 takuya takuya 886K Aug 21 01:05 out.png

#!/usr/bin/env ruby

def gen_cmd (level,filter,strategy)
  "convert
  sample.jpg
  -strip -define png:compression-level=#{level}
  -define png:compression-filter=#{filter}
  -define png:compression-strategy=#{strategy}
  -type Palette out.#{level}.#{filter}.#{strategy}.png".gsub(/\n/,'')
  end



(0..9).each{|level|
  (1..5).each{|filter|
    (0..4).each{|strategy|
     cmd = gen_cmd level, filter, strategy
     p cmd
     `#{cmd}`
    }
  }

}

全通り試してみよう

圧縮フィルタを変えていく

同じパレット化でも、これくらいに差が出てくるわけです。

ll out.9.5.0.png out.0.1.0.png
-rwxrwxrwx 1 takuya takuya 2.9M Aug 21 01:33 out.0.1.0.png
-rwxrwxrwx 1 takuya takuya 826K Aug 21 01:38 out.9.5.0.png
2,964,981  out.0.1.0.png
2,964,981  out.0.1.1.png
2,964,981  out.0.1.2.png
2,964,981  out.0.1.3.png
2,964,981  out.0.1.4.png
2,964,981  out.0.2.0.png
2,964,981  out.0.2.1.png
2,964,981  out.0.2.2.png
2,964,981  out.0.2.3.png
2,964,981  out.0.2.4.png
2,964,981  out.0.3.0.png
2,964,981  out.0.3.1.png
2,964,981  out.0.3.2.png
2,964,981  out.0.3.3.png
2,964,981  out.0.3.4.png
2,964,981  out.0.4.0.png
2,964,981  out.0.4.1.png
2,964,981  out.0.4.2.png
2,964,981  out.0.4.3.png
2,964,981  out.0.4.4.png
2,964,981  out.0.5.0.png
2,964,981  out.0.5.1.png
2,964,981  out.0.5.2.png
2,964,981  out.0.5.3.png
2,964,981  out.0.5.4.png
1,328,449  out.1.1.2.png
1,328,449  out.1.2.2.png
1,328,449  out.1.3.2.png
1,328,449  out.1.4.2.png
1,328,449  out.1.5.2.png
1,328,449  out.2.1.2.png
1,328,449  out.2.2.2.png
1,328,449  out.2.3.2.png
1,328,449  out.2.4.2.png
1,328,449  out.2.5.2.png
1,328,449  out.3.1.2.png
1,328,449  out.3.2.2.png
1,328,449  out.3.3.2.png
1,328,449  out.3.4.2.png
1,328,449  out.3.5.2.png
1,328,449  out.4.1.2.png
1,328,449  out.4.2.2.png
1,328,449  out.4.3.2.png
1,328,449  out.4.4.2.png
1,328,449  out.4.5.2.png
1,328,449  out.5.1.2.png
1,328,449  out.5.2.2.png
1,328,449  out.5.3.2.png
1,328,449  out.5.4.2.png
1,328,449  out.5.5.2.png
1,328,449  out.6.1.2.png
1,328,449  out.6.2.2.png
1,328,449  out.6.3.2.png
1,328,449  out.6.4.2.png
1,328,449  out.6.5.2.png
1,328,449  out.7.1.2.png
1,328,449  out.7.2.2.png
1,328,449  out.7.3.2.png
1,328,449  out.7.4.2.png
1,328,449  out.7.5.2.png
1,328,449  out.8.1.2.png
1,328,449  out.8.2.2.png
1,328,449  out.8.3.2.png
1,328,449  out.8.4.2.png
1,328,449  out.8.5.2.png
1,328,449  out.9.1.2.png
1,328,449  out.9.2.2.png
1,328,449  out.9.3.2.png
1,328,449  out.9.4.2.png
1,328,449  out.9.5.2.png
1,128,468  out.1.1.4.png
1,128,468  out.1.2.4.png
1,128,468  out.1.3.4.png
1,128,468  out.1.4.4.png
1,128,468  out.1.5.4.png
1,088,706  out.2.1.4.png
1,088,706  out.2.2.4.png
1,088,706  out.2.3.4.png
1,088,706  out.2.4.4.png
1,088,706  out.2.5.4.png
1,049,337  out.3.1.4.png
1,049,337  out.3.2.4.png
1,049,337  out.3.3.4.png
1,049,337  out.3.4.4.png
1,049,337  out.3.5.4.png
1,016,731  out.4.1.4.png
1,016,731  out.4.2.4.png
1,016,731  out.4.3.4.png
1,016,731  out.4.4.4.png
1,016,731  out.4.5.4.png
1,012,007  out.1.1.3.png
1,012,007  out.1.2.3.png
1,012,007  out.1.3.3.png
1,012,007  out.1.4.3.png
1,012,007  out.1.5.3.png
1,012,007  out.2.1.3.png
1,012,007  out.2.2.3.png
1,012,007  out.2.3.3.png
1,012,007  out.2.4.3.png
1,012,007  out.2.5.3.png
1,012,007  out.3.1.3.png
1,012,007  out.3.2.3.png
1,012,007  out.3.3.3.png
1,012,007  out.3.4.3.png
1,012,007  out.3.5.3.png
1,012,007  out.4.1.3.png
1,012,007  out.4.2.3.png
1,012,007  out.4.3.3.png
1,012,007  out.4.4.3.png
1,012,007  out.4.5.3.png
1,012,007  out.5.1.3.png
1,012,007  out.5.2.3.png
1,012,007  out.5.3.3.png
1,012,007  out.5.4.3.png
1,012,007  out.5.5.3.png
1,012,007  out.6.1.3.png
1,012,007  out.6.2.3.png
1,012,007  out.6.3.3.png
1,012,007  out.6.4.3.png
1,012,007  out.6.5.3.png
1,012,007  out.7.1.3.png
1,012,007  out.7.2.3.png
1,012,007  out.7.3.3.png
1,012,007  out.7.4.3.png
1,012,007  out.7.5.3.png
1,012,007  out.8.1.3.png
1,012,007  out.8.2.3.png
1,012,007  out.8.3.3.png
1,012,007  out.8.4.3.png
1,012,007  out.8.5.3.png
1,012,007  out.9.1.3.png
1,012,007  out.9.2.3.png
1,012,007  out.9.3.3.png
1,012,007  out.9.4.3.png
1,012,007  out.9.5.3.png
988,969    out.5.1.4.png
988,969    out.5.2.4.png
988,969    out.5.3.4.png
988,969    out.5.4.4.png
988,969    out.5.5.4.png
969,534    out.6.1.4.png
969,534    out.6.2.4.png
969,534    out.6.3.4.png
969,534    out.6.4.4.png
969,534    out.6.5.4.png
964,417    out.7.1.4.png
964,417    out.7.2.4.png
964,417    out.7.3.4.png
964,417    out.7.4.4.png
964,417    out.7.5.4.png
958,431    out.8.1.4.png
958,431    out.8.2.4.png
958,431    out.8.3.4.png
958,431    out.8.4.4.png
958,431    out.8.5.4.png
956,071    out.9.1.4.png
956,071    out.9.2.4.png
956,071    out.9.3.4.png
956,071    out.9.4.4.png
956,071    out.9.5.4.png
953,058    out.1.1.0.png
953,058    out.1.1.1.png
953,058    out.1.2.0.png
953,058    out.1.2.1.png
953,058    out.1.3.0.png
953,058    out.1.3.1.png
953,058    out.1.4.0.png
953,058    out.1.4.1.png
953,058    out.1.5.0.png
953,058    out.1.5.1.png
947,009    out.4.1.1.png
947,009    out.4.2.1.png
947,009    out.4.3.1.png
947,009    out.4.4.1.png
947,009    out.4.5.1.png
930,469    out.2.1.0.png
930,469    out.2.1.1.png
930,469    out.2.2.0.png
930,469    out.2.2.1.png
930,469    out.2.3.0.png
930,469    out.2.3.1.png
930,469    out.2.4.0.png
930,469    out.2.4.1.png
930,469    out.2.5.0.png
930,469    out.2.5.1.png
928,669    out.5.1.1.png
928,669    out.5.2.1.png
928,669    out.5.3.1.png
928,669    out.5.4.1.png
928,669    out.5.5.1.png
909,453    out.6.1.1.png
909,453    out.6.2.1.png
909,453    out.6.3.1.png
909,453    out.6.4.1.png
909,453    out.6.5.1.png
905,455    out.7.1.1.png
905,455    out.7.2.1.png
905,455    out.7.3.1.png
905,455    out.7.4.1.png
905,455    out.7.5.1.png
904,646    out.3.1.0.png
904,646    out.3.1.1.png
904,646    out.3.2.0.png
904,646    out.3.2.1.png
904,646    out.3.3.0.png
904,646    out.3.3.1.png
904,646    out.3.4.0.png
904,646    out.3.4.1.png
904,646    out.3.5.0.png
904,646    out.3.5.1.png
897,668    out.8.1.1.png
897,668    out.8.2.1.png
897,668    out.8.3.1.png
897,668    out.8.4.1.png
897,668    out.8.5.1.png
894,594    out.9.1.1.png
894,594    out.9.2.1.png
894,594    out.9.3.1.png
894,594    out.9.4.1.png
894,594    out.9.5.1.png
887,389    out.4.1.0.png
887,389    out.4.2.0.png
887,389    out.4.3.0.png
887,389    out.4.4.0.png
887,389    out.4.5.0.png
873,315    out.5.1.0.png
873,315    out.5.2.0.png
873,315    out.5.3.0.png
873,315    out.5.4.0.png
873,315    out.5.5.0.png
858,641    out.6.1.0.png
858,641    out.6.2.0.png
858,641    out.6.3.0.png
858,641    out.6.4.0.png
858,641    out.6.5.0.png
854,629    out.7.1.0.png
854,629    out.7.2.0.png
854,629    out.7.3.0.png
854,629    out.7.4.0.png
854,629    out.7.5.0.png
848,080    out.8.1.0.png
848,080    out.8.2.0.png
848,080    out.8.3.0.png
848,080    out.8.4.0.png
848,080    out.8.5.0.png
845,454    out.9.1.0.png
845,454    out.9.2.0.png
845,454    out.9.3.0.png
845,454    out.9.4.0.png
845,454    out.9.5.0.png

github にpush してghcr.io に docker push する。

github にpush したらghcr.io にdocker push する。

概要

github に push したタイミングで、github actionsを起動して、docker ビルドをして、docker イメージを github コンテナ・レジストリにpush したい

手順

  1. github のレポジトリを用意する
  2. github で actionsから workflow 用の変数を用意する
  3. workflow の定義を用意する
  4. git push する
  5. 動作チェックする。
  6. docker push のチェック
  7. 公開・非公開の切替え
  8. 注意点

github のレポジトリを用意する

github のレポジトリを用意する。

Dockerfile が含まれていたら良い。

workflow 用の変数を用意する

workflow から github のコンテナレジストリにpushするために、ログイン(アクセス権)が必要。パスワードを書くわけにも行かないので、GitHubアクセストークンを用意して、レポジトリの変数に設定する。

プロジェクト(レポジトリ)→settings→secrets

f:id:takuya_1st:20220404025407p:plain

変数名と中身を設定

f:id:takuya_1st:20210927133955p:plain

設定例

名前: GH_ACCESS_TOKEN
中身:Githubから発行される個人用アクセストークン

f:id:takuya_1st:20220404030459p:plain

アクセストークンの発行は別記事を参照のこと。

workflow を設定する。

ファイルにワークフローを記述する

## git clone 
git clone https://github.com/takuya/$REPO
cd $REPO
mkdir -p .github/workflows/
touch .github/workflows/actions.yml

##
open $REPO/.github/workflows/actions.yml

レポジトリに .github/workflowsディレクトリを作ってyamlをその中に設置する。日本人は workflowsworkflowと書いてしまい複数形を忘れがちなので注意。

docker push 用のキーを書き込み

f:id:takuya_1st:20210927134032p:plain

Dockerfileの場所を指定。

Dockerfile が格納されているフォルダを指定する。フォルダを作らずDockerfileを直接設置したときは ./とカレントディレクトリを指定しておけばいい。

f:id:takuya_1st:20210927134049p:plain

actions.yml の設定例

name: Build and Publish Docker

on:
  push:
    branches:
      - master

jobs:
  build_and_push:
    runs-on: ubuntu-latest
    env:
      IMAGE_NAME: sample-docker-image
    steps:
      - name: checkout
        uses: actions/checkout@v2

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1

      - name: Login to GitHub Container Registry
        uses: docker/login-action@v1
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ secrets.GH_ACCESS_TOKEN }}
      - name: Build and push
        uses: docker/build-push-action@v2
        with:
          context: ./docker-build
          push: true
          tags: |
            ghcr.io/${{ github.repository_owner }}/${{ env.IMAGE_NAME }}:latest
            ghcr.io/${{ github.repository_owner }}/${{ env.IMAGE_NAME }}:1.0.0

workflow のかんたんな解説。

ビルドとpushをする箇所

docker builddocker pushを行うのはここ。

- name: Build and push
    uses: docker/build-push-action@v2

これは。https://github.com/docker/build-push-action で公開されているスクリプトで、それを取り込んで実行している。

push 先とタグを tags: で指定している。

${{ github.repository_owner }}githubワークフローのcontextと呼ばれるプリセット変数である。

docker push の準備をする箇所

docker push にはログインが必要なので、ログインを行う。

- name: Login to GitHub Container Registry
uses: docker/login-action@v1
with:
  registry: ghcr.io
  username: ${{ github.repository_owner }}
  password: ${{ secrets.GH_ACCESS_TOKEN }}

これは、 https://github.com/docker/login-actionで公開されているスクリプトで。uses: docker/login-action@v1 を使って利用を指定して、どこにログインするかとパスワードとユーザー名をyaml で与えている。

${{ secrets.GH_ACCESS_TOKEN }}が最初にレポジトリに設定したsecrets変数である。接頭辞をつけてsecrets.MY_NAME でアクセスする。

git push で動作させる

master レポジトリにpush すると actionが動き出す。

git push origin master

master で動くのは、masterへのpush で起動指定してあるから。

ワークフローのyml の冒頭部分(以下抜粋)で指定してある。

on:
  push:
    branches:
      - master

動作チェックする

レポジトリ→Actionsを選ぶと実行結果が見られる。

f:id:takuya_1st:20210927134130p:plain

docker push のチェック

docker build が無事に終わり、docker pushも無事に終わると、githubにパッケージがpushされている。

github で docker push された結果は、「パッケージ」と呼ばれる。

結果は, https://github.com/YOUR_NAME?tab=packages で見ることができる。

公開・非公開の切り替え

docker push されたイメージは、「プライベート」になっているので、「パブリック」にしてあげる。

公開非公開の切り替えは「パッケージ」の「設定」を使って設定する。

f:id:takuya_1st:20220404031519p:plain

https://github.com/USERNAME のページで確認できる。

注意点(上限)

workflowとghcr を使うときはパブリックにしておかないと容量と実行時間の上限がシビアなので、パブリックが無難だと思う。可能な限りパブリックにするといいと思う。

2021-09-26 現在で調べた限りですが。

github コンテナ・レジストリでは、デフォルトで500MBの「プライベート領域」がある。そして、push したら、デフォルトでプライベートになる。 しかし、「パブリック」なら無制限である。

そのため、push後はパブリックに切り替えて容量を節約している。

docker push で初期非公開になっています。デフォルト設定で公開する方法は見つからなかった。

docker buildがコケたとき

workflow のログを見ながらエラーを修正するとよいが、github の workflow で実行した場合、build用の仮想マシンを毎回新規作成するので、時間がかかる。

そのため、手元のローカルマシンで docker build をしてbuildが確認できてからgit push で起動したほうがいい。

docker push がコケたとき

docker push がコケたら、面倒だけど一回手作業で docker push しておく。

push 自体はとても簡単なので、一度手作業でpush を試してからgit push してももいいと思う。

push を手動でやる方法

TODO::別エントリ

docker で ghcr.io にログインする。

docker logoin ghcr.io

docker login ghcr の注意 :アクセストークンを使ってログインすること。

任意のイメージを github に push できる名前をつける。

たとえば、apline を ghcr.io にpush するなら

docker pull alpine
name=ghcr.io/takuya/my-first-docker-image
source_id=$(docker images alpine:latest --format="{{.ID}}")
docker tag $source_id $name
git push $name

alpine:latest に名前をつけて、その名前でpushする

名前は、次のようになる。

ghcr.io/YOUR_GITHUB_NAME/IMAGE_NAME

docker push できればあとは、github のサイトに従って使えばオッケー

ワークフローがコケる場合は、まずちゃんとghcr.io に docker push できることを確認しておく。

サンプルレポジトリ

docker build して push するサンプルのレポジトリ

動作サンプルようのレポジトリを残しておく。

https://github.com/takuya/github-actions-build-and-push-docker-sample

2022-04-04

画面デザインの変更に合わせて画像を若干更新

参考資料

共有メニューは使わなくないですか?消しました。

windows 10 の共有メニュー。

誰が使うんですか。これ。

f:id:takuya_1st:20210912102527p:plain

共有メニューの問題点

Shareメニューは日本語訳で「共有」になるのですが。共有メニューは、Win10からの共有と、WinNTからの「ネットワーク共有」とWin内部ローカルユーザー間の「ユーザー間共有」と、もはやわけがわかりません。共有メニュが何を指すのか、使い方を調べるのも一苦労です。そのため、誰も使いたがりませんし使ってないと思います。iPhoneユーザがWindowsを使い始めたときに癖で押して使うだろうが使いにくくて苦労していると思います。

シェアメニューを押して出てくる画面も、情報多すぎて全然わかりません。iphoneの人は、他アプリが出てくると思いきや「他アプリ」は「Open With(別で開く)」ですから。ユーザーが迷うだけです。ゴミ機能です。

消しましょう。

Computer\HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\ModernSharing

f:id:takuya_1st:20210912102929p:plain

アスタリスク( * ) がちょっとわかりにくいですが、*はすべてのファイル(フォルダ)という意味でレジストリツリーに存在します。

参考資料

https://shellfix.nirsoft.net/context_menu_list.html

f:id:takuya_1st:20210912103018p:plain

Shift押したときだけ右クリックメニューに表示するようにしたい

Shift押したときだけ右クリックメニューに表示するようにしたい

右クリックメニューに余計なものが多すぎる。

Windowsには、「Shiftを押したときだけ右クリックメニューが表示される」のフィルタ機能がある。

右クリックメニューに出現するアプリたち。使わないのに右クリックメニューを占拠して私達を迷わせ無駄時間を使わせる極悪非道な右クリックメニューたち。やつらを一斉解雇したい。

だけど、全部消しちゃうと流石に不便なので契約維持・解雇・2軍に分けたい。

Shift化→スタメン落ち

邪魔なメニューだけど、消すのも困るっていうスタメン落ち。2軍(登録抹消)ほどでもないけど、常に表示されるのは困る。

Extended Mode

それは、レジストリでは、Extended Mode 拡張モードにする。

ExtendedModeのエントリを作成しておく。キーが存在するだけでいい。これでShiftのみで表示されるコンテキストメニューが有効になる。

f:id:takuya_1st:20210912100434p:plain

shellmenuviewで閲覧・編集

Windowsレジストリを直接触るのは大変なので、shellmenuviewを使ってカスタマイズする。

ExtendedModeがYesに設定している。

f:id:takuya_1st:20210912095336p:plain

f:id:takuya_1st:20210912095833p:plain

Backgroundは、なにもないところを右クリックしたとき

エクスプローラでなにもないところをクリックするだけでも大量にメニューが出てくるので困りますよね。

ピン留め系のメニューを消す。

ピン留め系のメニューなんて初期設定したあと殆ど使わなくないですか?

f:id:takuya_1st:20210912101358p:plain

ということでこれもスタメン落ちさせてみます。

Computer\HKEY_CLASSES_ROOT\Folder\shell\pintohome

f:id:takuya_1st:20210912101512p:plain

メニューから消える。

Shiftキーを押せばいつでも出てくる。

f:id:takuya_1st:20210912101524p:plain

右クリックメニューが多すぎて押し間違え起きる。

Windowsは右クリックメニューを増やしすぎて、押し間違えで面倒が起きるので、整理しておくのがおすすめです。