2023,江端さんの忘備録

最近は聞かれなくなった言葉に、『自分探し』というものがあります。

One word that is no longer heard these days is "self-discovery.

―― 自分とは何者であるか

"Who I am"

哲学的な問いですが、私、この答を見つける最適最短手段を知っています。

This is a philosophical question, but I know the best and shortest way to find the answer.

『「育児」and/or「介護」の当事者になる』

Becoming a Party to "Childcare" and/or "Caregiving"

これだけです。

That's all.

-----

もう、そりゃ、自分が認識していなかった自分が「もろ見え」です。

I can already "see" myself that I didn't recognize.

特に、肉体的、精神的限界に至った時の、自分の中に潜む「どす黒い感情」が赤裸々に見えて ―― 自分でびっくりします。

Especially when I reach my physical and mental limits, I can see nakedly the "black emotions" that lurk within me -- I am surprised at myself.

『極限状態の戦場では、その人の本質が明らかになる』と言われます。

It is said that "the nature of a person is revealed on the battlefield under extreme conditions.

その意味で、「育児」「介護」は準戦場と言えるかもしれません。

"In this sense, "childcare" and "caregiving" could be described as a quasi-battlefield situation.

-----

もちろん、好んで戦場に行く必要はありません。

Of course, you do not have to go to the battlefield by preference.

これらを忌避して生きてもいいんですか ―― いいんです(楽天カードのCM風)。

Is it OK to live in evasion of these things? -- it's OK (Rakuten Card commercial style).

-----

ただ、個人的に言えば ―― 『「育児」and/or「介護」の当事者』になった人は「信用できる」とは思います。

However, speaking personally -- I think that people who have been "involved in "childcare" and/or "caregiving" are "trustworthy".

一方、このような「体験至上主義」が、いわゆる、結婚ハラスメント、育児ハラスメント、介護ハラスメントの温床になっている、という自覚もあります。

On the other hand, we are also aware that this "experience-history principle" has become a breeding ground for so-called marriage harassment, childcare harassment, and caregiver harassment.

2021/01,江端さんの技術メモ

官能の人工知能 ~深層学習を最も分かりやすく説明するパラダイムOver the AI ―― AIの向こう側に(22)

"Artificial Intelligence in Sensuality -- The paradigm that most clearly explains deep learning
Over the AI -- Beyond AI (22)

で使ったソースコード(cpp)が見つからなかったので、添付しておきます。
I could not find the source code (cpp) used in the following, so I am attaching it.

simple-cnn8x8

simple-cnn 8x8

simple-cnn_8x8-2

ついでに、破壊実験の方も
Code for destructive experiments

口に出せない介護問題の真実 ~「働き方改革」の問題点とは何なのか
The Truth About Unspoken Nursing Care Issues - What is the Problem with "Workplace Reform"?

destructive_simple-cnn_8x8

destructive_simple-cnn_8x8-2

 

 

2023,江端さんの技術メモ

This program is based on the following page
https://qiita.com/ufoo68/items/9e4ca04578ba0f5fa5ff

This program solves the XOR problem using MLP with one hidden layer.

#include <stdio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
//num of units
#define NUM_INPUT 2
//#define NUM_HIDDEN 20
#define NUM_HIDDEN 2

double sigmoid(double x) {
    return 1/(1+exp(-x));
}

//derivative of sigmoid function
double d_sigmoid(double x) {
    double a = 0.1;
    return a*x*(1-x);
}

