2023年11月21日火曜日

SAS StudioからOpenSearchのログを検索するサンプル

Viyaのログの調査の効率を上げるためにSAS Studioからクエリを投入できないか思案しています。できたのが以下のコードです。

  1. /* Sample code to search OpenSearch by PROC HTTP. */  
  2. filename myresult temp;  
  3.   
  4. data _null_;  
  5.     attrib code length=$64;  
  6.   
  7.     /* Change the following user name (admin) and password (hogehoge) to match your environment. */  
  8.     code=put("admin:hogehoge", $base64x64.);  
  9.     put code=;  
  10.     call symputx('code', compress(code), 'G');  
  11. run;  
  12.   
  13. proc http url="https://v4m-search.logging.svc.cluster.local:9200/_search"  
  14.         in='{ "query": { "simple_query_string": { "query": "setinit", "fields": [ "message" ], "default_operator": "and" }}}'   
  15.         out=myresult  
  16.         timeout=30  
  17.         /* clear_cache*/;  
  18.     sslparms "SSLREQCERT"="allow" SSLCERTLOC="/opt/sas/viya/home/SASSecurityCertificateFramework/tls/certs/ca-bundle.pem";  
  19.     headers "content-type"="application/json" "authorization"="Basic &code.";  
  20.     debug level=0;  
  21. run;  
  22.   
  23. data _null_;  
  24.     infile myresult;  
  25.     input;  
  26.     put _INFILE_;  
  27. run;  
このコードが意味するところは、messageフィールドからsetinitを検索しています。URLのホスト名、ポート番号とPEMのファイルはSAS Compute ServerのPodに接続して探したり、kubectl describe endpointsやservicesで探しました。それらのホスト名とかポート番号は公式なドキュメントには書かれていないので実機検証で調べてたものです。なので内部の実装は知らぬ間に変わる可能性があることに留意してください。

CURLの--insecureに相当するのが、SSLREQCERTのオプションです。それだけだとエラーが出るので、SSLCERTLOCでPEMファイルを指定しています。

私は全く知らなかったのですが、これでPROC HTTPを実行すると接続とCOOKEの情報が保持されるそうです。それをクリアするのがコメントアウトしてある CLEAR_CACHEです。その接続とCOOKIEがあれば、毎回SSLSERTLOCを指定する必要はありません。

2023年11月4日土曜日

Androidのタブレットで、ZOOMが起動できない場合の点検箇所

Androidの端末でChromeからZoomが起動しないときの点検箇所は、PC版サイトのチェックです。また「ブラウザから参加」しようとすると、以下のようなエラーが出るときにも有効でした。

  • This site can't ask for your permission close any bubbles or overlays?
  • 他のアプリのバブルやオーバーレイをすべて閉じてから、もう一度お試しください。
試していませんが、特定サイトだけ設定というのもあるようです。

2023年10月4日水曜日

OpenSearch を curl から検索する例

SAS Viya Monitoring for Kubernetes でログを検索したい場合に以下のようにクエリを投入できる。結果はJSONなので、これを加工して欲しい情報を見やすく成型する。この curl のコマンドは OpenSearch の DEV Toolからコマンドを生成して、必要最小限のオプションまで削りました。

  1. curl 'https://viya4.example.com/dashboards/api/console/proxy?path=_search&method=GET' \  
  2.   -H 'osd-xsrf: opensearchDashboards' \  
  3.   --data-raw '{ "query": { "simple_query_string": { "query": "setinit", "fields": [ "message" ], "default_operator": "and" }}}' \  
  4.   --insecure -u 'admin:password'  
このコードが意味するところは、messageフィールドからsetinitを検索しています。-uでユーザ名とパスワードを指定しています。OpenSearch自体にクエリを投げる例はすぐに見つかりますが、クラスタ内部のサービスを指定する方法が判らず数時間調べました。

2023年6月26日月曜日

SAS Viya CLIのログインとトークンを環境変数に設定

