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

―― なぜ、江端は『サマータイムレンダ』についてのコメントを出さないのだ?

Why does not Ebata release his comments about "Summer Time Render"?

と思っている人がいるかもしれません。

Some people may think so.

時空間コンテンツフリークの江端が、沈黙を続けていることに、違和感を感じている方もいるかもしれません。

You may feel strange that Ebata, who is a space-time content freak, keeps silent about "Summer Time Render"

コメントを出さないのではなく、出せないのです。

I am not making a comment. I am unable to be making a comment.

なぜなら、途中の2話ほどをロストしているため、頭の中で話が繋がらないのです。

Because I failed to watch two episodes during the series,

もちろん、これは私の過失です。

You know, this is my fault.

シュタインズゲートの時は、イギリス出張中に、ホテルからノートPCで視聴していました。

At the time of Steins;Gate, I was on a business trip to England and watched it on my laptop from my hotel.

そんな私が、ここまで油断したのは、AmazonとNetFlixのせいです。

The reason I have been so caught off guard is because of Amazon and NetFlix.

大抵のアニメは、どちらかの動画サイトがフォローしていますが、『サマータイムレンダ』は、どっちもサポートしていませんでした。

Most anime is followed by one of the video sites, but "Summer Time Render" was not supported by either.

それを知ったときは、『マジか』と呟いて、頭が真っ白になりました。

When I knew it, I mumbled, 'Really?' and my mind went blank.

-----

時空間コンテンツは、その内容の性質上、連続視聴が必要になります。

A space-time content requires continues viewing due to the nature of its content.

まあ、その緊張感というのも、なんとも言えない楽しさなのですが。

Well, that tension is also an indescribable pleasure.

とは言え、どうしようかな?

Anyway, what shall we do?

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

本日、社内で、安全講話のプレゼン(?)してきました。

Today, I gave a presentation (?) on safety lectures in the company.

(以下、省略)

(Omitted hereafter.)

近日、詳細公開予定・・・できるかな?

More details will be released soon...I hope.

 

 

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

本日は、コラムがリリースされた日なので、日記はお休みです。

Today, new my column is released, so I take a day off.

「お金に愛されないエンジニア」のための新行動論(6)

老後を生き残る「戦略としての信仰」は存在するのか

"A New Theory of Action for Engineers Who Are Not Loved by Money(6)"

Is there "faith as a strategy" for surviving in old age?

-----

今回の最後のページのレビューアーは、代打をお願いしています。

In the last part of this column as a reader's review, I asked for a substitute.

私のホームページの立ち上げ時からのお付き合い頂いている方には、「懐しい人が出てきたな」と思われているかもしれません。

Some people who have been with me since the launch of my website, may think that "it is him".

あいかわらず、キレキレのレビューです。お楽しみ下さい。

As usual, he gave me a keen review. Enjoy it.

それはさておき。

That's aside.

-----

今回のコラムの中では、カルト宗教団体「江端教」が登場します。

In this column, a cult group "Ebata-ism" will be featured.

万一、あなたが、その内容に「既視感」を覚えたとしても、それはあなたの錯覚です。

Even if you feel a sense of "deja vu" with the content, it is your illusion.

「江端教」は、先週金曜日に、EE Times Japan編集部から前半全面削除の提案を受けたのち、週末に、江端が頭を抱えながら捻り出した、100%江端オリジナルの新しいカルト宗教です。

Ebata-ism" is a new cult religion that I had major renovated over the last weekend, after receiving a proposal from the EE Times Japan editorial board last Friday to delete the first half in its entirety.

―― 決して、深く勘繰ってはなりません

"Never, ever, be too deeply in the dark"

そういうことをすると、あなたも私も編集部も、みんなが不幸になります。

That makes everyone unhappy, including you, me, and the editorial staff.

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

私、このテレビの運搬の経験をしてから、聖書の内容に疑義の目を向けています。

After this TV carrying experience, I have been skeptical of the Bible's content.

75kg超えのテレビを、普通の夫婦二人で、2階に運び、さらにタンスの上に上げる方法(後編)

ナザレのイエスは、重量70kg~90kgの十字架を背負って、ゴルゴダの丘までの1.6kmを歩かされたと言われています。

