タグ:Perl ( 31 ) タグの人気記事
perlXStut を少し読んでみた その2
 perlXStut(perlXStut - XSUB を書くためのチュートリアル)の EXAMPLE 4 と 5 まで写経。そろそろややこしくなってきた。

 外部のライブラリを Perl から呼ぶだけであれば、XS のコードは結構シンプルに書けるっぽいというのが、実感として分かってきた。けど、込み入ったことをやろうとすると、おまじない的お作法がいろいろあって面倒っす。
[PR]
by fkmn | 2008-07-01 23:55 | IT
perlXStut を少し読んでみた
 XS を書くためには、perlXStut を読むと良いということなので、perldoc の日本語訳(perlXStut - XSUB を書くためのチュートリアル)を読みながらサンプルコードを写経してみた。とりあえず EXAMPLE 3 まで(自分用アレンジが少し入ってます)。
 ちなみに、XS のコードは、やっぱり c-mode で書くのが普通なんだろか?インデントが微妙な感じで、ちょっと気持ち悪い。

Mytest.xs

#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"


MODULE = Mytest PACKAGE = Mytest

void
hello()
CODE:
printf("Hello, world!\n");

int
is_even(input)
int input;
CODE:
RETVAL = (input % 2 == 0);
OUTPUT:
RETVAL

double
round(arg)
double arg;
CODE:
if (arg > 0.0) {
RETVAL = floor(arg + 0.5);
}
else if (arg < 0.0) {
RETVAL = ceil(arg - 0.5);
}
else {
RETVAL = 0.0;
}
OUTPUT:
RETVAL



 そういえば、RubyKaigi で arton さんの「拡張ライブラリの書き方講座」を聞いたことだし、Ruby の C拡張も試してみようかなぁ。
[PR]
by fkmn | 2008-06-30 23:55 | IT
TechTalk漬けの日
 RejectKaigi と RejectRejectKaigi と Shibuya.pm Teck Talk #9 の動画を見て過ごす、そんな1日。

 RjectKaigi と RejectRejectKaigi は、歌って踊る人とかやる夫とかまで出てきて、いい感じにカオスだなぁ。やっぱり、最後までいればよかった。

 Shibuya.pm の方は、C言語初心者(もちろんXSなんて書いたことない)のオイラにとっては、ちょいキツめの内容だった。でも、最初の二人(ひろせさんと牧さん)の話は分かりやすかったっす。そのうち、自分でも XS を書きたいなぁ。
[PR]
by fkmn | 2008-06-28 23:55 | IT
Perl-users.jp: 日本の Perl ユーザのためのハブサイト
YAPC::Asia 2008 で Michael Schwern は「SEO に有効な独自ドメインを取って、もっと Perl 初心者が集まりやすい nice な Perl の情報を集めたサイトを作れ!」といったので Perl-users.jp ドメインを取って、ここに Perl-users.jp を開始します。
Perl-users.jp - 日本の Perl ユーザのためのハブサイト

素晴らしすぎる取り組み。Yappo++

SEO支援のため、リンク貼っておきます。
http://perl-users.jp/
[PR]
by fkmn | 2008-05-20 23:55 | IT
YAPC::Asia 2008 の感想
遅ればせながら、YAPC::Asia 2008 の感想をば。

 まず、YAPC に参加して再確認したのは、Perlコミュニティの暖かさ。冒頭の宮川さんの「ここに来ている人たちは、みんな Perlコミュニティの一員だ」という言葉に始まり、最後のSchwernの基調講演「Perl is unDead」で終わるというのがその象徴的でした。

 Perl以外の言語(JavaScript や Erlang)がメインのトークがあるというオープンさや、不満のある部分を改善していこうとする前に進む力(Mooseとか)にも、Perlコミュニティの魅力を感じずにはいられなかったです。

 やっぱり、僕がPerl好きでいるのも、こういうコミュニティの人たちがいるからなんだなぁということを改めて感じた2日間でした。

スタッフの皆様、すばらしいカンファレンスをどうもありがとうございました!
# 次は京都でお会いしましょう(笑)


 ちなみに、トークの動画が既にニコニコ動画にかなりの数あがってますね。
http://www.nicovideo.jp/tag/yapcasia2008
ホント、仕事はやすぎですw。見れなかったトークは、こっちの方で確認していこう。
[PR]
by fkmn | 2008-05-19 23:44 | IT
YAPC::Asia2008 1日目
懇親会で Larry と一緒に写真撮ってもらった!!
a0057891_231744.jpg

今年の YAPC::Asia に思い残すことはないわ(まだ終わってないけどw)。

今日聞いたトークは以下の通り。後で、追記する予定。
  • Tatsuhiko Miyagawa - Welcome to YAPC::Asia 2008
  • José Castro ( cog ) - TPF Introduction
  • Larry Wall - A Standard That Is Meant To Be Broken, 本当に!
  • Kang-min Liu ( gugod ) - Continuous Testing
  • Dan Kogai - PSL = Perl as a Second Language
  • Ingy döt Net - JavaScript Love for Perl Hackers
  • Leon Brocard ( acme ) - Working in the cloud
  • Kazutake Hiramatsu - Parrot Compiler Tools
  • Yusuke Kawasaki - DOM Manipulation by Gainer/Wiimote over HTTP
  • Kazuhiro Osawa ( Yappo ) - Let's enjoy Perl on the %^H
  • Lightning Talks

[PR]
by fkmn | 2008-05-15 23:08 | IT
Perl で文字列中の変数名を明示的に指定する方法

文字列に式が埋め込めない。

Python の嫌いなところ - kwatchの日記

これはほかの言語も Ruby を参考にするべきだと思う。

Perl のは変数の直後に識別子に含めていい文字が来る場合にどうしていいかよくわからないのだよな。こんなん?
my $x = "a";
my $y = "$x\_b";

Pythonはダメなところは信者がアレすぎるところ - odz buffer


 変数の直後に識別子に指定できる文字が来てしまう場合は、展開して欲しい変数を ${変数名} という形で指定してやればおk。

 例えば、こんな感じ。
my $x  = "a";
my $xy = "b";
print "${x}y"; #=> ay

 でも、Ruby みたいに式を含めることはできないなぁ。


 Perl6 だと、ダブルクオート中の {} が Perl の式として展開されるらしい。

my $foo = 3;
my $hoge = "{$foo + 4}";
say $hoge; # 7

Pugs で Perl6 を体験する


[PR]
by fkmn | 2008-04-16 23:55 | IT
Perl で Church数をいじってみた
Church数をちゃんと理解できているかいまいち不安だったので、Perl でちょっといじってみた。

まず、SICP の問題2.6の、zero と add-1(ついでに one)を Perl に移植。

my $zero = sub {
my $f = shift;
sub { my $x = shift; $x }
};

my $one = sub {
my $f = shift;
sub { my $x = shift; $f->($x) };
};

sub add_1 {
my $n = shift;
return sub {
my $f = shift;
return sub {
my $x = shift;
$f->( $n->($f) ($x) )
};
};
}

my $two = add_1($one);

# 数値に戻してみる
print $zero->( sub { $_[0] + 1 } ) (0); #=> 0
print $one->( sub { $_[0] + 1 } ) (0); #=> 1
print $two->( sub { $_[0] + 1 } ) (0); #=> 2


add_1 をもとに、任意の2つの数の加算ができるように変形。
$m->($f) で m の数をつくって、その回数分 $n->($f) ($x) を繰り返してやる。

sub add {
my ( $n, $m ) = @_;
return sub {
my $f = shift;
return sub {
my $x = shift;
$m->($f) ( $n->($f) ($x) );
};
};
}

my $three = add( $one, $two );
my $five = add( $two, $three);

# 数値へ
print $three->( sub { $_[0] + 1 } ) (0); #=> 3
print $five->( sub { $_[0] + 1 } ) (0); #=> 5


加算が出来ると、乗算も割と楽。
$m の回数分 $n->($f) を繰り返してやって、それを $x に適用させる。
# 上の add と比べて、変わってるのは * の部分だけ。

sub multi {
my ( $n, $m ) = @_;
return sub {
my $f = shift;
return sub {
my $x = shift;
$m->( $n->($f) ) ($x); # *
};
};
}

my $six = multi( $two, $three );

# 数値へ
print $six->( sub { $_[0] + 1 } ) (0); #=> 6


この調子で Y-combinator にまで進もうと思ったけど、Perl だと遅延評価が必要とか、Z-combinator とか言われて、正直よく分からんかった。。。

