2020,江端さんの忘備録

引き続き、仕様書を読みながら、コーディングを続けていますが、そればかりでは楽しくないので、コミックの読み直しをしています。
I continue to code while reading the specifications, but it's not fun, so I'm rereading the comics.
「薬屋のひとりごと」
"A Pharmacist's Small Talk"
が面白いです。
is fun
内容についてはググって下さい。
Please google for the content.
中国の宮廷(後宮等)の美姫たちが登場し、医薬(主に毒薬)を取り扱う、そして、絵が美しい、歴史と化学を融合させた、コンテンツです。
These are contents that fuse history and chemistry, beauty princesses from the Chinese court (such as the shrine) appeared, and heroin Handles pharmaceuticals (mainly poisons). In addition, the picture is beautiful.
-----
今回は、これを電子書籍で購入して、Fire7で購読している点が違います。
This time, the difference is that I subscribed and read Fire7 as an e-book.
なので、娘から不平不満を受けています。
My daughter is complaining.
本の書籍でないと、家族で共有することができないからです。
The books can not be shared with family.
いや、実はできるのですが、まあ、これは、「私の方ががんばる」のは、筋が通らないかな、と思いまして。
No, I can, but it is strange that "I will do my best."
という訳で、もし娘が私がAmazonで購入したマンガが見たいのであれば、私は、娘からの具体的な手続の指示を待っていればいい、と思っています。
So, if my daughter wants to see the manga that I purchased on Amazon, I think I should wait for her specific instructions from my daughters.
I'm refusing to do "IT neglect."
-----
ところで、この「薬屋のひとりごと」は、原作1つで、コミカライズが2種類という、珍しい(ですよね?)例です。
This "A Pharmacist's Small Talk" is unusual; one original generates two types of comicalization.
ちなみに、私は「サンデーGXコミックス」の方を購入していますが、「ビッグガンガンコミックス」の方の絵も気にいっています。さすがに両方購入は厳しいので我慢していますが。
I purchased "Sunday GX Comics"; however, I think the picture of "Big Gangan Comics" is also good. I'm patient because both are tough to buy.

2023,江端さんの技術メモ

SELECT * FROM records WHERE start_at = '2023-03-20 05:03:00'; start_atの時間順に表示するSQLを教えて下さい。
SELECT * FROM records ORDER BY start_at ASC;

降順(新しいものから古いものへ)に並べ替えたい場合は、ASCDESC に変更します:
SELECT * FROM records ORDER BY start_at DESC;

select user_id, start_at, end_at from records order by start_at ASC where user_id = 7; のSQLは何が間違っていますか?
SELECT user_id, start_at, end_at FROM records WHERE user_id = 7 ORDER BY start_at ASC;

moove=# select place from records where id = 2; place ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [{"lat": 34.7325, "lng": 135.4986}, {"lat": 34.7326, "lng": 135.4989}, {"lat": 34.7326, "lng": 135.4989}, {"lat": 34.7327, "lng": 135.4995}, {"lat": 34.7327, "lng": 135.5}, {"lat": 34.7328, "lng": 135.5002}, {"lat": 34.733, "lng": 135.5006}, {"lat": 34.7331, "lng": 135.501}, {"lat": 34.7334, "lng": 135.5015}, {"lat": 34.7336, "lng": 135.5018}, {"lat": 34.7336, "lng": 135.5018}, {"lat": 34.7336, "lng": 135.5019}, {"lat": 34.7337, "lng": 135.5021}, {"lat": 34.734, "lng": 135.5024}, {"lat": 34.7343, "lng": 135.5026}, {"lat": 34.7346, "lng": 135.5024}, {"lat": 34.7347, "lng": 135.5024}, {"lat": 34.7346, "lng": 135.5024}, {"lat": 34.7345, "lng": 135.5025}, {"lat": 34.7343, "lng": 135.5027}, {"lat": 34.7343, "lng": 135.5029}, {"lat": 34.7342, "lng": 135.5031}, {"lat": 34.7344, "lng": 135.5035}, {"lat": 34.7344, "lng": 135.5035}, {"lat": 34.7344, "lng": 135.5035}] (1 row) で登場する、最初の{"lat": 34.7325, "lng": 135.4986}と、最後の {"lat": 34.7344, "lng": 135.5035}だけを取り出すSQL文を書いて下さい
WITH places AS (
SELECT jsonb_array_elements(place) AS place_elements
FROM records
WHERE id = 2
)
SELECT
(SELECT place_elements FROM places LIMIT 1) AS first_place,
(SELECT place_elements FROM places ORDER BY jsonb_array_length(place) DESC LIMIT 1) AS last_place
FROM records
WHERE id = 2;

