心霊写真変換つくりました
世間では空前の幕末ブームが到来しているようですが、社内のデザイナーさんの力をお借りして心霊写真ジェネレータを作成しました。
やっていることは、
こんな感じです。
変換後は除霊を行うことで霊を削除して、目線だけの画像にすることもできます。
除霊後↓ほっとしますね(w
変換後の画像は手元で保存してください。数日で消されてしまいます。
霊によっては人のいないエリアに出現するようです、かなり気まぐれなので色々試してください。
追記
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本を読んだりニコニコの動画配信を見て、ようやく分かってきた感じです。
- 作者: Leonard Richardson,Sam Ruby,山本陽平,株式会社クイープ
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2007/12/21
- メディア: 単行本
- 購入: 25人 クリック: 842回
- この商品を含むブログ (168件) を見る
ソフトウェアに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::Buzz->call() 5で割り切れたらBuzz
Class::C3はデータにFilterをかけたいなどの横方向に拡張したい場合に使うと有効なようです。
あと、FizzBuzzの確認には
perl -MAcme::FizzBuzz -e ''
を使うと安心です(w
yappo++