ラムダ式がよくわからない。

「Java8で導入された新しい文法。ローカルクラスと無名クラスを利用して記述する内容を省略して処理記述を簡潔にする。」ということだが、そもそも無名クラスもよくわからない(笑)。そんなものを使わなくてもなんとかなってきたからな。

無名クラス(匿名クラス / Anonymous Class)とは「名前を持たない使い捨てのクラスのことです。」と言われても、なんで無名クラスを使わないといけないのか、その状況がパッと頭に浮かばない。
多分、無名クラス(からさらに発展してラムダ式)を使った方がすっきりしたコードが書けるんだろうが、無名クラスでの処理が唯一の解ではないので、上に書いたように「別の書き方」で凌いできたのが俺である(笑)

ラムダ式はインターフェース(関数型インターフェース)を実装したオブジェクトを生成するもの。「ラムダ式を、関数型インターフェースの型として扱う」という言い方もあるようだが、「インタフェースの実装」の方が俺的にはしっくりくる。

インターフェースはわかる。標準インタフェースはよく使うし。
インタフェースとは「クラスが持つべき『メソッドの型(名前、引数、戻り値)』だけを定義した設計図のようなもの」である。

ラムダ式は「抽象メソッドが 1つだけ」のインタフェースの「その 1つだけの抽象メソッドを規定して」実装するものだ。

また新しい言葉が出てきたぞ。「抽象メソッド」とは「中身の無い名前だけのメソッド」だ。

例えば、以下のようなインタフェース。

interface Greeting {
    void sayHello();
}

sayHello が「抽象メソッド」である。「引数の無い、戻り値もない sayHello という名前のメソッド」が存在しているだけのインタフェースが。
これを実装するラムダ式が、

Greeting greeting = () -> System.out.println("こんにちは!");

となる。

greeting というのが、このラムダ式の変数名である。
()というのは引数がないということ。Greeting インタフェースの sayHello メソッドには引数がないからな。

System.out.println("こんにちは!"); というのが、sayHello という「中身の無いメソッド」に与える「中身」である。sayHello メソッドは「こんにちは!」という文字列を標準出力に出力する処理であると規定している。

これでこのラムダ式の変数 greeting に、上記内容のメソッド sayHello が設定される。なのでこの変数.メソッドを

greeting.sayHello();

このように書いてやれば、標準出力(画面など)に「こんにちわ!」という文字列が表示される。

引数、戻り値がある例だと、

public interface BiFunction<T, U, R> {
    R apply(T t, U u);
}

こういう「2つの引数(T型, U型)を受け取り、R型の結果を返す抽象メソッド apply」を実装するラムダ式は、例えば

BiFunction<String, Integer, Integer> stringAdder = (strNum, num) -> {
    return Integer.parseInt(strNum) + num;
};

このようになる。引数として文字列と数値を渡して、引数の文字列を数値変換(Integer.parseInt(strNum))して引数の数値と足し、数値の戻り値を返すラムダ式だ。

これで、stringAdder という変数に実装した apply メソッドを

int sum = stringAdder.apply("100", 50);

このようにして呼べば、変数 sum には 150 がセットされる。

おお、なんかラムダ式わかってきたぞ。なるほど、なるほど。

無名クラスで書くと

BiFunction<String, Integer, Integer> stringAdder = new BiFunction<String, Integer, Integer>() {
    @Override
    public Integer apply(String strNum, Integer num) {
        return Integer.parseInt(strNum) + num;
    }
};

こうなるので、確かにラムダ式の方がすっきりはするな。

ちなみに <T> だ <R> という引数は、ジェネリクス(Generics / 型引数)というもの。俺は C#.NET の開発のときに初めて遭遇したが、ほんま最初は「何、これ?」だったな(笑)
引数や戻り値の型を指定しないインタフェースで使われる仮の名前だ。<T>じゃなく<X>とか<Z>って書いても良い。仮の名前だから。でも、まあ、<T>が一般的な引数の仮の名前、<R>は戻り値の仮の名前絵として使われることが多い。

BiFunction<T, U, R> というのは、引数<T><U>と戻り値<R>の型はなんでもいいので、呼ぶとき指定してねってことである。

ラムダ式の勉強をするだけで、色々な勉強ができるな(笑)
もう一ヶ月以上前の話だが、7/8(水)、土橋のお客さんのところで夕方から作業があった。それが無事終わったので、飲み友のN◎を呼び出し十日市の「カープ鳥きのした 十日市店」へ。土橋から歩いていける場所なんでね。

20260708_kinoshita1.jpeg
「カープ鳥きのした」は以前から行きたかった店だが「本物のカープファン」がいそうで怖くて一人ではなかなか入れなかったのだ。なにせ「なんちゃってカープファン」なもんで(^^;;;。迂闊なことを言うと怒られそうじゃん(^^;;;
というわけで、同じ「なんちゃってカープファン」のN◎を伴いいざ入店。

いやあ、怖がる必要はなかったよ(笑)。常連っぽい人もいたけど、酒呑みながら楽しそうにカープ中継を観ているだけだった。なにより、あのカープのレジェンドである「パンチョ」ことヒゲの木下富雄氏がニコニコ笑顔でビールを運んで来てくれるのだ。カープファンとしてこれほどの幸せはあろうか(笑)

店員さんも皆明るくて良いね。この日は若い女の子のスタッフが考えた「天ぷら」がメニューに入ったばかりだったようで、俺が日本酒のアテに天ぷらを注文したらその子が「やったー!!」って(笑)。可愛いので思わずその後も追加で天ぷら頼んじゃったよ。

この日のカープは二番手の鈴木がロングリリーフ。圧巻の投球でヤクルトを 2回から 6回までゼロに抑えて見応え十分。カープは 4回に同点に追いつくのだが、三番手の遠藤が 2点取られて再びリードを許す。しかしその裏に「俺のファビアン」が同点の 2ランホームランを!!
スタンドに球が入った瞬間に、両手を突き上げ「やった!!」と立ち上がってしまった(笑)。すっかりくつろいでたもんで(笑)

その後、ハーンがしっかり 8回を抑え、9回は森浦。よし!森浦を応援するために「森浦」を注文するか!と(笑)。

カープ鳥は串の種類毎に選手の名前が付いているのだ。ピッチャーで言えば森下が「ピーマン肉詰め」、アドゥワが「笹身さび焼」、栗林が「牛タン」って感じ。だから、「笹身さび焼」が欲しければ「アドゥワ一本」って頼むのがカープ鳥のルールである(笑)

20260708_kinoshita2.jpeg
で、森浦は・・・とメニューを探すと・・・「白ネギか~」(^^;;;まあ、注文したけど。「森浦ひとつ」って(笑)。そのかいあって(?)、森浦はしっかり 9回表を無得点で抑えてくれた。

ちなみに、2回途中で足を怪我してベントに下がった玉村は「こんにゃく」である(笑)。

そして 9回裏。なんとモンテロが押出し四球を選んでカープはサヨナラ勝ちをしたのである。奇跡や!

そこまで見届けて俺達は店を出たのだが、その帰り際、パンチョさんに「一緒に写真いいですか?」とお願いすると「もちろん!」と快諾してくれた(笑)。ホントに良い人だなあ、パンチョ~

すっかり気分の良くなった俺は「明日、球場でヤクルト戦三連勝の瞬間を見ようぜ!」とN◎と約束して店をあとにしたのであった。その観戦が地獄になるとも知らず・・・(^^;;;
Quora なんかでよく中国ネタに回答している中国共産党のエージェントっぽい人(笑)が「天安門事件のことは中国人なら誰でも知っている。なぜなら、あれは国として正しい対応であり、隠さないといけないのような恥ずべき行動ではないからだ」なんて言ってるのを読んだことがあるんだけど・・・

この嘘つきめ!(笑)

天安門事件はしっかり中国でタブーです。そんなタブーがあることを日本人にあれこれ言われるのがいやで、中国共産党に従順な中国人や媚中の日本人が「天安門事件を中国政府は隠してない」と言うけど、俺、一回中国人の詐欺グループとメッセージのやり取りをしたときに、騙されたふりして「了解。すぐ振り込みます。天安門」って送ったら、なぜか「馬鹿はお前」という謎メッセージが送られてきて音信不通になったよ。

そして、これ。中国の AI モデル「DeepSeek」にチャットで「天安門」ネタを振った結果。

20260812_deepseek1.jpg

「申し訳ありませんが、その質問についてはお答えできません。」だって(笑)

そりゃ、自国の軍隊が自国の市民を共産党の命令で戦車で轢き殺したなんて話、(すでに世界中の人間が知ってることだけど)中国共産党としては否定し続けたいよな。というか、否定するのも嫌だから、知りません、なんですかそれ?で逃げ切りたい(笑)

結局まだまだ天安門ネタは対中国人の武器として使えるってことですね。
土橋のお客さんのところで作業をした帰りは「汁なし担々麺専門店 楽(らく)」で晩飯。

最近、汁なしの二郎インスパイア「森二郎」を食べることが多かったのだが、この日は普通の二郎インスパイア(まあ、普通というのもおかしいが。二郎系そのものが本家も含めてキチガイ料理だからな(笑))「楽二郎」を。

20260803_raku1.jpeg 20260803_raku2.jpeg 20260803_raku3.jpeg

細麺(ディフォルトで大盛りになる)、にんにく多めで注文。1,300円。ああ、けっこういい値段だねえ。ま、その価格に合う内容だと思うので文句はない。

ほれほれ、この見事なにんにくタワー

スープをすすると、追加された生にんにくで舌がぴりぴりする(笑)
食べてるうちにおろしたにんにくの粒たちがどんどん底にたまっていくので、最後まであの濃いスープを飲まざるを得ない。せっかく「多め」で頼んだにんにくを残していくなんてできない!(食品ロス削減!!)

ま、こんな食べ方をしているから身体はどんどん肥満度を増していくわけだが(笑)

そうして俺が幸せな時をすごしている間に、なんと広島市内は突然の雨に。けっこう激しく降っている。空も完全な曇天で、すぐに止むような気配もない。
折りたたみ傘を鞄の中に常備はしているが、風も雨も強い。俺は徒歩で横川まで帰るのは諦め、土橋電停から広電の電車に乗った。

一応「にんにく増しのラーメンを食ったあと」のエチケットとしてマスクはしたのだが、それでも二人ほど俺の口元を見て顔をしかめたやつがいた。失礼しちゃう!マナーがないなあ!!
7/22(水)。久しぶりの「竹乃屋 ミナモア店」。

20260722_takenoya1.jpeg
前回、お代が 2,500円ほどにな完全敗北してから何となく足が遠のいていたのだが、あのお気に入りの「親鶏ふりそで」と「焼さば串」が食べたくなって訪店。
今回はすでに「驛麺屋 BIGFRONTひろしま店」で生ビールとつまみ二皿をやって腹もこなれているからな。前回のような失敗はしないという自信を胸に、意気揚々と入店したのである。

立ち飲みカウンターに立つと、すぐに QR コードを読んで注文画面にアクセス。一杯目だけは店員に注文しないといけないので、注文を取りにきた女の子にジムビームハイボールと伝える。ただ、「早く親鶏、親鶏」と親鶏ふりそで串の注文を焦っていたので、スマホ画面に集中して女の子の方を一度も見ず。失礼な態度だったと反省。店と客は対等な立場だからな。

20260722_takenoya2.jpeg
ま、それはいいんだけど、なんとメニューから「親鶏ふりそで」が消えているではないか・・・マジか?
何度も何度も同じ画面をスクロールさせて確認するのだが、「親鶏ふりそで」の文字はどこにもない・・・

もうひとつのお気に入り「焼さば串」はあったので、とりあえず「とりもも梅肉串」「焼さば串」「生いわし串」を注文。生いわし串は初めて頼んでみたのだが、まあ、なかなかイケる。頭から腹にかけてはちょっと肉がふかふか柔らかすぎるんだが、しっぽの方は身も引き締まっており焼き魚の香ばしさもあって美味い。しかし、親鶏ふりそでの代わりになるほどではない・・・寂しい・・・

そんな寂寥感に苛まれた俺の心の隙間に入り込むように、店の女の子が「今、店で一押しなのが『カツオ白子ポン酢』なんですけど、注文しませんか?」と俺の横にやってきてささやく。そいつは親鶏ふりそでに代わって俺の心を満たしてくれるのだろうか?・・・俺はしばし悩んだ末「カツオ白子ポン酢」を注文したのであった。

20260722_takenoya3.jpeg
カツオの白子はけっこう歯ごたえがある。俺のイメージしていた「とろっとした感触」とは違う。それに白子と言えば濃厚な味を予想するが、なんともさっぱりした味であった。美味いけど、なんか思ってたんと違う・・・

しかも、俺にカツオ白子を勧めた女の子が飲み物を運んできてのだが、俺の前の白子を一瞥しただけで一言もなく帰っていく。「わぁ、私がすすめた白子を頼んでくれたんですねえ」くらいの反応はあるとおじさんは期待していたのに。その言葉で親鶏ふりそでを失った寂しさを埋めようと思ったのに・・・

その後、芋焼酎ハイボールを一杯、芋焼酎のお湯割りを二杯やったが全然酔えず・・・。またしばらく足が遠のくかもしれない・・・

お代は 1,500円ほど。勝った・・・リベンジは果たした。しかし俺の心には「喜び」の感情はまったく湧いてこなかった。
金曜日は午後休を取ったので、昼飯は紙屋町パセーラ地下の「中国麺飯店 万豚記(ワンツーチィ)」で「担々麺(赤)+肉めしセット」1,320円をチョイス。

20260807_wantsuti01.jpeg
本当は横川の「味億」で尾道ラーメンを食べようと思ってたんだけど、なんと金曜日が定休日だと判明(^^;;
「え?マジ?」とショックのあまりバスの中でちょっと失禁してしまったけど、そう言えばパセーラの地下にも尾道ラーメンの店が・・・いや、その隣に前から気になっていた担々麺が売りの中華屋があったなと思い出し紙屋町でバスを降りたのだった。

俺を含め2組待ちだったけど回転は意外に早くてすぐに入店できた。多分調理が追いつかないからか、席の三分の一ほどは使っていないようだった。実際、麺類はすぐ出てきたのだが、餃子は時間がかかっていた。

この店は黒担々麺が売りの店のようだが、黒って黒胡麻でしょ?あんま好きじゃないのよね(笑)。なので上記のように赤を選択。

その担々麺(赤)はさすがちゃんとした中華の店の料理。ちゃんと辛くてそこに複雑な香辛料の味が絡む。以前業務スーパーで買った鍋の素みたいな味や(そこまで辛くないけど(笑))

20260807_wantsuti02.jpeg
この店の味は気に入ったので、季節限定メニューの「冷やし黒胡麻担々麺」ってやつを今度試してみたいな。

「黒胡麻は嫌いって書いてるじゃん!」って?いや、正確には「あんま好きじゃないのよね」だ。決して好きではないのだけど、これはちょっと挑戦してみてもいいかなあと。「汁なし」じゃないんだけど、麺の半分くらいのところまでしか汁が入ってなくて・・・ああ、「冷やし中華」スタイルか。

なにせ段原勤務でなかなか紙屋町方面は帰宅途中に寄れる場所じゃないんだけど、そういえば職場から広島県庁までの無料のシャトルバスも出てるし、近々に再訪だ。

夏は誰もが痩せる季節なんだけど、俺はまだまだ太るよ!!応援して!!
Spring Boot 4 で作成したファイルダウンロード画面。「ダウンロード」ボタン押下で DB を読んで CSV ファイルを生成し、そのファイルがクライアントPCにダウンロードされる。

Controller はこんな感じ。

    // ボタン押下で実行される処理
    @PostMapping("/createFile")
    public ResponseEntity<Resource> downloadFile() throws Exception {
        Path path    = HogeService.make_file_path(); // ダウンロードされるファイルを作成するパス
        HogeService.logic_make(path.toString());     // ダウンロードファイルを作成

        Resource resource    = new FileSystemResource(path);

        HttpHeaders headers    = new HttpHeaders();
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"");
        headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, HttpHeaders.CONTENT_DISPOSITION);

        return ResponseEntity.ok()
                .contentType(getContentType(path))
                .contentLength(resource.contentLength())
                .headers(headers)
                .body(resource);
    }

    // ContentType の取得
    private MediaType getContentType(Path path) throws IOException {
        try {
            return MediaType.parseMediaType(Files.probeContentType(path));
        }
        catch (IOException e) {
            return MediaType.APPLICATION_OCTET_STREAM;
        }
    }

これで、例えば

    <form action="/createFile" method="post" id="form" name="form">
        <input type="submit" name="download-btn" class="btn-primary" id="download-btn" value="ダウンロード">

みたいな形にすれば、「ダウンロード」ボタン押下でブラウザのダウンロード窓が開いてダウンロードは行われる。

しかし、例えばダウンロードに失敗したときは Web 画面上にエラーメッセージを表示したいとか、成功したら画面に「正常にダウンロードできました」などと表示したい場合はこれではダメだ。

Controller の各メソッドで返却できる値は 1種類である。
上の例のようにデータ(ダウンロードファイル)を出力するか(ダウンロード)、HTML を出力するか(画面表示)、生のテキストや JSON データなどを出力するか(API など)・・・のいずれかひとつのことしかできない。
「先にファイルを出力して、その次に結果を伝える HTML を出力する」という二段構えの出力はできない。ファイルを出力すれば画面(HTML)は表示できないし、画面(HTML)を表示(出力)すればファイルは出力できない。

・・・が、ファイルダウンロードをして結果を Web 画面に表示したい要件ってあるよねえ。

そういうときは、直接ファイルダウンロードの画面を呼び出すのではなく、JavaScript の中でファイルダウンロード画面を呼び出し一旦ファイルを受信しするようにする。そして、そのデータをクライアントに出力し、その後画面の編集をすればいい。JavaScript で処理すれば「ファイル出力か HTML 画面表示かどちらかしかできない」なんて制限ないからね。

具体的には、↓こんな感じの JavaScript。

    document.getElementById('download-btn').addEventListener('click', async (e) => {

        e.preventDefault();

        const btn    = document.getElementById('download-btn');
        const errMesg = document.getElementById('error_msg');
        const sucMesg = document.getElementById('success_msg');

        errMesg.style.display = 'none';  // メッセージ非表示
        sucMesg.style.display = 'none';  // メッセージ非表示

        try {
            btn.disabled = true;  // ボタンが押されたら、二度押し防止のため非活性化

            // ダウンロード処理呼び出し
            const action_url    = /*[[@{/createFile}]]*/ '';
            const response = await fetch(action_url, {  // fetch(非同期通信(HTTPリクエスト))でダウンロードデータ取得
                method: 'POST'
            });

            if (!response.ok) {  // ダウンロード画面からデータが取れなければ例外発生
                throw new Error()
            }

            const blob = await response.blob();  // データをBlob(バイナリの塊)として取得

            const disposition  = response.headers.get('Content-Disposition') ;  // レスポンスヘッダーからファイル名取得
            let filename = 'download.csv';  // ファイル名が取れなかったときのディフォルト値

            if (disposition && disposition.indexOf('attachment'!== -1)) {
                const fileMatch        = /filename="?([^; \n"]*)"?/.exec(disposition);  // 正規表現でファイル名取得
                if (fileMatch && fileMatch[1]) {
                    filename    = fileMatch[1];
                }
            }

            const url  = window.URL.createObjectURL(blob);  // ダウンロード用の疑似リンク作成
            const a    = document.createElement('a');     // 疑似アンカータグ作成

            a.href     = url;  // アンカータグの href 属性に疑似URLを紐づける
            a.download = filename;  // アンカータグの download 属性にファイル名をセット
            document.body.appendChild(a);  // 作成した疑似アンカータグを一時的に(操作のため)実体化
            a.click();  // 実体化したアンカータグを画面の前の人間に代わってクリック(ダウンロードスタート)

            a.remove();  // もう必要ないのでアンカータグ削除
            window.URL.revokeObjectURL(url);  // メモリに残った疑似リンク(blobデータ含む)を削除

            btn.disabled = false;  // ボタン使用可能に
            sucMesg.textContent = "正常にダウンロードが終了しました。";
            sucMesg.style.display = 'block';  // メッセージをセットして表示

        }
        catch(error) {
            btn.disabled    = false;  // ボタン使用可能に
            errMesg.textContent = "ダウンロードに失敗しました。";
            errMesg.style.display = 'block';  // メッセージをセットして表示
        }
        finally {

        }
    });

ダウンロードボタンが押されたらイベントリスナーによりこの処理が実行される。
コメントに書いているとおり、JavaScript 内で(画面の前の人間には見えないところで)実際のダウンロード画面にアクセスしデータを取得。そのデータをダウンロードするための疑似リンクを作って、そのリンクに(画面の前の人に代わって)アクセスして画面の前の人のパソコンにデータがダウンロードされるという動き。

なんでこういうことをするかというと、JavaScript 内でダウンロードの成否を判断して処理を行うため。

ダウンロードに失敗したときは例外を発生させ「失敗」メッセージを表示。最後まで問題なく処理が終われば「正常」メッセージを表示・・・となる。(直接ブラウザでダウンロードをした場合は、成否の情報は画面(JavaScript)には伝わってこないので何もできない。)

Controller のファイルダウンロードのメソッド(上の例では downloadFile メソッド)を修正する必要はない。
CSV を読み込んで DB に登録している処理で、今は単純に INSERT を行っているのだが、それだとキーが重複したときに

Caused by: java.sql.BatchUpdateException: バッチ 0 INSERT INTO t_user_summary (
    user_id,
    user_name,
    user_address1,
    user_address2,
    user_phone_number,
    anniversary,
    note
) VALUES (
    ('1'::int8),
    ('MASA SHIMURA'),
    ('岩国市黄金町黄金1928-11'),
    (''),
    ('090-0000-1111(携帯)'),
    ('19650824'),
    ('誕生日(2回目)')
)
 はアボートしました: ERROR: 重複したキー値は一意制約"t_user_summary_pkey"違反となります
  詳細: キー (user_id, anniversary)=(1, 19650824) はすでに存在します。 このバッチの他のエラーは getNextException を呼び出すことで確認できます。

このように更新に失敗する。(このケースは、user_id が '1' で anniversary が '19650824' のデータがすでに存在している)

そこで、まず存在チェックを行って、存在していれば UPDATE、存在していなければ INSERT を行うようにしたい。
そのために、SELECT 処理を埋め込みたいが、Spring Batch の Chunk 方式の場合、どこにその処理を入れればきれいなのか?と Gemini に気いてみたら「SQL 直せばいいだけです」と言われた。

そうなん?いやあ、俺も、SQL をきちんと(専門書を買うなどして)一から勉強したことなくて・・・。長年の経験から相当複雑な SQL も組めるけど、あるステートメントのオプションなんかは知らないものもちょこちょこある。

Gemini が示した SQL の、

INSERT INTO t_user_summary (
                user_id,
                user_name,
                user_address1,
                user_address2,
                user_phone_number,
                anniversary,
                note
            ) VALUES (
                :user_id,
                :user_name,
                :user_address1,
                :user_address2,
                :user_phone_number,
                :anniversary,
                :note
            )
            ON CONFLICT (user_id, anniversary) DO UPDATE SET
                user_name = EXCLUDED.user_name,
                user_address1 = EXCLUDED.user_address1,
                user_address2 = EXCLUDED.user_address2,
                user_phone_number = EXCLUDED.user_phone_number,
                anniversary = EXCLUDED.anniversary,
                note = EXCLUDED.note

ON CONFLICT () DO もそうだし、EXCLUDED も何?って感じ(笑)

ON CONFLICT () DO は「キー重複時の動きを指定する PostgreSQL 独自の句(オプション)」なんじゃね(SQLite でも書き方は違うが使える)。EXCLUDED は「INSERT に失敗したデータが一時的に保管されている DB」を表すんだそうな。

もう、各 RDBMS 独自の構文になってくるとわけわからん(笑)。なもんで、この業界には「Oracle しか使えん」っていう Oracle 独自構文にどっぷり浸かって抜け出せない Oracle じいさんがたくさん存在してるけどな(笑)

というわけで、ItemWriter 内の SQL を上記に置き換え。

test01=> SELECT user_id, anniversary, note FROM t_user_summary WHERE
user_id=1 AND anniversary='19650824';
 user_id | anniversary |  note
---------+-------------+--------
       1 | 19650824    | 誕生日
(1 行)

が、

test01=> SELECT user_id, anniversary, note FROM t_user_summary WHERE
user_id=1 AND anniversary='19650824';
 user_id | anniversary |       note
---------+-------------+------------------
       1 | 19650824    | 誕生日(2回目)
(1 行)

と、ちゃんと更新されていてバッチグー(死語)であった。
週末も仕事って日が続いてて、この土曜日もやっぱり仕事だったんだけど、やっと日曜日オートバイに乗る時間ができた。午前中、親父の介護アパートに新聞を届けた足でそのまま川上から川越方面に愛機 DUCATI MONSTER S2R 1000 を走らせた。

結局、県道5号線(自動車は離合が大変な険道(けんどう)である)を美川町まで走り、「観音水車 でかまるくん」を観て帰った。行程往復60kmほどのプチツーリングである(笑)

20260802_dekamaru1.jpeg 20260802_dekamaru2.jpeg

「でかまるくん」・・・名前が(^^;;; もうちょいええ名前を考えりゃあええのに。地元の小学生に名前を公募した感じかな?

平成2年(1990年)に造られたというから(当時は「美川町の大水車」と呼んでたようだが)、もう 36年の歴史あり?でも、長い間周りの休憩所なども含め放置されてたみたい。

2年くらい前まで活動されていた美川町の地域おこし協力隊の人の SNS で復活までの苦労話を読んでいたので、ちゃんとぐるぐるまわるでっかい水車を眺めながら、「これがあの・・・」と若干感慨を抱く・・・

凄い坂なので、初心者ライダーはバイクを停めるときやUターン時に「立ちゴケ確率」78%くらいの場所だけど、直径12mの水車はなかなか迫力あるので、一度観てみてはどうでしょう?(立ちゴケしても責任はとりませんが(笑)
久しぶりのビアガーデン。

何年も前に一度岩国の人気のビアガーデンに某秘密結社のメンバーと行ったけど、それももう20年ぶりのビアガーデンって感じだったと思う。

お客さんのところの慰労会に参加させてもらって、その会場が「そごう屋上ビアガーデン 海の恵屋」だったのだ。
そごうのビアガーデン、行ったことあるけど 30数年前だな(笑)。まだビアガーデンやってたのか(笑)

20260731_sogo1.jpeg
20代のころはよくビアガーデン行ってたなあ。3,500円で飲み放題とかそんな感じだったよね。若い頃はガブガブ酒も飲んでたし(俺の若い頃は日本酒が不味くて(^^;、ビールオンリーだったけど(笑))、食う量も凄かったので余裕で元が取れてた気がするが、さすがに今は食べ放題・飲み放題にそんなに魅力を感じないお年頃になったので、ビアガーデンは選択支にはいることもなくなったよねえ・・・

いや、マジでこういう会でもないとなかなか機会がないんで、慰労会に誘っていただいたのはありがたかった。
外注の俺らにも補助金を出していただいたので、男性 5千円(ビアガーデンの値段も上がったなあ)のところが団体割引なども含め一人 1,800円で済んだのにで、元を取るために必死で飲み食いする必要もなく(笑)、ゆっくり落ち着いて飲み食いできました。

ビール&焼酎ソーダ割りを 7~8杯、料理を大皿に 3~4回おかわりしたくらいかな。
・・・5千円でも元取ってるな(笑)

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら