2013-09-19 Thu

YAPC Asia 2013 前夜祭 に参加した

2日前からやってる実装がまだ終わらないため前夜祭に行くか悩んでいたら、隣の席のTさんが「行かないんですか?」と言うので、YAPC Asia 2013 前夜祭 に参加してきた。

- YAPC::Asia Tokyo 前夜祭はLTソン!
-- http://yapcasia.org/2013/07/ltthon-is-coming-back-for-one-night.html

9/19 18:00頃から2〜3時間(時間はまだ予定)ほどLTソンが行われます。とにかく時間と発表のある限りLTを続けるという企画。YAPC本編ではまだ敷居が高いなーなんて思っている人に是非参加して欲しいイベントです。皆さんも5分話すネタを持ってくれば飛び込みでLTができるはず!


会場は慶応大学の日吉キャンパスにある協生館という建物の2Fのホール。

続きを読む

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2013-08-29 Thu

CentOS に Digest-MurmurHash3 をインストールするとき

PerlモジュールのDigest::bBitMinHashではMurmurhash3のハッシュ関数を利用している。
Murmurhash3はC++で書かれているけど、もしもバインディングがあるなら
最初はPerlだけで済ませようとbBitMinHash.pm内でuse Digest::MurmurHash3した時の話。

以下はDigest::MurmurHash3-0.01にのみ有効な情報。

続きを読む

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2013-04-10 Wed

PhantomJS を Selenium::Remote::Driver から使う

少し前から PhantomJS を Selenium::Remote::Driver から使っている。
PhantomJS + Wight も試したけど、今のところ Selenium::Remote::Driver の方が好き。

- PhantomJS
# コマンドラインから操作できるWebKit
# 1.8 からGhost Driver(WebDriver Wire Protocolを実装したhttpd) が組み込まれた

- Selenium::Remote::Driver - search cpan org
# WebDriver Wire Protocolのクライアント
 
意外と便利なので今後も使う。

続きを読む

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2010-06-30 Wed

CentOS 4.8 上で perlbrew install するときは /usr/include/poll.h をリネームしておく

CentOS 4.8 上で「perlbrew install 任意のバージョンのPerl」を実行したら、コンパイルエラーでインストールできなくなっていました。

perlbrew は任意のバージョンのperlを$HOME(自分のホームディレクトリ)以下にインストールするためのアプリケーションです。
レンタルサーバや研究室など複数人で計算機を共有する場合に、他人に影響を与えずに任意のバージョンの Perl をインストールできるので重宝します。

perlbrew のインストール方法をについては『「perlbrew」と「cpanminus」と「local::lib」を使って、さくらのレンタルサーバで任意のバージョンのPerlを使う』 [2010-04-24-1] という記事に書きました。

さて、本題に戻ってログを見てみると、ざっと以下のようになっていました。

$ tail -f $HOME/perl5/perlbrew/build.log
(中略)
IO.xs: In function `XS_IO__Poll__poll`:
IO.xs:249: error: Invalid application of `sizeof` to incomplete `pollfd`
(省略)


このようなエラーが出ているためインストール時にエラーが出た Perl のソースを grep してみたところ、/usr/include/poll.h と /usr/include/sys/poll.h をチェックしているようです。で、存在していたら優先的に include される前者の /usr/include/poll.h が不具合の原因かもしれないと思い、ファイル名を変更したところ、perlbrew install できました。force オプションは付けなかったので sys/poll.h が include されて IO.xs から成生された IO.c を正常にコンパイルできたのでしょう。

なんで、include/poll.h は駄目で、include/sys/poll.h が大丈夫なのかは深追いしてない分かりませんが、検索エンジンで検索しても同じエラーが出た起きていることを書いている人が1人しか見つからないので、非常に稀な問題でハマってるのかも。。。
素直に CentOS 5.x 系を使っていれば起きない問題なのかもしれませんね。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2010-04-17 Sat

Perl で配列の要素を回転させる

Perl で配列の要素を回転させるときのコードってどんなんかな?、と頭の中でコードを思い浮かべたので、メモ。

rotate($$) は配列を回転する処理です。第一引数に配列のリファレンスを与えます。第二引数に第一引数で与えた配列の要素のうち回転後の配列で先頭になって欲しい要素番号を与えます。出力としては、例えば、配列 (1, 2, 3, 4, 5) のリファレンスと、2 という配列の添字を rotate() に与えると、配列 (3, 4, 5, 1, 2) のリファレンスが得られます。

実際には rotate() を for 文で繰り返しおこなって全ての回転を得たり、重複を取り除いたりする処理とあわせて使うのかな。文字の回転だったら、substr で全部やれるし、入力と出力が同じ長さになるから、もっと簡単に書ける気がします。

コメントを書く変わりに長い変数名に意味を込めました。第二引数で与えられた引数が第一引数で与えられた配列の範囲外だったり、第二引数で与えられた引数が負の値だった場合には無言で第一引数を返してます。場合によっては警告を出したほうがいいかも。そもそもrotate()を呼ぶより前にチェックしとけばいいですね。

#!/usr/bin/env perl                                                    

use strict;
use warnings;
use utf8;

use YAML;

