The Nameless City

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

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

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


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

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で一変数要約統計みたいなのが簡単に出せたような記憶があるけど、怪しい文字変数内のドット検出とかもあった方が良く。

ほとんどのプロジェクト失敗の原因はコミュニケーション不足、とか言われるその先を考えてほしいなと。

愚痴っぽいメモ。
google:プロジェクト 失敗 コミュニケーション不足


失敗気味であればあるほどコミュニケーションは阻害される。コミュニケーション不足は擬似相関な要因で、兆しを見付けたらなにかがおかしいので別の所の故障原因を探すのが吉。
「コミュニケーションしろ!」と声掛けても飲み会開いてもあんまり上手くいかないよね。


誰かをワルモノにしない問題点とか対応策探しは大事。
酷ければ、もっと上の人をワルモノにするとかやりようは幾つかあるけど。
監査スキームはあまり上手くいかない事が多い。Audit Trailの作成作業が手作業ってのは良くない(リソース不足とかで作らされる事はあるが)。
チェックスキームを自動化して毎日ぶん回してダッシュボードで作業者が確認する、くらいがホントはいいよなあ。人間の脳内にタスクを置く意味あんまりあるとは思えず。


そういう事がやりやすい、一つのプラットフォームを何か準備しておきたい所で、それがRedmineのカスタマイズやなにかで回せるならいいけど、多分難しいだろうなあ。
GitHubとかで治験の作業をプロトコル単位で回したい。WordやExcelファイルに拘束されるのは良くない。

Windows PowerShellのイマイチイケてない所。

バージョンの差異が少なからずあり、Win7とWin10ではバージョンが違う。

最大の欠点がこれで、当面WindowsDOSコマンドから抜け出せないのもこのせい。
正直当てに出来ない。

未だにシェルの文字エンコードS-JIS

Winの、「表示はS-JISなんだが実際には裏はファイル名やファイルパスはUnicodeで~」という仕様がしんどい。
chcp65001でシェルを使おうとして、Unicode対応フォントが当てられないのも困る。

エイリアスが外部の実行ファイルとかぶる。DOSコマンドとの非互換性がきつい。

lsが使えるのになーという所が。
cdが/dを受け付けない。iexと打ったらエイリアスに蹴られる。

セキュアな仕掛けがシェルとしての利用を阻む事が・・・・・・

いやまー、パスワードとか埋め込めないのは正しいっちゃ正しいんですがね。

パスワードルール、変わっていくと良いんですが。

パスワードの定期変更推奨が無くなりました。総務省から。


当面は、Part11とかの影響引き摺るんでしょうが、今後は無くなりそうです。
その代わりと言ってはなんですが、ユーザーの管理はしっかりやってく必要あるでしょうね。

WinでのPython入れ。

Python入れる。

現行Py3系統の最新安定版は3.6.4。公式版、64bitを使う。
ただ、実際のところ32bit版が安牌な気がするが要調査。

Proxy通す。

会社内で使っているプロキシを通す、のだが、PACファイルでProxy設定しているパターンなので、それはそのままは使えず。
念の為いうと、PACファイルのはnetsh winhttpコマンドでも取れず。LinuxでもGNOMEのsettingで一部対応はしているけど、認証付きProxyにはうまく対応しないなど色々ある。
基本的にここ、pipの設定ファイルで設定してpipコマンドにだけproxyを~というところなのだろうけど、会社環境ではそもそもコマンドのパラメータにある--proxyでうまく設定できなかった。
なので、「UNIX系アプリで使われる古くからのProxyの設定方法」で試すと通った。

set HTTP_PROXY=http://<user>:<password>@<server>:<port>
set HTTPS_PROXY=http://<user>:<password>@<server>:<port>

なお、@は%40として対応。pipとかのproxyの設定で上手くいかないのは、このあたりの特殊文字の扱いのせいかも。
この設定は、アップデートなんかはWin/個人レベルという事で、環境変数としてもそちらで設定しておいた。サーバ再起動は不要。


なお、Linuxの場合、プロキシ設定がどんどん進化はしているので、環境に合わせて設定した方がいいと思うし、それが疲れると思うならpip.confとかのやり方をやるのがいいと思う。
このやり方は暫定的なやり方で、Winのプロキシ認証とかちゃんとお作法に則りたいところなんだけど、Pythonのインストールモジュールではそこまで考慮しないので、環境変数にハードコーディングしているような感じに。

pipアップグレードしておく。

実際には、「pip install pip --upgrade」としても、入ってますーとか言われて終わるかと思う。

