2025,江端さんの忘備録

お昼のNHKニュースを見ていたら、本日から5年に一度の「国勢調査」が始まるそうです。
When I was watching the NHK noon news, I heard that the once-every-five-years “National Census” starts today.

人口の数や仕事のこと、家族の形などを集めて、国や自治体の計画に役立てるアンケートであり、答えるのは『国民の義務』であると憲法に記載されている、と聞きました。
It is a survey that gathers information about population, jobs, and family structures to be used in national and local government planning, and I heard that the Constitution says responding is “a duty of the people.”

よく調べてみたら、国勢調査は「憲法に明記」されているのではなく、「憲法の規定に基づいて制定された統計法によって、回答が義務づけられている」という仕組みになっているようです。
When I looked into it more carefully, I found that the census is not “explicitly written in the Constitution,” but rather that “based on constitutional provisions, the Statistics Act was enacted, which makes responding mandatory.”

憲法
Constitution
├─ 第41条:国会は国権の最高機関
├─ Article 41: The Diet is the highest organ of state power
├─ 第62条:国会の国政調査権
├─ Article 62: The Diet’s power to investigate government affairs
└─ 第73条:内閣の行政権 → 統計を整備する責任
└─ Article 73: Executive power of the Cabinet → responsibility to develop statistics

法律(統計法 第13条ほか)
Law (Statistics Act, Article 13, etc.)
└─ 国勢調査は基幹統計調査として規定
└─ The census is designated as a fundamental statistical survey

政令・告示(総務省)
Government orders/notifications (Ministry of Internal Affairs and Communications)
└─ 実施要綱で「日本に住むすべての人・世帯」が対象
└─ Guidelines specify that “all people and households living in Japan” are subject

国民
Citizens
└─ 回答は「法的義務」
└─ Responding is a “legal obligation”
(統計法 第61条に罰則規定あり)
(Penalties stipulated in Statistics Act Article 61)

『罰則?えらい、きっつい規定があるんだなぁ』と思い、こっちもちょっと読んでみました。
“Penalties? Wow, that sounds tough,” I thought, and decided to read it too.

======

統計法(平成19年法律第53号)
Statistics Act (Act No. 53 of 2007)

第61条(罰則)
Article 61 (Penalties)
基幹統計調査又は一般統計調査に関し、次の各号のいずれかに該当する行為をした者は、50万円以下の罰金に処する。
A person who commits any of the following acts regarding a fundamental statistical survey or general statistical survey shall be punished by a fine of up to 500,000 yen.

虚偽の報告をした者

A person who makes a false report

正当な理由がないのに報告をしなかった者

A person who fails to report without cause

報告を拒んだ者

A person who refuses to report

======

まあ、国勢調査に協力せずに、罰則を受けたという話は聞いたことがないので、多分これは「努力規定(*1)」という奴なんだろうなぁ、と思ったら、なんと「強制規定(*2)」でした。
Well, I’ve never heard of anyone actually being penalized for not cooperating with the census, so I thought this must be a “best-effort provision (*1).” But it turned out to be a “mandatory provision (*2).”

(*1)「努めなければならない」「努力するものとする」といった表現で書かれる。違反しても直接の罰則は通常ない。
(*1) Written as “shall endeavor to” or “should strive to.” Usually, there are no direct penalties for violations.

(*2)「~しなければならない」「~してはならない」といった表現で書かれる。違反すれば罰則や行政処分が伴う。
(*2) Written as “must” or “must not.” Accompanied by penalties or administrative sanctions if violated.


で、まあ、今日の日記のオチです。
And so, here’s the punch line of today’s diary.

私、政府の回し者ではありませんし、統計局の回し者でもありませんが、声を大にして言いたいです。
I am not a stooge of the government, nor of the Statistics Bureau, but I want to say this loudly.

『国勢調査への協力をよろしくお願いいたします』
“Please cooperate with the national census.”

「交通と都市研究室」の学徒の一人としても、また、交通や都市のサービスを提供する研究をする企業研究員としても、国勢調査や首都圏または地方のパーソントリップ調査のデータは、私たちの"命綱"といっても過言ではありません。
As a student in the “Transportation and Urban Studies Laboratory,” and as a corporate researcher working on transportation and urban services, census data and person-trip survey data in metropolitan and regional areas are nothing less than our lifeline.

まあ、政府の方がもっと真剣だと思います。
For the government, it’s even more serious.

政府は、これらの基礎資料がないと、まともな政策を立てられないだろうし、数字やデータが読めない頭の悪い政治家を黙らせることもできません。
Without these basic materials, the government cannot make proper policies, nor silence foolish politicians who cannot read numbers or data.

良かれ悪かれ、『数字(統計データ)は暴力装置』というのは事実です。政府や権力者は、この暴力装置を適正に使うことが期待されていますが ――
For better or worse, it is true that “numbers (statistical data) are instruments of power.” The government and those in authority are expected to use this instrument appropriately, but—

「二次関数は義務教育から削除しろ」と主張するたわけた作家夫婦や「女性は三角関数より花の名前でも覚えていればいい」と言ってしまう低能な県知事がいますので、心底心配です。
Some foolish novelists insist “quadratic functions should be removed from compulsory education,” and dim-witted governors who say “women should learn flower names rather than trigonometric functions,” which makes me genuinely worried.

想像力の欠如した、低能な人間

とりあえず、政府や政権の為ではなく、学問の徒としての私の為だけで良いので、ご協力のほど、よろしくお願い致します。
For the time being, not for the sake of the government or the administration, but just for me as a humble student of learning, I ask for your cooperation.


ただ、アンケートを作る側も、「もっと考えろ」と言いたい。
However, I also want to say to those who design the questionnaires: “Think more carefully.”

年収や、年齢や、配偶者や被保護者の有無を、答えさせられる側の心理的負担を、もう少し真剣に考えろ、と。
Think more seriously about the psychological burden imposed on respondents when they are forced to answer about income, age, spouse, or dependents.

お金でデータを買う、というのがてっとり早いのは分かるのですが、これをやると「間違いなくデータの分布に歪みが発生する」と思います。
I understand that buying data with money is the quickest method, but I believe this will inevitably distort the distribution of the data.

しかし、生成AIと日常会話するだけで、アンケート内容を収集できるようにするなど、テクノロジーの方でなんとかする方法がありそうな気がします。
However, I feel there is a belief in technological solutions, such as using generative AI to facilitate conversations and casually collect survey content.

今回の国勢調査には間に合わないとは思いますが、次回の国勢調査は、『10分ほど会話していたら、アンケートが終っていた』くらいの、AI国勢調査員による調査を期待していますよ ―― 総務省統計局の皆様。
This time’s census may be too soon, but for the next census, I hope for AI census-takers that can make it feel like “after about 10 minutes of chatting, the questionnaire was already done” — dear officials of the Statistics Bureau.

■ストレスチェックを受けるように強要されること自体がストレスである → Yes / No

2025,江端さんの忘備録

私が心配性であることは、これまでも何度もお話してきました。
I have mentioned many times before that I am a worrier by nature.

ですので、学位授与式においても「本当に学位が認定されているのか?」と、式の始まる直前まで心配していました(本当の話です)。
Therefore, even at the degree conferment ceremony, I kept worrying until just before it began, wondering, “Has my degree really been approved?” (That is the truth.)

■大丈夫だと思っていた論文が(再投稿の余地なく)リジェクトされる
■A paper I thought was safe gets rejected, with no chance for resubmission.

■予約していた新幹線や飛行機で、席が見つからない
■I cannot find my reserved seat on the Shinkansen or an airplane.

■ネットを使った予備審査の途中でリンクが切れて中断される
■An online lecture suddenly gets cut off when the link disconnects.

■認可される予定だった研究原資が、突然取り消される
■Research funding that was expected to be approved suddenly gets canceled.

社会人であれば、こうしたことは日常茶飯事であり、その積み重ねによって、私は年齢を重ねるごとにますます心配性になっていきました。
For a working adult, such things are everyday occurrences, and as they piled up, I found myself becoming more and more of a worrier with age.

-----

私がようやく安心できたのは、
The only times I finally felt reassured were:

(1) 私の名前が付いたタグがアカデミックガウンに付いているのを確認したとき
(1) When I saw the tag with my name attached to the academic gown.

(2) 私の名前のある成績証明書の封筒が机の上に置かれているのを見たとき
(2) When I noticed the envelope containing my transcript, with my name on it, was placed on the desk.

 

この二つの瞬間でした。そこでようやく「卒業できるんだ」と安堵しました。
At those two moments, I finally felt relieved, thinking, “So I really am going to graduate.”

嘘偽りなく、私は学位記を授与されるその瞬間まで、心配し続けていたのです。
Truthfully, I worried right up until the very moment I was handed my diploma.

以前も述べましたが、これほどの心配性で、自分を痛めつけてしまう自分自身に、正直腹を立てています。
As I have said before, I honestly get angry at myself for being such a worrier that I end up tormenting myself.

『私は、小心者で心配性で、考えうる準備をしておかないと不安で仕方がない』という性格なのです。私は、「私のこの性格で自分が苦しめられている」ことを、大変にがにがしく、また、はらだたしく思っています。

それはさておき。
That aside.

-----

本年度の春学期のゼミの歓迎パーティで、留学生の学友から、
At this year’s spring semester welcome party for the seminar, an international student friend asked me,

"When is your 'Final Defence'?"
“When is your ‘Final Defence’?”

と尋ねられ、私は思わずキョトンとしてしまいました。
I was momentarily dumbfounded.

「最終防衛? 戦争の予定は入っていないけどな」と思いながら話を続けていると、それが「最終審査(公聴会)」のことだと分かってきました。
Thinking, “Final defence? I don’t have any wars scheduled,” I continued the conversation, only to realize that it meant “the final examination (public defence).”

