The Nameless City

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

SASのResponseファイルが文字化けを起こす。

SAS Deployment Wizardを使うと、%userprofile%\AppData\Local\SAS\SASDeploymentWizard の中にいろいろSDWの実行ログができるんだが、その中には、画面からの選択を記憶しておいてくれるResponseファイルというのがあるんだが。


これを使って記録していた情報を再生すると、途中で文字化けが起こります。
SASサーバの再構築がこれでできるかと思ったのに・・・・・・
面倒臭いなあ・・・・・・


記録側のResponseファイルがS-JISで保存されているので、それをUTF-8(BOMはいらんと思うが多分あっても問題はない)で保存すればOK。
というのをSAS9.4TS1M3で確認。生温かいバグですが、テクサポにいつ報告しようかね・・・・・・

HRESULT系のエラーがSASに絡むと大変だよなあという。

頭を悩ませて来た問題ではあるんだけど。
混ざって来てたから一緒の問題だと思い込んでたけど、違うわ・・・・・・


HRESULT 800ac472 from set operations in Excel

Yes, you are getting the VBA_E_IGNORE error that Excel will return when you try to invoke the object model when the property browser is suspended.

HRESULT Codes in Excel interop in C# - Stack Overflow

HRESULT codes that start with 0x800A are internal errors in the application that you are interoperating with. The last 4 digits are the hex code of the internal error. So in your case that's 0xC472 == "Excel error 50290". That gives your user a hundred thousand Google hits. "The file used has this or that problem" gives your user no Google hits, Microsoft does not maintain a mapping of internal error codes to error descriptions and Google doesn't maintain a list of your error descriptions. Use Marshal.GetHRForException() – Hans Passant Jun 5 '14 at 21:04

へえ。

https://support.microsoft.com/ja-jp/kb/820595

オートメーション サーバーとなっている Excel 2002 は、オートメーションのメソッドやプロパティの設定を実行しようとすると、ユーザーの入力処理など Excel が他の処理を行っているかどうか確認するようになりました。ActiveX コントロールなどの外部コンポーネントとの通信の間でイベントを発生させるプログラムの場合、一時的に Excel の準備ができていない状態になることがあり、このときにオートメーションの通信を行うと、Excel は実行時エラーを返します。

Ready プロパティを使用し、アプリケーションの準備ができている場合にだけ処理を実行します。Ready プロパティは Excel 2002 で新しく追加されたプロパティです。

これらの情報は古いが、内部でおそらく同様の状況になってそうだ。


ともかく。
SASのAMOでこの手の問題が発生していて、
Excel2010で確認してみたが、プロパティはある。
ただ、まあ、これに対応しているかどうかは、VSTOアドインの中身をリバースでもせんと分からんから無理だなあ。対応していても、さてReadyに対応してりゃこのエラー吐かなくなるかは分からないし。
HRESULT 800ac472
"ExcelのExceptionなので対応が無理"という訳ではなかろうちうのは普通に思う所ではあるが、
ここらへんの情報を煮詰めて問い詰めないと、多分対応しないんだろうなあ。はあ。

SAS Hot Fix Analysis, Download and Deployment Tool(SASHFADD)に残念感を覚えつつ、FTPを使わずにHotfixを取得する。

うんまあ、一応言っておくと、SASのせいとは言わない。
言わないんだが、もう少しどうにかしてくれてもいい感じはある。

FTPのプロキシ設定を超えるのが、ここんとこ難しい。

ウチのProxyはPACファイル仕様である。そもそも、Windows謹製のFTPがProxyに対応していないのだが。
PuTTYとか使うのがめんどい。

どうするか。

二通り考えられる。

SAS Software DepotのHotfixダウンロード機能を使う
但し、展開している各サイトナンバー毎に落としてくれるような機能ではなく全部落ちる。意外と時間がかかる。FWは通る。初期インストール時はこちら、なのだが、初期ではないインストールではこちらはちょっと違うルートなので自助努力必要。落として来たファイルから、対象の構成用のを選択する必要がある。これ、多分HTTP/HTTPS?なのか、プロキシは問題にならんかった。ただ、このプロキシ周りって以前はプロキシ設定していた気がする。どこかのファイルにプロキシ設定が保存されてんのかなあ(もう端末でアホほど作業しているので確認する気力がない。)
SASHFADDを使いながらダウンロードはブラウザ等を使う
構成に合わせて必要なものをダウンロードする事は出来る。が、あんまり時間変わんねえなあという気はする。ダウンロード用アドオンなどでレジューム機能等が使えはする。他端末で実施する事が可能なのは利点の一つ。

