Perlテックブログ

Perlゼミのはてな出張所。Perlの新着情報、Perlイベントなどの紹介

PHPのP++構想と同じものがPerlのSPVMプロジェクトだ

PHPのP++構想と同じものがPerlのSPVMプロジェクトである。

PHPから静的型のP++を呼び出そうとしているというのが、P++プロジェクトだ。


P++: 銀河に平和をもたらすための奇策と決着
P++: 静的型付けをめざすPHP
PHPから後方互換性を除いた「P++」が提案される
P++: 静的型付けをめざすPHP

これをPerlのモジュールシステムを使って実現しようとしているのが、PerlのSPVMプロジェクトだ。

SPVMドキュメント 1.0 ベータ

SPVMは静的型言語で、Perlの文法を使って、Perlからコンパイルされた関数を呼び出すことができる。

これは、日本で実用的なプログラミング開発をしている、数名のうちの一人の、Perlゼミによって研究されているプロジェクト。

2019年Perl入学式東京 第四回 リファレンス偏 講義内容を公開中

2019年Perl入学式東京 第四回 リファレンス偏 講義内容を公開中

github.com

今ちょうど、Perl入学式にたどり着きました。

参加予定者の方は、14人。

ちょうど、午後1時からPerl入学式が始まりそうです。

Perl入学式東京 始まりました サポーター紹介

サポーター紹介。和田さん、にしるさん、モチ君、わたくし、テツジさん。

参加者の方の自己紹介 13:10

みっつのテーブルのそれぞれのメンバーで、自己紹介。

第四回になって、慣れてきたのか、盛り上がっております。

リファレンスの講義が開始 13:15

今回は、講義資料が少しリニューアル!

最初は、ハッシュに、名前と食べ物のペアがあって、食べ物が何回出現したかを数える。

最初は、前回のハッシュの復習だった。

github.com


my %data = (
alice => 'sushi',
bob => 'soba',
carol => 'sushi',
dave => 'sushi',
ellen => 'soba',
frank => 'udon',
);

書き書き。


my %food_count;
for my $name (keys %data) {
my $food = $data{$name};
$food_count{$food}++;
}

日付を正規表現を使って変換

書き書き書き。


use strict;
use warnings;

my $date = '07-13-2019';

my $date_edit;

if ($date =~ /^(\d+)-(\d+)-(\d+)$/) {

my $mday = $1;

my $mon = $2;

my $year = $3;
$date_edit = "$3-$2-$1";

}

print "$date_edit\n";

若干、間違いがあるみたい。

リファレンスの解説が始まる 14:00

リファレンスの解説が始まる。

配列のリファレンス。デリファレンス

配列の配列

配列の配列の表現方法を学ぶ。

ハッシュのリファレンス 16:10

ハッシュのリファレンス。配列のリファレンスと括弧が違うだけでよく似ている。

配列のハッシュを作って、要素を操作する 17:15

複雑なデータ構造に、自由にアクセスして、データを追加、変更できるか。

これが、自由にできるようになると、プログラミングの幅がすごく広がります。

お疲れさまでした。 18:00

お疲れさまでした。最終回は、サブルーチンとWebサイト作成です。

Perlには、真偽値型も、真偽値リテラルも、存在しません。

Perlの真偽値に反応して書き書き。

Perlには、真偽値型はない

Perlは、動的型言語ですから、もちろん、真偽値型というものは、ありません。

内部的にはSVデータ型として、データを保存していますが、これも、真偽値型という概念を持っていません。

Perlには、真偽値リテラルはない

Perlには、trueやfalseといった真偽値リテラルはありません。

Perlでは、一般的には、真は1で、偽は、0かundefで表現することが多いですね。


# 偽(デフォルトundef)
my $flag;

# 0を入れる
my $flag = 0;

# 真は1が多い
my $flag = 1;

普段は困らない

これで、プログラミング上は、普段は、何も困ることはないです。

唯一必要なのは、JSONブーリアンを入力するとき

プログラミングの内部で閉じている場合は、何の不便もありませんが、JSONブーリアンを入力するときに、Perlにおいては対応がないので、ひと工夫が必要です。

ただし、Perlには、演算子オーバーロードという機能があるので、JSONを解析した結果は、オブジェクトで表現された真偽値に変換され、そのまま真偽値として利用できます。


my $data = decode_json($json);

# そのままでOK
if ($data->{flag}) {

}
else {

}

JSON出力に関しては、1,0で出力してあげれば、真偽値として、利用できますね! (仕様で求められる場合は、別ですが)

結論: そんなにびっくりしなくてもよい

まぁ、まぁ、落ち着いて。

実用で不便が生じる可能性は、そんなに大きくないよということです。

GitのインストールにはPerlが必要

Git 1.7.4以降ではPerl 5.8が必須となっています。


