2024,江端さんの忘備録

このブログは、私のメモです。ですので、何でも書き込みます。

This blog is my notebook, so I write about anything.

週末は、大学の研究やコーディングで終日狂っていますので、技術メモも増えます。

On weekends, I spend all day doing university research and coding, so I also end up with more technical memos.

で、この技術メモの内容が理解できる人は、非常に少ないと思っています。

I think very few people can understand the contents of this technical memo.

なにしろ、動機や背景、そして、DBのスキーマについても一切記載がないのですから、ここから読み取れる人がいたら、その人は「天才以上」といっても良いでしょう。

After all, the motives, background, and database schema are not mentioned, so if anyone can read this, they must be “more than a genius.”

『実際のところ、江端は技術漏洩しているんじゃないか?』と疑っている人がいるかもしれませんが、私が公開している情報は、基本的に公開されている情報を、私のためだけに二次加工して公開しているものですので、技術漏洩には当たりません ―― というか、この点については、私は常に細心の注意を払っています。

There may be people who suspect that “Ebata is leaking technology.” Still, the information I am releasing is publicly available and reprocessed for my use, so it does not constitute a technology leak. I am always cautious about this.

忘れないでください ―― 私は「会社の犬」です。

ただ、私のページを読んで頂いている方の多くに、「読み難い思いをさせているだろう」という予想はつきます。

However, I can imagine that many people reading my page have difficulty reading it.

多分、全然興味がなく、膨大な内容で、かつ意味不明な内容でしょう。

They are probably not attractive, and a vast amount of content makes no sense.

では、なぜ私が、このような意味不明な技術メモを開示し続けているかというと、自分自身の業務や大学での研究などで、便利なんですよ。

The reason I continue to disclose these incomprehensible technical memos is that they are helpful for my work and research at the university.

まず 、『私は、過去の失敗を簡単に忘れる。なので、直ぐにメモを取る。そのメモは私に分かれば十分であり、他人に理解してもらう必要がない』ことが挙げられます。

First of all, “I easily forget past mistakes. So, I take notes immediately. Those notes are sufficient for me to understand, so others do not need to understand them.”

ならば、『そのメモは非公開にして江端だけ見れるようにすれば良い』とも言えます。

Then, you could say, 'Make the memo private so that only Ebata can see it.

ところが、『私がハマった部分』が、私以外の人に役にたっている可能性があるのです。

However, there is a possibility that the part that I was stuck on is useful for other people.

たとえば、本日のメモですと、

For example, today's memo is

q0713がイオン金沢シーサイド店である場合のq0707とq0714の値を0から24の値の数で表示させるSQL文を作成してcsvファイルで保存して下さい。添付したようなグラフを作成するためです。

実際に、SQL文でのCSVファイルの保存に失敗する人に、稼動実績のあるコマンドを、丸ごと提供できます。

I can provide a command that has been proven to work for people who are having trouble saving CSV files in SQL statements.

これは、他のエンジニアにとっても助かるはずなのです ―― なぜ、そう言い切れるか? 「私が、他の人のメモで助けられてきたから」です。

This will also be helpful for other engineers - why can I say that? Because other people's notes have helped me.

「作成プロセス途中の、小さくて、汚いソースコードを残して下さい」

という訳で、私のページを読んで頂いている方には、迷惑をおかけしているとは思いますが、当面、この運用を続けてまいります。

So, I apologize to those of you who are reading my page for any inconvenience caused, but for now, I will continue to operate it in this way.

悪しからずご了承下さい。

Please accept my apologies.

未分類

q0713がイオン金沢シーサイド店である場合のq0707とq0714の値を0から24の値の数で表示させるSQL文を作成してcsvファイルで保存して下さい。添付したようなグラフを作成するためです。

 

CSVファイルへの保存(psql の場合)

結果をローカルにCSVファイルとして保存するには、以下のコマンドを使用します(1行で記載sにないと、\copy: parse error at end of lineと言われる)

\copy (WITH 時刻範囲 AS (SELECT generate_series(0, 24) AS 時刻) SELECT 時刻範囲.時刻, COALESCE(SUM(CASE WHEN e.q0707 = 時刻範囲.時刻 THEN 1 ELSE 0 END), 0) AS 出発時刻カウント, COALESCE(SUM(CASE WHEN e.q0714 = 時刻範囲.時刻 THEN 1 ELSE 0 END), 0) AS 到着時刻カウント FROM 時刻範囲 LEFT JOIN master_e AS e ON e.q0713 = '京急ストア富岡店' AND e.q0707 BETWEEN 0 AND 24 AND e.q0714 BETWEEN 0 AND 24 GROUP BY 時刻範囲.時刻 ORDER BY 時刻範囲.時刻) TO 'G:/home/ebata/output.csv' WITH CSV HEADER;

イント

  1. Windows環境では絶対パスを使用:
    • G:/home/ebata/output.csv の形式で絶対パスを指定してください。
  2. クエリ結果を手動で確認:
    • 上記SQLを実行後、クエリ結果を確認し、正確なデータが得られることを確認してください。
  3. グラフ作成:
    • このデータを元にPythonやExcelで出発時刻・到着時刻の折れ線グラフを作成できます。

未分類

select household, q0301 from master_b where household like 'P%'; で、(Pで始まる)ユーザ番号と、ユーザの年齢が出てきます。 select household, q0707,q0714 from master_e; で、(Pで始まる)ユーザ番号と、出発時刻(0-24)、と到着時刻(0-24)が出てきます。 この2つのSQL文をくみあわせて、0-9歳、10ー19歳、 ..... 90-99歳に分類して、それぞれの年齢分類毎の出発時刻と到着時刻を算出するSQL文を作って下さい。

以下は、出発時刻 (q0707) と到着時刻 (q0714) の 標準偏差 を算出する SQL 文です。標準偏差は STDDEV 関数を使用して計算します。

SELECT 
    CASE 
        WHEN b.q0301 BETWEEN 0 AND 9 THEN '0-9歳'
        WHEN b.q0301 BETWEEN 10 AND 19 THEN '10-19歳'
        WHEN b.q0301 BETWEEN 20 AND 29 THEN '20-29歳'
        WHEN b.q0301 BETWEEN 30 AND 39 THEN '30-39歳'
        WHEN b.q0301 BETWEEN 40 AND 49 THEN '40-49歳'
        WHEN b.q0301 BETWEEN 50 AND 59 THEN '50-59歳'
        WHEN b.q0301 BETWEEN 60 AND 69 THEN '60-69歳'
        WHEN b.q0301 BETWEEN 70 AND 79 THEN '70-79歳'
        WHEN b.q0301 BETWEEN 80 AND 89 THEN '80-89歳'
        WHEN b.q0301 BETWEEN 90 AND 99 THEN '90-99歳'
        ELSE 'その他'
    END AS 年齢分類,
    AVG(e.q0707) AS 平均出発時刻,
    STDDEV(e.q0707) AS 出発時刻の標準偏差,
    AVG(e.q0714) AS 平均到着時刻,
    STDDEV(e.q0714) AS 到着時刻の標準偏差
