名古屋旅行2日目

2日目は東山動物園に行く予定。まずはモーニングを食べるために、ホテルを出て歩いて栄に向かう。

久屋大通公園の中を通ってみる。名古屋のど真ん中にこんな空間があるなんて。セントラルパークみたいだ。

栄の地下街にある「コンパル」に到着。まさかの行列。名古屋ローカルの喫茶チェーンだから、そこまで並んでないと思ったのに。何とか第一陣で入れてよかった。

ドリンクはミックスジュースを注文した。メニューにミックスジュースがあると、つい注文してしまう。ミキサーの音がしていたので、店内で作っているんだろうか。フレッシュで美味し。

名物のエビフライサンドも注文。食べるのが難しく、容易く崩壊してしまった。エビはプリっとしていて、オーロラソースもベストマッチ。朝食としてはボリュームが多いので、シェアするのがいいかも。

モーニングの後は、いよいよ「東山動物園」へ。この日もあいにくの天気。ほんと天気が怨めしい。雨が降ったり止んだりが続く。土砂降りでないだけ良しと思うことにしよう。

東山動物園にはゾウがいた。福岡市の動物園からはゾウがいなくなって久しい。ほんと、久しぶりに肉眼でゾウを見た。やはり動物園の主役だな。

レッサーパンダは愛くるしい。結構間近で見ることができて、展示の方法が上手いなぁと感心。

トラをガラス越しではなく金網越しに見れた。東山動物園のトラは活動的だったな。若いのかな。こんなに動いているトラを肉眼で見るのは初めて。

シロクマは青いタンク?と激しく戯れていて、注目を集めていた。

東山動物園でのお目当てだったコアラは、夜行性だからか、みんなお昼寝中だった。しかもほとんどのコアラが背中を向けていた。悲しい。

ツシマヤマネコの展示室には、隠れる場所が無いから、その姿をしっかり確認できた。福岡市動植物園だと、いつも隠れていてどこにいるかわからないんだよな。

東山動物園のお目当てその2。イケメンゴリラのシャバーニ。左側のオスがシャバーニだろうか。本当にイケメンかどうかは分からなかった。

東山動物園を一通り周ったら、栄に戻って昼食。松坂屋内にある「矢場とん」に行った。観光客は矢場本店に流れるだろう予測と、寒くて外で待つのはツラいので、松坂屋店を選んだ。結局こちらも30分くらい並んだけど。

味噌ヒレカツを注文。目の前で味噌ダレをかけてくれるパフォーマンスがあった。食べる直前に味噌ダレをかける形になるから、衣はまだサクサクでグッド。ヒレカツは柔らかくはあったけど、ややモソっとしていた。肉質がイマイチという前評判の通りだった。矢場とんを食べたという実績は解除。

栄から地下鉄で隣の伏見駅に移動し、子どもが行きたがった「でんきの科学館」へ。

無料で入れて、展示やサイエンスショーを見ることができた。さすがにここは観光客ではなく、地元の家族連れが多かったな。

予約していた時間よりだいぶ早いけど、もう開店していたので、「世界の山ちゃん」に向かった。早めの夕食。

お酒はほとんど飲めないので、ネクターとカルピスのカクテルにした。アルコール0%。

子ども用に「ちくきゅー」。ちくわにきゅうりを詰めたやつ。子どものお弁当に入ったりするやつなので、間違いない。

子ども用に「フライドポテト」も注文。居酒屋なので、メニューが豊富で、子どもが食べられそうな品が結構あって助かった。

今回の名古屋旅行で一番食べたかった「幻の手羽先」は、幻のコショウ普通となしを注文。幻のコショウは普通でもかなりスパイシーで、お酒が進みそう。パリッと香ばしく揚がっていて非常に美味だった。幻のコショウは控えめも試したけど、控えめでは物足りない。最低でも普通だな。

「山ちゃんコロッケ」にも幻のコショウが使われているらしい。手羽先ほどスパイシーではなく、ホクホク甘くて子どもでも食べられそうなコロッケだった。なんと松坂牛も使っているのだとか。食べた後に気づいた。

