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|08|09|10|11|12|
2020|01|02|03|04|

2018-10-02 postGIS(Windows版)をインストールする [長年日記]


2018-10-06 財政破綻って何? [長年日記]

財政破綻って何?

財政破綻って何?

  • 2018/10/06
  •  
  • 1.きっかけ
    • 「財政破綻」の意味がよく分からない
  • 2.前提
    • 財政とは
      • 政府支出の財源は2つだけ
        • 税収
        • 国債による借入金
    • 通貨とは
      • 日本政府は通貨発行権を持っている
        • 上記の「2つだけ」に頼らなくてもいい
        • お札を印刷すればいい
        • 管理通貨制度であり、変動相場制ですから、自国通貨を発行する何の拘束もない
      • しかし、政府に通貨発行を全部任せると、選挙の度に(地元にをバラまく為に)お金を印刷しかねない
      • そこで、選挙と関わりの無い第三者機関(日銀)に通貨発行業務を任せることにした
        • これが、「日銀の独立性」
      • とは言え、日銀は政府の下部組織であるので、「日銀は政府の一部」で正しい
    • 国債とは
      • 財務省(政府)が発行する金券(×現金)のこと
      • 日銀は国債を発行しない(日銀は、「政府(社長?)にも屈しない、頑固親父の紙幣の印刷屋」をいうイメージで良い)
  • 3.前提から導かれる結論
    • 「政府の借金」とは「日銀」への借金のこと
    • (A)政府の対日銀債務(借金)と言うものは、自分自身への借金
    • (B)実体として「政府の借金」は債務(借金)ではない
    • (C)いざとなれば、お金を印刷すれば、借金は一瞬で「チャラ」になる
      • この具体例
        • (Step.1)1年間だけ、お金を大量に印刷して、市場にばら撒き、その1年間だけ消費税を100%にする
        • (Step.2)消費税を全部、日銀の借金の返済にまわす
        • (Step.3)借金完済
    • (D)論理的に、日本では、デフォルト(債務不履行)はあり得ない(というか、デフォルトにできない)
  • 4.ここから分かってくる事実
    • (1)「政府が税金(の一部)を使って、民間への借金を返済する(国債の買い戻し)」などということは、(制度上)ありえない
      • 国債の流通ルートは、政府ー日銀ー民間銀行のパスしか認めていないから
        • 政府ー民間銀行の直結パスはない
      • このへんは、自分でもちょっと分からない話
        • (A)税収が上がると、個人も法人も貯蓄は減る
          • 所有できる現金が減るから
        • (B)政府が支出すると、個人も法人の貯蓄が増える
          • 所有できる現金が増えるから
        • (C)好景気(バブル等)の時
          • 政府が儲かってしまう場合があるが、その時は、個人法人ともに貯蓄は減る
          • 政府は儲かっている金で、日銀に借金を返済する(=日銀から国債を買い取る)
          • 但し、民間から国債を買い取ることはない(日銀の存在を否定することになるから)
    • (2)上記(1)は、(当然だけど)満期の時だけは、国債を買い戻す
      • そういう約束をした債権(国債)だから
      • ただ、その買い戻しのお金も、新しい国債を発行して得たお金である場合も多い
    • (3)日銀が金融機関から国債を買い取る金融緩和の時に限り、政府部門からの対民間債務の返済が行われる(政府から、直接、民間銀行への国債と現金の交換が行われる)
      • ところで「金融緩和」って何?
        • 日本銀行(中央銀行)(×政府)が不況時に景気底上げのために行う金融政策の1つ
        • 具体例
          • 景気が悪化したとき、国債を買い上げたり政策金利と預金準備率を引き下げたりすることによって通貨供給量を増やし、資金調達を容易にする政策
          • 国債や手形の買い上げによって通貨供給量を増やす政策を、特に量的金融緩和政策(量的緩和)
  • 5.政府が借金を返済できかかどうかは、見方によって変わる
    • (イ)日銀保有国債は政府債務ではないとした場合
      • 4(1)の場合
        • 当然、政府債務は変化しない
        • 但し、発行貨幣の回収ということが起こるので、超過税収の分だけ財市場のマネーストックは減少
      • 4(3)の場合
        • 政府債務は減少する
    • (ロ)日銀保有国債を政府債務とした場合
      • 4(1)の場合
        • 超過税収がある場合に限り、政府が超過税収で日銀から国債を買い戻し、貨幣を返還したときに政府債務は減少
      • 4(3)の場合
        • 政府債務は減少しない
          • 国債の保有者が金融機関から日銀に移るだけ
  • 6.結論(デフォルトは発生するのか?)
    • デフォルトという意味では、財政破綻は発生しない
      • 政府部門(政府と日銀)は無限の貨幣発行権を持っているから
      • 民間保有国債が正真正銘の債務であったとしても、デ無限に貨幣の発行を行うことが可能であるから
  • 7.財政破綻の一般定義
    • 定義
      • 行政活動や公共政策などの遂行のために行う、資金の調達や管理、支出などの経済活動が正常にできなくなる状態(危機的状況)
      • 国や地方自治体の資金収支計画(資金繰り)が行き詰ること
    • 破綻の確定
      • 国や地方自治体の発行した債券が、デフォルト(債務不履行)となること
        • イメージは、紙屑になった貸借契約書とか、株券とか
    • ユースケース
      • 放漫な財政運営、巨額の公的債務残高、基礎的財政収支(プライマリーバランス)の悪化などが長年積み重なり、ついに財政の持続可能な限界に達し、資金調達や利払いなど資金繰りが行き詰った時に発生することが多い
    • 我が国の財政破綻(国債の債務不履行)後に発生すること(予想)
      • ・日本円が売られて、超円安となる
      • ・日本国債の買い手がいなくなり、金利が急騰する
      • ・金融機関が経営危機に陥り、世界的な金融危機が発生する
      • ・国際会議が開かれ、日本に対して財政の抜本的改善が要求される
      • ・預金封鎖が一時的に行われる可能性がある
      • ・大増税が行われると共に、行政サービスが大きく削減される
      • ・社会保険料の負担が増える一方で、年金受給年齢は延期される
      • ・企業の倒産や役所のリストラなどで失業者が急増する
      • ・急速なインフレが起こり、人々の生活は苦しくなる
  • 7.本論(日本における財政破綻って何?)
    • 前提
      • (ここまでの記述に基づけば)日本においてはデフォルトという意味における財政破綻はあり得ない
        • 日本国政府は、金をいくらでも印刷できるから
        • これが、ギリシャや一般企業と決定的に違うこと
    • 疑問
      • では、「財政破綻」とは何か?
      • このままでは「財政破綻」を定義できない
    • ある人の考え
      • 「財政破綻とはインフレのことである」としか、定義できない
        • ×デフォルト
        • ○ハイパーインフレ
          • 無限に貨幣発行量が増えることによって、行き着く先
        •  「財政破綻とはハイパーインフレのことである」を一般化すればこうなる
      • 国債の暴落はハイパーインフレと同義
        • ハイパーインフレによって貨幣価値が暴落しなければ、あわてて国債を売却する必要は無く、満期までじっと持っていればよいから
      • インフレが起こるとどうなるか?
        • 国内産業は好況
        • 貿易企業が価格競争に負ける
          • 貿易は不振
          • 大企業=貿易企業は損をする
        • 仮説
          • 富裕層が大企業を牛耳り、大企業が政治および経済を握っていたから、近代以降、インフレは悪いものだという認識が各国の支配的な認識として培われて来た
    • ところが、ハイパーインフレが発生するのはレアケース
      • 戦争や災害で生産力が壊滅したとき
      • 生産力の脆弱な国家では通貨発行を増大させたとき
  • 8.外国(の破綻)とはどう違うの
    • 基本はコレだろう
    • デトロイトの例を見てみる
      • 2013年7月18日
        • 日本円換算でおよそ2兆円(180億ドル)もの巨額の負債を抱えて破綻
        • 20年かけてゆるやかに破綻した、と表現されている
      • 財政破綻したデトロイト市の運営は、ミシガン州が引き受けることとなった。
      • ただ、意外なことに、2013年7月の連邦破産法9条の適用申請は、長らく不毛な思いをしていた住民たちからは歓迎されていたという。
        • 早々に財政破綻を認めて再起を図ることを求める声が少なくなかった
      • 中心部の空きビルに格安賃料にメリットを感じたベンチャー企業が集まりだした。
      • 不動産投資家がデトロイト市内の優良物件を購入する動きが活発になり、不動産市場が回復していく。
      • 2014年11月には、各方面の債務圧縮策に加え、ITベンチャーの興隆と不動産市場の回復が寄与し始めていたデトロイト市の再建案を、米連邦破産裁判所が承認。
      • 政破綻前から荒廃していた市政サービスに15億ドルを投資
      • 数十年間に渡って続いた産業都市デトロイトの衰退は終了
    • ギリシャの例を見てみる
      • 先進国では初めて事実上の債務不履行(デフォルト)に陥った
        • 国際通貨基金(IMF)も声明を発表し、同じく1日午前0時が支払期限だった約15億ユーロ(約2040億円)の債務が返済されなかったことを明らかにした。
      • ギリシャ財務相「ユーロ使えない。元の通貨ももう作れない」
      • 6月30日 欧州連合(EU)による金融支援が終了
        • 国際通貨基金(IMF)に対する約16億ユーロの返済期限
      • 7月5日 ギリシャで財政再建案の賛否を問う国民投票
      • 13日 IMFに対する約4.5億ユーロの返済期限
      • 20日 欧州中央銀行(ECB)に対する約35億ユーロの返済期限
      • 8月20日 ECBに対する約32億ユーロの返済期限
      • 夜を徹した首脳会議での約17時間の協議の末の13日朝、欧州連合(EU)のトゥスク大統領が「厳しい条件」を含むがギリシャのユーロ圏離脱の懸念に終止符を打つ合意の成立を発表した。
        • チプラス首相は夜通しの協議を終えた後、記者団に対し「今回の厳しい協議で、われわれは何とか債務再編を勝ち取った」と述べた。
      • ギリシャ政府は20日、欧州中央銀行(ECB)と国際通貨基金(IMF)に対する債務計62億5000万ユーロ(約8400億円)の支払い手続きを始めた。
        • これにより、債務未払いを理由にECBから資金供給を絶たれる懸念はひとまずなくなる。また、IMFへの滞納状態も解消される。
        • ギリシャが同日、欧州連合(EU)から71億6000万ユーロのつなぎ融資を受けたため、支払いが可能になった。
      • 過去30年間政権を担った前政権がやらなかった事をやって改善されている
        • 税金逃れを減らして回収率を高める方策
        • 付加価値税も大幅に簡略化
        • 低所得者層に負担をかけることなく、歳入を増加
        • 天然ガスなどのエネルギー分野、宿泊業などにおいて規制緩和を実施
    • 結論
      • デトロイトは破綻したが、その後回復した
      • ギリシャはデフォルトを免れて、ギリギリのところで財政再建を実施中         

