2011|08|
2013|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|05|06|07|08|09|10|11|12|
2016|01|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|

2015-05-07 Windows7のライセンスキー [長年日記]

_ プライベートに格納済み


2015-05-09 smailのインストール [長年日記]

■smailとは
Windowsのコマンドプロンプト(またはMS-DOSプロンプト)から起動して利用できる
CLIプログラムで送信専用の電子メールクライントである。
■動機と背景
自宅用のビデオサーバ起動時に、自動的にsmailを自動的に起動するようにして、
ビデオサーバの起動が家族全員に通知されるようにするため
(アニメの長時間使用に対する家族全員による監視の為)
■環境
gmail(googleメール)をSMTP/POPで使うこととする
■gmailでのPOPの有効
gmailの「設定」→「メール転送とPOP/IMAP」→「POPダウンロード」で
「今後受信するメールでPOPを有効にする」を選択
■smail.iniの内容
[POP3]
POP3_USE=1
APOP_USE=0
POP3_SERVER=pop.gmail.com
POP3_PORT=110
POP3_AFTER_WAIT=300
POP3_TIME_OUT=10
POP3_USER=ebataisverygreat@gmail.com
POP3_PASS=gmail用のパスワード
[SMTP]
SMTP_AUTH=2
SMTP_USER=ebataisverygreat@gmail.com
SMTP_PORT=25
SMTP_PASS=gmail用のパスワード
[SSL]
SSL_USE=1
SSL_USE_POP=1
SMTPS_PORT=465
POPS_PORT=995
SSL_TLS=0
SSL_STARTTLS=0
■テスト用に使用したコマンドライン
smail-v4.18>smail -hsmtp.gmail.com -s江端家ビデオサーバが起動しました ebataisverygreat@gmail.com -d -i
■セキュリティの強度変更
ERR-0011 だの、POPサーバがどうのこうのとエラーを言ってきたら、
https://support.google.com/mail/answer/78754を読んで対応してみる。
私の場合、
https://www.google.com/settings/security/lesssecureapps
にアクセスして、"Turn on"を選択
にしたら動くようになった。
■注意
"smail.ini"は、使い回しできない。
インストールしたマシンで、それぞれパスワードを入力しなおさないと
起動しないので注意(これに気がつくのに、恐しく時間がかかった)

2015-05-10 [長年日記]


2015-05-18 クラスの中でクラス(のインスタンス)を使う方法 [長年日記]

久々にC++でシミュレーションを組んでいます。

今、あるシステムのデバイス構成要素のクラス設計が完了したのですが、この段階になって、そのシステムを使っている会社のクラスの中に収納したくなりました。

しかし、今更、その会社のクラスの中に、デバイスのクラスを組み込むなんぞ、面倒なことはしたくありません。

そういえば、私、こんなに色々なプログラミングやってきたのに、未だ、「クラスの中にクラスを定義する」ということをやったことがなかったことに気がつきました。

今までは、全部作り直してきたようです。昔の私は根性があったようです。

少し調べてみたら、「インナークラス」という記載方法があるようですが、コンストラクタの定義を考えたら、面倒くさくなったので、ポインタで逃げることにしました。

こんな感じです。

class Water_Pipe
{
public:
	Water_Pipe(int lenght)  // 単位はメートル
	{
		max_length = lenght;
		max_array_count = lenght/2;  //秒速2メートル	で必要となるタイムスライス	
	
		for( int i = max_array_count-1; i >= 0; i--)  // パイプの初期化
			water_array[i] = 0;
	}
	
	double water_input_output(double volume_of_water)  
	{
		output_water = water_array[max_array_count-1];
	
		for( int i = max_array_count-1; i > 0; i--)
		{
			water_array[i] = water_array[i-1];
		}
	
		water_array[0] = volume_of_water;
	
		return output_water;
	}
	
private:
	int		max_length;
	int		max_array_count;
	double	output_water;
	double	water_array[20000];
};
	
class Water_Company
{
public:
	Water_Pipe 	*m_water_pipe;
}
	
int _tmain(int argc, _TCHAR* argv[])
{
	Water_Pipe	water_pipe1(1000); // 1000メートル
	Water_Company	water_company;
	
	water_company_A.m_water_pipe = &(water_pipe1);
	water_company_A.m_water_pipe->water_input_output(100);
}

2015-05-19 SAIのバケツ着色で「白ふち」が出てくる問題 [長年日記]

