未分類

以前から、私は10月入学式の支持者です。

I have long been a supporter of the October entrance ceremony.

入試の時期の観点もありますが、教育の国際化の観点からも、良いことだと思います。

The reason is the time of the entrance examination; moreover, I think it is also good from the perspective of internationalizing education.

まあ、この「コロナ禍」を利用でもしない限り、こんなチャンスは二度とは訪れないでしょう。

Unless we use this "new coronavirus disaster, " we will never see this chance again.

-----

世界各国を見てみると、9月入学は圧倒的に多いですが、それが全てではないようです。

Looking at the countries around the world, the beginning of September seems to be overwhelmingly large, but that is not all.

1月(シンガポール)、2月(オーストラリア、ニュージランド)、3月(韓国)、6月(フィリピン)などもあるようです。

For example, January (Singapore), February (Australia, New Zealand), March (Korea), June (Philippines), etc.

一方、今度は会計年度を調べてみたら、こちらは、世界各国バラバラでした。

On the other hand, according to fiscal year, they were scattered across each country.

ご存知の通り、日本の場合は4月から3月です。

As you know, it is from April to March in Japan.

しかし、G-7のメンバ国でも、米国(10月から9月)、英国(4月から3月)、ドイツ(1月から12月)、フランス(1月から12月)、イタリア(1月から12月)、カナダ(4月から3月)というようにバラバラです。

However, even in G-7 member countries, the United States (October to September), United Kingdom (April to March), Germany (January to December), France (January to December), Italy (January to December), and Canada (April to March).

さらに米国に至っては連邦としては10月から9月ですが、州単位ではバラバラです。

Furthermore, although the United States has a federal fiscal year from October to September, each state has its own fiscal year.

―― それでも、国際キャッシュフローとしては、なんとかなるんだなぁ

"It will be manageable as an international cash flow."

とちょっと感心しています。

I'm a little impressed.

逆に言えば、このように会計年度がズレることで、金融危機が回避されている面もあるでしょう。

Conversely, such fiscal year shifts could avoid the financial crisis.

各国の独自通貨制度にも、良い面と悪い面ががあります。

Each country's unique currency system has its good and bad sides.

特に、国が独自のお金を印刷できる能力があるというのは、今回のような未曾有の経済危機では、圧倒的なメリットです(短期戦に持ち込まないとヤバいことになりますが)。

In particular, the ability of the country to print its own money is an overwhelming advantage in an unprecedented economic crisis like this (although it would be dangerous if it were not brought into a short-term war).

そういえば、単一通貨制度に結構ヤバいことがあることは、最近では、ユーロとギリシャが教えてくれましたね。

By the way, the Euro and Greece have recently shown that the single currency system is quite dangerous.

-----

会計年度は、各国で統一する必要はないのかもしれませんが ―― さて、「教育年度」はどうでしょうか?

Fiscal years may not need to be uniform across countries; however, how about the "educational year"?

国際協調の観点では9月が良いとは思いますが、個人的には、入試の時期が「雪害」と「インフルエンザ」と「台風」と「猛暑」がぶつかってこなければ ―― 正直、どーだっていいです。

I think September is good from the perspective of international cooperation. Personally, if entrance examinations are not disturbed by "snow damage," "flu," "typhoon," and "hot weather," I don't care at all.

我が国の現行の独自の教育年度(4月から3月)が、「教育システムとして有効である」ことをロジカルに主張できる人がいれば、私はお話を伺う準備があります。

If anyone can logically claim that Japan's current unique education year (April to March) is “effective as an education system,” I will hear them.

数値に基づくシミュレーション(机上シミュレーションで良い)があれば、喜んで馳せ参じます(本当)。

I'd be happy to come if there is a numerical simulation (even if it is a desktop simulation).

2020,江端さんの忘備録

以前の仕事の見直しが必要となっていますが、その作業を開始すると、その時の恐怖が再現されてきて、心臓がバクバクして、呼吸が苦しくなります。

I need to review my previous work. When you start the work, the fear at that time is reproduced, my heart beats, and breathing becomes difficult.

こういう症状が出るような場合、「初動」が大切なことは、自分でこれまで色々調べて知っていました。

I know that "initial response" is important, whenever I have such symptoms. Because I wrote about it in my columns.

すぐに、心療内科への電話予約を試みましたが、全ての医院で『初診は6月以降』と言われてしまいました。

Immediately, I tried to make a telephone reservation to several clinics of Department of Psychiatry and Internal Medicine, however at all the clinics I was told that my first visit was after June.

これも、連鎖的な医療崩壊の一端かもしれません。

This may also be part of the chain of medical collapse.

というか、

Rather, I am thinking that,

―― 国家レベルの「心の崩壊」が始まっている

The national level "disintegration of mental health" has begun

のかもしれないなぁ、と考えています。

2020,江端さんの忘備録

Amazon PRIMEで、"ReLIFE"というアニメを見ました。
I watched an animation titled "ReLIFE" on Amazon PRIME.

良いアニメでした。
It was a good anime.

繰り返しますが、大変良いアニメでした。
Again, I said it was a very good anime.

-----

ここで、楽しく、野暮な、理系脳のツッコミをしてみましょう。
Here, let's dig the animation base on my science brain in a fun.

■「ReLIFE研究所」のビジネスモデルはどうなっているんだろう?
- What is the business model of the “ReLIFE Institute”?

膨大な医薬開発コスト、監視対象の監視期間、記録媒体の改竄、実験終了後の関係者の記憶の抹消 ――
Huge drug development costs, Monitoring period of the monitoring target, Falsification of recording media, Erasing the memories of the people involved after the experiment,

某社の研究所の人件費を当てはめてみると、一人の被験者の実験コストは、最低でも、年間4000万円、最高でも年間2億円はかかっていると思います。
When we apply the labor costs of a certain laboratory, I think the experimental cost per subject is at least 40 million yen per year, and up to 200 million yen.

費用対効果はどうなっているのだろうか。
What is the cost-effectiveness?

実験の効果に対して、得られる効果が小さすぎる。
The effect obtained is too small relative to the experiment's effect.

■医薬による後遺症は大丈夫だろうか?
- Is the after-effect of the medicine OK?

エイジング、アンチエイジングの処理を一晩で行うとするとなると、体細胞は勿論、脳細胞にかかる負荷は膨大なものになると思います。
If aging and anti-aging processes are performed overnight, the load on brain cells and other body cells will be enormous.

まあ、被験者はリスクを承知の上で、行っているとしても、環境要因となっている人間(被験者の回りの学生達)も、記憶操作をするのは、人道上の問題になるでしょうし、それ以上に、著しい人権の侵害になるでしょう。
Well, even if the subject understands the risks, manipulating memory in humans exposed to environmental factors (students around the subject) can be a humanitarian problem and, moreover, a significant violation of human rights.

-----

という話を次女にしたら、
I talked about this story to my junior daughter. She disgruntled me

