The Nameless City

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

なんか聞きたければ、聞いて下さい。

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


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

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

Central Statistical Monitoringという話題を聞いて考えた事。

それ、逸脱チェックみたいな話になっていくのかな?
という感想。


時代が進まねえ・・・・・・


論理チェックとかかなり軽量化していったのを経験した身としては、そんな金とリスクのトレードオフに合わせて適当にさじ加減変わるなら、そのように要件早めに出しておいてほしいものだと思います。

なんかすみませんね。

SASユーザー総会にて。
社内の人に挨拶をするだけのつもりが、いきなりだったのでちょっとビックリしました。


流石にブログ名音声で呼ばれるのはなあ。いやつけたのは自分ですが。

IronPythonとPython .NETでハマった。

IronPythonWindows 7にインストールしたらVisual Studio Codeで食わせるのにハマった。
こちらは標準のPythonPython .NETを食わせることで回避。完全互換ではないようですが。


Python .NET(pythononnet)をFedoraに入れてみようとしたら、Monoとの連携にハマった。


Atom EditorもどうもProxy超えがしんどいし、Visual Studio CodeChromiumベースなのでWin/Linuxどっちでもいける。


.NET Framework Coreもmonoも案外安定しない。Spotfireの事がなければIronPythonとか考えたかないからなあ・・・・・・なんで今Python2系なのか。
JupyterNotebookとか使ってみてえ。

Spotfireで使えるPythonの話へのリンク

spotfiremaniacs.net
余談ながら、「StreamBaseとH2O連携 | Spotfireで学ぶデータサイエンス超入門
がIoTとかには必要になってくるやつなので興味深いです(が、どこまで使えるかは分からないです触ってないので)


何が出来て何が出来ないという範囲を探したのですが日本語ソースはなかったので。リンクを張っておきます。
community.tibco.com

Limitationの話。
community.tibco.com

Limitations
Scripts are executed in isolation from the rest of the running Spotfire code. This is to ensure that faulty scripts cannot crash the running client and also provide security to avoid malicious scripts. To provide further security, scripts must also be trusted before they are used. Spotfire use a undo/redo system to give the user the option to revert the changes done after the script has executed.

https://community.tibco.com/wiki/how-develop-ironpython-scripts-tibco-spotfirer-and-their-limitations#toc-4

これはLimitationなのかとちょっとわからなくなるんですが。


Spotfire 7.6のAPIリファレンス(英語)
TIBCO Spotfire 7.6 API Reference - Table of Content
Spotfire 7.13のAPIリファレンス(英語)
TIBCO Spotfire 7.13 API Reference - Table of Content

Excelから出てきたようなCSVを、途中の改行を別フレーズに置き換えるサンプル。

こんなの。

filename _IN  ... ;
filename _OUT ... ;

data _NULL_ ;
  length TEXT $32767. ;
  infile _IN lrecl=32767 dlm='1a'x;
  input TEXT ;
  file _OUT lrecl=32767 dlm='1a'x;
  length NUM_DQ FLG_DQ 8. ;
  retain FLG_DQ ;
  if _N_ = 1 then FLG_DQ = 0 ;
  NUM_DQ=klength(TEXT)-klength(transtrn(TEXT,"""",trimn(""))) ;
  FLG_DQ = mod(NUM_DQ+FLG_DQ,2) ;
  if FLG_DQ=0 then put TEXT ;
  else do ;
    put TEXT +(-1) "<LF>" @@ ;
  end ;
run ;

補足

文字コード'1a'xは、まずレコードの区切り文字としては使われない文字コードを変数区切り文字に設定したということ。
置換文字 - Wikipediaとか参照。
結構End Of Fileのマークとして使われることがあります。
SASは改行の文字コードをあんまり配慮してくれないので、別レコードになることがあるけど、二重引用符の数を認識して取り込むという感じです。

SSL対応しました。そして、Symantecの証明書サービスが別会社に移る際の問題。

はてなブログSSL対応をしました。
無料版でありはてなドメインなのでLet's Encrypt対応です。


Symantec絡みの事で、製薬企業のサイトで見えなくなりそうなサイトが・・・・・・大丈夫でしょうかね。
シマンテックの SSL/TLS サーバ証明書の入れ替えについて | DigiCert & Symantec
Symantecの事業はDigicertに移管されますが、元々審査が甘いという事で証明書発行プロセスが疑われた事が発端なので、そのうち殺されざるを得ないとは思います。

簡易チェックツールいるなあ。。。。。

Pinnacle 21ほどのチェックはいらないんだけど、単純にnullがあるとか、全部nullとか、データセットの素性を明らかにするようなチェックツールがいるなあと。
Enterprise Guideで一変数要約統計みたいなのが簡単に出せたような記憶があるけど、怪しい文字変数内のドット検出とかもあった方が良く。