食後のデザートに「自家製杏仁豆腐」を食べたけど、自分が知ってる杏仁豆腐と違った。なんか固まってない?滑らかでないとか、そんな次元では無かった。メニュー知らずに食べて、杏仁豆腐と分かる人いないのでは。

子どもが注文したイチゴのアイスクリームの方が、ハーゲンダッツ使われていて美味しそうだった。こっちにすればよかったな。

手羽先絶品で10本食べた。福岡にも出店して欲しい。次回名古屋に来たときも食べたいと思えた。杏仁豆腐以外は満足だな。

山ちゃんを出た後は歩いてホテルに戻って2日目終了。

名古屋旅行1日目

子どもが春休みに入り、家族で2泊3日の名古屋旅行に行ってきた。自分のお目当ては名古屋めし。今回も8時ちょうどののぞみ10号で旅立つ。

名古屋までは3時間19分かかった。さすがに遠いな。着いたらまずは腹ごしらえ。名古屋駅地下のエスカに向かった。エスカには名古屋めしの有名店があつまっている。ここだけで名古屋めし制覇できそうなくらいだった。

最初の名古屋めしは、子どもが食べられそうなきしめんを選択。味噌カツやひつまぶしに人気が集中すると予想していたけど、吉田きしめんも結構な行列だった。

きしめんはほんのり甘さを感じるつゆが旨くてごくごく飲めた。きしめんの歯応えも丁度良くて、期待通りの一杯だった。

愛知には妻の親友が住んでいて、その人に会うのも目的だった。名古屋駅の待ち合わせの定番、金の時計で合流。10年以上ぶりに会えたみたい。

合流して外に出たら、あいにくの雨模様だった。そして名古屋超寒い。最高気温10度だとか。3月下旬なのに2月みたいだ。

名古屋駅から歩いて、ノリタケの森に到着。ここでは、カップやお皿の絵付けが体験できる。子どもは絵付け体験に興味を示していたので、今回の名古屋旅行を承諾させることができた。

レンガ調でヨーロッパみたいな建物が並ぶ。右手にあるのはショップだった。アウトレット品でお安いのもあり、ここで買うのはお買い得かも。

クラフトセンターは入館有料。さらに絵付け体験は別料金。けっこう高かったけど、それでも人気があるみたい。すぐにテーブルが埋まった。自分たちは運良く一つ空いていたテーブルに滑り込めた。絵付け体験では、カップ名古屋城と桜を描いてみた。写真を撮るのを忘れていたな。

絵付け体験の後は隣接するイオンモールに移動し、妻とその友人、自分と子どもの組み合わせで別行動。イオンモールの中は、名古屋も福岡もたいして変わらないな。ゲームセンターにワニワニパニックが置いてあって、子どもが初プレイ。ずっとやってみたいと言ってたけど、まさか名古屋で出会うとはな。

別行動終わって合流したら、歩いて名古屋駅に戻る。雨はやんでいた。

妻の友人を駅で見送り、夕食を食べにまたエスカへ。「ひつまぶし稲生」に行ってみた。さすがにひつまぶしは行列が長い。席に案内されるまで30分以上は並んだだろうか。

上ひつまぶしを注文。ご飯を無料で大盛にできたので、大盛にしたのはやりすぎだったな。皮はパリッと、身はふっくら、スタンダードで美味いひつまぶしだった。鰻がたっぷり入っていた気がする。満足。

名古屋駅から地下鉄で丸の内駅に移動し、そこから徒歩で久屋大通方面へ。今回の宿泊先は「ホテル京阪名古屋」。子どもが京都で泊まった京阪をいたく気に入ったので、今回も京阪にしてみた。

京都で泊まった部屋より1つ下のグレードだったので、ベッドが3つ並んでいるとさすがに窮屈に感じる。まぁ、今回の旅行はすべて外で食事する予定なので問題無い。ベッドの間に隙間が無いので、子どもがベッドから落ちなくて済むのはむしろ好都合だ。大浴場が無いのだけが残念だな。