FROM 
    master_b AS b
JOIN 
    master_e AS e
ON 
    b.household = e.household
WHERE 
    b.household LIKE 'P%'
    AND e.q0707 <> 999
    AND e.q0714 <> 999
GROUP BY 
    年齢分類
ORDER BY 
    年齢分類;

修正点:

  1. 標準偏差の計算:
    • STDDEV(e.q0707) AS 出発時刻の標準偏差
    • STDDEV(e.q0714) AS 到着時刻の標準偏差
    • 標準偏差を計算するために、STDDEV 関数を使用。
  2. 出力項目:
    • 年齢分類
    • 平均出発時刻
    • 出発時刻の標準偏差
    • 平均到着時刻
    • 到着時刻の標準偏差

出力例:

pj20005=# \e
 年齢分類 |    平均出発時刻     | 出発時刻の標準偏差 |    平均到着時刻     | 到着時刻の標準偏差
----------+---------------------+--------------------+---------------------+--------------------
 0-9歳    |  8.7364864864864865 | 2.0264293870576348 | 16.6959459459459459 | 2.7902629433767539
 10-19歳  |  8.6916488222698073 | 2.3823202999576382 | 17.5610278372591006 | 3.1068884868890622
 20-29歳  |  8.9774436090225564 | 2.7632636644010746 | 17.8020050125313283 | 3.7370800926049844
 30-39歳  |  9.0335731414868106 | 2.3690328974486025 | 17.1534772182254197 | 2.9668749279360904
 40-49歳  |  9.0164835164835165 | 2.4084051553191729 | 16.9326923076923077 | 3.3338216665822259
 50-59歳  |  9.1076555023923445 | 2.7224076287670418 | 17.6854066985645933 | 3.2784704658907816
 60-69歳  |  9.7626321974148061 | 2.8109242893099341 | 16.5687426556991774 | 3.1044389062381429
 70-79歳  | 10.4559659090909091 | 2.5466884006062182 | 15.2897727272727273 | 3.0459374095847468
 80-89歳  | 10.4758454106280193 | 2.4712413371273877 | 15.1835748792270531 | 2.9226415927228037
 90-99歳  | 10.0217391304347826 | 2.7260261951824853 | 15.1086956521739130 | 3.3890099517874430
 その他   |  8.9574468085106383 | 2.7431827273506346 | 16.6170212765957447 | 3.1146769555086844

未分類

「売国機関」に登場する、チュファルテク合同共和国、クライス連邦、ガルダリケ王国とは、何時の時代のどの国を題材にしていると考えられますか?

「売国機関」に登場する架空の国家であるチュファルテク合同共和国クライス連邦ガルダリケ王国は、具体的な時代や実在の国を直接的にモデルにしているわけではありませんが、その設定や描写は、いくつかの歴史的事象や国々を連想させる要素があります。

  1. チュファルテク合同共和国
    • 名前や政治体制から、社会主義や共産主義体制の国を彷彿とさせます。特に冷戦期の東ヨーロッパ諸国や旧ソビエト連邦をモデルとしている可能性があります。
    • 「合同共和国」という名称は、ソビエト連邦(Union of Soviet Socialist Republics)やユーゴスラビア(Socialist Federal Republic of Yugoslavia)のような多民族国家を想起させます。
  2. クライス連邦
    • クライス(Kreis)はドイツ語で「地区」や「郡」を意味します。この名称からは、ドイツやオーストリアの連邦制国家の特徴が反映されているように見えます。
    • 作中の設定が連邦制であることから、現在のドイツ連邦共和国や、かつての神聖ローマ帝国のような緩やかな連邦制国家が着想源となっている可能性があります。
  3. ガルダリケ王国
    • ガルダリケ(Gardarike)は古ノルド語で「都市国家の国」を意味し、歴史的には中世スカンジナビア人がルーシ(現代のロシアやウクライナの起源となる地域)を指した言葉です。
    • この名前から、北欧や中世ヨーロッパをモデルにしている可能性が高いです。また、「王国」という形態からは、伝統的な君主制国家であるスウェーデンやデンマークを連想させます。

これらの国々は、特定の時代や国を直接的に題材にしているというよりも、さまざまな歴史的背景や地政学的状況を参考にした架空の国として設定されているようです。それぞれが抱える政治的、社会的、文化的な問題を描くことで、現実の国際政治や歴史的なテーマに対する寓意や批評を提供していると考えられます。

世界地図の南北をひっくり返してあてはめてみると、ガルダリケ王国=ドイツ・フランス チュファルテク合同共和国=ポーランド、 クライス連邦=バルト3国+ソ連 のように見えますが、いかがでしょうか?

ご指摘の通り、地図をひっくり返して見ると、以下のように現実の国々と対応させて考えることができます。

  1. ガルダリケ王国 = ドイツ・フランス
    • ガルダリケ王国は地図の西側に位置しており、現実の地図を上下逆にすると、ドイツやフランスがその位置に相当します。
    • 「王国」という形態から、歴史的に君主制が存在したこれらの地域をモデルとしている可能性が高いです。
  2. チュファルテク合同共和国 = ポーランド
    • 地図中央のチュファルテク合同共和国は、位置的にポーランドや東欧諸国を連想させます。
    • 「合同共和国」という名称は、ソビエト連邦やユーゴスラビアのような多民族国家の連邦体制を意識した設定であると考えられます。
  3. クライス連邦 = バルト三国 + ソ連
    • クライス連邦は地図の東側に位置しており、バルト三国(エストニア、ラトビア、リトアニア)や旧ソ連をモデルとしていると考えられます。
    • 「クライス」というドイツ語圏の名称が付いていることから、東ヨーロッパの国々を抽象化して描かれた可能性があります。

これらの対応は、地理的な配置だけでなく、各国の名称や設定から見ても妥当であるように思われます。コミックの設定としては、現実の歴史や地理を元にしながら、架空の要素を加えているように感じます。こうした背景設定を踏まえると、物語の中で描かれる政治的・文化的な対立や共存のテーマがより深く理解できるかもしれません。

2024,江端さんの忘備録

