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|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|

2019-04-01 検証:STLを使うと実行速度が「遅くなる」? [長年日記]

検証:STLを使うと実行速度が「遅くなる」?

検証:STLを使うと実行速度が「遅くなる」?

  • date

    • 2019/04/01

  • 原本

  • 1.動機
    • ■18年度は、ソフト外注会社さんのお勧めもあって、リスト構造体に"STL"を採用してみた
    • ■この辺については、この記事の最終章が役に立つかも
  • 2.感想
    • (1)確かに便利
      • メモリリークの心配をしなくて良いのは、安心
    • (2)今までできていたことができなくなった
      • リストの要素の中身を、<list>のメソッドを使わなければ触れないのは、正直"痛い"
      • 動的メモリの内容を、複数のリストに一斉に影響させる、ということができなくなるのは、かなり"痛い"
    • (3)上記(2)に関しては、メモリを配列にすることで回避できることとのアドバイスを貰ったが、それって、一度、スタティックメモリを事前に確保しておかなければ、美味しくない
      • 個人的には、オブジェクトは1つにして、色々なところからアクセスできるようにしたい
      • だって、開発者は、私一人だけなんだから
  • 3.コーディングの上での問題点
    • (1)GDBのデバッグで、STLのライブラリのソースコードの中に入り込んで、2ステップ以上の手続が必要となり、滅茶苦茶イライラする(多分、解消法はあるんだろうが、見つけられていない)
  • 4.実行上の問題
    • 仮説:STLを使うと実行速度が「遅くなる」
      • デバッグ時のローディングは、間違いなく、滅茶苦茶遅い
  • 5.本当に遅いのか?
  • 6. 考察
    • ■これは、江端の環境での話であって、他の環境では異る結果が出るかもしれない
    • ■江端は研究目的でプログラムを作っているので、保守環境などを考えれば、「STLの使用が正解である場合」がある
      • 実際、江端は、後輩にC/C++ without STLなどを進めていない
      • 新人なら、STLやpythonを勧めると思う

2019-04-02 Eプログラム [長年日記]


2019-04-05 csvファイルでQGISに地図を表示する [長年日記]

csvファイルでQGISに地図を表示する

csvファイルでQGISに地図を表示する

  • date

    • 2019/04/05

    原本

    1.動機

    • ■QGISで表示される仮想の地図(osmファイル)を作ってみたが、これがどうにも上手く動いてくれない
    • ■JOSMにインポートしてエクスポートしたりもした。形式的には問題がないように見える
    • ■しかし、何をどうしてもpostGISに読み込んでくれないし、QGISもosmファイルをダイレクトに読み込んでもくれない
    • ■正直本気で困った

    2.発想の転換

    • ■この際、ノード(道路)は諦めて、ポイントだけでも表示できればいい、と割りきった(こんなところで時間を使うのは、なんとも悔しい)
    • ■CSVファイルで読み込めないかな、と思ったら、QGISには、その仕組みがあった
    • ■忘れないうちにメモしておこう、と思った

    3.やり方

    • (Step.1)CSVファイルを作る
    • (Step.2) QGIS3を起動
    • (Step.3) "レイヤ"→"レイヤの追加"→"デリミテッドテキストレイヤの追加"
    • (Step.4)
    • (Step.5)
      • プロジェクトとして保存しておけば、後からも使える

    以上


2019-04-15 usleep()がコンパイルエラーになる件 [長年日記]

原因は良く分からないのだけど、C言語用のpostgresのAPIの環境と一緒に使うと、コンパイルエラーが発生する現象に悩まされていた。

#include 
#include 
int main(int argc, char **argv) {
  fprintf(stderr, "start\n");
  usleep(1000000);
  fprintf(stderr, "end\n");
  return 0;
}

で、これまで見たことがない、以下のエラーが発生するようになってしまった。

 error: 'usleep' was not declared in this scope
   usleep(1000);

原因ははっきりしないのだけど、

g++ -g db20190415.cpp -o db20190415 -I"D:\PostgreSQL\10\include" -L"D:\PostgreSQL\10\lib" -llibpq -lwsock32 -lws2_32

とか、

#include "libpq-fe.h"

が怪しそうである(これらを追加したら、出てきたから)。

==============

暫く悩んだのだけど、usleep()を使わない方法を、試してみた。

#include 
#include 
int main(int argc, char **argv) {
  struct timespec ts;
  fprintf(stderr, "start\n");
  ts.tv_sec = 0;
  ts.tv_nsec = 999999999/35; // 1/35秒と見なして良い
  nanosleep(&ts, NULL);
  fprintf(stderr, "end\n");
  return 0;
}
 
 // 出展 https://www.mm2d.net/main/prog/c/sleep-01.html

これで良しとした。


2019-04-16 C言語プログラムでPostgreSQLの「あればUPDATE、なければINSERT」をUPSERTを使わずにやってみる。 [長年日記]

