テクめも

プログラミング関連のちょっとしたTipsなどを書いています。

2020-01-01から1年間の記事一覧

不要なPythonライブラリを一括で削除するワンライナー

誤ってグローバル環境など別の環境にライブラリをインストールしたとき、依存関係でインストールされるものもあるので一つづつ削除するのは面倒です。 そこで、次のコマンドで一括で削除できます。 pip list --format json | jq '.[] | select((contains({na…

pipのキャッシュをクリアする

pip 20.1以降であれば pip cacheが使用でき、以下のコマンドでキャッシュをクリアできます。 pip cache purge それ以前のバージョンであれば、手動で削除できます。 # MacOSの場合 rm -r ~/Library/Caches/pip # Linuxの場合 rm -r ~/.cache/pip 参考 stacko…

S3からファイルに保存せずに画像を読み込む

S3に保存した画像ファイルをプログラム中で使用したいシナリオを多いかと思います。 一度ファイルに保存して、保存したファイルを読み込む方法もありますが、保存せずに利用する方法を紹介したいと思います。 from io import BytesIO import boto3 import nu…

よく使うMacのターミナルショートカットキー一覧

移動 Command Content Ctrl + a 行頭に移動する Ctrl + e 行末に移動する Option + ← 前の単語に移動する Option + → 後の単語に移動する 削除 Command Content Ctrl + w 前の単語を削除する Ctrl + u 行頭までを削除する Ctrl + k 行末までを削除する Ctrl …

HTTP通信のテストにhttpbinを使う

APIリクエストを行うプログラムの開発のときに、HTTP通信のテストをしたいときがあるかと思います。 httpbinを使うと、GETやPOSTなどのHTTPメソッドのテストができたり、特定のステータスコードのレスポンスを受け取ることができます。 例えば、GETリクエス…

jqで配列の番号を追加する

以下のような配列に対して、配列の番号が知りたいときがあるかと思います。 [ "a", "b", "c" ] jqを使うことで、配列の各要素に配列番号(index)を追加することができます。 echo '["a", "b", "c"]' | \ jq 'to_entries | map({name: .value, index: .key})…

pytestで複数の条件を組み合わせたテストする

pytestでは、parametrizeを使うと、条件を変えてテストすることができます。 以下の例では、x=0、x=1とx=2の3パターンがテストされます。 @pytest.mark.parametrize("x", [0, 1, 2]) def test_foo(x): pass ここに、flag=True/Falseも条件に加えたいとします…

CloudWatchのログ確認を便利にする

CloudWatchのログの確認はAWSコンソールや公式のCLIよりもawslogsのほうが便利です。 pecoと連携することで、さらに便利になります。 以下のようなfunctionを.bashrcとかに書いておきます。(※zshで動作確認しています。) awslog() { local res=$(awslogs g…

AWSのIPアドレスを取得する

AWS

AWSのIPアドレス帯はJSON形式で公開されています。 https://ip-ranges.amazonaws.com/ip-ranges.json jqを使うと、IPアドレスを抽出できます。 curl -s https://ip-ranges.amazonaws.com/ip-ranges.json \ | jq -r '.prefixes[] | .ip_prefix' 13.248.118.0/…

プロジェクト内のTODOコメントをgrepで探す

開発をしていると以下のようにTODOコメントを書くことが多いかと思います。 # TODO: あとでなおす エディタによっては一覧表示する機能がありますが、エディタに依存せずに利用できるgrepを使って一覧表示する方法を紹介します。 grep "# TODO: " -nr projec…

Pythonツールの設定ファイルまとめ

ツール名 pyproject.toml setup.cfg tox.ini 独自 flake8 NG #428 OK OK .flake8 black OK NG NG yapf NG #708 OK NG .style.yapf mypy NG #5205 OK NG mypy.ini isort OK OK OK .isort.cfg bandit NG #550 NG #212 NG .bandit pytest NG #1556 OK OK pytest…

lambda-uploaderで環境変数を上書きしない

lambda-uploaderを用いると、PythonのコードをAWS Lambdaに簡単にアップロードできます。 lambda-uploader myfunc 設定はlambda.jsonに書かれている内容が反映されます。 環境変数はGitで管理したくないので、lambda.jsonに書かないケースも多いかと思います…

Hugoでシンタックスハイライトのスタイルを変更する

Hugoの設定ファイルconfig.tomlに以下を追加するとシンタックスハイライトが有効になります。 pygmentscodefences = true スタイルを変更するには、以下を追加するとできます。 pygmentsstyle = "solarized-light" 使用できるスタイルは以下を参照すると良い…

Git hookを初期化する

Git

いろいろGit hookを試しているとどれインストールされていているか分からなくなったりして、いったんリセットしたいときは、.git/hooksを削除して、git initで再度イニシャライズをします。 $ rm -rf .git/hooks $ git init Reinitialized existing Git repo…

pyenv + toxで複数バージョンのテストを行う

pyenvを使用している環境で、toxで複数バージョンのテストをするときはまったのでそのメモです。 tox.iniに以下のように設定しておき、toxでテストを実行しました。 [tox] envlist = py36, py37 [testenv] deps = pytest commands = pytest $ tox GLOB sdist…

Clickのテストで例外をキャッチしない

PythonのCLIフレームワークであるClickでは、テストツールも用意されており、容易にテストを書くことができます。 invokeを使えば、コマンドと引数を渡すことができますが、デフォルトでは例外をキャッチします。 通常は、exit_codeの値を比較すればよいので…

Github Actionsでジョブが成功したら次のジョブを実行する

テストが成功したらデプロイするみたいに、あるジョブの実行には前のジョブが成功が必要となるワークフローを書くには、needsを使うとできます。 name: build on: [push] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@master # テス…

Pythonで優先度付きキューを使う

Pythonでの優先度付きキューはheapqを使うとできます。 import heapq 最小ヒープ はじめに、リストをキューに優先度付きキューに変換します。 que = [3, 1, 5, 2] heapq.heapify(que) 先頭に最小値がきます。(先頭以外はソートされているわけではありません…

pyproject.toml利用時にアプリのバージョンを取得する

Pythonパッケージを作成する際、__init__.pyにバージョンを書いておき、setup.pyでは__init__.pyからimportすることが一般的かと思います。しかし、pyproject.toml を利用するとPythonファイルではないので setup.py のようにバージョンをimportすることはで…

Pythonでエスケープされた文字列を戻す

argparser の引数として文字列を入力すると自動的にエスケープされますが、改行などプログラム中で使いたい場合があるかと思います。そこで、エスケープされた文字列を元に戻す方法を紹介します。 はじめに、自動的にエスケープされることを確認します。 # m…

Clickでコマンド別にファイル分割する

PythonのCLIフレームワークの1つにclickがあります。 デコレータを使って簡単にCLIが作成できますが、1ファイルにすべてのコマンドのコードを書いていくと長くなります。 そこで、CommandCollectionを使って複数のコマンドをマージすることで、コマンド別に…

hackingとisortの競合を解決する

isortのデフォルトの設定では、例えば以下のようにソートされます。 import json import time from pathlib import Path from urllib.parse import urljoin, urlparse しかし、hackingを導入していると以下のようにエラーが発生します。 ./main.py:3:1: H306…

ArgumentParserをテストする

argparse を使うと簡単にCLIが作成できます。 そのままテストすることが少し難しかったので、調べた結果、parseするとことを別の関数に切り出して、その部分をテストするのが良さそうです。 # main.py def main(): args = parse_args(sys.argv[1:]) def pars…

DockerのMySQLを使う

パスワードを設定する場合 docker run --name mysql -e MYSQL_ROOT_PASSWORD=pass -d -p 3306:3306 mysql:5.7 パスワードを設定しない場合 docker run --name mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d -p 3306:3306 mysql:5.7

Railsでmysql2のビルドエラー

MacでRailsのインストールする際にMySQL周りでエラーが発生したので、ログと解決策をメモしておきます。 エラーログ Gem::Ext::BuildError: ERROR: Failed to build gem native extension. current directory: /Users/user_name/project_name/vendor/bundle/…