select user_id from records; で出てくる異なるuser_id(整数)をピックアップするSQL文を教えて下さい
SELECT DISTINCT user_id FROM records;

ありがとうございます。では、これを降順に並べる方法も教えてください
SELECT DISTINCT user_id FROM records ORDER BY user_id DESC;
昇順ならどうなりますか
SELECT DISTINCT user_id FROM records ORDER BY user_id ASC;

 

2023,江端さんの技術メモ

指定された二つの位置情報間のデータを30秒ごとに補完するには、まず、始点と終点の位置情報と時刻を取得し、それらの間の差を求めます。次に、時間と位置の差を等間隔に分割して、各時点での位置を計算します。

以下のGoプログラムは、始点と終点の情報を基に30秒ごとの位置情報を補完する例です:

package main

import (
	"fmt"
	"time"
)

// Location は緯度と経度を保持する構造体です
type Location struct {
	Lat, Lng float64
}

func main() {
	// 初期位置情報
	startLocation := Location{Lat: 34.665300, Lng: 135.224100}
	endLocation := Location{Lat: 34.664900, Lng: 135.223900}

	// 時刻の設定
	startTime, _ := time.Parse("2006-01-02 15:04:05", "2023-03-03 07:39:30")
	endTime, _ := time.Parse("2006-01-02 15:04:05", "2023-03-03 07:43:30")

	// 各差を計算
	duration := endTime.Sub(startTime)
	latDiff := endLocation.Lat - startLocation.Lat
	lngDiff := endLocation.Lng - startLocation.Lng

	// 30秒ごとのデータを生成
	interval := 30 * time.Second
	for t := startTime; t.Before(endTime); t = t.Add(interval) {
		fraction := t.Sub(startTime).Seconds() / duration.Seconds()
		lat := startLocation.Lat + fraction*latDiff
		lng := startLocation.Lng + fraction*lngDiff

		fmt.Printf("Lat: %f, Lng: %f %v\n", lat, lng, t.Format("2006-01-02 15:04:05"))
	}
}

このプログラムは、指定された時間間隔(この場合は30秒)で始点と終点の間の緯度と経度を計算し、その結果を出力します。始点と終点の間の時間差と距離差に基づき、等間隔に位置情報を補完しています。

2023,江端さんの技術メモ

Go言語で、指定された日時(文字列形式)に30秒ずつ加算して表示するプログラムを作成するには、まず日時を扱うための time パッケージを利用します。以下は、その要件を満たす簡単な例です。

package main

import (
    "fmt"
    "time"
)

func main() {
    // 初期の日時設定
    startAt := "2023-03-01 03:38:00"
    layout := "2006-01-02 15:04:05" // Goの時間フォーマット

    // 文字列を time.Time 型に変換
    t, err := time.Parse(layout, startAt)
    if err != nil {
        panic(err)
    }

    // 30秒ずつ加算して表示
    for i := 0; i < 10; i++ { // 例として10回繰り返す
        t = t.Add(30 * time.Second)
        fmt.Println(t.Format(layout))
    }
}

このプログラムでは、time.Parse 関数を使用して日時の文字列を time.Time 型に変換し、その後 time.Add メソッドを使って30秒ずつ加算しています。最後に、time.Format メソッドを使用して日時を指定された形式で表示しています。ここでは10回の繰り返しを行っていますが、必要に応じて繰り返し回数を変更できます。

2023,江端さんの忘備録

先日、シバタ先生と私を中心としたチームは、3年間に渡った新型コロナウィルスに関するコラムに関して、総括を行いました。

「日本のコロナ史」を総括する ~5類移行後の答え合わせ

Recently, a team led by Dr.Shibata and myself summarized the three years of columns on the new coronavirus.

次は、以下の見解を広めていた方に総括をお伺いしたいです。

Next, I want to hear a summary from those promoting the following views.

