DRYな備忘録

Don't Repeat Yourself.

Docker for Macのインストールと複数VMをつくるまで

インストールのログ

f:id:otiai10:20170523100821p:plain

f:id:otiai10:20170523100650p:plain

f:id:otiai10:20170523100724p:plain

f:id:otiai10:20170523100952p:plain

f:id:otiai10:20170523101108p:plain

% which docker
/usr/local/bin/docker
% docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
% docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL   SWARM   DOCKER   ERRORS
% docker-compose ps
ERROR:
        Can not find a suitable configuration file in this directory or any
        parent. Are you in the right directory?

        Supported filenames: docker-compose.yml, docker-compose.yaml

%

docker-machinedocker-composeも入ってるやん?VM複数つくっていいのかな。VirtualBoxではなくHyperkitという差はある。

まずは適当になんか立てる

% docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL   SWARM   DOCKER   ERRORS

docker toolbox的に言えば、machineがひとつも立ってないんだからdockerホストいなくね?っていう気持ちだけど、とりあえずやってみる。自作のOCRサーバ立ててみる。

% docker run --rm -p 8080:8080 otiai10/ocrserver
Unable to find image 'otiai10/ocrserver:latest' locally
latest: Pulling from otiai10/ocrserver
386a066cd84a: Pull complete
75ea84187083: Pull complete
88b459c9f665: Pull complete
a31e17eb9485: Pull complete
1b272d7ab8a4: Pull complete
eca636a985c1: Pull complete
08158782d330: Pull complete
fb9f7b3131a3: Pull complete
fcf51ff1519d: Pull complete
afdc21dc8865: Pull complete
2e81650bd01b: Pull complete
Digest: sha256:221d7ffd1ca2daa2dd2bff6e8d888873302f7031c05df5c2bd61c2d73cd14326
Status: Downloaded newer image for otiai10/ocrserver:latest
[ocrserver] listening on port :8080

f:id:otiai10:20170523102435p:plain

動いとる。いい感じ。別ターミナルから

% docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                    NAMES
0c2091fcfda3        otiai10/ocrserver   "/bin/sh -c /go/bi..."   About a minute ago   Up About a minute   0.0.0.0:8080->8080/tcp   stupefied_tesla
% docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL   SWARM   DOCKER   ERRORS
% docker kill 0c2091fcfda3
0c2091fcfda3
% docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
%

いい感じ。

プロジェクトごと別々のDockerホストを扱う

% docker-machine create --help
Usage: docker-machine create [OPTIONS] [arg...]

Create a machine

Description:
   Run 'docker-machine create --driver name' to include the create flags for that driver in the help text.
% docker-machine create foo
Creating CA: /Users/otiai10/.docker/machine/certs/ca.pem
Creating client certificate: /Users/otiai10/.docker/machine/certs/cert.pem
Running pre-create checks...
Error with pre-create check: "VBoxManage not found. Make sure VirtualBox is installed and VBoxManage is in the path"

まあそうだよな。VirtualBox入れてないもん。じゃあHyperkitかな?

% docker-machine create --driver hyperkit foo
Driver "hyperkit" not found. Do you have the plugin binary "docker-machine-driver-hyperkit" accessible in your PATH?
%

なぬ?hyperkitのdocker-machineドライバー無いのか。

Currently, there is no docker-machine create driver for HyperKit, so you will use virtualbox driver to create local machines.

今んとこ、複数Dockerホスト立てる場合は、docker for macが立てたhyperkitのvmではなく、docker-machine経由で、VirtualBoxVMを立てる必要があるっぽい。ということで、掲題の目的を達成するためには

  1. VirtualBoxのインストー
  2. docker-machine createする
  3. docker-machine envをevalする
  4. そこに向けてdocker runする

という今までのおなじみのワークフローをすればよいっぽい。

それにしても、エラーメッセージの docker-machine-driver-hyperkit っていうのはちょっと気になる。

