« 2006年9月 | メイン | 2006年11月 »

2006年10月 アーカイブ

2006年10月 3日

Plaggerで「最近聞いた曲」Planetサイトを作る

入力がCustomFeed::iTunesRecentPlayで出力Bundle::Planetにして最近聞いた曲というかアルバムを表示するPlanetサイトを作る。俺の場合、ヒンジがぶっ壊れたThinkpad X22をiTunes専用マシンにしてあって、そこから自宅サーバーをsambaで覗けるようにしてあるので、Thinkpad(iTunes)→自宅サーバー(Planet)ということが可能。ちょっとWindowsでPlagger動かすのに手間取ったけどできた。 以下config.yaml

global:
  timezone: Asia/Tokyo
  assets_path: Y:\lib\plagger\assets
  
plugins:
  - module: CustomFeed::iTunesRecentPlay
    config:
      library_path: file://D:/Music/iTunes/iTunes Music Library.xml
      duration: 10080
      title_format: %track - %album - %artist
      aws_developer_token: D3QNAE4JDR26A2
      aws_associate_id: kamawada-22
      aws_locale: jp

  - module: Bundle::Planet
    config:
      title: yusukebe MUSIC
      dir: Y:\public_html\yusukebe\music
      url: http://yusukebe.com/music/
      theme: music
      stylesheet: http://yusukebe.com/music/theme/theme-music.css
      duration: 7 days
      description: pickup albums from yusukebe's recent playlist

  - module: Publish::JavaScript
    config:
      dir: Y:\public_html\yusukebe\music
      filename: music.js

Publish::Javascriptもしてサイドバーに貼り付けてあります。こんな感じ→yusukebe MUSIC

music.jpg

2006年10月 4日

FFmpeg::Commandを使ってflvを作成する

こんな感じでできた。なんとなく-deinterlaceをいれたかった。もすこしオプションを工夫しよ。

#!/usr/bin/perl

use strict;
use FFmpeg::Command;

my $ffmpeg = FFmpeg::Command->new('/usr/local/bin/ffmpeg');
my $input_file = "input.avi";
my $output_file = "output.flv";

$ffmpeg->input_file($input_file);
$ffmpeg->output_file($output_file);
$ffmpeg->options(
                                 '-y',
                                 '-f' => 'flv',
                                 '-s' => '470x390',
                                 '-ar' => '44100',
                                 '-deinterlace',
                         );

my $result = $ffmpeg->exec();
print  $ffmpeg->errstr unless $result;

2006年10月 5日

MTでファイルを映像アップロードしたらflvに変換する

MovableTypeの管理画面の「ファイルのアップロード」ってやつから映像ファイルをアップロードすると.flvファイルに変換してくれるってやつ。ほんとはMTをYoutubeみたいにしたいので、エントリー毎に1ファイルということでオリジナルのフィールド作ってcallbackのタイミングをエントリーをポストした時とした方がよいかも。RightFieldsと組み合わせるかな。

package MT::Plugin::Video;

use strict;
use MT;
use MT::Log;
use FFmpeg::Command;

my $ffmpeg = FFmpeg::Command->new('/usr/local/bin/ffmpeg');
my $log = MT::Log->new;
my $plugin = new MT::Plugin({
                                                         name => "Video",
                                                         version => '0.01',
                                                         author_name => "Yusuke Wada",
                                                         author_link => "http://yusukebe.com",
                                                 });
MT->add_plugin($plugin);
MT->add_callback('CMSUploadFile', 1, undef, \&uploadfile_hdlr);

sub uploadfile_hdlr {
    my ($eh, %params) = @_;
        my $file = $params{File};
        encode($file);
}

sub encode{
        my ($input) = @_;
        $ffmpeg->input_file($input);
        my $output = get_base_name($input)  . ".flv";
        $ffmpeg->output_file($output);
        $ffmpeg->options(
                                         '-y',
                                         '-f' => 'flv',
                                         '-s' => '470x390',
                                         '-ar' => '44100',
                                         '-deinterlace',
                                 );
        my $result = $ffmpeg->exec();
}

