5.31.2014

Docker: Python: Getting Internal IP Address of the Container

コンテナを Detached Mode で起動して、その内部アドレスを知る一行野郎 (ワンライナー)

grep や jq でもできるけど、Python で JSON をパーズするほうが好み。

docker inspect $(docker run -d IMAGE_NAME) | \
python -c 'import json,sys;print json.loads(sys.stdin.read())[0]["NetworkSettings"]["IPAddress"]'

 

実行例

Docker の動作するホスト上で実行

# docker inspect $(docker run -d mogproject/sshd) | python -c 'import json,sys;print json.loads(sys.stdin.read())[0]["NetworkSettings"]["IPAddress"]'
Unable to find image 'mogproject/sshd' locally
Pulling repository mogproject/sshd
db38b1b40c65: Download complete
539c0211cd76: Download complete
154a1496c839: Download complete
0e8300b2772a: Download complete
43af4236d0da: Download complete
fc0cc09b2562: Download complete
172.17.0.2
# ssh ssh-user@172.17.0.2
The authenticity of host '172.17.0.2 (172.17.0.2)' can't be established.
RSA key fingerprint is e7:77:e5:bc:b0:3e:c4:78:27:cf:57:3a:2e:98:69:30.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.17.0.2' (RSA) to the list of known hosts.
ssh-user@172.17.0.2's password:
[ssh-user@1e53a210ba41 ~]$ cat /etc/redhat-release
CentOS release 6.4 (Final)

5.27.2014

Docker: Pull From the Private Registry Failed with I/O Timeout

Docker: プライベートレジストリからの docker pull でタイムアウトエラー

 

Mac + boot2docker 環境で、プライベートリポジトリから docker pull した時に
タイムアウトになってしまう問題。

$  docker -H tcp://127.0.0.1:4243 pull my-private-reg:5000/image_name:base
2014/05/27 00:59:47 Error: Invalid Registry endpoint: Get http://my-private-reg:5000/v1/_ping: dial tcp: i/o timeout

どうやら、名前解決で時間がかかっているようだった。(5秒以上)

以下いずれかの対応でとりあえずタイムアウトは回避できた。

  • 1. boot2docker-vm 上 (Mac上ではない!) の /etc/hosts にホストを登録し、ローカルで名前解決
  • 2. docker pull の際にプライベートリポジトリの IPアドレスを直接指定

 

追記:
よく見たら boot2docker-vm 上の /etc/resolv.conf 先頭に到達不能な IPアドレスが記述されていた。
boot2docker 起動時に Mac の設定情報をコピーするようなので、IPアドレスの変わりやすい ノートPC 利用時などでは特に注意が必要。

5.26.2014

IVA Reading: Chapter 01, Section 04 Exercises

IVA読書会 chap01-sect04 宿題

 

No.5

${\bf V}(x+xy,y+xy,x^2,y^2) = {\bf V}(x, y)$ を示す

 

Exercise 3 b. から、$\langle x+xy,y+xy,x^2,y^2 \rangle = \langle x,y \rangle$ が示されたので
命題4から最初の式が求まる。

また、明らかに ${\bf V}(x+xy,y+xy,x^2,y^2) = {\bf V}(x, y) = \{(0,0)\}$。

 

No.11

$(t, t^3, t^4)$ とパラメータ化された曲線 $V \subset \mathbb{R}^3$ を考える。

a. $V$ がアフィン多様体であることを証明する

$ \begin{cases} x = t \\ y = t^3 \\ z = t^4 \end{cases} $
より、
$V = {\bf V}(x-t,y-t^3,z-t^4) = {\bf V}(y - x^3, z - x^4) \subset \mathbb{R}^3$ が示される。

 

b. このねじれ3次曲線から ${\bf I}(V)$ を特定する

$V = {\bf V}(y - x^3, z - x^4) \subset \mathbb{R}^3$ について考えれば、 section04 本文中の証明と同様に
${\bf I}(V) = \langle y - x^3, z - x^4 \rangle$ を示すことができる。

 

