83's

Top > Archives > 2008 > August

August 02, 2008

GaucheでYAML 00:01

YAMLが読めるよ!! やったね たえちゃん!

lequeから Gauche-YAML-0.0.tgzを入手。バージョンがすごい……。ダブルオー。

$ sudo aptitude install libsyck-dev
$ sudo gauche-package install Gauche-YAML-0.0.tgz

(use text.yaml)したらSEGVした。

GaucheのAPIが変わってるみたい。yaml.cを修正。

--- Gauche-YAML-0.0.orig/yaml.c 2006-09-03 00:04:40.000000000 +0900
+++ Gauche-YAML-0.0/yaml.c      2008-08-01 23:05:12.000000000 +0900
@@ -450,7 +450,7 @@
     sym_merge = SCM_INTERN("merge");
     sym_default = SCM_INTERN("default");
     make_date_proc =
-       Scm_EvalCString("make-date", SCM_OBJ(SCM_FIND_MODULE("srfi-19", 0)));
+       Scm_EvalCStringRec("make-date", SCM_OBJ(SCM_FIND_MODULE("srfi-19", 0)));
 
     /* Register stub-generated procedures */
     Scm_Init_yamllib(mod);

(use text.yaml)するとこんな関数が使える。おおお。

  • yaml-parse-string yaml-string
  • yaml-load port
  • yaml-dump obj &optional port
  • x->yaml obj

メールからtwitter 01:40

きっと何人も同じことをやってるんだろうけど。

#!/bin/sh
#
# post_twitter
#

CONF=/path/to/twitter/username/password

if [ -e $CONF ]; then
  . $CONF
else
  echo "$CONF is not found." >&2
  exit 1
fi

BODY=`sed "0,/^$/d" | nkf -w`

curl -u $USER:$PASSWORD -d status="$BODY" http://twitter.com/statuses/update.xml > /dev/null 2>&1

みたいにしておいて、$CONFのパスにこんなの置いて

USER=aaa
PASSWORD=bbb

さらに/etc/aliasesに

name_to_post_twitter: | /path/to/post_twitter

んでメール送ったら本文に書いたやつがpostされる。キタコレ!

オレの携帯古すぎてm.twitter.com開けないってのもあるけど、メールのほうが手軽かなと。

最近読んだこの本がためになりました。シェルスクリプト++

入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界
ブルース ブリン
ソフトバンククリエイティブ
売り上げランキング: 51446

August 07, 2008

属性リストへのアクセス 00:19

調べるのに少し手間取ったのでメモ。

Common Lispだと

(getf (list :a 1 :b 2 :c 3) :a)
;;=> 1

これのScheme版はget-keyword

(get-keyword :a (list :a 1 :b 2 :c 3))
;;=> 1

属性リストって書くの楽でいいよなぁ。他の言語でこんなのやると罪悪感みたいのがわくけど、 こっちは関数があるおかげで「使っていいんだ」っていう雰囲気。

August 10, 2008

ディスプレイ買った 16:53

24インチワイド。今まで17インチだったのでとても大きく感じる。 テレビだよ、もうこのサイズは。

BenQ 24インチ ワイドTFTモニタ 1920x1020/D-Sub15Pin/DVI/ブラック G2400WDBenQ 24インチ ワイドTFTモニタ 1920x1020/D-Sub15Pin/DVI/ブラック G2400WD

ベンキュージャパン 2008-05-09
売り上げランキング : 133

Amazonで詳しく見る
by G-Tools

August 12, 2008

gnome-terminalのウィンドウサイズ設定 23:22

  1. まずgnome-terminalを好きなサイズに変更する
  2. xwininfoでgnome-terminalのgeometryを調べる
  3. gnome-terminal起動するときに--geometry=<今調べたやつ>をつける

サイズくらい勝手に憶えておいてほしいなぁ。

--geometryの書き方は偽物雑記帳: gnome-terminalのサイズ変更参照。

August 19, 2008

PostgreSQL本 00:08

PostgreSQLって今まで触ったことなかったので適当に入門本ぽいのを掴んでレジへ。