そういえば、審査のことをアカデミズムでは "Defence(防御)" と呼ぶのを思い出しました。
Then I recalled that in academia, examinations are often called a “defence.”

なぜそう呼ぶのかを ChatGPT に尋ねてみたところ、
When I asked ChatGPT why it is called that,

======
博士候補者は、審査委員や他の学者たちの前で論文を公開し、質疑応答に応じて「自らの理論・データ・結論の正しさを守る」ことが求められました。
Doctoral candidates were required to present their dissertations before a panel of examiners and other scholars and “defend” the validity of their theories, data, and conclusions during questioning.

この伝統がそのまま英語圏に引き継がれています。
This tradition has been carried on directly in the English-speaking academic world.
======

と言われました。

つまり "Final Defence" とは「博士号取得者にふさわしいかどうかを確認するための知的な戦いの場」であり、比喩ではなく、本当に「戦い」や「戦争」に近い意味合いだったのです。
In other words, the “Final Defence” is an intellectual battleground to determine whether one is truly worthy of a doctorate. It is not just a metaphor—it carries the sense of an actual battle or war.

アカデミズムというのは、やはりどこか怖い世界なのだなと、帰路の途中でゾクッとしたのを、今でも覚えています。
I remember shivering on my way home, realizing once again that academia is, in its own way, a rather frightening world.

『この春の大学のゼミ集まりで、"When is your 'final defence'?"と言われて、思わず"What?"と対応してしまいました』についてChatGPTに尋ねてみた件

 

2025,江端さんの忘備録

他の人が、どのような背景や理由で取得したのかは、知りませんし、興味もありません。
I neither know nor care what kind of background or reasons others had for obtaining it.

私は、自ら望んで挑戦し、(予想通り)酷い苦労を重ね、(予想通り)散々な目にも遭いながら、ようやくここに辿り着きました。
I chose this path on my own, faced terrible hardships as expected, went through countless ordeals as expected, and finally managed to arrive here.

そうでない人もいるでしょうが、今、私は声を大にして叫びたい。
Others may have had different journeys, but right now, I want to shout it out loud.

博士号取ったぞー!

"Finally got my Doctor of Engineering (Course-based Doctorate)!!!"


ここであれこれ(主に愚痴)を語ることもできますが、それを「ダラダラ」と公開するつもりはありません。
I could go on and on here (mostly with complaints), but I have no intention of dragging them out in public.

この三年間の出来事(と愚痴)を、ロジカルに整理し、時系列順に体系化してドキュメントとして残し、毎月の連載として発表するために、現在、編集部への「営業活動」をしています。
Instead, I am working to organize the events (and complaints) of these three years logically, arrange them chronologically, and preserve them as a document, which I plan to publish as a monthly series. For that purpose, I am currently "pitching" to the editorial department.

また、この連載に今後巻き込まれるであろう関係者の皆さんに対しても「仁義を通す」活動もすでに開始しています。
At the same time, I have already begun "paying my respects" to those who will likely get involved in this upcoming series.


私が学位を取得できたのは、会社の支援と理解、指導して頂いた先生と学生の皆さん、そして、家族(江端家)の圧倒的な支援があったからです。
I was able to obtain my degree thanks to the support and understanding of my company, the guidance of my professors and fellow students, and above all, the overwhelming support of my family (the Ebata household).

ですから――
Therefore—

■真冬のコートよりも厚い生地のアカデミックガウンを着せられたまま、冷房の効いた会場から酷暑の日差しのキャンパスへと連れ出され、
■Being led out from an air-conditioned hall into the blazing summer sun, still wearing an academic gown thicker than a winter coat,

■妻や長女の言うままのポーズで、200枚近い写真撮影に付き合わされた
■And being forced into nearly 200 photo shoots, striking whatever poses my wife and eldest daughter demanded,

などということは、些細なことです。
These were trivial matters.

家族へのささやかな恩返しとして、この程度のことは当然の務めだと思っています。
As a small token of gratitude to my family, I consider them only natural obligations.


もっとも、アカデミックガウンを着たシニア学生が、熱中症で救急車搬送されたりしたら――
That said, if a senior student wearing an academic gown were to be carried away by ambulance due to heatstroke—

『大学が学位を取り消すかもしれない』と頭の片隅で一瞬よぎったのも、また事実です。
It did briefly cross my mind that the university might revoke my degree, and that, too, is a fact.

2025,江端さんの忘備録

英語では、助動詞というのが結構重要な役割をはたしています。
In English, modal verbs play quite an important role.

これは、英語のテクニカルライティングで、一番最初に教えられる内容です。
This is one of the very first things taught in English technical writing.

論文やドラフトでも、これについてはかなり厳密に規定されています。
Even in papers and drafts, their usage is regulated rather strictly.

"義務"で言えば、must > have to > had better > should/ought to
In terms of “obligation”: must > have to > had better > should/ought to

"可能性・推量"で言えば、must > will > should/ought to > may > might/could
In terms of “possibility/likelihood”: must > will > should/ought to > may > might/could

というような感じです。
That’s roughly how the hierarchy looks.


ですので、『絶対XXXXやと思うで。知らんけど』という大阪のフレーズは、基本的には英語に翻訳できません。
Therefore, the Osaka phrase “I’m sure it’s XXXX. But don’t quote me on that” is basically untranslatable into English.

今、飲み物取りにリビングに降りて、嫁さんの見ているバラエティ番組を10秒ほど視聴したのですが、その中でゲストが、
Just now, I went downstairs to grab a drink, and while passing through the living room, I caught about ten seconds of the variety show my wife was watching. One of the guests said:

「ディズニー映画だけは、何度でも見直して欲しいんです」と言っていました。
“I just want people to rewatch Disney movies again and again,” they said.

うん、これは良いフレーズです。
Yes, that’s a good phrase.

「ディズニー映画だけは、何度でも見直して見るべきやで」
But if it had been phrased as, “Disney movies are something you should watch again and again,”

と言われたら、私はカチンときたでしょう。
I would probably have bristled.

もし、そういうフレーズ言われたら、私は間髪入れずに、
And if someone actually said that, without missing a beat, I would have replied:

「NHKの『映像の世紀』だけは、何度でも見直して見るべきやで」
“The NHK series The Century in Moving Images is what you should be rewatching again and again.”

と言い返すでしょう。
That’s what I would have shot back.

正しいフレーズは、「NHKの『映像の世紀』だけは、何度でも見直して見て欲しい」です。
The correct phrasing would be, “I’d like you to rewatch NHK’s The Century in Moving Images as many times as possible.”


私は、正しい日本語に固執するような人間ではありませんが、それでも、『絶対XXXXやと思うで。知らんけど』というセリフは、正直、不愉快です。
I’m not someone who obsesses over strictly correct Japanese, but honestly, the line “I’m absolutely sure it’s XXXX. But don’t quote me on that” makes me uncomfortable.

最低でも、この程度には、論理的な日本語フレーズにして欲しい。
At the very least, I want it expressed in a logically coherent Japanese phrase, like these:

「私はXXXXだと強く推測している。ただし、誤っている可能性もある。」
“I strongly infer that it is XXXX. However, there is a possibility I may be wrong.”

「XXXXである可能性が非常に高いと考える。しかし、確実ではない。」
“I consider it highly likely that it is XXXX. However, it is not certain.”

「XXXXであると判断する根拠はあるが、責任をもって断定はできない。」
“There are grounds to judge that it is XXXX, but I cannot assert it with responsibility.”

フレーズ前半で「強い推測(≒ must に近い)」を示し、後半で「断定を避ける保険」をかける、という構造を持たせることで、論理的に一貫した文章にはなっていますが ーー はっきりいって"迂遠"です。
By structuring the phrase so that the first half shows a “strong inference (≒ must)” and the second half adds a hedge to avoid certainty, it does become logically consistent — but frankly, it’s “roundabout.”


普通に「XXXXである可能性が高いと思う」、または「XXXXと思う」と言えばいいんです。
It would be simpler to say, “I think it’s highly likely to be XXXX,” or simply, “I think it’s XXXX.”

"絶対"などを出すから、"知らんけど"で逃げを打たなければならないんですよ。
It’s only when you throw in “absolutely” that you end up having to tack on “don’t quote me on that” as an escape clause.


このフレーズについての要因を考えてみたのですが ーー
As for why this phrase exists—

「インパクトは欲しいが責任は負いたくない」という人間の欲望を、たった一言で形にした大阪文化的発明
It may be seen as an Osaka-style cultural invention that condenses the human desire to “make an impact without taking responsibility” into a single expression.

と言えるかもしれません。
That’s one way to put it.

知らんけど。
Please don’t quote me on that.

2025,江端さんの忘備録

家族から「リビングの冷却能力が落ちている」とのクレームを受け、先日、リビングのエアコンクリーニングをしてもらいました。
My family complained that the living room’s cooling ability had declined, so the other day I had the air conditioner in the living room professionally cleaned.

3時間弱の作業を全部見せてもらいましたが、プロの技に感嘆すると同時に、洗浄水の汚れには驚かされました。
I watched the entire process, which took nearly three hours, and while I was impressed by the technician’s skill, I was equally shocked by how dirty the wash water was.

事前の打ち合わせの段階で、エアコンが相当に古く、メーカーの部品保存期間も超過しているとのことで、「分解修理はリスクがある」と説明されました。そこで、一般的なクリーニング(といっても、内部の汚れを高圧水で徹底的に流し出す本格的なもの)をお願いしました。
During the preliminary consultation, I was informed that the air conditioner was ancient and that the manufacturer’s parts retention period had already expired, making disassembly repairs risky. So I opted for a standard cleaning, which in this case meant a thorough high-pressure washing of the internal components.

