Home –  Scala
Tag Archives: Scala

Scalaの正規表現のエスケープ

正規表現中、ユーザーからの入力を検索文字列として使いたいときありますよね?
色々日本語のサイト検索しながら正規表現のエスケープについて調べていたのですが、探し方が悪いのか有用な情報がなかなか見つかりませんでした。

困り果ててAPI調べたら、Scalaの正規表現のオブジェクトであるRegexにはquoteメソッドがあるじゃないかーヽ(`Д´)ノプンプン

ということでREPLを立ち上げて実行してみる。

scala>import scala.util.matching.Regex
import scala.util.matching.Regex

scala> Regex.quote("aaaa")
res0: String = \Qaaaa\E

ふむ\Q\Eで囲まれるのかぁ。\Q\Eってなんだ?JVMの正規表現の仕様?と思ったら、Perlの正規表現にもあるみたいですね。
こんなん知らなかったわー。

ということでquoteする文字に\E入れたらどうなるんですかねと気になったので確認

scala> Regex.quote("""aaa\Ea""")
res1: String = \Qaaa\E\\E\Qa\E

お、おぅ・・・なんだか\Eが一杯に・・・。

\Eの文字列がある場合、その前に一旦\Eで終わらせてから\Eで\E単体でマッチさせてまた\Qから始めるという感じなんですね。

正しくクオートしてくれましたし、単純に\Q\Eで囲む機能ではなくて良かったです。

Play Framework で 206 Partial Content を返したい

気がつけば半年以上、放置していますね。イカンイカン(・_・;)

最近、趣味でPlay Frameworkを使っています。Play FrameworkはScalaもしくはJava用のWeb Frameworkです。
私はJavaの冗長な記述が嫌だというのもあるのでScalaを勉強しつつ使ってます。

それで使ってるうちにHTTPのレスポンスで「206 Partial Content」を返したいなという事がおきて、作ったので後々のメモ代わりにBLOGに書いておこうかなと。

通常Play Frameworkでレスポンスでファイルをクライアントに送信する場合はさくさくと一文でできてしまいます。

def index = Action {
  Ok.sendFile(new java.io.File("/tmp/fileToServe.pdf"))
}

https://www.playframework.com/documentation/ja/2.3.x/ScalaStream

この場合、クライアントから「Range: bytes=xxx-xxx」みたいなリクエストに多分(考えて見たら未確認だった・・・!)対応出来ません。

で、自分で実装してみようかともい頑張ってみました。

Play FrameworkではEnumeratorのおかげで、一気にメモリを取得せずちまちまと少しずつデータが遅れるので巨大なデータでも安心ですね。
最初取っ付きづらかったですが、この仕組は素晴らしいなぁと作ってて思いました。

以前、Railsとかで同様の仕組みを作った時に、一気にファイルを取得してデータを返していたのでファイルサイズに応じてメモリを大量に使用しまうという問題があったりしたので(・_・;)
もしかしたらやり方がまずかったからかもしれませんが。

read more