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

新しいデバイス(スマホ、PC)を使う時に、ワクワクしていたのはいつごろまでだったかな、と思いながら、社用スマホの交換作業を行っていました。

I was replacing a company phone, wondering how long it had been since I was excited to use a new device (smartphone or PC).

充電を2時間経過すると、使いものにならなくなったので、会社に『バッテリー交換』を依頼していました。

After two hours of charging, it became useless, so I had to ask the company to 'replace the battery'.

しかし、『使用期間を越えているので、機器交換にしてくれると、こっちも面倒がなくて助かる』というニュアンスの回答がきましたので、それに応じました。

However, I received a nuanced response that said, "Since it is beyond the period of use, it would be helpful if you could replace the equipment so that we don't have to deal with it," so I agreed.

バッテリー交換をする、ということは、『社用スマホ』という超ド級の秘密情報を含むデバイスを第三者に預ける、ということになります。

When I replace the battery, I am entrusting my "company phone," a device that contains highly confidential information, to a third party.

当然、その守秘義務に関する契約が、想像を絶するほど面倒なものになる ―― ということは、想像に難くありません。

Of course, it is not hard to imagine that the confidentiality agreement would be unimaginably cumbersome.

これって、SDGs的にどうなの? とは思わなくはありませんが ――

From the SDGs viewpoint , what does this means ? I thought, however,

まあ、私の古いスマホは、完全初期化された後、バッテリー交換されて、タリバンが支配する地域などで、有効活用されるのだろう、と思っています ―― 廃車後の日本車と同様に。

Well, I'm sure my old phone will be fully initialized and the battery will be replaced and put to good use in areas controlled by the Taliban -- just like Japanese cars after they are scrapped.

-----

なにしろ、社用スマホは、会社のシステムと連携するデバイスですから、複雑なセキュリティ用ソフトをインストールしなければならず、3種類のパスワードを合計30回くらいは入力する必要がありました。

At any rate, since the company phone is a device that is linked to the company system, I had to install complicated security software and had to enter three different passwords a total of about 30 times.

正直、かったるかった、です。

To be honest, it was a bit of a chore.

加えて、私、スマホにトコトン興味がないので、基本的に前と同じ機種を選んで、以前のスマホのレプリカを作成していただけでした。

In addition to that, I, I, I'm not really interested in smartphones, so I basically just chose the same model as before and made a replica of my previous phone.

-----

本当にしつこいのですが、本気で『ガラケー復活しないかなぁ』と思っています。

I know I'm being really persistent, but I'm seriously wondering if flip phones will ever come back.

小さいし、耐用年数長いし、操作が単純だし、充電時間が短い。

It is small, has a long service life, is simple to operate, and takes a short time to charge.

動画や音楽、リモート会議は、PCかタブレットで十分です。

For video, music, and remote meetings, a PC or tablet will suffice.

LINEは、テキストが表示されれば十分ですし、スタンプなんぞいらん。

For LINE, it's enough to display text, and I don't need stamps.

ただ、『スマホの使用を前提とするサービスの研究開発をしている研究員』としては、『かなり矛盾していることを言っている』という自覚はあります。

However, as a "researcher working on the research and development of services based on the use of smartphones," I am aware that I am saying things that are quite contradictory.

-----

今回の交換の際、うっかりとして、電話帳の移行をすっかり忘れてしまいました。

During this replacement, I inadvertently forgot to migrate the phonebook.

いえ、今回は故意ではなく、私の過失です。

No, this time it was not intentional, it was just my fault.

そんでもって、現在、通話履歴だけで対応していますが ―― 困ったことに、『全然困っていない』です。

So, I'm currently using only the call history -- and the trouble is, I'm not having any trouble at all.

メールとLINEだけで、十分、生活できています。

Email and LINE are enough for my life.

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

今、スキマ時間(10分単位)を見つけて、2冊目の本をダラダラと書いています。

I'm currently finding time in the gaps (10-minute unit) to lazily write my second book.

その中で、Dockerの解説文を書いているのですが、なかなか良い内容と自負しておりますので、ご紹介致します。

In the article, I wrote an explanation of Docker. I am proud to say that the content is quite good, so I would like to introduce it here.

===== ここから =====

===== from here =====

ちなみに、Dockerのコンテナに関する私のイメージは

By the way, my image of Docker containers is

■『姉妹または兄弟の複数の愛人(バージョンの違うアプリケーション)に、気が向いた時だけに尋ねることができるマンション(妾宅)の一戸』です。

