料理サプリを使ってみた!!

先日リリースされた料理サプリを早速使ってみた。
http://ryorisapuri.jp/

朝食になにか作ろうと思ってみたものの、これといってなにか食べたい物が決まっていない。
こういう時に、ジャンル検索のシーン別で「朝食」、「昼食」とかあると、作るものが決まっていない時はすごく便利。


トムヤムクン」も惹かれたけど、さすがに家にトムヤムペーストは常備していないので諦めた。
けど、お買物リストに追加しておけば、夕方に買い物に行った時に買い忘れをしないで済むのが便利。
もちろん、1品のみとはいかないので、他のレシピもお買物リストに追加しておく。
重複した材料は、ちゃんと計算されて必要な量がリストされるので、無駄買いしなくてすむのもよく考えられているな〜と。


で、結局「フライパンで簡単マルゲリータピザ」を作ることに決めた。
たまにパン焼き器を使ってパンを作っているので、必要な材料は大体揃ってるし、前からピザ作りはチャレンジしてみたかったので。

それにしても、動画で調理方法が見られるのはめっちゃ便利。
文章を読んでも、こね方とか、柔らかさとかイメージが湧かないけど、動画で見れるとすごく分かりやすい。


なわけで、ピザを作りました。
(細かいレシピはアプリを見て下さい)


材料をボールに入れてゴムベラで混ぜます。


打ち粉を降ったまな板の上で、更にこねます


再びボールに戻して、ラップを掛けて1時間置きます。
きれいに発酵が進み、倍ぐらいのサイズに膨らみました!


2枚分の材料なので、2つに分けてラップを掛けて10分ほど寝かします。


手抜きをしてレシピに有ったトマトソースを作らずに、コストコで買ったトマトソースを使います


オリーブオイルを引いたフライパンの上で、焼いていきます。


焼き目が付いたらひっくり返して、チーズとかのせます。


モッツアレラとバジルがなかったので、トマトソースとチーズだけのプレーンなピザが出来上がりました!!
プレーンだけど、冷凍ピザとは比べ物にならないぐらい美味しい!!


二枚目は、アンチョビペーストとオリーブを載せてみました!

フライパンピザは思ってたよりも簡単で、子供のおやつにも良さそうな感じです。

今度は、トムヤムクンか、四川風麻婆豆腐にチャレンジしよう。

ガーデンフェンスをDIY

長い間放置していたガーデンフェンスの設置を、GWの休みを使って一気に進めました。

Day1

元のフェンスはこんな感じの普通のやつ。

1400x900の板を27枚使ってフェンスを作っていきます

柱になる木材を含めて30枚ほど。
長持ちするように防腐剤が塗布されている板を使います。
なので色が緑っぽいから、色を塗っていきます。


手伝ってくれているのか、邪魔しているのか。。


既存のフェンスの柱に板をボルトで固定して、これに横板を貼って、それに縦板を固定します。


縦板の隙間を検討。
広すぎると変だし、狭すぎると風通しも悪くなてしまう。


隙間の幅が決まったら、毎回毎回寸法を測るのも大変なので、こんな感じの治具を作ります。


それを、縦板を固定するときに使って幅を綺麗に揃えていきます。


一気に縦板を貼り終えました。
初日はここまでで作業終了。

Day2

購入した板の元の寸法は1800だったけど、フェンスは1500の高さに揃えたので余った端材がいっぱい有ります。
捨てるのはもったいないので、端材を使って棚などを作っていきます。


こんな感じで棚を作ったり


箱型も作りました。


こんな感じでフェンスに取り付けて、花を飾って完成です!

tizen-iviをVirtualBox で動かしたい

tizen-iviのイメージがVMWare用に出ているのだが、VMWareは有料だし無料のVirtualBoxで動かせないか試してみることにした。

環境は、Mac10.9.2、VirtualBox4.2.22

こちらのサイトがtizen iviのwikiになっているのでそこを参考にしながら進める。
https://wiki.tizen.org/wiki/IVI/IVI_3.0_VMware

今回ダウンロードしたのはこれ
tizen_20140115.4_ivi-release-mbr-i586-sdb.raw.bz2

ダウンロードしたものを解凍します