Jesus of Nazareth is said to have walked the 1.6 km to the Hill of Golgotha carrying a cross weighing 70 kg to 90 kg.

信じられません。

I can't believe it.

嫁さんとふたりで、75kgのプラズマディスプレイを、30cmの移動を試みただけで、腰に激痛が走りました。

My wife and I had severe pain in our lower back just trying to move a 75 kg plasma display by 30 cm.

私たち夫婦が、このテレビを二階に上げて、さらにタンスの上に上げるのに、どれだけのコストと時間をかけたことか。

I can't tell you how much money and time my wife and I spent getting this TV upstairs and further up the wardrobe.

イエスが、重量級のマッチョであったという聖書の記述はありませんし、あったとしても、取っ手などもない十字架を背負うことなどできる訳がありません。

There is no biblical account of Jesus being a heavyweight macho man, and even if he was, there is no way he could carry a cross with no handles.

重量70kg~90kgの十字架を移動させる(地面の上をずらす)速度は、時速2メートルが限界だと思います。

The speed at which a cross weighing 70 kg to 90 kg can be moved (shifted over the ground) is limited to 2 meters per hour.

とすれば、ゴルゴダの丘の到着時間は、800時間。

If so, the arrival time at Golgotha Hill is 800 hours.

24時間不眠不休で行ったとしても、33日間はかかる計算です。

Even if he worked 24 hours a day, sleepless nights, it would take 33 days to complete the project.

3日目経たずに、過労死は確実です。

Before the third day has passed, overwork is a certainty.

-----

さて、夏休み最終日前日ですね。

Well, it is the day before the last day of summer vacation.

夏の自由研究に困っているみんな。

Everyone who is having trouble with their summer free research.

お父さんかお母さんに頼んで、DIYショップで70kg相当の木材を購入してもらって、これを十字架形状に加工して、自分が実際にどのくらい運べるか、という検証実験をやってみよう!

Ask your father or mother to buy 70 kg worth of lumber at a DIY store, and then modify it into a cruciform shape and do an experiment to see how much you can actually carry!

多分、学校で大ウケすることは間違いなしです。

It will probably be a big hit at your school.

テレビ局が取材にくるかもしれませんよ。

TV stations might come to cover the event.

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

私は基本的に、日用品が壊れたら修理しています。

I basically fix commodities when they are broken.

20年前に購入した3980円の電波時計は、自分で3回の電池交換と、4回のバンド交換を行っています。(最近、秒の液晶が見えなくなってきました)。

I purchased a 3980-yen radio-controlled watch 20 years ago and have replaced the battery three times and the band four times myself. (Recently, the seconds LCD has become invisible).

バンド交換に必要な軸穴が欠けてしまっていますので、瞬間接着剤で、強制的にくっつけています。

The shaft hole required to replace the band is missing, so I used instant adhesive to force it to stick.

バッグやGパンの穴も、木工用ボンドで補修して、使っています。

I have also repaired holes in bags and trousers with wood glue and continue to use them.

パソコン、冷蔵庫、洗濯機、バイクも、マニュアル読んで、分解して直すことが多いです。

I often read manuals and disassemble and fix computers, refrigerators, washing machines, and even motorcycles.

ただ、私は、これを「美徳」とか考えていません。

However, I do not consider this a "virtue" or anything like that.

「もったいない精神」など、1mmも考えたこともありません。

I have never thought about the "mottainai spirit" even for a millimeter.

そして、「貧乏くさい」という訳でもないと思います ―― 日常品を買う程度のお金は持っているつもりです。

And I don't think I'm "poor" -- I think I have enough money to buy commodities.

-----

敢えていうのであれば、「面倒くさい」あたりがしっくりきます。

Frankly speaking, "bother" is good fit for me.

新しいものを購入して、それに「慣れる」までのプロセスが、私は面倒なのです。

I feel to bother to purchase something new and accustom it.

あとは「修理が好き」ということですね。

Basically, I like repair.

-----

上手く修理できると、「勝ったような気」がするのですが、この気持ちを、他の人に理解して貰おうとも思っていません。

