@ledsun blog

無味の味は佳境に入らざればすなわち知れず

焼売は蒸して作るのになぜ焼いて売るのか?

中国内モンゴル自治区発祥で、北京、広東と伝わるうちに音はシャオメイのまま、 漢字が稍美 > 焼麦 > 焼売 と変化していったみたいです。 日本に伝わるときに漢字は焼売のまま音がシュウマイに変わったようです。

◆羊肉焼麦 …1,380円

…「内モンゴルの羊肉シュウマイ」 これが凄く食べたかった!!

今でこそシュウマイというと 広東料理など中国南方のイメージが強いが、

実はその発祥は内モンゴル自治区の 呼和浩市(フフホト市)で元王朝の時代に 誕生したと言われている。

こうやって発祥の地 内蒙古のシュウマイが実際に食べれらるとは ホント貴重な経験( ゚ε゚;)

・・・そんな私の気持ちを汲み取ってか、 本来6個の所、8個にサービスしてもらいました(笑)

小籠包のような モチモチとした皮に ゴロゴロした羊肉と臭み消しのタマネギのみ。

羊肉特有の風味と ジューシーな肉汁に舌鼓(;´∀`) 黒酢で味変すると、 羊のクセがまろやかに♪

稍美(シャオメイ) シューマイ  稍美は日本での定番中華料理シューマイのこと。地方によっては稍麦,焼売と書くところもあり、日本と全く変わらない。こちらのシューマイの一番の特徴は皮にある。餃子でもシューマイでも日本の物は皮がとても薄いが、中国ではこれが主食にあたるため、皮もおいしく、しっかり食べる。そのため、シューマイの皮にもこだわりがあり、日本のシューマイとは違った食感、味がする。具は、肉を中心にしたもので、とてもやわらかい。日本のシューマイのように、箸できれいに割ることは出来ない。割ってしまったらバラバラにくずれてしまう。   フフホトでは、朝食にシューマイを食べる人が多く、朝からシューマイを出す店は繁盛している。朝早くおきて街中を散歩すれば、かならずシューマイを買っている人にでくわすだろう。

次は、稍麦。いわゆる焼売(シューマイ)のことだ。 意外なことに、シューマイが内モンゴルの名物らしい。

中国ではシューマイは焼売とか焼麦とか書くのが普通なんだけど、 ここ内モンゴルでは、稍麦とか稍美とか書くんだそうだ(どれも発音が似ているのだ)。

中国の田舎に行くと、難しい漢字は勝手に違う漢字を当てて簡単にしてることがよくあるから、 これもその一例なのかなと思ったら、さにあらず。 なんと明代にはこっちの書き方が正式だったんだそうだ。へえ。

餡に羊肉を使うのと、塞ぎ口に粉を付けて雪が積もったように見せるのが、特徴。 まあ、美味しいかと聞かれれば、答えはやや微妙で。。

「蒸し物なのに何でこんなに油っこいんだろう。。」 「ひとつひとつが無闇に大きいからじゃないか?  これだけ皮が薄くて餡が多いと、肉の固まりを食べているのと大して変わらんもの」

(DeepL翻訳)

伝説によると、明朝末期から清朝初期にかけて、桂花市の大南街大昭寺の近くに、饅頭を売って生活している兄妹がいたという。 兄は食費以外に収入がなく、将来結婚して家庭を持つために、鍋で蒸した時に薄皮の開いた「饅頭」を作って別に売り、饅頭を売ったお金を兄に渡して、そのお金を貯めていた。 そのうち、饅頭には見えない饅頭を気に入る人が多くなり、豚の背比べを意味する「捎卖」と名付けられた。[1] また、その昔、茶館で売られていたこの蒸し菓子は、濃い磚茶やミルクティーに各種菓子を入れて飲み、籠から出したばかりの熱い蒸し菓子を食べたところ、側面が花のようにわずかにしわが寄っていたことから、「側面がわずかに美しい」という意味の「稍美」と呼ばれたそうである。 お茶屋さんで売られていることから、「捎卖」とも呼ばれている。 その後、晋の商人を通じて北京や天津に広まり、「稍麦」と呼ばれるようになり、北京で有名になった。 当時、北京の前門地区では、微麦を売る店の前にぶら下がっている看板に「桂花城稍麦」という文字がよく出ていた。 その後、進化を遂げながら「焼売」と呼ばれるようになり、南方へ広がっていった。

redEyes26

表紙からしてヘイデン回かと思ったらヘイデン回でした。 野獣のような男がいつの間にか成長を遂げていました。 22巻から始まった敵の本拠地への攻撃の続きです。

5巻目なので、話の長さが特別長いと言うことはないです。 年に一冊しか出ないので、もう5年目です。 たぶん攻め終わるのは10年後ぐらいだと思います。 いまどきパワードスーツバトルをアナログで描くのは伝統芸能だと思います。 健康に気をつけて描き続けてもらえればと思います。

クレバテス−魔獣の王と赤子と屍の勇者− 4

王都に攻め込んで来た主人公の仇の攻撃を、主人公は防げるか、仇を討てるのか? ストーリーの累計としては「家の中のモンスター」に当たりそうです。 見所はツンデレ魔王様のちょっといいところでしょうか? 仇討ちと絡めて世界の謎がちょっと見えてきました。

ディメンションW」に続いて、強い仇役にひげ面のおじさんを配置したのは、何かこだわりがあるんですかね?

WARNING: collation "ja-x-icu" has version mismatch

PostgreSQLで次の警告が表示されました。

2022-03-22 18:00:35.147 JST [68445] WARNING:  collation "ja-x-icu" has version mismatch
2022-03-22 18:00:35.147 JST [68445] DETAIL:  The collation in the database was created using version 153.14.39, but the operating system provides version 153.112.40.
2022-03-22 18:00:35.147 JST [68445] HINT:  Rebuild all objects affected by this collation and run ALTER COLLATION pg_catalog."ja-x-icu" REFRESH VERSION, or build PostgreSQL with the right library version.

意味はわかりません。 表示されたガイドに従ってコマンドを実行してみます。

~/px►psql postgres
psql (14.2)
Type "help" for help.

postgres=# ALTER COLLATION pg_catalog."ja-x-icu" REFRESH VERSION
postgres-# ;
NOTICE:  changing version from 153.14.39 to 153.112.40
ALTER COLLATION

良さそうです。

参考

PostgreSQL 10のICUコレーションを使うと日本語を普通にソートでき、更に文字順序までカスタマイズできる – yohgaki's blog

ソート順序はICUのバージョンによって変わる場合があります。このため、ICUバージョンが異るとエラーが発生することがあります。

PostgreSQL 10からja-x-icuという日本語の順序の指定方法が追加されたそうです。 これにバージョンが存在するそうです(言われてみれば、そらそうですね)。 PostgreSQLをバージョンアップしたときに、DB内のICUバージョンとPostgreSQL側のICUバージョンがズレるみたいです。

データモデリング

主にサーバーサイドのRDBMSのデータモデリングの話です。 最近、流行らないのですが・・・T字形ERに取り組むのが早道なんじゃないかなあ?と思っています。

例えば、TM(T字形ER)によるモデリング で説明されているものです。 ただ、僕が知った10年前ですら「どこかに伝わっているそういう手法があるらしい」みたいな感じでした。 人に勧めるには手頃な入門書を知らないです。

提唱者の佐藤正美さんの比較的新しい本があるので、良いのかもしれません。

未読です。

そういえば、僕はどういう本で勉強してきたかなあ?というのを思い出してみます。

10年以上前に読んだので内容は一ミリも覚えていませんが、すごい感銘を受けたことを覚えています。

同著者のより新しいデータモデルの本があるので、これも良いのかもしれません。

現実世界の例からデータモデリングをしていく実例が載っている本としては、名著です。 データモデリングの理論でなくて実践の入り口としてとても良いです。 「Kindle版がない」とか「出来た結果がRailsのActiveModelのソースコードだと、(僕にとって)都合がいいのに」とか思ったりします。

20220322追記

「SEのためのモデルへのいざない」は入門以前的な本で、データモデリングに必要になる数学を扱った本でした。

WSLのバージョン

WSL2とかでなくて、もうちょっと細かいバージョンについてです。

github.com

Githubでは0.56.2とかってバージョンがついています。

docs.microsoft.com

Release NoteではBuild 21364です。

要するに自分のPCに入っているWSLってどのバージョンなのでしょうか?

how to check version/build number of WLS · Issue #1728 · microsoft/WSL · GitHub

To find your Windows build number (which corresponds to your WSL version), go to Cortana and type "About your PC", and press Enter.

Build 21364というのはWindowsのビルドと一緒の番号みたいです。

f:id:ledsun:20220319235424p:plain
自分のPCのWindowsのビルドは19043.1586

WSLでいうとBuild 19041まで入っているのでしょうか? リリースはDecember 10, 2019 で2年前です。 結構古いですね。

Windows 11にすると ビルド 22000 になるっぽいです*1。 WSLのバージョンを上げるにはWindowsのバージョンを上げればよいということがわかりました。

Githubとのタグとの関係性は謎です。

アラフォー賢者の異世界生活日記~気ままな異世界教師ライフ~ 8

古代超科学文明の遺跡を調査しにきた主人公が見つける物は何か? 「SAVE THE CATの法則」のストーリーの類型では「なぜやったのか?」に該当するのでしょうか? 主人公が異世界に転生してきた原因が徐々に見えてきました。

自分、異世界転生チート主人公が現地人を育てて回る話が好きみたい。

WSLを終了する

Windowsターミナルを閉じてもWSLは終了しません。 sudo shutdow -h nowでも終了するっぽいのですが、Distrodがエラーメッセージを表示します。

ledsun@MSI:~►sudo shutdown -h now
[sudo] password for ledsun:
ledsun@MSI:~►[Distrod][ERROR] Failed to spawn the command.
Caused by:
    status.code() is None unexpectedly.

[プロセスはコード 137 で終了しました]

wsl.exe --shutdownで正常に終了できます。

f:id:ledsun:20220318231729p:plain
wsl.exe --shutdown でWSLが正常に終了したところ

sudoも要求されません。

参考

WSL1/WSL2 を再起動する方法 - 備忘録

トラックボール

ワークフロムホームでは机が狭いです。 より快適に作業をするためにトラックボールを使っています。 今まで使ったことがある三機種を比較してみます。

現役の左手用トラックボールです。 もとは右の背中の負担を減らすために、11月から左手用トラックボールを使い始めました。 最初は、左手で操作するのは慣れませんでした。 もう5ヶ月使っています。 今は普通に使えます。 何かで、右手が上手く動かせなくなったときに、左手でもある程度操作できる方が、プログラマ寿命が伸びそうです。

その前、9月から2ヶ月間、使っていた大玉トラックボールです。 でっかいとかっこいいと思って試してみました。 久しぶりに使ってみました。 僕は、人差し指と中指で操作するのはダメっぽいです。 1時間ぐらい使うと手首が痛くなってきます。 十数年前にボウリングをやっていた時期に痛めた部分です。 普段は特になんともないのですが、10年経っても治らないんですね。

www.sanwa.co.jp

2022年5月、最初に使ったトラックボールです。 1年以上使いました。 今使ってみると、手が大きいからか、玉と本体と両方が軽すぎてふわふわします。 なんとなく私には合わないようです。

marmaid.jsを使ってシーケンス図を書くためのHTMLファイルのテンプレート

SPAのような、あるページを表示するときにブラウザからサーバーへ複数回のリクエストを送るWebサイトがあります。 シーケンスそのものは複雑ではありませんが、複数種類のリクエストを送信していることを強調したいことがあります。 そんなときにサッとシーケンス図を描いて図示できると便利です。

簡単な図なのでわざわざ作図ツールを使うほどではありません。 なるべく手軽にシーケンス図を書きたいです。 そこで思いつきました。 marmaid.jsを組み込んだHTMLファイルを用意します。 例えば次のHTMLファイルです。

これをブラウザで表示すればシーケンス図が得られます。

f:id:ledsun:20220318200816p:plain
ブラウザでひらいくとシーケンス図が得られます。

お好みのテキストエディタで編集して、好きなシーケンス図が得られます。

marmaid.jsにはライブエディタもあります。 よく考えたら、要りませんでした。

Windows10のWSL起動時にfish-shellからrbenvの初期化に失敗する

WSL起動時に次のエラーメッセージが表示されます。

source: Error encountered while sourcing file '/tmp/.psub.N1u4nIBokn':
source: No such file or directory
rm: cannot remove '/tmp/.psub.N1u4nIBokn': No such file or directory
Welcome to fish, the friendly interactive shell
Type help for instructions on how to use fish

rbenvを初期化するためのコマンドsource (rbenv init -|psub)の実行に失敗しているためにでているエラーメッセージです。 この状態ではrubyコマンドが見つかりません。

ledsun@MSI:~►ruby                                                                                                  23:01

Command 'ruby' not found, but can be installed with:

sudo snap install ruby  # version 3.1.1, or
sudo apt  install ruby  # version 1:2.7+1

See 'snap info ruby' for additional versions.

もう一度source (rbenv init -|psub)すればrbenvは初期化されます。 rubyコマンドが使えるようになります。

ledsun@MSI:~[127]source (rbenv init -|psub)                                                                0.127s 23:01
ledsun@MSI:~►ruby

fish-shell同じエラーメッセージがでるissueがあります。

github.com

close済みです。 WSLに関する情報も載っていません。

psubは名前付きパイプの代わりに一時ファイルをつかうfish-shellの組み込みコマンドです。

fishshell.com

わかった風に書いていますが、名前付きパイプがなにかはわかっていません。 やっていることは、次のようにrbenv initコマンドで初期化スクリプトを出力します。

ledsun@MSI:~[1]►rbenv init -                                                                                       23:16
set -gx PATH '/home/ledsun/.rbenv/shims' $PATH
set -gx RBENV_SHELL fish
command rbenv rehash 2>/dev/null
function rbenv
  set command $argv[1]
  set -e argv[1]

  switch "$command"
  case rehash shell use
    rbenv "sh-$command" $argv|source
  case '*'
    command rbenv "$command" $argv
  end
end

psubを使ってスクリプトを一時ファイルに書き込みます。 一時ファイルのパスを返します。

ledsun@MSI:~►echo (rbenv init -|psub)                                                                              23:17
/tmp/.psub.qMqt1fQTDG

これをsourceコマンドで読み込むだけなので、失敗しないはずです。 WSLの起動中だと一時ファイルへの書き込みに失敗するか、書いた一時ファイルが消えるかしているのでしょうか?

20220409追記

Windows 11にしたら起きなくなりました。 WSLのバージョンに依存していたようです。

20220501追記

また、起きるようになりました。

WSLの起動時にfish-shellでrbenvの初期化に失敗するところ

Fat Model問題

Fat Model問題を説明してみましょう。 ここでいうFat Model問題とはRuby on Raisを使って書かれたWebアプリケーションにおいてモデルクラスが大きくなりすぎる問題のことをいいます。 Ruby on Railsでは、MVC(model-view-controller)というアーキテクチャパターンを採用しています。

第1章 ゼロからデプロイまで - Railsチュートリアル

ブラウザがRailsアプリと通信する際、一般的にWebサーバーにリクエスト(request)を送信し、これはリクエストを処理する役割を担っているRailsのコントローラ(controller)に渡されます。コントローラは(ユーザーなどの)サイトの要素を表しており、データベースとの通信を担当しているRubyのオブジェクトであるモデル(model) と対話します。モデルを呼び出した後、コントローラは、ビューを描画し、完成したWebページをHTMLとしてブラウザに返します。

Ruby on Railsではコントローラーには処理をほとんど書かずに、モデルクラスの呼び出しのみを書くべきだとされています(要出展)。 例えば、DHHが示したBasecamp3というアプリケーションの統計情報では、コントローラーのメソッド辺りの行数(LOC/M)は3行しかありません。

では処理はどこに書くのでしょうか?MVCの残りの登場人物はモデルクラスとビューです。 MVCはPresentation Domain Separation (PDS)原則に則っています。 ビューにはプレゼンテーション(見た目の整える)処理のみを書きそれ以外の処理はモデルに書きます。 つまり、見た目に関わらないほとんどの処理はモデルクラスに書きます。

この方針のまま大きなアプリケーションを実装したらどうなるでしょうか? 大きなモデルクラスが誕生します。 モデルクラスが大きくなると変更が難しくなります(なぜ?)。 これがFat Model問題です。

で、DHHのツイートを見なおしてみましょう。 モデルクラスは2万行近くあって300個以上あります。 が、クラス辺りのメソッド数(M/C)は8しかないしメソッド辺りの行数は3なんですよね・・・どこがFatなのか? ServiceクラスもFormオブジェクトも使わなくともFat Model問題は起きないみたいですよ?どういうことですか?

参考

20220317追記

texta.fmの第7回「Fat Controllers and Models」を公開しました! - てくすた を聞きました。

  • コントローラーの方がテストを書きにくいので、Fat Controller vs Fat ModelならばFat Modelがまし
  • Fat Modelになるのはデータモデリングが出来ていないため。テーブルが少ない。典型的にはテーブルが、リソースのみでイベントエンティティがない。
  • クラスメソッドが多いのは悪いコードの匂い。特にモデルクラスから別のモデルクラスのクラスメソッドを呼んでいるのは良くない。

つづいて 本ブログのポッドキャスト「texta.fm」を始めました! - てくすた の3. Low-Code Developmentも聞きました。 半分寝落ちしてましたが、「URL設計とデータ設計が上手くできればRailsは高速開発できる」みたいな話が面白かったです。

ブラウザからJavaScriptモジュールをjQueryとともに使う

ブラウザでJavaScriptモジュールが使えるようになりました。 <script type="module">って書くやつです。 これを使うとimport/exportを使ってモジュール感の依存関係が解決できます。 これまでは人間がscriptタグの順番を決めるか、Webpackのようなモジュールバンドラーで事前処理する必要がありました。 さらにそれ以前は、jQueryのようなグローバル変数を使って、依存関係を解決していました。

jQuery時代の依存関係解決からJavaScriptモジュールに一気にジャンプ出来るのでしょうか? それとも一度Webpackのようなモジュールバンドラーを経由する必要があるのでしょうか? ということを試してみます。 次のindex.htmlではJavaScriptモジュールとして、index.jsを読み込みます。

<head>
  <script src="https://code.jquery.com/jquery-3.6.0.js" integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk="
    crossorigin="anonymous"></script>
  <script type="module" defer>
    import init from './index.js'
    init()
  </script>
</head>

<body>
  <div id="hoge"></div>
</body>

index.jsではすでに読み込まれているはずのjQueryを参照します。

export default function () {
  $("#hoge").text("hello");
}

これが動くのかというと、動きます。 次のようにHTTPサーバーで起動します。

python3 -m http.server
open htttp://localhost:8000

f:id:ledsun:20220316085625p:plain
helloが表示されます。

HTTPサーバーを起動しないと、index.jsをローカルファイルから読もうとします。 これはエラーになります。

f:id:ledsun:20220316085920p:plain
ローカルのスクリプトファイル読み込みエラー

モジュールバンドラーを使っていなくても、<script type="module">を使ってWeb標準の依存関係解決をやっていけることがわかりました。

git force pullはない

変更が激しいブランチのソースコードレビューをするときなど、リモートのForce pushされたブランチをローカルブランチに反映したいことがあります。 自分が作業しているわけではないのでローカルの変更は全部捨ててかまいません。 git push -fみたいなオプションはpullコマンドにはありません。 代わりにresetコマンドを使います。

git reset --hard origin/master

引数なしのgit reset --hardだとローカルブランチの状態を変更前に戻すコマンドです。 戻す基準にするブランチを指定できるイメージでしょうか?

参考

git pull を強制し、リモートでローカルを上書きする方法 | WWWクリエイターズ

マクロスのミサイルみたいな矢印

こんな感じでX座標が同じ目標にむかう矢印は狭い範囲に集中してごちゃごちゃします。

f:id:ledsun:20220311100009p:plain
同じ座標に向かっている矢印

そこでマクロスのミサイルみたいに各矢印に個性を与えます。

f:id:ledsun:20220311100034p:plain
マクロスのミサイルみたいな矢印

正確に言うと逆です。 マクロスのミサイルは目標地点は1つで、経路に個性があります。 今回与えた個性は、目標地点をずらしています。 目標地点が画面外に出ていて見えないことを良いことに、矢印が向かうX座標をランダムで変更しています。

ネットワーク、パフォーマンス、メモリを指しているように見えるかもしれませんが、偶然です。

f:id:ledsun:20220311100723p:plain
順番に並んだ矢印

もう少し調整して、矢印が決まった順番にならぶようにしました。 矢印の個性は減ります。 矢印の交差が減るので関係性は見やすくなります。

ちなみにこの画像はブラウザのキャプチャで、矢印はSVGで描いています。