翌日はモーニングを食べるために早く出るので、早めの就寝。新幹線で移動するだけでも、結構疲れるもんだ。

AKS 上のWindows コンテナから Windows ノードのストレージを使う

Windows コンテナ内では20GBまでしかストレージを使えない。それ以上使いたい場合は、ボリュームを構成する必要がある。

一時的に 20GB 以上欲しいけど、用が済んだらすぐに消すので、Nodeのディスクが使えればいい。emptyDir ボリュームを使えばいいみたい。

github.com

apiVersion: v1
kind: Pod
metadata:
  name: empty-dir-sample
spec:
  containers:
  - image: microsoft/windowsservercore:1709
    name: empty-dir-sample
    volumeMounts:
    - mountPath: C:/temp
      name: temp-volume
  volumes:
  - name: temp-volume
    emptyDir: {}
  nodeSelector:
    kubernetes.io/os: windows

Playwrightでクリップボードを使う機能のテスト

クリップボードに文字列をコピーするボタンを Playwright でテストする方法をメモ。grantPermissions でクリップボードの読み書きを許可しておくのがミソ。

import { test, expect, Page } from "@playwright/test";

test("アクセスキーをコピーできる", async ({ page, context }) => {
  // Arrange
  await context.grantPermissions(["clipboard-read", "clipboard-write"]);

  // Act
  await page.getByRole("button", { name: "コピー" }).click();

  // Assert
  const clipboardText = await page.evaluate(async () => {
    return await navigator.clipboard.readText();
  });
  await expect(clipboardText).toContain("期待する文字列");
});

PlaywrightでMUIのDialogをテストする

Playwright で MUI の Dialog コンポーネントをテストするのに手間取ったのでメモ。

import {
  Button,
  Dialog,
  DialogTitle,
  DialogContent,
  DialogActions,
  DialogContentText,
} from "@mui/material";
import { test, expect } from "@playwright/experimental-ct-react";

test("MUI の Dialog のテスト", async ({ page, mount }) => {
  const component = await mount(
    <Dialog open onClose={() => {}}>
      <DialogTitle>ダイアログタイトル</DialogTitle>
      <DialogContent>
        <DialogContentText>ダイアログ本文</DialogContentText>
      </DialogContent>
      <DialogActions>
        <Button color="primary">OK</Button>
        <Button color="inherit">キャンセル</Button>
      </DialogActions>
    </Dialog>,
  );

  await expect(page.getByText("ダイアログタイトル")).toBeVisible();
  await expect(page.getByText("ダイアログ本文")).toBeVisible();
});

mount が返す component ではなく、pape の方を確認しないといけなかった。

tbls で SQL Server のデータベースからドキュメントを生成

コードファーストで開発していた Web サービスのテーブル資料を求められたので、既存のデータベースから生成するツールを探したら良いの見つけた。

github.com

SQL Server にあるデータベースから、MarkdownSVG を生成できた。

tbls doc mssql://ログイン名:パスワード@localhost:1433/データベース名

生成した MarkdownSVG から、Excel ファイルを生成することもできた。

tbls out -t xlsx -o schema.xlsx

こんなこともあろうかと、efcore でエンティティ定義するときにコメントを付けてまわっていたので助かったな。

C# で ARM テンプレート関数を使う

C# のプログラムで Azure Resource Manager のテンプレート関数が使いたかった。具体的には guid を。Azure.Deployments.Expression パッケージを使って実現できた。

www.nuget.org

guid 関数を呼び出して、deterministic な GUID を生成するサンプルは次のとおり。

    public static Guid SeededGuid(string src1, string src2, string src3)
    {
        var parameters = new FunctionArgument[]
        {
            new FunctionArgument(new JValue(src1)),
            new FunctionArgument(new JValue(src2)),
            new FunctionArgument(new JValue(src3)),

        };
        var result = ExpressionBuiltInFunctions.Functions
            .EvaluateFunction(
                functionName: "guid",
                parameters: parameters,
                context: new ExpressionEvaluationContext())
            .ToString();
        return Guid.Parse(result);
    }