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

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

ソース公開する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

ロータリエンコーダ付きステッピングモータをArduinoで制御して角度を取得する

機材 Arduino UNO(中華) ロータリエンコーダ付きステッピングモータ PKP214U06A-R2EL PKP214U06A-R2EL-L|PKPシリーズ/PKシリーズ|ステッピングモーター|オリエンタルモーター株式会社 モータ部説明書(PDF、HM-7433J.pdf) ロータリエンコーダ部説明書(PDF、HM-7439JE.pdf) 特性図(画像)(DC24V駆動時) モータ部 2相 ユニポーラ5本リード線 基本ステップ角度1.8° AC 50/60Hz 0.5kV 絶縁耐圧(1分間) ロータリエンコーダ部 分解能 200 パルス/回転(pulse/revolution) A相、B相、Z相:3チャンネル出力 DC5V駆動 モータドライバ SLA7078MPRT SLA7078MPRT |サンケン電気 2相ステッピングモータードライバー ユニポーラ駆動用 SLA7078MPRT: 半導体 秋月電子通商-電子部品・ネット通販 データシート(PDF、sla7073mprt_ds_jp.pdf) μステップ対応品 実使用電圧 10-44V モータドライバ基板 SEC20120330A エレ・メカ・ホビーショップSEC 資料置き場 新型 2相ステップドライバ資料(PDF、step-2p-v1.pdf) ステッピングモータの制御 ステッピングモータ 配線 ステッピングモータ本体からは、左から黒・緑・橙・青・赤の5本のケーブルが出ている。 これは説明書を見ると 黒・緑がA相(\(\rm A\)・\(\rm \overline{A}\))、 青・赤がB相(\(\rm B\)・\(\rm \overline{B}\))、 橙が電源になっている。 モータドライバ基板の対応する端子にこれらを接続する。 モータ電源として24V DC電源(ATS065-P240)を使用した。 ステッピングモータ ドライバ設定 μステップ機能(角度をより細かく制御できる)を使い、 励磁方式をW1-2相励磁(4分割)にするため、ドライバのM3端子をHIGHにする。 今回使ったドライバ基板ではDIPスイッチの4番をONにする。 第3回 ドライブICの制御方式「励磁方式」 | 特集 | NPM 日本パルスモーター株式会社 ドライバ基板上の半固定抵抗(Refに接続)を使って、 カレントダウン(過熱防止のための電流カット機能)時の電流と 通常時の電流をできるだけ絞る(反時計回りで絞れる)。 実際に回すときは、求められるトルクと発熱のトレードオフで調節すると思われる。 ...

2020年10月6日 · aoirint

Ubuntu, pyenv環境でtkinterを使う

sudo apt install tk-dev python-tk python3-tk pyenv install 3.8.6 pyenv global 3.8.6 python3 -m tkinter

2020年10月4日 · aoirint

Python Requests

ses = requests.Session() Headers ses.headers.update({ }) Copy cookies from Selenium ses.cookies.clear() for cookie in driver.get_cookies(): rc = requests.cookies.create_cookie(domain=cookie['domain'], name=cookie['name'], value=cookie['value']) ses.cookies.set_cookie(rc) Download a file file_url: str dest_path: str with tempfile.NamedTemporaryFile() as fp: with ses.get(file_url, stream=True) as r: r.raise_for_status() for chunk in r.iter_content(chunk_size=8192): fp.write(chunk) fp.flush() shutil.copy(fp.name, dest_path)

2020年9月28日 · aoirint

docker-composeによるPython + Selenium環境

