湯布院旅行

家族で湯布院へ旅行に行ってきた。子どもが産まれてから初めて。7年以上ぶりの旅行。

当初はゆふいんの森号で行く予定だったけど、台風のせいでしばらく運休に。慌てて高速バスに切り替えた。湯布院のバスセンターは湯布院駅すぐそば。

湯布院駅前のお土産屋さんはモダンな建物に変わってた。遠くに由布岳が見える。旅行日和。むしろ暑かった。

湯の坪街道に向かう道中、まずは子どもが楽しみにしていた「石ころ館」へ。特別に支給した小遣いで、さっそく自分用のお土産を買っていた。まだ湯布院について1時間経ってないのに気が早い。

湯の坪街道の入り口は、まだ観光地っぽくない。無量塔のロールケーキが有名な「B-SPEAK」があった。イートインは無くテイクアウトのみだったので、チラ見だけ。

初日は食べ歩くと決めていた。まずは「湯布院ぽてはに」で壺やきいも。

トッピングはアイスクリームに限る。ただでさえホクホク甘い焼きいもが、アイスクリームでさらに美味に。

湯の坪街道を進んでいくと、お土産屋さんが増えて、観光地らしくなってきた。

次のお目当てが「湯布院金賞コロッケ」。金賞の実力を見せてもらおう。

金賞コロッケは、揚げたてで外はカリッと、中はホクホク。予想外にジャガイモの甘さが際立っていて、さらに予想外にスパイシーだった。子どもにはまだ早い。ただ、非常に気に入った。福岡に出店してほしい。

メンチカツもジューシー。溢れんばかりの肉汁だった。メンチカツも捨てがたいが、金賞コロッケのほうが個人的に上だな。

オレンジやグレープフルーツをくり抜いた生搾りジュースを売っている店があった。オレンジにストローさして飲んでいる人が道中いて、子どもが気になっていたみたい。

暑かったので生搾りオレンジジュースで一服。10月とは思えない気温に疲労してたけど生き返った。

金鱗湖はしんとしていて空気が違った。鳥が全くいなくて、子どもは残念そうだった。前はでっかいガチョウ(?)がいたんだけどな。

宿泊先は「今昔庵」。高級な宿が多い湯布院では、比較的リーズナブル。妻の友人が以前訪れて高評価だったらしい。

離れと母家の客室があり、母家を選択。離れだと夕食がしゃぶしゃぶなのに対し、母家だと炭火焼きだったので。

客室に露天風呂が付いている。コロナ禍で大浴場には入りづらいので、今回の宿の条件は露天風呂付客室がマスト。夜と朝で合計5回ほど入ることになった。

夕食は、母家の向かいにある食事処でいただく。

ヤマメの塩焼き。皮までしっかり香ばしく焼かれていて、身はふっくら。丁度いい塩加減だった。川魚特有の臭みもなく大変美味。

豊後牛と赤鶏の炭火焼き。豊後牛のサシが美しい。

口に入れるとジュワッととろける。脂が旨い。この肉はしゃぶしゃぶよりも焼くのが正解だな。

冷たいうどんは口の中をさっぱりさせてくれて、口直しに丁度いい。子どもには肉よりもうどんの方が好評だった。

天ぷら。海老が大きいのが嬉しい。ただ、このあたりになると胃袋がもうパンパン。

締めに焼きおにぎりの出汁茶漬け。上にのっているのは焼き明太子。

母家の1階にある喫茶室に移動し、デザートの自家製プリンとシャーベットをいただいた。

コーヒーでホッと一息。喫茶室はレトロな喫茶店みたいな雰囲気で落ち着けた。デザートを食べる以外に使ってないんだろうか。だとしたら勿体無いな。

翌朝の朝食も、母家の向かいにある食事処吉一でいただいた。

朝食はオーソドックス。だし巻き卵と、おひつに入ったご飯が美味しかった。ご飯は海苔や卵で4杯ぐらい食べてしまった。食べすぎたな。