When I successfully fix it, I feel "I won", however, I don't expect others to understand this feeling either.

嫁さんは、そんな私を、諦めているようですが。

My wife seems to have given up on me like that.

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

redisのブロードキャストで構造体データを運ぶ時の注意(というか、golangのキャストがC/C++みたいに単純でない件)

で記載していますが、Redisのブロードキャストを大変「ありがたく」使っているのですが、

/switch v := psc.Receive().(type) {

では、受信でロックしてしまうので、これを破る(Break)する方法を探して、以下の方法を見つけたのですが

switch v := psc.ReceiveWithTimeout(5 * time.Second).(type) {

これが、上手く動きません。

// go run sub.go
// goga\1-9-6\others\sub2.go

package main

import (
	"encoding/json"
	"fmt"
	"time"

	"github.com/gomodule/redigo/redis"
)

type Ch5_info struct {
	Bus_num int     // バスの番号
	CC      int     //  1: 座標情報 2: 停車位置情報
	Present int     // 停車位置番号
	Lat     float64 //
	Lon     float64 //
}

func main() {
	// 接続
	conn, err := redis.Dial("tcp", "localhost:6379")
	if err != nil {
		panic(err)
	}
	defer conn.Close()

	psc := redis.PubSubConn{Conn: conn}
	psc.Subscribe("channel_1")

	for {
		c5i := new(Ch5_info)

		//switch v := psc.Receive().(type) {
		switch v := psc.ReceiveWithTimeout(5 * time.Second).(type) {
		case redis.Message:
			fmt.Printf("%s: message: %s\n", v.Channel, v.Data)

			_ = json.Unmarshal(v.Data, &c5i)

			// 試しに2つほど出力してみる
			fmt.Println(c5i.Bus_num)
			fmt.Println(c5i.Lon)

		case redis.Subscription:
			fmt.Printf("%s: %s %d\n", v.Channel, v.Kind, v.Count)
		case error:
			fmt.Println("After 10 seconds. out of switch")
			time.Sleep(time.Millisecond * 1000)
			//psc.Conn.Flush()
			//psc.Subscribe("channel_1")
		}

		//		fmt.Println("out of switch")

		//if c5i.CC == -1 {
		//	break
		//}

	}

	fmt.Println("Catch break")
}

"case error"
これで、5秒を経過すると"case error"に飛んでしまい、その後、forループで戻しても、常に"case error"に行ってしまいます。

どなたか、5後にswitchを抜けた後、また同じようにswitchで5秒を待つようにする方法をご存知の方、御一報下されば大変助かります。

ちなみに、参考までに、データ配送側のプログラムはこんな感じです(1回配送、走り切りです)。

// go run pub.go
// goga\1-9-6\others\pub.go
package main

import (
	"encoding/json"
	"fmt"

	"github.com/gomodule/redigo/redis"
)

type Ch5_info struct {
	Bus_num int     // バスの番号
	CC      int     //  1: 座標情報 2: 停車位置情報
	Present int     // 停車位置番号
	Lat     float64 //
	Lon     float64 //
}

func main() {
	// 接続
	conn, err := redis.Dial("tcp", "localhost:6379")
	if err != nil {
		panic(err)
	}
	defer conn.Close()

	c5i := new(Ch5_info)

	c5i.Bus_num = 1
	c5i.CC = -1
	c5i.Present = 23
	c5i.Lat = 12.34
	c5i.Lon = 56.78

	json_c5i, _ := json.Marshal(c5i)

	// パブリッシュ
	r, err := redis.Int(conn.Do("PUBLISH", "channel_1", json_c5i))
	if err != nil {
		panic(err)
	}
	fmt.Println(r)
}

 

 

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

本日、次女のサークルのイベント出場の見学に、夫婦で表参道に出向いてきました。

Today, my wife and I went to Omote-Sando to watch my junior daughter's club activitiy.

とても楽しめました。

I enjoyed it very much.

数百人~千人レベルの踊り子のグループを、オンスケジュールで動かしていく運営の能力とノウハウには、脱帽しました。

I was moved to look at the secretariat's ability and know-how to move a group of several hundred to a thousand level dancers on-schedule.

踊り手グループの動きを見ながら、トラックを使って巨大スピーカーを移動させていくのですが、音響が相互に干渉しない距離の取り方や、スピーカーの指向性の制御に舌を巻きました。

The dancers moved the giant speakers using trucks while watching the movements of the dancers' group, and I was amazed at the way the distance between the speakers was kept so that the sound did not interfere with each other, as well as the control of the directivity of the speakers.

-----

もちろん、踊りそのものは大変楽しかったのですが ―― 高知県からやってきたあるグループの踊りの、精緻さ、そのシンクロ率じの高さ、それを含めた『舞踊芸術』に感銘を受けました。

Of course, the dancing itself was a lot of fun, but I was impressed by the precision and synchronization of one group from Kochi Prefecture, and the "art of dance" it included.

学生たちの勢いのある踊り、というのも悪くないのですが、場数を踏んだと思われる熟年チームの踊りには、遠く及ばないなぁ、と実感しました。

The vigorous dancing of the students was not bad, but I realized that it was not as good as the dancing of the mature team, which seemed to have more experience in the event.

-----

いずれにしても、次女のサークルのイベント参加がなければ、私は、このイベントとは完全に無関係なままだっただろうと思います。

In any case, had it not been for my junior daughter's participation in the Circle event, I would have remained completely uninvolved with the event.

本日は、珍しく、渋谷や原宿に「前泊なし」で行ける場所に住んでいることに、感謝することができました。

Today, unusually, I was able to appreciate the fact that I live in a place where I can go to Shibuya and Harajuku "without a previous night's stay".

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

Amazonに発注した物品の未着率が5割を超えるようになり、Amazonのカスタマーセンタとチャットで議論した件

カスタマーセンタの『後ほど連絡します』を許さずに、「今すぐ調べろ」とゴネると、解決は早いです。

If you don't allow the customer center to say 'I'll call you later' and gong to 'check it up now', the solution will be reached soon.

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

元首相の国葬について、「国を二分する」とまでの規模ではありませんが、議論が噴出しているようです。

Controversy seems to be erupting about the state funeral of former prime ministers, although not on the scale of 'dividing the country in two'.

議論自体は良いことだと思いますが、私が首を炊げているのは、国葬の経費です。

I think the debate itself is a good thing, but I don't understand the the cost of state funerals.

―― 安倍元首相「国葬」経費 約2億5000万円支出を閣議決定

"Cabinet approves expenditure of about 250 million yen for former Prime Minister Abe's 'state funeral'."

これ本当? めちゃくちゃ安くない?と思いました。

"Really, It's too cheap isn't it?" I thought.

お金持ちの家、一件分くらいですよ。

A rich man's house, about the price of one.

-----

だって、国賓レベルの人が大量に国内にやってくるんですよね。

Because people at state guest level are coming to the country in large numbers.

仮に100人の国賓の人がやってきたと仮定すると、そのガードに10人が付いたとして、一人あたりの諸経費が1日50万円として、ざっくり、500万 x 100人 = 50億円ですよ。当然、2~3日滞在するとして、これで、もう200億円です。

Let's assume that 100 state guests arrive, and that 10 people are attached to guard them, and that the overheads per person are 500,000 yen per person per day, roughly, 5 million x 100 people = 5 billion yen. Of course, if they stay for two or three days, that's another 20 billion yen.

今回の、参加予定者は6000人と発表されています。

This time, the number of expected participants is announced to be 6,000.

当然、交通規制、運行制限なども行うわけですから、地方の警察官の動員もかかるでしょうし、国賓は日本国警察の威信をかけて要人警備をするはずです。

Naturally, traffic and operational restrictions will be imposed, so local police officers will have to be mobilised and the prestige of the Japanese police force will be put on the line to provide security for dignitaries.

もし、要人が国内で暗殺されたら、国交断絶のリスクだってあります。

If a key figure is assassinated in the country, there is even a risk of a breakdown of diplomatic relations.

これらをひっくるめれば、500億円なんぞ軽く突破すると思います。

If you put all these together, I think it will easily break the 50 billion mark.

もしも、ですよ。仮に、私が、自分の葬式を6000人規模でやるとしても、会食や接待、移動費用で、一人1万円、6000万円は必要になると思います。

If. If I were to hold my own funeral for 6,000 people, I would need 10,000 yen per person, or 60,000,000 yen, for dinner, entertainment and travel costs.

この私ですら、です。

Even this me.

-----

私は、「金額」についてとやかく言うつもりはありません。

I am not going to quibble about 'amounts of money'.

ただ、数字で連載コラムを担当しているライターとしては、とり急ぎ、"2.5億円"の見積書の概要(項目)を見たいです。

However, as an engineer who is in charge of a serial column with figures, I would like to see an overview (items) of the "250 million yen" quotation at the earliest opportunity.

と、ここまで書いて、『周辺の警備にあたる警察官の人件費などは含まれていないということです』というフレーズを見つけてしまいました。

And then I wrote this far and found the phrase 'This does not include the cost of police personnel to guard the area'.

そりゃ、そうだろう。

That would be.

ではお願いを修正して、「警備のコスも合わせた見積の開示」と致します。

We will now amend our request to "Disclosure of the estimate with security cos.

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

以下の記述は間違っているようですので、参照にしないで下さい(現在検証中)。
(昨日、ソフト外注会社の方に教えて貰いました)

 

Golangで、http.HandleFunc と http.Handleについて、ずっと混乱しつづけています。

というか、私は、使い方が分かればよくて、その理屈なんぞ1mmも興味がないので、コードを書きながら理解しています(結局、遅くなっているような気がしますが)。

1. http.Handle()は、index.htmlをベースとしたサーバを立てるもの

// main16.go 現在の居場所は、c:\Users\ebata\hirohakama\199A2\others
/*
.
├── main16.go
├── index.html (A)
└── chart            # chartフォルダに静的ファイルがある
    └── index.html (B)
*/

package main

import (
	"net/http"
)

func main() {

	// 静的ファイル配信.
	// ディレクトリ名をURLパスに使う場合
	// 例:http://localhost:8080/chart/で index.html (B) の方を表示
	http.Handle("/chart/", http.FileServer(http.Dir("./")))

	// 例:http://localhost:8080/で index.html (A) の方を表示
	http.Handle("/", http.FileServer(http.Dir("./")))

	// ディレクトリ名とURLパスを変える場合
	// 例:http://localhost:8080/mysecret/sample1.txt
	// http.Handle("/mysecret/", http.StripPrefix("/mysecret/", http.FileServer(http.Dir("./contents"))))

// 例:http://localhost:8080/で index.html (A) の方を表示
	http.Handle("/", http.FileServer(http.Dir("./")))
	// 8080ポートで起動
	http.ListenAndServe(":8080", nil)
}

これで、main16.goが置いている場所が、基準点となります(それだけです)。

で、色々考えずに、基本は、

http.Handle("/", http.FileServer(http.Dir("./")))

としておきましょう(というか、これがデフォルトなら、記載すらしなくてもいい)

2. http.HandleFunc()は、ソースコードで書いたものをサーバとするもの

// main15.go 現在の場所はc:\Users\ebata\hirohakama\199A2\others

/*
.
└── main15.go

*/

package main

import (
	"io"
	"log"
	"net/http"
)

func h1(w http.ResponseWriter, _ *http.Request) {
	io.WriteString(w, "Hello from a HandleFunc #1!\n")
}

func h2(w http.ResponseWriter, _ *http.Request) {
	io.WriteString(w, "Hello from a HandleFunc #2!\n")
}

func main() {

	// http://localhost:8080/ で h1の内容を表示 (プログラムの内容を)
	http.HandleFunc("/", h1)

	// http://localhost:8080/endpoint で h2の内容を表示
	http.HandleFunc("/endpoint", h2)

	log.Fatal(http.ListenAndServe(":8080", nil))
}

3. http.Handle()1つとhttp.handleFunc()1つが混在しているものは、それぞれサーバが2つある、ということ

// main13.go

package main

import (
	"fmt"
	"log"
	"math/rand"
	"net/http"
	"time"

	"github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{}

type GetLoc struct {
	ID    int     `json:"id"`
	Lat   float64 `json:"lat"`
	Lng   float64 `json:"lng"`
	TYPE  string  `json:"type"` // "PERSON","BUS","CONTROL
	POPUP int     `json:"popup"`
	//Address string  `json:"address"`
}

func echo3(w http.ResponseWriter, r *http.Request) {
	upgrader.CheckOrigin = func(r *http.Request) bool { return true } // おまじない
	conn2, err := upgrader.Upgrade(w, r, nil) //conn2でwebsocketを作成
	if err != nil {
		log.Println("websocket connection err:", err)
		return
	}
	defer conn2.Close()

	for {
		gl2 := new(GetLoc)
		gl2.ID = rand.Intn(20) // ここで乱数を発生されて、javascriptで受信させる
		gl2.Lat = 181.0
		gl2.Lng = 181.0
		gl2.TYPE = "BUS"
		gl2.POPUP = 101

		err := conn2.WriteJSON(&gl2)
		if err != nil {
			log.Println("ReadJSON:", err)
			break
		}
		fmt.Println("echo3:", gl2)
		time.Sleep(time.Second * 1)
	}

}

//var addr = flag.String("addr", "0.0.0.0:5000", "http service address") // テスト

func main() {

	http.Handle("/chart/", http.FileServer(http.Dir("./")))

	http.HandleFunc("/echo3", echo3)

	//log.Println("server starting...", "http://localhost:8080")
	//log.Fatal(http.ListenAndServe("localhost:8080", nil))
	log.Fatal(http.ListenAndServe(":8080", nil))
}

index.html

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>test</title>

</head>

<script type="text/javascript" src="moment.js"></script>
<script type="text/javascript" src="Chart.js"></script>
<script type="text/javascript" src="chartjs-plugin-streaming.js"></script> 



<script>  
    var ws;

    // websocketのオープン(この段階で接続完了)
    ws = new WebSocket('ws://localhost:8080/echo3')  // ユーザ登録画面

    ws.onopen = function (event) {
    }

    ws.onmessage = function (event) {
        // 送られてきたデータを受信して、JSON形式に変更
        var obj = JSON.parse(event.data);
        console.log("obj:",obj);
        console.log("obj.id:",obj.id);
        aa = obj.id;
    }
</script>  

<body BGCOLOR="black" text="white"  STYLE="overflow: hidden;">

	<center>
	  <font size="5">Waking Time(min.) <br></font> <!--- 意味のない表示 -->
	  <font size="5"> 歩行時間(分)</font> <!--- 意味のない表示 -->
	</center>
	
    <canvas id="myChart" width="100" height="85"></canvas>


<script>  
    var ctx = document.getElementById('myChart').getContext('2d');
			var chart = new Chart(ctx, {
				type: 'line',
				data: {
					datasets: [{
                        data: [],  // 1つめ
                        borderColor: "rgba(255,0,0,1)",
                        backgroundColor: "rgba(0,0,0,0)",  
                        lineTension: 0,
                        label: 'Time',
					}]
				},
				options: {
					scales: {
						xAxes: [{
                            type: 'realtime',
                            realtime: {
                                duration: 30000, // 300000ミリ秒(5分)のデータを表示 (コメントアウトすると早く動く)
                                onRefresh: function(chart) {
                                    chart.data.datasets.forEach(function(dataset) {
                                        dataset.data.push({
                                            x: Date.now(),
                                            //y: (Math.floor(Math.random()*16)+30) //30-45の乱数(整数)
                                            y: aa, // この"aa"が、送られてきたデータ
                                        });
                                    });
                                }
                            }

                        }],
                        yAxes: [{
					        ticks: {
					        	max: 20,
					        	min: 0
        					}
                        }]
					}
				}
			});

</script>

</body>
</html>

 

この場合、

  • /chart/index.htmlをベースとするサーバと、
  • echo3()が作るサーバ

の2つがある、ということ。

実際のところ、echo3は、/chart/index.html のクライアント(データの送信元)でもあるんだけど、要求があれば、ポコポコ作り出される、という点ではサーバでもある、という形になっています。

―― という説明を、次に私が頭を抱えた時に、私が思い出せるのかが、不安です