int main(void) {
    srand((unsigned)time(NULL));
//train data
    double train_x[4][NUM_INPUT+1] = {{0, 0, -1},{0, 1, -1},{1, 0, -1},{1, 1, -1}};
    double d[4] = {0, 1, 1, 0};
//net
    double w[NUM_HIDDEN+1][NUM_INPUT+1];
    double v[NUM_HIDDEN+1];
    double y[4][NUM_HIDDEN+1];
    double z[4];
    double eta = 0.1;
    int epoch = 1000000;
//other
    int i, j, k, l;
    double tmp = 0;

//update weights using rand()
    for(l=0; l<NUM_HIDDEN+1; l++) {
        for(i=0; i<NUM_INPUT+1; i++) {
            w[l][i] = ((double)rand() / ((double)RAND_MAX + 1));
        }
    }
    for(i=0; i<NUM_HIDDEN+1; i++) {
        v[i] = ((double)rand() / ((double)RAND_MAX + 1));
    }

//tain
    for(k=0; k<epoch; k++) {
        //feedforward
        for(j=0; j<4; j++) {
            //hidden
            for(l=0; l<NUM_HIDDEN; l++) {
                for(i=0; i<NUM_INPUT+1; i++) {
                    tmp += train_x[j][i] * w[l][i];
                }
                y[j][l] = sigmoid(tmp);
                tmp = 0;
            }
            y[j][NUM_HIDDEN] = -1;
            //output
            for(i=0; i<NUM_HIDDEN+1; i++) {
                tmp += y[j][i] * v[i];
            }
            z[j] = sigmoid(tmp);
            tmp = 0;

        //backward
            //output
            for(i=0; i<NUM_HIDDEN+1; i++) {
                v[i] = v[i] - eta * y[j][i] * d_sigmoid(z[j]) * (z[j] - d[j]);
            }

            //hidden
            for(l=0; l<NUM_INPUT+1; l++) {
                for(i=0; i<NUM_HIDDEN+1; i++) {
                    w[i][l] = w[i][l] - eta * train_x[j][l] * d_sigmoid(y[j][i]) * d_sigmoid(z[j]) * (z[j] - d[j]) * v[i];
                }
            }
        }

		/*
        //print detail
        printf("z=");
        for(i=0; i<4; i++) {
            printf("%f ", z[i]);
        }
        printf("epoch:%d\n",k);
		*/
    }

//predict
    for(j=0; j<4; j++) {
        //hidden
        for(l=0; l<NUM_HIDDEN; l++) {
            for(i=0; i<NUM_INPUT+1; i++) {
                tmp += train_x[j][i] * w[l][i];
            }
            y[j][l] = sigmoid(tmp);
            tmp = 0;
        }
        y[j][NUM_HIDDEN] = -1;
        //output
        for(i=0; i<NUM_HIDDEN+1; i++) {
            tmp += y[j][i] * v[i];
        }
        z[j] = sigmoid(tmp);
        tmp = 0;
    }

//print result
    printf("z=");
    for(i=0; i<4; i++) {
        printf("%f ", z[i]);
    }
    printf("epoch:%d\n",k);


    for(i=0; i<NUM_INPUT+1; i++) {
        for(l=0; l<NUM_HIDDEN+1; l++) {
		  printf("w[%d][%d]:%f\n", i, l, w[i][l]);
        }
    }

    for(i=0; i<NUM_HIDDEN+1; i++) {
	  printf("v[%d]:%f\n",i, v[i]);
    }


    return 0;
}

Save this program as a name "mlp.c", compile ">gcc mlp.c" and execute ">./a.exe"

2023,江端さんの忘備録

高校の時は、漠然と応用物理学を専攻したいと思っていました。

In high school, I vaguely wanted to major in applied physics.

大学では電子工学を、大学院では電気工学を、

I studied electronics in college and electrical engineering in graduate school.

そして、その後は、以下の図に記載した業務に携わり、

Then, afterwards, I was involved in the operations described in the following diagram.

で、本日、

So, the following card arrived today.

が、届きました。

-----

―― 思えば、遠くに来たもんだ

"Come to think of it, I've come a long way"

と、しみじみと実感しています。

I am deeply aware of this.

2023,江端さんの忘備録

今日も資料作成の為に、特許検索サイトに行きました。

I went to the patent search site again today to prepare documents.

ところが、

However,

というメッセージを受けて、今、困っています。

I am now in trouble because I received th above message.