今昔庵からは金鱗湖が近かったので、二日目は金鱗湖側から湯の坪街道を散策スタート。道中、子どもにオルゴールづくり体験をさせたり、自分達のお土産に箸を買ったり、また金賞コロッケ食べたりしつつ、湯布院駅へ。

湯布院駅に着いたらちょうどお昼時だったので、ゆふまぶしを食べようかと思っていたんだけど、子どもが断固拒否。仕方なく、ゆふまぶし心の向かいにある「由布院ミルヒドーナツ&カフェ」に入った。

子どもにはドーナツの「フェーボン クラッフェン」。大人はそんなにお腹減ってなかったから、エクレアみたいな「ハーゼンオール」をシェアした。カスタードが濃厚で期待以上だった。

ドリンクはバナナミルク。牛乳自体が優しい甘さ。それにアイスとバナナソースなんて合うに決まってる。

初めての家族旅行、久しぶりの湯布院。金賞コロッケ食べたし、豊後牛も堪能したし、露天風呂に入りまくったので、やりたかったことは大体できて満足。子どもも「まぁまぁ楽しかった」みたいだ。まぁまぁの評価をもらえたので成功だろう。唯一の心残りは、ゆふまぶしを食べられなかったこと。次回湯布院に来たらリベンジしたい。

Xenoblade3

ゼノブレイド3をクリアした

ゼノブレイドシリーズ3作目。3は3部作の集大成ということで、集大成らしい、スケールの大きい作品だったかと思う。

舞台のアイオニオンは1と2の世界が合体したような世界だった

1っぽい国のケヴェスと、2っぽい国のアグネスが、ずっと戦争を続けている。アイオニオンに生きる人たちは10年しか生きられないという、なんじゃそりゃという設定。それもストーリーが進むにつれて理由が明かされるけど、生きるために戦い、戦うために生きていて、なんとも救いがない酷い世界だ。

子孫もいないので異性という概念もないっぽい

最初ノアとランツと一緒に、ユーニがお風呂に入っていたのはギョッとした。全年齢向けだよなこれ。まぁ、それもこの独特過ぎる世界観の構築に一役買っていたんだろう。

10年しか生きられないことに疑問を抱かされ当然旅立つ

ケヴェス側のノアとランツとユーニ、アグネス側のミオとセナとタイオン。敵対していた6人が、シティを目指せというヴァンダムの遺言に導かれ、共に旅立つ。その先でアイオニオンが戦争ばかりかつ、人が10年しか生きられない世界になった元凶と戦う、というわけだ。

1と2をプレイしていたらわかるネタが

6人にシティに向かえと言った漢の名がヴァンダム。ケヴェスとアグネス、それぞれのトップの女王が、1と2に出てきたヒロインだったり。2のインディヴィアが山脈になってたし、1の大剣みたいなものもあった。ホント、1と2が合体したような世界。合体したというのは、あながち的外れでもないんだけど。

話の中心はやはりノアとミオではあるけど

途中に出てくるライバル的な立ち位置の、黄金の鎧を着た敵Nが出てくるけど、そいつがなんというか。闇堕ちしたノアというか。でも嫌いになれない。気持ちはわかる。何度も絶望を味わったら闇落ちもしちゃうよね。

特に子供を残して逝くところはシンドかった。胸に突き刺さる。自分の子供と重ね合わせてしまうので、ああいうのマジ勘弁。耐性無くなってしまったな。夫と子供残して母親が先に逝くのも無理。感情移入しちゃうんで、あのあたりはやってて辛かった。

ゼノブレイドシリーズの主人公はみんな優等生だな

ノアは気が利きすぎて優等生が過ぎる。むしろ、タイオンの方が理系脳で異性に免疫なさげで、親近感があった。ミオは2のニアを彷彿させるビジュアル。でも、ニアよりも精神が大人で、年長らしさとお茶目さが同居して魅力的だった。

ユーニはビジュアルと性格面の両方でどストライク。男勝りな言動をしていても、乙女チックな部分があって、そのギャップが良い。もうちょっとタイオンとのエピソードがあってよかったのに。話の中心はノアとミアだから仕方ないのか。

1と2が合体したようなシステム

チェインアタックとか、コンボとか。コンボも2系統あるし、アーツも時間経過で貯まるタイプと、オートアタックがヒットしたら貯まるタイプとあって、難解なシステムだった。1と2をプレイしてたのでなんとか使えたが。

ウロボロスは反則的で強すぎ。変身中は死なないし。バランスブレイカー。ノアも後半になったら急激に超火力になる。ラッキーセブンのアンリミテッドソードが強すぎる。即死の効果もあり、ユニークとボス以外は瞬殺も可能。攻撃力も上がっているので、チェインアタックで、ウロボロスオーダーまで行ったら何百万もダメージを与えられる。ボスやユニークは半分くらいHPを減らした後は、チェインアタックで仕留める、という力押し作戦が使えた。

フィールドのシステムはこれでもかってくらい親切

ナビゲートをONにすると、アクティブなクエストの目的地までの最短ルートを表示してくれる。おかげでほとんどのクエストをスムーズに進めることができた。絶対迷わせないという強い意思を感じたね。

エストは全部クリア

ノーマルクエストだけでなく、ヒーロークエストと覚醒クエストも全部クリアしたはず。クエストをクリアしていたらレベルがガンガン上がって、ラスボス前に99に達した。ユニークも全部倒したし、アイオニオン最強も倒した。

アイオニオン最強だけは、チェインアタックでは倒し切れず、ウロボロスに変身してなんとかって感じ。

ヒーロークエストをクリアすれば確実にヒーローを仲間にできたので2よりもだいぶ親切

3はクラスっていう、FFやDQでお馴染みのクラスチェンジができる。クラスはヒーローを仲間にすれば確実に入手できて、ヒーローはヒーロークエストをクリアすれば確実に仲間にできた。運要素がないので、2よりもだいぶ親切。よく考えられているというか、2が不評だったのかもしれない。

ヒーローはクリア後に仲間にできる隠しヒーローが強すぎて、クリア後はそればかり。それまでだと、チェインアタックのゲージを増やしてくれるマシロをよく使っていた。加入してからはずっとマシロ。バフも全体にかけられて、かなり優秀なヒーローだった。

3部作の集大成にふさわしい作品だった

全ての謎が明らかになったわけじゃないんで、4に持ち越しだろうな。きっと。最後、ノアたちとミオたちがどうなったのかも気になる。今作みたいに、4で少し触れられるだろうか。今後のゼノブレイドシリーズに期待ということで。

C# で自己署名証明書を生成する

.NET 6 で試したら、標準ライブラリだけで自己署名証明書を生成できた。

using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;

var ecdsa = ECDsa.Create();

var request = new CertificateRequest(
    subjectName: "cn=hogefuga",
    key: ecdsa,
    hashAlgorithm: HashAlgorithmName.SHA256);

// 自己署名証明書を生成
var certificate = request.CreateSelfSigned(
    notBefore: DateTimeOffset.Now,
    notAfter: DateTimeOffset.Now.AddYears(1));

// PFX を出力
var exportedPfx = certificate.Export(X509ContentType.Pfx, "P@ssw0rd");
var filePath = Path.Combine(AppContext.BaseDirectory, "mycert.pfx");
File.WriteAllBytes(filePath, exportedPfx);

// 公開鍵のみを Base64 エンコードして出力
var exportedCert = certificate.Export(X509ContentType.Cert);
var base64EncodedCert = Convert.ToBase64String(
    exportedCert,
    Base64FormattingOptions.InsertLineBreaks);
Console.WriteLine("-----BEGIN CERTIFICATE-----");
Console.WriteLine(base64EncodedCert);
Console.WriteLine("-----END CERTIFICATE-----");

SOUVENIR

アニメ「SPY×FAMILY」2期の主題歌。髭ダンのミックスナッツが作品にピッタリ過ぎて、比較されそうで心配していたけど、杞憂だったかもな。

軽快なようでいて物悲しさも併せ持っているようなメロディが、あまりにも自然に、スッと入ってきた。味わい深くて、繰り返し聴いてしまう。

「あなたに貰ったこの帰り道」という歌詞から、ヨルさんが思い浮かんだ。ヨルさんが帰り道を歩く情景が。いやいや、ロイドも3人と1匹で暮らしてるうちに変わってきつつあるので、ロイドの可能性もあるな。ていうか、繰り返し聴いてると、2人ともあてはまっているように思えてきた。

1期主題歌がSPY×FAMILYのSPY部分を表現しているとして、2期主題歌はFAMILY部分を表現しているんだろうな。きっと。

SOUVENIR

SOUVENIR

C# で Azure 仮想マシンのプロパティを取得する

Azure ポータルの仮想マシンの概要ページに表示されているような情報を、C#SDK 使って取得してみた。

www.nuget.org

www.nuget.org

といっても全部取得するのは調査に時間がかかるので、ひとまず必要なやつだけ。ズバッと1回の呼び出しで取得できなかったので、思っていたよりかなり面倒だった。気が利いてなさすぎてイマイチ。

using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.Compute;
using Azure.ResourceManager.Compute.Models;
using Azure.ResourceManager.Network;

const string ClientId = "クライアントID";
const string ClientSecret = "クライアントシークレット";
const string TenantId = "テナントID";
const string SubscriptionId = "サブスクリプションID";
const string ResourceGroupName = "リソースグループ名";
const string VmName = "仮想マシン名";

var credential = new ClientSecretCredential(
    tenantId: TenantId,
    clientId: ClientId,
    clientSecret: ClientSecret);
var client = new ArmClient(credential);

var id = VirtualMachineResource.CreateResourceIdentifier(
    subscriptionId: SubscriptionId,
    resourceGroupName: ResourceGroupName,
    vmName: VmName);
var vm = client.GetVirtualMachineResource(id);
var response = await vm.GetAsync(expand: InstanceViewType.InstanceView);

// 状態は InstanceView の Statuses を見るしかなさそう。
// 実行中の場合、Statuses には ProvisioningState/succeeded と PowerState/running が入っているので、
// 最後だけ取り出す一工夫が必要。
Console.WriteLine($"状態:{response.Value.Data.InstanceView.Statuses.LastOrDefault()?.DisplayStatus}");

foreach (var niRef in response.Value.Data.NetworkProfile.NetworkInterfaces)
{
    // IPアドレスを見るには、ネットワークインターフェースを取得するしかなさそう。
    var ni = client.GetNetworkInterfaceResource(niRef.Id);
    var nicResponse = await ni.GetAsync();
    foreach (var ip in nicResponse.Value.Data.IPConfigurations)
    {
        Console.WriteLine($"プライベートIPアドレス:{ip.PrivateIPAddress}");
        if (ip.PublicIPAddress != null)
        {
            // パブリックIPアドレスはさらに別リソースなので、IPアドレスの値を見るためには、
            // パブリックIPアドレスリソースを取得するしかない。
            var pip = client.GetPublicIPAddressResource(ip.PublicIPAddress.Id);
            var pipResponse = await pip.GetAsync();
            Console.WriteLine($"パブリックIPアドレス:{pipResponse.Value.Data.IPAddress}");
        }
    }
}

Console.WriteLine($"OSディスク:{response.Value.Data.StorageProfile.OSDisk.Name}");
foreach (var dataDisk in response.Value.Data.StorageProfile.DataDisks)
{
    Console.WriteLine($"データディスク:{dataDisk.Name}");
}

Console.ReadLine();

C# でホスト名から IP アドレスを取得する

Dns クラスを使えばホスト名から IP アドレスを取得できた。だいぶ前に試したときは、遅過ぎて使いものにならなかった記憶があるけど、さて今回はどうか。

using System;
using System.Diagnostics;
using System.Net;
using System.Threading.Tasks;

namespace DnsLookupSample
{
    internal class Program
    {
        static async Task Main(string[] args)
        {
            foreach (var hostName in args)
            {
                Console.WriteLine(hostName);

                {
                    Console.WriteLine(nameof(Dns.GetHostAddressesAsync));
                    var sw = Stopwatch.StartNew();
                    var addresses = await Dns.GetHostAddressesAsync(hostName);
                    sw.Stop();
                    foreach (var address in addresses)
                    {
                        Console.WriteLine(address);
                    }
                    Console.WriteLine($"{sw.ElapsedMilliseconds} ms");
                }

                {
                    Console.WriteLine(nameof(Dns.GetHostEntryAsync));
                    var sw = Stopwatch.StartNew();
                    var entry = await Dns.GetHostEntryAsync(hostName);
                    sw.Stop();
                    foreach (var address in entry.AddressList)
                    {
                        Console.WriteLine(address);
                    }
                    Console.WriteLine($"{sw.ElapsedMilliseconds} ms");
                }

                {
                    Console.WriteLine(nameof(Dns.GetHostAddresses));
                    var sw = Stopwatch.StartNew();
                    var addresses = Dns.GetHostAddresses(hostName);
                    sw.Stop();
                    foreach (var address in addresses)
                    {
                        Console.WriteLine(address);
                    }
                    Console.WriteLine($"{sw.ElapsedMilliseconds} ms");
                }

                {
                    Console.WriteLine(nameof(Dns.GetHostEntry));
                    var sw = Stopwatch.StartNew();
                    var entry = Dns.GetHostEntry(hostName);
                    sw.Stop();
                    foreach (var address in entry.AddressList)
                    {
                        Console.WriteLine(address);
                    }
                    Console.WriteLine($"{sw.ElapsedMilliseconds} ms");
                }
            }

            Console.WriteLine("Enter で終了");
            Console.ReadLine();
        }
    }
}

.NET Framework 4.8 での実行結果。

今回試したら 200ms かからなかった。こんなに速かったっけ?当時はネットワークが不調だったんかな…。今回使う予定のツールなら 200ms で充分。NuGet でパッケージ探さずに済みそうだ。

ヌワラエリヤ

赤坂のけやき通りの入り口にある、「ヌワラエリヤ」に行ってきた。ここはスリランカカレーの店で、あのツナパハグループ。ランチならスリランカカレーとかカレーヌードルに、サラダとドリンクと、あとアイスがついてお得ってことで、ランチタイムに行ってきた。

久しぶりにスリランカカレーを注文。最初にサラダが運ばれてきたけど、ツナパハで学習したので、まだサラダには手をつけない。スリランカカレーが来るまで待機。

スリランカカレーは、辛味がガツっと来るカレールー、自分が普段食べている欧風カレーとは辛さが一段二段上のレベルだ。一口二口と食べ進めていくと、額に汗が滲んで、体も汗ばんできた。それが不快には感じではないので、夏にカレーを食べたがる人の気持ちもわかる。具はシンプルにチキンとナスとコーン。ご飯とルーだけじゃ舌が耐えきれないんで、サラダで舌を休めたり、ナスやコーンで辛味をマイルドにしたり。工夫して食べ進めれば、そんなに辛さに耐性があるわけではない自分でも、美味しくいただけた。

食後には、デザートのヨーグルトアイスとアイスティ。ヨーグルトアイスがピリピリした口の中をいい感じにマイルドにしてくれてた。バニラアイスじゃなくてヨーグルトアイスのさっぱりじゃないとダメ。スリランカカレーにはヨーグルトアイス。ツナパハも同じだったな。

東方遊酒菜 ヌワラエリヤ
〒810-0042 福岡県福岡市中央区赤坂1-1-5 鶴田けやきビル2F
2,000円(平均)2,000円(ランチ平均)
r.gnavi.co.jp