結果として、通気は劇的に改善されたのですが、冷却能力に変化は見られませんでした。
As a result, airflow improved dramatically, but there was no noticeable change in cooling performance.

「経年劣化」と認めざるを得ません。というか、関係者からは「よく今まで動いていた」と言われるほどの長期運用でした。
I had no choice but to admit it was due to aging. In fact, the technician even remarked, “It’s amazing this unit lasted this long,” given its extended years of service.


昨年に引き続き、今年の夏も信じられない暑さです。灼熱の夏は今後も続くと考えて間違いありません。
Just like last year, this summer has been unbearably hot. It’s safe to assume that these scorching summers will continue.

そして、もし「その夏の最中にエアコンが故障したら」などと考えるだけで恐ろしいことです。
And just thinking about what would happen if the air conditioner failed in the middle of such a summer is frightening.

もはや、エアコンは「快適を提供するもの」から「生存を担保するもの」へと替わりつつあります。
Air conditioners are no longer just devices for comfort—they are becoming essential for survival.

という訳で、現在のエアコンには引退してもらって、今年の秋ごろに取替えをするつもりです。
For that reason, I plan to let the current unit retire and replace it this autumn.


20年前(2000年代前半)のエアコンは、同じ冷房能力でも現在の機種に比べておおよそ2倍近い電力を消費していました。
Air conditioners from about twenty years ago consumed nearly twice as much power as today’s models, even with the same cooling capacity.

つまり、最新のエアコンの消費電力は当時の50%程度になっている、というのが大まかな目安です。
In other words, the power consumption of a modern unit is roughly 50% of what it used to be.

最近、政府が節電要請をしてこなくなったのは、エアコンとあわせて、冷蔵庫や照明(白熱灯→LED)も効率が大きく向上しており、家庭やオフィス全体のピーク電力需要が、昔ほど逼迫しにくくなってきたからだそうです。
The government has stopped issuing strong power-saving requests in recent years because not only air conditioners, but also refrigerators and lighting (from incandescent to LED) have become much more efficient, making peak electricity demand in homes and offices less strained than before.

以下はChatGPTに作ってもらった比較表です。
Below is a comparison table generated by ChatGPT.

家電 20年前(2000年代前半) 現在(2020年代) 削減率 備考
エアコン(6畳用) 約800W(冷房時) 約400W 約▲50% インバータ制御の進化、APF向上
冷蔵庫(400Lクラス) 年間 1000kWh前後 年間 300kWh前後 約▲70% 真空断熱材・高効率コンプレッサー
テレビ(32型相当) 約150W(ブラウン管) 約50W(液晶/有機EL) 約▲65% 省電力パネルとバックライト制御
照明(居間用100W×5灯) 約500W(白熱電球) 約50W(LED) 約▲90% LED化で大幅削減
洗濯機(1回運転時) 約800Wh 約300Wh 約▲60% インバータ駆動・自動水量制御

家電製品の買い替えは、「消費が正義」と言い切れるレアケースです。
Replacing home appliances is one of the rare cases where “consumption is justice.”


実際、私のように20年選手のエアコンを酷使してきた人間からすると、「買い替えで電気代が半分になる」というのは、単なる経済合理性どころではなく、生命保険の更新に近い感覚です。
For someone like me who has pushed a twenty-year-old air conditioner to its limits, the idea that “a new unit can halve the electricity bill” feels less like simple economic rationality and more like renewing a life insurance policy.

さらに、現行機種には人感センサーやAI制御が標準装備され、部屋の使用状況に応じて自動的に省エネ運転をしてくれるものも増えました。つまり「つけっぱなしがむしろ正解」という逆転現象すら起きています。
Moreover, many current models come with motion sensors and AI control that automatically adjust for energy savings based on room usage. As a result, we now see the ironic phenomenon where “leaving it on is actually the right choice.”


一方、現在、冷房を使わない部屋で熱中症で死亡するシニアの事件は、もはやレアケースとは言えません。
Meanwhile, cases of seniors dying from heatstroke in rooms without air conditioning are no longer rare.

私を含めたシニア世代は「冷房を入れるたびに電力メーターが高速回転する恐怖」を忘れられず、8月や9月の電気料金の請求書を見るのに勇気が必要だった時代をいまだに引きずっています。
My generation of seniors, myself included, still remembers the fear of watching the power meter spin wildly whenever the air conditioner was turned on, and the dread of opening electricity bills in August and September.

ただ、それだけではありません。シニアになると「エアコンを使うと恐ろしく疲労する」のです。特に睡眠の質が悪くなるのは、多分、体のメカニズムの劣化によるものだと思います。
But that’s not all. As seniors, we often feel terribly fatigued after using air conditioning. The decline in sleep quality, in particular, is probably due to the deterioration of the body’s internal mechanisms.

温度を高めに設定していても(私の場合29〜30度)、倦怠感を覚えます。さらに、除湿効果で翌朝には喉を痛めます。そこで加湿器を導入したのですが、今度は発汗するようになり(たぶん家ダニまで活発化)、加湿器を1時間単位でON/OFFするタイマーを装着する羽目になりました。
Even with a higher temperature setting (in my case, 29–30°C), I still feel fatigue. The dehumidifying effect also leaves my throat sore the next morning. I introduced a humidifier, but that led to excessive sweating (and likely increased dust mite activity), forcing me to install a timer to switch the humidifier on and off every hour.

はっきり言って、床につくまでの準備が「面倒くさい」のです。
Frankly, the preparations before going to bed have become a real nuisance.


こうしてみると、私の就寝準備は「宇宙船の打ち上げ前チェックリスト」に近いです。
When I think about it, my bedtime routine now resembles the pre-launch checklist of a spaceship:

冷房、除湿、加湿、タイマー、全部ONにして――最後にOFFになるのは、私自身の意識です。
Air conditioning, dehumidification, humidification, timers—all set to ON. And the last thing to switch OFF is my own consciousness.

あの時の私は、父を『エアコンで"虐待"していたのではないか』とさえ思うのです。

未分類

次女が50ccバイクを日常使いすることになり、バイクが入ると、玄関の出入りが難しくなるので、『門扉を外せないか』と嫁さんに相談されました。

最近、「ナット外し」の機会が多くて(バイクのオイル交換等)、『スパナを購入しては、サイズ違い』という繰り返しをしており、もうセットで購入することにしました。

Amazonで、1300円というお手頃価格でした(↓をクリックすると、Amazonに飛びます)

 

門扉の結合部

保護キャップを取り外す

スパナ(11mm)をラチェットに装着

 

アタッチ部を解除

門扉を外し終えた状態

外された門扉

 

 

2025,江端さんの忘備録

私、自分のホームページのアクセスログは毎日確認しています(但し、グラフ表示のみ)。
I check the access logs of my homepage every day (though only in graph form).

で、最近、アクセスエラーが酷くなりました。以前は、一日に、0回、多くても2~3回くらいだったのが、先週3900回になっておりました。
Recently, however, access errors have become severe. In the past, it was 0 times a day, or at most 2–3 times, but last week it reached 3,900 times.

『ちょっと看過できなくなってきたなぁ』と思い、今日、ログ解析をしていたのですが、主に、3つのホスト(海外)からDDOS攻撃もどきを受けていたようです。
Thinking, “This is getting hard to ignore,” I analyzed the logs today, and it seems I was being hit mainly by three overseas hosts with something like a pseudo-DDOS attack.

まあ、悪意の攻撃か、あるいは自動プログラムのリトライかは分かりませんが、迷惑な話です。
Well, whether it was a malicious attack or simply a retry by an automated program, it’s a nuisance.

攻撃対象は、WordPressに移行する前の古いコンテンツのようでしたので、多分、セキュリティホールを探しているのではないかと推定されます。
The attack target seemed to be old content from before I migrated to WordPress, so I presume they are probably probing for security holes.

で、先程、手元でできる対策(上記のIPアドレスを名指しでアクセス拒否する等)などを行ってみました。
So, I just tried some local countermeasures, such as explicitly blocking those IP addresses.

全部ではなく、対策は半分くらいとしておきました。今後、アクセスログを解析すれば、「悪意の攻撃」か否かを特定できると思います。
I didn’t cover everything—only about half the directories. In the future, by analyzing the logs, I think I can determine whether it was truly a malicious attack or not.


それにしても『私のような個人サイトを攻撃してどうするんだ? やるなら、官庁や大企業を狙えよ』と思うのですが、サイバー攻撃というのは、基本的に「頭の悪い攻撃」がほとんどです。
Still, I can’t help but think, “What’s the point of attacking a small personal site like mine? If you must, go after a government office or a big corporation.” But most cyberattacks are basically “dumb attacks.”

イメージとしては、『全方向に機関銃をぶっぱなして、悲鳴が上がったところに、対象がいる』という、"索敵"をやっているようなもので、その"索敵"が終わった後に「何をするか」というビジョンはありません。
The image is like “firing a machine gun in every direction and then assuming the target is wherever someone screams.” It’s just reconnaissance, and after that “recon” ends, there’s no vision of what to do next.

とりあえず、ログインの方法まで遡れれば、私のサイトを『攻撃の踏み台』にできるかもしれませんし、トップページを『外国語で日本国政府を批判する記事に書き換える』とかはできそうです。
At best, if they could trace back to a login method, they might use my site as a “stepping stone” for attacks, or they might rewrite the top page with some article in a foreign language criticizing the Japanese government.

今なら、中国語とかロシア語が有力ですが、このトレンドは5年くらいで替わります。実際に上記の3つのIPアドレスの一つは、米国の大学となっていました(もちろんURLの詐称をしているとは思いますし、詐称していなければ『バカ』と言うしかありません)。
Currently, Chinese or Russian would be the most likely options, but these trends shift every five years or so. In fact, one of the three IP addresses appeared to be a U.S. university (though I assume it was spoofed—and if it wasn’t spoofed, then they’re just plain fools).

