docker 覚書

素でdockerを使う場合.
更新していく予定.

dockerの操作

開始(インタラクティブ)
$ sudo docker run -it IMG CMD

終了時に自動破棄するには--rm

開始(デモナイズ&ポート転送)
$ sudo docker run -d -p 8080:8080 IMG
デタッチ
C-p C-q
アタッチ
$ sudo docker attach ID
停止したコンテナの再開
$ sudo docker start ID
コンテナの停止
$ sudo docker stop ID
停止しプロセスのないコンテナでプロセスを実行し入る
$ sudo docker exec -it ID CMD
コンテナの削除
$ sudo docker rm ID
プロセス表示
$ sudo docker ps [-a]
イメージ一覧
$ sudo docker images
イメージの削除
$ sudo docker rmi IMG

dockerの作成

Dockerfileを作成する

FROM ubuntu:14.04.5

ENV http_proxy http://proxyhost:proxyport/
ENV https_proxy http://proxyhost:proxyport/
ENV APTOPT Acquire::http::proxy=${http_proxy},Acquire::https::proxy=${https_proxy}
ENV APTSRC /etc/apt/sources.list
ENV PYENV_ROOT /root/.pyenv
ENV PATH ${PYENV_ROOT}/shims:${PYENV_ROOT}/bin:${PATH}
ENV PYENV_SHELL sh

