「あの人も読んでる」略して「も読」。さまざまな寄稿者が最近気になった情報や話題をシェアする企画です。他のテックな人たちがどんな情報を追っているのか、ちょっと覗いてみませんか?
最近はZennのトレンド芸人になりつつあるしゅんそくです。GWにむけてもりもりコード書いています。
JetBrains IDEとClaude Codeを連携させて擬似Clineにする
私は業務で編集量が多いプロジェクトは基本JetBrainsで書いています。そんな私にとってこの記事は蜘蛛の糸のような存在でした。
https://zenn.dev/laiso/articles/def184d432438b
次の写真はPyCharmの画面です。Claude Codeのコマンド /init
で、CLAUDE.md を生成した様子です。
無事生成されました。Taskfileの対応している部分をちゃんと汲み取ってくれています。
紹介した画像は下記URLのサンプル用プロジェクトですが、実務でも導入しています。
https://github.com/shunsock/fizzbuzz
Claude Codeの場合、次のように書いておけば実装とテスト、docstringの記述まで完璧にしてくれます。
class Person:
def __init__(self, name: str):
pass
def greet(self) -> None:
"""挨拶を表示"""
pass
また、型で会話すれば、先にファイルを作らずとも上手くいく印象です。
「src
dir直下にclass Personを作成して。Personは挨拶を表示するmethod greet() -> Noneを持ちます」といった感じです。
Claude Code + JetBrainsはかなり高額な装備ではありますが、生産性と品質があがるのでかなりオススメです。
IntelliJ IDEAを使っている人は全員Junieを導入しよう!
https://zenn.dev/smartround_dev/articles/b90904e75666a3
僕はメインのPythonの他にもPHP, Go, Rust, .Netなどを書くことがあるため、JetBrainsはAll Products Packを年間契約しています。実のところ、初期の頃のJetBrains AIを月$10位で契約していたのですが、微妙だったので解約した過去があります。(GPT-3.5だったからしょうがないと思う)
このような背景があったので、記事を読んでAI機能がAll Products Packに追加されたことは衝撃でした。
使った感想ですが、Planを実行前と実行中に表示するUIが良いなと思いました。
JetBrains Webサイトより
Junieはまだ使いこなせていないので、余暇で知見を深めていきたいです。
Church Encoding: numberやbooleanを関数だけで表現しよう!
https://zenn.dev/socialplus/articles/3498a491bf977b
データ構造を関数だけで表現するという内容に惹かれて読みました。せっかくなので引き算を別言語で実装してみました。
module Main where
newtype Church = Church { runChurch :: forall a. (a -> a) -> a -> a }
zero :: Church
zero = Church $ \_ x -> x
succChurch :: Church -> Church
succChurch (Church n) = Church $ \f x -> f (n f x)
one :: Church
one = succChurch zero
two :: Church
two = succChurch one
three :: Church
three = succChurch two
add :: Church -> Church -> Church
add (Church m) (Church n) = Church $ \f x -> m f (n f x)
predChurch :: Church -> Church
predChurch (Church n) = Church $ \f x ->
let (p, _) = n (\(p, q) -> (q, f q)) (x, x)
in p
subChurch :: Church -> Church -> Church
subChurch m (Church n) = n predChurch m
churchToInt :: Church -> Integer
churchToInt (Church n) = n (+1) 0
main :: IO ()
main = do
putStrLn $ "three converted to int: " ++ show (churchToInt three)
putStrLn $ "2 + 3 = " ++ show (churchToInt (add two three))
putStrLn $ "3 - 2 = " ++ show (churchToInt (subChurch three two))
putStrLn $ "2 - 3 = " ++ show (churchToInt (subChurch two three))
※ gistにも置いています。 https://gist.github.com/shunsock/09b6bff47bd00208ebdcfc96f4004511#file-main-hs-L22
オレオレ RAG をさくっと作る
https://voluntas.ghost.io/slug-quick-custom-rag/
DuckDBとTransformersを組みあわせて、Local RAGを作るという内容でした。読んでほしくなったので夜なべして作りました。
作ったもの(Private Repositoryなのでスクショ)
今回はPythonで実装しました。Goで当初やろうとしたのですが、補足に書いた理由で断念したのと、FastMCPのアプリケーションをPyInstallerでバイナリ化できると分かったからです。
ちょっと前にFastMCPをバイナリにしようとして失敗したことがあったので心配していたのですが、MCPオブジェクトを次のように起動する方式にすればうまくいくようです。
main.py
import multiprocessing
from app import mcp
if __name__ == "__main__":
multiprocessing.freeze_support()
mcp.run()
app.py
from fastmcp import FastMCP
import duckdb
mcp = FastMCP("ShunsockRag")
@mcp.tool()
def add(query: str):
あとは元記事と大体一緒です。こんな感じで動きます。ちなみにバイナリの大きさは0.14GBぐらいでした。
補足
当初はGoで実装しようとしていました。実際、多くの言語でSDKが提供されています。 https://duckdb.org/docs/stable/clients/overview.html
しかし、文書をベクトル化したときにHugging Face API Tokenの発行が必要とのことで断念しました。(API Tokenの発行とそれに依存したテストを書きたくないからです)
https://pkg.go.dev/github.com/hupe1980/go-huggingface#section-readme
もし、DuckDBのSDKが配布されていて、HuggingFaceのAPIが不要でかつ単一の実行形式化が可能な言語があれば教えてください。(本当にほしい)
しゅんそくさんの「も読」過去記事
- マイナポータルのCSV、読みやすいコード、Pythonの定数(3月25日公開)