Screaming Loud

日々是精進

slickにおける動的にwhere句を作る

Slickにおける動的where句の作り方

現在最新は3系ですが環境としては、Slick2.1での書き方での紹介です。
Documentation | Slick

Slickにおいて動的にwhere句を作るのは、案外Scalaを始めたばかりだとうまくいきません。

以下の様なクラスに対して複数の検索をかけるとき、

type Address = (Int,String,String)
class Addresses(tag: Tag) extends Table[Address](tag, "ADDRESS") {
  def id = column[Int]("ID", O.PrimaryKey, O.AutoInc)
  def street = column[String]("STREET")
  def city = column[String]("CITY")
  def * = (id,street,city)
}
lazy val addresses = TableQuery[Addresses]

多分一番最初に思い浮かぶ方法は以下だと思います。

def find(streetOp: Option[String], cityOp: Option[String])(implicit session: Session) = {
  val q = streetOp.map(s => addresses.filter(_.street === s).getOrElse(addresses)
  val q1 = cityOp.map(c => q.filter(_.city === c).getOrElse(q)
  q1.list
}

しかし、実はfilter()の中をColumn[Option[Boolean]]を返すことで条件として満たします。
なので、以下の様な書き方ができます。

def makeCondition(row: Addresses, streetOp: Option[String], cityOp: Option[String]): Column[Option[Boolean]] = {

    val True: Column[Option[Boolean]] = Some(true)
    val a: Option[Boolean] = (if (streetOp.nonEmpty) row.street === streetOp.get else True) &&
      (if (citiOp.isDefined) row.city === cityOp.get else True)
    a   
}
addresses.filter(q => makeCondition(q, Some("東海道"), None)).list

この書き方の場合、検索条件を関数化できるので、複数の部品による組み合わせができます。

例えば、

addresses.filter(q => makeCondition(q, Some("東海道"), None) || q.id === 1).list

みたいなことができます。

使う機会は多いのに、ドキュメントからではなかなかわからないのですが、ぜひ活用してみてください。

社内勉強会でDeepLearningの話をしました。

もともと自分が知りたかったということもあり、DeepLearningの話を社内勉強会で発表しました。

そもそも機械学習自体を知らない人もいるので、入門的な機械学習とはなにか?から始めたのですが、
結局、中途半端に数式をいれたり削ったりしたために、結局わかりづらいスライドになってしまった感が否めません。

何か間違いなどあれば指摘していただければ幸いです。

www.slideshare.net

MacのYosemiteからEI Capitanにアップデートした際のbrewの対応

特に問題なくアップデートできました。

EI Captianから/usr/localを自分で作れなくなったので、EI Capitanからbrewのデフォルトである/usr/local/Cellarが使えません。
ただ、Yosemiteからの移行の場合は、すでに/usr/local/Cellarが作られているはずで、問題なくアップデートできました。

その際、いくつかやるべき手順があったので、メモしておきます。

EI Capitanからのアップデート

そもそもbrew cask updateをかけても以下のエラーが出ており、困っていたので実行しました。

$ brew cask update
==> error: Ref refs/remotes/origin/master is at 3eaf298cbbe8fc31d5f022e742c8b5dc
==> error: Cannot lock ref 'refs/remotes/origin/master':
==> Error: Failure while executing: git pull --ff --no-rebase --quiet origin ref
error: Ref refs/remotes/origin/master is at 3eaf298cbbe8fc31d5f022e742c8b5dcd0ef06aa but expected cd5cc7e2d6be6d657a749570551f71564da06437
error: Cannot lock ref 'refs/remotes/origin/master':
Error: Failure while executing: git pull --ff --no-rebase --quiet origin refs/heads/master:refs/remotes/origin/master
brew cask update  2.98s user 2.25s system 42% cpu 12.327 total

そもそも、その前にEI CapitanからRootlessという概念が加わり、操作できないディレクトリが増えました。
OS X 10.11 El Capitanにアップデートするさいの注意点まとめ。

なので、その対応がbrewに関しても必要となっています。

1. brewが使う/usr/localの権限を変更する。
homebrew/El_Capitan_and_Homebrew.md at master · Homebrew/homebrew · GitHubに書いてあるとおり、実行します。
そこそこ時間がかかります。

sudo chown -R $(whoami):admin /usr/local

2. brewレポジトリを最新にする。
/usr/localの権限を変えただけだと、まだ$ brew cask updateのfetchエラーが出ていたので、以下を実行しました。

$ cd `brew --prefix`
$ cat .git/config
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = false
        autocrlf = false
[remote "origin"]
        url = https://github.com/Homebrew/homebrew.git
        fetch = +refs/heads/*:refs/remotes/origin/*

$ git fetch origin
$ git rebase origin/master

これで、repositoryを最新にして動かすことができました。

参考:qiita.com

anyenvで入れたphpenvに対して、composerを使う

デフォルトではcomposerなどがホームディレクトリに入ってしまうので、
anyenvで入れたphpenvで切り替えた時に、対応ができません。

anyenvの入れ方はyuutookun.hatenablog.com
を参照してください。


ですので、別の入れ方をする必要があります。

phpenv 環境で composer global でパッケージをバージョン別にインストールするプラグイン - ngの日記を参考にいれてみました。

まず、以下を入れます。
ngyuki/phpenv-composer · GitHub

$ cd ~/.anyenv/envs/phpenv/plugins
$ git clone https://github.com/ngyuki/phpenv-composer.git
$ phpenv rehash

次にcomposerを実行します。

$ cd ~/.anyenv/envs/phpenv/plugins
$ phpenv-composer/libexec/composer
Download composer.phar ...
#!/usr/bin/env php
All settings correct for using Composer
Downloading...

Composer successfully installed to: /Users/yuto/.anyenv/envs/phpenv/plugins/composer.phar
Use it: php ./composer.phar
Move composer.phar to /Users/yuto/.anyenv/envs/phpenv/versions/5.6.9/composer
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.0-dev (c41079192f38f0fc446b17baa8f628dcb3b61e7d) 2015-09-28 09:38:16

出力から分かる通り、composer.pharがphpの5.6.9のフォルダ以下に移動されています。

ここで、ホームディレクトリを確認すると、ちゃんと移動していることがわかります。

$ phpenv-composer/libexec/composer config -g home
/Users/yuto/.anyenv/envs/phpenv/versions/5.6.9/composer

例えば、larabelをインストールすると、

$ phpenv-composer/libexec/composer global require "laravel/installer=~1.1"
$ ls ~/.anyenv/envs/phpenv/versions/5.6.9/composer/vendor/
autoload.php bin          composer     guzzlehttp   laravel      react        symfony

でちゃんとインストールされていることがわかります。