@blog.justoneplanet.info

日々勉強

mod_dosdetectorを導入する

以下のコマンドでインストールする。

su
yum install httpd-devel -y
cd /usr/local/src
git clone https://github.com/stanaka/mod_dosdetector.git
cd mod_dosdetector
make
make install
exit
sudo vim /etc/httpd/conf/httpd.conf

以下のように設定する。ELB配下ではクライアントのIPはX-Forwarded-Forに格納されているので、DoSForwardedをonにする必要がある。

    <IfModule mod_dosdetector.c>
        DoSDetection     on
        DoSForwarded     on
        DoSPeriod        60
        DoSThreshold     5
        DoSHardThreshold 10
        DoSBanPeriod     60
        DoSTableSize     100
        DoSIgnoreContentType  image/*
    </IfModule>

以下のコマンドで再起動する。

sudo /etc/init.d/httpd restart
vim ~/site/webroot/.htaccess

mod_dosdetectorは環境変数がセットされるだけなので、htaccessで環境変数に応じたステータスを返すようにする。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond  %{ENV:SuspectDoS} .+
    RewriteRule .*  - [R=503,L]
    RewriteCond  %{ENV:SuspectHardDoS} .+
    RewriteRule .*  - [R=503,L]
</IfModule>

Android用にmozcをUbuntuでビルドする

Google日本語入力Android版がオープンソースになったという事で早速ビルドしてみる。

■準備

EC2でUbuntu 12.04を使用。

sudo apt-get update
sudo apt-get install g++ python subversion ibus make libibus-1.0-dev libzinnia-dev unzip ant qt4-dev-tools libqt4-core libqtgui4 git

■JDK

scp -i hogehoge.pem -r ~/Downloads/jdk-6u41-linux-x64.bin user@host:/home/user/jdk1.6.0_41
chmod 0700 jdk-6u41-linux-x64.bin
./jdk-6u41-linux-x64.bin
PATH=$PATH:$HOME/jdk1.6.0_41/bin
JAVA_HOME=$HOME/jdk1.6.0_41
export JAVA_HOME

■SDK

cd ~
wget http://dl.google.com/android/android-sdk_r21.1-linux.tgz
tar zxvf android-sdk_r21.1-linux.tgz
export PATH=/home/ubuntu/android-sdk-linux/tools:"$PATH"

cd ~/android-sdk-linux/platforms/
wget http://dl.google.com/android/repository/android-17_r01.zip
unzip android-17_r01.zip
mv android-4.2 android-17

wget http://dl.google.com/android/repository/android-2.2_r03-linux.zip
unzip android-2.2_r03-linux.zip
mv android-2.2_r03-linux android-8

■NDK

cd ~
wget http://dl.google.com/android/ndk/android-ndk-r8e-linux-x86_64.tar.bz2
tar -jvxf android-ndk-r8e-linux-x86_64.tar.bz2
export PATH=/home/ubuntu/android-ndk-r8e:"$PATH"

■mozc

cd ~/
svn co http://src.chromium.org/svn/trunk/tools/depot_tools
export PATH="$PATH":`pwd`/depot_tools

mkdir -p ~/src/mozc
cd ~/src/mozc
gclient config http://mozc.googlecode.com/svn/trunk/src
gclient sync

ちなみにリビジョンを指定するには以下のようにする。

gclient sync --revision r178

mac

macでgclient syncを実行すると以下のようなエラーが出て完了できない。

Server certificate verification failed: issuer is not trusted (https://zinnia.svn.sourceforge.net)

以下のコマンドで事前に取り込んでおく。

svn ls https://src.chromium.org
svn ls https://zinnia.svn.sourceforge.net
cd ~/src/mozc/src
./build_mozc.py gyp --target_platform=Android --android_sdk_home=/home/ubuntu/android-sdk-linux
./build_mozc.py build_tools -c Release
android update project -s -p android -t android-8
python build_mozc.py build android/android.gyp:apk -c Release_Android

x86

./build_mozc.py gyp --target_platform=Android --android_sdk_home=/home/ubuntu/android-sdk-linux --android_arch_abi=x86

ちなみにcleanは以下のコマンドで行う。

./build_mozc.py clean

リリースビルドしようとするとPlatform toolsが無いと言われて怒られる。

BUILD FAILED
/home/ubuntu/src/mozc/src/android/build.xml:86: The following error occurred while executing this line:
/home/ubuntu/android-sdk-linux/tools/ant/build.xml:401: SDK Platform Tools component is missing. Please install it with the SDK Manager (tools/android)

Ubuntuマシンがローカルに欲しくなる。この状態で既に共有ライブラリなどは生成されているのでローカルにダウンロードしeclipseでビルドできる。

参考

Apache SolrをPHPから使う

file_get_contentsとかでlocalhostを叩いても可能ではあるが、Apache Solrを使ってみることにする。

Apache Solr のバージョン 1.3 および 1.4 の両方と互換性があります。

上述のように記載されているが3.6でもとりあえずドキュメントの追加はできる。

■php-pecl-solrのインストール

面倒なのでremiを使う。

yum install --enablerepo=remi,epel php-pecl-solr

mac

peclでインストールする。

pecl install solr

windowsは知らん。

■ドキュメントの追加

以下のようにして、ドキュメントを追加する事ができる。

$client = new SolrClient(array(
    'hostname' => 'localhost',
    'port'     => 8983,
));
var_dump($client);

$doc = new SolrInputDocument();
$doc->addField('id',        '1');
$doc->addField('name',      '梅雨');
$doc->addField('value',     '蒸し暑い,湿気');
$doc->addField('is_public', true);

$updateResponse = $client->addDocument($doc);
$updateResponse = $client->commit();// commitしないとindexが更新されない
var_dump($updateResponse);

■ドキュメントの取り出し

以下のようにしてクエリを発行する事ができる。

$client = new SolrClient(array(
    'hostname' => 'localhost',
    'port'     => 8983,
));
$query = new SolrQuery('*:*');
$query->setStart(0);
$query->setRows(300);
$query_response = $client->query($query);
$response = $query_response->getResponse();
var_dump($response);
/*
object(SolrObject)#4 (2) {
  ["responseHeader"]=>
  object(SolrObject)#5 (3) {
    ["status"]=>
    int(0)
    ["QTime"]=>
    int(0)
    ["params"]=>
    object(SolrObject)#6 (4) {
      ["indent"]=>
      string(2) "on"
      ["wt"]=>
      string(3) "xml"
      ["q"]=>
      string(3) "*:*"
      ["version"]=>
      string(3) "2.2"
    }
  }
  ["response"]=>
  object(SolrObject)#7 (3) {
    ["numFound"]=>
    int(2)
    ["start"]=>
    int(0)
    ["docs"]=>
    array(2) {
      [0]=>
      object(SolrObject)#8 (8) {
        ["created"]=>int(123456789)
        ["face"]=>string(5) "梅雨"
        ["id"]=>string(1) "1"
        ["is_public"]=>bool(true)
        ["tag"]=>string(15) "蒸し暑い,湿気"
      }
      [1]=>
      object(SolrObject)#9 (8) {
        ["created"]=>int(123456789)
        ["face"]=>string(12) "秋雨"
        ["id"]=>string(1) "2"
        ["is_public"]=>bool(true)
        ["tag"]=>string(15) "蒸し暑い,湿気"
      }
    }
  }
}
*/

