Magnolia Tech

いつもコードのことばかり考えている人のために。

Software Design 2023年2月号 特集「ドメイン駆動設計入門」と「ログの基本」の2本立てで凄い!

Software Design 2023年2月号、特集が「ドメイン駆動設計入門」と、「ログの基本」の2本立てなんですけど、どちらも凄く良い記事でした。

これは買った方がいいです!

ドメイン駆動設計入門

エヴァンスの「ドメイン駆動設計」で語られれていることをベースとして増田亨さんをはじめとする執筆陣による、とてもコンパクト、かつ分かりやすい解説が怒涛の密度で展開されます。この部分だけでも5000円くらいの価値が有るんじゃないでしょうか。

基本的な考えを把握する、という意味ではこの特集を読む以上に効率的な方法って無いんじゃないか、と思えるほどです。


あとは、この手の方法論を実際にコードに落とし込もうとすると、膨大な量の「こういう時はどうするの?」「原則通りにやるととても回りくどいけど、本当にそうするの?」「例外としてもいい境界線はどこ?」「例外として原則から外れる設計をどうやって後世に残す?」「そもそもこれを理解できる人材はいる?」「深いところまで理解しなくてもできるように、実際のドメインに合わせてパターン化するためにはどうすればいい?」みたいな、現実との戦いが待っているわけです。

そういう意味では設計方法論は、経験値から得られたノウハウを汎化して作られていくものなので、それ自体が「間違っている」ということは無いです。しかし、「向かないところへ適用しようとする」「設計方法論にとらわれて、肝心のビジネスと向き合っていない」みたいなアンチパターンが発生する可能性は有るので、そこは常に戒めていかないといけないんですよね。

レールを敷いておけば本質に集中できるぞ!と思ったら、目的を忘れて「レールから外れないこと(ルールを守っているか否か)」ばかりに関心が集中してしまった、ということは色々なところで起きてしまうのです。

今さら聞けないログの基本

Linuxのログの現代的な仕組み......journald導入以降の構成や、Webサーバのアクセスログの見方、アプリケーション側でログを出す方法まで、こちらもまず把握したいログの基本が全部載っています。この先にクラウド基盤のロギングの仕組みや、fluentdを使ったログ基盤の構築みたいなテーマが出てくると思いますが、まずはその手前で理解しないといけないことがコンパクトにまとまっているところがいいですね。

ここも5000円くらい払いたくなる価値があります。

ちょうどjournaldの仕組みを知りたいと思っていたところだったので、journaldと、rsyslogの連携方法がバシっと説明されていてタイムリーな特集でした。journaldが導入されてLinuxのログ周りの仕組みも以前とだいぶ変わっていましたので、以前の知識をアップデートするにはちょうど良いですね。

その他

環境の再構築中だったので、『最強の開発環境探求の道』が、「シェルをカスタマイズする」だったのもタイムリーでした。プロンプト、変えたくなりますよね。

ここ、3000円払ってもいいです


ということで、今月号、お値段の10倍以上の価値があって、マジでお買い得感が凄いので、今すぐ本屋へダッシュです。

ドメイン駆動設計について、興味が出てきたら、エヴァンス本を読むも良いし、特集を執筆された増田さんの本、あと、最近わだいの「ちょうぜつ本」を読むのもおすすめです。

Dockerを使ってSambaサーバを立てる

引き続きThinkCentre M75q Tiny Gen2上にインストールしたUbuntu Serverの環境構築を続けます。

blog.magnolia.tech

メインPCとファイルを共有するためにSambaでファイルサーバを立てることにします。

直接Ubuntu Server上でSambaサーバを立ててしまうと管理が面倒なのでDockerで立てることにします。

Sambaのイメージを選ぶ

ネットを検索するとdperson/sambaというイメージを使って構築する事例がよく出てきますが、残念ながらイメージの更新が止まっているようです。

他のイメージを探したところ、servercontainers/sambaというイメージが見つかりました。

GitHubリポジトリを見たところ、具体的なバージョンを指定するのではなく、定期的にAlpineのイメージを取得してインストールできたSambaのバージョンをもとに、複数のイメージをビルド・アップするところまでが自動化されており、常に最新バージョンがDocker Hubにアップされてます。

