2018年8月15日水曜日

プログラムをデバッグする話

データステップにデバッグオプションを付けると,デバッガが起動します.
1stepごとに実行し適宜変数の値を確認したり,指定した箇所まで実行したりすることが出来ます.
excelで言う所のデバッグトレースですかね.

以下のプログラムを実行すると,データステップにdebugオプションが付いているので
データステップデバッガが起動します.

data hoge  ;
    val1 = 1 ; val2 = 2 ; type = "A" ; output ;
    val1 = 1 ; val2 = 2 ; type = "B" ; output ;
    val1 = 1 ; val2 = 2 ; type = "C" ; output ;
run ;

data hoge2 / debug ;
    set hoge ;
    if TYPE = "A" then VAL3 = VAL2 - VAL1 ;
    if TYPE = "B" then VAL3 = VAL2 + VAL1 ;
    if TYPE = "D" then VAL3 = VAL2 * VAL1 ;
run ;





 





  















デバッガが起動すると,debugger log とdebugger sourceの二つのwindowが立ちあがります.

debugger logの下部にある点線の下にコマンドを入力し,デバッグを行います.
debugger sourceの黒線部分が今実行する直前のステートメントです.

ココで出来ることは,以下の感じです.
もちろん他にも機能はありますが,とりあえずこれだけです.
  • 指定した行数分ステートメントを実行(stepコマンド)
  • 指定した変数の値を確認(examineコマンド)
  • ステートメントを指定して,そのステートメントまで実行(breakコマンド)
  • 指定した変数の値が変わるまで実行(watchコマンド)
  • デバッガを終了(quitコマンド)
breakコマンドはexcelで言う所のbreakpointとほぼ同じだと思います.
 デフォルトではエンターキーがstep1に対応しているので,
debugger logでエンターをたたくと1ステートメントだけ実行されます.
以下の画像ですと134行目に黒線があるので,133行目まで実行されている状態です.
この状態でexamineコマンドでVAL3を見ると,値が1になっています.
examineコマンドは黒線がある直前まで実行された段階での変数の値を返してくれます.
ですのでdebugger logにステップ:行132カラム24の時にすべての変数の値を確認すると,VAL3は欠測になります.
(まだ132行目のTYPEが"A"の時にVAL3を演算する処理が実行されていないため.)
 _N_=1のため,今は1レコード目を読みこんでいる状態でデバッグをしていることが分かります.

データステップデバッガも例にもれず,1レコード読みこんで,すべてのステートメントを実行して,
また次のレコードを読みこんで...と進んでいきます.
確認したいレコード番号が大きいとそこまで実行しないといけません.
いちいちエンターキーを叩いて1レコードごとに実行しているとキリが無いので,
watch,breakなどを駆使して確認箇所まで実行するのが良いのではないでしょうか.



















マクロのデバッグにも使える感じですね.

参考資料
<http://www.sas.com/offices/asiapacific/japan/service/help/pdf/lebaseutilref.pdf>
dataステップデバッガの項目

SASユーザー会行ってきました

今年もSASユーザー会行ってきました.
台風がかすっていきましたが,まあ何とか全日程が完了してよかったです.

1日目は台風とともに東京に向かうことに.
前日入りも覚悟していたところでしたが,東にそれたと聞いて当日東京に向かうことに決定.
霧雨の舞う中会場にたどり着き,荷物はびしょびしょ.
雨が風で舞う所為で傘がその機能を果たしてくれず,それはそれはぬれました.
一日目はルームDを中心に発表を聞く.
ODS TABLE,rtf作成時のfont調整等々なかなか便利そうなものばかり.
fontの調整はあの発表をそのままパクってしまおうかな...

セッションが午後のみだったのであっという間に一日目は終了,懇親会へとなだれ込む
雨の中の移動にエネルギーを思ったより使ったのか,ご飯を見るとおなかがみるみる空いてくる.
乾杯の挨拶中に食べたいものにあたりをつけ,乾杯後に早速ご飯をget
周りを見ると先輩が知り合いを連れてきて後輩が群れを成して名刺交換にいそしむ光景がちらほらありましたが,そんなものは知らぬ.おなかが空いている.

台風が明日にでも命中するとの予報だったので,2次会も無く解散しホテルへと引き上げる


2日目はもはや台風の気配など無く普通に晴れ.
全日程にわたる雨を覚悟し,折り畳みではないかさを持ってきた私は拍子抜けしました.
自分の準備が出来ていなかったので,直前のセッション中に準備をして何とか間に合わせる.
どうもやっつけな準備をしたせいか発表もやっつけに終わってしまった気がするが,終わればいいのだ終われば.

自分の発表を終えるとイマイチ気が乗り切らず,ほどほどにセッションを見てほどほどに切り上げるとする.
東大の中央食堂に乗り込むとそれはそれは綺麗で広大で自分の学生時代との差に悲しみを背負うが,
悲しみも早々に忘れてデザートをパクついて糖分を補給,悠々と会場に戻って最後のセッションを見て今年のユーザー会もお開きに.

今年のノベルティは扇子,拡大鏡,メモ帳の三択でしたが,
扇子以外にもらうものが無かったので実質一択.メモ帳もらっても...ねえ...?
しかしSASユーザー総会,椅子をですね,もう少し増やして欲しいなと思いますね.頼むわ.

会の後は知人との飲み会が新橋であるので急行し,安居酒屋でチャーハン,ジンジャーエール,モツポン酢をいただく.
ジンジャーエールはもう少し辛口のほうが私の好みであったが,所詮安居酒屋.高望みはすまい.
知り合いも変わりなくSASとは全然関係ない話に華を咲かせ,23時頃にホテルに引き上げそのままお布団へ.

9月にPharmaSUGがあるので,次はそのタイミングで東京にいくとしましょうかね.
申請やら報告書がめんどくさいので有給で行きたいが,果たして申請が通るかどうか.
通って欲しいなあ.