wt=phpとクエリを投げるとphpの配列で返ってくるのだが以下のメソッドがどうも上手く機能しない。

$client->setResponseWriter("phpnative");
//SolrResponse::getResponse(): Error unserializing raw response.
//Uncaught exception 'SolrException' with message 'Error un-serializing response'

参考

Apache Solrを使ってみる

■インストール

macにインストールする

Javaは既に入ってると思うので、以下のコマンドでダウンロードする。

wget http://ftp.tsukuba.wide.ad.jp/software/apache/lucene/solr/3.6.0/apache-solr-3.6.0.zip
unzip apache-solr-3.6.0.zip
cd apache-solr-3.6.0

CentOSにインストールする

Javaが必要なので以下のコマンドでJavaをインストールする。

yum install java-1.6.0-openjdk
java -version

以下のコマンドでダウンロードする。

wget http://ftp.tsukuba.wide.ad.jp/software/apache/lucene/solr/3.6.0/apache-solr-3.6.0.tgz
tar xvzf apache-solr-3.6.0.tgz
cd apache-solr-3.6.0

■設定

example/conf/schema.xml

<schema>
 <!--typesは大体元のxmlファイルを使う-->
 <fields>
   <field name="id"        type="string"       indexed="true" stored="true"  required="true" /> 
   <field name="name"      type="text_ja"      indexed="true" stored="true"  required="true" />
   <field name="value"     type="text_ja"      indexed="true" stored="true"  required="true" />
   <field name="text"      type="text_ja"      indexed="true" stored="false" multiValued="true"/>
   <field name="is_public" type="boolean"      indexed="true" stored="true"  required="true" />
 </fields>
 <uniqueKey>id</uniqueKey>
 <copyField source="name"  dest="text"/>
 <copyField source="value" dest="text"/>
</schema>

ポート変更

デフォルトは8983で動作するが変更したい場合は以下のコマンドを実行する。

vim etc/jetty.xml

以下の部分を

<Set name="port"><SystemProperty name="jetty.port" default="8983"/></Set>

以下のように変更する。

<Set name="port"><SystemProperty name="jetty.port" default="8080"/></Set>

■データの準備

example/exampledocs/mydata.xml

同じディレクリに入ってるデータを参考に以下のようにしてみる。

<add>
<doc>
  <field name="id">1</field>
  <field name="name">春</field>
  <field name="value">花粉症,花</field>
  <field name="is_public">true</field>
</doc>
<doc>
  <field name="id">2</field>
  <field name="name">夏</field>
  <field name="value">暑い,海</field>
  <field name="is_public">true</field>
</doc>
<doc>
  <field name="id">3</field>
  <field name="name">秋</field>
  <field name="value">紅葉</field>
  <field name="is_public">true</field>
</doc>
<doc>
  <field name="id">4</field>
  <field name="name">冬</field>
  <field name="value">寒い,雪</field>
  <field name="is_public">true</field>
</doc>
</add>

あまり良いサンプルデータとはいえない。

■起動

cd example
java -jar start.jar

■データの登録

以下のコマンドでデータを登録する。

java -jar example/exampledocs/post.jar example/exampledocs/mydata.xml

■遊ぶ

http://localhost:8983/solr/admin/にアクセスする。

■データの削除

solrを止めてから以下のコマンドを実行する。

rm -fr example/solr/data/index

順序を間違えると面倒な事になる。

参考

■nginxをたてる

リモートにsolrを立てる場合は何らかの認証をしたいのでnginxを使ってBasic認証してみる。

wget http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
rpm -ivh epel-release-5-4.noarch.rpm
yum install nginx
/sbin/chkconfig nginx on
/sbin/chkconfig --list nginx

nginxの設定

vim /etc/nginx/nginx.conf

以下のように記述する

location / {
    proxy_pass http://127.0.0.1:8389;
    auth_basic "Type your ID and password";
    auth_basic_user_file htpasswd;
}
yum install httpd
htpasswd -c /etc/nginx/htpasswd hoge
/etc/init.d/nginx restart

参考

■起動

再起動時にsolrが起動するようにする。

vim ~/start.sh
#!/bin/bash

cd /home/hoge/apache-solr-3.6.0/example
nohup java -jar /home/hoge/apache-solr-3.6.0/example/start.jar > /home/hoge/log/solr.log &
chmod 0777 start.sh

スクリプトが起動時に実行されるようにする。

sudo crontab -e
@reboot /home/ec2-user/start.sh

参考

Elastic IPを別のホストに関連付ける

Elastic IPを別のホストに関連付けた後でmacのターミナルからsshでアクセスしようとすると以下のようなエラーが出る。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
00:88:66:99:77:aa:bb:cc:dd:ee:ff:11:22:33:44:55.
Please contact your system administrator.
Add correct host key in /Users/name/.ssh/known_hosts to get rid of this message.
Offending key in /Users/name/.ssh/known_hosts:7
RSA host key for 123.123.123.123 has changed and you have requested strict checking.
Host key verification failed.

以前に同じ証明書で接続したホストとフィンガープリントが変わっていると警告してくれている。以下のようにして対処する。

