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

先日、リモート会議で、研究ユニットのメンバから「犯罪学」に関する発表を聞きました。

I recently heard a presentation on "criminology" from a member of our research unit at a remote conference.

ちょうど良い機会なので、質疑の時間に、

I thought it was just the right opportunity to ask a question during the question period.

―― 私、結構な頻度で、『職務質問』されるんですけど、良い対策方法ってありますか?

"I am being "questioned on duty" quite often. Is there any good countermeasure?"

と質問してみました。

不思議なのですが、ネットワークの向こう側であっても、『メンバーがどん引き』しているのを感じることができました。

It's strange, but even on the other side of the network, I could feel the 'members' was put off by what I said.


英国入国

私の入会を許諾してくれる「珍走族」の方、いらっしゃいましたら、ご連絡下さい。

大抵の人にとって、「職務質問」という言葉は、単なる概念として一生を終えると思います。

女子中学生の拉致を計画しているテロリストが、少しづつ近付いてきている 

―― 江端の禁酒って、改宗?

写真なんかとったら、直ぐに取り抑えられそうでしたし、正直、立ち止まることすら躊躇されました。

海外出張に行くあなたは、「たった一人の軍隊」である 

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

さくらのレンタルサーバでの「ベーシック認証」は、自力でやらず、サーバーコントロールパネルを使うこと

特定のディレクトリのみベーシック認証を実施したかったのですが、

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at [no address given] to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.

から逃げられず、どうして良いのか分からなかったのですが、どうも、これ、プロバイダ側の原因(仕様変更)らしいと分かってきました。

で、今、動いたようなので、忘れない内に、私の為に、メモのみ残しておきます。

これで,".htpassword"が生成されます。

これを操作すると(内容は忘れた)、".htaccess"が生成されます。

いずれにしても、「手動で作る」ことは諦めた方がいいです。

以上

 

 

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

ホームページを丸ごとダウンロードできる便利ツールHTTrack(WinHTTrack)の使い方

EE Times Japan風のスタイルサンプル


<!-- globalStylesheet -->

<link rel="stylesheet" href="https://www.itmedia.co.jp/css/ee/base.css?201908291653" type="text/css" media="all">
<link rel="stylesheet" href="https://www.itmedia.co.jp/css/ee/ad.css?202106291147" type="text/css" media="all">
<link rel="stylesheet" href="https://www.itmedia.co.jp/css/ee/article.css?202208011700" type="text/css" media="all">

<!-- /globalStylesheet -->

<div class="lpanIn">


<script type="text/javascript">
var str = document.title.replace(/\<\!\-\-EDIT START\-\-\>/g,'').replace(/\<\!\-\-EDIT END\-\-\>/g,'').replace(' - EE Times Japan','');
str = cutString(str,50);
document.write(str);
</script>

</div>
</div>
</div>
</div>
</div>

</div>


<div id="masterContents"><div id="globalContents">
<div id="masterMain">

<!---->


<div id="tmplNews" class="tmplArticle"><div id="tmplNewsIn" class="tmplArticleIn">

	


<!--EDIT START-->
<!--EDIT END-->



<div id="cmsTitle"><div class="inner">
<h1 class="title"><span class="title__maintext">老後を生き残る「戦略としての信仰」は存在するのか</span><i class="title__delimiter">:</i><i class="title__subtitle">「お金に愛されないエンジニア」のための新行動論(6)</i><span class="title__pagenumber">(4/12 ページ)</span></h1>
</div></div>
<div id="tmplMark"></div>


<div id="cmsAbstract"><div class="inner"><h2></h2></div></div>


<!---->

<div id="cmsByline"></div>
<div id="cmsByline"></div>


<div id="cmsByline"><div class="inner" id="byline"><b>[</b><b>]</b></div></div>
<div id="cmsByline"><div class="inner" id="byline"><b>[</b>江端智一,<b>EE Times Japan]</b></div></div>



<!-- cmsHoleBodyWrapStart -->
<div id="cmsBody"><div class="inner">

<script>
(function(){
	var d = document;
	var date = d.getElementById('cmsDate');
	var type = d.getElementById('cmsType');
	var abstract = d.getElementById('cmsAbstract');
	var byline = d.getElementById('cmsByline');
	// 位置を移動
	byline.parentNode.insertBefore(date,byline);
	// 要素を削除
	type.parentNode.removeChild(type);
	abstract.parentNode.removeChild(abstract);
})();
</script>



