2022/09,江端さんの技術メモ

dis: 0.2839182387773051
dis: 0.09663299157559467
dis: 1.2640838214822172
dis: 0.2725675930110564
fatal error: concurrent map iteration and map write
goroutine 26 [running]:
runtime.throw({0x432b38, 0xc000292000})
        c:/go/src/runtime/panic.go:1198 +0x76 fp=0xc00033d858 sp=0xc00033d828 pc=0x196416
runtime.mapiternext(0x48a620)
        c:/go/src/runtime/map.go:858 +0x4eb fp=0xc00033d8c8 sp=0xc00033d858 pc=0x16f8cb
main.echo3({0x48f558, 0xc00013e2a0}, 0x0)
---
さて、やっつけますか。
「mapの競合状態のはなし」のページを参考にさせて頂き、新しく作ったmapが悪さをしているとアタリをつけました。
で、当初、sync.Mutexでロックしていたのですが、デッドロックが発生してしまいました。
そこで、sync.RWMutexに変更したところ、デッドロックが発生しなくなりました。
―― というのは気のせいのようで、RWMutex でも メソッドにLock Unlockを使えば、Mutexと同じらしいので、たまたま偶然だったようです。
RWMutexのウリは、
RLock : 読み取り用のロック。RLock同士はブロックせず、Lockのみがブロックされる。解除時は RUnlockを使う
Lock : Mutexと同じロック。RLock, Lock双方をブロックする。
のようです。今回は、読み出し中に、書き込みや削除処理が走ることがあったのですが、読み出し場所が一箇所だけだったので、普通に、Lock, Unlockを使用することにしました。
これでサーバがダウンすることはなくなりました。
以上

2022/09,江端さんの忘備録

「GO言語でクラスっぽいことをする」をレビューする

こちらにも書きましたが、今回、初めて、HP、AP、MPの意味をきちんと調べてみました。

As I wrote in this page, this time, I study the meaning of terms of "HP", "AP", "MP".

HP:ヒットポイント: ゲームにおいてキャラの体力や生命力を示すステータスの一つ

HP: Hit Points: A statistic that indicates a character's strength or vitality in a game.

AP:アタックポイント: ゲームにおいてキャラの行動力などを示すステータスの一つ

AP: Attack Points: A status that indicates a character's ability to take action, etc.

MP:マジックポイント: ゲームにおいてキャラの魔法や呪文を使う力を示すステータスの一つ

MP: Magic Point: A status that indicates a character's ability to use magic or spells in a game.

となっておりました。

当初、私は、「ステータス(地位)」という言葉に違和感を感じました。

Initially, I felt uncomfortable with the term 'status'.

ステータスというと、もっと静的なもの、例えば、社会的地位をイメージしていました。

Because I thought that the word of 'status' is something static, like social status.

でも、ちょっと調べてみたら、

However, I did a little digging more,

『コンピューターゲーム、とくにオンラインゲームやロールプレーイングゲームに登場するキャラクターの状態。能力、経験値、所持する武器などを指す』

"The state of a character in computer games, especially online games and role-playing games like, capabilities, experience, and weapons possessed by the character"

という意味で、すでに、ゲームの世界に、この用語「ステータス」がデフォルトとなっていることを知りました。

As the above meaning, I know that the word of 'status' has already been default in the game word.

-----

私、これまで、コンピュータで取り扱える「人間エージェント」の設計と開発をやってきました。

I have been designing and developing "human agents" that can be handled by computers.

そして、それらのエージェントを、主に街の中での住民の移動やら、交通機関の利用などのシミュレーションで使っています。

And I use these agents mainly in simulating the movement of residents and transportation in the city.

私がエージェントを設計すると、「住所」「年齢」「性別」「職業」のような『静的なもの』から着手することになります。

When I design an agent, I start with 'static' things like 'address', 'age', 'gender', and 'occupation'.

-----

で、今回、私のエージェントに、HP、AP、MPのステータスを入れたらどうなるかなぁ、と考えてみたのですが、

So, I wondered what would happen if I put the HP, AP, and MP stats into my agent this time.

―― 『住民が、バス停や駅、または、バスや電車の中で、乗車や座席を巡ってバトルを始める』というシナリオが必要になる

"I need a scenario where 'residents start battling over boarding and seating at bus stops, train stations, or on buses and trains"

