より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

読書感想「ドメイン駆動設計入門」

ドメイン駆動設計入門 ボトムアップでわかる!ドメイン駆動設計の基本

個人的に、ドメイン駆動設計ほど銀の弾丸は存在しないを理解させてくれる設計だったりします。

なんの策もなく実装をするのは危険ですが、あまりこだわりすぎてしまうと、逆にややこしくしてしまうのがドメイン駆動設計なのです。

その意見は、この本を読んでも変わりません。

ドメインオブジェクトを公開すると多くの危険性があるので、DTOを用いる

まあ、ドメインオブジェクトを公開すると影響範囲が広くなるので、DTOを使うというものです。

   public class UserApplicationService
    {
       // 略

        public UserData Get(string userId)
        {
            var targetId = new UserId(userId);
            var user = _userRepository.Find(targetId);
            // ドメインオブジェクトを直接公開すると多くの危険性があるのでDTOを用いてやりとりする
            return new UserData(user);
        }
    }
    public class UserId { // 略 }
    public class UserName { // 略 }
    public class UserData { // 略 }

と解説されていますが、個人的な経験上、こういうことに厳密になると、似たようなクラスがいっぱいになってしまい、新しいプロパティを追加するのに、1つではなく、2つ、3つクラスを修正しなければならないので、あまり好きではないです。

本書では、その手間を省くためにドメインオブジェクトを指定するとDTOとなるクラスコードを生成するツール作るとよいとしています。

コマンドオブジェクト

ユーザーを更新するとき、Idは必須で、名前やメールアドレスは任意であることを示す場合。

引数で表現をすると煩雑であるため、コマンドオブジェクトを用いる戦術。これは初耳でしたね。

    public class UserUpdateCommand
    {
        public UserUpdateCommand(string id)
        {
            Id = id;
        }

        public string Id { get; set; }
        
        public string Name { get; set; }
        
        public string MailAddress { get; set; }
    }
    public class UserApplicationService
    {
        // 中略

        public void Update(UserUpdateCommand command)
        {
            var targetId = new UserId(command.Id);
            var user = _userRepository.Find(targetId);
            if (user == null)
            {
                throw new UserNotFoundException(targetId);
            }

            if (command.Name != null)
            {
                var newUserName = new UserName(command.Name);
                user.Name.ChangeName(command.Name);
                if (_userService.Exists(user))
                {
                    throw new CanNotRegisterUserException(user, "ユーザーはすでに存在しています。");
                }
            }


            _userRepository.Save(user);
        }
    }

ソリューション構成

ドメイン層とアプリケーション層だけはプロジェクトを一緒にして、インフラストラクチャ層などは別々にするそうです。

私の経験したプロジェクトではドメイン層とアプリケーション層も分けてました。

一緒にできるなら一緒にした方がいいのが個人的な感想です。プロジェクトが多すぎると管理が煩雑ですので。

こんな文法あるんだ「Id = id ?? throw new ArgumentException(nameof(id));」

namespace ValueObject
{
    public class User
    {
        public UserId Id { get; set; }
        public UserName Name { get; set; }

        public User(UserId id, UserName name)
        {
            if (id == null) throw new ArgumentException(nameof(id));
            if (name == null) throw new ArgumentException(nameof(name));
            Id = id;
            Name = name;
        }
    }
}

というC#のコードを書いていたのですが、Riderがサジェストしてきたのです。

適用してみると

using System;

namespace ValueObject
{
    public class User
    {
        public UserId Id { get; set; }
        public UserName Name { get; set; }

        public User(UserId id, UserName name)
        {
            Id = id ?? throw new ArgumentException(nameof(id));
            Name = name ?? throw new ArgumentException(nameof(name));
        }
    }
}

確かに ?? でnullだったら〜の値を指定できるのですが、値ではなく例外もできるんかと。

「新すばらしきこのせかい」は熱中できるゲームだった

体験版プレイして即購入決めたゲームです。

www.jp.square-enix.com

ボタンに対応したキャラクターが攻撃するというありそうであんまりないバトルシステムを昇華していて楽しいです。

イマの渋谷を現実に落としこんでいて、渋谷付近で働いた身からすると、あーこういう場所あったねーというのがしばしばありました。

装備したバッジによって、回復ができたり、爆弾を投げたり、飛び道具を連発したりと攻撃方法が変わるようになっております。バッジは多数用意されており、コレクション要素も兼ねています。

種類が多いので仕方ないのですが、バッジによっての性能差が激しすぎる気がしました。

後半になると、明らかに強すぎるバッジがあるため、そればかりを使えば済む、そうしないとまともに戦えないとなります。

特に強いのがラグジュアリースピア。神バッジではないので制限もなく、敵が落とすバッジ。

何が強いって石化の効果が強いです。終盤はダメージは期待できませんが、このゲームは一部の敵の強力な攻撃を複数人がまともに受けると一気にピンチに陥るため、敵の動きを止められるとバトルが安定します。

ずっと誰かに持たせてましたね。

それとY攻撃の飛び道具連打は使いやすく、LとRのチャージ攻撃、Xは使っていて楽しいですが、近接なので反撃を受けてしまう。ZLとZRのバッジは終盤に体力回復のバッジを使うぐらいで、ほぼ出番ありませんでした。

メインキャラクターが男性比率が高いのに買えるファッション(装備)が女性ものが多いのに、プレイヤーに女性キャラが少ないのが微妙でした。

男性にスカートを装備させることも出来ます(グラフィックには変化なし)

が、時と場合によっては自分、これじゃないって放り出してしまいそうな気がしましたね。

ストーリーは破綻はしてませんが、設定が独特しすぎてあまり移入はできませんでした。キャラクターの男女比を考えて欲しかったですね。

ストーリーのボリュームはかなりあります。特に最終章が長い。良い点とも言えるんですが、個人的には長すぎる気がしました。

このゲームをプレイして、時間は巻き戻してはいけない、退屈になるから、と思いました。

ゲームとしては熱中できるんだけど、どうしても冷めてしまうという感じですね。休み休みプレイしてました。

色々マイナス点も挙げてしまいましたが、全体的に良ゲーでした。

とにかくバトルでボタンを動かしていると熱中できるのと、ボーカル入りの音楽、渋谷を体験できるのでゲームとしては十分な出来です。

読書感想「医者が教える食事術 最強の教科書――20万人を診てわかった医学的に正しい食べ方68」

医者が教える食事術 最強の教科書――20万人を診てわかった医学的に正しい食べ方68

最近YouTubeで食の雑学チャンネルなどゆっくり東方が解説している動画を見ています。

その中で缶コーヒーはダメ。十分に糖分を含むと聞いて、へーそうなんだーと調べてみたら、以下の記事にぶち当たりました。

diamond.jp

不調の原因の9割は「血糖値」にある

実は清涼飲料水などのメーカーは、人の至福点について計算し尽くし、商品を設計をしています。言ってみれば、糖質中毒者を増やすことで利益を得ているのです。知的なはずのビジネスパーソンが、それにまんまとはまってはいけません

縄文時代にはなかった食べ物は口にしてはいけない

あなたを太らせる原因は、唯一「糖質(=炭水化物)」です。

などと、なんとかモンばりのパワーワードが散りばめられた本です。

同僚が進化医学からどういった食事にするか考えて実践しているという話を聞きましたが、この本でも日本人は縄文人に近い体質であり、咀嚼しない糖分なんてあり得ない、縄文時代にはなかった食べ物は口にしてはいけないとしています。

よって、ジュースはもちろん、プロテインもよろしくないと言います。

現代になって急激に食事状が発達したが、現代人の体はそれにはついていけていないんです。

食事の正解については、医学は日々進歩しており、昨日まで「いい」と言われていたことが「悪い」に変わることはしょっちゅう起きる。そういう状況にあって最も知的な態度は人体のメカニズムを前提にして「冷静に最新の正しい情報を得る」と言うことに尽きるとのことです。

というのです。筆者は英語の最新の医学論文を読むようにしているそうです。それが患者さんの健康に対する責務だそうです。

新しい常識

  • 糖質が太る唯一の原因
  • カロリーと肥満は関係ない
  • 脂肪は食べても太らない
  • コレステロール値は食事では変わらない
  • プロテインアミノ酸は腎臓を壊す
  • ちょこちょこ食べる方が太らない
  • 果物は太る
  • 疲れたときに甘いものをとるのは逆効果
  • 発がん性(ハム・ソーセージ・ベーコン)を疑われているものは食べない
  • 運動は食後にすぐ行うのがいい。(血糖値の上昇を抑えることができる)

太る仕組み

  1. 糖質を摂取する
  2. 血液中のブドウ糖が増える
  3. 増えすぎたブドウ糖を処理するためにインスリン膵臓から分泌される
  4. インスリンブドウ糖をグリコーゲンに変えて取り込む
  5. グリコーゲンとして取り込める量には限界があり、さらに余ったブドウ糖中性脂肪として脂肪となる
  6. この中性脂肪が肥満、そして中年男性のぽっこりお腹の原因

この仕組みで、一度に一気に食事を取るよりちょこちょこ食事をとった方が良いのも裏付けが取れますね。

ちなみに、脂肪そのものは口にしても、100%取り込まれません。

むしろ、パンと脂質を合わせて取ったほうが血糖値の上昇が抑えられるとしています。

なぜ病気になるのか

筆者は免疫力の低下を挙げています。

特に花粉症やアトピーの急増はこの免疫力の低下によるもので、それはかつて存在しなかった添加物のような食品によるものとしています。

固いものを食べて噛むことも大事です、ナッツ類、繊維質の多い野菜、赤身の肉、小魚などを食べることで本来の力が目覚めるようです。

長生きするための秘訣

死ぬまで働く(仕事がなければ、料理やボランティア)とか、生きがいを持つというのはわかるのですが、挙げられている中で意外だったのは

  • 坂道を歩く
  • チョコレートを食べる

というのは意外でした。

チョコレートのカカオは適量食べることで、抗酸化作用があるようです。なので赤ワインも抗酸化作用があるので、飲むと健康に効果があるのです。

坂道を上り下りするのは適度な運動になるそうです。

アクション事項

  • とにかく糖質は控える。肥満の原因
  • ジュース、缶コーヒーは飲まない
  • やせるには運動ではなく食事
  • 血糖値の計測をして血糖値の上昇を知る(FreeStyle リブレという製品がある)
    • 血糖値を70-140に保つ
  • 食べる順番は野菜->タンパク質->糖質で、血糖値の上昇を抑える
  • お酒はビールよりも辛口の白ワイン、蒸留酒が好ましい
  • ナッツ類、繊維質の多い野菜、赤身の肉、小魚を噛んで食べる
  • プロテインの過剰摂取はしない
  • 常に冷静に最新の正しい情報を得る

Cloud WatchのLog InsightでIISのエラーレスポンスを解析する

docs.aws.amazon.com

Cloud Watchダッシュボードにエラーレスポンスのログ一覧を出したかったのですが、ログフィルターの構文がまた違ってくるようです。

以下のようになります。

FIELDS @message
| PARSE @message " * * * * * * * * * * * * * " as date,time,sIp,csmethod,csUriStem,csUriQuery,sPort,csUsername,cIp,UserAgent,Referer,scStatus,scSubstatus,scWin32Status,timeTaken
| FILTER scStatus >= 400
| DISPLAY @timestamp, scStatus, @message

iisで宣言されているのと同じヘッダーにしたいところですが、ハイフンは使えないようですので、私はキャメル記法にしました。

とにかく * が何個続くんだ、というところですね。

AWSのEC2のメモリ使用率はCloud Watchからモニタリングする

docs.aws.amazon.com

AWSのEC2のインスタンスのモニタリングからはメモリ使用率は見れないんですね。CPUしか見れないです。

CloudWatchエージェントを入れて、Cloud Watchで見るようです。

メトリクスからインスタンス名で検索して、それらしいのを探してみるのですが、うーん。

GCPもディスク使用率はエージェントを入れないと見れなかったかと思うのですが、AWSより見やすかったので、残念に感じましたね。