ターミナルでDBの新規インサート(直近レコード)を監視する

PostgreSQLに入ってるテーブルの直近10レコードを表示する。

$ psql --pset=pager -c "SELECT * FROM hoge ORDER BY id DESC LIMIT 10;"

上記をターミナル上で延々と繰り返したい。
たとえば1秒おきに叩くとか。
ターミナルで見たいからcronは使えない。
定期実行のコマンドといえばwatch

これは間違い
$ watch -n 1 psql --pset=pager -c "SELECT * FROM hoge ORDER BY id DESC LIMIT 10;"

これが正しい
$ watch -n 1 'psql --pset=pager -c "SELECT * FROM hoge ORDER BY id DESC LIMIT 10;"'

クエリーとシェル変数を組み合わせればファイルに対するtail的なことをDBにも出来るかも。

Raspberry PiへRuby 2.0を入れる

参考
Groom your app’s Ruby environment with rbenv.
Raspberry PiにrbenvでRuby2.0.0インストールした
Ubuntu12.04にrbenvインストールして、crontabやdaemontoolsも設定した
rubygems update の罠

  • rubyのインストール
$ sudo apt-get -y install rbenv ruby-build openssl libssl-dev libreadline-dev
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ rbenv install --list | grep '2\.0'
$ rbenv install 2.0.0-p353

実際には最後の行は

$ time rbenv install 2.0.0-p353

として

real	138m20.700s
user	128m29.870s
sys	4m31.190s

となる。2時間ちょっとかかった。

インストールされたか確認する。

$ rbenv versions
* system (set by /home/pi/.rbenv/version)
  2.0.0-p353

デフォルトを今入れたものへ変更する。

$ rbenv global 2.0.0-p353

設定されたか確認する。

$ ruby --version
ruby 2.0.0p353 (2013-11-22 revision 43784) [armv6l-linux-eabihf]
  • gemのアップデート
$ gem install rubygems-update bundler rbenv-rehash
(ここでログアウト&ログイン)
$ update_rubygems
(アップデート後に更新履歴がズラズラ並ぶ)
$ gem --version
2.2.2
$ gem update
(rakeとrdocの上書きを聞かれたらNで)
$ rbenv rehash

長かった…。


Ubuntuはだいぶredhat系とパッケージ名が違うのね。
apt-get install readline
で駄目なのは焦るなど。

Raspberry Piを購入して初期設定

参考サイト

この記事に触発されました。


以下購入に関して。

  • 持っていた物
    • micro USBケーブル(端子はType A、Micro-B)
    • USB出力電源アダプター(端子はType A)
    • microSDカードアダプター(microSDをUSBで包む)

ELECOM カードリーダライタ USB2.0対応 シングルタイプ microSD用 小型 FACE MR-SMC07WHF1

    • モニター(端子はDVI-I)
  • 組み立て

参考ページの通りに組み立てる。
本体に電源、SDカード、LANケーブルさえ繋げば他は要らない。
モニター表示とキーボードは何かあった時のために用意した。
でもある方が良いよ。
キーボードがUSB英語キーボードなのは最初に入れるOSが日本語化されていないかもしれない場合を見込んで。記号の入力でハマると嫌だし。

  • 作業
    • イメージを用意する。

Raspberryの公式サイトからイメージをダウンロードする。
NOOBSではなくRaspbianを選んだ。
ダウンローされたファイル名は2014-01-07-wheezy-raspbian.zip。
以下でzipの中身を展開する。

$ unzip 2014-01-07-wheezy-raspbian.zip
    • イメージ書き込み

microSDHCをmicroSDカードアダプターでMacへ挿す。
自動でマウントされるのでアンマウントする。
そしてイメージを焼く。

$ sudo diskutil unmount /dev/disk1s1
$ sudo dd bs=1m if=2014-01-07-wheezy-raspbian.img of=/dev/rdisk1

5分位かかった。
途中で失敗したり中止したらdiskutilを立ち上げてパーティションを消去してMacを再起動してからやり直す。

    • 本体を起動

上で焼き込んだmicroSDHCをSDカードのアダプターに入れてRaspberry Piへ挿す。
そして電源のUSBケーブルを通電する。
LEDの全部(ACT:桃色?、PWR:赤、FDX:緑、LINK:緑、100:緑)が光ったら起動が始まってる。
PWRしか光っていなかったらイメージの焼き込みに失敗している。色々見直す必用がある。

    • ログイン

IPアドレスを確認する。
どのIPアドレスが割り当てられたかはルーターの管理画面で確認するかtcpdumpでを見てDHCP経由でRaspberry Piに配布されたのを見る。
そのIPアドレスへユーザーpiでログインする。
パスワードはraspberry。

