読者です 読者をやめる 読者になる 読者になる

takafumi blog

日々の勉強メモ

【Docker】 docker toolboxでdockerとvagrantを共存

VirtualBox Vagrant Docker

環境  Windows 10 VirtualBox 5.1.12 Vagrant 1.8.7 docker 1.13.1

壮絶に勘違いしていた事。

Windowsで現行Dockerはdocker for windowsしかないと思ってたorz

普通にdocker toolboxとかあるんですね。

docker for widows docker toolbox vagrant
仮想化方式 Hyper-V VirtualBox VirtualBox/Hyper-V
VirtualBoxとの共存 x o o / x
Hyper-Vとの共存 o x o / x
  • Vagrantはprovider選択でHyper-Vを選ぶ事が可。
  • ただしWindowsHyper-VのサービスをONにすると、Hyper-V以外のVirtualBoxは使えなくなる。
    なので実際にはどちらか一方を選択という事になる。

docker toolboxは結局VirtualBox上にホストを立てるので、Vagrant上のVirtualBox上でやってもあまり変わらない。 しいて言うなら一枚中間が少なくなって、dockerコマンドがCMD上から使えるが、Linux使いだとCMDでdockerコマンド使えてもそんなにうれしくない気がする。

f:id:takafumi-s:20170218135432p:plain

【Selenium】 【Node.js】独自なwait()条件を作る

Selenium Node.js JavaScript

環境   Ubuntu 16.04 Selenium Standalone Server 3.0.1

const webdriver = require('selenium-webdriver');
const promise = require('selenium-webdriver/lib/promise').Promise;
const driver = new webdriver.Builder() // オプション省略

let cond = function(val) {
    return new webdriver.Condition(
        "something message.",
        /**
         * @return {!ManagedPromise<T>}
         */
        function(driver){
            return promise.resolve(val);
        }
    );
}
driver.wait(cond(true), 60000);
  • ちなみにdocument.readyState == 'complete'を条件にするwait条件をつくりたかったのだが、webdriver.get()webdriver.click()はデフォルト対応しているらしい。 そしてajaxには無用・・・orz
  • 更にちなみに、一応以下のような感じ。テスト実施しているブラウザで、document.*みたいなのを使いたいときには参考になるかも。
let cond = new webdriver.Condition(
    "something message.",
    function(driver){
        return driver.executeScript('return document.readyState').then(r => {
            return r == 'complete';
        })
    }
);

【Selenium】 エラーがでたらまずdriverを更新する

Selenium

環境   Ubuntu 16.04 Selenium Standalone Server 3.0.1

$ mocha test.js

// 略
WebDriverError: unknown error: Runtime.executionContextCreated has invalid 'context': {"auxData":{"frameId":"16896.1","isDefault":true},"id":1,"name":"","origin":"://"
}

// stack trace

みたいのが延々と出て悩む。

$ node test2.js

みたいのは平気だったので、スクリプトの問題かと思って、また延々と悩む。

結局chromedriverを最新(2.27)に更新したら、サクッと直りました。 まずは悩む前にdriver更新しなさいという教訓。

【Ubuntu】 サーバーイメージにX Window Systemインストール

Ubuntu

環境   Ubuntu 16.04

  • サーバーイメージだとxorgがないのでインストール
$ sudo apt-get -y install xorg xserver-xorg
  • 起動
$ startx
  • xeyesとかで確認してみる。

  • 終了

$ exit

【Scala】【ScalikeJDBC】 Config設定方法

Scala

環境   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

環境   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