<link rel="stylesheet" href="https://www.itmedia.co.jp/css/socialbutton.css?202001221022">
<script>
var msbBtnLoadScript = [];
</script>
<script src="https://eetimes.itmedia.co.jp/js/socialbutton.js?202111161930"></script>
<div id="masterSocialbuttonTop" class="masterSocialbutton"><div class="msbOut" id="msbTopOut"></div></div>




<!-- BCP Text -->


<div id="cmsMark"><!-- null for itmedia-->
</div>
<!-- cmsBodyCtrlTop -->
<div class="ctrl">
<span id="prev"><a href="news047_3.html">前のページへ</a></span>
<span id="numb"><a href="news047.html">1</a>|<a href="news047_2.html">2</a>|<a href="news047_3.html">3</a>|<strong>4</strong>|<a href="news047_5.html">5</a>|<a href="news047_6.html">6</a>|<a href="news047_7.html">7</a>|<a href="news047_8.html">8</a>|<a href="news047_9.html">9</a>|<a href="news047_10.html">10</a>|<a href="news047_11.html">11</a>|<a href="news047_12.html">12</a></span>
<span id="next"><a href="news047_5.html">次のページへ</a></span>
</div>

<!-- cmsBodyMainStart -->
<!-- cxenseparse_start -->
<div class="subscription">
<a name="point2"></a>
<h4>私(江端)がカルト宗教(江端教)の教祖になった件</h4>
<p> さて、キリスト教系のカルト宗教団体の多くは、キリスト教の根幹とも言える、この"原罪"ストーリーに、壮大なラクガキ・・・もとい、上書きを施します。これらのカルト宗教に見られる「上書き」パターンには以下のようなものがあります(というか、私が知る限り、『これしかない』という感じです)。</p>
<p> カルト宗教団体や、その教祖のイメージをしやすくするために、『<strong>私(江端)がカルト宗教(江端教)の教祖になった件</strong>』、という架空の話で説明を行います。</p>
<p> まず、教祖である私は、原作である失楽園での、「アダムとイブによるリンゴ食」のストーリーを、ヘビ(ルシファー)とイブの性交(SEX)と、さらに、イブとアダムとの性交(SEX)という、「ヘビとアダムとイヴの3P(Three persons SEX)」が実施された、という「上書き」を施します。これによって、精神的または肉体的な純潔が犯された(堕落した)という概念を挿入しました。</p>
<p> 次に、私は、『イエス・キリストの救済は、万能ではなかった』、という「上書き」を加えます ―― といっても、イエス・キリストの働きを全面的に否定するのではなく、精神的または肉体的な純潔という2つの純潔のうち、<strong>「精神面」だけは解決してくれた</strong>、というストーリーに改ざんします。</p>
<p> イエス・キリストを全面否定すると、信者が集まりにくくなると考えたので、ここは、イエス・キリストを活用する方向でストーリーを作りました。</p>
<p> しかし、<strong>肉体的な純潔は、まだ回復されていない</strong>、という課題を残しつつ、ついに、ここに私(江端)が登場するのです。</p>
<!--CAP-->
<div id="col600c"><a name="mm220831_money02_w570.jpg"></a><img src="https://image.itmedia.co.jp/ee/articles/2208/31/mm220831_money02_w570.jpg" width="570" height="981"></div>
<!--CAPEND-->
<p> <strong>“メシア the final” こそが、この私江端智一、偉大なる江端、『<span class="cmsFontsize1">エバ・カンターレ</span>』です。</strong></p>
<p> 以上をまとめますと ―― イエス・キリスト製ワクチンは、”魂(スピリッツ)の原罪”には効果はあったが、<strong>肉体(フィジカル)の原罪には、その効力が及んでいない</strong>、という、<strong>壮大なシナリオ変更をぶっこむ</strong>のです。この肉体版”原罪”のワクチンとなるのが、この私、エバ・カンターレなのです。</p>
<p> 私(江端)は、『<strong>イエス・キリストは完全な”原罪”ウイルス向けワクチンを提供していない</strong>』と、キリスト教に対する強烈なディスリスペクトをかました上で、<strong>自分(江端)こそが最終救済者(メシア the final)であると言い切ります</strong>。もちろん、これは、世界中のキリスト教徒全てにケンカを売る行為です<sup>*)</sup>。</p>
<p><span class="cmsFontsize-1">*)ただ、世界中のカルトの教祖のほぼ全てが、「自分こそが”メシアthe final”」と主張しているので、逆に、「ありふれている」と言えるかもしれませんが。</span></p>
<!--CAP-->
<div id="col600c"><a name="mm220831_money02a_w570.jpg"></a><img src="https://image.itmedia.co.jp/ee/articles/2208/31/mm220831_money02a_w570.jpg" width="570" height="428"></div>
<!--CAPEND-->
<p> 江端教の目的が、肉体向け”原罪”に対抗するワクチン接種行為と考えるわけです。</p>
<p> しかし、肉体向け"原罪"の消滅は、mRNAのようなワクチン接種では実現できません。そこで、私は、AI技術の一つである、遺伝的アルゴリズム<sup>*)</sup>のアプローチ、すなわち、人為的なエリート製造戦略で、この問題の解決を試みます。</p>
<p><span class="cmsFontsize-1">*関連記事:「<A HREF="https://eetimes.itmedia.co.jp/ee/articles/1701/31/news031.html" target="_blank">抹殺する人工知能 ~ 生存競争と自然淘汰で、最適解にたどりつく</A>」</span></p>
<p> つまり、<strong>肉体向け”原罪”をうまいこと消滅できる組み合わせのカップルを作る</strong>のです。『そんなこと、どうやってできるのか』などとは、考えてはなりません。</p>
<p> 私はたった一人で、誰にも相談せずに、この組み合わせをコンピュータと直感でデザインするのです。しかし、1組、2組程度をちんたらやっていたら、人類の救済などできません。</p>
<p> ですので、カップルを、数千から数万単位で同時に量産するのです。その上、私は、男女の顔写真と全身写真”だけ”で、<A HREF="https://eetimes.itmedia.co.jp/ee/articles/1804/27/news093_2.html" target="_blank">ニューラルネットワーク</A>と、<A HREF="https://eetimes.itmedia.co.jp/ee/articles/1711/30/news019_2.html" target="_blank">最適化アルゴリズム</A>を使ってマッチングさせます。</p>
<p> 私はコンピュータを使った組み合わせ問題のエキスパートでもありますので、この問題の困難性を完璧に理解しています。恐らく、完璧な量子コンピュータが開発されたとしても、この組み合わせを完成させるのには、宇宙の年齢を、宇宙の年齢分繰り返しても、全然足りないくらいの時間が必要です<sup>*)</sup>。</p>
<p><span class="cmsFontsize-1">*)「NP困難問題」でググってみてください。</span></p>
<p> しかし、忘れてなりません。私は、最終救済者、”メシア the final”なのです。<strong>私のコンピュータの中には、神が常駐しており、私には、計算中のコンピュータから、常に神の声が聞こえてくるのです</strong>。</p>
<p> このように、この私は、肉体版”原罪”を消滅させうる超高度な医学的(遺伝子学)組み合わせを、写真だけを使って、膨大(という言葉では語れないくらいの膨大)な数でデザインします。</p>
<p> この程度のこと、”メシア the final”である私にとっては、ピース・オブ・ケーキ(朝飯前)です。</p>
<p> 人類は、最終救済のためであれば、自由恋愛やら、出会いの場やら、合コンやら、結婚相談所やら、そのような些事(さじ)に関わっている暇はありません。</p>
<p> 神の声を聞くことのできる唯一のメシアである私は、堕落した近代の<strong>自由恋愛結婚観を完全否定</strong>して、現実世界において、豪快かつ壮大な数の遺伝的アルゴリズムを地上で実現しなければならないという使命があるのです ―― つまり、一斉集団結婚です<sup>*)</sup>。</p>
<p><span class="cmsFontsize-1">*)純潔を守るという名目の、「村の中のみで閉じた結婚制度」、あるいは、「一夫多妻」「一妻多夫」などのような形態でも同じ効果を得られます。</span></p>
<p> すなわち、江端教においては、肉体版"原罪"を消滅させうる手段として、一斉集団結婚は、絶対に避けて通ることができない一大イベントなのです。</p>
<div id="notice"><a href="news047_5.html">「江端原理」通称”エバタ・プリンシプル”を説明する</a></div>
</div><!-- subscription end -->