シェルから . で読み込んでSAS Viya CLIと環境変数にトークンを設定する例です。curlと組み合わせて使うので、このスクリプトをよく使う。

  1. sas-viya -k auth login -u sasadm -p hogehoge  
  2. export ACCESS_TOKEN=$(cat ~/.sas/credentials.json | jq -r '.Default."access-token"')  
  3. export URL=$(jq -r ' .Default."sas-endpoint"' ~/.sas/config.json)  
  4. export LANG=en.UTF-8  

2023年5月2日火曜日

デスクトップPCをリプレース, HP Pro Mini 400 G9 Desktop PC

 5年ぶりに自宅のPCをリプレースしました。これまでEliteの省スペースPCでしたが、最上位でなくても良いと思ったのでビジネス用で1ランクしたのProに乗り換えました。世代を示す番号はG3からG9に進化しています。Windows10から11への移行は面倒で、ドキュメントの位置がOne Driveとローカルで分散していたのが厄介なところです。ファイルを整理しないといけない。


ざっくりと2-3倍程度のスピードアップです。ベンチマークの結果と体感がどれだけ違うか、試してみます。

2023年4月25日火曜日

Viya4 XCMD有効化の設定

 良く忘れるのでメモ
allowXCMD がキーワード



2023年4月11日火曜日

JSONのファイルから32KBを超えるSASプログラムを抽出する。

