nakaoka3の技術ブログ

2023年中に52本なにか書きます

VSCodeでPerlNavigatorのバージョンを固定して問題を回避

VSCodePerlのコードを書いている。PerlNavigatorという VSCode拡張を便利に使っていたが、いつからかメソッドの定義の参照やジャンプができなくて困っていた。

同僚に相談したところ古いバージョンで固定するとこの問題を回避できると教えてもらった。

一度Perl Navigatorをアンインストールして、以下のコマンドを実行して拡張機能を入れ直した。

code --install-extension bscan.perlnavigator@0.6.2

無事定義の参照やジャンプができるようになって便利にPerlのコードを読み書きできるようになった。

追記

VSCodeGUIでも別バージョンの拡張機能のインストールはできました

2.3GBのLLMも意外と使えるかもしれない Ollamaを使ってLamma3とPhi-3を試した

Ollama / ローカルマシンでLLMを気軽に試せる

Ollamaというツールを使って、ローカルマシンでLLMを動かしてみた。Ubuntuにインストールして試したが、READMEを見る限りMacWindowsにも対応してそうだ。

github.com

Llama 3 / Meta のモデル

Quickstart に書かれている Meta の Llama3を最初に試した。

ollama run llama3 というコマンドを入力すると、モデルのダウンロードが始まる。ファイルサイズが4.7GBあるので、ダウンロードが完了するのをしばらく待つ。日常でダウンロードするサイズと比べると大きいが、とはいえ数GB程度なのは驚きだ。ちゃんと意味のある文章を生成できるのだろうか。ダウンロードが終わるとシンプルなCLIの対話インターフェイスが起動する。

Llama3との最初の会話

helloから会話を始めたからか、日本語を入力しても英語が返ってきた。最初から日本語で話すと、日本語で会話ができた。

Ollama3 日本語で会話

とはいえ少し日本語がぎこちない気がする。間違ってはいないのだが、片言の日本語が聞こえてくるのは気のせいだろうか。

Phi-3 / Microsoft の2.3GBのモデル

2つ目に試したのがMicrosoftのPhi-3だ。このモデルはLlama3よりも更にサイズが小さく、2.3GBしかない。丁寧な日本語を生成してくる。あまり賢くはなさそうだが、簡単な日本語の受け答えはできそうだ。2.3GBでもこの程度のことはできるというのは驚きだ。

Phi-3

今回試したのはサイズの小さい有名なモデルで、さらにサイズが大きいモデルはより高性能だそうだ。しかし手元のPCでは動かせないか、動かせても実用的な速度で動くのか不明なので試していない。

グラフィックボードを交換した

PCのグラフィックボードをGeForce RTX 3060に交換した。

最近はPCゲームをしていないので、デスクの横に置きっぱなしのでかいPCは手放してもいいかなと思い始めていた。しかし画像生成モデルのStable Diffusion や、音声書き起こしのWhisperやローカルLLMをPCで動かして遊んでみたいと思うことがあり、それならグラボを買い替えておこうと思い立った。

コスパの良さそうモデルを探し、GeForce RTX 3060に辿り着いた。4000シリーズが最新みたいだが、バリバリ使う予定はないし3060の評価が高く中古でも手に入るので3060を買うことにした。GeForce RTX 3060は思っていたよりも小さく、ケースに無事収まり安心した。購入した製品はメモリが12GBと多めなので、画像生成にも向いているらしい。

ネットで調べながらグラボを交換していった。一番苦労したのはグラボを支えるパーツを取るところで、力ずくで引っ張っていいのか、どこかのネジを外すのかわからなかったところだ。結局YouTubeで動画を見てただ引っ張れば良さそうということがわかって無事取り外すことができた。

無事物理的な交換が完了し、WindowsUbuntuNVIDIAのドライバをインストールした。CUDAも使えるようにインストールし、無事NVIDIAのグラフィックボードを活用できる準備ができた。

きょうのJavaScript/TypeScript - nullチェック

JavaScript/TypeScriptをたまに書くと、いまだにこの言語について基本的なことについて把握していないことが多いということを思い知る。

最近、あるデータがnullかundefinedでないときのみにある処理を行うという、以下のようなnullチェックを書いた。

if (data != null) {
    doSomething(data)
}

JavaScriptでは等価演算子/不等価演算子と厳密等価演算子/厳密不等価演算子がある。上記の例は不等価演算子なので、dataがnullのときもundefinedのときも!=でfalseとなる。