先日、EE Times Japanの村尾さん寄稿された、「英語ができれば開発力も上がる? やっぱり立ちはだかる語学の壁」という題目のコラムを読みました。

The other day, I read a column by Ms. Murao of EE Times Japan titled “If you can speak English, will your development ability improve? I read a column by Mr. Murao of EE Times Japan titled, “Does English Improve Development Skills?

興味深かったのは、「ドイツ人も英語に困っている」という部分でした。これ、私も経験あります。

The part about “Germans also have trouble with English” was interesting. I have experienced this, too.

ベルリンの朝の公園で、屋台でホットドックを買おうとした時、英語でしゃべりかけてしまったのですが(私の語学は、英語は"不自由"、英語以外は"存在しない"のレベル)ですが、その屋台のおじさんが、『英語は分からん』という仕草をしたのを覚えています。

In a park in the morning in Berlin, I tried to buy a hot dog from a stall and spoke in English (my English is at the level of “crippled” and non-existent), but I remember the man at the stall made a gesture that he did not understand English.

なんか、私たち日本人は、『私たちだけが、不当に英語に苦しめられている』と思いがちですが、基本的に、非英語圏の人たちも同じように苦しめられています。

We Japanese tend to think that we are the only ones who are unfairly suffering from English, but basically, non-English speaking people are suffering the same way.

とは言え、私は「努力をしましょう」とは言いません ―― 「諦めましょう」といいます。

However, I don't say, “Let's make an effort” -- I say, “Let's give up”.

ただ、「諦める」にしても、0と1しかないような二値化のような諦め方ではなくて、「0.2とか、0.5の諦め方」について、こちらでご紹介しています。ご一読下さい。

However, even if you “give up,” it is not the binarized kind of giving up where there are only 0s and 1s, but the “0.2 or 0.5 giving up” method, which is introduced here. Please read it.

それはさておき。

Aside from that.

-----

最近は、チーム内に日本語がネイティブでない人が加わることになり、英語を回避して生きていくのが、ますます難しくなっているのを実感します。

With the recent addition of a non-native Japanese speaker to our team, it is increasingly difficult to avoid and live in English.

ただ、英語を使わされて苦しんでいるのは、私たちだけなく、『英語ノンネイティブの人たちも同じである』ということに思いを馳せなければならない、とは思います。

However, we must remember that it is not only us who suffer from being forced to use English but also “non-native English speakers.”

また、こういう仕事の機会が増えて分かってきたことがあります。

There is also something I have come to understand as opportunities for this kind of work increase.

(1)チームの中に私より堪能に英語に通じている人が一人いるだけで、私の英語理解の努力が激減する

(1) Having one person on the team who is more highly fluent in English than I am drastically reduces my efforts to understand English.

(2)日本人がチームで多数派の場合、いつのまにか、日本語ベースの会話になりやすい

(2) When Japanese are in the majority of a team, it is easy for the conversation to become Japanese-based before you know it.

まず、(1)については、『うん、何言っているか分からないから、後であの人(英語に精通している人)に聞こう』と、私の心がサボり出します。

First, for (1), my mind starts skipping out, saying, 'Yeah, I don't understand what you're saying, so I'll ask that person (who is well-versed in English) later.

(2)については、英語で会話しはじめても、いつの間には、最期の方では日本語を日本人どうしで話していることになっている、という現象に直面します。

As for (2), you may start a conversation in English, but before you know it, you will speak Japanese with Japanese people at the end of the conversation.

はっきり言えることは、

What is clear is,

―― 日本語って、本当に心底から目も眩むくらいに"ラクチン"

"Japanese language is a dazzling “making me easy” from the bottom of my heart."

という現実です。

―― 2言語同時使用コミュニケーション

あと、英語を使わなければならないフェーズが、ダイナミックに変わってきていることが挙げられます。

The other thing is that the phases we must use in English change dynamically.

今迄は、私(たち)は、単身で海外に乗り込んで、マイノリティ(少数派)として、打ち合わせに参加しなければなりませんでした。

Until now, I (we) had to go overseas by myself and participate in meetings as a minority.

ところが、最近の英語での打ち合わせは、日本語を使う日本人がマジョリティ(多数派)になってきているのです。

Recently, however, Japanese who use Japanese have become the majority (majority) for meetings in English.

このような状況では、私たちの英語に対する「気合」も「覚悟」も、格段に「緩みます」。

Under these circumstances, our “enthusiasm” and “preparedness” for English will be much “looser.”

だって、最悪の場合、日本語を使えばいいんですから 、そりゃそうなりますよ。

Because, in the worst-case scenario, we can use Japanese.

-----

私が心配しているのは、これから『日本に来ているなら、日本語を使えるようになってこい』という、傲慢な考えが、国内で支配的になりつつあることです。

What worries me is that the arrogant idea that 'if you are in Japan, go ahead and learn to use Japanese' is becoming dominant in the country.

しかし、これは、私たちが、米国や英国でやられたことの『仕返し』をしているようなもので ―― とても見苦しい、と思います。

But I think this is like us getting 'payback' for what was done to us in the U.S. and U.K. -- very unseemly.

-----

英語での打ち合わせを強行すると、日本人が、一斉に沈黙し始めるんですよ ―― うん、分かる、分かるよ。恥をかきたくないし、それ以上に、自分の言いたいことを表現できないのがもどかしいし。

When I force a meeting in English, Japanese people, all at once, start to be silent -- yes, I know, I know. I don't want to embarrass myself; more than that, it's frustrating not being able to express what I want.

実際、私も、黙ります。

I will be silent.

チーム内に一人英語に通じている人がいれば、私は完全に黙りこみます ―― そんでもって、打ち合わせの後に、その人と個人的に日本語で相談の電話をする、と。

If one person on the team is fluent in English, I would be completely silent -- and then, after the meeting, I would call that person privately for advice in Japanese.

これこそ、私、江端の小賢しさの真骨頂です。

This is the essence of my, Ebata's, cleverness.

-----

いや、そうじゃないだろう。

No, we don't.

私は、こういう、小賢しい日本人を量産したくて、あのコラムの連載をしていた訳ではないはずなんだけど ―― しかしながら、フェーズが変わるだけで、人間は劇的に変わるものです。

I am sure I was not writing that series of columns to mass produce these petulant and clever Japanese -- however, people can change dramatically just by changing phases.

常に、ラクな方向へ、ラクな方向へと。

Always in the direction of ease, ease, ease.

2024,江端さんの技術メモ

改めてGeoEntityDBの作り方の手順を示して下さい。

 

以下に、GeoEntityDB を作成する手順を改めて示します。


GeoEntityDBの作成手順