『その辺は、なんとか上手く回るようになっているんだよ!』
"That's working well. Mind your own business !"

と、吐き捨てるように言われました。

まあ、なんというか ―― 「次女が正しい」
Well, I think "she is right".

2020,江端さんの忘備録

(昨日の続きです)

(Continuation from yesterday)

つまるところ、「人が集まらなければ、クラスターは発生することができない」のです。

After all, "If you don't get together, you can't create a cluster."

そして、今のところ、我が国に関しては、この「クラスター潰し」が、ぎりぎり有効な範囲にあります。

And so far, in Japan, this "cluster crushing" is in a marginally effective range.

もっとも、我が国でも、この「クラスター潰し」も限界に近くなってきているようです。

However, in Japan, this "cluster crushing" seems to be reaching its limit.

これが「感染経路が分からない」というものです。

This is "we cannot know the route of infection."

ちなみに、欧米では、「クラスター潰し」のフェーズを離れ、手遅れになっているのはご存知の通りです。

By the way, as you know, in Europe and the United States, it is too late to leave the "cluster-crushing" phase.

今、これから発生する数万人規模の死体収容所を作っている ―― って、どこの世界線(ディストピア)の話? と聞きたくなります

Now, they are building tens of thousands of corpses in the future. I want to ask what the worldline (dystopia) is.

-----

「クラスター潰し」の観点から、学校、会社、集会、イベントを自粛するのは、(個人の経済的事情を無視するのであれば)最適戦略です。

From a "cluster crushing" perspective, refraining from schools, companies, gatherings, and events is an optimal strategy (if you ignore the economics of an individual).

しかし、学校、会社、集会、イベントを自粛しながら「夜の歓楽街に出掛ける」という人間は、はっきり言わせて貰えば、

However, persons who "are going to the red light district at night" while restraining schools, companies, gatherings, and events,

『あんたたち、脳があるのか?』

"Do you have a brain?"

と尋ねたくなるくらい、理解不能です。

I do not understand them at all.

-----

そこで、私、経済活動をそこそこのレベルで維持しつつ、クラスター発生を防止する一つの案を提案したいと思います。

Therefore, I would like to propose a proposal to prevent clusters while maintaining economic activity at a reasonable level.

「音声コミュニケーションの絶対的な禁止命令」

"Absolute ban on voice communication"

です。

■いかなる状況であっても、対人間で会話をしてはならない(例外なし)。

- You should not speak to anyone at any place.

■コミュニケーションは、一定の距離(数メートル)を維持しながら、全て、SNS等のリアルタイムのテキストメッセージのみでで実施する。

- All communication is carried out using only real-time text messages such as SNS while maintaining a certain distance (a few meters).

■スマホが使えない人は、メッセージボードで会話をする。

- Talk on the message board if you can't use a smartphone.

■どうしても音声による会話が必要であれば、全て電話で行う、または、電話会議を実施する。

- If a voice conversation is absolutely necessary, you can use a phone or telephone conference.

これは、現時点で多くの会社で実施されています。

Many companies are currently implementing this.

この条件が満たされるのであれば、私は、バー、キャバクラ、メイド喫茶は再開しても良いと考えています。

If this condition is fulfilled, I will resume bar, cabaret club, and maid cafe.

-----

ところで、

By the way,

江端家は、一度、家族4人で、秋葉原にあるメイド喫茶なるものに行ったことがあります。

The Ebata family once went to a maid cafe in Akihabara.

待ち列に並んでいる最中、家族全員が、不快と酸欠で顔色が悪くなっていました。

While in the queue, the whole family had turned pale due to discomfort and lack of oxygen.

私が「離脱」を提案したところ、1秒後に家族全員が同意して、5秒後に店の外に敗走しました。

When I proposed "withdrawal," the whole family agreed one second later and broke out of the store five seconds later.

その時、シュタインズゲートの中に登場していた「メイド喫茶」への幻想は、私の中で、完全に破壊されました。

At that time, the illusion of a "maid cafe" that appeared in Steins Gate was completely destroyed in me.

閑話休題

Restless talk

(続く)

(To be continued)

2020,江端さんの技術メモ

江端の環境でのローカルな場所 C:\Users\ebata\Desktop\bouncy2

C:\Users\ebata>cd C:\Users\ebata\Desktop\bouncy2
cd /c/Users/ebata/Desktop/bouncy2
python3 httpsrv.py
http://localhost:8080 で起動

 

  • 2020/03/14

     

  • 背景
    • ■これからは「C/C++ → Go」と「JavaScript → Webassembly」とシフトしながら色々やっていこうと思っている■正直、どっちも難しい。そういう時は、サンプルをパクって勉強するのが正解 ―― と思っている
  • 目的
  • 環境
    • ■Windows7 or 10
    • ■Go と python3 をインストールしてある
  • やってみたこと
    • ■サンプルプログラムをダウンロードして、コンパイルしてみた
      • ~ https://github.com/stdiopt/gowasm-experiments/tree/master/bouncy
      • コマンドプロンプトからこんな感じでコンパイルできた
        • $ set GOOS=js
        • $ set  GOARCH=wasm
        • $ go build -o main.wasm main.go
        • ちなみに、bashの環境があれば、build.shでコンパイルできる
      • 実際には、コンパイルしなくても、バイナリコード(main.wasm)も、ダウンロードの中に入っているので、コンパイルは不要だったが
    • ■ローカルサーバとしては、色々試してみた
      • python3 -m http.server 8080
      • Goでサーバも作ってみた
      • Perlでもやってみた
    • ■動画がどうしても出てこない
    • ■ここから丸2日間の格闘のスタート
      • もう、色々探しまくった
  • 確認していた問題点
    • ■Google Chromoから、→ 「その他のツール」 → 「ディベロッパーツール」 → 
      • Uncaught (in promise) TypeError: Failed to execute 'compile' on 'WebAssembly': Incorrect response MIME type. Expected 'application/wasm'.この「Expected 'application/wasm'.」がどうにも、不味いらしい ―― が、解決方法が、どうにも見つからない
    • ■kobore.netのサーバに上げても、改善が見られず
  • ローカルサーバを作ってみた
    • ■httpsrv.pyを作った
      #!/usr/bin/env python3
      import http.server
        import socketserver
        
        PORT =
      8080
        
        Handler = http.server.SimpleHTTPRequestHandler
        Handler.extensions_map.update({
        '.wasm': 'application/wasm',
        })
        
        socketserver.TCPServer.allow_reuse_address =
      True
      with socketserver.TCPServer(("", PORT), Handler) as httpd:
        httpd.allow_reuse_address =
      True
      print("serving at port", PORT)
        httpd.serve_forever()
      
  • ■httpsrv.pyを起動した
    • $ python3 httpsrv.py
  • http://localhost:8080 で起動
    • ■動いた
      ■動かなかったら、chromo → 「設定」 → 「閲覧履歴データの削除」でキャッシュをクリアてみること

