読者です 読者をやめる 読者になる 読者になる

Amazon Linux 2016.03 で Nginx をインストールする Itamae レシピ

linux amazon itamae

Amazon Linux のレポジトリからではなく、Nginx の公式レポジトリからインストールしたかったので、Itamae のレシピを書いてみた。

package 'http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm' do
  not_if 'rpm -q nginx-release-centos'
end

package 'nginx' do
  options '--disablerepo=amzn-main,amzn-updates'
end

Vagrant のプロバイダとして xhyve を使ってみた

vagrant xhyve

現時点で Vagrant のプロバイダとして xhyve を提供するプラグインが2個存在している。

どちらのプラグインが良いかのを比較はしていないが、RubyGems で公開されているためインストールが簡単だった oldpatricka/vagrant-xhyve を試すことにした。

手順

1. インストール

RubyGems で公開されているので vagrant plugin install でインストールした。

$ vagrant plugin install vagrant-xhyve

このプラグインは xhyve-ruby に同梱されている xhyve を使うようになっているので、xhyve 自体のインストールは不要である。

2. Vagrantfile の作成

Ubuntu 14.04 LTS の Box のみが提供されているので、この Box を起動する Vagrantfile を作成した。

Vagrant.configure(2) do |config|
  config.vm.box = 'oldpatricka/ubuntu-14.04'

  config.nfs.functional = false
end

config.nfs.functionalfalse に設定している理由は、vagrant up 時に下記のエラーを発生させないためである。

No host IP was given to the Vagrant core NFS helper. This is
an internal error that should be reported as a bug.

3. 起動

プロバイダに xhyve を指定して起動する必要がある。また、xhyve の制限で root 権限で起動する必要がある。

$ sudo vagrant up --provider=xhyve
Bringing machine 'default' up with 'xhyve' provider...
==> default: Box 'oldpatricka/ubuntu-14.04' could not be found. Attempting to find and install...
    default: Box Provider: xhyve
    default: Box Version: >= 0
==> default: Loading metadata for box 'oldpatricka/ubuntu-14.04'
    default: URL: https://atlas.hashicorp.com/oldpatricka/ubuntu-14.04
==> default: Adding box 'oldpatricka/ubuntu-14.04' (v0.1.0) for provider: xhyve
    default: Downloading: https://atlas.hashicorp.com/oldpatricka/boxes/ubuntu-14.04/versions/0.1.0/providers/xhyve.box
==> default: Successfully added box 'oldpatricka/ubuntu-14.04' (v0.1.0) for 'xhyve'!
==> default: Checking if box 'oldpatricka/ubuntu-14.04' is up to date...
==> default: Importing box...
==> default: Done importing box.
==> default:  About to launch vm
==> default:  -- CPUs: 1
==> default:  -- Memory: 1024
==> default: [vagrant-hostsupdater] Checking for host entries
    default: 
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default: 
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Rsyncing folder: /Users/hidekazu/xhyve-vagrant/ => /vagrant

Docker for Mac のメモリサイズを変更する方法

mac docker

Docker for Mac の設定画面でメモリサイズを変更しようとしたけど、スライダーを動かすことが出来ない状態だったので変更することが出来なかった。

f:id:holidayworking:20160419225437p:plain

正式版では設定画面から変更出来るようになると思うけど、現時点では pinata というコマンドを使う必要があるようだ。

例えば、メモリサイズを 4GB に変更したい場合は下記のように実行する。

$ pinata set hypervisor native memory=4

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

docker swift perfect

サーバーサイド 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 を作った

ruby

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 で書いてみる

riak 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"}