ssh-keygen -R 123.123.123.123

CentOSにHaskellを入れる

めも。

■ghc

wget http://www.haskell.org/ghc/dist/7.2.2/ghc-7.2.2-x86_64-unknown-linux.tar.bz2
tar xvfj ghc-7.2.2-x86_64-unknown-linux.tar.bz2
cd ghc-7.2.2
./configure --prefix=/usr/local/haskell/ghc/7.2.2
make install
export PATH=/usr/local/haskell/ghc/7.2.2/bin:$PATH

コーディング

vim hello.hs
main = putStrLn "Hello World"

実行

以下のコマンドでコンパイルと実行が同時にできる。

ghc -e main hello.hs 

もしくは以下のコマンドを実行する。

ghc --make hello.hs
./hello

インタプリタ

以下のコマンドで起動する。

ghci

以下のようにしてインストールできる。

Prelude> putStrLn "Hello World"
Hello World

以下のようにしてインタプリタを終了できる。

<ctrl>+D

エラー

<command line>: can't load .so/.DLL for: libgmp.so (libgmp.so: cannot open shared object file: No such file or directory)

以下のコマンドで解決できる。

cd /usr/lib64
ln -s libgmp.so.3 libgmp.so

参考

■hugs

インタプリタ。ghciもあるので必要がないと思われる。

wget http://cvs.haskell.org/Hugs/downloads/2006-09/hugs98-Sep2006.tar.gz
tar xvzf hugs98-Sep2006.tar.gz
cd hugs98-Sep2006
./configure
make
make install

開始

hugs

終了

<ctrl>+D

Hello World

Hugs> putStrLn "Hello World"
Hello World

CentOSにjenkinsをインストールする

以下のコマンドでインストールできる。

yum install java-1.6.0-openjdk
wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
yum install jenkins

デフォルトのJENKINS_HOMEは以下のようになる。

/var/lib/jenkins

■ポート変更

以下のコマンドで設定ファイルを編集する。

vim /etc/sysconfig/jenkins

デフォルトでは8080番を使用しているので以下のように変更する。

JENKINS_PORT="1234"

■起動

/sbin/service jenkins start

以下のアドレスでアクセスできる。

http://localhost:8080/

■セキュリティ

以下のURLにアクセスする。

http://localhost:8080/configure

デフォルトではすべてのユーザが閲覧可能でありジョブを追加することができるので、「セキュリティを有効化」の項目にチェックを入れる。

特定のユーザのみが操作可能にする

Jenkinsのユーザーデータベース

Jenkinsのユーザーデータベースを選択し、ユーザーにサインアップを許可を外して一度保存する。

権限管理

行列による権限設定を選択し、上述で追加したユーザ名に対して全権限を与える。また、匿名ユーザには必要な権限だけ付加する。

Unixユーザを使用した管理の方が便利かもしれない。

■E-mail通知

以下のURLにアクセスする。

http://localhost:8080/configure

SMTP認証にチェックを入れ以下のように入力する。

SMTPサーバー
mail.example.com
E-mailのサフィックス
@example.com
送信元メールアドレス
john@sample.com
ユーザ名
mike
パスワード
mike’s_pasword
SMTPポート
587

メールを送信して設定を確認にチェックを入れて実際にメールが送信できるか確認する。

■JDKのインストール

以下のURLにアクセスする。

http://localhost:8080/configure

JDKの項目があるので入力して保存する。oracleアカウントが面倒。

■Git連携

以下の画面にアクセスする。

http://localhost:8080/pluginManager/available

Git Pluginを選択し「ダウンロード後に再起動しインストール」を選択する。

gitの設定

http://localhost:8080/job/SampleProject/configure

android

以下にアクセスしてAndroid Emulator Pluginをインストールする。

http://localhost:8080/pluginManager/available

gitで過去のcommitに対してbranchをきる

まず、コミットのハッシュ値を調べる

gitx

gitxを入れていない場合は以下のコマンドで調べる。

git log --all --graph

以下のコマンドで一度チェックアウトしたあとブランチを切った後、元のブランチをチェックアウトする。

git checkout 1234567
git branch -a
git checkout -b forgetbranch
git checkout master

addしてないファイルとかあると少し面倒になる。