途中式

$$ \begin{eqnarray*} x^{\alpha}y^{\beta}z^{\gamma} &=& x^{\alpha}(x^3+(y-x^3))^{\beta}(x^4+(z-x^4))^{\gamma} \\ &=& x^{\alpha}(x^{3\beta}+ \text{terms involving } y - x^3)(x^{4\gamma}+ \text{terms involving } z -x^4)) \\ &=& h_1(y - x^3) + h_2(z - x^4) + x^{\alpha + 3{\beta} + 4{\gamma}} \end{eqnarray*} $$

5.24.2014

How to Install MathJax on Blogger

BloggerでMathJaxを使う方法

 

Blogger テンプレートの編集

こちらの解説 (Getting Started — MathJax 2.3 documentation) にあるように、HTMLソースのHEADブロックの中に以下のタグを埋め込めばいい。

<script type="text/javascript"
  src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>
<script type="text/x-mathjax-config">  
  MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}});
</script>

Blogger の管理画面から、テンプレート -> HTML の編集 を行い、<head> … </head> の間の適当な場所に
タグを貼り付けて「テンプレートを保存」。

テンプレート -> バックアップ/復元 の機能を利用して、事前・事後にバックアップを取っておくと安心。

 

MarsEdit プレビューテンプレートの編集

ブログ作成ツール MarsEdit のプレビュー画面でも数式を表示したい。

これには SyntaxHighlighter 同様のトリックが必要となる。

テンプレートのBODYブロック内(</body>の直前)に以下のスクリプトを埋め込んだら、プレビュー画面でも MathJax が処理されるようになった。

<script type="text/javascript">
  function refreshMathJax() {
    MathJax.Hub.Queue(["Typeset",MathJax.Hub]);
    setTimeout("refreshMathJax()", 5000);
  }
  refreshMathJax();
</script> 

 

出力サンプル

When $a \ne 0$, there are two solutions to \(ax^2 + bx + c = 0\) and they are
$$x = {-b \pm \sqrt{b^2-4ac} \over 2a}.$$

When $a \ne 0$, there are two solutions to \(ax^2 + bx + c = 0\) and they are $$x = {-b \pm \sqrt{b^2-4ac} \over 2a}.$$

Mac: Displaying Text as What I Wrote in TextEdit

Mac の TextEdit でテキストファイルを開いたのに、HTMLがレンダリングされてイライラ

TextEdit でファイルを開いた場合、ファイルの拡張子に関係なく
ファイルの中身がHTMLっぽい場合 (htmlタグがあるなど) は HTML ファイルとして認識されてしまうようだ。

Preference -> Open and Save -> Display HTML files as HTML code instead of formatted text

にチェックを付けたら、とりあえずファイルの内容がそのまま表示されるようになった。

こういうストレス仕様は即刻やめてほしい。

5.19.2014

IVA Reading: Chapter 01, Section03 Exercises

IVA読書会 chap01-sect03 宿題

 

Ideals, Varieties, and Algorithms 読書会 #3 - PARTAKE の宿題、担当分に挑戦してみる。

No.5

双曲線 $x^2 - y^2 = 1$ に関する問題

a.

$$ x = \cosh(t) = \frac{e^t + e^{-t}}{2} \\ y = \sinh(t) = \frac{e^t - e^{-t}}{2} $$

$x^2 - y^2 = {(\frac{e^t + e^{-t}}{2})}^2 - {(\frac{e^t - e^{-t}}{2})}^2$ を計算すると 1 となる。

$t$ に関わらず成立するので、これらの点は $x^2 - y^2 = 1$ 上に常に存在する。

また、定義から $x = \cosh(t) \gt 0$ であるため、双曲線うち右側の曲線(第1, 第4象限)のみカバーされる。

b.

ヒントにあるように、場合分けして考える。

