Casser Notes

SASメインで使っていたエンジニアのステップアップの記録

ブレイクスルー?

昨日は自分にとって後から見たらブレイクスルーだったな?と思うような1日だった

 

具体的には、悩んでるところにいろいろな方からアドバイスをいただけた

 

1つは、自分のやり方が合ってるのか、正しいのか分からない、とぼやいたところ、

正しさは自分の中にあるからそれとズレてなければいいんじゃない?

と言ってもらったこと

 

 

1つは、稼働可能な工数が少ないプロジェクトで、正しい工程を踏んだら確実に残業続きになりそうなところで、

  • まずモノ、プログラムをプロトタイプで作ってみる
  • 追加開発案件で元がある&一部仕様は他シス待ちで手戻りもある
  • まずはプログラムコピーで作ってみて動くものを作る
  • 動いたら設計書にリバース
  • 他シスの仕様も決まったらしっかりUT

というアドバイスをもらったこと

 

確かに見積もりは外部設計~内部設計~開発~UTというウォーターフォールでやったけど、
とりあえず動くものがあれば極論そのままITに進んでも何とかなるわけで心理的にも安心する

最初からミリミリ詰めるんじゃなくてざっくり作ってブラッシュアップする、
という完璧主義を治す方法、の話と同じだった
コレが100%正しい、というわけでもないけど、今の状況ではベターな選択

 

工程に拘りすぎてた自分にも気づけたし、無理なものは無理ですよ!と上に反抗してしまった中で
目からウロコが落ちるようないいアドバイスをもらえたのはとても、ありがたかった

 

もう一つは、副本部長さんという偉い立場の方と話す機会があって、自分のこれまでのコラボレーションしましょう!の活動だったり社内技術交流会の取り組み、

そしてなにより自分の綺麗事とも言えるポジティブに転換して考えることや、周りを巻き込みたい、管理職はこうあってほしい、というリクエストをとても評価いただけて、行動に移していただけると言ってもらったこと

 

 

1日にこんなに沢山の助言をいただけて幸せモノなのかもしれないし、

だからこそ結果を出す、愚直に目の前のことを潰すのは最低限やっていかないとと改めて

 

昨日も楽しかった

Advenceを取ってもwhereとサブセットIFの違いを間違えた話

今回はSASの話

 

とある案件でカラムの値ごとにファイルを出力したいという話があって、まあサブセットIFで分岐して適当にfileステートメントで出力したらいいだろうと考えてたけど、勉強不足から落とし穴にハマった

 

1 FILEステートメントは0オブザベーションでもファイルを生成する

まずここで悩んだ

結論としてはcall symput(count,_N_)で取得した件数を格納した&count マクロ変数を%symexist()を使って存在確認の上0ならfdeleteで削除するということにした

data _null_;
set dummy end = eof;
where type = "&typeval.";
file myfile dsd;
put type name;

If eof then
call symput("count",_N_);
run;

 

%if %symexist(cnt) = 0 %then
%do;
%put %sysfunc(fdelete(myfile));
%end;

※ コードは端折ってます

 

2 サブセット化IFステートメントとWhereステートメントの違い

SAS Certified Advanced Programerでやっていながら、ここの違いを勘違いしていた

 

上のプログラムは&typeval を 

%macname(typea);

%macname(typeb);

みたく別の値を与えてwhereで絞ってから出力&0件なら消すという処理をしてるけど、

最初はいつものクセでサブセット化IFでやろうとしていた

 

…が意図した結果にならず、結論としてはWhereとサブセット化IFのオブザベーション選択方法の違いにあった

 

すっごい初歩的な話だけど、よく理解できてなかった

●オブザベーション選択のタイミング オブザベーションを読み込む場合、PDV(プログラムデータベクトル)に値が読み込まれます。
WHEREステートメントはPDVに読み込まれる前に作用します。一方サブセット化IFステートメントはPDVに読み込まれた後に作用します。 

サブセット化IFステートメントとWHEREステートメントの違い - SAS Support Communities

 

そう、Whereの場合は例えば

type name

a taro

a jiro

b saburo

となっていた場合にwhere type = それぞれのtypeで絞った場合の_N_が

type _N_

a 2

b 1

となってくれるけど、if type=それぞれのtypeで絞った場合は

type _N_
a 欠損値

b 3

となる

 

最初はよくわからなかったけど、

whereは絞った状態でPDVに持ってきてくれるからtype a,bとも件数絞った状態で持ってきてくれて思った通りの_N_が取れる

 

しかし、ifの場合はPDVに持ってきてから弾くので、type bは3オブザベーション目なので3になる

type aはよく分かんないけど、3オブザベーション目が読み込まれた時にこれはいらねえってSASが判断して_N_をリセットしてるんだろうか

 

そもそも、サブセット化IFをよく使うようにしたのも、そっちの方が性能がいいから…としてた気がするけど、それも勘違いだったのかな…

 

まだ調べてないけど、なんかAdvanceの勉強した時の資料に書いてあった気がするʕ •́؈•̀ ₎

 

今のところはこんな感じだけど、とりあえずは目的を達成できたので良し

 

Advanceを取っても取るだけじゃダメだという教訓になった

条件ごとにファイル出力&ヒットするオブザベーションがない場合はファイルを削除する

今回はSASの話

 

