旅する医用工学者

医用工学に関するトピックを中心に,臨床工学技士国家試験,第1種ME技術実力検定試験,第2種ME技術実力検定試験に関係する内容についても取り扱います.日々の技術開発や受験勉強や学校の授業の予習・復習にお役立てください.内容の正確性には留意していますが,これを保証するものではありません.

地方発着1泊4日ベトナム旅行

久しぶりの海外?!

旅行好きな私にとって、COVID-19 パンデミックの影響は大きすぎた。

ようやく海外を含めて自由に旅行ができるようになってきたのだが、世界的な旅行需要の増大、原油価格の上昇、慢性的な円安の影響が重なって、航空券の価格が高止まりしているこのご時世だ。例えば、パンデミック前は LCC 利用なら1万円ちょっとで往復できた台北ですら、3〜4万円前後が相場になってしまった。これではなかなか海外旅行は難しいぞ……と思いながらも、色々と頑張ってサーチを続けていたら、燃油サーチャージやら諸税やら込みで、なんと24,560円という、とんでもなく安いチケットを発見してしまった。そしてそのままなんとなくノリでチケットを取ってしまった。租税や燃油サーチャージ込みでこの値段である。昨今の国内外の情勢を考えると、決して悪くはないだろう。

……で、肝心の行き先はどこかって……?

ホーチミンシティ(Ho Chi Minh City; HCMC)、まさかのベトナムだ。

韓国とか台湾に行くよりも圧倒的に安く、ベトナムまで行けることになってしまった。バグか何かかよ……と疑いたくもなるが、これで決済も通ってチケットも普通に届いてしまった。どうやら本当に2万5千円以下でベトナムまで行けてしまうらしい。最高かよ?!

航空券を手配したら次は宿泊先の手配だ。ホテルではなくてドミトリーでも良いと思ったのだが、久しぶりの海外旅行だ。屋上にプールとルーフトップバーのあるちょっと良いホテルをチョイスした。そして地元から東京まで往復するための陸上交通も手配し、旅程をこんな感じで組んでみた。

 

0日目

通常勤務

20:00 頃 自宅出発

(新幹線)

23:30 頃 羽田空港

1日目

02:00 羽田空港

(VJ821便)

06:10 タンソンニャット空港着

HCMC 散策

Alagon Saigon Hotel & Spa 泊

2日目

HCMC 散策

14:00 頃 タンソンニャット空港着

17:00 タンソンニャット空港発

(VJ820便)

3日目

(VJ820便)

01:00 羽田空港

バスタ新宿へ移動

(高速バス)

18:00 頃 帰宅

 

まあ、3連休がとれればこんなもんだろう。これなら無理なく楽しめるスケジュールだ。うん、悪くはないぞ。

出発の日は通常勤務なので、勤務終了後にすぐに出発できるよう、前夜までにパッキングを済ませておく。

f:id:medicalengineer:20230929082633j:image

着替えや洗面用具、ガジェット類、トラベルグッズ等をバックパックに詰め、実測重量は約 6 kgだった。財布や一部の衣服は身につけるため、実際にはもっと軽くなり、約 5.5 kgとなる筈だ。

 LCC での海外旅行なら、ベースウエイト 6 kg、パックウエイト 7 kg、スキンアウト 8 kg……うん、ウルトラライトならこのくらいの重量管理が適切だろう……って、登山かよ。

そして、忘れてはいけないのが、現地でのスマートフォンの回線契約だ。空港でツーリスト SIM を契約してもいいのだが、KKday で事前に 4G 回線の eSIM を契約した。2日間で 2 GB の契約で 485 円で済ませることとした。

 

0日目

旅の初日は普段通りの勤務から始まる。旅の荷物を詰めたバックパックを玄関前に置いて出勤。この日の勤務は、業務内容は普段と変わらないのに、旅への高揚感を胸に秘めているので、なかなかに心躍るものとなった。これも旅の持つ魔力なのか……

17時30分、通常勤務を終える。そのまま大急ぎで帰宅。スマートフォンには搭乗予定便の55分のディレイを知らせるメールが届いていた。まあ55分なら許容範囲だろう。この先の道中、何かトラブルがあったときにリカバリできる余裕をもらえたと思えば気が楽だ。足早に帰宅して、シャワーと夕食を済ませる。

部屋の戸締りと荷造を確認したら、いよいよ異国の地への旅立ちだ。バックパックを背負って新幹線に飛び乗り、東京駅へ向かう。窓の外を眺めると、住み慣れた街の夜景が超高速で後ろに過ぎ去ってゆく。これだよこれ、新幹線のこのスピード感がたまらないんだよ。流れゆく車窓を楽しんでいるとあっという間に列車は首都圏に入り、22時半には東京駅に到着した。

f:id:medicalengineer:20230928220331j:image

左右対称の赤煉瓦の駅舎は、往時の威厳と風格をとどめ、いつ見ても本当に美しい。流石、重要文化財に指定されるだけの歴史的建造物だけある。

東京駅からは京浜東北線京急エアポート急行を乗り継いで羽田空港第3ターミナルへ向かう。既に夜も遅いのだが、まだまだ電車には多くの乗客がいて、活気が戻ってきたことを実感させられる。

羽田空港第3ターミナルでエアポート急行を降りて……

f:id:medicalengineer:20230928233430j:image

長いエスカレータを上ると……

f:id:medicalengineer:20230928215457j:image

国際線出発ロビーが眼前に広がる!!

f:id:medicalengineer:20230928233536j:image

パンデミック前には幾度となく目にしたこの光景……!もう見られないとまで思ってしまった時もあったけど……目の前にはあの時と変わらぬ光景が広がっている……!!

おっと……感傷に浸っている場合ではない。これから様々な手続きを済ませなければならないのだ。まずは搭乗便のチェックインカウンターへ。羽田発タンソンニャット行き、Vietjet Air 運航の VJ821 便 にチェックイン。

f:id:medicalengineer:20230928215542j:image

 

1日目

日付が変わったあたりでチェックイン完了。即座に出国手続きへ。深夜発着のフライトは CIQ の手続きに並ぶ時間が短いから本当に有難い。パスポートコントロールを通過して目の前のエスカレータを上り、いつものラウンジへと向かう。

f:id:medicalengineer:20230928215835j:image

懐かしの羽田のラウンジ室内へ。

f:id:medicalengineer:20230928215407j:image

深夜のラウンジは人気も疎らで、パンデミック前と変わることなく、旅人たちに癒しの空間を提供してくれている。ラウンジは旅のセーブポイントなんだよ。

旅立ち前のゆったりとした時間をラウンジで過ごし、思う存分リラックス。到着機材遅れのため、搭乗予定便も玉突きで遅れることになり、ボーディングタイムも遅くなってしまったのだが、急ぐ旅ではないのだから、ラウンジでゆったりと待っていれば良いだけのことだ。
f:id:medicalengineer:20230928215403j:image

結局、搭乗開始は2時50分までずれ込んだ。まあ、1〜2時間の遅れなど LCC では珍しくもないことだから、このくらいの想定はしておいたほうが良い。2時50分、機体後方の旅客から搭乗開始。機体前方の私は3時を回ってからの搭乗。ゲートでパスポートと搭乗券のチェックを受け、ボーディングブリッジを渡ってシップに向かう。

f:id:medicalengineer:20231003081431j:image

ここを歩いている時こそが、旅の高揚感を味わえる最高の瞬間ではなかろうか。

Vietjet Air のボーディングミュージックは、Quynh Anh さんの "Hello Vietnam" という曲と、Fiona Fung さんの "Proud of You" という曲。なかなか素敵な選曲でもある。 "Proud of You" は"I can fly..." というサビの歌声が本当に美しい。これから本当に飛ぶんだけど、歌詞とのシンクロがすこぶる良い雰囲気を出している。3時半になってようやくタキシング開始。羽田を離陸したのはもう4時近かった。

Vietjet AirのA321 neo の機内はよくある LCC スタイル。

f:id:medicalengineer:20230928215321j:image

3+3 配列でシートモニタはなく、テーブルとシートポケットがあるだけ。どうせ深夜便は寝るだけだから、これが必要にして十分。過不足なくてちょうどいい。離陸に先立って、セーフティインストラクション。あわせて非常口の確認もしておく。なるほど、"Exit" はベトナム語では "Loi Ra" というのか。初めて覚えたベトナム語がまさかの "出口" だ。水平飛行に入り、機内で寝ていたところ、窓側の乗客がトイレに行きたいというので起こされ、席を立つ。窓の外を眺めたら、夜空がバーミリオンに明けてゆくところだった。
f:id:medicalengineer:20230928215318j:image