bunzip2 tizen_20140115.4_ivi-release-mbr-i586-sdb.raw.bz2

qemu-imgコマンドでVMDK形式に変換

qemu-img convert -f raw -O vmdk tizen_20140115.4_ivi-release-mbr-i586-sdb.raw tizen-ivi-pre-3.0.vmdk

macだと大変そうだったので、VirtualBoxubuntuを動かして、その中でこのコマンドを実行して変換しました。)

VirtualBoxを起動して新しくマシンを追加します

タイプは「Linux」、バージョンは「Fedora」を指定


メモリは1GBぐらい


ハードドライブは一旦指定しない。
ポップアップで「OSが〜」と表示されるけど、一旦は無視する


ビデオメモリは最大を指定した

これで、マシンが追加されます。
次に、マシンを選択して設定のメニューをクリックします。

システムの設定


起動順序で、フロッピーとCDのチェックを外します。


「PAE/NXを有効化」にチェック

ディスプレイの設定


「3Dアクセラレーションを有効化」にチェック

ストレージの設定


ストレージツリーにあるものをすべて削除したあと、追加のアイコンから「IDEコントローラーを追加」をクリック


追加されたコントローラを選んで、追加のアイコンをクリックして「ハードディスクを追加」をクリック


「既存のディスクを追加」をクリックして、最初に変換したVMDKファイルを指定します


こんなかんじで追加されるので、OKで設定を終了

仮想マシンを起動

これで、かっちょいい画面でも表示されるのかと期待したら、なんだかbootの途中で止まってしまう。。

次はこちらのwikiを参考にしながら進める
https://wiki.tizen.org/wiki/IVI/IVI_January_15,_3.0-M2-EOY#Virtual_Machine

上記の画面の状態で「Ctrl + F3」を入力すると、ログインを促されるので、root /tizen では入ります。

wikiに書かれていることを色々試してみたけど、うまく起動できないですね。。
今日はつかれたので、続きはまた今度

Raspberry Pi + PiTFT

記事の内容が古いため、この手順でセットアップしてもうまくいかない場合があります。
ドライバが入ったイメージもリリースされているようなので、そちらを使ったほうが簡単に使えるかも。
https://learn.adafruit.com/adafruit-pitft-28-inch-resistive-touchscreen-display-raspberry-pi/easy-install

Raspberry Piを使ってデジカメを作ったという記事を見て、それに使われていた液晶ディスプレイがいい感じ。
Adafruit PiTFT - 2.8" Touchscreen Display for Raspberry Pi

ただの液晶ディスプレイではなく、タッチパネルでもあるので色々便利そうと思ってポチってしまった。
$36の本体に対して、EMSを使うと送料が同じぐらいの値段してお得感が全くなかったから、「USPS First Class Mail International」で送ってもらいました。
ヘタすると1ヶ月ぐらいさまよってから着くという話もありましたが、10日ぐらいで無事届きました。

よくよく見るとコネクタが基板に付いていない。。
ハンダ付けが必要ってことで、久しぶりにハンダ付けした。


久しぶりだったけど、ハンダ付けは楽しい。

準備ができたので早速セットアップ開始。
Raspberry PiのOSは、2014-01-07-wheezy-raspbian.zipが入ってる状態

ドライバのインストール

sshで入って

cd ~
wget http://adafruit-download.s3.amazonaws.com/libraspberrypi-bin-adafruit.deb
wget http://adafruit-download.s3.amazonaws.com/libraspberrypi-dev-adafruit.deb
wget http://adafruit-download.s3.amazonaws.com/libraspberrypi-doc-adafruit.deb
wget http://adafruit-download.s3.amazonaws.com/libraspberrypi0-adafruit.deb
wget http://adafruit-download.s3.amazonaws.com/raspberrypi-bootloader-adafruit-112613.deb
sudo dpkg -i -B *.deb

注意:
2013 Aug以降のRaspbianがインストールされている場合は、以下のコマンドを実行してaccelerated X framebufferを停止しておく必要があります。

sudo mv /usr/share/X11/xorg.conf.d/99-fbturbo.conf ~

(salexkiddコメントありがとうございます)

終わったらPiTFTを繋ぐので、一旦落とします

sudo shutdown -h now

落ちたら、PiTFTを接続して起動します。