LIBNAMEのJSONエンジンの欠点は、32KBを超える長さのデータを抽出できない点です。できないものは仕方ないので、32KBを超えてもSASプログラムを抽出するコードを書きました。 字句解析の状態遷移を考えて "code": の値を抽出してバックスラッシュのエンコードを解いてファイルの保存します。入力のJSONファイルは整形されていないコンパクトや書式の前提です。昔、Lex, Yaccを使っていた記憶を掘り起こした。

  1. /* Code extraction from JSON file of job definition */  
  2. %macro extractJobCode(infile=, outfile=, debug=0);  
  3.     %local/readonly DQ='22'x;  
  4.     %local/readonly BSL='5c'x;  
  5.     %local/readonly BS='08'x;  
  6.     %local/readonly FF='0c'x;  
  7.     %local/readonly NL='0a'x;  
  8.     %local/readonly CR='0d'x;  
  9.     %local/readonly TB='09'x;  
  10.     %local/readonly SP='20'x;  
  11.   
  12.     data _NULL_;  
  13.         attrib filein length=8 label='input file id';  
  14.         attrib fileid length=8 label='output file id';  
  15.         attrib stat length=8 label='State of lexical analysis';  
  16.         attrib token length=$256 label='Token';  
  17.         attrib ucode length=$4 label='Unicode';  
  18.         attrib count length=8;  
  19.   
  20.         /* Open input/output files */  
  21.         filein=fopen("&infile" , 'I'1'B');  
  22.         fileid=fopen("&outfile", 'O'1'B');  
  23.         count=0;  
  24.         stat=0;  
  25.         rec=&SP;  
  26.   
  27.         do while(fread(filein)=0);  
  28.             rc=fget(filein, rec, 1);  
  29.   
  30.             %if &debug=1 %then  
  31.                 %do;  
  32.   
  33.                     if count < 512 then  
  34.                         put stat=rec=token=;  
  35.                     count=count + 1;  
  36.                 %end;  
  37.   
  38.             if stat eq 0 and rec eq &DQ then  
  39.                 stat=1;  
  40.             else if stat eq 1 then  
  41.                 do;  
  42.   
  43.                     if rec eq &DQ then  
  44.                         do;  
  45.   
  46.                             /* Double quotes */  
  47.                             if token eq 'code' then  
  48.                                 stat=2;  
  49.                             else  
  50.                                 stat=0;  
  51.                             token='';  
  52.                         end;  
  53.                     else  
  54.                         do;  
  55.                             token=catt(token, rec);  
  56.                             stat=1;  
  57.                         end;  
  58.                 end;  
  59.             else if stat eq 2 then  
  60.                 do;  
  61.   
  62.                     if rec in (&SP, &TB, &NL) then  
  63.                         stat=2;  
  64.                     else if rec eq ':' then  
  65.                         stat=3;  
  66.                     else  
  67.                         stat=0;  
  68.                 end;  
  69.             else if stat eq 3 then  
  70.                 do;  
  71.   
  72.                     if rec in (&SP, &TB, &NL) then  
  73.                         stat=3;  
  74.                     else if rec eq &DQ then  
  75.                         stat=4;  
  76.                     else  
  77.                         stat=0;  
  78.                 end;  
  79.             else if stat eq 4 then  
  80.                 do;  
  81.   
  82.                     if rec eq &DQ then  
  83.                         stat=0;  
  84.                     else if rec eq &BSL then  
  85.                         stat=5;  
  86.                     else  
  87.                         do;  
  88.                             rc=fput(fileid, rec);  
  89.                             rc=fwrite(fileid);  
  90.                         end;  
  91.                 end;  
  92.             else if stat eq 5 then  
  93.                 do;  
  94.   
  95.                     /* Handling of backslash-escaped characters */  
  96.                     if rec eq 'b' then  
  97.                         do;  
  98.                             rc=fput(fileid, &BS);  
  99.                             rc=fwrite(fileid);  
  100.                             stat=4;  
  101.                         end;  
  102.                     else if rec eq &DQ then  
  103.                         do;  
  104.                             rc=fput(fileid, &DQ);  
  105.                             rc=fwrite(fileid);  
  106.                             stat=4;  
  107.                         end;  
  108.                     else if rec eq &BSL then  
  109.                         do;  
  110.                             rc=fput(fileid, &BSL);  
  111.                             rc=fwrite(fileid);  
  112.                             stat=4;  
  113.                         end;  
  114.                     else if rec eq 'f' then  
  115.                         do;  
  116.                             rc=fput(fileid, &FF);  
  117.                             rc=fwrite(fileid);  
  118.                             stat=4;  
  119.                         end;  
  120.                     else if rec eq 'n' then  
  121.                         do;  
  122.                             rc=fput(fileid, &NL);  
  123.                             rc=fwrite(fileid);  
  124.                             stat=4;  
  125.                         end;  
  126.                     else if rec eq 'r' then  
  127.                         do;  
  128.                             rc=fput(fileid, &CR);  
  129.                             rc=fwrite(fileid);  
  130.                             stat=4;  
  131.                         end;  
  132.                     else if rec eq 't' then  
  133.                         do;  
  134.                             rc=fput(fileid, &TB);  
  135.                             rc=fwrite(fileid);  
  136.                             stat=4;  
  137.                         end;  
  138.                     else if rec eq 'u' then  
  139.                         do;  
  140.                             ucode='';  
  141.                             do i=1 to 4;  
  142.                                 rc=fread(filein);  
  143.                                 rc=fget(filein, rec, 1);  
  144.                                 ucode=catt(ucode, rec);  
  145.                             end;  
  146.                             if ucode eq '0026' then  
  147.                                 do;  
  148.                                     rc=fput(fileid, '&');  
  149.                                     rc=fwrite(fileid);  
  150.                                 end;  
  151.                             else if ucode eq '003c' then  
  152.                                 do;  
  153.                                     rc=fput(fileid, '<');  
  154.                                     rc=fwrite(fileid);  
  155.                                 end;  
  156.                             else if ucode eq '003e' then  
  157.                                 do;  
  158.                                     rc=fput(fileid, '>');  
  159.                                     rc=fwrite(fileid);  
  160.                                 end;  
  161.                             else  
  162.                                 do;  
  163.                                     rc=fput(fileid, &BSL);  
  164.                                     rc=fput(fileid, 'u');  
  165.                                     rc=fput(fileid, ucode);  
  166.                                     rc=fwrite(fileid);  
  167.                                 end;  
  168.                             stat=4;  
  169.                         end;  
  170.                 end;  
  171.         end;  
  172.   
  173.         /* Close input/output files */  
  174.         rc=fclose(filein);  
  175.         rc=fclose(fileid);  
  176.     run;  
  177.   
  178. %mend;