github.com

具体的な起動方法は、サンプルのdocker-compose.ymlが提供されているので、こちらをカスタマイズすればOKです。

github.com

環境変数にユーザーを指定しておけば勝手にOS側のユーザーも作り、Samba用の設定までやってくれます。便利ですね。

起動する

docker-compose.ymlをコピーしてきて、ユーザー、グループの指定と、ディレクトリやゲストの許可有無等を指定すれば準備OKです。

      GROUP_family: 1500

      ACCOUNT_alice: alipass
      UID_alice: 1000
      GROUPS_alice: family

      SAMBA_VOLUME_CONFIG_aliceonly: "[Alice Share]; path=/shares/alice; valid users = alice; guest ok = no; read only = no; browseable = yes"

    volumes:
      - ./shares/alice:/shares/alice

起動します。

$ sudo docker compose up

次ははバックアップ運用とか、監視とかを考えていきます。

ルータ側の設定でDHCPでUbuntu Serverに配布されるIPアドレスを固定化する

前回のエントリでは、ルータ側のDHCPの設定でIPアドレスを固定化しようとしたけど、上手くいかなかったので、Netplanを使って固定化する方法を調べた。

blog.magnolia.tech

今使っているルータは、MACアドレス指定でDHCPで配布されるIPアドレスを固定化する仕組みを提供しているけど、Ubuntu ServerではDHCPを使ってIPアドレスを取得する際のキーがMACアドレスではなく、DUIDを使っていることがわかった。

IPアドレスを指定するためには、Netplanの設定で、dhcp-identifierという項目に、macと指定する必要があった。

結果的に、設定はこれだけになった。

network:
  ethernets:
    device_ethernet:
      dhcp4: yes
      dhcp-identifier: mac
      wakeonlan: true
  version: 2

ちなみに、IPv6IPアドレスはSLAACという仕組みで、ルータからプリフィクスが配布される設定にしているので、dhcp6を有効にする必要はない。

使っているルータのDHCPの配布指定が20エントリまでしか使えないのがちょっと心許ない。あと、全然説明が足りなさ過ぎて、困った。

自宅ネットワークでもルータ側でIPアドレスの配布は集中管理したいよね。

ThinkCentre M75q Tiny Gen2で、Wake On LANを有効にする

UEFIのPOWERの設定を確認する

  • Enhanced Power Saving ModeDisabledになっていること

    現代のPCは、電源がオフになっている時でも多少の電力を消費するようになっているけど、それを最小化するための設定。 ただし、これがEnabledになっているとWake On LANは使えず、Wake On Alarmという日時指定の自動起動しか使えなくなる。

    また、これがEnabledになっていると、特定のポートに繋がったUSBキーボードからAlt+Pで電源をオンにするためのSmart Power Onも使えなくなる。

    Wake On LANを有効にするためには、まず項目がDisabledになっていることが条件。

  • Automatic Power OnWake On LANEnabledになっていること

    そのままの設定値だけど、続いて当然Wake On LANEnabledになっている必要がある。

    これでUEFIメニューの中の設定は終わり。

netplanの設定を確認する

  • netplanのEthernet用の設定に、wakeonlan: trueが含まれていること

    デフォルトがオフなので、明示的にtrueに設定しないと有効にならない。

なお、無線LAN側のインタフェースは設定しても反応しなかったので、残念ながらThinkCentre M75q Tiny Gen2は、無線LANによるWake on LANはサポートしていないようです。

スイッチングハブを買う……TP-Link LS105G

自宅サーバ構築用にPCを購入し。

blog.magnolia.tech

作業している部屋で使えるLANのポートが一つしかなく、有線LANと、無線LANのアクセスポイントが同時に利用できない。無線LANでもいいか……と思って作業を始めたけど、Ubuntuのインストールに異常に時間がかかるし、起動のたびに無線LANの接続に数分余計にかかるし、そもそもクライアントPCからのSSHが気持ち悪い遅延が発生して使い物にならない……

さっさと一番安いスイッチングハブを買ってきて接続。


手元の間に合わせだったので一番安い1Gbp対応のものを選ぶだけかなーと思ったけど、実際に買おうとすると選択肢も多いので、小一時間悩んでしまった。

  • 通信速度(1Gbps、2.5Gbps、10Gbps)……さすがに100Mbpsは無し
  • ポート数(たいてい家庭用は5か、8)
  • 金属筐体か、プラスチック筐体か
  • 電源内蔵か、ACアダプタか
  • POE+対応か
  • 筐体の大きさ
  • 保証

くらいが考慮事項か。このくらいのレベルだと電源内蔵モデルが少ないけど、絶対にACアダプタとの組み合わせが分からなくなるから迷ったけど、ちょっと高めだったので今回は見送り。あとPOE+に対していると今使っているMeraki GoのアクセスポイントのACアダプタが不要になって見栄えが良くなる…とか考えたけど、それはまた別途最終構成を考えてから…ということで、売り場で一番安かったTP-Linkの製品を購入。

物理Linuxサーバ構築用にThinkCentre M75q Tiny Gen2を購入

普段、メインで使っているPCがMacBook Air 2018なので、さすがにDockerでコンテナをたくさん立ち上げたまま、ブラウザで調べ物する、みたいな使い方が辛くなってきた。夏場はファンも凄い回っちゃうし、レスポンスはすごく悪くなるし。

メインPCを買い替えようかとも思ったけど、ブラウザを使うくらいの作業なら特に不満は無い。それにそもそもメインPCでLinuxが動いている必然性も無いし、画面も要らないのでサブPCとしてデスクトップPCを用意して、Linuxをインストールする方に方向に転換。


部屋に大きなデスクトップが有るとサイズ的に圧迫感が有るし、複数のマシンのファンの音が同時に鳴るのは苦手なので(データセンタではないので...)、作業している場所から離れた所の隙間に設置できるような、1リットルサイズの小型PCを探すことにした。

Amazonとかで探すと色々と出てくるけど、それなりのスペックを求めると(当たり前だけど)それなりに高くて、10万円に近づいていく。サブPCにそこまで使うのもなーと思って、中古を見てみると古い世代であればたくさん出回っているけど、決め手に欠けるものばかりで、さっさと買う、というモードにならず。

そういえば一時期「lenovoAMD搭載ThinkCentre Tiny」が安い、みたいな記事がたくさん出回っていたことを思い出して最新の価格を調べてみると...円安のせいか、数ヶ月の間にだいぶ値段が上がっている......そもそも即納モデル以外はどれも納期が3ヶ月後とかで、ちょっと手がでない。待っている間に新製品が出そう。

そこでlenovoのアウトレットストアを見てみると、割と常時開封後返品されたマシンを整備品として、リーズナブルな価格で販売していた。

www.lenovo.com

ただし、1リットルサイズのTinyモデルはほとんどない。普通のデスクトップモデルならいつでも有るけど……と思っていたら、年明けにAMD搭載ThinkCentreのTinyモデルが安く売られていたのですぐに購入。販売数が少ないので、すぐに売り切れていた。タイミングが良かった。

スペック的には即納モデルと同じみたいで、CPUがAMD Ryzen 5 PRO 5650GE、メモリ8GB、SSD256GB。Wi-Fiもある。あとは一応キーボード、マウス、スタンドも付いてきた、使わないけど。

価格は新品より2万円安く、ちょっと前の新品の価格をちょっと下回るくらい。

実際にに届いた物をチェックしたけど、特に使用感も全然無くて普通に新品と見分けがつかなかった。

梱包は簡素で、箱にはlenovoのマークも無し。

紙のマニュアルも一切付属せず、自分でダウンロードする必要がある。

Windows 11の立ち上げ確認

プリインストールされていたOSはWindows 11 Home

立ち上げ確認と、マイクロソフトアカウントの登録、ライセンス認証、インストールメディアの作成まで実施。

マイクロソフトアカウントにデジタルライセンスが登録されたので、再インストールの準備完了。

Ubuntu Server 22.10のインストール

Windows 11をいつでも再インストールできる状態にしたら、早速全部ストレージを初期化して、Ubuntu Serverのインストール。いつでも入れ替えられるので、最新の22.10をインストール。

注意点はインストール前に、セキュアブートをオフにしておくことを忘れない、くらい。SSHの鍵もGitHubから取得してくれて用意してくれるので、macOSからすぐにSSHでログインできたのが良かった。そういえば、Ubuntuインストーラを起動のもずいぶん久しぶりな気がする...

最初、無線LAN経由でインストールしたらめちゃめちゃ時間がかかったので、HUBを買ってきて有線LAN側で接続。レスポンスがかなり快適になった。

インストールが完了した後に、IPアドレスを固定化してから、Wake on LANを試す。macOSだと「WakeOnCommand」というツールで可能。特に設定は変えていないけど、MACアドレスを指定したらすぐに立ち上がった。これで遠隔操作もバッチリ。


考えてみれば物理ハードにUbuntuを自分でインストールしたのが初めてで、ネットワークの設定周りでちょっと戸惑ったけど、それが終わればいつものUbuntuなので、あとは特に困ることも無かった。

最近はLinuxもイメージから起動するようになってOSのインストーラ自体動かさなくなってたなぁ。

Ubuntu Serverでnetplanを使って固定IPアドレスを指定する(あと、Wake on LANを有効にする)

手元のPCにUbuntuをインストールした...よく考えてみると物理PCに直接Ubuntuをインストールしたのが初めてだと気がついた。 特にネットワーク周りの設定は、ネットワークインタフェースに影響を受けるので、今まで意識したことが無いところでの設定が必要になった。


自宅内サーバとしての使い方なのでIPアドレスは固定化したい。 本当はルータ側でMACアドレスを指定してIPアドレス払い出しを固定化する方法も有るはずなのだけど、上手くいかなかったので、まずはUbuntu側で設定することにした。

Ubuntuでは、netplanというコマンドを使ってIPアドレスを固定化する。

詳しい解説は、以下のサイトを参照のこと

netplan.io

公式ドキュメントでも、ネットの情報でも、明示的にrendererを指定している例が多いけど、公式ドキュメントには/etc/netplan/配下にYAMLファイルが置かれていると明示的にrendererNetworkManagerを指定しない限り、networkdが利用されるそうなので、明示的に指定する必要が無かった。

あと、Ubuntu ServerはデフォルトでNetworkManagerをインストールしないので、NetworkManagerのパッケージを追加インストールしない限り、rendererNetworkManagerを指定してもネットワークインタフェースは何も設定されないので、注意。初めてUbuntu Serverをインストールした時、nmcliではネットワークインタフェースが全てunmanagedになっていたので何事?と思ったけど、そもそもNetworkManagerでは管理されていない、というそのままの状態表示だった。


インストールしたPCには有線LANと無線LANの、2つのインタフェースが有るので、有線LAN側を固定IP化することにした。

有線LAN側の設定

network:
  ethernets:
    device_ethernet:
      dhcp4: false
      addresses: [192.168.0.xx/24]
      routes:
        - to: default
          via: 192.168.0.1
          metric: 100
      nameservers:
        addresses: [192.168.0.1]
      wakeonlan: true
  version: 2

バイス名と、IPアドレスはマスクしているけど、それ以外は設定した内容をそのまま載せている。静的にIPを指定する場合は、nameservermetricは明示的に設定する必要がある。

metricの意味は下記のサイトを参考にした。

qiita.com

デフォルトでは無線LANのインタフェースには600、有線LANのインタフェースには100が割り当てられた。同じゲートウェイを向いている時は、有線LANが選択されることになる。IPアドレスを固定化する際は、明示的に指定しないといけないの、デフォルトと同じ100を設定した。

name serverは、利用しているホームゲートウェイがWAN側にDNSサーバのアドレスを保持しているので、ゲートウェイに設定した。パブリックDNS 8.8.8.8でも別によいけど。

Wake on LANも明示的に設定しないと有効にならなかったので設定した......これで遠隔から電源をオンにできる。

無線LAN側の設定

同じ設定方法だとトラブった時に切り分けができないので、無線LAN側はDHCPを使うデフォルト設定のままとした。

network:
  version: 2
  wifis:
    device_wifi:
      access-points:
        name_of_access_point:
          password: xxxxxxxxxxxxxxxxxxx
      dhcp4: true

ip routeコマンドで反映した結果を確認する

なお、ゲートウェイを指定するgateway4記法はUbuntu 22.04より非推奨になっており、routesを使うのだそうだ。