この時、起動してもまだディスプレイには何も表示されず、バックライトが点いただけ。

ドライバの設定をして、X serverを起動してみると

sudo modprobe spi-bcm2708
sudo modprobe fbtft_device name=adafruitts rotate=90
export FRAMEBUFFER=/dev/fb1 
startx


デスクトップがTFTに表示されました!

続けて、起動時にドライバが読み込まれるように設定をします
Control + C でX Serverを止めます

エディタを開いて、/etc/modules に書きます

$ sudo nano /etc/modules

spi-bcm2708
fbtft_device

Control X + Y して、Enterで保存できます

次に

$ sudo nano /etc/modprobe.d/adafruit.conf

options fbtft_device name=adafruitts rotate=90 frequency=32000000

frequency=32000000は、20FPSの設定。

ここで、OSを再起動します。

sudo reboot

設定ファイルを追加

$ sudo mkdir /etc/X11/xorg.conf.d
$ sudo nano /etc/X11/xorg.conf.d/99-calibration.conf

Section "InputClass"
        Identifier      "calibration"
        MatchProduct    "stmpe-ts"
        Option  "Calibration"   "3800 200 200 3800"
        Option  "SwapAxes"      "1"
EndSection

タッチパネルのセットアップ

タッチパネル用のデバイスファイルの設定をします

$ sudo nano /etc/udev/rules.d/95-stmpe.rules

SUBSYSTEM=="input", ATTRS{name}=="stmpe-ts", ENV{DEVNAME}=="*event*", SYMLINK+="input/touchscreen" 

タッチスクリーンのモジュールをリロード

sudo rmmod stmpe_ts; sudo modprobe stmpe_ts

タッチパネル用のデバッグツールなどインストール

sudo apt-get install evtest tslib libts-bin

以下のコマンドで、タッチパネルの情報を見ることが出来ます

sudo evtest /dev/input/touchscreen

Input driver version is 1.0.1
Input device ID: bus 0x18 vendor 0x0 product 0x0 version 0x0
Input device name: "stmpe-ts"
Supported events:
  Event type 0 (EV_SYN)
  Event type 1 (EV_KEY)
    Event code 330 (BTN_TOUCH)
  Event type 3 (EV_ABS)
    Event code 0 (ABS_X)
      Value   1692
      Min        0
      Max     4095
    Event code 1 (ABS_Y)
      Value   1441
      Min        0
      Max     4095
    Event code 24 (ABS_PRESSURE)
      Value      0
      Min        0
      Max      255
Properties:
Testing ... (interrupt to exit)
Event: time 1393059859.794388, type 3 (EV_ABS), code 0 (ABS_X), value 2400
Event: time 1393059859.794398, type 3 (EV_ABS), code 1 (ABS_Y), value 1094
Event: time 1393059859.794402, type 3 (EV_ABS), code 24 (ABS_PRESSURE), value 70
Event: time 1393059859.794407, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
Event: time 1393059859.794411, -------------- SYN_REPORT ------------
Event: time 1393059859.800637, type 3 (EV_ABS), code 0 (ABS_X), value 2392
Event: time 1393059859.800651, type 3 (EV_ABS), code 24 (ABS_PRESSURE), value 100
Event: time 1393059859.800658, -------------- SYN_REPORT ------------
Event: time 1393059859.806818, type 3 (EV_ABS), code 0 (ABS_X), value 2380
Event: time 1393059859.806830, type 3 (EV_ABS), code 1 (ABS_Y), value 1095
Event: time 1393059859.806835, type 3 (EV_ABS), code 24 (ABS_PRESSURE), value 107

キャリブレーション

次のコマンドで、キャリブレーションを開始します

sudo TSLIB_FBDEVICE=/dev/fb1 TSLIB_TSDEVICE=/dev/input/touchscreen ts_calibrate


画面にカーソルみたいのが表示されるので、タップします。

次に、以下のコマンドでお絵かきのテストをします

sudo TSLIB_FBDEVICE=/dev/fb1 TSLIB_TSDEVICE=/dev/input/touchscreen ts_test


なにか書いてみて、触ったところと描画位置がずれるようであれば、上記のキャリブレーションをやり直します。

X input systemのキャリブレーション

