ファイル変更時にコマンド実行(watchmedo, watchexec)

watchmedo (watchdog) https://github.com/gorakhargosh/watchdog https://pypi.org/project/watchdog/ watchmedo shell-command -R --command 'make build' ./src # プロセスが動いていても停止して再実行する watchmedo auto-restart -R -d ./src -- make serve watchmedo インストール pip3 install watchdog[watchmedo]==2.1.3 ※ 2.1.4 on Ubuntuはバグがありそう Exception in thread Thread-1: Traceback (most recent call last): File "$HOME/.pyenv/versions/3.9.6/lib/python3.9/threading.py", line 973, in _bootstrap_inner self.run() File "$HOME/.pyenv/versions/3.9.6/lib/python3.9/site-packages/watchdog/observers/api.py", line 199, in run self.dispatch_events(self.event_queue, self.timeout) File "$HOME/.pyenv/versions/3.9.6/lib/python3.9/site-packages/watchdog/observers/api.py", line 372, in dispatch_events handler.dispatch(event) File "$HOME/.pyenv/versions/3.9.6/lib/python3.9/site-packages/watchdog/events.py", line 282, in dispatch self.event_dispatch_map[event.event_type](event) AttributeError: 'RootHandler' object has no attribute 'event_dispatch_map' watchexec https://github.com/watchexec/watchexec https://crates.io/crates/watchexec-cli https://superuser.com/questions/181517/how-to-execute-a-command-whenever-a-file-changes watchexec -w ./src -- make build # プロセスが動いていても停止して再実行する watchexec -r -w ./src -- make serve # 初回実行しない watchexec -p -w ./src -- make event-trigger watchexec インストール Rustのインストール https://www.rust-lang.org/ja/learn/get-started curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh watchexecのインストール cargo install watchexec-cli

2021年8月22日 · aoirint

Terraria TShockサーバをdocker-composeで立てる

https://github.com/Pryaxis/TShock https://hub.docker.com/r/ryshe/terraria/ 上記URLから最新(もしくは対応する)バージョンを確認して、イメージタグのバージョンを変更する。 既存のワールドを使用する場合は、./data/worlds/に.wldファイルを配置し、WORLD_FILENAMEを変更する。 docker-compose.yml version: '3.9' services: terraria: image: ryshe/terraria:tshock-1.4.2.3-4.5.5 tty: true stdin_open: true restart: always ports: - '7777:7777' volumes: - '${WORLD_DIR:-./data/worlds}:/root/.local/share/Terraria/Worlds' - '${LOG_DIR:-./data/logs}:/tshock/logs' - '${BACKUP_DIR:-./data/backups}:/tshock/backups' - '${PLUGIN_DIR:-./data/plugins}:/plugins' environment: TZ: 'Asia/Tokyo' WORLD_FILENAME: 'MyWorldName.wld' ワールドの新規作成 autocreateオプションにはワールドサイズを数値で指定する(1: Small, 2: Medium, 3: Large)。 ここではSmallを指定している。 環境変数WORLD_FILENAMEが設定されていると実行に失敗するので、-e WORLD_FILENAME=で外しておく。 docker-compose run --rm -e WORLD_FILENAME= terraria -world /root/.local/share/Terraria/Worlds/MyWorldName.wld -autocreate 1 作成完了後、サーバが起動し、サーバコンソールが開く。 バックグラウンド起動にするため、ここでは一旦サーバを停止しておく。 サーバの起動 docker-compose up -d docker-compose logs -f tail -f data/logs/*.log サーバコンソールを開く Dockerコンテナ名を調べる。ここでは、tshock_terraria_1とする。 docker-compose ps 以下コマンドでサーバコンソールが開く。 Ctrl+cするとサーバが停止してしまうので、脱出するときはCtrl+p Ctrl+qを押す。 docker attach tshock_terraria_1 設定・権限の変更 TShockにはバニラと異なる細かいデフォルト設定や権限機能があるので注意。 設定では、デフォルトで初期スポーン地点保護が有効化、墓生成が無効化されている。 権限では、デフォルトでNPCの部屋割り当て、ボス召喚などが無効化されている。 また、TShockのバージョンによってコマンドや設定方法に差異がある。 ...

2021年8月22日 · aoirint

