2011年6月28日火曜日

オートページャ



クリックしたら、次へボタンのURLパラメータ更新



// autopager
$('a[rel=next]').click(function() {
var url_param;

$.autopager({
autoLoad: false,
content : '.content'
});
$.autopager('load');

// page数++
url_param = $(this).attr('href').replace(/([&\?])page=(\d+)/, function (match_whole,separator,page_num) {
return separator + 'page=' + ( Number(page_num) + 1 );
});
$(this).attr('href', url_param);

return false;
});





2011年6月27日月曜日

nginx設定 locationブロックの構文



ブロック




    • プロトコルレベル(httpブロック)

    • サーバレベル(serverブロック)

    • URIレベル(locationブロック)




http {
....
server {
.....
location {
.....
}
}
}



locationは入れ子可能だが、 = でマッチさせた場合は無理。^~も?


locationブロックの優先順位 基本


構文

location [=|~|~*|~~|@] pattern { ... }


優先順位

設定ファイルに書く順番関係なく、修飾子よって優先順位が違う。



  1. =(等価。^~と同じで、以降のlocationとマッチしない。)

  2. 修飾子なしでpatternがURIに完全マッチ

  3. ^~(5番の修飾子なし先頭部分マッチと同じだが、最初にマッチしたパスで検索終了)

  4. ~ or ~* (正規表現を使用。大文字小文字の区別ありとなし)

  5. 修飾子なしで、patternがURIに先頭部分マッチ



locationブロックの優先順位 応用


修飾子なしで、同じパターン

エラーになる。



location /hoge/ {}
location /hoge/ {}




同じ正規表現

先に書いたほうが優先



location ~ /hoge/ {} #優先
location ~ /hoge/ {}




修飾子なしで、前方一致

より長く一致したほうが優先



location /ho {}
location /hog {} #優先




異なる修飾子で前方一致

修飾子関係なく、長く一致したほうが優先



location ^~ /ho {} #修飾子としてはこちらが強いが、
location /hog {} #こちらが優先される






pacoインストール



ソースからインストールすると、アンインストールするのが面倒なので、pacoで管理。
(make uninstall できるのは一部だけ)



wget http://sourceforge.net/projects/paco/files/paco/2.0.9/paco-2.0.9.tar.bz2
tar jxf paco-2.0.9.tar.bz2
./configure --disable-gpaco # CUI
make
sudo make install
sudo make logme # paco自身を管理対象に。




あとは、通常 make install するところを



sudo paco -D make install
paco -a # 登録一覧確認
paco -r 名前 #アンインストール。



ちなみに、ファイルの生成などを伴うものをすべて管理できるので、cpanのようなものでインストールする際にも
利用できるようだ。





ubuntu10.04のemacsでWrong number of arguments: called-interactively-p, 1



http://d.hatena.ne.jp/kojimu/20110421/1303334897



sudo add-apt-repository ppa:ubuntu-elisp/ppa
sudo apt-get update
sudo apt-get upgrade





ファイルタイプを判定



スクレイピングしたものの、画像のリンク先が切れていて、ファイル名は画像として取得したのに、
中身は404のHTMLだったとき。(200番が返ってきていた)

File::MMagicで、imageになるかどうかで判定。




2011年6月26日日曜日

nginxインストール



インストール



./configure --user=www-data --group=www-data --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-perl=/usr/bin/perl --prefix=/usr/local/nginx-*.*.*
make
sudo paco -D make install
sudo ln -s /usr/local/nginx-1.0.4 /usr/local/nginx


--userと--groupは設定がないときのみ使用されるデフォルト。
このときのconfigureのオプションは./nginx -V で確認できる。


設定



sudo /usr/local/nginx/conf/nginx.conf
user nobody; # user ユーザネーム グループ に変更。


sudo /usr/local/nginx/sbin/nginx -t
で設定ファイルのチェック。
(本番稼働中に設定ファイルを変更する場合は、-cオプションで別ファイルに設定を作ってからそれをテストする。)


ps aux | grep nginx
でワーカプロセスのユーザネームを確認。問題なければ、アクセスするとWelcome to nginx!が表示されている。


