2020/11,江端さんの忘備録

最近、巷(ちまた) ―― というか、特に米国と欧州でで、GAFA(ガーファ)による市場独占の問題が大きく取り上げられています。

Recently, the issue of market monopoly by GAFA has been widely discussed on the street -- especially, in the US and Europe in particular.

GAFAとは、Google, Apple, Facebook, Amazon の4つのプラットフォーマのことです。

GAFA refers to the four platformers of Google, Apple, Facebook and Amazon.

まあ、実際に市場を独占していますし、プラットフォーマの特権的地位を用いて、小売店舗に対して優位的に振る舞っているのは事実だと思います。

Well, I think it's true that GAFA actually dominates the market and uses the privileged position of platform formers to act as an advantage over retail stores.

皮肉なことに、私が、「プラットフォーマの特権的地位」についての具体的な例を知ったのは、GAFAではなく"R"でした。

Ironically, it was "R", not GAFA, that I learned of the specific example of the "privileged status of platformer".

今年の1月、『楽天が一定額以上買物をすると送料を一律で無料にする方針』に対して、小売店の組合が『優越的地位の濫用』になるとの抗議を行いました。

In January of this year, the retailer's union protested that it would be an 'abuse of a superior position', in response to Rakuten's policy of "free shipping on purchases over a certain amount,

これを受けた公正取引委員会が、楽天に対して緊急停止命令の申立てを東京地方裁判所に行いました。

In response to this, the Fair Trade Commission filed a "Petition for Emergency Stay Order against Rakuten" with the Tokyo District Court.

-----

既視感があります ―― 私には、1995年の、Windows95発売時の騒乱が、思い浮んできます。

I have a sense of deja vu -- I think of the mayhem of 1995, when Windows 95 was released.

その後、マイクロソフト社は、「Windows OSの特権的地位による独占」を理由に、米国や欧州で訴訟されまくっていました。

Subsequently, Microsoft was being sued all over the U.S. and Europe for "monopoly due to the privileged status of the Windows OS".

「ブラウザ(Internet Explore)の同梱問題」が大きかったです。

The "browser (Internet Explorer) bundling problem" was a big one.

事実、ブラウザは、世界を支配しているツールです。

In fact, browsers are the tool that rules the world.

多分、多くの人が気がついていないかもしれませんが、今や、ブラウザは、「デジタル社会」 ―― というよりも、「デジタル技術」を先導しています。

Perhaps many people don't realize it, but browsers are now leading the way in "digital technology" rather than the "digital society".

リアルタイムゲームだけではなく、例えば、地図上に100万オブジェクトを同時に表示することを可能とする、「スケーラブルリアルタイムのデジタルサービスの基盤」です。

It's "the foundation of scalable real-time digital services" that allow, for example, to display a million objects on a map simultaneously, as well as real-time games.

私は、Sさんの勧めで、WASM(Webアセンブラ)によるプログラムを試した時の衝撃を忘れることができません。

I'll never forget the impact I had when I tried to program in WASM (Web Assembler) on Mr. S's recommendation.

ちなみに、このプログラム、皮肉なことに、Internet Explore"だけ"動きません。

By the way, this program doesn't work, ironically, only on "Internet Explore".

それ以外のほとんどのブラウザ(Chromo, Firefox、Edge、Safariその他)では表示されます。

Most other browsers (Chromo, Firefox, Edge, Safari, etc.) will show it.

しかし、多くの企業が、業務系の基本ブラウザとして、Internet Exploreが採用しているため、今更、これを変更することができません。

However, many companies have adopted Internet Explorer as the basic browser for their business systems, so it is not possible to change this now.

これが、いわゆる「OSの独占」の一形態(成功例?)と言えます。

This is a form of so-called "monopoly by OS" (a success story?) .

それはさておき。

Aside from that.

-----

GAFAが市場を独占していることは、誰の目からみても明らかでしょう。

By all accounts, it should be clear that GAFA has a monopoly on the market.

ついでに言えば、

In addition,

―― 我が国最大のサービスプラットフォーマであるはずの日本国政府が、Amazonに負けている