sub rotate {
    my ($seq_arr_ref, $start_att_num) = @_;
    my @result_arr = ();
    my $last_att_num = $#{$seq_arr_ref};
    my $diff_num = $last_att_num - $start_att_num;
    if (($diff_num >= 0) && ($last_att_num > 0) && ($start_att_num >= 0)) {
        my $cursor = 0;
        for (my $i = 0; $i <= $last_att_num ;$i++) {
            if (($diff_num - $i) >= 0) {
                $result_arr[$cursor] = $seq_arr_ref->[$start_att_num + $i];
            }
            else {
                my $abs_i = (($diff_num - $i) * -1) - 1;
                $result_arr[$cursor]  =  $seq_arr_ref->[$abs_i];
            }
            $cursor++;
        }
    }
    else {
        @result_arr = @{$seq_arr_ref};
    }
    return \@result_arr;
}

sub fetch {
    my @sample_arr = (
               ['a', 'a::b', 'a::c', 'd', 'c::f'],
               ['a::d', 'c', 'b::c', 'a::e'],
               ['e::f', 'a::b', 'd::f', 'c', 'b'],
               ['e', 'a::f', 'c', 'b', 'c'],
              );

    foreach my $sequence_arr_ref (@sample_arr) {
        print Dump &rotate($sequence_arr_ref, 3);
    }
}

&fetch();


実行すると、以下のようになります。

---
- d
- c::f
- a
- a::b
- a::c
---
- a::e
- a::d
- c
- b::c
---
- c
- b
- e::f
- a::b
- d::f
---
- b
- c
- e
- a::f
- c


こういうのをブログに書いておくとペタっと貼れていい感じ。

次は順列を得るコードが欲しくなってきたなぁ。

コンピュータサイエンスのための 離散数学入門 : 第2版

[Amazonで詳細を見る]

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2010-01-20 Wed

PerlのXSはじめました(1)

XSについて学びはじめました。えええ!!いまどきXS!?と思う人もいるとは思いますが、ちゃんと理解してなかったのは本当なのでしょうがない。これまで何回か学んでは中途半端で止まってしまっていたので、今回はきっちり区切りがよいとこまで終わらせます。

今まではPerlから共有ライブラリを扱うときにはSWIGを使っていました。でも、なんかSWIGって生成されるコードが一見してもよく分からないし、Rubyバインディングを書いたときのような歯車が噛み合った感なんかは皆無です。ぜんぜん気持ちよくないのです。

ということで、耐えられなくなったことを機にXSをちゃんと理解して使いこなしたいと思ったのでした。以下の資料を読めるところから読み始めました。

読み始めた資料


モダンPerl入門

[Amazonで詳細を見る]


- perlxs
-- XS言語のリファレンス
- perl
-- XSUBのチュートリアル
- perlguts
-- Perlコアの基本動作、Perl PAIの使い方

今後しばらくつづく。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2009-02-13 Fri

指定フォルダ以下の画像を、一辺が指定長の正方形に加工するPerlスクリプト

縦横長がバラバラの画像集合を全部まとめて、
「50x50」とか「100x100」とかの正方形画像に加工したくなりました。

画像フォルダの指定、出力フォルダの指定、一辺の長さの指定、
をするとモリモリと正方形画像を生成します。

とりあえず自分の用途では動いたのでアップ。

#!/usr/bin/perl

use strict;
use warnings;

use App::Options(
  option => {
    indir => "type=string; required; default=Unknown;",
    outdir => "type=string; required; default=Unknown;",
    type => "type=string; required; default=Unknown;",
    width => "type=integer; required; default=Unknown;",
    debug => "type=boolean",
  },
);

use Image::Magick;
use Path::Class;

my $image = Image::Magick->new;

my $dir = Path::Class::Dir->new($App::options{indir});
while (my $file = $dir->next) {
  my $absin = $file->absolute;
  my $image = Image::Magick->new;
  next unless $absin =~ m|$App::options{type}$|;
  $image->Read($absin);
  my ($now_width, $now_height) = $image->Get('width', 'height');
  my ($x_start, $y_start, $x_width, $y_height);
  if ($now_width < $now_height) {
    my $retio = $App::options{width} / $now_width;
    my $new_height = int($now_height * $retio);
    $image->Resize(
      width => int($App::options{width}),
      height => int($new_height),
      blur => 0.9
    );

    ($now_width, $now_height) = $image->Get('width', 'height');
    if ($now_width < $now_height) {
      $x_start = 0;
      $x_width = 0;
      my $margin = int(($new_height - $App::options{width}) / 2);
      $y_start = 0;
      $y_height = $margin ;
      $image->Crop(geometry=> $x_start."x".$y_start."+".$x_width."+".$y_height);
      $image->Crop(geometry=> $x_start."x".$y_start."+".$x_width."-".$y_height);
    }
  }
  else {
    my $retio = $App::options{width} / $now_height;
    my $new_width = int($now_height * $retio);
    $image->Resize(
      width => int($new_width),
      height => int($App::options{width}),
      blur => 0.9
    );

    ($now_width, $now_height) = $image->Get('width', 'height');
    if ($now_width > $now_height) {
      $y_start = 0;
      $y_height = 0;
      my $margin = int(($App::options{width} - $new_width) /2);
      $x_start = 0;
      $x_width = $margin;
      $image->Crop(geometry=> $x_start."x".$y_start."+".$x_width."+".$y_height);
      $image->Crop(geometry=> $x_start."x".$y_start."-".$x_width."+".$y_height);
    }
  }
  if ($absin =~ m|^.+/(.+?)$|) {
    my $filename = $1;
    my $absoutdir = Path::Class::Dir->new($App::options{outdir})->absolute();
    $image->Write("$absoutdir/$filename");
  }
}


