doilux’s tech blog

ITに関する備忘録。 DDP : http://doiluxng.hatenablog.com/entry/2018/01/01/195409

論理モデルと物理モデルの実装を分離する話

論理モデル(ドメインモデル)と物理データモデル(例:ERモデル)を、実装上分離したい。その理由を書く。 TL; DR ちゃんとカプセル化をして、バグが混入する余地を無くしたいため 実装は大変だが、楽する方法はある(ただし、リスクもはらむ) 分離したい…

他人がつくったテーブルなど信用しない

過激なタイトルですが、とても優しい内容ですw BigQuery(以下、BQ)をよく使います。とても便利なのですが、PRIMARY KEY制約(またはUNIQUE制約)がないのが不満です。 例えば、こんなテーブルがあったとき(あえてDDLで書いてます) CREATE TABLE clients …

CXについての話

アドベントカレンダーの空いてる日をエモい記事で埋める担当のdoiluxですw 今日はCXについて書きます DXは最近よく耳にしますが、CX(某テレビ局じゃないよ!)は初めて聞く方が多いかもしれません。 なぜなら僕が今作った言葉だからw CXはChild Transform…

地図なき冒険の始まりと羅針盤

PTAアドベントカレンダー2日目です!! 会長とおなじ部署で働く、doiluxと申しますmm 1年に一度のテックブログを書く時期になりましたw 今年はエモい記事を書きます。 www.jp.playstation.com 私はアンチャーテッドというゲームのファンです。ゲームとし…

Figmaを完全に理解する

はじめに エンジニアの言う「完全に理解した」「なにもわからない」「チョットデキル」って本当はこういう意味?「わかる」の声多数 - Togetter サーバーサイドエンジニアと兼任でプロダクトマネージャもやってます。最初、モックをパワポでつくったり、既存…

マインドマップでタスク管理したら捗った

タスク管理でカンバンやめてマインドマップにしたら捗った。 カンバンに感じてた課題 Whyが可視化できないこと。アジャイルなものづくり(課題解決の手段が誰もわからず、PDCAサイクルを回して改善していく)をするなら、今作っている機能がどういう文脈で必…

目標設定前にSWOT分析する

エンジニアリングマネージャーになってから約一年半、色々と試行錯誤した中で、手応えのあった施策を書く。 なお、記載内容は個人的な意見であり、所属組織の見解ではない 前提:目標設定の目的は成長支援とリソース把握 目標設定の目的は、個人の成長を組織…

クソPR(Pull Request)をやっつけろ

本ブログ1年ぶりのポストは、私が所属するPTAのアドベントカレンダー6日目の記事です。 PTAについては、1日目の会長の記事をご覧ください。 前回は、同僚の@hyperdashによる、AppleScriptでなくすmicro-toilという記事でした。 私について 今年の前半はAB…

DDD(Domain Driven Development)でDDT(Dramatic Dream Team)を作る

本記事はドメイン駆動設計#1 Advent Calendar 2019の14日の記事です。 前回はryuseikurataさんの記事でした。 2019年もあとわずかになりました。今年は皇位継承や、多数の大物芸能人の婚約・結婚、個人的にも第一子が生まれるなど、とてもドラマティックな1…

Futureをネストしてハマった

あかんやつ import scala.concurrent.{Await, Future} import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.duration.Duration object Main extends App { Await.ready(test(), Duration.Inf) def test(): Future[Unit] = {…

ドメイン駆動設計でトラッキングIDをどうするか

マイクロサービスっぽくサービスを分解していると、ログを串刺しでみたり分析したりするためにトラッキングIDを付与したいことがあるが、DDDの文脈からいうと、トラッキングIDはドメインの処理とは関係ないため、どうやって引回すか悩む。 例 ↓のデータソー…

マイクロサービスつらいorz

過去のマイクロに振り切ろうとした(そして諦めた)経験を踏まえ、自分の考えるマイクロサービスのいいところとわるいところをまとめる。 多分、オライリーの本とかに同じようなことが書いてある気がする。 分ける対象 分ける対象は以下 プロセス(ジョブ、t…

Lens便利

HoloLensの話ではない。scalaz.Lensの話。 これが ```object Main extends App {val a = A(B(C(D(1))))println(a)val copy = a.copy(a.b.copy(a.b.c.copy(a.b.c.d.copy(2))))println(copy)} case class D(value: Int)case class C(d: D)case class B(c: C)ca…

ScalaでprotoをJSONにする

そもそもなんでわざわざprotoをJSONにしているのかというと 重いバッチがあって、その中で一部の処理が重い 「一部の処理」を別バッチに切り出して並列処理をする 元のバッチのジョブと切り出したバッチのジョブの間でオブジェクトをやりとりしたい =>JSONに…

activatorパターン

オレオレデザインパターン 解決したい課題 DBMSのトランザクション機能が使えない(例:マイクロサービスをまたぐなど)場合に読み取り一貫性を実現する 設計 例えば携帯電話で月の途中でプランを変えた(普通のプランから、Youtubeの通信をカウントしないプ…

akka-streamについて

まずはさっくり作ってみる import akka.actor.ActorSystem import akka.stream.ActorMaterializer import akka.stream.scaladsl.{Flow, Sink, Source} object Main extends App { implicit val system = ActorSystem("sample") implicit val materializer = …

Actorおさらい

akka-streamを検討しているので今一度Actorについておさらい。 サンプル import akka.actor.{Actor, ActorSystem, Props} object Main extends App { val system = ActorSystem("sample") val actor = system.actorOf(Props[SampleActor]) Range(1, 10).fore…

Groovyの==

Groovyの==は、Comparableを実装している場合はcompareToを使って検証するらしい。 Comparableを実装していない場合 @AllArgsConstructor public class Zombie { private final int no; private final String name; } class ZombieTest extends Specificatio…

Scalaのadd(a: Int, b: Int)とadd(a: Int)(b: Int)の違い

(a: Int, b: Int)の部分、引数リストって言うらしい。 Scalaメソッド定義メモ(Hishidama's Scala def Memo) 部分適用したいときはこうなる add(a: Int, b: Int)の場合 scala> def add(a: Int, b: Int): Int = a + b add: (a: Int, b: Int)Int scala> def add…

改善を進めたかったらダッシュボードが必要だった

今関わっているシステムはファーストリリースを終えて、スプリントを回しながら改善・機能追加していくフェーズに入りました。 最初の頃は改善がうまく進みませんでしたが、ダッシュボードを導入して一気に改善が進みました。 ※ちょっと抽象的な記述が多いで…

GASで現在時刻から現在のスプリントを取得する

スプリントが金曜~翌木曜で、現在時刻から今のスプリントを取得する。 例えば、今日が2018.09.17なら、2018.09.14-20という文字列を取得する。 とりあえず、今週金曜日を取得するコードはこちら var this_day = new Date() var this_friday = new Date(this_…

習慣化アプリを試す~その1

以下の習慣化アプリを試している。 Momentum 習慣トラッキングMathias Maehlum仕事効率化無料 Productive - タスクリストApalon Apps仕事効率化無料 Habitify-習慣化ー習慣トラッカーUnstatic Ltd Co仕事効率化無料 Today:習慣追跡アプリNeybox Digital Lt…

MySQLのREPEATABLE_READの動き

MySQLもとい、読み取り一貫性機能のあるDBMSのREPEATABLE_READの動作がいつも「どうだっけ?」となるのでメモ。以下MySQLの例 結論 共有ロックは(おそらく)かけておらず、(基本的には)更新と参照は競合しない。 ※基本的にはと書いたのは、確かauto-incre…

Wrikeでバーンダウンチャートを描く

まだ描けてないけどアイディアだけ浮かんだのでメモ。 背景 Wrikeってツールをつかってるけど、ストーリーポイントとバーンダウンチャートの機能がないのが不便。よし作ろう。 実装 チケットのタイトルにストーリーポイントを書くようにする(例:1pt_実装す…

scala.concurrent.Futureのあれこれメモ

Scalaを初めて、scala.concurrent.Futureに慣れてなかったのであれこれメモ ただ実行する。 scala> Future { | Thread.sleep(3000) | println("hey!!") | } res6: scala.concurrent.Future[Unit] = Future(<not completed>) scala> hey!! Futureの戻り値はFuture[Unit]にな</not>…

shellスクリプトのテンプレート

オレオレシェルをつくるなら以下のテンプレートを使う。 #!/usr/bin/env zsh # Settings ## スクリプト名 script=$(basename $0) ## バージョン version="v1.0" ## debugモード(デフォルトoff) debug=0 ## 引数の数(オプションを除く) args_num=1 # usag…

モブ・ペア・XP

モブプロっぽいものを取り入れてうまく言った話。 TL;DR モブプロを導入して以下の効果が得られた。 レビュー工数の大幅な削減 属人性の排除 IDEのテクなど、コーディング以外のノウハウ共有 いろんなスタイルを取れるので型を押し付けないことが大事。 導入…

sbtでScapegoatを使う

Scapegoatとは 静的コードアナライザでFindBugsやcheckstyle、ScalaのScalastyleと同様の機能を提供する((公式)https://github.com/sksamuel/scapegoatより) なんでScapegoatか FindbugsもScalaで使えるが、Scalaで使うとノイズが入る。 例えば、以下のよ…

sbtでfindBugsを使う

plugins.sbtに以下を追加する。 addSbtPlugin("com.github.sbt" % "sbt-findbugs" % "2.0.0") build.sbtに以下を追加する(html形式のレポートを出す。おそらくJenkinsとかでレポートを表示するなら不要) findbugsReportType := Some(FindbugsReport.PlainH…

ドキュメントについて考える

ドキュメントの目的 大きく2つかと思います。 これから何をつくるのかを表現 なにを作ったのかを表現 上記2つを一種類のドキュメントで兼ねようとすると、うまく管理できない気がします。 これから何をつくるのか 主にステークホルダー間でこれから何を作…