initスクリプト


/etc/init.d/nginxを編集。



DAEMON=/usr/local/nginx/sbin/$NAME
SCRIPTNAME=/etc/init.d/$NAME



元の雛形にstart-stop-daemonがあったが、使用せずに以下を記述



d_start() {
$DAEMON || echo -n " already running"
}

d_stop() {
$DAEMON -s quit || echo -n " not running"
}
d_reload() {
$DAEMON -s reload || echo -n " not reload"
}


を追加して、case "$1" in の start) stop) restart) などで呼び出す。


$update-rc.d -f nginx defaults
でランレベル遷移の際にスクリプト実行されるようにするが、すでに登録されている。





2011年6月12日日曜日

Crypt::SSLeayをインストール



cpanmでコケタ。
以下の2つと、なければOpenSSLをインストール。
sudo apt-get install libssl-dev
sudo apt-get install libcrypt-ssleay-perl


無事Net::Twitterが入った。





2011年6月11日土曜日

2段ssh tオプション



2段ssh
ssh hostname [command]で、対話シェルに入らずにコマンド結果が返ってくる。

これを応用して、2段ssh。
ssh -t hostname1 hostname2

対話シェルが禁止されてるので、tオプションで擬似tty。





さくらVPSにUbuntu



インストール


さくらVPSのカスタムOSインストールの手順に従って特に問題なくインストール。
ただ、インストール中に放置してたらネットワーク接続切れて失敗したので、席を離れないようにした。


適当にインストール


インストール後、ユーザアカウントでログイン。
(ubuntuはデフォルトではrootのパスが設定されていないので、rootログインはできない。sudoでパスを設定すれば可能。)
update upgreade
screenとemacsとcurl、zsh、build-essential入れる。


sshのport変更


sshのポートを変更した後、以下も変更。
/etc/serviceに登録されているsshのポート番号を変更



$ sudo vi /etc/services
ssh 12345/tcp
ssh 12345/udp


以下のコマンドで何も表示されないのを確認してrestart



$ sudo sshd -t
$ sudo service ssh restart



公開鍵送信


scpで公開鍵を送信。portは-Pで指定。


ファイアーウォール設定


Ubuntuにデフォルトで入っているファイヤーウォールの「ufw」
さくらVPSにカスタムOSのUbuntu 10.04をインストール+セキュリティ設定などをした時のメモ



sudo ufw default deny  #最初に全部禁止
sudo ufw allow port番号
sudo ufw enable
sudo ufw status


ufwは外部からの通信遮断のみ。トロイに感染して、内部からの発信はとめてくれない。




2011年6月8日水曜日

セットアップスクリプトメモ



最近のセットアップスクリプトの書き方

Data::Section::Simpleで__DATA__以下に、ファイルパスと内容(テンプレート)を書いておいて、



mkpath $dir or die "$dir: $!" unless -d $dir;
write_file($path, $content) or die "$path: $!";


とすると。
__DATA__以下で、@@[スペース]を使用してるのは、Data::Section::Simpleの仕様でした。

テンプレートエンジンのヘルパーとか、こうやって書けば楽そう。
bashとかで小難しいことはしたくないので、大体perlで書いてしまいたいですねー。

p.s.
Data::Section::Simpleみてると、scalar callerってやってパッケージ名取得してた。ほむほむ。
あと、fileno。。。。勉強しよう。





2011年6月7日火曜日

s///gとtr///のベンチマーク





use Benchmark qw(:all);

$num = 100000000;
$word = $word2 = '1'x$num;

$results = timethese(1, {
'tr' => sub { $word =~ tr/1/2/ ;},
's' => sub { $word2 =~ s/1/2/g;},
},
'none'
);

cmpthese( $results );


trの圧勝でした。



s/iter s tr
s 19.0 -- -99%
tr 0.120 15767% --



と思ったら、tr///dじゃないからダメだ。
あとで計測しなおす。





特殊変数$^W