<!-- cxenseparse_end -->

<!-- cmsBodyMainEnd -->

<!-- cmsBodyRelated -->
<div class="ctrl">
<span id="prev"><a href="news047_3.html">前のページへ</a></span>
<span id="numb"><a href="news047.html">1</a>|<a href="news047_2.html">2</a>|<a href="news047_3.html">3</a>|<strong>4</strong>|<a href="news047_5.html">5</a>|<a href="news047_6.html">6</a>|<a href="news047_7.html">7</a>|<a href="news047_8.html">8</a>|<a href="news047_9.html">9</a>|<a href="news047_10.html">10</a>|<a href="news047_11.html">11</a>|<a href="news047_12.html">12</a></span>
<span id="next"><a href="news047_5.html">次のページへ</a></span>
</div>

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

アウトカムやら、ロジックモデル、ロジックツリーなど、毎日新しい用語を覚えさせられる日々を送っております。

Every day I am forced to learn new terms such as outcome, logic model, logic tree, and so on.

興味のある方はググって頂ければ結構ですが、これらは、私が見る限り、すでに存在していた考え方の「再定義」に過ぎません。

If you are interested, you can Google it, but as far as I can tell, these are just "redefinitions" of ideas that already existed.

これらの用語の意味を、現存する技術に落し込んで考えたいエンジニアの方には ――

