読者です 読者をやめる 読者になる 読者になる

53歳限界プログラマの憂鬱

SU/CAR-ST-APplication-cellsから派生したプログラマのブログ

本家はこちら↓
f:id:sucar:20151115183011p:plain

SU/CAR-ST-APplication-cellsの安倍野ミックスと申します
来訪ありがとうございます
シストレツールを自作してます

f:id:sucar:20150414193802p:plain

にほんブログ村 IT技術ブログ プログラム・プログラマーへ
にほんブログ村 IT技術ブログ C/C++へ
にほんブログ村 株ブログ 株日記(アフィリなし)へ
←ランキングに
1票お願いします

gawkとigawk (@include)

awk

awkで@include文を活用する記事を書いた

abenomix.hatenablog.com

ただ、gawk 4.0 以降だと@include文が使える

といことはそれ以前のバージョンだと@include文は使えない

mingw+msysのシステムだとgawk3.1.7なので、@includeは使えなかった

まあ、どこかから4以上のバージョンのものをとってきて置き換えればよさそうだが

いろいろググってみるとigawkというシェルスクリプトがあり、これをgawkの代わりにつかうと@include文が使えるらしい

ということで試してみたらエラーが出る

どうもバージョン4以降のgawkとigawkでは少し違いがあるようだ

調べたところ

バージョン4以降のgawk

@include "インクルードするファイル"

と""が必要

igawk

@include インクルードするファイル

と""は不要

ということらしい

なぜ統一しなかったのだろう? まあいいけど

 

awkの引数で-vオプションのありなし

awk

自作のawkスクリプトコマンドラインから、引数を渡そうと思い、ググったところ

qiita.com

で詳しく説明されていた

詳細はリンク先を見てもらえばわかるので改めて説明はしませんが簡単に書くと

  • awkで引数を渡す場合2つ方法がある
  • 1つは-vオプションを使う方法
  • もう一つは-vオプションを使わない方法
  • -vオプションを使うとちゃんとBEGINブロック内でも代入した値を参照することができる
  • -vオプションを使わないとBEGINブロック内で代入した値を参照することができない

ということで、最後に

-vオプションを使わない方法は、どのような場面で活用するんだろう... 思いつかない

で終わっている 当然

「なるほど、まあ普通-vオプション必要だよな」と思ったのだが・・・

自作awkスクリプトに引数を渡すshellスクリプトを作成したのだが、何と逆に-vオプションをつけるとうまくいかないことが発覚!

つまり、自分の設計は、あまり他人が思いつかない

-vオプションを使わない方法が活躍する場面

を無意識に想定していたのでした(やはり私は天邪鬼?)

いや、むしろ-vオプション付けない方が楽なんだけど・・・

以下、説明を試みる

-vオプションを付けると順番は以下のようになる

  1. コマンドラインでの変数への代入
  2. BEGIN{}の実行
  3. 本体の実行
  4. END{}の実行

これが、-vオプションを付けないとこうなる

  1. BEGIN{}の実行
  2. コマンドラインでの変数への代入
  3. 本体の実行
  4. END{}の実行

確かに-vオプションを付けない場合の処理の順番は変な感じである

大体、BEGIN{}の前に変数に代入されなければ、チェックすらできないではないか

うっかり代入しなかったらNULLになって・・・・

で、ここではたと気付くのである

代入しなかったらデフォルトの値を使ってくれた方がいい場合もある

BEGIN{}の中で変数にデフォルト値を入れておき、使う時にコマンドラインで変数を書き換えてやる、ってのが、-vオプションを使わない方法だとすんなりできるのだ

これが、-vオプションを使って引数を渡すと、BEGIN{}の中で変数にデフォルト値が上書き代入されてしまうので、渡しても意味がなくなる

-vオプションで渡す場合、BEGIN{}の中で変数のNULLチェックをして、NULLなら、デフォルト値を代入ってやらなければならない面倒な部分が-vオプションを使わない方法なら、BEGIN{}の中でのチェックは不要になる

awkはいろいろ奥深いですw

 

awkで$数字でなく$列名で計算(@includeの活用)

awk

awkは便利です

なので、なるべくエクセルじゃなくawkを活用しようと考えている今日この頃・・・

今、システムの大規模改良を目論んでいて、C言語ソースから大幅に手を入れようと思っているのだけど、なかなかC言語でのシステムの出力データのフォーマットが決まらない・・・

これが決まってないと、その出力を入力とするツールがどうにもならないのです