私たちの調査の結果、現時点においても、上記の事項は、"全て"ネガティブです。

As a result of our research, "all" of the above are still negative at this time.

私としては、自発的な総括をお願いしたいところですが、応じて頂けない場合は、別の方法を考えます。

I would ask for a voluntary summary, but I will find another way if you do not comply.

ちなみに、これらの情報を発信されていた方のログ(アカウント付き)を、私は所持しています。

Incidentally, I have the logs (with account info.) of the person transmitting this information.

-----

参考文献:「コロナワクチン接種拒否」に寄り添うための7つの質問(4ページ)

Reference:7 Questions to Approach "Corona Vaccination Refusal" (Page 4)

2023,江端さんの技術メモ

select place from records where id = 2 とした場合、最初の{"lat": 34.7325, "lng": 135.4986}と、最後の {"lat": 34.7344, "lng": 135.5035}だけを取り出すSQL文を書いて下さい。ただしplaceはjsonb形式です。

これを、

User
You
SELECT id, user_id, start_at, end_at, end_at - start_at, distance, prediction_type FROM records WHERE user_id = 43 ORDER BY start_at ASC; で選ばれた上記のSQLを、first_place, last_placeとして追記できるようにするには、どのように記述すれば良いですか

とお願いしたのですが、上手く動かないようなので、Go言語で書いて貰いました。

/*

f:/しゅらばしゅう/有吉先生データ/Moove/2023-07/test1124.go

SELECT id, user_id, start_at, end_at, end_at - start_at, distance, prediction_type FROM records WHERE user_id = 43 ORDER BY start_at ASC; で選ばれた上記のSQLを、first_place, last_placeとして追記できるようにするには、どのように記述すれば良いですか。

で、作ってもらったプログラム


*/

package main

import (
    "database/sql"
    "encoding/json"
    "fmt"
    "log"

    _ "github.com/lib/pq"
)

type Record struct {
    ID             int
    UserID         int
    StartAt        string
    EndAt          string
    Duration       string
    Distance       float64
    PredictionType int
    FirstPlace     Location
    LastPlace      Location
}

type Location struct {
    Lat float64 `json:"lat"`
    Lng float64 `json:"lng"`
}

func main() {
	// PostgreSQL データベースへの接続情報
	const (
		host     = "192.168.0.23"
		port     = 15432
		user     = "postgres"
		password = "password"
		dbname   = "moove"
	)

	// PostgreSQL データベースへの接続
	connStr := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", host, port, user, password, dbname)
	db, err := sql.Open("postgres", connStr)
	if err != nil {
		panic(err)
	}
	defer db.Close()


    rows, err := db.Query("SELECT id, user_id, start_at, end_at, end_at - start_at, distance, prediction_type, place FROM records WHERE user_id = 43 ORDER BY start_at ASC")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()

    for rows.Next() {
        var r Record
        var placeJSON string

        err := rows.Scan(&r.ID, &r.UserID, &r.StartAt, &r.EndAt, &r.Duration, &r.Distance, &r.PredictionType, &placeJSON)
        if err != nil {
            log.Fatal(err)
        }

        var places []Location
        err = json.Unmarshal([]byte(placeJSON), &places)
        if err != nil {
            log.Fatal(err)
        }

        if len(places) > 0 {
            r.FirstPlace = places[0]
            r.LastPlace = places[len(places)-1]
        }

        fmt.Printf("%+v\n", r)
    }
}

出力結果

f:\しゅらばしゅう\有吉先生データ\Moove\2023-07>go run test1124.go
go run test1124.go
{ID:20132 UserID:43 StartAt:2023-04-08T05:35:00Z EndAt:2023-04-08T06:20:00Z Duration:00:45:00 Distance:348821.9097841587 PredictionType:4 FirstPlace:{Lat:35.3714 Lng:139.6255} LastPlace:{Lat:35.4409 Lng:139.6591}}
{ID:20133 UserID:43 StartAt:2023-04-08T06:20:30Z EndAt:2023-04-08T06:30:00Z Duration:00:09:30 Distance:153.88780282790526 PredictionType:2 FirstPlace:{Lat:35.4408 Lng:139.659} LastPlace:{Lat:35.4402 Lng:139.6596}}
{ID:20134 UserID:43 StartAt:2023-04-08T06:30:30Z EndAt:2023-04-08T06:49:30Z Duration:00:19:00 Distance:180.2412488153271 PredictionType:1 FirstPlace:{Lat:35.4402 Lng:139.6596} LastPlace:{Lat:35.4401 Lng:139.6599}}
{ID:20135 UserID:43 StartAt:2023-04-08T06:50:00Z EndAt:2023-04-08T06:53:30Z Duration:00:03:30 Distance:65.08472909159703 PredictionType:2 FirstPlace:{Lat:35.4401 Lng:139.6598} LastPlace:{Lat:35.44 Lng:139.6599}}
(以下省略)

 

