zopfli for php install

# get source code

git clone https://github.com/kjdev/php-ext-zopfli.git
cd zopfli
git clone https://code.google.com/p/zopfli/ .
cd ..

 

# install for php

phpize
./configure
make && make test && make install
echo extension=zopfli.so > /etc/php5/conf.d/zopfli.ini

 

# check instalation

php -i | grep zopfli

 

----------------------------------------------------------------------------

# sample program

<?php

$png_image = file_get_contents("A.png");
$png_image_recompressed = zopfli_png_recompress($png_image);
file_put_contents( "B.png", $png_image_recompressed );

$png_image = file_get_contents("B.png");

$png_image_recompressed = zopfli_png_recompress($png_image);
file_put_contents( "C.png", $png_image_recompressed );

----------------------------------------------------------------------------

# check zopfli program

ls -al   (reduced file size)

(ImageMagik) composite -compose difference A.png B.png diff.png (diff pixel data)

 

 ----------------------------------------------------------------------------

zopfli での圧縮は処理時間 0.2~0.5 秒付近をさまようのでフロントで使用するべきではない。

ファイルサイズの減少は、12910→11721(90.7%)、37271→35557(95.4%)

となった。

 

 

OpenSocial::Gadget 配下のウェブアプリで GoogleAnalyticsMobileTracking - Perl

モバイルサイトで GoogleAnalyticsTracking を利用するこちらを参照すればできるのだが、モバイル端末の識別をするのに cookie または 国内の移動体通信事業者が出力するリクエストヘッダを参照するプログラムになっており(※1)、OpenSocial::Gadget 配下のウェブアプリだと(個人情報云々などの制約で)OpenSocial::Gadget なリクエスト内容に変化して個体識別番号などは取得できず、フィーチャーフォンにおいては cookie が使用できないので、プログラムをそのまま使用してもトラッキングが正常にできないというケースに遭遇する。

※1----------------------------------------------------------------------------

  if (exists($ENV{'HTTP_X_DCMGUID'})) {
    $guid_header = $ENV{'HTTP_X_DCMGUID'};
  }
  if (exists($ENV{'HTTP_X_UP_SUBNO'})) {
    $guid_header = $ENV{'HTTP_X_UP_SUBNO'};
  }
  if (exists($ENV{'HTTP_X_JPHONE_UID'})) {
    $guid_header = $ENV{'HTTP_X_JPHONE_UID'};
  }
  if (exists($ENV{'HTTP_X_EM_UID'})) {
    $guid_header = $ENV{'HTTP_X_EM_UID'};
  }
  my $visitor_id = get_visitor_id($guid_header, $account, $user_agent, $cookie);
----------------------------------------------------------------------------

 

でも大丈夫。

このへんのコードをばっさり切って、

$visitor_id に opensocial_viewer_id を代入するコードにちょちょいと改修すれば

出来上がり。

以上。

 

Perl モジュールインストール

Perl モジュールインストールが面倒くさい人はこれ。

Perl プログラムで使用しているモジュールの一覧ひろって cpanm にぶん投げる

  perl -d:Modlist=nocore example.pl 2>&1 >/dev/null | awk '{print $1}' | xargs cpanm

※Devel::Modlist は予めインストールしとけ

以上。

 

Perl de MongoDB超入門

ひっさびっさのはなげまんです。
不定期更新ですが Perl de MongoDB超入門 をやっていこうと思います。

Perlインストール MongoDBインストールなどの準備の仕方は
公式ドキュメントや他のブログにお任せします。
また、MongoDB の成り立ちやアーキテクチャなどは、公式ドキュメント等をご参照ください。

今回使用する Perl モジュールは MongoDB.pm にします。
Author は 「Kristina Chodorow」さん。MongoDB を開発している 10gen という会社でソフトウェアエンジニアをされているようです。つまり、10gen 公式のPerl言語で書かれたMongoDBドライバであるという認識ができそうです。さらに ScalingMongoDB などの著者でもあるようですね。

さて、MongoDB.pm はこのページをみるといくつか関係するモジュールがあるようです。
└MongoDB::BSON
└MongoDB::Code
└MongoDB::Collection
└MongoDB::Connection
└などなど
ふむ。追って回を重ねるごとに詳しくみていきましょう。

今回は「MongoDBに接続する」ということをやってみます。簡単です。
「接続する」というキーワードから気になる点がいくつか頭に浮かんできます。
[1] MongoDB::Connection を使えばよさそうだ。
[2] 接続するときのオプションは何があるのだろう。
[3] クライアント/サーバ間で文字コードを utf8 で統一したい。
ですが、[3] の utf8 になっているかは、接続しただけではわからないので、
今回はおまじない的なコードを記述しています。
まぁ、CPAN モジュールをみてだな、以下の様なテストコードになると思うのだよ。

----------------------------------------------------------------------------
use strict;
use warnings;
use utf8;

use Test::More;
use Data::Dumper;
use MongoDB;

{
=test-1
    connect to mongodb with correct data source
=cut
    my $data_source = {
        host => 'hogehoge:27017',
    };

    $MongoDB::BSON::utf8_flag_on = 0;
    my $mongodb = MongoDB::Connection->new( $data_source );
    is ref( $mongodb ), 'MongoDB::Connection', 'MongoDB Connected';

=test-2
    connect to mongodb with incorrect data source
=cut
    $data_source = {
        host => 'hagehage:27017',
    };

    eval {
        $MongoDB::BSON::utf8_flag_on = 0;
        $mongodb = MongoDB::Connection->new( $data_source );
    };
    if ( $@ ) {
        $mongodb = undef;
    }
    is $mongodb, undef, 'MongoDB Not Connected';
}

done_testing();
----------------------------------------------------------------------------

実行結果:

ok 1 - MongoDB Connected
ok 2 - MongoDB Not Connected

と、こうなるはずだ。

んでね、
MongoDB::Connection->new は、接続に失敗すると、die します。
今回は接続に失敗しても処理は続けたいので、eval で囲んでいます。

以上、こんな感じかしら。今回はここまで。
まとめると、
・utf8 フラグは統一しておきたいおまじない。
 $MongoDB::BSON::utf8_flag_on = (0|1);  # 0または1 を設定
・MongoDB::Connection->new は失敗すると die で死ぬ。