JavaScriptでUtilityっぽいものを作る

JavaScriptでUtilityっぽいものを作るには。 同僚に教えてもらったのでメモ。

// Utilityっぽいの
var Sample = (function() {

 var pub = function() {
   console.log('publicだよ');
 };

 var prv = function() {
   console.log('privateだよ');
 };

 return {
   // 公開したいメソッドだけ
   pub: pub 
 }

})(); 

// 使い方
Sample.pub();

Mockitoでvoidメソッドをゴニョゴニョする

doAnswer を使うと、Mockのvoidメソッドの中でゴニョゴニョできる。
全然違うことで悩んでいて見つけた方法なので、使い所はよくわからない(笑)
けど、メモとして残しておく。

以下はSpockで書いた場合で、メソッドの呼ばれた回数を集計してる。
(実際に回数を集計したいときは times() を使えばOK)

def "voidメソッドでゴニョゴニョする"() {
        setup:
        Hoge hoge = mock(Hoge.class);
        int count = 0;
        Mockito.doAnswer(new Answer<Void>() {
            @Override
            Void answer(InvocationOnMock invocationOnMock) throws Throwable {
                count++
                return null
            }
        }).when(hoge).mockMethod()

        when:
        // do something

        then:
        // count assertion
        count == 1
    }

MySQL、localhostだとポート指定オプション効かないってマジですか。。

検証用のMySQLデータベースをせっかくなのでDockerコンテナで作ったら、接続できないという事態。

docker run -d -p 13306:3306 --name mysql-for-local mysql-for-local

こんな感じでコンテナを起動して

mysql -u root -D my_db -h localhost -P 13306 -A

こんな感じで接続しようとしても繋がらない。。 正確にはローカルのMySQLに繋がってしまう。

docker exec -ti mysql-for-local /bin/bash

して、コンテナ内部でmysqlに接続するとちゃんと繋がる。

もしかして、-Pオプションが効いてない?と思ってぐぐってみたら、まさかそのとおりでした。。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.2.2 MySQL サーバーへの接続

Unix では、MySQL プログラムはホスト名 localhost を、ほかのネットワークベースのプログラムと比較して想定されるのとはおそらく異なる、特別な方法で扱います。localhost への接続で、MySQL プログラムは Unix ソケットファイルを使用してローカルサーバーに接続しようとします。これは、ポート番号を指定するために --port または -P オプションが与えられた場合にも生じます。クライアントがローカルサーバーに TCP/IP 接続を行うことを保証するには、--host または -h を使用して、ホスト名の値 127.0.0.1、またはローカルサーバーの IP アドレスまたは名前を指定します。--protocol=TCP オプションを使用して、localhost に対しても、接続プロトコルを明示的に指定することもできます。

localhostをIP指定することで無事解決できました。

mysql -u root -D my_db -h 127.0.0.1 -P 13306 -A

ちなみに、後で知ったのですがMySQLではFAQらしいです。

参考

引数にオブジェクトを渡すか、個別に渡すか

メソッドを作成するときに、引数の数が増えてくるとどう対応したものかよく迷う。
と思ったらコードコンプリートに答えが書いてあった。

「第二部 7.5 ルーチンの引数の使用」あたりでの僕の理解。

  • 2つの意見がある

    • 個別に渡して結びつきを最小限に抑える
    • オブジェクトを渡して柔軟性を持たせ、インターフェイスを安定させる
  • どちらも短絡的

  • ルーチンの抽象化概念がオブジェクトを使って何かをすることであればオブジェクトを渡すべき

  • たまたま同じオブジェクトが提供するということであれば、個別に渡すべき

つまり引数の数がたとえ少なくても、その抽象化概念がオブジェクトに対するものなら、引数はオブジェクトであるべきってことなのね。
うん、しっくりくる(実践は難しそうだけど)。

短絡的な2つでいつも悩んでた。。

CircleCIでdot(graphviz)が動かなくなった

概要

qiita.com

↑な感じでDB定義の管理にSchemaSpyを利用しているんだが、リレーションの描画にSchemaSpyは Graphviz を使っている。 しかし最新のビルドでリレーションの描画がされていなかった。 その調査と対応のまとめ。

現象

SchemaSpyで描画されなかったメッセージ。

SchemaSpy was unable to generate a diagram of table relationships. 
SchemaSpy requires Graphviz version 2.2.1 or versions greater than 2.4 from www.graphviz.org.

