@Akio Hashimoto さん

 失礼しました、ほんとうですね。記事をよく読むと「venv 環境から IRISインスタンスに接続して SQL実行できます」って書かれていました。逆でした・・・

残念ながら、現時点 (2024年12月時点) の Embedded Python では、venv のような仮想環境の作成は対応していません。そのため、別に作成された仮想環境にアクセスしたりインポートもできない状態です。

いつか対応してくれるといいな、と私も思っています!

Akio さん、こんにちは!
venv 用の IRIS Embedded Python へのラッパーが、GitHub で公開されています。
https://github.com/grongierisc/iris-embedded-python-wrapper
紹介DC記事 https://community.intersystems.com/post/embedded-python-virtual-environe...

紹介DC記事は、コメント側に最新 alias コマンドが掲載されていますのでご注意ください。
どちらも英語ママですが、こちらお役に立てそうでしょうか?

> ちなみに、メッセージの出力を制御するのは難しいのでしょうか?

できるかもしれませんが、"CacheQuality for Visual Studio Code" については詳しくなく・・・。

あと、私も Akio さんと同じく、コーディング中に赤線が出るのは好きではないため、VSCode の設定で以下のように設定しています 😆

    "intersystems.language-server.diagnostics.suppressSyntaxErrors": [
        "COS",
        "SQL",
        "CLS"
    ],
 

Akio Hashimoto さん

いろいろ大変でしたね。。。

ご質問が「プロジェクト単位で、この拡張機能をON/OFFしたい」という意味でしたら、

・CacheQuality for Visual Studio Code を、拡張機能から一旦 Disable にして
・そのあと、同機能を有効にしたいワークスペースで 「Enable (Workspace) を選択」 

でいかがでしょう?

@Yuji Ohata さん、面白い話題をありがとうございます!

ご質問への直接な回答としては
「DBeaver が文字列、ObjectScript経由が数値として入る差異は製品仕様で、回避する方法がない」
になります。。

背景やその他おもしろ情報を以下お伝えしますね。

ObjectScriptも、実は内部では、データを「文字列」か「数値型」かを明確に区別しています。たとえば、以下の2つはデータとしては厳密には異なります。

    set a="12345"  ;; a: STRING
    set x=12345    ;; x: INTEGER

if a=x write "OK" とすると、ちゃんと "OK" と表示しますが、内部的には異なるデータです。

ただ、ObjectScript では型を厳密に定義しなくてもデータを扱える、という「メリット」があります。たとえば a は上記のように内部的には文字列扱いですが、aをキャストしなくても、数値を加えることができます。 

    set a="12345"    ;; a: String
    set b=a+1        ;; b: INTEGER!

つまり、上記の a と x はデータとしては厳密には異なりますが、ObjectScriptで取り扱うときは、多言語と違って、文字でもあり数値でもある曖昧さを許容してプログラミングできる、ということです。プログラマーにはラクチンです😄


ここで、Yuji さんがご質問されているテーブル定義の VARCHAR ですが、これは内部データ格納時に、ObjectScript 経由で登録すると 「%Stringだが、もし数値として登録されるなら、数値として登録される仕様」となっています。

Property a1 As %String;

ClassMethod init()
{
    &sql(insert into test (a1) values ('123'))
    &sql(insert into test (a1) values ('12345678901234567890'))
}

1件目のデータは、数値 123
2件目のデータは、(数値範囲を超える桁数なので) 文字列 12345678901234567890

ただ、ODBC / JDBC 経由でデータ挿入をする場合は、ODBC / JDBC の世界では厳密にデータ型を定義しているため、IRIS登録時に「VARCHAR の 123456789012345678 ね」 と情報が届きます。そのため、同じINSERTでも

INSERT INTO test (a1) values (123)

は、文字列 123 として登録されます。

ちなみに、「ObjectScriptでそのデータは文字列か数値か」は、$List のデータに格納することで区別がつきます。

    set a=123    ;; INTEGER
    set x="123"  ;; STRING
    
    set a1=$LB(a)    ;; INTEGER in $LIST 
    zzdump a1        ;; a1: 03 04 7B 

    set x1=$LB(x)    ;; STRING in $LIST
    zzdump x1        ;; x1: 05 01 31 32 33
    

$LIST は第2バイトに型をもっています。上の例ですと

a1 :  型 04 = INTEGER
x1 :  型 01 = STRING

という感じです。

あまりご質問の回答としてふさわしくない話題かもしれませんが、、、 
「なるほど、その分野はユルめの言語なのね」と思っていただけると嬉しいです。

@松川 幸久 さん、
$LIST形式のデータであれば、$LISTTOSTRING(list) というコマンドで文字列にできます。
ということで、こんなのはどうでしょうか?

   set line=time_" ["_type_"] "_gref
   if type="SET" {
      if $LISTVALID(gval) {   // if gval is $LIST data
         set gval="$LB("_$LISTTOSTRING(gval)_")"
      }
      set line=line_"="_gval
   }

わかりやすく $LB( ) で前後をくくってみました。 以下のように出力されます。