README読むほどに、まあ無理してこれ使わんでも、VirtualBoxでdocker-machineで立てればいいか、という気持ちになるので、放置でよいかと思った。とりあえずMacのHyperkitのホストに対してdocker/docker-composeでプロジェクトごとに分ける運用で十分かという結論。

DRYな備忘録として

Docker入門

Docker入門

pkg_resources.DistributionNotFound: The '自作pythonスクリプト==0.0.3' distribution was not found and is required by the application

問題

jobとしてシェルスクリプトを投げるタイプのjob-queueシステムにおいて、シェルスクリプトから pip install --user で入れたpython binを参照させると、どうやらimportでコケている模様。

# 中略
pkg_resources.DistributionNotFound: The 'filtertool==0.0.3' distribution was not found and is required by the application

原因

  • --user で入れたものの lib のpathは、環境変数 $PYTHONUSERBASE/lib を参照しているが、
  • job-queueシステムのシェルスクリプトではその環境変数が見つからないのでsystemのlibを見に行って、
  • 自作スクリプトがライブラリとして存在してないよ! 」という状況が起きる

解決

例) uge_cooker を使っている場合

env.json

{
    "PYTHONUSERBASE": "/home/otiai10/opt/python/2.7.10/packages"
}

DRY

Pythonスタートブック

Pythonスタートブック

scpできなくて私もハマった

問題

scpがエラー無く終わるが、何も転送されていない

% scp otiai10@foobar.com:~/test.txt ~/
Enter passphrase for key '/User/otiai10/.ssh/foobar': 
foobar
%
% ls -la | grep test.txt
% # ← あれーん?

tl;dr, 解決

  • リモート側の.bashrcでログイン時にログインしたホスト名を出力するようにしていたのが原因だったっぽい?(ナンデ?)
# リモートの~/.bashrc

### 以下をコメントアウトしたら動いた
hostname

参考

ログ

問題の発覚

% scp otiai10@foobar.com:~/test.txt ~/
Enter passphrase for key '/User/otiai10/.ssh/foobar': 
foobar
%
% ls -la | grep test.txt
%

なんもない? scpコマンドにはverbose logを出す-vオプションがあるので調査

% scp otiai10@foobar.com:~/test.txt ~/
#
# 略
#
debug1: Entering interactive session.
debug1: pledge: network
debug1: Sending command: scp -v -f ~/test.txt
Sink: foobar
foobar
Sending file modes: C0640 37 test.txt
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: client_input_channel_req: channel 0 rtype eow@openssh.com reply 0
debug1: channel 0: free: client-session, nchannels 1
debug1: fd 0 clearing O_NONBLOCK
debug1: fd 1 clearing O_NONBLOCK
Transferred: sent 3264, received 2992 bytes, in 0.1 seconds
Bytes per second: sent 22591.7, received 20709.0
debug1: Exit status 1
% 

確かにExit status 1してるし、sentに対してrecievedが少ないが、なんとも情報が少ない。ググってギリギリそれっぽいのがこれだった。

sshも繋がるしWinSCPも出来たのでなかなか原因にたどり着くことができませんでした。同じような状況のときは.~rcを調べてみるといいかもしれません…。

f:id:otiai10:20170512131857j:plain

それな。~/.bashrcを確認しても、だいたい環境変数のexportとかしてるだけでそれっぽいものが無いけど、以下のブロックを見つけた

# {{{ PROMPT
if [[ `hostname` =~ foobar ]]; then
    hostname
else
    export PS1="\e[1;34m\]$\e[m\] "
fi
# }}}

foobarサーバだったらfoobarを出力し、それ以外だったらプロンプト(コマンド受け付けるところの左のやつ)をシンプルに $ (色付き)だけにするというやつ。「まさかぁ〜」と思いつつコメントアウトしたら動いた。問題を切り分けて、どうやら hostname を実行している箇所 だけ が問題だったということが判明して事なきを得たが、結局原因はわかっていないです。教えてエロいひと。

