2012年7月19日木曜日

InstallAware RAD Studio Editionでインストーラ作成

作業するマシンが度々変わるとバイナリの置き場所がバラバラになるので、SAS Log Utilityのインストーラを、InstallAwareで作ってみました。InstallAwareは、Delphi XE2 Proに使用権が含まれている製品です。細かい設定を使いたければ、999ドルのDeveloper版にアップデートしないといけません。


悩ましいのがEULAの記述です。英語で適当なサンプルを探していますが、やたらと長かったり、米国の特定の州が云々という文言が入っていたりします。フリーウェアとして、コンパクトで分かりやすいEULAを捜し歩いています。


2012年7月17日火曜日

MPRINT無しでマクロ名を得ることはできるか?

SAS Log Utilityの改良ネタを考えたけどボツ案です。
現在、ツールの仕様はMPRINTのオプションを付けないと、マクロ名を拾ってくれません。ひょっとして、デフォルトのオプションのままでもマクロ名を取得できるかもしれないと思いましたがNGです。

下のログは、行番号19の後ろのマクロ名を捕捉します。

8    %macro foo(in_ds);
9        proc sort data=&in_ds out=class;
10           by name;
11       run;
12
13       data class;
14           set work.class;
15           keep name;
16       run;
17   %mend;
18
19   %foo(sashelp.class)

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



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


以下のログの場合は、マクロで囲まれていないプロシージャです。行番号の後にマクロ名称が無ければ、マクロの外側と判断できるのではないでしょうか?
1    proc sort data=sashelp.class out=class2;
2        by name;
3    run;

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


行番号 %マクロ名;がマクロの開始、行番号 RUN又はQUIT;でマクロを抜けたことを判定できそうです。しかしながら、マクロが入れ子になっていると外側のマクロ名しか拾えません。継続して検討しますが、無理そうです。

2012年6月14日木曜日

SASのインストール・アカウント

Intelligent Platform製品をインストールする人向けに注意を1つ書きます。インストールのアカウントは削除されないように注意してください。

最近のインストールガイドでは、Administratorを使わないで、インストール用のアカウントを使うように推奨されています。しかしながら、セキュリティ意識の高まりを受けて、使っていないアカウントは、運用チームがバサバサと削除することがあります。

インストール・アカウントを削除すると、Service Packを当てたり、プロダクトを追加ができないことがあります。いま、まさにそんな状況で、弱っています。インストール・アカウントは無効化しておくように、運用チームと掛け合ってください。

2012年6月11日月曜日

EGPの中を検索するツール


How to search your SAS Enterprise Guide project files

世の中、考えることは同じなのです。
しかし、インターフェイスの作りが違って面白い。
SRXの公開版を作らねば...

2012年6月7日木曜日

パイプを使ったSASESOCKエンジン

UNIXでは良くあるPIPEですが、Windows環境でもSASESOCKというエンジンで使えます。あるのは知っていましたが、サンプルコードを動かしてみました。
サンプルを実行する前に、Servicesにポート番号を定義、OUTLIBのフォルダを作成する必要があります。サンプルでは、PIPE1という名前にしてあります。実行はDMSの画面から、サブミットするだけです。SPAWNER.EXEは起動していなくても動きます。

/* -----------  DATA Step - Process P1  ----- */
signon p1 sascmd='!sascmd';
rsubmit p1  wait=no;

libname outLib sasesock ":pipe1"; 

/* create data set - and write to pipe */
data outLib.Intermediate;
   do i=1 to 5;
       put 'Writing row ' i;            
       output;
   end;
run;
endrsubmit;
rdisplay p1;

/* -----------  DATA Step - Process P2  ----- */

signon p2 sascmd='!sascmd';
rsubmit p2  wait=no;

libname inLib sasesock ":pipe1";
libname outLib "d:\temp"; 

data outLib.Final;
set inLib.Intermediate; 
   do j=1 to 5;
        put 'Adding data ' j;          
        n2 = j*2; 
        output;
   end;
run;
endrsubmit;
rdisplay p2;
/* -------------------------------------------- */
こちらは実行したときのログです。
NOTE: Copyright (c) 2002-2010 by SAS Institute Inc., Cary, NC, USA.
NOTE: SAS (r) 9.1 (TS1M3 DBCS3054)
      Licensed to XYZ JAPAN,LTD., Site 0041264126.
NOTE: このセッションは NET_SRV  プラットフォーム上で実行されています。



NOTE: SAS 9.1.3 Service Pack 4

NOTE: SAS システム初期化処理 :
       処理時間            1.43 秒
       CPU 時間            0.62 秒

1    /* -----------  DATA Step - Process P1  ----- */
2    signon p1 sascmd='!sascmd';
NOTE: P1 へのリモート接続を開始します。 (SAS Release 9.01.01M3P020206)
NOTE: SASUSER.PROFILE をオープンできません。 WORK.PROFILE を使用します。
NOTE: PROFILE への変更はセッションの終了時に失われます。
NOTE: Copyright (c) 2002-2010 by SAS Institute Inc., Cary, NC, USA.
NOTE: SAS (r) 9.1 (TS1M3 DBCS3054)
      Licensed to XYZ JAPAN,LTD., Site 0041264126.
