CasperJS で JQuery を使う
CasperJS は PhantomJS の機能を使って現在扱っているページに対して JS を差し込める。
var casper = require('casper').create({clientScripts: ['jquery-1.9.1.min.js']});
clientScripts にローカルの JQuery へのパスを指定する。phantom.incectJs() を使っているのでリモートのファイルは指定できない。
で、実際に使うには
var url ='http://www.akb48.co.jp/'; var casper = require('casper').create({clientScripts: ['jquery-1.9.1.min.js']}); casper.start(url, function() { this.echo($(title).text()); }); casper.run();
…では動かない。
ReferenceError: Can't find variable: $
とエラーが出る。evaluate() を使う必要がある。
var url ='http://www.akb48.co.jp/'; var casper = require('casper').create({clientScripts: ['jquery-1.9.1.min.js']}); casper.start(url, function() { var title = casper.evaluate(function(){ return $('title'); }); this.echo(title.text()); }); casper.run();
…では動かない。
evaluate() は返り値に primitive object = JSON に変換可能なオブジェクトしか返せないので
var url ='http://www.akb48.co.jp/'; var casper = require('casper').create({clientScripts: ['jquery-1.9.1.min.js']}); casper.start(url, function() { var title = casper.evaluate(function(){ return $('title').text(); }); this.echo(title); }); casper.run();
とする必要がある。
これで
AKB48公式サイト
ちゃんと JQuery を使うことができる。
めんどい。非常にめんどい。
CasperJS を Mac OS X にインストールする
CasperJS とは
CasperJS: CasperJS is a navigation scripting & testing utility for PhantomJS and SlimerJS written in Javascript
JavaScript で書けるスクレイピングとテストを便利にしてくれるツール。PhantomJS/SlimerJS を使っているので Mechanize とかと違い、JavaScript で表示制御しているようなページも扱える。
インストール
brew install casperjs
以上!というわけにはいかない。一緒にインストールされる Mac の PhantomJS のバイナリが腐っているので、このままでは UTF8 以外の日本語が文字化けしてしまって扱えない。PhantomJS をソースからリビルドする必要がある。
まずは phantomjs をアンインストール(しなくてもいいけど)。
brew uninstall phantomjs
phantomjs をリビルド
cd $HOME/local git clone git://github.com/ariya/phantomjs.git cd phantomjs git checkout 1.9 ./build.sh
最初に警告が出るとおり死ぬほど時間がかかるので昨日の公演をダウンロードして見ながら待つ。
終わったら phantomjs/bin にパスを通して動けば完了。
ln -s $HOME/local/bin/phantomjs $HOME/local/phantom/bin/phantomjs casperjs
UserAgent での iPhone / iPad / Android phone / Android Tablet の見分け方
if ($ua =~ /Android/) { if ($ua =~ /Mobile/) { $type = 'Android phone'; } else { $type = 'Android tablet'; } } elsif ($ua =~ /iPhone/) { $type = 'iPhone'; } elsif ($ua =~ /iPad/) { $type = 'iPad'; }
http://googlewebmastercentral-ja.blogspot.com/2011/05/android.html
Kyoto Tycoon memcached plugin VS memcached のベンチを取ってみた
#!/usr/bin/env perl use strict; use warnings; use Benchmark qw(:all); use Cache::Memcached::Fast; my $mf = Cache::Memcached::Fast->new( { servers => ['127.0.0.1:2010'] } ); my $mfm = Cache::Memcached::Fast->new( { servers => ['127.0.0.1:11211'] } ); my @keys = map { 'x' . rand } 0 .. 10000; my $n = 100; cmpthese( $n => +{ 'KT(memcached) set' => sub { $mf->set( $_ => rand ) for @keys; }, 'Memcached (memcached) set' => sub { $mfm->set( $_ => rand ) for @keys; }, } ); cmpthese( $n => +{ 'KT(memcached) get' => sub { $mf->get($_) for @keys; }, 'Memcached (memcached) get' => sub { $mfm->get($_) for @keys; }, } );
Rate KT(memcached) set Memcached (memcached) set KT(memcached) set 2.82/s -- -15% Memcached (memcached) set 3.34/s 18% -- Rate KT(memcached) get Memcached (memcached) get KT(memcached) get 3.35/s -- -12% Memcached (memcached) get 3.79/s 13% --
KTのHTTPとMemcachedプロトコルのベンチを取ってみた
環境は以下の通り
- mac mini 2.66GHz 4GB RAM
- kyotocabinet 1.2.30
- kyototycoon 0.9.18
KTをMemcachd pluginサポート起動
ktserver -plsv /usr/local/lib/ktplugservmemc.dylib -plex 'port=2010'
ベンチを取ったコードはこんな感じ
とりあえずsetのベンチ
#!/usr/bin/env perl use strict; use warnings; use Benchmark qw(:all); use Cache::KyotoTycoon; use Cache::Memcached::Fast; my $kt = Cache::KyotoTycoon->new( host => '127.0.0.1', port => 1978 ); my $mf = Cache::Memcached::Fast->new( { servers => ['127.0.0.1:2010'] } ); my @keys = map { 'x' . rand } 0 .. 1000; my $n = 10; cmpthese( $n => +{ 'Cache::Memcached::Fast' => sub { $mf->set( $_ => rand ) for @keys; }, 'Cache::KyotoTycoon' => sub { $kt->set( $_ => rand ) for @keys; }, } );
結果
Cache::KyotoTycoon 5.52/s -- -82% Cache::Memcached::Fast 31.2/s 466% --
HTTPのオーバーヘッドが大きいので当たり前と言えば当たり前ですね。
getやバイナリプロトコルや他のストレージとの比較とかしてみたい。
お手軽gitリモートリポジトリの作り方メモ
リモートリポジトリの作成
@example.com
cd ~ mkdir git mkdir git/FooBar.git cd git/FooBar.git git --bare init --shared=true
ローカルリポジトリからpush
mkdir FooBar cd FooBar git init touch README git add README git commit -a -m "initial import" git remote add origin hidek@example.com:git/FooBar.git git push origin master
ローカルにclone
git clone hidek@example.com:git/FooBar.git
Ubuntu 10.10 に XML::LibXMLをインストールする
一身上の都合でMacが使えなくなったのでUbuntuが入ったラップトップを引っ張り出してきたついでに、10.10をインストールして XML::LibXMLをインストールしようとしたらlibxml2が見つからないと怒られた。
hide@localhost:~$ perl Makefile.PL enable native perl UTF8 running xml2-config...untested Note: libxml2 2.7.7 was not tested with this XML::LibXML version. looking for -lxml2... no looking for -llibxml2... no libxml2 not found Try setting LIBS and INC values on the command line Or get libxml2 from http://xmlsoft.org/ If you install via RPMs, make sure you also install the -devel RPMs, as this is where the headers (.h files) are. Also, you may try to run perl Makefile.PL with the DEBUG=1 parameter to see the exact reason why the detection of libxml2 installation failed or why Makefile.PL was not able to compile a test program.
apt-get install libxml2-devしたけど見つからず。
http://www.simplicidade.org/notes/archives/2007/04/tip_xmllibxml_a.html
をみて
apt-get install zlib1g zlib1g-dev
したら通った。