メンテナンスは必須ですので、仕方がないことです。

Maintenance is a must, so it is inevitable.

しかし、『動いているのが当たり前と思っているものが止まる』というのは、困るものです。

However, it is troubling when 'things that we take for granted to be moving stop.

-----

そういえば、今回のコラムで、

In this column, I wrote

江端:「ああ、それは分かります。私たちは、普段から『私が突然いなくなっても、社会は1mmも困らない』ことを良く知っていますが、その事実を直視すると凹みますからね」

Ebata: "Oh, I understand that. We usually know very well that 'even if I suddenly disappear, society will not be troubled one millimeter,' but when we face that fact, it makes a dent, you know."

と記載しました。

で、今、

So, now, I am thinking

―― 私の価値って、特許検索エンジンの価値の1/1000以下よりも、はるかに低いんだろうなぁ

"I guess my value is much less than 1/1000th of the value of a patent search engine"

とか思って、勝手に凹んでいます。

And I am depressed on my own.

2023,江端さんの忘備録

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

Today's diary is taken off, as the new column has been released.

------

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━……‥‥・・・
連載記事アラート《アイティメディアID》 ………………………… 2023/02/25

Serial Article Alert 《Itimedia ID》 ........................ 2023/02/25

・・・‥‥……━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

「「お金に愛されないエンジニア」のための新行動論」の最新記事が掲載されました。

The latest article on "New Behavioral Theory for 'Engineers Not Loved by Money'" has been published.

■最新記事

- Latest Articles

1日1回の外出は2000円の価値? 「孤独」がもたらす損失を試算してみる

Is going out once a day worth 2,000 Yen? Let's estimate the loss that "loneliness" brings.

(イラストをクリックすると、記事に飛びます)

(Click on the figure to jump to the article)

今回は、「移動」と「ウェルビーイング」を解析した論文を読み解いてみました。

In this issue, I read a paper analyzing "mobility" and "wellbeing".

そこで得た結論は、「孤独を回避して幸せになりたいのなら、毎日外へ出ろ」というものです。

The conclusion I came to was, "If you want to avoid loneliness and be happy, go outside every day".

2023,江端さんの忘備録

こちらにも記載しましたが、3月に、大学生の学生の講義のコマを3つ持つ旨、担当指導教授から指示を受けました。

私の業務経歴は、「成果」ではなくて「怒り」で記載可能のようです。

In March, I have been instructed by my supervisor to have three lecture sessions for university students.

各種のネタは持っているのですが、まあ、最近なら『"AI"がウケがいいだろう』と思って、その旨を教授に返事をしました。

I had a variety of ideas, but I thought, well, "'AI' would be popular these days," I replied to the professor.

―― で、今、講義の準備に頭を抱えています。

Now, the "preparation for lectures" is giving me a headache.

-----

講義だけなら、1時間程度くらい、デタラメな英語をしゃべる続けることはできると思うのです。

I think I can keep speaking bullshit English for about an hour of the lecture.

その訓練は、20年前に完了しています。

That training was completed 20 years ago.

問題は「練習問題」です。

The problem is "practice problems".

AIというのは、基本的には『コンピュータプログラムを使った、暴力的な力まかせの計算の強行』です。

AI is basically 'violent forced computation' using computer programs.

―― プログラミングを知らない学生に、「座学」で「手計算」で「計算用紙」を使って、AIの計算プロセスを練習させる

"How to have students who do not know programming practice the AI calculation process in a "classroom" setting, using "hand calculations" and "calculation paper"

これが、想像を絶するほど難しいのです。

This is unimaginably difficult.

正直、どこから手をつけたら良いのか分からない、という感じです。

Frankly, I don't know where to start.

加えて、『講義の時間がわずか1時間』という制約が、私を苦しめています。

In addition, the restriction of 'only one hour of lecture time' has been a pain for me.

例えば、ベイズ推論、ファジィ推論、それぞれのAI技術の解説に、最低「5時間」は欲しいのですが、現状、それぞれ15分しかありません。

