いものやま。

雑多な知識の寄せ集め

OOC2024の発表を見てみた。(その1)

Object-Oriented Conference 2024 (OOC2024)が3/24(日)に開催されたんだけど、そのときの動画がアップされてきてる。

それらの中からいくつか気になるものをピックアップして感想とか補足を書いてみたい。

まず取り上げたいのはミノ駆動さんの『クソコード動画「カプセル化 Mk-II」で考える、上手くカプセル化できない理由』。

「目的」と「手段」

動画が相変わらずオモロイんだけど、発表の肝になってるのは動画そのものではなく、「目的」と「手段」について言及して、その関係について議論しているところだと思う。

プログラミングというのは手段を提供するものなので、目的について考えなかったり、目的と手段をごっちゃにしがち。 そうすると「間違ったDRY」で「手段が同じなんだからコードを共通化しよう」みたいになって、動画のように「複数の目的があるのに手段が1つしか提供されてない」状況が発生して、カプセル化が壊れる、と。 目的が違うなら手段も分けた方がよくて、そうするとカプセル化が壊れにくい、と。

元々の「カプセル化」の動画は「属性をプライベートにしてgetterとsetterを作るのがカプセル化と勘違いしてる人がいるよね」という内容だった。

今回の動画は「カプセル化するとして、そのときに間違ったDRYしないようにしよう」という内容と言えそう。 なので裏のテーマは「間違ったDRY」な気がする。

DRYはよく言われる原則だけど、間違って使ってしまうことが多い原則でもある。 目的が違うのに現状の実装が同じだからと共通化してしまうと、あとで苦労することが多いのよね。 DRYするときは「目的が同じか」に気をつけた方がいい。 これはカプセル化と関係なく言えることだったりする。

「インタフェース」と「実装」

この「『目的』と『手段』をちゃんと分けて考えよう」というのは「『インタフェース』と『実装』をちゃんと分けて考えよう」という話につながってくる。

「インタフェース」というのはモジュールを外から眺めた姿で、そのモジュールが「何(What)を提供するのか」という「目的」を規定するものとなっている。 一方、「実装」はモジュールを内側から眺めた姿で、そのモジュールが「どうやって(How)目的を達成するのか」という「手段」を提供するものとなっている。

そう考えると「目的」と「手段」の「N対N対応」についても分かりやすい。

動画では「複数の目的に対して1つの手段で頑張るのはよくない」と言ってたわけだけど、これは複数のインタフェースに対する実装を1つのコードで頑張ろうとしてるわけだから、そりゃ大変となる。 そして「目的ごとに手段を用意しよう」というのは、インタフェースごとに実装を用意しようということになるので、素直な実装と言える。 さらに動画では言及されなかったけど、「1つの目的に対して複数の手段を用意する」というのも可能で、そうするとコードの柔軟性がぐっと上がることになる。 これがさらに進むと依存性の注入の話になってくる。

実装の再利用をどうするか

ところで、間違ったDRYはよくないものの、実装を再利用したいというのはよくある話で、そういったときにどうしたらいいのかも知っておくといい。

これは目的をより小さな目的に分割し、小さな目的に使える実装を提供して、処理を委譲する。 目的は小さく分けると汎用的な目的になるので、それを提供する実装も汎用的になり、再利用しやすくなる。

たとえば電子レンジの例を考えてみると、「食べ物を温める」という機能自体は電子レンジが提供するものの、そのためには「時間を測る」「電圧を上げる」「電磁波を発生させる」といったサブの機能が必要で、それらはモジュール化された機器を使うことになる。 そういったモジュール化された機器は電子レンジ以外の家電にも使えるわけよね。 さらにそういったモジュールもさらに小さなモジュールの集まりで構成されてるわけで。

そんな感じで、単純だけどちゃんと動く部品をまず作り、それらを段階的に組み合わせて創発的に機能を作っていくといいんよね。 まさにオブジェクト指向という感じ。

今日はここまで!

技術書典16オフラインにサークル参加してきた。

だいぶ時間が経ってしまったけど、5/26(日)に開かれた技術書典16オフラインにサークル「いもあらい。」として参加してきた。

技術書典16オフライン

出店の様子

今回は当日までの準備が遅れて朝がドタバタで大変だった。