wheel入れる

コンパイル済みのモジュールを入れる為。

numpy+mkl.whlをダウンロード。

これは何?

全部pythonで完結してりゃ楽なんだけど、実はそうはいかないという事がある。そこが、mklのところ。
Intel Math Kernel Libraryの簡単な言い方っぽい。x86x86-64AMD64)版があるがそれをインストールしてnumpyにそれ参照するように設定して~というやり方は今回せず、
https://www.lfd.uci.edu/~gohlke/pythonlibs/
からのnumpyに組み込んだpre-build版を使う。Intel Math Kernel Libraryのところからダウンロードするのが登録必要で面倒臭い為(フリーではあるけど)。pre-build版はUnofficialなので自己責任でどうぞ。

この入れ方について。

こちらはデータサイエンティストとデベロッパーのあいのこみたいなものなので、こんな感じで入れておく。
家ではFedoraだし。
Anacondaは、一人で一台みたいな状況であれば別に問題はないんだと思うけど、余計な環境変更を行う事があるらしく、トラブルの元にもなるようなので止めておく。

ダウンロードしたファイルを特定フォルダに入れて、pipでインストールする。ローカルのソースをインストール出来る。

他インストール。

numpy、scipy、wxPythonとか。djangoとか。
pyenvとかは今回はやってない。特に複数バージョン云々やらんつもりで。あと、pyenvはWinは無理だったそういや。

SAS開発環境に、Atom Editorを使うことのとりとめないメモ。

SASIDEと呼べるのは、SAS謹製しかない。

WDSとかは置いておいて。University Editionは商業利用出来ないし。
コードエディタとしてはSAS DMSの他、SAS Drug Developmentの~とかSAS Studioとかあるが、如何せんライセンスの問題もあるし、何より、SAS Intelligence Platformのサービスが立ってないと動かんものが多い。で、これは、起動前のクレデンシャルの問題とかをどうするか決めておく必要があるし(AD連携は可能なんだけど)、実行結果を貰う側がどうやって貰うかも考えておく必要があり、それも含めて今はSAS謹製のものを利用する以外はあんまり解がない状況ではある。


Eclipseプラグインとかは、AppDev Studioのライセンスにくっついて来た。あんまり深くは調べていないが、JavaからSASを呼べる・使えるというところで、多分これもSAS Intelligence Platformが必要だなあと。しかもJava用であり、SASをそのまま実行させる用ではない。。。。。。


結論としては、あくまでも他のアプリ使うのは、エディタの範囲までかなと思う。
同一マシンにおけるなら、SAS入れたサーバにリモート実行しかけることができるなら、バッチ実行までは大丈夫だけど、sshみたいな仕掛けがWindowsの標準ではかなり穴が開いてないのもあって難しいしわかりづらい。PowerShellで出来るんだけどさ。。。。。。psexecはハマりがキツくて非推奨。

SASのEditorとしては。

各種テキストエディタは適当に使え、なんだけど、テキストエディタではやはり能力に限界がある(色分けくらい)ので、プログラムエディタくらいは投入したいところ。
今想定しているのはAtom Editor。
設定には一癖二癖あることもあって、VS Codeも見てみたが、野良で機能を突っ込むにはAtom Editorの方が楽だろうとは思っている。現行環境では外部パッケージを取り込むことは出来ているので、あとはautocomplate機能、language-sasのもうちっとのカスタマイズ、辞書機能の利活用どうするの問題をクリアできればなあ。
ただ、正直サクラエディタgrep機能が便利過ぎてなあというのと、Atom文字エンコーディングのデフォルトがUTF-8というので、日本のSASの標準的にはS-JISな環境ではうまくいかないかもしれない。

DMS動かしつつ、裏でバッチ実行するというやり方。

と言っても大げさなものではなく、
単純に、SASUSERのパス変えた違うsasv9.cfgで実行させればいいという話です。
パラレルにバッチ実行するには、rsasuserシステムオプションと、ods pathのパスの最初にWORK.TEMPLATEとかをprependしてやればよいです。ちょっとのコマンドであれば、autoexec.sasではなくsasinitstmtで実行させられます。

コードリストになっている文字列から、コード値の数値に変換する方法

要約

コード変換については、SASの場合にはフォーマット/インフォーマットを使うのが楽です。

数値コード→文字列変換
数値フォーマットを使います。
文字列コード→文字列変換
文字フォーマットを使います。
文字列→数値コード変換
数値のインフォーマットを使います。

インフォーマットとは。

