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

「なんで、江端は、未だにコーディングなんかしているだ?」と思われている方は多いと思います。

"Why is Ebata still coding?" I think there are many people who think that.

ここ数年、私は、プログラムを外注の方に作って頂いています。

For the past few years, I have had the program created by an outsourcer.

ソースコードも含めて、全品納品して頂いているのですが、

I've had all the items delivered to me, including the source code, however, I came to realize

―― それらのソースコードを、全く再利用(改修)できない

"I have not been able to reuse (modify) their source code at all"

と、思い知ってきたからです。

-----

はっきりと言いますが、『他人の書いたプログラム』は、はっきり言って「呪文」です。

To be clear, "programs written by others" are, to put it bluntly, "spellbinding.

自分の知らないプログラム言語は言うに及ばず、自分が熟知しているプログラム言語であっても、

Not only programming languages that I am not familiar with, but also even programming languages that I am familiar with, are not

- ライブラリが違う

- Libraries are different,

- プログラムの開発環境が違う

- Program development environments are different,

- プログラム言語のバージョン(仕様)が違う

- Versions (specifications) of the programming language are differnt,

ことがあり、決定的なことは、

In, addition, the crucial thing is that

- コーディングのアプローチ(思想)が違う

- Coding approaches (philosophy) are different.

という点が、絶望的に「呪文」なのです。

This point is hopelessly "spellbinding".

以前、私の師匠(エルカン)が、

Once, my mentor, "Erukan" said,

―― 他人のプログラムを読むことは、他人の頭を覗き込むような行為で、不快で嘔吐すら覚える

"Reading someone else's program is like looking into someone else's head. it's offensive and even vomit-inducing"

と言っていましたが、これは、けだし名言と言えます。

I think that this is a great quote.

-----

苦痛を伴わないプログラミングとは、スクラッチから自分1人で行うプログラミングです。

Pain-free programming is programming done by myself alone from scratch.

ただ、これは、昨今のデジタルサービスのスピードを考えれば、このようなプログラミングは『贅沢』です。

However, this is a 'luxury' of such programming, given the speed of digital services these days.

また、『非生産的』であることも、認めざるを得ません。

I also have to admit that it is 'unproductive'.

そのようなプログラミングが、贅沢で非生産的なことをやっているのであれば、私は、どこからリソースを削ってくればいいか?

If the programming is "luxury" and "unproductive", where can I get resources from?

そりゃ、『週末』と『睡眠時間』しか、ないでしょう。

The only thing I can use is "weekends" and "sleeping time".

-----

昔は、『週末』と『睡眠時間』を削ってプログラミングしていることを、普通にしゃべることができました。

In the past, I could usually talk about the programming on the 'weekends' and on less sleep.

最近は、このようなことを職場等で公言することは、『コンプライアンス的に問題がある』ということになっているようです。

These days, it seems to be a 'compliance issue' to publicly state such a thing in the workplace, etc.

そして、私も、この意見には賛成です。

And I agree with this opinion.

この手の話は、つまるところ『パワハラ』ですし、こういう自慢話は、聞いている側もムカつきます。

This kind of talk is, after all, "power harassment," and this kind of bragging is infuriating to listen to.

だから、これからは、『自分がやりたい仕事(試したいプログラム等)は、アンダー・ザ・テーブルで仕込む』ことが、普通になっていくと思います。

So, from now on, I think it will become the norm that 'the work I want to do (programs I want to try, etc.) will be prepared "under the table".

-----

ところで、この「アンダー・ザ・テーブル」は、プログラミングに限定されません。これは仕事一般に通じる話です。

By the way, this "under the table" is not limited to programming. This goes for work in general.

私が常に言っていることですが

I've always said.

「あなたがやりたい仕事は、公にせずに1人でやること」

"The work you want to do, do it alone, without making it public"

「そして公にできるチャンスを、虎視眈々と狙い続けること」

"Keep my eyes open for any opportunity to make it public"

が肝要です。

These are important.

自分のアイデアを、未完成のまま、不適当なタイミングで組織に開示すると『必ず潰されます』 ―― ロジカルに。

If you disclose your ideas to the organization in an unfinished state and at an inappropriate time, 'your idea will surely be crushed' -- logistically.

これは「組織の公理」と言っても過言ではありません。

It is no exaggeration to say that this is an "axiom of organization".

例えば、私には、ある自分のアイデアを3年間隠し続け、2年間かけて目立たないように少しづつ開示し、ようやく組織内で認識して貰えるに至ったサービス/製品があります。

For example, I have a service/product that I kept my idea hidden for three years, and after two years of discreetly disclosing it little by little, I finally got it to be recognized within the organization.

閑話休題

Now let's return to the main subject

-----

「なんで、江端は、未だにコーディングなんかしているだ?」に関しては、色々なことが言えますが、一言で言えば、

Why is Ebata still coding?" A lot can be said about this, but in a nutshell

『ラクだから』

"Because, it is easy"

です。

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

(その1)

(Part 1)

米国を含めた多国籍軍は、1991年に、湾岸戦争を開戦しました。

Multinational forces, including the United States, launched the Gulf War in 1991.

1990年、イラクのフセイン政権は、石油を大量に保有しているクウェートに対して攻撃を仕掛け、国連決議によって多国籍軍が、イラクに攻撃を開始しました。

In 1990, the Hussein regime in Iraq launched an attack against Kuwait, which had large oil reserves. In response, a multinational force, under a United Nations resolution, launched an attack on Iraq.

当時、戦争に忌避的だった米国の世論は、「ナイラ証言」によって、一気に開戦へと機運が高まりました。

Public opinion in the U.S., which at the time was averse to war, was quickly galvanized by the "Nayirah testimony" to start the war.

「ナイラ証言」とは、イラクによるクウェート侵攻の後、「ナイラ」を名乗る少女が行った証言で、その内容は過激なものでした(YouTubeに飛びます)。

The "Nayirah testimony" was a radical testimony given by a young girl who identified herself as "Nayirah" after the Iraqi invasion of Kuwait.

『イラク軍兵士がクウェートの病院から保育器に入った新生児を取り出して放置し、死に至らしめた』と、その経緯を涙ながらに語っていました(何度もニュースで流れたので、よく覚えています)。

'Iraqi soldiers removed a newborn from a Kuwaiti hospital in an incubator and left it to die,' he said tearfully (I remember it well because it was on the news many times).

現在、これが『偽証』であったこと、さらに、そのナイラなる少女が、当時クウェート駐米大使であったサウード・アン=ナーセル・アッ=サバーハの娘だった事実が明らかになっています。

It is now known that this was "perjury" and that the girl, Nayirah, was the daughter of Saud an-Nasser a-Sabah, then Kuwait's ambassador to the United States.

―― (米国民を含めて)世界は、その少女の偽証に見事に騙されて、戦争に突き進んでいったのです。

"The world (including the American people) was successfully deceived by the girl's perjury, and pushed forward to the war"

-----

(その2)

(Part 2)

米国と英国は、2003年に、イラク戦争を開戦しました。

In 2003, the United States and the United Kingdom launched a war in Iraq.

ブッシュ大統領は、開戦前後の演説で、戦争理由以下を挙げました。

President Bush cited the following reasons for the war, in his speeches before and after the war.

(1)生物・化学兵器等、大量破壊兵器を保有し続け、その事実を否定し、国連の武器査察団に全面的な協力を行わなかった

(1) Continued to possess weapons of mass destruction, including biological and chemical weapons, denied the existence of such weapons, and failed to cooperate fully with UN weapons inspectors

(2)イラクの一般市民をサッダーム・フセイン大統領の圧政から解放する

(2) Free Iraqi civilians from the oppressive regime of President Saddam Hussein.

ただし、国連安保理のなかでも、フランス、ドイツ、ロシア、中国らは軍事介入に反対しました。

However, even within the UN Security Council, France, Germany, Russia, and China opposed military intervention.

常任理事国の拒否権によって、国連軍は発動しませんでした。

Due to the veto power of the permanent members of the Council, the UN force was not activated.

米国、英国などは有志連合を組み、3月20日、空爆という先制攻撃に踏み切りました。

The United States, the United Kingdom, and other countries formed a coalition of the willing and launched a pre-emptive strike on March 20, bombing the country.

で、

As a result,

―― 生物・化学兵器等、大量破壊兵器を保有していたという証拠は、一つも見つかりませんでした。

"Not a single piece of evidence was found that Iraq possessed weapons of mass destruction, including biological or chemical weapons"

それを理由として、英国は当時のブレア首相が退陣に追い込まれました(ブッシュ大統領は退陣していません)

Because of this, then British Prime Minister Blair was forced to step down (President Bush did not step down).

-----

(その他)

(Other)

―― 米国は、1945年に、非戦闘員である広島市民と長崎市民の頭上に、摂氏3000度(太陽の表面温度の半分)の核爆弾を炸裂させました。

-- In 1945, the United States detonated a nuclear bomb at 3,000 degrees Celsius (half the surface temperature of the sun) over the heads of non-combatant citizens of Hiroshima and Nagasaki.

これが、連合国軍の分裂(冷戦)の始まりであり、満州、北方領土に侵攻中のソ連に対する、核兵器保有国としてのデモンストレーションであったことは、(我が国では)定説です(米国政府の公式見解とは異なる)。

It is a common belief (in Japan) that this was the beginning of the division of the Allied Forces (Cold War) and a demonstration by the nuclear weapon states against the Soviet Union, which was invading Manchuria and the Northern Territories (contrary to the official view of the US government).

-----

私は、ロシアのウクライナ侵攻、特に、市民への虐殺を、絶対的な意味で許せません。

I cannot tolerate, in an absolute sense, Russia's invasion of Ukraine, especially its massacres of its own citizens.

また、戦争当事者でない国の国民として、現時点で日本国内の報道は、概ね事実だろう、と考えています。

Also, as a citizen of a country that is not a party to the war, I believe that the reports in Japan at this time are probably generally true.

しかし、私が、それを大声で叫び出さない(コラムの執筆、寄稿等)で、個人的な支援に徹している理由は、

But the reason I don't shout it out loud (writing columns, contributing, etc.) and stick to personal support is

―― 世界各国の政府発表(プロパガンダ)に騙され続けてきた

"I have been continuously deceived by government announcements (propaganda) from all over the world"

という、過去の苦い思い出があるからです。

I have bitter memories of the past like the above.

-----

「政府がいつもウソをつく」とは思っていませんが、戦争(国防)に関しては、どの政府も高い頻度でウソをつきます。

I don't believe that "governments lie all the time," but when it comes to war (national defense), every government lies with high frequency.

そして、私も、結構、チョロい感じで騙されてきました。

And I, too, have been cheated, quite easily.

ちなみに、「個人的な支援」については、今はお話できません。

By the way, I cannot talk about "personal support" at this time.

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

「野心的な目的をもつプロジェクトチームを統率してきたマネージャと」と「目の前のデータを、望むような形で計算することができるプログラマー」

"A manager who has led a project team with ambitious objectives" and "a programmer who can compute the data in front of him/her in any way they wants."

どちらに市場価値があり、どちらの市場規模が大きいのか?

Which has more market value and which has a larger market size?

私は、これまで、ずっと考え続けてきました。

I have been thinking about this for a long time.

-----

内館牧子さんの小説『終わった人』は、私の世代における最大級の『ホラー小説』です。

Makiko Uchidate's novel, "The Finished Man," is one of the greatest "horror novels" of my generation.

―― 日本最高学府の学歴や、一流会社のハイキャリアが、定年後の再就職の最大の障害になる

"Academic background from Japan's highest academic institution and a high career at a prestigious company become the biggest obstacles to re-entering the workforce after retirement"

という話が、登場します。

The story appears in the book.

この小説の主人公だって、『どんな仕事でもやります』と言っているのに、中小企業の会社の社長は、ことごとく採用を躊躇します。

Even the protagonist of this novel says, 'I'll do any job,' but the president of the small business firm hesitates to hire him at every turn.

その気持ち、とても理解できます。

I understand their feeling very well.

だって、社長としては、会社の経営に口を出されたら、嫌ですよね。

Even they would not like to be told how to run their companies.

しかし、再就職を希望するシニアは、会社の経営に口を出すつもりはなく、言われたことをやると思います。

However, I believe that seniors who want to be rehired will do what they are told, with no intention of meddling in the management of the company.

しかし、現場が忖度をしてしまうのです。

However, the people on the field make the conjecture.

これは『逆差別』―― ではなくて、『エリート差別』?

Is this "reverse discrimination" or "elite discrimination"?

-----

私が中小企業の社長であれば、どんなシニアが欲しいか? と考えると、

If I were the president of a small business, what kind of senior would I want?

■新人のように謙虚で、元気で、ちょっと弾けているところもあるけど、

- humble, energetic, and even a little bouncy in some ways, like a rookie.

■注意すれば直ぐに方向転換をし、あまり目立たずに、金に繋がる成果を上げても、それを吹聴しないで、淡々として、

- Change direction quickly if someone pay attention to them, and if achieve something that leads to money without being too obvious, don't blow it out of the water, just go about it nonchalantly, and don't even try to get you to pay attention.

■分からないことがあれば黙って勉強し、それでも分からなければ、若者に素直に頭を下げて教えを請うことができて、

- Study it quietly, and if don't understand, honestly bow down to the young man and ask him to help.

■メンタルでもフィジカルでも、ロバストな

- Robust, both mental and physical.

そんな「シニア」なら、欲しいと思います。

I would want such "seniors".

これからは、新人もシニアも『即戦力』で計られる時代であり、私たちシニアに求められているロールモデルは、

In the future, both newcomers and seniors will be measured by their "readiness to work," and we seniors are expected to be role models, like

『清濁併せ呑むことのできる、老獪な新人』

Newcomers who are required to be broadminded enough to associate with people of all sorts for the sake of working out a compromise.

だと思うのです。

I think.

-----

「野心的な目的をもつプロジェクトチームを統率してきたマネージャと」と「目の前のデータを、望むような形で計算することができるプログラマー」

"A manager who has led a project team with ambitious objectives" and "a programmer who can compute the data in front of him/her in any way they wants."

どちらに市場価値があり、どちらの市場規模が大きいのか?

Which has more market value and which has a larger market size?

市場価値については、私は分かりません。

I do not know about market value.

しかし、市場規模が大きいのは、『命じられた業務を、サクっとやりとげるシニア』だと思うのです。

However, I think the largest market is for "seniors who can quickly complete tasks that are assigned to them.

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

https://teratail.com/questions/2m8dsx1urnslib

一応動いているソースコード

// main.go

package main

import (
	"flag"
	"fmt"
	"log"
	"net/http"
	"net/url"

	"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 echo2(w http.ResponseWriter, r *http.Request) {
	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)
		err := conn2.ReadJSON(&gl2)
		if err != nil {
			log.Println("ReadJSON:", err)
			break
		}
		fmt.Println("echo2:", gl2)
		//time.Sleep(time.Second * 10)
	}

}

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

func dummyClient() {
	_ = websocket.Upgrader{} // use default options

	flag.Parse()
	log.SetFlags(0)
	u := url.URL{Scheme: "ws", Host: *addr, Path: "/echo2"}
	log.Printf("connecting to %s", u.String())

	c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
	if err != nil {
		log.Fatal("dial:", err)
	}
	defer c.Close()

	for {
		gl := new(GetLoc)

		gl.ID = 101
		gl.Lat = 181.0
		gl.Lng = 181.0
		gl.TYPE = "BUS"
		gl.POPUP = 101

		err := c.WriteJSON(gl)
		if err != nil {
			log.Println("write:", err)
			break
		}
	}

}