なぁ、と思いました。

should be needed.

この辺が、ゲームと、私のシミュレーションの、決定的な違いかなぁ、と考えています。

I think this is the crucial difference between the game and my simulation.

-----

しかし、別の分野、例えば、「学校におけるいじめシミュレーション」「オフィスにおけるパワハラシミュレーション」では、使えるような気がします。

However, I feel that it could be used in other areas, e.g., "bullying simulation in schools" or "power harassment simulation in offices",

こんなのですね。

like this one.

2022/09,江端さんの技術メモ

C言語によるファジィ(Fuzzy)推論コード

をGo言語に移植してみました。

で、できるだけ、

「GO言語でクラスっぽいことをする」をレビューする

に近づけてみました。

コメントのPrint分は、C++のを残しています(面倒だったので)。あとenum型がないので、テキトーに文字列を使うことにしました。

以前のコードには、豪快なバグがありましたので、ソックリ差し替えします。

設定条件は以下の通りです(テーブルの内容は、負荷量です)

package main

import (
	"fmt"
	"os"
)

func max_2(a, b float64) float64 {
	if a > b {
		return a
	} else {
		return b
	}
}

func min_2(a, b float64) float64 {
	if a > b {
		return b
	} else {
		return a
	}
}

type condition_MF3 struct { // condition_MF3の基底クラス
	center  float64
	width   float64
	express string
}

func new_condition_MF3(_center, _width float64, _express string) *condition_MF3 {
	c3 := new(condition_MF3)
	c3.center = _center
	c3.width = _width
	c3.express = _express
	return c3
}

// 前件部メンバーシップ関数(山3つ)クラス
func (c3 *condition_MF3) func_X(_x float64) float64 {
	// x,yは、メンバーシップ関数上の座標を示す
	x := _x
	y := 0.0 // yの値は、必ず0以上1以下になる

	if c3.express == "LESS" {
		if x <= c3.center-c3.width {
			y = 1.0
		} else if x <= c3.center {
			y = -1.0 / c3.width * (x - c3.center)
		} else {
			y = 0.0
		}
	} else if c3.express == "COMMON" {
		if x <= c3.center-c3.width {
			y = 0.0
		} else if x <= c3.center {
			y = 1.0/c3.width*(x-c3.center) + 1.0
		} else if x <= c3.center+c3.width {
			y = -1.0/c3.width*(x-c3.center) + 1.0
		} else {
			y = 0.0
		}
	} else if c3.express == "MORE" {
		if x <= c3.center {
			y = 0.0
		} else if x <= c3.center+c3.width {
			y = 1.0 / c3.width * (x - c3.center)
		} else {
			y = 1.0
		}
	} else {
		fmt.Println("MF3: wrong expression")
		os.Exit(1)
	}
	return y
}

type condition_MF5 struct { // condition_MF5の基底クラス
	center  float64
	width   float64
	express string
}

func new_condition_MF5(_center, _width float64, _express string) *condition_MF5 {
	c5 := new(condition_MF5)
	c5.center = _center
	c5.width = _width
	c5.express = _express
	return c5
}

func (c5 *condition_MF5) func_X(_x float64) float64 {
	// 前件部メンバーシップ関数(山5つ)クラス
	// x,yは、メンバーシップ関数上の座標を示す
	x := _x
	y := 0.0 // yの値は、必ず0以上1以下になる

	if c5.express == "LESSLESS" {
		if x <= c5.center-2.0*c5.width {
			y = 1.0
		} else if x <= c5.center-c5.width {
			y = -1.0/c5.width*(x-(c5.center-2.0*c5.width)) + 1.0
		} else {
			y = 0.0
		}
	} else if c5.express == "LESS" {
		if x <= c5.center-2.0*c5.width {
			y = 0.0
		} else if x <= c5.center-c5.width {
			y = 1.0/c5.width*(x-(c5.center-c5.width)) + 1.0
		} else if x <= c5.center {
			y = -1.0/c5.width*(x-(c5.center-c5.width)) + 1.0
		} else {
			y = 0.0
		}
	} else if c5.express == "COMMON" {
		if x <= c5.center-c5.width {
			y = 0.0
		} else if x <= c5.center {
			y = 1.0/c5.width*(x-c5.center) + 1.0
		} else if x <= c5.center+c5.width {
			y = -1.0/c5.width*(x-c5.center) + 1.0
		} else {
			y = 0.0
		}
	} else if c5.express == "MORE" {
		if x <= c5.center {
			y = 0.0
		} else if x <= c5.center+c5.width {
			y = 1.0/c5.width*(x-(c5.center+c5.width)) + 1.0
		} else if x <= c5.center+2.0*c5.width {
			y = -1.0/c5.width*(x-(c5.center+c5.width)) + 1.0
		} else {
			y = 0.0
		}
	} else if c5.express == "MOREMORE" {
		if x <= c5.center+c5.width {
			y = 0.0
		} else if x <= c5.center+2.0*c5.width {
			y = 1.0/c5.width*(x-(c5.center+2.0*c5.width)) + 1.0
		} else {
			y = 1.0
		}
	} else {
		fmt.Println("MF5 func_X(): wrong expression")
		os.Exit(1)
	}

	return y
}