しばらく自分で使いながらデバッグします。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2009-01-07 Wed

これから15分で Remedie を始めるための資料

Remedieを使い始めたので、さっそく手順をまとめました。

Remedie

この資料を15分くらいかけて上から下まで読み、
Mac OSX やDebian Linuxにインストールすると、
割とあっさり、Remedieが動かせると思います。

とくにMac OSX についてはサーバを用意しなくても、
Remedie Serverをインストールすれば利用準備が完了してしまいます。
また、Remedie Playerは快適なRemedie生活を助けてくれるでしょう。

Linuxサーバにインストールする場合や、
自分で全部インストールしたい場合には、
やはりコツコツとインストールする必要あります。
Remedieのインストール自体は15分で終わらない場合が多いでしょう。
# 沢山のCPANモジュールを使ってるから

Remedieとは



Remedie は Perl で書かれたプラガブルな
メディアセンターアプリケーションです。

Plaggerを生んだ、miyagawaさんによるアプリです。

- Plagger - Trac
-- http://plagger.org/trac

Remedieに、さまざまな動画ファイルの更新情報を登録することで
Remedieは、自分のお気に入り動画で埋め尽くされた
自分専用の動画閲覧インターフェイスになってくれます。

プラガブル、を簡単に言うと、
何か自分好みの機能を追加する際に、
Remedieのプラグインとして必要な
最小限のコードを書くだけで、
その機能を実現できる仕組みです。

Mac OSX で Remedie を使いたい場合


miyagawaさんが、Remedie ServerというOS Xアプリ化されていて、
アイコンをダブルクリックだけで、Remedieサーバーを起動できるバイナリを公開しています。

ですので、Mac OSX で Remedieを使う場合、必要な手順は大きく2つだけです。

1、Remedie-Server をインストール
2、Remedie-Server を起動してブラウザでアクセス

もしも、便利にRemedieを閲覧したい場合は、drikinさんが作ったRemedie Playerを使うために、

3、Remedie-Player をインストールして起動する

を行なうと良いでしょう。

1、Remedie-Server をインストール

Remedie-Serverにアクセスして、
一番新しい「Remedie-Server-xx.xx.xx-leopard.zip」をダウンロードしましょう。

Remedie-Server

僕は「Remedie-Server-0.6.18-leopard.zip」を試しました。

ダウンロードしたらファイルを解凍します。
解凍するとできるディレクトリ内の「Remedie Server」を適当な場所に移します。
# 「アプリケーション」ディレクトリなど。

Remedie Server

その後、Remedie Server を実行します。

Remedie Server起動

こんな感じになったら起動完了です。

2、Remedie-Server を起動してブラウザでアクセス

起動できたら、http://localhost:10010/にアクセス!

Remedie-Serverの起動確認

おお!ばっちりですね。ばっちりです!

3、Remedie-Player をインストールして起動する

毎回 Remedie Server を起動した後ブラウザでアクセスするのが
面倒な方には、Remedie Playerをオススメいたします。

@drikin さんのRemedie-Playerをダウンロードしましょう。

Remedie-Playerのダウンロード

僕は「Remedie_Player-0.9.zip」を試しました。

ダウンロードしたらファイルを解凍します。
解凍したらできるディレクトリ内の「Remedie Player」を適当な場所に移します。
# 「アプリケーション」ディレクトリなど。

Remedie Server

その後、Remedie Player を実行します。
このとき、もしもRemedie Serverが起動していなければ、Remedie Serverが起動されます。

Remedie ServerとPlayerが起動された

こんな感じになると、以下のようなウィンドウが表示されて、Remedieを利用することができます。

Remedie Player 動作確認

Remedie Playerは「command+F」でフルスクリーンになってるのが素敵です。
詳しくは、以下の記事をご覧下さい。

Remedie Serverを、何回起動しようとしても起動できない時は?

ときどき、Remedie Serverの終了をうまくできないときがあるのですが、
そんなときに気が使いないで Remedie Serverを起動しようとすると
起動しても起動しても起動しないということになります。

そんなときに、ターミナルで「ps ax|grep remedie」してみると、

$ps ax|grep remedie
15846 ?? Ss 0:03.85 /usr/bin/perl /XXX/XXX/Remedie Server.app/Contents/Resources/bin/remedie-server.pl


のように、終了したはずの Remedie が立ちあがっている場合があります。
このような場合は、この remedie-server.pl のプロセスを kill すれば良いでしょう。

以上で、Remedie Server と Player を使った利用の説明は終了。
Remedie を楽しんで下さい!!

Mac OSX 以外で Remedie を使いたい場合や、コードを読みたい場合


簡単に使うだけならバイナリをインストールして起動すれば良いと思います。

Mac OSX 以外でコードを読みたい・中身をいじくりたい場合や、
Remedie を自宅で起動しておいて、出先でアクセスしたいとか言う場合は、
Remedie のソースコードを取得して自分の環境に合わせて
インストールやら設定やらすることになると思います。

この資料で行なう、初回のインストールでは
ソースを追加したり、いじくらないでも、
適当な動作や結果を得ることができそうです。

Remedieのチェックアウト

最近のremedieを自分で何とかして使いたいという人はgitを使いましょう。

- miyagawa's remedie at master — GitHub
-- http://github.com/miyagawa/remedie/tree/master

