The Nameless City

何故か製薬やSAS関連のブログ、の予定。

<del>なんか聞きたければ、聞いて下さい。</del>用事無くても書き込んでええんやで。

トランスエンコーディングのページにPVが集まるので、なんか探られてるなーと思ってますが。


こちらで聞いて頂く分には、分かる範囲で特に明確な期限ないですが、回答しますので(質問・回答は公表しますので、不幸が起こらない形で問い合わせていただければ)、適当に掲示板使って下さい。このエントリのとか。
あと、何もなくても書いておいてもらうと。

最近のExcelだと、インストールのされ方が変わっているので、ちゃんとドライバ入っているか確認しなおした方がいいよーという話。

最近のOffice製品は、インストールの仕方が変わっていて、C2R形式になっている。
この場合、Excel周りのドライバがインストールされなかったりするので注意が必要だ。

ACEドライバ入ってないんじゃないかね?

Access ODBC ドライバーまたは OLEDB プロバイダーを Office クイック実行の外部で使用することはできません | Microsoft Docs

ちょっと前にMSDNブログでも出てたと思うんだが、C2R形式だと、他のアプリとの関係性をあんまり壊さずにインストール出来る反面、今までのようにセットで入っていたドライバが別途入れなければいけない。特に他のアプリで利用する場合に影響がある。

Spotfireとか。SASとか。

え、グローバルIP持ってんの?

あまり気にしていなかったけど、IPアドレスグローバルIP振られてるわ色々。
https://ja.wikipedia.org/wiki/IPアドレス#プライベートIPアドレス

クラス 範囲 サブネットマスク アドレス数
クラスA 10.0.0.0 - 10.255.255.255 255.0.0.0 16,777,216 (16,777,216 × 1 subnet)
クラスB × 16 172.16.0.0 - 172.31.255.255 255.240.0.0 1,048,576 (65,536 × 16 subnet)
クラスC × 256 192.168.0.0 - 192.168.255.255 255.255.0.0 65,536 (256 × 256 subnet)


ここの範囲にない場合には、グローバルIPだと(基本的には)。もちろん、社外からアクセス出来るかというと、LANの入り口でブロックはされてんだけどさ。
昔の会社はクラスAのプライベートIPアドレス使われてて、当然ながらグローバルIPを振るのは別途という感じだった。SSL-VPNも、192.168.0.xが振られるタイプで、それに合わせて家のサブネットマスク変更した記憶がある。
うーん、いやー、マジでかー。

Pinnacle 21 Community 3.0.2は認証つきProxyを通らないらしい。

www.pinnacle21.com

Proxy Aware - configuration
In trying to eliminate the internet connection error report we've been working with our network teams. It has been determined that the application is not proxy aware (ie the traffic cannot be pushed to the proxy server to gain access to the required aws hosted services). The traffic is treated as a normal traffic and the site is blocked based on the site. Unfortunately for larger organizations there is not a manageable solution to allow this type of traffic on normal internet gateways and this must be managed by connecting via a proxy server. Can you provide instructions or an eta for an application update to allow P21 Community become proxy aware.

アプリケーションがProxy対応してないってさ。


Electron使っているから、VS CODEみたいな事は出来るはずとは思うけど、案外社内からの認証つきProxyに対応していない事はある。
Atom EditorはProxy SettingはあらかじめユーザIDとパスワードを設定させる方式だった。流石に同じElectronでもMS Teamsとかはプロキシには対応がっちりしているけどね。


あまりピンと来ない人に経緯含め説明。
現在、大抵の会社では、HTTP通信にプロキシサーバを介する想定だ。また、社内のDNSサーバは外部のDNSサーバを見ておらず(無論逆も)、外部のサーバにはそのプロキシを無視して外部の通信は出来ないようになっている。このプロキシの利用は、認証が必要である。


今、プロキシ等のネットワーク設定に関しては、どのブラウザでもWindowsの設定となるネットワーク関係のものを使って通信している。どの、というと言い過ぎか。Firefoxはたしか個別に設定する事が出来る。
ただ、本来は、アプリケーション毎に設定するようなものだったんだよねプロキシ設定って。その設定を見て、ブラウザがリクエストをプロキシに投げてプロキシが外部サーバと通信して返すという流れ。そんな設定を個々にするのが面倒およびトラブルの元でもあるので、OSの設定に近付けられているというのが本当のところ。
なお、通信とされるもののなんでもがプロキシを通るという訳ではない。アプリケーションがそれを見ない場合には、DNSサーバにどこのIPかを問い合わせてIPを取得して、そのIPに対して通信を行うんだが、DNSサーバが「そんな名前知らない」で返すとかが普通。


