The Nameless City

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

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

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


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

にんげんにやさしい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を運用時に使うのなら考えていいと思うんだが。

すみません。

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

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

及び

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

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


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


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


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

用語の曖昧さは曖昧さを理解して使うといい。

「ん?なんでそれ間違えたの?」という用語ミスのトラブルを見かけたのですが。
具体的な単語を書くと宜しくないので止めときますけど。


専門用語というよりは、業界用語ですね。私化学工学出身なので、この手の単語には接したことがあります。
そうですねえ、例えばバルクとか。界面制御工学出身なので、このバルクってのは、表面から離れた溶液のことなのですが、そんなの業界触った人にしかわかりません。
分かりませんが、bulkという元の言葉の意味を考えましょう。英語の辞書に書かれている日本語の意味は、本来「bulk」という単語に与えられる大体一つの意味であり、それを色々な言葉で言い換えているだけです。なので、「なんかかさ高いもの」というくらいの認識がいいです。
このバルクという言葉は、バルク品、みたいな言い方で使われることもあります。バルク品という言葉の指すものは、量産されてブランドとされていない品質マチマチな何かを指す言葉です。バッタ品と、モノとしては出自は似てますが、意味合いは違います。


発生原因はなんとなく分かりますが、その用語は意味から広範囲で使われがちな用語で、場面場面においては別の概念を示しやすいものなので、もう使われている限り確認が必要な用語なんですよねえ・・・・・
そういう場合には、対概念含めてはっきりしているか、確認した方がいいです。

UNIVARIATEプロシージャとMEANSプロシージャとSUMMARYプロシージャの使い分けについて少し。

これらはほとんど変わらない、とSAS V6のマニュアルを見ても書いていた記憶が・・・・・・

SAS日本語オンラインマニュアルの、「Base SAS 9.4 プロシジャガイド」に載っているリスト(p.2079)とかが便利です。統計プロシージャのガイドでないところが何というか残念なところなのですが。親切なヘルプやテキストがあるのにもかかわらず、探し出すのが一苦労というのがSASのヘルプの良くないところです。いやマジで。


あとは、帳票とかを触っている人には、proc means/proc summaryと、proc univariateはちょっと違うというか、proc univariateは数値データを取り扱うのにはイケるけど、文字変数を使うのにはちょっと使いづらいとか、経験的にproc means/summaryを使う事が多いかもです。
proc meansの方が、出力に関してのオプションが若干多いか?
しかし、preloadfmtもclassdataもあまり普及していないんだなと、今の会社になって思いました。まあ、SASフォーマットを駆使するとかだと分かりやすい設計にはなりにくいかもです。
SASフォーマットを使って、いわゆるマスタテーブルに存在しないコードが入っているかのチェックなんかは結構便利なのですが。大抵のマスタテーブル使うロジックはSASフォーマットを使う事が出来たりします。マスタテーブルからフォーマットを作成し、OTHERの際に「ERROR!!!」のラベルをつけておくと、vformatで出した段階でエラーになるのは検知可能ですし。ただ、SASフォーマットの使い方は、マクロ以上にあんまり深く掘り下げられない傾向があるのでまあ無視していいとは思います。

特殊欠損値の扱いについて少し。

sas-tumesas.blogspot.com
を見て。

特殊欠損値は、気がつく人は気がつく、知らない人は知らないし分かりづらいのであんまり使う事はないのですが。
以下サンプル。

data _NULL_ ;
  a = .M ;
  put a ;
  if a^=. then put '特殊欠損値は通常の欠損値とは異なります' ;
  if missing(a) then put '関数を使うと特殊欠損値も欠損値として扱えます' ;
run ;
1    data _NULL_ ;
2      a = .M ;
3      put a ;
4      if a^=. then put '特殊欠損値は通常の欠損値とは異なります' ;
5      if missing(a) then put '関数を使うと特殊欠損値も欠損値として扱えます' ;
6    run ;

M
特殊欠損値は通常の欠損値とは異なります
関数を使うと特殊欠損値も欠損値として扱えます
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.07 秒
      CPU時間            0.00 秒

なお、どっかに書いたような気もするけど、SASが統計プロシージャ内で使っている事もあるので、念の為知っておいた方がいいかもです。
「._」は文字としては表示しない、「.I」が「Infinity」、「.M」が「-Infinity」という形でANOVAのTemplate(SASHELP.TMPLSTAT.STAT.GLM.ANOVAとか)に記載されています。
ODS OUTPUTで統計結果を拾ってる場合には値としてこれらの特殊欠損値が出て来るかもという事です。

独自のエラーをログに書く際に考える事。

SASが標準で作成するログのパターンに合わせるかどうか

「ERROR:...」「WARNING:」「NOTE:」みたいなのに合わせるかどうか。
あと、SYSERR等を取り扱うかどうか。


SAS DMSの中で色が違うだけでいい、というのであれば、ログにputステートメント等で「ERROR:...」と書くだけでいいです。
システム的にエラーコードを吐かせたいのであれば、abortステートメントでretern入れるとかが必要になってきます。この辺りは、SASをバッチ実行的に組み込む時には必要な知識になるのですが、普段遣いであれば、abortとかを使わない方が幸せかも。