awkにせよ、エクセルにせよ、列がずれると使い物にならない(方法はあるのかもしれないけどよくわからない)

R言語ならデータフレームに取り込んで、データフレーム$列名でアクセスできる

だけど・・・

エクセルはともかくawkでは何とかしたい

ということで、どんくさいけどこんな方法を考えてみた(たぶんもっとエレガントな方法があるんじゃないかと思うのだけど・・・)

まず、列名付きのcsvデータを準備

扱えるフォーマットは2種類

f:id:sucar:20170205102509p:plain

↑1行目はコメント行:約束として最初のセルに #1 と書くことにする

2行目に列名indexが記述される

f:id:sucar:20170205102752p:plain

↑コメント行なし 1行目に列名indexが記述される

で、awkで、例えば、hjm1を抜き出したかったら

print $2

とか書くのだけど これを

print $hjm1

と書けるようにしたいという話

いろいろ方法を考えて、連想配列使えばできそうなんだけとそれだと

print $ar["hjm1"]

とかなりそうで、記述が美しくない

で、gawk 4.0 以降だと@include文が使えるらしいのでこれを活用してみるテストを実施

以下test1.awk

#使い捨て関数をインクルード
@include "indexfunc.awk"

BEGIN{
	FS = ","
	#使用する変数に大きなマイナス数を入れておく
	owa1=hjm1=-10000
	#使い捨て関数実行
	indexfunc()
	#使用する変数の和がマイナスならエラー
	if (owa1+hjm1<0) {
		print "error\n"
		exit
	}
}
NR==1{
	if ($1!="#1") {
		hd=1
	}
	else {
		hd=2
	}

}
#本体
NR>hd{
	printf("%s=%8.2f : %s=%8.2f\n","hjm1",$hjm1,"owa1",$owa1)
}

こんな感じで、要はhjm1=2 owa1=5を代入してくれる関数を別途作ってincludeしてあげればよい

で、indexfunc.awkawkを使って

以下test.awk

BEGIN{
	FS = ","
	print "function indexfunc() {\n"
	}
NR==1{
	if ($1!="#1") {
		for(i=1;i<=NF;i++) printf("%s=%2d\n",$(i),i)
		print "}\n"
		exit
	}
	else {
		hd=2
	}
}
NR==hd{
	for(i=1;i<=NF;i++) printf("%s=%2d\n",$(i),i)
	print "}\n"
	exit
}

ってやって作成する

これらを纏めるシェルスクリプトを作成

以下awktest

#!/bin/bash
awk -f test.awk $1 > indexfunc.awk
awk -f test1.awk $1 
rm indexfunc.awk

こんな感じで

f:id:sucar:20170205104717p:plain

一応うまくいった感じ

これで、データのフォーマットがどんなに変更されても列名さえ変化なければawkスクリプトは変更する必要はない

ただ、気になる点として・・・・

変数名を間違ってもエラーにならず、0が入るだけで$0が参照され、そのまま処理が進んじゃうとこが、ちょっと・・・

まあ気を付けるしかないか

 

 

逃げ恥・・・「そういうこと」

ドラマ 逃げ恥

相変わらず「逃げ恥」についてw

明日の展開でいろいろわかるとは思うけど、みくりの「ひらまささんとならそういうことしてもいいですよ」発言に対する津崎の「無理です」発言についてw

まあ、正直みくりはいいこ・・・いいこすぎる・・・

「かんち、〇〇〇しよ」なんか霞んでしまうほどの涙が出るほど感激しそうなセリフ

でもやはり津崎は「無理です ごめんなさい」というしかないようだ

みくりにとってはショックだが、津崎は多分「一生そういうことはしない」と心に決めているふしがある(独身のプロ ドリンクは一生不要など)

ポイントは両親にあるのではないか?

みくりの両親は今でもラブラブである

子供の前でも自然にラブラブな言動をとっていて、みくりも、夫婦とは、好きあっている男女とはそういうものだと思っている

スキンシップ、ハグの延長にキスがあり、その延長に「そういうこと」あり、その結果として自分の存在があることを自然に肯定できる

しかし、津崎の両親はそんな感じではない

基本的に男の子は母親が好きだが、その結果父親が嫌いで憎いことは多々ある

自分の存在が両親の「そういうこと」の結果であることが、両親の愛情ではなく父の欲望からきてるとしか思えない=自分の存在を肯定できないし、好きな女性とも「そういうこと」を自分の欲望からすることを肯定できない

みくりの「してもいいですよ」には「ひらまささんがしたいのなら」という前提があるように聞こえる