以上

httpsrv.py

#!/usr/bin/env python3

import http.server
import socketserver

PORT = 8080

Handler = http.server.SimpleHTTPRequestHandler
Handler.extensions_map.update({
    '.wasm': 'application/wasm',
})

socketserver.TCPServer.allow_reuse_address = True
with socketserver.TCPServer(("", PORT), Handler) as httpd:
    httpd.allow_reuse_address = True
    print("serving at port", PORT)
    httpd.serve_forever()

main.go

//Wasming
// compile: GOOS=js GOARCH=wasm go build -o main.wasm ./main.go
package main

import (
	"fmt"
	"math"
	"math/rand"
	"strconv"
	"syscall/js"
)

var (
	width      float64
	height     float64
	mousePos   [2]float64
	ctx        js.Value    // "syscall/js"から引っ張られる
	lineDistSq float64 = 100 * 100
)

func main() {

	// Init Canvas stuff
	doc := js.Global().Get("document")
	canvasEl := doc.Call("getElementById", "mycanvas")
	width = doc.Get("body").Get("clientWidth").Float()
	height = doc.Get("body").Get("clientHeight").Float()
	canvasEl.Set("width", width)
	canvasEl.Set("height", height)
	ctx = canvasEl.Call("getContext", "2d")

	done := make(chan struct{}, 0)

	dt := DotThing{speed: 160, size: 6}

	mouseMoveEvt := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
		e := args[0]
		mousePos[0] = e.Get("clientX").Float()
		mousePos[1] = e.Get("clientY").Float()
		return nil
	})
	defer mouseMoveEvt.Release()

	// Event handler for count range
	countChangeEvt := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
		evt := args[0]
		intVal, err := strconv.Atoi(evt.Get("target").Get("value").String())
		if err != nil {
			println("Invalid value", err)
			return nil
		}
		dt.SetNDots(intVal)
		return nil
	})
	defer countChangeEvt.Release()

	// Event handler for speed range
	speedInputEvt := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
		evt := args[0]
		fval, err := strconv.ParseFloat(evt.Get("target").Get("value").String(), 64)
		if err != nil {
			println("invalid value", err)
			return nil
		}
		dt.speed = fval
		return nil
	})
	defer speedInputEvt.Release()

	// Event handler for size
	sizeChangeEvt := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
		evt := args[0]
		intVal, err := strconv.Atoi(evt.Get("target").Get("value").String())
		if err != nil {
			println("invalid value", err)
			return nil
		}
		dt.size = intVal
		return nil
	})
	defer sizeChangeEvt.Release()

	// Event handler for lines toggle
	lineChangeEvt := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
		evt := args[0]
		dt.lines = evt.Get("target").Get("checked").Bool()
		return nil
	})
	defer lineChangeEvt.Release()

	// Event handler for dashed toggle
	dashedChangeEvt := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
		evt := args[0]
		dt.dashed = evt.Get("target").Get("checked").Bool()
		return nil
	})
	defer dashedChangeEvt.Release()

	doc.Call("addEventListener", "mousemove", mouseMoveEvt)
	doc.Call("getElementById", "count").Call("addEventListener", "change", countChangeEvt)
	doc.Call("getElementById", "speed").Call("addEventListener", "input", speedInputEvt)
	doc.Call("getElementById", "size").Call("addEventListener", "input", sizeChangeEvt)
	doc.Call("getElementById", "dashed").Call("addEventListener", "change", dashedChangeEvt)
	doc.Call("getElementById", "lines").Call("addEventListener", "change", lineChangeEvt)

	dt.SetNDots(100)
	dt.lines = false
	var renderFrame js.Func
	var tmark float64
	var markCount = 0
	var tdiffSum float64

	renderFrame = js.FuncOf(func(this js.Value, args []js.Value) interface{} {
		now := args[0].Float()
		tdiff := now - tmark
		tdiffSum += now - tmark
		markCount++
		if markCount > 10 {
			doc.Call("getElementById", "fps").Set("innerHTML", fmt.Sprintf("FPS: %.01f", 1000/(tdiffSum/float64(markCount))))
			tdiffSum, markCount = 0, 0
		}
		tmark = now

		// Pull window size to handle resize
		curBodyW := doc.Get("body").Get("clientWidth").Float()
		curBodyH := doc.Get("body").Get("clientHeight").Float()
		if curBodyW != width || curBodyH != height {
			width, height = curBodyW, curBodyH
			canvasEl.Set("width", width)
			canvasEl.Set("height", height)
		}
		dt.Update(tdiff / 1000)

		js.Global().Call("requestAnimationFrame", renderFrame)
		return nil
	})
	defer renderFrame.Release()

	// Start running
	js.Global().Call("requestAnimationFrame", renderFrame)

	<-done

}

// DotThing manager
type DotThing struct {
	dots   []*Dot
	dashed bool
	lines  bool
	speed  float64
	size   int
}

// Update updates the dot positions and draws
func (dt *DotThing) Update(dtTime float64) {
	if dt.dots == nil {
		return
	}
	ctx.Call("clearRect", 0, 0, width, height)

	// Update
	for i, dot := range dt.dots {
		dir := [2]float64{}
		// Bounce
		if dot.pos[0] < 0 {
			dot.pos[0] = 0
			dot.dir[0] *= -1
		}
		if dot.pos[0] > width {
			dot.pos[0] = width
			dot.dir[0] *= -1
		}

		if dot.pos[1] < 0 {
			dot.pos[1] = 0
			dot.dir[1] *= -1
		}

		if dot.pos[1] > height {
			dot.pos[1] = height
			dot.dir[1] *= -1
		}
		dir = dot.dir

		ctx.Set("globalAlpha", 0.5)
		ctx.Call("beginPath")
		ctx.Set("fillStyle", fmt.Sprintf("#%06x", dot.color))
		ctx.Set("strokeStyle", fmt.Sprintf("#%06x", dot.color))
		// Dashed array ref: https://github.com/golang/go/blob/release-branch.go1.11/src/syscall/js/js.go#L98
		ctx.Call("setLineDash", []interface{}{})
		if dt.dashed {
			ctx.Call("setLineDash", []interface{}{5, 10})
		}
		ctx.Set("lineWidth", dt.size)
		ctx.Call("arc", dot.pos[0], dot.pos[1], dt.size, 0, 2*math.Pi)
		ctx.Call("fill")

		mdx := mousePos[0] - dot.pos[0]
		mdy := mousePos[1] - dot.pos[1]
		d := math.Sqrt(mdx*mdx + mdy*mdy)
		if d < 200 {
			ctx.Set("globalAlpha", 1-d/200)
			ctx.Call("beginPath")
			ctx.Call("moveTo", dot.pos[0], dot.pos[1])
			ctx.Call("lineTo", mousePos[0], mousePos[1])
			ctx.Call("stroke")
			if d > 100 { // move towards mouse
				dir[0] = (mdx / d) * 2
				dir[1] = (mdy / d) * 2
			} else { // do not move
				dir[0] = 0
				dir[1] = 0
			}
		}

		if dt.lines {
			for _, dot2 := range dt.dots[i+1:] {
				mx := dot2.pos[0] - dot.pos[0]
				my := dot2.pos[1] - dot.pos[1]
				d := mx*mx + my*my
				if d < lineDistSq {
					ctx.Set("globalAlpha", 1-d/lineDistSq)
					ctx.Call("beginPath")
					ctx.Call("moveTo", dot.pos[0], dot.pos[1])
					ctx.Call("lineTo", dot2.pos[0], dot2.pos[1])
					ctx.Call("stroke")
				}
			}
		}

		dot.pos[0] += dir[0] * dt.speed * dtTime
		dot.pos[1] += dir[1] * dt.speed * dtTime
	}
}

