Hokkaido.pm Casual#5に行ってきました

今回も、無事にHokkaido.pm Casual#5を行うことが出来ました。
次回は、10/17を予定しておりますので、よろしくお願いします。

まずは、みなさんお疲れさまでした!
次回は、O/Rマッパーでいんですかね?DBIだっけ??
あんまり良く覚えてないデス・・・、ゴメンなさい!

Perl Beginners」からいろいろパクりまして(*1)、オープニングトークをして、
その中で、LTで質問するっていう手もあるよ!っていうお話をしました。
あと、「Perl入学式」のように補講はできないにしても、
過去に扱ったテーマ(発表)に対するリクエストを募集している旨を伝えました。

という訳で、さっそく内容の方に。
まとめるとこんな感じ。

  • テンプレートって?
  • みんなどれ使ってるの?
  • カジュアルに使うならどれ?

で、テンプレート使うとこんなことできるよ!みたいなお話は後にして、
どれを使ってるの?っていうお話だと、まずは候補がこんな感じ。

Template-Toolkit
HTML::Template
HTML::Template::Pro
Text::Xslate
Text::MicroTemplete

で、カジュアルなのはformat関数でしょ!
じゃなくて、Text::MicroTempleteが依存が少ないし、
レンタルサーバーでも使えるって意味でカジュアルですね、っていう結論(*2)でした。
もちろん、環境が許すならText::Xslateだと思います。

次に、PerlのI/Oネタ。
こんな感じで、日々の疑問をLTで提供して貰えるとうれしいです。
perldocって、ほんと便利ですね。

use strict;
use warnings;

use JSON;
use utf8;
use Encode;

my $utf8_text = '[{"名前":"あ"},{"名前":"い"}]';

# perldoc JSON より
# $utf8_encoded_json_text = encode_json $perl_hash_or_arrayref;
# $perl_hash_or_arrayref  = decode_json $utf8_encoded_json_text;

my $array_ref = decode_json( encode_utf8($utf8_text) );
foreach my $hash_ref (@{$array_ref}) {
    print encode_utf8("名前 => " . $hash_ref->{"名前"}), "\n";
    $hash_ref->{"年齢"} = "123";
}

print encode_json($array_ref), "\n";
# 出力結果
# 名前 => あ
# 名前 => い
# [{"年齢":"123","名前":"あ"},{"年齢":"123","名前":"い"}]

最後に、自分が発表したネタ。

この画像をCairoで作るのにこんなコードを書きました。

use strict;
use warnings;

use Cairo;
use Math::Trig qw( deg2rad );
use Data::Dumper;

my ( $w, $h ) = ( 121, 121 );

my $surface = Cairo::ImageSurface->create( 'argb32', $w, $h );
my $cr = Cairo::Context->create( $surface );

$cr->set_line_width( 2 );
#$cr->set_antialias( 'none' );

my $n = 16;
my ( $x0, $y0 ) = ( int($w / 2), int($h / 2) );
my $r  = 30;
my $da = 360 / $n;
for (my $i=0; $i<$n; $i++) {
    $cr->translate( $x0, $y0 );
    $cr->rotate( deg2rad($da * $i) );
    $cr->translate( -$x0, -$y0 );

    $cr->rectangle( $x0 + $r, $y0, 15, 20 );
    $cr->set_source_rgb( 0, 0, 0 );
    $cr->stroke();

    $cr->identity_matrix();
}

$cr->show_page();
$surface->write_to_png( 'output.png' );

MacじゃないとCairoの入れ方とか説明できないし、
無理矢理テンプレートに関連付けると、
SVGをテンプレートで出力する方法があるよ!っていう流れから、

use strict;
use warnings;

use Text::Xslate;
use Data::Section::Simple;

my $vpath = Data::Section::Simple->new()->get_data_section();
my $xslate = Text::Xslate->new(
    path => [$vpath],
);

my ( $w, $h ) = ( 121, 121 );

my $n = 16;
my ( $x0, $y0 ) = ( int($w / 2), int($h / 2) );
my $r  = 30;
my $da = 360 / $n;

my @rectangles = ();
for (my $i=0; $i<$n; $i++) {
    push @rectangles, {
        r => $r,
        a => $i * $da,
        x0 => $x0,
        y0 => $y0
    };
};

print $xslate->render( 'svg.tx', {
    width => $w,
    height => $h,
    rectangles => \@rectangles
} );

__DATA__
@@ svg.tx
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <title>SVG</title>

    <style type="text/css">
<!--
rect {
    fill: none;
    stroke: black;
    stroke-width: 2;
}
-->
    </style>
</head>

<body>
<svg width="<: $width :>" height="<: $height :>"
    xmlns="http://www.w3.org/2000/svg" version="1.1">
    : for $rectangles -> $rect {
    <rect x="<: $rect.x0 + $rect.r :>" y="<: $rect.y0 :>" width="15" height="20"
        transform="rotate(<: $rect.a :> <: $rect.x0 :> <: $rect.y0 :>)" />
    : }
</svg>
</body>

このスクリプトを”aaa.pl”とかで保存して、
$ perl aaa.pl > index.html
を実行すると、”index.html”が生成されて、Chromeで同じ絵が確認できました。

あと、これを実行するためのモジュールは、
$ cpanm Text::Xslate
$ cpanm Data::Section::Simple

で、インストールすることができます。

配列リファレンスとハッシュリファレンスがポイントですかね。
テンプレート内では、”->”ではなく”.”でメンバーを参照しています。

スライドは間に合わなかったけど、ちゃんと動いたので良かった!

おしまい。

(*1) オープニングトークとLTで質問
(*2) #hokkaido.pm@freenode(IRC)調べだと、printfとheredocが上がってました

Leave a Comment