Python,Ruby,PerlのMicroframework

Flask周りを調べていたらいくつかあった

Python

Ruby

Perl

Dancer面白そう。

#!/usr/bin/perl
use Dancer;

get '/hello/:name' => sub {
    return "Why, hello there " . params->{name};
};

dance;

PerlフレームワークCatalyst完全入門

気になるが、他の著書みたらこんな感じなので、実際に本屋で中を見てからのほうがいい気がした。

ProductName PerlフレームワークCatalyst完全入門
山田 祥寛
インプレスジャパン / ¥ 4,410 ()
在庫あり。

目次もない

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

ナイス!

Quine

Esotericを読み始め。

ProductName Rubyで作る奇妙なプログラミング言語 ~Esoteric Language~
原 悠
毎日コミュニケーションズ / ¥ 2,814 ()
在庫あり。

一章の練習問題にファイルのオープンを使わないでQuine

rubyだとかなり短く書けるのね。

printf a="printf a=%p,a",a

perlだとsigilが必要な分だけ難しいなぁ。

シングルクォートをq{}にして$_に入れてevalするとか。

FFmpegで作る動画共有サイト

Turbogearsで作るとかいうあたりに惹かれてぽちっと。

ProductName FFmpegで作る動画共有サイト
月村 潤,本間 雅洋,堀田 直孝,原 一浩,足立 健誌,尾花 衣美,堀内 康弘,寺田 学
毎日コミュニケーションズ / ¥ 2,940 ()
在庫あり。

プログラム言語を静岡酒に例えると

最近は、仕事がハードで金曜の夜はコード書いたりとか技術書読んだりとかはやる気がおきない。そのうえ金土だけ酒解禁日なので日本酒を呑むのがうれしくて仕方がないので余計にやる気などおきない。

というわけで、今晩は山形正宗をチビチビやりながら、ふとプログラム言語を静岡酒に例えたらどうなるだろうかと妄想してみた。

まぁ間違いなくPythonは喜久酔。香りはそこそこに上品な口当たりとすっきりと旨い。旨さがストレートに伝わってきて心地よい。コレは誰が飲んでも普通に旨いって思えるよな。

それに対しperlは臥龍梅かな。あのどっしり感とふくよかな旨みのわりにするりとした後味で奥の深い味わい。奥が深い症候群ってのにやられて酒米の種類で飲み比べしたりしたくなるのも臥龍梅ならでは。まさにTMTOWTDI

で、rubyは國香やな。あのメロンを思わせる爽やかな香りと酸味ののった軽快感があるけど旨みもしっかりとしている。あーでも驚き最小ではないな、美味さに驚く。

燗つけて旨いのが白隠正宗。燗をつけたときの旨みのふくらみがなんともいえなくて深みが増します、燗(括弧)はとっつきにくいけど一度慣れてしまうと当たり前になってしまうSchemeあたりか。

とくにオチはないのだけど、静岡で日本酒を呑むとしたら國香の純米中汲みとか白隠正宗の黒いラベルのやつをぬる燗にするのがオススメです。特に國香の中汲みはやたらと旨かった。

いくつかは市川さんで手に入りますヨ。

PythonにはIO::Promptみたいなモジュールはないのかな

引数なしで起動したらhelpを表示して終了するのがいいのか、対話モードで起動したらいいのか悩ましいプログラムがあったりする(単に対話モードの処理を書くのが面倒とも)。

システム管理者のための Pythonによると、選択メニューを表示するのにベタ書きしていて、受け取るほうもif-elif-で処理していたのでIO::Promptみたいなモジュールはないのだろうかと探してみたが見つからなかった。

LL行ってきたヨ

今、ちょうどまさにSICPを読んでいる僕としては朝一の基調講演は気になるところなので、朝早くから出かけた。

基調講演

20070804030

ハッカー気質について。内容が面白かった。早起きした価値があった。 それにしてもプレゼンMeadowだよな。あれなんなんだろう?それがちょっと気になった。

Language Update

luaってそういえば7,8年くらい前(もっと前かな?)に分子生物学会のポスターで見たことあったのを思い出した。

Pythonのプレゼンがわかりやすかった。