For example, I would like at least "5 hours" to explain the AI techniques of Bayesian and fuzzy reasoning, but currently I have only 15 minutes each.

このまま講義に突入すれば、『想像を絶するほど、つまらない講義になるだろう』と予感しています。

I have a feeling that if I go into the lecture as it is, 'it will be the most boring lecture imaginable'.

という訳で、ここ数日、ずっと頭を抱え続けています。

This is why I have been keeping my head in the sand for the past few days.

-----

「数学教育が、なぜ、あれほどつまらないものになるか」の断片を、理解したような気がします。

I think I understand a piece of "why math education can be so boring".

ここに至って、私は『数学教育を楽しいものにするには、少なくとも、今のコマの5~10倍以上の時間が必要だ』ということに、気がつきました。

It was here that I came to the realization that 'to make math education fun, we need at least five to ten times as much time as we have in our current frames.

2023,江端さんの技術メモ

Golang 文字列を数値に変換する方法で、文字列→実数なら、これが一番てっとり早そう

dest_lat, err := strconv.ParseFloat(row[2], 64)

strconv.ParseIntstrconv.ParseUnitは、文字列を解析して整数型を返す関数
それぞれ符号付き整数型と符号なし整数型に対応している。

 

2023,江端さんの技術メモ

ODデータ(csv):20220518weekday

領域データ(csv):yamaguchi_area

出力データ(csv):new_20220518weekday

その他: 年齢を乱数を使って適当に作成しているコードも入っている

// ~/yamaguchi/src_try1/others/main61.go

// Usage: go run main61.go 20220518weekday.csv new_20220518weekday.csv

package main

import (
	"database/sql"
	"encoding/csv"
	"fmt"
	"log"
	"math/rand"
	"os"
	"strconv"

	_ "github.com/lib/pq"
)