"The Government of Japan, which should be Japan's largest service platformer, is losing to Amazon"

ということも事実です。

It is true.

勿論、『このような比較は不当である』ということは承知の上、だとしてもです。

Of course, even if I know that "such a comparison is unreasonable".

(続く)

(To be continued)

2020/11,江端さんの技術メモ

2年前のコードをAWS Lightsailに乗せられないか、docker compose up -d  を試してみたところ、変なところでエラーが出てきた。

go build cmd/server/main.go

と打ち込んでみたら

というところで、引掛っていることが分かった。

原因をググってみた「メモリ不足」。

最低でも1G用意しろ、って書いてあった。

Amazon Lightsailの一番安いやつは、512MBだった。

まあ、今時、ノートPCだって、4G搭載しているからなー、これはないかなー 。

しかし、搭載を断念するのも残念だしなー、安全を考えると2GBは欲しいしなー ・・・でも、10ドル/月かぁ。

ちょっと考えよう。

Lightsail のインスタンスのスケールアップ

(後日談) 1MBのメモリを持つ、5$/月 の インスタンスにスケールアップして、docker compose up -d を通しました。

# いや、実装に成功していたラズパイのメモリが1GBだったので、多分大丈夫だろうと踏みました。

―― が、コンテナが起動していないので、ここからが勝負です。

 

2020/11,江端さんの忘備録

駅に設置されている男性の小便器を見ると、いつでも私は頭の中でシミュレーションをしてしまいます。

Anytime I see a male urinal installed in a train station, I run a simulation in my head.

女性の方は知らないかもしれませんが、駅に設置されている男性の小便器というのは、だいたい"3つ"です。

Women may not know this, but there are usually three male urinals installed in stations.

そして、この3つの小便器を見る度に考えるのです。

And every time I look at these three urinals, I think.

------

■この3つが全部空いている時、どの小便器を使用するのが最適戦略か?

- Which urinal is the best strategy to use when all three of these are available?

■真ん中が使用中の時、左右どちらの小便器を使用するのが最適戦略か?

- Which urinal is the best strategy to use, left or right, when the middle is in use?

■水が流されている途中の小便器は回避すべきか否か?

- Should you avoid urinals while the water is flowing?

そして、小便器の平均使用時間、年齢別の分散、使用される時間帯の混雑率等を勘案して、

Then, taking into account the average time of use of urinals, the dispersion of urinals by age, and the congestion rate at the time of use

これらの、小便器を使用する男性のエージェントプログラムに組込む推論エンジンは、

Which of these is the best reasoning engine to build into these, urinal-using male agent programs ?

■行動を言語記述するルールベース推論が良いか、

- Rule-based reasoning to describe behavior verbally

■あるいは、観測結果から挙動を導く強化学習が良いか、

- Alternatively, reinforcement learning to derive behavior from observations

■あるいは、行動経済学の振舞をモデル化するエージェントが良いか、

- Or, virtual agents to model behavioral economics

とか、考えるのは ―― 楽しい。

It is fun for me to think about those things.

-----

さすがにトイレにカメラを設営することは許されませんが、小便器に設置された人間センサの時間のデータがあれば、そこそこの仮説と検証ができると思うのですよ。

As you can imagine, we are not allowed to set up a camera in the toilet. However, if we had data on the time of the human sensors installed at the urinal, I think I could hypothesize and test it there.

という訳で、トイレ便器メーカーの皆様。

So here's a request to all toilet bowl manufacturers.

私に、その時系列人間センサーの反応時間のデータ、開示して貰えませんか?

Would you mind releasing that time-series human sensor response time data to me?

え? そんなデータ、計測していない?

Huh? You're not measuring that kind of data?

いえいえ、計測しているハズですよ。

No, no, I'm sure you are measuring it.

男性の小便器の使用率は、御社にとって重要なデータですよね。

The use rates of male urinals are important data for your company.

待ち行列理論を適用して、各駅で必要な小便器を算出する必要があるからです。

This is because you need to apply queuing theory to calculate the urinals needed at each station.

『重要なデータであるからこそ、江端に開示する理由がない』

"There's no reason to disclose it to Ebata because it's important data"

