Skip to content

Instantly share code, notes, and snippets.

@jkugiya
jkugiya / eff_vs_mt_eff.scala
Created December 17, 2020 07:40
Effの例
package jkugiya.fp.eff
import org.atnos.eff.concurrent.Scheduler
import scala.concurrent.{ ExecutionContext, Future }
object Usage {
import cats._
import org.atnos.eff.future.{ _future, fromFuture }
@jkugiya
jkugiya / eff_vs_mt_mt.scala
Created December 17, 2020 07:38
モナドトランスフォーマーの例
package jkugiya.fp.mt
import scala.concurrent.{ ExecutionContext, Future }
object Usage {
import cats._
import data._
case class Inventory(
@jkugiya
jkugiya / unitofwork.scala
Created December 15, 2020 12:05
PofEAAのUnit of Work
import scala.util.Random
class DomainObject(
val id: Option[String]
) {
protected def markNew(): Either[String, Unit] = UnitOfWork.getCurrent.registerNew(this)
protected def markClean(): Either[String, Unit] = UnitOfWork.getCurrent.registerClean(this)
protected def markDirty(): Either[String, Unit] = UnitOfWork.getCurrent.registerDirty(this)
protected def markRemoved(): Either[String, Unit] = UnitOfWork.getCurrent.registerRemoved(this)
}
@jkugiya
jkugiya / intersection.scala
Created October 22, 2020 09:08
交差型の変位について
object Covariant {
trait Animal
trait Cat extends Animal {
def bow(): Cat
}
trait Dog extends Animal {
def bow(): Dog
}
class CatDog extends Cat with Dog {
@jkugiya
jkugiya / email.bash
Last active June 5, 2020 01:46
emailをterraterm/opensslで
openssl s_client -starttls smtp -crlf -connect ${MAIL_HOST}:${MAIL_PORT}
EHLO ${MAIL_HOST}
AUTH PLAIN `printf "%s\0%s\0%s" ${MAIL_USER} ${MAIL_USER} ${MAIL_PASSWORD} | openssl base64 -e | tr -d '\n';echo
`
mail from: <${FROM_ADDRESS}>
rcpt to: <${TO_ADDRESS}>
data
From: from<${FROM_ADDRESS}>
To: to<${TO_ADDRESS}>
@jkugiya
jkugiya / 継承を使わないで共通フィールドを表現する.md
Last active November 24, 2019 10:48
継承を使わないで共通フィールドを表現する

継承を使わないで共通フィールドを表現する

以下のような要件をモデリングするには?

  • ディスク情報製造者サイズを持つ。
  • 製造者はディスクを製造したメーカーの識別子を表す。
  • サイズはディスクのサイズをGB単位で表す。
  • ディスク情報は、さらにディスクの種類に応じた情報を持つ
    • ディスクの種類がハードディスクの場合、回転数(RPM)プラッタの数を持つ
    • ディスクの種類が*マルチメディアカード(MMC)*の場合、ピンの数
@jkugiya
jkugiya / UUIDTypeBinder.scala
Created October 3, 2019 13:03
scalikejdbc - postgresql/UUID対応
trait UUIDTypeBinder {
implicit val uuidPBF: ParameterBinderFactory[UUID] = ParameterBinderFactory[UUID] { value => (stmt, idx) =>
stmt.setObject(idx, value)
}
implicit val uuidTB: TypeBinder[UUID] = new TypeBinder[UUID] {
override def apply(rs: ResultSet, columnIndex: Int): UUID = rs.getObject(columnIndex, classOf[UUID])
override def apply(rs: ResultSet, columnLabel: String): UUID = rs.getObject(columnLabel, classOf[UUID])
}
@jkugiya
jkugiya / monad_transformer.md
Last active March 10, 2019 07:19
Monad Transformer

ボイラープレートを少なくするために使用する。

OptionT

以下のような関数を合成する

  def echoName(name: String): Future[String] = Future.successful(name)
  def greeting(g: Option[String]): Future[Option[String]] = Future.successful(g)
@jkugiya
jkugiya / snake_case.scala
Last active July 22, 2018 08:16
スネークケースへの置換
package exam
import java.util.Locale
object RegexExam {
import scala.collection.mutable
private val PASS1 = """([A-Z]+)([A-Z][a-z])""".r
private val PASS2 = """([a-z\d])([A-Z])""".r
private val REPLACEMENT = "$1_$2"
@jkugiya
jkugiya / base64UUID.scala
Last active July 22, 2018 05:01
base64 uuid
def create(): String = {
// This is not url safe. It may cause problem in web application.
// val encoder = Base64.getEncoder
val encoder = Base64.getUrlEncoder
val uuid = UUID.randomUUID()
val buffer = ByteBuffer.wrap(new Array[Byte](16))
buffer.putLong(uuid.getMostSignificantBits)
buffer.putLong(uuid.getLeastSignificantBits)
encoder.encodeToString(buffer.array())
}