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

私が普段使っているDBは、PostgreSQLを使っているのですが、構築手順が面倒くさいし、なによりDBサーバ立てるのを省略したかったです。

ですので、SQLiteを使ってDB構築の手を抜くことにしました。

今日のところは、mattn/go-sqlite3 に _example/simple/simple.go というサンプルファイルがあったので、これを動くことを確認するところまでやりました。

/*
	C:\Users\ebata\kese\gonet-html\1-1
	go get github.com/mattn/go-sqlite3

	どういう訳か、VSCodeのデバッグでトレースができなかったので、fmt.Println("----->10") と入れて確認をしている。
	このプログラムは、

*/

package main

import (
	"database/sql"
	"fmt"
	"log"
	"os"

	_ "github.com/mattn/go-sqlite3"
)

func main() {
	os.Remove("./foo.db")

	fmt.Println("----->10")

	db, err := sql.Open("sqlite3", "./foo.db")
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	sqlStmt := `
	create table foo (id integer not null primary key, name text);
	delete from foo;
	`
	_, err = db.Exec(sqlStmt)
	if err != nil {
		log.Printf("%q: %s\n", err, sqlStmt)
		return
	}

	fmt.Println("----->9")

	tx, err := db.Begin()
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("----->8")

	stmt, err := tx.Prepare("insert into foo(id, name) values(?, ?)")
	if err != nil {
		log.Fatal(err)
	}
	defer stmt.Close()
	for i := 0; i < 100; i++ {
		_, err = stmt.Exec(i, fmt.Sprintf("こんにちわ世界%03d", i))
		if err != nil {
			log.Fatal(err)
		}
	}
	tx.Commit()

	fmt.Println("----->7")

	rows, err := db.Query("select id, name from foo")
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()
	for rows.Next() {
		var id int
		var name string
		err = rows.Scan(&id, &name)
		if err != nil {
			log.Fatal(err)
		}
		fmt.Println(id, name)
	}

	fmt.Println("----->6")

	err = rows.Err()
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("----->5")

	stmt, err = db.Prepare("select name from foo where id = ?")
	if err != nil {
		log.Fatal(err)
	}
	defer stmt.Close()
	var name string
	err = stmt.QueryRow("3").Scan(&name)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(name)

	fmt.Println("----->4")

	_, err = db.Exec("delete from foo")
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("----->3")

	_, err = db.Exec("insert into foo(id, name) values(1, 'foo'), (2, 'bar'), (3, 'baz')")
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("----->2")

	rows, err = db.Query("select id, name from foo")
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()
	for rows.Next() {
		var id int
		var name string
		err = rows.Scan(&id, &name)
		if err != nil {
			log.Fatal(err)
		}
		fmt.Println(id, name)
	}

	fmt.Println("----->1")

	err = rows.Err()
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("----->0")

}

もう一つのサンプルコード

https://qiita.com/geniusmaaakun/items/b3cb44de3b10a526be98 を参照させて頂き、微小修正

package main

/*
C:\Users\ebata\kese\gonet-html\1-1-1
sqliteをインストールする際の手順の確認

# ドライバのインストール
go get github.com/mattn/go-sqlite3

*/

import (
	"database/sql"
	"fmt"
	"log"
	"os"

	//インポート _にしないとコンパイルエラーになる。使用しない為
	_ "github.com/mattn/go-sqlite3"
)

var DbConnection *sql.DB

type Person struct {
	Name string
	Age  int
}