上記方法で何にせよ落ちるんだけど、SAS Software Depotの場合、複数OSパターン落ちてくるんで、Hotfixとして適用出来ないものが混じっている。その場合にはやっぱりダメとか言われるので、何にせよSASHFADDを用いた方が楽。
楽、なんだけどさ・・・・・・

SASHFADDをPuTTYで超えてというのが大変面倒臭い。

別にSつかないFTPでもいいんだが、なんでかよく分からんが上手く乗り越えられる気がしなかった。毎度ながらFTPは会社のFW内では通しにくい。Windowsでは。
Windowsの接続はやっぱり鬼門だなあと思う。Linuxとか大抵http_proxyとかに仕込めば乗り越えられるんだがなあ・・・・・・
でもとりあえずダウンロードまでは出来る事は確認した。

SASHFADDで出来るファイルリストのHTMLをベースに、ダウンロードしても行けると思う。

その場合には、SAS94_HFADD_data.xmlとDeploymentRegistry.txtだけが必要。DeploymentRegistry.txtは作成出来るはずだし、SAS94_HFADD_data.xmlはブラウザ経由で落とせるだろう(FFでは出来た)。
ftpは通らないが、ANALYSIS_SASHFADD_~フォルダは作成され、中のHTMLから、まとめてダウンロードする事も可能。そう、FFならね。
流石に分割ダウンロードまでやると問題あるとは思うけど、まあ出来る方法が沢山あるに越した事はない。

SASの技術情報の場所として、Knowledge Baseはもう少し使われてほしい。

英語翻訳の仕事をしている訳ではないんで、ホント「日本語の情報だせ」とか要望されるのは勘弁。


Knowledge Baseには、おおよそ日本語モノより十倍以上のノウハウがあります。
support.sas.com

というかまあ、日本語ソースがあまりにも貧弱なのですが。
オススメはFocus Areaです。
support.sas.com



日本のSASコミュニティは、SAS Foundation周りのノウハウに情報が固まってますが、その情報も正直、Focus Areaに書かれていたりする情報が多いです。
ただ。
この辺り、Sitemapがちゃんと整備されておらず、ナカナカ目的の情報に到達するのは難しいかも知れません。
Googleでサルベージする方が早いかも。

SASでバグを発見したら・・・・・・

色々とプロジェクトに関わってきていての経験知です。

  • 障害として急ぎ対応される事は稀。
    • 障害の内容によりますが、基本的にクライアントの挙動とかの場合には、修正されてもだいぶ後です。
    • やった事ないですが、Caryへダイレクトアタックかけられる方が対応は早いと思います。ヘルプの間違いはそれで直してもらった。
  • 回避策を練ろう。
    • 最悪、Excelアドインでプログラムぶっこんでとか有り得る。
  • 製品への過度な期待は禁物。
    • 綺麗な製品の使い方をするならば、あんまり障害にはぶち当たらない。
    • 連携によって起こる障害もプログラムで対応出来るような場合じゃないとプログラムを作ってイージーにシステムを組むのは止めた方がいい。
      • データ連携ならともかく、イベント貼りまくってるAMOとかでVBAで構築するのは無茶じゃないかと思う。
      • プログラムでガシガシ作って回避する時には、WindowsでのExcel VBAの権限とかをちょっと練っておく必要はあるかと思う。


イラッと来る事は多々有りますが、海外製品の場合、「直るまで仕様だと言い張る」事がありまして、それはまあそうだなあ(うっかり認めると賠償の問題がありますので)とは思うんですが、流石に、Usage NoteがHotfix出てProblem Noteに昇格した時に、「その取扱はどうなんだ」と思ったりはしました。
ただまあ、その手の隙間でヤクザみたいに押し寄せて来る連中ってのはグローバル企業なら当たり前のような所があり、多分日本のSIerグローバル化出来ないのもそこら辺緩いからなあと思ったりします。


