2014-12-06

学びサイトメモ

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

この本を読んで気になったサイトのメモです。

さかぽん先生.tv(小中学生向け)
eboard [いーぼーど] (小学校~高校生向け)
マナビー(高校生向け)
カーンアカデミー(日本語吹き替え)(小学生~大人向け)
schoo(大人向け)
JMOOC(大人向け)

2014-11-24

railsのログに情報を追加する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
railsのログに情報を簡単に追加する方法として
config.log_tags
を利用する方法があります。

config/environment/develpment.rb
や
config/environment/production.rb
に以下のように書くとセッションIDとリモートIPをログに追加できます。
config.log_tags = [ :uuid, :remote_ip ]

ここでふと、このlog_tagsにはどんなものが記載できるのだろう?と思ってみたわけです。

調べてみたところ、log_tagsで記載した内容が、実際にログにタグとして追加する処理は以下のcompute_tagsの部分で行っているようです。
https://github.com/rails/rails/blob/21a71cd5d8f266252278a63316a99cc403a32cad/railties/lib/rails/rack/logger.rb#L57

Sybolとして指定したものは、requestオブジェクトのメソッドとして呼ばれるようです。なのでrequestオブジェクトのメソッドがここで指定できる候補になります。

実際に、以下のようにuser_agentを追加してみたら
config.log_tags = [ :uuid, :remote_ip, :user_agent ]