// SetNDots reinitializes dots with n size
func (dt *DotThing) SetNDots(n int) {
	dt.dots = make([]*Dot, n)
	for i := 0; i < n; i++ {
		dt.dots[i] = &Dot{
			pos: [2]float64{
				rand.Float64() * width,
				rand.Float64() * height,
			},
			dir: [2]float64{
				rand.NormFloat64(),
				rand.NormFloat64(),
			},
			color: uint32(rand.Intn(0xFFFFFF)),
			size:  10,
		}
	}
}

// Dot represents a dot ...
type Dot struct {
	pos   [2]float64
	dir   [2]float64
	color uint32
	size  float64
}

build.sh

#!/bin/sh

GOOS=js GOARCH=wasm go build -o main.wasm ./main.go

wasm_exec.js

// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

(() => {
	// Map multiple JavaScript environments to a single common API,
	// preferring web standards over Node.js API.
	//
	// Environments considered:
	// - Browsers
	// - Node.js
	// - Electron
	// - Parcel

	if (typeof global !== "undefined") {
		// global already exists
	} else if (typeof window !== "undefined") {
		window.global = window;
	} else if (typeof self !== "undefined") {
		self.global = self;
	} else {
		throw new Error("cannot export Go (neither global, window nor self is defined)");
	}

	if (!global.require && typeof require !== "undefined") {
		global.require = require;
	}

	if (!global.fs && global.require) {
		global.fs = require("fs");
	}

	const enosys = () => {
		const err = new Error("not implemented");
		err.code = "ENOSYS";
		return err;
	};

	if (!global.fs) {
		let outputBuf = "";
		global.fs = {
			constants: { O_WRONLY: -1, O_RDWR: -1, O_CREAT: -1, O_TRUNC: -1, O_APPEND: -1, O_EXCL: -1 }, // unused
			writeSync(fd, buf) {
				outputBuf += decoder.decode(buf);
				const nl = outputBuf.lastIndexOf("\n");
				if (nl != -1) {
					console.log(outputBuf.substr(0, nl));
					outputBuf = outputBuf.substr(nl + 1);
				}
				return buf.length;
			},
			write(fd, buf, offset, length, position, callback) {
				if (offset !== 0 || length !== buf.length || position !== null) {
					callback(enosys());
					return;
				}
				const n = this.writeSync(fd, buf);
				callback(null, n);
			},
			chmod(path, mode, callback) { callback(enosys()); },
			chown(path, uid, gid, callback) { callback(enosys()); },
			close(fd, callback) { callback(enosys()); },
			fchmod(fd, mode, callback) { callback(enosys()); },
			fchown(fd, uid, gid, callback) { callback(enosys()); },
			fstat(fd, callback) { callback(enosys()); },
			fsync(fd, callback) { callback(null); },
			ftruncate(fd, length, callback) { callback(enosys()); },
			lchown(path, uid, gid, callback) { callback(enosys()); },
			link(path, link, callback) { callback(enosys()); },
			lstat(path, callback) { callback(enosys()); },
			mkdir(path, perm, callback) { callback(enosys()); },
			open(path, flags, mode, callback) { callback(enosys()); },
			read(fd, buffer, offset, length, position, callback) { callback(enosys()); },
			readdir(path, callback) { callback(enosys()); },
			readlink(path, callback) { callback(enosys()); },
			rename(from, to, callback) { callback(enosys()); },
			rmdir(path, callback) { callback(enosys()); },
			stat(path, callback) { callback(enosys()); },
			symlink(path, link, callback) { callback(enosys()); },
			truncate(path, length, callback) { callback(enosys()); },
			unlink(path, callback) { callback(enosys()); },
			utimes(path, atime, mtime, callback) { callback(enosys()); },
		};
	}

	if (!global.process) {
		global.process = {
			getuid() { return -1; },
			getgid() { return -1; },
			geteuid() { return -1; },
			getegid() { return -1; },
			getgroups() { throw enosys(); },
			pid: -1,
			ppid: -1,
			umask() { throw enosys(); },
			cwd() { throw enosys(); },
			chdir() { throw enosys(); },
		}
	}

	if (!global.crypto) {
		const nodeCrypto = require("crypto");
		global.crypto = {
			getRandomValues(b) {
				nodeCrypto.randomFillSync(b);
			},
		};
	}

	if (!global.performance) {
		global.performance = {
			now() {
				const [sec, nsec] = process.hrtime();
				return sec * 1000 + nsec / 1000000;
			},
		};
	}

	if (!global.TextEncoder) {
		global.TextEncoder = require("util").TextEncoder;
	}

	if (!global.TextDecoder) {
		global.TextDecoder = require("util").TextDecoder;
	}

	// End of polyfills for common API.

	const encoder = new TextEncoder("utf-8");
	const decoder = new TextDecoder("utf-8");

	global.Go = class {
		constructor() {
			this.argv = ["js"];
			this.env = {};
			this.exit = (code) => {
				if (code !== 0) {
					console.warn("exit code:", code);
				}
			};
			this._exitPromise = new Promise((resolve) => {
				this._resolveExitPromise = resolve;
			});
			this._pendingEvent = null;
			this._scheduledTimeouts = new Map();
			this._nextCallbackTimeoutID = 1;

			const setInt64 = (addr, v) => {
				this.mem.setUint32(addr + 0, v, true);
				this.mem.setUint32(addr + 4, Math.floor(v / 4294967296), true);
			}

			const getInt64 = (addr) => {
				const low = this.mem.getUint32(addr + 0, true);
				const high = this.mem.getInt32(addr + 4, true);
				return low + high * 4294967296;
			}

			const loadValue = (addr) => {
				const f = this.mem.getFloat64(addr, true);
				if (f === 0) {
					return undefined;
				}
				if (!isNaN(f)) {
					return f;
				}

				const id = this.mem.getUint32(addr, true);
				return this._values[id];
			}

			const storeValue = (addr, v) => {
				const nanHead = 0x7FF80000;

				if (typeof v === "number") {
					if (isNaN(v)) {
						this.mem.setUint32(addr + 4, nanHead, true);
						this.mem.setUint32(addr, 0, true);
						return;
					}
					if (v === 0) {
						this.mem.setUint32(addr + 4, nanHead, true);
						this.mem.setUint32(addr, 1, true);
						return;
					}
					this.mem.setFloat64(addr, v, true);
					return;
				}

				switch (v) {
					case undefined:
						this.mem.setFloat64(addr, 0, true);
						return;
					case null:
						this.mem.setUint32(addr + 4, nanHead, true);
						this.mem.setUint32(addr, 2, true);
						return;
					case true:
						this.mem.setUint32(addr + 4, nanHead, true);
						this.mem.setUint32(addr, 3, true);
						return;
					case false:
						this.mem.setUint32(addr + 4, nanHead, true);
						this.mem.setUint32(addr, 4, true);
						return;
				}

				let id = this._ids.get(v);
				if (id === undefined) {
					id = this._idPool.pop();
					if (id === undefined) {
						id = this._values.length;
					}
					this._values[id] = v;
					this._goRefCounts[id] = 0;
					this._ids.set(v, id);
				}
				this._goRefCounts[id]++;
				let typeFlag = 1;
				switch (typeof v) {
					case "string":
						typeFlag = 2;
						break;
					case "symbol":
						typeFlag = 3;
						break;
					case "function":
						typeFlag = 4;
						break;
				}
				this.mem.setUint32(addr + 4, nanHead | typeFlag, true);
				this.mem.setUint32(addr, id, true);
			}

			const loadSlice = (addr) => {
				const array = getInt64(addr + 0);
				const len = getInt64(addr + 8);
				return new Uint8Array(this._inst.exports.mem.buffer, array, len);
			}

			const loadSliceOfValues = (addr) => {
				const array = getInt64(addr + 0);
				const len = getInt64(addr + 8);
				const a = new Array(len);
				for (let i = 0; i < len; i++) {
					a[i] = loadValue(array + i * 8);
				}
				return a;
			}

			const loadString = (addr) => {
				const saddr = getInt64(addr + 0);
				const len = getInt64(addr + 8);
				return decoder.decode(new DataView(this._inst.exports.mem.buffer, saddr, len));
			}

			const timeOrigin = Date.now() - performance.now();
			this.importObject = {
				go: {
					// Go's SP does not change as long as no Go code is running. Some operations (e.g. calls, getters and setters)
					// may synchronously trigger a Go event handler. This makes Go code get executed in the middle of the imported
					// function. A goroutine can switch to a new stack if the current stack is too small (see morestack function).
					// This changes the SP, thus we have to update the SP used by the imported function.

					// func wasmExit(code int32)
					"runtime.wasmExit": (sp) => {
						const code = this.mem.getInt32(sp + 8, true);
						this.exited = true;
						delete this._inst;
						delete this._values;
						delete this._goRefCounts;
						delete this._ids;
						delete this._idPool;
						this.exit(code);
					},

					// func wasmWrite(fd uintptr, p unsafe.Pointer, n int32)
					"runtime.wasmWrite": (sp) => {
						const fd = getInt64(sp + 8);
						const p = getInt64(sp + 16);
						const n = this.mem.getInt32(sp + 24, true);
						fs.writeSync(fd, new Uint8Array(this._inst.exports.mem.buffer, p, n));
					},

					// func resetMemoryDataView()
					"runtime.resetMemoryDataView": (sp) => {
						this.mem = new DataView(this._inst.exports.mem.buffer);
					},

					// func nanotime1() int64
					"runtime.nanotime1": (sp) => {
						setInt64(sp + 8, (timeOrigin + performance.now()) * 1000000);
					},

					// func walltime1() (sec int64, nsec int32)
					"runtime.walltime1": (sp) => {
						const msec = (new Date).getTime();
						setInt64(sp + 8, msec / 1000);
						this.mem.setInt32(sp + 16, (msec % 1000) * 1000000, true);
					},

					// func scheduleTimeoutEvent(delay int64) int32
					"runtime.scheduleTimeoutEvent": (sp) => {
						const id = this._nextCallbackTimeoutID;
						this._nextCallbackTimeoutID++;
						this._scheduledTimeouts.set(id, setTimeout(
							() => {
								this._resume();
								while (this._scheduledTimeouts.has(id)) {
									// for some reason Go failed to register the timeout event, log and try again
									// (temporary workaround for https://github.com/golang/go/issues/28975)
									console.warn("scheduleTimeoutEvent: missed timeout event");
									this._resume();
								}
							},
							getInt64(sp + 8) + 1, // setTimeout has been seen to fire up to 1 millisecond early
						));
						this.mem.setInt32(sp + 16, id, true);
					},

					// func clearTimeoutEvent(id int32)
					"runtime.clearTimeoutEvent": (sp) => {
						const id = this.mem.getInt32(sp + 8, true);
						clearTimeout(this._scheduledTimeouts.get(id));
						this._scheduledTimeouts.delete(id);
					},

					// func getRandomData(r []byte)
					"runtime.getRandomData": (sp) => {
						crypto.getRandomValues(loadSlice(sp + 8));
					},

					// func finalizeRef(v ref)
					"syscall/js.finalizeRef": (sp) => {
						const id = this.mem.getUint32(sp + 8, true);
						this._goRefCounts[id]--;
						if (this._goRefCounts[id] === 0) {
							const v = this._values[id];
							this._values[id] = null;
							this._ids.delete(v);
							this._idPool.push(id);
						}
					},

					// func stringVal(value string) ref
					"syscall/js.stringVal": (sp) => {
						storeValue(sp + 24, loadString(sp + 8));
					},

					// func valueGet(v ref, p string) ref
					"syscall/js.valueGet": (sp) => {
						const result = Reflect.get(loadValue(sp + 8), loadString(sp + 16));
						sp = this._inst.exports.getsp(); // see comment above
						storeValue(sp + 32, result);
					},

					// func valueSet(v ref, p string, x ref)
					"syscall/js.valueSet": (sp) => {
						Reflect.set(loadValue(sp + 8), loadString(sp + 16), loadValue(sp + 32));
					},

					// func valueDelete(v ref, p string)
					"syscall/js.valueDelete": (sp) => {
						Reflect.deleteProperty(loadValue(sp + 8), loadString(sp + 16));
					},

					// func valueIndex(v ref, i int) ref
					"syscall/js.valueIndex": (sp) => {
						storeValue(sp + 24, Reflect.get(loadValue(sp + 8), getInt64(sp + 16)));
					},

					// valueSetIndex(v ref, i int, x ref)
					"syscall/js.valueSetIndex": (sp) => {
						Reflect.set(loadValue(sp + 8), getInt64(sp + 16), loadValue(sp + 24));
					},

					// func valueCall(v ref, m string, args []ref) (ref, bool)
					"syscall/js.valueCall": (sp) => {
						try {
							const v = loadValue(sp + 8);
							const m = Reflect.get(v, loadString(sp + 16));
							const args = loadSliceOfValues(sp + 32);
							const result = Reflect.apply(m, v, args);
							sp = this._inst.exports.getsp(); // see comment above
							storeValue(sp + 56, result);
							this.mem.setUint8(sp + 64, 1);
						} catch (err) {
							storeValue(sp + 56, err);
							this.mem.setUint8(sp + 64, 0);
						}
					},

					// func valueInvoke(v ref, args []ref) (ref, bool)
					"syscall/js.valueInvoke": (sp) => {
						try {
							const v = loadValue(sp + 8);
							const args = loadSliceOfValues(sp + 16);
							const result = Reflect.apply(v, undefined, args);
							sp = this._inst.exports.getsp(); // see comment above
							storeValue(sp + 40, result);
							this.mem.setUint8(sp + 48, 1);
						} catch (err) {
							storeValue(sp + 40, err);
							this.mem.setUint8(sp + 48, 0);
						}
					},

					// func valueNew(v ref, args []ref) (ref, bool)
					"syscall/js.valueNew": (sp) => {
						try {
							const v = loadValue(sp + 8);
							const args = loadSliceOfValues(sp + 16);
							const result = Reflect.construct(v, args);
							sp = this._inst.exports.getsp(); // see comment above
							storeValue(sp + 40, result);
							this.mem.setUint8(sp + 48, 1);
						} catch (err) {
							storeValue(sp + 40, err);
							this.mem.setUint8(sp + 48, 0);
						}
					},

					// func valueLength(v ref) int
					"syscall/js.valueLength": (sp) => {
						setInt64(sp + 16, parseInt(loadValue(sp + 8).length));
					},

					// valuePrepareString(v ref) (ref, int)
					"syscall/js.valuePrepareString": (sp) => {
						const str = encoder.encode(String(loadValue(sp + 8)));
						storeValue(sp + 16, str);
						setInt64(sp + 24, str.length);
					},

					// valueLoadString(v ref, b []byte)
					"syscall/js.valueLoadString": (sp) => {
						const str = loadValue(sp + 8);
						loadSlice(sp + 16).set(str);
					},

					// func valueInstanceOf(v ref, t ref) bool
					"syscall/js.valueInstanceOf": (sp) => {
						this.mem.setUint8(sp + 24, loadValue(sp + 8) instanceof loadValue(sp + 16));
					},

					// func copyBytesToGo(dst []byte, src ref) (int, bool)
					"syscall/js.copyBytesToGo": (sp) => {
						const dst = loadSlice(sp + 8);
						const src = loadValue(sp + 32);
						if (!(src instanceof Uint8Array)) {
							this.mem.setUint8(sp + 48, 0);
							return;
						}
						const toCopy = src.subarray(0, dst.length);
						dst.set(toCopy);
						setInt64(sp + 40, toCopy.length);
						this.mem.setUint8(sp + 48, 1);
					},

					// func copyBytesToJS(dst ref, src []byte) (int, bool)
					"syscall/js.copyBytesToJS": (sp) => {
						const dst = loadValue(sp + 8);
						const src = loadSlice(sp + 16);
						if (!(dst instanceof Uint8Array)) {
							this.mem.setUint8(sp + 48, 0);
							return;
						}
						const toCopy = src.subarray(0, dst.length);
						dst.set(toCopy);
						setInt64(sp + 40, toCopy.length);
						this.mem.setUint8(sp + 48, 1);
					},

					"debug": (value) => {
						console.log(value);
					},
				}
			};
		}

		async run(instance) {
			this._inst = instance;
			this.mem = new DataView(this._inst.exports.mem.buffer);
			this._values = [ // JS values that Go currently has references to, indexed by reference id
				NaN,
				0,
				null,
				true,
				false,
				global,
				this,
			];
			this._goRefCounts = []; // number of references that Go has to a JS value, indexed by reference id
			this._ids = new Map();  // mapping from JS values to reference ids
			this._idPool = [];      // unused ids that have been garbage collected
			this.exited = false;    // whether the Go program has exited

			// Pass command line arguments and environment variables to WebAssembly by writing them to the linear memory.
			let offset = 4096;

			const strPtr = (str) => {
				const ptr = offset;
				const bytes = encoder.encode(str + "\0");
				new Uint8Array(this.mem.buffer, offset, bytes.length).set(bytes);
				offset += bytes.length;
				if (offset % 8 !== 0) {
					offset += 8 - (offset % 8);
				}
				return ptr;
			};

			const argc = this.argv.length;

			const argvPtrs = [];
			this.argv.forEach((arg) => {
				argvPtrs.push(strPtr(arg));
			});
			argvPtrs.push(0);

			const keys = Object.keys(this.env).sort();
			keys.forEach((key) => {
				argvPtrs.push(strPtr(`${key}=${this.env[key]}`));
			});
			argvPtrs.push(0);

			const argv = offset;
			argvPtrs.forEach((ptr) => {
				this.mem.setUint32(offset, ptr, true);
				this.mem.setUint32(offset + 4, 0, true);
				offset += 8;
			});

			this._inst.exports.run(argc, argv);
			if (this.exited) {
				this._resolveExitPromise();
			}
			await this._exitPromise;
		}

		_resume() {
			if (this.exited) {
				throw new Error("Go program has already exited");
			}
			this._inst.exports.resume();
			if (this.exited) {
				this._resolveExitPromise();
			}
		}

		_makeFuncWrapper(id) {
			const go = this;
			return function () {
				const event = { id: id, this: this, args: arguments };
				go._pendingEvent = event;
				go._resume();
				return event.result;
			};
		}
	}

	if (
		global.require &&
		global.require.main === module &&
		global.process &&
		global.process.versions &&
		!global.process.versions.electron
	) {
		if (process.argv.length < 3) {
			console.error("usage: go_js_wasm_exec [wasm binary] [arguments]");
			process.exit(1);
		}

		const go = new Go();
		go.argv = process.argv.slice(2);
		go.env = Object.assign({ TMPDIR: require("os").tmpdir() }, process.env);
		go.exit = process.exit;
		WebAssembly.instantiate(fs.readFileSync(process.argv[2]), go.importObject).then((result) => {
			process.on("exit", (code) => { // Node.js exits if no event handler is pending
				if (code === 0 && !go.exited) {
					// deadlock, make Go print error and stack traces
					go._pendingEvent = { id: 0 };
					go._resume();
				}
			});
			return go.run(result.instance);
		}).catch((err) => {
			console.error(err);
			process.exit(1);
		});
	}
})();