DRY

vimのcolorschemeで勝手にドキドキするvimrc

わけあってリモートサーバでvimでがんがんコードの編集する仕事をしており、あと単調なので、なんかドキドキしたいと思い、1時間ごとにcolorschemeを勝手に変えるvimrcの断片を書いたのでメモ

追記 2017/05/15

id:foooomioさんありがとうございます!助かりました!

function! s:ColorSchemeLottery()
    let schemes = ["koehler", "zellner", "peachpuff", "slate", "murphy", "delek"]
    let l = len(schemes)
    let i = strftime("%H") % l
    return schemes[i]
endfunction
execute 'colorscheme ' . s:ColorSchemeLottery()

これでリストだけ更新すればよくなった。

以下原文、読まなくてよい。

これ動かない

なんで…

function! s:ColorSchemeLottery()
    let schemes = ["koehler", "zellner", "peachpuff", "slate", "murphy", "delek"]
    let l = len(schemes)
    let i = strftime("%H") % l
    return schemes[i]
endfunction

colorscheme s:ColorSchemeLottery()

" E185: Cannot find color scheme 's:ColorSchemeLottery()'
" と言われる。関数呼び出しが呼び出しと戻り値ではなく引数として食わせる文字列として評価されている

とりあえずこうした

function! ColorSchemeLottery()
    let h = strftime("%H") % 6
    if h == 0
        colorscheme koehler
    elseif h == 1
        colorscheme zellner
    elseif h == 2
        colorscheme peachpuff
    elseif h == 3
        colorscheme slate
    elseif h == 4
        colorscheme murphy
    else
        colorscheme delek
    endif
endfunction

call ColorSchemeLottery()

Vimテクニックバイブル ?作業効率をカイゼンする150の技

Vimテクニックバイブル ?作業効率をカイゼンする150の技

RedHatにGo言語をインストール(というか配置)

$ cd
$ mkdir -p opt/src
$ cd opt/src
$ wget https://storage.googleapis.com/golang/go1.8.1.linux-amd64.tar.gz
$ tar zxvf go1.8.1.linux-amd64.tar.gz
$ mv go ~/opt/.go # GOROOT用
$ mkdir -p ~/proj/go # GOPATH用
$ export GOROOT=~/opt/.go
$ export GOPATH=~/proj/go
$ export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
$ go version
go version go1.8.1 linux/amd64

確認

$ go get github.com/otiai10/primes/primes
$ which primes
~/proj/go/bin/primes
$ primes p 100
[2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97]

いけてる。Goのインストールは手軽で明確でほんとに好きだなあ。

DRYな備忘録として

Macにsamtoolsをインストール

ゴール

  • macOS Sierra上でsamtoolsコマンドが使える

参考

ログ

% cd
% mkdir opt
% mkdir opt/src
% cd opt/src
% wget https://github.com/samtools/htslib/releases/download/1.4/htslib-1.4.tar.bz2
% tar jxvf htslib-1.4.tar.bz2
% cd htslib-1.4
% ./configure --prefix=$HOME/opt
# 中略
configure: error: liblzma development files not found
# 後略

ふむ

% brew search liblzma
lzma is now part of the xz formula.
% brew search lzma-devel
lzma is now part of the xz formula.
% brew search xz-devel
No formula found for "xz-devel".

lzmaはxzになったけど、liblzmaの名前で探しにこられててnot foundとなっているような気がする。xzを入れればいいのかな。

