岩手からこんにちは ☆彡 perl とかウェブ系なブログ

はてなダイアリーからひっこしましたよ http://d.hatena.ne.jp/rosiro

nginxでmod_pagespeed

apacheにはmod_pagespeedがありますが、nginxにはないのー?って事でぐぐったらngx_pagespeedがあるようです。
https://github.com/pagespeed/ngx_pagespeed
とはいえまだまだ絶賛開発中のようです。apacheモジュールのmod_pagespeedとほぼ同じ機能が利用できるようにがんばってるっぽいです。
css,javascript,画像の最適化、htmlの書換、キャッシュなどなど・・

とりあえず試してみた。

ngx_pagespeedはapacheのmod_pagespeedを使うようなのではじめにmod_pagespeedをコンパイルする必要があります。
build mod_pagespeed from source https://developers.google.com/speed/docs/mod_pagespeed/build_from_source

httpd gcc-c++ python subversion gperf make rpm-build git python2.6 chromium depot toolsが必要

sudo yum install httpd gcc-c++ python subversion gperf make rpm-build git
wget http://www.python.org/ftp/python/2.6/Python-2.6.tgz
tar xzf Python-2.6.tgz
cd Python-2.6
./configure --prefix=/usr/local
make -j >make.log
sudo make install

こんかいはここまで

さくらのクラウドで追加IPアドレスを行う

さくらクラウドはVPSに比べてかなり高めですがその分自由な設定ができます。
でディスクの追加とかも魅力的ではあるんですが、IPアドレスを追加できる事もとてもいいですね。
追加IPアドレスをできていいことは・・・ まあいろいろあるんですけど・・・ 

eth0(デフォルト) /etc/sysconfig/network-scripts/ifcfg-eth0
eth1(追加ネットワーク) /etc/sysconfig/network-scripts/ifcfg-eth1
基本はeth0をコピーする感じで。 IPアドレスなんかはコントロールパネル上に表示されているかと思います。
ただしGATEWAYは追加した方には記載しない。network restartでデフォルトゲートウェイがeth1に記載したゲートウェイに変更されてしまい、eth0からの通信がeth1から帰る?ためeth0との通信ができなくなります。

ルーティングテーブルに名前を付ける

/etc/iproute2/rt_tables

201     ethA
202     ethB

ルーティングを行う

ip route add ネットワークアドレス dev eth1 src IPアドレス table ethB
ip route add default via ゲートウェイ table ethB
ip rule add from IPアドレス table ethB
ip route add default via ゲートウェイ metric 10

こんな感じ?でいける

OS X Mountain Lion image::imlib2 install

http://docs.enlightenment.org/api/imlib2/html/
download and configure, make, make install

libtiff

libtiff http://www.remotesensing.org/libtiff/

./configure; make; make install

makeすると
"-save-temps and -M options are not allowed with multiple -arch flags"
なエラーがでる。

./configure後
make CXXFLAGS=-m64 CFLAGS=-m64 LDFLAGS=-m64 -j12
でmakeできた

giflib

giflib http://giflib.sourceforge.net/
libtiffと同様

X11

X11 http://xquartz.macosforge.org/landing/

configureに--enable-amd64=noをつける


とかがんばってみたものの
brew install libtiff
brew install giflib
brew install imlib2
の方が楽でいいよ・・・・とおもったもののcpanm image::imlib2できない・・ たぶんライブラリのパスとかそのへんだとおもうんだけどわけわかめ

imlib2をソースからいれる

./configure --enable-amd64=no
make CXXFLAGS=-m64 CFLAGS=-m64 LDFLAGS=-m64 -j12
make install

cpanm Image::Imlib2
でインストールできる。

~/セーフセーブ?ファイルパーミッションが戻される

desktopにgit cloneして、そこをwindowsからもみれるようにファイル共有したんだけど、ファイルいじろうとしたら書き込みパーミッションが強制的に削除され、書き込みできなくなる。 上書きできねーなー変だなーと そういう仕様なようです。 なのでいじるときはsshしたほうがよさそうです。

perlbrew

perlbrew install perl-5.** な時にエラーになる。テストの一部が通らないようだ。 forceとかnotestでクリア

ライブラリの位置関係でのmakeがとおらんとかがおおい

なれないとしんどい homebrewとかほんとにいいのかよくわからない

synergy

synergy 1.4 がでてた。 windows server , macbook clientな感じでキーボード入力できなかったので mac側はSynergyKMってのを使う。

しゃっこい!(冷たい)

冬はmacbookつらい。。 ドラゴンタトゥーの女あんな寒い国でmacbookはつらくないのだろうか

Starman自動起動とServer::Starter

前の記事に投稿しためろりんPerlのウェブサーバStarmanでAmon2ウェブアプリケーションを配信しています。 proxyはnginxです。

で、今日めろりんを見たら、動いていないんです・・
原因はさくらVPSが再起動していたから・・
というか悪いのは自動起動する設定書いてないから

というわけで自動起動スクリプト書いてみたのでメモ

起動スクリプトは /etc/inid.d/ に書きます。
今回は
/etc/init.d/merolin.com_server_starter にしてみた。

#!/bin/bash
#
# Init file
#
# chkconfig: 2345 55 25
# description: merolin.com start_server
#
# processname: merolin.com
start(){
  echo "starting merolin.com..."
  /home/merolin.com/development/merolin/script/start.sh
  return 0
}

stop(){
  echo "stopping merolin.com..."
  ps -ef |grep 'start_server'|grep '/usr/bin/perl' | awk '{print "kill ",$2}'|sh
  return 0
}