とある案件でカラムの値ごとにファイルを出力したいという話があって、まあサブセットIFで分岐して適当にfileステートメントで出力したらいいだろうと考えてたけど、勉強不足から落とし穴にハマった

 

1 FILEステートメントは0オブザベーションでもファイルを生成する

まずここで悩んだ

結論としてはcall symput(count,_N_)で取得した件数を格納した&count マクロ変数を%symexist()を使って存在確認の上0ならfdeleteで削除するということにした

data _null_;
set dummy end = eof;
where type = "&typeval.";
file myfile dsd;
put type name;

If eof then
call symput("count",_N_);
run;

 

%if %symexist(cnt) = 0 %then
%do;
%put %sysfunc(fdelete(myfile));
%end;

※ コードは端折ってます

 

2 サブセット化IFステートメントとWhereステートメントの違い

SAS Certified Advanced Programerでやっていながら、ここの違いを勘違いしていた

 

上のプログラムは&typeval を 

%macname(typea);

%macname(typeb);

みたく別の値を与えてwhereで絞ってから出力&0件なら消すという処理をしてるけど、

最初はいつものクセでサブセット化IFでやろうとしていた

 

…が意図した結果にならず、結論としてはWhereとサブセット化IFのオブザベーション選択方法の違いにあった

 

すっごい初歩的な話だけど、よく理解できてなかった

●オブザベーション選択のタイミング オブザベーションを読み込む場合、PDV(プログラムデータベクトル)に値が読み込まれます。
WHEREステートメントはPDVに読み込まれる前に作用します。一方サブセット化IFステートメントはPDVに読み込まれた後に作用します。 

サブセット化IFステートメントとWHEREステートメントの違い - SAS Support Communities

 

そう、Whereの場合は例えば

type name

a taro

a jiro

b saburo

となっていた場合にwhere type = それぞれのtypeで絞った場合の_N_が

type _N_

a 2

b 1

となってくれるけど、if type=それぞれのtypeで絞った場合は

type _N_
a 欠損値

b 3

となる

 

最初はよくわからなかったけど、

whereは絞った状態でPDVに持ってきてくれるからtype a,bとも件数絞った状態で持ってきてくれて思った通りの_N_が取れる

 

しかし、ifの場合はPDVに持ってきてから弾くので、type bは3オブザベーション目なので3になる

type aはよく分かんないけど、3オブザベーション目が読み込まれた時にこれはいらねえってSASが判断して_N_をリセットしてるんだろうか

 

まだ調べてないけど、なんかAdvanceの勉強した時の資料に書いてあった気がするʕ •́؈•̀ ₎

 

今のところはこんな感じだけど、とりあえずは目的を達成できたので良し

 

Advanceを取っても取るだけじゃダメだという教訓になった

ラフな社内技術交流会

昨日午前は明日やる社内技術交流会の準備をした

 

今回は普段接しない人たちがグループに分かれてピザでも食べながら日頃の疑問や悩みを寄せ合って解決したり、

すぐ解決しないものはまとめて上に上げましょう、

という会をやる

 

この会は普段は運営メンバがコンテンツを見繕って発表依頼して参加者は聞くだけ…という形だったんだけど、

参加者から受身すぎるとか言われたり、

交流会が形骸化してるみたいな声があったので、原点に立ち返って交流会メインでやって、

そこから何かリクエスト、ヒントを貰おう、という回を計画した

 

毎回運営もプロジェクトみたいに手順書通りにかっちりやってたけど、そこも結構大雑把にゆるい感じでやるように変えた

 

ここからまた再スタートが切れるといいなぁ

 

昨日も楽しかった

リングフィットきつい

昨日は家でだらだら

 

リングフィットを最大負荷でやってるけど、あれしんどすぎないか…?

 

最初のころはまあいける、って感じだったけど、プランクとかリングアローの最大負荷がしんどすぎる

 

これ本当にジム解約してもいいかも…?

 

筋トレや運動は自己肯定感を上げるのやドーパミン分泌のために欠かせない

とはいえ、こう時間外が嵩むとそんなに時間も取ってられない…

 

今日もリングフィットしよう

 

昨日も楽しかった

自分のストレス解消法

一昨日の分

 

休日初日はグデーッとしちゃうのは書いたけど、その流れで夜間フリータイムでカラオケをしてた

 

計50曲ほど歌ってた模様

ほとんどがストレイテナーの曲

 

カラオケって、この人たちこの曲知ってるかな、盛り上がるかな、とか気にしないといけないので面倒

 

それを自分だけとか、身内の少人数とかだと気にしなくて良いから楽

 

12月はテナーのライブが3回もあるのでそれを糧に生きていく

 

一昨日も楽しかった

休日初日の体力

昨日は余りまくってる有給を消化した

 

まだ20代ではあるものの、残業続きの平日明けの休日は、初日が使い物にならなくなってきた

 

朝はいくら寝ても眠いし、昼間も出かけるとちょくちょく座らないとしんどい

 

一応ジムも最近は週1ペースだけど行ってるし、ランニングとかそういう意味での体力はある方だと自負してるけど、精神的な疲れみたいなのが出てきた

 

12月はストレイテナーのワンマン2DAYSがあったりCDJ3DAYSもあるのでそこで2019年に溜まったものを全て吹っ飛ばす予定、そこまで持ってくれ

 

何にせよ、今年は悪いことを良いことに都合よく発想転換できるようになったのがでかい

 

昨日も楽しかった