2012年12月31日月曜日

SAS Log Inspector Version 1.1.0.0をリリース

年末年始の休みを使って、SAS Log Inspectorの機能追加を行いました。マッチングのパターンを追加、修正することが出来ます。



SAS Log Inspectorの機能
  • 複数のログファイルからエラー、バグに繋がるNOTEを集計
  • 日本語と英語版のメッセージに対応
  • Excelファイルにログをチェックした結果をエクスポート
  • 任意のチェック項目を検査対象から外すことができる
  • Notepadを起動して、該当のログファイルを参照できる
  • マッチングパターンを追加、修正できるように機能を追加





2012年12月24日月曜日

SAS Log Inspector Version 1.0.0.0をリリース

SAS Log Utilityから機能を分離して、ログを検査するツールを開発しました。まもなく、Vectorで公開されます。主な用途は、SASプログラムのテスト結果(エビデンス)をまとめるために使います。これまで、チェック項目の件数のみを保存していましたが、「Miss Val」などの短縮したメッセージの意味を聞かれることが多かったので、マッチングの結果も表示するように変更しました。



SAS Log Inspectorの機能
  • 複数のログファイルからエラー、バグに繋がるNOTEを集計
  • 日本語と英語版のメッセージに対応
  • Excelファイルにログをチェックした結果をエクスポート
  • 任意のチェック項目を検査対象から外すことができる
  • Notepadを起動して、該当のログファイルを参照できる





2012年12月3日月曜日

SAS Log Inspector 開発中

SAS Log Utilityから機能を分離して、ログを検査するツールを開発中です。案件によってはログを検査する機能だけあった方が、取り回しやすいので新規でコードを起こしました。元々のコードが荒れていたので、マッチングのパターンを追加、修正しやすくしています。年内に開発してVectorに載せる予定で進めています。



SAS Log Inspectorの機能
  • 複数のログファイルからエラー、バグに繋がるNOTEを集計
  • 日本語と英語版のメッセージに対応
  • Excelファイルにログをチェックした結果をエクスポート
  • 任意のチェック項目を検査対象から外すことができる





2012年8月30日木曜日

日本語版SASオンラインヘルプβ版

SAS社から「日本語版SASオンラインヘルプβ版」の案内メールが届きました。
いまの時点ではNLSの部分しかありませんが、順次拡充していくようで期待しています。

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;

2012年5月28日月曜日

年代の書式定義

仕事用のメモです。4月始まりで年代を分けるための書式定義です。

options mprint source;

%macro date_fmt(from=, to=, fmt=, fmtnam=);
        %local i tcount;

        data _null_;
                format from to end yymmddn8.;

                from = &from;
                end = &to;
                tcount = 0;

                do while (from < end);
                        to = intnx('MONTH', from, +11, 'END');
                        tcount = tcount + 1;

                        /* マクロ変数を定義 */
                        value = put(from, &fmt);
                        macvar = compress("FROM" || put(tcount, BEST.));
                        call symput(macvar, compress(value));

                        value = put(to, &fmt);
                        macvar = compress("TO" || put(tcount, BEST.));
                        call symput(macvar, compress(value));

                        call symput("TCOUNT", compress(put(tcount, BEST.)));

                        /* 次の年を設定 */
                        from = intnx('MONTH', from, +12);
                end;
        run;

        /* 書式を設定 */
        proc format;
                value &fmtnam
                        %do i=1 %to &tcount;
                                "&&from&i" - "&&to&i" = "&&from&i - &&to&i"
                        %end;
                ;
        run;
%mend;

%date_fmt(from='1-Apr-1990'd, to=today(), fmt=YYMMN6., fmtnam=$DATE6_F);
%date_fmt(from='1-Apr-1990'd, to=today(), fmt=YYMMDDN8., fmtnam=$DATE8_F);

data _null_;
        x = put(today(), yymmddn.);
        y = put(x, $DATE8_F.);
        z = put(x, $DATE6_F.);
        put _all_;
run;

2012年5月24日木曜日

SRX, 仕事で使ってみた。良かった!