git使ってないし、別にちょっと動けばいいよ、という人は
この節は飛ばしちゃってください。

さて、gitをインストールしていない人は以下のような感じで、とりあえず入れちゃいましょう。

Debian Linuxの場合はお手軽にインストールできます。

% apt-get install git
% apt-get install git-core
% update-alternatives --config git

2の「/usr/bin/git-scm」を選択する。


これで終了。次はMacOSX。

Mac OSXの場合は、git-osx-installerという便利そうなものもありますね。

- git-osx-installer
-- http://code.google.com/p/git-osx-installer/

もしXcodeをインストールしてあるなら、
以下を確認して、最新っぽいtar.gzファイルをもってきて
自前でコンパイル、インストールしても良さそうです。

- Index of /pub/software/scm/git
-- http://www.kernel.org/pub/software/scm/git/

今回は後者にチャレンジ。
今日の時点では、最新バージョンは1.6.4っぽかった。

% wget http://www.kernel.org/pu% b/software/scm/git/git-1.6.4.tar.gz
% tar xfvz ./git-1.6.4.tar.gz
% cd git-1.6.4
% ./configure prefix=/usr/local # prefixはお好みに
% make
% make install # make でエラーになってなかったらね


which してgitが見つかったら大丈夫。

% which git
/usr/local/bin/git


あるある。

gitのインストールって気を使うべきことが多いですが、
とりあえずRemedieが使えればいいんだ、という立場を崩さず、
とっとと先に進みます。

remedieのgithubに書いてあるClone URLを入力してgit cloneします。

- MacOSXの場合ね。
% git clone git://github.com/miyagawa/remedie.git
Initialized empty Git repository in /Users/**/home/remedie/.git/
remote: Counting objects: 3836, done.
remote: Compressing objects: 100% (1324/1324), done.
remote: Total 3836 (delta 2298), reused 3793 (delta 2275)
Receiving objects: 100% (3836/3836), 906.29 KiB | 134 KiB/s, done.
Resolving deltas: 100% (2298/2298), done.


ls して、「remedie」ディレクトリを確認できましたか?
できたらOK。

もしもRemedieがアップデートしたら、
git cloneでできたディレクトリ内でgit pullしましょう。

$ git pull
Already up-to-date.


こうなったら、最新の状態になっている。

いきなり起動はできない。CPANモジュールをインストールしよう


起動する前に必要なことは、remedie/HACKINGに書いてある。

- remedie/HACKING
For now, run
  > rm -r ~/.remedie
  > perl -Ilib -MRemedie::DB::Schema -e 'Remedie::DB::Schema->install'


でも、大概の場合、Remedieで必要なモジュールが不足で、
この操作を完了できないと思います。

ということで、ビシビシとモジュールを入れます。

perl -MCPAN -e shell して
それから、installしまくります。

Makefile.PLを加工するのが面倒だったので、(何でだろう)
以下のエントリからモジュールのリストをコピーさせてもらい、
足りないモジュールを付け足しました。

- Remedie を試してみる #3 - Holidayworking::Diary
-- http://d.hatena.ne.jp/holidayworking/20081203/1228230236

実際のインストール時のコマンド履歴が以下。

$  perl -MCPAN -e shell

中略

install Module::Install
install Feed::Find
install FindBin::libs
install HTTP::Engine
install Image::Info
install JSON::XS
install Log::Log4perl
install MIME::Types
install MooseX::ConfigFromFile
install MooseX::Getopt
install Path::Class
install Rose::DB
install Rose::DB::Object
install String::CamelCase
install XML::RSS::LibXML
install DBD::SQLite
install Log::Dispatch
install File::Find::Rule
install XML::Atom
install XML::Feed
install Template
install DateTime::Format::ISO8601
install MooseX::ClassAttribute
install File::Find::Rule::Filesys::Virtual
install HTML::ResolveLink
install HTML::Selector::XPath
install YAML::Syck
install Cache::FileCache
install Web::Scraper
install HTML::Scrubber
install Path::Class::Unicode
install Text::Tags::Parser
install String::ShellQuote
install XML::OPML::LibXML
install XML::LibXML::Simple
install Encode::JavaScript::UCS
install AnyEvent
install AnyEvent::HTTP
install Coro
install EV
install Devel::LeakGuard::Object
install HTML::TreeBuilder::LibXML
install HTTP::Parser
install Net::Rendezvous::Publish
install Net::SSLeay
install Term::Encoding
install Any::Moose
install MouseX::ConfigFromFile
install MouseX::Getopt
install MouseX::Types::Path::Class
install Mac::AppleScript
install File::Spotlight
install Net::Rendezvous::Publish::Backend::Apple


もしも、これでモジュールが揃っていれば、
以下のようにperl Makefile.pmしたときに
エラーもなくfinishすると思います。

最近のRemedieでは「いまMac OS Xを使っているなら、Remedie Server.app があるよ。そっちの方が開発者じゃないならかなりオススメだよ」というメッセージが出てきます。

$ perl Makefile.PL
---------------------------------------------------------------

You're trying to build your own Remedie using Makefile.PL on Mac OS X.

There's a binary .app package available at http://github.com/miyagawa/remedie/downloads
and it is hightly recommended to install the binary unless you're a developer.