func main() {

	os.Remove("./example.sql") // これを入れないと、DBが太り続ける

	//1
	//DBを開く  なければ作成される
	DbConnection, _ := sql.Open("sqlite3", "./example.sql")
	//終わったら閉じる
	defer DbConnection.Close()
	//DB作成 SQLコマンド
	cmd := `CREATE TABLE IF NOT EXISTS person(
        name STRING,
        age  INT)`

	//実行 結果は返ってこない為、_にする
	_, err := DbConnection.Exec(cmd)

	//エラーハンドリング
	if err != nil {
		fmt.Println("エラー")
		log.Fatalln(err)
	}

	//ターミナル
	//sqlite3
	//.table
	//SELECT * FROM tablename;
	//で確認

	//2 CRUD処理
	//Create
	//データを追加
	//VALUES (?, ?)  値は後で渡す。セキュリテイの関係でこのようにする方がいい
	//SQLインジェクション 悪意あるコマンドでDBが操作されてしまうのを防ぐ ?でエスケープしてくれる
	cmd = "INSERT INTO person (name, age) VALUES (?, ?)"
	//実行
	//レコードを取得する必要のない、クエリはExecメソッドを使う
	//第二引数からは、コマンド?部の値
	_, err = DbConnection.Exec(cmd, "Nancy", 20)
	if err != nil {
		log.Fatalln(err)
	}

	_, err = DbConnection.Exec(cmd, "Mike", 20)
	if err != nil {
		log.Fatalln(err)
	}

	_, err = DbConnection.Exec(cmd, "Tom", 55)
	if err != nil {
		log.Fatalln(err)
	}

	//Update
	//データの更新 Mike が存在する場合
	cmd = "UPDATE person SET age = ? WHERE name = ?"
	_, err = DbConnection.Exec(cmd, 25, "Mike")
	if err != nil {
		log.Fatalln(err)
	}

	//Read
	//Get  All
	//マルチセレクト
	//データ全てをループで表示
	//Queryは全て取得する
	cmd = "SELECT * FROM person"
	rows, _ := DbConnection.Query(cmd)
	defer rows.Close()
	//structを作成
	var pp []Person

	//取得したデータをループでスライスに追加 for rows.Next()
	for rows.Next() {
		var p Person
		//scan データ追加
		err := rows.Scan(&p.Name, &p.Age)
		if err != nil {
			log.Println(err)
		}
		pp = append(pp, p)
	}
	err = rows.Err()
	if err != nil {
		log.Fatalln(err)
	}
	//表示
	for _, p := range pp {
		fmt.Println(p.Name, p.Age)
	}

	//特定のデータを取得
	cmd = "SELECT * FROM person where age = ?"
	//age = 20にして実行
	//QueryRowは最初の一件だけ取得する。

	//row := DbConnection.QueryRow(cmd, 20)
	//row := DbConnection.QueryRow(cmd, 25)
	row := DbConnection.QueryRow(cmd, 55)

	var p Person
	err = row.Scan(&p.Name, &p.Age)
	if err != nil {
		//データがなかったら
		if err == sql.ErrNoRows {
			log.Println("No row")
			//それ以外のエラー
		} else {
			log.Println(err)
		}
	}
	fmt.Println(p.Name, p.Age)

	//Delete
	//データの削除  全て
	cmd = "DELETE FROM person WHERE name = ?"
	_, err = DbConnection.Exec(cmd, "Nancy")
	if err != nil {
		log.Fatalln(err)
	}

	//マルチセレクト  テーブルもSQLインジェクション対策
	//こちらを推奨
	//データを構造体に入れて表示
	//テーブルはSQLインジェクション対策が使えない
	tableName := "person"
	//テーブル名指定は?が使えない為、%sを使う。
	//後に対応されるかも?
	cmd = fmt.Sprintf("SELECT * FROM %s", tableName)
	rows1, _ := DbConnection.Query(cmd)
	defer rows1.Close()
	var pp1 []Person
	//パターンとして覚える
	for rows1.Next() {
		var p Person
		//データを構造体に追加
		err := rows1.Scan(&p.Name, &p.Age)
		if err != nil {
			log.Println(err)
		}
		//ppに追加
		pp1 = append(pp1, p)
	}
	//まとめてエラーチェック
	err = rows1.Err()
	if err != nil {
		//エラーなら終了
		log.Fatalln(err)
	}
	for _, p := range pp1 {
		fmt.Println(p.Name, p.Age)
	}
}

 

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

Pythonのスクレイピングを、Golangで記述してみる。

まずpythonの記述です。

# -*- coding: utf-8 -*-
from pyquery import PyQuery

q = PyQuery('https://kabutan.jp/stock/?code=7203')
sector = q.find('#stockinfo_i2 > div > a')[0].text
print(sector)

これでターゲットとなるhtml部分は、多分ここ

<div id="stockinfo_i2">
<dl>
<dt>業績</dt>
<dd><img src="/images/cmn/gyouseki_2.gif" title="今期予想" /></dd>
</dl>

<div>
<a href="/themes/?industry=17&market=1">輸送用機器</a>
</div>

これをgolangで実現するには、このようにコーディングするようです。

package main