なお、Git 1.7.4以降ではPerl 5.8が必須となっているが、FedoraRed Hat Enterprise LinuxCentOSなどのプラットフォームではPerlの一部のコアモジュールがデフォルトでは提供されていないため、追加のモジュールが必要となるという。

「Git 2.17」が公開 - OSDN Magazine

GithubのようなWeb上でリポジトリを管理するツールは、内部でGitというツールを利用しています。

GitのインストールにはPerlが必要となってくるので、Perlを事前にインストールしましょう。

yumなどのツールの管理ツールで、gitをインストールすれば、依存関係を自動的に解決してくれるので便利です。

Perlは、opensslやgitといったUnix/Linuxミドルウェアの分野で、ブートストラップツール、補助ツールとしての採用実績が豊富です。

Imagerを使って六角形を作って塗りつぶす

PerlImagerを使って六角形を作って塗りつぶす。



ソースコードは以下。


use strict;
use warnings;

use Imager;
use Imager::Color;
use Imager::Fill;

my $xsize = 500;
my $ysize = 250;

my $img = Imager->new(xsize => $xsize, ysize => $ysize, channels => 4);

# Background white
$img->box(color => Imager::Color->new(255, 255, 255), xmin=>0, ymin=>0, xmax=>$xsize, ymax=>$ysize,
filled=>1);

# Blue Hexagon
{
my $blue = Imager::Color->new( 0, 0, 255);
my $fill = Imager::Fill->new(solid=> $blue);

$img->polygon(points => [[50, 50], [100, 50], [125, 100], [100, 200], [50, 200], [25, 100]], color => $blue, fill => $fill, aa => 1);
}

# Green opacity hatch Hexagon
{
my $green = Imager::Color->new( 0, 255, 0, 200);
my $fill = Imager::Fill->new(hatch => "check2x2", fg => $green);
$img->polygon(points => [[250, 50], [300, 50], [325, 100], [300, 200], [250, 200], [225, 100]], color => $green, fill => $fill, aa => 1);
}

# inverse virtical
$img->flip(dir => 'v');


$img->write( file => 'rokkaku.png')
or die $img->errstr;

Imagerでsinのグラフを書く - 実験編1

Perlで二次元グラフをポータブルに書けないかどうかというのを調べていて、Imagerで何とかなるかもしれないと思い、実験をしています。

Cairoは、機能としては、申し分なさそうなんですが、ポータビリティ、環境構築が鬼門ということで、Imagerを調べていて、直線を短くつなぐことで、曲線に見せることができるという情報をGETしたので、やってみようということで。

sinのグラグを書いてみました。




use strict;
use warnings;

use Imager;
use Imager::Color;
use Math::Spline;
use Math::Trig 'pi';

my $xsize = 500;
my $ysize = 500;
my $x_offset = 250;
my $y_offset = 250;

my $img = Imager->new(xsize => $xsize, ysize => $ysize, channels => 4);

my $scale = 100;

my $min = -pi();
my $max = 2*pi();

my $kannkaku = 0.1;

my $points = [];
for (my $x = $min; $x < $max; $x += 0.1) {
my $y = sin($x);
my $point = [$x * $scale + $x_offset, $y * $scale + $y_offset];
push @$points, $point;
}


# my @ys = map { xx($_) } @xs;

# my $spline = Math::Spline->new(\@xs, \@ys);

# my $x = 5;
# my $y = $spline->evaluate($x);

my $blue = Imager::Color->new( 0, 0, 255 );
# my $fill = Imager::Fill->new(hatch=>'stipple');

$img->box(color => Imager::Color->new(255, 255, 255), xmin=>0, ymin=>0, xmax=>400, ymax=>300,
filled=>1);

$img->polyline(points => $points, color => $blue, aa => 1);

$img->flip(dir => 'v');

# Jpeg、画質 90% で保存
$img->write( file => 'graph.png', jpegquality => 90 )
or die $img->errstr;

いい感じじゃないかな。

Math::Spline - スプライン曲線の座標を求める

スプライン曲線の座標を求めるにはMath::Splineモジュールを使用します。

スプライン曲線とは、与えられた座標を滑らかにつなぐ曲線のことです。


use strict;
use warnings;

use Math::Spline;

my $xs = [1, 3, 8, 10];
my $ys = [1, 2, 3, 4];

my $spline = Math::Spline->new($xs, $ys);

my $x = 5;
my $y = $spline->evaluate($x);

print "($x, $y)\n";

Math::Splineのコンストラクタに、複数のx座標とy座標を指定します。


my $spline = Math::Spline->new($xs, $ys);

evaluateメソッドに任意のx座標を与えることで、スプライン曲線のy座標を取得できます。


my $x = 5;
my $y = $spline->evaluate($x);