SI現場のPostgreSQL入門 (DBMagazine SELECTION)
小野 哲
翔泳社
売り上げランキング: 191817

2000円しなくて安くていいんだけど、バージョン7.3てだいぶ古くなイカ。

August 20, 2008

timeout 02:29

RubyのTimeout.timeoutぽいのをGaucheで書いてみた。 こういうの結構必要な場面あると思うんだけど、毎回書くのかなぁ。 まあほんの数行だけどさ。それともなんかもっとイカすやつがあるのかなぁ。

(use gauche.threads)

(define (timeout sec proc)
  (guard (e ((<uncaught-exception> e) (raise (uncaught-exception-reason e))))
    (thread-join! (thread-start! (make-thread proc))
                  sec)))

;;--------------------------------

(print (timeout 5 (lambda ()
                    (sys-sleep 3)
                    "foo")))
;;=> foo

(guard (e (else (print e)))
  (timeout 1 (lambda () (sys-sleep 5))))
;;=> #<join-timeout-exception #<thread #f runnable 0x80ec920>>

(timeout 10 (lambda () (error "error occured in proc")))
;;=> gosh: "error": error occured in proc

thread-join!は待ち時間が指定した秒数を越えると join-timeout-exceptionを投げるらしいのでタイムアウトのエラーはそれをそのまま使ってる。 timeout用のエラーを作った方がいい気がするけどもう寝る。 どうせその次はモジュールにしたくなったりするんだ。 寝るべきだ。

いいこと思いついた。お前testのケツのところでapplyしろ 22:55

述語を使ったテストって毎回こう……

(test* "3 is number" #t (number? 3))

expectに#tって書くのでめんどくさい。

(define-macro (test-true msg form)
  `(test* ,msg #t ,form))

という感じでマクロを書いてしまえば

(test-true "3 is number" (number? 3))
;;=> test 3 is number, expects #t ==> ok

となるわけだけど、「expects #t」ってなんだかなぁと思ってちょっとこうしてみる。

(define-macro (test-pred msg pred form)
  `(test* ,msg ,pred (list ,form) apply))

(test* msg expect form compare)は中で(compare expect form)を評価してるので、 compareapply渡してformをlistでくくると(apply pred (list form))つまり (pred form)が#tならpassするテストが書ける。

すると

(test-pred "3 is number" number? 3)
;;=> test number, expects #<subr number?> ==> ok

てな具合にちょっとすっきり書けつつ、「expects #<sub number?>」ってあたりが惜しい感じ。 「expects number」とかになればいいんだけど、さすがにそれはgauche.testのメソッド上書き しないとダメっぽいなぁ。

ただまあ、処理とテストの式が分離できて見栄えはいい感じがする。ホントか?

(test-pred "returns number" (cut is-a? <> <number>) (do-something))
;;=> test returns number, expects #<closure #f> ==> ok

表示はイケてない。

August 31, 2008

読んだ 00:09

Firefox 3 Hacks Mozillaテクノロジ徹底活用テクニック
江村 秀之 池田 譲治 下田 洋志 松澤 太郎 dynamis
オライリージャパン
売り上げランキング: 2059

拡張作る人には良いんじゃないでしょうか。

timeoutのやつ 01:21

ググったらGaucheクックブックにあった (長時間かかる処理にタイムアウトをつける)。 リファレンスマニュアルしか探してなかったよ。 なるほどalarmってこういうふうに使うのか……。

ちなみにalarmだとうまく行かない正規表現のやつは、 スレッド版だとしっかりタイムアウトして返ってきました。 Rubyからパクったかいがあったよ。

(print (current-date))
(guard (e (else (print (current-date))))
  (timeout  1
            (lambda () (#/a+*$/ "aaaaaaaaaaaaaaaaaaaaaaaaaaaab"))))
% gosh timeout.scm
#<date 2008/08/31 01:23:14.839329000 (32400)>
#<date 2008/08/31 01:23:15.845366000 (32400)>

ところでクックブック再開キボン……(´・ω・`)