wget http://adafruit-download.s3.amazonaws.com/xinput-calibrator_0.7.5-1_armhf.deb
sudo dpkg -i -B xinput-calibrator_0.7.5-1_armhf.deb

古いデータを一旦削除して起動

sudo rm /etc/X11/xorg.conf.d/99-calibration.conf
FRAMEBUFFER=/dev/fb1 startx &
DISPLAY=:0.0 xinput_calibrator


また、カーソルをポチポチタップします

ポチポチが終わると、ターミナルに以下が表示されます

--> Making the calibration permanent <--
  copy the snippet below into '/etc/X11/xorg.conf.d/99-calibration.conf'
Section "InputClass"
	Identifier	"calibration"
	MatchProduct	"stmpe-ts"
	Option	"Calibration"	"15 3712 3843 226"
	Option	"SwapAxes"	"1"
EndSection

この情報をファイルに書きます

sudo nano /etc/X11/xorg.conf.d/99-calibration.conf

Section "InputClass"
	Identifier	"calibration"
	MatchProduct	"stmpe-ts"
	Option	"Calibration"	"15 3712 3843 226"
	Option	"SwapAxes"	"1"
EndSection

キャリブレーションはこれで終わり

標準出力をPiTFTに設定する

いつもはHDMIでテレビに繋いでましたが、せっかく液晶モニターが手に入ったので、標準出力を表示できるようにします。

/boot/cmdline.txt を編集して、一番最後に

sudo nano /boot/cmdline.txt 

一番最後に以下と追記します

fbcon=map:10 fbcon=font:VGA8x8

再起動すると、液晶に表示されます!

カッコイイ・・

Vagrant + chef-soloでopsworksのrecipeをローカルで試す

Chefやcookbookについては過去のエントリで書きましたが、最近opsworksを使う機会があったので、その辺について書いてみようと。

opsworksAWSサービスでchefベースのサーバ構成ツール
opsworksが提供しているcookbookも使えるし、そのcookbookの一部をカスタマイズしたり、自分で作ったオリジナルのcookbookも登録して実行できる。

opsworksのコンソールから実行すればrecipeの実行はできるが、カスタマイズしたり新規で作ったcookbookを試す為に、ec2のインスタンスをポコポコ立ち上げるのも多少お金がかかるし、落とし忘れたら大きめの請求が来て悲しい気持ちになるので、ローカルで試せるものはなるべくローカルで試してみたい!

ということで、ローカルでrecipeを実行する為の、環境づくりや方法について説明していきます。
recipeを実行する先は自分のPCではなく、今流行(流行りに乗るのがだいぶ遅いけど)のVagrantを使います。
Vagrantについては詳しく説明しているサイトが他にもいっぱいあるので、詳しくはそちらを参照して下さい)


以下の説明はMac向けの説明となります。

VirtualBoxのインストール

VirtualBoxを以下のサイトからダウンロードして、インストールします。
https://www.virtualbox.org/wiki/Downloads

Vagrantのインストール

Vagrantを以下のサイトからダウンロードして、インストールします。
http://www.vagrantup.com/downloads.html

どちらもインストーラーなので、簡単ですね。

Vagrant仮想マシンを作る

ここからはターミナルを使って作業していきます。

どこか好きな所にディレクトリを作ってその中で作業します

$ mkdir ~/Documents/Vagrant
$ cd ~/Documents/Vagrant

今回はubuntuのイメージを使って作業するので、ubuntuのboxを作成します。
こちらのサイトに色々なイメージが公開されているので、使いたいものを選びます。
VirtualBox用を使うこと)

http://www.vagrantbox.es/

$ vagrant box add ubuntu12_04 http://cloud-images.ubuntu.com/vagrant/precise/current/precise-server-cloudimg-amd64-vagrant-disk1.box

VagrantFileを作ります

$ mkdir ubuntu
$ cd ubuntu
$ vagrant init ubuntu12_04

起動してみます

$ vagrant up

Bringing machine 'default' up with 'virtualbox' provider...
[default] Importing base box 'ubuntu12_04'...
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for machine to boot. This may take a few minutes...
[default] Machine booted and ready!
[default] The guest additions on this VM do not match the installed version of
VirtualBox! In most cases this is fine, but in rare cases it can
prevent things such as shared folders from working properly. If you see
shared folder errors, please make sure the guest additions within the
virtual machine match the version of VirtualBox you have installed on
your host and reload your VM.