2018-10-09 SAIによって背景を完全に削る方法 [長年日記]

キーワード:SAI、切り出し、背景、削除、切り取り

(Step 1)まずオブジェクトを線画で記載する。

(Step 2)背景の部分を真っ赤にする。

(Step 3)自動選択ツールで領域検出モードを「色差が範囲内の部分」にし、背景部分だけを選択して、「編集→切り取り」で選択した部分を削除する


2018-10-20 さくらインターネットへのSSHログインとカウンターの桁数の変更 [長年日記]

kobore.net
22
user:ftpと同じ
pass:ftpと同じ
cd wwww/www
emacs txcount.cgi
$digit = 6; → $digit = 7;
exit

2018-10-26 postGISを使ったシミュレータのテストプログラム [長年日記]

/////////////////////////////////////////
// 
// これはサービス利用者とサービス提供者の例
//
// とりあえず、適当な地図を作って、自動車を走らせよう
// 
//
//
 
 
 
/*
 
 gcc -g -I"D:\PostgreSQL\pg96\include" test.cpp -o test.exe -L"D:\PostgreSQL\pg96\lib" -llibpq -lwsock32 -lws2_32
 
 
*/
 
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <sys/types.h>
#include <math.h>
#include "libpq-fe.h"
 
struct PASSENGER{		
  double a1,a2;
  double d1,d2;
  double arrival_CS(double);  // 到着時刻に関する満足度関数
  double departure_CS(double); // 出発時刻に対する満足度関数
  
};
 