func main() {

	file, err := os.Open("yamaguchi_area.csv")
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()

	r := csv.NewReader(file)
	rows, err := r.ReadAll() // csvを一度に全て読み込む
	if err != nil {
		log.Fatal(err)
	}

	str := "SELECT ST_Covers(st_geomfromtext('POLYGON(("

	// 行ごとに
	for i, row := range rows {
		if i == 0 {
			continue // CSVのヘッダー行を無視
		}

		str += row[1] + " " + row[2] + ", " // rowのままで取り出せば、文字列になっている

	}
	str1 := str[:len(str)-2] + "))'),st_geomfromtext('LINESTRING(" // 上記の最後の", "を削除して、文字列を追加

	dbMap, err := sql.Open("postgres",
		"user=postgres password=password host=192.168.0.23 port=15432 dbname=yama_db sslmode=disable")
	log.Println("------------------ map db open ------------------")
	if err != nil {
		log.Fatal("OpenError: ", err)
	}
	defer dbMap.Close()

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

	//file2, err2 := os.Open("20220518weekday.csv")
	file2, err2 := os.Open(os.Args[1]) // 第1パラメータ
	if err2 != nil {
		log.Fatal(err2)
	}
	defer file2.Close()

	r2 := csv.NewReader(file2)
	rows2, err2 := r2.ReadAll() // csvを一度に全て読み込む
	if err != nil {
		log.Fatal(err2)
	}

	file3, err3 := os.Create(os.Args[2]) // 第2パラメータ
	if err3 != nil {
		panic(err)
	}

	w := csv.NewWriter(file3)

	var id int

	for _, row := range rows2 {
		//if i == 0 {
		//	continue // CSVのヘッダー行を無視
		//}

		str2 := str1 + row[0] + " " + row[1] + ", " + row[2] + " " + row[3]

		str2 += ")'))"

		fmt.Println(str2)

		rows1, err := dbMap.Query(str2)
		if err != nil {
			log.Fatal(err)
		}
		defer rows1.Close()

		//var dt string
		var dt bool

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

				//if err := rows.Scan(&id, &age, &type1, &departure_name, &departure_number, &departure_lat, &departure_lng, &arrival_name, &arrival_number, &arrival_lat, &arrival_lng); err != nil {
				//	fmt.Println(err)
				// 上記のSQLのフォームと同じ形でcsvファイルを作る

				var age int

				fmt.Println("row[4]:", row[4])

				// id_str := strconv.Itoa(id) // idを文字列に
				if row[4] == "10-15" {
					age = 10 + rand.Intn(5)
				} else if row[4] == "15-29" {
					age = 15 + rand.Intn(5)
				} else if row[4] == "20-24" {
					age = 20 + rand.Intn(5)
				} else if row[4] == "25-29" {
					age = 25 + rand.Intn(5)
				} else if row[4] == "30-34" {
					age = 30 + rand.Intn(5)
				} else if row[4] == "35-39" {
					age = 35 + rand.Intn(5)
				} else if row[4] == "40-44" {
					age = 40 + rand.Intn(5)
				} else if row[4] == "44-49" {		
					age = 45 + rand.Intn(5)
				} else if row[4] == "50-54" {
					age = 50 + rand.Intn(5)
				} else if row[4] == "55-59" {
					age = 55 + rand.Intn(5)
				} else if row[4] == "60-64" {
					age = 60 + rand.Intn(5)
				} else if row[4] == "65-69" {
					age = 65 + rand.Intn(5)
				} else if row[4] == "70-74" {
					age = 70 + rand.Intn(5)
				} else if row[4] == "75-80" {
					age = 75 + rand.Intn(5)
				} else if row[4] == "80-84" {
					age = 80 + rand.Intn(5)
				} else if row[4] == "85-89" {
					age = 85 + rand.Intn(5)
				} else if row[4] == "90-94" {
					age = 90 + rand.Intn(5)
				} else if row[4] == "95-99" {
					age = 95 + rand.Intn(5)
				} else {
					age = 15 + rand.Intn(65) // 15箸キ79までの乱数
				}

				type1 := "resident"
				departure_name := ""
				_row1, _ := strconv.ParseFloat(row[1], 64)
				_row0, _ := strconv.ParseFloat(row[0], 64)

				departure_number, departure_lng, departure_lat := fixPosition(dbMap, _row1, _row0) // row[1], row[0]の順番に注意

				arrival_name := ""
				_row3, _ := strconv.ParseFloat(row[3], 64)
				_row2, _ := strconv.ParseFloat(row[2], 64)
				arrival_number, arrival_lng, arrival_lat := fixPosition(dbMap, _row3, _row2) // row[3], row[2]の順番に注意

				output := []string{fmt.Sprint(id), fmt.Sprint(age), type1, departure_name, fmt.Sprint(departure_number), fmt.Sprint(departure_lat), fmt.Sprint(departure_lng), arrival_name, fmt.Sprint(arrival_number), fmt.Sprint(arrival_lat), fmt.Sprint(arrival_lng)}

				//output := []string{row[0], row[1], row[2], row[3], row[4]}
				fmt.Println("output:", output)

				if err = w.Write(output); err != nil {
					log.Fatal(err)
				}

				id++ // idの加算
			}
		}

		err = rows1.Err()
		if err != nil {
			panic(err)
		}

		defer w.Flush()

		if err := w.Error(); err != nil {
			log.Fatal(err)
		}

	}
}

