育休中の個人開発活動の振り返り

# はじめに
半年間の育休中にスキマ時間で個人開発した内容を振り返ってみます。
（開発の話しかしないので、育児の話に興味がある方は「[男性ワンオペ育休６ヶ月間の振り返り](https://note.com/shimapompom/n/n747591e17802)」も合わせてお読みいただければと思います）

全体的には、生成AI，音韻・音楽解析、CI/CDなどその時々で興味のある調査や開発をしました。

半年間でQiitaの記事59本（26週連続投稿）、GitHubのプルリクエスト59件、学会ワークショップでの発表1件、RAGコンペ参加1回、OSSパッケージ公開4件をしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259353/1ff484c1-9090-4212-b557-975d889e0da4.png)

育休中なので趣味に使える時間は主に子どもの睡眠中に限られていました。スクリーンタイムなどから見積もった実働時間は半年間で540時間ほどでした。4時間半に1回、記事かプルリクエストを出していた計算であり、時間に対する成果で考えると、個人的な感覚としてはまあまあ妥当か、少し頑張れた程度かなと思います。

開発環境にはCursorを使っており、開発加速にかなり貢献してくれました。

以下では主な開発トピックをもう少し詳細に振り返ってみます。

# 生成AI

## 音声対話

- 出身研究室の手伝いで、[生成AIを用いた高速な音声対話のデモプログラム](https://github.com/jiroshimaya/fastvoicechat)を開発しました。
  - 非同期処理で音声認識や音声合成を多少の精度とのトレードオフはありつつ効率化したことで、ロボットの発話開始までの遅延時間を0.5~1秒程度まで短縮でき、ベースになったシンプルな実装と比べ５倍くらい早くなりました。
  - 長期的なメンテナンス性より短時間でサクッと試せることを重視しました。
  - 実装の過程で、[voicevoxの使い方](https://qiita.com/shimajiroxyz/items/732c1a07b4613f990c03)、[threadingによる音声認識とVADの並列実行](https://qiita.com/shimajiroxyz/items/d2a6248120c36a9ea02f)、pytestにおける[非同期socket](https://qiita.com/shimajiroxyz/private/8e5c8aabe54d07f8dfb5)や[timeoutの挙動](https://qiita.com/shimajiroxyz/items/04b4b9d4acf7b0ef181b)などについて学びました。
- 相槌やターンテイキングのタイミングを予測する[Realtime-VAP](https://x.com/inokoj/status/1830444491599458492)の[試用・検証記事]()を書きました。動かすことはできたものの、1つのマイクによるロボット対話で使うには追加の工夫が必要に感じられました。

## キーワード検索の改善
### 高速化
https://x.com/shimajiroxyz/status/1851139960016904548

- langchainのBM25Retrieverなど、RAGなどに使えるキーワード検索ライブラリのマージ（[検討1](https://qiita.com/shimajiroxyz/items/d42c1ad22c0e96544f45)、[2](https://qiita.com/shimajiroxyz/items/214e27c3b281636faa41)、[3](https://qiita.com/shimajiroxyz/items/31c594e3a14a44fc1070)、[4](https://qiita.com/shimajiroxyz/items/01b6b02e18fb19de1113)）と検索（[検討5](https://qiita.com/shimajiroxyz/items/c09d3424dc4bc2a83a1b)、[6](https://qiita.com/shimajiroxyz/items/77be6d54ba01683c9e50)）の高速化方法を検討しました。
- 最終的に、検証した範囲では、[マージを2倍、検索を50倍ほど高速化できました](https://qiita.com/shimajiroxyz/items/e6f07012dc95de0f5a8c)。
- pythonでよく使われる[rankbm25のエラー対応](https://qiita.com/shimajiroxyz/items/37592d1ca953fef31a7d)や[RustベースのBM25Vectorizer](https://qiita.com/shimajiroxyz/items/ceffcf09bd8aca4925f2)の調査を通じて、単語分割の並列処理やスコア計算式のバリエーションについて学びました。

### 検索精度向上

https://x.com/shimajiroxyz/status/1863369827899093063

- 主にBM25のスコア計算方法や単語分割方法を再考（[検討1](https://qiita.com/shimajiroxyz/items/bc221ea0879d086dd184)、[2](https://qiita.com/shimajiroxyz/items/0e89ea37c8f38cec06e7)、[3](https://qiita.com/shimajiroxyz/items/32cca9063524402fc734)）し、評価しました。
- [クエリの重みベクトル化](https://qiita.com/shimajiroxyz/items/536be21a79f37bc30820)や[文字トリグラム分割](https://x.com/shimajiroxyz/status/1862703861821317199)によって精度が向上する場合があることを、主要な日本語ベンチマークを用いて確認しました。
- 評価のために[JMTEBをキーワード検索に対応させたフォーク版](https://github.com/jiroshimaya/jmteb)を作成しました。
- [JMTEBインストール時のバグ対応](https://qiita.com/shimajiroxyz/items/2d38a5db7122d6ad9524)などを通じて、日本語ベンチマークの評価コードの実装や改修方法を学びました。


## 日本語時間表現の解析

https://x.com/shimajiroxyz/status/1851992198834983251

- リマインダチャットボットを作りたくなったので、[日本語の時間表現解析技術のサーベイ](https://qiita.com/shimajiroxyz/items/ed13305119dd503a4a1b)、既存のルールベースの解析ライブラリ（ja-timex）の[精度を調査](https://qiita.com/shimajiroxyz/items/035f5a7edec5e73add7a)し、[ja-timexがカバーしない表現（「次の」など）への対応方法](https://qiita.com/shimajiroxyz/items/7441aa4a7772c7596f7b)を検討しました。
- 最終的には[LLMによる日本語時間表現の理解能力を検証](https://qiita.com/shimajiroxyz/items/b86ebb2444a822683fbf)し、十分に高いことを確認しました。
- LLMの強力さを学びました。

# 音韻・音声処理
## 音韻埋め込み

https://x.com/shimajiroxyz/status/1869960685515616482

- 音韻を考慮した埋め込みを作成する方法を調査し、[編集距離ベースの疎ベクトルを主成分分析で低次元化する方法](https://qiita.com/shimajiroxyz/items/6082bfadf8c8347db8ff)、[音声とテキストの対応で学習する方法](https://x.com/shimajiroxyz/status/1869749216626762207)、音素系列で[BERT的な学習](https://x.com/shimajiroxyz/status/1869756878248673490)や[Word2Vec的な学習](https://x.com/shimajiroxyz/status/1869758517948878873)をする手法などがあることを学びました。
- 上記で調査したモデルをいくつか試してみました（[XPhoneBERT](https://qiita.com/shimajiroxyz/items/8134867d6c787f0101d0)、[Wav2Vecのトークン表現](https://qiita.com/shimajiroxyz/items/9b579ff7a03602002fca)など）。あまり空耳自動生成には向いていないかもしれないことがわかりました。
 ### 日本語音韻検索データセット

https://x.com/shimajiroxyz/status/1898739463184109844

  - 空耳自動生成の評価をしやすくするため[「〇〇で歌ってみた」替え歌に基づく音韻検索データセットを作成し、CDLAライセンスで公開](https://github.com/jiroshimaya/soramimi-phonetic-search-dataset)しました。
  - 同データセットでベースラインとなる複数の[編集距離ベースの手法の精度を評価](https://qiita.com/shimajiroxyz/items/89260d6441f45bf20f8b)しました。
  - 同データセットで[LLMの音韻検索性能を評価し、あまり高くないことを確認しました](https://qiita.com/shimajiroxyz/items/ffb2c5ad186312bbcd2f)。[LLMの韻踏み能力が高くないことも予備的に確認](https://x.com/shimajiroxyz/status/1899042190736957937)しました。
  - 公開にあたって、[替え歌歌詞の効率的な解析方法](https://qiita.com/shimajiroxyz/items/ffb2c5ad186312bbcd2f)や[データセットの著作権に関する法的な観点](https://qiita.com/shimajiroxyz/items/4226c908371f76544ea6)を検討しました。

## 音声テキストアライメント

https://x.com/shimajiroxyz/status/1856598504120185159


- 楽曲分析に役立てるため日本語テキストの発話タイミングを音声と対応付ける技術（強制アライメント）の調査と検証をしました。
- [torchaudioの強制アライメント関数を用いたサンプルの実行](https://qiita.com/shimajiroxyz/items/ccbef2f851b15252cfa6)や、[日本語モデルの性能検証](https://qiita.com/shimajiroxyz/items/90280465572bcd5e0a63)をしました。
- 強制アライメントでは日本語特化のモデルを使う利点は少ないことがわかりました。
  

## 空耳替え歌分析

https://x.com/shimajiroxyz/status/1896369672972538171

- 音韻類似性に伴うユーモアへの理解を深めるため、[「〇〇で歌ってみた」と呼ばれる空耳替え歌の歌詞を分析し、コンクールでの高評価につながる音韻的な要因を考察]しました。
- 公開中の[空耳自動生成プログラムの辞書を更新](https://x.com/shimajiroxyz/status/1847079429375512866)しました。




# CI/CD、開発環境整備
## uvとGitHub ActionsによるCI／CDテンプレート

https://x.com/shimajiroxyz/status/1848733559433171339

- [uvとGitHub Actionsを用いた効率的なパッケージ管理方法を検討](https://qiita.com/shimajiroxyz/private/24e25d9edbe0eb9807aa)し、[テンプレートとして公開](https://github.com/jiroshimaya/version-update-workflow-sample)しました。
- その過程で、[GitHub Actionsでのuvの実行方法](https://qiita.com/shimajiroxyz/items/c05ab9608d42c0dcdd31)、[PyPIへのpublish](https://qiita.com/shimajiroxyz/items/55404dce8b89cef852d9)、[効率的なバージョン管理方法](https://qiita.com/shimajiroxyz/items/f1d92a6ccb0d2bbe33b5)、[sphinxによるドキュメント自動生成](https://qiita.com/shimajiroxyz/private/34a3a4d8ca64a2c1443c)や[デプロイ](https://qiita.com/shimajiroxyz/private/ee751c62a9e1f75d612a)、[ローカルでのGitHub Actionsのテスト方法](https://qiita.com/shimajiroxyz/items/7153a65c852b140566f6)などを学びました。

## 開発振り返り用の集計プログラム（Qiita、GitHub API）
- 開発の振り返りに役立てるため、QiitaやGitHubのAPIの使い方を学びました。
- [Qiitaの投稿数やリアクション数を集計](https://qiita.com/shimajiroxyz/items/28071db638bc328844ba)し、[どのような指標で分析するのがよいか検討](https://qiita.com/shimajiroxyz/items/bc69473d88c7fad9cfac)しました。また実装を[パッケージ化して公開](https://qiita.com/shimajiroxyz/items/a453218349a229d864cc)しました。
- [GitHub上での活動を集計するプログラム](https://qiita.com/shimajiroxyz/items/6b79ee9d9672b40aa8a9)を作りました。
- 副次的にpydantic-settingsの使い方に詳しくなりました（[記事1](https://qiita.com/shimajiroxyz/private/381a8683bd8edb40b24d)、[2](https://qiita.com/shimajiroxyz/private/f6d972411bd584679e6f)、[3](https://qiita.com/shimajiroxyz/private/9064760f672adbd4c047)）


## 機械学習用パソコンの初期設定
- 機械学習用にNVIDIA GPUを積んだPCを購入したので、設定時の試行錯誤をまとめました。
- [ubuntuをインストール](https://qiita.com/shimajiroxyz/items/44363ebfac3caa45f00b)して、[GPU周りを設定し](https://qiita.com/shimajiroxyz/items/834b28e2f150d724aa35)、[リモートデスクトップの実現手段の比較検討](https://qiita.com/shimajiroxyz/items/8514f4a541ec8c8cb391)などをしました。
- 思いのほか、うまく動かず悩まされたため、GPU周りの設定の勉強になりました。

# 対外的な活動
## 学会ワークショップ発表
https://x.com/shimajiroxyz/status/1899434631579267545

- 音韻検索データセットの開発と検証についてNLP2025の併設ワークショップNLR2025で口頭発表しました（[プログラム](https://jedworkshop.github.io/JLR2025/program/)、[発表資料](https://jedworkshop.github.io/JLR2025/materials/d-1.pdf)）
- [NLP2025に参加して興味深かった発表のメモを公開](https://qiita.com/shimajiroxyz/items/3e96758cac978d1d9ffa)しました。
### RAGコンペ参加
- [Retrieval Augmented Generation（RAG）の国内コンペ（Raggle）に参加し、入賞はしませんでしたが、上位10%程度の成績になりました](https://qiita.com/shimajiroxyz/items/c4bdf668658f1acd5337)
- 検討の過程でlangchainによる構造化出力や画像入力の方法を学びました（[記事1](https://qiita.com/shimajiroxyz/items/d3e3329088356c18df35)、[2](https://qiita.com/shimajiroxyz/items/d808ce739a46c1c45f13)、[3](https://qiita.com/shimajiroxyz/items/9bb5d0b6e3acb63e2b5d)、[4](https://qiita.com/shimajiroxyz/items/8b77e9d6148d7cdf43e0)）

## OSSパッケージ
### xfmido
https://x.com/shimajiroxyz/status/1844247218628461042

- 歌詞情報を含むYamaha拡張仕様（XF仕様）のMIDIファイルパーサー[xfmido](https://pypi.org/project/xfmido/)を開発しました。本家midoにもマージしてもらえるか[相談中](https://github.com/mido/mido/issues/599)です。
### kanasim
https://x.com/shimajiroxyz/status/1847079429375512866
- 日本語かな文字列の音韻類似度を高精度に計算するライブラリ[kanasim](https://pypi.org/project/kanasim/)を開発しました。
### soramimi-phonetic-search-dataset
- 「〇〇で歌ってみた」替え歌に基づく日本語音韻検索データセットを評価等に使いやすいように[PyPIパッケージとしても公開](https://pypi.org/project/soramimi-phonetic-search-dataset/)しました。
### qiitareactioncounter
- [Qiitaの投稿数等の集計、比較分析プログラムをパッケージとして公開](https://github.com/jiroshimaya/qiitareactioncounter)しました。

# おわりに
半年間の振り返りをしてみました。
我ながらバラバラなことをやっているなと思いましたが、pydantic-settingsやuv、GitHub Actionsなど新規のライブラリやフレームワークに手を出せたのは良い経験でした。対外発表も密かに目標にしていたので実現できてよかったです。

反省としては、バラバラなことをやりすぎて全体的に浅い成果になってしまったので、せっかく540時間も稼働するならもう少し１つのことを深く掘り下げられればよかったです。子どもの体調や睡眠によって、開発の中断・再開のタイミングが左右されるので、どうしても小ぶりに成果が出るものばかりに取り組みがちになりました。同じ理由で、全く新しい新規のものに手を出すこともあまりできていませんでした。今後、同じような機会があるかはわかりませんが、もし訪れたら、長期的な時間の使い方にも勇気を出して取り組みたいなと思いました。

この記事では、開発トピックについての定性的な振り返りをしましたが、QiitaやGitHub上での活動指標から定量的に振り返ってみるのも面白そうだと思っているので、時間があれば取り組みたいです。特にCursorを本格的に使いだしてから生産性が上がった印象があり、それを量的に示唆できると面白いかなと思っています。

以上、ここまで記事を読んでいただきありがとうございました。

# 付録
## 半年間で書いた記事、成果物一覧

- 生成AI
  - 音声対話
    - [作業メモ:VoiceVoxのインストールからpythonで音声合成するまで](https://qiita.com/shimajiroxyz/items/732c1a07b4613f990c03)
    - [【python】高速音声対話の実現に向けた音声認識と発話区間検出の並列実行](https://qiita.com/shimajiroxyz/items/d2a6248120c36a9ea02f)
    - [【python】Realtime-VAP（発話交代予測）を試す](https://qiita.com/shimajiroxyz/items/1932cbb7bc0763595e19)
    - [pytest-timeoutでtcpipクライアントのテスト](https://qiita.com/shimajiroxyz/items/04b4b9d4acf7b0ef181b)
    - [pytestでsocketサーバへの接続が完了しない](https://qiita.com/shimajiroxyz/private/8e5c8aabe54d07f8dfb5)
  - キーワード検索
    - 高速化
      - [【rank_bm25】AttributeError: Can't get attribute 'tokenize' on <module '__main__' (built-in)>](https://qiita.com/shimajiroxyz/items/37592d1ca953fef31a7d)
      - [【python】rank_bm25のインスタンスを高速にマージ](https://qiita.com/shimajiroxyz/items/01b6b02e18fb19de1113)
      - [【langchain】BM25Retrieverの高速なマージ](https://qiita.com/shimajiroxyz/items/31c594e3a14a44fc1070)
      - [rank_bm25のインスタンスをオーバーライドなしで高速にマージする方法の速度・精度比較](https://qiita.com/shimajiroxyz/items/d42c1ad22c0e96544f45)
      - [TfidfVectorizerのマージ方法の違いによる精度比較](https://qiita.com/shimajiroxyz/items/214e27c3b281636faa41)
      - [【langchain】BM25Retrieverの高速化（scikit-learn vs rank_bm25）](https://qiita.com/shimajiroxyz/items/c09d3424dc4bc2a83a1b)
      - [【langchain】BM25Retrieverの高速化（rank_bm25使用） v0.0.2](https://qiita.com/shimajiroxyz/items/77be6d54ba01683c9e50)
    - 検索精度向上
      - [【疑問】BM25でもTFIDF同様にコサイン類似度に基づいてランキングしてよいのか](https://qiita.com/shimajiroxyz/items/bc221ea0879d086dd184)
      - [検索タスクにおけるBM25のコサイン類似度とスコアの精度比較](https://qiita.com/shimajiroxyz/items/0e89ea37c8f38cec06e7)
      - [jupyter notebookでhuggingfaceのload_datasetが終わらない](https://qiita.com/shimajiroxyz/items/13abd02c94c68411e9c2)
      - [日本語テキスト埋め込みベンチマークJMTEBのpoetry installでInstalling torch (2.3.1): Failed](https://qiita.com/shimajiroxyz/items/2d38a5db7122d6ad9524)
      - [TFIDFとBM25の類似度計算方法の比較：検索ベンチマークMIRACLを用いた検証](https://qiita.com/shimajiroxyz/items/32cca9063524402fc734)
      - [BM25検索でクエリを重みベクトルにしてみる: MIRACLとJMTEBでの検証](https://qiita.com/shimajiroxyz/items/536be21a79f37bc30820)
      - [【Python】RustベースのTfidfVectorizerとBM25Vectorizerを試す【lenlp】](https://qiita.com/shimajiroxyz/items/ceffcf09bd8aca4925f2)
  - 日本語時間表現の解析
    - [自然言語における時間表現の正規化方法の調査](https://qiita.com/shimajiroxyz/items/ed13305119dd503a4a1b)
    - [【langchain】BM25Retrieverの高速化 v0.0.3](https://qiita.com/shimajiroxyz/items/e6f07012dc95de0f5a8c)
    - [文脈を考慮した時間表現の正規化（ja-timex）](https://qiita.com/shimajiroxyz/items/035f5a7edec5e73add7a)
    - [曜日の時間表現の解析](https://qiita.com/shimajiroxyz/items/7441aa4a7772c7596f7b)
    - [LLMで時間表現の解析](https://qiita.com/shimajiroxyz/items/b86ebb2444a822683fbf)

- 音韻・音声処理
  - 音韻埋め込み
    - [論文メモ: Phonetic Word Embedding (Sharma 2021)](https://qiita.com/shimajiroxyz/items/6082bfadf8c8347db8ff)
    - [Wav2vec2 CTCモデルのトークンの表現が音韻特徴を捉えているか眺めてみる](https://qiita.com/shimajiroxyz/items/9b579ff7a03602002fca)
    - [XPhoneBERTの埋め込みを試す](https://qiita.com/shimajiroxyz/items/8134867d6c787f0101d0)

  - 日本語音韻検索データセット
    - [「〇〇で歌ってみた」替え歌歌詞に基づくデータセット公開時の注意点の検討](https://qiita.com/shimajiroxyz/items/4226c908371f76544ea6)
[LLMによる音韻検索の性能評価](https://qiita.com/shimajiroxyz/items/ffb2c5ad186312bbcd2f)
  - 音声テキストアライメント
    - [torchaudioのforced_align用ハイレベルAPIを試す](https://qiita.com/shimajiroxyz/items/ccbef2f851b15252cfa6)
    - [日本語版wav2vec2でforced-alignment](https://qiita.com/shimajiroxyz/items/90280465572bcd5e0a63)

  - 空耳替え歌分析
    - [補足情報付き人名エンティティのパース（〇〇で歌ってみた）](https://qiita.com/shimajiroxyz/items/681f312084ec18f47d3e)
    - [「〇〇で歌ってみた」に基づく音韻検索データセットの検証](https://qiita.com/shimajiroxyz/items/89260d6441f45bf20f8b)
    - [コンクールで評価される「〇〇で歌ってみた」替え歌の分析](https://qiita.com/shimajiroxyz/items/f7321a8e7345214eee57)

- CI/CD、開発環境整備
  - uvとGitHub ActionsによるCI/CDテンプレート
    - [作業メモ: uvからtestpypiにpublish](https://qiita.com/shimajiroxyz/items/55404dce8b89cef852d9)
    - [メモ：github actions上でuvでタスク実行するときの最低限のyaml](https://qiita.com/shimajiroxyz/items/c05ab9608d42c0dcdd31)
    - [【M1Mac / DockerDesktop / act】Error: failed to start container: Error response from daemon: error while creating mount source path](https://qiita.com/shimajiroxyz/items/7153a65c852b140566f6)
    - [uvとgithub actionsによる効率的なpythonパッケージのバージョン更新](https://qiita.com/shimajiroxyz/items/f1d92a6ccb0d2bbe33b5)
    - [uvとsphinxでパッケージのdocsを自動生成](https://qiita.com/shimajiroxyz/private/34a3a4d8ca64a2c1443c)
    - [uvとgithub actionsによるsphinxのビルドとgithub pagesアップロード](https://qiita.com/shimajiroxyz/private/ee751c62a9e1f75d612a)
    - [uvとGitHub ActionsでpythonパッケージとドキュメントのCI/CD](https://qiita.com/shimajiroxyz/private/24e25d9edbe0eb9807aa)

  - 開発振り返り用の集計プログラム（Qiita、GitHub API）
    - [自分のGitHubリポジトリへのPR数とコミット数を集計する](https://qiita.com/shimajiroxyz/items/6b79ee9d9672b40aa8a9)
    - [Qiitaの投稿数やリアクション数を集計する](https://qiita.com/shimajiroxyz/items/28071db638bc328844ba)
    - [Qiitaの投稿パフォーマンス分析：リアクション数の比較](https://qiita.com/shimajiroxyz/items/bc69473d88c7fad9cfac)
    - [BaseSettingsでCLI引数の衝突を回避](https://qiita.com/shimajiroxyz/private/9064760f672adbd4c047)
    - [Pydantic BaseSettingsにおけるCLI引数、環境変数、コンストラクタ引数の優先順位](https://qiita.com/shimajiroxyz/private/f6d972411bd584679e6f)
    - [Qiita記事のリアクション数を自分と全体で比較するプログラム](https://qiita.com/shimajiroxyz/items/a453218349a229d864cc)
    - [pydantic-settingsで環境変数とコマンドライン引数を同時管理](https://qiita.com/shimajiroxyz/private/381a8683bd8edb40b24d)

  - 機械学習用パソコンの初期設定
    - [nvidia gpuをつんだPCにubuntu24.04インストール](https://qiita.com/shimajiroxyz/items/44363ebfac3caa45f00b)
    - [nvidia gpuをつんだPCにインストールしたubuntuの初期設定](https://qiita.com/shimajiroxyz/items/834b28e2f150d724aa35)

- 対外的な活動
  - 学会ワークショップ発表
    - [発表資料](https://jedworkshop.github.io/JLR2025/materials/d-1.pdf)
    - [NLP2025+Workshopの面白かった発表メモ](https://qiita.com/shimajiroxyz/items/3e96758cac978d1d9ffa)

  - RAGコンペ
    - [raggleに参加してみた感想](https://qiita.com/shimajiroxyz/items/c4bdf668658f1acd5337)
    - [【langchain v0.3】ChatOpenAIの使い方メモ（画像添付）](https://qiita.com/shimajiroxyz/items/9bb5d0b6e3acb63e2b5d)
    - [【langchain v0.3】ChatOpenAIの使い方メモ（構造化出力、tool_call）](https://qiita.com/shimajiroxyz/items/d3e3329088356c18df35)
    - [ubuntu 24.04のリモートデスクトップ環境構築検討](https://qiita.com/shimajiroxyz/items/8514f4a541ec8c8cb391)
    - [【langchain/pymupdf】pdfを画像に変換してLLMにわたすサンプルコード](https://qiita.com/shimajiroxyz/items/8b77e9d6148d7cdf43e0)
    - [【langchain】ChatPromptTemplateで画像を受け取る](https://qiita.com/shimajiroxyz/items/d808ce739a46c1c45f13)

  - OSSパッケージ
    - [xfmido](https://pypi.org/project/xfmido/)
    - [kanasim](https://pypi.org/project/kanasim/)
    - [soramimi-phonetic-search-dataset](https://pypi.org/project/soramimi-phonetic-search-dataset/)
    - [qiitareactioncounter](https://github.com/jiroshimaya/qiitareactioncounter)

- その他
  - [n人をkチームに分ける試行を複数回行う際、できるだけ少ない回数で全員が自分以外のメンバーと1回以上同じチームになるようにする](https://qiita.com/shimajiroxyz/items/5623006f30a858d16941)（いわゆるソーシャルゴルファー問題です。家族からの要望でコードを書きました）

## 記事タイトル一覧の取得に用いたコード

```Python
import os

import requests

# アクセストークンとユーザーIDの設定
access_token = os.environ["QIITA_TOKEN"]
user_id = USERNAME

# 取得期間の設定
start_date = "2024-10-01"
end_date = "2025-03-31"

# APIエンドポイントとヘッダーの設定
url = "https://qiita.com/api/v2/items"
headers = {"Authorization": f"Bearer {access_token}"}

# クエリパラメータの設定
query = f"user:{user_id} created:>={start_date} created:<={end_date}"
params = {"query": query, "per_page": 100, "page": 1}

# 記事情報の取得と出力
all_articles = []
while True:
    response = requests.get(url, headers=headers, params=params)
    if response.status_code != 200:
        print(f"Error: {response.status_code}")
        break
    articles = response.json()
    if not articles:
        break

    all_articles.extend(articles)
    params["page"] += 1

# created_atでソートして出力
sorted_articles = sorted(all_articles, key=lambda x: x["created_at"])
for article in sorted_articles:
    title = article["title"]
    article_url = article["url"]
    print(f"[{title}]({article_url})")
```

```sh
 % uv run qiita_titles.py
[pydantic-settingsで環境変数とコマンドライン引数を同時管理](https://qiita.com/shimajiroxyz/private/381a8683bd8edb40b24d)
[uvとGitHub ActionsでpythonパッケージとドキュメントのCI/CD](https://qiita.com/shimajiroxyz/private/24e25d9edbe0eb9807aa)
[Qiita記事のリアクション数を自分と全体で比較するプログラム](https://qiita.com/shimajiroxyz/items/a453218349a229d864cc)
[Pydantic BaseSettingsにおけるCLI引数、環境変数、コンストラクタ引数の優先順位](https://qiita.com/shimajiroxyz/private/f6d972411bd584679e6f)
...
```