GitHub Actions, DockerイメージをビルドしてDocker Hubにpushする(アクセストークン)

Docker Hubにアクセストークンを追加する。 https://hub.docker.com/settings/security リポジトリのSettingsから、Secretsを開き、New repository secretから DOCKER_USERNAME、DOCKER_PASSWORDを追加する。 DOCKER_USERNAMEはDocker Hub上のユーザ名、 DOCKER_PASSWORDはアクセストークンを設定する。 以下のファイルをリポジトリに追加する(ファイル名docker.ymlは変更可)。 mainブランチにgit pushされたとき、Dockerイメージのビルドが走り、イメージがDocker Hubにdocker pushされる。 .github/workflows/docker.yml name: Push to Docker registry on: push: branches: - main jobs: push: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Login to Docker Hub uses: actions-hub/docker/login@master env: DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} DOCKER_REGISTRY_URL: docker.io - name: Build :latest if: success() run: docker build -t username/imagename:latest . - name: Deploy :latest if: success() uses: actions-hub/docker@master with: args: push username/imagename:latest

2021年7月10日 · aoirint

GoogleサービスのURLでユーザアカウントを指定する(?authuser=email)

Googleサービスでは、URL中の/u/0/や/u/1/の数値部分を書き換えることで、ログイン順に基づいてユーザの切り替えができる。しかし、ログイン順の異なる端末間でURLをブックマークしたい場合などに不便である。 メールアドレスを指定してユーザを切り替えるには、 URLのGETパラメータに[email protected]のようにGoogleアカウントのメールアドレスを記述する。 Google Classroom https://classroom.google.com/c/[email protected] Gmail https://mail.google.com/[email protected]

2021年7月1日 · aoirint

Makefile Tips

Makefileのあるディレクトリの絶対パスを取得する $(pwd)や相対パスでは、makeコマンドの実行ディレクトリが基準になってしまう。Makefileの実体があるディレクトリを基準としたいときは、以下のようにROOT_DIRを定義する。 ROOT_DIR = $(dir $(realpath $(firstword $(MAKEFILE_LIST)))) エラー時に処理を続行する コマンドの前に-(ハイフン)をつける。 .PHONY: cmd cmd: ls -fail_command a b c ls インデントはスペースではなくタブを使う vimrcでset expandtabしている場合にひっかかる。 以下で一時的に解除するか、vimrcでset expandtabするのをやめる、もしくはvimrcでファイル名による分岐で設定する。 :set noexpandtab .vimrc set expandtab let _filename = expand('%:r') if _filename == 'Makefile' set noexpandtab endif vimでMakefileだけTabスペースではなくTabとして入力する - Qiita ファイルの存在に関係なくターゲットを実行する Makeは本来Cのコンパイルなどに使うとき、ターゲット名に一致するファイルが存在している場合に処理をスキップするようになっている。 一方で、buildというターゲット名を使って、呼び出しのたびにコマンドを実行したいが、buildディレクトリが存在するような場合に困る。 スキップさせないようにするには、.PHONY: ターゲット名を記述する。 .PHONY: cmd cmd: ls 複数のコマンドを1つのシェルで実行する cmd: echo Hello;\ VAR=World;\ echo $$VAR .ONESHELL: cmd cmd: echo "Hello" VAR=World echo $$VAR 途中のコマンドの終了ステータスを返す https://stackoverflow.com/a/44324918 .ONESHELL: cmd .PHONY: cmd cmd: sh -c 'exit 123' EXIT_CODE=$$? echo "Exit code: $$EXIT_CODE" exit $$EXIT_CODE

2021年7月1日 · aoirint

透過プロキシ(macOS, go-transproxy)

