2026年1月17日土曜日

よく使うコードの書き方をスニペットに登録して時間節約

何故 Snippet を使うのか?

よく使う割に書き方を忘れてしまうことがあります。そんなときにSAS Studioのスニペットが役立つということを遅ればせながら実感しました。スニペットは昔からある機能ですが、何故か敬遠というか存在を無視して使っていませんでした。

しかし、頻発する「あれはどうやって書くのか?」という度に検索したり、自分のBlogを読み返したりするのは時間が惜しくなってきました。で、典型例を探して自分のスニペットに登録し始めました。

いまボランティアワークでPrometheusからデータを取得する仕組みを作っています。SAS Viya Monitoring for Kubernetes からメトリクスを取得してシステム管理に役立つ何かを得ようとしています。そんな中で開発をちょっと効率化したいと思ったわけです。

私が登録しているSnippet

参考までに私が登録しているマクロを示します。
  • マクロ変数の値から引用符を取り除く
  • マクロのパラメータで値が無い項目をチェックしてエラーメッセージ出力
  • テンポラリのファイル参照名を定義
  • ファイル参照名が定義されているか判定してクリア
  • その他、PROC HTTPの例とか追加する予定

感じるメリット

書いてみると分かるのですが、諳んじて書くのと注意してコメントまで入れてロジックの穴を点検するのでは気づきがあります。例えばエラー処理で %goto でマクロの終端にジャンプするというのは統一していると方がより良いです。

また分かりやすいコメントも含めておくとより良いです。最近はCopilotに相談しながら英語圏の人でも分かりやすいコメントを入れるようにしています。急いで書くと不自然なコメントになってしまいます。

コードの例  

/* Remove quotation marks from parameter values */
%let macvar=%sysfunc(dequote(%superq(macvar)));

/* Check missing parameter */
%local /readonly list=from to step query out macvar debug;
%local i n item;
%let n = %sysfunc(countw(&list));
%do i = 1 %to &n;
  %let item = %scan(&list, &i);
  %if %length(&&&item)=0 %then %do;
    %put ERROR: Missing parameter &item in %sysfunc(lowcase(&sysmacroname));
    %goto exit;
  %end;
%end;
  
/* Assign a temprary file reference name */
%let macvar=_RF%sysfunc(putn(%sysfunc(monotonic()), z5.));
  
/* Clear the file reference name */
%if %sysfunc(fileref(&macvar))<=0 %then %do;
  filename &macvar clear;
%end;

2025年6月8日日曜日

ClipChampの使い方メモ、最短で学ぶ

 とある案件で操作説明の動画を作るように依頼されて仕方なくやってみた。そのときにコツと思える箇所があったので、他の人に役立つようにメモする。

  1.  目的に合わせて多少操作が迷ってスマートじゃなくても動画 MP4のファイルを作るのが優先
  2. MP4のファイルはClipChampで分割、複製できるので割らなくても良い
  3. タイトル、トラジション、説明画像はPPTで作成して .PNG でエクスポート
  4. ClipChampで、MP4の動画と.PNGをインポート
  5. 動画の余分な部分はスプリットして削除
  6. スプリットした間にタイトル、セクションや解説の.PNGを挿入
  7. 動画の一部を拡大したいときは複製してクロップで切り抜いてからサイズ調整
  8. 協調したいところにテキストや矢印を配置
  9. 動画やスライドの継ぎ目にトラジションの効果を入れる
  10. 音声合成で読み上げの文書を入れる
  11. その後で自動でキャプション作成し、生成されたトランスクリプションを手修正
  12. 必要に応じて音楽を足す
  13. MP4エクスポートして保存

1.まずは操作をTeams会議で録画して動画をつくる

多少、操作が覚束ないところがあっても後でスプリットして削除できる。間に「この部分は割愛」と表示して切り取る。またはスプリットで分けた期間を3倍速にして巻きで再生することができる。

2. 動画はあらかじめ分割しなくてもOK

ClipChampの中で動画を分割、複数コピーすることができる。同じ動画を複製して拡大部分を表示することも可能です。

3. タイトル、セクション、説明用のスライドはPPTで作成

細かい図や説明はPPTで作る方が楽だと思う。

4. ClipChamp で、MP4の動画と.PNGをインポート

これは+ボタンをクリックしてメディアを足すだけで簡単操作です。

5. 動画の余分な部分はスプリットして削除

動画を再生しながら切り取りたいところで停止してハサミのアイコンで分割します。

6. スプリットした間にタイトル、セクションや解説の.PNGを挿入

スプリットした動画の間隔を広げて、その空いた隙間の枠に.PNGを落とせばセクション区切りができます。セクション区切りを表示する期間はマウス、キー入力で調整できる。スプリットしてその間を削除しても、インポートしたメディアからその期間が消えてしまうわけではないので、バシバシスプリットして良いです。

7. 動画の一部を拡大したいときは複製してクロップ&サイズ調整

同じ動画を別なトラックにコピーして、クロップで切り取り拡大すると注目してほしい箇所をオーバーレイで表示できます。

8. 協調したいところにテキストや矢印を配置

これも操作は直観的にできるので説明省略

9. 動画やスライドの継ぎ目にトラジションの効果を入れる