sub get_base_name {
  my ($file_name) = @_;
  my $basename = $file_name;
  $basename =~ s/(.*)\..*?$/$1/;
  if ($basename eq '') {
    $basename = $file_name;
  }
  return $basename;
}

RightFieldsのプロパティをゲットする

MTのエントリーに独自のプロパティを設定できるRightFieldsPlugin。これ便利なので、外部からいじってみる。まずは、エントリーごとに設定したRightFieldsのextraプロパティをゲットする方法。まずはuseして

use lib qw(/path/to/RightFields/lib);
use RightFields;

pre_saveコールバック時に指定したプロパティの値をログに吐き出す。

MT::Entry->add_callback('pre_save', 1, undef, \&pre_save_hdlr);

sub pre_save_hdlr {
    my ($eh, $entry) = @_;
        my $cfg = RightFields::blog_data('extra', "$blog_id");
        my $obj = RightFields::new_obj($cfg,$entry->id);
        my $column_value = $obj->column_values();
        my $video_file = $column_value->{'field_name'};
        $log->message(Dumper($field_name));
        $log->save();
}

RightFieldsハック、今日はこんな感じ。

2006年10月 9日

「2007湘南国際マラソン」ニュースページのCustomFeed::Configのasset

こういうページ→2007湘南国際マラソン|2007 SHONAN INTERNATIONAL MARATHONをPlaggerでフィードにしたいってな時にまっさきにEFTを使うってのがうかんだのだけども、このページ、各ニュースが個別記事になっていないので、custom_feed_follow_linkでおっかけられない。 IRCで質問したところmiyagawaさんにCustomFeed::Configにすればできるかも、ということでやってみた。CustomFeed::Configはこちら→Plaggerグループ - Seacolor's Labs.からとってきて、assetsのyamlを書く。以下/path/to/assets/CustomFeed-Config/shonan-kokusai.yaml

author: Yusuke Wada
match: http://www\.shonan-kokusai\.jp/news\.html
extract: <table class="news">.*?<th>(.*?)</th><td>(.*?)</td>
extract_capture: date body
extract_after_hook: $data->{title} = $data->{date}

湘南地域限定、期間限定というニッチなassetでした。しかしCustomFeed::Configはしらなんだ。夢がひろがりんぐだ。

オライリーからのAjax本2冊購入

とりあえず買った。Ruby on RailsでAjaxの記事が多いなという印象。

Ajax Hacks ―プロが教えるWebアプリケーション構築テクニック Ajax Hacks ―プロが教えるWebアプリケーション構築テクニック
実践 Ajax ―Web2.0アプリケーション開発への手引き 実践 Ajax ―Web2.0アプリケーション開発への手引き
  • Justin Gehtland Ben Galbraith Dion Almaer 宮川 達彦 加藤 慶彦
  • オライリー・ジャパン 大型本
  • Amazonで詳しくみる

FLVTool2::Command 0.01 FLVTool2のラッパーモジュール

FLVTool2というflvファイルにメタデータつけたり、メタデータを取得できるソフトのPerlラッパーモジュール。初めてモジュール作ったかも(といってもFFmpeg::Commandをかなり参考にさせていただきました)。

こんな感じで、flvファイルにメタデータつけれるのとdurationを秒数でゲットできます。

#!/usr/bin/perl

use FLVTool2::Command;

my $flvtool = FLVTool2::Command->new('/usr/bin/flvtool2');
$flvtool->file('test.flv');
$flvtool->add_metadata;
my duration = $flvtool->get_duration;

以下、FLVTool2::Command。

package FLVTool2::Command;

use warnings;
use strict;
our $VERSION = '0.01';

use base qw( Class::Accessor::Fast Class::ErrorHandler );
__PACKAGE__->mk_accessors( qw( file flvtool2) );
use IPC::Run qw( start );
use Carp qw( carp );

