転職しました

ブログの更新サボっている間に、転職をしました。
札幌に住んでいる状態から、関東の会社への転勤はいろいろと大変でしたが今では元気にやっております。

現在の生活に慣れたら、またブログを書いていきたい。
そして、アウトプットの質を上げていきたい。

スライスでのデータアクセスのパフォーマンス

スライスでのアクセスのほうがパフォーマンスが出ると思っているが、
実際どの程度の差なのか少し気になったので測ってみた。

datafile.yaml

データ構造を考えるのがめんどくさかったので、ここから拾ってきました。
るびま

teams:
  - name:        Akudaman
    members:
      - name:    Mujo
        age:     24
        leader:  yes
      - name:    Tobokkee
        age:     25
      - name:    Donjuro
        age:     30
  - name:        Doronboo
    members:
      - name:    Doronjo
        age:     24
        leader:  yes
      - name:    Boyakkie
        age:     25
      - name:    Tonzuraa
        age:     30

array_slice.pl

use Benchmark qw( cmpthese );
use Config::YAML;

my $config  = Config::YAML->new( config => 'datafile.yaml' );
my @values  = ();

sub idx {
    @values = (
        $config->{teams}[0]{members}[0],
        $config->{teams}[0]{members}[2],
    );
}

sub idx_with_temp {
    my $temp = $config->{teams}[0]{members};
    @values = (
        $temp->[0],
        $temp->[2],
    );
}

sub slice {
    @values = @{ $config->{teams}[0]{members} }[ 0, 2 ];
}

cmpthese( 1_000_000, {
        idx             =>  sub { idx() },
        idx_with_temp   =>  sub { idx_with_temp() },
        slice           =>  sub { slice() },
});

結果

$ perl array_slice.pl
                  Rate           idx idx_with_temp         slice
idx           378788/s            --          -22%          -43%
idx_with_temp 487805/s           29%            --          -26%
slice         662252/s           75%           36%            --
$ perl array_slice.pl
                  Rate           idx idx_with_temp         slice
idx           384615/s            --          -21%          -45%
idx_with_temp 485437/s           26%            --          -30%
slice         694444/s           81%           43%            --

hash_slice.pl

use Benchmark qw( cmpthese );
use Config::YAML;

my $config  = Config::YAML->new( config => 'datafile.yaml' );
my @values  = ();

sub key {
    @values = (
        $config->{teams}[0]{members}[0]->{name},
        $config->{teams}[0]{members}[0]->{age},
    );
}

sub key_with_temp {
    my $temp = $config->{teams}[0]{members}[0];
    @values = (
        $temp->{name},
        $temp->{age},
    );
}

sub slice {
    @values = @{ $config->{teams}[0]{members}[0] }{ 'name', 'age' };
}

cmpthese( 1_000_000, {
        key             =>  sub { key() },
        key_with_temp   =>  sub { key_with_temp() },
        slice           =>  sub { slice() },
});

結果

$ perl hash_slice.pl
                  Rate key_with_temp           key         slice
key_with_temp 233100/s            --          -24%          -32%
key           306748/s           32%            --          -11%
slice         343643/s           47%           12%            --
$ perl hash_slice.pl
                  Rate           key key_with_temp         slice
key           363636/s            --           -6%          -29%
key_with_temp 387597/s            7%            --          -25%
slice         515464/s           42%           33%            --

まとめ

概ね予想通りだった。
複雑なデータ構造の(配列|ハッシュ)から、データを取り出す場合はスライスを使ったほうがパフォーマンスはいい。
(といっても微々たるものなんだろうけど。)

さくらVPSで、メールを送信出来るようにする

以下のページを見ながら、postfixのインストールと設定。
さくらのVPSをもう少しセットアップしてみる | @blog.justoneplanet.info


とりあえず、送信専用。

"/etc/postfix/main.cf" 更新箇所

myhostname = www9999u.sakura.ne.jp
mydomain = www9999u.sakura.ne.jp
myorigin = $mydomain

# SMTP-Auth configuration
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions =
    permit_mynetworks
    permit_sasl_authenticated
    reject_unauth_destination

# limit
message_size_limit = 10485760

saslauthdの起動

/etc/rc.d/init.d/saslauthd start
/sbin/chkconfig saslauthd on
/sbin/chkconfig --list caslauthd

postfixの起動

/etc/rc.d/init.d/postfix start
/sbin/chkconfig postfix on

[日記][Perl] PerlでタイムラインからURL付きのツイートのみを拾ってBloggerに投稿するスクリプトを作った

思ったよりも時間がかかったけれど、なんとなく動いたので結果報告。
ソースコードは、そのうちgithubに上げます。。

どういうスクリプトなの

自分のタイムラインをTwitterAPIを使い取得
URLを含んだツイートのみを摘出、DBに保存
摘出した情報を元に1日に1回、メールでBloggerに投稿

今後どうするの

  • 勢いで作ってしまったので、CPAN形式で出来ていない。CPAN形式に対応させる
  • タイムラインの定期取得をcronを作って行っているので、AnyEventを使って書き直したい
  • メールからBloggerAPIを使っての投稿に切り替えたい
  • 不具合の対応
    • URLのページタイトル取得にたまに失敗する&文字化けする
  • 機能改善
    • 除外する(URL|ドメイン)を設定できるようにする

まとめ

まず、このスクリプトを作った理由ですが、以下の3つ。

  1. フォローワー増えてきて、タイムライン追えなくなってきた
  2. とある事情で、日中ツイッターを見れなくなった
  3. 自宅で何か作ってみたかった

で、実際に作ってみて思ったのが、「想像以上に自分使えねぇ」ってことでした。
分かったつもりでいたことが、実はそれほど分かってなかったことが多く、
それらを知るいい経験になったとおもってます。
本ばっかり読むんじゃなくて、ちゃんと実践しないとダメだね。
サンプルコード書いて満足しちゃってた。反省。

使ったモジュール

FindBin
Encode
Config::Pit
DateTime
Data::Section::Simple
Template
Email::MIME::CreateHTML
Email::Send
Net::Twitter
Web::Scraper
Date::Calc
LWP::UserAgent
HTTP::Request

フィボナッチ整列を求めるようなサンプルコード

とある事情で書いたけど、本当に必要だったのは違うものだった。
まぁせっかくなので、ブログに書く。

use strict;
use warnings;
use Math::BigInt;

{
    my @fibonacci_number = ();

    sub fibonacci
    {
        my $num = shift;

        unless ( $fibonacci_number[$num] ) {
            if ( $num <= 1 ) {
                $fibonacci_number[$num] = Math::BigInt->new( $num );
            }
            else {
                $fibonacci_number[$num] = fibonacci( $num-1 ) + fibonacci( $num-2 );
            }
        }

        return $fibonacci_number[$num];
    }
}

print fibonacci( 1 ), "\n";
print fibonacci( 10 ), "\n";
print fibonacci( 100 ), "\n";

桁が大きすぎると、指数表記されてしまうのでMath::BigInt使いました。

my.cnfが見当たらない

そろそろ、自宅でもMySQL使いそうなのでちゃんと設定しておこうと思った。
だけど、my.cnfが見当たらない。

ドキュメント読んで解決。

MySQLは指示された通りの順序でオプションファイルを探し、その中で存在するものを解読します。もし使用したいオプションファイルが存在しなければ、プレーンテキストエディタで新しく作ってください。

http://dev.mysql.com/doc/refman/5.1/ja/option-files.html

というけで、/etc/my.cnf を作成。
long_query_time に 1秒を指定して、MySQL再起動。
show variables like 'long_query_time'; で設定が反映されていることを確認。

Twitter APIについて少しだけ調べてみた。

タイムラインを取得して、つぶやきに含まれているURLを抜き出してみたかった。

Twitter API

  • API上でつぶやきのことは、status と表現されている模様-
  • タイムラインの取得には、statuses/home_timeline または、statuses/friends_timeline を使うと良さそう
  • つぶやかれた内容は、text に格納される
    • リツイートの場合、つぶやきが省略される場合がある?
      • その場合、retweeted_status に格納されているデータからリツイートされたつぶやきの内容が取得できる。
  • つぶやきにURLが含まれる場合、entities から取得できる

Perlでつぶやきと、URLを取得するサンプル