For engineers who want to understand the mieaning of terms by matching existing technologies

『ベイジアンネットワーク』が、てっとり早いかなぁ、と思っています。

I think that "Bayesian Network" would be the quickest way to understand them.

私は、

I think that

『「ロジックモデル」や「ロジックツリー」とは、つまるところ、ベイジアンネットワークの設計プロセスだろ?』

"Logic models and logic trees are, after all, the design process of a Bayesian network, right?"

と思ってます。

本件に関して、ご見識のある方からのコメント歓迎致します。

I welcome comments from those who have insight on this matter.

-----

さて、その覚えなければならない用語の一つとして、最近、「EBPM」なるものを、取り扱っています。

Well, recently I use "EBPM" as one of terms which I have to understand.

EBPMとは、エビデンス・ベースト・ポリシー・メイキング、証拠に基づく政策立案というものです。

EBPM means "evidence-based policy making".

"EBPM"でググって頂けると分かることですが、『劇的につまらない話』が、わんさか登場してきます。

If you google "EBPM," you will find that a lot of "dramatically boring stories" will appear.

加えて、「これまでの政策って、EBPMで動いていなかったのか?」と、逆に驚いてしまうくらいです。

In addition, I was really suprised to know that "Has our goverment not worked by EBPM yet?"

-----

現時点で、EBPMに関する、もっとも分かりやすい解説の一つが、こちらのYouTubeのビデオクリップです。

At this time, one of the most comprehensive explanations of EBPM is this YouTube video clip.

このプレゼンの結論の

The conclusion of this presentation

「EBPMは今は忘れろ。まずは、現場のデジタル化だ」

"Forget EBPM for now. First, we need to digitize the field."

と、

and

「デジタル傭兵部隊ヘッジファンド」

"Digital Mercenary Force Hedge Fund."

の話が、私の胸を打ちました。

made me move.

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

/*

golangで時刻(time)情報を生成して、その情報をpostgresqlに格納して、さらに読み出す実験

テスト用DB環境の作り方

C:\Users\ebata>psql -U postgres -p 15432
Password for user postgres:
psql (13.4, server 12.5 (Debian 12.5-1.pgdg100+1))
Type "help" for help.

postgres=# create database agent_db;
CREATE DATABASE

postgres-# \c agent_db
psql (13.4, server 12.5 (Debian 12.5-1.pgdg100+1))
You are now connected to database "agent_db" as user "postgres".

agent_db-# create table LocMessage(
agent_db(# ID     int,
agent_db(# dt     timestamp,
agent_db(# Lat    double precision,
agent_db(# Lng    double precision,
agent_db(# TYPE   varchar(10),
agent_db(# POPUP  int
agent_db(# );

agent_db=# \dt
           List of relations
 Schema |    Name    | Type  |  Owner
--------+------------+-------+----------
 public | locmessage | table | postgres
(1 row)


agent_db=# select * from locmessage;
 id | dt | lat | lng | type | popup
----+----+-----+-----+------+-------
(0 rows)

と、まあ、こんな感じ

*/