環境変数 シェル起動時にネットワーク設定からプロキシ設定を環境変数に読み出すようにしている場合、GUIで設定すればOK。 export HTTP_PROXY=http://proxy.example.com:8080/ export HTTPS_PROXY=http://proxy.example.com:8080/ export NO_PROXY=localhost,127.0.0.0/8,::1 NO_PROXYには必ずlocalhost/ローカルループバックアドレスを設定しておくこと(無限ループする)。 ビルド https://github.com/wadahiro/go-transproxy git clone https://github.com/wadahiro/go-transproxy.git cd go-transproxy/ make ls go-transproxy/bin/transproxy # check network device name ifconfig ~/transproxy/pf.conf MacBookの無線LANカード:en0 Mac miniなどの場合はNIC名が異なる場合があるので注意。 Packets = "proto tcp from en0 to {!192.168.0.0/16}" rdr pass log on lo0 $Packets port 80 -> 127.0.0.1 port 3129 rdr pass log on lo0 $Packets port 443 -> 127.0.0.1 port 3130 pass out on en0 route-to lo0 inet $Packets port {80, 443} keep state 有効化 sudo pfctl -ef ~/transproxy/pf.conf transproxy -disable-iptables 無効化 # stop transproxy process (Ctrl+C) # reset pf configs sudo pfctl -df /etc/pf.conf Macでプロキシとの戦いに疲れたので、透過型プロキシを導入してみた - Qiita

2021年6月21日 · aoirint

透過プロキシ(Ubuntu, go-transproxy)

/etc/sudoers Defaults env_keep+="HTTP_PROXY" Defaults env_keep+="HTTPS_PROXY" Defaults env_keep+="NO_PROXY" 環境変数 export HTTP_PROXY=http://proxy.example.com:8080/ export HTTPS_PROXY=http://proxy.example.com:8080/ export NO_PROXY=localhost,127.0.0.0/8,::1 NO_PROXYには必ずlocalhost/ローカルループバックアドレスを設定しておくこと(無限ループする)。 デスクトップの場合はGUI設定でOK。 /usr/local/bin/transproxy https://github.com/wadahiro/go-transproxy /usr/local/bin/transproxy-start #!/bin/bash set -eu # iptables -t nat -I OUTPUT -p tcp --dport 53 -j REDIRECT --to-ports 3131 # iptables -t nat -I OUTPUT -p udp --dport 53 -j REDIRECT --to-ports 3131 iptables -t nat -I OUTPUT -p tcp --dport 80 -j REDIRECT --to-ports 3129 iptables -t nat -I OUTPUT -p tcp --dport 443 -j REDIRECT --to-ports 3130 transproxy -disable-iptables # -dns-over-https-enabled /usr/local/bin/transproxy-stop #!/bin/bash set -eu # iptables -t nat -D OUTPUT -p tcp --dport 53 -j REDIRECT --to-ports 3131 # iptables -t nat -D OUTPUT -p udp --dport 53 -j REDIRECT --to-ports 3131 iptables -t nat -D OUTPUT -p tcp --dport 443 -j REDIRECT --to-ports 3130 iptables -t nat -D OUTPUT -p tcp --dport 80 -j REDIRECT --to-ports 3129 iptablesのルールを書き換えるため、実行時にはroot権限が必要。 ...

2021年6月21日 · aoirint

bind9