Guest Additions Version: 4.1.12
VirtualBox Version: 4.3
[default] Mounting shared folders...
[default] -- /vagrant

起動しました。

通常は、vagrant ssh仮想マシンに入れますが、後でrecipeを実行するときに不便なので、ssh hogehoge で入れるように設定します。

以下のコマンドsshのconfigに記載する情報を表示します

$ vagrant ssh-config

Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/hogehoge/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL

表示された内容を~/.ssh/config に追記します

$ vi ~/.ssh/config

Host vagrant-ubuntu
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/hogehoge/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL

入れるか試します

$ ssh vagrant-ubuntu

Welcome to Ubuntu 12.04.4 LTS (GNU/Linux 3.2.0-59-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Sat Feb 22 00:24:13 UTC 2014

  System load:  0.0               Processes:           64
  Usage of /:   2.7% of 39.37GB   Users logged in:     0
  Memory usage: 10%               IP address for eth0: 10.0.2.15
  Swap usage:   0%

  Graph this data and manage this system at:
    https://landscape.canonical.com/

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.

vagrant@vagrant-ubuntu-precise-64:~$

入れました!

仮想マシンの準備ができたので、仮想サーバから抜けて、先ほどのディレクトリ(~/Documents/Vagrant/ubuntu)に戻ります。

chef-soloのセットアップ

Macの方にknife-soloが必要なので、gemで入れます。

今回試したrubyの環境は、以下のとおりです

$ ruby -v
ruby 2.0.0p247 (2013-06-27 revision 41674) [universal.x86_64-darwin13]

$ gem -v
2.0.3

knife-soloをインストール

$ sudo gem install knife-solo

バージョンを確認すると

$ knife -v

Chef: 11.10.4

chef-repoを作る

cookbookなどを含めるディレクトリをknifeコマンドで作ります

$ knife solo init opsworks-test

WARNING: No knife configuration file found
Creating kitchen...
Creating knife.rb in kitchen...
Creating cupboards...

作成されたディレクトリに移動します

$ cd opsworks-test

ディレクトリ内に作られたファイルとかは以下の様な感じ

opsworks-test/
    .chef
    .gitignore
    cookbooks
    data_bags
    environments
    nodes
    roles
    site-cookbooks

cookbooksディレクトリは、opsworksのcookbookを置くので、一旦削除してgithub上のリポジトリをcookbooksとしてcloneします。

$ rm -rf cookbooks
$ git clone https://github.com/aws/opsworks-cookbooks.git cookbooks

一回、opsworksで用意されているcookbookを試してみます。

cookbookを実行するためには、対象の仮想マシンにchef-soloが入っている必要があります。
仮想マシンに入ってインストールしてもいいですが、以下のコマンドで必要な物をインストールすることが出来ます。

$ knife solo prepare vagrant-ubuntu

セットアップが完了すると、nodes/vagrant-ubuntu.jsonMac上に作られます。
ファイルの中身は、

{"run_list":[]}

となっているので、run_listに実行するrecipeを書きます。
(run_listにカンマ区切りで書けば複数のrecipeを実行することが出来ます)

$ vi nodes/vagrant-ubuntu.json

run_listにnginxを追加しました

{
  "run_list":[
      "nginx"
  ]
}

recipeを実行します

$ knife solo cook vagrant-ubuntu

ちゃんとnginxがインストールされたか見てみます。

$ ssh vagrant-ubuntu
$ ps aux | grep nginx

root      3456  0.0  0.2  62876  1336 ?        Ss   02:11   0:00 nginx: master process /usr/sbin/nginx
www-data  3457  0.0  0.3  63212  1912 ?        S    02:11   0:00 nginx: worker process
www-data  3458  0.0  0.3  63212  1912 ?        S    02:11   0:00 nginx: worker process
www-data  3459  0.0  0.3  63212  1912 ?        S    02:11   0:00 nginx: worker process
www-data  3460  0.0  0.3  63212  1912 ?        S    02:11   0:00 nginx: worker process
www-data  3461  0.0  0.3  63212  1912 ?        S    02:11   0:00 nginx: worker process
www-data  3462  0.0  0.3  63212  1912 ?        S    02:11   0:00 nginx: worker process
www-data  3463  0.0  0.3  63212  1912 ?        S    02:11   0:00 nginx: worker process
www-data  3464  0.0  0.3  63212  1912 ?        S    02:11   0:00 nginx: worker process
www-data  3465  0.0  0.3  63212  1912 ?        S    02:11   0:00 nginx: worker process
www-data  3466  0.0  0.3  63212  1912 ?        S    02:11   0:00 nginx: worker process
vagrant   3654  0.0  0.1   8108   928 pts/0    S+   02:12   0:00 grep --color=auto nginx

ちゃんと入ってました。

次は自分で作ったrecipeを実行できるようにします。

カスタムcookbookの実行

カスタムのcookbookは、site-cookbooksに配置します。

opsworksのコンソールでgitのリポジトリを指定している場合は、そのリポジトリをsite-cookbooksにcloneします。
例)

