月別アーカイブ: 2010年10月

WordPressのブログを移転した

自宅サーバー縮小計画の第一弾として、wordpress製のブログを移転してみた。

自宅のmysqlのバックアップ

$ mysqldump blog2 > /tmp/db.dump

ダンプデータとwordpressディレクトリをさくらに転送

$ scp /tmp/db.dump blog2.jamadam.com:/tmp/
$ scp /path/to/blog2 blog2.jamadam.com:/path/to/blog2

さくらにログイン

$ ssh blog2.jamadam.com

リストア

$ mysql -p blog2 < /tmp/db.dump

おしまい。のはず。

と思ったら、ブログのベースのパスがDBの至る所に埋め込まれていたので、下記のようにdb.dump内のhttp://jamadam.com/blog2をhttp://blog2.jamadam.comへ置換。

sed -e "s/http://jamadam.com/blog2//http://blog2.jamadam.com//g" db.dump > db-fixed.dump

perlbrewを試した

perlbrewという便利なものを知った。ユーザー権限で色んなPerlバージョンをHOME以下にインストールできる。早速、さくらのVPSで、ほぼまっさらな最小インストールdebianで試した。

下準備。

# su
# aptitude update
# aptitude upgrade
# aptitude install gcc make libc-dev libc6-dev
# aptitude install bzip2
# aptitude install curl
# exit

perlbrewをインストールして初期化と.bashrcの設定。

$ cd ~
$ curl -LO http://xrl.us/perlbrew
$ chmod +x perlbrew
$ ./perlbrew install
$ rm ~/perlbrew
$ ~/perl5/perlbrew/bin/perlbrew init
$ echo 'source ~/perl5/perlbrew/etc/bashrc' >> ~/.bashrc

 

いろいろなPerlバージョンをインストール

$ perlbrew install perl-5.8.9
$ perlbrew install perl-5.12.1

インストール済みのPerlバージョンを確認。

$ perlbrew installed

perl-5.8.9(*)
perl-5.12.1
/home/ore/perl5/perlbrew/bin/perl
/home/ore/perl5/perlbrew/perls/current/bin/perl
/usr/bin/perl

スイッチ。

$ perlbrew switch /usr/bin/perl

Switched to /usr/bin/perl

$ perl -v

This is perl, v5.10.0 built for i486-linux-gnu-thread-multi

Copyright 1987-2007, Larry Wall

$ perlbrew switch perl-5.8.9

$ perl -v

This is perl, v5.8.9 built for i686-linux

Copyright 1987-2008, Larry Wall

$ ~/perl5/perlbrew/perls/perl-5.8.9/bin/perl -v

This is perl, v5.8.9 built for i686-linux

Copyright 1987-2008, Larry Wall

スクリプトのパス。

#!/home/ore/perl5/perlbrew/bin/perl

cpanmも使えばcpanモジュール含めて丸ごとスイッチ。

 

参考

モダンな Perl5 開発環境について

perlbrew + cpanminus + local::lib で環境構築

モバイル用にHTMLを圧縮するPlack::Middlewareらしきもの

HTMLソースを携帯用に圧縮するPlack::Middlewareらしきもの。スペースや改行を削除するのと、全角→半角変換などを適当にやってくれる。絵文字はできてない。

package Plack::Middleware::KetaiMinimize;
use strict;
use warnings;
use Lingua::JA::Regular::Unicode;
our $VERSION = '0.01';
use utf8;
use Encode;
use Encode::JP::Emoji;
use Encode::JP::Emoji::Property;
use base qw( Plack::Middleware );
use Plack::Util;

sub call {

    my $self = shift;
    my $res = $self->app->(@_);
    $self->response_cb($res, sub {
        my $res = shift;
        my $h = Plack::Util::headers($res->[1]);
        if ($h->get('Content-Type') =~ 'text/html') {
            return sub {
                my $chunk = shift;
                if (! defined $chunk) {
                    return;
                }
                $chunk =~ s{(rn|r|n|s)+}{ }g;
                $chunk =~ s{(^|>)([^<]+)}{
                    my $a = $1;
                    my $b = Lingua::JA::Regular::Unicode::katakana_z2h($2);
                    $b =~ tr{-}{0-9};
                    $b =~ tr{、。()!?}{、。()!?};
                    if ($b eq ' ') {
                        $a;
                    } else {
                        $a. $b;
                    }
                }ge;
                #$chunk = emoji_conv($chunk);
                return $chunk;
            };
        }
        $res;
    });
}