package main

import (
	"database/sql"
	"fmt"
	"log"
	"time"

	_ "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()

	ins, err := db.Prepare("insert into locmessage(id,dt,lat,lng,type,popup) VALUES($1,$2,$3,$4,$5,$6)")
	if err != nil {
		log.Fatal("db.Exec Error: ", err)
	}

	a := 1
	b := time.Now()
	c := 139.02
	d := 38.02
	e := 1
	f := 1

	ins.Exec(a, b, c, d, e, f)

	///// 書き込みここまで
	// 書き込まれたデータはこんな感じになっている (2回プログラムを実施)
	/*
		agent_db=# select * from locmessage;
		 id |             dt             |  lat   |  lng  | type | popup
		----+----------------------------+--------+-------+------+-------
		  1 | 2022-09-15 23:54:36.877274 | 139.02 | 38.02 | 1    |     1
		  1 | 2022-09-15 23:55:16.574776 | 139.02 | 38.02 | 1    |     1
		(2 rows)
	*/
	// さて、このDBからどうやって、時間情報を取り出すか?

	rows, err := db.Query("select dt from locmessage")
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()

	var dt time.Time

	for rows.Next() {
		if err := rows.Scan(&dt); err != nil {
			fmt.Println(err)
		}

		fmt.Println(dt)

		// 出力結果が、こんな感じになって、ちょっと変 "+0000 +0000"は、いらん
		/*
			2022-09-15 23:54:36.877274 +0000 +0000
			2022-09-15 23:55:16.574776 +0000 +0000
			2022-09-16 00:06:18.870051 +0000 +0000
			2022-09-16 00:12:51.251972 +0000 +0000
			.....
			2022-09-16 13:57:46.704896 +0000 +0000
		*/

		// こんな感じにすれば、整数などでデータ取り出せる
		fmt.Println(dt.Date())   // e.g 2022 September 16
		fmt.Println(dt.Clock())  // 13 57 46
		fmt.Println(dt.Minute()) // 57
		fmt.Println(dt.Hour())   // 13
		fmt.Println(dt.Day())    // 16

	}

}

こんだけのことがやりたかっただけなのに、"golang" "postgresql", "timestamp", "time.Time"で検索しても、ドンピシャの情報が出てこないんですよ、不思議なことに。

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 max_3(a, b, c float64) float64 {
	return max_2(max_2(a, b), c)
}

func max_4(a, b, c, d float64) float64 {
	return max_2(max_3(a, b, c), d)
}

func min_1(a float64) float64 {
	return a
}

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

func min_3(a, b, c float64) float64 {
	return min_2(min_2(a, b), c))
}

func min_4(a, b, c, d float64) float64 {
	return min_2(min_3(a, b, c), d)
}

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 == "ZERO" {
		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("wrong expression\n")
		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 == "ZERO" {
		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
		}
	}
	return y
}

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

func new_action_MF3(_center, _width float64, _express string) *action_MF3 {
	a3 := new(action_MF3)
	a3.center = _center
	a3.width = _width
	a3.express = _express
	a3.x = 0.0
	a3.y = 0.0

	return a3
}

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

	if a3.express == "LESS" {
		a3.x = a3.center - a3.width
	} else if a3.express == "ZERO" {
		a3.x = a3.center
	} else if a3.express == "MORE" {
		a3.x = a3.center + a3.width
	} else {
		fmt.Println("wrong scale expression\n")
		os.Exit(0)
	}
	return a3.x
}

func (a3 *action_MF3) func_Max(b float64) {
	a3.y = max_2(b, a3.y)
}