ああ、確かにそれはそうかもしれません。

Oh, that's certainly reasonable.

-----

それなら、私が、独自で、トイレで観察し続けるしかないかないかなぁ。

Then I guess I'll just have to keep observing, independently, in the restroom.

でも、確実に、警察に通報されるだろうなぁ。

But for sure, I'm sure they'll call the police.

私ですら、『そんな不審者がいたら、絶対通報する』と思う。

Even I think, "If I find a suspicious person like that, I'm definitely going to call the police".

2020/11,江端さんの技術メモ

地図データの入った PostgreSQL + postGIS サーバ を関係者に配るために、Docker containerのイメージを公開する(サーバ構築手順書を作成するのが面倒だから)

1.コンテナイメージの確認

C:\Users\ebata>docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6432e639f678 postgis-pgrouting:latest "docker-entrypoint.s…" 3 months ago Up 6 hours 0.0.0.0:15432->5432/tcp toyosu_db_1

2.コンテナイメージのパッキング(commit)

C:\Users\ebata>docker commit 6432e639f678 tommurphy/toyosu_db_1
sha256:c7a1a0537fbe24d0c1371264cbd83e620a09e2ec5c328b5fbb42efb0e9454f8e

3. dockerへのログイン

C:\Users\ebata>docker login -u tommurphy
Password:
Login Succeeded

4. 外部への公開

C:\Users\ebata>docker push tommurphy/toyosu_db_1
The push refers to repository [docker.io/tommurphy/toyosu_db_1]
fcc5c725337c: Layer already exists             

fcc5c725337c: Layer already exists
a3994f456ccb: Layer already exists
.....
latest: digest: sha256:27a46f90aa1c7c9f9b5fa92877d22156144b882ba15ba4e04fe0e4fe2cb4af24 size: 4497

5. 確認

https://hub.docker.com/にアクセス

5. 相手側への連絡

「dockerをインストールしたマシンで、"docker pull tommurphy/toyosu_db_1" とコマンド投入しろ」

「で、そのあと、$ docker run -it tommurphy/toyosu_db_1 bash とコマンド投入しろ」

 

と連絡する。

(とりあえず、Windows10で作ったイメージを、Amazon Lightsailの ubuntu20.04に入れることまでは成功した。動くかどうかは不明)

→ ダメ。データベースすっからかんのコンテナができた。もうちょっと嵌る必要があるなぁ

というか、そもそもDockerコンテナとはそういうものらしい("docker" "postgresql" "永続化"、あたりでググってみる)

現在、PostgreSQLをデータごとDockerコンテナ化するを読んでいる。

 

 

2020/11,江端さんの技術メモ

私が使っているQGIS3の地図と地物情報を、先方に送りたいのですが、先方に「DB構築してくれ」とは言えない場合があります(というか、殆どの場合がそうだろう)。

# で、今、実際にそんな状況になっている。

最初、qgzファイルを送付すれば足る、とか思っていたのですが、甘かったようです(qgzファイルはプロジェクト情報しか送付できない)

で、QGIS3を色々触っているうちに、なんかファイルができたような気がするので、自分用のメモとして残しておきます。

以上(現在、先方の成否報告待ち)。

キーワード:gpkg QGIS3 地物情報 先方にメールで送付

 

2020/11,江端さんの忘備録

私が先日記載した「願い」は、どうやら叶わないような感じです。

The "wish" I mentioned the other day is apparently not going to come true.

「私の最悪の予想」の何パーセントくらいのとろで留まるか ―― ということになりそうです。

My interest is going to "What percentage of "my worst expectation" will stay?"

-----

こちら、ある団体から講演を依頼された時に使用したプレゼンテーションファイルです。

This is the presentation file I used when I was asked to give a lecture by an organization.

『気持悪い』アメリカ合衆国大統領選挙の仕組み

"Unpleasant" United States presidential election mechanism

御興味あれば、ご一読下さい。

If you are interested, please read it.

-----

江端:「どうして、今回の合衆国大統領選挙は、11月3日なんだっけ?」

Ebata: "Why is this US presidential election on November 3rd?"

娘:「うーん、日本の『文化の日』にちなんで、かな?」