ともかくも、法曹関係は抜きにして、サッサと先に進みたいんだがなと思う今日このごろ。
こういう事のやり取りをしていると、心が死んでく感じがします。
会社としての責任を問うとか、会社としての責任回避とか、もうどうでもいいんだけどどうにかならないのかなあ。そのせいで、「何が分かって何が分からん」のかという話が茫洋とするのがホントやってらんねえ。

SAS社テクニカルサポートを使ってきて、の雑感。

他に代わって質問する事も多々あります。・・・・・・出来れば、「SASテクニカルサポートにお願い出来ない事をこちらに聞かないでほしい」とか思うんだけど。だいぶ病んでます。

SASテクニカルサポートは、運用面でのサポートは引き受けないのが原則。

あそこは、製品のサポートです。
SASは売る時にはカスタマイズ「出来る」と言うんですが、カスタマイズした設定が正しいとか間違ってるとかは、「マニュアル読んで」としか言いません。

Windows等の他の製品の機能については、サポート外です。

OSの機能絡みに関しては、「Microsoftがサポートですよね」と言われます。

ガチな障害であれば、二週間くらいは最低でもかかる&回避策を飛ばす事もある。

障害を見つけてしまうと、・・・・・・Caryの本社に問い合わせが流れていくんですよね・・・・・・

あくまで原則、なんですが。

SASテクニカルサポートでも、誰に当たるかで回答の方向性が異なる事は多々有ります。
「MSのエラーコードをAMOが拾っているのであって、MSのサポートに確認して下さい」みたいな人と、
「本国に調査を依頼します」みたいな人がいます。
実は両者同じような対応だという事だったりしますが。前者の方が冷たいようですが、実は結構踏み込んで答えてもらっている所でもあります。まずこのパターン、解決不能あるいはパッチが出るパターンです。障害かどうかと言われると、MSの製品のせいもあるかもですしSASの場合もなくはないです。
プログラム開発や保守をしている訳ではないので、SAS Japanで何か解決用のパッチを出せる訳でもない。


回避策を、という場合でも、業務側が考えて回避する事が一番ラクなので、あんまりサポートで対応すべきとも思えないんですよね。
開発のメインルートだと、流石にSASも検証してます。あまり綺麗でない使い方、あるいは、Excelだとマクロ記録してカスタマイズ、みたいなやり方でしている使い方、なんかは、システム開発屋からは見えづらいので、いつまでもバグが残ったりします。
ちょっと綺麗に書くだけでバグってる部分回避出来たりするんだけどー、という所を、頑張っても互いに不幸になるだけだ、とは思います。


あと、SASのソリューション製品の環境を妙にカスタマイズすることは、全くオススメしません。
インストールのオプションの範疇ならわりと分かりやすいですし出来るんですが、アレ、WebServerだとかWebAppServerだとかWebDAVだとかで出来る膨大なパラメータのうち、比較的カンタンに理解されやすい部分だけを抽出しているだけです。
JVMのサイズだとかCacheサイズだとかもぜーんぶ一から設定する事は不可能とは言いませんが、SASがその設定のマニュアルを持っていません(OEMのマニュアルはあるんですがそれもApacheベースとかだとかそういう感じ)し、まるっと売ってるのはそこら辺を自力で構築すると大変面倒だからです。
本来、「/Config/Lev1」とかの下は触るものではない、という風には言われています。


で、このあたりを深掘りして完全なサポートするのは、正直どこの世界に言っても無理じゃないでしょうか。
事前に何が起こるのかとかを設定変更した場合に予測は不可能なんで、故にドライランとか別環境とか持っているものなんですよねえ。
はあ。

とりあえずErlangでもかじってみるか・・・・・・

Pythonはともかくとして。

理由:なんとなく、統計計算に便利そうだから。

統計計算には、意外と行列計算的なものが多く、また、sumとか延々とやるので。
簡単に並列計算風に出来そうだから。

本当はスパコン使ったプログラミングとかやりたいがなあ。

そうも言ってられない。

ElixirはErlangの後かな。

元々、大してオブジェクト指向型やってないのでというのもあり。