なので津崎は「したいわけじゃない」と答えざるを得ない

まあかなりこじらせているが・・・

明日どうなるか? みくりは帰ってくるのか? わからないけど、みくりは心理学専攻なのでいつかは津崎を心から理解できるんだろうな、とは思う

そうなったら大学院での勉強が恋愛に役立つのだから多分みくりは嬉しいだろう(=ひらまささんを理解してあげられるのは世界で私だけって思えるから)

でも、そうなったらドラマは終わりだろうから淋しくなるなw

 

ふと思ったがこのドラマは津崎とみくりの心の声がよく出てくる

演出としては役者の内面は演技で語らせるべき、とも思うが、津崎の心の声がなかったら視聴者には全然わからないだろうw だからそれでいいのだろう

また、嵌る前はみくりの妄想シーンは???だけど 嵌ってしまうとあった方がいいなと思うw

あとパンツの洗濯を拒むのもそういうことかな、と思ってしまった(ご婦人にはわかりにくいけど)

 追記)8話見たけど・・・
 そんなに深刻でなく「経験がないから」で軽く終わってしまったw
  

逃げ恥・・・嵌ってます

ドラマ 逃げ恥

うーん、全然このブログの趣旨から外れるけど、先週の火曜日から「逃げ恥」に嵌ってしまったので、それについて記事を書こうとしているんだが・・・・

まあ、ドラマそんなに見る人間ではないのだが、それでも半沢直樹は面白かったし、たまにはDr.Xとかも見たりはしてる

家政婦のミタはほとんど見なかったけど、ゲゲゲの女房は見てた

まあ、話題のドラマは少しは見ると言いたいだけだが、今回の「逃げ恥」には嵌ってしまったw

感じとしては「デート」に近いが、嵌り度数は「逃げ恥」の方が何倍も強い(百倍くらいかも)

これまで一番好きなドラマは(古いですが)「雑居時代」だったが「逃げ恥」はそれを凌駕してしまったw

まあ確かにガッキーはかわいい

正直第一話を見ようと思ったのはそれだけだったかもしれない

特に新垣結衣のファンではないが、ドラマ開始前の宣伝での新垣結衣のかわいさは尋常ではないと思った

それで珍しく第1話から見始めたのだが・・・

確かにガッキーのみくりはかわいいと思った

しかし、冒頭の情熱大陸風の部分が???で(のちにみくりの妄想とわかるが)派遣を切られて、津崎のところで家事代行を始めるところまで見て消してしまった

やはり「ヒロインかわゆす」だけでは、1時間はもたない

始まったばかりだが、特にその後の展開が気になるわけでもなかったというのが正直なところ

夜10時開始なのは覚えたが何曜日かは記憶に残らなかったので2話以降は見なかった

しかし、ネットでの評判はうなぎ上り

少し気になっていたが、たまたま10時にテレビをザッピングしていたらガッキーが出てきたので冒頭を見た

第5話だったのだが、選挙カーの上でガッキーが演説していたシーンが・・・

なんか???だったので(1話からの流れを見てないので当然かもしれないが)やはり消した

しかし、ネットでは更に盛り上がっていて、6話ではついに・・・と

今度はちゃんと見ようと思って6話はちゃんと見た(この頃やっと火曜と認識)のだが・・・

ちょっとはまったけどみくりの元彼の言動がちょっと見るに堪えない気がして半分だけみて消したw

7話は翌日が休みだったので全部見た

うーんそれで嵌ってしまった

多分理由は津崎に共感してしまったのかもしれないw

その後ネットでいろいろ探して1話からの空白を補完したのだけど・・・

まさか自分の中で「雑居時代」を超えるラブコメドラマに出会うとは思わなかった

まあ津崎もプログラマという設定なのでここにこんな話書いてもいいでしょうw

 

6 プログラムメイン部分先行公開

改めて開発日記

改めて開発日記

は、1~5までで、いろいろインストールしてるだけですが、別のPCである程度進んでいるので、記念に(なんの記念だ?w)

にメイン部分を公開(突っ込みはなしで)

とりあえず

/*
 * 業種別を取り込む準備⇒廃止
 * 分割処理 1/500まで拡張
 * 分割時の代金バグを修正
 * mt_rule対応
 * 表示用dispda[][]
 * 2016/6/25 出力をdispda[][]⇒owa[][]
 * simxp7->8
 * 出力を根本的に変える(一つずれる)
 *
 * 2016/8/11 
 *	char* c_cfg=".\\code\\code.cfg"; を
 *  SHIJOUが定義されていたら変更する
 *
 * 2016/09/10
 * Zday=\t%d\t Yson=\t%5.2f
 *
 * 2016/11/05
 * msys2 移行
 * UTF-8 LF
 */
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>