2023,江端さんの技術メモ

moove=# select place from records where id = 2; place ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [{"lat": 34.7325, "lng": 135.4986}, {"lat": 34.7326, "lng": 135.4989}, {"lat": 34.7326, "lng": 135.4989}, {"lat": 34.7327, "lng": 135.4995}, {"lat": 34.7327, "lng": 135.5}, {"lat": 34.7328, "lng": 135.5002}, {"lat": 34.733, "lng": 135.5006}, {"lat": 34.7331, "lng": 135.501}, {"lat": 34.7334, "lng": 135.5015}, {"lat": 34.7336, "lng": 135.5018}, {"lat": 34.7336, "lng": 135.5018}, {"lat": 34.7336, "lng": 135.5019}, {"lat": 34.7337, "lng": 135.5021}, {"lat": 34.734, "lng": 135.5024}, {"lat": 34.7343, "lng": 135.5026}, {"lat": 34.7346, "lng": 135.5024}, {"lat": 34.7347, "lng": 135.5024}, {"lat": 34.7346, "lng": 135.5024}, {"lat": 34.7345, "lng": 135.5025}, {"lat": 34.7343, "lng": 135.5027}, {"lat": 34.7343, "lng": 135.5029}, {"lat": 34.7342, "lng": 135.5031}, {"lat": 34.7344, "lng": 135.5035}, {"lat": 34.7344, "lng": 135.5035}, {"lat": 34.7344, "lng": 135.5035}] (1 row) で登場する、最初の{"lat": 34.7325, "lng": 135.4986}と、最後の {"lat": 34.7344, "lng": 135.5035}だけを取り出すSQL文を書いて下さい

ただし、placeは、以下の通り、jsonb形式です。

moove=# \d records;
Table "public.records"
Column | Type | Collation | Nullable | Default
-----------------+-----------------------------+-----------+----------+-------------------------------------
id | integer | | not null | nextval('records_id_seq'::regclass)
user_id | integer | | |
distance | double precision | | |
place | jsonb | | |
speed | jsonb | | |
prediction_type | integer | | |
start_at | timestamp without time zone | | |
end_at | timestamp without time zone | | |
Indexes:
"records_pkey" PRIMARY KEY, btree (id)
moove=# \d records;
Table "public.records"
Column | Type | Collation | Nullable | Default
-----------------+-----------------------------+-----------+----------+-------------------------------------
id | integer | | not null | nextval('records_id_seq'::regclass)
user_id | integer | | |
distance | double precision | | |
place | jsonb | | |
speed | jsonb | | |
prediction_type | integer | | |
start_at | timestamp without time zone | | |
end_at | timestamp without time zone | | |
Indexes:
"records_pkey" PRIMARY KEY, btree (id)


WITH places AS (
SELECT jsonb_array_elements(place) AS place_elements
FROM records
WHERE id = 2
)
SELECT
(SELECT place_elements FROM places LIMIT 1) AS first_place,
(SELECT place_elements FROM places ORDER BY jsonb_array_length(place) DESC LIMIT 1) AS last_place
FROM records
WHERE id = 2;

出力結果
first_place | last_place
-----------------------------------+-----------------------------------
{"lat": 34.7325, "lng": 135.4986} | {"lat": 34.7325, "lng": 135.4986}
(1 row)

2023,江端さんの技術メモ

moove=# SELECT id, user_id, start_at, end_at, end_at - start_at, distance, prediction_type FROM records WHERE user_id = 7 ORDER BY start_at ASC;