RUN set -x && \
sed -i 's/archive.ubuntu.com/jp.archive.ubuntu.com/' ${APTSRC} && \
sed -i 's/^# \(.*\)multiverse$/\1multiverse/' ${APTSRC} && \
sed -i 's/^# \(.*\)trusty-backports\(.*\)$/\1trusty-backports\2/' ${APTSRC} && \
rm -rf /var/lib/apt/lists/* && \
apt-get -o ${APTOPT} update && \
apt-get -y -o ${APTOPT} upgrade && \
apt-get -y -o ${APTOPT} install git wget && \
cd /root && \
git clone https://github.com/yyuu/pyenv.git .pyenv && \
eval "$(pyenv init -)" && \
mkdir -p /home/python && \
pyenv install anaconda3-4.1.1 && \
pyenv rehash && \
pyenv global anaconda3-4.1.1

ENTRYPOINT ["jupyter","notebook","--ip=0.0.0.0","--port=8080","--notebook-dir=/home/python"]

イメージをビルドする

$ sudo docker build -t REPOSITORY:TAG PATH

Dockerfileの置いてあるディレクトリ内で実行する時は,PATHは.で良い.

wordpress でクォートが全角になったりする問題

再々追記
wordpress 4.0 から, run_wptexturize フィルターが追加され,簡単に止められるようになった.
もはやプラグイン公開の価値があるかは知らないけど,いちおうアップデートしておいた.
また,機能に合わせて,プラグインの名前を変えた → Disable wptexturize

再追記
リンクのパスを間違えていた…すみません。以下、復旧済です。

追記
とりあえず作ったよ。
下記を解決するプラグインは、機能を殺す部分だけなら簡単に実装できたが、plugin の体裁にするのに手がかかった。公式にアップするのもまだちょっとかかりそう。
とりあえずすぐ解決したい人は、どうぞ → [Disable Auto Replacement]
解凍してできるディレクトリを、wp-content/plugins へ配置すれば OK。
これを使うと、クォーテーションもハイフネーションもアスキー文字のまま出力されるが、三連ピリオドを三点リーダーへ置換する機能も死ぬので、注意すること。

私は、プログラムのコードを本文中に書くことが多い。
しかし wordpress を使うと勝手に全角に置き換えられるのが不満で、回避策として " などを使うようにしていた。これは面倒くさい。
まだ文字実体参照の用意されている文字コードなどなら良いが、ハイフンみたく用意されてないと (正確には、ndash と mdash はあるが、これはハイフンではない)、不便で仕方がない。
(wordpress は二連ハイフンを mdash か何かに置き換えてくれる)

さっきも NOOK の記事を書こうとしていい加減に腹が立ってきたので、そういうのを抑制する plugin でもないか検索したら、原因が見付かった。
wordpressで”ダブルクォーテーションが全角になっちゃう” | IT勉強するコタツネコ
この人、置換行をコメントアウトしているので他の問題が出そうだなー、と思いつつそれはさておき、この記事にある

$curl = preg_replace($dynamic_characters, $dynamic_replacements, $curl);

というのが問題の行で、dynamic_replacements の中身を見れば簡単に分かるはず…

小足見てから昇龍余裕でした。
例えば、シングルクォートは ’ に置き換えちゃ、だめだろ JK
’引用符 - Wikipedia が詳しい。
どうダメかというと、' と比較するとこんな感じくらいダメ。
ダメさが伝わりやすいように、MS Pゴシックにフォントを変えてみる。
apos版 → He's a student.
8217版 → He’s a student.

もー! 半角文字を全角文字に置き換えるコーディングするやつは、コーディングやめちまえ!

といいたい。
でも本体に手を入れるとアップデートや鯖移行の度に面倒くさいので、plugin で何とかしたい。
この程度、どっかに転がってないかな。
PS Disable autoformatting ではダメだった。
これいじって、作るか…

以下、作っている間のテスト用文字列…
---He's a student.

GeForce を積んで CUDA を使う,オンボードの intel グラフィックも搭載したノート PC で Virtualbox の 3d acceleration を有効にする

どうも,nvidia optimus に対応した bumblebee というものを入れないと,うまく動かないらしい.
bumblebee を入れる手順は…

$ sudo apt-get purge nvidia\*
$ sudo add-apt-repository ppa:bumblebee/stable
$ sudo apt-get update && sudo apt-get upgrade
$ sudo apt-get install --reinstall bumblebee bumblebee-nvidia nvidia-352 nvidia-settings mesa-dri # bumblebeeと一緒にインストールする
$ sudo apt-get install cuda 

ちゃんと入ったか確認.

$ ps aux | grep bumblebeed

gpu を使って起動

$ optirun COMMAND

ベンチマーク

$ optirun glxgears

GPUモニタ

$ nvidia-smi -l

chrome app を linux でコマンドから起動する

うにてぃ使ってる人はchromeアプリランチャーを入れたらいいんだろうけど,使ってない人なので起動スクリプトを作ってパス通して,xmobarから呼び出せるようにしておかないと生きていけない.
app-idとかは,windowsでchrome appをタスクバーに登録して,ショートカットのオプションを見るのが一番てっとり早い.

$ chromium-browser --profile-directory=Default --app-id=***************************

profile directory は,変更してたら変更してるやつを書く.
app id は,~/.config/chromium/Default/Extensions/* のどれかなので,かかりそうなキーワードでgrepしても,見付けられるかも.

xmonad でタイルの配置が1列になってしまった時

私はうっかりよく忘れるのだが,Mod-,やMod-.というキーでmaster paneのタイル数を変えるという機能が xmonad にはある.
これは,デフォルトではmaster paneにはタイルは1枚で,残りのタイルは横に小さく表示されるという外観になると思うのだが,そのmaster paneに複数枚のタイルを配置し,「masterにある複数枚のタイルのみ大きく表示」「他のタイルは小さく表示」という配置を実現してくれる.
で,AltキーをModキーにしていた場合に,カンマやピリオドは誤爆してしまうことがあって,タイルはせいぜい2枚しかないため,どっちを押してもビューが1列になってしまって焦るということが起こる.

これは,master paneが0枚or2枚のどっちになっても1列に全タイルが並ぶのが原因であって,master paneの枚数にマイナスはないので,このキーバインドを殺さずこの現象を打開するには,

  1. とにかくMod-.を連打してmaster paneを0枚にする
  2. Mod-,で必要枚数に戻す

という手順を覚えておくのが良い.
先にMod-,の方を試すと,master paneに数十枚を設定することも可能なため,何を押しても一列状態が解除されず,尚のこと焦るという悪循環が待っている.

gitでcommit logのauthorを変更する

ずっとローカルで管理してたソースを,github とかで公開する時にgithubのアカウントと同じauthorにして,commit logにアイコンを出したりする時に使える.
手順は以下の通り.

  1. gitのconfigを変更.
    変更後のユーザ名をaaaaaaaとする.

    [user]
        name = aaaaaaa
        email = aaaaaaa@users.noreply.github.com
    
  2. ローカルリポジトリを一括修正
    参照:Authorの名称をGitHubと同じにする - Qiita

    $ git filter-branch -f --env-filter "GIT_AUTHOR_NAME='aaaaaaa'; GIT_AUTHOR_EMAIL='aaaaaaa@users.noreply.github.com'; GIT_COMMITTER_NAME='aaaaaaa'; GIT_COMMITTER_EMAIL='aaaaaaa@users.noreply.github.com';" HEAD
    

    ちなみに,コントリビュータが複数人いて,それぞれがgithubのアドレスとかにする場合は,if文を使う.
    if文は,Git - 歴史の書き換え
    の最後の例を参照のこと.

  3. リモートリポジトリを作り直す(←Qiitaの方法(push -f)では,リモートリポジトリにrejectされるわ,そのエラーに従いpullしたら全部のログが二重になるわ,悲惨な目にあった)
    ちなみに,重複するcommit logの削除コマンドも,以前探した時にはあった気がするが,面倒くさいので,最後にmergeしてしまったツリーから,pullする直前のコミットにcheckoutして,そこからブランチをフォーク,masterを削除,forkしたものをマスターに再フォーク,フォークしたブランチを削除,とすればフィルターを駆使して頑張らなくても戻せる.
    git的に正しいとは思わないけど,手っ取り早い.

nginx で rewrite を辞めたら PCRE library を使ってくれなくなるので注意

nginx の makefile 作成時に --without-http_rewrite_module をつけて rewrite オプションを外すと,PCRE のライブラリを使ってくれなくなるため,location ディレクティブとかで正規表現を使っている場合にエラーを起こす.
回避策が分からんので,rewrite が要らなくなっても,location ディレクティブで正規表現したい時は外しちゃだめ.絶対.

たまにページ転送を rewrite でリクエストの改変により実装している人がいるが,重いので辞めた.

(略)
    # https でリダイレクト
    return 302 https://$http_host$request_uri;
    # ↑ ↓ 同じ
    rewrite ^(.*) https://$http_host$1 permanent;

こういうケースね.

R と Rcmdr を ubuntu に入れる

ubuntu 14.04 に R を入れる.
インストールはこの辺を参照した→How To Set Up R on Ubuntu 14.04 | DigitalOcean
公式はこの辺→Index of /bin/linux/ubuntu

  1. リポジトリの追加.
    /etc/apt/sources.list.d/ の下にファイルを作った方が管理し易いと思うので,これをオススメ.

    deb http://cran.ism.ac.jp/bin/linux/ubuntu trusty/
    
  2. リポジトリのキーを追加.
    $ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9
    $ gpg -a --export E084DAB9 | sudo apt-key add -
    
  3. インストール.
    $ sudo apt-get update
    $ sudo apt-get upgrade
    $ sudo apt-get install r-base
    
  4. Rcmdrのインストール.
    これができれば,他のパッケージも同じように動くはず.

    > Sys.setenv(http_proxy="http://username:password@proxy.address:port/");
    > install.packages("Rcmdr")
    
  5. 初回起動時に,推奨パッケージのインストールも行なわれると思う.
    そこはお好みで.

    > library(Rcmdr)
    

ubuntuの差分バックアップ

ubuntu は deja-dup が標準で入っているので,使われていることが多いと思うが,NW越しにパスワードをかけて保存しようとすると,うまくいかないことがある.
で,deja-dupが呼び出しているduplicityを直接叩くことにする.
あと,うちの環境では何故かsmb経由では保存がうまくできなかったので,FTP経由にした.
これで保存したバックアップは,deja-dupから読み込むことができるけど,リストアスクリプトも用意してみた.

ちなみに,deja-dupが呼び出す時のオプションは,適当なバックアップを手動で走らせている間に,$ ps aux | grep duplicityで見ると良い.

設定ファイル,定期バックアップスクリプト,古いバックアップの削除スクリプト,リストアスクリプトの例.

# 保存するディレクトリリストをスペース区切りで
DIRS='/home/USERNAME /MYDIR'

# 連想配列の宣言
declare -A INCLUDE
declare -A EXCLUDE

# duplicity は include/exclude に合致するディレクトリが実際にないとエラーを吐くので,
# ターゲットディレクトリ毎に指定する必要がある
# deja-dup がここを include に入れていた..cacheをexcludeしつつ,このファイルだけincludeしたりできる.
INCLUDE['/home/USERNAME']='/home/USERNAME/.cache/deja-dup/metadata'
# 半角スペース入りのディレクトリは後ろのfor loopでどうしても分割されてしまうので,半角スペース抜きに設定を変更するのが楽(vboxとか)
EXCLUDE['/home/USERNAME']='/home/USERNAME/mountedvolumes /home/USERNAME/Dropbox /home/USERNAME/Downloads /home/USERNAME/.cache /home/USERNAME/.rnd /home/USERNAME/VirtualBoxVMs'

INCLUDE['/MYDIR']=''
EXCLUDE['/MYDIR']='/MYDIR/lost+found'
#!/bin/bash

. ~/bin/duplicity_dirs.conf

# environment variables
# パスワードとかコマンドにもスクリプトにも入れたくない場合は,読み込むしかない
USER=$(cat /home/USERNAME/username)
# GnuPGに渡されるパスフレーズ
export PASSPHRASE=$(cat /home/USERNAME/passphrase)
# FTPログイン時に使用されるパスワード
export FTP_PASSWORD=$(cat /home/USERNAME/password)

# command
CMD=/usr/bin/duplicity

# バックアップ保存先
# destination
DESTADDR=192.168.1.200
DESTPATH=/BackupDirectory
# FTPの場合
DESTSRV=ftp://${USER}@${DESTADDR}/array1${DESTPATH}
# LinkStationの場合,array1が間にはさまることに注意

# options
# 1ヶ月ごとにフルバックアップを取る
OPTIONS='--volsize=100 --gpg-options=--no-use-agent --archive-dir=/home/USERNAME/.cache/deja-dup --tempdir=/tmp --full-if-older-than 1M'

# include オプションの生成
COMBINE_INC() {
    RESULT=""
    for STRING in $*
    do
        RESULT="${RESULT} --include=$STRING"
    done
}

# exclude オプションの生成
COMBINE_EXC() {
    RESULT=""
    for STRING in $*
    do
        RESULT="${RESULT} --exclude=$STRING"
    done
}

# loop for all target directories
for DIR in $DIRS
do
    echo backup $DIR
    # include
    COMBINE_INC ${INCLUDE[$DIR]}
    INC_OPT=$RESULT
    # exclude
    COMBINE_EXC ${EXCLUDE[$DIR]}
    EXC_OPT=$RESULT
    # command
    echo $CMD $INC_OPT $EXC_OPT $OPTIONS $DIR ${DESTSRV}$DIR
    $CMD $INC_OPT $EXC_OPT $OPTIONS $DIR ${DESTSRV}$DIR
done

export PASSPHRASE=""
export FTP_PASSWORD=""
#!/bin/bash

. ~/bin/duplicity_dirs.conf

# environment variables
# パスワードとかコマンドにもスクリプトにも入れたくない場合は,読み込むしかない
USER=$(cat /home/USERNAME/username)
# GnuPGに渡されるパスフレーズ
export PASSPHRASE=$(cat /home/USERNAME/passphrase)
# FTPログイン時に使用されるパスワード
export FTP_PASSWORD=$(cat /home/USERNAME/password)

# command
CMD=/usr/bin/duplicity
SUBCMD=remove-older-than # 経過時間を条件に削除するモード

# バックアップ保存先
# destination
DESTADDR=192.168.1.200
DESTPATH=/BackupDirectory
# FTPの場合
DESTSRV=ftp://${USER}@${DESTADDR}/array1${DESTPATH}
# LinkStationの場合,array1が間にはさまることに注意

# options
PARAM=6M  # 6ヶ月より古いものを消す
OPTIONS='--force'

# loop for all target directories
for DIR in $DIRS
do
    echo clear $DIR
    echo $CMD $SUBCMD $PARAM $OPTIONS ${DESTSRV}$DIR
    $CMD $SUBCMD $PARAM $OPTIONS ${DESTSRV}$DIR \
        && echo "clear old data for $DIR" \
        || echo "some error may happen in the process for $DIR"
done

export PASSPHRASE=""
export FTP_PASSWORD=""
##!/bin/bash

. ~/bin/duplicity_dirs.conf

# environment variables
# パスワードとかコマンドにもスクリプトにも入れたくない場合は,読み込むしかない
USER=$(cat /home/USERNAME/username)
# GnuPGに渡されるパスフレーズ
export PASSPHRASE=$(cat /home/USERNAME/passphrase)
# FTPログイン時に使用されるパスワード
export FTP_PASSWORD=$(cat /home/USERNAME/password)

# command
CMD=/usr/bin/duplicity
SUBCMD=restore

# バックアップ保存先
# destination
DESTADDR=192.168.1.200
DESTPATH=/BackupDirectory
# FTPの場合
DESTSRV=ftp://${USER}@${DESTADDR}/array1${DESTPATH}
# LinkStationの場合,array1が間にはさまることに注意

# 入力処理 - バックアップのURLを特定する
# ターゲットディレクトリに部分一致があれば,DIRに値が入ったままbreakする仕組み
for DIR in $DIRS
do
    [ "${1#$DIR}" != "$1" ] && break
    DIR=""
done

[ "$DIR" == "" ] && exit

# 対象ファイルの相対化
# duplicityは,バックアップ先のディレクトリからの相対パスが必要
RELPATH="${1#$DIR/}"
OPTIONS="--file-to-restore $RELPATH"

# リストアしたファイルを格納するテンポラリファイル
# 直接書き戻すこともできるけど,リスキーだからやめた方が良い
TARGET=~/restore
mkdir -p $TARGET
TARGET="${TARGET}/${RELPATH}"

echo restore $1
echo $CMD $SUBCMD $OPTIONS ${DESTSRV}$DIR $TARGET
$CMD $SUBCMD $OPTIONS ${DESTSRV}$DIR $TARGET \
    && echo "files are restore into ${TARGET}" \
    || echo "some error may happen in the process for ${TARGET}"

export PASSPHRASE=""
export FTP_PASSWORD=""

個人的には,バックアップをdaily,削除をmonthlyで回すくらいがオススメ.

tmux でコマンドライン履歴のスクロールバックとコピペ

tmux使用中にShift+PageUpしても画面がスクロールしていってしまって,tmuxの中の履歴を参照できず困っていた.
これは,tmuxのコピーモードを使えば解消するらしい.

実は,tmux の部分は全部 man tmux に載ってる.

プレフィックス(デフォルトでC-b)をPrefixと表記する.

キーバインド(viモードの場合)

key binding explanation
Prefix+[ コピーモード開始
q コピーモード終了
Space Start selection
Enter Copy selection
Prefix+] Paste the most recently copied buffer of text

X Window system clipboardとの連携

$ sudo apt-get install xsel
bind-key > save-buffer ~/.tmux-buffer \; run-shell 'xsel -b -i < ~/.tmux-buffer' \; display-message "Copied to clipboard"
bind-key < if-shell 'xsel -b -o > ~/.tmux-buffer' 'load-buffer ~/.tmux-buffer ; paste-buffer'