% brew install xz
% ./configure --prefix=$HOME/opt
# いけたっぽい
% make
# warningは多数出てるけどとりあえず最後まで行ったっぽい
% make install
% ll ~/opt
total 0
drwxr-xr-x   7 otiai10  staff   238  4 13 10:24 .
drwxr-xr-x+ 39 otiai10  staff  1326  4 13 10:06 ..
drwxr-xr-x   5 otiai10  staff   170  4 13 10:24 bin
drwxr-xr-x   3 otiai10  staff   102  4 13 10:24 include
drwxr-xr-x   7 otiai10  staff   238  4 13 10:24 lib
drwxr-xr-x   3 otiai10  staff   102  4 13 10:24 share
drwxr-xr-x   4 otiai10  staff   136  4 13 10:06 src

コマンドPATHを通す

% which htsfile
htsfile not found
% export PATH=$HOME/opt/bin:$PATH
% which htsfile
/Users/otiai10/opt/bin/htsfile
% man htsfile
# いい感じ

LIBRARY PATHを通す

export LD_LIBRARY_PATH=$HOME/opt/lib:$LD_LIBRARY_PATH

samtoolsのインストール

% cd $HOME/opt/src
% wget https://github.com/samtools/samtools/releases/download/1.4/samtools-1.4.tar.bz2
% tar jxvf samtools-1.4.tar.bz2
% cd samtools-1.4
% ./configure --prefix=$HOME/opt
% make
% make install

確認

% which samtools
/Users/otiai10/opt/bin/samtools
% man samtools

イケてる。

はじめてのバイオインフォマティクス (KS生命科学専門書)

はじめてのバイオインフォマティクス (KS生命科学専門書)

DRYな備忘録

RustをMacにインストールしてHelloWorldとFizzBuzz

追記 2018/02/25

brewで入れると色々横着なので、ちゃんとインストールし直した。

otiai10.hatenablog.com

以下原文、読まなくていいです。


Rust、話題なので、やってみる。ミーハーなので。

brew install rust

% brew install rust
% rustc -V
rustc 1.16.0
% cargo -V
cargo-0.17.0-dev (f9e5481 2017-03-03)

Hello, Rust!

% cd
% mkdir -p proj/rust/playground/hello
% cd proj/rust/playground/hello
fn main() {
    println("ハロー, Rust!");
}
% rustc hello.rs
error[E0423]: expected function, found macro `println`
 --> hello.rs:2:5
  |
2 |     println("ハロー, Rust!");
  |     ^^^^^^^ did you mean `println!(...)`?

error: aborting due to previous error

%

めっちゃ親切やん

fn main() {
-    println("ハロー, Rust!");
+    println!("ハロー, Rust!");
}
% rustc hello.rs
% ./hello
ハロー, Rust!
%

できた

Write & Runがだるい

コンパイルして、実行ファイルを実行、っていう流れがだるいな、って思ったら、cargo runというのがあるっぽい。本当はプロジェクトつくるときにcargo newするのが作法のようで、cargo newするとtestsも自動的につくってくれるっぽい。いいっぽい。今回は後からCargo.tomlを追加した。

FizzBuzz

こういう感じにしたい

% fizzbuzz 15
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
FizzBuzz!!!

こうなった

use std::env;

fn fizzbuzz(x: i8) {
    for i in 1..(x + 1) {
        match (i % 3, i % 5) {
            (0, 0) => println!("FizzBuzz!!!"),
            (0, _) => println!("fizz"),
            (_, 0) => println!("buzz"),
            _ => println!("{}", i),
        }
    }
}

fn main() {
    match env::args().last().unwrap().parse::<i8>() {
        Ok(x) => fizzbuzz(x),
        Err(err) => println!("数字を指定してください: {}", err),
    }
}

結果

% cargo run 18
    Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
     Running `target/debug/fizzbuzz 18`
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
FizzBuzz!!!
16
17
fizz

いい感じ。成果物です。

github.com

コミットの細かさには定評がある僕です。

参考

雑感

  • とりあえず書き始めたけど、思ったより難しくて、ちゃんとチュートリアル読まなあかんな、と思った
  • わりと楽しく書けそう

Programming Rust: Fast, Safe Systems Development

Programming Rust: Fast, Safe Systems Development