restart(){
  echo "restarting merolin.com..."
  ps -ef |grep 'start_server'|grep '/usr/bin/perl' | awk '{print "kill ",$2}'|sh
  /home/merolin.com/development/merolin/script/start.sh
  return 0
}
case $1 in
  start)
    start
  ;;
  stop)
    stop
  ;;
  restart)
    restart
  ;;
esac

面倒だったのはkillでプロセス指定する部分。
通常server::starterが起動すると

/usr/bin/perl /usr/local/bin/start_server -- starman --workers 3 --max-req....

みたいになりました。
grepしたりめんどうです。 ていうか普通は違う簡単な方法あるのかも

以上起動メモ

Algorithm::NaiveBayesで2ch系まとめサイトをカテゴライズしてみた

2ch系まとめサイトのアンテナ?的な新着サイトは結構あるんですが、勉強もかねてAlgorithm::NaiveBayesでベイズ使ってカテゴライズしてみたメモ。

Algorithm::NaiveBayes
http://search.cpan.org/~kwilliams/Algorithm-NaiveBayes-0.04/lib/Algorithm/NaiveBayes.pm

目標 はてぶみたいに自動でカテゴリ分けしたい

参考に・・

新はてなブックマークでも使われてるComplement Naive Bayesを解説するよhttp://d.hatena.ne.jp/tkng/20081217/1229475900

上のサイトをみるとはてなではComplement Naive Bayesがつかわれてるっぽいです。

ここではAlgorithm::NaiveBayes 単純ベイズを使いました。
カテゴリ予測までの流れ

  1. カテゴリに属すると思われるページを選定
  2. 選ばれたページから特徴語を抽出 Lingua::JA::OkapiBM25を使いました。
  3. Algorithm::NaiveBayesにadd_instanceでカテゴリに属性データを追加
  4. Algorithm::NaiveBayesに学習させる
  5. ページがどのカテゴリーに属するかを予測する predict

カテゴリーを用意

今回は

政治・経済、スポーツ、科学・学問、グルメ・レシピ、映画・音楽、コンピュータ・IT、ゲーム、アニメ・漫画、アイドル・芸能人、アダルト

を用意しました。

そしてカテゴリーに属するサイトデータははてなブックマークのランキングや人気データを利用しました。

たとえば政治・経済の場合は http://b.hatena.ne.jp/ranking/monthly/201208/economics にのってるページを集めるといった感じで、各カテゴリにふさわしいと思われるサイトデータを集めます。

あとめたサイトの特徴語を抽出します。
抽出にはLingua::JA::OkapiBM25を利用しました。

my $page_text = ページタイトル . ページ概要などなど;
my $okapi =  Lingua::JA::OkapiBM25->new;
my @list  = $okapi->bm25(encode("utf8",$page_text))->list(50);

上記でLingua::JA::OkapiBM25が50個の特徴語を抽出してくれます。
Lingua::JA::OkapiBM25については
http://d.hatena.ne.jp/download_takeshi/20091206/1260130230
が詳しいです。(というか作者さん)

抽出したデータをAlgorithm::NaiveBayesにadd_instanceする

my $bayes;
my $bayes_file = 'algorithm_naivebayes.dat';
if( -f $bayes_file){
    $bayes = Algorithm::NaiveBayes->restore_state($bayes_file);
}
else{
    $bayes = Algorithm::NaiveBayes->new( purge => 0 );
}

for $さいと ( @さいと){
  my %pagedata{
    encode("utf8",$keyword->keyword)} => encode("utf8",$page_keyword->score);
  };
  $bayes->add_instance(
    attributes => {%pagedata},
    label => encode("utf8",'カテゴリ名'),
  );
}

bayes->train;
my $save = $bayes->save_state($bayse_file);

各カテゴリには約1500サイト程度にしています。 カテゴリに属するサイトの数はおなじぐらいになるようにしています。


最後にページがどのカテゴリに属するか予測してみます。

my $bayes_file = 'algorithm_naivebayes.dat';
if( -f $bayes_file){
    $bayes = Algorithm::NaiveBayes->restore_state($bayes_file);
}
else{
    $bayes = Algorithm::NaiveBayes->new( purge => 0 );
}

my %pagedata{
    'hogehoge' => 1.555,
    'mogemoge' => 1.444',
};
my $result = $bayes->predict( attributes => {%pagedata} );

以上でそのページがどのカテゴリに属するのかの予測ができました。

まとめサイトのデータは、最近2chで、まとめサイトを登録しろ的な事になったようですので、
ニコニコ大百科 http://dic.nicovideo.jp/a/2ch%E9%96%A2%E9%80%A3%E3%81%BE%E3%81%A8%E3%82%81%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AE%E4%B8%80%E8%A6%A7
からサイトを調べています。
それぞれのサイトからrssフィードURLを探し出して、LWP::UserAgentで記事を抽出しています。

そんなこんなして、とりあえずつくってみたのがこちらになります。


めろりん http://merolin.com


カテゴライズはあってる部分と、それ違うだろ的な感じになっています。
まあなんとなくだけど、それっぽい感じにはなりました。
このままだといけてないので、カテゴリを修正する、ページつくって、手動で修正していく必要があるのかなとおもってます。 いまのところここまで

本当はBM25で抽出した単語の関連語なんかも出した方がいいのだろうとおもいます。
その辺のチューニング的な事もしないとだめだとおもいます。
あとComplement Naive Bayesでやれれば、やってみたいなと思います。

以上メモ。

とりあえず機械学習はたのしい!