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

package main

import (
	"fmt"

	"github.com/PuerkitoBio/goquery"
)

func main() {

	q, err := goquery.NewDocument("https://kabutan.jp/stock/?code=6501")
	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/05,江端さんの技術メモ

package main

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

	"github.com/PuerkitoBio/goquery"
)

func main() {
	// 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)
	})
}

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

嫁さんは、いわゆるレストランで接客のパートをしています ―― 私には絶対にできない職業の一つです。

My wife works part time in customer service in restaurant --- one of those professions I could never do.

『無礼な客は、許さない』と確信できるからです。

I am convince that I never forgive an arrogant customer.

-----

今や、飲食店におけるタブレットを使ったオーダーシステムが、普通になりつつあります。

Now an order system using a tablet seems to be ordinally in the food and beverage field.

このシステムは、人件費やオーダーミスを減らす観点からメリットもありますし、お客にとってもオーダー取りがこなくてイライラすることもないというメリットがあります。

This system has merits that decreasing labor costs and order errors, and less frustration when an order is not picked up for customers.

もっとも、このようなシステムに慣れていない人にとっては、不便です。

Of course, it is inconvenience for customers who are not familiar with this tablet system.

-----

最近、タブレットが使えない高齢者が問題になっているようです。

Recently, old-agers who cannot use a tablet become social problems.

タブレットが使えない高齢者は、当然に支援すべきですが、タブレットで注文するようにお願いすると、怒鳴りつける客(ジジイに多い)が結構頻発しているらしいのです。

Of course, we have to support theses old-agers who cannot use a tablet, however, my wife said that some old-agers who got angry when she asked them to use the tablet, are increasing.

嫁さんから話を聞いていると、私の方がキレてしまいます。

Hearing wife's story, it is me who come to angry.

―― 店員は当店の大切なアセット(資産)です。店員を怒鳴りつけるお客様はお帰り頂きます。またのご来店を「拒否」します。

"Our clerks are our most important asset. Any customer who yell at our clerks will be asked to leave. We will "refuse" next your visit.

って、言えないのかな、と言ったら、『それは無理だ』と言われました。

When asking her, she said "it is impossible".

(実は、これ(出禁)は法律的に可能です(民法第521条「契約の自由」))

(Actually, this (banning) is legally possible (Civil Code Article 521 "Freedom of Contract").

さて、これから「マスクをしない方は、入店を御遠慮下さい」が、「ワクチン接種を終えていない方は、入店を御遠慮下さい」に変化していくに際して、『これは、"差別"なのか?』という純粋な疑問です。

-----

これは、インタフェースの問題だと思うのですよ ―― タブレットではなく、ジジイの方の。

This is a interface problem of old-agers not tables.

(1)『お前がオーダーを取れ!』と怒鳴るジジイと、

(1) The old man who yell "You take the order"

(2)『何度も済まないけど、教えて下さらないか』と頭を下げるジジイ

(2) The old man who bows his head and says, "I'm sorry to repeat some questions again, but could you please teach me?"

私たちの社会は、(1)のジジイを切り捨てて、その労力を(2)のジジイの支援に注ぎたい、と思うものです。

Our society think that we cut out the the above (1) old man, and want to support the above (2) old man.

私は、この感情をシステム化する ――「ジジイ選別システム」を作っている、と自負しております。

Now I am systematizing this emotion, and creating "the system that cut arrogant customer off"

-----

『お客様は神様です』の旧態依然の価値観で生きているジジイたちに告ぐ。

I will tell the old-agers who live by the old-fashioned value system of "the customer is God".

私は、この価値観を破壊します。

I destroy this values.

いずれ、私のシステムが、そのようなジジイたちを排除するようになるでしょう。

Eventually, my system will be designed to eliminate those old-agers.

今からでも、自分のインターフェースを変更して、「私のシステム」にチューニングした方がいいです。

I think that they should change their interface, and tune them into "the Ebata's system".

未分類

https://tutorialmore.com/questions-2093576.htm

lengthとlength_mの違いは何ですか?また、それぞれの単位距離は何ですか?

length  度単位であり、それほど意味はありません。

緯度・経度の 1度はどれくらいの長さがあるのか

143.48731327191777 ÷ 0.0016025174726055347 = 89538.688797334365001365036280371 となり、概ねあっている様子。

length_m  メートル単位です。

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

utsu_tram_db=# select * from ways where source =0
;
gid | osm_id | tag_id | length | length_m | name | source | target | source_osm | target_osm | cost | reverse_cost | cost_s | reverse_cost_s | rule | one_way | oneway | x1 | y1 | x2 | y2 | maxspeed_forward | maxspeed_backward | priority
| the_geom

gid | osm_id | tag_id | length | length_m | name |

source: 始点ノードの識別子

target : 始点ノードの識別子

| source_osm | target_osm |

costcost : エッジにかかる重み(負の重みは、エッジがグラフに挿入されるのを防ぎます)

reverse_cost: エッジの反対方向のためのコスト。

| cost_s | reverse_cost_s | rule | one_way | oneway |

x1 : エッジの始点のx座標

y1 : エッジの始点のy座標

x2 : エッジの終点のx座標

y2 : エッジの終点のy座標

| maxspeed_forward | maxspeed_backward | priority
| the_geom

 

・id : エッジの識別子 [int4] ・・・・source : 始点ノードの識別子 [int4] ・・・・target : 終点ノードの識別子 [int4] ・・・・cost : エッジにかかる重み(負の重みは、エッジがグラフに挿入されるのを防ぎます)。 [float8] ・・・・reverse_cost(オプション) : エッジの反対方向のためのコスト。

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

以前、何度かアニメ「氷菓」の話をしました。

Previously, I often told the animation "Hyouka".

私なりの「氷菓」シリーズの解釈は、

What I understand the contents of "Hyouka" series, are

(1)『努力は天才に勝てない』と

(1) "Hard work is no match for genius."

(2)『天才は幸せではない』という、

(2) "Genius is not happy".

私がティーンの時代の言語化できなかった事実を、等身大の若者たちの姿で、納得できる描写で描いている点にあります。

This animation show us the above realties that I had not reached in my teenager, appearing life-size young people.

-----

その続編となる米澤 穂信さんの小説「いまさら翼といわれても」についても、何度も書きましたが、今、改めて読み直しています。

I often wrote about the sequel novel "Even if you give me my wings now", by Honobu Yonezawa, and I am reading it again now.

こちらでは、上記(1)(2)のテーゼに加えて、『高校の部活動の無意味さ』についても記載されています。

In this novel, 'insignificance of high school club activities' are described, in addition to the above (1) and (2) themes.

友人同士で派閥を作り、目標もなく、ただ時間を消費し続けるだけの高校の部活動について、厳しい批判と思われる短編が登場します。

There is a story that is a harsh criticism of high school activities that has no purpose, waste time and just make factions with friends.

比して、そのような部活動などに目もくれずに、ハイスクールに入る前から、自分のできること、好きなことのみに注力し、今や、世界を動かしている、2大オペレーティングシステムの礎を作った人たちもいます。

In comparison with, there are persons who completed two world-wide computer operating systems. Even before entering high school, they focused on what they did and what they wanted, without paying attention to such club activities, etc.

もちろん、そのような「成功体験」がある例はレアなケースですし ―― ぶっちゃけ「成功」なんてどうでもいいのです。

Of course I know such "success experiments" are rare. Moreover I don't care about "success" to be frank,

あの高校時代の時間を、もっと『狂ったように過す』ことはできたと思います ―― 友人という名のグループに安住して、無為な時間を浪費することなく。

I think I could have spent the time for 'going crazy' during those high school years.

つまり「昔の私」です。

In other words, "It was me as young".

-----

もっとも、私を含む多くの凡庸な人間にとって、このような「狂ったように過す」ことのできる対象に巡り合うことは難しいです。

However, for many people including me, it is difficult to find such an object of "going crazy".

加えて、ティーンの共通の"貨幣"が、"友人"という奇妙なものであるからです。

In addition, the common "currency" of teenager is a strange thing that called "friends".

そして、彼等は、その"貨幣"の多少、つまり"友人数"という価値の呪縛から逃れられないからです。

And they cannot escape from the spell of the value of "currency", called "numbers of friends".

この"友人"という名の"貨幣"は、ティーンの時代を越えても、価値あるものと見なされることがあります。

The "currency" called "friend" is often treated to be valuable beyond the teenager.

-----

来週リリースされるコラムでは、この"友人"という名の"貨幣"について論じる予定です。

In the column of this month, I will argue the "currency", called "friends"

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

JSONで、芳賀・宇都宮LRTの路線と一般道を、停車駅の単位で接続して、LRTを道路扱いする方法にしてみました。

で、昨日の実験結果の方法

街の中に道路を作って、ダイクストラ計算ができるか試してみた件 ―― JOSMを使った道路追加の方法を試す

を使って、utsunomiya-lrt-latest-1-no_modify.osmを手動で作成しました。

そんで、もって、

OpenStreetMapから、鉄道情報(芳賀・宇都宮LRT)を引き出して、ダイクストラ計算やってみました。

を使って、道路とLRTのみのDBを作りました。

root@a2b2f7061d88:~# osm2pgrouting -f /utsu_db/utsunomiya-lrt-latest-1-no_modify.osm -c /utsu_db/mapconfig_for_cars_tram.xml -d utsu_tram_db -U postgres

これで、私は、LRTの架橋を使って、「さあ、道から乗って、LRTに乗って、橋を渡って、道に下りられるか?」を試してみます。

ターゲットとしたノードは、駅近くを選びました。

では始点の方を拡大します。

ダイクストラ計算の結果

postgres=# \c utsu_tram_db
You are now connected to database "utsu_tram_db" as user "postgres".
utsu_tram_db=# SELECT seq, node, edge, cost, agg_cost FROM pgr_dijkstra('SELECT gid as id, source, target,length_m as cost FROM ways',14779, 14266, false);
seq | node | edge | cost | agg_cost
-----+-------+-------+--------------------+--------------------
1 | 14779 | 42200 | 42.785394484227744 | 0
2 | 34 | 19785 | 7.618791492678159 | 42.785394484227744
3 | 35 | 48595 | 389.45546677917343 | 50.4041859769059
4 | 42701 | 59452 | 12.262652109536079 | 439.85965275607936
5 | 42982 | 59725 | 270.535671188774 | 452.12230486561543
6 | 42176 | 58890 | 215.43378099396782 | 722.6579760543895
7 | 42004 | 58695 | 620.3511502405348 | 938.0917570483573
8 | 42005 | 58696 | 199.48206530565716 | 1558.442907288892
9 | 42017 | 58710 | 162.9099908343982 | 1757.9249725945492
10 | 33448 | 48969 | 102.43865451629547 | 1920.8349634289475
11 | 14266 | -1 | 0 | 2023.273617945243
(11 rows)

QGISで書いてみたら、こうなった

あれ、LRTの架橋を通っていないぞ。これ前にも見たことがあるな。これかな

postGISのpgr_dijkstra()を試しているけど、理解できない現象が発生している件

 

revese_costを入れたら、ちゃんとLRT架橋を通過しました

よし、これで、道路と鉄道の強制マージに目処が付きました。

ちなみに、OpenStreetMapに実装されていなかった部分を、JSONで道路工事をした結果、ちゃんと開通していることを確認しました。

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

―― ノードの座標情報が記載されていなければ、JOSMに地図が表示される訳ないやん?

"Without the information of latitude and longitude described in the script, even the JOSM cannot display the additional map information"

と、寝ている最中に気がついて、目が覚めてしまい、本日は不眠で体がだるいです。

This morning I noticed the above and waked up, and I feel tired all day.

この↓の話です。

This is the story.

街の中に道路を作って、ダイクストラ計算ができるか試してみた件 ―― JOSMを使った道路追加の方法を試す

朝方に、夢の中のネタで起こされるのは、コーディング、特許明細書などをガリガリ書いている時に多いです。

This happening is likely to happen in my dream early morning, when I concentrate coding or patent writing.

-----

今日、午前中に、電子地図(OpenStreetMap)の、ローカルの改竄に成功して、ちょっと気分がいいです。

Today, before noon, I succeeded a falsification of digital map (Open Street Map).

こんな時は、勢いにのって、本番の地図にも手を出すと、作業が早いのですが ――

In time like this, building on the momentum, I know that I have to deal with the target map, as soon as possible, however,

次のフェーズに入ると別の問題が発生することは分かっています。

I know that another problem happens easily in the next step.

ですから『今日は気分の良いまま、今日という日を終えたい』です。

Therefore, "I want to end today, with feeling good."

が、まあ、そんな甘えたことは言ってられませんので、多分、今晩も頭を抱えることになるのでしょう。

However, I know that I cannot be so picky. So some problems will annoy me in this night too.

で、また明日の朝、『楽しくもない夢に叩き起こされる』、と。

And tomorrow's morning, I will be waken up by a nightmare.

-----

『不毛だ』と思いますが、エンジニアの日常って、こんなものですよね。

I think it is meaningless, however, this is a typical engineer's life.

それとも、私だけ?

Or is it just me?

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

OpenStreetMapから、鉄道情報(芳賀・宇都宮LRT)を引き出して、ダイクストラ計算やってみました。

この投稿の最後に書いた『経路が繋がっていないと、ダイクストラ計算はできないはずなので』を、JOSMを使ってなんとかできないか実験中しています。

JOSMについては、こちらを御参照下さい。

で、こちらの本で例題として出している街のデータを使って実験します(宇都宮のデータはデカすぎるので)。

https://github.com/TomoichiEbata/hirohakama/tree/main/hiro_db の hirohakama.osmを使って実験します。

まず、hirohakama.osm から hirohakama1.osmを複製して、さらに、このhirohakama1.osmを、JOSMにローディングして、ファイル → 保存をします。JOSMに入れるだけで、フォーマットの一部が変更されるからです。

こうしておいて、さらに、hirohakama1.osmのコピー、hirohakama2.osmを作成します。

以後、この2つのファイルを比較することで、作成状況を把握していきたいと思います。

まず、すでにあるノード(node)間を繋いで道路を作ってみます。(小さい□がnodeです)

をクリックして、

この2点間に線を引きます。

で、その後、このhirohakama2.osmをセーブして、hirohakama1.osmと比較してみました。

結果は以下の通り。way id='220736115' に、ref='3813457320'のノードが追加されています(この一行だけ)。

ちなみに、ref='3813457320'のノードの情報は、

<node id='3813457320' timestamp='2015-11-02T07:07:06Z' uid='3057995' user='oini' visible='true' version='1' changeset='35026994' lat='35.5957559' lon='139.4735283' />

となっています。

既存のノード同士をくっ付けるのであれば、結構簡単にできそうです。

では、ノード以外の道路を適当に繋げるとどうなるかを、調べてみます。

で、ノード番号 -101965, -101966 の座標は入っていませんでした(作られていませんでした)。多分ダイクストラやっても、無視されると思います。

見落していました。作られていました(ファイルの最初の方だったので)。

<node id='-101792' action='modify' visible='true' lat='35.59604489421' lon='139.47307912887' />
<node id='-101793' action='modify' visible='true' lat='35.59558383511' lon='139.47265061383' />

ノードを動かしたら、

ちゃんと、ノードの座標も動いていました。

ただ、ノードでない場所(×の部分)とかを動かしてノードを増やしても、先程のようにマイナスのノード番号が出てきて、座標も追加されませんでした。

しかし、ノードの追加はしたいなぁ(今後のことを考えると)

で、"JOSM" "ノードの追加" で検索したら、このページが出てきました。

しかし、ただノードを追加すれば良いってもんじゃない。既存のWAYに埋め込まなれば意味がない。さて、どうしようか。


今考えている、最も安直なアイデアは、

OSMファイルに、ノード番号 -101965, -101966 の座標を手で書き込む、です。

試してみて、上手くいったら、またご報告します。

不要です。座標(ノード)はできていました。現時点の問題は、QGISとかに表示されない、ということです。

私が、人工的に追加したノードの記述は、

<node id='-101792' action='modify' visible='true' lat='35.59604489421' lon='139.47307912887' />

ですが、オリジナルのノードは、

<node id='278288868' timestamp='2015-11-02T07:00:53Z' uid='3057995' user='oini' visible='true' version='4' changeset='35026937' lat='35.5997134' lon='139.4660138' />

と、だいぶ表示形式が違うようです。

JOSMでは表示されますが、QGISでは表示されません。

 

https://help.openstreetmap.org/questions/71446/how-to-get-changes-how-to-commit-only-changed-elements

に、

JOSMは、どの要素が変更されたかを正確に記録しています。アップロード時には、あなたが触っていないオブジェクトはすべて無視されます。タグを追加して後で削除した場合など、例外があるかもしれません。

この情報はOSM XMLファイルにも保存されます。action='modify' と action='delete' の要素だけが、OSM データベースにアップロードされます。

との記載がありました。つまり、本番情報として認識されないのかな、と思っています。

https://wiki.openstreetmap.org/wiki/JA:%E3%83%8E%E3%83%BC%E3%83%89

には、

名前 説明
id 整数(>=1) ノードのIDはノードの中でのみ一意となる。(同じIDを持つウェイが存在しても良い。)一般的なエディターでは、サーバーに保存される前のノードのIDに負数が用いられる。サーバー上のノードのIDは不変であり、既存のノードに割り当てられたIDは将来にわたって変更されない。削除されたノードのIDが最利用されることはない(削除を取り消した場合を除く)。

という記載があるので、少なくとも負数を使うのは、ダメみたい。

近くにある、このNodeとWayを参照してみる。

(宇都宮レールウェイの場合)<tag k='construction' v='tram'/>と記載されていましたので、これを、強制的に<tag k='railway' v='tram'/>に置換する

(1)node id, way idの負数から、マイナスを取って、強制的に正数にする(他のnodeやwayとぶつかっていないことを確認する)

(2)"action='modify'" を削除してみる

(2)<tag k='highway' v='residential' />を追加してみる。

<way id='102395' visible='true'>
<nd ref='101792' />
<nd ref='101793' />
     <tag k='highway' v='residential' />
</way>

で、これでQGISで表示したら、やっと出てきました。

この、手動で変更したhirohakama-21.osmが、postgreSQL+postGISに載るかやってみました。

詳しい手続は、このWebサイトから探していただくか、面倒なら、GISをDIYで作ろう―PostGISを使い倒すを手に入れて下さい。

root@abbab13a933e:/# psql -U postgres
psql (12.5 (Debian 12.5-1.pgdg100+1))
Type "help" for help.

postgres=# CREATE DATABASE hiro_db21;
CREATE DATABASE
postgres=# \c hiro_db21
You are now connected to database "hiro_db21" as user "postgres".
hiro_db21=# create extension postgis;
CREATE EXTENSION
hiro_db21=# create extension pgrouting;
CREATE EXTENSION

hiro_db21=# \dt
List of relations
Schema | Name | Type | Owner
--------+-----------------+-------+----------
public | spatial_ref_sys | table | postgres
(1 row)

hiro_db21=# exit
root@abbab13a933e:/# osm2pgrouting -f /hiro_db/hirohakama-21.osm -c /usr/local/share/osm2pgrouting/mapconfig_for_cars.xml -d hiro_db21 -U postgres

さて、ダイクストラがちゃんと働いているかを調べてみました。

hiro_db21=# SELECT seq, node, edge, cost FROM pgr_dijkstra('SELECT gid as id,
source, target,length as cost, reverse_cost FROM ways',31, 262);
seq | node | edge | cost
-----+------+------+------------------------
1 | 31 | 1 | 0.0002245334340526014
2 | 1 | 3 | 0.000629444702259577
3 | 2 | 356 | 0.00046326006156789223
4 | 262 | -1 | 0
(4 rows)

QGISで調べてみました。

新しい道路で、ダイクストラ計算ができていることが確認できました。

 


P.S. 調べていたら、駅の構成についての説明文を見つけました。後程、参考にさせて貰おうと思います。

 

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

JOSMのノードの追加は、「上級者モード」にならないと、メニューが出てきません。

とすると、メニューが見えるようになります。

この理由は、比較的、推測しやすいです。

もし間違って、このようなデタラメな地図が、OpenStreetMapの方に反映されるようなことになれば(アップロードされれば)、世界中の地図がメチャクチャになる、からです。

今、私がやっていることは、自分のシミュレータ用に都合よく地図を改竄(かいざん)していることですから、

ですから、間違っても、この改竄した地図をアップロードしないことに注意しなければなりません。

故に、「上級者モード」ということ ―― なんだろうなぁ、と思っています。