で。
アプリのアップデーターと呼ばれるものは(アプリ本体とは別のものになる)、アップデートがあったかどうかを外部と通信して、あれば通知ダイアログを出して、OKが押されればアプリを止めて、対象のアプリの最新版を一旦ダウンロードして、元ファイル削除&ダウンロードファイルの移動をして、アレだったらアプリを起動する。
このアップデーターの通信は、最近はほぼhttps経由だ。なんだけど、Proxy設定を見に行かないアプリもあるんだわなこれが。


対応方法は、リバースプロキシ設定するとかがあるんだが、そこまですると大変なのと、じゃあ誰の認証使うのさという話が発生するので、どうしたもんかねえとは。

今のうちにやっておきたい事

SpotfireのR使うやり方を一通りやっておきたいなあ。

Spotfireのテーブル→R→Spotfireのテーブルみたいな事は出来るとは思うので、Rの帳票がそのまんま使えなくても描画はどうにかなると思うし(特殊な作図を要するもの以外は)、早いことやっときたいなあと。
信頼曲線とカプランマイヤーが引ければ結構いける気がする。


あと、Rのbiostat関連をSpotfireに突っ込めたら、わりと色々使える気がする。

SASデータセット加工用ETLツールの基礎構築とか。

色々みんなどうテンプレ化するか考えているのだけど、SDTMはそろそろ変数のメタ定義もはっきりしてきたのでこれはしときたい。
んだけど、次のやつとどっちが先に考えておいた方がいいかちょっと考える。

SDTMの実体のモデル構築

どうにもSDTMのデータの持ち方が非効率な気がしている。
連長圧縮だけでもだいぶ圧縮されるデータで、STUDYIDが一体どれだけ無駄に容量食ってるか考えるとなあ。

  • 使い回されるデータが多い
  • Pinnacleのチェックでも無駄にかかってる

なんか考えるとちょっとなあ・・・・・・Study Data Tabulation Modelなのだから、実際のEntityとは違うので、どうにかならんかなと思っている。
I/Oの問題もあるが、SASだとViewがイマイチ。SDTMのファイル転送のタイミングでも発生するんだが、結局、フォルダ→ライブラリの定義が相対的には出来ないので持ち運びに苦労しちゃうんだよねえ。

社内の自己評価の度に思う事。

職務経歴書を書くのは楽しいが、社内評価の度にコミュニケーションとか問われるのが、性格に全くあってないので面倒だなあ。


そんなアッパー系の人種じゃないしなあ。

MFILEが使えそうな。

最近はSASのKnowledgeが溜まらんなあという。

MFILEオプション

MPRINTの内容をファイル出力出来る機能。
これを使うとマクロ展開後のソースが出力されるので便利だ。

これってSASマクロで実際には組んでおくけど、マクロの検証が完了しない状況でも作成されたプログラムの一本単位での検証は楽かもしれぬ。

SASプログラム生成の工程において、CSVを強要される(が進まない)ところでかなり有効かもしれん。とりあえずダブルプログラミングでの、試験単位での検証しか動かなさげな場合には。


マクロのシステムテストによる検証は、意外と困難なところがあり、パラメータに何入れてもちゃんと動く、みたいな検証ってかなり難しいからなあ・・・・・

PDF1.4って。

Adobe Acrobatno5とか相当古い規約に思えるだろうけど、これ、PDF/A規約に近いものになっていると思ってほしい。
PDF/A - Wikipedia

Adobe Acrobatでは拡張仕様なんかがあるが、そういうのは使わないようにする必要がある。

にんげんにやさしいEDCないものか。

うーんマジでR○ve面倒臭いのだけど、どうにもCSVとかロールとかで、複雑に組めてしまうのが大きい。


会社ごとにカスタマイズする意味ってほぼないよね。製薬企業が内製するなら別だけど、個別カスタマイズするくらいなら制限かけた上でやれた方がいいし、運用中のトラブルシューティング用の形をもう少しちゃんと準備しておいてほしいしなあ。