とりあえず、lambda だけで無限ループ(再帰)するのは簡単だよね、というところまで。

# 無限ループ(再帰)
my $omega = sub {
my $f = shift;
$f->($f);
};
$omega->($omega);



一応、Y-combinator がちゃんと理解できるまで続く予定。


参考サイト:
404 Blog Not Found:TuringとChurchの狭間で
The Mellow Musings of Dr. T : Recursive lambda expressions
[PR]
by fkmn | 2008-01-30 23:55 | IT
Perl の reduce (List::Util) で配列を作る方法
SICP の2.2.3節あたりを読んでいたら、思いついたのでメモ。

いままで reduce で配列を作る方法がいまいち分かってなかったんだけど、以下のようにすればいい。

例えば、1から3までの数字について、元の数字とその数字を2乗した数の対の配列を作る場合はこう。

my @array = 1 .. 3;
my $array_ref = reduce { [ @{$a}, [ $b, $b**2 ] ] }[], @array;
print YAML::Dump($array_ref);

実行結果

---
-
- 1
- 1
-
- 2
- 4
-
- 3
- 9

初期値に空の配列リファレンスを入れておいてやるのが(個人的な)ポイント。

Perl の(というより List::Util の)reduce は初期値を設定できなくて使いづらいと思ってたんだけど、ただ単に、配列の先頭に初期値を突っ込んでやればいいだけだった。コロンブスの卵。


参考サイト:
畳み込み関数の比較 (fold / accumulate / inject / reduce) - blanket sky
[PR]
by fkmn | 2008-01-24 23:55 | IT
livedoorクリップのタグをリネームする "Perl" スクリプト
livedoorクリップのタグをリネームするRubyスクリプト - むぅもぉ.jp
たぶんPerlで書いたらCPANのモジュール使えるかっらもっとシンプルに書けたのかな。

API, delicious compatible - livedoor クリップ まとめサイト - livedoor Wiki(ウィキ)
Net::Delicious を endpoint 変更のみでそのままご利用いただけます。


面白そうだったのと、Net::Delicious を使うと簡単に出来そうだったので、やってみました。

ldc_tag_rename.pl

use strict;
use warnings;
use Net::Delicious;

my $livedoor_id = "your_livedoor_id";
my $apikey = "your_api_key";

my $old_tag = shift or die "usage: $0 old_tag [new_tag]\n";
my $new_tag = shift;

my $ldc = Net::Delicious->new(
{ user => $livedoor_id,
pswd => $apikey,
endpoint => 'http://api.clip.livedoor.com/v1/',
debug => 0,
}
);

for my $post ( $ldc->posts( { tag => $old_tag } ) ) {
my $tags = $post->tags;
$tags =~ s/$old_tag/$new_tag/;

$ldc->add_post(
{ url => $post->url,
description => $post->description,
extended => $post->extended,
tags => $tags,
}
);
print $post->url, "\n";
sleep 1;
}


スクリプトの "your_livedoor_id" の部分に livedoor の ID、"your_api_key" の部分に API Key を入力してから使います。

実行する時は、コマンドライン引数に「変換前のタグ」と「変換後のタグ」を指定します。「変換後のタグ」を指定しないと、タグが削除されます。

# perl ldc_tag_rename.pl google Google


元エントリと同様に、実際に使う場合は自己責任でお願いします。自分で使ってみた限りでは、特に問題なく動作しましたが。


余談だけど、Net::Delicious に "$obj->rename_tag(\%args)" というメソッドがあって、一瞬期待したけど、livedoor クリップではまだ実装されていないらしかった。残念。


# 元エントリに trackback 打とうと思ったけど、URL が分からないなぁ。
[PR]
by fkmn | 2008-01-14 23:55 | IT


とあるWebアプリケーションエンジニアの日記
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
カテゴリ
以前の記事
ブログパーツ
リンク
検索
タグ
最新のトラックバック
プログラミングが「出来る..
from とりあえず9JP?
Genographic ..
from ナンジャモンジャ
ジュセリーノ
from ありの出来事
くちこみブログ集(ライフ..
from くちこみブログ集(ライフ)(..
以降、丁寧語で行こう!
from エッセイ的な何か
その他のジャンル
ファン
記事ランキング
ブログジャンル
画像一覧

fkmnの最近読んだ本 フィードメーター - フッ君の日常 あわせて読みたい AX