そもそもnullとundefinedがべつものとして存在していることが無駄に複雑で、JSを使いたくない気にさせるが、ブラウザで動く唯一の言語であるなのでそうもいかない。

それはともかくTypeScript Deep Dive によると、nullとundefinedの2つを区別する必要はなく != null でチェックするのがよいとのことだ。nullとundefinedについては以下の記事を参考にした。

typescript-jp.gitbook.io

Asanaにタイムトラッキング機能があったので使っている

Asanaにタイムトラッキング機能があるのを見つけた。よさそうなので使っている。

デフォルトでは無効になっていて、カスタマイズのフィールドの追加をするところから有効にすることで、推定時間と実際の時間のフィールドが追加される。タイマー機能があって、時間を測れるようになっているのが便利。

タイムトラッキング – Asana Help Center

タイムトラッキング機能は「マイタスク」の自分だけが見れるフィールドとして追加している。

マイタスクのフィールドとして追加されている

あるタスクが思っていたよりも難しくて時間がかかっているということが把握しやすくなっていい。

基本的に何事も測るのが好きな方なので、こういうことをするのは楽しい。几帳面ではないのでそのうち使わなくなると思うが、少しの間だけでも使ってみようと思う。

Claude 3 Opus は小説を読むことができるのか - Claude に『走れメロス』を読ませる

最近 ChatGPTよりもAnthropicのClaudeのほうが賢いという噂を目にして、試しにClaudeを使ってみている。確かに賢い気もするが、はっきりとしたことはわからない。せっかくなので色々と試してみようと思う。

去年の8月にLangChainというライブラリを使った実装の練習で、OpenAIのGPT3に『走れメロス』の内容を質問した。なので今回もそれを踏襲して『走れメロス』の内容について質問して、小説の内容を正しく反映した回答が生成できるかを試した。

nakaoka3.hatenablog.com

試したこと

小説に対する質問をして、それに対して自然で正しい内容を生成するかを見た。

ファイルを添付して質問する

WebのClaudeではファイルを添付できるので、小説の本文が入ったテキストファイルをアップロードしてから質問した。3つの質問で、それぞれ正しい説得力のある返答を生成できていた。国語のテストなら正解でいいだろう。気のせいかも知れないが、「〜たのです」というに口調が小説のスタイルに引っ張られて、昔の小説っぽくなっている気がする。いつもの日本語の回答だとシンプルな丁寧語で「〜でした」という口調になる。

ファイルを添付して質問した結果

ファイルなしで質問する

ここまでやった後で、『走れメロス』に関しては本文のファイルなくても答えられるのでは、という懸念が生まれた。この懸念は正しく、本文の添付がなくても同じように内容を正しく反映した回答が生成された。『走れメロス』は学習済みということがわかった。

ファイルなしで質問した結果

本文を改変して質問する

学習済みでない小説について質問したいので、『走れメロス』の一部を改変して、その小説について質問することにした。

質問に合わせて、以下の変更を行った。

この改変内容を含んだ回答になっているかを試してみる。

本文を改変して質問した結果

1つ目の質問は改変内容は無関係。2つ目の質問には、期待通り婿の名前が含まれている。3つ目の質問には、期待通りセリヌンティウスが死亡したと書かれている。ということで、改変内容を反映してた内容を正しく答えることができていた。

まとめ

Claude 3 Opus は小説の内容を把握しているような回答を生成する事ができるということが確認できた。

有名な小説は学習済みの可能性があるので、注意が必要。検証用のデータは学習されている可能性のないデータを使う必要がある。

【Swift】enumのassociated value にデフォルト値をつける

以下のようなSwiftのコードを書いた。

enum Example {
    case one
    case two(name : String)
    case three(name : String = "taro")
}

print(Example.three(name: "hanako")) // three(name: "hanako")
print(Example.three()) // three(name: "taro")

enumのassociated valueにデフォルト値をつけらるとは思っていなかったので、コンパイルエラーになるだろうなと思っていたが、予想に反してコンパイルできた。Swiftのバージョンは 5.8.1 で実行している。

予想とは違っていたので目を疑ったが、どう考えてもコンパイルできて動いている眼の前の現実のほうが正しいだろう。

以下の記事によるとSwift 5.1 から追加された機能らしい。

www.swiftbysundell.com