1. GeoEntityDBの作成

  1. PostgreSQLに接続します。
    psql -U postgres

     

  2. 新しいデータベースを作成し、PostGISを有効化します。
    CREATE DATABASE GeoEntityDB; \c GeoEntityDB CREATE EXTENSION postgis; CREATE EXTENSION pgrouting; -- 必要に応じて有効化

     


2. 地物テーブルの作成

地物データを格納するためのテーブルを作成します。

  1. テーブルスキーマを定義します。以下はカテゴリ付きの地物データ用のスキーマです。
    CREATE TABLE geo_entities ( id SERIAL PRIMARY KEY, -- 自動生成の一意識別子 category VARCHAR(10), -- カテゴリ (例: A1, B1, D2) stay_time INTEGER, -- 滞在時間 (分) geom GEOMETRY(POINT, 4326) -- 座標データ (EPSG:4326の緯度経度) );

    # id SERIAL PRIMARY KEY の部分は自動的にインポートされるので、csvの先頭の番号は行削除しておくこと

  2. インデックスを作成して検索性能を向上させます。
    CREATE INDEX geo_entities_geom_idx ON geo_entities USING GIST (geom);

     


3. CSVデータのインポート

CSVファイルから地物データをインポートします。

  1. 一時テーブルを作成(緯度・経度データを変換するために使用)。
    CREATE TEMP TABLE temp_geo_entities ( category VARCHAR(10), stay_time INTEGER, latitude DOUBLE PRECISION, longitude DOUBLE PRECISION );

     

  2. CSVをインポート(ファイルのパスは実際のCSVファイルの場所を指定してください)。
    COPY temp_geo_entities (category, stay_time, latitude, longitude) FROM '/path/to/geo_entities.csv' DELIMITER ',' CSV HEADER;

    # 実は、'/path/to/geo_entities.csv'の部分で酷く転けた記憶があるが、結果的にインポートできてしまったので、忘れた。

  3. 本テーブルに挿入(緯度・経度を POINT 型に変換して挿入)。
    INSERT INTO geo_entities (category, stay_time, geom) SELECT category, stay_time, ST_SetSRID(ST_MakePoint(longitude, latitude), 4326) FROM temp_geo_entities;

     

  4. データが正しくインポートされたか確認します。
    SELECT * FROM geo_entities LIMIT 10;

    #ここから先は試していないが、メモに残しておく。


4. 既存DBとの連携設定

方法 1: postgres_fdw を使った連携

hakata_ex_cost_db(道路ネットワークDB)と GeoEntityDB を連携させます。

  1. postgres_fdw を有効化(GeoEntityDBで実行)。
    CREATE EXTENSION postgres_fdw;

     

  2. 外部サーバーを登録
    CREATE SERVER hakata_server FOREIGN DATA WRAPPER postgres_fdw OPTIONS (dbname 'hakata_ex_cost_db', host 'localhost');

     

  3. 外部DBへのユーザーマッピングを作成
    CREATE USER MAPPING FOR current_user SERVER hakata_server OPTIONS (user 'postgres', password 'your_password');

     

  4. 必要なテーブルをインポート(例: 道路ネットワークテーブル)。
    IMPORT FOREIGN SCHEMA public FROM SERVER hakata_server INTO public;

     

  5. テーブルが使用可能か確認
    SELECT * FROM ways LIMIT 10;

     


5. 経路計算の設定

最短経路計算の基本例

エージェントの現在地から目的地(地物)までの経路を計算します。

  1. エージェントの現在地に最も近いノードを取得
    SELECT id FROM ways_vertices_pgr ORDER BY geom <-> ST_SetSRID(ST_MakePoint(130.3980676, 33.59543503), 4326) LIMIT 1;

     

  2. 地物の位置に最も近いノードを取得
    SELECT id FROM ways_vertices_pgr ORDER BY geom <-> (SELECT geom FROM geo_entities WHERE id = 1) LIMIT 1;

     

  3. Dijkstraアルゴリズムで経路計算
    SELECT seq, id1 AS node, id2 AS edge, cost FROM pgr_dijkstra( 'SELECT id, source, target, cost FROM ways', start_node_id, end_node_id, directed := false );

     


6. 地物データと経路計算の組み合わせ

以下のようなクエリで、地物データの位置と経路計算を連携させます。

  1. エージェントの現在地から15メートル以内の地物を検索(これ、上手く稼動しません。下の方は使って下さい)
    SELECT id, category, stay_time, ST_Distance(geom, ST_SetSRID(ST_MakePoint(130.3980676, 33.59543503), 4326)) AS distance FROM geo_entities WHERE ST_DWithin(geom, ST_SetSRID(ST_MakePoint(130.3980676, 33.59543503), 4326), 15);

     

  2. 発見した地物への最短経路を計算
    SELECT seq, id1 AS node, id2 AS edge, cost FROM pgr_dijkstra( 'SELECT id, source, target, cost FROM ways', start_node_id, (SELECT id FROM ways_vertices_pgr ORDER BY geom <-> (SELECT geom FROM geo_entities WHERE id = found_geo_id) LIMIT 1), directed := false );

     


まとめ

  1. GeoEntityDBの作成とデータインポート:
    • PostGISとpgRoutingを有効化し、CSVデータを地物テーブルに格納。
  2. 既存DBとの連携:
    • postgres_fdw を使用して、hakata_ex_cost_db の道路ネットワークを参照。
  3. 経路計算の実装:
    • エージェントの現在地と地物データを連携させ、道路ネットワーク上で最短経路を計算。

これにより、エージェントが嗜好に応じて地物に向かう動きをリアルにシミュレーションする仕組みを構築できます。

ーーーーー
こういうミスもやったので、以下のメモに残しておく。

SELECT * FROM geo_entities WHERE category = 'B1'; としたらエントリーがでてきませんが、
SELECT * FROM geo_entities WHERE category = ' B1'; としたらエントリーがでてきました。
categoryの要素でえ最初に空白が入っているものを修正したいのですが、どうしたら良いでしょうか

 

category の要素の先頭に空白が含まれている場合、それを修正するには TRIM 関数を使用して先頭と末尾の空白を取り除く必要があります。以下に、データを修正する方法を説明します。


手順

1. データの確認

まず、空白が含まれているデータを確認します。

SELECT * FROM geo_entities WHERE category LIKE ' %' OR category LIKE '% ';

 

  • LIKE ' %' は先頭に空白があるデータを検索します。
  • LIKE '% ' は末尾に空白があるデータを検索します。

2. 空白を修正

TRIM 関数を使用して、category カラムから空白を取り除きます。

すべてのエントリを修正する場合

以下のクエリで、空白を削除した値に更新します。

UPDATE geo_entities SET category = TRIM(category) WHERE category LIKE ' %' OR category LIKE '% ';

 


3. 修正結果の確認

修正後に、データが正しく更新されたか確認します。

SELECT * FROM geo_entities WHERE category LIKE ' %' OR category LIKE '% ';

 

  • クエリの結果が空であれば、すべての空白が正常に削除されたことを意味します。

4. 再度クエリを実行

修正後、以下のようにクエリを実行して正しいデータが取得できるか確認します。

SELECT * FROM geo_entities WHERE category = 'B1';

 


補足

  • TRIM の動作: TRIM 関数は、先頭と末尾の両方から空白を削除します(不要なスペースも含む)。
  • データの一時バックアップ: データ更新は破壊的変更となるため、念のため更新前にバックアップを取得しておくことをおすすめします。

これで問題が解決するはずです!もしさらなるサポートが必要であればお知らせください。


ざっくりとした使い方

 

geoentitydb=# \l
List of databases
Name | Owner | Encoding | Locale Provider | Collate | Ctype | ICU Locale | ICU Rules | Access privileges
--------------------+----------+----------+-----------------+------------+------------+------------+-----------+-----------------------
geoentitydb | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | |
hakata_db | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | |
hakata_ex_cost_db | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | |

geoentitydb=# SELECT id, category, stay_time, geom FROM geo_entities where id = 29;
id | category | stay_time | geom
----+----------+-----------+----------------------------------------------------
29 | B1 | 20 | 0101000020E610000006802A6E9C4C6040099FB5F44BCB4040

 

geoentitydb=# SELECT id, category, stay_time, ST_X(geom) AS longitude, ST_Y(geom) AS latitude FROM geo_entities where id = 29;
id | category | stay_time | longitude | latitude
----+----------+-----------+-------------+-------------
29 | B1 | 20 | 130.3940955 | 33.58825549

こんな感じででてくる。

以下は、130.4064827799044, 33.591348965846656 から 100メートル以内のジオエンティティを抽出するSQLです。(こっちが正しい)

geoentitydb=# SELECT id, category, stay_time, ST_Distance(geom::geography, ST_SetSRID(ST_MakePoint(130.4064827799044, 33.591348965846656), 4326)::geography) AS distance FROM geo_entities WHERE ST_DWithin(geom::geography, ST_SetSRID(ST_MakePoint(130.4064827799044, 33.591348965846656), 4326)::geography, 100);

id | category | stay_time | distance
------+----------+-----------+-------------
304 | A2 | 60 | 68.03775787
357 | A3 | 120 | 75.80618279
366 | A3 | 120 | 76.48825161
414 | D2 | 180 | 80.65210758
415 | D2 | 180 | 79.93815148
429 | D2 | 180 | 61.23626794
435 | D2 | 180 | 62.50441807
546 | E1 | 480 | 77.36793898
550 | E1 | 480 | 90.09868468
813 | E2 | 300 | 54.40053345
1174 | F2 | 10 | 92.85196166
1217 | F2 | 10 | 89.44133931
1933 | H2 | 30 | 64.5772006
1942 | H2 | 30 | 84.70916514
(14 rows)

未分類

ご相談があります。

1,A1,30,33.59543503,130.3980676
2,A1,30,33.59525629,130.3993336
3,A1,30,33.59323656,130.3984967
4,A1,30,33.59261097,130.3963509
5,A1,30,33.59212837,130.3954712
6,A1,30,33.59243223,130.3971234
7,A1,30,733.5927897,130.3996554
1,A2,60,33.59398255,130.3959787
2,A2,60,33.59364294,130.3985965
3,A2,60,33.59328547,130.3976095
4,A2,60,33.59278499,130.3969657
5,A2,60,33.59265988,130.3953564
6,A2,60,33.59285649,130.4020941
1,A3,120,33.59401761,130.3947008
2,A3,120,33.59389249,130.3972542
3,A3,120,33.5928558,130.3972972
4,A3,120,33.5920336,130.3982198
5,A3,120,33.59205147,130.3995288
6,A3,120,33.5924447,130.3997862
7,A3,120,33.59274856,130.4001081

のように記載されたcsvファイルあります。 A1はカフェの位置座標、A2は飲食店の位置座標、A3は、居酒屋の位置座標、この他、B1からH2までの種類の店舗の位置座標のデータがあります。

一方現在、PostGISを使ったマルチエージェントシミュレーション(MAS)を作成しております。このMASは、帰路の駅に向う途中に気になる店舗があったら、その店舗に立ち因る、という動きをさせたいと思っています。

このMASのシミュレータはすでに完成しており、エージェントも稼動しておりますが、上記の「立ち寄り」のアルゴリズムはまだ実装しておりません。 各エージェントは、エージェント単位に嗜好を持っており、例えば、帰路の途中にカフェ(A1)を、自分の位置から半径15メートル以内に見つけらたら、そこに立ち寄らせたいと思っています。

でご相談なのですが、このような実装を行うに際して、上記のCSVファイルは、どのように利用するのが良いでしょうか。
(1)CSVファイルとして全てを纒めておき、シミュレータ開始前に全部をメモリ上に格納しておき、A1(カフェ)とエージェントの距離が15メートル以内にはいったか否かを随時計算する
(2)CSVファイルをPostgresSQLのDBに格納しておき、上記と同じ処理を行う。
(3)その他

観点は、「計算時間または計算負荷ができるだけ軽量に行える」ということになります。エージェントは1000~10000作って動かすので、時間がかかるのは困るのです。本件についてアドバイスを頂けますようお願いします。

計算負荷を軽減し、効率的にエージェントの「立ち寄り」アルゴリズムを実装するためには、以下のアプローチが考えられます。

アプローチの比較

(1) CSVファイルをすべてメモリにロードして距離計算

メリット:

  • 実装がシンプル。
  • 外部データベースに依存しないため、環境構築が容易。

デメリット:

  • メモリ消費が大きい。特に店舗データが増えると、メモリ上で全てを保持するのが困難になる場合がある。
  • エージェントが増えた場合、すべての店舗との距離を計算する処理が重くなる可能性が高い。

適用場面:

  • 店舗データが少ない場合や、エージェント数が少ない場合に有効。

(2) PostgreSQL + PostGIS を利用する

メリット:

  • PostGIS の空間インデックス機能を使うことで、店舗検索の計算負荷が大幅に軽減される。
    • ST_DWithin を用いることで、指定距離内の店舗を効率よく取得可能。
  • データの永続性が高く、今後店舗データを増やしたり更新する場合の対応が容易。
  • 複雑なクエリが実行可能で、たとえばカテゴリ別の店舗をエージェントの嗜好に基づいてフィルタリングできる。

デメリット:

  • 初期設定やクエリのチューニングに多少の手間がかかる。
  • 外部データベースへのアクセスによる若干のオーバーヘッド。

適用場面:

  • 店舗データやエージェント数が多い場合。
  • データの拡張性やメンテナンス性を重視する場合。

(3) その他の選択肢: ハイブリッド方式

方法:

  • CSVデータをシミュレータ起動時にPostGISにロードし、シミュレーション中はPostGISを利用する。
  • シミュレーション後に、必要に応じて結果を再度CSVや他の形式にエクスポート。

メリット:

  • PostGISの性能を活用しつつ、データ管理はCSVベースでシンプルに保てる。
  • データがPostGISにあるため、他の分析ツールやダッシュボードにも容易に接続可能。

デメリット:

  • CSVのロード処理が必要。
  • PostGISの初期設定が求められる。

推奨アプローチ

(2) PostgreSQL + PostGIS の利用を推奨します。
以下の理由によります:

  1. 計算負荷の軽減: PostGISの空間インデックスを利用することで、エージェントと店舗の距離計算が効率化されます。
  2. 柔軟性: 店舗データが拡張されても問題なく対応可能。
  3. スケーラビリティ: エージェント数が増加しても処理時間を抑えることが可能。

実装例: PostGISでの距離計算

  1. CSVデータをPostGISに格納する
    CREATE TABLE stores ( id SERIAL PRIMARY KEY, type VARCHAR(10), preference INT, geom GEOMETRY(POINT, 4326) ); COPY stores(type, preference, geom) FROM 'path/to/stores.csv' WITH (FORMAT CSV, DELIMITER ',', HEADER TRUE, GEOMETRY 'POINT(longitude latitude)');

     

  2. 距離計算クエリ
    エージェントの位置 (33.595, 130.398) を例とします:

    SELECT id, type, preference, ST_Distance(geom, ST_MakePoint(130.398, 33.595)::geography) AS distance FROM stores WHERE ST_DWithin(geom::geography, ST_MakePoint(130.398, 33.595)::geography, 15);

     

  3. エージェントの嗜好を反映したクエリ
    SELECT id, type, preference, distance FROM ( SELECT id, type, preference, ST_Distance(geom, ST_MakePoint(130.398, 33.595)::geography) AS distance FROM stores WHERE type = 'A1' AND ST_DWithin(geom::geography, ST_MakePoint(130.398, 33.595)::geography, 15) ) sub WHERE preference = 1; -- エージェント嗜好がカフェ(A1)の場合

     


システム構成例

  1. PostGISをバックエンドとしたシミュレータ
    • シミュレーション開始時にPostGISへ接続。
    • 各エージェントが特定の地点を通過するたびに、クエリで立ち寄り候補店舗を取得。
  2. CSV管理を維持したデータフロー
    • 必要に応じてPostGISのデータをCSVにエクスポート。
    • シミュレータ結果を再度CSV形式で保存可能。

これらを基に、システム全体の効率化を図ることをお勧めします。

 

2024,江端さんの忘備録

私、学生の頃、大学→バイト→学寮or下宿のローテーションをしていました。

As a student, I used to rotate between university, part-time job, and dormitory or boarding house.

それ以外のことをやる時間がなかったので、奨学金とバイトの収入と、食費と学費の支出で、ざっくりトントン、またはちょっと黒字くらいでした。

I didn't have time to do anything else, so with my scholarship, part-time income, and food and tuition expenses, I was roughly in the black or maybe a little in the black.

# 奨学金は借金なので、トータルとしては当然に赤字ですが、返済する時間は担保されていました。

# The scholarship is a loan, so the total is obviously in the red, but the time to pay it back was secured.

ですので、私は、ちょっと残った黒字分が出たときは、東南アジアや大陸をフラフラと旅することもできました(当時の日本の"円"は、世界最強の通貨でした)。

So, when I had a little surplus left over, I could travel around Southeast Asia and the continent (the Japanese “yen” was the strongest currency in the world at that time).

リスクを計算せずに、安直に、愚直に、直感に従って、誰にも相談せずに、一人で行動を開始すべきです。他人に相談するのはよくない。特に「親に相談する」は最悪です。

それはさておき。

Aside from that.

-----

闇バイトに手を出す人には若い人が多いようです。そして、その理由のほぼ100%が『借金苦』のようです。

Many people who get involved in black market work are young. And almost 100% of the reasons seem to be 'debt distress.

私の若いころを思い出しているのですが、ギャンブルには興味がなかったし(今もない)、自分を装う方向には感度ゼロでしたし(今もそうだが)、色恋にはご縁が薄く(知らない間にフラれたりしていました)、専門書はそれなりに購入したけど、それでも、借金するほど高価な本はありませんでした。

I remember my youth. I had no interest in gambling (still don't), I had zero sensitivity in the direction of self-promotion (still don't), I had little luck with colorful love (I was dumped without my knowledge), I bought a good amount of technical books, but still, no books were expensive enough to put me in debt.

高額な買い物は、当時で86万円したパソコンでしたが、私は、これをバイトで稼いだ現金で購入しました(ちなみに、このPCの金額は、今でも私史上、最高額です)。

My most expensive purchase was a computer, which cost 860,000 yen at the time, which I bought with cash earned from my part-time job (by the way, this is still the most expensive PC in my history).

当時は、まともなソフトウェアがなかったので、自分で作らなければなりませんでした。時間は取られましたが、ソフトウェア購入の金額はほぼゼロ円でした。

At the time, no decent software was available, so I had to make my own. It took a lot of time, but the software purchase cost almost nothing.

自分で購入したソフトウェア(?)と言えば、"Turbo Pascal"というPascal言語のパッケージでした(2万円くらいだったかな)。

The software(?) I purchased a Pascal language package called “Turbo Pascal” (about 20,000 yen).

-----

で、ふと思ったのですよ。

And then it occurred to me.

―― 一体、やつらは、どこで借金を作っているんだ?

"Where the hell are they getting their debt?"

と。

家庭の経済的な支援が少ない学生や若年層は、学費や生活費を補うために借金をすることがあるかもしれません。

Students and young adults with little financial support from their families may take on debt to supplement their tuition and living expenses.

今は物価も高いです。それが長期的な返済困難を招くことはあると思います。

Prices are high now. I think that can lead to long-term repayment difficulties.

が、どうにも、違和感があるのです。

But, I don't know, it just doesn't feel right.

苦学生は、苦学しながらも勉学を志そうとしている人たちです ―― このような人たちが、スマホの音声ごときで強盗や殺人をするとは、考えにくい ―― 私の中で、人物像が一致しないのです。

Struggling students are people who are struggling and trying to study -- it is hard to imagine that these people would rob or murder someone over the sound of a smartphone -- the personas don't match up in my mind. I don't have the right image of the person.

ですから、私としては、『自己責任 & 免責型フードバンク』というのを、非営利かつ非公式に運用したいなぁ、と思っています。

-----

しかし、調べていくうちに、私の見識が甘かったかもしれないと思い始めてきました。

However, as I looked into it, I thought I may have been naive in my insight.

■『奨学金の返済』 ―― これはよく分かる。就職活動に上手くいかないと、返済の目処が立たないこともあるでしょう。

- 'Scholarship repayment' -- I understand this. If you don't do well in your job search, you may be unable to afford the repayment.

■『治療費による借金』 ―― これも理解できる。でも、こちらはセーフネットの方で担保できるものもあるんじゃないかなぁ。

- 'Debt due to treatment costs' -- this is also understandable. But I think the safety net can secure some of this one.

ちゃんと相談する所に言って、相談すれば、一気に解決はしないまでも、解決へのアプローチについては教えて貰えるような気がします。

I feel that if you go to the right place and ask for advice, you will be able to learn about approaches to solving the problem, even if it is not solved all at once.

私も、『人間嫌い』で人に相談するのは苦手ですので、人のことをとやかくは言えませんが、とりあえず相談に乗ってくれるところが絶無ということはないと思います。

I am also a “misanthrope” and don't like to talk to people, so I can't speak ill of others, but at any rate, I don't think there is any place where you can get advice.

学生のころ、学費の支払いの目処がたたなくて、困っていたとき、学生課に相談しに行ったことがあります。一言で言えば「大学がお金を貸してくれました」。今でも、その恩は忘れていません。

As a student, I once went to the student affairs office to ask for help when I could not pay my tuition fees. In a word, the university lent me money. Even now, I have not forgotten that favor.

『金銭については、相談すれば、色々なパスが見えてくるもんだなぁ』ということを、その時、初めて知ったような気がします。

I think it was then that I learned for the first time that 'if you consult with people, you can see many different paths.

もちろん『それで全てが解決する』などとは、私も思ってはいませんが、闇バイトする前に、やれることはやってみてからの方が良いと思います。

Of course, I don't believe that “that will solve everything,” but I think it is better to do what you can do before you do a black market job.

-----

ちなみに『遊興費(ギャンブルやブランド品の購入)による借金』については ―― そんな奴のことは知らん。借金までして、遊ぶな、買うな、バカ。そんなことはやめて、コトコツ働いて地道に返済しろ

By the way, as for 'debt due to entertainment expenses (gambling and buying brand-name goods)' -- I don't know anyone who does that. Don't go into debt, don't play, don't buy, you idiot. Stop that kind of thing, work hard, and steadily repay your debts.

とまあ、私は、自分に理解できないコトやモノについては、徹底的に冷酷になれる、最低な奴なんですよ。

And, well, I am a pretty lousy guy who can be thoroughly ruthless about things and things I don't understand.

ご存知の通り。

As you know.

2024,江端さんの忘備録

出張先で、ACアダプタを忘れる ―― これは、定番の「出張あるある」ですが、本人にしてみれば、真っ青になる事件です。

Forgetting an AC adapter on a business trip - this is a standard “business trip occurrence,” but it is an incident that would make the person in question pale in comparison.

日帰り出張であれば、ノートPCのACアダプタを忘れてもなんとかかるかもしれません。

If you are on a one-day business trip, you may help yourself even if you forget your laptop's AC adapter.

しかし、出張先で、しかも、電気量販店もないような地方や海外ともなれば、本当にシャレにならない状況になります。

However, the situation becomes embarrassing if you are on a business trip and in a rural area or overseas with no electronics retailers.

―― バッテリーがなくなったら、そこで業務終了

"When the battery runs out, that's the end of the operation."

顧客が激怒している様子が、簡単に予想できます。

It is easy to predict that customers are outraged.

-----

アニメ『新世紀エヴァンゲリオン』では、エヴァンゲリオン(エヴァ)が外部電源から切り離されると、内蔵された非常用電源(内部バッテリー)での稼働が可能ですが、その稼働時間は約5分から6分と設定されていた、と記憶しております。

In the anime Neon Genesis Evangelion, when the Evangelion (Eva) is disconnected from the external power supply, it can operate on its built-in emergency power supply (internal battery). Still, I remember that the operating time was around 5 to 6 minutes.

まあ、「活動内容に関係なく6分間」という設定には、違和感を感じますし、これだけのものを稼動させるだけの科学力があるのであれば、戦闘中のエネルギー供給を無視できるエネルギー源(小型の原子炉)を搭載してもよさそうなものだ、と思いますが ―― そこには突っ込みません。

Well, I feel that the setting of “six minutes regardless of activity content” is strange. If they have the scientific ability to operate something like this, it seems like they could have installed an energy source (a small nuclear reactor) that could ignore the energy supply during combat, but I won't go there.

ともあれ、このエヴァンゲリオンというのは、この「『ACアダプタから分離されたノートPC』のメタファ」であるのだろう、と私は考えています。

This Evangelion is a metaphor for “a laptop computer that has been separated from its AC adapter.”

それはさておき。

Leaving that aside.

-----

ACアダプタのインターフェースも、メーカごとに見事にバラバラです。そして、ACアダプタは、単体でも非常に高価に設定されています(1万円以上することもある)。

The interfaces of AC adapters are also wonderfully different depending on the manufacturer. AC adapters are also costly (sometimes costing over 10,000 yen).

ACアダプタが併用できない状況に対して、EUが是正命令を出しています(特に、Appleに対して、"SDGs舐めんな!"という趣旨)。