import (
	"fmt"

	"github.com/PuerkitoBio/goquery"
)

func main() {
	//get_url_info, err := goquery.NewDocument("https://profile.yahoo.co.jp/search/?w=トヨタ自動車")
	get_url_info, err := goquery.NewDocument("https://kabutan.jp/stock/?code=7203")
	if err != nil {
		fmt.Println("get html NG")
	}

	//result := get_url_info.Find("div > div > table > tbody > tr > td")
	//result := get_url_info.Find("div > div > a")
	result := get_url_info.Find("#stockinfo_i2 > div > a")
	result.Each(func(index int, s *goquery.Selection) {
		fmt.Println(s.Text())
	})
}

出力結果は以下の通りです。

ebata@DESKTOP-P6KREM0 MINGW64 ~/kese/gonet-html
$ go run main3.go
輸送用機器

こうやると、もっと簡単にできそう。

package main

import (
	"fmt"

	"github.com/PuerkitoBio/goquery"
)

func main() {

	q, err := goquery.NewDocument("https://kabutan.jp/stock/?code=7203")
	if err != nil {
		fmt.Println("get html NG")
	}

	name := q.Find("div.company_block > h3").Text()
	fmt.Println(name)

	code_short_name := q.Find("#stockinfo_i1 > div.si_i1_1 > h2").Text()
	fmt.Println(code_short_name)

	market := q.Find("span.market").Text()
	fmt.Println(market)

	unit_str := q.Find("#kobetsu_left > table:nth-child(4) > tbody > tr:nth-child(6) > td").Text()
	fmt.Println(unit_str)

	sector := q.Find("#stockinfo_i2 > div > a").Text()
	fmt.Println(sector)

}

 

 

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

シルベスタ・スターローンさん主演の代表作に「ランボー」というものがあります。

One of the best movies starring Sylvester Stallone is called "Rambo".

ベトナム戦争の帰還兵が、本国で理不尽な差別を受けて、保安官達との戦闘や、州兵による追撃を受けて、最終的に逆襲に転じるという、バトルアクション映画です。

This is a battle-action film about a Vietnam War veteran who is unreasonably discriminated against in his home country, battles with sheriffs and pursued by the National Guard, and finally strikes back.

非常に重い米国の社会問題を扱った映画として、当時、日本国内でも、かなりヒットしました。

As a film dealing with a very serious social issue in the United States, it was quite a hit in Japan at the time.

このシリーズに「ランボー3/怒りのアフガン」があります。

In this series, there is "Rambo 3: The Angry in Afghan".

これは、当時、アフガニスタンに侵攻していたソ連(今のロシア)に対するレジスタンスであるムジャーヒディーン(「ジハードを遂行する者」の意味)を支援して、ランボーが、ソ連軍に対して闘いを挑む、という内容でした。

It was about Rambo supporting the Mujahideen (meaning "those who carry out jihad"), a resistance group against the Soviet Union (now Russia) that was invading Afghanistan at the time, and challenging them to fight against the Soviet army.

映画の中では「愛国心をもったゲリラがいる国は征服できない。我々はそれをベトナムで体験した」という台詞が登場します。

In the film, the line "A country with patriotic guerrillas cannot be conquered. We experienced it in Vietnam" appears in the film.

また、ラストに「この映画をすべてのアフガン戦士たちに捧げる」というテロップも登場します。

At the end of the film, there is a message that says, "This film is dedicated to all Afghan warriors

かなり乱暴に纏めると、映画「ランボー3/怒りのアフガン」は、「米国民のランボーが、アフガニスタンのタリバンを支援する映画」と言えます。

To sum it up quite roughly, the movie "Rambo 3" can be described as "a movie in which Rambo, an American citizen, supports the Taliban in Afghanistan.

今調べたところ、Amazon Primeでも、この映画を視聴できます。

I just checked, and you can also watch this movie on Amazon Prime.

どうやら、ランボーとタリバンをリンクさせるような、捻くれた視点を持つのは、私くらいのようです。

Apparently, I am the only one who has a twisted perspective that links Rambo to the Taliban.

-----

一方、現実の世界でも、ソ連軍はアフガニスタンから撤退しました。

Meanwhile, in the real world as well, Soviet troops have withdrawn from Afghanistan.

しかし、その結果、ムジャーヒディーン同士の対立から内戦となり、タリバンの台頭を招くことになりました。