/////////////////////////////

type action_MF5 struct { // condition_MF5の基底クラス
	center  float64
	width   float64
	express string
	x       float64
	y       float64
}

func new_action_MF5(_center, _width float64, _express string) *action_MF5 {
	a5 := new(action_MF5)
	a5.center = _center
	a5.width = _width
	a5.express = _express

	if a5.express == "LESSLESS" {
		a5.x = a5.center - 2.0*a5.width
	} else if a5.express == "LESS" {
		a5.x = a5.center - a5.width
	} else if a5.express == "COMMON" {
		a5.x = a5.center
	} else if a5.express == "MORE" {
		a5.x = a5.center + a5.width
	} else if a5.express == "MOREMORE" {
		a5.x = a5.center + 2.0*a5.width
	} else {
		fmt.Println("new_action_MF5: wrong scale expression")
		os.Exit(-1)
	}

	a5.y = 0.0

	return a5
}

// 後件部メンバーシップ関数(山3つ)クラス
func (a5 *action_MF5) func_Y() float64 {
	// x,yは、メンバーシップ関数上の座標を示す

	return a5.y
}

func (a5 *action_MF5) func_Max(b float64) {
	a5.y = max_2(b, a5.y)
}

func (a5 *action_MF5) func_X() float64 {
	return a5.x
}

