ファイル変更時にコマンド実行(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

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

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

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

GitLab CI, DockerイメージをビルドしてContainer Registryにpushする

2023-05-18 追記:この記事には、改訂版(2023年版)があります。 リポジトリ構造 .gitlab-ci.yml app/ Dockerfile .gitlab-ci.yml stages: - build build: stage: build image: docker:20.10 services: - docker:dind rules: - if: $CI_COMMIT_BRANCH == "main" script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - docker build ./app -t $CI_REGISTRY_IMAGE:latest - docker push $CI_REGISTRY_IMAGE:latest

2021年5月29日 · aoirint

Atom Text Editor Setup

GitHubが開発するElectron製高機能テキストエディタAtomをセットアップする。 Installation macOS, Windows https://atom.io/ Ubuntu https://flight-manual.atom.io/getting-started/sections/installing-atom/#platform-linux wget -qO - https://packagecloud.io/AtomEditor/atom/gpgkey | sudo apt-key add - sudo sh -c 'echo "deb [arch=amd64] https://packagecloud.io/AtomEditor/atom/any/ any main" > /etc/apt/sources.list.d/atom.list' sudo apt update sudo apt install atom Key Binding Resolver (Ctrl + .) キーバインドが重複してどれが動いているかわからないときに便利。 Packages パッケージにより機能拡張ができる。 https://atom.io/packages/ GUIによる操作 Install: Edit > Preferences > Install Config: Edit > Preferences > Packages CLIによる一括インストール # Export Package List apm list -b -e -i --no-v > atom_packages.txt # Import Package List and Install apm install --packages-file atom_packages.txt おすすめパッケージリスト ...

2021年5月14日 · aoirint

PsychopyでOpenCV画像をImageStimで表示する

Psychopy - GitHub y軸反転と画素値をfloat(0-1)に変換すればOK。 npimg: np.ndarray # (height, width, num_channels) stimimg = np.flip(npimg.astype(np.float32) / 255, axis=0) ウインドウに表示させるサンプル import numpy as np # numpy>=1.20.1 import cv2 # type: ignore # opencv-python>=4.5.1.48 from psychopy import core # type: ignore # psychopy>=2020.2.10 from psychopy.visual import Window, ImageStim # type: ignore import sys # npimg: np.ndarray = cv2.imread('image.png', 1) npimg: np.ndarray = np.zeros((400, 400, 3), dtype=np.uint8) npimg = cv2.line(npimg, (0, 50), (400, 50), (127, 127, 127), 3) npimg = cv2.line(npimg, (50, 0), (50, 400), (255, 255, 255), 3) # cv2.imwrite('image.png', npimg) stimimg = np.flip(npimg.astype(np.float32) / 255, axis=0) window = Window((400, 400), color='black', units='pix') stim = ImageStim(window, pos=(0, 0), size=(400, 400)) stim.image = stimimg stim.draw() window.flip() core.wait(3) # while True: # stim.draw() # window.flip() # # for keys in event.getKeys(timeStamped=True): # if keys[0] in [ 'escape', 'q' ]: # sys.exit(0) # # core.wait(0.01)

2021年2月14日 · aoirint

Sphinx

Python製のドキュメント生成ツール。 Python 3.8.5 Sphinx 3.4.2 Sphinx · PyPI pip3 install Sphinx reST(reStructuredText) SphinxではデフォルトでreStructuredTextというマークアップ言語を使う。 https://www.sphinx-doc.org/ja/master/usage/restructuredtext/basics.html https://atom.io/packages/language-restructuredtext 既存Pythonプロジェクトにドキュメントを追加する setup.py などが存在するPyPIパッケージプロジェクトを想定する。 プロジェクトのルートに docs ディレクトリを作成し、 インタラクティブツール sphinx-quickstart を実行する。 mkdir docs cd docs/ sphinx-quickstart Separate source and build directories (y/n) と聞かれるので、 y 。 プロジェクト名、著者名、言語などを答える。 source ディレクトリ、 build ディレクトリ、 Makefile が生成される。 make html 以上のコマンドで build/html ディレクトリにHTMLが生成される。 python3 -m http.server -b localhost -d build/html などで確認する。 次はPythonモジュールのdocstringからドキュメントを自動生成する。 Sphinx でPythonのAPIドキュメントを自動作成 - Qiita python書くなら絶対に使いたい2つのドキュメント生成ツール - Qiita #!/bin/bash SCRIPT_DIR=$(cd $(dirname $0); pwd) cd "${SCRIPT_DIR}" sphinx-apidoc -f -o "./source/api" "../mymodule" make html docs/mkdocs.sh を以上のように作成し、実行する(TODO:Makefileへの入れ込み)。 ここでは、以下のように docs ディレクトリと並んで、パッケージとして提供するPythonモジュール mymodule のディレクトリがあることを想定している。 なお、 docs/source/conf.py は設定ファイルであり、 例えば html_theme = 'sphinx_rtd_theme' のような設定を追加し、 pip3 install sphinx-rtd-theme してから make html することで、Read the Docsスタイルのドキュメントを生成できる。 ...

2021年1月5日 · aoirint

Docker Desktop for Mac上のX ClientをホストのXQuartz(X Window Server)で表示する

$ docker -v Docker version 20.10.0, build 7287ab3 $ brew -v Homebrew 2.6.2 Homebrew/homebrew-core (git revision ce927; last commit 2020-12-19) Homebrew/homebrew-cask (git revision eb977; last commit 2020-12-19) $ brew info xquartz xquartz: 2.7.11 (auto_updates) https://www.xquartz.org/ /usr/local/Caskroom/xquartz/2.7.11 (74.6MB) From: https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/xquartz.rb ==> Name XQuartz ==> Description Open-source version of the X.Org X Window System Docker Desktop for Mac 3.0.2 (50996) macOS Catalina Version 10.15.7 XQuartzのインストール(HomebrewとHomebrew Cask) 現在はbrew caskコマンドは非推奨で、brewだけでOK(あるいは--caskオプションをつける)。 XQuartzの場合は--caskをつけなくても内部で勝手にbrew caskとしてインストールしてくれた。 Homebrew CaskというのはGUIアプリケーション向けのHomebrewの拡張らしいが、Homebrewと何が違うのかわからん。 Warning: Calling brew cask install is deprecated! Use brew install [--cask] instead. The Missing Package Manager for macOS (or Linux) — Homebrew homebrew-cask — Homebrew Formulae Homebrew/homebrew-cask: 🍻 A CLI workflow for the administration of macOS applications distributed as binaries command line - What is the difference between brew and brew cask? - Ask Different homebrew-cask/USAGE.md at master · Homebrew/homebrew-cask Homebrewは、開発元からソースコードが配布されていて、そのコンパイル済みのバイナリ(またはソースダウンロード+自動ローカルビルド)を提供するもので、 Homebrew Caskは、*.dmgが配布されていてマウントして*.appを/Applicationsにコピーする操作(実際には/usr/local/Caskroomにインストールする)のを自動化する、というものなのだろうか? --caskを明示するのは両方に登録されていてもCaskを優先するみたいな指定なのか? XQuartzの場合は--caskを付けなくてもCaskとしてインストールされた。 ...

2020年12月20日 · aoirint