id | user_id | start_at | end_at | ?column? | distance | prediction_type
-------+---------+---------------------+---------------------+----------+--------------------+-----------------
20132 | 43 | 2023-04-08 05:35:00 | 2023-04-08 06:20:00 | 00:45:00 | 348821.9097841587 | 4
20133 | 43 | 2023-04-08 06:20:30 | 2023-04-08 06:30:00 | 00:09:30 | 153.88780282790526 | 2
20134 | 43 | 2023-04-08 06:30:30 | 2023-04-08 06:49:30 | 00:19:00 | 180.2412488153271 | 1
20135 | 43 | 2023-04-08 06:50:00 | 2023-04-08 06:53:30 | 00:03:30 | 65.08472909159703 | 2
20136 | 43 | 2023-04-08 06:54:00 | 2023-04-08 08:06:00 | 01:12:00 | 522.2898726850697 | 1
20137 | 43 | 2023-04-08 08:06:30 | 2023-04-08 08:15:00 | 00:08:30 | 144.15400138235145 | 2
20138 | 43 | 2023-04-08 08:15:30 | 2023-04-08 08:23:00 | 00:07:30 | 359.73505399604153 | 1
20139 | 43 | 2023-04-08 08:23:30 | 2023-04-08 08:54:30 | 00:31:00 | 13516.406121323496 | 4
20140 | 43 | 2023-04-08 08:55:00 | 2023-04-08 09:00:30 | 00:05:30 | 30.045448973873317 | 1
20141 | 43 | 2023-04-08 09:01:00 | 2023-04-08 09:05:00 | 00:04:00 | 39.96401615517626 | 2

2023,江端さんの技術メモ

SELECT * FROM records WHERE start_at = '2023-03-20 05:03:00'; を"2023-03-20"が含まれているものだけを条件にするには、どのようなSQL文になりますか

SELECT * FROM records WHERE start_at = '2023-03-20 05:03:00'; を"2023-03-20"が含まれているものだけを条件にして、時間順に表示するSQLを教えて下さい。

moove=# SELECT user_id, start_at, end_at FROM records WHERE user_id = 7 ORDER BY start_at ASC;
user_id | start_at | end_at
---------+---------------------+---------------------
7 | 2023-03-01 03:38:00 | 2023-03-01 03:58:30
7 | 2023-03-01 03:59:00 | 2023-03-01 04:03:00
7 | 2023-03-01 04:03:30 | 2023-03-01 04:09:30
7 | 2023-03-01 04:10:00 | 2023-03-01 04:15:30
7 | 2023-03-01 04:16:00 | 2023-03-01 05:22:30

中略
7 | 2023-05-17 10:48:00 | 2023-05-17 10:54:30
7 | 2023-05-17 10:55:00 | 2023-05-17 11:09:00
7 | 2023-05-17 11:09:30 | 2023-05-17 11:38:30
7 | 2023-05-17 11:39:00 | 2023-05-17 11:53:00
7 | 2023-05-17 11:53:30 | 2023-05-17 11:54:30
7 | 2023-05-17 11:55:00 | 2023-05-17 12:04:00
7 | 2023-05-17 12:04:30 | 2023-05-17 12:30:00
(1514 rows)

2023,江端さんの技術メモ

SELECT * FROM records WHERE start_at = '2023-03-20 05:03:00'; を"2023-03-20"が含まれているものだけを条件にするには、どのようなSQL文になりますか

SELECT * FROM records WHERE start_at = '2023-03-20 05:03:00'; を"2023-03-20"が含まれているものだけを条件にして、時間順に表示するSQLを教えて下さい。

moove=# SELECT user_id, start_at,end_at FROM records WHERE user_id = 7 and DATE(start_at) = '2023-03-21' order by start_at;
user_id | start_at | end_at
---------+---------------------+---------------------
7 | 2023-03-21 00:03:00 | 2023-03-21 00:07:30
7 | 2023-03-21 00:08:00 | 2023-03-21 00:11:00
7 | 2023-03-21 00:11:30 | 2023-03-21 00:18:00
7 | 2023-03-21 00:18:30 | 2023-03-21 00:27:30
(中略)
7 | 2023-03-21 23:22:00 | 2023-03-21 23:30:30
7 | 2023-03-21 23:31:00 | 2023-03-21 23:53:30
7 | 2023-03-21 23:54:00 | 2023-03-22 00:00:30
(35 rows)