---------------------------------------------------------------
include /root/remedie/inc/Module/Install.pm
include inc/Module/Install/Metadata.pm
include inc/Module/Install/Base.pm
include inc/Module/Install/TestBase.pm
include inc/Module/Install/Include.pm
include inc/Test/Base.pm
include inc/Test/Base/Filter.pm
include inc/Spiffy.pm
include inc/Test/More.pm
include inc/Test/Builder.pm
include inc/Test/Builder/Module.pm
include inc/Module/Install/WriteAll.pm
include inc/Module/Install/Makefile.pm
Writing META.yml
include inc/Module/Install/Win32.pm
include inc/Module/Install/Can.pm
include inc/Module/Install/Fetch.pm
Writing Makefile for Remedie


足りないモジュールがあるときは、
以下のようにエラーがでます。

WARNING WARNING WARNING WARNING WARNING WARNING


足りないモジュールは、インストールしましょう。

ひとしきり、モジュールをインストールした後に
makeをして足りないモジュールが無いかさがします。

$ make
$ make test


間違っても、make installしないようにしましょう。

DBD::SQLite を別パッケージにして上書きしよう


DBD::SQLiteに、ちょっくら不具合があるらしい。

上記のインストールだけでは、
RemedieにRSSを登録しようとしたけれど、

closing dbh with active statement handles at /usr/local/share/perl/5.8.8/Rose/DB.pm line 842.


みたいなエラーがでて、Remedieが止まってしまう。。

この解決方法は、以下のように

- DBD::SQLite で closing dbh with active statement handles になる件のまとめとその解決方法について - TokuLog 改めB日記
-- http://d.hatena.ne.jp/tokuhirom/20080727/1217140312
【現状での現実的な解法】
DBD::SQLite::Amalgamation


と書いてあるので、使う。

DBIのバージョンが低い場合があるので、
ちゃんと最新にしておく。

install DBI


そのうえで、codereposからDBD::SQLite::Amalgamationを取ってくる。
さらにインストールまでやってみる。

$ svn co http://svn.coderepos.org/share/lang/perl/DBD-YASQLite/trunk/ ./DBD-YASQLite
cd DBD-YASQLite
$ perl Makefile.PL
$ make
$ make test
$ make install


はい、できたー。

とりあえず動かしてみよう。

とりあえず動かしてみます。

まず、初回なので以下をやって、

For now, run

  > rm -r ~/.remedie
  > perl -Ilib -MRemedie::DB::Schema -e 'Remedie::DB::Schema->install'


次に、以下。

perl -Ilib .bin/remedie-server.pl


エラーが起きなければ、問題ないです。

http://localhost:10010/にアクセスしましょう。

これが起動したばかり。

Remedie

ちなみに、Remedieは、

- NHKオンライン|RSSについて
-- http://www3.nhk.or.jp/toppage/rss/

などの動画も取得できるので、割と便利。

やってみましょう。

Remedie

その結果、以下のような感じになりました。

Remedie

Remedieは立ち上がってしまえば、非常に簡単です。

ローカルポートに転送するプロキシ

今後は、外出先からでもRemedieを使えるように、
Webサーバから10010番ポートに転送される設定を書きます。

今回はlighttpdを使っています。

remedieはローカルホストの10010ポートに立ち上がるので、
外出先からアクセスできるように、
自宅サーバのlighttpdのproxyに設定を追加する。

lighttpdはaptで入れてしまった。

/etc/lighttpd/lighttpd.conf
server.modules = (

任意のモジュール

  "mod_proxy",
  
任意のモジュール
  
)


その上で、以下を追記する。

/etc/lighttpd/conf-enabled/10-proxy.conf
   $HTTP["host"] == "任意のアドレス" {
    proxy.server = (
      "/" => (
        "artofmission" => (
          "host" => "127.0.0.1",
          "port" => 10010
        )
      )
    )
   }


設定を変更したらlighttpdを再起動します。

/etc/init.d/lighttpd restart


エラーが表示されることなくlighttpdが起動すれば、
すれば、remedieをローカルで立ち上げたときに、
外部から参照できるようになるでしょう。。

まとめ

今回は Remedie を動かしてみました。

Remedieは、coolirisを使ったサムネイル閲覧ができるので、
動画の量が増えたときでも便利に探せます。

Remedie

Remedieはプラグインを自分で書いて、
気に入らない挙動を修正できるのが嬉しいところなので、
今後は、そういうことをやった例についても触れます。

つづきは、あとで書く。

その他の参考文献

- Remedie使いだす - otsune's SnakeOil - subtech
-- http://subtech.g.hatena.ne.jp/otsune/20081202/remedie

- remedie からコンテンツアグリゲータに必要なことを学ぶ - Future Insight
-- http://d.hatena.ne.jp/gamella/20081122/1227283917

- ブログが続かないわけ | 週末にRemedie を試してみた
-- http://en.yummy.stripper.jp/?eid=1100711

- RemedieをFedora 10にインストール - Perlメモ - perlmemoグループ
-- http://perlmemo.g.hatena.ne.jp/fedora9/20081209/p2

- MOONGIFT: » フィードを使ってブラウザ上で動画を楽しむ「Remedie」
-- http://www.moongift.jp/2009/01/remedie/

- Remedieかなりアップデート - otsune's SnakeOil - subtech
-- http://subtech.g.hatena.ne.jp/otsune/20090112/remedieChangelog

- SetupRemedie - mizzy.org - Trac
-- http://trac.mizzy.org/public/wiki/SetupRemedie
本当に15分で Remedie を始めるための資料