/*
 
  C言語プログラムでPostgreSQLで「あればUPDATE、なければINSERT」をUPSERTを使わずにやってみる。
 
  g++ -g db.cpp -o db -I"D:\PostgreSQL\10\include" -L"D:\PostgreSQL\10\lib" -llibpq -lwsock32 -lws2_32
 
 
  // 状態をPostgreSQLに書き込み続ける
  // プログラム実行中にも、経過情報が読めるようにする為
 
  まず、以下の手順でテーブルを作っておく
 
  C:\Users\yrl-user>psql -h localhost -U postgres	
  postgres=# \l		
  postgres=# \connect ca_db(データベース名)
  
  以下をコピペしてテーブルとその内容を直接書き込む
  
  create table q_state (
	   number int,
	   action_type int,
	   q int);
 
  ca_db=# \dt
 
  データベースのテーブルの中身を確認する
  ca_db=# select * from q_state; // 検索の基本形
 
  ======================
  本プログラムは、 
 
  (1)numberとaction_typeの値の両方が同じ行がある場合、qの値を書き換えること
  (2)同じ行がない場合には、行を追加する
 
  を実施する、かなりスマートではない方法である
  (が、とりあえずは動く)
  ======================
 
*/
 
#include 
#include 
//#include  // sleep(1)
#include  // sleep(1)
#include 
#include 
#include 
#include "libpq-fe.h"
 
 
const char *conninfo = "host=localhost user=postgres password=xxxxxxx dbname=ca_db port=5433";
PGconn *conn;
 
int open_db()
{
  // データベースとの接続を確立する 
  //PGconn *conn = PQconnectdb(conninfo);
  conn = PQconnectdb(conninfo);
  
  /* バックエンドとの接続確立に成功したかを確認する */
  if (PQstatus(conn) != CONNECTION_OK){
	fprintf(stderr, "Connection to database failed: %s",
			PQerrorMessage(conn));
  }
  
  return 0;
};
 
int delete_db()
{
  // テーブルの中身を空にする(全行を消去する)
  char stringSQL2[512] = {0};
  sprintf(stringSQL2, "DELETE FROM q_state;");
 
  PGresult *res = PQexec(conn, stringSQL2);
 
  // INSERT等値を返さないコマンドの場合戻り値は PGRES_COMMAND_OK
  if (res == NULL || PQresultStatus(res) != PGRES_COMMAND_OK) {
    // SQLコマンドが失敗した場合
	fprintf(stderr, "INSERT COMMAND IS FAILED.",
			PQerrorMessage(conn));
  }
  
  // 値セットが無い場合でも必ず結果をクリアする
  PQclear(res);
 
  return 0;
};
 
int write_db(int number, int action_type, int q)
{
  char stringSQL2[512] = {0};
  char stringSQL1[512] = {0};
  
  sprintf(stringSQL2, "UPDATE q_state SET number = %d, action_type = %d, q = %d where number = %d and action_type = %d;",
		  number, action_type, q, number, action_type);
 
  PGresult *res = PQexec(conn, stringSQL2);
  ExecStatusType est = PQresultStatus(res);
  
  char mes[10] = {0};
  strcpy(mes,PQcmdStatus(res));
 
  // UPDATEできなかった場合には、"UPDATE 0"というメッセージが帰ってくるので、
  // そのメッセージを使って、UPDATEの失敗を判断して、INSERTの処理を行う
  int c = strcmp(mes, "UPDATE 0"); 
  if (c == 0){
	sprintf(stringSQL1, "INSERT INTO q_state(number , action_type , q) VALUES(%d,%d,%d);",
			number, action_type, q);
 
	PGresult *res = PQexec(conn, stringSQL1);
  }
  
  // INSERT等値を返さないコマンドの場合戻り値は PGRES_COMMAND_OK
  if (res == NULL || PQresultStatus(res) != PGRES_COMMAND_OK) {
    // SQLコマンドが失敗した場合
	fprintf(stderr, "INSERT COMMAND IS FAILED.",
			PQerrorMessage(conn));
  }
  
  // 値セットが無い場合でも必ず結果をクリアする
  PQclear(res);
 
  return 0;
};
 
int close_db()
{
  // 最後必ずデータベースとの接続を閉じる
  PQfinish(conn);
 
  return 0;
}
 
 
int main()
{
  open_db();
  delete_db();
 
  write_db(1, 2, 4);
  write_db(1, 2, 3);
  write_db(2, 1, 4);
  write_db(2, 2, 4);
  write_db(2, 1, 5);
  write_db(1, 2, 5);
 
 
  /*
	struct timespec ts;
	fprintf(stderr, "start\n");
	ts.tv_sec = 1;
	ts.tv_nsec = 0;
	nanosleep(&ts, NULL);
	fprintf(stderr, "end\n");
  */
 
  close_db();
 
}

2019-04-22 QGISのアドイン"PosiVew"を使った、Q学習の進み方の視覚化 [長年日記]


2019-04-29 舘の玄関のタイマーの再設定方法 [長年日記]

keyword WTC 5331 WK panasonic あけたらタイマ

<メール>

"玄関のタイマーの件" 2018/11/24 13:57

https://mail.google.com/mail/u/0/?tab=rm#inbox/CllgCHrfTZlWgjBLgGBtwVTtTnjDqGvGCSlbvHSTpZkchwhMdfFtsfHFDxvfDtVXLNTmwMJdjqB

"Re: 館の玄関の電球" 2018年10月19日(金) 15:49

https://mail.google.com/mail/u/0/?tab=rm#inbox/CqMvqmRFpFpRRnmLQjBrsjJzjGLTLQJLXHDgmXcMKHLlswbJPVKDNPQwbzngZMGTxwtjzHxJmSq