私(または江端家)の個人情報を取ってくる、という可能性もありますが、費用対効果からは、あまりペイしないと思います。
They might also try to steal my (or the Ebata family’s) personal information, but from a cost-effectiveness standpoint, I doubt it would pay off.


以前ちょっとお話しましたが、私、以前、「報復システム」というネタで特許出願しようか、と考えたことがあります。
As I mentioned before, I once considered filing a patent application for an idea called a “Retaliation System.”

『私が個人で「報復システム」を起動させるのであれば、特に問題はないよなぁ』とか、考え出しています。
I began thinking, “If I personally activated a ‘Retaliation System,’ there wouldn’t be any problem, would there?”

そろそろ、「組織のしがらみ」からも解き放たれつつありますしね。
After all, I’m starting to be freed from the “constraints of organizations.”

まあ、攻撃者も私のサイトを狙うくらいなら、いっそ Amazonのレビュー欄で☆1を連打するとか、もっと建設的な暇つぶしをすればいいのに。
Well, if attackers are going to bother with my site, they might as well spend their time more constructively—like spamming one-star reviews on Amazon.

インターネットは広大だというのに、よりによって江端家を選ぶとは、趣味が悪い。
The Internet is vast, yet of all places, they chose the Ebata household—what lousy taste.


「報復システム」特許明細書(素案)

“Retaliation System” Patent Application(blueprint)

【発明の名称】
個人運営型サーバ向け自動報復システム
[Title of Invention]
Automated Retaliation System for Individually Managed Servers

【背景技術】
従来のサイバー攻撃対策は、防御に偏重し、個人運営者に爽快感をもたらすことが困難であった。
[Background Technology]
Conventional cyberattack countermeasures focus solely on defense and fail to provide a sense of satisfaction to individual operators.

【課題】
攻撃を受けた側に「なんかスカッとする」心理的効果を提供しつつ、費用対効果に優れた報復を実現する。
[Problem to be Solved]
To provide the attacked party with a refreshing psychological effect while delivering a cost-effective retaliation.

【解決手段】
本システムは、攻撃元IPを検知すると以下のいずれかの報復処理を実行する:

  1. 攻撃元画面に「江端智一のコラム最新号」を強制表示する。

  2. 攻撃元のCPUに負荷をかけずに延々と「読み込み中...」アニメーションを回し続ける。

  3. 攻撃元のシステム時計を5分ずつ遅らせる(社会的に地味に困らせる)。
    [Solution]
    When detecting the attacker’s IP, the system executes one of the following retaliation processes:

  4. Force displays the latest “Tomoichi Ebata Column” on the attacker’s screen.

  5. Loops a perpetual “Loading...” animation without burdening the attacker’s CPU.

  6. Delays the attacker’s system clock by five minutes at a time (a subtle but socially troublesome effect).

【効果】
本システムにより、個人運営者は被攻撃時に「ただの迷惑」ではなく「ちょっとしたエンタメ」として状況を受け止められる。さらに、攻撃者には「時間泥棒」という究極の逆襲を体感させることができる。
[Effect]
With this system, individual operators can perceive attacks not merely as nuisances but as minor entertainment. At the same time, attackers experience the ultimate counterstrike: theft of their time.

【産業上の利用可能性】
国内外の個人ブロガー、趣味サイト管理者、ならびに「暇をもて余したエンジニア」の精神衛生維持に広く応用可能である。
[Industrial Applicability]
This system can be widely applied for the mental health of personal bloggers, hobby site administrators, and “engineers with too much free time” both domestically and internationally.

未分類

現在の状況(11/30) 一通りの稼働を確認

(Step 1) 広袴のOSMファイルをダウンロード
G:\home\ebata\hirohakama\hiro_db\small-hirohakama.osm

(Step 2) OSM → network.xmlへの変更
G:\home\ebata\hirohakama\hiro_db
$ python osm_to_matsim_network.py
network.xmlが生成

(Step.3)
ebata@DESKTOP-1QS7OI7:~/matsim-example-project$ java -jar matsim-example-project-0.0.1-SNAPSHOT.jar

[config-test1.xml]

<?xml version="1.0" ?>
<!DOCTYPE config SYSTEM "http://www.matsim.org/files/dtd/config_v2.dtd">
<config>

	<module name="global">
		<param name="randomSeed" value="4711" />
		<param name="coordinateSystem" value="EPSG:6685" />
	</module>

	<module name="network">
		<param name="inputNetworkFile" value="network-test1.xml" />
	</module>

	<module name="plans">
		<param name="inputPlansFile" value="plans-test1.xml" />
	</module>

	<module name="controller">
		<param name="outputDirectory" value="./output" />
		<param name="lastIteration" value="0" />

		<!-- 追記:毎イテレーション events を出す -->
		<param name="writeEventsInterval" value="1" />

	</module>


	<module name="scoring">
		<parameterset type="activityParams" >
			<param name="activityType"            value="h" />
			<param name="typicalDuration" value="12:00:00" />
		</parameterset>
		<parameterset type="activityParams" >
			<param name="activityType"            value="w" />
			<param name="typicalDuration" value="08:00:00" />
		</parameterset>
	</module>

	<module name="routing">
	  <!-- 既に書いてある他の routing パラメータがあればそのまま残す -->
	  
	  <!-- ネットワーク整合性チェックを無効化 -->
	  <param name="networkRouteConsistencyCheck" value="disable" />
	</module>	
	
</config>

[network-test1.xml]

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE network SYSTEM "http://www.matsim.org/files/dtd/network_v1.dtd">

<network name="equil test network">
  <nodes>
    <node id="279332805" x="768875.871" y="1096994.329"/>
    <node id="279332812" x="768964.532" y="1097238.641"/>
    <node id="279332877" x="768972.629" y="1097302.450"/>
(中略)
    <node id="12893847140" x="768966.269" y="1097305.846"/>
    <node id="13206970768" x="768642.219" y="1096803.771"/>
    <node id="13206970769" x="768656.013" y="1096826.212"/>
  </nodes>

  <links capperiod="01:00:00">
    <link id="1239817547_0_bwd" from="12891801850" to="279332880" length="2.25" freespeed="13.89" capacity="900.00" permlanes="1" />
    <link id="1239817547_0_fwd" from="279332880" to="12891801850" length="2.25" freespeed="13.89" capacity="900.00" permlanes="1" />
    <link id="1239817547_1_bwd" from="1768138693" to="12891801850" length="62.84" freespeed="13.89" capacity="900.00" permlanes="1" />
(中略)
    <link id="761529596_5_bwd" from="12891801828" to="12891801827" length="1.72" freespeed="10.00" capacity="1000.00" permlanes="1" />
    <link id="761529596_5_fwd" from="12891801827" to="12891801828" length="1.72" freespeed="10.00" capacity="1000.00" permlanes="1" />
  </links>
</network>

[plans-test1.xml]

<?xml version="1.0" ?>
<!DOCTYPE plans SYSTEM "http://www.matsim.org/files/dtd/plans_v4.dtd">
<plans xml:lang="de-CH">
<person id="1">
  <plan>
    <act type="h" link="153188623_0_fwd" end_time="06:00" />
    <leg mode="car">
      <route> </route>
    </leg>

    <act type="w" link="165222823_3_fwd" dur="00:00:10" />
    <leg mode="car">
      <route> </route>
    </leg>
    <act type="w" link="165257680_2_fwd" dur="00:00:05" />

    <leg mode="car">
      <!-- ここは書かない(MATSim に任せる) -->
    </leg>

    <act type="h" link="257057591_26_fwd" />
  </plan>
</person>
</plans>

(Step.4)

ebata@DESKTOP-1QS7OI7:~/matsim-example-project/scenarios/equil2$ python matsim_events_to_geo_csv.py
CSV exported: output/agents_positions_geo.csv

(Step.5)

ここからは、QGISで動画表示をするところは、前回の方式とおなじ

======
現在の状況(11/24)

WSL(Ubuntu)起動→
ebata@DESKTOP-1QS7OI7:~/matsim-example-project$ java -jar matsim-example-project-0.0.1-SNAPSHOT.jar

 

これが通ると

ebata@DESKTOP-1QS7OI7:~/matsim-example-project/scenarios/equil2/output$ pwd
/home/ebata/matsim-example-project/scenarios/equil2/output が書換えられるので注意

必要なファイルは3つ

<?xml version="1.0" ?>
<!DOCTYPE config SYSTEM "http://www.matsim.org/files/dtd/config_v2.dtd">
<config>

	<module name="global">
		<param name="randomSeed" value="4711" />
		<param name="coordinateSystem" value="EPSG:6685" />
	</module>

	<module name="network">
		<param name="inputNetworkFile" value="network.xml" />
	</module>

	<module name="plans">
		<param name="inputPlansFile" value="plans100.xml" />
	</module>

	<module name="controller">
		<param name="outputDirectory" value="./output" />
		<param name="lastIteration" value="10" />

		<!-- 追記:毎イテレーション events を出す -->
		<param name="writeEventsInterval" value="1" />

	</module>

	<module name="scoring">
		<param name="lateArrival" value="-18" />
		<param name="performing" value="+6" />
		<parameterset type="activityParams" >
			<param name="activityType"            value="h" />
			<param name="typicalDuration" value="12:00:00" />
		</parameterset>
		<parameterset type="activityParams" >
			<param name="activityType"            value="w" />
			<param name="typicalDuration" value="08:00:00" />
			<param name="openingTime"     value="07:00:00" />
			<param name="closingTime"     value="18:00:00" />
		</parameterset>
	</module>
	
	<module name="replanning">
		<parameterset type="strategysettings" >
			<param name="strategyName" value="BestScore" />
			<param name="weight" value="0.9" />
		</parameterset>
		<parameterset type="strategysettings" >
			<param name="strategyName" value="ReRoute" />
			<param name="weight" value="0.1" />
		</parameterset>
	</module>
</config>

上記のconfig.xmlの概要は以下の通り。

config.xml の概要

本設定ファイルは、MATSim シミュレーションを実行するための基本パラメータを定義したものであり、全体として「ネットワーク」「プラン」「コントローラ」「スコアリング」「リプランニング(経路再探索)」の各モジュール設定から構成されている。

1. global モジュール

  • シミュレーションの乱数シード(4711)を指定して再現性を確保している。

  • 使用する座標系として EPSG:6685(日本の平面直角座標系 9系などに相当)を明示している。

2. network モジュール

  • 交通ネットワークとして network.xml を読み込む設定である。

  • 道路・リンク・ノード等の空間構造を定義する基礎データである。

3. plans モジュール

  • エージェントの活動計画ファイルとして plans100.xml を指定している。

  • 各エージェントの1日の行動(自宅→職場など)を読み込む役割を持つ。

4. controller モジュール

  • 出力ディレクトリを ./output とし、最終イテレーションは 10 としている。

  • 各イテレーションでイベントファイル(events.xml.gz)を出力するため、writeEventsInterval=1 を設定している。

5. scoring モジュール

  • スコア計算に関するパラメータを定義している。

    • 遅刻のペナルティ(lateArrival = −18)

    • 活動継続の効用(performing = +6)

  • 活動タイプ h(home) および w(work) の典型滞在時間・開閉時間などを定義し、日常行動モデルの評価基準を与えている。

6. replanning モジュール

  • プラン選択と経路再探索に関する戦略設定を行っている。

    • BestScore(重み 0.9)

    • ReRoute(重み 0.1)

  • これにより、シミュレーション内でエージェントがプランを修正し、より良い経路や活動を選択する過程を再現する。


総括

本 config.xml は、標準的な MATSim 実行構成を踏襲しながら、日本の座標系(EPSG:6685)を用いたネットワーク・プランデータを読み込み、10 イテレーションのシミュレーションを行う設定となっている。スコアリングおよび再計画戦略も基本設定が施されており、小規模テストから実用的な解析まで広く利用可能な構成である。

[network.xml]

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE network SYSTEM "http://www.matsim.org/files/dtd/network_v1.dtd">

<network name="equil test network">
  <nodes>
	<node id="1"  x="774558.033" y="1108851.844"/>
	<node id="2"  x="779558.033" y="1108851.844"/>
	<node id="3"  x="793693.033" y="1114776.844"/>
	<node id="4"  x="792060.033" y="1113182.844"/>
	<node id="5"  x="790729.033" y="1112066.844"/>
	<node id="6"  x="789860.033" y="1110562.844"/>
	<node id="7"  x="789558.033" y="1108851.844"/>
	<node id="8"  x="789860.033" y="1107140.844"/>
	<node id="9"  x="790729.033" y="1105636.844"/>
	<node id="10" x="792060.033" y="1104520.844"/>
	<node id="11" x="793693.033" y="1102926.844"/>
	<node id="12" x="794558.033" y="1108851.844"/>
	<node id="13" x="799558.033" y="1108851.844"/>
	<node id="14" x="799558.033" y="1098851.844"/>
	<node id="15" x="774558.033" y="1098851.844"/>
  </nodes>

   <links capperiod="01:00:00">
      <link id="1" from="1" to="2" length="10000.00" capacity="36000" freespeed="27.78" permlanes="1"  />
      <link id="2" from="2" to="3" length="10000.00" capacity="3600" freespeed="27.78" permlanes="1"  />
      <link id="3" from="2" to="4" length="10000.00" capacity="3600" freespeed="27.78" permlanes="1"  />
      <link id="4" from="2" to="5" length="10000.00" capacity="3600" freespeed="27.78" permlanes="1"  />
      <link id="5" from="2" to="6" length="10000.00" capacity="3600" freespeed="27.78" permlanes="1"  />
      <link id="6" from="2" to="7" length="10000.00" capacity="3600" freespeed="27.78" permlanes="1"  />
      <link id="7" from="2" to="8" length="10000.00" capacity="3600" freespeed="27.78" permlanes="1"  />
      <link id="8" from="2" to="9" length="10000.00" capacity="3600" freespeed="27.78" permlanes="1"  />
      <link id="9" from="2" to="10" length="10000.00" capacity="3600" freespeed="27.78" permlanes="1"  />
      <link id="10" from="2" to="11" length="10000.00" capacity="3600" freespeed="27.78" permlanes="1"  />
      <link id="11" from="3" to="12" length="5000.00" capacity="1000" freespeed="27.78" permlanes="1"  />
      <link id="12" from="4" to="12" length="5000.00" capacity="1000" freespeed="27.78" permlanes="1"  />
      <link id="13" from="5" to="12" length="5000.00" capacity="1000" freespeed="27.78" permlanes="1"  />
      <link id="14" from="6" to="12" length="5000.00" capacity="1000" freespeed="27.78" permlanes="1"  />
      <link id="15" from="7" to="12" length="5000.00" capacity="1000" freespeed="27.78" permlanes="1"  />
      <link id="16" from="8" to="12" length="5000.00" capacity="1000" freespeed="27.78" permlanes="1"  />
      <link id="17" from="9" to="12" length="5000.00" capacity="1000" freespeed="27.78" permlanes="1"  />
      <link id="18" from="10" to="12" length="5000.00" capacity="1000" freespeed="27.78" permlanes="1"  />
      <link id="19" from="11" to="12" length="5000.00" capacity="1000" freespeed="27.78" permlanes="1"  />
      <link id="20" from="12" to="13" length="10000.00" capacity="36000" freespeed="27.78" permlanes="1"  />
      <link id="21" from="13" to="14" length="10000.00" capacity="36000" freespeed="27.78" permlanes="1"  />
      <link id="22" from="14" to="15" length="35000.00" capacity="36000" freespeed="27.78" permlanes="1"  />
      <link id="23" from="15" to="1" length="10000.00" capacity="36000" freespeed="27.78" permlanes="1"  />
   </links>
</network>

network.xml の概要

本 network.xml は、MATSim の「equil(equilibrium)」テストで用いられる代表的な小規模ネットワークの構造を記述したものであり、ノード 15 点とリンク 23 本から構成される。全体として、中央ノード「2」を中心とした放射状構造と、外周を囲うリング構造をあわせ持つネットワークである。


1. ノード構成(nodes)

  • ノード数は 15

  • 座標はメートル単位の **平面直角座標(UTM ではない独自座標)**に近い配置。

  • ノード 1 → 2 → 3 → 12 → 13 → 14 → 15 → 1 と接続する大きな「外周ループ(リング)」が形成されている。

■ 中央に位置するノード

  • ノード 2
    → このノードから計 10 本のリンクが放射状に伸びており、ネットワークの「ハブ」として機能する。

■ 外周ノード

  • 1, 2, 3, 12, 13, 14, 15
    → 大きな四角形〜多角形を構成する外周ノード。

■ 放射状ノード

  • 3〜11(2 を中心とした扇状配置)

  • これらのノードはすべてノード 12 に接続され、中央から外周へ向かう“枝”のような構造を形成。


2. リンク構成(links)

総リンク数は 23 本。時間帯は capperiod="01:00:00"(1時間あたり容量)。

(1) ハブ(ノード 2)から放射状に伸びるリンク(リンクID 2〜10)

  • from="2" → to="3〜11"

  • 長さ:10,000 m

  • 容量:3,600 veh/h

  • 自由速度:27.78 m/s(= 約 100 km/h)

  • 構造:中央ノードから各方向へ伸びる 9 本の支線

(2) 放射状ノードからノード 12 への接続(リンクID 11〜19)

  • 各ノード 3〜11 → ノード 12 へ接続

  • 長さ:5,000 m

  • 容量:1,000 veh/h(細い道路)

  • 放射状ネットワークの外周に向かう“枝”の集約点がノード 12

(3) 外周ループ(リンクID 1, 20〜23)

  • 1 → 2

  • 12 → 13

  • 13 → 14

  • 14 → 15

  • 15 → 1

  • 長さ:10,000〜35,000 m

  • 容量:36,000 veh/h(高速道路レベル)

  • ネットワーク外周を広く囲むリング道路


3. ネットワーク構造の特徴

  • 中央ハブ(ノード2)
    → 多方向に交通が流れる主要結節点。
    → エージェントが多く集まるため、MATSim チュートリアルで典型的に渋滞が再現される部分。

  • 外周大容量リンク
    → 大容量(36,000 veh/h)で構成され、混雑しづらい。
    → “外環状道路”として機能。

  • 中間のノード 12 が集約点
    → 放射状ノード群の出口に相当。
    → ハブ(2)と外周(13)を結ぶ重要な中継ノード。

  • 典型的なテストネットワーク
    → シンプルであるが、渋滞・ルート選択・再探索の動きを明確に確認できる構造。
    → MATSim の初学者用・論文やサンプルコードで用いられる標準モデル。


総括

この network.xml は、MATSim の代表的な「equil」ネットワークをベースとしたもので、中心に交通が集中するハブ構造と、大容量リング道路、放射状道路からなるシンプルかつ典型的なテスト用ネットワークである。渋滞発生や再経路探索のような動態変化を観察するのに適した構成となっている。

[plans100.xml]