Daughter: "Hmm, maybe it's Japan's "Culture Day""

江端:「昔だけど、相当数の米国人が『日本の首都は北京』と答えた、という話を聞いたことがあるぞ」

Ebata: "Once upon a time, I've heard that quite a few Americans answered, 'The capital of Japan is Beijing'"

娘:「・・・」

Daughter:"..."

江端:「今も、米国民の日本に対する興味って、その程度だと思う ―― ましてや、日本の祝日を知っているネイティブは、絶無だと思う」

Ebata: "I think that Americans are still interested in Japan at most-even more, and I also think that there are no natives who know Japanese holidays."

2020/11,江端さんの忘備録

(昨日の続きです)

(Continuation from yesterday)

―― とは言え、AWSの自習の為に、月数千円を持っていかれるのは、なんとも悔しいな

"However, it is regrettable to bring thousands of yen a month for AWS self-study."

と思っていたところ、見つけたのが、Amazon Lightsailです。

When I was thinking, I found Amazon Lightsail.

3.5ドル(500円)/月のサーバであり、これなら、自腹を切っても、耐えられる範囲です。

It is a server of 3.5 dollars (500 yen) / month, which is a range that can withstand even if I run out of my own stomach.

うん、これ、いい。

Yeah, this is good.

そもそも、私は、サーバを外部からのサイバー攻撃から守る気がない。

In the first place, I have no intention of protecting the server from external cyber attacks.

システム破られたって、困るような情報なんぞ最初から入れないし、ソースコードに至ってはgithubで公開しているくらいです。

Even if the system is broken, I can't enter any information that would be a problem from the beginning, and the source code is published on github.

仮想サーバのコア(EC2相当)なんぞ1つあれば十分だし、DBはコアの中に作りこんでしまえばいい。

One core (equivalent to EC2) of the virtual server is enough, and the DB can be built in the core.

なにより、ファイアウォールとして使っているロードバランサの設定も、Route53の設定もやりたくありません。

Above all, I don't want to configure the load balancer used as a firewall or Route53.

-----

という訳で、この11月始めの連休は、Amazon Lightsail上に、試作したサーバを搭載して、数千のオブジェクトのデータで攻撃し続けるという、「えげつない」テストを繰り返していました。

So, this weekend in early November, I was repeating a "bad" test of installing a prototype server on Amazon Lightsail and continuing to attack with data of thousands of objects.

当然、通信障害は発生した(させた)のですが、サーバがダウンするようなことはありませんでした。正直『凄いな』と、感心しています。

Of course, a communication failure occurred (caused), but the server did not go down. To be honest, I'm impressed with how amazing it is.

-----

で、ここで、冒頭の話に戻ります。

So, let's get back to the beginning.

「ラズパイを使った自宅サーバの方に、開発方向をシフトさせる」を、さらに再度逆転し「クラウドを使う」がスコープに入ってきました。

"Shifting the development direction to the home server using Raspberry Pi" is coming into scope of "using the cloud".

500円/月で、プライベートなインターネットサーバで遊べ・・・もとい、運用できるのであれば、私には十分です。

For 500 yen / month, I can play on a private internet server ... If I can operate it, it's enough for me.

2020/11,未分類,江端さんの技術メモ

以下、自分用のメモのみ

AWS  Lightsailにdockerのインストールまで成功

PostgreSQLのインストールも成功したと思う

が、ここから嵌り始める。

ca_sim=# create extension postgis;

^C^CCancel request sent
Cancel request sent
ERROR: canceling statement due to user request
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Failed.
!>

が出てきて、

