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

とやればよろしい。

ProductName 初めてのPerl 第5版
Randal L. Schwartz,Tom Phoenix,brian d foy
オライリージャパン / ¥ 3,780 ()


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);

pygments

amazon認証プロキシ

amazonの認証に対応するためにhikiのバージョンを0.8.8.1にあげたついでにamazonプラグインを覗いてみたらプロキシで対応していた。

drkcoreのほうはNet::Amazon使っているので、ローカルでSignature組み立ててるんだけど、wikiりたいだけのユーザーがわざわざsecret_keyとか取得すんのもあほくさいからwikiみたいのはプロキシーでいいのかと。

ProductName パターン、Wiki、XP ~時を超えた創造の原則 (WEB+DB PRESS plusシリーズ)
江渡 浩一郎
技術評論社 / ¥ 2,394 ()
在庫あり。

駱駝使い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')";;

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をネットワーク越しに制御できるので音サーバーというのも面白いかもしれませんな。

ProductName Making Things Talk -Arduinoで作る「会話」するモノたち
Tom Igoe
オライリージャパン / ¥ 3,990 ()
在庫あり。

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";
}

これで、月に一回くらいまとめておけば、食欲が刺激されて吉。行ったとこには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
Next Page