レコード件数を取り出す「if 0 then set <dataset name> NOBS=<variable>」は、特定条件下で想定外の結果を返すので注意。

「if 0 then set 」って昔調べた時には情報ホント無かったんだけど、今SASプログラマの人がボチボチネットに書いてますね。
で、見てた時に、そういや某所でやってた時に、ここら辺で面倒臭い話あったなと思い出して調べてみた所、やっぱりこのコードは特定条件下でバグになります。まあ普通はならんのですけど。

参考までに、関係しそうな所に対してリンク貼っときます。TB打てないんだよなはてなブログ
データステップ100万回      SAS新手一生: 【訂正追補】SASデータセットのオブザベーション数をマクロ変数に格納する方法_call symput
SAS忘備録: データステップ内で、色々なデータセットのオブザベーション数を取得する
SAS忘備録: 行削除の落とし穴

通常の使い方。

プログラムは↓

data _NULL_ ;
	if 0 then set SASHELP.CLASS nobs=_SYS_OBS ;
	put 'トータルの物理オブザベーション数->' _SYS_OBS ;
	stop ;
run ;

で、ログが↓

66   data _NULL_ ;
67       if 0 then set SASHELP.CLASS nobs=_SYS_OBS ;
68       put 'トータルの物理オブザベーション数->' _SYS_OBS ;
69       stop ;
70   run ;

トータルの物理オブザベーション数->19
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.00 秒
      CPU時間            0.00 秒

簡単に説明すると、最初、定義とかは取りに行くんですが、実行部分で「if 0 then」となっているので、レコード自体は読み込まれません。
この場合に、通常はdataステップはオブザベーション数分実行されるんですが、1行も読み込まない設定の場合には、1回だけ実行されます。
データの定義部に、オブザベーション数が書き込まれてるんですね。
で、「トータルの」と但し書きを入れたのは、例えば「set SASHELP.CLASS SASHELP.CLASS」とかにすると、この合算のオブザベーション数(38)が書き込まれます。


本題にも関わってくるのですが、このデータの定義部に書かれているオブザベーション数は、「物理オブザベーション数」であり、「論理オブザベーション数」ではないという事を頭に入れておいて下さい。

特殊条件下で想定外の結果を返す例。

プログラムは以下です。

proc sql ;
	create table CLASSDEL as select * from SASHELP.CLASS ;
	delete * from CLASSDEL where AGE=15 ;
quit ;

data _NULL_ ;
	if 0 then set CLASSDEL nobs=_SYS_OBS ;
	put 'トータルの物理オブザベーション数->' _SYS_OBS ;
	stop ;
run ;

SASHELP.CLASSを複写したCLASSDELというデータセットを作成します。
そして、「SQLプロシージャで」DELETE文を発行しています。この場合、AGE=15(4オブザベーション)を削除します(ホントどうでもいい事ですが、CLASSデータセットは日本語版、UTF-8英語版などでNAMEやSEXの中の値が変わるためAGEにしてます)
その結果は?

71   proc sql ;
72       create table CLASSDEL as select * from SASHELP.CLASS ;
NOTE: テーブルWORK.CLASSDEL(行数19、列数5)が作成されました。

73       delete * from CLASSDEL where AGE=15 ;
NOTE: 4行がWORK.CLASSDELから削除されました。

74   quit ;
NOTE: PROCEDURE SQL処理(合計処理時間):
      処理時間           0.01 秒
      CPU時間            0.01 秒


75
76   data _NULL_ ;
77       if 0 then set CLASSDEL nobs=_SYS_OBS ;
78       put 'トータルの物理オブザベーション数->' _SYS_OBS ;
79       stop ;
80   run ;

トータルの物理オブザベーション数->19
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.01 秒
      CPU時間            0.00 秒

さてと。
「このデータの定義部に書かれているオブザベーション数は、「物理オブザベーション数」であり、「論理オブザベーション数」ではない」と言っていた事に繋がるのですが、SQLプロシージャでDELETE文を発行した場合、オブザベーションがまるっと消されるのではなく、単にDELフラグが立つだけです。
そしてこの際定義部は書き換えられないです。
その為、こうなります。

同様の操作をdataステップで実行する事は可能です。但し、MODIFYなんて、まあ滅多に使わないと思いますが。

data CLASSDEL ;
	set SASHELP.CLASS ;
run ;
data CLASSDEL ;
	modify CLASSDEL ;
	if AGE=15 then remove ;
run ;
data _NULL_ ;
	if 0 then set CLASSDEL nobs=_SYS_OBS ;
	put 'トータルの物理オブザベーション数->' _SYS_OBS ;
	stop ;
run ;
308  data CLASSDEL ;
309      set SASHELP.CLASS ;
310  run ;

NOTE: データセットSASHELP.CLASSから19オブザベーションを読み込みました。
NOTE: データセットWORK.CLASSDELは19オブザベーション、5変数です。
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.01 秒
      CPU時間            0.01 秒


311  data CLASSDEL ;
312      modify CLASSDEL ;
313      if AGE=15 then remove ;
314  run ;

NOTE: データセットWORK.CLASSDELから19オブザベーションを読み込みました。
NOTE: データセットWORK.CLASSDELを更新しました。
 オブザベーションの再書き込み0、追加0、削除4
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.00 秒
      CPU時間            0.01 秒


315  data _NULL_ ;
316      if 0 then set CLASSDEL nobs=_SYS_OBS ;
317      put 'トータルの物理オブザベーション数->' _SYS_OBS ;
318      stop ;
319  run ;

トータルの物理オブザベーション数->19
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.00 秒
      CPU時間            0.00 秒


現在、「SQLプロシージャでDELETEステートメントを発行する」「DATAステップでREMOVEステートメントを発行する(MODYFYステートメントでデータセットを取り込む場合)」場合に、「物理オブザベーション数が論理オブザベーション数から乖離する」事がわかっています。

この時他の方法でデータを取得するとどうなっているか?

他に、オブザベーション数を取得する方法は、ざっと考えて二つあります。
CONTENTSプロシージャを利用する方法と、SQLプロシージャでSASHELP.VTABLE(あるいはDICTIONARY.TABLES)を利用する方法です。

proc sql ;
	create table CLASSDEL as select * from SASHELP.CLASS ;
	delete * from CLASSDEL where AGE=15 ;
quit ;
data _NULL_ ;
	if 0 then set CLASSDEL nobs=_SYS_OBS ;
	put 'トータルの物理オブザベーション数->' _SYS_OBS ;
	stop ;
run ;

proc contents data=CLASSDEL out=INFODEL noprint ;
quit ;
proc print data=INFODEL ;
	var MEMNAME NOBS DELOBS ;
quit ;

proc sql ;
	create table INFODEL2 as
	select MEMNAME,NOBS,DELOBS,NLOBS from SASHELP.VTABLE
	where LIBNAME='WORK' and MEMNAME='CLASSDEL' ;
quit ;
proc print data=INFODEL2 ;
	var MEMNAME NOBS DELOBS NLOBS ;
quit ;

今度は、アウトプット(LISTINGで出力)を。

OBS    MEMNAME     NOBS    DELOBS

 1     CLASSDEL     15        4
 2     CLASSDEL     15        4
 3     CLASSDEL     15        4
 4     CLASSDEL     15        4
 5     CLASSDEL     15        4
OBS    memname     nobs    delobs    nlobs

 1     CLASSDEL     19        4        15

CONTENTSプロシージャの出力には変数の情報も入ってくる為その分オブザベーションが増えてしまっているのですが、NOBSは想定のものに「書き換えられている」イメージです。
SQLプロシージャで、SASHELP.VTABLEを利用すると(これは裏でせっせと情報集めに行っているので注意が必要です--対象になるテーブルだけ参照しに行きますが、WHEREの書き方やハンドリング次第ではかなり時間がかかります)、書き換わっていない「NOBS」が表示されます。
DELOBSという変数を表示させていますが、こちらが「削除された(が物理的には残っている)オブザベーション数」になります。
NLOBSはVTABLEにしかありませんが、こちら「論理オブザベーション数」です。

余談

削除されたオブザベーションは、内部的にはデータを保持していますのでバイナリエディタとかで確認出来たりします。
あと、当然ながらパフォーマンス劣化につながります(以前SASサーバのレポジトリ肥大とかあったのはそのせいだろうなあ。今のバージョンでは確認してませんが)。
その場合には、