サーバ側に
2020-11-04 12:52:16.858 UTC [51] ERROR: canceling statement due to user request
2020-11-04 12:52:16.858 UTC [51] STATEMENT: create extension postgis;
2020-11-04 12:53:53.365 UTC [1] LOG: server process (PID 51) was terminated by signal 9: Killed
2020-11-04 12:53:53.365 UTC [1] DETAIL: Failed process was running: create extension postgis;
2020-11-04 12:53:53.365 UTC [1] LOG: terminating any other active server processes
2020-11-04 12:53:53.367 UTC [25] WARNING: terminating connection because of crash of another server process
2020-11-04 12:53:53.367 UTC [25] DETAIL: The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.
2020-11-04 12:53:53.367 UTC [25] HINT: In a moment you should be able to reconnect to the database and repeat your command.
2020-11-04 12:53:53.371 UTC [53] WARNING: terminating connection because of crash of another server process
2020-11-04 12:53:53.371 UTC [53] DETAIL: The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.
2020-11-04 12:53:53.371 UTC [53] HINT: In a moment you should be able to reconnect to the database and repeat your command.
2020-11-04 12:53:53.372 UTC [56] WARNING: terminating connection because of crash of another server process
2020-11-04 12:53:53.372 UTC [56] DETAIL: The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.
2020-11-04 12:53:53.372 UTC [56] HINT: In a moment you should be able to reconnect to the database and repeat your command.
2020-11-04 12:53:53.516 UTC [1] LOG: all server processes terminated; reinitializing
2020-11-04 12:53:53.535 UTC [58] FATAL: the database system is in recovery mode
2020-11-04 12:53:53.538 UTC [57] LOG: database system was interrupted; last known up at 2020-11-04 12:47:18 UTC
2020-11-04 12:53:53.607 UTC [57] LOG: database system was not properly shut down; automatic recovery in progress
2020-11-04 12:53:53.613 UTC [57] LOG: redo starts at 0/216DCD0
2020-11-04 12:53:53.712 UTC [57] LOG: invalid record length at 0/24F2310: wanted 24, got 0
2020-11-04 12:53:53.712 UTC [57] LOG: redo done at 0/24F22D8
2020-11-04 12:53:53.741 UTC [1] LOG: database system is ready to accept connections

そこで、

コンテナの外に出て、

sudo apt-get clean
sudo apt-get install postgis
sudo apt-get update

■全部のDockerを止める
C:\Users\ebata>docker ps -aq | xargs docker stop
C:\Users\ebata>docker ps -aq | xargs docker rm (これやると、これまでの設定も全滅するので注意)

もう一度、imageから作り直して ・・(30分経過)・・ううむ、それでもダメか。

今日はここで一旦引き上げ

2020/11,江端さんの技術メモ

正直手続忘れてしまったけど、一応historyからメモを作成しておきます。
https://docs.docker.com/engine/install/ubuntu/

$ sudo apt-get remove docker docker-engine docker.io containerd runc
$ sudo apt-get update
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

ここからコケ始めました。

$ apt-cache madison docker-ce

の後、

$ sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io

を入力したら、予想通り失敗しました。

(ちょっと一息)

$ apt-cache madison docker-ce

を入力した時、一番最初に表示された"5:19.03.13~3-0~ubuntu-focal" を訳も分からずに、置き換えしました。

$sudo apt-get install docker-ce=5:19.03.13~3-0~ubuntu-focal docker-ce-cli=5:19.03.13~3-0~ubuntu-focal containerd.io

でもって、

$ sudo docker run hello-world

をして、コメントに出てくる通りに、

$ docker run -it ubuntu bash

を実施しても"Got permission denied....." とか言われて、dockerのコンテナの中に入ることができませんでした。

$ docker ps

Got permission denied while trying to connect to the Docker daemon
socket at unix:///var/run/docker.sock:
Get http://%2Fvar%2Frun%2Fdocker.sock/v1.39/containers/json:
dial unix /var/run/docker.sock: connect: permission denied

てなエラーが出てくるので、このエラーメッセージで検索したところ、

# dockerグループへユーザを追加
$ sudo gpasswd -a ubuntu docker

# グループの追加ができたことを確認
$ id ubuntu

と入力して、(ここ大事)

# 一回ログアウトして再ログインする
$ exit

して、再度

$ sudo docker run hello-world
$ docker run -it ubuntu bash

をしたら、今度はコンテナの中に入ることができました。

ubuntu@ip-172-26-13-137:~$ docker run -it ubuntu bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
6a5697faee43: Pull complete
ba13d3bc422b: Pull complete
a254829d9e55: Pull complete
Digest: sha256:fff16eea1a8ae92867721d90c59a75652ea66d29c05294e6e2f898704bdb8cf1
Status: Downloaded newer image for ubuntu:latest
root@e9ff5fa891d0:/# ;s
bash: syntax error near unexpected token `;'
root@e9ff5fa891d0:/# ls
bin   dev  home  lib32  libx32  mnt  proc  run   srv  tmp  var
boot  etc  lib   lib64  media   opt  root  sbin  sys  usr

よく分からんけど、これで、Amazon Lightsailの中にDockerをインストールすることができたんだろう・・・と思っています。

2020/11,江端さんの忘備録

こちらのコラムで、私が、実家の見守りシステムを作る際に、自分のWebサイトのVPSの利用に「失敗した」という話を書いています。

In this column, I wrote that I "failed" to use the VPS on my website when creating a home watching system.

でもって、ラズパイを使った自宅サーバの方に、開発方向をシフトさせるに至りました ―― まあ、そのおかげで、この連載の記事が執筆できたのですが。

Therefore, we have shifted the development direction to the home server that uses Raspberry Pi. Well, thanks to that, I was able to write an article in this series.

ここ一年の間、Amazon Web Service(AWS)の、Amazon Elastic Compute Cloud(EC2)とLBS(ロードバランサ)を使ったシステムを使って、色々やってきたのですが、先日、1年間の無料使用期間が終了して、有料モードに突入してしまいました。

For the past year, I've been using Amazon Web Services (AWS), a system that uses Amazon Elastic Compute Cloud (EC2) and LBS (load balancer). The other day, the one-year free usage period has expired and I have entered the billing phase.

実は、それに気が付かずに、3~4ヶ月くらい5000円/月の課金を喰らっていたことを知って、先日あわててアカウントを抹消しました。

Actually, I didn't notice it and learned that I was charged 5,000 yen / month for about 3-4 months, so I hurriedly deleted my account the other day.

練習用に使っていただけなのに、結構な損金になりました。

Though I only used it for practice, it was a considerable loss.

-----

そもそも、私、"AWS"というものが苦手です。

In the first place, I'm not good at "AWS".

"AWS"というのは、「ビルデイングブロック」で作るサーバです ―― イメージ的に言えば、「電子ブロック」のような感じです。

"AWS" is a server created by "building blocks". In other words, it feels like an "electronic block".

「電子ブロック」は、よく(便利に)使われるメタファですが、これが現実世界で運用するとなると、悪夢のような状態になるのです。

An "electronic block" is a metaphor that is often (conveniently) used, but when it comes to operation in the real world, it becomes a nightmare.

―― ブロックがたった一つでも動かないと、サーバシステム全体が動かない

"The entire server system will not work unless even one block works"

"TLS認証"で、"ロードバンサー"で、"ドメイン登録"で、私がどれほど「動かないサーバ」に恐怖しながら、闘ってきたかは、これまでも、たびたびお話ししたと思います。

I've often talked about how scared I was of "non-working servers" with "TLS authentication", "road bangsar", and "domain registration".

-----

『てやんでい! サーバ構築なんてもんはなぁ、コンソールのシェルが2つ、3つ立ち上がっていればいいんでい!』

"Shut up! I only need two or three console shells up to build a server"

という、1980年代のコマンドインターフェース型のUNIXサーバ構築の技だけで生き残っているロートルには、"AWS"のようなサーバ構築手法は、本当に"辛い"のです。

In this way, for the elderly who survived only with the command interface type UNIX server construction technique of the 1980s, the methods like "AWS" are really "hard".

まあ、とは言え、こういうセリフを語り出した時から、人間はジジイ化する訳で ――

However, if I start talking about these lines, I become "old farts"

『ジジイ化を自分に許してしまったエンジニア』は、そこで『試合終了』となります。

"the engineer who allowed himself to become old farts" is going 'game over'.

『試合終了』が嫌なのであれば、週末でも、大型連休でも、就業後の深夜でも、エンジニアは、闘い続けなければなりません。

If I don't like the 'game over', then engineers have to keep fighting, even when it's a weekend, a major holiday, or late at night after work.

(続く)

(To be continued)