NOTE: このセッションは NET_SRV  プラットフォーム上で実行されています。



NOTE: SAS 9.1.3 Service Pack 4

NOTE: SAS システム初期化処理 :
       処理時間            0.26 秒
       CPU 時間            0.26 秒

NOTE: P1 へのリモート接続を完了しました。
3    rsubmit p1  wait=no;
NOTE: バックグラウンドで P1 へのリモートサブミットが進行中です。
4    rdisplay p1;
5
6    /* -----------  DATA Step - Process P2  ----- */
7
8    signon p2 sascmd='!sascmd';
NOTE: P2 へのリモート接続を開始します。 (SAS Release 9.01.01M3P020206)
NOTE: SASUSER.PROFILE をオープンできません。 WORK.PROFILE を使用します。
NOTE: PROFILE への変更はセッションの終了時に失われます。
NOTE: Copyright (c) 2002-2010 by SAS Institute Inc., Cary, NC, USA.
NOTE: SAS (r) 9.1 (TS1M3 DBCS3054)
      Licensed to XYZ JAPAN,LTD., Site 0041264126.
NOTE: このセッションは NET_SRV  プラットフォーム上で実行されています。



NOTE: SAS 9.1.3 Service Pack 4

NOTE: SAS システム初期化処理 :
       処理時間            0.20 秒
       CPU 時間            0.20 秒

NOTE: P2 へのリモート接続を完了しました。
9    rsubmit p2  wait=no;
NOTE: バックグラウンドで P2 へのリモートサブミットが進行中です。
10   rdisplay p2;
11   /* -------------------------------------------- */


DMSには次のような表示が現れます。

2012年6月6日水曜日

SAS Intelligence Platformのサービス起動順序

仕事で使う割には良く忘れるので、ここにメモします。
SAS BI Serverのサービス起動順を以下に示します。
  1. Start the SAS Metadata Server.
  2. Start the SAS Object Spawner.
  3. Start the SAS Services Application.
  4. Start the WebDAV server.
  5. Start the servlet container or the J2EE application server.
停止は逆順です。起動はMO, 停止はOMと呪文のように覚えます。
これは、SAS® 9.X Intelligence Platform System Administration Guideに説明があります。

2012年5月29日火曜日

年代の書式定義(2)

昨日書いたコードは難しく考えすぎました。素直に数十年先まで定義するのがシンプルです。

options mprint source;

proc format;
 value $DATE8_F
  "19900401" - "19910331" = "19900401 - 19910331"
  "19910401" - "19920331" = "19910401 - 19920331"
  "19920401" - "19930331" = "19920401 - 19930331"
  "19930401" - "19940331" = "19930401 - 19940331"
  "19940401" - "19950331" = "19940401 - 19950331"
  "19950401" - "19960331" = "19950401 - 19960331" 
  "19960401" - "19970331" = "19960401 - 19970331"
  "19970401" - "19980331" = "19970401 - 19980331"
  "19980401" - "19990331" = "19980401 - 19990331"
  "19990401" - "20000331" = "19990401 - 20000331" 
  "20000401" - "20010331" = "20000401 - 20010331"
  "20010401" - "20020331" = "20010401 - 20020331"
  "20020401" - "20030331" = "20020401 - 20030331"
  "20030401" - "20040331" = "20030401 - 20040331"
  "20040401" - "20050331" = "20040401 - 20050331"
  "20050401" - "20060331" = "20050401 - 20060331"
  "20060401" - "20070331" = "20060401 - 20070331" 
  "20070401" - "20080331" = "20070401 - 20080331"
  "20080401" - "20090331" = "20080401 - 20090331"
  "20090401" - "20100331" = "20090401 - 20100331"
  "20100401" - "20110331" = "20100401 - 20110331"
  "20110401" - "20120331" = "20110401 - 20120331"
  "20120401" - "20130331" = "20120401 - 20130331" 
  "20130401" - "20140331" = "20130401 - 20140331"
  "20140401" - "20150331" = "20140401 - 20150331"
  "20150401" - "20160331" = "20150401 - 20160331"
  "20160401" - "20170331" = "20160401 - 20170331"
  "20170401" - "20180331" = "20170401 - 20180331"
  "20180401" - "20190331" = "20180401 - 20190331"
  "20190401" - "20200331" = "20190401 - 20200331" 
  "20200401" - "20210331" = "20200401 - 20210331" 
  "20210401" - "20220331" = "20210401 - 20220331" 
  "20220401" - "20230331" = "20220401 - 20230331"
  "20230401" - "20240331" = "20230401 - 20240331"
  "20240401" - "20250331" = "20240401 - 20250331" 
  "20250401" - "20260331" = "20250401 - 20260331"
  "20260401" - "20270331" = "20260401 - 20270331"
  "20270401" - "20280331" = "20270401 - 20280331"
  "20280401" - "20290331" = "20280401 - 20290331"
  "20290401" - "20300331" = "20290401 - 20300331"
 ;
run;