サークル入場開始が9:30で、できるだけ早く入場してほしいという話もあり、家を早めに出る必要があったんだけど、荷造りや告知もできてない状態で、朝起きてから急いでやったり。

(当日朝の7:30頃に告知ページ作ってる・・・)

まぁそんな感じで大変だったけど、無事会場に到着し、準備ができてしまえば落ち着いたもの。 そのあとはいつも通りな感じだった。

出店の様子

新刊の話

さて、今回どうしてこんなに準備がドタバタになったかというと、新刊が全然間に合わなかったから。

TeX言語について調べるのに時間がかかって、執筆の目処が立ってリポジトリを作ったのが5/20(月)、そこからドドドっと書いてなんとか推敲前の状態に持っていけたのがイベント前日の5/25(土)といった具合。 本当にギリギリだった。

今回は見本としてコピー本を用意したんだけど、以前に手作りで製本した経験がちょっと活きた。

印刷する前にPDFのページ順を入れ替えておくのが肝なんよね。

内容としてはTeX組版ではなくプログラミング言語として使ってみようというもの。 TeXについて説明された本の多くは、組版の話とプログラミングの話がごっちゃになってて、しかも雑然とした順序で説明されてたりするので、かなり分かりにくい。 そこをプログラミングの話だけに絞って、かつ説明を前から順に読んでいけば分かるように整えたので、比較的分かりやすくできたと思う。 まぁそれでも難しいのがTeX言語の困ったところなんだけど。

推敲したものも6/4(火)にアップロードしていて、今日6/9(日)まで技術書典16オンラインで購入できるので、気になった人は手に取ってみてほしい。

(一応、会期後も電子版は購入可能で、BOOTHでも頒布予定)

今日はここまで!

TeX言語で遊んでみた。

技書博10で配ったフリーペーパーの内容をブログにも書いておく。

 \TeX = 組版

 \TeXといえば普通は組版を思い浮かべると思う。

けど \TeXが実際にやっているのは一列に並んだトークン(≒命令)を順に処理しているだけだったりする。 組版できるのはそういった命令の中に組版用のものがあり、その命令が処理された結果にすぎない。

なので \TeX組版以外で使うこともできる。

Hello, TeX.

まずはプログラムの基本の「Hello, world.」から。

% hello.tex
% 入出力用のマクロ(≒関数)
\def\ReadStdin#1{{\endlinechar=-1 \global\read0 to#1}}
\def\WriteStdout#1{\immediate\write0{#1}}

\ReadStdin\Name     % 入力を求めて\Nameに代入
\WriteStdout{Hello, \Name.}     % 出力

\end

これを実行すると次のようになる:

$ luatex --halt-on-error hello.tex
...
\Name =TeX
Hello, TeX.
...

\Name =と入力を求められるのでTeXと入力すると、それが使われてHello, TeX.と表示される (そして組版の命令はないので組版はされない)。

計算

整数変数(レジスタ)を用意して四則演算もできる。

% calc.tex;入出力用のマクロは省略

\ReadStdin\Input
\newcount \Value    % 整数変数
\Value = \Input     % 入力を代入

\multiply\Value by 2    % \Value *= 2
\WriteStdout{Value * 2: \number\Value}

\advance\Value by -3    % \Value += -3
\WriteStdout{Value * 2 - 3: \number\Value}

\divide\Value by 4      % \Value /= 4
\WriteStdout{(Value * 2 - 3) / 4: \number\Value}

\end

実行例は以下:

$ luatex --halt-on-error calc.tex
...
\Input =42
Value * 2: 84
Value * 2 - 3: 81
(Value * 2 - 3) / 4: 20
...

ちゃんと計算できてるのが分かると思う。

条件分岐と繰り返し

条件分岐と繰り返しだってできる。 繰り返しはマクロを再帰的に展開するので関数型っぽい。

% fibonacci.tex;入出力用のマクロは省略

\ReadStdin\Input
\chardef\Count = \Input     % 繰り返し回数

\newcount \I 
\newcount \Value