2020,江端さんの忘備録

映画"Fukushima 50"を見に行くべきか、行かないべきか、で悩んでいます。

I'm wondering whether to go to the movie "Fukushima 50" or not

というのは、こんな理由があるからです。

This is because of these reasons.

-----

"NHK Special October Nightmare-Record of the Cuban Crisis and Horror of 1962 (NHK Special) (1992)" (pictures out)

この番組は、私に衝撃を与えました。

This program shocked me.

It is no exaggeration to say that this program created me today as a "simulation maker"

DVDも購入し、少なくとも30回以上は、視聴しました。

I also bought DVDs and watched them at least 30 times.

その後も「キューバ危機」については勉強を続け、今では、この事件の発生から終結まで、いつ、どこでも、誰にでも、プレゼンできる程度には知識を持っていると自負しております。

After that, I continued to study about the "Cuba Crisis" and now I am confident that I have enough knowledge to present to anyone, anywhere, anytime, from the start of this accident to the end.

問題はその後です。

However another problem occurred.

私は、ケビンコスナー主演の映画「13デイズ」(2000)を見にいって、激怒しながら、映画館から出てきたのを覚えています。

I remember coming out of the cinema, furiously, after watching the movie "13 Days" (2000) starring Kevin Costner.

深みがない、中身がない、薄っぺら、 軽薄で軽率、熟考していない、短慮で短絡 ―― ありとあらゆる罵詈雑言を唱えながら、帰宅したのを、よく覚えています。