で、よくよく考えると、「システムが出しているERRORやWARNINGと合わせるのは有用か?」という事は考えておいた方がいいかとも思います。
目立たせる方法は一通りではないので。

ABORTステートメントは、SAS.EXEのプロセスに影響を及ぼします。

何も引数をつけないABORTなら、単にデータステップを止めSASエラーを発生させるだけだったかなと。
ただ、RETURNであるとかABENDであるとかをつけると、SAS DMSだとプロセスが終了する憂き目を味わう事になります。


バッチモードとSAS DMSのモードでは挙動が異なる事もあって、開発もかなり面倒です。
サーバSASとかSAS Studioとかでは避けた方がいいと思います。ログが表示される事なく死んだりします。
そうでなくとも、SASはエラーを上手くハンドリングする事が出来ません。SYNTAXCHECK、DMSSYNCHK等のオプションで、SASエラーにあった場合の挙動を変更する事は出来るのですが。
代わりと言ってはなんですが、データ操作中の例えば0除算だったりしても、結果が0除算で欠損値になるというだけで、エラーは発生しづらいです。

実行プログラムの中で「ERROR:」を直接書かないでログに「ERROR:」を出す話。

小ネタですが。

data _NULL_ ;
  putlog 'ERROR' ':' 'エラーです' ;
run ;

と、「ERROR」と「:」をプログラム内では分割しておくと、検索とかで変に引っかからずに済みます。DI StudioだったかCSTだったかのマクロでこんな事やってるの見かけた記憶があります。

SAS on Linuxで気をつける事。

SASLinux版もありますが。
というか、SASってWindows版後から出してた印象なので、むしろWindows対応に四苦八苦してた気が。

どのLinuxでも載るという訳ではありません。

ええと、SAS Analytics UだったかはVM入れさせるのであんまり関係ないのですが、素でLinux版を入れる場合には気をつけてください。
RPM使うやつしか対応してません。公式には、RHELOracle LinuxSUSEのEnterprise版だったかと思います。
CENT OSは試しに入れられるのを確認した事はありますが、Scientific Linuxとかはやってない。OpenSUSEは試した。
何が違うって、ライブラリの名前とかが変わったり、インストール時にOSチェックしているところでコケました。
Linux版では幾つか先に入れとくべきモジュールがありますのでインストールマニュアル読んだ方がいいです。フォントの仕込み方も書いてあったけどあれはインストール後のマニュアルに書いてあったような。
53997 - Prerequisites for installing SAS® 9.4 on Red Hat Enterprise Linux 7


なお、RHEL7はサポートが2024年までなので長めです。
けど、Fedoraから見ると五年前の基盤なのよね・・・・・・

SAS DMSのLinux版は、UTF-8対応していません。

というのがログに出ます。
GUI部分がおかしくなるのだろうと思います。エンジンは対応しているので。
Linux版でDMS使う方が稀だと思いますが、念の為。
出力の為に別途クライアント側にその手のサーバを立ててとかあった気がするけど、RHELに入れた時にはサーバに立ててXで引っ張れるように仕込んだ記憶が。

けどSASソリューション製品を使うのであれば、UTF-8推奨です。

SASのメッセージがS-JISなのをソリューション側に引っ張る時に文字コード変換してくれてないケースがあるようです。
バグだと思うんですが、そもそもSASソリューションはデバッグできるIDEというものではちょっとないので(SAS DMSでもマクロのミスで治らない場合には強制再起動だったりしますが、SASソリューションも裏ではsasのプロセスが生きているWorkspace Serverで動いてます)、大変悩ましいなあとは。
ローカルSASで開発して本番はサーバ上で、というやり方はしばしば見かけました。今だとブラウザ上で実装されていてもソコソコの速度で動くとは思うのですが、モダンブラウザじゃないとHTML5とかWebAssemb

SAS StudioかSAS EGか。

認証機構が実はちょっと違うし、使うポートも変わるので。
ただ、SASプログラムで構築したい、というのであれば、SAS Studioがあるのならそちらでいいかと思います。
SAS EGは、ちょっと癖のあるGUIで統計やりたいとかの人向けです。SASプログラムも書けますが、面倒。プログラム実行順序とかを別途定義する必要もあったりしますので、システム開発者にはいいかもですが。

templateの保存場所には気をつけて。

同一ユーザでマルチでセッション貼った場合、SASUSERフォルダが厄介です。Windowsだとプロファイル読めないとかって警告が出たかと思いますが、サーバ環境だとちょっと違うオプションがあったりして、使えはするが書き込めないとかも発生する可能性があります。
ODSのPATHを変える事で、スタイルのテンプレートとかをWORKライブラリにする事は出来、また、RSASUSERオプションで起動時からSASUSERフォルダを読み込み専用にするという事は出来ます。こういう場合、templkateの永続化が勝手には為されないので、注意が必要です。
まあ、「むしろ勝手に保存されているに気付かずツラい」みたいな話の方があるかもですが・・・・・・