func complain_reasoning(dis, age float64) float64 {

	// Walking(前件部)
	Walk_Less := new_condition_MF3(1.4, 0.4, "LESS")
	Walk_Common := new_condition_MF3(1.4, 0.4, "COMMON")
	Walk_More := new_condition_MF3(1.4, 0.4, "MORE")

	// Age(前件部)
	Age_LessLess := new_condition_MF5(42, 15, "LESSLESS")
	Age_Less := new_condition_MF5(42, 15, "LESS")
	Age_Common := new_condition_MF5(42, 15, "COMMON") // 中央が 42歳
	Age_More := new_condition_MF5(42, 15, "MORE")
	Age_MoreMore := new_condition_MF5(42, 15, "MOREMORE")

	// Complain(後件部)
	Complain_LessLess := new_action_MF5(0.5, 0.25, "LESSLESS") // 不満の中央値が0.5   0.0/0.25/0.50/0.75/1.00 の5段階

	Complain_Less := new_action_MF5(0.5, 0.25, "LESS")
	Complain_Common := new_action_MF5(0.5, 0.25, "COMMON")
	Complain_More := new_action_MF5(0.5, 0.25, "MORE")
	Complain_MoreMore := new_action_MF5(0.5, 0.25, "MOREMORE")

	// [ルール00] 歩行距離:少0 年令:子供0
	Rule00 := min_2(Walk_Less.func_X(dis), Age_LessLess.func_X(age))
	Complain_LessLess.func_Max(Rule00) // 後件部は上書きされていく
	//fmt.Println("Rule00", Rule00)

	// [ルール01] 歩行距離:少0 年令:若年1
	Rule01 := min_2(Walk_Less.func_X(dis), Age_Less.func_X(age))
	Complain_LessLess.func_Max(Rule01) // 後件部は上書きされていく
	//fmt.Println("Rule01", Rule01)

	// [ルール02] 歩行距離:少0 年令:壮年2
	Rule02 := min_2(Walk_Less.func_X(dis), Age_Common.func_X(age))
	Complain_Common.func_Max(Rule02) // 後件部は上書きされていく
	//fmt.Println("Rule02", Rule02)

	// [ルール03] 歩行距離:少0 年令:高齢3
	Rule03 := min_2(Walk_Less.func_X(dis), Age_More.func_X(age))
	Complain_Common.func_Max(Rule03) // 後件部は上書きされていく
	//fmt.Println("Rule03", Rule03)

	// [ルール04] 歩行距離:少0 年令:老齢4
	Rule04 := min_2(Walk_Less.func_X(dis), Age_MoreMore.func_X(age))
	Complain_More.func_Max(Rule04) // 後件部は上書きされていく
	//fmt.Println("Rule04", Rule04)

	// [ルール10] 歩行距離:普通1 年令:子供0
	Rule10 := min_2(Walk_Common.func_X(dis), Age_LessLess.func_X(age))
	Complain_LessLess.func_Max(Rule10) // 後件部は上書きされていく
	//fmt.Println("Rule10", Rule10)

	// [ルール11] 歩行距離:普通1 年令:若年1
	Rule11 := min_2(Walk_Common.func_X(dis), Age_Less.func_X(age))
	Complain_Less.func_Max(Rule11) // 後件部は上書きされていく
	//fmt.Println("Rule11", Rule11)

	// [ルール12] 歩行距離:普通1 年令:壮年2
	Rule12 := min_2(Walk_Common.func_X(dis), Age_Common.func_X(age))
	Complain_Common.func_Max(Rule12) // 後件部は上書きされていく
	//fmt.Println("Rule12", Rule12)

	// [ルール13] 歩行距離:普通1 年令:高齢3
	Rule13 := min_2(Walk_Common.func_X(dis), Age_More.func_X(age))
	Complain_More.func_Max(Rule13) // 後件部は上書きされていく
	//fmt.Println("Rule13", Rule13)

	// [ルール14] 歩行距離:普通1 年令:老齢4
	Rule14 := min_2(Walk_Common.func_X(dis), Age_MoreMore.func_X(age))
	Complain_MoreMore.func_Max(Rule14) // 後件部は上書きされていく
	//fmt.Println("Rule14", Rule14)

	// [ルール20] 歩行距離:多2 年令:こども0
	Rule20 := min_2(Walk_More.func_X(dis), Age_LessLess.func_X(age))
	Complain_Less.func_Max(Rule20) // 後件部は上書きされていく
	//fmt.Println("Rule20", Rule20)

	// [ルール21] 歩行距離:多2 年令:若年1
	Rule21 := min_2(Walk_More.func_X(dis), Age_Less.func_X(age))
	Complain_Common.func_Max(Rule21) // 後件部は上書きされていく
	//fmt.Println("Rule21", Rule21)

	// [ルール22] 歩行距離:多2 年令:壮年2
	Rule22 := min_2(Walk_More.func_X(dis), Age_Common.func_X(age))
	Complain_More.func_Max(Rule22) // 後件部は上書きされていく
	//fmt.Println("Rule22", Rule22)

	// [ルール23] 歩行距離:多2 年令:高齢3
	Rule23 := min_2(Walk_More.func_X(dis), Age_More.func_X(age))
	Complain_MoreMore.func_Max(Rule23) // 後件部は上書きされていく
	//fmt.Println("Rule23", Rule23)

	// [ルール24] 歩行距離:多2 年令:老齢4
	Rule24 := min_2(Walk_More.func_X(dis), Age_MoreMore.func_X(age))
	Complain_MoreMore.func_Max(Rule24) // 後件部は上書きされていく
	//fmt.Println("Rule24", Rule24)

	// 推論計算
	numerator :=
		Complain_LessLess.func_X()*Complain_LessLess.func_Y() +
			Complain_Less.func_X()*Complain_Less.func_Y() +
			Complain_Common.func_X()*Complain_Common.func_Y() +
			Complain_More.func_X()*Complain_More.func_Y() +
			Complain_MoreMore.func_X()*Complain_MoreMore.func_Y()

	denominator :=
		Complain_LessLess.func_Y() +
			Complain_Less.func_Y() +
			Complain_Common.func_Y() +
			Complain_More.func_Y() +
			Complain_MoreMore.func_Y()

	complain := numerator / denominator

	return complain

}

