DDD本を読み終えた(ざっくり)

DDD本をとりあえず読んだので,気になった部分をまとめます.

www.shoeisha.co.jp

↓5章までは以下にまとめてます.

http://blog.hatena.ne.jp/MitubaEX/mitubaex.hatenablog.com/edit?entry=17391345971618128236 mitubaex.hatenablog.com


6章

集約

エンティティと値オブジェクトをまとめたもの. 集約にはルートエンティティがあり,このルートのみを外部のオブジェクトは参照できる.

本で挙げられてた例では,自動車がルートエンティティでその下に車輪,タイヤ,位置が保持されている. これにより,自動車の下にある車輪は外部のオブジェクトから参照されることが無く,集約内部での不変条件を満たせる. この不変条件というのは,自動車だと前のタイヤは二つで後ろのタイヤは二つといった絶対変わらない条件のことを指す. 後ろのタイヤを勝手に誰かに変えられると困るかもしれない.

ファクトリ

オブジェクトを作成,再構成する役割を持つオブジェクト. 複雑な処理をカプセル化できたりする. 基本的な役割は,集約を作成して集約のルートを渡す.

ファクトリは,エンティティを再構成する時,識別子を新たに作ってはいけない. だからファクトリメソッドの引数には識別子を入れる. オブジェクトの再構成をする場合は,DBなどですでに値が書き換わっているかなど確認することが多いらしい.

リポジトリ

クライアント,DB間のインタフェース的存在. データストアの実際の操作をカプセル化する.

リポジトリは,クライアントから切り離されているので容易に実装を変更できる. また最後のDBへのコミットはリポジトリが行うのではなく,クライアント側の責務である. リポジトリは変更の操作を行うだけで,トランザクション処理には関与しない.


14章

境界づけられたコンテキスト

複数のモデルを抱える巨大なプロジェクトがあった時,モデルごとにきちんと境界をしき外部のモデルに左右されない一貫性を保つ. このコンテキストごとに名前を設け,そのコンテキストと他のコンテキストの関係をコンテキストマップにまとめる.

腐敗防止層

二つのモデルが結合されて,モデルの一貫性が取れなくなった場合には腐敗防止層を設ける. この腐敗防止層は,二つのモデルの双方向の変換を行う.


15章

汎用サブドメイン

ドメインの中の優先度の低い処理群. OSSのライブラリなど実現に必要な手段のことだと思った.

ドメインビジョン声明文

コアドメインがやることを1ページのドキュメントとして記述する. このドメインビジョン声明文は開発が進むにつれて変化し,そのたびに改訂版を出す.

凝集されたメカニズム

ドメインに関係のない処理群. 汎用サブドメインとの違いはコードが無いので,いまいちわからなかった・・・

他にも色々ありましたが,また実践ドメイン駆動設計を読んでから読み直したいです


感想

長い.

それでも読んでて面白いと思う箇所が多く,実践を読んでまた理解を深めていけたらなと思いました. 精進します.

YouTubeの音楽を垂れ流すだけのアプリを作った話

部活の制作合宿でYouTube垂れ流しアプリnoisicを作成しました.

↓実際に発表したスライド

概要

noisic

検索ワードを入れたら,その検索ワードに引っかかった動画を再生し続けるアプリです.

  • 使用技術: electron

作った目的

  • 普段,ブラウザでYouTubeを見て調べ物もする
  • タブが無限に生成される
  • chromeを落とす
  • 音楽が止まる😭

こういうことが頻繁に起こるので,解消したいと思って開発しました.

App for YouTubeというものがあるらしい

  • 軽く使った感じ次の動画へのautoplayがない?
  • 金払うとホットキーが割り当てられるらしい

大変そう

やっていき

詰まったところ

  • Reactを採用するかしないか案件 -> 結局採用しなかった
  • YouTubeの投稿者による再生の制限された動画の扱い
  • UI

感想

できてよかった

firebaseにcreate-react-appしたアプリをデプロイする

備忘録です.

install

sudo npm update -g firebase-tools
sudo npm install -g create-react-app  

create app

create-react-app [dir_name]
cd [dir_name]

dir_nameは好きな名前で大丈夫です.

firebase setting

firebase login

firebase init
=> Hostingを選ぶ.前もってfirebaseでプロジェクトを作成して,そのプロジェクト名を指定する.

firebase.jsonを以下のように変更します

- {}
+{
+  "hosting": {
+    "public": "build"
+  }
+}

build & deploy

npm run build
firebase deploy

これでdeployできた思います.

Umeda.goという勉強会に参加しました.

umedago.connpass.com

Goだけで作るフロントエンド入門 @nobonoboさん

gopherjs + vecty 最高という話

↓チャットアプリ

vecty sample

golang初心者が3dモデル出すために色々苦労した話 @akinobufujiiさん

aimingで主にクライアントエンジニアをしている

背景

golangが流行っている レンダリング周りの勉強がしたい

C++歴7年

やっていき

golang + OpenGLで3Dモデルを出してみる

go-gl/glとかいろいろ触れるライブラリが揃っている

コードは300行ぐらい

重要ポイント

5日間ぐらいでgolangで3Dモデルは描画できるぞ!

スタートアップ立ち上げの主力言語にgoを採用してみた話 @ponpoko1968さん

フリーランスのお方

人を採用したい時,rubyだと人がたくさん来るかもしれないから適度に人が少なそうなgolangを採用.

API構築にはgoaを採用.goaでswaggerの設定ファイルを吐ける. 凄い

ReactNativeでGoを使う @hatajoeさん

isomorphic go

  • サーバもクライアントも同じ言語でやっていこうという思想
  • 今回はmobileをgoでやってみたお話

gomobileでandroidからgolangを扱えるようにしてあげて,その後Nativeでbridgeする

サーバとクライアントで同一の構造体を持つことができて,varidationが楽

感想

gopherjsが非常に面白いなぁと思ったり,いろいろ楽しそうという印象でした.

ちょっとgolangをかじっただけの,goamateurなのでgolangの楽しさを色々知れて良かったです.

DDD本の1章~5章までで気になったところまとめ

DDD本の1章から5章までで気になったところの個人的まとめです.

www.shoeisha.co.jp

2章

ユビキタス言語

とにかく用語などを使うのではなく,そのチームでの定義を設けその言語を使えということ. 一つのチームに一つのユビキタス言語を使用することが理想であると書かれていた

4章

レイヤードアーキテクチャ(LAYERED ARCHITECTURE)

  1. ユーザインタフェース層,プレゼンテーション層
  2. アプリケーション層
  3. ドメイン
  4. インフラストラクチャ層

以上の4つのレイヤーからなるアーキテクチャである.1.が一番上のレイヤーで4.が一番下のレイヤーである.

ユーザインタフェース層は表示周りの処理,アプリケーション層は上と下をつなぐインターフェース的な役割,ドメイン層はロジック周りの処理,インフラストラクチャ層はデータの永続化などドメイン層を支える処理を行う.

このアーキテクチャの特徴は,複雑なコードをレイヤーで分割し,それによって各レイヤーごとの責務に集中するだけでよくなる点である. 各レイヤーが下のレイヤーにのみ依存し,上のレイヤーとは疎結合な関係を保つことを容易に実行できる.

5章

エンティティと値オブジェクト

エンティティは,各エンティティに識別番号などを持たせオブジェクトごとの同一性を判断する. 例として,座席が挙げられていた. 座席はどれも同じものであるが,座席番号がついており座席ごとで区別することができる.

それに対して値オブジェクトは,同一性を判断しないオブジェクトである. この値オブジェクトの中にはエンティティなども含まれており,その場合は値オブジェクトの中のエンティティで同一性を判断することになる.

サービス

エンティティや値オブジェクトを触るインターフェースとして提供されているのが,サービスである. サービスを設けることにより,ロジック部分とエンティティや値オブジェクト部分を明確に分離できる. サービスは単にエンティティや値オブジェクトをつなぐだけなので,ステートレスである必要がある.

モジュール

ドメインロジックなどを他のコードと切り離すときなど利用する場面が多いらしい

感想

まだ序章

dartでjson配列のparse方法

個人的に残しておきたかったので,置いときます.

import 'dart:convert';

// 今回はUser型を定義しました
class User {
  final String name;
  final String hobby;

  User(this.name, this.hobby);

  // map to User
  User.fromJson(Map<String, dynamic> json)
      : name = json['name'],
        hobby = json['hobby'];

  // map to json
  Map<String, dynamic> toJson() =>
    {
      'name': name,
      'hobby': hobby,
    };
}

void main() {
  // 対象json文字列
  final String json = """[{"name":"mituba", "hobby":"anime"}, {"name":"mit", "hobby":"ani"}]""";

  // string to List<User>
  List<Map<String, String>> jsonArray = JSON.decode(json);
  List<User> userList = jsonArray.map((i) => new User.fromJson(i)).toList();

  userList.forEach((i) => print(i.name + ':' + i.hobby));
  // ---output---- 
  // mituba:anime
  // mit:ani

  print(JSON.encode(userList));
  // ---output---- 
  // [{"name":"mituba","hobby":"anime"},{"name":"mit","hobby":"ani"}]
}

感想

非常に楽

python3でfirebaseのRealtime Databaseを使う

python3からfirebaseのRealtime Databaseにアクセスする方法なんかをまとめました.

install

pythonでfirebaseを利用するには,firebase-adminというものがいるのでそれを入れます. installは以下のコマンドで

sudo pip3 install firebase-admin

下準備

まずfirebaseで新規プロジェクトを作成してください. 作成したプロジェクトに入ると,こんな画面が出てくると思います.


f:id:MitubaEX:20180211150846p:plain
プロジェクト画面


まずはProject Overviewと書かれた文字の右側の歯車をクリックして設定画面へ行ってください. こんな画面になると思います.


f:id:MitubaEX:20180211151030p:plain
設定画面


そしてサービスアカウントに行って,一番下の新しい秘密鍵の生成で秘密鍵jsonを入手してください. 秘密鍵pythonコードと同じディレクトに配置してください.

次に左のメニューからDatabaseを選択します.

そうすると以下のような画面が出てくると思います.


f:id:MitubaEX:20180211151301p:plain
データベース画面


ルールを開いて,ルールを以下のように変更します.

{
  "rules": {
    "public_resource": {
      ".read": true,
      ".write": true
    },
    "some_resource": {
      ".read": "auth.uid === 'my-service-worker'",
      ".write": false
    },
    "another_resource": {
      ".read": "auth.uid === 'my-service-worker'",
      ".write": "auth.uid === 'my-service-worker'"
    }
  }
}

これで下準備は完了です.

アクセスする

pythonコードは以下のような感じです.

import firebase_admin
from firebase_admin import credentials
from firebase_admin import db

cred = credentials.Certificate('./<your service account json>')

firebase_admin.initialize_app(cred, {
    'databaseURL': 'https://<your database url>',
    'databaseAuthVariableOverride': {
        'uid': 'my-service-worker'
    }
})

ref = db.reference('/another_resource')

## add data to database
users_ref = ref.child('users')

users_ref.set({
    'alanisawesome': {
        'date_of_birth': 'June 23, 1912',
        'full_name': 'Alan Turing'
        },
    'gracehop': {
        'date_of_birth': 'December 9, 1906',
        'full_name': 'Grace Hopper'
        }
    })

# insert
users_ref.child('mituba').set({
    'date_of_birth': 'Aug 23, 1994',
    'full_name': 'Mituba Mituba'
    })

## get data
print(ref.get())

以上でアクセスできたと思います.

感想