くろみーの日報テンプレ

日常のほのぼのした記録

Python でバージョンを確認したいときは `-v` ではなく `-V` を使う

python でバージョンを確認したいときは -v ではなく -V を使おう

今朝、python のバージョンを確認したいだけなのに大量に謎のログが出力されてしまう問題で悩んでいた

例えばこんな感じ

% python -v
import _frozen_importlib # frozen
import _imp # builtin
import '_thread' # <class '_frozen_importlib.BuiltinImporter'>
import '_warnings' # <class '_frozen_importlib.BuiltinImporter'>
import '_weakref' # <class '_frozen_importlib.BuiltinImporter'>
import '_io' # <class '_frozen_importlib.BuiltinImporter'>
import 'marshal' # <class '_frozen_importlib.BuiltinImporter'>
import 'posix' # <class '_frozen_importlib.BuiltinImporter'>
import '_frozen_importlib_external' # <class '_frozen_importlib.FrozenImporter'>
# installing zipimport hook
...

みた感じ別にエラーになっているわけではなさそうだったが、例えば以下のようなシェルスクリプトを書いていると、この部分で Python のプロンプトが開かれてしまうため処理が途中で止まってしまう

python -v | grep ${PYTHON_VERSION} > /dev/null || pyenv install ${PYTHON_VERSION} && pyenv global ${PYTHON_VERSION}

なんでだろうと困っていたら、ひょっとしたらこれは verbose の v なのではないかということに思い当たった

念の為ヘルプを確認してみたところあたり

%python --help
...
-v     : verbose (trace import statements); also PYTHONVERBOSE=x
         can be supplied multiple times to increase verbosity
-V     : print the Python version number and exit (also --version)
         when given twice, print more information about the build
...

python -v の代わりに python -V を使ってあげたら解決

ちなみに ruby だと -V オプションはなくて -v オプションでバージョンを見る仕様なのでややこしい

ケースバイケースということか

csv を bigquery にアップロードするだけの CLI ツールを作った

Embulk の設定があまりにも難し過ぎたので csv を bigquery にアップロードするだけの CLI ツールを作った

 

汎用性は全くないが、自分用としてはこれで良いのだ

 

せっかくなので PyPl にアップしてみた

 

pypi.org

 

自分用といいつつ、誰か使ってくれる人がいたらいいなー

Github で使っていない Repository を削除する

最近Github のレポジトリが増えてきたので、このタイミングで整理してみる

Private レポジトリの制限も随分前に解除されたし、別にレポジトリの整理なんてする必要がないと言われればそうなのだが、部屋が広いからといって要らないものをたくさん置いて良いわけではないのと同様に、レポジトリも使わないレポジトリは積極的に削除した方が良いというのが私の考え

まず最初に使ったのは Github CLI

インストールするとターミナルで gh コマンドが使えるようになるのでこれで色々できる

まずは現在持っているレポジトリの総数を数えてみる

gh repo list -L 1000 | wc -l

デフォルトで30個までしかレポジトリをとってこないので、-L option をつけて十分に大きな数(1000など)を指定しないいけない

このうち、今年に入って全く更新のないレポジトリをリストアップしたかったのだがここで問題が発生した

gh repo list にはレポジトリを更新日時でソートするオプションがないのだ

またソートできたとしても、今回のように数十個単位でレポジトリを削除する場合、そのレポジトリごとに gh コマンドを実行して削除するのはめんどくさい(私が単にシェルスクリプトが苦手なだけ)

どうしようかと思っていたところ、こんな記事を見つけたので今回は R でやってみることにした

www.jumpingrivers.com

基本的にはこの記事に書かれている通り、Github の PAT (Personal Access Token) を用意して R の gh パッケージをインストールすれば良いだけなのだが、レポジトリをとってくるところは少し工夫が必要だった

元記事だと public かつ fork されたレポジトリのみを対象としているのでエンドポイントが GET /users/:owner/repos になっているのだが、private なレポジトリも対象としたい場合はそうはいかない

そこで私の方で書き換えたものがこちら

my_repos = gh("GET /user/repos", 
              visibility = "all",
              affiliation = "owner",
              before = "2022-12-01T",
              sort = "updated",
              page = 1, 
              per_page = 100)

公式のドキュメントによれば GET /user/repos にアクセスすることによって PAT の認証ユーザーのレポジトリを private なものも含めて全て持ってこれる

また before や sort のオプションも提供されているので、ここに必要な値を入れてやれば、更新日時でソートしたりフィルタリングをかけたりすることができる

ここで対象のレポジトリを抽出できたら削除する部分は一緒

purrr::map(to_delete, 
           ~gh("DELETE /repos/:owner/:repo", owner = my_username, repo = .x))

まさか Github のレポジトリを削除するときに purrr パッケージが活躍するとは思わなかった