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;;
駱駝使いw
perlと言えば駱駝、OCamlと言えば駱駝。つまり両頭使いは必然の流れですな。
perl4camlを使うとocamlでperlのコードを取り込める。
#require "perl";;
open Perl;;
eval "use Net::Twitter";;
eval "Net::Twitter->new({username => 'ur', password => 'pw'})->update('from perl4caml')";;
CPANの膨大な資産が使えるのは魅力。
Chuckで遊んでみた
朝からChucKで遊ぶ。
編集した結果をリアル気味に反映させたくなったのでperlで書いた(loop.pl)。
use Path::Class;
my $file = $ARGV[0] || die "filename not found";
my $t = file($file)->stat->mtime;
system "chuck", "+", $file;
while(1){
sleep 1;
unless ($t == file($file)->stat->mtime) {
system "chuck", "=", "1", $file;
$t = file($file)->stat->mtime;
}
}
あとはChuckのサンプル(test.pl)
SinOsc s => JCRev r => dac;
.5 => s.gain;
.2 => r.mix;
[ 1, 3, 5, 7 ] @=> int note[];
while( true )
{
Std.mtof(Std.rand2(1,3)*12 + 48 + note[Std.rand2(0,note.cap()-1)] ) => s.freq;
140::ms => now;
}
これで、chuckのほうをサバクラにするために
chuck --loop
で動かしておいて、別の端末から
perl loop.pl test.ck
これで、test.ckをエディタで編集して保存すると反映される。
Arduinoとかで制御すればもっと面白くなりそう。CdSセンサとかで変化するようなのをつくってみてもいいし、ChucKをネットワーク越しに制御できるので音サーバーというのも面白いかもしれませんな。
kdi(今度行く)とitkt(行ってきた)
先日カットに行った時に美味しい店の話になって、
ブログで見かけた美味しそうな店はブックマークでリスト化してる
とかそういう話をした。
それにしても見ているブログがかぶるなぁと思い、帰ってきてからローカルネタのブログを数えたら120件くらいしかなかったので意外と少ない(と思ったがローカルネタにカテゴライズしてないブログもあるのでそういうの入れたら200件くらいにはなるか)。というより、よくよく考えてみるに食べ物関係のブログがかぶっているだけか。まぁ三島、沼津は少ないので、簡単に収束してしまうような気もする。
さらに、リスト化してるだけで、実際に行けてないんですよねー的な話もしていて、さすがに、これじゃいかんときちんとタグふって管理してみることにした。
ブログに貼付けやすいようにmarkdownで出力
use URI;
use XML::Feed;
use Encode;
my $feed = XML::Feed->parse(URI->new('http://b.hatena.ne.jp/kzfm/rss?tag=kdi'))
or die XML::Feed->errstr;
print $feed->title, "\n";
for my $entry ($feed->entries) {
my $title = encode('utf8',$entry->title);
my $link = $entry->link;
print "- [$title]($link)\n";
}
- Blog@お天気屋さん: のみの市
- 山家 | ふじでこ - 富士山周辺地域のエリアガイド&コミュニティサイト
- スロウなまいにち:ジャパニーズランチ
- 寒い夜に焼き鳥〜! - エコオヤジですがなにか? - Yahoo!ブログ
- 酒蔵 ひなよし (三島市、和食居酒屋)
- サバーイ・ディール "断然一押しタイ料理店!" [食べログ.com]
- オープニングすたっふ〜募集♪ - さかな一等兵 富士宮 駅前店♪ - Yahoo!ブログ
- Eat and run!:蒸し暑いですねぇ、こんな日は冷たい麺が食べたい!vol3 - livedoor Blog(ブログ)
- 六文銭 "【静岡】長谷通りから香ってくるスパイスの香り カレー屋「六文銭」" [食べログ.com]
- Eat and run!:GENERAL RESTAURANT 枇杷(びわ)BIWA - livedoor Blog(ブログ)
- 創作居酒屋「縁」えにし沼津
これで、月に一回くらいまとめておけば、食欲が刺激されて吉。行ったとこにはitktとかタグふれば、達成率も管理できて尚よい。
あと、美容師さんのお薦めを聞いていたら、OPERAにいかねばならん気にさせられた。
MooseでLisp(MoospのFunction::Setq)
やさしい Lisp の作り方 by Java and by C#を参考に書いてみる。
sub fun {
my ($self, $arguments) = @_;
my $arg1 = $self->eval->eval($arguments->cdr)->car;
my $sym = $arguments->car;
$sym->value($arg1);
$self->env->put($sym,$sym->name);
return $arg1;
}
束縛するものがリストだと、まだうまくいかない。
Moosp> (setq a 5)
5
Moosp> (setq b 2)
2
Moosp> (+ a b)
7
Moosp> (setq c (+ 1 2))
Attribute (value) does not pass the type constraint because: Validation
failed for 'Moosp::Sexp' failed with value Moosp::List=HASH(0xa2a110) at lib/Moosp/Function/Setq.pm line 22
Moosp::Function::Setq::fun('Moosp::Function::Setq=HASH(0xa208a0)',
'Moosp::List=HASH(0xa29a80)') called at lib/Moosp/Eval.pm line 93
Moosp::Eval::eval('Moosp::Eval=HASH(0xa1dcc0)',
'Moosp::List=HASH(0xa29fa0)') called at lib/Moosp.pm line 67
Moosp::run('Moosp=HASH(0x804320)') called at moosp.pl line 7



初めてのPerl 第5版
パターン、Wiki、XP ~時を超えた創造の原則 (WEB+DB PRESS plusシリーズ)
Making Things Talk -Arduinoで作る「会話」するモノたち