フォルダ・フォームの概念も、SDTMや人間の頭で考えるデータ収集のイメージともあってないし。インジケーターの機能が貧弱だし。


うーん。

SASのプログラムを書く上で、他のアプリやシステムと連携してる所で結構考えておくといいネタいくつか。

UnicodeUTF-16とか

Windowsの昔のツールだとUnicodeと呼ばれていた文字コードは、UTF-16だったりする。LEかBEかはBOMでわかるのだが、WindowsUTF-16 LEのような形で保存していたりする。
UTF-8ではないので一応注意。

UnicodeにもBOMがあることが。

こちらはあってもあまり気にされていないかもだが、データを素で取り込もうとすると困った事になったりするので注意。

パスの扱いについて少し。

Windowsのファイルパスは実の所、UTF-16なんであるけども、シェル等を介する場合にUnicodeをうまく認識出来ないケースがある。わざわざShift-JISに変換して取り込もうとしたりする。
現在SASS-JISで使われているケースが多いとは思うが、海外ではあまり遭遇しない事例でもあり、注意。
なお、zipファイルのアーカイバも文字エンコーディングに対応していないのがある。MacとWin間で化けるのがそれのせい。

SASからシェルを呼び出したりDDEを呼び出したりするのの限界について。

SASは生でインストールしている場合にXCMDが有効化されているのだが、例えばSAS Analytics UとかはNOXCMDのはず。
有効化されているとPIPEとかでコマンドの結果を得られたりするのだが、セキュリティ上の問題から生のディレクトリを参照出来たりしないよう殺されている。
よくよく考えれば当たり前の話なのであるが、子プロセス立ち上げられるのは良くないので、使わないに越した事はない。

なお、DDEを悪用してのExploitが出ていて、セキュリティ上問題があるなという認識がMSにもある。

XLSXエンジンについて

SAS/ACCESSS Intrerface to PC Filesでは、MSのエンジンを使ってEecelを読み書き出来るのだが、その場合にビット数の問題がよく発生していた。ビット数の違いで書き方変えなければいけないのもアレですし。
Excelをデータ格納場所として考えるなら、その縛りのないXLSXエンジンとか使うのも手。ただ、実際にはそんな事は期待出来ないんだけどね。
Excelを出力先として帳票出力、というのは、今後はあんまりやるべきではないと思っている。というか、SASからは何かのテンプレートに流し込む為のデータを作成し、帳票そのものの整形は別のツールでいいんじゃないかなと思うんだが。
SASのレイアウト作成ロジックはかなり気持ち悪いしコントロールが難しい。HTMLは帳票作成には向いていないし、XLSTとかはあんまり聞かんなあ。
結局、安定して今も使われているRTFがいいんだろうという事になっている・・・・・のだが、Tex復権があってもいいんじゃないかと個人的には思っている。いい加減、見た目とデータを分離してほしいんだ・・・・・・。

SASをDockerに入れたい

www.sas.com
ライセンス費用節約の為にあんまり意味のないSASサーバ接続をやめたいなと。
必要な時にDocker動かしてSAS実行させて、プログラムソースとかはgitで管理とかどうよ。
とか言っても、日本の会社のITってとにかくリソースが枯渇気味なので、こういう方向転換出来るのは何年後になるんだろうなあ。死ぬまでに変わるかしらん。

SASの欠損値

www.cresco.co.jp
見かけて、ふむふむと頷いていたのですが。

SASの欠損値の要諦

missing valueと英語表記されますが、RDBのNULLとは違う挙動をします。

  • NULLは型としてNULL型があるが、SASの場合には文字列型・数値型などの型を持ちます。
    • 結果として、欠損値は「値」です。
      • 「値」なので比較出来ます。その際には、マイナス無限大のように振る舞います。
      • なおSASでは文字列も一般的なプログラム言語と同様に比較演算可能です。
    • 数値型には特殊欠損値というものがあります。
      • ODSデータセットとかでぶっこ抜く場合にたまに遭遇しますが、印字の所でしか出会った事はないです。
      • その時々の定義でこう使う、というのを決めて使うもので、あんま気にしないでいいです。
    • 文字型の欠損値は半角空白です。
      • なおSASでの取扱では、定義長未満の文字列を格納する際に、後ろ側に半角スペース(0x20)が埋められます。