- A unit of apartment (concubine's house) where you can ask multiple mistresses (different versions of applications) of your sisters or brothers only when you feel like it.

■『マンションの戸の内側とのコミュニケーションは、インターホン(ポート番号)のみで行うという徹底ぶり』ですので、ホストOS(Windows10)への、環境変数(PATHやLIB)などの設定は不要です。

- Communication with the inside of the apartment building is thorough, using only the intercom (port number), so there is no need to set environment variables (PATH or LIB) for the host OS (Windows 10).

■(私たちエンジニアは、このことを「本宅(ホストOS)の環境を汚さずに済む」という言い方をします。)

- (We engineers refer to this as "not having to pollute the home (host OS) environment").

■同じOS(例えばWindows10)に2つ以上の異なるバージョンの同じアプリをインストールしたら、アプリを正確に立ち上げることもできないし、仮にできたとしても、設定環境がグッチャグチャで、多分、まともに動かすことはできません。

- If you install two or more different versions of the same app on the same OS (e.g. Windows 10), you won't be able to launch the app correctly, and even if you could, you probably wouldn't be able to run it properly because of the messed up configuration environment.

■また不要になったら、『愛人も含めてマンションの戸単位で消滅させることができるという、後腐れのなさ』も、良いです。

- When you don't come to need the app, you can 'make the whole apartment disappear, including your mistress,' so there's no aftermath.

===== ここまで =====

===== to here =====

Dockerコンテナの説明は、これで正しいと思いますが ――

I think this is the correct way to describe Docker containers -- however,

なんだか、「私の人格に問題がある」ような内容にも読めます。

Someone might think that "there's something wrong with Ebata's personality".

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

「やはり俺の青春ラブコメはまちがっている」は素晴しい作品です。

The books "My youth romantic comedy is wrong, as I expected" would be a masterpiece.

ただ、間違って頂きたくないのですが、私は、あのような主人公に「憧れている」のではありません。

I don't "admire" that main character. Please don't misunderstand me.

あのような作品を、「私が書きたかった」のです。

I wanted to write that kind of work.

まあ、「ラブコメ」というのは分からないし、上手く書けないし、正直書きたくないですが、あの主人公のマインド、価値観、世界観は、私が書きたかった、と思う。

Well, I don't know what a "romantic comedy" is, I can't write it well, and honestly I don't want to, however that main character's mindset, values, and worldview is what I wanted to write about

ただ、私が書くと、ベースは「ラブコメ」ではなくて、多分「東南アジア 一人旅」になると思うけど ―― うむ、読む人いるかな?

However, if I were to write it, it wouldn't be based on a "romantic comedy" but probably on a "solo trip to Southeast Asia" -- hmm, I wonder if anyone would read it?

-----

で、まあ、そこまで詳細に説明した上でならいいですが、

And, well, I hope you've explained it in such detail.

―― うちの父親が、「やはり俺の青春ラブコメはまちがっている」が凄い、って言っていた

"My father said that "My youth romantic comedy is wrong, as I expected" was great."

と、軽いノリで友人に語るのは、ちょっと躊躇して貰えないだろうか、長女。

I hope you will hesitate a little to tell your friends in a light-hearted way, my daughter?

お父さん、少し、恥しいんだが。

I'm a little embarrassed.

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

With hearing the following,

ネットワークスペシャリストだの、

Network specialist.

データベーススペシャリストだの、

Database specialists.

組み込み系エンジニアだの、

Embedded systems engineer.

クラウドエンジニアだの、

Cloud engineer.

AIエンジニアだの、

AI engineer.

IoTエンジニアだの、

IoT engineer.

AWSエンジニアだの、

AWS engineer.

仮想化エンジニアだの、

Virtualization engineers.

―― うるせい!

"Shut up!"

と思っています。

I think.

「やらなければならない」ことなら、「やらなければならない」のが、エンジニアです。

"If it has to be done, it has to be done". It is an engineer.

どんな技術だって、どこからでも、膨大な資料を(自費で)購入して、Webを読み倒して、誰にでも(嫌なヤツにでも)頭を下げて、そんでもって、何度だってゼロから始める ―― それがエンジニアという職業です。

No matter what the technology, start from anywhere, buy tons of materials (at my own expense), read the Web, bow down to everyone (even the jerks), and then start from scratch again and again -- that's what being an engineer is all about.

それは、時代と社会と技術とからなる多次元の空間の中を、可能な限りつき進み続け、『ここが終わり』というものが『ない』世界です。

It is a world in which there is no 'end', in which I keep moving forward as far as possible in a multi-dimensional space consisting of time, society, and technology.

今まで、そうしてきましたし、これからも、そうしていくのだろうと思っています。

I have done so until now, and I believe I will continue to do so in the future.

-----

ちなみに、今、私の会社では、『デジタル人材認定制度』なる制度登録が始まっているようです。

Incidentally, my company is now starting the system called the "Digital Human Resources Certification System".

じっくり観察させて頂くつもりです。

I'm going to observe my co-workers carefully.

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

pandocを使ってMarkdownをepubにする方法と場所

の続きです。

ちなみに、pandocとは、こういうことができるツールです(興味のある人は、ググってインストールして下さい)。

PandocでMarkdownをHTML形式やらWord形式に変換する

それはさておき。

githubの最初のページに出てくるREADME.mdのフォーマットって、かっこいいですよね。

その上、Markdown言語で書くので、とっても簡単です。

今まで、Latexとか、htmlの記述で苦労してきたのがバカみたいです(まあ、技術系の記述だから、という理由もあると思いますが)

だから、このgithubのイメージをそのままにして、書籍化(epub形式)できないかな、と思っていたら、スタイルシートを変えるだけで行けました

"github.css"で検索したら、色々出てくるようですが、私は以下のファイルを、"github.css"という名前で保存して使わせて貰いました。

body {
  font-family: Helvetica, arial, sans-serif;
  font-size: 14px;
  line-height: 1.6;
  padding-top: 10px;
  padding-bottom: 10px;
  background-color: white;
  padding: 30px; }

body > *:first-child {
  margin-top: 0 !important; }
body > *:last-child {
  margin-bottom: 0 !important; }

a {
  color: #4183C4; }
a.absent {
  color: #cc0000; }
a.anchor {
  display: block;
  padding-left: 30px;
  margin-left: -30px;
  cursor: pointer;
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0; }

h1, h2, h3, h4, h5, h6 {
  margin: 20px 0 10px;
  padding: 0;
  font-weight: bold;
  -webkit-font-smoothing: antialiased;
  cursor: text;
  position: relative; }

h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor {
  background: url("../../images/modules/styleguide/para.png") no-repeat 10px center;
  text-decoration: none; }

h1 tt, h1 code {
  font-size: inherit; }

h2 tt, h2 code {
  font-size: inherit; }

h3 tt, h3 code {
  font-size: inherit; }

h4 tt, h4 code {
  font-size: inherit; }

h5 tt, h5 code {
  font-size: inherit; }

h6 tt, h6 code {
  font-size: inherit; }

h1 {
  font-size: 28px;
  color: black; }

h2 {
  font-size: 24px;
  border-bottom: 1px solid #cccccc;
  color: black; }

h3 {
  font-size: 18px; }

h4 {
  font-size: 16px; }

h5 {
  font-size: 14px; }

h6 {
  color: #777777;
  font-size: 14px; }

p, blockquote, ul, ol, dl, li, table, pre {
  margin: 15px 0; }

hr {
  background: transparent url("../../images/modules/pulls/dirty-shade.png") repeat-x 0 0;
  border: 0 none;
  color: #cccccc;
  height: 4px;
  padding: 0; }

body > h2:first-child {
  margin-top: 0;
  padding-top: 0; }
body > h1:first-child {
  margin-top: 0;
  padding-top: 0; }
  body > h1:first-child + h2 {
    margin-top: 0;
    padding-top: 0; }
body > h3:first-child, body > h4:first-child, body > h5:first-child, body > h6:first-child {
  margin-top: 0;
  padding-top: 0; }

a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
  margin-top: 0;
  padding-top: 0; }

h1 p, h2 p, h3 p, h4 p, h5 p, h6 p {
  margin-top: 0; }

li p.first {
  display: inline-block; }

ul, ol {
  padding-left: 30px; }

ul :first-child, ol :first-child {
  margin-top: 0; }

ul :last-child, ol :last-child {
  margin-bottom: 0; }

dl {
  padding: 0; }
  dl dt {
    font-size: 14px;
    font-weight: bold;
    font-style: italic;
    padding: 0;
    margin: 15px 0 5px; }
    dl dt:first-child {
      padding: 0; }
    dl dt > :first-child {
      margin-top: 0; }
    dl dt > :last-child {
      margin-bottom: 0; }
  dl dd {
    margin: 0 0 15px;
    padding: 0 15px; }
    dl dd > :first-child {
      margin-top: 0; }
    dl dd > :last-child {
      margin-bottom: 0; }

blockquote {
  border-left: 4px solid #dddddd;
  padding: 0 15px;
  color: #777777; }
  blockquote > :first-child {
    margin-top: 0; }
  blockquote > :last-child {
    margin-bottom: 0; }

table {
  padding: 0; }
  table tr {
    border-top: 1px solid #cccccc;
    background-color: white;
    margin: 0;
    padding: 0; }
    table tr:nth-child(2n) {
      background-color: #f8f8f8; }
    table tr th {
      font-weight: bold;
      border: 1px solid #cccccc;
      text-align: left;
      margin: 0;
      padding: 6px 13px; }
    table tr td {
      border: 1px solid #cccccc;
      text-align: left;
      margin: 0;
      padding: 6px 13px; }
    table tr th :first-child, table tr td :first-child {
      margin-top: 0; }
    table tr th :last-child, table tr td :last-child {
      margin-bottom: 0; }

img {
  max-width: 100%; }

span.frame {
  display: block;
  overflow: hidden; }
  span.frame > span {
    border: 1px solid #dddddd;
    display: block;
    float: left;
    overflow: hidden;
    margin: 13px 0 0;
    padding: 7px;
    width: auto; }
  span.frame span img {
    display: block;
    float: left; }
  span.frame span span {
    clear: both;
    color: #333333;
    display: block;
    padding: 5px 0 0; }
span.align-center {
  display: block;
  overflow: hidden;
  clear: both; }
  span.align-center > span {
    display: block;
    overflow: hidden;
    margin: 13px auto 0;
    text-align: center; }
  span.align-center span img {
    margin: 0 auto;
    text-align: center; }
span.align-right {
  display: block;
  overflow: hidden;
  clear: both; }
  span.align-right > span {
    display: block;
    overflow: hidden;
    margin: 13px 0 0;
    text-align: right; }
  span.align-right span img {
    margin: 0;
    text-align: right; }
span.float-left {
  display: block;
  margin-right: 13px;
  overflow: hidden;
  float: left; }
  span.float-left span {
    margin: 13px 0 0; }
span.float-right {
  display: block;
  margin-left: 13px;
  overflow: hidden;
  float: right; }
  span.float-right > span {
    display: block;
    overflow: hidden;
    margin: 13px auto 0;
    text-align: right; }

code, tt {
  margin: 0 2px;
  padding: 0 5px;
  white-space: nowrap;
  border: 1px solid #eaeaea;
  background-color: #f8f8f8;
  border-radius: 3px; }

pre code {
  margin: 0;
  padding: 0;
  white-space: pre;
  border: none;
  background: transparent; }

.highlight pre {
  background-color: #f8f8f8;
  border: 1px solid #cccccc;
  font-size: 13px;
  line-height: 19px;
  overflow: auto;
  padding: 6px 10px;
  border-radius: 3px; }

pre {
  background-color: #f8f8f8;
  border: 1px solid #cccccc;
  font-size: 13px;
  line-height: 19px;
  overflow: auto;
  padding: 6px 10px;
  border-radius: 3px; }
  pre code, pre tt {
    background-color: transparent;
    border: none; }

因みに、元のmdファイルは、自分のgithubから持ってきた、このファイルを、"README_1.md"という名前で保存しました。

 

# PruneMobileとは

複数の人間や自動車等の移動体のリアルタイムの位置情報を、地図上に表示する、
PruneCluster https://github.com/SINTEF-9012/PruneCluster
のアプリケーションです。

PruneMobileに対して、任意のタイミングで位置情報(JSON形式)を送り込むだけで、地図上にマーカーが表示されます。

## 使用環境

- golang(Go言語)のインストールされていれば良いです。私(江端智一)の環境では以下のようになっています。
```
$ PruneMobile\server>go version
$ go version go1.14 windows/amd64
```

- 実際に動かせば、コンパイラから、あれこれ言われますので、それに対応して下さい。基本的には、
```
$ go get github.com/gorilla/websocket
```
は必要になると思います。

## サンプルプログラムの環境

- Webブラウザで表示される地図は、東京都江東区の豊洲駅を中心にして作ってあります。
  - PruneMobile\server\serverX.go (Xは数字) の中にある、
```
var map = L.map("map", {
   attributionControl: false,
   zoomControl: false
}).setView(new L.LatLng(35.654543, 139.795534), 18);
```
の"35.654543, 139.795534"の座標を変更すれば、地図の中心位置が変わります。

- クライアントプログラムでは、豊洲駅を中心にランダムウォークさせています
  - PruneMobile\server\clientX.go (Xは数字)を起動すると、10秒間程、マーカーが移動して、その後消滅します。

- クライアントプログラム(clientX.go)は複数同時に起動させることができます。

## 現時点で確認している問題点で、いずれ直すもの

- ~~マーカーの消滅のタイミングが、同時になってしまう~~

- ~~Webブラウザの表示が、最初の1つめしか、正常に動作しない~~

- ローカルのjs(javascript)のローディングに失敗した為、江端のプライベートサーバ(kobore.net)からローディングしている。PruneMobile\server\serverX.goの以下を参照
```
	<script src="http://kobore.net/PruneCluster.js"></script>
	<link rel="stylesheet" href="http://kobore.net/examples.css"/>
```

# サンプルプログラムの動作方法

## Step 1 サーバの起動

適当なシェルを立ち上げて
```
$ cd PruneMobile\server
$ go run serverX.go (Xは数字)
```
とすると、「Windowsセキュリティの重要な警告(windows10の場合)」が出てくるので、「アクセスを許可する」ボタンを押下して下さい。

## Step 2 地図画面(マーカ表示画面)の起動
Chromoブラウザ(他のブラウザのことは知らん)から、
```
http://localhost:8080/
```
と入力して下さい。豊洲地区の地図が表示されます。

## Step 3 移動オブジェクト(マーカの対象)の起動
適当なシェルを立ち上げて
```
$ cd PruneMobile\client
$ go run clientX.go (Xは数字)
```
とすると、マーカが0.5秒単位でランダムに動きます。

## 動作の様子
![](./PruneMobile_demo.png)





# クライアントプログラムで使うI/F(データ形式)

## 前提

- サーバとwebsocketのコネクションを確立して下さい。方法は問いません。golangでの記述方法はclient/clientX.goを参考にして下さい。

- データ形式はJSONを用います。golangでの記載サンプルは以下の通りです。

```

// GetLoc GetLoc
type GetLoc struct {
	ID  int     `json:"id"`
	Lat float64 `json:"lat"`
	Lng float64 `json:"lng"`
	//Address string  `json:"address"`
}
```

## Step.1 マーカーの登録

IDを"0"にして、最初のマーカーの座標を入力したJSONを、サーバに送付して下さい。golangでの送信方法はは以下の通りです。
```
	gl := GetLoc{
		ID:  0,
		Lat: 35.653976,
		Lng: 139.796821,
	}

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

返り値に入ってきたIDが、これからそのマーカで使うID番号となります。golangでの受信方法はは以下の通りです。

```
	gl2 := new(GetLoc)
	err = c.ReadJSON(gl2)
	log.Printf("after ID:%d", gl2.ID)
	log.Printf("after Lat:%f", gl2.Lat)
	log.Printf("after Lng:%f", gl2.Lng)
```

以後、このID番号(整数)を使用して下さい。この番号と異なる番号を使用した場合、動作は保証されません。

## Step.2 マーカーの移動

指定されたIDを使って、移動後の座標を送付して下さい。
```
	gl := GetLoc{
		ID:  5,         // IDが"5"の場合
		Lat: 35.653923,
		Lng: 139.796852,
	}

	err = c.WriteJSON(gl)
	if err != nil {
		log.Println("write:", err)
	}
```
返り値は、入力と同じJSONが戻ってきますが、必ず受信して下さい。
```
	gl2 := new(GetLoc)
	err = c.ReadJSON(gl2)
	log.Printf("after ID:%d", gl2.ID)
	log.Printf("after Lat:%f", gl2.Lat)
	log.Printf("after Lng:%f", gl2.Lng)
```

## Step.3 マーカーの抹消

指定されたIDを使って、地球上の緯度経度の数値で現わせない座標を入力して下さい。具体的に、latに90.0より大きな値、またはlngに180より大きな値を入力することで、マーカが消去されます。
```
	gl := GetLoc{
		ID:  5,         // IDが"5"の場合
		Lat: 999.9,
		Lng: 999.9,
	}

	err = c.WriteJSON(gl)
	if err != nil {
		log.Println("write:", err)
	}
```
返り値は、入力と同じJSONが戻ってきますが、必ず受信して下さい。
```
	gl2 := new(GetLoc)
	err = c.ReadJSON(gl2)
	log.Printf("after ID:%d", gl2.ID)
	log.Printf("after Lat:%f", gl2.Lat)
	log.Printf("after Lng:%f", gl2.Lng)
```

# Amazon Lightsail を使った、スマホの現在位置の表示方法

PruneMobileは、シミュレータ等で計算した位置情報を、ブラウザで表示することを目的としたものですが、これを、現実のスマホの位置の検知にも使えるようにしました(要するに「ココセコム」としても使える、ということです)

これを実現する為には、インターネット上に(クラウド)サーバを置かなければなりません。AWSのVPS(仮想専用サーバー)が思いつきますが、AWSのEC2は6運用が面倒な上に使用料が高価です。そこで「月額 500 円で使えるAWSクラウドのVPS」を使う方法について記載しておきます。

- Amazon Lightsail の立ち上げ方法については、https://wp.kobore.net/江端さんの技術メモ/post-1513/ を参考にして下さい。

- ここでは、"sea-anemone.tech"という架空のドメインを例として使っていますが、外部(例えば「お名前.com」)でドメインを得た場合は、その名前に置き換えて読んで下さい。


- 公開鍵の取得方法については、https://wp.kobore.net/江端さんの技術メモ/post-1550/ を参考にして下さい(ここに記載されている、"go_template/server_test"は、"PruneMobile\vps_server"と読み換えて下さい)


## Step 1 サーバの起動

Amazon Lightsailのシェルから適当なシェルを立ち上げて
```
$ cd PruneMobile\vps_server
$ go run serverXX.go (Xは数字)
```

と起動して下さい。

## Step 2 地図画面(マーカ表示画面)の起動
Chromoブラウザ(他のブラウザのことは知らん)から、
```
https://sea-anemone:8080/
```
と入力して下さい。現在は、東京のある地域が表示されますが、serverXX.go の中に記載れている、位置情報、35.60000, 139.60000 を片っぱしから、任意の位置(自宅の位置等)に変更することで、自宅付近での実証実験ができます。
自宅の情報は、GoogleMAPから取得できます。

## Step 3 移動オブジェクト(マーカの対象)の起動
スマホのブラウザから、
```
https://sea-anemone:8080/smartphone
```
として、[open]ボタンを押して下さい。スマホで位置測位が開始されます(この際、位置情報を提供して良いか、と聞きあれることがありますので、"OK"として下さい)。
[close]ボタンを押下すると地図画面からマーカが消えます。

## 現時点で確認している問題点で、いずれ直すもの

- ローカルのjs(javascript)のローディングに失敗した為、江端のプライベートサーバ(kobore.net)からローディングしている。PruneMobile\vps_server\serverXX.goの以下を参照
```
	<script src="http://kobore.net/PruneCluster.js"></script>
	<link rel="stylesheet" href="http://kobore.net/examples.css"/>
```
- 動作中にwebsocketが切断してしまった時(スマホの閉じる、別のブラウザ画面を立ち上げた時)、オブジェクトが放置されて、システム全体が動かなくなる

PruneMobile_demo.png は、同じディレクトリに放り込んでおきました。

でもって、

ebata@DESKTOP-P6KREM0 MINGW64 ~/eBook_sample_with_markdown_and_pandoc
$ pandoc -f markdown -t epub3 README_1.md title.txt -o book.epub --css github.css --toc --toc-depth=2 --epub-cover-image=cover.jpg

を実行して、chromoの拡張機能としてアドインしておいた、epubリーダを使って"book.epub"を表示したら、

こんな感じで表示されるようになりました。

これで、一応「mdファイルを作成して、epubファイルにするまでの方法」を、(とりあえず)確立できました。

それと、 md(Markdown)ファイルを編集するなら、Visual Studio Codeが便利そうです。

編集とビューが連動しているので、いちいちビューアーで確認する必要がありません。

以上

 

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

PDFを黒塗りしてから、保存できるサイト(↓をクリック)

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

pandocを使ってMarkdown(README_1.md)をepub(book.epub)にする方法と場所

ebata@DESKTOP-P6KREM0 MINGW64 ~/eBook_sample_with_markdown_and_pandoc
$ pandoc -f markdown -t epub3 README_1.md title.txt -o book.epub --css styleshee
t.css --toc --toc-depth=2 --epub-cover-image=cover.jpg

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

私の家族は、私を除いて、全員「虫」に立ち向うことができません。

All of my family members, except for me, can't fight the "insect".

部屋の中に虫が入ってきただけで、大騒ぎになって、私を呼びつけます(酷い時には、会社に帰宅命令が来ます)

When a insect comes into the room, they will make a big fuss and call me (in the worst case, I will be ordered to go home to work).

ゴキブリなど出た日には、本当にその日はエラいことになります。

In case of cockroaches, the day will be a disaster.

-----

私は、これまで、虫の駆除(逃し他、殺し方)については、様々な方法を試してきました。

I have tried many different methods to get rid of (miss and otherwise kill) insects.

まあ、タイやインドの安宿では、イモリやヤモリや、てのひらサイズの蜘蛛が壁に張りついていましたが、夜には、普通に寝ていました。

Well, in cheap hotels in Thailand and India, newts, geckos, and palm-sized spiders were sticking to the walls, but at night, I slept normally.

危険であるとか、うっとうしいと思わない限りは、基本的には、無用な殺生は避けたいと思っています。本当です。

Basically, I want to avoid unnecessary killing anything unless I think it is dangerous or annoying. It is true.

しかし、嫁さんや娘たちは、私に『なんとかして』とだけ言います ―― 『殺害して』とは言いません。

But my wife and daughters only say to me, "Do something" -- not "Kill it".

-----

政府所属の暗殺チームも、多分、上司から『なんとかして』と、だけ、言われているんだろうなー、と、思っています。

The assassination team belonging to Japan government is probably just being told by their superiors to 'do something', I think.

命じられている仕事の困難度も、心理的負担も、ずいぶん違うことは分かっていますが ――

I know that the degree of difficulty and psychological burden of the work I am assigned to do is very different, but...

一方的に「同志」と思っています。

I unilaterally consider them to be "comrades".

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

学生のころ、自治を謳う学生寮(学寮)に住んでいました。

When I was a student, I lived in a student dormitory (Gakuryo) that claimed to be self-governing.

先輩の一人が、部屋の中に、ホッケーのスティックを常備しているような学寮でした。

The dormitory was such that one of the seniors had a field hockey stick in his room at all times.

『部屋に踏み込まれた時に、武器が必要だから』と、普通に「内ゲバ」を警戒するような会話が、あまり奇異に感じられない ――

Conversations like, "I will need weapons in case someone steps into the room," and the usual warnings about "internal strife," don't seem too strange--

70年代の安保闘争の残滓を、しつこく残していた学寮でした。

It was a dormitory that persistently retained the residue of the security struggle of the 1970s.

『暴力』が、暴力装置(警察、自衛隊)の専権事項ではない、と考える時代があったんですよ(遠い目)。

There was a time when someone thought "violence" was not the exclusive domain of violent devices (police, self-defense forces) (with having a distant look).

まあ、こういうところでは、合理的思考(例:エンジニアリングアプローチ)を持つ者が排除されるのは、当然と言えます。

Well, it's not surprising that rational thinkers (e.g., engineering approach) are excluded in such places.

-----

先日、夜中の12時前に、自宅の呼び鈴が鳴りました。

The other day, just before midnight, the doorbell rang at my house.

こんな時間に我が家を訪問する人物に、私は、心当りはありません。

I have no idea who would be visiting my house at this hour.

私は、部屋にあった「肩叩き用の棒」を構えて、階下におりたところ、チェーンキーで自宅に入れなかった長女が、嫁さんに門扉を開けもらって、入ってきたところでした。

I went downstairs to my room with my SHOULDER TAPPING ROD at the ready. There, my senior daughter, who was unable to enter my house because of the chain key, had just come in after my wife opened the gate for her.

私は、『自室に、武器も装備していない自分の平和ボケ』に、一瞬、愕然としてしまいました。

I was momentarily taken aback by the fact that I was not equipped with a weapon in my room.

-----

江端:「自分の部屋に、武器を配備しなければ」

Ebata: "I have to deploy the weapons in my room."

嫁さん:「玄関の傘立に、じーじ(嫁さんの父親(没))のゴルフクラブを入れてあるよ」

Wife: "I put my father's golf clubs in the umbrella stand at the entrance."

江端:「それでは、自宅に踏み込まれた後では、侵入者を制圧できない」

Ebata: "Then we won't be able to subdue the intruders after they raid our home."

と、現在、木刀の購入を検討中です。

So, I'm currently considering purchasing a wooden sword.

また、武器として使用した場合、侵入者を殺害しかねないので、なかなかに、悩ましいですが ――

Also, if used as a weapon, it could kill the intruder, which is quite annoying.

実際に70年代では、過激派が内ゲバで使った、こういうもの(バール)の方が安いです。

In fact, in the 70's, these things (crowbars) were cheaper, used by militants in internal fights.

これなら、本来の用途でも使用できそうです。

It seems that this device can be used for its intended purpose.

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

芝村裕吏さんの「マージナル・オペレーション」が面白いです。

"Marginal Operation" by Yuri Shibamura is interesting.

(興味のあるかたは、ググって下さい)

(If you are interested, please Google it.)

内容(設定や状況や登場人物)が面白いから、面白い、でいいと思います ―― 現実とファンタジーとちょっとだけ未来のテクノロジーがバランスよく登場してくるところも良いです。

I think it's interesting because the content (setting, situation, characters) is interesting -- the balance of reality, fantasy, and a bit of future technology is also good.

-----

『インフォメーションイルミネーター(情報統合端末)』というのは実現可能とは思うけど、敵軍の状態まで『見える化』するのは、無理があるよな、とか

I think the "Information Illuminator" is feasible, but I don't think it's feasible to visualize the status of the enemy forces.

1000人以上のオブジェクトを同時追跡するのは、現状の無線方式からして難しいし、タイムラグも無視できなうだろうなぁ、とか

Simultaneous tracking of more than 1000 objects would be difficult with the current wireless system, and the time lag would be negligible.

―― などと、「子どもの見守りシステム」を色々考えてきた研究員としては、近未来デバイスを考えることができる点も「楽しい」です。

As a researcher who has been thinking about various "child watchdog systems" in this way, I also "enjoy" the fact that I can think about near-future devices.

ちなみに、こちらには、『まずは、この日本を、年間平均で300人の子どもが犯罪で殺害されるような社会にすることが優先事項ですね』というギャクで、滑って、上司をどん引きさせた、という話があります。

Incidentally, there is a story here about a reseacher who slipped up and shocked his boss with a joke: "First of all, the priority is to make Japan a society where an average of 300 children a year are killed in crimes".

それはさておき。

That aside.

-----

モノを書いて読んで貰っている人間の一人としては、文章のスタイルが、とても勉強になります。

As a column writer, the style of writing in this book is very informative.

―― とにかく、読み易い

"Anyway, it's easy to read."

私、ラノベ(ライトノベル)というのが、どのようなものか良く分かっていないのですが ―― 次女とかにも、その定義を聞いてみたのですが、ピンときていません。

I don't really know what a "light novel" is -- I've asked my junior daughter and others to define it, but they don't have a clue -- but

ライトノベルが「読み易い本」と定義できるのであれば、『究極にして至高の本』と言って良いと思います。

If a light novel can be defined as "an easy-to-read book," then I think it's no problem to say that it's "ultimate book".

比して、私のコラムは、全体の7割が形容句と、業界用語(と、グラフと表)で埋まっているなぁと実感します。

In comparison, I feel that 70% of my column is filled with adjectives, industry terms (and graphs and tables).

-----

以下の比較は妥当ではない、と思いますが、

I don't think the following comparison is valid, however

高村薫さんのファンでもある私としては、「マージナル・オペレーション」は、「マークスの山」の20倍以上の速さで読めています。

As a fan of Kaoru Takamura's work, "Marginal Operations" is reading more than 20 times faster than "Marks' Mountain".

うん、本当に妥当ではない、と思う。

Yeah, it's not really appropriate, I guess.

ただ、「マージナル・オペレーション」を読むのは楽しいので、この本を読むのは、ウォーキングの時だけ、と決めています。

But, well, I enjoy reading Marginal Operations, so I've decided that I'll only read this book when I'm walking.

こうすることで、「ウォーキングが面倒だなあ」という気持ちを、「早くウォーキングにでかけたい」という気持ちに転換して、日常生活のルーティンに組み込んでいます。

In this way, I can change the feeling of "walking is too much trouble" to "I want to go out for a walk as soon as possible" and incorporate it into my daily routine.