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

GitHubのPAT(Personal Access Token)認証手順(Ubuntu)

GitHubがパスワードによるGitアクセスを無効化する(正確にはパーソナルアクセストークン認証を必須化する、だが現状SSH認証は残る)旨のアナウンスをした(Token authentication requirements for Git operations - The GitHub Blog)。 これまで、コマンドラインGit操作のためのGitHubの認証にはパスワード認証(HTTPS Basic認証)を使っていた。 一応、リポジトリを操作するたびにパスワードを入力するのは面倒なので、 cacheは有効化していた。(git config --global credential.helper cache)。 パスワード認証は、持ち出せないPCやVPS、モバイル端末や新しいPCから一時的にリポジトリにアクセスする必要があるときに便利だった。 もちろん、キーロガーやgitコマンドなどシステムがハックされている可能性を考えると望ましくないことはわかっていたが..。 以前はSSH認証を使っていた時期もあったが、ブラウザ上での鍵の登録削除操作が必要でこういった一時的な認証には向かない(この記事ではこの問題は解決しない。都度PATを用意するか、平文保存するか、あるいは手元で認証情報を持つ必要のない自動デプロイを採用することになるかもしれない)。 また、同じGitホスティングサービスに複数アカウントを作っているとき、デバイス数×アカウント数と大量に鍵を管理する必要が出てくる(この記事ではこの問題も解決しない)。 自分の認識として、GitHubのGit操作をする認証にはパスワード認証(HTTPS Basic認証)、SSH認証、パーソナルアクセストークンがある(GitHub ActionsのトークンやOAuthなどは除く)。 SSH認証を使っていなかった理由は先に述べた問題(一時的なアクセス・大量の鍵管理)のほかに、プロキシがある。 自分の環境では、ネットワーク/場所が変わるたびにプロキシ設定を切り替える必要があり、 HTTPS認証の場合、毎回git config --global http.proxyあるいはgit config --global --unset http.proxyを打つことになっている(あるいはシェルスクリプト。globalなのはリポジトリ別に設定を残さないためとcloneができないから)。 ここでSSHを使うとHTTPプロキシ経由で通信するためのProxyCommandを設定することになるが、これがやっかいである。 まず、OSごとにプロキシコマンドが異なる。connect -H(Windows)、ncat --proxy-type http --proxy(macOS)、nc -X connect -x(Linux)とそれぞれのOS用の設定を用意することになる。 また、プロキシのON/OFF自体については、ふつうにsshでつなぐときは、ワイルドカード設定を使って接続先名でプロキシを切り替えるようにしているのだが、 Gitの場合は接続先名を変えるためにgit remote set-urlする必要があり、これにはリポジトリのパスを記憶して頻繁に入力する必要が出てきてしまう。今のところそのような認識であるので、パーソナルアクセストークンを使った認証に切り替えていく。 パーソナルアクセストークン(PAT)は、パスワードの代わりに利用可能な認証情報で、権限を絞ったトークンを生成できる。GitHub Package Registryを利用するときに使っていて(docker login docker.pkg.github.com。パスワード認証不可。現在GitHubのDockerレジストリはpull認証不要のGitHub Container Registry ghcr.io に置き換えられる予定でパブリックベータ中)、好印象を持っていた(PyPIやDocker Hubでもトークン認証が便利)。また、GitHubはSSH認証よりもHTTPS認証を推奨している。PATの設定箇所は若干わかりにくいが、Settings > Developer settings > Personal access tokensから設定できる。 主要機の切り替えにあたって、トークンを毎回入力するわけにはいかないので、入力されたパスワード(トークン)を認証情報マネージャを使って永続化する設定をする。Windows(Git for Windows)、macOSでは自動で設定されるように思うが、Ubuntuでは手動設定することになる。 libgnome-keyringのgit-credential-gnome-keyringというのがあるが、libgnome-keyringが非推奨になっている(linux - Error when using Git credential helper with gnome-keyring as Sudo - Stack Overflow、[libgnome-keyring] Deprecate libgnome-keyring. Use libsecret instead)ようなのでlibsecretを使う(裏側では同じgnome-keyringが動いているようだが)。 どちらもほぼ手順は同じだが、開発用パッケージからソースコードを取得したあと、手動でmakeするという謎手順がある(#パッケージマネージャとは)。これで一応保存時の暗号化(復元可能)は施された状態で永続化できる。 ...

2020年12月18日 · aoirint

Debianパッケージから内容物を抽出する

Debian – buster の bash パッケージに関する詳細 http://ftp.jp.debian.org/debian/pool/main/b/bash/bash_5.0-4_amd64.deb wget http://ftp.jp.debian.org/debian/pool/main/b/bash/bash_5.0-4_amd64.deb mkdir bash tar xvf bash_5.0-4_amd64.deb -C bash/ cd bash mkdir data tar xvf data.tar.xz -C data/ cd data # here is root directory

2020年12月8日 · aoirint

Dockerイメージから内容物を抽出する

docker save | Docker Documentation docker pull alpine:3 docker save -o out.tar alpine:3 mkdir out tar xvf out.tar -C out/ cd out/6709f754bd0ccbbea9a7481e92772a494cca1543b3421978edff62bc5de16662 tar xvf layer.tar -C layer/ cd layer # here is root directory

2020年12月8日 · aoirint

Pythonを追加するDockerfile

pyenvは部品を使うだけで最終的には削除します(Pythonは/usr/localに導入) FROM ubuntu:bionic ARG DEBIAN_FRONTEND=noninteractive ARG PYTHON_VERSION=3.9.0 ARG PYTHON_ROOT=/usr/local ARG PYENV_ROOT=/tmp/.pyenv ARG PYBUILD_ROOT=/tmp/python-build RUN apt update && apt install -y \ build-essential \ libssl-dev \ zlib1g-dev \ libbz2-dev \ libreadline-dev \ libsqlite3-dev \ wget \ curl \ llvm \ libncurses5-dev \ libncursesw5-dev \ xz-utils \ tk-dev \ libffi-dev \ liblzma-dev \ python-openssl \ git \ && git clone https://github.com/pyenv/pyenv.git $PYENV_ROOT \ && PREFIX=$PYBUILD_ROOT $PYENV_ROOT/plugins/python-build/install.sh \ && $PYBUILD_ROOT/bin/python-build -v $PYTHON_VERSION $PYTHON_ROOT \ && rm -rf $PYBUILD_ROOT $PYENV_ROOT

2020年12月8日 · aoirint

Mastodonをdocker-composeで立てる(Ubuntu 18.04)

tootsuite/mastodon: Your self-hosted, globally interconnected microblogging community Mastodon documentation 内容はコミットID44d5c6bc8ffd92cd201380dabe35748e50b6af68、Mastodon Dockerイメージバージョンv3.2.1(Digest:sha256:41cd5fb48d8b15ec806f08ab06fec98df33ec9b83a1f879e0fb30da9994018dc)におけるもの。docker-composeの設定ファイルバージョンは3。 $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.5 LTS Release: 18.04 Codename: bionic $ uname -r 5.4.0-56-generic $ docker -v Docker version 19.03.14, build 5eb3275d40 $ docker-compose -v docker-compose version 1.27.1, build 509cfb99 $ docker images tootsuite/mastodon --digests REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE tootsuite/mastodon v3.2.1 sha256:41cd5fb48d8b15ec806f08ab06fec98df33ec9b83a1f879e0fb30da9994018dc 37ca50fc92bd 6 weeks ago 1.86GB 今回はDocker Hub上のイメージを使用し、ローカルビルドをしない想定でいく(ごちゃごちゃするので)。 Mastodonを改造したい場合など、必要に応じてgithub:tootsuite/mastodonをFork/Cloneし、自分で/CIでビルドして信頼できるDockerレジストリに登録すればいいと思う。 ...

2020年12月6日 · aoirint

ソース公開するArduinoプログラムに秘密情報を埋め込む

aoirint/RoomSystemSensorESP32: ESP32とFirebaseを使った部屋センシング・オンライン化 クライアントの開発中に Arduinoプログラム(.ino)にWiFiパスワード・APIキーなどの秘密情報を埋め込む必要が出てきた。 ここでは、Arduino IDEの主要機能を持つCLIソフトウェアarduino-cliを使う。 arduino/arduino-cli: Arduino command line interface arduino-cliの使い方については、別記事参照。 arduino-cliの使い方 - えやみぐさ 秘密情報の埋め込み 秘密情報の埋め込みには、以下のようなシェルスクリプトcompile.shを作成するのが楽でよい。 DEFINES=の部分の-Dから=までの文字列が定数名、=の右辺が定数値として 定義された状態でソースコードがコンパイルされる。 ここでは同ディレクトリの.envファイルを読み込んで使用する。 .envファイルのフォーマットはよくあるものと同じで、 改行で区切られ、#から始まる行を無視するKEY=VALUE形式のテキストファイル。 ボードへの書き込みには以下のupload.shのようなスクリプトを使うとよい。 screenコマンドをラップするスクリプトserialmon.shもおいておく。 compile.sh #!/bin/bash set -eu if [ -f .env ]; then echo "Found .env file." export $(cat .env | sed 's/#.*//g' | xargs) fi # ESP32-DevKitC FQBN="esp32:esp32:esp32" # Arduino UNO # FQBN="arduino:avr:uno" DEFINES="-DSECRET_WIFI_SSID=$WIFI_SSID" DEFINES="${DEFINES} -DSECRET_WIFI_PW=$WIFI_PW" DEFINES="${DEFINES} -DSECRET_FIREBASE_HOST=$FIREBASE_HOST" DEFINES="${DEFINES} -DSECRET_FIREBASE_AUTH=$FIREBASE_AUTH" SKETCH="$(basename $PWD).ino" arduino-cli compile \ -b "$FQBN" \ --build-properties \ "build.defines=${DEFINES}" \ "$SKETCH" "$@" プログラム側では以下のようにする。#xはコメントではないので注意(文字列リテラルとして展開するマクロ)。 ...

2020年11月9日 · aoirint

arduino-cliの使い方

$ arduino-cli version arduino-cli Version: 0.13.0 Commit: 693a045 インストール Installation - Arduino CLI arduino/arduino-cli Arduino CLIの公式ドキュメントに従ってインストールする。後述するscreenコマンドも合わせてインストールする。 arduino-cliはDockerイメージも配布されているのでお好みで。 curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | BINDIR=~/.local/bin sh echo "export PATH=\"\$PATH:\$HOME/.local/bin\"" >> ~/.bashrc source ~/.bashrc sudo apt install screen プラットフォーム一覧を更新しておく。 arduino-cli core update-index シリアルポートを使うため、dialoutグループにユーザを追加する(/dev/ttyACM#や/dev/ttyUSB#のグループはdialout)。 sudo adduser $USER dialout スケッチの作成 特に特殊なファイルを必要としたりはしないので、 Arduino IDEで作成しても、好きなテキストエディタで作成してもよい。 一応テンプレート付きのスケッチを作成するには、arduino-cli sketch new SKETCH_NAMEを実行する。 手動で作成する場合にはArduino IDEと同様、 スケッチ名(ディレクトリ名)と同じ名前で、SKETCH_NAME.inoのように メインのソースコードを作成する。 以下、arduino-cliのコマンドはスケッチのディレクトリで実行する。 FQBNの確認 arduino-cliでボードを扱うときには、ボード名にあたるFQBNというコロンで区切られた文字列を使う。 arduino-cli board listallコマンドで arduino-cliが対応しているボードのFQBN一覧が出力される。 arduino-cli board listall esp32のようにキーワードを追加して、 絞り込むこともできる。 また、arduino-cli board listコマンドでPCに接続しているボードのFQBNを調べられる場合がある(Arduino系ボードの場合?)。 ...

2020年11月9日 · aoirint