Skip to content

Instantly share code, notes, and snippets.

View j5ik2o's full-sized avatar

Junichi Kato j5ik2o

View GitHub Profile

はじめてのScala

どんな言語?

  • オブジェクト指向パラダイムを主軸に関数型パラダイムを取り込んだプログラミング言語です。
  • コンパイラ言語であり、コンパイル結果はJavaバイトコードとなり、JVM上で実行可能です。

インストール方法

case class Cart
(id: CartId,
status: StatusType.Value,
customerId: CustomerId,
cartItems: List[CartItem])
extends Entity[CartId]
case class Cart
(id: CartId,
status: StatusType.Value,
customerId: CustomerId,
cartItems: List[CartItem]) extends Entity[CartId] {
// ...
def addCartItem(cartItem: CartItem): Cart = {
require(cartItem.quantity > 0)
cartItems.find(_.itemId == cartItem.itemId).map {
currentItem =>
protected def convertToEntity(json: J): E
protected def convertToEntityWithoutId(json: J): E
protected def createAction(implicit tjs: Writes[E], rds: Reads[J], ctx: EntityIOContext) = Action {
request =>
request.body.asJson.map {
json =>
json.validate[J].fold(defaultErrorHandler, {
validatedJson =>
@j5ik2o
j5ik2o / Javaメモリモデル.md
Last active August 29, 2015 13:59
Javaメモリモデルについて
  • 通常変数
    • 変数の値の再代入が可能。
  • final
    • 変数の値の再代入が禁止。
    • finalフィールドはコンストラクタが完了した時点で複数のスレッドから可視となる。
  • volatile
    可視性のみを保証する(ロックを獲得しない)。
    • コスト: 読み込みはNormalと同程度で、書き込みはNormalより高い(メモリバリアのため)
    • 可視性: ○
  • スレッド内での共有変数への書き込みを、ほかのスレッドにも反映させる必要がある場合に利用する。
case class Cart
(id: CartId,
status: StatusType.Value,
customerId: CustomerId,
cartItems: List[CartItem],
version: Option[Long]) extends Entity[CartId] {
def customer(implicit cr: CustomerRepository,
ctx: EntityIOContext): Try[Customer] =
cr.resolveById(customerId)
object Server extends App {
val service = new Service[HttpRequest, HttpResponse] {
def apply(req: HttpRequest): Future[HttpResponse] =
Future.value(
new DefaultHttpResponse(
req.getProtocolVersion, HttpResponseStatus.OK
)
)
}
val server = Http.serve(":8080", service)
#!/bin/sh
BACKUPS_DIR=~/backups
grep "\[インストール\]" /var/log/aptitude > $BACKUPS_DIR/apt-package.list
cd /
sudo tar zcvf $BACKUPS_DIR/etc_fail2ban.tgz etc/fail2ban
sudo tar zcvf $BACKUPS_DIR/etc_logwatch.tgz etc/logwatch
@j5ik2o
j5ik2o / Spray.scala
Last active August 29, 2015 14:03
spray-routingをベースしたControllerの書き方
import akka.actor._
import akka.io.IO
import spray.can.Http
import spray.routing.{Directives, HttpService, RequestContext, Route}
trait Action {
def apply(request: RequestContext): Unit
}
// あらゆる型を加算できる型クラス Adder
trait Adder[A] {
def add(a: A, b: A): A
}
// 型クラスのインスタンス Int用
implicit val intAdder = new Adder[Int] {
override def add(a: Int, b: Int): Int = a + b
}