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

したら通った。