"No depth, flimsy, frivolous rash, not contemplating, and short thought", I remember going home while saying all kinds of abusive language.

ええ、分かっています ―― 今回も、「間違っている」のは「私」です。

Yeah, I know well. Again, "I" am "wrong".

映画は、大衆向けのエンターテーメントです。

Movies are mass entertainment.

多くの人が分かりやすく、受けいれやすく、楽しいものでなければなりません。

For many, movies should be easy to understand, accept, and enjoy.

私のように、「キューバ危機」について、いつでも100ページくらいのコラムが書けそうな、「特殊」な人間をターゲットとして映画を作成したら ――

If they create a movie targeting a "special" person who can write a column of about 100 pages at any time about the "Cuba Crisis" like me,

その映画は、興行としては大失敗となっていたでしょう。

The movie would have been a huge failure for box office.

-----

さて、私、福島の原発事故については、かなり調べました。

By the way, I investigated the Fukushima nuclear accident.

おそらく直接の事故関係者ではなくて、福島原発事故調査委員会の報告書(600ページ以上)の全てに目を通した、数少ない人間の一人である、と自負しております。

I am proud to be one of the few people who have probably read the entire report (over 600 pages) of the Fukushima Nuclear Accident Investigation Commission, in spite of not directly involved in the accident.

