Rakudo Starを触ってみた
Wiki Bookを読みながら、面白いなと思った部分。
型チェックしてくれる
> my Int $x;
Int()
> $x = "1"
Type check failed for assignment
> $x = 1
1
multi method dispatch
Haskellっぽくかける
> multi sub fib (Int $n where { $n < 3 }) { 1 }
> multi sub fib (Int $n) { fib($n - 1) + fib($n - 2) }
> fib(10) #55
終了条件を最初に決めて、あとは再帰させてみた。
> multi sub mysum (@a where {@a == 0}) {return 0}
> multi sub mysum (@a) {@a[0] + mysum(@a[1..(@a-1)])}
> mysum 1..10 #55
Placeholder Arguments
$^で
> for (@myArray) { say $^a + $^b; }
3 # 1+2
7 # 3+4
11 # 5+6
gather take
リスト内包表記っぽい。それともScalaっぽい?
> gather for 1..10 {take $_ if $_ % 3 == 0} # 3 6 9
こんな感じにもできる
> gather for 1..10 {take 1..$_,"\n"}
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6
1 2 3 4 5 6 7
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9 10
Rakudo Starを入れた
朝からPerl6の実装のひとつのRakudo Starを入れて遊んでた。
$ ./perl6
> for 1..5 { .say }
1
2
3
4
5
無限リスト
> for 1..Inf { .say }
1
2
3
...
20092
20093
20094
Segmentation fault
週末にもう少し触ってみよう。
Python,Ruby,PerlのMicroframework
HaskellでYAML
HaskellでYAMLを扱うライブラリはyaml,HsSyckがあるんだけどlibyamlのバインディングであるyamlのほうは使い方がわからん。
なので、HsSyckの使い方を覚えた。
import Data.Yaml.Syck
global_tag = mkNode $ EStr $ packBuf "Item 1"
name_tag = mkNode $ EStr $ packBuf "name"
name_value = mkNode $ EStr $ packBuf "kzfm"
email_tag = mkNode $ EStr $ packBuf "address"
email_value = mkNode $ EStr $ packBuf "xxx@gmail.com"
pass_tag = mkNode $ EStr $ packBuf "password"
pass_value = mkNode $ EStr $ packBuf "snail"
item = mkNode $ EMap [(name_tag,name_value),(email_tag,email_value),(pass_tag,pass_value)]
node = mkNode $ EMap [(global_tag,item)]
main = do
emitYamlFile "test.yaml" node
作成されたtest.yamlの中身
---
? "Item 1"
:
? "name"
: >-
kzfm
? "address"
: >-
xxx@gmail.com
? "password"
: >-
snail
これをperlでparseしてみる
use YAML;
my $filename = "test.yaml";
my $doc = YAML::LoadFile($filename);
print YAML::Dump($doc);
実行結果
---
Item 1:
address: xxx@gmail.com
name: kzfm
password: snail
ナイス!
Net::AmazonでBad Requestエラー
大掃除と配置換えのためにサーバーの電源を切ったり入れたりしてたらNet::Amazonが動かなくなってしまった。
Net::Amazonのデバッグは
use Net::Amazon;
use Log::Log4perl qw(:easy);
Log::Log4perl->easy_init($DEBUG);
my $ua = Net::Amazon->new(
とか。
手元のMacbookと比較しながらにらめっこすること3時間。そろそろイライラして来た頃合にSignatureしか考えられんよなぁとソースを見ながらふと、時間ズレてんじゃねーの?
ビンゴだった
cpanのgpgエラー
cpanコマンドでinstall CPANすると
警告: 構成ファイル「/Users/xxxx/.gnupg/gpg.conf」の安全でない所有者
となるのは-Hオプションをつけてないから。
sudo -H cpan CPAN
とやればよろしい。
perlでソースコードのハイライト
Pygmentsをperlで使いたかったので、 Inline::Pythonでやってみた。
use Inline Python => <<'END_OF_PYTHON_CODE';
from pygments import highlight
from pygments.lexers import PythonLexer
from pygments.formatters import HtmlFormatter
def py_highlight(code):
return highlight(code, PythonLexer(), HtmlFormatter())
def get_stylesheet():
return HtmlFormatter().get_style_defs('.highlight')
END_OF_PYTHON_CODE
$code = <<'PYTHON_CODE';
from reportlab.pdfgen import canvas
c = canvas.Canvas('hello.pdf')
t = c.beginText()
t.setFont(t._fontname, 64)
t.setTextOrigin(0, 0)
t.textOut('Hello, World')
h = 64 / t.getX() * c._pagesize[1]
t.setFont(t._fontname, h)
c.setFontSize(h)
c.rotate(-90)
c.drawString(-c._pagesize[1], t._leading - h, 'Hello, World')
c.save()
PYTHON_CODE
printf qq|<html><head><style type="text/css">%s</style>
</head>\n<body>%s</body>\n</html>|, get_stylesheet(), py_highlight($code);

amazon認証プロキシ
amazonの認証に対応するためにhikiのバージョンを0.8.8.1にあげたついでにamazonプラグインを覗いてみたらプロキシで対応していた。
drkcoreのほうはNet::Amazon使っているので、ローカルでSignature組み立ててるんだけど、wikiりたいだけのユーザーがわざわざsecret_keyとか取得すんのもあほくさいからwikiみたいのはプロキシーでいいのかと。
駱駝使いw (2)
行末がOCamlっぽくなっても大丈夫!
use XXX;;
use WWW::Mixi::Scraper;;
my $mixi = WWW::Mixi::Scraper->new(
email => 'ml', password => 'pw',
mode => 'TEXT');;
XXX $mixi->new_friend_diary->parse;;



Einstieg in Perl 6
PerlフレームワークCatalyst完全入門
初めてのPerl 第5版
パターン、Wiki、XP ~時を超えた創造の原則 (WEB+DB PRESS plusシリーズ)