double PASSENGER::arrival_CS(double time){
  double ret; 
 
  if (time < a1){
	ret = 1.0;
  }
  else if (time > a2){
	ret = 0.0;
  }
  else {
	ret = 1.0 / (a1 - a2) * ( time - a2);
  }
  
  return ret;
}
 
double PASSENGER::departure_CS(double time){
  double ret; 
 
  if (time < d1){
	ret = 1.0;
  }
  else if (time > d2){
	ret = 0.0;
  }
  else {
	ret = 1.0 / (d1 - d2) * ( time - d2);
  }
  
  return ret;
}
 
struct DRIVER{		// ここではタクシードライバを想定する
  // タクシードライバは、遅れてくる客が嫌い
  // タクシードライバは、待っていてくれる客は好き
 
  double w1;
  double w2;
  
  double waiting_CS(double);
 
};
 
double DRIVER::waiting_CS(double time){
  double ret; 
 
  if (time < w1){
	ret = 1.0;
  }
  else if (time > w2){
	ret = 0.0;
  }
  else {
	ret = 1.0 / (w1 - w2) * ( time - w2);
  }
  
  return ret;
}
 
#define rad2deg(a) ((a)/M_PI * 180.0) /* rad を deg に換算するマクロ関数 */
#define deg2rad(a) ((a)/180.0 * M_PI) /* deg を rad に換算するマクロ関数 */
 
 
//double distance_km(LOCATION* A, LOCATION* B, double *rad_up)
double distance_km(double a_longitude, 
				   double a_latitude, 
				   double b_longitude, 
				   double b_latitude, 
				   double *rad_up)				   				 
{
  double earth_r = 6378.137;
 
  double loRe = deg2rad(b_longitude - a_longitude); // 東西  経度は135度
  double laRe = deg2rad(b_latitude - a_latitude); // 南北  緯度は34度39分
 
  double EWD = cos(deg2rad(a_latitude))*earth_r*loRe; // 東西距離
  double NSD = earth_r*laRe; //南北距離
 
  double distance = sqrt(pow(NSD,2)+pow(EWD,2));  
  *rad_up = atan2(NSD, EWD);
 
  return distance;
}
 
 
double diff_longitude(double diff_p_x, double latitude) 
{
  double earth_r = 6378.137;
  // ↓ これが正解だけど、
  double loRe = diff_p_x / earth_r / cos(deg2rad(latitude)); // 東西
  // 面倒なので、これで統一しよう(あまり差が出ないしね)
  //double loRe = diff_p_x / earth_r / cos(deg2rad(35.700759)); // 東西
  double diff_lo = rad2deg(loRe); // 東西
 
  return diff_lo; // 東西
}
  
double diff_latitude(double diff_p_y) 
{
  double earth_r = 6378.137;
  double laRe = diff_p_y / earth_r;  // 南北
  double diff_la = rad2deg(laRe); // 南北
  
  return diff_la; // 南北
}
 
 
int main (){
  
  double time = 2.7;
 
  // 構造体定義名の前に「struct」がいらない(C++にあってCにない規定らしい)
  PASSENGER passenger1;	
  PASSENGER passenger2;	
  
  // 以下が、マインド(心)変数
 
  passenger1.a1 = 1;	
  passenger1.a2 = 3;	
 
  passenger1.d1 = 2;	
  passenger1.d2 = 4;	
 
 
  double aa1 = passenger1.arrival_CS(time);
  double bb1 = passenger1.departure_CS(time);
 
 
  passenger2.a1 = 0;	
  passenger2.a2 = 2;	
 
  passenger2.d1 = 3;	
  passenger2.d2 = 5;	
 
  double aa2 = passenger2.arrival_CS(time);
  double bb2 = passenger2.departure_CS(time);
 
  DRIVER driver1;
  DRIVER driver2;
 
  driver1.w1 = 0;
  driver1.w2 = 5;
 
  double cc1 = driver1.waiting_CS(time);
 
  driver2.w1 = 2;
  driver2.w2 = 7;
 
  double cc2 = driver2.waiting_CS(time);
 
 
  printf("time = %f, aa1 = %f, bb1 = %f, cc1 = %f\n", time, aa1, bb1, cc1);
  printf("time = %f, aa2 = %f, bb2 = %f, cc2 = %f\n", time, aa2, bb2, cc2);
 
  //////////////////////////////////////////////////
  int bus_stop_num[] = {115,104, 3, 62, 277,48, 213, 208, -1};
 
  const char *conninfo = "host=localhost user=postgres password=c-anemone dbname=city_routing";
  
  // データベースとの接続を確立する 
  PGconn *conn = PQconnectdb(conninfo);
  PGresult *res;
 
 
  // バックエンドとの接続確立に成功したかを確認する
  if (PQstatus(conn) != CONNECTION_OK){
	fprintf(stderr, "Connection to database failed: %s",
			PQerrorMessage(conn));
  }
 
 
  int cnt = 0; 
  
  while (bus_stop_num[cnt] != -1){
	printf("%d\n", bus_stop_num[cnt]);
	
	// テーブルオープン
	char stringSQL[1024] = {0};  
	  
	// sprintf(stringSQL, "SELECT seq, node, edge, cost FROM pgr_dijkstra('SELECT gid as id, source, target, cost_s As cost, reverse_cost_s AS reverse_cost FROM ways', %d, %d, true );",bus_stop_num[cnt], bus_stop_num[cnt+1]);
 
	sprintf(stringSQL, "SELECT node FROM pgr_dijkstra('SELECT gid as id, source, target, cost_s As cost, reverse_cost_s AS reverse_cost FROM ways', %d, %d, true );",bus_stop_num[cnt], bus_stop_num[cnt+1]);
 
	res = PQexec(conn, stringSQL);
	
	if (res == NULL){
	  fprintf(stderr, "failed: %s",
			  PQerrorMessage(conn));
	}
	
	// SELECTの場合戻り値は PGRES_TUPLES_OK.  これを確認しておく
	if (PQresultStatus(res) != PGRES_TUPLES_OK){
	  PQerrorMessage(conn);
	}
 
	int nFields = PQnfields(res);
 
	// まず属性名を表示する。 
 
	/*
	for (int i = 0; i < nFields; i++){
	  printf("%-15s", PQfname(res, i));
	}
	printf("\n\n");
	*/
 
	// そして行を表示する。
	for (int i = 0; i < PQntuples(res) -1 ; i++) {
	  for (int j = 0; j < nFields; j++) {
		//printf("%d %d ", i, j);
		//printf("%-15s", PQgetvalue(res, i, j));
		//printf("\n");
 
		if (j == 0){
		  printf("%-15s", PQgetvalue(res, i, j));
 
		  char stringSQL2[1024] = {0};  
		  sprintf(stringSQL2, "SELECT x1,y1,x2,y2 from ways where source = %s;",
				  PQgetvalue(res, i, j));
		  
		  PGresult *res2 = PQexec(conn, stringSQL2);
		  int nFields2 = PQnfields(res2);
 
		  double loc[4] = {0.0};
 
		  //for (int i2 = 0; i2 < PQntuples(res2); i2++) {
			for (int j2 = 0; j2 < nFields2; j2++) {
			  printf("%-15s", PQgetvalue(res2, 0, j2));
			  
			  loc[j2] = atof(PQgetvalue(res2, 0, j2));
			}
			//}
 
			//未来のパスのベクトルを計算する
			double rad_up1;
			distance_km(loc[0], loc[1], loc[2], loc[3], &rad_up1);
 
			printf("%-15f", rad_up1);			
			
 
		  // 値セットが無い場合でも必ず結果をクリアする
		  PQclear(res2);
 
		} // j == 1
	  }
	  printf("\n");  
	}
 
	// 値セットが無い場合でも必ず結果をクリアする
	PQclear(res);
  	
	cnt += 1;
  }
  
  // 最後必ずデータベースとの接続を閉じる
  PQfinish(conn);
 
 
 
 
  return 0;
}
syntax2html

2018-10-29 線の端っこを越えたことを判別する方法 [長年日記]

上の図 ↑ をクリックのこと
 
#include 
double rad0 = atan2(y1 -y0, x1-x0);
double rad1 = atan2(y1 -y', x1-x');
 
if (fabs(rad0 -rad1) >= pi * 0.5){
  # 点線を越えた
}

2018-10-30 postGISのノード間の両端座標を検索する方法 [長年日記]


2018-10-31 postGISを使って、自動車を走らせてみよう [長年日記]

/////////////////////////////////////////
// 
//
// postGISを使って、自動車を走らせてみよう
// 
//
//
 
 
 
/*
 
gcc -g -I"D:\PostgreSQL\pg96\include" test1031.cpp -o test1031.exe -L"D:\PostgreSQL\pg96\lib" -llibpq -lwsock32 -lws2_32
 
*/
 
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <sys/types.h>
#include <math.h>
#include "libpq-fe.h"
 
struct BUS{  
  double p_x; // 現在のX座標
  double p_y; // 現在のY座標
};
 
#define rad2deg(a) ((a)/M_PI * 180.0) /* rad を deg に換算するマクロ関数 */
#define deg2rad(a) ((a)/180.0 * M_PI) /* deg を rad に換算するマクロ関数 */
 