server$ sudo apt install bind9 使用中のDNSサーバの確認 クライアントに設定されているDNSサーバはnmcliコマンドで確認できる。 $ nmcli device show | grep DNS IP4.DNS[1]: 8.8.8.8 IP4.DNS[2]: 8.8.4.4 IP4.DNS[3]: 1.1.1.1 Command-line to list DNS servers used by my system - Ask Ubuntu 用語 BIND DNSサーバー構築 | CentOSサーバー構築入門 コンテンツサーバ(権威サーバ) あるゾーン(DNSにおける名前の管理単位)に関する名前解決要求(非再帰問い合わせ)を受け取り、自身が管理するゾーンならば名前解決結果を、委任情報を持つゾーンならば委任先の権威サーバ情報を応答する。 ルートゾーン(FQDN: .)を管理するルートサーバは、TLD(例えば jp.)の権威サーバへの委任情報を持つ。 ゾーン情報において、NSレコードにより指定される。 JPRS用語辞典|ルートゾーン JPRS用語辞典|権威サーバー(権威DNSサーバー) JPRS用語辞典|ネームサーバー(DNSサーバー) キャッシュサーバ(フルサービスリゾルバ) クライアントから名前解決要求(再帰問い合わせ)を受け取り、 コンテンツサーバへ反復的に名前解決要求(反復問い合わせ)を送ることで任意のドメイン名の名前解決を行う。 JPRS用語辞典|フルサービスリゾルバー(キャッシュDNSサーバー) 例えばhoge.example.jp.というドメインの名前解決要求を受け取ったとき、 ルートサーバ.への非再帰問い合わせによりjp.権威サーバへの委任情報を取得する。 jp.権威サーバへの非再帰問い合わせによりexample.jp.権威サーバへの委任情報を取得する。 example.jp.権威サーバへの非再帰問い合わせによりhoge.example.jp.のIPアドレスを取得する、のような流れで反復的に問い合わせを行うことでhoge.example.jp.の名前解決を行う。 ISPの提供するDNSサーバや会社などの組織内DNSサーバ、GoogleやCloudflareなどが提供するパブリックDNSがある。 ASCII.jp:DNSによる名前解決の仕組みを理解しよう (1/2) 回送 プロキシのように、受け取った名前解決要求を他のDNSサーバに送り、 応答を返す。 /etc/bind/named.conf.options 自身が管理していない情報(ゾーン、委任情報)に関する問い合わせについて、 他のDNSサーバ(フルサービスリゾルバ)に問い合わせを回送するように設定する。 「再帰問い合わせ」と「非再帰問い合わせ」の違いを教えてください:DNS Tips - @IT BIND DNSサーバー構築 | CentOSサーバー構築入門 フォワード(回送) : お父さんのためのDNS講座 デフォルト設定ファイル options { directory "/var/cache/bind"; // If there is a firewall between you and nameservers you want // to talk to, you may need to fix the firewall to allow multiple // ports to talk. See http://www.kb.cert.org/vuls/id/800113 // If your ISP provided one or more IP addresses for stable // nameservers, you probably want to use them as forwarders. // Uncomment the following block, and insert the addresses replacing // the all-0's placeholder. // forwarders { // 0.0.0.0; // }; //======================================================================== // If BIND logs error messages about the root key being expired, // you will need to update your keys. See https://www.isc.org/bind-keys //======================================================================== dnssec-validation auto; auth-nxdomain no; # conform to RFC1035 listen-on-v6 { any; }; }; 変更点 forwarders { 8.8.8.8; 8.8.4.4; 1.1.1.1; }; 初歩から解説!BINDでシンプルDNSサーバー構築【構築編】| 開発者ブログ | 株式会社アイソルート 確認 server$ systemctl restart bind9.service client$ dig @192.168.x.x aoirint.com ... ;; ANSWER SECTION: aoirint.com. 3600 IN A 185.199.108.153 aoirint.com. 3600 IN A 185.199.111.153 aoirint.com. 3600 IN A 185.199.109.153 aoirint.com. 3600 IN A 185.199.110.153 ... digコマンドの使い方 - Qiita /etc/bind/named.conf.local DNSサーバの管理するゾーンの名前と対応する設定ファイル(ゾーンファイル)を設定する。 ...

2021年6月9日 · aoirint

npm startでError: ENOENT: no such file or directory ... .steampathで起動しないときの対処(React)

gitでブランチを切り替えて依存関係に差分が生じたとき、 node_modulesを修正していないときに起きる。 Error: ENOENT: no such file or directory, stat '/home/USER/.steampath' package-lock.jsonがあれば、 package-lock.jsonに基づいて依存関係をインストールするnpm ciを実行する。 実行時にnode_modulesディレクトリの中身は削除され、再構築される。 npm ci https://docs.npmjs.com/cli/v7/commands/npm-ci https://stackoverflow.com/questions/64962960/error-enoent-no-such-file-or-directory-stat-home-dylan-steampath package-lock.jsonがないときは、手動でnode_modulesを削除するのがよいかもしれない。 rm -rf node_modules/ npm install ほかに、プログラムに構文エラーがあるときに起きることがある。この場合、tscでエラー箇所を調べて直す。

2021年6月5日 · aoirint

npm startで構文エラーが消えないときの対処(React)

npm startで構文エラーが消えなくなることがある。 npm startでサーバを起動してコードの変更を監視したままの状態で、gitでブランチを切り替えたときキャッシュが正しく更新されないことが原因と思われる。 キャッシュを破棄するには、 npm start -- --reset-cache 依存関係が変わっているとエラーの原因になるので、モジュールもインストールし直すのがよい。 npm ci https://qiita.com/kt3k/items/758c4f3595ffd7e74f9f

2021年6月5日 · aoirint