聞きなれない言葉かもしれませんが、、、外部の文字列を取り込んでSASの変数に格納する際に適用される、フォーマットの逆みたいなやつです。
普段はあんまり使わないんですが、CSVからデータ取り込みするとかの場合に適用されます。
また、ほとんどの場合にはフォーマットと対になるインフォーマットがあるんですが、例外も結構あります。
日付型のYYMMDD10.フォーマットは、亜種にYYMMDDS10.フォーマットとかあるんですが、インフォーマットはYYMMDD10,インフォーマットしかないです。スラッシュ区切りでもYYMMDD10.インフォーマット使えばいいのですが。

作り方

こんな感じ。

/* S-JISでやってます */
proc format ;
  invalue _SEXI '男子'=1 '女子'=2 ;
quit ;
data CLASS ;
  set SASHELP.CLASS ;
  attrib SEXN length=8 label='SEX (N)' ;
  keep NAME SEX SEXN ;
  SEXN = input(SEX,?? _SEXI.) ;
run ;
proc print data=CLASS ;
quit ;
OBS    Name            Sex     SEXN

  1    アルフレッド    男子      1
  2    アリス          女子      2
  3    バーバラ        女子      2
  4    キャロル        女子      2
  5    ヘンリー        男子      1
  6    ジェームズ      男子      1
  7    ジェーン        女子      2
  8    ジャネット      女子      2
  9    ジェフリー      男子      1
 10    ジョン          男子      1
 11    ジョイス        女子      2
 12    ジュディー      女子      2
 13    ルイーズ        女子      2
 14    メアリー        女子      2
 15    フィリップ      男子      1
 16    ロバート        男子      1
 17    ロナルド        男子      1
 18    トーマス        男子      1
 19    ウィリアム      男子      1

注意点

このままだと、実はアサインされていない文字列の場合には、bestで適当に数値変換されてしまいます。
通常は文字列を数値に変換しても問題ないのですが、たまたま数値にうまく変換出来る場合であると、変な事になります。

proc format ;
  invalue _SEXI '男子'=1 '女子'=2 ;
quit ;
data CLASS ;
  set SASHELP.CLASS ;
  attrib SEXN length=8 label='SEX (N)' ;
  keep NAME SEX SEXN ;
  if SEX = '男子' then SEX='3.14' ;
  SEXN = input(SEX,?? _SEXI.) ;
run ;
proc print data=CLASS ;
quit ;
OBS    Name            Sex     SEXN

  1    アルフレッド    3.14    3.14
  2    アリス          女子    2.00
  3    バーバラ        女子    2.00
  4    キャロル        女子    2.00
  5    ヘンリー        3.14    3.14
  6    ジェームズ      3.14    3.14
  7    ジェーン        女子    2.00
  8    ジャネット      女子    2.00
  9    ジェフリー      3.14    3.14
 10    ジョン          3.14    3.14
 11    ジョイス        女子    2.00
 12    ジュディー      女子    2.00
 13    ルイーズ        女子    2.00
 14    メアリー        女子    2.00
 15    フィリップ      3.14    3.14
 16    ロバート        3.14    3.14
 17    ロナルド        3.14    3.14
 18    トーマス        3.14    3.14
 19    ウィリアム      3.14    3.14

これを回避するのには、ちょっと仕込みがあります。
otherの設定をしてやると良いです。

proc format ;
  invalue _SEXI '男子'=1 '女子'=2 other=. ;
quit ;
data CLASS ;
  set SASHELP.CLASS ;
  attrib SEXN length=8 label='SEX (N)' ;
  keep NAME SEX SEXN ;
  if SEX = '男子' then SEX='3.14' ;
  SEXN = input(SEX,?? _SEXI.) ;
run ;
proc print data=CLASS ;
quit ;
OBS    Name            Sex     SEXN

  1    アルフレッド    3.14      .
  2    アリス          女子      2
  3    バーバラ        女子      2
  4    キャロル        女子      2
  5    ヘンリー        3.14      .
  6    ジェームズ      3.14      .
  7    ジェーン        女子      2
  8    ジャネット      女子      2
  9    ジェフリー      3.14      .
 10    ジョン          3.14      .
 11    ジョイス        女子      2
 12    ジュディー      女子      2
 13    ルイーズ        女子      2
 14    メアリー        女子      2
 15    フィリップ      3.14      .
 16    ロバート        3.14      .
 17    ロナルド        3.14      .
 18    トーマス        3.14      .
 19    ウィリアム      3.14      .