モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

llama-indexのopenai 1.x系への対応

Pythonでllama-indexを使っているのですが、開発環境からテスト環境へ移して実行しようとしたところ、SimpleNodeParserのところで、以下のようにエラーが発生しました。

    node_parser = SimpleNodeParser.from_defaults(text_splitter=text_splitter)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: SentenceSplitter.from_defaults() got an unexpected keyword argument 'text_splitter'

pyproject.tomlに

dependencies = [
    "openai>=0.28.0",
    "llama-index>=0.8",
...

という感じに書いていたため、openaiが1.3.xに、llama-indexが0.9.xになっており、llama-index 0.9系だと動かないようです。

そこでllama-indexを0.8のままにしておくよう、以下のように「<0.9」の指定を追加してやることでこのエラーは回避しました。

dependencies = [
    "openai>=0.28.0",
    "llama-index>=0.8, <0.9",
...

しかし今度はopenaiが1.xだと古い使い方だと動かないと言われました。

openai.lib._old_api.APIRemovedInV1:

You tried to access openai.Completion, but this is no longer supported in openai>=1.0.0 - see the README at https://github.com/openai/openai-python for the API.

You can run `openai migrate` to automatically upgrade your codebase to use the 1.0.0 interface.

Alternatively, you can pin your installation to the old version, e.g. `pip install openai==0.28`

A detailed migration guide is available here: https://github.com/openai/openai-python/discussions/742

github.com

今後Assistant APIとか使うことを考えると、openaiは早めに1.xに移行しておきたいところです。
しかし実はすでに他のコードは1.xに移行しており、これはllama-indexの中で発生しているエラーでした。

ちなみにどのバージョンからllama-indexがopenai 1.xに対応したのだろう?と思って調べてみたところ、0.8.5x台までは

openai = ">=0.26.4"

だったのが、
2023/11/8 の 0.8.64 から

openai = ">=1.1.0"

となっていました。
なので0.9.xからというわけではなく、0.8.xの途中からopenai 1.x系への対応がされたようです。

ただ今後のことを考えると、なんにしても0.8.xから0.9.xへの移行をしといたほうが良さそうに思いました。
で0.8->0.9への移行の情報を探したところnpakaさんの記事がありました。
note.com

ここの「4. ノード解析・テキスト分割・メタデータ抽出のインターフェース変更」のところに、これまでの一旦「SimpleNodeParser」を作る方法から変更されたことが書いてありました。

これまでの「0.8.x」の場合

node_parser = SimpleNodeParser(
    text_splitter=SentenceSplitter(chunk_size=512)
)
nodes = node_parser.get_nodes_from_documents(documents)


今後「0.9.x」の場合

node_parser = SentenceSplitter(chunk_size=512)
nodes = node_parser(documents)

このため、これまでnode_parserを入れたSimpleNodeParserを生成していた部分を、単にそのままこれまで使っていたSentenceSplitterを入れることで動くようになりました。

Outlookのメール送受信で0x8004010Fのエラーになる

Outlookのメール送受信をしようとすると「0x8004010F」のエラーが出てメール送受信が出来ない、という相談を受けました。
なにかやったわけではなく突然なったということでした。

これぐぐると、やばそうな障害だな…というのがわかります。

電子メールの送受信時にエラー 0x8004010F が表示される - Outlook | Microsoft Learn https://learn.microsoft.com/ja-jp/outlook/troubleshoot/synchronization/error-0x8004010f-when-sending-or-receiving-emails

つまりOutlookのDBファイルにアクセスできなくなった場合に出るエラーです。
しかし確認したところ、メール自体は表示されるため、まったくファイルへアクセス出来ない状況、というわけではありませんでした。
また設定自体も問題なく、またディスク容量も問題なくて、ファイルも壊れてはなさそうでした。

じゃあ逆になにが問題なんだ??となって色々調べてたのですがよくわからず、でもExploreでファイルを見てみたときにOneDriveの同期中になったままになっていることに気が付きました。
なにかでかい変更があってファイルの同期に時間がかかってる?と思って確認すると、OneDrive側の容量が足らなくなっていて同期ができない状況になっていることがわかりました。
このアカウントはなぜかMicrosoft365のアカウントではなく、無料の個人アカウントになっており、そのため容量が5Gになっていたので上限に達していたようです。

Microsoft365のアカウント自体はあったので、そちらのほうをOneDriveに登録し直して、OneDriveにあったデータもすべて移行して、そちらを参照するようにOutlookの設定も変更しました。
これでちゃんと送受信ができるようになりました。

Outlookの送受信ができないというエラーで、OneDriveの容量が足らないのが理由、というのはなかなか気が付きにくいです…

Flaskの稼働URLにディレクトリ名を指定する

flaskのアプリで、例えば開発用を /dev 以下に、デモ用を /demo 以下で動かしたいと思ったのでした。
これはたぶん標準機能ですぐ出来るんだろうなと思って検索したところ、flaskの起動時に環境変数「SCRIPT_NAME」でディレクトリ名を与えてやれば出来るっぽいと見かけました。…が、できない

こういう機能はどうも blueprint というモジュール使えば出来るようです。

が、なんでSCRIPT_NAME指定でダメなんだろう?と調べました。
するとやはりflask単体だとうまく行かず、gunicornから起動だとこの設定が出来るという記述がありました。

dlukes.github.io

実際に本番稼働させるには gunicorn で動かす予定でいたため、gunicornで試したところ「SCRIPT_NAME」を与えてやることで指定したディレクトリ以下で動かすことが出来ました。

werkzeugでurl_decodeのエラーが発生する

Pythonでflask_loginを使っているアプリで、下記のエラーが発生した。

ImportError: cannot import name 'url_decode' from 'werkzeug.urls'

werkzeug.urlsなんてimportしてないのになんで??と思ったら、どうもflask_loginで呼ばれているようだった。
そして、werkzeug.urlsがv3.0以降でurl_decodeがなくなっているのに、まだflask側での対応がされていないため、このエラーが発生するとのことだった。

stackoverflow.com


そこで以下のようにpyproject.tomlで、werkzeugのバージョンを2の最終の2.3に固定して、flaskを2.3以降にすることで対応できた。

"Werkzeug==2.3.7",
"flask>=2.3.3",
"flask-login>=0.6.2",

ただし、すでにwerkzeugが3が入っているとだめなので、一旦Werkzeugやflaskを外してsyncして、再度上記の依存を記述してsyncすることで対応できた。

最終的に入ったバージョンは以下の通り。

Flask==2.3.3
Flask-Login==0.6.3
Werkzeug==2.3.7

WSL2上のSQLiteデータをGUIで確認したい

WSL2上でSQLite使っているとき、簡単にデータのブラウズをしたくて、MySQL WorkbenchみたいにGUIで確認出来たらいいのにな、と思いました。
で、そういう用途はDB Browser for SQLite(sqlitebrowser)を使えば良いようです。

が、普通にWindows版のsqlitebrowserを入れてすんなり動いたのですが、WSL2上のファイルを指定するとロックされてるから見れない、と言われてしまいました。
読み取り専用で読み込もうとしてもダメ。

ChatGPT-4様に聞いてみると、WSL2上のファイルはダメだから一旦Windowsファイルシステム上へコピーすれば見れるよ、とのこと。
確かに試してみると、コピーしただけで見れるようになりました。

…が、さすがにこれはめんどくさすぎる。

最近のWSL2だとデフォルトでGUIというかWindows側でXが動くようになってて、GUIのものが使えるようになっています。
なのでWSL2にLinux用のsqlitebrowserを入れてみました。
単にapt installで入ります。

sudo apt install sqlitebrowser fonts-ipafont

WSL2上のsqlitebrowserだと問題なくDBのファイルを指定して中身を見ることができました
ただフォントが入っていないと日本語が全部「□」になってしまったため、ipafontも入れたところ問題なく表示できるようになりました。

Pythonのdotenvのインストールではまった

すごくしょうもないことではまったのでメモ。


Pythonの仮想環境ツールをanaconda使ってたのだけど、ぼちぼち移行したほうがよかろうと思って、Poetryにしようかと思ったんだけど、Pythonのバージョンも一括で管理できて評判の良いRyeにかえたのでした。

んで、dotenvを使いたくて

rye add dotenv
rye sync

したところ

error: could not write production lockfile for project

的なエラーがでて動かず。


ただ、別段たいしたことないdotenvのせいでlockfileが作れないとか、そんなことは無かろうと思って、色々調査して、最終的にはRyeのせいだろうか?とか思ってPoetryを試してみるまでいくも解決せず。
ただ、Poetryでやるとdotenvのインストールで問題が起こっていることに気が付きました。


でよくよく確認してみるとdotenvのパッケージ名って「python-dotenv」なんですね…

てことで、再度Ryeに戻して

rye add python-dotenv
rye sync

にすることで解決しました。

これだけで2時間くらい無駄にしました…

WindowsからNASへどうしてもアクセス出来ない問題

新しいWindows PCのセットアップを頼まれて、NASへのショートカットを作ろうとしたところでどうしても共有フォルダにアクセスができない(認証が通らない)という謎現象に当たりました。

2台の新しいPCをセットアップしていて、1台はなんの問題もなくすんなり。
でもう1台がなぜかPINを求められるようになって、そこからはどーしても、どうしても、ユーザ名とパスワード入れても通らないのです。
Windows Credentialsのところから、現在保存されてしまっているアカウント設定を削除するとか、SMB1.0 Clientのチェックとかは試してみたのですがダメ。

それで、色々ぐぐってみたところSynologyのFAQにこんな内容がありました。

kb.synology.com

ここで「ユーザ名」だけではなく「サーバ名¥ユーザ名」とすると通ることがあるとのこと。
IPでの設定だったため「192.168.10.100\example」みたいな感じで設定したところ、無事に通りました。

しかしなぜ1台はすんなり通ったのに、もう1台だけこんなことになったのかは、謎のままです。

UbuntuとWindowsのデュアルブート環境でAX200のWiFiが接続できなくなる問題

タイトルが長いけど、WindowsデュアルブートであることによってなぜかWiFiが接続できなくなることがあるという、絶対気が付かんだろこれ!という問題に当たったのでメモ。


ある日突然 UbuntuWiFiが接続できないようになってしまい

sudo lshw -C network

として調べてみると、インターフェイスのところに「UNCLAIMED」とついていて、利用できない状況になっていることがわかりました。

突然こうなったのでなんでだろ?と、再起動してみたりデバイスドライバのアップデートとか掛けたりしてみたんですが解消せず。


んで AX200 特有の問題だろうか?と Ubuntu AX200 で探してみたところ、こちらのエントリがありました。

musaprg.hatenablog.com

bugzilla.kernel.org

WindowsUbuntuデュアルブートでAX200を利用している場合、Windows側でFastbootを利用していると、その影響でWiFiが使えなくなるというのです。
なので、Windows側の設定でFastbootをやめると解決するとのこと。


このPCもWindowsUbuntuデュアルブート環境だったので当てはまるのですが、何度も再起動もしてるのにほんと??となったんですけども、半信半疑で試してみました。

すると、ほんと一発で解決しました。

いやー… さすがにこんなの気が付かんわ、と思いました。

「0x0000011bエラー」で印刷できない件ふたたび

ちょうど1年前に

stealthinu.hatenadiary.jp


というエントリを書いたのですが、その件のサーバリプレースがあり、再度同じ問題が発生して対処したため、そのまとめです。


このサーバには古いドットインパクトプリンタがUSBパラレル変換ケーブル経由で繋がっていて、これは他のプリンタサーバなどでは共有に出来ないため、どうしてもWindowsサーバ経由で使うように設定する必要があります。
もう転写式の帳票なんてやめたほうがいいんでないかなあ… と思うんですけど、それはお客さんの判断なのでなんともです。


さて、新規サーバリプレースのため、サーバのOSはWindows Server 2019になったのですが、これだと前回対応したときのように、Windows Updateで「5005565」等があたったわけではないため更新のリストには上がっておらず、それと全く同じに対応することはできませんでした。


それで探してみると、あの方法で対処した後日、問題のパッチが当たっていても、レジストリを変更することで対処する手法が発見されていたみたいです。

sakuraxren.blog.fc2.com

こちらのエントリを拝見すると、「SMB1.0の有効化」と「RpcAuthnLevelPrivacyEnabledレジストリの設定」で動作可能になるようでした。

ただこれは、パッチ当てないのと同様、パッチを当てるべきセキュリティリスクをあえて穴あける設定なので、今回のようにどうしても必要な場合以外はおすすめではありません。


Windows ServerでWindowsの機能を追加しようとすると、サーバーマネージャーが起動しちゃってどうしたらいいんだろ?と思ったんですが、進めていくと機能の選択というのが出てきてここで普通のWindowsと同じように追加ができるのですね。

anything-it.info


これで無事にドットインパクトプリンターが動くようになりました。

OCNバーチャルコネクト固定1IPで接続してる環境にクライアントVPN接続する設定

最近、OCNバーチャルコネクトの固定1IPで接続している環境に、出先のWindowsクライアントからVPN接続するための設定がどうしてもうまくいかずはまりました。
やっと解決できたのでそのメモです。


自分のハマったポイントは、クライアントPC側のWindowsで「AssumeUDPEncapsulationContextOnSendRule」 レジストリ キーを設定してNATトラバーサルを有効にしてやる必要があったことでした。

実は同じクライアントPCに他のVPN設定があり、そちらは問題なくつながっていたため、この設定をしなくても良いと思っていました。そちらの接続は普通にPPPoEで繋がってました。
OCNバーチャルコネクトはIPoEでIPv6で接続して、そこからIPv4にNATして繋がっているため、このNATトラバーサルの設定がないとつながらないようです。

https://www.cup.com/staticip/manual/win10_l2tp.html

【Windows10】L2TP/IPSecでリモート接続するVPN接続設定 | The modern stone age.

ちなみに「ヤマハVPNクライアント」をインストールしても自動的にこちらのレジストリの設定が行われます。
そのため、ヤマハVPNクライアントを使えばこの設定をしなくてもすんなり接続できてしまいます。


OCNバーチャルコネクトの接続設定とVPNの設定は、configファイルでやってもいいのですが、Web GUIからでもできてしまうようです。

【OCNバーチャルコネクト固定1IPの接続設定】

基本はヤマハの公式サイトのWebGUIの説明のとおりです
OCNバーチャルコネクトでインターネット接続

  • かんたん設定 > プロバイダー接続
  • プロバイダー接続から「LAN2」で接続
    • IPoE
    • 設定名「OCN_virtual_connect」
    • 光電話契約「契約していない」
    • IPv4 over IPv6「使用する」>「OCNバーチャルコネクトサービス」
    • OCNバーチャルコネクトサービス固定IP1契約
    • アドレス解決システムURL: http://ipoe-static.ocn.ad.jp/nic/update
    • 認証用ID: 【OCN指定のもの】
    • 認証用パスワード: 【OCN指定のもの】
    • 推奨のIPフィルタを使用する

リロードすると

  • OCN_virtual_connect
  • IPv6 IPoE(RA)接続
  • LAN2/TUNNEL1

で接続している状況になります。

【クライアント接続用VPNの設定】

基本は下記ヤマハ公式の接続設定のとおりですが、それにプラスしてESP/UDP500,4500,1701を通すためのフィルタ設定とマスカレードの設定が必要になります。
L2TP/IPsecを使用したリモートアクセス : Web GUI設定