53ningen.com

@gomi_ningen's Website

play 2.5 のアレコレ

play がいろいろと変わっているので、いろいろと走り書き

logback.xml を使え

  • WARN がうるさい
  • logback.xml という名前でとりあえず次のようなファイルを作っとけば OK
  • https://www.playframework.com/documentation/2.5.x/SettingsLogger
<!-- https://www.playframework.com/documentation/latest/SettingsLogger -->
<configuration>

    <conversionRule conversionWord="coloredLevel" converterClass="play.api.libs.logback.ColoredLevel"/>

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>${application.home:-.}/logs/application.lo...
Read More

AWS Lambda を用いた Amazon SNS のエンドポイント整理

Amazon SNS の Application に紐付いているエンドポイントには Enabled という Attribute がついています。文字どおり、有効なエンドポイントかどうかを表すものです。Amazon SNS は賢いので APNSGCM からのフィードバックを受けて、プッシュトークンが無効になった場合に自動的に false にしてくれます。しかし、基本的には Enabledfalse になったエンドポイントは不要です。したがって、これらを自動的に削除するような仕組みがあったほうがよさそうです。そこで、この記事では AWS Lambda を用いて、それを実現する方法について説明します。

AWS Lambda で動かすスクリプト

コード自体は非常に簡単で以下のような形です。AWS Lambda Function を素早く立ち上げるとしたら本来は pythonnode.js のほうが良いかと思いますが、今回の作りたいものに関してはそれほど即時性を求められるようなものではないと思うので、好きな言語(もちろん Lambda ...

Read More

無効になったSNSのエンドポイントを削除してくれる AWS Lambda コードを書いた

無効になったSNSのエンドポイント、別に放っておいてもよいのですが、定期的にお掃除したほうがよさそうだったので、お掃除用のAWS Lambdaコードを書きました。Amazon SNSは、アプリケーション(SNSのデバイストークンが登録できるやつ)に紐付いているエンドポイントの状態が変化したときに通知してくれる機能があります。その状態変化通知を受け取るトピックを適当に作っておいて、AWS Lambda コードがそいつを購読するようにしてあげればよいことになります。

ソースコード

...

Read More

タグ付けできない休日

package object tagged {
  type Tagged[A, T] = {type Tag = T; type Self = A}
  type @@[T, Tag] = Tagged[T, Tag]
}

case class Hoge(id: String @@ Hoge)
case class Foo(id: String @@ Foo)

scala> val hogeStr: String @@ Hoge] = "123".asInstanceOf[String @@ Hoge]
scala> val fooStr: String @@ Foo] = "123".asInstanceOf[String @@ Foo]
scala> val hoge1 = Hoge(hogeStr) //=> OK
scala> val hoge2 = Hoge(fooStr)  //=> NG
scala> hogeStr + "456" //=> "123456"

これを Swift で書こうとして無理だと悟って休日が終わりました。はぁ...。 はやく...

Read More

乱数生成を純粋化する

乱数の生成についての簡単な例を見てみよう。scala.util.Random が用意されているのでそれを使えば簡単だ。

scala> val rng = new scala.util.Random
rng: scala.util.Random = scala.util.Random@5e28ea8b

scala> rng.nextInt
res0: Int = -1998760920

scala> rng.nextInt
res1: Int = 1591304297

scala> rng.nextInt
res2: Int = -321914793

nextInt メソッドは呼び出しのたびに返ってくる値が異なる。呼び出しのたびに rng の状態が遷移していることが想像出来る。たとえば、ランダム性を利用したメソッドのテストを書こうとした場合、テストを再現可能にする必要があるが scala.util.Random では難しそうである。仮に乱数ジェネレータを直接扱うとしても、ジェネレータの状態を揃えてあげる必要がある。こういった状態に対処するために、...

Read More

遅延リストを作る

FP in Scala 第 5 章読書会の予習。Stream の作成については、半年前くらいに記事にまとめた。

リストの操作と無駄な中間リスト

リストへの map や filter 操作の評価は、模式的には以下のような感じで行われる。

List(1,2,3,4).map(_ + 10).fliter(_ % 2 == 0).map(_ * 3)
List(11,12,13,14).fliter(_ % 2 == 0).map(_ * 3)
List(12,14).map(_ * 3)
List(36,42)

中間リストが無駄に生成されているので、map や filter といった高階関数をつかって合成性をおとさずに、つまり while ループに頼らずなんとかしたい。そんなときに非正格性(non-strictness)を使うとよい。ということで「ワンランク上のリストの構築のしかた」を探っていく。

正格関数と非正格関数

「ワンランク上のリスト構築」をする前に正格性について確認を行っ...

Read More

Scalaのtraitを解剖してみた

Scala の trait を解剖してみた

trait Trait {

    val value: String = s"$getOne"

    def getOne: Int = 1

    def getTwo: Int

}

これを jad すると

// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name:   Trait.scala

import scala.Predef$;
import scala.StringContext;
import scala.runtime.BoxesRunTime;

public abstract class Trait$class
{

    public static int getOne(Trait ...
Read More

Scalaの末尾再帰除去を確認する

Scala の末尾再帰除去を実際に jad を使って確かめただけの簡単な記録。 jad の導入は以下のとおり。

brew tap homebrew/binary
brew install jad

簡単な階乗関数で確認すればわかりやすい

object Math {

  def fact(n: Int): Int =
  if (n < 2) 1
  else n * fact(n - 1)

  def fact2(n: Int): Int = {
    def go(n: Int, acc: Int): Int = {
        if (n < 2) acc
        else go(n -1, n * acc)
    }
    go(n, 1)
  }

}

こんなのをコンパイルして jad でどうなっているか確認します。以下その結果。

public final class Math$
{

    public int fact(int n)
    {
        return n >= 2 ? n...
Read More

Scalaの経路依存型(path-dependent type)とは?

Functional Programming in Scala の Wiki を翻訳している中で path-dependent types という単語が出てきてよくわからなかったので調べました。 調べたら hishidama さんのページが出てきてくれたので良かった(?)です。 詳細はそちらを参照していただければという感じなんですが、以下一応自分なりに噛み砕いてまとめてみました。

経路依存型(path-dependent types)

普通に Java で内部クラスを定義したとすると、以下のような感じになると思います。Scala でも同様に書けると思います。

class A {
    class B {
    }
}

さてここから先、内部クラスのインスタンスを生成したときの挙動が Java と Scala で変わるそうです。 まずは Java の例を見てみましょう。

Java では class A の異なるインスタンス a1, a2 を用いて、それぞれの内部クラス B のインスタンスを生成したとしても、それらは同じ型です。 つまり以下のような...

Read More

Scalaでストリームを実装する

scala では基本的に式は正格評価されます。 評価を遅らせたい場合は、サンク(thunk)と呼ばれる関数にしてあげることになります。 単純な例から見てみてみましょう。

scala> 1
res4: Int = 1

scala> def one = () => 1
one: () => Int

scala> one()
res6: Int = 1

このようにある A 型の値をサンクにしたい場合は () => A 型の関数にしてあげればよいです。 評価したくなったタイミングで関数にユニット () を渡してあげる形になります。

特に関数定義の際に引数の評価を遅らせたいことがあると思います。 以下のように数字を 2 倍する関数を定義できます。

scala> def twice(x: () => Int) = 2 * x()
twice: (x: () => Int)Int

scala> twice(() => 2)
res: Int = 4

この場合、呼び出し側と実装部分で () を付けるのが面倒なのですが、 x とだけ書けば良いように、便利な...

Read More

Copyright © 53ningen.com