サーバーサイド Swift フレームワークである Perfect を Docker で動かせるようにした

サーバーサイド Swift フレームワークである Perfect を Docker で動かせるようにした。

github.com

作成した Docker イメージは Docker Hub でも公開しているので、下記のように実行するとビルド済みのイメージが取得することができる。

$ docker pull holidayworking/perfect

この Docker イメージではサンプルアプリケーションである URL Routing を実行するようにしてあるので、

$ docker run -d -p 8181:8181 holidayworking/docker-perfect

を実行後に http://localhost:8181/foo/bar/baz にアクセスすると下記のように表示される。

f:id:holidayworking:20151227150946p:plain

Docker イメージを構築するときにハマった点はコンパイルした Perfect アプリケーションを実行する方法である。アプリケーションをコンパイルすると so ファイルが生成されるが、このファイルを perfectserverhttp を実行するディレクトリ内の PerfectLibraries ディレクトリにコピーするか、シンボリックリンクを貼ってある必要がある。最初はこれが分からなくて、サンプルアプリケーションのディレクトリ内で perfectserverhttp を実行して、上手くいかないと悩んでいた……

One-Class SVM で外れ値検出ができる gem を作った

One-Class SVM で外れ値検出ができる gem を作った。

github.com

元々は会社で開発している Rails アプリケーション内に実装した外れ値検出ライブラリだったけど、汎用性があるように実装していたので gem として公開することにした。

使い方

One-Class SVM のモデルを構築する必要があるので、オブジェクト作成時に訓練データを渡してやる。

detector = Hazure::Detector.new([[1,0,0], [1,0,0]])

モデルが構築後は Hazure::Detector#outlier? の引数に判定したいデータを渡す。

detector.outlier?([10, 0, 0])
# => true

Hazure::Detector#outlier? の返り値が true の場合が外れ値で false の場合が正常値となる。

Riak MapReduce を Elixir で書いてみる

前提条件

  • CentOS 7.1.1503
  • Riak 2.1.1
  • Erlang/OTP 18.0
  • Elixir v1.0.5

事前準備

Erlang/OTP のインストール

Elixir を動かすためには Erlang/OTP 17 以降のインストールが必要となる。今回は Erlang Solutions レポジトリを追加して、Erlang/OTP 18.0 をインストールする。

$ wget http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
$ sudo rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
$ sudo yum install erlang

Elixir のインストール

最新の安定版である v1.0.5 の CentOS 用 RPM が公開されていなかったので、GitHub で公開されているコンパイル済みのアーカイブを使う。

$ wget https://github.com/elixir-lang/elixir/releases/download/v1.0.5/Precompiled.zip
$ sudo unzip Precompiled.zip -d /opt/elixir
$ export PATH=/opt/elixir/bin:$PATH

Riak MapReduce を書いてみる

今回は指定したバケットのキー一覧を取得する MapReduce を Elixir で実装する場合は、下記のようなコードとなる。

defmodule MapReduceExample do
  def get_keys(value, _, _) do
    [{:riak_object.bucket(value), :riak_object.key(value)}]
  end
end

これを map_reduce_example.ex というファイル名で保存してコンパイルする。

$ elixirc map_reduce_example.ex

コンパイルが終わると Elixir.MapReduceExample.beam が生成される。このファイルを /usr/lib64/riak/lib/basho-patches にコピーして Riak を再起動する。

$ sudo cp Elixir.MapReduceExample.beam /usr/lib64/riak/lib/basho-patches
$ sudo service riak restart

あとは下記のように MapReduce を実行する。

$ curl -XPOST localhost:8098/mapred \
  -H 'Content-Type: application/json'   \
  -d '{"inputs":"training","query":[{"map":{"language":"erlang","module":"Elixir.MapReduceExample","function":"get_keys"}}]}'
{"training":"bar","training":"bam","training":"baz","training":"foo"}

FreeBSD on xhyve でディスクをマウントすることができた

前に xhyve で FreeBSD を動かしたときにディスクのマウントに失敗すると書いた。

blog.holidayworking.org

原因と解決方法が分かったので補足しておく。

続きを読む

Hyper 0.2 のリリース

ハイパーバイザー・ベースの Docker エンジンである Hyper の最新バージョンとなる 0.2 がリリースされていた。

  • Support Xen Hypervisor (Xen 4.5/hvm)
    • fully support run, stop, replace and persistent mode as the kvm version
  • overlayfs storage engine support.

v0.2 (2015-06-26) | About Hyper

hyper がサポートしているハイパーバイザーは KVM (QEMU) のみであったが、このリリースからは Xen のサポートも追加されることになった。

リリースノートに書かれていないが、試したところポートフォワーディングがサポートされるようになっていた。

続きを読む

意見(評価表現)抽出ツール を Docker で動かせるようにした

NICT が公開している意見(評価表現)抽出ツール を Docker で動かせるようにした。

github.com

Docker イメージのビルド

$ git@github.com:holidayworking/docker-extractopinion.git
$ cd docker-extractopinion
$ docker build -t holidayworking/extractopinion .

意見(評価表現)抽出ツールの実行

オプションなしで Docker コンテナを起動すると、意見(評価表現)抽出ツールに含まれているサンプルファイルを引数として extract.sh が実行されるようになっている。

$ docker run holidayworking/extractopinion
変換処理を開始します...
変換処理が終了しました...
/opt/extractopinion-1.2/sample.txt.euc  1       [著者]  メリット+       ビタミンが豊富だ。
/opt/extractopinion-1.2/sample.txt.euc  2
/opt/extractopinion-1.2/sample.txt.euc  3       [著者]  批評-   良くない。
/opt/extractopinion-1.2/sample.txt.euc  4       [著者]  当為    学校に行くべきだ。
/opt/extractopinion-1.2/sample.txt.euc  5       [著者]  メリット+       地域経済の活性化が図られるので、
/opt/extractopinion-1.2/sample.txt.euc  5       [著者]  メリット+       商機が拡大すると考えられる。

任意のファイルに対して extract.sh を実行したい場合は、下記のように Docker コンテナを実行する。

$ cat sample.txt
ほうれん草はビタミンが豊富だ。
京都は日本にある。
商品Aは良くない。
太郎は学校に行くべきだ。
道州制は国の一律の規制が解かれ地域経済の活性化が図られるので、商機が拡大すると考えられる。
意見(評価表現)抽出ツール を Docker で動かせるようにした。
$ docker run -it -v `pwd`:/data holidayworking/extractopinion /opt/extractopinion-1.2/extract.sh /data/sample.txt
変換処理を開始します...
変換処理が終了しました...
/data/sample.txt.euc    1       [著者]  メリット+       ビタミンが豊富だ。
/data/sample.txt.euc    2
/data/sample.txt.euc    3       [著者]  批評-   良くない。
/data/sample.txt.euc    4       [著者]  当為    学校に行くべきだ。
/data/sample.txt.euc    5       [著者]  メリット+       地域経済の活性化が図られるので、
/data/sample.txt.euc    5       [著者]  メリット+       商機が拡大すると考えられる。
/data/sample.txt.euc    6