Microsoft風に現せば、自らドッグフードを喰らうとでも言うのでしょうか。SRXを仕事で使ってみたが、なかなか良かった。いくつもあるSASコードから、同じような問題箇所を洗い出し、報告用の資料を作りました。

Windows環境だと、拡張子.SASのコードの中身を検索できないことがあります。社内ではUNIX上でgrep(1)を使うのですが、エビデンスのファイルを作るのが面倒でした。今回は、SRXを使ってSASプログラム一覧を作成し、抽出パターンとマッチングした結果をExcelファイルに保存しました。30分程度で、まとまったExcelファイルになって、素早さが好評でした。

改善したいと思ったのは、Excelファイルにエクスポートしたときに、ヘッダ、フッタの設定です。これも機能化すれば、10分程度でエビデンスを抽出して精査の時間をゆったり取れます。あ、Windows7未対応でした。

2012年5月15日火曜日

SASログの字句解析を作り直す。

SAS Log Utilityで120MB程度のSASログを解析したら、えらく時間が掛かった。Elapsed, CRUDの字句解析を個別に行っていましたが、処理効率が悪いので1つにまとめることを検討します。それと、画面の更新も足を引っ張っているので、BeginUpdate、EndUpdateで表示周りも調整します。

SASとVBScriptの連携

仕事柄VBScriptとSAS.EXEを連携することが多くあります。 サンプルコードを貼って、LanguageService Objectの資料をリンクしておきます。

'---
'    SASワークスペース・オブジェクトの生成
'---

Set oWrkSp = WScript.CreateObject("SAS.Workspace")

'---
'    ランゲージ・サービスの取得
'---
Set oLngSp = oWrkSp.LanguageService

'---
'    プログラムの実行
'---

oLngSp.Submit "data class; set sashelp.class; run; proc print; run;"

'---
'    ログの表示
'---
MsgBox oLngSp.FlushLog(100000)

'---
'    アウトプットの表示
'---

MsgBox oLngSp.FlushList(100000)

'---
'    ワークスペースを閉じる
'---

oWrkSp.Close
Set oWrkSp = Nothing

WScript.Quit(0)

2012年3月31日土曜日

TAdvMemoの日本語が表示が崩れる。

SAS Log Utilityの原文表示の機能を開発中です。TAdvMemoを使うつもりでしたが、どうにも日本語が文字化けしてしまいます。ソースコードがあるとはいえ、今の私の力量では難しい。あきらめて、TMemoで原文表示を実装するか思案しています。

表示が途切れるTAdvMemo


2012年3月22日木曜日

SAS Log Utility 1.5.2.1 リリース, Vectorに公開

仕事で使っていることもあり、機能制限版をVectorに公開しました。ダウンロードする人がいるかな?

2012年3月18日日曜日

原文参照を実現するサンプルコード作成中

SAS Log Utilityに原文参照の機能を加えるべく技術調査をしています。TAdvMemoのTopLineに値をセットして、指定した行にジャンプできます。TMemoには無い属性です。

TAdvMemoの技術検証サンプル

To Do

やりたいことを整理します。
  • SAS Log - 入出力データを集計する機能
  • SAS Log - ログファイルを参照する機能(原文参照)
  • 次のユーティリティ作り(SRX)
  • 次のユーティリティ作り(DFD)