sub new{
        my $class = shift;
        my $self = {
                                flvtool2 => shift || 'flvtool2',
                                file => '',
                        };
        bless $self, $class;

}
sub get_duration {
        my $self = shift;
        my @result = split(/\n/,$self->execute('-P'));
        my $duration;
        foreach (@result){
                if(/duration: (\d+)/){$duration = $1};
        }
        return $duration;
}
sub add_metadata {
        my $self = shift;
        $self->execute('-UP');
        return;
}
sub execute {
    my ( $self, $args) = @_;
    my ( $in, $out, $err );
        my $h = eval {
                start [ $self->flvtool2, $args, $self->file],  \$in, \$out, \$err;
        };
    if( $@ ){
        $self->error($@);
        return;
    }
    else {
        finish $h or do {
            $self->error($err);
            return;
        };
    }
        return  $out;
}

1;

2006年10月16日

LyricWikiのAPIを使って今聴いてる曲の歌詞を表示

iTunesで今聴いている曲の歌詞を表示させる。あくまでPerlで。 LyricWikiがSOAPのAPIを公開しているのでそれを使ってみる。

#!/usr/bin/perl
use SOAP::Lite;
use strict;
use Win32::OLE;

my $wsdl = 'http://lyricwiki.org/server.php?wsdl';
my $api = SOAP::Lite->service($wsdl);
my $itunes = Win32::OLE->new("iTunes.Application");

my $track  = $itunes->CurrentTrack;
if($api->checkSongExists($track->Artist,$track->Name)){
        my $lyric =  $api->getSong($track->Artist,$track->Name);
        print $lyric->{lyrics};
        print "\n";
}else{
        print "lyric is not found \n";
}

できた。海外の有名なアーティストの曲しか登録されてないとけど、ぱっと知りたいときはコマンドたたくだけなので便利。

lyric.jpg

$plugin->load_tmpl

自分用メモ。MTのPluginでViewを扱う時にはプラグイン・ディレクトリ内にtmplディレクトリを作ってHTML::Templateのファイルを用意する。そしてMT::Pluginオブジェクトのメソッドload_tmplで呼び出す。$fileより右側の引数はHTML::Templateコンストラクタに渡される。

$plugin->load_tmpl($file[, ...])

参照: Movable Type オブジェクト・リファレンス - MT::Plugin

2006年10月17日

配列からランダムな複数の要素を取得する

こんな感じかなぁ

my @new_array = get_rand_array(\@old_array,3);
sub get_rand_array{
        my ($arrayref, $num) = @_;
        my @old_array = @{$arrayref};
        my @new_array;
        while($num){
                push( @new_array, splice(@old_array, rand @old_array , 1) );
                $num--;
        }
        return @new_array;
}

親父がRubyプログラミングに挑戦しようとしている…

親父のメールより

> Rubyのプログラミングに挑戦しようとインストールしたんだけど
> (西山伸さんのチュートリアル)、コマンドラインがでてこねえ。

えらい!今から教えに行って来るw

2006年10月20日

Shibuya.pm テクニカルトーク #7 メモ

先ほどまで行われていた、Shibuya.pmのテクニカルトーク #7。 参加したかったけど気づいたら締め切り状態なので、家からストリーミングで参加しました。 以下そのときとった、ざっくりとしたメモでーす。面白かったー

■Amazon Web Services, S3 and EC2 (Emerson Millsさん)

ヴァーチャルサーバー機能とストレージ機能を提供
なんか試したくて、Catalystをそこで動かしてみた
cpanの時間がかかる
OS?のimageをインスタンスとして起動できる
Apacheとかソフトが入っているimageがある
レンタルサーバーと違うところ、レンタルはハードができたときにインストール
これは好きなときにインストール
起動に5分くらい、何が走っているのかamiのIDで確認できる
1時間前くらいに起動したイメージでいろいろ試してみましょう
SSHでみんなログインできる!
価格月1インスタンス8000円くらい
データストレージもやすい

みんなでログインすると面白い
screen入ってた、catalyst起動させた

Perlは事前から入っている
Catalystの入ったイメージを作ったりしたい

■Catalyst+Lighttpdテクニック (typesterさん)