$ ssh pi@192.168.0.100

32GiBのSDカードを使っているのに最初は焼いたイメージの大きさのままになっているのでパーティションを広げる。

$ sudo raspi-config

これで表示されたメニューの1を選んで容量限界まで拡張する。
大容量のSDカードを使うとバックアップの時に困るかもしれないのでそこは購入前に検討すべし。

言語→米国英語
タイムゾーン→Asia/Tokyo

システム標準を日本語にするとログや設定ファイルに日本語が出てきてターミナル作業の邪魔になることが多いので米国英語にする。
ユーザー用の言語は日本日本語でも可。その場合はLANGの変更だけで良いはず。

sudo update-locale LANG=en_US.UTF-8
sudo echo "Asia/Tokyo" > /etc/timezone
sudo dpkg-reconfigure -f noninteractive tzdata

確認

$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
$ date
Sat Feb 1 15:46:21 JST 2014
    • 新規ユーザーを作成

普段使うユーザーを作成する。
ついでにsudoの許可とグループadmへ登録する。admはredhat系でいうところのwheel。

$ sudo passwd root
$ sudo useradd kappa -m
$ sudo passwd kappa
$ sudo usermod kappa -G adm
$ sudo visudo
(ファイル末尾に以下を追記する)
%adm ALL=(ALL) ALL
$ exit
    • 新規ユーザーのログイン確認

作成したユーザーでログインできるか、sudoできるか確認する。

$ ssh kappa@192.168.0.100
kappa@192.168.0.100's password: 
Linux raspberry 3.10.25+ #622 Fri Jan 3 18:41:00 GMT 2014 armv6l
(略)

$ sudo ls -l /root
[sudo] password for kappa:
total 0
    • ユーザーpiを無効化(ロック)

これからはkappaを使うのでpiは無効にする。自動化の時に復活させるかもしれないので削除はしない。

$ sudo usermod -L pi
$ exit
    • ユーザーpiが無効化されたか確認
$ ssh pi@192.168.0.100
Permission denied, please try again.
    • 有線LAN設定
$ sudo cp /etc/network/interfaces /etc/network/interfaces.1.bak
$ sudo vi /etc/network/interfaces
(以下へ変更)
auto lo

iface lo inet loopback

iface eth0 inet static
address 192.168.0.100
netmask 255.255.255.0
gateway 192.168.0.1

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf

iface default inet dhcp
(保存)

再起動する

$ sudo reboot

指定のIPアドレスへ接続する

$ ssh kappa@192.168.0.100

現状確認

$ sudo ifconfig -a
(略)
wlan0     Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:6 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

$ sudo dmesg  | less
(略)
[    3.359457] usb 1-1.3: new high-speed USB device number 4 using dwc_otg
[    3.471583] usb 1-1.3: New USB device found, idVendor=2019, idProduct=ab2a
[    3.482733] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[    3.494129] usb 1-1.3: Product: GW-USNANO2
[    3.502288] usb 1-1.3: Manufacturer: Planex Communications Inc.
[    3.512299] usb 1-1.3: SerialNumber: xxxxxxxxxxxx
(略)

$ sudo lsusb | grep -i PLANEX
Bus 001 Device 004: ID 2019:ab2a PLANEX GW-USNano2 802.11n Wireless Adapter [Realtek RTL8188CUS]

何もしなくても認識されている。

SSIDパスフレーズを作成する

$ sudo wpa_passphrase 親機のSSID パスワード > ~/passphrase.tmp

SSIDとPSKを設定する

$ sudo cat ~/passphrase.tmp >> /etc/wpa_supplicant/wpa_supplicant.conf
$ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf
(以下変更内後)
trl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
  ssid="親機のSSID"
  psk=生成された値
  key_mgmt=WPA-PSK
  proto=WPA2
  pairwise=CCMP
  priority=2
}
(変更して保存)

ネットワークの設定

$ sudo cp /etc/network/interfaces /etc/network/interfaces.2.bak
$ sudo vi /etc/network/interfaces
(以下変更後内容)
auto lo

iface lo inet loopback

iface eth0 inet static
address 192.168.0.100
netmask 255.255.255.0
gateway 192.168.0.1

allow-hotplug wlan0
iface wlan0 inet static
address 192.168.0.101
netmask 255.255.255.0
gateway 192.168.0.1
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

iface default inet dhcp
(変更して保存)

無線LANを有効にする

$ sudo ifdown wlan0
Internet Systems Consortium DHCP Client 4.2.2
Copyright 2004-2011 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/wlan0/xx:xx:xx:xx:xx:xx
Sending on   LPF/wlan0/xx:xx:xx:xx:xx:xx
Sending on   Socket/fallback
DHCPRELEASE on wlan0 to 192.168.0.1 port 67

$ sudo ifup   wlan0
ioctl[SIOCSIWAP]: Operation not permitted
ioctl[SIOCSIWENCODEEXT]: Invalid argument
ioctl[SIOCSIWENCODEEXT]: Invalid argument
Internet Systems Consortium DHCP Client 4.2.2
Copyright 2004-2011 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/wlan0/xx:xx:xx:xx:xx:xx
Sending on   LPF/wlan0/xx:xx:xx:xx:xx:xx
Sending on   Socket/fallback
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 3
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 7
DHCPREQUEST on wlan0 to 255.255.255.255 port 67
DHCPOFFER from 192.168.0.101
DHCPACK from 192.168.0.1
bound to 192.168.0.101 -- renewal in 38864 seconds.

$ exit

LANケーブルを抜いて無線LAN経由で接続する。

$ ssh kappa@192.168.0.101
kappa@192.168.0.101's password: 
Linux ginowan 3.10.25+ #622 PREEMPT Fri Jan 3 18:41:00 GMT 2014 armv6l

とりあえず無線化して放っておけるところまでできた。

OS X MavericksでWindowFlowを使う

こちらを参考にさせていただきました。
絵入りでドンピシャのものが無かったのでメモとして。

MavericksになってWindowFlowが自動で起動していないなと気づいたので今更ながらに手動で起動したらaccessなんちゃらを設定して起動しなおせとエラーが出たのでその解決方法です。

  1. 「システム環境」を開く

  1. 「セキュリティとプライバシー」を開く

  1. 左下の鍵を変更を許可し、「アクセシビリティ」をクリックし、「WindowFlow」をチェックする

  1. WindowFlowを起動する

これでWindowFlowがMavericksでも使えるようになります。

また、
Macの「次のウィンドウを操作対象にする」をなぜ設定しないのか
にある通りWindowFlowを使わなくても元々option+F1にウィンドウ切り替えが割り当てられているのでそれでも可能です。

Amazon EC2でDocker

自分用の記録として。進行中。

参考リンク

Marketplaceから以下を選択する。
CentOS 6 (x86_64) - with Updates

    • OSのアップグレード

# yum update
...
COMPLETE!

    • アップデートが上手くいったか確認する

# cat /etc/redhat-release
CentOS release 6.5 (Final)

参考
How To: Install RHEL EPEL Repo on Centos 5.x or 6.x

# yum install wget
# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
# rpm -Uvh remi-release-6.rpm epel-release-6-8.noarch.rpm
# ls -l /etc/yum.repos.d/epel* /etc/yum.repos.d/remi*

    • 普段は使いたくないので無効にしておく

# vi /etc/yum.repos.d/epel.repo

enabled=0

  • Dockerをインストールする
    • RPMをインストールする

# yum install docker-io --enablerepo=epel
# yum -y update docker-io --enablerepo=epel
# service docker start
# chkconfig docker on
# chkconfig --list | grep docker
# docker run centos /bin/echo "Hello World"
# docker run centos yum -y update
# docker run centos cat /etc/redhat-release

下3行はお試しでCentOSのコンテナを動かしてる。現時点でCentOS 6.4。

    • イメージを作る。

イメージの定義ファイルを作成する。

# vi Dockerfile

FROM centos

    • イメージを作成する。

# docker build -t kappaseijin/centos65 .

    • イメージからコンテナを起動&ターミナルへログインしてOSをアップデートする。

# docker run -t -i kappaseijin/centos65 /bin/bash

yum -y update
..
Complete!
(このままターミナルを抜けるとコンテナでの作業が保存されずに消えるので今回はexitとかCtrl-dはしてはいけない)
(Ctrl-p Ctrl-qを打ってコンテナを動かしたままターミナルから抜ける)

    • コンテナの状態をイメージへ保存する

# docker ps
(1番左に表示されるIDを記録する)
# docker commit さっきのID kappaseijin/centos65
(ファイルの変更/新規が多いとコミットに時間が掛かる)

    • コンテナを終了させる

# docker kill さっきのID

Googleカメラ系と個人情報について

思っていることを並べるだけなので考察どころか思考にも至っていなけど書き連ねるなど。


Googleカメラ系デバイスが普及すると真っ先に流行るのは顔認識サービスだろうということに異論はないはず。

ではその利用に関してはどこまで合意が取れるかな? 自分の目視とGoogleカメラ系の画像はどこまで結びつけることが許されるのかな?

食べログを考えてみる。
食べログを知らない人のためにそれがどういうサービスかとざっくりと書くと「お店を評価するサービス」だね。スターバックス品川の場所はここだとか店内の雰囲気はこうだとか椅子の感じはこうだとか店員の接客はこうだとか。そういう評価するサービス。評価にともなって店内外の写真や位置情報は載っている。

つまりこれと同様のことをGoogleカメラ系で行った場合はどこまでサービスの提供が許されるのかな。別の言い方をするなら他人の顔に対して情報を共有をするのは許されるのか。

Googleカメラ系サービス、だといちいち長いのでここでは上に出した食べログに準じて「顔ログ」というサービス名だとしよう。顔本だとfacebookみたいなのでそれで。

具体的な例を上げていこうかな。


顔写真の共有は許されるのか(1)。

炎上するスマホアプリとサービスがちょこちょこ出てくる現状だと1をやっちゃうサービス提供会社も出てくるとは思うけど日本だと正直難しいだろうね。

では次に
顔を似顔絵やアニメ絵で共有するのは許されるのか(2)

これなら程度問題だけどそんなに似ていなければ最初は許されるのかもしれない。特に自動でアニメ絵が生成される方式なら反発が少ないかもしれない。ただ、この方式でも競合サービスが増えてくると似顔絵がだんだん似てきたり、自動で画像を生成する方式から手動で調整するようになったり、髪型の調整や服をきせかえできるようになって、結局最後は本人を簡単に特定できるくらいに似てきて問題にされる可能性が高い気がする。

では次に
顔をデータ化して共有するのは許されるのか(3)

この方式として色々なやり方が考えられるけどおそらく3Dデータを生成するか、顔認識のデータを生成するかそのどちらかのデータを作るようになると思う。
前者の場合は二次元写真から三次元データを作ることになるかな。具体的には30cm×30cmの箱に顔を突っ込んだとして顔の表面の凹凸を1mm単位で(x,y,z)の点としてデータ化する。
後者の場合は世界中の人間の顔の平均を割り出してその平均から眼や鼻の位置がどれだけずれているかを1mm単位で表してそれをデータ化する。
これだと写真じゃないからただのデータだと言い切ることはできるのかもしれない。ただ、そのデータから本人の顔を生成するのは可能なのでそういうサービスができてしまうと写真を共有する2と大差はないとおもう。やっぱり日本だと厳しいかな。

では次に
3から元のデータを生成できない形のIDで置き換えてそれを共有するサービスは許されるだろうか(4)

これは3の応用。2のデータをSHA512とかでハッシュ化してそれをIDにしただけ。この場合のハッシュ値は絶対に逆算できない。逆算できないけど同じデータなら必ず一意に同じIDが生成されるとするね。
これなら本人を特定できないどころか本人の属性もわからない。属性っていうのは2みたいに鼻が高いとか目がつり目とかいった特徴のことね。


なので4の方式で解決!めでたしめでたし〜!


というわけには勿論いかなくて4の方式でもそれをどう使うか運用するかで問題になるよね。

サービスの例として、

1. ホントのイケメンがいる美容室マップ
2. 居酒屋でゲロ吐いた奴
3. 原宿で見かけた綺麗なお姉さん一覧
4. 東海道線ランドセル図鑑

というようなサービスがすぐに思いつくかな。
1は店員として顔出しOKなら問題ないかもしれない。
2はお店同士が嫌な客のブラックリストとして使うならひょっとして問題ないかも。
3までくると職場の飲み会で撮った集合写真から美人の同僚の顔を切り出してその切り抜きを撮影したらストーカーできてしまって問題になりそう。一般人には抵抗あるよね。
4までくると電車通学の小学生を見つけるロリコン向けサービスにしか思えないので明確にダメだよね。


こうなるともう顔ログは日本人には提供不可能なサービスに思えるなあ。個人が個人のためだけに使うサービスにしか使えないかも。精一杯あるとして名刺交換した取引相手を想い出すのに使う程度。

うーん、顔という最大の個人情報を扱うサービスって難しい。
まあそれでもGoogleGoogleマップみたいに強気に始めて普及したらそのうち気にしないかもれないけど。

オチ無し。
ではではー。

ruby on railsでのエラー

railsでアプリを作っていたらのこのエラーが出た。

nodenv: couldn't find any version specified for use

nodejsが見つからない?というエラーなのかと思ったら逆で、nodejsが複数見つかったからどれを使うの?というエラーなそうです。
Titanium Studio の設定がうまくいかないのでBoxenで環境構築するのを諦めました

さらにググってnodejsのバージョンの指定の仕方を見つけました。
Boxen で npm を管理する

でも何故か上記の指定を指定してboxenコマンドを叩いても反映されないので結局以下のコマンドでバージョンを固定しました。

nodenv global v0.10.9

色々納得いかないけどコレで。