くろみーの日報テンプレ

日常のほのぼのした記録

BibTeX と BibLaTeX の違いでハマる

ご縁があってなんだかんだ大学を離れた後も TeX を触る機会が多い

学部・修士・博士と合わせて10年以上大学に所属していた身としては LaTeX の扱いももう慣れたもの・・・

と思っていたのだが、最近まで TeX の文献管理ツールに BibTeX と BibLaTeX の2つがあることに気づかなかった

 

どうやら BibTeX の新バージョン(互換性はない)として BibLaTeX というのがあるらしくて、今日 Zotero を使って文献情報をエクスポートしたら、知らない間に BibLaTeX でエクスポートされていて、コンパイルエラーで大変な目にあった

 

そもそも LaTeX のエラーの内容がいちいちわかりにくいという愚痴は置いておいて、BibTeX と BibLaTeX に互換性がないのはどうにかならないだろうか

 

せっかくなので両者の違いについて我が家の ChatGPT くんに聞いてみた

BibTeX: BibTeXのデータモデルは比較的単純で、文献タイプ(例: book、article、inproceedings)とそのフィールド(例: author、title、year)から構成されます。
BibLaTeX: BibLaTeXはより豊富なデータモデルを提供し、文献情報を詳細に表現できます。例えば、DOI、ISBN、URLなどの情報をより柔軟に扱えます。

DOI とか URL は最近の文献であればほぼ必ずついてくる情報なので、BibLaTeX であればこれがデフォルトで扱えるようになるのはありがたい

 

詳しくは BibLaTeX の公式ページを参照されたし

CTAN: Package BibLaTeX

 

ただし Zotero も工夫次第では BibTeX 形式でのエクスポートができるらしく、以下の記事が参考になりそうだった

 

zenn.dev

 

TeX は自分で一から書くというよりは配られたテンプレートを使うことの方が多いから、まだ BibTeX のままで止まっている雑誌も多い

 

たぶんよほどのことがない限りは、自分はこれからも BibTeX を使い続ける気がするが、TeX の世界も色々とアップデートされていってるんだなぁと思った昨今

Stub と Mock 完全に理解した

Shun57 さんのこのブログ記事を読んで n 年ぶりに Stub と Mock を完全に理解した

zenn.dev

Stub は依存コンポーネントを都合のいい値を返すように置き換えたものであり、Mockは依存コンポーネントが正しく呼び出されているかチェックするためのものである

 

つまり、テストの目的が依存コンポーネントが正しく呼ばれるかだったら Mock を使うし、依存コンポーネントから何らかの結果を受け取ってその結果を正しく処理したことを確かめたいのであれば Stub を使う

 

今は完全に理解しているけど1ヶ月経ったら完全に忘れてる説が濃厚

 

その時のための備忘録としてこの記事を残しておく

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 パッケージが活躍するとは思わなかった