どうやら台湾南部の上空を飛んでいるらしいが、とにもかくにも雲の向こうに昇る朝日が本当に美しい。これぞ海外旅行を実感する最高の時間帯だ。もうひと眠りして目を覚ますと、ちょうどファイナルアプローチのアナウンスが機内に流れた。予定より2時間ほど遅れて、HCMC のタンソンニャット国際空港に着陸、晴れてベトナムの地を踏むことができた。
f:id:medicalengineer:20230928215315j:image

降機したらバスでターミナルビルへ。

f:id:medicalengineer:20231113082207j:image

国際空港によくある長い通路を足早に駆け抜けて……

f:id:medicalengineer:20231113082201j:image

イミグレに並ぶ。

f:id:medicalengineer:20231113083959j:image

イミグレを通過した先の到着時免税店には ROYCE' の冷蔵ショーケースが。

f:id:medicalengineer:20231113082121j:image

ここは北海道かどこかですかね?!
f:id:medicalengineer:20231113082130j:image

チェックインバゲッジはなく、キャビンバゲッジのみなので、バゲッジクレームはスルーして税関へ。申告すべき所持品はないため、荷物を検査機に通して終わり。CIQ 全てをサクッと通過して、そのまま非制限エリアへ。

f:id:medicalengineer:20231113082808j:image

ここで eSIM をアクティベートして、行動中の通信環境を確保する。バックパックを背負って、いよいよ空港を出ることにした。

空港のターミナルビルを出た瞬間に感じる、東南アジア特有のもわっとした熱気。これがたまらない。

f:id:medicalengineer:20230928215119j:image

国際線ターミナル前から109番バスに乗る。

f:id:medicalengineer:20230928215048j:image

ミニバンみたいな車体だが、れっきとした路線バスだ。これに乗って HCMC 中心部を目指す。サイゴンセンター前のバス停で下車。

f:id:medicalengineer:20230928215012j:image

高島屋は9時半(一部店舗は10時)オープンなのだが、フードコートや ATM コーナーは営業をしており、Pasteur 通り側のエントランスから建物内に入ることができる。

海外に来たらとりあえず ATM……ということで、サイゴンセンター1階にある VIB の ATM でキャッシング。

f:id:medicalengineer:20231113082654j:image

サイゴンセンター地下の HIGHLANDS COFFEE でベトナムコーヒーとバインミーのセットをオーダーし、ベトナムの地で、初めての食事とする。

f:id:medicalengineer:20231112224505j:image
うん、ベトナムコーヒーもバインミーもめっちゃ美味しいぞ!!

さて、いよいよ HCMC 散策に出発だ。HCMC 観光の場合、名所をタクシーで巡るのが一般的らしいのだが、私にそんな発想はない。散策の道中、ガイドブックに載っていないスポットを捜し求め、現地の雰囲気を楽しむのだ。雨上がりの陽射しを浴びて、朝の HCMC を歩き回る。なんて贅沢な休日なんだ。昨日は日本の地方都市で普通に仕事してたんだぞ?!

高島屋から20分程歩けば、フランス植民地時代の面影を色濃く残すサイゴン中央郵便局に到着。

f:id:medicalengineer:20230928214844j:image

サイゴン中央郵便局はフランスのオルセー駅をモデルにした美しい建物で、列車こそ来ないものの、歴史ある駅舎と言われれば納得してしまいそうになる。

道をはさんでサイゴン中央郵便局の反対側には、ネオ・ゴシック様式の荘厳なサイゴン大教会
f:id:medicalengineer:20230928214847j:image

サイゴン中央郵便局やサイゴン大教会のすぐそば、書店が軒を連ねるブックストリートへ足を運ぶ。
f:id:medicalengineer:20230928214840j:image

ストリートの両脇には書店がずらりと並び、クラシックな古書店からモダンなブックカフェまで、本に囲まれた素敵な街並みだった。

ブックストリートを抜け、緑の街路樹にお洒落な建物が映える美しい街並みを散策。

f:id:medicalengineer:20230928231535j:image

この辺は特に美しい街路が広がり、歩いていて楽しくなる。

そのまま街中を適当に散策していたら、Bo Ne 3 Ngon(ボネバーゴン)が営業していた。Google Map 情報では、このお店は朝と夜の営業で、夜の部は16時にならないと営業しない筈なのに、何故か普通に営業中だった。百聞は一見に如かずとはまさにこのこと、そういうことであれば、早速食べていこうじゃないか。

f:id:medicalengineer:20230928231633j:image
f:id:medicalengineer:20230928231630j:image

このお店で食べられるのは、まさかのビーフステーキ!本来は熱々の鉄板でサーブされるのだが、私のベトナム語の理解力が低かったせいで、何故か持ち帰り用の容器に入れられてしまった。

f:id:medicalengineer:20230928231607j:image

お肉は美味しく味付けされて焼き上げられており、付け合わせのフランスパンが進む。
f:id:medicalengineer:20230928231604j:image

いや、本当に美味しいんですけどこのお肉?!?!お店のお兄さんとスマホの翻訳機能で「本当は店内で食べたかったんだよ。ここで食べていい?」「いいよ」などとやりとりしていたら、お詫びにペプシコーラを持ってきてくれた。ありがとうお兄さん。

美味しいビーフステーキを楽しんだら、ふたたび街中に繰り出そう。

HCMC の風情を堪能しながら、街中を散策していたら、異国の地に住むファミマを発見した。

f:id:medicalengineer:20231114082001j:image なんだろうこの謎の安心感は……?海外にセブンがあっても特になんとも思わないんだけど、ファミマがあると何故か嬉しくなるんだよなぁ……。

そのファミマのすぐ近く、UBND Phuong Dakaoバス停 から150番バスに乗って街中を移動。
f:id:medicalengineer:20231114081941j:image

完全にローカルにまみれてしまった。これぞ旅の醍醐味、ローカル路線バスは良いものだ。Cho Ban Co バス停で降りて、さらに街中を歩き回る。ラウンドアバウトがあちらこちらにあるので、頑張って渡る。
f:id:medicalengineer:20231114081948j:image

今夜のお宿、Alagon Saigon Hotel & Spa へチェックイン。

f:id:medicalengineer:20230928214647j:image

同じ系列のホテル3棟が館内の連絡通路で繋がっていて、別の棟からでも入ることができる。反対側の通りに面している棟もあるため、このシステムは地味に有難い。
f:id:medicalengineer:20230928214644j:image

Alagon Saigon Hotel & Spa の室内はお洒落で清潔。

f:id:medicalengineer:20230928214556j:image
f:id:medicalengineer:20230928214559j:image

インサイドルームなので窓はないけど、この内装で1泊2日程度なら普通に選択肢としてアリ。数百円ほど追加すれば窓のある部屋になるらしいけど、どうせ夜まで散策して帰ってきたらルーフトップバーやらプールやらで楽しんで寝るだけだし、外の騒音の心配をしなくていいから、窓なしで全く問題ない。

朝食ビュッフェ、ランチも込みで5,334円というお値段だったのだが、これに加えてウェルカムドリンク(ソフトドリンク)、そしてまさかのルーフトップバーでのワンドリンク(アルコールOK)チケットもついてきた。素晴らしすぎる。最高かよ?!

ホテルの自室で荷物整理。着替えやサンダル等は部屋に置いて、身軽になって散策再開だ。

定番の観光地、ベンタイン市場

f:id:medicalengineer:20230928220124j:image

コロニアル建築、市民劇場。

f:id:medicalengineer:20231005081900j:image
チャンフンダオ像近くのロータリー。
f:id:medicalengineer:20230928220130j:image

ロータリーを渡るのは至難の業。信号のないロータリーを切れ目なく車とバイクが走っていて、勇気を振り絞って横断しなければならない。ここを渡り切るとサイゴン川のほとりに辿り着く。
f:id:medicalengineer:20230928220127j:image

Nguyen Hue 通りで音楽イベントが開催されていた。

f:id:medicalengineer:20231005081151j:image

街中で大音響でクラブミュージックが流れていた。まだ明るい時間帯で、リハーサルといった感じだったけど、日が暮れると多くの人達で埋め尽くされて、屋外のクラブの様相となるんだろうなぁ……。

サイゴンセンターで洋書を立ち読みして、ローカルのお店で水着を買って(まさかの現地購入)、ホテルに戻ろうとしたその時、東南アジア特有のスコールに見舞われた。少し落ち着いたころ合いを見計らい、折り畳み傘を開いてホテルを目指す。

ホテルに帰って、ルーフトップのプールとジャグジーについて聞いてみたら、スコールで使用停止にしているとのこと。こうなるんだったら、散策に出ないでルーフトップのジャグジーとプールで楽しんで、ルーフトップバーで一杯やっておけばよかった。

f:id:medicalengineer:20230928213220j:image
f:id:medicalengineer:20230928213217j:image
f:id:medicalengineer:20230928213214j:image

ライトアップされたルーフトップの雰囲気はすこぶる良いのだが、雨でジャグジーやプールが閉鎖されてしまっては仕方ないから、屋根の下でカクテルを愉しむことにした。半分オープンスペースみたいなものだから、まあいいとしよう。せっかく南国に来たわけだし、マイタイをオーダーした。

f:id:medicalengineer:20230928213332j:image

普通にオーダーすると日本円換算で1000円以上するのだが、ワンドリンクチケットを使うことができた。ルーフトップで南国の大都会の喧騒をバックに飲むカクテルは最高だ。何も考えずにグラスを傾けるだけで時間が過ぎてゆく。なんと贅沢な時間の使い方なんだろう。

思いっきり HCMC の夜を楽しんだ後は、ダブルベッドでゆっくりと寝る。インサイドルームだから、外の騒音の影響は全くない。ロングフライトと何時間にもわたる散策の疲れを癒すこととした。

 

2日目

HCMC で迎える2日目の朝は、美味しい朝食ビュッフェからスタート。

f:id:medicalengineer:20231004193010j:image

ここは南国ベトナム。野菜もフルーツも、素材の味が濃い。素材が美味しいって本当に凄いことだと思う。そして、ベトナムの麺といったら、何はなくともフォー。

f:id:medicalengineer:20230928212641j:image

優しい味わいで本当に美味。調子に乗って唐辛子を2切れ入れたら、辛すぎて大変なことになったのはご愛嬌ということで。

そして、南国ベトナムは果物も本当に美味しい。

f:id:medicalengineer:20230928212657j:image

特に、このパッションフルーツの味が想像以上に濃くて美味しかった。やっぱり南国で楽しむトロピカルフルーツは最高だ。

朝食を楽しんだら、昨夜のリベンジだ。ルーフトップのプールとジャグジーを楽しもう。

f:id:medicalengineer:20230928212405j:image

大都会 HCMC の喧騒を眼下に、優雅にひと泳ぎ。ジャグジーも気持ち良かった。

f:id:medicalengineer:20230928212326j:image

そういえば、ウェルカムドリンクのチケットがまだ残ってたな。ルーフトップバーかレストランで、ジュースをいただけるらしい。よし、せっかくだしランチのときにレストランで使ってみよう。

さて、楽しい HCMC 滞在もそろそろ終わりが近づいてきた。部屋のシャワーを浴びて荷物整理。軽く土産物も買ったけど、航空機持ち込み手荷物の重量制限は大丈夫そうだ。

よし、帰国の途に就く前に、サクッとランチを済ませて……

f:id:medicalengineer:20230928221036j:image

いやいや待って待って?!?!

なんなんですかこのとんでもないボリュームのランチは?!?!

しかも、めっちゃ美味しいんですけど?!

朝食もランチもこの味と量、さらにレストランのフルーツジュースとルーフトップバーのカクテルをいただいて、5,334円なんですか?!普通なら飲食だけでその値段いきますよね?!?!

今回宿泊した Alagon Saigon Hotel & Spa は、何から何まで至れり尽くせりなホテルだった。名残惜しいけど、そろそろホテルをチェックアウトする時間だ。荷物をまとめてカウンターへ。部屋のチェックを受けてチェックアウト手続き完了。次に HCMC に泊まる機会があったら、またこのホテルに泊まりたい……そう感じられる素晴らしいホテルだった。

ホテルをチェックアウトして、HCMC 市街地に繰り出す。あとは近くのバス停からバスで空港を目指すだけだ。

f:id:medicalengineer:20231115081158j:image

南国の青空の下に広がる木々の緑とエネルギッシュな大都会。バス停に向かって歩いているだけなのに、不思議と楽しくなってくる。
f:id:medicalengineer:20231115081134j:image

バックパッカー街として有名な Bui Vien (ブイビエン)通りを眺める。
f:id:medicalengineer:20231115081144j:image

Bui Vien 通りの入口に程近い Tran Hung Dao バス停から152番バスに乗車。

f:id:medicalengineer:20230929081733j:image

運賃は5000ドン。車掌さんに "San bay Tan Son Nhat" と告げて5000ドンを渡して切符を買えば良い。HCMC の街並みを眺めながらバスに揺られ、しばらくするとタンソンニャット国際空港に到着。
f:id:medicalengineer:20230929081746j:image

バスでタンソンニャット国際空港に到着すると、地平の到着ロビー前で下車することになる。即座に出発ロビーに上がり、早めに VJ820 便にチェックインを済ませた。おかげで通路側のシートアサインを勝ち取ることができた。中長距離の夜行便は通路側のシートアサインが楽でいい。

タンソンニャット国際空港にほど近い MENAS MALL に足を運んでみることにした。

f:id:medicalengineer:20231002081305j:image

HIGHLANDS COFFEE や 7-ELEVEN、Family Mart などがある。しかし、テナントはだいぶ撤退してしまったのか、いささか寂しい印象が拭えなかった。

セブンとファミマで軽く手土産を調達してから、タンソンニャット国際空港に戻る。国際線ターミナル出口付近の HIGHLANDS COFFEE  にてベトナムコーヒーを飲みながら異国の地への名残を惜しむ。

f:id:medicalengineer:20231002081433j:image

コクと苦味の強いロブスタ種の濃厚なコーヒーに、甘いコンデンサミルクを合わせるベトナムスタイルがたまらない。ゆったりと過ごしていたら、出発2時間前になってしまった。名残は惜しいけど、そろそろ出国の時間だ。航空券とパスポートを片手に、パスポートコントロールを通過した。

タンソンニャット国際空港の制限区域内にショップや飲食店は少なく、時間をつぶせるような場所は少ない。上級クラス搭乗者やプライオリティパス所有者ならばラウンジを使うこともできるが、そうでない一般旅客はむやみやたらと早くパスポートコントロールを通過するのは得策ではない。なお、タンソンニャット国際空港の制限区域内の免税店は基本的には米ドル決済のようで、価格表示も軒並み米ドル建てである。

ちなみに、タンソンニャット国際空港の制限区域内にはシャワールームがある。このことを知っていれば、制限区域内に早く入っても時間を有効活用することができる。シャワーを使いたければ、パスポートコントロールを抜けたら右に曲がり、ターミナルの端までひたすら歩く。端まで来たら25番ゲート方面へ降りると、建物の端付近にシャワールームとトイレが併設されたエリアがある。シャワールームは立って使う、海外によくあるタイプのものだった。
f:id:medicalengineer:20230929081515j:image

決して不潔ではないのだが、荷物を濡らさずに置いておけるスペースがない。だが、ドアには何ヶ所か小さなフックがあるので、大きな手荷物を吊り下げるのに、S字フックがあると役に立つ。なお、水温についてはそれほど温かくはならなかった。

シャワー後に荷物整理を済ませて指定されたゲートに向かうと、ディレイの案内が。帰りのフライトもディレイを喰らってしまったみたいだ。搭乗予定の旅客案内上は1時間のディレイのようだ。

……しかし、18時になっても搭乗が始まる気配がない。おそらく2時間程度のディレイは覚悟せねばならぬだろう。所定では羽田着は1時で、ディレイが2時間か……つまり、羽田着は3時。いや、こちらとしては、このディレイはむしろありがたい。羽田に着いてから2時間で始発が動き出す。降機からパスポートコントロールの通過までを30分と見込むと、1時間半待てばいいわけだ。深夜の空港待機はなかなか大変だが、これならほとんど苦にならない。

Vietjet Air よ、遅れてくれてありがとう。

ゲート付近で2時間程度待ったところで、ボーディング開始。HCMC への名残を惜しみながらバスゲートへ進み、いざ改札へ。ボーディングパスを改札機にかざしたら、アラームが鳴って弾かれた。グランドスタッフさんから新しいボーディングパスを渡され、 "Aircraft change. Seat changed." と告げられた。無駄にチェックインが早かったせいなのか、せっかくの通路側のシートアサインが真ん中のアサインに変更されてしまった。残念。

バスに乗って沖止めの飛行機に向かう。
f:id:medicalengineer:20230929081507j:image

タラップからボーディング。
f:id:medicalengineer:20230929081502j:image

現地時間で19時、日本時間で21時に出発。

ほぼオーバーナイトのフライトになることが確定。そうと決まれば、もう勝ったも同然。ゆっくり寝ながら帰国してしまおう。

f:id:medicalengineer:20231023203039j:image

3日目

旅の最終日の目覚めは "Prepare for arrival." のアナウンスとともにやってきた。京葉工業地帯や東京湾アクアラインを眺めながら羽田に向けてファイナルアプローチ。Dランを越えて34Rにタッチダウン。結局、羽田には2時間のディレイで3時頃に到着。東京到着時の音楽は、Quynh Anh さんの "Hello Vietnam" に加え、藤田麻衣子さんの "蛍" という曲。旅の終わりに、どことなく哀愁を誘う  "蛍"もなかなかいい選曲だ。

エンジンが止まり、降機。ボーディングブリッジを渡り、長い通路を歩いてパスポートコントロールへ。

f:id:medicalengineer:20231023203016j:image

別に急ぐわけではないが、サクッと通過して到着ロビーへ。しばし時間をつぶしてからバスで第1ターミナルへ移動し、ラウンジでゆったりと過ごすことにした。

第1ターミナルの制限区域外にあるラウンジへ。ここはアライバルラウンジとして使うことを想定した立地なのか、朝の時間帯には利用者は疎らだった。

f:id:medicalengineer:20231023202942j:image

制限区域外のラウンジをアライバルラウンジとして使えるのは本当に有難い。オーバーナイトフライトの後にゆったり寛げる場所は貴重だ。

空港内で軽く朝食を済ませ、京急エアポート急行と山手線を乗り継いでバスタ新宿へ移動。バスタ新宿からは高速バスで地元へと向かう。所要時間は約6時間半、タンソンニャットから羽田までのフライトよりも所要時間が長いとか気のせいだ。うとうとしていたら、あっという間に地元についてしまった。そんなこんなで1泊4日の弾丸海外旅行を終えて無事に帰宅。

 

さて、旅を終えて気になるのは、支出総額だ。この旅で実際に要した経費は以下の通り。

  • 宿泊費:5,334円
  • 航空券:24,560円(諸税・燃油サーチャージ込み)
  • 新幹線(居住地~東京駅):7,380円
  • 高速バス(バスタ新宿~居住地):2,900円
  • 東京都内交通費合計:970円
  • eSIM(2 GB, 2日間):485円
  • 国内食費合計:795円
  • 現地通貨(手数料込):6,553円(VND1,000,000)

総合計48,977円

 

……うん、完全に狂ってる。しかも、東京までの往復と旅程中の飲食も含めてこのお値段だ。日系の大手エアラインを使っては出すことがほぼ不可能なこのお値段!週末の弾丸旅行でこれだけ楽しめてこのお値段なら、めっちゃコストパフォーマンスは良いだろう。決して贅沢な旅程ではないけれど、かといって貧乏旅行でもない。身の丈に合った「ちょうどいい」旅程だ。

そして、ベトナムという国はなかなか面白い。東南アジアということで、定番のエネルギッシュな光景は当然のごとく楽しむことができるのだが、かつてフランスの植民地だっただけあって、ヨーロッパ風の街並みも残っており、歴史散策も面白い。ハマる人は本当にハマる国、それがベトナム

あっ……そういえばドンコイ通りを散策するの忘れてた。ガイドブックにはもれなく記載されるような有名な通りなのだが、単に横切っただけで終わってしまってた。まあいいや、次に行ったときに歩けばいいや。行きそびれた場所があっても、またの機会にすればいいという気楽さがあるのが、週末弾丸旅行の良いところだ。また航空券をサーチしながら次の目的地に思いを馳せる日々を始めることとしよう。

Raspberry Piを始めよう!

Raspberry Pi 

Raspberry Piは英国Raspberry Pi Foundationにより開発されているシングルボードコンピュータのシリーズだ。小型で格安のPC*1と考えておけばわかりやすい。ただし、2021年に発売されたRaspberry Pi Picoはマイコンボードであるため、本記事で紹介する範疇からは外れることにご留意いただきたい。

www.raspberrypi.org

もともとは教育目的で開発されてきたハードウェアで、プログラミングや電子工作の初学者にとってもってこいの教材として知られている。しかし、格安の初学者向けハードウェアとはいえ、かなりの機能性や拡張性を備え、しかも小型であるという利点から、産業や学術研究の現場でも普通に使われるようになってきた。Raspberry Piはそれだけのポテンシャルを秘めたハードウェアなのだ。

Raspberry Piは有線(LANケーブル)*2でも無線(Wi-Fi*3でもインターネットに接続でき、入出力はUSB、micro HDMIBluetooth等に対応しており、市販品をそのまま開発に流用できる点も大きなメリットである。ただし、一般的なデスクトップPC*4のように、モニタやキーボード、マウス等は外付けなので、別途用意しておく必要がある。

 

Raspberry Piでできること

Raspberry PiはPCであるため、勿論、一般的なPC同様にwebブラウジングをしたり、文書作製や表計算のようなオフィスワークをしたりすることもできる。しかし、その程度ならわざわざRaspberry Piを使うまでもない。普通にWindows機を使えば良いのだ。Raspberry Piの本当の魅力はもっと別のところにある。それはプログラミングと電子工作だ。

Raspberry Piはプログラミングの環境が充実しており、Python*5を使ってプログラムを書くユーザが非常に多い。ちょっとしたプログラミング入門から実用的なAI開発*6まで、非常に幅が広い。さらに、Raspberry Piは GPIO*7と呼ばれるインターフェイスを備えており、Pythonから簡単に外部のハードウェアを制御できるのだ。つまり、Raspberry Piは電子工作とも非常に相性が良いのだ。しかも、PCに外部回路を接続して制御しようとすると、どうしてもPC本体の回路に過電流を流したり過電圧をかけたりして破損させてしまうリスクもある。一般的なPCでそんなことをしてしまったら涙目になること必至だが、Raspberry Piなら数千円程度という低価格なので、お財布へのダメージはさほど大きくはないだろう。

Raspberry Piを始める前に用意するもの

Raspberry Pi 4を用いた最小限の開発環境を構築するのに必要な物品を列挙する。Raspberry Pi 3以前のモデル*8Raspberry Pi Zeroシリーズ*9では必要物品が若干異なるので要注意。

  • Raspberry Pi本体
  • 3A給電対応のUSB-C電源*10
  • ディスプレイ(HDMI入力対応のTVでも可)
  • micro HDMIケーブル
  • キーボード*11
  • マウス*12
  • micro SDカード(16GB以上が望ましい)

本体を除いては家電量販店やネット通販等で購入できるものがほとんどだが、電源に関しては若干の注意が必要だ。スマートフォン用のUSB-C電源は、2.4A程度のものが多く、安いものだと1A程度しか出せないこともある。スペックを確認しておいたほうがよい。なお、2.4Aの電源でも起動はできるが、大きな負荷がかかると消費電流が増えるため、許容電流値をオーバーする可能性もある。ちなみに、著者はスイッチサイエンスから発売されている3A対応のACアダプタを利用している。

www.switch-science.com

なお、Raspberry PiをGPIOピンへの給電で駆動することもできるが、給電端子を間違えたり、端子をショートさせたりすると動作不良や故障の原因にもなり得る。GPIOの取扱いに慣れるまではUSB給電が無難だ。

また、Raspberry Pi専用の小型ディスプレイも発売されており、著者はこれに専用ケースを装着して使っている。この構成のためには追加で結構な出費(Raspberry Pi 4の8GBモデルを買ってもお釣りが来るレベル)を要するが、ハンドリングがかなり容易になる。ただし、ディスプレイケースを装着するとCPUファンの装備は難しくなるので、大きな負荷をかけ続けるようなシステムを構築する場合は、放熱*13について一考する必要がありそうだ。

f:id:medicalengineer:20211002211429j:image

f:id:medicalengineer:20210928220259j:image

 

Raspberry Pi OS

PCに搭載されるOS*14といえば、WindowsMacが一般的だが、Raspberry Piに搭載するOSはLinuxベースのRaspberry Pi OSだ。かつて、LinuxCUI*15による操作が主体で、初心者にはとっつきにくいというイメージがあった。しかし、Raspberry Pi OSはWindowsMac同様、GUI*16による操作主体で、初学者にも操作しやすいユーザフレンドリーなOSである。

 

さて、Raspberry PiにOSをインストールしよう。Raspberry PiにはハードディスクやSSDが付属していない。micro SDカードスロットがあり、そこにmicro SDカードを入れてストレージの役割を果たしてもらうのだ。なお、ストレージに用いるmicro SDカードは、後々のことを考えると、容量が16GB以上のものが望ましい。

Raspberry Pi OSのインストールはRaspberry Pi Imagerを使えば簡単*17だ。

https://www.youtube.com/watch?v=ntaXWS8Lk34


www.youtube.com

rptl.io

 

勿論、慣れた人はイメージファイルをダウンロードして書き込んでも構わない*18

OSをmicro SDカードにインストールしたら、それをRaspberry Pi本体のカードスロットに差し込もう。いよいよ起動準備だ。

 

Raspberry Piの起動

OSを書き込んだmicro SDカードをRaspberry Pi本体にセットしたら、いよいよ初回起動だ。まずは本体にモニタ、キーボード、マウスを接続しよう。そして、電源を繋ぐ。Raspberry Piには電源スイッチがないので、電源を繋げば即座に起動処理が始まる。初回起動時には言語選択、キーボード選択、ネットワーク設定などの初期設定を求められるので、指示に従って設定を進めよう。

設定が終われば、WindowsMacのPCと似たようなGUIのデスクトップ画面が現れる。2021年現在、初期設定ならば、Windowsでは画面下部にあるタスクバーはRaspberry Pi OSでは画面上部にあり、Windowsでは左下にあるスタートボタンはRaspberry Pi OSでは左上にある。WindowsMacと基本操作は似ているので、これらのOSに慣れていれば、比較的簡単に基本操作ができるようになるだろう。ちなみに、電源を切るには、スタートボタンから"ログアウト"を選択して、さらに"Shut down"を選択すればよい。

Raspberry Pi OSは基本的にはGUI環境なので、ある程度のことはマウス操作で感覚的に実行可能だ。しかし、Pythonのライブラリ(TensorFlowやNumPy等)をダウンロードしたり、それらを更新したりするときは、ターミナルを用いてCUI操作を必要とすることもある。

はじめは難しく感じるかもしれないが、慣れると結構便利になるもので、WindowsのようなGUI環境よりも早く簡単にPC操作ができるようになる。さらに、ターミナル上で直接動作するviやVimといったエディタを使えるとコーディングが捗る。これらについては別稿に譲ることとしよう。

 

*1:Personal Computer:いわゆるパソコンのこと

*2:Raspberry Pi Zeroシリーズを除く

*3:Raspberry Pi Zeroを除く(Raspberry Pi Zero W / WHはWi-Fi対応)

*4:2010年代後半以降のデスクトップPCはモニタと本体が一体化されているもの(iMacのようなタイプ)が多いが、Raspberry Piはモニタと分離されたオーセンティックな形態(Mac miniのようなタイプ)のデスクトップPCだ。

*5:高水準プログラミング言語の一種。初心者向けといわれることが多いが、データサイエンスや人工知能開発といった最先端のプロジェクトにも用いられている。

*6:著者はRaspberry Piを用いた画像認識AIの医療応用に関する研究を指導していたことがあるが、Raspberry Piでも実際にAIとしての能力を発揮してくれた。

*7:General Purpose Input Output:汎用入出力

*8:電源はUSB micro-B、映像出力はHDMI

*9:電源はUSB micro-B、映像出力はmini HDMI、USB micro-Bが1ポートのみ

*10:ACアダプタ一体型給電ケーブルでも良いし、ACアダプタとUSB-Cケーブルを別に用意しても良い。

*11:Bluetoothキーボードも使用可能だが、設定のために有線キーボードが必要。

*12:Bluetoothマウスも使用可能だが、設定のために有線マウスが必要。

*13:著者が機械学習による画像分類器を構築し、大量の教師データを学習させていたところ、温度警告がなされたことがある。

*14:Operating System:基本ソフト

*15:Character User Interface:文字すなわちコマンド入力による操作体系

*16:Graphical User Interface:グラフィックとポインティングデバイスすなわちマウスやタッチパッドを用いた操作体系

*17:かつてはNOOBSとよばれる初心者向けの公式ツールがあったが、現在は非推奨とされている。

*18:単に micro SDカードにイメージファイルをドラッグ&ドロップしてもOSは動かない。適切なライティングツールを使う必要がある。

血液透析における Kt/V の数学的意味

血液透析

血液透析は腎不全患者に対する生命維持管理技術の一つであり、日本国内では多数の腎不全患者が血中の老廃物を除去するために、定期的に血液透析を受けている。血液透析に用いられるダイアライザ(人工腎臓)は、老廃物を分離する機能を有する膜で作られた中空糸を多数束ねた構造を有しており、中空糸内部を流れた血液中から老廃物を分離除去するものである。このダイアライザで起こっている物質除去について、簡単な数理モデルを立てて、それを解析してみることにしよう。

血液透析数理モデル

さて、ダイアライザの物質除去能力は、血液中の老廃物濃度に比例し、老廃物濃度が高ければ単位時間あたりの物質除去量は大きいが、老廃物濃度が低ければ単位時間あたりの物質除去量が小さくなることが知られている。このときの比例定数を K (クリアランス)とおくと*1、老廃物の濃度 C(t) は、

という微分方程式で表すことができる。ただし、立式にあたっては、透析中の体液量変化(除水や代謝水の生成)および透析中の老廃物生成を無視している*2

これは自然科学分野でお馴染みともいえる、変数分離形の一階線形微分方程式である。解くのは比較的簡単であるため、オーソドックスな手法で解いてみることにしよう。勿論、Laplace変換法を用いても構わないが、ここでは言及を避けておく。

 

微分方程式

を変数分離すると、

となるが、おもむろに両辺に積分記号を付して*3

である。両辺の積分を実行すれば、

となる。ただし、D積分定数*4である。

ここで、対数表現を指数表現に直すと、

となり、指数法則より、

となる。ここで、e の D 乗は所詮は定数の定数乗であるから、これを新たに定数 D とおくと、

と書き直すことができる。

これでめでたく C(t) を時刻 t の関数で書くことができたわけだが、これこそが老廃物濃度 C(t) の一般解である。

さて、ここで、積分定数 D の値を決定しよう。

t = 0 のとき C(0) = C0 であるという条件より、

すなわち、

であるから、積分定数 D について、

と求まる。すなわち、与式の特殊解は、

であることが示される。*5

Kt/V の数学的意味

さて、微分方程式が解けたところで、数学的な考察を与えてゆこう。

この微分方程式の特殊解

において、指数部分の Kt/V は、「標準化透析量」ともよばれる指標でもある。

 

分子にはクリアランス K が含まれるが、クリアランスには「単位時間あたりに生成される、老廃物濃度がゼロの血液の体積(クリアスペース)」という意味合いもある。

勿論、クリアランス K に透析時間 t を乗じた Kt は、透析時間の間に生成されたクリアスペース(老廃物濃度がゼロの血液の体積)である。それを体液量 V で除しているわけだから、Kt/V には、「全身の血液を何回完全にキレイにしたか」という意味を与えることもできる……旨の記述が様々な文献にあふれている。

さらに、日本透析医学会の維持血液透析ガイドラインには「最低確保すべき透析量として、sp Kt/V*6 1.2 を推奨する」「目標透析量としては、 sp Kt/V 1.4 以上が望ましい」という記述がある。

doi.org

勿論、この Kt/V = 1.4 は透析関係者の間では有名な基準値だが、この意味を正しく理解することはできるだろうか?

先の表現を借りるならば、「Kt/V = 1.4 ならば、全身の体液が1.4回キレイになるのだ」と考えることができる……らしいのだが、これでピンとくるだろうか?

少なくとも、老廃物濃度がゼロになってしまったら、それ以上キレイになりようもないため、この言い回しはどうも理解しがたいのではないだろうか。

 

このあたりを詳しく考えてゆくにあたっては、先ほど得た微分方程式の特殊解は減衰型の指数関数であり、濃度の変化率(老廃物の除去速度)が一定ではないことが問題になることに気づかねばならない。

 

例えば、Kt/V = 1.0 のときの老廃物濃度を計算してみると、

であり、透析後の老廃物濃度は初期値の約37%になることがわかる。

あれれ……完全にキレイにできていないじゃないか?!

そう、「Kt/V = 1 の透析ならば、全身の体液が完全にキレイになる」というのは、数学的には間違いなのである。

 

また、推奨されている Kt/V = 1.4 のときでさえも、

であり、透析後の老廃物濃度は初期値の約25%にとどまっているのだ。

とりあえず、特殊解として与えられた指数関数

のグラフ(下図に赤実線で示す)を描いてみることにしよう。



t = 0 のとき、老廃物濃度は C0 であることは自明*7だが、ここで t = 0 における C(t) の接線(上図の青破線)の方程式を求めてみよう。

濃度曲線の導関数

であるため、t = 0 のときの接線の傾きは

であることがわかる。よって、接線の方程式 f(t)

である。

ここで、接線が横軸と交わる点、すなわち f(t) = 0 とするための条件を考えてみよう。

であればよいので、

としてやれば、

のときに f(t) = 0 となることが示される。つまり、これは「Kt/V = 1 のとき、透析を開始した瞬間の老廃物除去速度を維持できれば、体液中の老廃物濃度がゼロになる、すなわち全身の体液を完全にキレイにするレベルのクリアスペースを生み出すことが可能だ」ということである。

よって、「Kt/V = 1.4 のとき、透析を開始した瞬間の老廃物除去速度を維持できれば、全身の体液を1.4回キレイにするレベルのクリアスペースを生み出すことが可能だ」というのが正確な言い回しである。

 

Kt/Vについて、単に「全身の血液を何回完全にキレイにしたか」と定めるような言い回しは、あながち間違いではないのだが、現実的なモデルでは成立しえない。Kt/Vは、あくまでも指数関数的な減衰モデルにおける指数部分の絶対値でしかない。「全身の血液を何回完全にキレイにしたか」という言い回しにとらわれてばかりでは、数理モデルの本質を見失ってしまうのだ。

*1:リアランスには、単位時間当たりのクリアスペースとしての意味合いもあり、「単位時間あたりに生成される、老廃物濃度がゼロの血液の体積」と言い換えることもできる。

*2:よって、本モデルによって求められた濃度曲線は、現実の透析のものとは異なる。

*3:左辺と右辺で積分変数が違うではないか、というツッコミを受けそうだが、数学的には問題ない。この操作は本質的には置換積分法にほかならない。

*4:本来ならば両辺に積分定数をつけるべきであろうが、そもそも積分定数は任意に定まる定数であるから、右辺だけに積分定数を付し、それを「左辺の積分定数と右辺の積分定数の差」だとみなせば問題ない。

*5:気づいた読者もいるかもしれないが、実は RC 回路におけるコンデンサの放電特性とそっくりな式の形である。濃度変化の時定数は τ = V/K で与えられることもおわかりいただけるだろう。

*6:single-pool Kt/V

*7:自明というよりもそう定義したわけだが……

M5Stamp C3U + MicroPython による気象庁天気予報データのスクレイピング

M5Stamp C3Uで遊んでみよう!

前回の記事でWindow + MicropythonでM5Stamp C3Uを開発する環境構築について紹介した。

medicalengineer.hatenablog.jpしかし、Lチカをしただけでは芸がない。何か役に立つモノを作ってみたくなるのが人情ではないだろうか。M5Stamp C3UはWiFi接続も可能なデバイスであるため、Webから何かのデータを持ってきて表示するのも面白そうだ。よし、早速天気予報でもスクレイピングしてみよう。

 

天気予報のスクレイピング

Web上で天気予報を確認する方も多いだろうが、国内の天気予報サイトの代表格といえば気象庁のサイトではなかろうか。

気象庁による東京地方の天気予報のページ

気象庁の天気予報ページは、jsonとよばれるデータ記述言語で記載されたデータを参照して自動的に生成されている。

東京都の天気予報を表示するためのjson

 

なお、このjsonデータの読み方については、気象庁防災情報XMLフォーマット情報提供ページに詳細が掲載されている。

xml.kishou.go.jp気象庁の天気予報ページが参照しているjsonファイルの中で用いられている"areas"や"weatherCodes"等の項目の対応に関しては、"電文毎の解説資料(令和4年7月28日一部更新)"に収録されている"府県天気予報・府県週間天気予報_解説資料付録.xls"に掲載されている。

https://xml.kishou.go.jp/jmaxml_20220728_Manual(pdf).zip

今回は、この資料を参考に、気象庁jsonのデータを読み取って、M5Stamp C3Uに接続した小型ディスプレイに表示してみよう。

 

スクレイピングの準備

スクレイピングの準備として、予報対象地域のコードを確認しよう。例えば、東京都の天気予報のページのURLは、

"https://www.jma.go.jp/bosai/#pattern=forecast&area_type=offices&area_code=130000"

であるが、"area_code"の後に続く6桁の数字が各都道府県に対応している。すなわち、東京都のコードは130000だ。ただし、エリアの広い北海道、鹿児島、沖縄の各道県は道県単位ではなく、地方単位(例えば、北海道ならば宗谷、上川・留萌、網走・北見・紋別……)での対応となる。上記ページから都道府県・地方を選択するメニュー画面を出し、対象の都道府県(以上3道県は地方)の天気予報を表示する。

都道府県・地方の選択メニュー

 

対称の都道府県の天気予報を表示したら、そのURLから"area_code"を確認する。例えば、北海道宗谷地方のURLは

"https://www.jma.go.jp/bosai/#pattern=forecast&area_type=offices&area_code=011000"

であるので、コードは011000だということがわかる。これでスクレイピングの準備は完了だ。

 

パッケージのインストール

続いてThonnyを用いて必要なパッケージをインストールする。今回作成するプログラムでは、SSD1306を制御するための"micropython-ssd1306"と、Webデータを取得するための"micropython-urequest"という2つのパッケージを利用するので、それらをインストールしよう。

Thonny上で"Tools"→"Manage packages"とクリックすると、マイコンにインストールされているパッケージの管理画面が表示される。検索ウィンドウに"micropython-ssd-1306"と入力して、"Search on PyPI"をクリックして検索する。

mycropython-ssd1306ライブラリのインストール

"micropython-ssd1306"を選択し、"Install"をクリックしてインストールする。

mycropython-ssd1306ライブラリのインストール

同様に"micropython-urequest"も検索してインストールする。2つのパッケージのインストールが完了したら、"Close"をクリックしてウィンドウを閉じておく。

 

配線

さて、早速回路を組み立ててゆこう。今回の作例であれば、M5Stamp C3Uのほか、128×32pixelのOLEDディスプレイ、ジャンパ線4本(接続を工夫すれば減らすことも可能)、ブレッドボードが必要だ。

配線は極めて単純で、M5Stamp C3UにSSD1306 OLEDディスプレイをI2C接続するだけだ。OLEDのVCCはM5Stamp C3Uの任意の5Vピン、GNDは任意のGNDピンに接続すればよく、SCLとSDAはプログラム上で指定すればよい。今回は、SCLは4番ピン、SDAは3番ピンを使うこととした。

配線

コーディング

配線が済んだらコーディングだ。Thonnyで以下のコードを入力(もしくはCopy & Paste)する。ただし、"your_ssid"はWiFiSSID、"your_password"はWiFiのパスワードを入力し、"https://www.jma.go.jp/bosai/forecast/data/forecast/130000.json"の"130000"部分は対象の都道府県(北海道、鹿児島、沖縄の3道県は地方)のコードを入力する。さらに、都道府県内の地域の選択は"areas"の引数(0, 1, 2,...)を変更してやればよい。

# -*- coding:utf-8 -*-

import machine
from machine import Pin, SoftI2C
import ssd1306
import urequests as requests
import json
import network

ssid = "your_ssid"
password = "your_password"

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
    print('connecting to network...')
    wlan.connect(ssid, password)
    while not wlan.isconnected():
        pass
print("WiFi Connected")

i2c = SoftI2C(scl = Pin(4), sda = Pin(3))
display = ssd1306.SSD1306_I2C(128,32,i2c)

def decodeWeather(weatherCodes):
    if weatherCodes in [100,123,124,130,131]:
        weather = "Sunny"
    elif weatherCodes in [101,132]:
        weather = "Sunny / Cloudy"
    elif weatherCodes in [102,103,106,107,108,120,121,140]:
        weather = "Sunny / Rainy"
    elif weatherCodes in [104,105,160,170]:
        weather = "Sunny / Snowy"
    elif weatherCodes in [110,111]:
        weather = "Sunny > Cloudy"
    elif weatherCodes in [112,113,114,118,119,122,125,126,127,128]:
        weather = "Sunny > Rainy"
    elif weatherCodes in [115,116,117,181]:
        weather = "Sunny > Snowy"
    elif weatherCodes in [200,203,206,207,208,220,221,240]:
        weather = "Cloudy"
    elif weatherCodes in [201,223]:
        weather = "Cloudy / Sunny"
    elif weatherCodes in [202,203,206,207,208,220,221,240]:
        weather = "Cloudy / Rainy"
    elif weatherCodes in [204,205,250,260,270]:
        weather = "Cloudy / Snowy"
    elif weatherCodes in [210,211]:
        weather = "Cloudy > Sunny"
    elif weatherCodes in [212,213,214,218,219,222,224,225,226]:
        weather = "Cloudy > Rainy"
    elif weatherCodes in [215,216,217,228,229,230,281]:
        weather = "Cloudy > Snowy"
    elif weatherCodes in [300,304,306,328,329,350]:
        weather = "Rainy"
    elif weatherCodes in [301]:
        weather = "Rainy / Sunny"
    elif weatherCodes in [302]:
        weather = "Rainy / Cloudy"
    elif weatherCodes in [303,309,322]:
        weather = "Rainy / Snowy"
    elif weatherCodes in [308]:
        weather = "Rainstorm"
    elif weatherCodes in [311,316,320,323,324,325]:
        weather = "Rainy > Sunny"
    elif weatherCodes in [313,317,321]:
        weather = "Rainy > Cloudy"
    elif weatherCodes in [314,315,326,327]:
        weather = "Rainy > Snowy"
    elif weatherCodes in [340,400,405,425,426,427,450]:
        weather = "Snowy"
    elif weatherCodes in [401]:
        weather = "Snowy / Sunny"
    elif weatherCodes in [402]:
        weather = "Snowy / Cloudy"
    elif weatherCodes in [403,409]:
        weather = "Snowy / Rainy"
    elif weatherCodes in [406,409]:
        weather = "Snowstorm"
    elif weatherCodes in [361,411,420]:
        weather = "Snowy > Sunny"
    elif weatherCodes in [371,413,421]:
        weather = "Snowy > Cloudy"
    elif weatherCodes in [414,422,423]:
        weather = "Snowy > Rainy"
    else:
        weather = "Unknown"
    return weather

jma_url = "https://www.jma.go.jp/bosai/forecast/data/forecast/130000.json"
jma_json = requests.get(jma_url).json()
jma_date = jma_json[0]["timeSeries"][0]["timeDefines"][0]
jma_weather = jma_json[0]["timeSeries"][0]["areas"][0]["weathers"][0]
jma_weatherCodes = int(jma_json[0]["timeSeries"][0]["areas"][0]["weatherCodes"][0])

today_date = jma_date[0:10]
today_date = today_date.replace("-","/")
jma_weather = jma_weather.replace(" ", "")
today_weather = decodeWeather(jma_weatherCodes)

print(jma_date)
print(jma_weather)
print(jma_weatherCodes)

display.text(today_date,0,0,1)
display.text(today_weather,0,16,1)
display.show()

Thonnyによるコーディング

コーディングが済んだら、"File"→"Save as"とクリックし、"MicroPython device"を選択し、"main.py"というファイル名を指定して保存する。

保存した後、F5キーを押すか、"Run current script"をクリックすれば書き込んだプログラムが実行され、ディスプレイには日付と天気予報が表示されている筈だ。

 

動作確認


また、ThonnyのShellには上記コードのprint文の内容が表示されている筈だ。スタンドアロンで動作させるときはShellの内容は確認できないのだが、万一うまく動作しないようであれば、このShellの内容をもとにデバッグすることとなるため、要所要所でShellにメッセージを出力させるような設計にしておくとよい。

print命令の内容はShellに表示される

以上、M5StampとMycroPythonを用いたWebスクレイピングを試してみた。慣れれば半日かからずに完成できるため、小学生から高校生の皆さんの夏休みの自由研究にもちょうどいいかもしれない。

 

Windows + MicroPythonによるM5Stamp C3U開発環境の構築

Windows + MicroPythonによるM5Stamp C3U開発環境の構築

M5Stamp C3Uとは?

M5Stamp C3UはESP32-C3 RISC-V MCUを搭載した切手サイズのマイコンボードであり、ESP32-C3のUSBシリアル変換機能を利用しているため、直接USB接続するだけでプログラムの書き込みが可能なデバイスだ。

www.switch-science.comしかし、2022年8月現在、M5シリーズの開発環境であるUIFlowに対応していないことから、何かと不便なことが多い。Pythonで開発したいユーザはM5 Atom Liteを購入してUIFlowのPythonエディタを利用するのも一つの選択肢なのだが、残念ながらUI FlowのPythonエディタはPythonのコードを保存することができない。

そこで、UIFlowに頼らずにPythonでの開発環境を整えることとしたのだが、Windows環境では何かと面倒なことが多かった。個人的な備忘も兼ねて、要点をまとめておくことにする。

 

Pythonのインストール

もし、WindowsPythonがインストールされていない場合、Pythonをインストールする。Python本体のあるフォルダにPathを通しておくとともに、必要に応じて適切な環境を構築する。

www.python.org

もし、わかりにくければPython.jpの情報を参考にしてもよい。

www.python.jp

実は、Unix系OSであればさほど大変ではないのだが、WindowsPython環境を構築するのは結構面倒な作業だったりする。うまくいかなければ、Windowsなんて諦めてUnix系OSを導入してしまうのも一つの作戦なのだが、そうするとこの記事の価値がなくなるので、Windows環境上でゴリ押ししてもらいたい。

 

CP201x ドライバのインストール

Pythonの環境が整ったら、USB経由でファームウェアやプログラムを書き込むためのチップ(CP210xシリーズ)のドライバをインストールする。

www.silabs.comSILICON LABSのCP210xドライバのページから"DOWNLOADS"タブへ入り、"Software Downloads"の項目から"CP210x Windows Drivers"を選択し、ダウンロードする。環境によっては、単にリンクをクリックするだけではダウンロードできないこともあるようだ。その場合は、リンクを右クリックしてリンク先を保存するようにすればよい。

CP210x Driverのダウンロード

ZIPファイルを解凍したら、64bit版のWindowsであれば"CP210x VCPInstaller_x64.exe"を、32bit版であれば"CP210x VCPInstaller_x86.exe"をダブルクリックしてドライバをインストールする。

CP210x Driverのインストール

 

ESPTOOLのダウンロード

次はESP32C3のファームウェアの書き込みに必要なツール(ESPTOOL)のダウンロードだ。ESPTOOLはGitHubからダウンロードできる。

github.com上記リンクにアクセスしたら、"Code"メニューをクリックし、"Download ZIP"を選択する。

ESPTOOLをGitHubよりダウンロード

ダウンロードしたZIPファイルを解凍し、その中にある"esptool.py"をPathの通ったフォルダに格納(コピーまたは移動)する。

ダウンロードしたESPTOOL

 

ESP32C3ファームウェアのダウンロード

MycroPython公式サイトより、ESP32C3用のファームウェアをダウンロードする。

micropython.orgいくつかのバージョンが選択できるようになっているが、特段の事情がなければ、Releasesの中から、最新のもの(latest)を選んでおけばよい。

ESP32ファームウェアのダウンロード

ダウンロードしたら、わかりやすいフォルダにでも移動しておこう。これで必要なファイルの準備は完了だ。

 

ESP32C3ファームウェアの書き込み

必要なファイルが揃ったら、いよいよM5Stamp C3Uにファームウェアを書き込むことになる。M5Stamp C3Uの中央部のボタンを押しながら、USBケーブルでPCに接続する。これでM5Stamp C3Uはファームウェアを書き込むモードに入る。

Raspberry Pi  PicoをMicroPython環境で開発した経験のある方ならピンと来たかもしれないが、Raspberry Pi Picoの初回設定時にUF2ファイルを書き込むのと似たような作業だ。)

WindowsキーとRキーを同時に押し、"ファイル名を指定して実行"ウィンドウを出し、"cmd"と入力して"OK"をクリックして、コマンドプロンプトを起動する。(コマンドプロンプトのかわりにWindows PowerShellを利用してもよい)

 

コマンドプロンプトの起動

 

コマンドプロンプトに下記のコマンドを打ち込み、フラッシュの内容を削除する。("COM5"部分はそれぞれの環境に応じて変更)

esptool.py.exe --chip esp32c3 --port COM5 erase_flash

フラッシュの消去

続いて下記のコマンドを打ち込み、ファームウェアを書き込む。("COM5"部分は先のポート名に、"UserName\FilePath"部分はダウンロードしたファームウェアの格納されているフォルダのパス、"esp32c3-20220117-v1.18.bin"部分はダウンロードしたファームウェアのファイル名に変更)

esptool.py.exe --chip esp32c3 --port COM5 --baud 460800 write_flash -z 0x0 "C:\Users\UserName\FilePath\esp32c3-usb-20220618-v1.19.1.bin

ファームウェアの書き込み

書き込みには少し時間がかかるが、成功すれば、"Leaving..."というメッセージに続き、"Hard resetting via RTS pin..."というメッセージが表示される。

ファームウェアの書き込み完了

これでM5Stamp C3U側の準備は完了だ。一度M5Stamp C3UをUSBポートから抜いておこう。

Thonny Python IDEの設定

続いて、開発するWindows PC側の設定に入る。マイコンボードを用いた開発は、IDE統合開発環境)を用いるのが一般的だが、今回はRaspberry Piにプレインストールされていることでもお馴染みのThonnyを使うことにしよう。

thonny.orgThonnyの公式サイトからWindows版をダウンロードして、インストールする。

Thonnyのダウンロード

インストールが完了したら、Thonny Python IDEを起動する。

Thonny

Thonnyを起動したら、"Tools"→"Options"と進み、デバイスを"MirroPython (ESP32)"に、ポートを"USB Serial Device (COM5)"に設定し、"OK"をクリックする。("COM5"部分はそれぞれの環境に応じて変更)

 

ThonnyにESP32を設定

これでWindows + MycroPythonによるM5Stamp C3Uの開発環境の構築は完了だ。

 

Lチカで動作確認

配線

さて、M5Stamp C3Uの準備が整ったところで、動作確認をしてみよう。マイコンボードの動作確認の定番といえば、LEDの自動点滅、いわゆるLチカだ。

とりあえずM5Stamp C3Uの3番ピンに330Ω程度の抵抗器とLEDのアノードを直列に接続する。続いて、LEDのカソードをM5Stamp C3UのGND端子に接続する。

 

ブレッドボードの配線例

コーディング・書き込み

配線が完了したら、M5Stamp C3UをUSBケーブルでWindows PCに接続し、下記のコードを入力(もしくはCopy & Paste)する。

import machine
import time
led = machine.Pin(3, machine.Pin.OUT)
while True:
    led.value(1)
    time.sleep(1)
    led.value(0)
    time.sleep(1)

"while True:"以降は最後まで行頭に同じレベルのインデントを入れるのを忘れないように。

ThonnyでLチカのコーディング

入力し終えたら、ファイルをM5Stamp C3Uに書き込もう。

"File"→"Save as"とクリックし、"MicroPython device"を選択する。

 

M5Stamp C3Uに書き込み

"main.py"というファイル名を指定して保存する。

M5Stamp C3Uに書き込み

保存した後、F5キーを押すか、"Run current script"をクリックすれば書き込んだプログラムが動き出し、1秒間隔でLEDが点灯と消灯を繰り返すはずだ。

M5Stamp C3UでLチカ

これでひとまず、M5Stamp C3UをWindows + MycroPython環境で開発する環境が整った。あとは楽しく遊ぶこととしよう。

対称性を意識してAmpereの法則とBiot-Savartの法則を活用しよう

電流と磁場の公式を丸暗記?!

電流と磁場の公式。似たようなものが多くて、いろいろと混乱する。なんか電流が作る磁場の公式としても、

f:id:medicalengineer:20211113233539p:plain

だか

f:id:medicalengineer:20211113233618p:plain

だかわからなくなってくる。

そもそも、電磁気学に限らず自然科学において公式をひたすら丸暗記するなど愚の骨頂だ。Ampere(アンペール)の法則とBiot-Savart(ビオ・サバール)の法則に立ち返ればよい。とはいっても、これらの法則は積分形で書かれているから理解するのも面倒だ。ここでは、厳密さにはちょっとばかし目をつぶって、対称性を最大限に活用しながら、できるだけ簡単に理解できるように工夫しながら考えてゆこう。

 

無限長直線電流が作る磁場:円周で対称性を考える

公式丸暗記からの脱却の第一歩として、無限長直線電流を簡単に導出できるように頭を切り替えよう。これはAmpereの法則を用いて導出することにしよう。Ampereの法則とは、ぶっちゃけた言い方をすれば「ある周回経路に沿って磁場を足し合わせれば、その周回経路を貫く電流に等しくなる」ということだ。つまり、

f:id:medicalengineer:20211113235221p:plain

ということだ。周回積分

の領域を電流を中心とする半径rの同心円状にとれば、

f:id:medicalengineer:20211113235554p:plain

であるから、

f:id:medicalengineer:20211113233618p:plain

を得る。そもそも、無限長直線電流が作る磁場は2次元的に対象な筈だから円の周長2πrで割り算していると考えてもよかろう。

f:id:medicalengineer:20220416132659j:plain

Ampere's law

円環電流の中心の磁場:球面で対称性を考えてから円周にわたって足し合わせる

さて、続いては円環電流の中心の磁場だ。こちらはBiot-Savartの法則を用いて導出しよう。Biot-Savartの法則とは、電流がそのまわりに磁場を作るとき、その磁場の大きさを表す法則だ。本来ならばベクトルを用いた表記をすべきだが、ここでは簡単に理解してもらうため、

f:id:medicalengineer:20211113234026p:plain

と書いておこう。

なんのことはない、微小長さあたりで考えれば、電流に微小導体の長さをかけた値、すなわち微小電荷と速度の積*1を球の表面積で割っているにすぎない。そう、点とみなせる微小電流は3次元的に対称な筈だから球の表面積4πrで割り算している*2とでも考えておけば覚えやすかろう。つまり、Biot-Savartの法則は実質的にCoulomb(クーロン)の法則に電荷の移動速度を乗じたものなのだ。さて、円環電流がその中心につくる磁場Hを求めたければ、上式をおもむろに積分してやればよい。すなわち、

であることがわかる。ただし、微小経路を足し合わせたものが円周となることから、

f:id:medicalengineer:20211113234113p:plain

であることを用いた。

f:id:medicalengineer:20220416152058j:plain

Biot-Savart

今回は無限長直線電流が作る磁場と、円環電流が作る磁場を考えたが、対称性を利用すると考えるのが簡単になる。これら以外にも、対称性を利用して考えると覚えやすい公式も多い。電気工学はもちろん、物理学や数学といった自然科学系分野では、対称性を考えるというのは極めて大切なことである。

 

*1:何故そうなるのか疑問に思う方もいると思うが、

f:id:medicalengineer:20211118234204j:image

と捉えればわかりやすいだろう。

*2:あくまで覚える方法でしかない。電磁気学的にはあまり正確な考えではない。

Coulombの法則の本質

Coulombの法則は何故逆2乗則か?

電荷が作る磁場の計算や電荷同士に働く力の計算でお馴染みCoulomb(クーロン)の法則だが、医用電気工学のテキストでは

f:id:medicalengineer:20211114001404p:plain

と表されることが多い。「点電荷が作る電場は電荷に比例し、距離の2乗に反比例する」という、いわゆる「逆2条則」の典型例である。そもそも何故2乗に反比例するのか考えたことがあるだろうか。単なる反比例や3乗に反比例しちゃダメなのだろうか?

高校物理の教科書や参考書では歴史的な事情からか、

f:id:medicalengineer:20211114003954p:plain

とおいて、

f:id:medicalengineer:20211114001421p:plain

と紹介していることも多いが、もはや発狂モノだ。こんなの丸暗記しても、本質の理解には到底及びそうにない。本質を理解するために、まずは現象を単純に捉えてみよう。

f:id:medicalengineer:20211121233547j:plain

Coulomb's law



本来ならばCoulombの法則は電束密度Dを用いて

f:id:medicalengineer:20211114002915p:plain

と与えられるべきものだ。この式の意味するところをイメージできたなら、この先の理解はきっと早い。

 

勿論、この式は電荷の大きさ(すなわちそこから出る電束の本数)を半径rの球の表面積で除している。これは、「電束密度とは単位面積当たりの電束*1である(電束密度=電束の本数÷面積)」という定義そのものにすぎない。勿論、電束の空間的な広がり方は電荷に対して球対象であるから球の表面積で除しているわけだ。


ここで、電束密度Dを電場Eと誘電率εを用いて

f:id:medicalengineer:20211114002447p:plain

とすれば、

f:id:medicalengineer:20211114002907p:plain

であるから、両辺をεで除して、

f:id:medicalengineer:20211114002957p:plain

を得る。


ちなみに、この考え方を拡張すると、任意の平曲面Sに対しては、

f:id:medicalengineer:20211114005227p:plain

と表すことができる。これはMaxwell(マックスウェル)方程式を構成する方程式の1つ、Maxwell-Gauss(マックスウェルーガウス)の式*2とよばれるものである。

 

電場がわかれば電荷に作用する力はすぐにわかる

当然、電場は「1Cの電荷が受ける力が1Nであるような電場の大きさを1 [N/C] = 1 [V/m]と定める」こと、すなわち電荷Q、電場Eに対し、作用する力が

f:id:medicalengineer:20211121233842p:plain

と与えられるため、電荷同士に作用する力については、「電荷Q1が作る電場がQ2に及ぼす力」を考えれば、自ずと

f:id:medicalengineer:20211114010815p:plain

であることも理解できよう。

 

対称性を考えよう!

物理現象を考察する際に、対称性はとても便利だ。別の機会に「無限長直線電流が作る磁場」と「円環電流の中心の磁場」について紹介するつもりだが、このような電流が作る磁場を考えるときも非常に役に立つ。自然現象を考察するときは、是非とも対称性に着目してみよう。きっと、新たな見方が見つかる筈だ。

*1:+Q [C]の電荷からQ本の電束が湧き出す。

*2:これは積分形とよばれる形式であり、微分形とよばれる形式 Div D = ρ を用いて表現することもある。