3月が来た

先週振り返り

一週間開いてしまった。
やっぱ life 的なブログは毎週書かないとダメな気がしてきた。

先週はお腹の調子がひたすら悪くてしんどかった。
rails っていう覚えゲーをひたすらこなしているんだけど
とにかく雪崩のように覚えることがあって大変だ。

でも二回目以降(知識が増えたら)もっと楽になるだろうから今だけだと思って頑張ろう。

ついに花粉が本気出し始めた。
早めに病院に行ってこようと思う。
ちなみにロラタジンってくすりが俺にとってはすごく効いた(去年)。

困っていること

筋トレのモチベーションがどうも上がらない。
太る一方だし。。
あと ruby に駆り立てられてすごい頭を使ってるからずいぶん疲れている。
ruby の勉強というか調査とかのせいであんまり本を最近読めてない。
これは改善すべきだ。

勉強途中経過

進んでない

  • rails tutorial 6 まで

読書途中経過

積んでる

  • 詳解UNIXプログラミング第8章まで読んだ
  • オペレーティングシステム 6章まで読んだ
  • Webエンジニアのためのデータベース技術[実践]入門 7章まで読んだ
  • ネットワークはなぜつながるのか?
  • DDD ショートバージョン
  • http://www.infoq.com/jp/minibooks/domain-driven-design-quickly
  • 論語入門

読み終えた

  • (2014/3/1)chef-solo 入門
    • ザーッと目を通し直したらほぼ理解出来てたので読み終えたことにする
  • (2014/3/1)パーフェクトルビー
    • 手を動かしながら ver
  • (2014/2/16)(さらっと)日経Linux 2月号
  • (2014/2/8)プログラマの数学
  • (2014/2/6)(一周目、さらっと)[改訂新版] Apache Solr入門 ~オープンソース全文検索エンジン
  • (2014/1/26)マスタリングTCP/IP 入門第5版 とりあえず読み切った
  • (2014/1/13)読む筋トレ
  • (2014/1/8)ザ・コーチ 最高の自分に出会える「目標の達人ノート」

Factory_girl_active_support_concern

ぼやき

rspec でテストを書いていて、ある(concern)モジュールを include した active record なクラスで、
どうしても、ActiveSupport::Concern を include したところに インスタンスメソッドを定義しても
NoMethodError(undefined method) になってしまう..

日経Linux 2月号を読んだ

概要

日経Linux 2月号(2014) に、カーネルの特集記事があったので買って読んでみた。
今まで知らなかった部分とか、便利そうなことについて、以下に記載する。

メモリ管理

buddy システム, スラブアロケータについて書かれていた。
この本よりもっと詳しく書かれたページを発見したのでコチラを参照。
http://www.coins.tsukuba.ac.jp/~yas/coins/os2-2011/2012-01-17/

systemtap

system tap とは https://access.redhat.com/site/ja/node/289453 にある通り

実行している Linux カーネルで簡易情報を取得できるようにする革新的なツールです。

である。

install 方法(@CentOS)

vagrant で建てた CentOS を使ってやってみる。
Vagrantfile 的に
config.vm.box = “Berkshelf-CentOS-6.3-x86_64-minimal”
この box を使っている人は以下の通りでインストールできると思います。

sudo yum -y install systemtap
cd /tmp
wget http://debuginfo.centos.org/6/x86_64/kernel-debuginfo-common-x86_64-2.6.32-279.el6.x86_64.rpm
wget http://debuginfo.centos.org/6/x86_64/kernel-debug-debuginfo-2.6.32-279.el6.x86_64.rpm
sudo yum install kernel-debuginfo-common-x86_64-2.6.32-279.el6.x86_64.rpm
sudo yum install kernel-debug-debuginfo-2.6.32-279.el6.x86_64.rpm

# これで stap がつかえる
stap

## 追記
(これだと probe.kernel が使えないっぽい.. 要調査。)

あとは http://sourceware.org/systemtap/examples/
ここから
vm.tracepoints.stp や, sched_switch.stp を落として来て実行できる。

(参考)
http://stts.hatenablog.com/entry/20090614/1244952417

プロセスのメモリ割付について