<?xml version="1.0" ?>
<!DOCTYPE plans SYSTEM "http://www.matsim.org/files/dtd/plans_v4.dtd">
<plans xml:lang="de-CH">
<person id="1">
	<plan>
		<act type="h" x="-25000" y="0" link="1" end_time="06:00" />
		<leg mode="car">
			<route>2 7 12</route>
		</leg>
		<act type="w" x="10000" y="0" link="20" dur="00:10" />
		<leg mode="car">
			<route> </route>
		</leg>
		<act type="w" x="10000" y="0" link="20" dur="03:30" />
		<leg mode="car">
			<route>13 14 15 1</route>
		</leg>
		<act type="h" x="-25000" y="0" link="1" />
	</plan>
</person>

</plans>

この概要は以下の通り。

plans100.xml の概要

この plans100.xml は、MATSim に投入する **エージェントの活動計画(1日の行動スケジュール)**を定義したファイルである。
現状では person は1名のみ(id="1")であり、その人物が 自宅(h)→職場(w)→職場(w)→自宅(h) と移動しながら活動する1日の行動列が記述されている。


1. person と plan の構成

  • <person id="1">
    → エージェント1名を定義。

  • <plan>
    → そのエージェントの1日の行動計画を時系列に並べる。
    act(活動)と leg(移動)の交互列が基本。


2. 行動列の中身(act / leg)

(1) 自宅活動 h

<act type="h" ... link="1" end_time="06:00" />
  • type="h" は home(自宅)。

  • link="1" 上に存在する活動地点。

  • end_time="06:00" なので、06:00 に出発する設定。


(2) 車移動(自宅→職場)

<leg mode="car">
<route>2 7 12</route>
</leg>
  • mode="car" により車移動。

  • route は通過リンク列で、
    リンク 2 → 7 → 12 を通る経路を明示している。


(3) 職場活動 w(短い滞在)

<act type="w" ... link="20" dur="00:10" />
  • type="w" は work(職場)。

  • link="20" 上で活動。

  • dur="00:10" なので 10分だけ職場に滞在


(4) 車移動(職場→職場)

<leg mode="car">
<route> </route>
</leg>
  • 車移動だが route が空白。

  • これは 経路をMATSim側に再計算させる意図で置かれていると解釈できる。


(5) 職場活動 w(長い滞在)

<act type="w" ... link="20" dur="03:30" />
  • 同じ link="20" の職場で、
    3時間30分滞在する設定。


(6) 車移動(職場→自宅)

<leg mode="car">
<route>13 14 15 1</route>
</leg>
  • リンク 13 → 14 → 15 → 1 を通って帰宅する経路が明示されている。

  • ネットワークの外周ループ側を通る帰路と対応する。


(7) 自宅活動 h(帰宅後)

<act type="h" ... link="1" />
  • 最終活動は自宅(h)。

  • end_time や dur がないため、**その時点で計画終了(終日滞在)**の意味。


3. この plans.xml の特徴と用途

  • person が1名だけの 最小構成テスト用 plans

  • 経路が一部手動指定、一部自動再探索(空 route)という混合設定。

  • equil ネットワーク上で
    時間指定付きの通勤行動と、再経路探索の挙動を確認するための計画になっている。


総括

plans100.xml は、エージェント1名の1日行動(06:00 出発の通勤、職場での短時間/長時間滞在、外周経路で帰宅)を記述したテスト用 plans である。経路指定を明示する部分と MATSim に任せる部分が共存しており、ルート選択やリプランニングの動作確認に適した構成となっている。

さて、3つのファイルで

ebata@DESKTOP-1QS7OI7:~/matsim-example-project/scenarios/equil2/output$ ls
ITERS                      modestats.png              output_households.xml.gz  pkm_modestats.csv
logfile.log                modestats_stackedbar.png   output_legs.csv.gz        pkm_modestats.png
logfileWarningsErrors.log  modules.dot                output_links.csv.gz       scorestats.csv
modeChoiceCoverage10x.png  output_activities.csv.gz   output_network.xml.gz     scorestats.png
modeChoiceCoverage10x.txt  output_allVehicles.xml.gz  output_persons.csv.gz     stopwatch.csv
modeChoiceCoverage1x.png   output_config.xml          output_plans.xml.gz       stopwatch.png
modeChoiceCoverage1x.txt   output_config_reduced.xml  output_trips.csv.gz       tmp
modeChoiceCoverage5x.png   output_counts.xml.gz       output_vehicles.xml.gz    traveldistancestats.csv
modeChoiceCoverage5x.txt   output_events.xml.gz       ph_modestats.csv          traveldistancestatslegs.png
modestats.csv              output_facilities.xml.gz   ph_modestats.png          traveldistancestatstrips.png
ebata@DESKTOP-1QS7OI7:~/matsim-example-project/scenarios/equil2/output$

ができている。

ここにcsvファイル作成用のPythonプログラム(matsim_events_to_csv.py)を書き込む。

[matsim_events_to_csv.py]

import gzip
import xml.etree.ElementTree as ET
import csv
import math

EVENTS_FILE = "output_events.xml.gz"
NETWORK_FILE = "output_network.xml.gz"
OUT_CSV = "agents_positions.csv"
STEP_SEC = 1.0  # 1秒刻み


def load_network(network_file):
    nodes = {}
    links = {}

    with gzip.open(network_file, 'rb') as f:
        tree = ET.parse(f)
        root = tree.getroot()

        for node in root.find("nodes"):
            nid = node.attrib["id"]
            x = float(node.attrib["x"])
            y = float(node.attrib["y"])
            nodes[nid] = (x, y)

        for link in root.find("links"):
            lid = link.attrib["id"]
            fnode = link.attrib["from"]
            tnode = link.attrib["to"]
            length = float(link.attrib.get("length", "0"))
            freespeed = float(link.attrib.get("freespeed", "0"))
            links[lid] = (fnode, tnode, length, freespeed)

    return nodes, links


def interpolate_points(t0, t1, x0, y0, x1, y1, step=1.0):
    dt = t1 - t0
    if dt <= 0:
        return [(t0, x0, y0), (t1, x1, y1)]

    n_steps = int(math.floor(dt / step))
    pts = []

    for i in range(n_steps + 1):
        t = t0 + i * step
        if t > t1:
            break
        r = (t - t0) / dt
        x = x0 + r * (x1 - x0)
        y = y0 + r * (y1 - y0)
        pts.append((t, x, y))

    if not pts or pts[-1][0] < t1:
        pts.append((t1, x1, y1))

    return pts


def process_events(events_file, nodes, links, out_csv):
    # vehicle -> person 対応
    vehicle_to_person = {}

    # vehicleごとの entered 状態
    # in_progress[vehicle] = (link_id, enter_time)
    in_progress = {}

    with gzip.open(events_file, 'rb') as f, open(out_csv, "w", newline="", encoding="utf-8") as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(["time", "person", "x", "y", "link", "event_type"])

        for ev, elem in ET.iterparse(f, events=("end",)):
            if elem.tag != "event":
                continue

            a = elem.attrib
            etype = a.get("type", "")
            time = float(a.get("time", "0"))

            # 1) vehicle -> person 対応を作る
            if etype == "PersonEntersVehicle":
                person = a.get("person")
                vehicle = a.get("vehicle")
                if person and vehicle:
                    vehicle_to_person[vehicle] = person
                elem.clear()
                continue

            # 2) entered/left link は vehicle 単位で処理
            if etype in ("entered link", "left link"):
                vehicle = a.get("vehicle")
                link_id = a.get("link")
                if vehicle is None or link_id is None:
                    elem.clear()
                    continue
                if link_id not in links:
                    elem.clear()
                    continue
                if vehicle not in vehicle_to_person:
                    # person がまだ紐付いていない車両は無視
                    elem.clear()
                    continue

                fnode, tnode, length, freespeed = links[link_id]
                if fnode not in nodes or tnode not in nodes:
                    elem.clear()
                    continue

                if etype == "entered link":
                    in_progress[vehicle] = (link_id, time)

                elif etype == "left link":
                    if vehicle not in in_progress:
                        elem.clear()
                        continue

                    entered_link_id, t_enter = in_progress[vehicle]
                    if entered_link_id != link_id:
                        # 不整合対策:状態を更新してスキップ
                        in_progress[vehicle] = (link_id, time)
                        elem.clear()
                        continue

                    t_left = time
                    actual_dt = t_left - t_enter

                    expected_dt = length / freespeed if freespeed > 0 and length > 0 else None
                    if actual_dt <= 0:
                        if expected_dt is not None and expected_dt > 0:
                            actual_dt = expected_dt
                            t_left = t_enter + actual_dt
                        else:
                            actual_dt = 0

                    x0, y0 = nodes[fnode]
                    x1, y1 = nodes[tnode]

                    pts = interpolate_points(t_enter, t_left, x0, y0, x1, y1, step=STEP_SEC)

                    person = vehicle_to_person[vehicle]
                    for t, x, y in pts:
                        writer.writerow([t, person, x, y, link_id, "move"])

                    in_progress.pop(vehicle, None)

            elem.clear()


def main():
    nodes, links = load_network(NETWORK_FILE)
    process_events(EVENTS_FILE, nodes, links, OUT_CSV)
    print(f"CSV exported: {OUT_CSV}")


if __name__ == "__main__":
    main()

$ebata@DESKTOP-1QS7OI7:~/matsim-example-project/scenarios/equil2/output$ python matsim_events_to_csv.py
CSV exported: agents_positions.csv

このagents_positions.csvが、エージェントの軌跡となるが、面倒なので、時間と座標を出すプログラムを作成

[matsim_events_to_geo_csv.py]

import gzip
import xml.etree.ElementTree as ET
import csv
import math
from datetime import datetime, timedelta, timezone

try:
    from pyproj import Transformer