Windowsで自動ログオンを可能にする方法として、Autologin.exeを利用する。

タスクスケジューラーで自動的に何らかのプログラムを動かし、例えば毎日一回は何かを実行する、というのは大変よくやると思うが、タスクスケジューラーで実行しづらいものはあり、例えばデスクトップセッションで画面を必要とするようなものは、実行出来ない。

それに対しては、Windowsの機能で、「起動時に自動ログインする」という機能を有効にすると上手く出来る。
電源が入って起動し、保存されたIDとパスワードでマシンにログオンしておいてくれるという機能だが、つまりは電源入れると自動でログオンされてしまうので、セキュリティ的に問題がある。コマンドで画面ロック等をすると良いかと思う。


Autologon.exeがMSのサイトからダウンロード出来る。
technet.microsoft.com
パスワードは暗号化されるらしい。
参考:Windowsでシステムに自動ログオンする(Autologonツール編):Tech TIPS - @IT


通常の端末であれば、モニターに内容がそのまま見えてしまうので問題があるのだが、例えばVMの場合、物理モニターにダラダラ表示される訳ではない為、特に問題ない可能性は高い。
ただ、かなり気持ち悪い動きはする事になるかと思う。

Vivaldi 2.0 on Fedora 28について少し。

Vivaldi 2.0にしたついでに、寝ながら使うFedoraマシンのブラウザを完全にVivaldi一本でやる試み。

Vivaldiって何

Chromiumベースのブラウザで、色々カスタマイズして使いたい人向けのブラウザ。
ステータスバーやペイン表示がデフォルトで設定可能。設定項目もかなり使いやすいように、そう人向けのブラウザとして開発されている。
Chromiumがベースなので、Chrome拡張も使える。ただ、今までパスワードや設定のSyncがなかったが2.0で導入された。本格的に使えるようになった。
なお、個人的に使いやすいと思っているのは、ブックマークの使い勝手・設定のカスタマイズのやりやすさ、タブブラウズのやりやすさ、あとスクリーンショットが簡単に取れたりする所です。


ただ、Adobe Flashが同梱されていない為別途インストールする必要があったり、DRM保護機能のあるビデオの場合に苦労したりする。

Adobe Flashをインストールする

PPAPI版のAdobe Flashをインストールする必要がある。Flashサイトからダウンロード出来る(今はブラウザ自動検出で対象のFlashをダウンロード出来る・Repoの情報も取ってくるのでアップデートは以降普通にdnf updateで出来る)

Flashの日本語文字化け対応

Windows版では問題にならないと思うが、Linuxの場合ロケールが日本であっても何故か中華フォントであるuming.ttcが使われるのでVLゴシックのフォントで置き換える(まあ使わないし)※ただ、Fedoraのバージョンアップで元に戻ったりするかと思うので注意。

SASのエディタとしては、今はVS Codeかなと思っている。

namelesscity.hatenadiary.com
あれから使いながら、結局Atom EditorからVS Codeに引っ越した。


理由としては、
「会社のプロキシ超えするのにAtom Editorでハマリが多すぎる」
から。
ユーザIDやパスワードの特殊文字の調査とかもダルい。
VS CodeWindows版でもその設定はChromeと同様に使える。
参考:
Visual Studio Codeが1.15版で認証プロキシに対応していた


開発も、Git的に「ファイルサーバから複写して、開発、その後にリモートにプッシュ」という形をしたいのだが。
そういうフォルダ構造で管理すると結構捗る。フォルダ毎にVS Code用の設定が出来る。
ただなー、今共用サーバなんだよね。


他。
Linter拡張はない。Linterってのは、文法チェックを行う仕掛けなのだけど。
ほしいなあ。
そもそもSASのプロセス起動がかなり重い処理であるので、これをなんとかしないとLinter使うたびにSASプロセス起動してたのでは話にならない。
SAS Integration Technologiesの中では、セッションと対になる形でサーバ上ではSASプロセスが起動しっぱなしになるが、実行の度にプロセス落としていたら遅いというのも理由にはある。本当はサーバ上に適当に起動されたSASプロセスが複数あって、ユーザからのリクエストに対して適当にバランスしてくれればいいのだけどそういう作りにはなってないのよな。Viyaではそれが変わるのかしらん(マイクロサービスとか言っているからなあ)


参考として
http://www.sas.com/offices/asiapacific/japan/service/help/pdf/v94/hostwin.pdf
のp.197くらいからパフォーマンスの事が記載されている。ただ、MEMLIBも、軽量プロセス化を想定しているものではないとは思うので、起動がそこまで軽くはならなさそうだしなあ・・・・・・まあ、メモリ上に仮想ドライブを設定するという古の技を用いれば速くはなるが。
LinterはSASが出してほしいんだよなあ。syntaxcheckモードみたいなものだけど・・・・・・あれの有効活用出来ないものかな。
LintネタはSASの発表とかではある。
https://www.sas.com/content/dam/SAS/support/en/sas-global-forum-proceedings/2018/2543-2018.pdf