func (a3 *action_MF3) func_X() float64 {
	return a3.x
}

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

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
	a5.x = 0.0
	a5.y = 0.0

	return a5
}

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

	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 == "ZERO" {
		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("wrong scale expression\n")
		os.Exit(0)
	}
	return a5.x
}

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 main() {
	// ダイエット経過期間
	Period_Short := new_condition_MF3(14, 14, "LESS")  // 0日
	Period_Middle := new_condition_MF3(14, 14, "ZERO") // 14日
	Period_Long := new_condition_MF3(14, 14, "MORE")   // 28日

	// いわゆる「停滞期」(14日間あたりの平均減重変化量)
	WeighChange_Small := new_condition_MF3(1.0, 1.0, "LESS") // 0kg
	//WeighChange_Middle := new_condition_MF3(1.0, 1.0, "ZERO") // 1kg
	WeighChange_High := new_condition_MF3(1.0, 1.0, "MORE") // 2kg

	// 苦痛度
	/*
		Suffer_Zerol := new_condition_MF3(400.0, 400.0, "LESS")  // 0
		Suffer_Middle := new_condition_MF3(400.0, 400.0, "ZERO") // 400
		Suffer_Hight := new_condition_MF3(400.0, 400.0, "MORE")  // 800
	*/
	// BMI
	//BMI_lowlow := new_condition_MF5(22.0, 3.0, "LESSLESS")   // 痩せすぎ(15.0)
	//BMI_low := new_condition_MF5(22.0, 3.0, "LESS")          // 痩せぎみ(19.0)
	//BMI_Normal := new_condition_MF5(22.0, 3.0, "ZERO")       // 普通(22.0)
	BMI_High := new_condition_MF5(22.0, 3.0, "MORE")         // 太りぎみ(25.0)
	BMI_HighHigh := new_condition_MF5(22.0, 3.0, "MOREMORE") // 太りすぎ(28.0)

	// 一日の摂取カロリー
	Eat_LittleLittle := new_action_MF5(2500, 1000, "LESSLESS") // 500 Kcal
	Eat_Little := new_action_MF5(2500, 1000, "LESS")           // 1500 Kcal
	Eat_Normal := new_action_MF5(2500, 1000, "ZERO")           // 2500 Kcal
	Eat_Lot := new_action_MF5(2500, 1000, "MORE")              // 3500 Kcal
	Eat_LotLot := new_action_MF5(2500, 1000, "MOREMORE")       // 4500 Kcal

	// 超シンプルシミュレータ投入
	// 体重変動シミュレーションプログラム
	//基礎代謝量と求め方	?ハリス・ベネディクト方程式(日本人版) 計算式
	//http://www.kintore.info/kisotaisya_mass/index.cgi
	//【計算式】
	// 男性 66.5+(体重kg×13.8)+(身長cm×5.0)-(年齢×6.8)
	// 女性 665.1+(体重kg×9.6)+(身長cm×1.9)-(年齢×7.0)
	// 江端智一 2014日2月4日現在のデータを使って計算
	weight := 78.0 // 開始時の体重 78.0kg
	//lengthw := 172.0     // 身長 172cm
	age := 49.0 + 94/365 // 開始時の年齢 49歳と94日 (2014年2月4日現在)

	// 最初の基礎代謝カロリー 男性  66.5+(体重kg×13.8)+(身長cm×5.0)-(年齢×6.8)
	consumption_calorie :=
		66.5 + weight*13.8 + 172.0*5.0 - age*6.8
	// このカロリーに運動消費カロリーを加えて、
	// トータルの一日の消費カロリーを算出する

	// (現在の体重 66.5kgにおいて)一日運動消費カロリー 708kcalと推定し、
	// このカロリーは、体重に比例するものと仮定する。
	consumption_calorie += weight / 66.5 * 708.0
	fmt.Println("consumption_calorie = ", consumption_calorie)

	var last_weight [14]float64 // 過去14日分の体重

	// 最初は全部同じ体重とする 14日経過までは同じ体重とする
	for i := 0; i < 14; i++ {
		last_weight[i] = weight
	}
	// ここからループ開始
	for day := 0; day < 1460; day++ { // 1460日は、ちょうど4年分の日数
		// 7kcal = 1g = 0.001kg とする

		// 体重データを一日分ずらす
		for i := 0; i < 14-1; i++ {
			last_weight[i+1] = last_weight[i]
		}
		last_weight[0] = weight

		// 線形補完の傾きだけを求める(14日分)
		// http://d.hatena.ne.jp/rainlib/20090112/1231735459
		k1 := 0.0
		k2 := 0.0
		k3 := 0.0
		k4 := 0.0
		for i := 0; i < 14; i++ {
			k1 += float64(i) * float64(i)
			k2 += float64(i) * last_weight[i]
			k3 += float64(i)
			k4 += last_weight[i] * last_weight[i]
		}
		dW := (14.0*k2 - k3*k4) / (14.0*k4 - k3*k3) // 14

		// BMIの計算式 体重(Kg)÷身長(m)÷身長(m) 江端の身長172cm
		bmi := weight / 1.72 / 1.72

		// [ルール1] ダイエット開始直後は、「無条件にがんばれる」
		r1 := min_1(Period_Short.func_X(float64(day)))
		Eat_Little.func_Max(r1)
		//printf("r1: %f\n",r1);

		//printf("Eat_Little.func_X() = %f\n",Eat_Little.func_X());
		//printf("Eat_Little.func_Y() = %f\n",Eat_Little.func_Y());

		// [ルール2] ダイエット一ヶ月を過ぎても、停滞し続けると「切れる」
		r2 := min_2(Period_Long.func_X(float64(day)), WeighChange_Small.func_X(dW))
		Eat_LotLot.func_Max(r2)
		//printf("r2: %f\n",r2);

		// [ルール3] ダイエット2週間を過ぎて、停滞し続けると「緩んでくる」
		r3 := min_2(Period_Middle.func_X(float64(day)), WeighChange_Small.func_X(dW))
		Eat_Normal.func_Max(r3)
		//printf("r3: %f\n",r3);

		// [ルール4] 停滞期がなく順調に体重が落ちている場合は「がんばれる」
		r4 := min_1(WeighChange_High.func_X(dW))
		Eat_Little.func_Max(r4)
		//        printf("r4: %f\n",r4);

		// [ルール5] ダイエット一ヶ月を過ぎて、再び太り出してくると、またダイエットを再開してしまう
		r5 := min_2(Period_Long.func_X(float64(day)), BMI_High.func_X(bmi))
		Eat_Little.func_Max(r5)
		//printf("r5: %f\n",r5);

		// [ルール6] ダイエット一ヶ月を過ぎて、太り過ぎると、滅茶苦茶なダイエットを始めてしまう
		r6 := min_2(Period_Long.func_X(float64(day)), BMI_HighHigh.func_X(bmi))
		Eat_LittleLittle.func_Max(r6)

		//printf("r6: %f\n",r6);
		/*
		   printf("Eat_LittleLittle.func_X() = %f\n",Eat_LittleLittle.func_X());
		   printf("Eat_LittleLittle.func_Y() = %f\n",Eat_LittleLittle.func_Y());
		   printf("Eat_Little.func_X() = %f\n",Eat_Little.func_X());
		   printf("Eat_Little.func_Y() = %f\n",Eat_Little.func_Y());
		   printf("Eat_Normal.func_X() = %f\n",Eat_Normal.func_X());
		   printf("Eat_Normal.func_Y() = %f\n",Eat_Normal.func_Y());
		   printf("Eat_Lot.func_X() = %f\n",Eat_Lot.func_X());
		   printf("Eat_Lot.func_Y() = %f\n",Eat_Lot.func_Y());
		   printf("Eat_LotLot.func_X() = %f\n",Eat_LotLot.func_X());
		   printf("Eat_LotLot.func_Y() = %f\n",Eat_LotLot.func_Y());
		*/

		source_calorie :=
			(Eat_LittleLittle.func_X()*Eat_LittleLittle.func_Y() +
				Eat_Little.func_X()*Eat_Little.func_Y() +
				Eat_Normal.func_X()*Eat_Normal.func_Y() +
				Eat_Lot.func_X()*Eat_Lot.func_Y() +
				Eat_LotLot.func_X()*Eat_LotLot.func_Y()) /
				(Eat_LittleLittle.func_Y() +
					Eat_Little.func_Y() +
					Eat_Normal.func_Y() +
					Eat_Lot.func_Y() +
					Eat_LotLot.func_Y())

		fmt.Println("source_calorie = ", source_calorie)

		diff_weight := (source_calorie - consumption_calorie) / 7.0 / 1000.0
		weight += diff_weight
		age += 1.0 / 365.0
		consumption_calorie = 66.5 + weight*13.8 + 172.0*5.0 - age*6.8
		consumption_calorie += weight / 66.5 * 708.0
		//       printf("day:%d\tweight = %f\tconsumption_calorie =%f\n", day,weight, consumption_calorie);
	}
}

 

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.