以下のようなログが出力されました。
[a0b386ac-c108-4820-be22-4fbf8d14a1e8] [10.10.10.10] [Mozilla/5.0(Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36] Processing by WelcomeController#index as HTML

log_tagsで指定できるのは、Symbol以外にProcも指定できて、この場合はProcオブジェクトにrequestオブジェクトを引数として渡されて処理されるようです。
またそれ以外に、文字列を指定した場合は、その文字列が単純にセットされるようです。

ただrequestのメソッドならば、なんでもSymbolで指定したり、Proc内で処理できるわけではなさそうです。sessionなどは処理できませんでした。
どうも、通常は、ログの処理よりもセッションの処理の方が後に行われるようで、sessionを指定してもログの処理の段階ではセッションの処理がまだ行われていないことが原因のようです。

なので、以下のサイトで紹介されているように、処理の順番を入れ替えることでsessionも扱えるようになるようです。
http://threetreeslight.com/post/51883603368/rails-id-ip

2014-11-06

rubyで一時的にワーニングなしで定数を変更する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
rubyで定義済みの定数の値を変更するとワーニングが出力されます。

これは本来ありがたい仕様だと思うのですが、
今回、どーしても一時的に定数を書き換えたいケースがでました。

ワーニングが出るだけで動きに支障はないので、そのままでもよかったのですが
なんとなくワーニングが消せないかなぁと調べてみました。

以下のような感じでできました。
一時的な変更と言うより、一回削除して再作成です。

class A
  MOGE="momomo"
end

p A::MOGE
-> "momomo"

muga = A::MOGE

A.send :remove_const, :MOGE

A::MOGE = "mimimi"

p A::MOGE
-> "mimimi"

A.send :remove_const, :MOGE

A::MOGE = muga

p A::MOGE
-> "momomo"


これでクラスやモジュールに定義されている定数をワーニングなしで一時的に置き換えることができました。

ちなみにグローバルに定義している定数の場合は、以下のような感じです。

HOGE = "hohoho"

p HOGE
-> hohoho"

fuga = HOGE

Object.send :remove_const, :HOGE

HOGE="hihihi"

p HOGE
-> "hihihi"

Object.send :remove_const, :HOGE

HOGE = fuga

p HOGE
-> "hohoho"

2014-09-25

Raspberry Piで音声合成してしゃべらせてみる

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Raspberry Piで音声合成を試してみます。

以下を参考にしています。
http://shokai.org/blog/archives/6893

Raspberry Piで音が出るようにするには、以下を参照ください。
Raspberry Piで録音再生をしてみる


音声合成にはopen-jtalkというものを利用します。

まずはopen-jtalkをインストールします。
sudo apt-get install open-jtalk hts-voice-nitech-jp-atr503-m001 open-jtalk-mecab-naist-jdic

デフォルトとは別の音声データを用意します。
wget http://downloads.sourceforge.net/project/mmdagent/MMDAgent_Example/MMDAgent_Example-1.3.1/MMDAgent_Example-1.3.1.zip
unzip MMDAgent_Example-1.3.1.zip
sudo cp -R MMDAgent_Example-1.3.1/Voice/* /usr/share/hts-voice/

ここまでくれば、音声合成はもう少しです。
open-jtalkで実際にしゃべらせるには、なんか面倒なコマンドを打つ必要があるようです。
それを簡単にするためのスクリプトが公開されているので使わせていただきます。

wget https://gist.githubusercontent.com/shokai/2892965/raw/jsay
chmod 755 jsay

ちなみにスクリプト内の最初の方でcdしている部分を変更することで声を変えることができるようです。

試してみます。
./jsay だめよー。だめだめ

い~~じゃないの~~

2014-09-24

Raspberry Piで録音再生をしてみる

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Raspberry Piで録音と再生をしてみます。

以下を参考にしています。
http://cubic9.com/Devel/%C5%C5%BB%D2%B9%A9%BA%EE/RaspberryPi/%C6%FC%CB%DC%B8%EC%B2%BB%C0%BC%C7%A7%BC%B1/

今回、録音再生するために使ったのは、以下のものになります。
Raspberry PiにUSB接続して、これにスピーカやマイクを接続して使います。
 

まずは、機器を使えるようにします。いろいろ作業用に事前にrootになっておきます。
sudo su -

まずは接続されていることを確認します。
lsusb
とコマンドをうって
Bus 001 Device 006: ID 0d8c:013a C-Media Electronics, Inc.
みたいのが出ていれば、きちんと認識されています。

音関連モジュールの優先度を確認します。
cat /proc/asound/modules
---------------
0 snd_bcm2835
1 snd_usb_audio
---------------
となっていれば、内蔵オーディオが優先されているので、USBで接続したものの優先度をあげる設定が必要です。

変更は、以下のファイルに対して行います。
/etc/modprobe.d/alsa-base.conf

変更の仕方を検索すると以下の部分のコメントアウトして
#options snd-usb-audio index=-2

options snd_bcm2835 index=-2
を追加してsnd_bcm2835の優先度を下げる方法と

options snd-usb-audio index=0
を追加してsnd-usb-audioの優先度をあげる方法の2通りがある感じです。

今回はsnd-usb-audio優先度をあげてみます。
vi /etc/modprobe.d/alsa-base.conf
---------------
# options snd-usb-audio index=-2
options snd-usb-audio index=0
---------------

設定を変更したら再起動します。
reboot

再起動したら、またrootになっておきます。
sudo su -

cat /proc/asound/modules
としてUSBオーディオが優先されていることを確認します。
---------------
 0 snd_usb_audio
 1 snd_bcm2835
---------------

とりあえず音が出るかを確認してみます。mplayerというを使ってみます。
apt-get install mplayer

とりあえず最初から入っているmp3ファイルを探してみます。
find / -name *.mp3

見つけたファイルを再生して音が出ることを確認してみます。
mplayer /usr/share/scratch/Media/Sounds/Vocals/Sing-me-a-song.mp3

ちなみに音がなっている間に*を押すと音量が上がり、/を押すと下がるようです。


いよいよ録音を試して見ます。

まず、マイクの感度を最大にしておきます。
amixer sset Mic 16

録音は以下のような感じです。
arecord -r 16000 -f S16_LE test.wav

マイクでしゃべり終わったらcrtl+Cを押すと録音が完了します。

録音したものの再生は以下の感じです。
aplay test.wav



2014-08-12

Windows Updateで80072EE2エラーが出たとき

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
最近Windows Updateをすると80072EE2エラーが出てとまってしまっていました。

調べると以下のサイトの対応をとるとよい感じでした。
http://capacitor.blog.fc2.com/blog-entry-137.html

しかし、この対応を行ってもエラーが出続けていました。
マイクロソフトのサイトが混んでいることが原因で出ることもあると書いてあったのを見た気がしたので、しばらく様子を見ていたのですが全然復旧しませんでした。

というわけで本格的に原因を調べてみました。

どうやら
 [スタート]-[ファイル名を指定して実行] から %windir% を実行して開いたディレクトリにあるWindows Update.log
がWindows Updateのログになっているようなので、このファイルを見てみました。

私の場合は、
WSUS server
という記載があって、マイクロソフトのものでないサーバをさしている状態になっていました。
どうやらずいぶん昔にWindowsUpdateを別のサーバから取得するような設定にしていて、そのサーバが、ここ最近知らないうちに倒れていたようです。
そのため、WindowsUpdateの情報を取得しようとしたけどタイムアウトが起きて、エラーが出ていたようです。

というわけで、WindowsUpdateの取得先をデフォルトに戻すようにします。

レジストリを修正する必要があります。

変更内容は、以下のとおりです。
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate
の下の
WUServer
と
WUStatusServer
をそれぞれ空白に変更します。

そして
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU
の下の
UseWUSer‌​ver
を0に変更します。

そしてWindows Updateサービスを再起動します。

これで私の場合は、エラーが解消されました。



2014-08-05

mysqlで監査ログを設定する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
MySQLでもデータベースの操作ログを取ったほうがよいのかなぁと思ってしまう今日この頃です。

というわけで、どのようにすれば監査ログを残せるのかを調べました。

Enterprise Editionには、監査の機能があるようですが、今回はEnterprise Editionのことは対象外です。

他にMcAfeeがMySQL用の監査ツールを提供しているようなので、こちらの使い方になります。


以下はすべてrootユーザで行うものとします。

まずはインストールです。

https://bintray.com/mcafee/mysql-audit-plugin/release
から自分の環境にあったものをダウンロードします。
今回の環境は、64bitCentOS6上のMySQL5.6とします。

ファイルを取得して、zip解凍してプラグイン用のディレクトリにコピーをします。
wget http://dl.bintray.com/mcafee/mysql-audit-plugin/1.0.5/audit-plugin-mysql-5.6-1.0.5-479-linux-x86_64.zip
unzip audit-plugin-mysql-5.6-1.0.5-479-linux-x86_64.zip

cp audit-plugin-mysql-5.6/lib/libaudit_plugin.so /usr/lib64/mysql/plugin/


そして設定です。
/etc/my.cnf
の
[mysqld]セクションに以下を追加します。
------------------------------------------------
# McAfee Audit-Plugin
plugin-load=AUDIT=libaudit_plugin.so
audit_json_file = On
------------------------------------------------
他にも設定できる項目はあるのですが、とりあえず最低限動くようにするには上記でよさそうです。
他の項目に関しては、以下を参照してください。


設定が完了したらmysqlを再起動です。
service mysqld restart


プラグインが設定されているかの確認は、以下を実行してaudit系の設定が表示されればOKです。
mysql> SHOW VARIABLES LIKE 'audit_%';


これで監査ログが
/var/lib/mysql/mysql-audit.json
に出力されることになります。

出力されるログの内容に関しては以下が参考になります。


監査ログは、いっぱい出力されるのでファイルサイズが大きくなっていきます。
なので以下の設定をして必要なものだけに絞るのがよいかと思います。
audit_record_cmds:ロギング操作を限定する
audit_record_objs:ロギングしたいオブジェクトを限定する
audit_whitelist_users:ログキングしないユーザを限定する


それでも大きくなり続けるのは、なんとなくいやだったので、ログローテートを設定します。
以下のようにしてみました。
とりあえず毎日ローテートして30日分残すことにしてみました。

vi /etc/logrotate.d/mysql-audit-log-rotate
-----------------------------------
/var/lib/mysql/mysql-audit.json {
  daily
  rotate 30
  missingok
  compress
  delaycompress
  sharedscripts
  postrotate
    if test -x /usr/bin/mysqladmin && \
      /usr/bin/mysqladmin ping &>/dev/null
    then
      /usr/bin/mysql --defaults-extra-file=/root/.my.cnf -e "set global audit_json_file_flush=ON"
    fi
  endscript
}
-----------------------------------

上記で利用する.my.cnfも作成します。
vi /root/.my.cnf
-----------------------------------
[mysql]
password = xxxxxxxx
user = root
-----------------------------------
chmod 600 /root/.my.cnf


ログローテートの確認です。2回目のlsでログが増えていることを確認します。
ls -l /var/lib/mysql/mysql-audit.json*
logrotate -f /etc/logrotate.d/mysql-audit-log-rotate
ls -l /var/lib/mysql/mysql-audit.json*


監査ログはこんな感じで残せるようにできたけど、監査ログを確認して異常を検知する方法がよくわからないので、監査ログを活用する方法をちゃんと理解したいところです。


2014-07-09

dockerでcentosの日本語環境コンテナを作ってみる

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Dockerをいろいろいじっていたら、なんかiconvの変換がうまくいかないというエラーに出くわしました。

たしかに
locale -a
とすると

C
POSIX

となんか少ないです。

そして
iconv -l
としても

10646-1:1993, 10646-1:1993/UCS4, ANSI_X3.4-1968, ANSI_X3.4-1986, ANSI_X3.4,
  ASCII, CP367, CSASCII, CSUCS4, IBM367, ISO-10646, ISO-10646/UCS2,
  ISO-10646/UCS4, ISO-10646/UTF-8, ISO-10646/UTF8, ISO-IR-6, ISO-IR-193,
  ISO646-US, ISO_646.IRV:1991, OSF00010020, OSF00010100, OSF00010101,
  OSF00010102, OSF00010104, OSF00010105, OSF00010106, OSF05010001, UCS-2,
  UCS-2BE, UCS-2LE, UCS-4, UCS-4BE, UCS-4LE, UCS2, UCS4, UNICODEBIG,
  UNICODELITTLE, US-ASCII, US, UTF-8, UTF8, WCHAR_T

とこちらも少ないです。

でなんか初期状態のcentosのコンテナは日本語関連の設定がされていないような感じなので、日本語環境のコンテナを作ってみました。

Dockerfileは以下のような感じです。
この設定のどこまでが本当に必要で足りないものが本当にないのかがいまいちわかりませんが、locale -aの結果とiconv -lの結果が普通な感じはなりました。

2014-07-04

dockerでsshを利用する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
dockerのCentOSの初期イメージは、ものすごくシンプルな内容で最低限のものしか入っていないようです。

まずはsshを利用できるようにしてみました。
とりあえずパスワードでお手軽に入れるものを試してみました。

用意したDockerfileは以下のような感じです。


これを用意したら、まずはイメージを作成します。
docker build -t centos/sshd .

コンテナを起動します。
docker run -d -P --name test_sshd centos/sshd

ssh用に割り当てられたポートを確認します。
docker port test_sshd 22

上記で49153が割り当てられていたとしてsshで入ってみます。
ssh tomato@localhost -p 49153

無事に接続できました。

コンテナが不要になったら以下で停止します。
docker stop test_sshd



2014-07-02

DockerをCentOSにインストールしてみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
最近、Dockerという仮想環境構築ツールといえばよいのか、どうかの話題を良く見るのでCentOS(64bit版)にインストールしてみました。

CentOSのバージョンが6.5以上であることを確認しておきます。

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


でインストールはEPELを利用してインストールします。
sudo yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo yum -y install docker-io

設定変更をしておきます。
sudo vi /etc/sysconfig/docker
以下のように変更します。
-------------------
other_args="--exec-driver=lxc --selinux-enabled"
-------------------

dockerの起動は以下のような感じで起動時に自動起動するようにもしておきます。
sudo service docker start
sudo chkconfig docker on

root以外のユーザでdockerを動かしたい場合は、そのユーザをdockerグループに入れます。
以下ではユーザtomatoでdockerを動かすようにする例です。
sudo gpasswd -a tomato docker


とにかく動くことを試すら以下のような感じで。
docker run centos /bin/echo "Hello World"

シェルを利用してみるなら以下のような感じで。
docker run -i -t centos /bin/bash


以下が参考になりました。
http://momijiame.tumblr.com/post/70679588212/centos-6-5-docker


ちょっと、いじってみようと思っています。