func main() {
	http.Handle("/", http.FileServer(http.Dir(".")))

	http.HandleFunc("/echo2", echo2)
	//go dummyClient()

	log.Println("server starting...", "http://localhost:5000")
	log.Fatal(http.ListenAndServe("localhost:5000", 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>
<body>
    <form>
        <button id="open">open</button>
        <button id="send">send</button>
        <button id="close">close</button>
    </form>

    <script>  

        var ws;

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

        // websocketのオープンイベントが発生したら
        ws.onopen = function(evt) {
            // 何もしない
            print("OPEN");
            console.log("OPEN");
            return false;
        }

        // "send"ボタンをクリックしたら
        document.getElementById("send").onclick = function(evt) {
            if (!ws) {
                return false;
            }
 
            var obj = {id:101,lat:181.0, lng:181.0,type:"BUS", popup:101}
            var json_obj = JSON.stringify(obj);            
            ws.send(json_obj);
            return false;
         };
        
        // "close"ボタンをクリックしたら
        document.getElementById("close").onclick = function(evt) {
            if (!ws) {
                return false;
            }
            // websocketを閉じる
                
            ws.close();
            console.log("CLOSE")
            return false;
        };
   
    </script>
</body>
</html>

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

leafletの地図上に、マウスでクリックするとマーカーが出てきて、マーカーをクリックするとマーカーが消える、というJavaScript

var map = L.map("map", {
        attributionControl: false,
        zoomControl: false
        }).setView(new L.LatLng(35.654543, 139.795534), 18);
        // }).setView(new L.LatLng(35.598563, 139.475528), 18); 広袴

        L.tileLayer('https://{s}.tile.osm.org/{z}/{x}/{y}.png', {
         detectRetina: true,
         maxNativeZoom: 18
        }).addTo(map);

        var leafletView = new PruneClusterForLeaflet(1,1);  // (120,20)がデフォルト

        //地図のclickイベントでonMapClick関数を呼び出し
        map.on('click', onMapClick)
        
        function onMapClick(e) {
            //地図のclickイベント呼び出される
            //クリック地点の座標にマーカーを追加、マーカーのclickイベントでonMarkerClick関数を呼び出し
            var mk = L.marker(e.latlng).on('click', onMarkerClick).addTo(map);
            console.log("click:",e.latlng)
        }

        function onMarkerClick(e) {
            //マーカーのclickイベント呼び出される
            //クリックされたマーカーを地図のレイヤから削除する
            map.removeLayer(e.target);
            console.log("remove:",e.target)
        }

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

先日、ヨーロッパにある店舗に発注手続をして、送金しようとクレジットカードを使おうとしたら、エラーで弾かれ続けて困りました。

The other day, when I tried to use my credit card to send money to a store in Europe after completing the order process, I was troubled by the fact that it kept getting rejected with errors.

店舗の居所は公開されていなかったのですが、もしかしたら、例の『世界中から金融制裁を受けているあの国』だっかもしれません。

The location of the store was not disclosed, but it might have been "that country that is under financial sanctions from all over the world".

「ビットコインでの支払いもできる」と書いてあったので、こちらで試みようとしました。

It said, "You can also pay in Bitcoin," so I attempted the method.

以前、テスト用に5000円程度購入したお金が、まだいくらか残っていたので。

I still had some money left over from a previous purchase of about $5,000 for testing.

ところが、システムから『残金が足りない』と言われました。

However, the system told me, 'The balance is not enough.

変だなー、と思って調べてみたところ、『送金コストが、購入物の値段より高い』ということが分かり、ビックリしました。

I thought this was strange, so I looked into it and was surprised to find that "the cost of remittance was higher than the price of the purchased item.

『ビットコインは送金コストが安い』が、最大のウリだったと思っていたので。

I thought 'Bitcoin has low remittance costs' was the biggest selling point.

もっとも、これは、ビットコインが理由ではなく、取扱い店舗の手数料かもしれませんが、ともあれ、ビットコインの送金もあきらめて、この取引を取り止めました。

This may not have been because of the bitcoin, but because of the fees charged by the store. Anyway, I gave up on the bitcoin transfer and canceled this transaction.

-----

(1)クレジットカードの使用を停止されると、小売店舗なんぞは簡単に干上がりそう

(1) If retail stores are force to stop using credit cards, they are going to dry up easily.

(2)ビットコインは、決済手続の抜け道として、使えそう

(2) Bitcoin could be used as a loophole in payment procedures.

という、現在、ニュースで報道されていることを、実体験することができました。

This was a real experience of what is currently being reported in the news.

-----

先程、お世話になった方に、Amazonギフトを使って御礼を送付しました。

I just sent "a thank you" to the person who helped me with an Amazon gift.

手続30秒でした。

The procedure took 30 seconds.

『本当に、ラクだなぁ』

"It's really, really easy."

と実感しています。

I realize that.

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

プログラムのバグというのは、本当にささいなものです。

A bug in a program is really a small thing.

カリフォルニアの1/3を大停電を発生させた原因のバグが、「たった3行のプログラム」であったことは有名ですが、私は驚きません。

I am not surprised that the bug responsible for causing a major blackout in 1/3 of California was famously "just three lines of programming".

というのは、私は3日間ぶっつづけで、3つのプログラムのトレースを100回以上チェックして、データの読み込みタイミングのズレを見つけて、

Because I spent three days straight checking the traces of three programs over a hundred times to find the timing discrepancies in reading the data, and

―― JavaScriptの1行をコメントアウトしただけで、プログラムはあっさりと動き出しました。

"I commented out one line of JavaScript and the program started working easily."

「PrumeMobileのサーバ化」もどきの実装に目処が立ちました

で、残っているものは、山のようにつけ加えた(全く関係のなかった)変数や、膨大なプリントアウトメッセージが書き込まれている、とても汚ない不様なプログラムリストです。

So, what is left is a very dirty, ugly program list with a mountain of added (and totally unrelated) variables and a huge number of printout messages written on it.

これから、これを、未来の私が読める程度に、キレイにしてサーバにアップするという、あまり楽しくない作業が残っています。

Now I have the not-so-fun task of cleaning it up and uploading it to the server so that future for me.

-----

文部科学省のプログラミング教育というのは、このような、プログラム開発の現状を無視しています。

Programming education by the Ministry of Education, Culture, Sports, Science and Technology (MEXT) ignores this current state of program development.

そして、「プログラム的思考」なるものを教えることができる、と、思っているようです。

And they seem to think that they can teach something that is "programmatic thinking".

ただ、文部科学省としては、『それしか、やりようがない』というのは、私にも理解できます。

However, I understand that the Ministry of Education, Culture, Sports, Science and Technology says, 'That's the only way to do it'.

もし、プログラム開発のフロント現場のリアルを、子どもたちに強いたりしたら、全員が逃げだすことを、私は受けあいます。

I assure you that if the MEXT force children to experience the realities of the front lines of program development, they will all run away.

だから、

So, I think,

―― まあ、そういうこと(「プログラム的思考」)が本当に実現できれば、子どもと文部科学省の両方に、心の底から『おめでとう』と言える

"Well, if such a thing can really happen, I can say 'congratulations' from the bottom of my heart to both the child and the Ministry of Education"

と思っています。

10年後を楽しみに待つとしましょう。

Let's wait and see what happens in 10 years.

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

PrumeMobileのサーバ化

から、1日もあれば、動かせるだろうと思ったのですが、そこから、redisのパブサブ、Golangのmap、JavaScriptの改造、えらい目に会いましたが、ようやく目処が立ちました。

PrumeMobileは、Webのメモリを使うので、単なるWebサーバのようには取り扱えないので、色々工夫をしました。デバッグで苦労しました。

嬉しい気持ちは、直ぐに消えてしまうので、消える前に記録しておきました。