#include "sub/env.h"
#include "sub/check0.h"
#include "sub/read_kd2.h"
#include "sub/matome.h"
#include "sub/sngrx.h"
#include "sub/common_y.h"
#include "sub/output.h"

uint8_t dt[DATEMAX][11]; //use output
uint8_t code[DATAMAX][8]; //use output main
int gys[DATAMAX];
double hjm[DATAMAX][DATEMAX]; //use output
double tak[DATAMAX][DATEMAX]; //use output
double yas[DATAMAX][DATEMAX]; //use output
double owa[DATAMAX][DATEMAX]; //use output
double da[DATAMAX][DATEMAX];//daiから変更
int bnk[DATAMAX]; //株式分割
double dispda[DATAMAX][DATEMAX];//表示用のdaikin(分割バグ無関係)// output //で使用

double suii[DATEMAX][XDAYMAX2]; //購入後の損益推移(安値→高値) // use output
double pfm[100];
double pfmall[100][100];

int ck[DATAMAX][DATEMAX];        //フラグ 1
int CodeMax;
int DtMax;

int Jkc=0;

double Pmax[PM];
int Lr[PM];
int Ms[PM];



//////
#include "mt/mt_rule.c"
//////

#ifndef DAYSON
double Yson=-30.0; //損切% 必要に応じて変える
int Zday=5; //損切ライン 必要に応じて変える
#endif

int main (void) {
	//2016/8/11 市場切り替え対応
#ifdef SHIJOU
	uint8_t* c_cfg=SHIJOU;
#else
	uint8_t* c_cfg="./code/code.cfg"; 
#endif
	//
	uint8_t* d_cfg="data.cfg";
	uint8_t* rksg="./output/rksg.txt"; //利確損切を別ファイルに
	uint8_t  filename[40];
	uint8_t buf[40];
	double brk;
	double pmax;
	int i,k,n;
	//int lr,ms;

	FILE *fp;
	//code fileの読み込み
	fp = fopen(c_cfg, "rt");
	if ( fp ){
		i=0;
		while ( fgets(buf,40,fp)!=NULL) { 
			n=check0(buf);
			if (n!=0) {
				strcpy(code[i],buf);
				//printf("%d %s \n",i,code[i]);
				i++;
			}
		}
		CodeMax=i;
	
	}
	fclose(fp);
	
	//data file の読み込み
	fp = fopen(d_cfg, "rt");
	if ( fp ){
	//  d_cfg   data読込作業
		i=0;
		while ( fgets(filename,40,fp)!=NULL) { 
			n=check0(filename);
			if (n!=0) {             //#コメント以外 @は除外
				read_kd2(filename,i);
				i++;
			}
		}
		DtMax=i;
	}
	maxxday();
	minxday();
	
	//calc25();
	calc();
	check();
	output();
	
	fp=fopen(rksg,"w");
	fprintf(fp,"----\tXd0\t%d\t----\tXdd\t%d\t-----\t%d\t---------------------------\n",Xd0,Xdd,DtMax);
	fprintf(fp,"利確\t損切\n");
	matome();
	pmax=-100.0;
	for (k=0;k<PM;k++) {
		if (Pmax[k]!=pmax && Lr[k]!=0){
			fprintf(fp,"%d\t%d\t%6.3lf\t%8.2lf\n",Lr[k]+1,-Ms[k]-1,Pmax[k],Pmax[k]*Jkc);
			pmax=Pmax[k];
		}
	}
	fclose(fp);

}

こんな感じ

 意外にシンプルかもね

グローバル変数使いまくりだけど、宣言はサブの個別ファイルでやったほうがいいのかもしれない

分割コンパイルに全然慣れていないのを露呈w

 

5 diff のインストール

改めて開発日記

msys2にはなぜかdiffが入っていなかったのでインストール

$pacman -S diff

だとダメだったのでgoogle先生に聞く

ググって出てきたのが

qiita.com

$pacman -S diffutils

で無事インストールOK

diff が必要と思ったのは稼働中の現システム on msys での結果と

移植中の新システム on msys2 での結果が一致するか? の確認のため

ここで書いている改めて開発日記はまだいろいろインストールしている段階ですが、実はPCが2つあって、もう一つのPCではある程度移植が進んでいるのです

まあ何とか年内には目途をつけたいですが・・・