/proc/[processId]/maps (これをメモリーマップと呼ぶ。)を参照すれば、どのようにメモリが割り付けられているかがわかる。

vi hoge.c
-----
#include <stdio.h>

int main(void) {
  char hoge[4096] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

printf("sleep start\n");
  sleep(500000);
printf("sleep stop\n");
  return 0;
}

ps aux | grep a.out
vagrant  19157  0.0  0.0   3928   408 pts/1    S+   04:41   0:00 ./a.out
vagrant  19164  0.0  0.0 107456   948 pts/0    S+   04:42   0:00 grep a.out


cd /proc/
cat /proc/19157/maps

00400000-00402000 r-xp 00000000 fd:00 3590                               /tmp/a.out
00601000-00602000 rw-p 00001000 fd:00 3590                               /tmp/a.out
7fdf912e5000-7fdf91470000 r-xp 00000000 fd:00 3071                       /lib64/libc-2.12.so
7fdf91470000-7fdf9166f000 ---p 0018b000 fd:00 3071                       /lib64/libc-2.12.so
7fdf9166f000-7fdf91673000 r--p 0018a000 fd:00 3071                       /lib64/libc-2.12.so
7fdf91673000-7fdf91674000 rw-p 0018e000 fd:00 3071                       /lib64/libc-2.12.so
7fdf91674000-7fdf91679000 rw-p 00000000 00:00 0
7fdf91679000-7fdf91699000 r-xp 00000000 fd:00 3437                       /lib64/ld-2.12.so
7fdf9188e000-7fdf91891000 rw-p 00000000 00:00 0
7fdf91896000-7fdf91898000 rw-p 00000000 00:00 0
7fdf91898000-7fdf91899000 r--p 0001f000 fd:00 3437                       /lib64/ld-2.12.so
7fdf91899000-7fdf9189a000 rw-p 00020000 fd:00 3437                       /lib64/ld-2.12.so
7fdf9189a000-7fdf9189b000 rw-p 00000000 00:00 0
7fff2a0dc000-7fff2a0f1000 rw-p 00000000 00:00 0                          [stack]
7fff2a1b4000-7fff2a1b5000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

下から見ると、 systemcall が呼ばれる領域(カーネル仮想空間)があるのと、 stack が積まれる領域があるのと、
shared object がリンクされている領域と、 テキスト(プログラム)が格納されている領域があるのが見て取れる。

左端から、仮想アドレス、アクセス属性、データオフセット、 デバイスのメジャー番号とマイナー番号、 inode, ファイル名とのこと。

カーネル時計

Linux カーネルは 起動時には、PC の内蔵時計を使用するが、それ移行は独自のカーネル時計を使用する。
ミリ秒からナノ秒の処理が必要であるため。

I/Oスケジューラー

入出力するブロックデータを並び替えて入出力を高速化できるもの。

http://city.hokkai.or.jp/~hachikun/IOScheduler.html
http://www.valinux.co.jp/technologylibrary/document/linuxkarnel/cfq0001/

MySQL Workbench で Rails の Migration ファイルを吐き出す

TOC

概要

mysql workbench っていう MySQL のER図を作るみたいなツールがある。
CUI硬派のため、いままでは使ったことなかったけど、
今回はじめて使ってみると結構いい感じだった。
それを rails のマイグレーションファイルに吐き出したいなぁと思っていたら、
それっぽいプラグインを見つけたので、その方法を書いておく。

Mysql workbench の SS

手順

1. mysql workbench rails exporter plugin をダウンロード

http://sourceforge.net/projects/railsexporter/ ここから、 rails exporter を落としてくる。

2. mysql workbench のインストール

新しい workbench ツールに、上記プラグインが対応していなかったので、 ちょっと古いやつで試したら動作した。
http://dev.mysql.com/downloads/tools/workbench/ から、 Looking for previous GA versions? をたどると、 mysql-workbench-gpl-5.2.47-osx-i686.dmg が落とせる。
これをインストールする。

3. プラグインのインストールと実行

mysql workbench のタブから、 “SCRIPTING > INSTALL PLUGIN/MODULE …” で、展開した 1 の zip の .lua ファイルを選択する。
mysql workbench を再起動して、 “PLUGINS > CATALOG > Rails Exporter 1.0.1” を選択すれば、あら不思議、
$HOME に Rails_Explorer ディレクトリが。
db と model が出来上がるので、あとはそれをよしなに利用すれば良い。

