ScalikeJDBCでDDD的な
大したことではないのだけど、便利そうだったのでメモ。
Long値である従業員IDを明示的に型として保持したいニーズがあるとして、こんな case class
があったとする。
case class EmployeeId(value: Long)
SQLのWHERE句を組み立てる際、下記の様になる
val where = sqls.eq(Employees.e.employeeId, employeeId.value)
この .value
がちょっと煩わしいなと思っていたのだけど、下記のような implicit conversion
を定義しておくと
implicit val intParameterBinderFactory: ParameterBinderFactory[EmployeeId] = ParameterBinderFactory{ id => (stmt, idx) => stmt.setLong(idx, id.value) }
こんな風に書けた。
val where = sqls.eq(Employees.e.employeeId, employeeId)
あくまでも自分へのメモw
knotfestおしまい
主催のslipknotは、僕の中で好きなバンドランキングで現在2位のバンドで、人生2回目のライブ参戦。
バンドが大きくなりすぎて、ライブ1つやるのも壮大な調整が必要だそうで、次に日本でライブしてくれるのは何時になるかわからず(メンバー一人亡くなっちゃったし)。
なので、嫁ちゃんにお願いして参戦してきました。
最前列まで行き、メンバー一人一人を間近で見れて、本当に楽しかった。
メールアドレスをあらわす正規表現について
今日、個人的に信じていたメールアドレスの正規表現に穴があった。
どういうものかというと、
input type=email – e-mail address input control (NEW) - HTML5 で仕様とされている
\b[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*\b
が、RFCが策定しているメールアドレスの形式に違反した形である foo.baa.@domain.co.tokyo
という形式(※アットマークの前にドットが存在する)に合致してしまう問題。
なので、少し手入れしてこんな感じに...
[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(?!\.).@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*
ちなみに、
^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(?!\.).@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*
とすると、foo..baa.@domain.co.tokyo
も弾いてくれる。
ただ、コレが絶対的に正しいのかというと自身なし。
メールアドレスを表す正規表現は、多分、永遠の課題なのかもしれない...。
IntelliJ IDEAのsbtビルドがコケまくった話
会社のMacに入れているIntelliJ IDEAのsbtビルドが盛大にずっこけるようになり、プロジェクトの作り直した等していたら、そもそもソースコード自体開けなくなった。
原因を言ってしまえば、例のXcodeのAgreeをしていなかったから。
最近OSをSieraにしたので、たしかにそのタイミングぐらいからコケるようになった気がする。
こんなことで午前中を無駄にしてしまったorz-3
ちなみに、気づいたのがbrewコマンドを叩いた時w
brew大好きだぜ。
同じ原因でずっこける人も要るかもしれないので、念のためにエラーログを貼っておこう!
[info] Set current project to stanby-ats (in build file:/Users/omiend/hogehoge) java.lang.RuntimeException: Nonzero exit code (69) running git. at scala.sys.package$.error(package.scala:27) at scala.Predef$.error(Predef.scala:142) at com.typesafe.sbt.git.ConsoleGitRunner$.apply(ConsoleGitRunner.scala:25) at com.scalapenos.sbt.prompt.promptlets.GitPromptlets$class.gitStatus(GitPromptlets.scala:51) at com.scalapenos.sbt.prompt.promptlets.GitPromptlets$class.com$scalapenos$sbt$prompt$promptlets$GitPromptlets$$gitInfo(GitPromptlets.scala:31) at com.scalapenos.sbt.prompt.promptlets.GitPromptlets$$anonfun$gitPromptlet$1.apply(GitPromptlets.scala:15) at com.scalapenos.sbt.prompt.promptlets.GitPromptlets$$anonfun$gitPromptlet$1.apply(GitPromptlets.scala:15) at com.scalapenos.sbt.prompt.Promptlet.render(Promptlet.scala:15) at com.scalapenos.sbt.prompt.PromptTheme$$anonfun$1.apply(PromptTheme.scala:12) at com.scalapenos.sbt.prompt.PromptTheme$$anonfun$1.apply(PromptTheme.scala:12) at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) at scala.collection.immutable.List.foreach(List.scala:318) at scala.collection.TraversableLike$class.map(TraversableLike.scala:244) at scala.collection.AbstractTraversable.map(Traversable.scala:105) at com.scalapenos.sbt.prompt.PromptTheme.render(PromptTheme.scala:12) at $b60c967c006b29b77803$$anonfun$root$6$$anonfun$apply$1.apply(build.sbt:31) at $b60c967c006b29b77803$$anonfun$root$6$$anonfun$apply$1.apply(build.sbt:31) at sbt.BasicCommands$$anonfun$shell$1.apply(BasicCommands.scala:172) at sbt.BasicCommands$$anonfun$shell$1.apply(BasicCommands.scala:170) at sbt.Command$$anonfun$command$1$$anonfun$apply$1.apply(Command.scala:30) at sbt.Command$$anonfun$command$1$$anonfun$apply$1.apply(Command.scala:30) at sbt.Command$.process(Command.scala:93) at sbt.MainLoop$$anonfun$1$$anonfun$apply$1.apply(MainLoop.scala:96) at sbt.MainLoop$$anonfun$1$$anonfun$apply$1.apply(MainLoop.scala:96) at sbt.State$$anon$1.process(State.scala:184) at sbt.MainLoop$$anonfun$1.apply(MainLoop.scala:96) at sbt.MainLoop$$anonfun$1.apply(MainLoop.scala:96) at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17) at sbt.MainLoop$.next(MainLoop.scala:96) at sbt.MainLoop$.run(MainLoop.scala:89) at sbt.MainLoop$$anonfun$runWithNewLog$1.apply(MainLoop.scala:68) at sbt.MainLoop$$anonfun$runWithNewLog$1.apply(MainLoop.scala:63) at sbt.Using.apply(Using.scala:24) at sbt.MainLoop$.runWithNewLog(MainLoop.scala:63) at sbt.MainLoop$.runAndClearLast(MainLoop.scala:46) at sbt.MainLoop$.runLoggedLoop(MainLoop.scala:30) at sbt.MainLoop$.runLogged(MainLoop.scala:22) at sbt.StandardMain$.runManaged(Main.scala:54) at sbt.xMain.run(Main.scala:29) at xsbt.boot.Launch$$anonfun$run$1.apply(Launch.scala:109) at xsbt.boot.Launch$.withContextLoader(Launch.scala:128) at xsbt.boot.Launch$.run(Launch.scala:109) at xsbt.boot.Launch$$anonfun$apply$1.apply(Launch.scala:35) at xsbt.boot.Launch$.launch(Launch.scala:117) at xsbt.boot.Launch$.apply(Launch.scala:18) at xsbt.boot.Boot$.runImpl(Boot.scala:41) at xsbt.boot.Boot$.main(Boot.scala:17) at xsbt.boot.Boot.main(Boot.scala) [error] Nonzero exit code (69) running git. [error] Use 'last' for the full log.
チェイス
主演は、俺を涙のどん底に突き落とした最高のインド映画、きっと、うまくいく - the industrialのアーミル・カーン。
この人天才過ぎる。今回もめちゃくちゃ良かった。
前半はプレステージみたいな感じなんだけど、後半に行くほど話が深くなっていって、ラストは…
この秋観たいめっちゃオススメ映画でした。
ノンデザイナーズ・デザインブック(カラーを使ったデザイン)
とりあえず最終回
カラーを使ったデザイン
※色の話なので、実際に本を見た方がわかりやすい
- カラーホイール
- 黄、赤、青の三原色から始まる
- それぞれを合成し、二次色を作成
- さらに合成し、三次色を作成
- 補色
- カラーホイール上の真向かいにある色同士
- メインとアクセントとして利用し、最大の効果を発揮
- トライアド
- 等しい距離にある三色の組み合わせ
- 心地よい色合い
- 三原色はプライマリー・トライアド
- 緑、オレンジ、紫はセカンダリー・トライアド
- スプリッド・コンプリメント・トライアド
- ホイール上のどれか1つを選び、その色の補色の両脇の色を選択
- さらに少し洗練された、鋭さを持つ組み合わせが生まれる
- 類似色
- 隣り合う色の組み合わせ
- ヒュー
- 純粋な色
- シェードとチント
- ヒューに黒を加えるとシェード
- ヒューに白を加えるとチント
- 単色の組み合わせ
- 1つのヒューに対応する複数のチントやシェード
- トーン
- ヒューの濃淡の特定の質を示す言葉
- トーンが類似すると、濁った感じになる
- 濃淡をつける(コントラストを強める)といい
- 暖色と寒色
- 暖色は少し前に出る
- 寒色は少し後ろに引っ込む
- 赤や黄色で暖める
- 様々な青で冷やす
- CMYK
- C シアン(青)
- M マゼンタ(赤)
- Y イエロー
- K key色(通常は黒)
- この4色で何千もの色を作れるので、4色プロセスとも言われる
- 白 全ての色が無い状態
- 黒 全ての色が重なった状態
- 印刷機を使って物理的なものに印刷する時に使う
- RGB
- R 赤
- G 緑
- B 青
- 反射光ではなく、色のついた光線でできている(つまり、モニターから直接目に届く光線)
- 白と黒の関係は、CMYKの反対
- ファイルサイズが比較的小さい
- CMYKとRGB間でファイル変換を繰り返すと、その分データが失われるので、RGBで画像の処理を行い、最後にCMYKに変換するのが最善