However, the resulting conflict between the Mujahideen led to a civil war and the rise of the Taliban.

米国政府は、『以前に軍事支援した国家から、自国の安全保障を脅かされる』ということを繰返してきた国です。

The U.S. government is a country that has repeatedly had its security threatened by nations that it has previously supported militarily.

ベトナム戦争にしても、湾岸戦争にしても、米国が、その国に膨大に渡した兵器によって、自国の軍隊が攻撃される、というケースには、枚挙にいとまがありません。

Whether it is the Vietnam War or the Gulf War, there is no shortage of cases where the U.S. has been attacked by its own troops because of the huge amount of weapons it has given to that country.

そういう意味では、我が国は、政治的判断(特に自衛隊に関する)が遅いことから、こういう事態から、運よく免れてきた、と言えます。

In that sense, Japan has been fortunate to have avoided this kind of situation because of its slow political decision-making (especially regarding the Self-Defense Forces).

―― 日本は、先進国の中で、唯一、イスラム原理主義者によるテロを国内で実施されていない国じゃないかな?

"Isn't Japan the only developed country that hasn't had a domestic terrorist attack carried out by Islamic fundamentalists?"

なのかなと思い、で、ちょっと調べてみたのですが、

So, I did some research.

アメリカ→(当然)あり、フランス→あり、イギリス→あり、ドイツ→あり、イタリア→摘発あり、カナダ→あり(昨年6月)(*)

U.S.A. -> (naturally) yes, France -> yes, U.K. -> yes, Germany -> yes, Italy -> yes, Italy -> yes, Canada -> yes (last June)(*)

(*)出典:国際テロリズム要覧2021 | 公安調査庁、その他

(*)Source: International Terrorism Handbook 2021 | Public Security Intelligence Agency, etc.

という結果でした。

ただ、上記の30分程度のネットを使った調査が、「事実」として流布されていくのは怖いので、私が、誤解、誤記しているようでしたら、メールにてご指摘下さい。

However, I am afraid that my 30-minute research on the Internet above will be spread as "fact", so if I have misunderstood or misrepresented anything, please point it out to me by e-mail.

-----

以前、私、赤穂浪士事件(忠臣蔵)のことを、『地方武士の暴動』みたいなことを言って、嫁さんに叱られました。

My wife once scolded me for saying that the Ako Roshi incident (Chushingura) was like a "riot of local samurai.

それ以後、私は、こういう表現を思いついても、口にするのは自粛するようにしています。

Since then, I have tried to refrain from saying such expressions even if they come to my mind.

昨夜、NHKで、2004年に放映されていた、大河ドラマ「新選組!スペシャル」(総集編)を、ちょっとだけ見ていたのですが、

Last night, I was watching NHK's 2004 Taiga Drama "Shinsengumi! Special" (compilation), which was aired on NHK in 2004. and I thought,

―― 「新撰組」というのは、江戸幕府原理主義者によるタリバンのようなものだよな

""Shinsengumi" is like the Taliban of Edo Shogunate fundamentalists."

と思いました。

そもそも、権力機関(江戸幕府)の承認も得ずに、ただの私的な部局の判断だけで、殺害を実行する組織、という点では、タリバンよりも悪質である、と言えます。

In the first place, it is more vicious than the Taliban in that it is an organization that carries out killings based only on the judgment of a private department without the approval of the authority (Edo Shogunate).

新撰組は、幕府の解散命令に抵抗した者が徒党を組み、会津藩主・松平容保の私財で運営された私的な傭兵部隊(民間軍事会社:PMC(private military company)です。

The Shinsengumi was a private military company (PMC) that was formed by those who resisted the Shogunate's order to disband the group and was funded by the private fortune of the Aizu domain lord, Matsudaira Yoho.

そういう意味でいえば、

In that same sense,

―― 「るろうに剣心」も、薩摩、長州藩がやとったPMCの一員であり、稀有な能力を有するテロリスト

""Rurouni Kenshin" is also a member of the PMC taken over by the Satsuma and Choshu clans, a terrorist with rare abilities."

とも言えます。

-----

しかしながら ――

However,

■「新撰組」についての上記の解釈を口にすれば、嫁さんから口をきいて貰えなくなり、

If I mention the above interpretation of "Shinsengumi", my wife will stop talking to me.

■「るろうに剣心」についての上記の解釈を口にすれば、長女から口をきいて貰えなくなる

If I mention the above interpretation of "Rurouni Kenshin", my senior daughter will not be able to talk to me.

ことは『確実』なので、いらんことは言わないようにしています。

This is a sure thing. Hence, I won't say anything they don't want to hear

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

参照 : https://github.com/PuerkitoBio/goquery

goqueryは、jQueryに似た構文と機能群をGo言語に提供するものです。

$ go get github.com/PuerkitoBio/goquery

で使うことができるようになります。

サンプルプログラムで、この内容の解説を試みます。

package main

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

	"github.com/PuerkitoBio/goquery"
)

func ExampleScrape() {
	// Request the HTML page.

	res, err := http.Get("http://kobore.net")

	if err != nil {
		log.Fatal(err)
	}
	defer res.Body.Close()
	if res.StatusCode != 200 {
		log.Fatalf("status code error: %d %s", res.StatusCode, res.Status)
	}

	// Load the HTML document
	doc, err := goquery.NewDocumentFromReader(res.Body)
	if err != nil {
		log.Fatal(err)
	}

	doc.Find("input").Each(func(i int, s *goquery.Selection) {
		// For each item found, get the title
		title, _ := s.Attr("type")
		fmt.Printf("Review %d: %s\n", i, title)
	})

	/*
		上記によって以下の4行がピックアップされる。

		<input type="hidden" name="cx" value="010448971387544815344:gehqdwxqnlo" />
		<input type="hidden" name="ie" value="Shift_JIS" />
		<input type="text" name="q" size="10" />
		<input type="submit" name="sa" value="Search" />
	*/

}

func main() {
	ExampleScrape()
}

対象となる、Webのhtmlは以下の通り

(前略)

<TITLE>kobore.net</TITLE>
</head>

<TD ALIGN="right">
<A HREF="./index-en.shtml">English</A> /
Japanese
</TD>

<div align="RIGHT">
<img src="https://www.kobore.net/KOBORE-small.jpg">
<form id="cse-search-box" action="https://google.com/cse" target="_blank">
<input type="hidden" name="cx" value="010448971387544815344:gehqdwxqnlo" />
<input type="hidden" name="ie" value="Shift_JIS" />
<input type="text" name="q" size="10" />
<input type="submit" name="sa" value="Search" />
</form>
</div>

<body BGCOLOR="#F0FFA0">

<H1 ALIGN="center">こぼれネット</H1>
<H2 ALIGN="center">
www.kobore.net
</H2> 

(後略)

出力結果は、以下の通り。

C:\Users\ebata\kese\gonet-html>go run main.go
Review 0: hidden
Review 1: hidden
Review 2: text
Review 3: submit

未分類

■WordとExcelによる年賀状宛名書きは、

(1)「年賀状の宛名印刷 ワープロ編:ワード(Word)とエクセル(Excel)で年賀状の住所録作成、宛名を印刷「年賀状・暑中見舞いドットコム」2022年・令和4年寅(とら)年版」を読んで、毎年作り直すこと(大した手間ではない)。

(2)ただし"1.png"を読むこと(ここだけ違う)

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

2001年から使い続けてきた年賀状ソフトが、10年ほど前に販売が中止し、後継ソフトも会社も存在しません。

The New Year's card software that I have been using since 2001 was discontinued about 10 years ago, and there is no successor software or company.

これまでソフトを騙し続けながら使い続けていたのですが、流石に危機を感じて、昨年、WordとExcelを連携させた、年賀状宛名書システムを使いました。

I had been using the software deceitfully, but I felt that I was in danger, so last year, I built a New Year's card addressing system that linked Word and Excel.

問題は、

The problem is.

―― その使い方を忘れてしまって、現時点で、年賀状が発送できていないこと

"I forgot how to use it, so I haven't been able to send out any New Year's cards yet"

です。

新年早々、なんとも間抜けな話ですが、悪しからずご了承下さい。

This is a very dumb thing to say at the beginning of the New Year, but please accept my apologies.

-----

ちなみに、嫁さんは、古い年賀状ソフトの利用を続けています。

By the way, my wife continues to use the old New Year's card software.

新しいソフトを覚える気が、全くないようです。

She doesn't seem to be interested in learning new software at all.

しかし、印刷等は、私に丸投げされています。

However, she throws all the printing, etc. to me.

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

昨年、ブリ1尾、ボイルの蟹を1kgを注文しました。

Last year, I ordered 1 yellowtail and 1kg of boiled crab.

一昨年の正月に、ブリを1kg購入して、正月中ずっとブリ刺身を食べていたのですが、これが思いの他、家族に好評でした。

The year before last, I bought 1kg of yellowtail and ate yellowtail sashimi all through the New Year, which was unexpectedly popular with my family.

ブリ1尾は、その3倍以上はあり、さすがに多すぎた様です。正月三が日中で食べきるのは無理だろうと思っていますが、ブリは使い道が多いので、あまり心配はしていません。

One yellowtail is more than three times as much as last year, which is indeed too much. I don't think we will be able to eat it all in the three days of the New Year, but I'm not too worried because yellowtail has many uses.

-----

YouTubeを見ながら、魚の捌き方を学んでいます。

I'm learning how to process fish by watching YouTube.

というか、最近は『動画を見ながら料理をする』ということが普通になりつつあります。

Or rather, 'cooking while watching a video' is becoming the norm these days.

おかげで、私も、調理で失敗することは、滅多にありません。

Thanks to this, I rarely make mistakes in cooking.

料理に関しては、「レシピ」に固執したサービスが低調となり、ほぼ「動画サービス」で定着しています。

In terms of cooking, services that stick to "recipes" have become sluggish, and have been mostly established as "video services".

料理が「親から子への伝承」(いわゆる「おふくろの味」)という形態は、もはや必要ないのかもしれません。

It may no longer be necessary for cooking to be "handed down from parent to child" (so-called "mother's cooking").

家庭料理であれば、『クラウドからダウンロード』で、特に困ることもありません。

For home cooking, "Download from the Cloud" will not cause any problems.

-----

今どき、「おふくろの味」などというものに拘る人がいるとも思えませんが、もし、拘りたい人がいれば、自から教えを請うて、自力でその技術を継承すべきでしょう。

I don't think there is anyone who cares about "mother's taste" nowadays, but if there is someone who wants to, he or she should ask for help and pass on the technique by himself or herself.

そこには、女も男も年齢も結婚も未婚も、一切関係ありません。

It has nothing to do with women or men, age, married or unmarried.

『利益を受けたい者が、汗をかく』―― それだけのことです。

"People who want to benefit will sweat" - that's all there is to it.

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

私は、「NHKプラス」に加入していますので、パソコンでNHKの番組を見ることができます(受信料を払っていれば、タダです)。

I subscribe to "NHK Plus" so I can watch NHK programs on my computer (free of charge if you pay the subscription fee).

『NHKスペシャル「台湾海峡で何が~米中“新冷戦”と日本~」』は、1月2日まで、見ることができます。

NHK Special "What's Happening in the Taiwan Strait: The U.S.-China "New Cold War" and Japan" can be viewed until January 2.

興味のある人は、ご視聴下さい。

If you are interested, please watch.

-----

―― もの凄く面白く、そして、怖かった

"It was so interesting and scary"

台湾有事を想定した、日本国政府の対応のシミュレーションが、もの凄くリアルでした。

The simulation of the Japanese government's response to a possible Taiwanese emergency was very realistic.

ところで、「シミュレーション」というと、多くの人は、コンピュータシミュレーションをイメージすると思いますし、実際にWikiでも、そのように記載されていますが ―― これは正しくありません。

By the way, when we say "simulation", most people think it is computer simulation, and in fact, that is how it is described in the Wiki -- but this is not correct.

シミュレーションとは、『現実に行われていない物事について、想定する場面を再現して、その対応を試みること』です。

Simulation is "an attempt to recreate a hypothetical situation and respond to it in a way that has not been done in reality".

この番組でのシミュレーションは「台湾有事」でした。

The simulation in this program was "Taiwan Emergency".

安全保障関連の法律に携わった経験者や、自衛隊の元幹部、現職の国会議員などが、総理大臣、防衛大臣、官房長官の役になります。

People with experience in security-related legislation, former senior officers of the Self-Defense Forces, and current members of the Diet played the roles of the Prime Minister, Defense Minister, and Chief Cabinet Secretary.

自衛隊の元最高幹部が、湾有事の仮想シナリオを複数用意しておき、それを、状況にリアルタイムで届けて、その場で閣僚が協議して判断を行う、というものです。

The former top official of the Self-Defense Forces has prepared several hypothetical scenarios of a Taiwanese contingency, which were delivered to the situation in real time, and the cabinet members discussed and made decisions on the spot.

このシミュレーションの条件は(私の理解では)2つ

There are (as I understand it) two conditions for this simulation

(1)大原則として「対話をもって平和的に解決する外交」を堅持しつつも、有事の際には自衛権を発動すること

(1) While adhering to the principle of "diplomacy for peaceful resolution through dialogue," invoke the right of self-defense in the event of an emergency.

(2)ただし、武力発動、その他(住民の避難)は、全て現行の法律に基いて行われること

(2) However, the use of force and other actions (evacuation of residents) must be carried out in accordance with existing laws.

となっていました。

-----

シナリオの第1段は、「台湾で独立派の総統が誕生 → 中国軍による強襲揚陸訓練が開始 + 陸戦部隊も海岸部に結集」というものでした。

The first stage of the scenario was that an independent president would be born in Taiwan → Chinese forces would begin assault and landing drills + land troops would be assembled in the coastal areas.

さて、この段階で、日本国は何ができるか?

Now, at this stage, what can the Japanese nation do?

もし中国が米軍を攻撃すれば、日本は「集団的自衛権」によって戦闘状態に入れることになります。

If China attacks the U.S. military, Japan will be able to enter a combat situation through the "right of collective self-defense".

さて、ここで問題となるのは、どの時点で「集団的自衛権」の発動条件が整うのか? です。

Now, the question is, at what point do the conditions for triggering "collective self-defense" come into play?

米軍が戦闘準備に入った時? 米軍が攻撃を受けた時? 米軍が反撃を開始した時? 米軍が自衛隊に要請をしてきた時? と ―― 考えてみれば当然なのですが、これらの発動時間にはタイムラグがあります。

When the U.S. military prepares for battle? When U.S. forces are under attack? When the U.S. military launches a counterattack? When the US forces request the SDF? It is natural to think that there is a time lag between these activation times.

で、自衛隊としては「自衛隊を動かす為には時間が必要だから、「集団的自衛権」がどの段階で発動できるのかが、はっきりしていないと、米軍との共同作戦が意味をなさない」という、もっともな意見が出ています。

So, the SDF has a plausible argument that since time is needed to move the SDF, joint operations with the U.S. military will be meaningless unless it is clear at what stage the right of collective self-defense can be activated.

-----

私のような素人であれば、

As an amateur like me, I apt to think

―― 中国軍による軍事演習が開始された時点で、自衛隊を動かせばいいじゃん?

"Why don't they just move the Self-Defense Forces when the military exercises by the Chinese military start?"

と思ってしまいがちです。

しかし、自衛隊は法律に元づかないと動かすことができない組織なのです ―― いや、シビリアンコントロール下にある、法治国家は、すべてそういう運用がされていますけどね。

But the Self-Defense Forces is an organization that can only operate under the law -- well, all law-abiding nations under civilian control operate that way, though.

自衛隊は、我が国の国防が任務です。

The SDF is tasked with the defense of our country.

法律的には『台湾がどうなろうが知ったことか』というスタンスが、正解です。

From a legal standpoint, the correct stance is to say, 'I don't care what happens to Taiwan.

だって、台湾は、日本の軍事同盟国ではないのですから。

Because Taiwan is not a military ally of Japan.

『米軍』が絡んできて、そこで始めて『集団的自衛権』が発動するのだから、米軍が何もされていない段階では、自衛隊は、1mmも動けない、が、正論です ―― が、

Since the right of collective self-defense is activated only when "U.S. forces" are involved, the SDF cannot move even a millimeter when U.S. forces are not doing anything, however,

「そんな、集団的自衛権なんか、意味ないじゃんかー」というのが、現場の本音です。

The real feeling on the ground is that the right of collective self-defense is meaningless.

そして、この事例は、私たちの日常生活の常識とも一致しています。

And this case is also consistent with our common sense in our daily lives.

例えば、会社で、プロジェクトを行う場合、幹部の承認が下されるまでプロジェクトに着手していなかったら、プロジェクトは成り立ちません。

For example, in a company, if you are working on a project and you don't start working on it until it is approved by the executives, the project will not work.

「プロジェクトを動かせるギリギリの状態まで準備して、万全の状態で、承認を待機する」というのが、普通のプロジェクトの運用方法です。

The normal way of operating a project is to prepare the project until it is just about ready to move, and then wait for approval when it is ready.

これは、国会が無能だったということではないです。

This is not to say that the Diet was incompetent.

手段的自衛権のユースケースとしては、『朝鮮半島有事』と『ホルムズ海峡封鎖』で議論がされていました。

The use cases of the right of procedural self-defense were discussed in the "Korean Peninsula Emergency" and "Blockade of the Strait of Hormuz".

『台湾有事』は、その時、スコープに入っていなかったのです。

The "Taiwan contingency" was not in the scope at that time.

-----

シナリオの第2段は、「中国軍による与那国島周辺の海上封鎖 + 台湾本土への攻撃開始」でした。

The second stage of the scenario was the "blockade of the sea around Yonaguni Island by the Chinese military + launch of an attack on the Taiwanese mainland.

この段階で、米軍との共同作戦が可能になりますが、当然として、中国軍は、日本への本土攻撃も可能となります。

At this stage, joint operations with the U.S. military will become possible, and of course, the Chinese military will also be able to attack the Japanese mainland.

中国軍からの日本本土攻撃に対して、迎撃体制が完了していなければ、自衛隊は自衛の任務を果せないことになります。

The SDF will not be able to fulfill its mission of self-defense if it does not have a complete interception system in place against an attack from the Chinese military on the Japanese mainland.

さらには、住民を避難させるにも、法律の適用が必要なのですが、このような軍事攻撃に対して、自衛隊が住民避難を支援する法律が「ない」ことも分かりました。

Furthermore, they found out that there is "no law" to support the SDF in evacuating residents in response to such a military attack, even though the law must be applied to evacuate residents.

―― 災害救助法に元づいて避難させればいいじゃん?

"Why don't they just evacuate them based on the Disaster Relief Act?"

と、私と同じように、閣僚役の人も考えたようですが、これは、法解釈に無理がある、との意見も出ていました。

And, like me, some people in ministerial roles thought that this was an unreasonable interpretation of the law.

閣僚役の人が、法文集を開きながら、議論している様子は、非常に印象的でした。

It was very impressive to see a person playing the role of a cabinet minister, opening a collection of legal texts and discussing them.

『その感じ、分かるわー』と呟きながら、番組を見ていました。

I was watching the program, muttering, "I know that feeling".

-----

結論です。

Conclusion.

私、現在のプログラミング教育における「プログラム的思考(テキシコー)教育」のアプローチがさっぱり分からん、と、こちらに書きました。

I wrote here that I have no idea about the current approach to "programmatic thinking (tekishiko-) education" in programming education.

もしかしたら、その方法の一つは、このようなシミュレーションを使った教育かもしれない、と思っています。

Perhaps one of the ways to do this is through education using simulations like this one, I think.

ただ、この「シミュレーション教育」は、その題材を作ることや、状況を判断する方法(人かコンピュータ)が、難しいだろうな、とも、考えています。

However, I also think that this "simulation education" will be difficult to create the subject matter and the method (human or computer) to judge the situation.

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

githubの中のファイルを直接編集したいだけなのに、色々調べたけど、余計な説明が多すぎて困っています。

上記の2つ(GitHub Repositories, GitHub Pull Request and Issues)がインストールされていることが前提です。

以下の操作をやるとできるようになるようです。

ブラウザに次の画面が次の画面が立ち上がってきます。

VSCodeの方に以下のメッセージが出てくるので「許可」を押下して下さい。

VSCodeにリポジトリの内容が表示されます。

編集するファイルを選んで、変更します。"test5"と記載して、ファイルをセーブして、以下の手続を行います。

コミットのメッセージを記載する。

以下のボタンを押して下さい。

Webで、反映されているのが確認できます。

本来は、ブランチとかマージとか、いろいろできるのでしょうが、とりあえず、iPad用の編集用に使えれば足りるので、これでいいのです。

https://vscode.dev で、編集もできそうだ、ということも確認しました。

ーーーー

コミットができなかったりするので、できたケースをもう一つ

変更してセーブすると「M」が表示されるので、以下の手順でコミットを進める。

の手順でコミットができるようです。

反映されています。