- Drift Diary13: Remedie Player
-- http://blog.drikin.com/2009/06/remedie-player.html

[2009-01-08]:追記
- インストールが15分で終わらないことを明示。
- githubからcloneする方法を追記した。
- いろいろ雑なところを、付け足し。
- 本文で触れていない参考文献を追加

[2009-01-12]:追記
- 参考文献を追加
- Remedieが更新されたときにgit pullする、の話を追加

[2009-09-11]:追記
- Remedie-ServerとRemedie-Playerの話を追記しました。
-- miyagawaさん、ありがとうございました。
- その他、最近の結果を確認して記事に反映しているとこです。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2008-10-31 Fri

目黒の大和路で開催された「TpfjPreMeeting #1」の2回目に行ってきた

「TpfjPreMeeting #1」の2回目が、目黒の大和路で開催されました。

TpfjPreMeetingは、これから5年〜10年後にPerl界を今より盛り上げるために開催されています。#1は、今日を含めて全部で4回開催されます。

画像

会場で話された内容はまとめにくいですが、

- Perlに関する団体をつくることに賛成。

という雰囲気を、その場にいた全員が発していました。
僕はこれが一番の収穫だと思います。

以下はその他のログ。

- まじめモードな試合時間は30分。ロスタイム20分。よくやりました。
- 自分と異なる業種・業務の人には、常に尊敬の念をもって接しよう
- もしかして自分が嫌われていないか、と自分自身を見つめ直そう
- で、Tpfjですよ。と強引に話を戻そう
- 鳥根にしてくれよう
- 意味がわからないです、と素直を言おう。
- 地方が意外と熱いのでは?という仮定をしてみよう。
- 伝説の助っ人が自責点したような状況である。
- SuffixのCatchやQueryは便利である

何のことやらという感じですが、こんな感じでした。

まだ、4回目は人数に余裕があるので、参加していない方は是非。

- TpfjPreMeeting1 - Soozy.org
-- http://soozy.org/index.cgi?TpfjPreMeeting1

参加資格
The Perl Foundation Japanに参加したい人。日本でPerl盛り上げていきたい人。「あいつだけはTPFJの理事になって(ほしい|ほしくない)」なんて意見のある人。 人数が集まりすぎると話ができないので、6人くらいずつ、最大4回くらい開催予定。


どうでも良いけど、今日は大和路店内の至る所がハロウィン仕様のカボチャだらけ。

画像

この後、店員さんがおいしく食べるのかなぁ。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2008-10-15 Wed

日本のPerl界を盛り上げていくための 「TpfjPreMeeting #1」

id:lestrratさんが、The Perl Foundation Japanを立ち上げ、日本のPerl界を盛り上げるために動き出しました。lestrrat++。

- TPF-J 準備 - 飲み会しませんか - D-6 [相変わらず根無し]
-- http://mt.endeworks.jp/d-6/2008/10/tpfj-1.html

前々から言っていた通り、やはりTPF-Jはやりたいのです。なんかまだどれだけの規模になりえるか、とかよくわかってなくて夢物語が多いのだけど・・・。


ということで、準備飲み会が開催されるそうです。早速申し込んでみました。

- TpfjPreMeeting1 - Soozy.org
-- http://soozy.org/index.cgi?TpfjPreMeeting1
参加資格
The Perl Foundation Japanに参加したい人。日本でPerl盛り上げていきたい人。「あいつだけはTPFJの理事になって(ほしい|ほしくない)」なんて意見のある人。 人数が集まりすぎると話ができないので、6人くらいずつ、最大4回くらい開催予定。


「日本でPerl盛り上げていきたい人」という広い条件で募集してくださっているので、「行きたい!」と感じた人は申し込んでみると良いのでは。

今後も積極的にTPF-J的な動きは取り上げるようにします。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2008-09-13 Sat

UTF-8のファイルがLatin1に文字化けしてたら「Encode::DoubleEncodedUTF8」

よりによって、このChangeLogをエディタで開いたら文字化けしていました。
文字化けの具合を見ると、定番のダブルエンコード(二重エンコード)で、latin1になっていました。

そんなわけで、miyagawaさんのPerlモジュール「Encode::DoubleEncodedUTF8」で文字化けを解消しました。

続きを読む

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2008-09-12 Fri

「HTML::Template::Pro」が「HTML::Template」より、かなり早くて助かる

なかなか、HTML::Template::Proを試すのに丁度よいタスクが見つからなかったのですが、僕が使ってるchalowが「HTML::Templeate」というPerlモジュールを使っているので、早速「HTML::Template::Pro」と入れ替えてみました。

- Igor Yu. Vlasenko / HTML-Template-Pro-0.71 - search.cpan.org
-- http://search.cpan.org/~viy/HTML-Template-Pro-0.71/

結論から言うと、僕は人生を沢山損してた、と思いました。

続きを読む

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2008-09-10 Wed

HTTP::Engine のカンファレンス - HE conference #01

HTTP::Engineのカンファレンスが、いつ開かれるか分からないけど、そのうち開催されるみたいです。

- HE conference #01 - Soozy.org
-- http://soozy.org/?HEcon1

それにしても、参加者資格の範囲が広いです。

HTTP::Engine をCPANにuploadしている人
or
HTTP::Engine を開発している人
or
HyperEstraier を開発している人
or
HTTP::Engine をインストールしたことがある人
or
WSGI, Rack 関係者
or
HTTP::Engine とか Catalyst::Engine などに興味のある人
or
Catalyst キモいと思った人