警告スイッチに対応して真偽値が入ってるので、
my $hoge = delete $cnf{hoge};
のように引数をdeleteで削り取っているのに、他に余計な引数がある場合かつ、
警告がONのときに、以下が真になります。



if (%cnf && $^W) {
Carp::carp("Unrecognized LWP::UserAgent options: @{[sort keys %cnf]}");
}





引数の明示という観点から残念なコードのリファクタ



残念なコード②を我流で書き直してみた。



sub new {
my $class = shift;
my %par = @_;

my $self;
$self->{ua} = LWP::UserAgent->new(
agent => $par{agent} || 'Mozilla/4.0'
) or return;
$self->{ua}->env_proxy if $par{env_proxy};
$self->{ua}->proxy('http', $par{proxy}) if $par{proxy};
$self->{ua}->timeout($par{timeout}) if $par{timeout};
$self->{host} = $par{host} || 'toolbarqueries.google.com';
bless($self, $class);
}



こんな感じになった。



sub new {
my ($class, $args) = @_;
my $env_proxy = $args->{env_proxy} ? delete $args->{env_proxy} : croak "env_procy is necessary";
my $proxy = $args->{proxy } ? delete $args->{proxy } : croak "procy is necessary";
my $timeout = $args->{timeout } ? delete $args->{timeout } : croak "timeout is necessary";
my $host = $args->{host } ? delete $args->{host } : 'toolbarqueries.google.com';

my $self;
return unless ( $self->{ua} = LWP::UserAgent->new( agent => $par{agent} || 'Mozilla/4.0' ) )
$self->{ua}->env_proxy;
$self->{ua}->proxy('http', $proxy);
$self->{ua}->timeout($timeout);
$self->{host} = $host;

bless $self => $class;
}



使えるならSmart::Args使いたいね。
あ、UserAgentはnewのときに、いっしょに入れてやったほうがいいのかな。



$self->{ua} = LWP::UserAgent->new( agent => $par{agent} || 'Mozilla/4.0',
env_proxy => 1,
timeout => $timeout,
);





use constantの定数を展開



リストコンテキストなので、
print @{ [定数名] }





2011年6月6日月曜日

jQuery風にCSSセレクタで解析



http://d.hatena.ne.jp/tokuhirom/20110221/1298244438

これは便利。
特にHTML::Selector::XPath はXML::XLibを使う際に使用したい。
あ、xmlには使えないか。。。。





EPUB3.0について



スクレイピングメモ。

始まりは META-INF/container.xml から


この中に、opfファイルへのフルパスが記述されている。

content.opf


メインの構成は、
metadata:本のタイトル、著者名、言語、表紙画像など
manifest:本を構成するすべてのファイルを列挙.<item id="", href="", media-type="" >
spine:表示するファイルの順番を記載? idrefでmanifestのid に対応。
guide:目次などに使われる。EPUB3.0で廃止。ただし後方互換のため、作成してもいい。

toc.ncx


目次などを作成する用。
navPoint は章や節を表していて、入れ子構造になっている。
入れ子の深さを表すものが、dtb:depth のはずだが、なぜか1以外見たことがない。
playOrderは、章や節に関係なく、連番になっている。基本的にこれがあれば、ファイル順番は決めれると思うのだが、content.opfのspineタグは何で要るんでしょう。

toc.ncxは、EPUB3.0で廃止。

ただのxmlファイルとして提供するそうです。




XML::Simple



XML::Simple


他のモジュールと比べると速度が劣るが、簡単。


注意点

同じHTMLタグが複数ある場合は、配列になるため、HTMLタグの数が単数か複数かで配列になったりならなかったりする。


対処

new時に、forcearray => 1 とすることで、強制的にすべて配列にできる。
特定のタグだけの場合は配列リファレンスで、指定する。
また、空の配列にアクセスした場合、エラーで落ちるのを防ぐために、何で埋めるかをSupperessEmptyで指定してやる。



my $parser = XML::Simple->new( SuppressEmpty => undef, forcearray => ["spine"]);
my $parsed_xml = $parser->XMLin($xml_file);
print $parsed_xml->{hoge}{bar}[0];