心霊写真変換つくりました

世間では空前の幕末ブームが到来しているようですが、社内のデザイナーさんの力をお借りして心霊写真ジェネレータを作成しました。

心霊写真変換

やっていることは、

こんな感じです。
http://farm3.static.flickr.com/2175/2398140632_071880f2b4_o.jpg
変換後は除霊を行うことで霊を削除して、目線だけの画像にすることもできます。

除霊後↓ほっとしますね(w
http://farm3.static.flickr.com/2200/2398140700_6b4068af7b.jpg
変換後の画像は手元で保存してください。数日で消されてしまいます。
霊によっては人のいないエリアに出現するようです、かなり気まぐれなので色々試してください。

分かりにくいですが、こんなところにも、、、
http://farm4.static.flickr.com/3030/2397178609_5bff4d5097_o.jpg

追記

APIの利用制限回数(200回?)を超えたらしく目線が入らなくなりました;;
ずいぶん少ないなぁ。

scoks経由のLWP::UserAgent

socks経由でLWP::UserAgentを使いたいときのメモ。
LWP::Protocol::https::SocksChainを使って指定してあげると良いようです。

use LWP::UserAgent;
use LWP::Protocol::https::SocksChain;

LWP::Protocol::implementor( https => 'LWP::Protocol::https::SocksChain' );
@LWP::Protocol::https::SocksChain::EXTRA_SOCK_OPTS = ( Chain_Len    => 1,
                                                        Debug        => 0,
                                                        Chain_File_Data => ['socks:1080:::4:383 b/s Argentina'],
                                                        Random_Chain => 1,
                                                        Auto_Save    => 1,
                                                        Restore_Type => 1 );

ホームディレクトリの~/.sc.confにこんな感じに書いておけば、Chain_File_Dataで指定する必要はないみたい。

 socks:1080:::4:383 b/s Argentina

autoboxでRESTクライアント

autoboxが流行っているようです。
自分は最近RESTづいているので、こんなクライアントモジュールを作ってみました。

 use autobox;
 use autobox::REST;
 
 my $response = "http://example.com/rest_api/"->post("foo=>1&bar=>hoo");
 $response = "http://www.example.com/rest_api/"->get();
 $response->content;
 $response = "http://www.example.com/rest_api/"->put("foo=>99");
 $response = "http://www.example.com/rest_api/"->delete();

RequestMethodをそれぞれPOST,GET,PUT,DLETEと指定して送る事ができます。
普通にGETでコンテンツだけ取得するものありですね、っていうか普通使うのはそれぐらいでしょうね。

やっぱRESTでしょ!

REST本を読んだりニコニコの動画配信を見て、ようやく分かってきた感じです。

RESTful Webサービス

RESTful Webサービス

REST自体に新しい技術はありません。
ソフトウェアにOOPのような設計手法があるように、Webサービスの設計にもREST(ROA)があるよと言う事のようです。

いままで何となく接してきた技術に名前をつけて再認識することで、Webサービスを構造的に考えられるようになりました。

URI(URL)
リソース(コンテンツ)
表現(フォーマット)
接続性(リンク)
統一インタフェース(GET、POST)

設計するの際に、この辺りを頭に入れておくと使いやすいサービスになるんじゃないかなと。
企画やデザインをする方も知っておいて損は無いと思いました。

Class::C3でFizzBuzzなんぞしてみる

微妙に違うバッチ処理スクリプトを大量に書いていたのですが、メンテナンスや再利用性を考えるとプラガブルな感じにしておくと良さそう。PerlモジュールにClass::C3ってのがあるので、これでうまい事できないかなと...

つーわけで、これを使って試しにFizzBuzzしてみました。

package Foo;
use base 'Class::C3::Componentised';
sub component_base_class { "Foo" }

sub new {
    my $class = shift;
    bless{n=>undef},$class;
}

sub call{
    my $self = shift;
    return;
}

package Foo::Buzz;
use base qw/ Foo /;

sub call{
    my $self = shift;
    my $n = [];
    for my $i (@{$self->{n}}){
       $i = 'Buzz' unless( $i =~ /(Fizz|Buzz)/ || $i%5 ); 
       push @{$n},$i;
    }
    $self->{n} = $n;
    $self->next::method();
    return;
}

package Foo::Fizz;
use base qw/ Foo /;

sub call{
    my $self = shift;
    my $n = [];
    for my $i (@{$self->{n}}){
       $i = 'Fizz' unless( $i =~ /FizzBuzz/ || $i%3 ); 
       push @{$n},$i;
    }
    $self->{n} = $n;
    $self->next::method();
    return;
}

package Foo::FizzBuzz;
use base qw/ Foo /;

sub call{
    my $self = shift;
    my $n = [];
    for my $i (@{$self->{n}}){
       $i = 'FizzBuzz' unless( $i%15 ); 
       push @{$n},$i;
    }
    $self->{n} = $n;
    $self->next::method();
    return;
}

package Foo::Hoge;
use base qw/ Foo /;

sub call{
    my $self = shift;
    $self->{n} = shift;
    $self->next::method();
    return $self->{n};
}

Foo::Hoge->load_components('FizzBuzz','Fizz','Buzz');
my $foo = new Foo::Hoge();
map{print "$_\n";} @{$foo->call([1..100])};

BaseクラスのClass::C3::Componentisedは、DBIx::Classにあったload_componentsを別モジュールとして分離実装したものです。モジュール名の配列を渡すと順番にに従って中のメソッドが実行されます。

Foo::Hoge->load_components('FizzBuzz','Fizz','Buzz');

今回の場合は以下の順番で処理され1から100までの数字が変換さるようになっています。

 ↓

  • Foo::Fizz->call() 3で割り切れたらFizz

 ↓

  • Foo::Buzz->call() 5で割り切れたらBuzz

Class::C3はデータにFilterをかけたいなどの横方向に拡張したい場合に使うと有効なようです。

あと、FizzBuzzの確認には

perl -MAcme::FizzBuzz -e ''

を使うと安心です(w
yappo++

CGIでDB(Postgresql)にアクセスするとエラーに → SELinuxの設定で解消★

CGIPostgresqlのDBにアクセスすると以下のエラーが出てこける。

 Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

コマンドラインスクリプトからは接続できてmod_perlでも動作するが、CGIだけダメ。
DB再起動したり設定を睨んだりしたがよくわからず。

結局SELinuxを無効にすると接続する事ができました。

タイトルは☆ばぐた☆風