Screaming Loud

日々是精進

2016年に読んだ本のまとめ

昨年末に読んだ本をまとめましたが、今年もやってみたいと思います。
昨年のリンクはこちら→ 2015年に読んだ本を振り返る - Screaming Loud

今年読んだ冊数は42冊でした。
昨年が30冊なので増えたのですが、前半にすごい高いペースで読んでいたのが、多くなった理由です。

あと、今年から引っ越して電車通勤になったおかげで読む時間ができたというのも、一つの理由ですね。

また、後半は組織論的な話を考える部分が多く、読んだ本もその付近が多かったですね。
ビジョナリーカンパニーなども名著ですが、今更ながら読みました。

良かった本

bookmeter.com

この本はメッセージ集なので一瞬で読めるのですが、その一語一語に重みがあるので突き刺さってくる。
ぜひ、一度手にとって見て欲しいです。

bookmeter.com
自分たちが普通に行っていることが実は女性だからと思って実施してしまっていることが多数あることに気づきます。
女性の社会進出が求められている中で、男性にも女性にもぜひ一度読んで自分の考え方を見直してみては。


他にも読んだ本は色々感想も書いているので、以下リンクから見てみてください。
mocyutoさんの読んだ本 - 読書メーター

Play2.4で非推奨のGlobalSettingをなくす

Play2.4で非推奨、かつPlay2.5ではなくなっているGlobalSettingの消し方を紹介します。
なかなか大変なので、ブログにまとめておきました。

Global.scalaで書いていたコード

Play2.3で書いていたGlobal.scalaのコードを記載します。

object Global extends WithFilters(CsrfFilter, AccessLoggingFilter, SystemAccessFilter) with GlobalSettings with JsonHelper {

  override def onStart(app: Application) {
    Akka.system.scheduler.schedule(1 hour, 1 hour) {
      Image.cleanTempImage()
    }
  }

  override def onError(request: RequestHeader, ex: Throwable): Future[Result] = {
    Logger.warn(s"Internal server error. Messages : ${e.getMessage} ExceptionMessage: ${e.getMessage()}")
  }
}

/**
 * アクセスログ出力フィルター
 */
object AccessLoggingFilter extends Filter {
  import models.component.RequestComponent._

  val accessLogger = Logger("access")
  def apply(next: (RequestHeader) => Future[Result])(request: RequestHeader): Future[Result] = {
    val resultFuture = next(request)
    val startTime = System.currentTimeMillis

    resultFuture.flatMap { result =>
      val takeTime = System.currentTimeMillis - startTime
      val msg = s"method=${request.method} uri=${request.uri} remote-address=${request.ipAddr} status=${result.header.status} user-agent=${request.userAgent} takeTime=${takeTime} ms"

      if (takeTime >= 1000) accessLogger.warn(s"*** ${msg} ***")
      else accessLogger.info(msg)

      resultFuture
    } recover {
      case NonFatal(ex) => {
        val takeTime = System.currentTimeMillis - startTime
        val msg = s"method=${request.method} uri=${request.uri} remote-address=${request.ipAddr} status=500 user-agent=${request.userAgent} takeTime=${takeTime}"
        accessLogger.error(msg)
        throw ex
      }
    }
  }
}
続きを読む

fileを開いて指定行数分取得する

fileを開いて、指定行数の分だけ取得するというロジックを作成していたのですが、
そもそもinputが指定行数以上あるかどうかを知りたかったので、そこもうまく取得できるような実装にする必要がありました。

BufferedReaderで最後の値が、nullになるので、null判定を行うことで、実装。

lisp脳なのか、headとtailでばかり考えていたのですが、
initとlastを使えばうまく実装できたので、メモとして。

ちなみに、aの値は以下のようになるのですが、

val a = Stream(1,2,??)

aの値代入が終わったあとでも以下のようにreader.readLine()を呼ぶと、aの値が変わります。

val reader = new Buffered...
val a = Iterator...
println(reader.readLine())
print(a)

なぜかは完全には把握していないのですが、Iteratorが遅延して評価しており、aの値が確定する前にreader.readLine()を読んでしまうのだろうということが仮説です。