2022/09,江端さんの技術メモ

Goにはクラスの概念がありません。

C++で作ってきたプログラムをGoに移植しているのですが、クラスで記載した部分を上手いこと使い回したくても、それができなくて困っていました。

で、

GO言語でクラスっぽいことをする

という記事を見つけて、これを使って勉強させて頂いていますが、困ったことがあります。

プログラムの中の変数の意味が分からない ―― HPとか、MPとか、APは、アニメ(多分ゲームも?)の中では頻繁に登場するのですが、私は何の略号か分からなかったので、サンプルプログラムの意味が読み解けませんでした。

そこで、上記記事に記載されていたプログラムに、そのまま、私の為に、コメントを付けさせて頂きました。

package main

import (
	"fmt"
)

const line = "--------------------"

func main() {
	wiz := newWizard("魔法少女", 10, 10, 5)
	war := newWarrior("+‡†狂戦士†‡+", 10, 15, 30)

	fmt.Println(wiz.hello())
	fmt.Println(war.hello())

	fmt.Println(line)
	fmt.Println(wiz.attack())
	fmt.Println(war.attack())

	fmt.Println(line)
	fmt.Println(wiz.magic())
	fmt.Println(war.attack())
}

type human struct { // "人間"という基底クラス
	name string
	hp   int
	ap   int
}

func (h *human) init(name string, hp, ap int) { // "人間"という基底クラスのコンストラクタ(3つの初期値を入れていることに注意))
	h.name = name // 名前
	h.hp = hp     // ヒットポイント: ゲームにおいてキャラの体力や生命力を示すステータスの一つ
	h.ap = ap     // アタックポイント: ゲームにおいてキャラの行動力などを示すステータスの一つ
}

func (h *human) hello() string { // "人間"という基底クラスのメソッド1
	return fmt.Sprintf("こんにちは、私は%sです。", h.name)
}

func (h *human) attack() string { // "人間"という基底クラスのメソッド2
	return fmt.Sprintf("%sの攻撃!%dのダメージ!", h.name, h.ap)
}

type wizard struct { // "魔法使い"というクラス
	human     // "人間の属性"を手動挿入
	mp    int // マジックポイント: ゲームにおいてキャラの魔法や呪文を使う力を示すステータスの一つ
}

func newWizard(name string, hp, ap, mp int) *wizard { // "魔法使い"クラスのコンストラクタ(4つの初期値を入れていることに注意))
	w := new(wizard)     // "魔法使い"の実体生成
	w.init(name, hp, ap) // "基底クラス"の属性値の設定
	w.mp = mp            // 新しい属性値の設定
	return w
}

func (w *wizard) magic() string {
	if w.mp <= 0 {
		return fmt.Sprintf("%sは力がでない", w.name)
	}
	w.mp -= 1
	return fmt.Sprintf("%sは魔法を使った!30のダメージ!", w.name)
}

type warrior struct {
	human // "人間の属性"のみを手動挿入
}

func newWarrior(name string, hp, ap, mp int) *warrior {
	w := new(warrior)
	w.init(name, hp, ap)
	// mpは使わない? Warrior(戦士)は、マジックポイントを持たないものなの?
	return w
}

func (w *warrior) attack() string {
	return fmt.Sprintf("%sの攻撃!%dのダメージ!", w.name, w.ap*2)
}

なるほど、変数の意味が分かれば、プログラムの趣旨が読み取れました ―― 加えて、アニメの中の台詞も理解できるようになり、一石二鳥でした。
ゲームをやっている人であれば、「今更なこと」だったんだろうな、と思っています。


とほほのGo言語入門 構造体(struct)

を読んでいたら、構造体(struct)でクラスと同じことができることが分かりました。

また、インタフェース(interface)を使えばポリモーフィズムもできるみたいでした。

しかも、コンストラクタとかデストラクタとか、面倒なものもを入れていないという点も好印象です。

Golangの設計者、よく分かってるじゃん!』と、絶賛賞賛中です。

2022/09,江端さんの忘備録

私は、「撤収」が、超高度な技術であることを知っています。

I know that "Withdrawal" is a super advanced technology.

"技術"に留まらず、"哲学"である、とすら思っています。

I believe that it is not only a "technique" but also a "philosophy".