11/07/2024 02:50:12 [SET] ^["^^c:\intersystems\iris\mgr\user\"]naka=$LB(a,1,xyz)
11/07/2024 10:51:29 [SET] ^["^^c:\intersystems\iris\mgr\user\"]naka(2)=123


 

上記(2)は、あくまでテキストベースで参照するための簡単なサンプルになります。
そのため、グローバルの値が gval=$LB("abc","xyz")gval="abc"_$C(1)_"xyz" など制御コードが含まるときは、ファイルにはそのまま出力されませんので、その点ご注意くださいませ。

「そのようなデータも見たいな」と言われる方は、コメントなどでお寄せください。

@Minoru Horita さん、分かりやすいベクトル検索の紹介記事、ありがとうございます!具体的に、大量の日本語文章データをIRISに格納して、そこからIRISのSQL一発で 「意味が似ている」データをヒットさせるデモは、分かりやすくてワクワクしますね。

感想だけではなんなので、記事の一連のPythonコードを、以下のようなIRISクラスに置き換えてみました。
(1) プロパティは、日本語文書 contents とそのベクトルデータ contentsv の2つ
(2) sqlalchemy ではなく、IRIS上で INSERT文発行して、ベクトルデータを格納

全く同じロジックですが、Pythonコード含めて、少しでも他メンバーの方のご参考になればと掲載します。

Class User.nakav3 Extends %Persistent
{

Property contents As %String(MAXLEN = 4096);

Property contentsv As %Vector(DATATYPE = "DOUBLE", LEN = 768);

ClassMethod load() [ Language = python ]
{
    import iris
    import pandas as pd
    from pyarrow.parquet import ParquetFile
    import pyarrow as pa

    pf = ParquetFile('/var/tmp/cc100/0000.parquet')
    first_rows = next(pf.iter_batches(batch_size = 1000))
    df = pa.Table.from_batches([first_rows]).to_pandas()
    df = df.replace("\n","",regex=True)

    for index,row in df.iterrows():
        text = row['text'] 
        iris.cls('User.nakav3').insertToIRIS(text)

    print('Done')
}

ClassMethod search(question As %String)
{
    if $g(question)="" set question="大都市での生活は便利な半面、混雑や環境の悪さなどの問題もある。"

    set questionv=$tr(..Embedd(question)," '[]")
    set sql="SELECT TOP 5 VECTOR_DOT_PRODUCT(contentsv, TO_VECTOR(?, DOUBLE, 768)) as sim, contents"
    set sql=sql_" FROM SQLUser.nakav3 ORDER BY sim DESC"
    set rs=##class(%SQL.Statement).%ExecDirect(.stmt,.sql,.questionv)
    while rs.%Next() {
        write rs.%Get("sim")," ",rs.%Get("contents"),!
    }
}

ClassMethod insertToIRIS(text As %String)
{
    set textv=$tr(..Embedd(text)," '[]")
    &sql(insert into SQLUser.nakav3 (contents, contentsv) values (:text, TO_VECTOR(:textv, DOUBLE, 768) ) )
}

ClassMethod Embedd(text) As %String [ Language = python ]
{
   from sentence_transformers import SentenceTransformer
   model = SentenceTransformer('stsb-xlm-r-multilingual')
   embeddings = model.encode(text)
   # convert the embeddings to a string
   embeddings_list = [str(embedding.tolist()) for embedding in embeddings]
   return str(embeddings_list)
}

}


データロード
do ##class(User.nakav3).load()

データ検索
do ##class(User.nakav3).search("大都市での生活は便利な半面、混雑や環境の悪さなどの問題もある。")

当日パネルディスカッションの進行役をつとめさせていただきました。

パネラーのみなさんが嬉しそうに IRIS にまつわる技術論をお話される姿と、会場のみなさんがその話を真剣にうんうん頷いて聞かれている姿、両方が良く見えて、司会席でニヤニヤしぱなっしでした。とても楽しい一日でした。

会場にお越しいただいたみなさま、本当にありがとうございました。

VSCodeのワークスペースを作成・保存
> この作業はUIで行っても良いのですが、

ここの UI 作業については、以下の記事でスクリーンショット付きで公開しています。少し古いですが、2023年10月現在でも同じ手順で登録できます。「鉛筆マーク」 クリックで登録されます。

https://jp.community.intersystems.com/node/493616
3. クラス定義やルーチンを編集する

Hashimotoさん、Peacock知りませんでした。楽しい情報ありがとうございます。

ObjectScriptコード内の色は、”InterSystems Language Server" エクステンションのTheme内で登録されていますので、ここを上書きさせれば出来る「かも」です。最新 Version 2.3.6 であれば、
C:\Users\<username>\.vscode\extensions\intersystems.language-server-2.3.6-win32-x64\themes

ここのテーマ別 json ファイルの、このあたり以下にずらっとならんでいました。

中橋は、コマンドカラーを変更するまでの元気がなくて、へーと眺めている段階です・・・。

Amano さん、

最近アップデートされた、InterSystems Server Manager エクステンションでは、簡単に「サーバ上のCSPファイル」を編集できるようになりました。以下に手順を投稿しましたので、もしご参考になれば幸いです。

VSCode を使ってみよう (2021年4月20日版)