終了
  • 2012/03/17 SAS Log - CRUD表のセルを矢印で移動する機能
  • 2012/03/16 SAS Log Utility 1.5.2.1のリリースをVectorに申請
  • 2012/03/14 SAS Option ReportのリリースをVectorに申請
  • 2010/07/03 VectorにSAS Log Utility1.2.1.0のリリースを申請
  • 2010/01/04 VectorにExcel Page Setup Utilityのリリースを申請
  • 2009/12/28 仕事で使うExcelのヘッダ/フッタ設定のツールを作成
  • 2009/10/25 VectorにSAS Log Utility 1.1のリリースを申請
  • 2009/10/25 マクロでないDataステップにマクロ名がセットされる問題を修正
  • 2009/10/25 ファイルI/Oのエラーハンドリングをリライト。
  • 2009/10/25 Export中の砂時計
  • 2009/09/23 CRUD(detail)の表示項目にマクロ名を追加
  • 2009/09/23 1.0.5.0としてリリースを申請
  • 2009/09/03 マクロ単位で処理時間を集計する機能を実装した。
  • 2009/07/22 新しいバージョン 1.0.3.0 をリリース
  • 2009/07/17 SAS Log UtilityのCRUD(summary)を実装した。
  • 2009/07/?? 新しいバージョン1.0.2.0をリリースした。
  • 2009/07/05 CRUD表で256列を超えるデータのバグ修正
  • 2009/07/05 Excelへのエクスポート処理をリライト
  • 2009/06/28 複数のログファイルに対応
  • 2009/06/28 OBSが0のときにデータセット名が空白になるバグを修正
  • 2009/06/28 データセット単位の集計でカウントが0になるバグを修正
  • 2009/06/28 英語版のログを解析できるように修正してテスト
  • 2009/06/27 CHANGEのログを拾えるように修正
  • 2009/06/22 DELETEのログを拾えるように修正
  • 2009/06/22 Excelが起動しないときのエラーハンドリングを追加
  • 2009/06/19 Vectorにプログラム登録の申請
  • 2009/06/02 SAS Log Utilityの処理時間集計にクスポート機能を実装
  • 2009/06/02 SAS Log UtilityのDATAステップ処理時間集計にクスポート機能を実装
  • 2009/06/02 Vectorにライブラリ作成者の登録を申請済み
  • 2009/05/31 何故かアイコンが設定できない問題をクリアするためプロジェクトを再構築
  • 2009/05/20 SAS Log UtilityのCRUD(detail)にエクスポート機能を実装する。
  • 2009/05/19 DelphiでStringGridからExcelへのエクスポート方法をテスト実装したが遅い。
  • 2009/05/18 SAS Log Utilityの画面イメージを投稿
  • 2009/05/17 バージョン情報のダイアログを追加
  • 2009/05/17 2回目以降にログファイルを開いたときの動作を検証
  • 2009/05/17 メモリリークを調査して修正
  • 2009/05/10 ブログの立ち上げ
  • 2009/05/11 動作環境津について記述
  • 2009/05/12 SAS Log Utilityの概要と機能を書いた。

2012年3月10日土曜日

SAS Option Report 1.2.0.0をリリース

仕事で使っているツールをSAS9.3対応で修正し、Vectorに登録しました。PROC OPTIONS VALUEのログを表形式に整形して、Excelファイルにエクスポートするツールです。SAS環境構築の仕事をしている人に役立つかも知れません。

2012年2月6日月曜日

SAS Log Utility 1.5.1.1 リリース

Vectorへの公開をストップしていますが、私の仕事用に更新しています。
  • 各タブにあったExport機能を削除
  • Potential Problemの名称を、Latent Problemに変更
  • Latent Problemのチェック項目を追加して機能を強化
  • Latent Problemからノートパッドでログを表示できるように修正
  • SAS9.3のログに合わせて、マッチングパターンを修正
  • ListViewをAdvListViewに、StringGridをAdvStringGridに変更
  • 開発環境をDelphi 2009から、Delphi XE2、Windows7に変更


2012年1月16日月曜日

TMS Software, TAdvListViewのインストールでエラー

環境を刷新
Delphi 2009からXE2へ、Windows XPから7にバージョンアップしました。ツール群もリライトしてコンパイルしていきます。オフィス系ドキュメントの互換性から、バージョンアップを避けてきましたが、XPのサポート切れが近づいてきたので、重い腰を上げます。

さっそくトラブル
そんな作業のなかで、TMS SoftwareのTAdvListViewを購入しましたが、インストールがうまくいきません。手書きの下手なイベントハンドラを捨てて、使いやすいパッケージの導入を目論みました。が、インストールがうまくできません。
エラー: パッケージ …alvPkgDXE2.bpl はバージョンの異なる Delphi または CBuilderで作成されたためインストールできません。

サポートに問い合わせて返事待ちです。