// 指定した座標に近いDB上の座標を取得
func fixPosition(db *sql.DB, _x1, _y1 float64) (int, float64, float64) {

	// Scan用の仮変数
	var source int
	var longitude float64
	var latitude float64
	var dist float64

	upperLimitMeter := 1500.0 // 近傍ノードの上限を1500 mに設定
	str := fmt.Sprintf(
		// 修正前: ways (道) の中から最近傍を取得
		// "SELECT source, x1 AS longitude, y1 AS latitude, ST_Distance('SRID=4326;POINT(%v %v)'::GEOGRAPHY, the_geom) AS dist FROM ways WHERE ST_DWithin(the_geom, ST_GeographyFromText('SRID=4326;POINT(%v %v)'), %.1f) ORDER BY dist LIMIT 1",
		// 修正後: ways_vertices_pgr (点座標) の中から最近傍を取得
		"SELECT id AS source, lon AS longitude, lat AS latitude, ST_Distance('SRID=4326;POINT(%v %v)'::GEOGRAPHY, the_geom) AS dist FROM ways_vertices_pgr WHERE ST_DWithin(the_geom, ST_GeographyFromText('SRID=4326;POINT(%v %v)'), %.1f) ORDER BY dist LIMIT 1",
		_x1, _y1, _x1, _y1, upperLimitMeter,
	)
	//fmt.Println(str)

	rows, err := db.Query(str)
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()

	foundGoodMapNode := false

	for rows.Next() {
		foundGoodMapNode = true
		if err := rows.Scan(&source, &longitude, &latitude, &dist); err != nil {
			fmt.Println(err)
		}
		//fmt.Println(source, longitude, latitude, dist)
	}

	if !foundGoodMapNode {
		log.Println("Warning: in func fixPosition: Good Map Node not found for query point (",
			_x1, ",", _y1, ")")
	}

	return source, longitude, latitude
}

2021/01,江端さんの忘備録

私は、新入社員の人に対して、あまり語ることができないヘッポコな社会人ではありますが、一つだけ言うのであれば、

I am a business person who cannot talk to fresh persons about equipment for their job, however if I am allowed to do, I will say,

―― 上司に「どうしたらいいでしょうか?」と聞く新人だけにはなってはいけません

"Don't make you a business person who say "What should I do next?" easily"

とは言えると思っています。

-----

具体的には、こんな風に言えるようななると良いと思います。

To be more precise, I think that it is better for you to talk to your boss as follow.

「どうしたらいいのか分からないのですが、取り急ぎ自分で(←ここ大切)3つ考えました」

"I don't know how to do about this task, howeve, I tired to do the following three A,B,C

「A方式はやってみました。メールに添付してあります」

"I have done A method. The report is attached in this mail"

「Bという方法と、Cという方法を考えていますが、こちらは、私には着手方法が分かりません」

"I have thought B and C methods too, but I could not come to think how to start them"

「あるいは(A)~(C)が全く的を外しているかもしれません。お手数ですが、ご教示頂けましたら幸いです」

"I may be missing the point of all (A) through (C). I would appreciate it if you could help me with this"

の、4つのフレーズです。

These four phrases are important.

-----

「どうしたらいいでしょうか?」は、あなたが最高にラクができて、上司が最高に面倒を負わなればなりません。

"What should I do next?"-- is the easiest way easy for you, but the hardest wasy for your boss.

4フレーズでは、あなたは最悪に苦労をした挙句、しかも「空振り」の可能性すらあります。一方、上司は、すでに回答が出揃っている状態を「選択」または「修正」だけすれば良い状態になっています。

In the above four phrases, you might have the worst hard time, and might be in vain. However your boss is ready to "choose" or "modify" the answers you already prepare for them.

-----

もっと簡単に言い換えましょう。

Let's put them more simply.

■あなたは、上司に、英作文を作成させるテストを受けさせますか?

Would you have your boss take a test where he or she has to compose an English essay?

■それとも、上司に、マークシートのテストを受けさせますか?

Or do you want your boss to take a mark-sheet test?

■上司はどっちの方がラクだと思いますか?

Which do you think is easier for your boss?

-----

私は、私にラクをさせてくれる新人が、可愛いです。

I think my subordinates who make it easy for me are prettier.

自力で解決しようとする新人が、可愛いです。

The subordinate who tries to think and solve the problem on their own is cute.

この「可愛さ」の前では、容姿、性別、年齢等の属性なんぞ『屁』でもありません。

In front of this "cuteness," attributes such as looks, gender, age, etc. are nothing.