$ rm -rf site-cookbooks
$ git clone <カスタムリポジトリを指定> site-cookbooks

今回は、サンプルとしてnginxに以下の変更を加えます。

  • worker processを2つにする
  • access_logのフォーマットをltsvに変更

カスタムcookbookを置くディレクトリを作って、opsworksのcookbookからnginxのテンプレートをコピーします

$ mkdir -p site-cookbooks/nginx/templates/default
$ cp cookbooks/nginx/templates/default/nginx.conf.erb site-cookbooks/nginx/templates/default/nginx.conf.erb
$ cp cookbooks/nginx/templates/default/default-site.erb site-cookbooks/nginx/templates/default/default-site.erb

nginx.conf.erbを編集します

$ vi site-cookbooks/nginx/templates/default/nginx.conf.erb

〜〜〜
http {
   〜〜〜

  access_log    <%= node[:nginx][:log_dir] %>/access.log;

  log_format  ltsv  'time:$time_local\t'
                            'host:$remote_addr\t'
                            'request:$request\t'
                            'status:$status\t'
                            'size:$body_bytes_sent\t'
                            'referer:$http_referer\t'
                            'ua:$http_user_agent\t'
                            'reqtime:$request_time\t'
                            'upsttime:$upstream_response_time';

default-site.erbを編集します

$ vi site-cookbooks/nginx/templates/default/default-site.erb

server {
  listen   80;
  server_name  127.0.0.1;

  access_log  <%= node[:nginx][:log_dir] %>/localhost.access.log ltsv;

  location / {
    root   /var/www/nginx-default;
    index  index.html index.htm;
  }
}

recipeやtemplateで使われているattributeを上書く場合は、先ほどのnodes/vagrant-ubuntu.json に書きます。

$ vi nodes/vagrant-ubuntu.json

{
  "run_list":[
      "nginx"
  ],
  "nginx":{
    "worker_processes": 2
  }
}

実行します

$ knife solo cook vagrant-ubuntu

ちゃんと反映されたか確認します。

$ ssh vagrant-ubuntu
$ sudo service nginx restart
$ ps aux | grep nginx

root      5197  0.0  0.2  62876  1216 ?        Ss   02:45   0:00 nginx: master process /usr/sbin/nginx
www-data  5198  0.0  0.3  63212  1916 ?        S    02:45   0:00 nginx: worker process
www-data  5199  0.0  0.3  63212  1916 ?        S    02:45   0:00 nginx: worker process
vagrant   5201  0.0  0.1   8108   932 pts/0    S+   02:45   0:00 grep --color=auto nginx

worker processが2つになりました。

次にテンプレートが反映されたか確認するので、デフォルトのindex.htmlを用意します

$ sudo mkdir -p /var/www/nginx-default
$ sudo touch /var/www/nginx-default/index.html
$ curl -I http://localhost/

HTTP/1.1 200 OK
Server: nginx/1.1.19
Date: Sat, 22 Feb 2014 02:52:36 GMT
Content-Type: text/html
Content-Length: 0
Last-Modified: Sat, 22 Feb 2014 02:51:03 GMT
Connection: keep-alive
Accept-Ranges: bytes

ログを見ると

$ cat /var/log/nginx/localhost.access.log

time:22/Feb/2014:02:52:36 +0000	host:127.0.0.1	request:HEAD / HTTP/1.1	status:200	size:0	referer:-	ua:curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3	reqtime:0.000	upsttime:-

ちゃんと、ltsv形式になっています。

これで、opsworksのcookbookとカスタムcookbookを組み合わせたrecipeの実行がローカルでも出来るようになりました!
もう、EC2の料金を気にしなくても、recipeのテストが出来ますね。

仮想マシンなので、何度繰返してもvagrant destroyしてから、vagrant up すれば、いつでもまっさらな環境でテストできるのがいいですね。

次は、jenkinsと組み合わせてrecipeのテストにチャレンジしようと思います。

 Redshiftのリモートデータロードについて

この記事は「AWS Advent Calendar 2013」の12/17分の記事となります。

Redshiftは、今までS3やDynamoDBからのロードに対応していましたが、先日のAWS re:Invent 2013でRedshiftが、リモートホストからのロードが可能になったと発表がありました。

発表された内容


これは何かというと、S3やDynamoDBからだけではなく、EC2のインスタンスやEMRから直接データをRedshiftに取り込めるようになったということです。

例えばアプリケーションのログをRedshiftに入れて、集計などに利用しようとした場合、
今まではログファイルをS3に一度アップロードして、それをLOADする方法をとっていたかと思います。
多いのは、サーバのログをtd-agent(fluentd)を使ってS3にアップロードする方式ではないでしょうか。

この方法でも特に問題はないのですが、サイズが大きくなるとアップロード → Redshiftへloadとと待ち時間が発生します。

しかし、今回の発表により、EC2のインスタンスから直接Redshiftにloadできるので、この待ち時間を短縮することが可能です。
(もっとリアルタイムを求めるなら、Kinesisがきっと便利)


今回は、このリモートロードを使ってWebサーバからアプリケーションのログをアップロードすることをイメージしながら解説したいと思います。

事前準備

事前に、以下を準備しておきます。

1. EC2インスタンスAmazon Linuxを使いました)
2. Redshiftのクラスタ

クラスタの準備については、以前ブログでも書きましたのでそちらを参考にして下さい。

リモートホストからのデータロード設定

1.マネージメントコンソールを開いて、対象のクラスタの詳細画面から、公開鍵とIPアドレスを調べます


2.EC2インスタンスのauthorized_keysに調べた公開鍵を追加します

viでauthorized_keysを開いて、鍵を追記します

vi ~/.ssh/authorized_keys


3.Redshiftクラスタからのアクセスを許可するために、調べたIPアドレスをセキュリティーグループに追加します


4.EC2インスタンスの公開鍵を調べて控えます

cat /etc/ssh/ssh_host_rsa_key.pub

5.マニフェストファイルを作成します

{ 
   "entries": [ 
     {"endpoint":"<EC2インスタンスのIP>", 
       "command": "<実行するコマンド>",
       "mandatory":true, 
       "publickey": "<4.で調べた鍵>", 
       "username": "<SSHで入るときのユーザー名>"},
       ・・以下繰り返しで、複数のホストを指定可能
    ] 
}

今回作成したものの例はこちら

{ 
   "entries": [ 
     {"endpoint":"xxx.xxx.xxx.xxx", 
       "command": "sh /home/ec2-user/load_log.sh",
       "mandatory":true, 
       "publickey": "AAAAB・・・", 
       "username": "ec2-user"}
    ] 
}

/home/ec2-user/load_log.sh の中身は

sudo cat /var/log/httpd/access_log


6.S3にマニフェストをアップロードします

manifest.jsonなど、適当に名前をつけてS3上の任意のBucketに保存します。
RedshiftのクラスタからS3へマニフェストを取得するので、IAMでユーザーを作成して専用のアクセキー、シークレットキーを使ったほうがいいかもしれない

IAMで専用のユーザーを作成した場合は、S3のbucket policyで以下のようなものを追加すると、manifest.jsonに対してgetする権限を与えることが出来ます。

{
	"Version": "2008-10-17",
	"Id": "Policy123456",
	"Statement": [
		{
			"Sid": "Stmt123456",
			"Effect": "Allow",
			"Principal": {
				"AWS": "arn:aws:iam::1122334455:user/remote-load-user"
			},
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::<bucket名>/manifest.json"
		}
	]
}

これで、リモートロードの準備はできたので、ロードするデータと、ロード先のDBを作成します。

Webサーバ側の設定

今回はとりあえず、ApacheアクセスログをRedshiftに取り込むことにするので、ログをそのままロードできるように、csv形式のフォーマットへ変更します。

/etc/httpd/conf/httpd.conf を開いて、ログフォーマットを変更します

#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
↓
LogFormat "%h,%u,%t,\"%r\",%>s,%b,\"%{Referer}i\",\"%{User-Agent}i\"" combined

Redshiftにテーブルを作成

アクセスログを格納できるように上記で変更したログフォーマットに合わせてテーブルを作成します。

create table access_log(
remote_host varchar,
remote_user varchar,
request_time varchar,
request_first_row varchar,
http_status int,
response_bytes varchar,
referer varchar,
user_agent varchar);

データをロード

LOADコマンドを叩いて、リモートロードを実行します

前回書いたブログにworkbenchの設定方法など書かれているので、そちらを参考にSQLを叩ける環境を作ります。

copy <ロード先テーブル名>
from 's3://<bucket-name>/<マニフェストファイルのキー>'
credentials 'aws_access_key_id=XXX;aws_secret_access_key=XXXXXXX'
delimiter ',' ←CSV形式なのでカンマを区切り文字に指定
COMPUPDATE OFF
ssh;

COMPUPDATEはデフォルト値(ON)のままだと、事前の解析用に一回リモートロード打実行され、その後にもう一度実行されてしまうので、2度実行されたら困るコマンドを実行する場合は、OFFにする必要がある。

で、今回実行したコマンドはこれ

copy access_log
from 's3://<bucket-name>/manifest.json'
credentials 'aws_access_key_id=XXX;aws_secret_access_key=XXXXXXX'
delimiter ','
COMPUPDATE OFF
ssh;


また、今回はCOPYコマンドを実行した際に、「sorry, you must have a tty to run sudo」とエラーがでたので、visudoで”Defaults requiretty”をコメントアウトしました。

コマンドを実行すると、EC2のインスタンスに対してSSHでログインしてきて、マニフェストファイルのcommandで指定したコマンドが実行されます。

今回の単純なアクセスログを取り込む場合だと、150万行ぐらいのアクセスログが、6秒ぐらいで取り込まれました。

ログローテートのタイミングに合わせて、ロード処理を実行する様にcronにコマンドを実行させるといった方法で、ログを自動的に取り込むことも可能です。

うまくローテートの時間とcronでのLOADを組み合わせれば、比較的リードタイムが短いアクセス解析にも使えそうです。

もっとリアルタイムで処理したい場合はkinesisが良さそうなので、これも調べてそのうちブログに書きたいと思います。
(プレビューのOKが出たけど、実際に使うとなるとサンプルプッログラムを書かないと、検証できなそうなので少し先かな・・)

Estimote Beaconゲット

知人がFacebookで「買うよ〜」と言ってたので、便乗して買ってもらいました。
ありがとうございますmm

ベーコンが量産されている動画も有ったり、到着がたのしみでした。

で、届いたのがこれ

なかなか、ステキな入れ物

開けてみると、3個入ってます。
ベーコンのステッカーも入ってる。

ベーコンには電源スイッチはついてないんだけど、どうやら出荷時から電波を出してるらしい。

さっそく、AppStoreで公開されているEstimoteのサンプルアプリをダウンロードして、見てみることに。

3個とも箱に入ったままだけど、こんなかんじで検出されました。

ベーコンの詳細も見ることが出来て、こんなかんじで情報が取得できています。

Estimoteのサンプルアプリは、オリジナルのSDKがライブラリとして提供されており、iOSフレームワークをラップしているようです。

お店での商品紹介や、決済アプリとの連携など、アプリの作りこみで新しいものが作れそうです。

とりあえず、個人で何かに使えないか考えてみようかと思います。

まずは、いい感じのブログを見つけたので、これらを見て勉強します。
Beaconの解説
Playing With iBeacon and Estimote in iOS 7