所感

実際、このあとに、 mysql に接続して、ER図を吐き出すやつやってみたけど、
まぁ当然、テーブル的にリレーションしてないわけだから、ER図もリレーションしてなくて、見づらい。
raisl には ERD 生成ツールみたいなのがあるらしいので、
最初の一回くらいしか使えないかもしれないけど、ないよりはいいかなぁ。
ちなみに出来上がるファイルは若干修正が必要だと思う。
ちゃんと mwb のほうで書いていれば大丈夫かもだけど。。
mwb の方で、カラムに複数行のコメントを入れておくと、出力された時にダメなので、
コメントを1行にするか、複数行の場合は先頭に#を入れると良いかもしれない。
あと、 unsigned int を作りたいけど、うまいことやってくれなくて、
gem “activerecord-mysql-unsigned”, “~> 0.0.1” これを入れて、手動で integer のカラムに :unsgined => true した。

2/16

先週振り返り

先週も solr 力をかなり高める感じだった。
docker がリアルに流行り始めているので、本格的に勉強したいところ。
でも家のネットワークが遅くてちょっと厳しいんだよなぁ。
なんかお腹の調子がずっと悪くてしんどかった。
あと、雪の日に自宅待機したら迷惑かけてしまったので、今後は極力休まない。

あんまり本が読めなかったので、気合入れて読む。
あと、どうでもいいけど、 MBA の容量が 128GB で 94% とか言ってて積んでる感ある。

土日振り返り

あんまり多く時間を取れなかったが、日経 linux 読んだのと、workbench の件をそこそこやった。

勉強途中経過

進んでない

  • rails tutorial 6 までやった

読書途中経過

進んだ

  • 詳解UNIXプログラミング第8章まで読んだ

積んでる

  • オペレーティングシステム 6章まで読んだ
  • Webエンジニアのためのデータベース技術[実践]入門 7章まで読んだ
  • ネットワークはなぜつながるのか?
  • chef-solo 入門 #23 まで読んだ(どっかで手を動かしながらやる)
  • パーフェクトルビー15章まで読んだ
    • 手を動かしながら ver
  • 論語入門

読み終えた

  • (2014/2/16)(さらっと)日経Linux 2月号
  • (2014/2/8)プログラマの数学
  • (2014/2/6)(一周目、さらっと)[改訂新版] Apache Solr入門 ~オープンソース全文検索エンジン
  • (2014/1/26)マスタリングTCP/IP 入門第5版 とりあえず読み切った
  • (2014/1/13)読む筋トレ
  • (2014/1/8)ザ・コーチ 最高の自分に出会える「目標の達人ノート」

Jekyll から Octopress に10 分で移行する

背景

デザインが見づらいって言われたので辛くなったから、
octopress にノリで移行してみた。
当方、 jekyll-bootstrap を使っていて、 octopress も普通に jekyll 使っているので
問題なく移行できると思ったら移行できた。

手順

大体こんなかんじでいける。空気さえ読めれば行ける感じ。

git clone git://github.com/imathis/octopress.git octopress
cd octopress/
bundle install
rake install
rake preview
rake -T
vim config.rb
rake preview
rake setup_github_pages

## Rakefile の L269 の git push を -f するようにした。すでにレポジトリがあったから。
vim Rakefile

rake deploy