タイトルと動画、セクションと動画の変わるところにトラジションの効果を入れると、場面が変わるタイミングがわかって視聴者の注意力を助ける効果が期待できる。

10. 音声合成で読み上げの文書を入れる

説明のキャプションをテキストで入れる方法もあるが、「録画と作成」から「音声変換」でテキストを打ち込み説明を入れるのが先。その理由は後からその音声でキャプションを作れるから。自分の声を当てたい人は別ね。

11. 自動でキャプション作成し、生成されたトランスクリプションを手修正

これも操作で迷わないと思う。右上のキャプションから自動キャプションを生成する。生成されたトランスクリプションの表示位置が分かりずらいが、右側の下に表示される。領域が縦長でかつカーソルの位置が見づらいので編集しにくい。

12. 必要に応じて音楽を足す

眠気防止の効果は有りそうだ。

13. MP4エクスポートして保存

社内だとクラウドで共有だが、外部に提供するときはMP4にエクスポートします。

2025年5月29日木曜日

ライブラリ参照名を定義しないでデータセットを格納する例

 ライブラリ参照名をテンポラリで作りたくないときがあります。そんなときにはディレクトリを指定してライブラリ参照名を定義しない使い方があります。古いTipsだけど忘れていた。



2025年5月13日火曜日

basename, dirname, nobs

良く使うけど、良く忘れるファイル名の操作のマクロをまとめておきます。DATAステップは使わずにマクロの文だけで作っているのでDATAステップの中でも値をはめこみ易いのです。高度なエディタだとマクロの終端を認識してくれないことがあるので、これらのマクロは最後の方に書きます。
このマクロの弱点は、括弧とか特殊文字がファイル名やディレクトリに混じると文字列の終端が判定できなくてERRORになることです。括弧を含む又は括弧の開始があって終了がないようなときはERRORになるので要注意です。

/* Strip directory and suffix from filenames. */
%macro basename(path);
  %local dequotePath orgLength dequoteLength lastSlash x;

  %let dequotePath=%sysfunc(dequote(&path));
  %let orgLength=%length(&path);
  %let dequoteLength=%length(&dequotePath);
  
  %let lastSlash=%sysfunc(findc("&dequotePath", "/", -%length(&dequotePath)));
  %let x=%substr(&dequotePath, %eval(&lastSlash));
  %quote(&x)
%mend;

/* Strip non-directory suffix from file name */
%macro dirname(path);
  %local dequotePath orgLength dequoteLength lastSlash x;

  %let dequotePath=%sysfunc(dequote(&path));
  %let orgLength=%length(&path);
  %let dequoteLength=%length(&dequotePath);
  
  %let lastSlash=%sysfunc(findc("&dequotePath", "/", -%length(&dequotePath)));
  %let x=%substr(&dequotePath, 1, %eval(&lastSlash-2));
  %quote(&x)
%mend;

/* Return number of obs. */
%macro nobs(mydata);
  %local NOBS;
  %let NOBS=0;
  %if %sysfunc(exist(&mydata)) %then %do;
    %let mydataID=%sysfunc(OPEN(&mydata., IN));
    %let NOBS=%sysfunc(ATTRN(&mydataID, NOBS));
    %let RC=%sysfunc(CLOSE(&mydataID));
  %end;
  &NOBS
%mend;

2024年12月6日金曜日

get-k8s-info.sh Viyaの情報をまとめて集めるツール

 Viyaの運用を行うのであれば常備しておきたいツールです。テクニカルサポート問合せのときに使います。実行方法はREADMEのCommand-Line Mode Exampleを見てください。デプロイしたときの site.yaml のあるディレクトリを引数で指定します。

リンクが間違っていたので修正

get-k8s-info.sh Script

2024年9月22日日曜日

ハンズで購入した木材で作るパームレスト

 分割型のキーボードに合わせて、パームレストを自作しました。これまでHHKBと専用のパームレストを使っていましたが、ちょっとした事故で肩を壊してから分割型キーボードに切り替えました。

ただの木の板を切断して表面処理をしただけでは面白くない?ので複数の銘木を組み合わせたものを自作してみました。ハンズでチーク、桜やカリンなど5種類の棒材が購入、それをサンドペーパーで表面をキレイにしてから木工ボンドと播金で圧着。水性ニスを重ね塗りと耐水ペーパーで表面を滑らかにしました。普通の一枚板よりも少しだけ洒落ていると思う。裏面はゴム脚つけて高さを出しています。

記録と参考のためにハンズのレシートを載せておきます。これにゴム足、水性ニス、刷毛、サンドペーパー、圧着するための播金があればできます。制作はのんびり作業して3日間ぐらいです。










2024年8月11日日曜日

SAS Viya Monitoring for Kubernetes からログを抽出するカスタムステップ

SAS Viyaでエラーを調査するときにOpenSearchでログを抽出するが、それを簡単に実行するカスタムステップがSAS Communities Libraryに紹介されている。ログの抽出が面倒な理由は複数ある。

  • OpenSearchで抽出できるのは10,000件というAPIの上限がある。
  • その制限の範囲内で抽出しようとすると手間がかかる。
  • フィールドを毎回選ぶのが面倒だ。
それをSAS Studioから範囲を指定して簡単に抽出できるのが、以下のカスタムステップです。get-k8s-info.sh, sas-viya configuration downloadと共に調査のツールとして使い手があります。