Lighttpdは軽い、小さい、高速、スタンドアローンでも
割と必要な機能、modはそろっている
LighttpdとPerlはFastCGIを使う
アプリケーションごとにモジュール空間が別になる
アプリケーションだけ個別に再起動できたりする
欠点は複数アプリを立ち上げるとメモリを食う、プロセス数が固定
正直、でも、めんどい、Catalystと組み合わせるともっとめんどい
めんどいのヘルパー作った、パッチも作った
ヘルパー: http://svn.unknownplace.org/public/library/perl/trunk/Catalyst-Helper-Light
Lighttpdの面白いところ、include_shellはシェルコマンドの出力を設定として読み込んでくれる
Lightyをスタンドアローンサーバーで動かせばテストサーバーになるんじゃね?
Catalyst組み込みサーバーの代わりとして、不満があるからね
ちなみにvoxはmod_perl1.xでCatalystを動かしている スタティックはperlbal by miyagawaさん
湘南Clipアルバムで使っている http://album.shonan-clip.jp/
Lighty + Catalyst + X-Sendfile + MogileFS
Catalyst::Helperをもっと活用しよう

■PMConnect: Perl - SpiderMonkeyバインディング(樋口証さん)

SpiderMonkeyとPerlをバインド js <-> Perl
SpiderMonkeyっていうのは元祖のJavaScriptインタプリタです
Firefoxに入っているやつです、サーバサイドでも使えるがライブラリが少ない
JSのライブラリ補完としてWindowsだとCOMをサポートすればいいがUnix系だとPerlのライブラリをいただくというのがアイデア
GD.pmをJavaScriptから使う例
new Perl('GD::Graph::' + gi.klass, 500, 400);とかできる
jsplコマンドjs <-> Perlのインタプリタ
デモのソースコード
http://ajaja.alphageek.jp/trac/browser/trunk/ajaja/pmconnect/samples/gdgraphuc2.js
FastCGIをJSで、すげー
http://ajaja.alphageek.jp/trac/browser/trunk/ajaja/pmconnect/samples/fcgi.js
SQLite
http://ajaja.alphageek.jp/trac/browser/trunk/ajaja/pmconnect/samples/sqlite.js
javascript で DBICとかできる??
JSANというのがあるらしいがあまり活発ではないらしい、なのでこれはすごい有効
データの相互変換
http://project-p.jp/halt/sandbox/js/pm.cgi
[これはすごい]

■実践 MogileFS 構築事例 〜 Catalystと一緒 〜 (ZIGOROuさん)

ストレージ神経使う<それMogileFSでできるよ
danga.com(SixApart)で開発された
作者はブラッドさん、池面ハッカー
LiveJournalやvoxで使われている
まだ運用実績が少ない
使える言語は公式ではPerl
client ネットワークを介したハンドル
trackersが司令塔、状態をdabaseで管理
mysql database cluster
storage node 、DAVサポートhttpd
イメージ(中国語w)
http://tk.files.storage.msn.com/x1pM0jCSUoiRhDgmdS6cLmNXUWHwGWGrFw2xYRkmdTAkNBbubhl2_DHwi1WBT6lGyo0kWxWy67uDeSQmFxY6mF2da_Hg04W-v-XiY04JeE9csExxHxbFaUNgEmu8tVm7n62RBtgi2ISzxA
コマンド、mogtoolを使ったデモ
失敗することがあるからレプリケーションを増やしておいた方がいい
Client、Constructorのパラメーターにドメインを指定
newa_file methodでファイルを作成…、rename keyからkeyへ
Catalystと一緒の場合
アップロードのプロセスに使ったら便利そう、でもちょっと無謀だった
ファイルアクセス、Helper作ったら便利そう
利点は分散ファイルシステムかな
実運用しているさせている方がいたらお知らせを
その一つ: http://www.sixapart.jp/techtalk/2006/10/dev_mogilefs.html
http://code.sixapart.com/cgi-bin/viewcvs.cgi/?root=TheSchwartz
code six apartに、[ソース嫁] … by miyagawaさん