「Catalyst キモいと思った人」とか、もはやPerlであることや、スクリプト言語好きかとかを超越した範囲指定ですね。

タイミングがあったら是非参加したいっす。

改訂新版 Cisco Catalyst LANスイッチ教科書: シスコ/Users/lrlab/Music/iTunes/Album\ Artwork/Cache/4BA29E726D82EFD4/03/03 システムズ株式会社 LANスイッチワーキンググループ

[Amazonで詳細を見る]

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2008-09-04 Thu

Thrift で多言語 RPC 通信を試す準備

id:naoyaさんから「Thriftいいよ」と聞いたので、使ってみることにしました。
XSやSWIGと違い、C++ でサーバアプリを書くので、実装の仕方によっては巨大なデータの読み込みや、データ構造の構築の回数を減らせるのかな、と期待しています。

でも今は、ちょっとインストール途中。
今後、暇を見つけて綺麗なメモにします。

以下が試用している資料。

WEB+DB PRESS Vol.46

[Amazonで詳細を見る]


Thriftのインストールメモ



Thriftのダウンロード

ダウンロードは以下から行なう。

- Facebook Developers | Thrift
-- http://developers.facebook.com/thrift/

Boost 1.33.1以上が必要なのでインストール


- SourceForge.net: Boost C++ Libraries
-- http://sourceforge.net/project/showfiles.php?group_id=7586

以下つづく。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2008-09-01 Mon

spritの挙動

高林さんが、プログラミング言語のsplit関数の挙動の違いについて言及していました。

- split の研究 - bkブログ
-- http://0xcc.net/blog/archives/000201.html

split 関数の挙動が言語ごとに微妙に異なると知人と話題になったので調べてみました。


PerlとRubyはsplitの第3引数に-1を与えることで、
末尾の空要素の省略を抑制するが、PythonやJavaScriptは-1がいらない、

ということを知らなかった。

JavaScriptでも-1を付けてしまいそうだったのでメモ。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2008-08-29 Fri

MacBookにGMPと、Math::GMPと、Math::BigInt::GMPをインストールするんだ

GCC4.3をコンパイルするときにGMPが必要になって気がついたのですが、
Math::BigInt::GMPってGMPを入れたら無事にインストールできますね。

- The GNU MP Bignum Library
-- http://gmplib.org/#DOWNLOAD

GMPのバージョンは4.3.2。
GMP自体は、clouderさんの記事をみたら、すんなりインストールできました。

- MacBook AirにGMPをインストールする方法 (Clouder::Blogger)
-- http://blog.clouder.jp/archives/001049.html

でも、その先が、ぜんぜんうまくいかないのです。

そもそもMath::GMPのインストールでこけまくります。

数時間悩んで仕方がないので、portsでMath::GMPをインストール。

$ sudo port install p5-math-gmp


その後、Math::BigInt::GMPをインストールしたら入った。

$ sudo cpan 'Math::BigInt::GMP'


うーん、GMPのバージョンが良くないのでしょうか。
portsは、4.2.2でMath::GMPをテストしていたのです。
でも、僕は、4.2.3をインストールしたので。うーん。

とりあえず、パフォーマンスを計測しました。

計測プログラムはdanさんのところのを使いました。

- 404 Blog Not Found:備忘録 - Intel Mac vs. GMP
-- http://blog.livedoor.jp/dankogai/archives/50712932.html

まずは、Math::BigInt::Calc。
$perl bench.pl Calc 5000
Math::BigInt::Calc at mbibench.pl line 10.
elapsed: 6.72095084190369s


次に、Math::BigInt::GMP。
perl bench.pl GMP 5000
Math::BigInt::GMP at mbibench.pl line 10.
elapsed: 0.470081090927124s


おお、全然早さが違う。あまりの早さに驚きました。

MacBookのCPUがせっかくcore2なので、これも試してみました。

- gmp-4.2.3-core2
-- http://www.geocities.jp/ct35z/gmp-core2.html
このパッチは GMP (GNU Multiple Precision Library) ver. 4.2.3 に Intel Core 2 最適化アセンブリコードを追加するものです。


インストールは無事にうまくいきました。

専用の環境を用意せずにパフォーマンスを計ってみたら、
調子が良いときは、0.01秒くらい速くなりますけど、
調子が悪いと同じくらいですから、体感速度的には誤差範囲です。

これは調子が良いとき。

$ perl bench.pl GMP 5000
Math::BigInt::GMP at bench.pl line 10.
elapsed: 0.438695192337036s


まぁ、ちょい早いのか。

とりあえず、疲れたので終了。
また同じことになるだろうから、その時考えます。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2008-08-22 Fri

Yokohama.pm - Yokohama Perl Mongers Technical Talk #2

Yokohama.pmのテクニカルトークが開催されたので行ってきました。

とても暖かいイベントでした。
スタッフの方と、会場を提供をしてくれたデジハリさんに感謝。
どうもありがとうございます。

平日の夕方に横浜ってありえないなぁ、と言いつつ、通っていた高校やバイト・パート先が横浜駅周辺にあったので、楽しみにしていました。

- Conference2 - Kwiki
-- http://yokohama.pm.org/wiki/index.cgi?Conference2

# 開催予定日
   2008/8/22(金) 18:00 Open 18:30 Start 20:30 End
# 開催予定会場
   デジハリ横浜校