古橋洋一さんの「カウントダウン・メルトダウン」を3回は読みなおしました。

I reread "Countdown Meltdown" by Yoichi Furuhashi three times.

(ちなみに、高村薫さんの「神の火」は、確実に100回以上は手に取り続けてきた、と断言できます)

(By the way, about Kaoru Takamura's "God's Fire", I have definitely read the book more than 100 times.)

福島原発に関するNHKスペシャルは、全て視聴しましたし、

I watched all NHK specials related to Fukushima nuclear power plant,

I am also the author of the accident commentary column from an engineer's perspective.

-----

映画「Fukushima 50」を見た結果が、「13デイズ」と同じようなこになったら、どうしよう ――

"What if the result of watching the movie "Fukushima 50" is similar to "13 Days""

そう思うと、映画館に行くことを躊躇してしまうのです。

I will hesitate to go to the movie theater.

せっかく映画を見にいくなら、楽しみたい。

If I go to a movie, I want to have fun.

映画を見にいって、腹を立てて帰宅することだけは避けたい。

I don't just want to go to the movies and get angry and go home.

-----

そこで、お願いがあります。

So I would like to ask you.

映画「Fukushima 50」が、江端にとってプロパーかどうかを、個人的に、主観的に、独善的に、教えて下さいませんでしょうか。

Could you tell me personally, subjectively and self-righteously whether the movie "Fukushima 50" is proper for Ebata?

私がこれまで記載してきた、膨大な雑文からご判断頂ければ幸いと存じます。

I hope you can judge it from the huge number of miscellaneous sentences that I have described so far.

何卒、よろしくお願い申し上げます。

I appreciate your kind cooperation.

2020,江端さんの忘備録

大学での実証実験のお手伝いを、学生さんにお願いしております。

Now, I ask some college students to help with campus field experiments.

理系の皆さんは、本当に礼儀正しくて、ロジカルで、知的で、お話していて気持ちがいいです。

The students in the science and engineering majors are polite, logical, and intelligent, so I feel good talking with them.

# ちなみに、私は理系です。

Incidentally, I am in the science and engineering majors.

-----

今回、お手伝いして頂いている学生さんの、実に6割以上が運転免許を所持していませんでした。

This time, more than 60% of the students who helped did not have a driver's license.

『運転免許取らなければ、と思っているうちに、M1(修士課程1年生)になってしまいまして・・・』

While thinking I needed a driver's license, I became "M1" (first-year master's student) ...

という話は、まるで、

I feel that this story is like that

『就職までに、TOEIC受験しなければ・・・』

"I must take the TOEIC test before getting a job..."

というノリと同じ、と感じました。

これは、私の推測の粋を出ませんが、

This is just my guess; however, they are thinking

―― 運転免許の取得が、TOEIC受験と同程度に『うっとうしい』

"Obtaining a driver's license is as annoying as taking the TOEIC test."

ということのように思えました。

-----

私、30年以上前、親に強制的に自動車運転免許を取らされました。

I was forced to get a driving license by my parents more than 30 years ago.

当時の私は、「原付の免許があれば足りる」くらいの気持ちでいましたし、今でも正直そう思っています。

At that time, I felt I only needed a motorbike license, and I still think so.

ただ、これは、大きな都市の交通網の充実しているから、そう感じるだけなのかもしれません。

However, this may only be felt because of the extensive urban transportation network.

唯一の例外は ―― 米国に赴任させられた時だけは、『車がなければ、この国では、3日で死ぬ』と思ったくらいです。

The only exception for me, when I was sent to the United States, I thought, "If I don't have a car, I will die in three days in this country."

(続く)

(To be continued)

2020,江端さんの忘備録

大学キャンパスの屋外実験に使う自動車に張る、複数の大型ステッカー(長さ1メートル)が自宅に到着しました。

Large stickers (1 meter long) on a car used for outdoor experiments have arrived at home.

ハンドキャリーで運ぶことになるので、ステッカーの重さや大きさを確認していました。

I checked the weight and size of the stickers because I would have to carry them by hand.

それを見ていた長女から、

The eldest daughter, watching my preparations, said to me

『パパ、文化祭でもやるの?』

"Dad, do you join in a school festival?"

と言われました。

-----

これが文化祭だとしたら、

If this is a school festival, I am determined that

―― もう人生で二度と関わりたくない、

I don't want to be involved in my life again

そして、

and

―― もう二度と絶対にかかわるものか、

I will never be involved again in my life

と決意している文化祭、と言えます。

