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

version: '3'

services:
  db:
    image: postgres:14
    container_name: postgres

    ports:
      - 15432:5432
    volumes:
      - ./stock_db:/stock_db
      - db-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=password
volumes:
  db-data:

# stock_dbというディレクトリを掘っておくこと
# docker exec -it postgres bash // コンテナへのログイン方法

ーーーー

>docker-compose start

ーーーー

>docker exec -it postgres bash

ーーーー

$ gem install csv2psql

ーーーー

CREATE TABLE stock(Date varchar(10), Open numeric, High numeric, Low numeric, Close numeric, Ave5day numeric, Ave25day numeric, Ave75day numeric, VWAP numeric, Vol numeric, Vol5day numeric, Vol25day numeric);

ーーーー

hitachi=# CREATE TABLE stock(Date varchar(10), Open int, High int, Low int, Close int, Ave5day int, Ave25day int, Ave75day int, VWA
P int, Vol int, Vol5day int, Vol25day int);
CREATE TABLE
hitachi=# \copy stock from '/stock_db/hitachi.csv' with csv delimiter ',';
COPY 245
hitachi=# select * from stock;
    date    | open | high | low  | close | ave5day | ave25day | ave75day | vwap |   vol    | vol5day | vol25day
------------+------+------+------+-------+---------+----------+----------+------+----------+---------+----------
 2022/6/3   | 6860 | 6897 | 6781 |  6856 |    6791 |     6492 |     6021 | 6840 |  1942500 | 2547480 |  2870752
 2022/6/2   | 6795 | 6802 | 6715 |  6797 |    6752 |     6460 |     6009 | 6778 |  1654700 | 2506700 |  2903484
 2022/6/1   | 6686 | 6796 | 6671 |  6796 |    6712 |     6431 |     5998 | 6752 |  1575500 | 2560260 |  2931012
 2022/5/31  | 6750 | 6798 | 6706 |  6725 |    6678 |     6402 |     5986 | 6735 |  3122200 | 2775060 |  2944456

 

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

SBI証券では、HYPER SBIというSBI証券が提供する取引ソフトを利用することでダウンロードが可能です。これまで、HYPER SBIについては条件を満たしていない場合だと月額利用料を支払う必要がありましたが、2021/10/2(土)より待望の無料化が実現しました。

との事でしたので、シミュレーション用にこのデータを頂いてくることにしました。

ちなみに、私の環境はWindows10です。


まずSBI証券のサイトにログインして、

HYPER SBI 2(国内株式版)をダウンロードします(HYPER SBIはサービス終了となるようです)

あとは、普通のアプリを同じようにインストールすればOKです。

HYPER SBI2を起動すると、こんな画面が出てきます(画面というよりはメニュー)

でてきたチャートに、6501と入力(ただの例題です)

で、「時系列」ボタンを押下します。

個別銘柄に「6501」→「日足」→「2021/06/03」(適当でいい) → 「2022/06/03」(適当でいい)→「照会」→「CSVエクスポート」

以下は、csvファイルをエクセルで表示したものになります。

あとは、これをDBに格納すれば、データを使い倒すことができます。

例:「PostgreSQLでCSVファイルをインポート/エクスポートする方法」

うーん、最近、証券会社もデータの大盤振舞いをしていて助かります。


■投資信託の情報の取得方法

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

wayを取るには、以下のコマンドを使う

utsu_tram_db=# select * from ways where name = '(仮称)宇都宮ライトレール';

で、宇都宮ライトレールのwayが取れることが分かったので(誰か知らないけど、コメント入れてくれた人、ありがとう)、あとは、updateコマンドで、costとreverse_costを、小さく(1/3くらい?)すればいけそう。

SQL文の書き方を調べよう。


いちいちDockerの中に入るのが面倒なので、windows10からpsqlでログインします。

C:\Users\ebata>psql -U postgres -p 15432
Password for user postgres:
psql (13.4, server 12.5 (Debian 12.5-1.pgdg100+1))
Type "help" for help.

で、江端が変態的改造した宇都宮ライトレールのテーブルにコネクションします。

さあ、道から乗って、LRTに乗って、橋を渡って、道に下りられるか?(道路と鉄道の強制マージの件)

postgres=# \c utsu_tram_db
psql (13.4, server 12.5 (Debian 12.5-1.pgdg100+1))
You are now connected to database "utsu_tram_db" as user "postgres".

utsu_tram_dbに直接改造を加えるのは怖いので、utsu_tram_db2 というレプリカを作っておきましょう。

Dockerの中にある、postgreSQLのpostGISのDBを、丸ごとコピーする方法

でも、できるのですけど、面倒なのでWindows10から直接できないか、試してみました。

【PostgreSQL】Windows に psql コマンドだけをインストールする手順

C:\Users\ebata>createdb -U postgres -p 15432 utsu_tram_db2
Password:

で、

utsu_tram_db=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
---------------+----------+----------+------------+------------+-----------------------
utsu_tram_db | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
utsu_tram_db2 | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
(12 rows)

あ、できている。凄い。(というか、createdbが使えた、といのも驚いたが)

で、MinGWのシェルから、

$ pg_dump -U postgres -p 15432 -Ft utsu_tram_db | pg_restore -U postgres -p 15432 -d utsu_tram_db2

Password:
Password:

を実施したら、passwordを2回聞かれました(珍しい)。確認したらレプリカ(utsu_tram_db2)が、できていました。こっちで、色々テストします。ちなみに、command.comではパイプ"|"が使えないみたいです。(ちなみに、pg_dump, pg_restoreが使えたことにも驚いたが)


さて、utsu_tram_db2を使って、costと、reverse_costの値を変えてみます。

現在は、こんな感じ。

utsu_tram_db2=# select cost, reverse_cost from ways where name = '(仮称)宇都宮ライトレール';
cost         |        reverse_cost
------------------------+------------------------
0.007490415761689246 | 0.007490415761689246
0.00040536575640007835 | 0.00040536575640007835
0.01932049990115761 | 0.01932049990115761
0.008712540173673398 | 0.008712540173673398
0.007102267864215258 | 0.007102267864215258
0.00684623081981901 | 0.00684623081981901
0.004139533878435676 | 0.004139533878435676
0.005101717091578247 | 0.005101717091578247
0.004405341713757751 | 0.004405341713757751
0.004776545712421741 | 0.004776545712421741

コスト値を小さくすると、ダイクストラで宇都宮ライトレールが選ばれやすくなる(はず)だけど、いくつくらいがいいかなぁ。1/3か 1/5か。とりあえず、効果が見たいから、1/5くらいで書き換えやってみよう。

utsu_tram_db2=# update ways set cost = cost * 0.2 where name = '(仮称)宇都宮ライトレール';
UPDATE 129

さて、どうなっているかな

utsu_tram_db2=# select cost, reverse_cost from ways where name = '(仮称)宇都宮ライトレール';
cost | reverse_cost
------------------------+------------------------
0.0014980831523378492 | 0.007490415761689246
8.107315128001567e-05 | 0.00040536575640007835

まだ、reverse_costの方には手を出していないので比較ができるはず。

0.0014980831523378492  ÷ 0.007490415761689246 = 0.2

おお、できている。

では、reverse_costの方も変えてしまおう。

utsu_tram_db2=# update ways set reverse_cost = reverse_cost * 0.2 where name = '(仮称)宇都宮ライトレール';
UPDATE 129

よし、これにて、cost, reverse_costの強制変換処理を完了

ちょっと問題はあるようですが、動いているようです。

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,江端さんの技術メモ

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,江端さんの技術メモ

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,江端さんの技術メモ

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の方に反映されるようなことになれば(アップロードされれば)、世界中の地図がメチャクチャになる、からです。

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

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

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

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

こんな感じになって、困っていました。

「セキュリティ保護なし」をクリックすると、次の画面が出てきます。

">"をクリックすると、

「証明のパス」を選ぶと、こんな感じになっています。

で、問題は、この「Cisco Umbrella Root CA」が、「信頼されたルート証明機関」に入っていないことらしいです。

ところが、これはインストールして使われるものでもないらしいとか、ネットでは色々書かれていましたが、私は、この「Cisco Umbrella Root CA」を力付くで、インストールしました。

"Cisco_Umbrella_Root_CA.cer"を探し出して、そのファイルを適当なディレクトリにダウンロード。ファイルを右クリックして、「証明証のインストール」を選んで、以下を実行。

 

これで、現在のところ、問題は出てこなくなっているようです。
(セキュリティ的にどうかとも思うのですが、作業できないと困るので)

以上