\def\Fibo(#1,#2,#3){% 今の回数, 前の数, 今の数
    \ifnum #1<\Count
        \WriteStdout{#3}
        \I = #1  \advance\I by 1
        \Value = #3  \advance\Value by #2
        \edef\Next{\noexpand\Fibo(\number\I,#3,\number\Value)}
    \else
        \edef\Next{\relax}
    \fi
    \Next}

\Fibo(0,0,1)
\end

これを実行すると1, 1, 2, 3, 5, 8, 13, ...とフィボナッチ数列が出力されるので試してみてほしい。

Goodbye, TeX!

ただ見ての通りかなりクセが強くて扱いづらい。 命令が一列に並んでるのを順に処理してるだけなので感覚としてはアセンブラに近いかも。 書くのも大変だし、それ以上に読むのが大変。 組版したいだけなのにね。

ということで。

 \TeXグッバイしたい!


今日はここまで!

技書博10にサークル参加してきた。

5/12(日)に第十回技術書同人誌博覧会にサークル「いもあらい。」として参加してきた。

技書博10

イベントの様子

技書博はいつも通りという感じで、人が大量に押し寄せるというわけでもなく、まったり進行。

出店の様子

今回は新刊が用意できなかったのでフリーペーパーだけ。  \TeX言語のことを少し書いたので、これはあとで記事で紹介したい。

そして今回の頒布で『オブジェクト・ウォーズ』の紙版はなんとか完売した。 いろんな方に手に取ってもらえたので嬉しいね。

今回は新刊もなかったということもあり、前回試したアンケートは実施せず。 でもそうするとやっぱり足を止めてくれる方は少ない感じがした。 アンケート、重要そう。

そういう意味で、斜め向かいのサークルさんが『推し組版技術』というアンケートをしてたのが興味深かった(終了時に写真を撮らせてもらった)。

『推し組版技術』アンケート

けっこうな方が足を止めてアンケートに回答してて、やっぱりフックとして強力よね。

Vivliostyleがやっぱりいいよなというのがあるけど、実際のサークルさんとしてはRe:VIEWを使ってるところも多いみたい。 あと \TeXはなんだかんだ昔から使ってる人がいて、それで票を集めてたみたい。

あとは今回のイベントもお昼ご飯が出たので嬉しかった。

無料配布のお昼ご飯

そして今回は10回目という節目だったこともあり、なんと樽酒がw

樽酒の祭壇w

バールのようなものでこじ開けていく

懇親会に出れなかったので飲めなかったけど、いやー、すごいねw

あと、初回と中止になった回を除いてサークル参加したということで、準皆勤賞で表彰してもらえた。

事前に伝えられてなかったのでビックリしたけど、こうして表彰してもらえるのはやっぱり嬉しい。 今後もアウトプットを続けていきたいね。

今日はここまで!

上牧温泉でまったりしてきた。(その3)

前回の続き。

矢木沢ダム

須田貝ダムをあとにして矢木沢ダムへ。

と思ったら、なんかダム管理用道路となっていて関係者以外立ち入り禁止の文字が。 これは入っていっても大丈夫なのかな?と心配になったんだけど、大丈夫そうね。 冬の期間とか夜とかは通れなくなる感じっぽい。

この管理用道路がけっこう長かったんだけど、右手にキレイな洞元湖を眺めながら進む感じでけっこういい。

そんなこんなで矢木沢ダムに到着。

矢木沢ダム

アーチ式のコンクリートダムを見たのは初めてかも。

奥利根湖と山々が広がる

放流用の水路

正面にあるイメージだったけど端の方にあるのね。

矢木沢ダムからの眺め

標高があって天気も悪かったりで、寒く感じたり。 このあと小雨も降り始めたし。

奈良俣ダム

管理用道路を戻っていったあとは湯の小屋温泉を通って奈良俣ダムへ。

その向かう途中でちょうど奈良俣ダムが放流してるのを見れた。

奈良俣ダムの放流!

いやー、これは運がよかった気がするw

奈良俣ダム

奈良俣ダムロックフィルダムで岩を組み上げたような感じになってる。 本当にゴツゴツの岩が積み重ねられてる感じなのね。

奈良俣ダムからの眺め

奈良俣湖

ダムの上から眺めた放流

考えてみると、ダム4つを回って重力式コンクリートダム、アーチ式コンクリートダム、ロックフィルダムと3種類のダムを見れたので、かなりお得な感じあるよね。

らーめん武尊

この日のお昼は宝川温泉の近くにある「らーめん武尊(ほたか)」へ。

宝川温泉に行くときにいつも見かけてて、でもお昼は大体宝川温泉で食べてたので、いつか食べてみたいなと思ってたラーメン屋。

行ったのが遅かったのでいくつかのラーメンは品切れで、野菜塩ラーメンを頼んでみた。

野菜塩ラーメン

たっぷりな感じで美味しかった。 麺がちょっと変わっててソーメンみたいな印象だったかな(うろ覚え)。

宝川温泉

帰りとなる4日目、5/2(木)は、宿をチェックアウトしたあとに宝川温泉へ。

この日は天気もよくて車を走らせていて気持ちよかった。

宿の駐車場からの眺め

天気がよくていい眺め

宝川温泉へ向かう橋

橋から眺めた利根川

宝川温泉

宝川温泉はやっぱりいいね。 以前はアブがちょっとやばかったときもあったけど、今回はそんなこともなく。 川を涼しい風が降りてくるので、温泉で温まったあとに川風で涼んでというのが最高に気持ちよかった。

ただちょっと変わってたところもあって、ご飯の提供はなくなってた。 ここで焼魚の定食を食べたかったんだけどなぁ。

藤原湖

河原で咲いてた桜

アップで

キレイな河原

GRILL&CAFE BAR -Minakami-

宝川温泉から戻ってきて、お昼をどうしようかと思ったんだけど、道の駅の近くによさげなお店があったので入ってみた。

https://thecampfire.jp/restrantbar-minakami/:embd

ハンバーグのセットを注文。

ハンバーグセット

切ってみると透明な肉汁が出てきていい感じ。 美味しかった。

肉汁溢れるいいハンバーグ

あとは道の駅でお土産を買ったりして帰路へ。

利根川のキレイな流れ


そんな感じで温泉とたっぷりの自然、お肉、あとダムを満喫してきた。 いい旅行だったなぁ。

今日はここまで!

上牧温泉でまったりしてきた。(その2)

前回は宿の話。

基本的には宿で温泉と食事を楽しみながらまったりと過ごしてたんだけど、少し出かけたりもしたのでその話を書きたい。

雨ニモマケズ

初日の4/29(月・祝)、13時ちょっと過ぎに水上に到着して、まず向かったのが「雨ニモマケズ」。

雨ニモマケズ

ここはめんつゆで食べる豚しゃぶのお店で、前にも来たことがあって、そのときにとても美味しかったのでまた来たいとずっと思っていたところ。 正直これをまた食べたくて水上に来たまである。

ランチのラストオーダーが13時半でけっこうギリギリだったんだけど、無事間に合ったのでよかった。

注文したのは前回と同じで3種食べ比べセット。

3種食べ比べセット

いやー、やっぱり美味しかった。 食べれてよかったなぁ。

ちなみにランチでトンテキもあってそっちも気になった。 ただ火・水はディナーのみ、木はお休みということで、食べる機会がなく。 うまく都合つけて食べてみたいよなぁ。

みなかみ町水紀行館

お昼を食べたあとは道の駅「みなかみ町水紀行館」へ。

ちょうど山桜が咲いててよかった。 足湯もいい感じだったしね。

桜と足湯

足湯気持ちよかった

足湯からの風景

天気はそんなによくなかったけど、景色がやっぱりよくていいよね。

利根川の水がキレイ

ラフティング気持ちよさそう

上牧散策

2日目の4/30(火)は上牧を少し散策。

ツツジと橋

橋から眺めた利根川

リンゴ園では花が満開だった。

リンゴ園

リンゴの花がキレイ

阿部りんご園

アップルパイとアイスコーヒー

このアップルパイも美味しかった。 持ち帰りもできたので最終日に立ち寄ってお土産として買っていったり。

上牧駅から大峰館へ向かう橋

この先に潰れてしまったホテルニュー上牧もあって、ちょっと覗いてみたけど中の様子は全然分からなかった。

藤原ダム

3日目の5/1(水)は水上のダム巡りをしてみた。

まず向かったのは藤原ダム。 ここは宝川温泉に向かう途中で通るので何度か行ったことがある。

藤原ダム

近くから

ダム湖がキレイ

以前はダムカードの配布を中止してたんだけど、今回は無事ゲットできた。

須田貝ダム

続いて矢木沢ダムに向かおうとしてたんだけど、途中で須田貝(すだがい)ダムがあったので立ち寄ってみた。

須田貝ダム

ここのダムカードはここでは配布してなくて、ダムに行ったことが分かる写真(つまり上の写真)を撮っておいて、みなかみ町水紀行館で見せることでもらえた。


長くなったので一旦区切り。

今日はここまで!

上牧温泉でまったりしてきた。(その1)

ゴールデンウィークということで3連休とって4/29(月・祝)〜5/2(木)に3泊4日で群馬の上牧温泉に行ってきた。

大峰館

今回お世話になったのは大峰館(おおみねかん)。

ここには日帰り温泉で一度来たことがあって、露天風呂がとてもよかったのを覚えてる。

ちなみに、去年行った館山やお正月に行った水戸もよかったのでどこに行こうか迷ったんだけど、日頃の疲れを癒すならサウナよりやっぱり温泉かなと思い、上牧に決めた。 ちょっと風呂に入りたいなと思ったときにいつでも温泉入れるのはやっぱり魅力的よね。

さて、4/29は自宅を10時半頃に出発し、車を3時間弱走らせて無事水上に到着。 お昼を食べて少し散策したあと、予定通りに15時頃に大峰館に到着した。

大峰館の入口

大峰館

そうそう、水上は山の方ということもあってか、ちょうど山桜が見頃を迎えている感じだった。 いろんなところで花が咲いててとてもよかったなぁ。

チェックインを済ませたら部屋へ。

部屋

部屋は本館のトイレのある部屋。

古さはあるものの設備はちゃんと整ってて、とても過ごしやすかった。 自分が泊まった部屋はけっこう広くて、4〜5人は楽に泊まれそうだったかな。 旅館によくある「あの空間」はなかったけどw

部屋では基本ゴロゴロして積読してた本やマンガを消化してた。 眠くなったら軽く寝たり、お風呂行きたくなったら温泉入ったりと、まさに湯治って感じ。

自然豊かで、外から聞こえてくる鳥や蛙の鳴き声が心地よかったなぁ。 音楽流せるようにスピーカーを持ってったりもしてたんだけど、結局使わなかった。

ちなみにWiFiもちゃんと飛んでてネットにも繋がった。 ちょっと回線速度は遅い気もしたけど、配信見れるくらいには大丈夫だった。 将棋ウォーズしようとするとさすがに遅延が気になったけど。

一応、少し残念だったことも書いておくと、自分の泊まった部屋だと窓が山側で眺めはちょっと悪かったかなぁ。 新館は窓が谷側にあると思うので、眺めもよさそうな気がする。 ということで次は新館の部屋にも泊まってみたいな。

風呂

お風呂は新館の方へ移動して階段を降りたところにある。

前に日帰り温泉で入ったときも思ったけど、やっぱりいい温泉。 こじんまりした露天風呂なんだけど、風情があってとてもいいんよね。

腰掛けるのにちょうどいい感じの石もあって、十分に温まったらそこに腰掛けて休憩もできたり。 繰り返すことで体の芯から温まってコリもほぐれる気がした。

お風呂を出たところには冷やした温泉も置いてあって、飲めるようになってたり。 ほのかな香りがするので苦手な人もいるかと思うけど、冷えてて飲むと気持ちいい。

入りたいと思ったときにいつでもすぐ入れるのもよくて、1日に4, 5回は入ったかなぁ。 1, 2回だけ他のお客さんがいたりというのはあったけど、基本貸切状態だったし。 贅沢だったなぁ。

料理

食事は朝夕の2食が出るプラン。

夕食はメインが上州牛の石焼で、おかずもいろいろ。

ある日の夕食

上州牛の石焼

この牛さんの美味しいこと。 あと写真にはないけど別の日に出てた岩魚の塩焼きとかも美味しかったなぁ。

朝食はおひつに入ったご飯に湯豆腐、そしておかずという感じ。

ある日の朝食

ご飯はお茶碗2杯分はあってたっぷりという感じ。 美味しくてとてもよかった。


宿ではそんな感じで、基本はゴロゴロしてたんだけど、少し出かけたりもしたので、それについては次に書きたい。

今日はここまで!