except ImportError as e:
    raise SystemExit(
        "pyproj が必要です。pip install pyproj を実行してください。"
    )

EVENTS_FILE = "output_events.xml.gz"
NETWORK_FILE = "output_network.xml.gz"
OUT_CSV = "agents_positions_geo.csv"
STEP_SEC = 1.0  # 1秒刻み

# シミュレーション開始日時(必要に応じて変更)
# 例: 日本時間で 2025-11-24 00:00:00 開始
SIM_START = datetime(2025, 11, 24, 0, 0, 0, tzinfo=timezone(timedelta(hours=9)))

# 座標変換: EPSG:6685 -> EPSG:4326 (lon, lat)
TRANSFORMER = Transformer.from_crs("EPSG:6685", "EPSG:4326", always_xy=True)


def load_network(network_file):
    nodes = {}
    links = {}

    with gzip.open(network_file, 'rb') as f:
        tree = ET.parse(f)
        root = tree.getroot()

        for node in root.find("nodes"):
            nid = node.attrib["id"]
            x = float(node.attrib["x"])
            y = float(node.attrib["y"])
            nodes[nid] = (x, y)

        for link in root.find("links"):
            lid = link.attrib["id"]
            fnode = link.attrib["from"]
            tnode = link.attrib["to"]
            length = float(link.attrib.get("length", "0"))
            freespeed = float(link.attrib.get("freespeed", "0"))
            links[lid] = (fnode, tnode, length, freespeed)

    return nodes, links


def interpolate_points(t0, t1, x0, y0, x1, y1, step=1.0):
    dt = t1 - t0
    if dt <= 0:
        return [(t0, x0, y0), (t1, x1, y1)]

    n_steps = int(math.floor(dt / step))
    pts = []

    for i in range(n_steps + 1):
        t = t0 + i * step
        if t > t1:
            break
        r = (t - t0) / dt
        x = x0 + r * (x1 - x0)
        y = y0 + r * (y1 - y0)
        pts.append((t, x, y))

    if not pts or pts[-1][0] < t1:
        pts.append((t1, x1, y1))

    return pts

def sec_to_datetime_str(sec):
    dt = SIM_START + timedelta(seconds=sec)
    # QGISで扱いやすい形式 → 2025-11-24 06:00:01
    return dt.strftime('%Y-%m-%d %H:%M:%S')

def xy_to_lonlat(x, y):
    lon, lat = TRANSFORMER.transform(x, y)
    return lon, lat


def process_events(events_file, nodes, links, out_csv):
    vehicle_to_person = {}
    in_progress = {}

    with gzip.open(events_file, 'rb') as f, open(out_csv, "w", newline="", encoding="utf-8") as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(["datetime", "time_sec", "person", "lat", "lon", "link", "event_type"])

        for ev, elem in ET.iterparse(f, events=("end",)):
            if elem.tag != "event":
                continue

            a = elem.attrib
            etype = a.get("type", "")
            time_sec = float(a.get("time", "0"))

            # vehicle -> person 対応付け
            if etype == "PersonEntersVehicle":
                person = a.get("person")
                vehicle = a.get("vehicle")
                if person and vehicle:
                    vehicle_to_person[vehicle] = person
                elem.clear()
                continue

            if etype in ("entered link", "left link"):
                vehicle = a.get("vehicle")
                link_id = a.get("link")
                if vehicle is None or link_id is None:
                    elem.clear()
                    continue
                if link_id not in links:
                    elem.clear()
                    continue
                if vehicle not in vehicle_to_person:
                    elem.clear()
                    continue

                fnode, tnode, length, freespeed = links[link_id]
                if fnode not in nodes or tnode not in nodes:
                    elem.clear()
                    continue

                if etype == "entered link":
                    in_progress[vehicle] = (link_id, time_sec)

                elif etype == "left link":
                    if vehicle not in in_progress:
                        elem.clear()
                        continue

                    entered_link_id, t_enter = in_progress[vehicle]
                    if entered_link_id != link_id:
                        in_progress[vehicle] = (link_id, time_sec)
                        elem.clear()
                        continue

                    t_left = time_sec
                    actual_dt = t_left - t_enter

                    expected_dt = length / freespeed if freespeed > 0 and length > 0 else None
                    if actual_dt <= 0:
                        if expected_dt is not None and expected_dt > 0:
                            actual_dt = expected_dt
                            t_left = t_enter + actual_dt
                        else:
                            actual_dt = 0

                    x0, y0 = nodes[fnode]
                    x1, y1 = nodes[tnode]

                    pts = interpolate_points(t_enter, t_left, x0, y0, x1, y1, step=STEP_SEC)

                    person = vehicle_to_person[vehicle]
                    for t, x, y in pts:
                        lon, lat = xy_to_lonlat(x, y)
                        dt_str = sec_to_datetime_str(t)
                        writer.writerow([dt_str, t, person, lat, lon, link_id, "move"])

                    in_progress.pop(vehicle, None)

            elem.clear()


def main():
    nodes, links = load_network(NETWORK_FILE)
    process_events(EVENTS_FILE, nodes, links, OUT_CSV)
    print(f"CSV exported: {OUT_CSV}")


if __name__ == "__main__":
    main()

QGISで動画表示する
レイヤ→属性テーブルを開く


これでdtというエントリーができる。
これで「プロパティ」→「時系列」で、

を投入する
これで
「プロジェクト」→「プロパティ」→「時系列」→「レイヤから計算」→「適用」

これもセットしないと出てこない

時系列コントロールを表示するには4つ設定しないと出てこない。
(1)そのレイヤ→"属性テーブル"によるdtのセット
(2)そのレイヤ→"プロパティ"によるセット
(3)メニューの"プロジェクト"→"プロパティ"→"時系列"によるセット
(4)メニューの"ビュー"→"パネル"→"時系列コントローラ"のチェック

こんな感じの動画がでます。

 

======

まず失敗から。