■Lightning Talks

▼Using Test::Base (miyagawaさん)
お知らせ、miyagawaさんビザを取得したので11月よりSix Apartの本社で働く!!
というわけで今後、Shibuya.pmのリーダーはtakesakoさん
Test::Baseの話
データドリブンのテストフレームワーク
Test::Moreと互換性がある
データセクションの中にどんどんテストを書いていく
__END__のあとでYAMLを書く
evalしてchompする
独自のfilterがあって、まとめるfiltersってのがある
Test::BaseでテストできるのがいいAPI
http://blog.bulknews.net/mt/archives/Test-Base.pdf
http://yapc.kwiki.org/data-driven-testing/start.html
▼ppm パッケージができるまで (charsbarさん)
Perlの枠を超えたDeployツール
モジュールに依存していると弱いので、PPMに過大な期待をしないように
PPM::MakeとかでWinに対応しないとかCygwinのTarとか使う
いろいろ苦労している
テストがこけたとき、古いModule::InstallとかKwalitee偽装とかだったり
▼俺とマッシュアップ (上野宣さん)
携帯から位置情報を定期的に送るってのをやりたい
サーバーからとりたい
Wilcomでもできるけどー、年間27万円!?
ここだよ、見つけて!ってのは月額1000円
この画面に緯度とか経度とか入っている
[それPla][俺Pla?]
JSONあたりで発信する
俺を世界へ
誰でも俺の位置を把握できる
「俺とマッシュアップしませんか?」というのがこれからのWeb2.0時代の口説き文句
▼今空前のブーム第2部:deploy tool編 (松野徳大さん)
もうブームは去った??
みんな飽きちゃった
deploy toolとはサーバに配置してただそれだけ
svn up / rsync / apache
Ruby on Railsだとカピなんたら
ぼうM社とかL社とかPlagger風のやつを作ったw
それを公開してみようと
Plagger風とは設定がYAMLとかなんでもやろうとしようとか、最先端とか
Archerという名前で作っている
init初期化、Notify::IRC、deploy開始しますよーとアラート、MySQLDiffとか
http://code.mfac.jp/trac/
▼CDBI to DBIC (nekokak:小林篤さん)
PerlのO/Rマッパー
DBIxクラス、その違いは
コネクションは違う
Class::DBIはクロージャ、コネクションをIma::DBIが管理
set_sqlだと別のコネクションを使う
DBIx::Classはインスタンス
connection_infoにコネクション情報、$scheema経由でCRUDを実行できて
感嘆にコネクションをわけることができる
必要なデータを必要な回数だけでとってこれる
データを取得するレンジを簡単に設定できる
JOINも簡単にできる
▼自然文書から日本の住所を頑張って抽出 (Yappo)
Geography::AddressExtract::Japanという日本語住所抽出モジュールを作ったときの話
位置情報が活発だから、ジオコーダ使いたい、自然文から抽出したい
Regexp::Assembleを使う
人間の書いた文章はゆらぎが多いのでノーマライズ
もうちょっとやってCPANにあげたい
http://tech.yappo.jp/docs/20061020shibuya.pm/
▼SVK による Plagger プラグイン開発プロセス (mizzy)
というか…SVKの使い方
2つのSVNレポジトリがあったときに
コピるのが面倒、SVKでやれば
Subversionに実装されたPerlの分散
ミラーブランチを作る、ローカルブランチを使う、バッファとしてローカルブランチを使う
ローカルブランチからチェックアウトして
svk mergeが超便利!
構成が複雑になるけど操作の手間は増えない
でもcp使うよりか楽ですよー、オフラインコミットできる
▼Apache わっふるモジュールで SQL injection 対策 (竹迫良範)
空前の脆弱性ブーム、警告
APIやJPCERT、、、できるけ穏便に
PHPは攻撃対象にされやられやすい
Xoops Protector
Suhosin、セキュリティ強化版PHP
アプリケーション側の対応もしっかり、他人任せはよくない
SQLインジェクションの脆弱性が多くなっている
大人の事情があって直せない場合があるよ
修正したらテストが必要だったり、社内でメンテナンスできないとか
WAFFull
Web Application Firewall
ウェブサーバーとブラウザの間に挟む
Apacheのモジュール、mod_waffull
httpd.confえロードしてフィルターをする
デフォルトのcahrsetを設定できて、それ以外をはじくとか
全体に対してフィルターをかけることができる
アプリケーションごとにホワイトリストを書いていく
Catalyst::P::FormValidatorなどあるがApache2のモジュールなのでプログラミング言語に非依存
mod_securityはブラックリスト方式
バージョンアップができない場合あるので、ワークアラウンドの提示方法があったり
脆弱性を指摘する人が防御ファイルも一緒に作ってくれたらいいな
miyagawaさんがShibya.pm永年名誉顧問に就任