VM魂(パネル)

IronPython,Jythonが気になってたが、JRuby,IronRubyも面白そう。そういえばJRubyってDepth-Firstが使っていたような。僕はJythonから使ってみたりするわけですが。

IronPythonはPythonでDirectXとか使えるのが気になる。

キミならどう書く

プレゼンソフトをつくるお題。IT戦記の人のjavascriptのやつがすげーよくできてるなと。あとGauche面白そう。

Lightning Talk

盛り上がり

おまけ

抽選会で本ゲット。やたらと重かった。

20070805034

充実した一日だった。

PythonでWu-Manber

ProductName Mastering Algorithms With Perl
Jon Orwant,Jarkko Hietaniemi,John MacDonald
Oreilly & Associates Inc / ¥ 3,263 ()
在庫あり。

ビット演算を利用したアルゴリズム。Shift-ADDと違いdifference,insertion,deletionを考慮する。

可能性を論理和として積み上げていってShift-ORみたいなアプローチで評価するとこだと思う。いまいちちゃんと理解できてないが。

   for j in range(1,k+1):
       s[j]  = (r[j] << 1) & Tc
       s[j] |= (r[j-1] | s[j-1]) << 1
       s[j] |= r[j-1]
       s[j] |= 1

あと、perlで@a = @bとやれるところがpythonではa=bとできず、 b = copy.copy(a)なのね。

#!/usr/bin/env python

import copy

def amatch (T,P,k=-1):

   text_length = len(T)
   pattern_length = len(P)
   po2 = map(lambda(x): 1 << x,range(31))

   if k == -1: k = int(pattern_length/10) + 1

   Table = [0] * 256
   for i in range(pattern_length):
       Table[ord(P[i])] |= po2[i]

   r = [0] * (k+1)
   for i in range(1,k+1):
       r[i] = r[i-1] | po2[i-1]

   mb = po2[pattern_length-1]

   s = [0] * (k+1)
   for i in range(text_length):
       s[0] <<= 1
       s[0] |= 1
       Tc = Table[ord(T[i])]
       s[0] &= Tc

       for j in range(1,k+1):
           s[j]  = (r[j] << 1) & Tc
           s[j] |= (r[j-1] | s[j-1]) << 1
           s[j] |= r[j-1]
           s[j] |= 1

       if s[k] & mb:
           return i - pattern_length + 1 if i > pattern_length else 0
       r = copy.copy(s)
   return -1

if __name__ == '__main__':
   print "match: ", amatch("pearl","perl",1)

PythonでShift-ADD

ProductName Mastering Algorithms With Perl
Jon Orwant,Jarkko Hietaniemi,John MacDonald
Oreilly & Associates Inc / ¥ 3,263 ()
在庫あり。

これもビット演算を利用したアルゴリズム。differenceを許容するけどinsertion,deletionは駄目。

#!/usr/bin/env python

from math import *

def shift_ADD (T, P, k=-1):
   text_length = len(T)
   pattern_length = len(P)

   if k == -1: k = int(log(text_length)+1)
   if k == 0:  return T.find(P)
   if pattern_length == 1: return T.find(P)
   if pattern_length > text_length: return -1
   if pattern_length == text_length and P == T: return 0

   bits = int(log(k+1,2)) + 1 # ????
   mask = 1 << ( bits - 1 )
   ovmask = 0

   for i in range(pattern_length):
       ovmask |= mask
       mask <<= bits

   table = [ovmask >> (bits-1)] * 256

   nmask = 1
   for i in range(pattern_length):
       table[ord(P[i])] &= ~nmask
       nmask <<= bits

   mask = ( 1 << ( pattern_length * bits )) -1
   state = mask & ~ovmask
   ov = ovmask
   watch = ( k + 1 ) << ( bits  * ( pattern_length - 1 ) )

   for i in range(text_length):
       state = ((state << bits) + table[ord(T[i])]) & mask
       ov    = ((ov << bits) | (state & ovmask))    & mask
       state &= ~ovmask
       if (state | ov) < watch:
           return i - pattern_length + 1

   return -1

if __name__ == '__main__':
   print shift_ADD("perlpethonxx","python",2)