これまで、SAIのバケツ着色で「白ふち」がでてくる対応として、通常レイヤーの「2値ペン」を使っていたが、`「ペン入れレイヤー」の「曲線」が、恐しく便利なので、こっちを使った。

しかし、別レイヤを立てて、色を塗ると、SAIのバケツ着色で「白ふち」が出てくる。

これは、その「別レイヤ」の方で、「領域検出モード」を

「色差が範囲内の部分」を、「透明部分(精密)」にすると発生しなくなるようだ。


2015-05-20 ファイル入出力関係で参考になりそうなコードだったので、残しておく [長年日記]

 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 #include <time.h>
 
 // 2014年4月1日 08:30からの経過時間(分)から日時を出す
 int minutes2dateAndTime(int min, char *s)
 {
 	// 1900年から、2014年4月1日 08:30までの経過秒数→1396308600秒
 
 	time_t fixed_sec = min * 60 + 1396308600; //1900年からの秒数に変換
 
 	struct tm *tm = localtime(&fixed_sec);
 
 	// 文字列にして戻す(別の形式でも良いが、とりあえず"2018/1/1 0:00"の形で)
 	// mainの方でメモリ確保して貰って、こっちで書き込むという形にする(コピーが面倒だから)
 
 	memset(s,0,sizeof(s));
 
 	sprintf(s,"%d/%02d/%02d %02d:%02d",tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min);
 
 	return 0;
 }
 
 
 // 2014年4月1日 08:30からの経過時間(分)を算出する
 int dateAndTime2minutes(char *s1)
 {
 	char s2[] ="/ :";  // デリミタは"/", " ", ":" の3つ
 //	char s1[] ="2014/4/3 8:08";
 	char* tok;
 
 	// 2014年4月1日8:30の累積分数
 
 	struct tm base_tm;
 	base_tm.tm_year = 2014 - 1900;  // 2014年
 	base_tm.tm_mon  = 4 - 1;  // 4月
 	base_tm.tm_mday = 1;  // 1日
 	base_tm.tm_hour = 8;  // 8時
 	base_tm.tm_min  = 30; // 30分
 	base_tm.tm_sec  = 0;  // 0秒
 
 	time_t time = mktime(&base_tm);
 	int base_min = (int)time/60;
 	
 	///////
 
 	struct tm tm;
 	
 	tok = strtok( s1, s2 ); /* 初回 */
 	tm.tm_year = atoi(tok)-1900;
 
 	tok = strtok( NULL, s2 );  /* 2回目*/
 	tm.tm_mon =  atoi(tok) -1 ;
 
 	tok = strtok( NULL, s2 );  /* 3回目 */
 	tm.tm_mday = atoi(tok);
 
 	tok = strtok( NULL, s2 );  /* 4回目 */
 	tm.tm_hour = atoi(tok);
 	
 	tok = strtok( NULL, s2 );  /* 5回目 */
 	tm.tm_min = atoi(tok);
 
 	tm.tm_sec = 0; //秒はデフォルト0 
 
 	time = mktime(&tm);
 	int target_min = (int)time/60;
 
 	return target_min - base_min;
 
 }
 
 int main()
 {
 
 	char *f_loader = "C:/Users/ebata/Desktop/LDSD.csv";
 
 	FILE* fp_loader = fopen( f_loader, "r" );
 	if( f_loader == NULL ){
 		printf( "%sファイルが開けません\n", f_loader );
 		return -1;
 	}
 	
 	char s1[200]; //200文字以上ということはないだろう
 	char s2[] =",";  /* デリミタはコンマのみ(なぜこれで動く?) */
 	char* tok;
 	
 	char facility_string[100][10];
 	memset(facility_string,0,sizeof(facility_string));
 	
 	char arrival_time_string[100][20];
 	memset(arrival_time_string,0,sizeof(arrival_time_string));
 
 	char start_time_string[100][20];
 	memset(start_time_string,0,sizeof(start_time_string));
 
 	char train_name_string[100][20];
 	memset(train_name_string,0,sizeof(train_name_string));	
 
 
 	// 一行目(見出し行)の強制スキップ
 	fgets( s1,200,fp_loader);
 	
 	int line =0;
 
 	// 一度、全データを読み込む
 	while( ( fgets( s1,200,fp_loader) != NULL)){
 		//printf("-->%s",s1);
 		tok = strtok( s1, s2 );
 		int count = 0;
 		while( tok != NULL ){
 			printf("count = %d\n",count);
 			
 			if (count == 0) strcpy(facility_string[line],tok);
 			else if(count == 1) strcpy(arrival_time_string[line],tok);
 			else if (count == 2) strcpy(start_time_string[line],tok);
 			else if (count == 3) strcpy(train_name_string[line],tok);
 
 			printf( "%s\n", tok );
 			tok = strtok( NULL, s2 );  /* 2回目以降 */
 			count++;
 
 		}
 		line++;
 	}
 
 	int base_line = line;
 	
 	fclose( fp_loader );
 
 	int  arrival_time_min[100];  // 到着時刻
 	memset(arrival_time_min,0,sizeof(arrival_time_min));	
 
 	int  start_time_min[100];  // 出発時刻
 	memset(start_time_min,0,sizeof(start_time_min));	
 
 	char train_name_buf_string[100][20]; // 名一時格納用
 	memset(train_name_buf_string,0,sizeof(train_name_buf_string));	
 
 	//////////////////// 2110 ////////////////////////////////////
 
 	int k = 0;
 	for(int i=0; i%s",s1);
 		tok = strtok( s1, s2 );
 		int count = 0;
 		while( tok != NULL ){
 			//printf("count = %d\n",count);
 									
 			if (count == 0) strcpy(batch_number_string[line2],tok);
 			else if(count == 1) strcpy(batch_start_time_string[line2],tok);
 			else if (count == 2) strcpy(batch_end_time_string[line2],tok);
 								
 			//printf( "%s\n", tok );
 			tok = strtok( NULL, s2 );  /* 2回目以降 */
 			count++;
 
 		}
 		line2++;
 	}
 	
 	fclose(fp_train);
  	return 0;
 
 }

2015-05-31 改行を削除して、一行にするC++プログラム [長年日記]

// 改行を削除して、一行にするプログラム
// gcc pack.cpp -o pack.exe
// pack.exe < input.data > output.data
 
#include < stdio.h >
 
int main()
{
  int c;
 
  while((c=getchar()) != EOF){
	if (c != '\n' )	  putchar(c);
  }
}