(1) x = a の場合

  代入して a^2 - y^2 = 1 を y について解く

    (i) -1 < a < 1 のとき交点なし
    (ii) a = ±1 のとき交点は1つ
    (iii) a < -1 または 1 < a のとき交点は2つ

(2) y = mx + b の場合

  代入して x^2 - (mx + b)^2 = 1 という方程式の解の個数について考える

  展開すると (1 - m^2)x^2 - 2mbx - (1 + b^2) = 0

    (i) m = ±1 のときは x についての一次方程式となり、x = ±((1 + b^2) / 2b) が得られる

      b = 0 のとき交点なし
      b ≠ 0 のとき交点は1つ

    (ii) m ≠ ±1 のときは二次方程式となるため、その判別式Dを考える
      D = 4 m^2 b^2 + 4 - 4m^2 + b^2 - 4m^2 b^2  = 4(-m^2 + b^2 + 1)

      m^2 - b^2 > 1 のとき交点なし
      m^2 - b^2 = 1 のとき交点は1つ
      m^2 - b^2 < 1 のとき交点は2つ

まとめると、

  交点なし
    x = a (-1 < a < 1)
    y = x
    y = -x
    y = mx + b (m ≠ ±1, m^2 - b^2 > 1)

  交点1個
    x = -1
    x = 1
    y = x + b (b ≠ 0)
    y = -x + b (b ≠ 0)
    y = mx + b (m ≠ ±1, m^2 - b^2 = 1)

  交点2個
    x = a (a < -1, 1 < a)
    y = mx + b (m ≠ ±1, m^2 - b^2 < 1)

 

y = 1.25x + 0.75 の例 (交点1個)

Ch01 03 ex05

c.

(-1, 0) および (0, t) を通る直線を考え、双曲線の右側との交点を (x, y) とすると、
1 : t = 1 + x : y より
y = t(1 + x) が求められる。

これを x^2 - y^2 = 1 に代入して解くと

x = (1 + t^2) / (1 - t^2)
y = 2t / (1 - t^2)

が求められる。

 

d.

双曲線 x^2 - y^2 = 1 の漸近線は y = ±x である。

t = ±1 のとき、直線の傾きが漸近線と並行になるため、(-1, 0) 以外の交点を持たない。 

 

No.11

 

a.

ex.08-d の式の y を x, x を z に置き換える。

b.

c を y^2 に置き換えると、

x^2 = y^2 z^2 - z^3 となり、これは x^2 - y^2 z^2 + z^3 = 0 を表す。

c.

考え中。
(0, 0), (x, y), (1, t) を通る直線を考える? 

 

No.17

(x1, y1) = (1, 0)
(x2, y2) = (1, 1)
(x3, y3) = (0, 1)

というベジエ曲線であると捉える。

a = 1 - √2 / 2
b = √2 - 1
w = 1 / √2

が求まるので、これらの値をex.16の式に代入すればよい。

x = ((1-t)^2 + √2 t(1-t)      ) / ((1-t)^2 + √2 t(1-t) + t^2)
y = (          √2 t(1-t) + t^2) / ((1-t)^2 + √2 t(1-t) + t^2)

 

TeX系の表示環境がないとつらい・・・

5.18.2014

Shell: Waiting Until a Condition Becomes Success Within a Time Limit

Bourne Shell: 指定されたコマンドを一定間隔で実行し、正常終了するまで待つ (タイムアウトあり)

 

これぞ車輪の再発明という感があるが、探しても見つからなかったので書く。

 

目的

以下のような処理を行う、汎用的なシェルスクリプトを作成したい

  • パラメータとして、タイムアウト時間(秒)、実行間隔(秒)、コマンド(引数付きでも可) を指定
  • パラメータとして渡されたコマンドを実行
  • コマンドのリターンコードが 0 である場合、すぐに処理を終了
    リターンコード 0 を返す 
  • コマンドのリターンコードが 0 以外である場合、指定された実行間隔だけ待機し
    その後再度コマンドを実行。これをリターンコードが 0 になるまで繰り返す
  • シェルスクリプトを実行してから、コマンドのリターンコードが 0 になることのないまま
    タイムアウト時間が経過した場合、リターンコード 1 を返して終了

 