data <dataset> ;
	set <dataset> ;
run ;

とか書ければ良いのですが。
あと、普段のSAS使いの人はあまり影響ないとは思いますが、Data Integration Studioで、SQLのDELETE文はわりと発行しているので注意です。


ただ、この削除方法等はRDBMSでは見かけるものです。その目的は、マルチアクセスという事にあるわけで、そういや、SAS/SHARE辺りは特に考えてなかったなあ・・・・・・面倒臭い。

1ファイルのサイズは1GB以下にした方が良いのは、コンピュータ・システムという事を使っている要件による。

SDTMの1ファイルが1GB制限であるというのは、OSや各種ファイルシステム、アプリの要件であり、この規制は無意味ではなく通信の物理制約も含めて「担保出来る範囲」という事です。
現在はだいぶ通信も安定している環境が多いのであんまり気にならないのかと思いますが、1GBではなく2GBではファイルシステムやアプリで制限が出て来ます。
例えば、ZIPの元の規約では、1ファイルのサイズが2GBを超えられず、圧縮ファイル全体のファイルサイズも2GBを超えられません。


ファイルというものが、そもそもサイズ制限が「必ず」存在し、そこを超えられないという事を認識した方が良いです。


で、これらを解決する方法は、当たり前に「ファイルの分割しかない」んです。
圧縮などのアルゴリズムも、送り手と受け手側に同じ認識がないとダメですし。これをXMLフォーマットにした所で、「物理的ファイルのサイズは制限された方がいい」のは普通です。
例えばインターネットを介したファイルの転送では、社内だとネットワークドライブとか、「仮想的にローカルディスクっぽくして扱う」のが当たり前になっているでしょうが、本来「転送はしばしば失敗し、分割して送信されているパケットは順不同になったりもする」ものです。
1ファイル辺りのサイズが大きくなればなるほど、転送に失敗する確率も増えていきます。まあ、レジューム機能つきでの転送とかもない訳じゃないですが、あまりに長い時間転送しようとすると、その通路上でのトラブルが増えます。FWでのヘッダの改造が原因だったり、長時間のダウンロードの強制停止であったり、原因は様々ですが。
てか、まず、「分割するのが基本」と思った方が良いです。


ただ、この話、「SDTMのガイドラインとして考えるべきか」というと、それとは違うレイヤなんですけどね。
ODMとかそこら辺の話です。SDTMに付随する情報として扱うべきで、本来、ファイル名+ナンバリングで逃げるのは厳しい所なんですがね。
ただ、CDISCの各種規約、骨組みはともかくとして実装が進んでいるのがSDTMな為、歪な発展するのは仕方ないですけどね。まあ結局SDTMが越境してくるような形で各標準書き換えるんだとは思いますが。

SAS9.4のサービス起動順序。

よく忘れるので。

SAS(R) 9.4 Intelligence Platform: System Administration Guide, Fourth Edition/Starting, Stopping, and Checking the Status of Servers/Operating Your Servers/Overview of Server Operation/Starting Servers in the Correct Order
以下の所を引用。

Start Order Server or Service Tier Dependencies
1 SAS Metadata Server*1*2 Server tier
2 SAS Web Infrastructure Platform Data Server Server tier
3 SAS OLAP Server Server tier SAS Metadata Server
4 SAS object spawner Server tier SAS Metadata Server
5 SAS/SHARE server Server tier SAS Metadata Server
6 SAS/CONNECT spawner Server tier SAS Metadata Server
7 SAS Deployment Tester server Server tier SAS Metadata Server
8 SAS Distributed In-Process Scheduler Job Runner Server tier SAS Metadata Server
9 JMS Broker Middle tier
10 Cache Locator Middle tier
11 SAS Web Server*3 Middle tier
12 SAS Web Application Server Middle tier Cache Locator
13 SAS Environment Manager server Middle tier SAS Web Infrastructure Platform Data Server
SAS Web Application Server*4
14 SAS Environment Manager Agent Server and middle tier
15 SAS Deployment Agent Server and middle tier