MATSim Docker image(https://github.com/maptic/matsim-docker)で動かせない。3日間くらいの時間を費やした結果、断念

-----

(1)WSLのUbuntuを起動

(2)matsim-example-project(https://github.com/matsim-org/matsim-example-project)にあるコンテンツをダウンロード

cd ~
git clone https://github.com/matsim-org/matsim-example-project.git

(3)ビルド

cd ~/matsim-example-project$

./mvnw clean package

(3-1) どの java が呼ばれているか確認

which -a java
readlink -f "$(which java)"
echo "$JAVA_HOME"
which -a で複数出たら、一番上が今使われている java です。

JAVA_HOME が 17 を指していれば、PATH 先頭に $JAVA_HOME/bin が来て 17 が優先されます。

~/.bashrc や ~/.profile に JAVA_HOME=/usr/lib/jvm/java-17... の行が残っていると、それが勝ちます。

(3-2) 一時的に 21 へ切り替え(すぐ試せます)

export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64
export PATH="$JAVA_HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
hash -r # シェルのコマンドキャッシュをクリア
java -version
→ ここで openjdk version "21..." になれば OK。

(3-3) 恒久設定(ログイン時に毎回 21 になるように)

~/.bashrc または ~/.profile の中の 古い JAVA_HOME/PATH 行をコメントアウトし、下を追記:

# Java 21 を既定にする
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64
export PATH="$JAVA_HOME/bin:$PATH"

保存後、反映:

exec $SHELL -l
java -version

(4)MATSim起動

cd ~/matsim-example-project$

java -jar matsim-example-project-0.0.1-SNAPSHOT.jar

(4)テスト起動

「Choose」を押す → リポジトリ内の
scenarios/equil/config.xml を選択。

ちなみに、Output Directoryのは、自動的に、
/home/ebata/matsim-example-project/scenarios/equil/output
が入っていた。

「Start MATSim」のボタンを押下

2~3分後に、こんな感じになった

コンソール画面も、こんな感じになって、入力できない状況

ただ、この段階で、データはできているので、コンソールをCtrl-Cで落しても良い。

で、ここから図示したかったのですが、すったもんだしたあげく失敗したので、via-appを使うようにしました。

で、WSLのUbuntuで、以下からダンロードします。

https://simunto.com/via/download

で、

$CPU=$(dpkg --print-architecture)
$wget https://www.simunto.com/data/via/release/debian/simunto-via-app_25.1.0_${CPU}.deb
$sudo apt install ./simunto-via-app_25.1.0_${CPU}.deb

を実施すると、

$via-app

で、viaが起動します。

ebata@DESKTOP-1QS7OI7:~/matsim-example-project$ export DISPLAY=:0
ebata@DESKTOP-1QS7OI7:~/matsim-example-project$ export LIBGL_ALWAYS_INDIRECT=1

ebata@DESKTOP-1QS7OI7:~/via-app

も必要かもしれない。

"output_network.xml.gz"を選択

同じ様に、

"output_events.xml.gz"

を選択する。

上図のように、"Load Data"ボタンを押して下さい。

上図のようにタイムラインが表示され、08:00から数分間のみ、自動車が表示されます。右側のインジケータを若干右に移動させると、移動の様子(といっても表われて消えているだけの様子)が見えます。

Windows版については
https://kobore.net/matsim/MATSim-begining.html
を参考にして下さい。
----
ちなみに、Ubuntuで作った
java -jar matsim-example-project-0.0.1-SNAPSHOT.jar
は、Windowsでも動きました。

======

もっとも簡単なMATSimの起動方法

~/matsim-example-project/simple-scenario というディレクトリを作り、さらに出力用にoutput/simple1 というディレクトリも掘っておく。

simple-scenario
├── config.xml
├── config.xml~
├── network.xml
├── network.xml~
├── output
└── simple1

[config.xml]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE config SYSTEM "http://www.matsim.org/files/dtd/config_v2.dtd">
<config>
  <module name="controller">
    <param name="firstIteration" value="0"/>
    <param name="lastIteration"  value="0"/>
    <param name="overwriteFiles" value="overwriteExistingFiles"/>
    <param name="outputDirectory" value="output/simple1"/>
  </module>

  <module name="network">
    <param name="inputNetworkFile" value="network.xml"/>
  </module>

  <module name="plans">
    <param name="inputPlansFile" value="plans.xml"/>
  </module>

  <module name="qsim">
    <param name="startTime" value="00:00:00"/>
    <param name="endTime"   value="24:00:00"/>
  </module>

  <!-- 旧 strategy → replanning に修正済み -->
  <module name="replanning">
    <param name="maxAgentPlanMemorySize" value="1"/>
  </module>

  <!-- scoring に h / w を定義 -->
  <module name="scoring">
    <parameterset type="activityParams">
      <param name="activityType" value="h"/>
      <param name="typicalDuration" value="12:00:00"/>
    </parameterset>
    <parameterset type="activityParams">
      <param name="activityType" value="w"/>
      <param name="typicalDuration" value="08:00:00"/>
      <param name="openingTime" value="07:00:00"/>
      <param name="closingTime" value="18:00:00"/>
    </parameterset>
  </module>
</config>

この `config.xml` は、MATSim(Multi-Agent Transport Simulation)の実行設定を記述したファイルです。内容をセクションごとに整理すると次のようになります。

---

### 1. `<module name="controller">`

シミュレーション全体の制御に関する設定。

* `firstIteration=0`
最初のイテレーション番号を 0 に設定。
* `lastIteration=0`
最後のイテレーションも 0 にしているので、学習や繰り返しは行わず、初期の状態のみを実行する(ワンショットのシミュレーション)。
* `overwriteFiles=overwriteExistingFiles`
出力ディレクトリに既存のファイルがあっても上書きする設定。
* `outputDirectory=output/simple1`
シミュレーション結果の出力先フォルダ。

---

### 2. `<module name="network">`

利用する交通ネットワークデータの指定。

* `inputNetworkFile=network.xml`
道路やリンク構造が記載されたネットワーク定義ファイル。

---

### 3. `<module name="plans">`

エージェント(個人)の行動計画データの指定。

* `inputPlansFile=plans.xml`
各エージェントの出発地・目的地・活動スケジュールを記載したプランファイル。

---

### 4. `<module name="qsim">`

シミュレーション実行時間の設定。

* `startTime=00:00:00`
シミュレーション開始時刻を午前 0 時に設定。
* `endTime=24:00:00`
シミュレーション終了時刻を 24 時に設定(丸一日分を対象にする)。

---

### 5. `<module name="replanning">`

プラン修正(replanning)の設定。
※旧名称 `strategy` が `replanning` に変更されたもの。

* `maxAgentPlanMemorySize=1`
各エージェントが保持できるプランの数を 1 に制限(つまり再計画はせず、最初のプランをそのまま利用)。

---

### 6. `<module name="scoring">`

エージェントが行動を評価するためのスコアリング設定。ここでは活動(activity)のパラメータを定義している。

* `activityType=h`
「h」(home、自宅滞在)活動を 12 時間の典型的持続時間で設定。
* `activityType=w`
「w」(work、仕事)活動を 8 時間の典型的持続時間で設定。
また、開店時間を 7:00、閉店時間を 18:00 とすることで、仕事に従事できる時間帯の制約を表現。

---

### 総合説明

この設定ファイルは、**1日分の単発シミュレーション**を対象とし、ネットワークとプランデータを与え、再計画を行わずに実行するシンプルなケースを記述している。活動は「自宅(h)」と「仕事(w)」の2種類のみで、典型的な1日の行動(12時間の在宅と8時間の勤務)を再現する構成になっている。

---

?? 要するに、この `config.xml` は \*\*「network.xml」と「plans.xml」を入力として、エージェントが自宅と仕事の往復を行う1日シミュレーションを出力/simple1 に結果保存する」\*\*ための設定ファイルです。

[config.xml]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE network SYSTEM "http://www.matsim.org/files/dtd/network_v2.dtd">
<network name="tiny-net">
  <nodes>
    <node id="1" x="0.0"    y="0.0"/>
    <node id="2" x="1000.0" y="0.0"/>
  </nodes>

  <links>
    <!-- 1km、自由速度15m/s ≒ 54km/h、容量 1000veh/h、1車線 -->
    <link id="1_2" from="1" to="2" length="1000.0" freespeed="15.0"
          capacity="1000.0" permlanes="1" modes="car"/>
    <link id="2_1" from="2" to="1" length="1000.0" freespeed="15.0"
          capacity="1000.0" permlanes="1" modes="car"/>
  </links>
</network>

この `network.xml` は、MATSim で利用する交通ネットワークを記述したファイルで、最小限の「2ノード・2リンク」からなる非常にシンプルなネットワークを定義しています。内容を整理すると以下の通りです。

---

### 1. `<network name="tiny-net">`

ネットワーク全体の名前として `"tiny-net"` を定義。小規模なテスト用ネットワークであることを示す。

---

### 2. `<nodes>`

ノード(交差点や地点)を定義。ここでは2つのノードがある。

* `<node id="1" x="0.0" y="0.0"/>`
座標 (0,0) にあるノード。IDは `1`。
* `<node id="2" x="1000.0" y="0.0"/>`
座標 (1000,0) にあるノード。IDは `2`。
→ ノード間は直線で 1000m(=1km)離れている。

---

### 3. `<links>`

ノード間を結ぶリンク(道路)を定義。2本のリンクが双方向に設定されている。

* `<link id="1_2" from="1" to="2" ... />`
ノード1からノード2へ向かうリンク。

* 長さ:`1000.0` m (1km)
* 自由速度:`15.0` m/s ≒ 54 km/h
* 容量:`1000.0` 台/時 (1時間あたりの通過可能車両数)
* 車線数:`1`
* 利用可能モード:`car` のみ
* `<link id="2_1" from="2" to="1" ... />`
ノード2からノード1へ戻るリンク。条件は上記と同じ。

---

### まとめ

このファイルは、**1kmの直線道路を2ノードで表現し、車が双方向に走行できるようにした最小限の道路ネットワーク**を定義している。速度や容量も現実的な数値(片側1車線、時速54km、1000台/時)で設定されており、テストや学習用のシミュレーションに適したネットワーク構成になっている。

?? 要するに「**ノード1とノード2を結ぶ片側1車線の道路(往復2車線)だけのシンプルネットワーク**」です。

[plans.xml]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plans SYSTEM "http://www.matsim.org/files/dtd/plans_v4.dtd">
<plans>
  <person id="1">
    <plan selected="yes">
      <act type="h" link="1_2" x="0.0" y="0.0" end_time="08:00:00"/>
      <leg mode="car"/>
      <act type="w" link="2_1" x="1000.0" y="0.0" end_time="17:00:00"/>
      <leg mode="car"/>
      <act type="h" link="1_2" x="0.0" y="0.0"/>
    </plan>
  </person>
</plans>

この `plans.xml` は、MATSim におけるエージェント(人物)の行動計画を記述したファイルです。内容を整理すると以下のようになります。

---

### 1. `<plans>` ルート要素

計画ファイル全体を示すルート。内部に個々の人物(`<person>`)とその行動計画(`<plan>`)を記述。

---

### 2. `<person id="1">`

ID が `1` の人物を定義。ここでは 1 人だけ。

---

### 3. `<plan selected="yes">`

この人物の計画(行動スケジュール)を記述。

* `selected="yes"` → このプランが実行対象として選択されている。

---

### 4. 行動と移動の流れ

計画は **行動(`<act>`)と移動(`<leg>`)が交互に記述**される。ここでは1日の典型的な「自宅→仕事→自宅」往復を表現している。

#### (1) 自宅での行動

```xml
<act type="h" link="1_2" x="0.0" y="0.0" end_time="08:00:00"/>
```

* `type="h"`:自宅(home)活動。
* `link="1_2"`:ノード1→2のリンク上に自宅があると仮定。
* 座標 `(0.0, 0.0)`(ノード1の位置に対応)。
* `end_time="08:00:00"` → 午前8時まで自宅に滞在し、その後移動を開始。

#### (2) 通勤移動

```xml
<leg mode="car"/>
```

* `mode="car"` → 自動車で移動する。
* 出発地点は自宅(link="1\_2")、目的地は次の `<act>` で指定。

#### (3) 仕事での行動

```xml
<act type="w" link="2_1" x="1000.0" y="0.0" end_time="17:00:00"/>
```

* `type="w"`:仕事(work)活動。
* `link="2_1"`:ノード2→1のリンク上に職場があると仮定。
* 座標 `(1000.0, 0.0)`(ノード2の位置に対応)。
* `end_time="17:00:00"` → 午後5時まで仕事をして、その後帰宅移動。

#### (4) 帰宅移動

```xml
<leg mode="car"/>
```

* 仕事先から自動車で自宅へ戻る。

#### (5) 自宅での行動(帰宅後)

```xml
<act type="h" link="1_2" x="0.0" y="0.0"/>
```

* 再び自宅(link="1\_2")で活動。
* 終了時刻は未設定なので、そのまま夜間~翌日まで滞在。

---

### まとめ

この `plans.xml` は、**1人の人物(id=1)が「午前8時に自宅を出発 → 車で職場へ通勤 → 午後5時まで勤務 → 車で帰宅 → 以降は自宅で滞在」する一日の行動計画**を記述している。

ネットワーク(`network.xml`)と組み合わせると、ノード1(自宅)とノード2(職場)の間を往復する最小限の通勤シナリオが再現できる構成になっている。

---

 

 

 

 

 

kno