たとえば、やりたいのはこんな処理。

 

コード

GitHub にアップ。

-h オプションでヘルプ表示

NAME
    await-until -- Await until the specified command becomes success

SYNOPSIS
    await-until [-t TIMEOUT] [-i INTERVAL] [-vh] COMMAND

DESCRIPTION
    The options are as follows:

    -t TIMEOUT
        Specify a timeout in seconds.
        The default value is $TIMEOUT.

    -i INTERVAL
        Wait INTERVAL seconds between executing each COMMAND.
        The default value is $INTERVAL.

    -v
        Print verbose messages.
        The default is 'disabled'.

    -h
        Print this help message.

    COMMAND
        Command line for testing.
        This string will be evaluated with 'eval' command in '/bin/sh'.

EXIT STATUS
    This command exits with one of following values:

    0 COMMAND returns 0 within TIMEOUT seconds.
    1 Timed out.
    >1 An error occurred.

-v オプションは主にデバッグ用。コマンドは Bourne Shell の eval で評価される。

 

使用例

  • 常に成功するコマンド
    $ await-until -v true
    [2014-05-18T06:44:38+0900] cmd: true => rc: 0
    [2014-05-18T06:44:38+0900] Normal end.
    $ echo $?
    0
    

    コマンドはすぐに終了する

  • 常に失敗するコマンド
    $ await-until -v false
    [2014-05-18T06:48:30+0900] cmd: false => rc: 1
    [2014-05-18T06:48:31+0900] cmd: false => rc: 1
    [2014-05-18T06:48:33+0900] cmd: false => rc: 1
    [2014-05-18T06:48:34+0900] cmd: false => rc: 1
    [2014-05-18T06:48:35+0900] cmd: false => rc: 1
    [2014-05-18T06:48:36+0900] cmd: false => rc: 1
    [2014-05-18T06:48:37+0900] cmd: false => rc: 1
    [2014-05-18T06:48:38+0900] cmd: false => rc: 1
    [2014-05-18T06:48:39+0900] cmd: false => rc: 1
    [2014-05-18T06:48:40+0900] cmd: false => rc: 1
    [2014-05-18T06:48:41+0900] Timed out.
    $ echo $?
    1

    タイムアウト時間になるまでコマンドが試行され、最終的にリターンコード 1 を返す。

  • 途中で成功に変わるコマンド
    $ await-until -v '((1`date +%S` % 10 == 0))'
    [2014-05-18T06:51:03+0900] cmd: ((1`date +%S` % 10 == 0)) => rc: 1
    [2014-05-18T06:51:04+0900] cmd: ((1`date +%S` % 10 == 0)) => rc: 1
    [2014-05-18T06:51:05+0900] cmd: ((1`date +%S` % 10 == 0)) => rc: 1
    [2014-05-18T06:51:06+0900] cmd: ((1`date +%S` % 10 == 0)) => rc: 1
    [2014-05-18T06:51:07+0900] cmd: ((1`date +%S` % 10 == 0)) => rc: 1
    [2014-05-18T06:51:08+0900] cmd: ((1`date +%S` % 10 == 0)) => rc: 1
    [2014-05-18T06:51:09+0900] cmd: ((1`date +%S` % 10 == 0)) => rc: 1
    [2014-05-18T06:51:10+0900] cmd: ((1`date +%S` % 10 == 0)) => rc: 0
    [2014-05-18T06:51:10+0900] Normal end.
    $ echo $?
    0
    

    システム時刻の秒数の下1桁が0になるまで待つ処理。
    毎回 date コマンドが評価されているのがわかる。

    秒数の前に「1」を付けているのは、「08秒」、「09秒」の時に 8進数表記と見なされてエラーになる現象を回避するため。

  • コマンドの途中で Ctrl+C
    $ await-until -v false
    [2014-05-18T06:52:28+0900] cmd: false => rc: 1
    [2014-05-18T06:52:29+0900] cmd: false => rc: 1
    [2014-05-18T06:52:30+0900] cmd: false => rc: 1
    ^C[2014-05-18T06:52:31+0900] Interrupted.
    $ echo $?
    3
    

    sleep などの子プロセスは全て即座に終了するので、プロセスのゴミは残らない。

  • Redis の BGSAVE の終了待ちは、以下のように短く書けるようになった。
    last_save=`redis-cli LASTSAVE`
    redis-cli BGSAVE
    await-until '[[ '$last_save' != `redis-cli LASTSAVE` ]]'
    if [ $? -ne 0 ]; then
      # エラー処理
    fi
    

    $last_save の評価タイミングに注意。

 

References

5.06.2014

C++11: For-all Statement with Lambda

C++11: ラムダ式を利用した for-all チェック

 

手に馴染むように練習。

あるコンテナについて、その要素全てが特定の条件を満たすかどうかをチェックしたい。

C++11で追加された algorithm ライブラリのメソッド

を使うのが簡便だ。

 

サンプルコード

実行結果
1
1
0
1
0

  • ラムダ式の基本は [キャプチャ](仮引数リスト) -> 戻り値の型 {ステートメント}
  • 戻り値の型が推論可能であれば、[キャプチャ](仮引数リスト){ステートメント} とも書ける
  • よく使うラムダ式は、[](...){return ...;} の形式
  • ステートメント内部のセミコロンを忘れがちなので注意
  • ラムダ式内部の仮引数に auto を指定するとコンパイルエラーとなる

5.04.2014

Recording the Terminal Session as Video

ターミナル録画系サービスのメモ

 

3種類のサービスを比較。

 

1. Asciinema

 

インストール

pip でインストールする。easy_install から始める場合は以下のとおり。

$ wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -O - | sudo python
$ sudo easy_install pip
$ sudo pip install asciinema

 

録画の実行

asciinema rec で録画実行、exit (Ctrl+D) で終了。

Asciinema を実行を Asciinema で録画したのがこちら。

録画した内容が瞬時にパブリックになってしまうというのも少し怖い気がするが……

 

2. showterm

 

インストール

gem でインストール。(実行シェルを直接ダウンロードする手順も記載されているが、うまく動作しなかった)
ruby からインストールする場合は以下のとおり。(RedHat系Linuxの場合)

$ sudo yum install -y rubygems
$ sudo gem install showterm

 

録画の実行

showterm で録画実行、exit (Ctrl+D) で終了。
終了すると即座にアップロード処理が始まる。

showterm を実行を showterm で録画したのがこちら。

表示が若干崩れるのは、script コマンドの問題だろうか。

 

3. Shelr.tv

 

インストール

gem でインストール。
ruby からインストールする場合は以下のとおり。(RedHat系Linuxの場合)
json ライブラリに依存しているので、ruby-devel のインストールが必要。

$ sudo yum install -y rubygems
$ sudo yum install -y ruby-devel
$ sudo gem install shelr

 

録画の実行

shelr record で録画実行、exit (Ctrl+D) で終了。
ターミナルのサイズが大きいと録画が実行されないので注意。

$ shelr record
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=> Please, resize your terminal!
=> Sizes bigger than 132x43 are slow and will not be available to all users.
=> We care about this.
=> Also, do not resize your terminal while recording. It will break the record.
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

ターミナルサイズを一時的に変更

$ stty rows 43 cols 132
$ stty -a    # 確認

shelr を実行を shelr で録画したのがこちら。

shelr の場合、録画内容が勝手に公開されてしまう心配がないので安心だ。
必要に応じて shelr play で内容をチェックした後、shelr publish で明示的に公開操作を行う。

Shelr.tv のアカウントを作れば、限定メンバーへの公開も可能な様子。