カンファレンスは最初から最後まで、全体的に暖かい雰囲気。
2時間は、本当にあっという間で、ちょっと物足りないくらい。
3時間くらいだと、満足感が出そうですね。

横浜に、やる気のあるPerlユーザーが集まる場所ができたことは、とても素晴らしいことです。
横浜で開催するから来られる人も多そう。

今後もタイミングが合ったら積極参加します。

【関連リンク】
- Yokohama.pm テクニカルトーク #2に行ってきた! - dann@webdev
-- http://dann.g.hatena.ne.jp/dann/20080822/p1
- Yokohama.pm#2でLTをさせて頂きました。 - iDeaList::Writing
-- http://d.hatena.ne.jp/acotie/20080824/1219530707
- ゆーすけべー日記: Yokohama.pm tech talk #2 に行って来た&『Perlモジュールだけで挑戦「画像の物体認識類似検索」』
-- http://yusukebe.com/archives/08/08/24/200952.html

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2008-03-24 Mon

Catalystアプリを作る際のポリシー


Catalyst は Perl の Web アプリケーションフレームワーク。
そのため、

- ひな形からアプリを作る際の自由度
- Perl である故の自由度

のような自由度が絡み合って、
クールで、より多くの部分が再利用可能な、
開発、運用時にトラブルの少ない開発ポリシーは、
未だに「コレ!」というものが、あんまりないですよね。

先日というか、結構前におもしろかったのは、typesterさんの記事。

- Catalystアプリオレオレポリシー
-- http://unknownplace.org/memo/2008/02/29#e002

camr作った時点での僕のポリシーは

1. アプリ名にかかわらず設定ファイルはconfig.yamlとconfig_local.yaml
2. でも変更することがないほとんどの設定はyamlには書かない。yamlがごちゃっとするときもい
3. ForceUTF8系モジュールは使用しない。内部がきちんとutf8で統一されていれば必要ない。
4. MyApp::UtilsとかいうのでいろいろBKなことをまとめてする。uri_forを気に入るように直したり、FillInFormの挙動変えたり


この記事のブクマコメントにikebeさんが

俺は MyApp::Context って名前で BK まとめてるな。


とコメントしていたのを見ました。

Contextという単語は、僕の頭では「文脈、脈絡」みたいな感じ。
ちょっと考えると、かなりガッチリはまったモジュール名ですね。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2008-03-06 Thu

Catalyst の Model 問題

Catalyst でアプリに依存しない Model は再利用できるようにしたいです。
けれど、標準のヘルパースクリプトだと、
「MyApp::Model::*」以下に作ることになってしまいます。

そうすると、無駄に Model のパッケージ名も長くなるし、
なにより Model が Catalyst に依存することになり、
テストしにくくて死ぬってことで、良いことが無いです。

既存のモジュールを取り込むために、
Catalyst::Model::Adaptor使っても、なんかいまいちな感じ。

ということで、今日このごろの議論を眺めていると、
以下のような方向でまとまりそうです。なるほど。

- はてなブックマーク - タグ catalyst
-- http://b.hatena.ne.jp/t/catalyst?sort=eid

- Model は lib/MyApp/Model より上に単体で動作するモジュールをつくる
-- Catalyst::Model::Adaptor を使うべき?
-- いや、lib/MyApp/C/とかにモジュールを作ろう
- DB がらみは、一つのDB内で簡潔するなら、DBIC::Schemaクラスのインスタンスに書く
- 複数のDBにまたがるときはCに書いとく
- Controllerには、ロジックを書かず、ロジックを扱いたいなら、適時C以下のモジュールかDBIC::Schemaのインスタンスに投げる
- なんなら Catalyst はDispatcher用途にしか使わない
- config.ymlに頻繁に変更しない設定は書かない。基本モジュールに直書く。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2008-03-04 Tue

ファイルが更新されてたら何かするPerlスクリプト

ファイルが更新されたら何かするスクリプトを書きました。

(任意の)ロックファイルに、対象ファイルを前回処理したときの
対象ファイルのタイムスタンプを保存しておきます。
スクリプトをcronとかで回して、対象ファイルの更新時間が変わっていたら、
指定したスクリプトを走らせるという、単純なものです。

#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;
use IO::File;

my $target_file = $ARGV[0];
my $lock_file = $ARGV[1];
my $process_file = '';	
unless ($ARGV[2]) {
   $lock_file = $ARGV[0].'lock';
   $process_file = $ARGV[1];
}
else{
   $process_file = $ARGV[2];
}

unless (-e $target_file) {
    die "[error : cl_auto_compile] There is not target file to auto process.";
}
my $pre_time = localtime( (stat($target_file))[9] );

# 処理する必要が無ければ止める
if (-e $lock_file) {
    my $io = IO::File->new($lock_file, 'r') or die $!;
    my $line = $io->getline;
    $io->close;
    if ($pre_time eq $line){
	 exit;
    }
}
# 処理を書いたファイルを実行する
{
    my $io = IO::File->new($lock_file, 'w');
    $io->print($pre_time);
    $io->close;
    eval{`$process_file`};
}
exit;

# 実行方法
# ./auto_process.pl 対象ファイルのパス 処理を書いたファイルのパス
# ./auto_process.pl 対象ファイルのパス 対象ファイルのロックファイルのパス 処理を書いたファイルのパス	


たぶん、こういうの他にあると思うんですが。。。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |