DDDに関する言葉

DDD で出てくる言葉たち(超意訳)

  • Entity
    • DB の1レコードというイメージ
    • DBのレコードをオンメモリで持ち、DB <-> Entity <-> 実処理 というデータの持ち方もある (CakePHP Entity)
  • Service
    • Domain Logic を書く
  • Repository
    • DB、各データストアとのやり取り。Service からコールされる
  • Domain Object
    • ドメイン(アプリが対象とする業務領域)の問題解決、サービスクラス、VO、Entityを指す
  • Value Object
    • ◯◯日付、◯◯請求月とか
    • $xxdate = new Date();
    • この xxdate が何を指すかわからない。そんな時にVOを見れば詳細が分かる。という仕組みが最適

参考

Laravel5.4 で 301 Redirect した時の挙動

目的

  • ある特定のページを301 redirect させて、UnitTest を Pass させる
  • Test をしているのは、Redirect ページであるため、実際に遷移したかどうかまで確認出来ていない
    • Redirect ページから、正しくページ遷移されたかどうか Test を書きたいが、今はこれで必要十分

routes/web.php

<?php

Route::get('/sample', function() {
    return redirect('/memo', 301);
});

tests/Unit/MemoControllerTest.php

<?php

namespace Tests\Unit;

use Tests\TestCase;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class MemoControllerTest extends TestCase
{
    public function testMemoIndex()
    {
        $response = $this->get('/sample');

        $response->assertStatus(301);

        $response->assertSee('<meta http-equiv="refresh" content="0;url=http://localhost/memo" />');

    }
}

redirect(‘/memo’, 301) と書いた時の内部的な動き

  • 下のような redirect 用のページが生成される(Laravelが自動的に生成)
  • page の中には 0秒で対象ページ(memo) にリダイレクトするよう、meta属性で定義
<html>
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="refresh" content="0;url=http://localhost/memo" />

        <title>Redirecting to http://localhost/memo</title>
    </head>
    <body>
        Redirecting to <a href="http://localhost/memo">http://localhost/memo</a>.
    </body>
</html>

疑問点

  • 環境によって、meta タグ内の content=x が 0秒 / 1秒 と異なる。これが異なる理由が不明。

所感

  • できればページ遷移した後の content をチェックして true を返すような Test に書き換えたい
  • まさか内部的に Redirect 用のページを挟んでいるとは思ってもいなかったので、Test によって Framework の理解が少し深まった。

全然関係ないけど

Hatena の Markdown で言語を引用する場合、<?php ってかかないとPHPと認識されないみたい。
たしかに class だけ書いてたらわからないよね。

builderscon tokyo 2017 へ行ってきた!

builderscon tokyo 2017 に参戦。
テーマ通り、「知らないを聞く」を楽しめた。
とにかく運営の方々、オーガナイザーの方々の楽しい雰囲気が伝わってきて、
最高の時間をすごせた。なんだろう。夏祭りみたいな。
運営の皆さん、本当にありがとうございました。

普段触っているPHP以外も見たかったが、見たいPHPセッションと重なり
いくつかはスライドを楽しみに待つ。

参加したトークは以下
スライドやリンクは追記予定

8/3 前夜祭

  • 不参加
    • 悔やまれる。次回はフルで参加したい

8/4 Day1

PHPで支える大規模アーキテクチャ

PHP / Lambda/ Kappa Architecture / Cassandra / Kafka / Presto / Spark

PHP でも Kafka / Spark あたりとの接続が出来る事を知らなかったし、
どういうライブラリを間に使っているのか、メモれなかったので発表資料の公開を楽しみに待つ。
一部は Scala の実装が必要だとか。Spark起動とかだったかな。

PHPで作っていき、スケールし Message Queue 使う運用のイメージがつかなったが
実際に億レコードのRDBMSの限界の話など、リアルな運用の苦労を知った。
Kappa Architecture は初めて聞いて面白いと思った
(Kafka / Spark / Cassandra の中で、Cassandra は使った事ないので仕事で使いたいなー)

ランチセッション A 株式会社VOYAGE GROUP

  • ajito.fm の存在を初めてしったので watch したい

ランチセッションB Momentum株式会社

  • 追記予定

マイクロチームでの高速な新規開発を支える開発・分析基盤

データは神よりも正しいというような社内文化がとても素敵だった。
お昼休みに論文を読みながら話したり、チームから改善のような温度を感じた。

質疑応答のスペックの話しは、素直にチームのスペックはかなり高いように感じたが
他の人はどう感じたのか。
あと、社内に流用可能なライブラリが豊富にあるようで
近しいアプリを作る時のスピード、解析のノウハウは圧倒的に多そうという感じ。
なにより、分析にユーザのログをかなり集めている所に感動した。
スワイプの数まで取っているとは。。

複雑なJavaScriptアプリケーションに立ち向かうためのアーキテクチャ

しんぺーさんはbuilderscon tokyo 2016 でも一度トークを見て、
スピードと間にはさむ子どもの写真がとても気になってたので今回も参加。
何よりアーキテクチャの話しが多そうだったので。
実際には、ドメインの切り分けを行うアーキテクチャを幾つか紹介していて
特に図で PDS / Layerd Architecture / CQRS は本当に知りたかった情報で
これからも見返す資料になりそう。
このサンプルを見るために Vue.js を読み解きたい。 コマンドとクエリの図はソースみないと理解出来なさそう。

RDBアンチパターン リファクタリング

上がってくるアンチパターンが、今の業務システムにハマりすぎてかなり笑った。
データベースの設計が積み木を積むイメージという考え方はとてもわかり易く、
三角の上に丸いオブジェクトを載せる天才は存在する例えなど、
資料とトークの上手さもあり、最高だった。

LT

QRコードを16分割に出来るトークは、かなり面白く、何か応用出来ないかと思い
LT以外でも聞いてみたかった。

8/4 Day2

まさかの寝過ごして、5分くらい遅れ
今日こそは朝ごはんを頂きたかった。

知られざる世界 〜WEB以外のPHP

PHPで IoT / DesktopApp / Daemon / パケットキャプチャ で遊びましょうというトーク
Webではまったく使わない情報をどうやって知っているのかという会場からの質問に
GitHubPHP xxx で 調べるというハックを聞いた

PHP で書いて Electron で動かすのは結構良さそうと思ったので
何かDesktopアプリを作るときは参考にしたい(メーラは便利そうだった)

小さく始めて育てるコンパイラ

俺言語を作る流れの紹介
言語を作るのは時間がかかるが、MinCaml をベースに実装を進めている話し
そもそも関数型言語に慣れていないせいか、DEMOのサンプルプログラムでも
結構ついていくのに必死だった。
でもこれぞ普段自分では触らない領域を知るって事もあり、ワクワク感があった。
あ。こういう遊び、こういう追求っていいなって純粋に。

Make you a React: How to build your own JavaScript framework.

VirtualDOM の話し。
細かくクラスとメソッド切って、実装を進めるDEMOだったが、
途中から実装の意味と内容がついていけず。。。

Factory Class

Kickstarter でつのったオリジナルキーボードが400くらい売れればって思ったけど
2000の back があった話しだった。
実際に中国、台湾、日本のパートナー探しがいかに大変かを聞けた。
話しを聞いてて、受託の時の事が思い浮かんだ。結構悩んで見積りを考えたり、
見積りでストーリーを考えたり。
(見積りはシナリオなんだよという昔の営業の先輩の事を思い出した)

型を意識した PHP アプリケーション開発

裏で Slack の方のトークがあったのでギリギリまで悩んだが、「PHPの現場」の
Podcast も楽しんで聞いているので、一度は shin1x1 さんを見てみたかったという
ファンのような感じ かつ、今学んでいる DDD 関連の話しが聞けそうという事で選択。
結果として、Value Object の実装をライブコーディングで見れたのは大きい。
DateOfBirth Class を carbon\chronos を継承するだけでなく、
必要なメソッドだけを生やして移譲に持っていく方法は今後の参考にする。

PhpStorm のショートカットとたぶん IdeaVim の併せ技で、かなり高速に
画面内移動してたのは真似したい。
地味に右クリックメニューから UnitTest まわせるの知らなかった。

Closing

  • つながり
  • 「安全地帯」の外に飛び出そう!
    なぜイベントを企画している、を聞けたのは良かった。
    週明けは会社のブログに投稿して、同僚に共有しようと思う。
    ほんと最高の2日間だった。(初日行けなかったの悔しい。。。)

Laravel ServiceProviderの bind / singleton の使い分け

使い分け

// singleton を利用すると内容が cache される
$this->app->singleton(MemoServiceInterface::class, MemoService::class);
// bind でも同様に動作するが、 cache されない
$this->app->bind(MemoServiceInterface::class, MemoService::class);

余談

ぐるぐるまわって、今更だけどサービスコンテナに感動してる。
なんなのこれ。魔法すぎる。

DDDってなんなの?

今読んでる本
・「実践ドメイン駆動設計」
・「現場で役立つシステム設計の原則」

どちらもDDDに関する本。
エバンス本は立ち読みして難しそうで敬遠。(近々読むことになりそうだが)
そんな中、「実践ドメイン駆動設計」の読書会に参加し、読み始めた。(今後も継続して参加予定)

読んでいて意味が分からない上にどうやってコードに落としたら良いのか。が掴めない。

モデルで直接DBとやり取りせずサービスクラスを使うようなイメージで、
DDD=レイヤードアーキテクチャの事だと思っていたが、「実践ドメイン駆動設計」では、
違うという風に説明している。 Repository パターンはDDDのパターンの一つなのか?答えが出ない。

読み進めながら実際にコードを書いて試してみるしか方法がなさそうだ。

2016/11 頃に読んだ「Laravelリファレンス」で書いてあった Service クラスや Repository クラスは、
今考えてみるとDDDの開発手法だったのか? もしかしたら全てドメイン駆動という事で繋がっていそう。

中途半端な状態という事を記録として残しておく。
8月中にはこの辺りの理解を深めてコードで違いが分かるようにする。

最近の事を

2017年4月頃からブログを更新していなかったので、最近の調子を書く。
さすがに今日はHHKBからの入力を試しながら。

仕事

  • 新しいプロジェクトについて、技術選定とか出来そう
  • テスト自動化など、業務システムにどんどんテストコードを混ぜて行きたい

家族

  • もうすぐ息子が2歳を迎える
  • 子どもと2人で出かける事もたまには出来ているが毎週末2人でどっかに行くことは出来ていないのが課題

コード

  • Write Code Everyday
    • 4月末で止まってしまった。GWもほぼかかずに過ごしてしまい、断念。継続できず。
    • また始めようと思い、今日は部屋に机を作った
    • いつものように、南アルプスの天然水のストックを重ねて、上にこたつを載せて完成
  • 最近興味あること
    • Reactビギナーズガイドを買って軽く1周したので、コードを書きながらReact.jsをちょっと試したい
    • 業務では Laravel + Vue.js を使いそうなので、ここもサンプルだけでなく、もう少し深く触りたい
    • できれば、サービスレイヤをおいて実装したいが、このあたりは理解が弱いので手を動かして理解したい
  • 土日はやっぱり手を動かす事が難しくなってきたので、平日に動かすしか方法がなさそうだ。

その他

  • 時間がないとか言っておきながら、ストレス発散目的でXbox One S を買った
  • 久しぶりにHalo をやったり、Just Cause3 というオープンマップのアクションをプレイしたり。あれ、時間あるじゃん。。。

HHKB(US)Type-Sデビュー

一度使って見ようと思い高くて迷ったが購入を決めた。
といっても家では机がないので打つ術がなくMacBookProのキーボードで今は書いている。

2010年頃に一度使って見ようと思いHHKB(JIS) Lite2を購入したが矢印キーがうまく使えず断念。
ここ最近2014年6月くらいからは、東プレRealForce(US)テンキーレスの黒色を使っていたが、
キートップの昇華印字が見づらく、AppleWirelessキーボードに変更していた。

簡単なキーボード歴史

  • 2010/x HHKB(JIS) Lite2 を使ってみるが即断念
  • 特にこだわりがなく、WindowsでJISキー配列のキーボードやノートPCをそのまま利用
  • 2014/3 MacBookPro (US配列) の利用を開始(家でも仕事でも同じMacを使うため、デフォルトがUS配列となる)
  • 2014/6 東プレ
  • 2016/x キータッチがMacBookProと微妙に違うのでAppleWireless キーボードを使い始める
  • 2017/3 なんかキータッチの打ち心地が嫌になってきた(衝撃が強くて小指が痛い)ので東プレに戻る
  • 2017/6 キートップの文字が見づらくなってきた

解決したい事

  • 黒キーボードだと目が疲れてきた時にキートップの文字が見えづらい
    • 記号含め(上段)のキーをすべてブラインドタッチできれば良いが、練習へのモチベーションがゼロ
  • AppleWireless キーボードはすごく使いやすいが、グラつきと、打ってる時の衝撃が指に伝わって右手小指が痛い
  • あまり激しくMacBookProのインナキーボードと差を出したくない(家ではMacBookProを直接使うので)

選択肢

  • 東プレもAppleWirelessも使っているのでHHKBしかない
  • 色は白(無刻印はかっこいいけど、記号が)

懸念点

  • 一度挫折した矢印
    • ExcelでShift + Fn + 矢印割当のキー とか押せるのか?
  • MacBookProとの差異
    • ~ , Delete キーの位置

HHKBを使って解決を期待する事

  • 小指の痛みが改善される。あと、入力時のグラつき
  • 記号入力時のタイプミス(白いキーボードであれば何でも良いが)
  • 東プレより省スペースなのでマウスまでの位置が近い。AppleWirelessとは同じくらいなので変化なし

という事で今後仕事で使う事になるので、
期待値が満たせない・または最高!のような感想は今後追記する。

20170811 追記 (1ヶ月くらい職場で使った印象)

  • 結構すぐに矢印問題 (Fn + x) での動きには慣れた 1週間くらいか。
  • 1ヶ月経った今でも、Ctrl + Fn + x の矢印や Shift を使って選択するときは、Keyboard を見ながら矢印を押してる
    • これはこのまま使っていけば、更に慣れて問題なく使えるようになりそう
  • 問題点と今思っている事
    • Mac の Keyboard と ~, | の位置が違う為、たまに混乱してる
    • 家では Mac のキーボードを使っているので、矢印を使う時に HHKB のように Fn キーを探してしまう
    • 結局なんだけど、家用の HHKB が欲しくなって来てる
      • 使っていない東プレのキーボードはオークションに出そうか迷うが、今までの感覚だとまた使う日がきそう