double distance_km(double a_longitude, 
				   double a_latitude, 
				   double b_longitude, 
				   double b_latitude, 
				   double *rad_up)				   				 
{
  double earth_r = 6378.137;
 
  double loRe = deg2rad(b_longitude - a_longitude); // 東西  経度は135度
  double laRe = deg2rad(b_latitude - a_latitude); // 南北  緯度は34度39分
 
  double EWD = cos(deg2rad(a_latitude))*earth_r*loRe; // 東西距離
  double NSD = earth_r*laRe; //南北距離
 
  double distance = sqrt(pow(NSD,2)+pow(EWD,2));  
  *rad_up = atan2(NSD, EWD);
 
  return distance;
}
 
 
double diff_longitude(double diff_p_x, double latitude) 
{
  double earth_r = 6378.137;
  // ↓ これが正解だけど、
  double loRe = diff_p_x / earth_r / cos(deg2rad(latitude)); // 東西
  // 面倒なので、これで統一しよう(あまり差が出ないしね)
  //double loRe = diff_p_x / earth_r / cos(deg2rad(35.700759)); // 東西
  double diff_lo = rad2deg(loRe); // 東西
 
  return diff_lo; // 東西
}
  
double diff_latitude(double diff_p_y) 
{
  double earth_r = 6378.137;
  double laRe = diff_p_y / earth_r;  // 南北
  double diff_la = rad2deg(laRe); // 南北
  
  return diff_la; // 南北
}
 
 
 
int main (){
 
  // postGISとQGISで調べたノード番号(強制停車するバス停を擬制)
  int bus_stop_num[] = {115,104, 3, 62, 277,48, 213, 208, -1}; 
 
  const char *conninfo = "host=localhost user=postgres password=c-anemone dbname=city_routing";
  
  // データベースとの接続を確立する 
  PGconn *conn = PQconnectdb(conninfo);
  PGresult *res;
 
  // バックエンドとの接続確立に成功したかを確認する
  if (PQstatus(conn) != CONNECTION_OK){
	fprintf(stderr, "Connection to database failed: %s",
			PQerrorMessage(conn));
  }
 
  int cnt = 0; 
  int initial_flag = 1; 
 
  BUS test_bus; // バスの生成
 
  while (bus_stop_num[cnt] != -1){  // バス停単位の開始
	// printf("%d\n", bus_stop_num[cnt]);
	
	// SQL文字列格納用の配列
	char stringSQL[1024] = {0};  
	  
	// バス停とバス停の間のノードをダイクストラで計算する(node(source)とedge(gid)を取る)
	sprintf(stringSQL, "SELECT node, edge FROM pgr_dijkstra('SELECT gid as id, source, target, cost_s As cost, reverse_cost_s AS reverse_cost FROM ways', %d, %d, true );",bus_stop_num[cnt], bus_stop_num[cnt+1]);
 
	res = PQexec(conn, stringSQL);
	
	if (res == NULL){
	  fprintf(stderr, "failed: %s",
			  PQerrorMessage(conn));
	}
	
	// SELECTの場合戻り値は PGRES_TUPLES_OK.  これを確認しておく
	if (PQresultStatus(res) != PGRES_TUPLES_OK){
	  PQerrorMessage(conn);
	}
 
	int nFields = PQnfields(res);
 
	// バス停からバス停の間のノード番号の一つをゲットする処理
	for (int i = 0; i < PQntuples(res)-1  ; i++) {  // バス停とバス停の間のノードを全部出す
 
	  /* 
		 ここでは、両端のエッジの座標が必要になる。
		 pgr_dijkstraでは、エッジ(両端)情報(x1,y1,x2,y2)が取得できるのだけど、
		 どっちが先端でどっちが終端かが分からない。
 
		 そこで(恐しく迂遠だけえど)、まずエッジ情報(x1,y1,x2,y2)を得てから、
		 ノード情報(x1, y1)を取得する(ちなみにノード情報のx2,y2は、
		 交差点などの場合は複数出てくるので、信用してはならない)。
		 
		 で、ノード情報のx1,y1を先端として、エッジ情報のx1,y1とx2,y2と一致していない方を終端とする
		 という処理を取っている。
 
		 (もっと簡単な方法があったら、誰か教えて下さい)
 
	   */
 
	  double node[2] = {0.0}; // x1, y1
	  double edge[4] = {0.0}; // x1, y1, x2, y2
 
	  int dummy_int_1 = 0;
	  int dummy_int_2 = 0;
 
	  for (int j = 0; j < nFields; j++) { // (j=0:node(source)と j=1:edge(gid)の値をゲットする)
 
		// まずノードの方
		if (j == 0){//(j=0:node(source)
 
		  memset( stringSQL, 0, sizeof(stringSQL)); // 念の為クリア
		  sprintf(stringSQL, "SELECT x1,y1 from ways where source = %s;",
				  PQgetvalue(res, i, j)); // ノードの座標を得る
 
		  dummy_int_1 = atof(PQgetvalue(res, i, j));
 
		  PGresult *res2 = PQexec(conn, stringSQL);
		  if (res2 == NULL){
			fprintf(stderr, "failed: %s",
					PQerrorMessage(conn));
		  }
 
 
		  int nFields2 = PQnfields(res2);
 
		  for (int j2 = 0; j2 < nFields2; j2++) { // node(source)のx1,y1の2つの値
			// printf("%-15s", PQgetvalue(res2, 0, j2));
			node[j2] = atof(PQgetvalue(res2, 0, j2));  
		  }
 
		  PQclear(res2); // SQL文の発行に対して必ずクリアする
		}
 
		//次にエッジの方
		if (j == 1){//(j=1:edge(gid)
 
		  memset( stringSQL, 0, sizeof(stringSQL)); // 念の為クリア
		  
		  sprintf(stringSQL, "SELECT x1,y1,x2,y2 from ways where gid = %s;",
				  PQgetvalue(res, i, j)); // ノードの座標を得る
 
		  dummy_int_2 = atof(PQgetvalue(res, i, j));
 
		  PGresult *res2 = PQexec(conn, stringSQL);
		  if (res2 == NULL){
			fprintf(stderr, "failed: %s",
					PQerrorMessage(conn));
		  }
 
		  int nFields2 = PQnfields(res2);
 
		  for (int j2 = 0; j2 < nFields2; j2++) { // node(source)のx1,y1の2つの値
			// printf("%-15s", PQgetvalue(res2, 0, j2));
			edge[j2] = atof(PQgetvalue(res2, 0, j2));  
		  }
 
		  PQclear(res2); // SQL文の発行に対して必ずクリアする
 
		}
	  }
 
	  double start_x, start_y, end_x, end_y;
 
	  //出揃ったところで、始点と終点の判定を行う
	  if ((fabs(node[0] - edge[0]) < 1e-6) && (fabs(node[1] - edge[1]) < 1e-6)){
		start_x = edge[0];
		start_y = edge[1];
		end_x = edge[2];
		end_y = edge[3];
	  }else{
		start_x = edge[2];
		start_y = edge[3];
		end_x = edge[0];
		end_y = edge[1];
	  }
 
	  // printf("両端の確定 %f,%f,%f,%f\n", start_x, start_y, end_x, end_y);
 
	  //両端の進行方向(ベクトル)を計算する
	  double rad_up1;
	  distance_km(start_x, start_y, end_x, end_y, &rad_up1);
 
	  // 確定直後にバス位置は、出発点(start_x, start_y)に強制移動する
	  test_bus.p_x = start_x;
	  test_bus.p_y = start_y;
 
	  // ここから0.1m単位でグルグル回す
 
	  int do_flag = 0;
	  do{
		// printf("x=%-15f,y=%-15f\n",test_bus.p_x, test_bus.p_y);
		printf("%-15f,%-15f\n",test_bus.p_x, test_bus.p_y);
 
		// 以下の0.1は1サンプリング0.1メートルを擬制
		test_bus.p_x += diff_longitude(0.1 * cos(rad_up1), test_bus.p_y);	
		test_bus.p_y += diff_latitude(0.1 * sin(rad_up1));
		
		double rad0 = atan2((end_y - start_y),(end_x - start_x));
		double rad1 = atan2((end_y - test_bus.p_y),(end_x - test_bus.p_x));
		
		// ここは、http://kobore.net/over90.jpg で解説してある
 
		if (fabs(rad0 - rad1) >= 3.141592654 * 0.5){
		  // 終点越えの場合、終点に座標を矯正する
		  test_bus.p_x = end_x;
		  test_bus.p_y = end_y;
		  
		  do_flag = 1; // フラグを上げろ
		}
		
	  }while(do_flag == 0);
	  
	} // バス停とバス停の間のノードを全部出す
 
	PQclear(res); // SQL文の発行に対して必ずクリアする
 
	cnt += 1; // カウントアップ
 
  }// バス停単位の開始
}
syntax2html