明確な依存関係は意外なほど薄いのであるが。
薄いのであるが。
しかし、サービスのスタートアップで、レスポンスタイムアウトとか結構あるっぽいんだよなー。
ちなみに、確認用にするつもりで、サービス登録でなくシェル起動で設定しようとすると、インストールでコケるのでとりあえずサービスで突っ込んだ後にサービスを手動構成にするという荒業を行っている。自己責任でどうぞ。
あと、最小構成でも8GB程度のメモリだと起動後で既にほぼメモリを使い切ってるような状況になる(実際には6GBくらいなんだが・・・・・・)。
厄介なのはMiddle Tier(Webサービスとかが起動してる所)なので、こっち側は必要な時に上げ下げするつもりで良いのかも知れん。
各サービスの機能については、また別エントリで。

余談。
手動のサービスを上げ下げするには、管理者実行の必要がある。「net start~」もあるが、個人的には最近は「sc start~」を使っている。

*1:In clustered configurations, make sure that all metadata server nodes are running before you start dependent components.

*2:In the third maintenance release for SAS 9.4, the documentation was changed to recommend starting the SAS Metadata Server first, followed by the SAS Web Infrastructure Platform Data Server (instead of the reverse). This order is easier and more logical for deployments in which the metadata server is installed on a separate machine from the other server-tier components.

*3:In the first maintenance release for SAS 9.4, the documentation was changed to recommend that the SAS Web Server be started before the SAS Web Application Server. This start-up order helps ensure optimum performance when web applications are initialized. The sas.servers script has also been changed to incorporate the new order.

*4:The SAS Environment Manager server can start without these components. However, the SAS Environment Manager application requires them in order to provide full functionality.

Windowsで特定のフォルダをドライブとしてマウントする方法

Windowsで特定のフォルダを仮想ドライブとしてマウントする方法
SUBST - Wikipedia, the free encyclopedia


SUBSTパターンでは満足しない人(私だが)の為に。
DOSデバイスとして「(ドライブレター):」とレジストリに書く方法があるのでまあそれもオススメだが、英語版Wikipediaにあるように起動時スクリプトとして仕込んでしまうのも一つ。Windowsの起動時のスクリプトはスタートアップで仕込むべき、では別にないので。


DOSデバイスとして設定した場合には、便利な事もあるが不便もあり、まあ、レジストリからしかタッチできんしなあ。

Windowsのレジストリを弄ることでメニューを作る。

最近もまたWindowsでSAS9.4TS1M2とかインストールしてんだけど。
うっかりUnicodeでの構成とかをデフォルトにした御蔭でちと面倒なことに。
f:id:houyhnhm:20160127164735p:plain
拡張子「.sas」に関連付けて幾つかメニューが作られるんだけど(この画像は既に仕込んだ後なんだけど)、バッチ実行をする際にあるメニュー

  • SAS9.4でバッチサブミット
  • SAS9.4(UTF-8)でバッチサブミット

どちらで実行してもUTF-8モードで動いてしまうようになった。


ので、急遽、「SAS9.4(S-JIS)でバッチサブミット」というメニューを作った。

レジストリエディタを起動して設定する。

まあ、個人端末なので簡単とは言え、この領域はアプリインストール出来る人、まあAdministratorsに所属してないと多分いじってはいけないけど。
いけないんだけど、そんなに怯えることはないです。レジストリエディタでレジストリいじる時には、必ず最初に元のレジストリをエディタからエクスポートしておいたら、最悪元に戻せる。
特にこれからいじる箇所は、そう他のアプリに影響することはない。

HKEY_CLASSES_ROOT

この下に、拡張子の設定、ファイルの設定色々が混じっている。.sasの場合、以下のようになっている。
f:id:houyhnhm:20160127165738p:plain
「.sasの場合には、既定のSAS.Program.701を見てね」ということなので、この.sasの下ではないSAS.Program.701を見る。f:id:houyhnhm:20160127170331p:plain
このSAS.Program.701の下にshellという枝が見えると思う。その下に、右クリックメニューで設定するような内容がある。
例えば、Batch940という枝は、
f:id:houyhnhm:20160127170522p:plain
f:id:houyhnhm:20160127170625p:plain
こういう構成になっている。
Batch940とかの名称はまあ重複しないようにして、何らかの新しいメニューを追加することが出来る訳です。
commandの内容は、
「"C:\Program Files\SASHome\SASFoundation\9.4\sas.exe" "%1" -nologo -config "C:\Program Files\SASHome\SASFoundation\9.4\SASV9.CFG"」
になっていて、Unicodeで構成するようにすると、ここのCFGの内容が、

-config "C:\Program Files\SASHome\SASFoundation\9.4\nls\u8\sasv9.cfg"

になってて、UTF-8の設定を見るようになってるのね(ちなみにここバージョンやOSによって設定のやり方が異なるので注意)。

ここをいじるのでも後先考えないなら別にいいけど、後でSASの構成変えたりする時にどうにかなるのも面倒なので、自分はメニューを追加した。

[HKEY_CLASSES_ROOT\SAS.Program.701\shell\Batch940SJIS]
@="SAS 9.4 (S-JIS) でバッチサブミット(&B)"

[HKEY_CLASSES_ROOT\SAS.Program.701\shell\Batch940SJIS\command]
@="\"C:\\Program Files\\SASHome\\SASFoundation\\9.4\\sas.exe\" \"%1\" -nologo -config \"C:\\Program Files\\SASHome\\SASFoundation\\9.4\\nls\\ja\\SASV9.CFG\""

余談だけど、ここでは文字は二重引用符で囲む。で、その中の特殊文字は\でエスケープしてます。

設定後は特に再起動とか必要ないので適当に試してみたらいいと思います。

Non-parametricな手法とParametricな手法の分岐パターンって、本当に必要なの?

正直な所、そう思っている。


Non-parametricな手法であるべきかParametricな手法であるべきか、なーんてのは、実施する測定値や前提で決まってるんじゃないの?
ってねえ。
その分岐に使われるのが、ひたすら等分散性の検定での判定だったりすることもあって、なーんかモヤモヤする。
利用したくなる気持ちも分かりはする。機械的に判断出来るのは自動的にしたい所だし。
でもそれって、設定のデフォルトとかですべき話じゃない?


例えば、ある検査機器で行うある測定値が、普通はパラメトリック検定になるんだけど、たまたま測定値の打ち切りみたいなのが発生しましたーじゃノンパラで、ってのは、何かおかしいよね。
普通、その測定値の原因調査が必要だよね。
打ち切りが発生するようなら、その検査機器で測定すべきじゃない値なのかもしれないし。
無論、そういう値が沢山出て来て仕方がないのでノンパラで、とかはいいよ?でも、等分散性の検定の結果だけでホントに判断出来るもんなんかなあ?あと、それならそれで、等分散性の検定結果、だけではなく、分散とかも必要な情報になるしねー。プロットの必要もあるんじゃないかなあ。


何というか、実験計画に組み込まれてるべきなんだよそこってーと思うんだけど。何でだろうねえ。


あと、面倒だっつっても、検定統計量とその変換形であるP値以外にも、ふつーの平均値/標準偏差/標準誤差ペアみたいなのはほしいよね。ノンパラだと中央値/四分位点だし。確率プロットみたいなのいるんじゃないかなあと。


道具作る職人なんでどう使おうが知らんとは言え、なんだかなあ。

Windowsでレジストリをいじって右クリックメニューに適当にS-JISでのバッチ実行用メニューを追加する。

こんな感じ。
改造元は、SAS9.4かで出て来ている、UTF-8でのバッチ実行のを見てです。まあ、要は拡張子連動の所で、明示的にコマンドを書いて上げるのです。
一応レジストリをなぶるので自己責任でどうぞ、とはいうけど、これぐらいはいじれるようになってた方が、Windowsユーザとしては幸せになれると思います。

[HKEY_CLASSES_ROOT\SAS.Program.701\shell\Batch940SJIS]
@="SAS 9.4 (S-JIS) でバッチサブミット(&B)"

[HKEY_CLASSES_ROOT\SAS.Program.701\shell\Batch940SJIS\command]
@="\"C:\\Program Files\\SASHome\\SASFoundation\\9.4\\sas.exe\" \"%1\" -nologo -config \"C:\\Program Files\\SASHome\\SASFoundation\\9.4\\nls\\ja\\SASV9.CFG\""