SchemaSpyの実行ログ。

Failed to query Graphviz version information
  with: dot -V
  java.io.IOException: Cannot run program "dot": error=2, No such file or directory

原因と対応

CircleCIのコンテナイメージを変更したのが原因。
Graphviz は Ubuntu14 で動かない。

[Project Setting] → [Build Environment]→ [OS to use for builds]

Ubuntu 14.04 (Trusty)」を「Ubuntu 12.04 (Precise)」に変更することで解決する。

調査の記録

Rebuild with ssh してコンテナにSSHしてみた。

ubuntu@box32:~$ dot -V
The program 'dot' is currently not installed. You can install it by typing:
sudo apt-get install graphviz

無いと言われる。。描画されていたときのコンテナもsshしてみる。

ubuntu@box1032:~$ dot -V
dot - graphviz version 2.26.3 (20100126.1600)

もしかして無くなってしまった?と思い公式を確認。

Ubuntu 12.04 (Precise) - CircleCI

あるって書いてある。。

こんな記事を見つけた。

mao-instantlife.hatenablog.com

サンプルプロジェクトで自分でビルドしてインストールするようにしてみた。 →うまく行ったヽ(=´▽`=)ノ

dependencies:
  cache_directories:
    - graphviz-2.38.0
  pre:
    - wget -O graphviz.tar.gz --quiet http://www.graphviz.org/pub/graphviz/ARCHIVE/graphviz-2.38.0.tar.gz
    - tar -zxf graphviz.tar.gz
    - graphviz-2.38.0/configure --silent
    - make --silent --ignore-errors && make --silent --ignore-errors install > /dev/null
    - echo 'which dot && version:'
    - which dot
    - dot -V

自分でビルドするのはイマイチなので、バイナリをインストールするように修正。

dependencies:
  pre:
    - wget -O ../graphviz-dev_2.38.0-1~precise_all.deb http://www.graphviz.org/pub/graphviz/stable/ubuntu/ub12.04/i386/graphviz-dev_2.38.0-1~precise_all.deb
    - sudo dpkg -i ../graphviz-dev_2.38.0-1~precise_all.deb
    - dot -V

wget毎回するのも嫌なので、プロジェクト内部で持つように修正。

pre:
    - sudo dpkg -i ./.circleci/graphviz-dev_2.38.0-1-precise_all.deb
    - dot -V

サンプルプロジェクトで動作検証できたので、本ちゃんのプロジェクトに適用!

ところが

$ dot -V
bash: line 1: dot: command not found

dot -V returned exit code 127

Action failed: dot -V

CIのログをサンプルプロジェクトと細かく比較してみる →Start containerに差分

CIRCLE_BUILD_IMAGE=ubuntu-12.04
CIRCLE_BUILD_IMAGE=ubuntu-14.04

どうも意図せずコンテナイメージを変更していたらしい。。

[Project Setting] → [Build Environment]→ [OS to use for builds]

Ubuntu 14.04 (Trusty)」を「Ubuntu 12.04 (Precise)」に変更。

そもそも Ubuntu14 で動かないのであった。。

久々のrubyをバージョンアップ

概要

久々にRuby触ろうとしたらバージョンが古かったので更新した。

現状確認

Rubyは入ってる。

$ ruby -v
ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin15]

rbenvも入ってた。

$ rbenv --version
rbenv 1.0.0

欲しいバージョン(2.3.1)がいない。

rbenv install --list

rbenvの更新

$ rm -rf ~/.rbenv/plugins/ruby-build
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

欲しいバージョン(2.3.1)が増えた。

rbenv install --list

rubyの更新

$ rbenv install 2.3.1
$ rbenv global 2.3.1
$ rbenv rehash

rubyの更新

でけた

$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]

削除したリモートブランチをローカルに反映する

概要

Pull Request マージされて、featureブランチ削除したのに、git branch -a すると出てくる。

手順

pull or fetch のときに --prune を使う。

o$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/hoge
  remotes/origin/fuga
  remotes/origin/piyo
$ git fetch --prune
From github.com:xxxx
 x [deleted]         (none)     -> origin/hoge
 x [deleted]         (none)     -> origin/fuga
 x [deleted]         (none)     -> origin/piyo
git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

スッキリしたヽ(=´▽`=)ノ

参考