The EU has issued a corrective order for situations where AC adapters cannot be used together (particularly for Apple, with the gist of “Don't mess with the SDGs!”).

「そりゃ当然だ」と私でも思います。あんなものは、忘れてきても、いつでもホテルで借りられのが当然のものであると思います。

Even I think, “Of course.” I think it's only natural that you can rent such things at the hotel, even if you forget to bring them.

もっとも、メーカーにも言い分はあるでしょう。ノートPCは、年々どんどん薄く、軽量化されていますので、インタフェースの形状も変えないとやってられない、などなど。

Of course, manufacturers will have their reasons. As laptop computers become thinner and lighter year by year, they can't help but change the shape of their interfaces, etc.

まあ、私が、出張でACアダプタを忘れずに持ち歩くようにすればいいだけのことですけどね。

Well, I must remember to take my AC adapter with me on business trips.

-----

本日、私、出張していたのですが、USBーEhternet変換アダプタを持ってくるのを忘れて、GoogleMAPで、駅近くの家電量販店を探して、なんとか見つけ出し、安くないお金を支払って購入し、その後、出張先まで走り続けました ―― そして、足の甲を痛めました。

I was on a business trip today, but I forgot to bring a USB-Ethernet conversion adapter. So, I used Google Maps to find a large electronics store near the station. I managed to see it, paid a lot of money, and then ran to my business trip destination—and hurt my instep.

今も、変な歩き方をしています。

I still walk strangely.

まあ、これも、先日お話した、「私の心配性」がなせる業ではあったのですが、このアダプタがあったお陰で、本日のシステム構築で、不良箇所が、いくぶん特定できました。

Well, this was also the result of my worrying nature, as I mentioned the other day, but thanks to this adapter, we could identify some of the faulty parts in today's system construction.

もし、生れ変ることがあるなら、今度は、この心配性パラメータを、現在の"0.3"くらいの係数にして欲しい、と願うばかりです。

安くない買い物でしたが、その価値はありました。

It wasn't cheap, but it was worth it.

-----

で、このUSBーEhternet変換アダプタですが、私の部屋に3つくらいあります。

And I have about three of these USB-Ethernet conversion adapters in my room.

こうして、また私の部屋には、デジタルガジェットが増えていくのです。

And so, my room is once again filled with more digital gadgets.

「パパ! どうして、こんな凄いものを、もっと早く購入してくれなかったの!」

2024,江端さんの忘備録

先日の学会発表では、散々な目にあってきた、というお話をしました。

At a recent academic conference, I talked about the terrible things that had happened to me.

―― ホテルの前に立った瞬間、ヤニの匂いが漂ってきた。

私は、CASIOの電波腕時計 WAVE CEPTORを愛用しています。

I use a CASIO WAVE CEPTOR radio-controlled watch.

この時計は1日1回、 福島または佐賀の2つの送信所から遅られてくる時刻情報の電波を受信して、時刻補正をしています。

This clock receives time correction signals from two transmission stations in Fukushima or Saga once a day.

逆に言えば、その電波が掴めなければ時刻補正ができません。

Conversely, if you can't catch that signal, this watch won't be able to adjust the time.

時刻補正ができないだけならいいのですが、 WAVE CEPTORは、時刻補正が行われないと、2001年1月1日にリセットしてしまうのです(仕様なのか寿命なのかは分かりませんが)。

If it were just a matter of being unable to correct the time, it would be fine, but WAVE CEPTOR resets to January 1st, 2001, if the time is not corrected (I don't know if this is a specification or a lifetime issue).

学会期間中、2001年1月1日の意味不明の時刻しか分からずに、いちいちスマホやPCで時間を確認せねばならず、ひどく難儀をしました(アナログ補正方式で対応していましたが)。

During the conference, I had to check the time on my smartphone or PC every time, as I only knew the time of January 1st, 2001. It was a huge hassle (although I was using an analog correction method).

GPSで補正する時計もありますが、まだまだ値段が高いです。

Some watches use GPS to make corrections but are still expensive.

てっとり早いのは無線LANですが、こちらはアクセスポイントのIDやパスワードの設定が必要になるようです。

The quickest way is to use wireless LAN, but you must set the access point ID and password.

壁掛け時計ならともかく、腕時計には使えないようです。

You can't use it as a wristwatch, even though you can use it as a wall clock.

-----

無線LANのビーコン信号(ブロードキャスト(常に周囲全体に向けて送信)されている)に、時刻情報を放り込んでおけばいいのに、と思うんですけどね。

I think it would be a good idea to throw time information into the beacon signal of wireless LAN (broadcast (always transmitted to the entire surrounding area))

ただ、それをやると、無線LANのアクセスポイント自体に時刻補正機能が必要となって、で、無線LANのアクセスポイントは上位サーバとの時刻同期が必要となって、そうなると、基幹のNTPサーバの負荷が重くなって ・・・ うん、滅茶苦茶に面倒が増える。

However, the wireless LAN access point will need a time correction function if you do that. The wireless LAN access point will need to synchronize its time with the upper-level server, and if that happens, the load on the core NTP server will increase... yeah, it will be a lot more troublesome.

つまるところ、『次女がダイソーで購入した900円の時計(私が電池を入れ替えたもの)を、私が持ち歩く』ということが、世界のために最もコストが安い(SDGsに貢献する)、という結論になりました。

Ultimately, I concluded that the most cost-effective (and SDG-friendly) thing for the world would be carrying around the 900 yen watch that my second daughter bought at Daiso (and I changed the battery).

「そこに怪我人がいれば、助けるのが医者だ」と「そこに動かない時計があれば、動かすのがエンジニアだ」というセリフが等価なのかは分かりませんが ――

そういえば、私、長女の結婚式の時に、この900円の時計をしていこうと思っていました。

I considered wearing this 900 yen watch to my eldest daughter's wedding.

『殆どの人は、900円の時計か9万円の時計か、見分けがつかない』とか、勝手に思い込んでいますか ―― 正直なところ、私は良く分からないです(少なくとも、私(江端)は見分けがつきません)。

I've decided that 'most people can't tell the difference between a 900 yen watch and a 90,000 yen watch'.I don't understand (at least, I (Ebata) can't tell the difference).

そもそも、私は「9万円の男」ではなく、「900円の男」である、という自負がありますから、全然構いませんでしたが。

To begin with, I am proud to say that I am not a “90,000 yen man”, but a “900 yen man”, so I was completely fine with it.

逆に驚いたのは、『家族から一人も反対意見がでなかった』ということです。

I was surprised that 'not a single family member had any objections.'

-----

『結婚式披露宴には、腕時計をしてはいけない』―― のだそうです。なんでも、『時間を気にすることがモラルに反する』のだそうです。

'You shouldn't wear a watch to a wedding reception' - that's what they say. Apparently, 'worrying about the time is against morals'.

私、そういうルール、全然知りませんでした。

I didn't know about those rules at all.

しかし、私、これまでの結婚式披露宴、100%腕時計してきました。

However, I wear a watch at 100% of all wedding receptions.

それに、結婚式披露宴の司会者している時に、「時計なし」で式進行するなど、不可能だったと思う。

Also, when I was the MC at a wedding reception, I didn't think it would have been possible to go through the ceremony without a watch.