さもなければ、いずれ『自分に殺される』ことになる。

2020,江端さんの忘備録

自分が望んだプロジェクトでもないのに、

It's not the project I wanted,

プロジェクトリーダにさせられて、

Someone let me a project leader

各所の遅延に悩まされて、

Suffering from delays everywhere,

各部署のミスのフォローに回り、

Following up on the mistakes of each department,

計上されていない予算を捻りだし、

Making a budget that is not accounted for,

心労で憔悴する。

Getting tired of working hard.

-----

仮に、このプロジェクトが転けても、

Even if this project falls,

別段、大きな損害が出る訳でもなく、

No big damage occurs.

自分が責めを負うということはないと分かっていても、

Even if I know I won't be blamed,

それでも、なんとか形しなければ、と、自分を追いつめる。

Still, I will be overtaken to make something.

これを「心配性」というのであれば、「心配性」はもっとも怖くて、痛くて、辛い病気だ。

If you call this "anxiety", "anxiety" is the scariest, most painful and tragic disease.

-----

私は、『逃げろ』と他人に言い続けてきた。

I've been telling others to run away.

しかし、「そこから逃げる」ことだけでは心の平安が得られない、というやっかいな人間もいる。

However, some people cannot get peace of mind by running away.

私だ。

It is me.

問題を解決することでしか、問題を解決できない人間には、心の平安はやってこない ―― つくづく、自分の性格に、腹が立つ。

A person who can solve a problem only by solving the problem will not have peace of mind. I really get angry with my personality.

------

毎日、問題が発生して、心を痛め、

Every day, problems occur, my heart hurts,

毎日、問題の収集を図って、心を安らげる。

Every day, problems are resolved, my heart relief,

これは、南極と赤道を毎日移動しているような環境の変化と同じで、確実に体と心を蝕んで行く。

This is similar to a change in the environment, as we travel daily between Antarctica and the equator. My body and mind are surely going to be destroyed.

この状況が

About this situation

1週間も続けば「発狂」し、

If I continue for a week, I go crazy,

1月続けば「うつ病」となり、

If I continue for a month, I will have depression

3月続けば「電車のレールの上に飛び込む」

If I continue for three months, I will dive on the rails of the train

という、確かな確信が私にはある。

I have certain convictions.

------

「問題を解決すること」でしか「問題を解決できない不器用な人間」は ――

"A person who can solve a problem only by solving the problem" should

■常に自分の能力を低く見積り、

always underestimate my abilities,

■卑屈なまでに謙虚を旨とし(フリをし)

be modest to the humble (pretending)

■他人を押し上げ(押しつけ)、

push up others,

■決して責任のある立場に立たない

never in a responsible position

ということが肝要である。

さもなければ、いずれ『自分に殺される』ことになる。

Otherwise, you will eventually be "killed by yourself."

2020,江端さんの忘備録

―― 大人になってからでも、人生は挽回できる

(昨日の続きです)

(Continuation from yesterday)

少なくとも「成人式でバカをやるバカ」は、世間(メディア)に、そのバカを晒しています。

At least, "persons who behave stupid at the coming-of-age ceremony" are exposing thir stupid to the public (media).

そして、メディア、特に、ネット世界で一度、そのバカが晒されれば、もう取り消すことができません。

And once the stupid is exposed n the media, especially in the internet, it can't be undone anymore.

そして、好んで「成人式でバカをやるバカ」と一緒に仕事や恋愛や結婚をしたい人間がいるとも思えません。

And I don't think there's a person who wants to work, romance or marry with the stupid who plays stupid at the ceremony".

なぜなら、「成人式でバカをやらない」人間の方が、圧倒的に多いからです。

This is because there are overwhelmingly many people who do not play stupid at the ceremonies.

で、多分、「成人式でバカをやるバカ」も、その程度のことは分かってやっているのだと思います。

So, I think "the person who do stupid at the coming-of-age ceremony" also know well.

もし彼らが、『世間の善意や優しさ』なんぞを、まだ信じているのであれば、「矯正不能のバカ」として放置して良いでしょう。

If they still believe in the goodwill and kindness of the world, You can leave them as "uncorrectable stupid".

-----

もし本気で、私たちが、このようなバカの発生を止めようと思うのであれば、これしかありません。

If we really want to stop such stupid occurrences, that's it.

「成人式の廃止」

"Abolition of the coming-of-age ceremony"

です。

まあ、そこまで極端な施策をしなくとも、

Well, if not taking such extreme measures, there are measures we can do, for example,

「スマホを使った成人式への事前申し込み」

"Pre-registration for the coming-of-age ceremony using a smartphone"

「会場前でのアルコール検知装置の導入」

"Installation of alcohol detection device in front of the venue"

「(式の進行を妨げた場合、刑事(×民事)告訴をする、と記載されている)事前誓約書の署名と提出」

"Signing and filing an advance pledge (which states that a criminal (x civil) complaint will be filed if it prevents the ceremony from proceeding)"

など、打てる手はあります。

「昔の仲間と出あえる機会を確保する」という観点であれば、有志の仲間が独自に企画・運営すればよいです。

From the perspective of "securing the opportunity to meet old friends", volunteers should plan and operate independently.

その場合、地方自治体は、人数に応じた補助金を出しても良いでしょう。

In that case, the local government may provide subsidies according to the number of people.

そもそも、「私の成人を、行政なんぞに祝って貰う言われはないわ」 ―― と思っていた私は、成人式には出席しませんでした。

I didn't attend the coming-of-age ceremony、 saying, "there is no reason that the government will celebrate my adult."

嘘です。

It is a lie.

次の日が、ドイツ語の再履修のテスト日だったので、帰省できなかっただけです。

The next day was the test date for retaking the German language, so I just couldn't go home.

------

繰り返しますが ――

Again,

「成人式で珍奇な行為をする新成人」は、これからもいなくなりません。

"New adults who do strange things at the coming-of-age ceremony" will not disappear.

どんなに過激に非難しようとも、メデイアで晒そうとも、条例や法律で禁じようとも、全くの無駄です。

No matter how hard you blame, you expose it in the media or forbid it by law or law, it's totally useless.

彼等にとって、最高にして最後の舞台 ―― 千秋楽 ―― は、それらの不利益を、易々と越えるものだからです。

For such a person, the "coming-of-age ceremony" is the ultimate and final stage of "concluding festivities" and it overcomes those disadvantages easily .

成人式とは、「将来の希望を諦めた新成人」にとって、人生最後にして最大の晴れ舞台です。

The coming-of-age ceremony is the last and greatest stage of life for a "new adult who has given up hope for the future."

-----

どちらかと言えば、

If anything,

そんなイベントを企画しておいて、彼らに「バカなことをするな」と文句を言う、

like, planning such an event and complaining to them, "don't do stupid things.

「私たちのバカさ加減」

"Our stupidity"

の方に、私たちはそろそろ気がつくべきです。

we should notice that soon.