そのようなマインドを持っている私にとって、

For me, with that kind of mindset,

■NHK「解体キングダム」

- NHK program "Kaitai Kingdom"

■Nスペ「廃炉への道」

- NKS Special "The Road to Decommissioning."

は、手に汗握るスリルに満ちた貴重なコンテンツです。

are valuable contents full of thrills.

-----

我が国は、原爆被害、原発事故など、いわゆる「"核災害"先進国」です。

Japan is an advanced country in terms of nuclear disasters, including atomic bombings and nuclear accidents.

しかし、同時に、これらの不幸な災害は、我が国の"核"災害対策の技術を高めていると思います。

At the same time, however, I believe that these unfortunate disasters have enhanced our nation's "nuclear" disaster preparedness techniques.

私は、システム屋として、『事故を起こさないシステムなど、絶対的な意味において「ない」』という事実を知っています。

As a systems engineer, I know for a fact that 'there is no such thing as an accident-free system' in the absolute sense of the word.

ですから、これからも、世界中で、核の事故は続きます。

New "nuclear" accidents will continue to occur in the world.

なぜなら、当面の間、人類が「核」を手放せる目処がない以上、「核」の事故は必ず発生するからです。

This is because, as long as humanity has no prospect of giving up "nuclear" in the foreseeable future, nuclear accidents are bound to occur.

以下は、「原発事故発生"10億年に1回"とは、笑わせる」を図解したものです。

The following is an illustration of the "1 in a billion years" accident rate, which make me laugh.

米国(スリーマイル)、ソ連、あらためロシア(チェルノブイリ、改めチョルノービリ)、日本(福島)、と、これまで「大事故」と断定できるものは3回ありました。