2022-08-06 追記 Seleniumのバージョンが上がって一部非推奨化したりしたので、そちらに対応した版を作成しました。 リポジトリ: https://github.com/aoirint/compose-selenium-python-template 2020-09-28 docker-compose.yml version: '3.8' services: app: build: ./app/ entrypoint: [ "wait-for-it", "selenium:4444", "--", "python3", "/code/main.py" ] volumes: - ./work:/work environment: SELENIUM_URL: http://selenium:4444/wd/hub depends_on: - selenium selenium: image: selenium/standalone-chrome volumes: - /dev/shm:/dev/shm app/Dockerfile FROM python:3 WORKDIR /work RUN apt update && apt install -y \ wait-for-it ADD requirements.txt /tmp/ RUN pip3 install -r /tmp/requirements.txt ADD code/ /code app/requirements.txt requests >= 2.24.0 selenium app/code/main.py from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.common.desired_capabilities import DesiredCapabilities selenium_url = os.environ['SELENIUM_URL'] website_url: str = None driver = webdriver.Remote( command_executor=selenium_url, desired_capabilities=DesiredCapabilities.CHROME, ) driver.get(website_url)

2020年9月28日 · aoirint

GitHub Actions, ビルド結果を別ブランチにpushする

GitHub Actions実行中に生成したbuildディレクトリの内容を別ブランチにpushする。 github:s0/git-publish-subdir-action name: Build on: push: branches: - master jobs: deploy: name: Build runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Setup Python uses: actions/setup-python@v2 with: # Version range or exact version of a Python version to use, using SemVer's version range syntax. python-version: 3.x - name: Install dependencies run: pip3 install -r requirements.txt - name: Build run: python3 app/main.py # run: | # python3 app/cmd1.py # python3 app/cmd2.py # https://github.com/s0/git-publish-subdir-action - name: Push to build branch uses: s0/git-publish-subdir-action@master env: REPO: self BRANCH: build FOLDER: build GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

2020年9月27日 · aoirint

Atom + LaTeX in Docker

概要 LaTeXをホストにインストールせず、Docker内で動かしつつ、 Atomからこれを利用できるようにする。 Requirements Ubuntu 18.04 Docker Atom Atom Packages latex Atom Packages latexを入れれば最低限ビルドコマンドは叩けるようになる。 latex シンタックスハイライト language-latex アウトライン表示 document-outline PDFプレビュー pdf-view(メモリリーク? Atomを一度閉じれば解消する) または pdf-view-plus(メモリリーク対策版らしい。latexとの連携はないので注意) Dockerイメージ paperist/alpine-texlive-jaを使う。 sudo docker pull paperist/alpine-texlive-ja Docker sudoなしでDockerを実行できるようにする。AtomからDockerコンテナを作るのに必要。 注意として、この方法で一般ユーザがDockerを使えるようにすると特権昇格できてしまうため、 共有サーバにおいてはDocker 20.10以降のDocker rootlessを設定する。 https://docs.docker.com/engine/security/rootless/ ユーザをdockerグループに追加したあと再ログインする。新しくdockerグループが作られた直後はnewgrp dockerしなければならないことがあり、シェルごとにこれを実行する必要があるようなのでAtomに反映されず、この場合OSの再起動が必要。 sudo groupadd docker sudo adduser $USER docker latexmkスクリプトを作る /usr/texbin/latexmk(手動でlatexのTeX Pathを設定するか、デフォルトでPATHの通っている場所ならどこでもいい)に以下のシェルスクリプトを作成し、chmod +x /usr/texbin/latexmkしておく。 ${HOME}/.atom/packages/latex/resourcesのマウントはlatexのExtended Build Modeが有効のときに${HOME}/.atom/packages/latex/resources/latexmkrcが読み出されるため設定している(このパスはホストのAtomから渡されるのでマウント先パスもホストと同じ)。この機能を無効にしていれば不要。 #!/bin/sh docker run --rm \ -v "${PWD}:/workdir" \ -v "${HOME}/.atom/packages/latex/resources:${HOME}/.atom/packages/latex/resources" \ paperist/alpine-texlive-ja \ latexmk "$@" サンプルTeXファイル \documentclass[10pt,a4paper]{jsarticle} \title{My Title} \author{Author} \date{2020-09-17} \begin{document} \maketitle \section{サンプル} \end{document} 注意点 カレントディレクトリ以下をマウントするため、外部においた.styなどは読み込めないので注意(デフォルトでロードされるディレクトリがあれば追加のマウントをすればOKと思われる)。 ...

2020年9月17日 · aoirint