数値欠損値を文字に暗黙のキャストを行うと、「.」が文字として出てきます。
これが結構タチが悪いので、共通のマクロなんかではちゃんと出てこないように制御した方がいいです。

SASの論理演算の要諦

SASの論理演算は、数値の結果を返します。
FALSE→ 0
TRUE → 1
また、RDBの論理演算と異なり、NULLは扱わないです。
なお、数値を論理にキャストする場合には、
0または欠損値→FALSE
上記以外→TRUE
です。

WHEREステートメントSQLの中では使えるが外では使えぬ「is not null」

missing関数使うといいです。

余談

他言語のNULLと違う!という話とかはよく聞くしまあそういう説明もするのですが、実の所、他言語でも別に統一されている訳ではないのでなんとも言い難いのがNULLです。

COMPAREプロシージャ使い方(ダブルプログラミング用)

変数の数不一致を検出(しやすいように)

LISTVARオプションつける

計算誤差をスルーしたい場合

METHOD=ABSOLUTEとかにして、CRITERION=1E-12を設定する
※1E-12は取り決めであるけども大体これくらいの計算誤差は出る

差があったらERRORをログに出す

ERRORオプションをつける
SASログを見てERROR:が出てくるだけなのであんまり・・・・・・

見せ方を考える場合

OUT=オプションをつけてデータセットを出力する

キーマッチングさせたい場合

Uniqueキーを特定して、IDステートメントに並べる
BYステートメントでもいいが、LIST出力が汚い

やりたい事。

VSCodeSAS実行まで
これは現実的に可能だが、バッチ実行スタイルになる。
悔しいかな今のところはLinterは難しそうだ。

SAS実行高速化
memlibとか使えればもっと爆速になるはず、だが、メモリのクォータ問題もあり、難しそうだ。SAS実行プロセスをキューで扱えれば・・・・・・でもデバッグやりながら実行にゃ向かないか。


・実行環境のGit利用
svnじゃなくてGitとしたいが、この辺りは、今のファイルサーバー管理では無理かもな。実行環境をもっと小さくていいから複数持てれば有望なのだが。
そう言えばUNCパスがカレントディレクトリにならない問題はPowerShellで出来るんだっけ。でもSASプログラム内でそれ出来ないのは痛いよなあ。


・CI/CD
ダブルプログラミングではなく、設計テストの方へ。
SDTMが出て来て以降、一データセット一プログラムが蔓延しすぎていてこれが効率化のボトルネックになっている。
いやまあプログラムなんて大した時間かかっているわけではないけど、設計書がマッピング定義書になっているのはやはりお粗末であり、ファンクションレベルのマクロ、ではなくもっとデータセットの変数を構造化したプログラムを作る方が良い。
なんとかならんかな。


あと、開発環境とテスト環境、本番環境とか分けよう。その間はファイルをエクスプローラーでコピーする、のではなく自動化させよう。
m5フォルダに手で格納するのではなく、自動化出来るはず。
テストデータとテスト結果を持っていてガンガン回せるようにしよう。


手間なんだけど、今後SDTMを運用時に使うのなら考えていいと思うんだが。

すみません。

わざわざお声掛け頂いて大変申し訳ないのですが、

  • 英会話能力ない
  • 調整能力ない

及び

  • 技術営業の力ない
  • かなりのコミュニケーション下手

があって、多分ご希望通りの力はない、そう思っているところがあります。


もう一つは、まだ今の会社に引っ張られ、責務を果たせてないという忸怩たる思いがあり、大変申し訳ないのですが、お断りさせて頂きます。


って宣言しとかないとめっちゃグラつくのでここで宣言を。
いやホントに、見込んでいただけたのは大変有り難い事なので。あまりの眩しさにビビったのもあります。
この人生こういう機会は早々訪れるものではないんだけど、お断りした事を後悔している気持ちもありますが、まだ私は先輩の域に達していない、そういう気持ちもございます。


ああ、でも、色々製品触れるのはああ。
いや、未だに気持ちブレブレですね。
こんな人間にオファー出していただくだけで有り難いです。
ホントすみません。