モバイル用Analyticsを埋め込むPlack::Middlewareらしきもの

[ Neurolab Inc. ] MainStore @ Phoen-X City, FRANCE3D Cyber City (124, 133,  1500) - General
Creative Commons License photo credit: Torley

モバイル用のGoogle Analyticsを埋め込むPlack::Middlewareらしきものをつくった。たぶん下記のようなインターフェースで動くはずだけど、ニセPSGI実装上でしかチェックしてないので、Plackで動くかどうかわからない。

なお、ga.plはGoogle Analytics公式サイトからGETしてドキュメントルートなどに設置する必要があります。

builder {
    enable 'GoogleMobileAnalytics',
    GA_ACCOUNT => 'UA-XXXXXX-1',
    GA_PIXEL => '/ga.pl';
    $app;
};
package Plack::Middleware::GoogleMobileAnalytics;
use strict;
use warnings;
our $VERSION = '0.01';
use base qw( Plack::Middleware );
use Plack::Util;
use Plack::Util::Accessor qw( GA_ACCOUNT );
use Plack::Util::Accessor qw( GA_PIXEL );
use URI::Escape;

sub call {

    my $self = shift;
    my $res = $self->app->(@_);
    $self->response_cb($res, sub {
        my $res = shift;
        my $h = Plack::Util::headers($res->[1]);
        if ($h->get('Content-Type') =~ 'text/html') {
            return sub {
                my $chunk = shift;
                if (! defined $chunk) {
                    return;
                }
                $chunk =~ s{</body>}{'<img src="' . $self->google_analytics_get_image_url() . '" /></body>'}e;
                return $chunk;
            };
        }
        $res;
    });
}

sub google_analytics_get_image_url {

    my $self = shift;
    my $url = '';
    $url .= $self->GA_PIXEL . '?';
    $url .= 'utmac=' . $self->GA_ACCOUNT;
    $url .= '&utmn=' . int(rand(0x7fffffff));
    $url .= '&utmr=' . uri_escape($ENV{'HTTP_REFERER'} || '-');
    $url .= '&utmp=' . uri_escape($ENV{'REQUEST_URI'});
    $url .= '&guid=ON';
    $url =~ s/&/&amp;/g;
    $url;
}

1;
 

javascriptとcssを全自動で連結&圧縮する

橋の上から
Creative Commons License photo credit: amadeusrecord

ウェブサイト作るときに、最近は膨大な数のjqueryのプラグインなんかをロードしなくちゃいけない。ロードするファイルが増えるとページのパフォーマ ンスにも影響するのでソースを1ファイルにまとめて、さらに圧縮するのが効果的なんだけど、これを手作業でするのは骨が折れる。特に開発段階では頻繁にソースへの修正が入るので、効率が悪い。そういう訳で自動化した。

こうなる

無数のjsやcssを個別に開発し、HTMLにはcat.phpのパラメータとして各ファイル名を+区切りで記述する。ファイルはdir/a.jsなどとディレクトリを切っても構わない。

<script type="text/javascript" src="./js/cat.php?jquery.1.4.2.js+a.js+b.js"></script>

<link rel="stylesheet" href="./css/cat.php?dir/a.css+dir/b.css" type="text/css" />

これだけで、全てのファイルが連結され、改行やコメント、先頭のCSS以外のcharsetが削除される。また、gzip対応ブラウザにはgzipを出力し、Etagなどのキャッシュ関連のヘッダもいい感じに世話してくれる。ファイルの更新日を常に判定しているので、ファイルに変更が加わればキャッシュはクリアされる(はず)。そういう訳で、一度セットアップしてしまえば、圧縮うんぬんのことは忘れてしまって、どんどんファイルを増やそう。

方法

ライブラリとして下記をダウンロードする。

下記のように配置する。PHPのライブラリは任意の場所で構わないが、cat.phpの先頭のset_include_pathを合わせる必要がある。

[DIR]commons
├[DIR]php
│├[DIR]Minify
││├[DIR]CSS
│││└Compressor.php
│││└UriRewriter.php
││├CommentPreserver.php
││└CSS.php
│└JSMin.php
├[DIR]js
│├[DIR]cache
│├jquery.1.4.2.js
│├a.js
│├b.js
│└cat.php
└[DIR]css
  ├[DIR]cache
  ├a.css
  ├b.css
  └cat.php

※cat.phpに実行権限、cacheディレクトリに書き込み権限が必要。

Google Page Speedつながりで、次回は全自動で画像最適化のネタを書きたい。