【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とか色々見かけるが、私の環境では上手く動作せず。
最終的にこの方法で無事動作した。
【参考】
【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 + I
でTPMがプラグインをインストールしてくれる。
最後に.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を使う事にする。
そこを抜いても、十分に便利なのでオススメ。
【Node.js】 NVMで最新版のNode.jsをインストール
環境 CentOS 7.2 NVM 0.31.1 Node.js 6.2.0
nightlyビルドを使いたいという事でなければ、stable版はnvmを使うのが便利。
■NVMのインストール
git clone https://github.com/creationix/nvm.git ~/.nvm
source ~/.nvm/nvm.sh
■Node.jsのバージョン確認
nvm ls-remote
とすると、インストールできるNode.jsのバージョンがズラーっと出るので、使いたいものを選択する。 今回は最新の6.2.0を使用。
■Node.jsインストール
NODE_VER=6.2.0 nvm install $NODE_VER nvm alias default $NODE_VER
毎度読み込むのは大変なので.bash_profileに
$NODE_VER=6.2.0 if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh nvm alias default $NODE_VER fi
と書いておけば自動で設定される。