Perlで映像ファイルのサムネイルを作成する

FFmpegとFFmpeg::Commandを組み合わせた。丁度半分の時間でサムネイルを作る。 ちなみにFFmpegはインストールする時テストでこけたけど、無理やり入れて動いた。

#!/usr/bin/perl

use FFmpeg;
use FFmpeg::Command;
use strict;

my $filename = "test.wmv";
my $jpgname = "test.jpg";

my $ff = FFmpeg->new();
my $ffc = FFmpeg::Command->new('/usr/local/bin/ffmpeg');

$ff->input_file($filename);
my $sg = $ff->create_streamgroup();
my $duration = $sg->duration();

$ffc->input_file($filename);
$ffc->output_file($jpgname);
$ffc->options(
                            '-y',
                            '-f'       => 'image2',
                            '-pix_fmt' => 'jpg',
                            '-vframes' => 1,
                            '-ss'      => $duration/2,
                            '-s'       => '160x120',
                            '-an',
                            '-deinterlace',
                    );
$ffc->exec();

2006年10月23日

Turn your MT into Youtube Base! / MTをYoutubeみたいにしちゃう

以前miyagawaさんがBlogで「Turn your MT into Google Base!」と題して、MovableTypeをRightFieldsというプラグインを使ってGoogle Baseにしてしまうという記事をポストしていました→RightFields - Turn your MT into Google Base!: blog.bulknews.net。 今回、紹介するのはそのRightFieldsプラグインを利用してMTをYoutube Baseにしてしまうというハックです。

どんな機能かというとMTの管理画面からエントリーを編集するように、映像をアップロードできて、それに対するテキストやタグ付けなどを行って、エントリーを保存すると自動的に映像をFlash形式に変換してくれて、Youtubeのようにウェブで映像が見れるというものです。さらにサムネイル画像を作ることもできます。

というか自分で自作のネタ映像を自前のサイトで公開したいから作りました。実際にできたサイトはこちらになります→yusukebeビデオ

video.gif

で、実際にどうやってるかというと、RightFiedsプラグインと独自のPlugin(Video.plという名前)を用意します。VideoプラグインはFFmpegモジュールとFFmpeg::Commandモジュールが必要です。これはちょっと敷居が高いかもしれないですね。というわけでエンコードにはFFmpegを使います。 次にRightFiedsでsourceというfile形式のExtraフィールドを作ります。これを使ってソースとなるビデオをアップロードします。そして独自のVideoプラグインは以下のようなコードになっております。ちょっと設定とか.plファイルに直接書き込むようになっていて作りが甘いですがちゃんと動きます。Videoプラグインは以下のようになります。

package MT::Plugin::Video;

use strict;
use MT;
use MT::Entry;
use MT::Log;
use FFmpeg::Command;
use FFmpeg;
use Data::Dumper;

use lib qw(/path/to/mt/plugins/RightFields/lib);
use RightFields;

my $blog_id = '1';
my $archive_path = '/path/to/archive/';

my $ffc = FFmpeg::Command->new('/usr/local/bin/ffmpeg');
my $ff = FFmpeg->new();

