takafumi blog

日々の勉強メモ

【Scala】【ScalikeJDBC】 Config設定方法

環境   Scala 2.11.8  ScalikeJDBC 2.5.0

  • 基本的にはこの内容 Configuration - ScalikeJDBC

  • scalikejdbc-conifg, application.confは設定方法によって必要

  • build.sbt

libraryDependencies ++= Seq(
  "org.scalikejdbc" %% "scalikejdbc"        % "2.5.0",
  "org.scalikejdbc" %% "scalikejdbc-config" % "2.5.0",
  "mysql" % "mysql-connector-java"          % "6.0.5",
  "ch.qos.logback"  %  "logback-classic"    % "1.1.7"
)
  • src/main/resourcese/application.conf
development {
  db {
    sandbox {
      driver="com.mysql.cj.jdbc.Driver"
      url="jdbc:mysql://localhost:3306/test"
      user="sa"
      password=""
    }
  }
}
/**
 * ConnectionPool config sample
 */
package main.scala.com.example

import scalikejdbc._
import scalikejdbc.config._
import com.mysql.cj.jdbc.Driver

object Db1{

  /**
   * Pattern 1
   */
  def ex1 = {
    // Initialize
    ConnectionPool.singleton("jdbc:mysql://localhost:3306/test", "sa", "")

    implicit val session = AutoSession

    // Query
    val r = sql"""select * from a""".map(_.toMap).list.apply()
    println(r)
  }

  /**
   * Pattern 2
   *   necessary import scalikejdbc.config._
   */
  def ex2 = {
    // Initialize
    Class.forName("com.mysql.cj.jdbc.Driver")
    val settings = ConnectionPoolSettings(
      initialSize = 5,
      maxSize = 20,
      connectionTimeoutMillis = 3000L,
    validationQuery = "select 1")

    ConnectionPool.add('example, "jdbc:mysql://localhost:3306/test", "sa", "", settings)

    implicit val session = AutoSession

    // Query
    val r = NamedDB('example) readOnly { implicit session =>
      sql"""select * from a""".map(_.toMap).list.apply()
    }
    println(r)
  }

  /**
   * Pattern 3
   *   necessary import scalikejdbc.config._
   *   necessary main/resources/application.conf
   */
  def ex3 = {
    // Initialize
    DBsWithEnv("development").setup('sandbox)
    // addで別の設定を追加する事も可能

    implicit val session = AutoSession

    // Query
    val r = NamedDB('sandbox) readOnly { implicit session =>
      sql"""select * from a""".map(_.toMap).list.apply()
    }
    println(r)
  }
}

【Scala】 sealedとパターンマッチ

環境   Scala 2.11.8

シールドクラス(トレイト)を継承したサブクラスは、すべて同一のソースファイルに定義される。
そしてシールドクラスをパターンマッチに使用されると、match式の網羅性をコンパイラがチェックできる。

sealedなし

このときはcaseのパターンが全て網羅されなくてもエラーは出ない。
が当然、網羅されていないパターンを投げると実行時エラーになる

trait Msg

case class TxtMsg() extends Msg
case class ObjMsg() extends Msg
case class ErrMsg() extends Msg

object Msg {
  def message(m: Msg): Unit = m match {
    case TxtMsg() => println("Text")
  }
}
$ scalac Msg.scala
$ # エラーは出ない
scala> :load Msg.scala
Loading test.scala...
defined trait Msg
defined class TxtMsg
defined class ObjMsg
defined class ErrMsg
defined object Msg

scala> Msg.message(ErrMsg())
scala.MatchError: ErrMsg() (of class ErrMsg)
  at Msg$.message(<console>:16)
  ... 33 elided

sealedあり

こうすると、コンパイルエラーになるので安全。

sealed trait Msg

case class TxtMsg() extends Msg
case class ObjMsg() extends Msg
case class ErrMsg() extends Msg

object Msg {
  def message(m: Msg): Unit = m match {
    case TxtMsg() => println("Text")
    case ObjMsg() => println("Text")
    // case ErrMsg() => println("Text")
  }
}
$ scalac test.scala
test.scala:8: warning: match may not be exhaustive.
It would fail on the following input: ErrMsg()
  def message(m: Msg): Unit = m match {
                              ^
one warning found

【Scala】 sbt, activatorのproxy設定

環境   Scala 2.11.8 CentOS7.0

sbtやactivatorを実行してmoduleをダウンロードしてくるときに、proxyで引っかかる時の対策。
内部で実行されるjavaコマンドがproxyで引っかかってるので、起動スクリプトを編集する手もあるが、以下の環境変数を設定する事で解決できる。

export JAVA_OPTS="$JAVA_OPTS -Dhttp.proxyHost=yourserver -Dhttp.proxyPort=8080 -Dhttp.proxyUser=username -Dhttp.proxyPassword=password"

これで実行可能になった。

~/.sbt/config/に設定ファイルを作るとか、HTTP_PROXYを設定しておけばOKとか色々見かけるが、私の環境では上手く動作せず。
最終的にこの方法で無事動作した。


【参考】

stackoverflow.com

【Scala】 空Listの表記

環境   Scala 2.11.8 CentOS7.0

なんか忘れるのでメモ

scala> val l1: List[Int] = Nil
l1: List[Int] = List()
scala> val l2 = Nil:List[Int]
l2: List[Int] = List()
scala> val l3 = List.empty[Int]
l3: List[Int] = List()
scala> val l4 = List[Int]()
l4: List[Int] = List()

全部同じ

【tmux】 TPM(Tmux Plugin Manager)で現在の状態を保存

環境   tmux 2.1

Tmux、便利ですよね。
そんなTmuxをもっと便利にするTPMというプラグインマネージャー。 github.com

使い方

ほとんどマニュアルそのままだけど
まずTPMをgit clone

$ git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

そして以下のように.tmux.confに使いたいプラグインを記述

set -g @tpm_plugins '              \
  tmux-plugins/tpm                 \
  tmux-sensible                    \
  tmux-plugins/tmux-resurrect      \
  tmux-plugins/tmux-pain-control   \
'

run-shell '~/.tmux/plugins/tpm/tpm'

そしてtmuxを起動してprefix + ITPMプラグインをインストールしてくれる。
最後に.tmux.confをリロードすれば完了。

現在の状態を保存するtmux-resurrec

で、もともと何をやりたかったかというと、ウィンドウやペインの状態は大体いつも同じ配置なのに、tmuxを終了すると再設定するのが大変という事で、状態を保存できるものを探してたどり着いたのがこちら。

ウィンドウとペインの状態をローカルに保存するので、PCを終了しても再度同じ配置に復元できる。
使い方は

状態の保存

prefix + Ctrl-s

状態の復元

prefix + Ctrl-r

とコレだけ。素晴らしい。

また復元するプログラムはデフォルト
vi vim nvim emacs man less more tail top htop irssi mutt
と設定されているが、

tmux-resurrect/restoring_programs.md at master · tmux-plugins/tmux-resurrect · GitHub

にあるように.tmux.confに以下のように記述すれば

set -g @resurrect-processes 'ssh psql mysql sqlite3'

他のプログラムも復元可能。

ちなみにsshでログインした先のサーバで開いていたプログラムもなんとか復元できないものかと、試行錯誤してみたがさすがに無理っぽかった。
素直にログイン先でtmux-resurrecを使う事にする。

そこを抜いても、十分に便利なのでオススメ。

github.com