cp -a $HOME/jekyll-bootstrap/_posts/* .

## JB setup を記事に埋め込んでいるのがあったのでそれをケア(互換性のため)
mkdir $HOME/octopress/source/includes/JB
cp -a $HOME/jekyll-bootstrap/_includes/JB/setup $HOME/octopress/source/includes/JB

ちなみに

テーマはコチラを使わせてもらった。
http://zespia.tw/Octopress-Theme-Slash/
how to install 通りにやれば適用できる。

Octopress テーマ集みたいなのはコチラ。
http://opthemes.com/

参考資料

http://joelmccracken.github.io/entries/octopress-is-pretty-sweet/

今更 Solr 入門

TOC

この記事について

今更ながら Solr に興味が出てきたので、自分用にまとめてみる。
あくまで自分用なので、ある程度わかっている人じゃないと本記事は無意味です。恐縮ながら。
前提として、 この記事は 改訂新版 Apache Solr入門 ~オープンソース全文検索エンジン を読みながら進めた。

まずは、予備知識として Apache Solr とはなにか、 Lucene とはなにかについて書く。
次に、スキーマを作って、サンプルデータ を 手動でのデータインポートで index に登録する手順について書く。
手動でのデータインポートは大変なので、mysql からデータをインポートするクローラ(DIH)について書く。 最後に、 MySQL にある json を保存するカラムのデータを、 Javascript を使って整形し、 index に保存することについて書く。

予備知識

Apache Solr とは

全文検索システムである。
全文検索エンジン Lucene をベースに、管理画面やキャッシュ、クラスタリングなどの機能がある。
ちなみに Java で書かれている。
http://ja.wikipedia.org/wiki/Apache_Solr

Lucene とは

Lucene(ルシーン)は、Javaで記述された全文検索ソフトウェアである。
あらかじめ蓄積した大量のデータから、指定したキーワードを探し出す機能を持つ。Javaのクラスライブラリとして提供される。

http://ja.wikipedia.org/wiki/Lucene なるほど。

スキーマを作ってみよう

スキーマを作って、サンプルデータを入れてみる。
ここでは、 料理人が複数いて、自分の料理をうるみたいなものを想定する。
Solr の schema.xml で、スキーマを定義することができる。

以下に、 schema.xml の fileds の設定例を載せる。

<fields>
    <field name="recipe_id"   type="int"     indexed="true" stored="true" required="true"/>
    <field name="chef"        type="text_ja" indexed="true" stored="true"/>
    <field name="recipe_name" type="text_ja" indexed="true" stored="true"/>
    <field name="genre"       type="text_ja" indexed="true" stored="true" multiValued="true"/>
    <field name="price"       type="int"     indexed="true" stored="true"/>
    <field name="_version_"   type="long"    indexed="true" stored="true"/>
  </fields>

フィールドタイプについて

  • fieldType は自分で xml を用いて定義することができる
  • それらの名前付けとかには習慣がある
  • 基本的な型については定義されているので、それを利用する

フィールドについて

テキストフィールドの定義

  • name は filed 名
  • type は filedType
  • indexed は、 このフィールドを検索対象、ソート対象、 ファセット対象にするか(true:する)
  • stored は、 このフィールドの値をそのまま index するか(true:する)
  • required は、 必須かどうか
  • multivalued は、 複数値を持てるかどうか
  • omitNorms は、 検索したドキュメントの長さによる重み付け
    • (短ければ当然、見つけるものに近いのでポイントが高く、逆に長ければ、それにヒットする確率が高いので値は低い。)

ダイナミックフィールド

  • 動的にフィールド名が決定するもの
  • schema.xml を変更しなくても、そのフィールド名を登録したり検索したりすることができるようになる

ユニークキーフィールド

  • 文書内で unique に特定できるようにするフィールド
  • 差分更新したい場合には必須
  • 指定はオプション
  • url

コピーフィールド

  • ドキュメントへのインデックス登録時に copyField の source から dest へコピーする
  • dest に同じものを複数指定する場合は multiValued が true である必要がある

core admin で core を作成

collection1 をコピーして, schema.xml を編集。
elevate が評価されてダメっぽかったのでコメントアウト。
すると、うまく load できた。

サンプルデータを入れてみよう

だいたいこんなかんじの data.json を用意して

[                                                                              
{                                                                              
    "recipe_id":"1",                                                           
    "chef":"vimtaku",                                                          
    "recipe_name":"vim の炒めもの",                                            
    "genre":["和食", "洋食"],                                                  
    "price":980                                                                
},                                                                             
{                                                                              
    "recipe_id":"2",                                                           
    "chef":"noro",                                                             
    "recipe_name":"emacs 焼き",                                                
    "genre":["和食", "中華"],                                                  
    "price":500                                                                
},                                                                             
{                                                                              
    "recipe_id":"3",                                                           
    "chef":"sublime",                                                          
    "recipe_name":"sublime 揚げ",                                              
    "genre":["洋食"],                                                          
    "price":250                                                                
}                                                                              
]
curl 'http://localhost:8983/solr/vimtaku/update/json?commit=true' --data-binary @data.json -H 'Content-type:application/json;charset:utf-8'

これで データ登録が完了する。

DIH(DataImportHandler) について

DIH は DataSource, EntityProccssor, そして設定ファイル(data‐config.xml) から成る。
DIH を使うための設定は、 solrconfig.xml と DIHの設定ファイル data―config にある。

solr config に記述する

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DatalmportHandler">
<lst name="defaults">
  <str name="config">db-data-config.xml</str>
</lst>
</requestHandler>

mysql の connector をダウンロードして設置

mysql-connector-java-5.1.29-bin.jar を http://dev.mysql.com/downloads/connector/j/から落としてきて dist 以下に設置する。

mysql の設定, db-data-config.xml の設定など

そしてだいたいこんなかんじに設置する。 mysql は localhost の 3306 番で動いているものとし、
solrsample っていう database があるものとする。 password は hogehoge とする。

diff --git a/conf/db-data-config.xml b/conf/db-data-config.xml
new file mode 100644
index 0000000..c758319
--- /dev/null
+++ b/conf/db-data-config.xml
@@ -0,0 +1,24 @@
+<dataConfig>
+    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver"
+        url="jdbc:mysql://localhost:3306/solrsample"
+        user="vimtaku" password="hogehoge"/>
+    <document>
+        <entity name="recipe_mst" pk="recipe_id"
+            query="select * from recipe_mst"
+            deltaImportQuery="SELECT * FROM recipe_mst WHERE recipe_id = ${dataimporter.delta.recipe_id}"
+            deltaQuery="select recipe_id from recipe_mst WHERE updated_at >= '${dataimporter.last_index_time}'">
+            <field column="recipe_id" name="recipe_id" />
+            <field column="recipe_name" name="recipe_name" />
+            <field column="price" name="price" />
+            <entity name="recipe_genre_rel"
+                query="select * from recipe_genre_rel where recipe_id = '${recipe_mst.recipe_id}'">
+                <entity name="genre_mst" query="select * from genre_mst where genre_id = '${recipe_genre_rel.genre_id}'">
+                    <field column="name" name="genre" />
+                </entity>
+            </entity>
+            <entity name="chef_mst" query="select * from chef_mst where chef_id = '${recipe_mst.chef_id}'">
+                <field column="name" name="chef" />
+            </entity>
+        </entity>
+    </document>
+</dataConfig>
diff --git a/conf/solrconfig.xml b/conf/solrconfig.xml
index 00b7555..2d19133 100644
--- a/conf/solrconfig.xml
+++ b/conf/solrconfig.xml
@@ -84,6 +84,9 @@
   <lib dir="../../../contrib/velocity/lib" regex=".*\.jar" />
   <lib dir="../../../dist/" regex="solr-velocity-\d.*\.jar" />

+  <lib dir="../../../dist/" regex="solr-dataimporthandler-.*\.jar" />
+  <lib dir="../../../dist/" regex="mysql.*\.jar" />
+
   <!-- an exact 'path' can be used instead of a 'dir' to specify a
        specific jar file.  This will cause a serious error to be logged
        if it can't be loaded.
@@ -1513,6 +1516,15 @@
   </requestHandler>


+  <requestHandler name="/dataimport"
+      class="org.apache.solr.handler.dataimport.DataImportHandler">
+      <lst name="defaults">
+          <str name="config">db-data-config.xml</str>

だいたいこんなかんじで、管理画面から /dataimport で full-import するといける。

deltaQuery について

差分 update(delta-import) のとき、deltaQuery がまず、実行される。 deltaQuery は どんなに nest が深くても実行される(たぶん)。

deltaQuery と parentDeltaQuery の関係

  • deltaQuery で mysql のレコードがヒットした場合に、 parentDeltaQuery が呼び出される
  • parentDeltaQuery では ${chef_mst.chef_id} のように、 deltaQuery でヒットしたものが使える
  • parentDeltaQuery で、 pk の 値を select するようにしておく。
  • pk のある entity に、
    • deltaImportQuery 属性がなくて query 属性がある場合には where pk = ‘’ としてクエリが実行され再登録される模様
    • deltaImportQuery 属性がある場合にはそのクエリが実行される。

例えば

<dataConfig>
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/solrsample"
        user="vimtaku" password="hogehoge"/>
    <document>
        <entity name="recipe_mst" pk="recipe_id"
            query="select * from recipe_mst"
            deltaImportQuery="SELECT * FROM recipe_mst WHERE recipe_id = ${dataimporter.delta.recipe_id}"
            deltaQuery="select recipe_id from recipe_mst WHERE updated_at >= '${dataimporter.last_index_time}'"
            >
            <field column="recipe_id" name="recipe_id" />
            <field column="recipe_name" name="recipe_name" />
            <field column="price" name="price" />
            <entity name="recipe_genre_rel"
                query="select * from recipe_genre_rel where recipe_id = '${recipe_mst.recipe_id}'">
                <entity name="genre_mst" query="select * from genre_mst where genre_id = '${recipe_genre_rel.genre_id}'">
                    <field column="name" name="genre" />
                </entity>
            </entity>
            <entity name="chef_mst" pk="chef_id"
                query="select * from chef_mst where chef_id = '${recipe_mst.chef_id}'"
                deltaQuery="select chef_id from chef_mst where chef_id = 1"
                parentDeltaQuery="select recipe_id from chef_mst where chef_id = ${chef_mst.chef_id} limit 1"
                >
                <field column="name" name="chef" />
            </entity>
        </entity>
    </document>
</dataConfig>

こうなっていた場合、
deltaQuery=”select chef_id from chef_mst where chef_id = 1”
これでヒットした chef_id を元に
parentDeltaQuery=”select recipe_id from chef_mst where chef_id = ${chef_mst.chef_id} limit 1”
が実行されて、
deltaImportQuery=”SELECT * FROM recipe_mst WHERE recipe_id = ${dataimporter.delta.recipe_id}”
これが実行される。

(2014/5/12追記) deletedPkQuery について

deltaImportQuery では、インデックスにのったデータの削除はされない。
なので、データを削除する場合は deletedPkQuery を使用する。
deletedPkQuery=”SELECT * FROM chef_mst WHERE status = 0”
のようにしておけば status = 0 の chef が削除できる。

(2014/5/12追記) Timezone の扱い

Solr のクラスタを動かすマシンによると思うが、マシンの timezone が JST, mysql の timezone が UTC などの場合も
普通にあると思う。なので
CONVERT_TZ(‘${dataimporter.last_index_time}’, ‘Asia/Tokyo’, ‘GMT’)
などとして変換してあげるといろいろ捗るかもしれない。

DIH の直前で Javascript でデータを加工する

UpdateHandler と UpdateChain

UpdateHandler と DIH の仕組みはこの図のようになっている。

(改訂版 Apache Solr 入門より引用。)

DIH とは疎になっていて、 UpdateHandler はどの requestHandler でも使えるように見える。

設定にはこの差分 を参照。

これを使えば、json のカラムからとった json を parse して multiValue なカラムに登録などができる。

なんかうまくいかない場合

キャッシュされたデータを更新するとたまに更新されない。
自分は一回 core を削除、 $SOLR_HOME の data ディレクトリを rm -rf している。
もっといい、データ削除(もしくはいれかえ)の方法知っている人は教えて下さい。。

参考URL

http://ja.wikipedia.org/wiki/Lucene
http://wiki.apache.org/solr/DataImportHandler
http://ochien.seesaa.net/article/153191074.html
http://d.hatena.ne.jp/kudzu/20110513/1305313247
http://d.hatena.ne.jp/bowez/20100405#p2

_

Docker_boot2docker_port_foward

OS X 10.8 公式サポートで話題の Docker

これをもとにとりあえず docker client を準備,
docker server を建てた。

mac の localhost に telnet 11211 したら memcached につながるようにしたい

https://www.docker.io/learn/dockerfile/level2/ これをもとに Dockerfile を作った。 ここでは ubuntu を元にした vimtaku/memcached_1 とした。

Dockefile

# Memcached
#
# VERSION       2.2

# use the ubuntu base image provided by dotCloud
FROM ubuntu

MAINTAINER Victor Coisne victor.coisne@dotcloud.com

# make sure the package repository is up to date
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update

# install memcached
RUN apt-get install -y memcached

# Launch memcached when launching the container
ENTRYPOINT ["memcached"]

# run memcached as the daemon user
USER daemon

# expose memcached port
EXPOSE 11211
docker build -t vimtaku/memcached_1 - < Dockerfile

これでとりあえず memcached な image を作れる。

docker run -p 11211:11211 vimtaku/memcached_1

これで boot2docker -> ubuntu が立つ。

追記(2014/02/13)

成功法っぽいのを発見した。
恥ずかしながら ssh port fowarding が -L オプションで できるっていうのを このブログ記事 で初めて知った。

まだ、やってないけど

ssh -L 11211:localhost:11211 -p 2022 root@localhost

とかすれば、 ssh port fowarding できるので、以下の手順は不要。

追記終わり。

とりあえず確認するには

とりあえず確認するには
boot2docker ssh して ifconfig | grep -A4 docker0 すると
172…. のような IP が見える。
そこに対して telnet すると ちゃんと疎通できてる。
ちなみに telnet localhost 11211 しても同様。

あとは mac -> boot2docker に 11211 疎通できればよい。
ぐぐったら http://fogstack.wordpress.com/2014/02/09/docker-on-osx-port-forwarding/ の記事が見つかったのでほぼこれの通りに、

boot2docker down
したあと
VBoxManage modifyvm "boot2docker-vm" --natpf1 "guestmemcached,tcp,,11211,,11211"
boot2docker up
docker run -d -p 11211:11211 vimtaku/memcached_1

これで mac から telnet localhost 11211 で行けた。たぶん。

2014/2/9

土日振り返り

雪うざい。地味に perfect ruby を進めた。
ruby 力が2くらい上がった。気がする。

勉強途中経過

進んでない

  • rails tutorial 6 までやった

読書途中経過

進んだ

  • パーフェクトルビー15章まで読んだ
    • 手を動かしながら ver

積んでる

  • 詳解UNIXプログラミング第7章まで読んだ
  • オペレーティングシステム 6章まで読んだ
  • Webエンジニアのためのデータベース技術[実践]入門 7章まで読んだ
  • ネットワークはなぜつながるのか?
  • chef-solo 入門 #23 まで読んだ(どっかで手を動かしながらやる)

読み終えた

  • (2014/2/8)プログラマの数学
  • (2014/2/6)(一周目、さらっと)[改訂新版] Apache Solr入門 ~オープンソース全文検索エンジン
  • (2014/1/26)マスタリングTCP/IP 入門第5版 とりあえず読み切った
  • (2014/1/13)読む筋トレ
  • (2014/1/8)ザ・コーチ 最高の自分に出会える「目標の達人ノート」

2月の Solr には雪も Full

先週の振り返り

先週は solr 祭りだった。
solr は存在くらいしか知らなかったけど、非常によく出来たソフトウェアで
これを使いこなせれば(使い方を知っていれば)非常によい価値を
提供できる気がした。

先々週はあんまり何やったか覚えていない。
そういや 先週は docker とかめっちゃいいなと思ってたところだった。
あとで触ってみよう。

ところで東京のくせに雪とか降るのは生意気だと思う(北から目線。

勉強途中経過

進んでない

  • rails tutorial 6 までやった

読書途中経過

進んだ

  • 詳解UNIXプログラミング第7章まで読んだ
  • パーフェクトルビー10章まで読んだ
    • 手を動かしながら ver

積んでる

  • オペレーティングシステム 6章まで読んだ
  • Webエンジニアのためのデータベース技術[実践]入門 7章まで読んだ
  • ネットワークはなぜつながるのか?
  • chef-solo 入門 #23 まで読んだ(どっかで手を動かしながらやる)

読み終えた

  • (2014/2/8)プログラマの数学
  • (2014/2/6)(一周目、さらっと)[改訂新版] Apache Solr入門 ~オープンソース全文検索エンジン
  • (2014/1/26)マスタリングTCP/IP 入門第5版 とりあえず読み切った
  • (2014/1/13)読む筋トレ
  • (2014/1/8)ザ・コーチ 最高の自分に出会える「目標の達人ノート」