my $log = MT::Log->new;
my $plugin = new MT::Plugin({
                                                         name => "Video",
                                                         version => '0.01',
                                                         author_name => "Yusuke Wada",
                                                         author_link => "http://yusukebe.com",
                                                 });
MT->add_plugin($plugin);
MT::Entry->add_callback('pre_save', 1, undef, \&pre_save_hdlr);

sub pre_save_hdlr {
    my ($eh, $entry) = @_;
        my $cfg = RightFields::blog_data('extra', "$blog_id");
        my $obj = RightFields::new_obj($cfg,$entry->id);
        my $column_value = $obj->column_values();

        #ビデオファイル名を取得
        my $source_video = $column_value->{'source'};
        trace($source_video);
        #エントリーIDを取得
        my $entry_id = get_entry_id($entry->id);
        trace(encode($archive_path . $source_video,$entry_id));
}

sub get_entry_id{
        my $old_id = shift;
        my $zero_num = 6 - length($old_id);
        my $new_id = "0" x $zero_num . $old_id;
        return $new_id;
}

sub encode{
        my ($input,$entry_id) = @_;
        $ffc->input_file($input);
        #output flv
        $ffc->output_file($archive_path . $entry_id .".flv");
        $ffc->options(
                                         '-y',
                                         '-f' => 'flv',
                                         '-s' => '320x240',
                                         '-ar' => '44100',
                                         '-deinterlace',
                                 );
        my $result = $ffc->exec();

        #output mp4
    $ffc->output_options({
        file  => $archive_path . $entry_id .".mp4",
        device => 'ipod',
    });
        $ffc->exec();

        #output jpg
        $ff->input_file($input);
        my $sg = $ff->create_streamgroup();
        my $duration = $sg->duration();
        
        $ffc->input_file($input);
        $ffc->output_file($archive_path . $entry_id .".jpg");
        $ffc->options(
                                    '-y',
                                    '-f'       => 'image2',
                                    '-pix_fmt' => 'jpg',
                                    '-vframes' => 1,
                                    '-ss'      => $duration/2,
                                    '-s'       => '120x90',
                                    '-an',
                                    '-deinterlace',
                            );
        $ffc->exec();        
        
        
        return 1;
}

sub trace{
        my $string = shift;
        $log->message($string);
        $log->save();
}

flvだけじゃなくてmp4も書き出しています。ファイルは設定したアーカイブページに6桁のエントリーIDをベースとしたファイル名で保存されます。なので flvファイル、mp4ファイル、jpegファイルには

path/archive/<$MTEntryID pad="1"$>.flv

とかでアクセスできます。これをFlash Playerの引数にしたり、Podcasting向けにRSSのenclosureに設定したりすれば立派な動画配信サイトができます。

実際にちゃんと動いて感動。Youtubeをはじめ、こういうインフラはもうすでにたくさんあるのでニーズは少ないだろうが、自分でシステム作るのもまた楽しい。

2006年10月27日

昨日買った本、「エンジニアのための時間管理術」とかWeb2.0の本

昨日東京にいったついでに八重洲ブックセンターで買ってきた本。 「エンジニアのための時間管理術」は原題が"Time Management for System Administrators"になってて、一般の人のタイムマネージメントの本じゃないところがポイント。結構面白そう。WEB+DB PRESSはnaoyaさんの記事がO/Rマッパーの件でそこが萌え。次回のDBICに期待。

エンジニアのための時間管理術 エンジニアのための時間管理術
  • Thomas A. Limoncelli 株式会社クイープ
  • オライリー・ジャパン 単行本(ソフトカバー)
  • Amazonで詳しくみる
WEB+DB PRESS Vol.35 WEB+DB PRESS Vol.35
Web2.0への道 Web2.0への道
Web2.0 キーワードブック Web2.0 キーワードブック

About 2006年10月

2006年10月にブログ「Yusukebe::Tech」に投稿されたすべてのエントリーです。過去のものから新しいものへ順番に並んでいます。

前のアーカイブは2006年9月です。

次のアーカイブは2006年11月です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。


ブログSEO対策:track word seo