There have been three major accidents in the United States (Three Mile), in Russia changed the Soviet Union(Chernobyl, and in Japan (Fukushima).

今度は、どこか?

"Where is the next?"

直感の域を出ませんが、国外であれば、我が国の近隣国がヤバい気がします。

It is just my imagination, I am concern that that our nearby countries will be in trouble.

-----

という訳で、解体や廃炉に特化した技術、さらには、それを日常生活から国家の政策にまで適用可能な、一般的思想(哲学)にまで高めた総合的な学問としての、

Therefore, not only as technologies for demolition and decommissioning a nuclear reactor, but also, as comprehensive study to be general thoughts (or philosophy) which apply for From everyday life to state policy, I will propose

『撤収学』

"Withdrawal Study"

の設立を提案したいと思います。

「XX大学工学部撤収学科」、とか、「XX大学経済学部撤収学科」、という称呼が一般的になって欲しいです。

I would like to see the term "XX University, Faculty of Engineering withdrawn" or "XX University, Faculty of Economics withdrawn" become more common.

2022/09,江端さんの忘備録

マッチョな体になって、女性にモテたい、という心理は、私の人生で、1ナノ秒も登場したことがありません。

上記を経て、「江端マッチョ化計画」・・・もとい、「江端介護向け身体改造計画」を進めております。

Through the above, I am proceeding with the "Ebata Machoization Plan"...or rather, the "Ebata Body Modification Plan as a caregiver".

観点は、以下のような感じです。

The viewpoints are as follows.

(0)外出(フィットネスセンターなど)が面倒くさい。

(0) Going out (e.g., to a fitness center) is a hassle.

(1)バーベルやダンベル等のごっついデバイスは、いずれ「漬物石」になる

(1) Burly devices such as barbells and dumbbells will eventually become "pickle stones".

(2)トレーニングマシンは、置く場所がない上に、とても高価。

(2) Training machines are very expensive as well as there is no place to put them.

(3)基本的に私が欲しいものは、腹筋運動や背筋運動を手伝ってくれる「補助」

(3) Basically what I want is an "assistant" to help me with abdominal and back exercises.

てなことを考えているうちに ―― 昨日衝動的に「買っちった」

I was thinking about it -- I impulsively "bought it" yesterday.

-----

鉄棒(懸垂)はルティーン化できたのですが、この腹筋・背筋運動を含めることができるか、今後の課題です。

I was able to lutinize the bars (pull-ups), but it remains to be seen if I can include these abdominal and back exercises.

2022/09,江端さんの技術メモ

Golangで "OpenError: sql: unknown driver "postgres" (forgotten import?) "で悩まされていました。

よく分かりませんが、"go.mod", "go.sum"とかをいじることなく

(1)ターミナルから、

go get github.com/lib/pq

として、

(2)import に

import (
   //  色々
    _ "github.com/lib/pq" // ←これを追記
)

で動きました。

2022/09,江端さんの忘備録

ロシアのウクライナ侵攻以来、小説の中の話が、現実でもちゃんと使えるんだ、ということを実感する日々です。

Since Russia's invasions of Ukraine, I have been realizing that fiction stories in novels can be used properly in real life.

1つ目は、『核抑止力』というものが、それなりに機能しているという事実です。

First of all, the fact is that "nuclear deterrence" is working to a point.

現時点で、ロシアもNATOも、核兵器を使用していません。

At this time, neither Russia nor NATO uses nuclear weapons.

正直、私は、「戦略核」の使用はないとしても、「戦術核」はありえるのではないか、と危惧していましたし、今も危惧し続けています。

Frankly speaking, I have feared and continue to fear that even if "strategic nuclear weapons" are not used, "tactical nuclear weapons" are possible.

-----

2つ目は、新しい"核"兵器としての原発の利用 --- 『原発(原子力発電所)攻撃』です。

Secondly, a new nuclear weapon using nuclear power plants --- "nuclear power plant attack"

今も続く、ロシアによる原発攻撃(*)によって、世界中が震撼しているのはご存知の通りです。

As you know, the world is still shaken by the ongoing Russian attack on nuclear power plants(*).

(*)ロシアは、「ウクライナによる攻撃」と主張

(*) Russia claims "attack by Ukraine

私は、日本国民が、『電力を作り出す原発』が『常時電力を供給し続けなければ、とんでもないことになる』ことを、心底から理解できている、世界唯一の国である、と信じています。

I believe that the Japanese are the only people in the world who truly understand that "nuclear power plants," which produce electricity, "would be in serious trouble if they did not constantly supply power".

もちろん、これは、福島原発事故の、あの「全電源消失」のことです。

Of course, this refers to the "total loss of power" of the Fukushima nuclear accident.

この『原発(原子力発電所)攻撃』というのは、『原爆(原子爆弾)開発』と比べて、おろそしく簡単で、ウルトラ低コストです。

This "attack on nuclear power plants" is ludicrously easy and ultra-low cost compared to "developing atomic bombs".

原子炉本体を攻撃する必要もなく、送電網の破壊だけで足ります -- 『破壊工作員、数人程度』で十分いけるんじゃないかな、思います。

There is no need to attack the reactor itself, only to destroy the power grid -- "a few saboteurs" should be enough.

本当に「想定外」なのですか?(2011-03-29の日記)

-----

このように、戦略核 -> 戦術核 -> 原発攻撃 と -----

Thus, strategic nuclear weapons -> tactical nuclear weapons -> nuclear power plant attack,

私たちは、「核廃絶」どころか、3つめの核兵器を「発見」してしまったのだなぁ、と実感しています。

I realize that we have not "abolished" nuclear weapons, but rather "discovered" a third nuclear weapon.

2022/09,江端さんの忘備録

最近、長女が、ロシアによるウクライナ侵攻を見て、真剣に国防を考え出しているようで、大変、興味深いです。

It is very interesting that my senior daughter has recently started to seriously consider national defense after seeing the Russian invasion of Ukraine.

# 正確に言うと『国防』ではなくて『逃亡』ですが。

# To be precise, it's not 'national security' but 'escape'.

―― どこに逃げればいいの?

"Where to escape?"

と、真剣に心配しています。

She is seriously concerned.

-----

「我が国(日本)が、今後、どういう流れで戦争に巻き込まれていくか」 ―― というシミュレーションは、私にとっては、大好物のネタですので、そのいくつかのシナリオを長女に語りました。

Simulations of how our country (Japan) might be drawn into a war in the future are a favorite topic of mine, so I told her about some of the scenarios.

昨夜は、これに加えて、「ロシアから見た正義」と「中国から見た正義」についても解説してみました。

Last night, in addition to this, I also explained "justice from the Russian point of view" and "justice from the Chinese point of view".

―― 彼らには、彼らなりの、戦争をしかけるだけの正当な理由がある

"They have their own, justifiable reasons for starting a war"

という私の話が、長女を、さらに不安にさせているようです。

The stories of mine seemed to make her more anxious.

それはさておき。

Aside from that.

-----

以前、私は、長女と次女の近代歴史知識の乏しさを批判し、逆に論破されたことがあります。

I once criticized my daughters for their lack of modern historical knowledge, and was rebutted.

「いや、『四人組』とか『文革』とか、嫌な話がテンコ盛りでしょう?」(2017-04-15 の日記)

実際に、歴史の教師は「歴史が重要だ」と言い続けていますが、はっきり言います―― 「古代エジプトのファラオが誰であろうか、その国が滅びようが、それが何だと言うのか」

一方、嫁さんの方は、近年「忠臣蔵」のドラマが放送されていないことに、重大な危機感を感じているようです。

On the other hand, my wife feels a serious sense of crisis over the fact that no "Chushingura" dramas have been broadcast in recent years.

『日本人から、「忠臣蔵」の精神が失われたら、どうするんだ』と。

"What if the spirit of Chushingura is lost from the Japanese people?"

私は、こちらについては、心底"どーでもいい"と思っています。

I am truly "not concerned" about this.

しかし、以前『徒党を組んだ地方浪人による、テロ事件』と語った時に、もの凄く怒られたので、黙っています。

However, my wife was extremely angry with me when I told her that it was "a terrorist attack by local ronin who formed a clique," so I have kept my mouth shut.

-----

私たちは、自分なりの価値観で、その価値観を他人にも理解して欲しいと考えますが ――

We have our own set of values, and we want others to understand those values, but--

結局のところ、そういう試みの多くは、『無駄』に終わります。

After all, such attempts will be in vain.

2022/09,江端さんの技術メモ

golangを使った、postgresqlのinsertの方法

/*

こんな感じで、DBとTableを作りました

create database agent_db;

create table LocMessage(
	ID     int,
	Lat    double precision,
	Lng    double precision,
	TYPE   varchar(10),
	POPUP  int,
	RealId int,
	PersonState      int,
	BikeState        int,
	StartStationLat  double precision,
	StartStationLng  double precision,
	GoalStationLat   double precision,
	GoalStationLng   double precision,
	StartStationName varchar(40),
	GoalStationName  varchar(40)
);

ちなみに、全部小文字になるみたいですねえ。
agent_db=# select * from locmessage;
 id |  lat   |  lng  |   type   | popup | realid | personstate | bikestate | startstationlat | startstationlng | goalstationlat | goalstationlng | startstationname | goalstationname
----+--------+-------+----------+-------+--------+-------------+-----------+-----------------+-----------------+----------------+----------------+------------------+-----------------

*/

package main

import (
	"database/sql"
	"log"

	_ "github.com/lib/pq"
)

func main() {

	db, err := sql.Open("postgres",
		"user=postgres password=password host=localhost port=15432 dbname=agent_db sslmode=disable")
	if err != nil {
		log.Fatal("OpenError: ", err)
	}
	defer db.Close()

	//_, err = db.Exec("insert into locmessage(id,lat,lng,type,popup,realid,startstationlng ) VALUES(1, 139.0, 38.0, 'PERSON',1,1,222.222);")
	// _, err = db.Exec("insert into locmessage(id,lat) VALUES(a, b);")
	//ins, err := db.Prepare("insert into locmessage(id,lat,lng,type,popup,realid,startstationlng ) VALUES(?,?,?,?,?,?,?)")
	ins, err := db.Prepare("insert into locmessage(id,lat,lng,type,popup,realid,startstationlng ) VALUES($1,$2,$3,$4,$5,$6,$7)")
	if err != nil {
		log.Fatal("db.Exec Error: ", err)
	}

	a := 1
	b := 139.02
	c := 38.02
	dd := "Tomoichi"
	e := 1
	f := 1
	g := 333.333

	//ins.Exec("1", "139.0", "38.0", "BIKE", "1", "1", "222.222")
	//ins.Exec(1, 139.01, 38.01, "BIKE", 1, 1, 222.222)
	//ins.Exec(1, 139.0, 38.0, 1, 1, 1, 222.222)
	ins.Exec(a, b, c, dd, e, f, g)

}

とりあえず、これでデータベースの書き込みはできるみたい。