83's

Top > Archives > 2006 > May

May 01, 2006

スパムがうざい 14:29

ちっくしょー、スパムうぜぇぇぇぇぇぇぇぇ!

トラックバックスパムコメントスパム、 そう言えばメールのほうも結構来る。

トラックバックは参照リンクありなしで蹴ることにして、コメントが問題ですよ。 日本語含まない場合はとりあえずあぼーんするかなぁ。 で、オレが見てスパムでなかったら復活、と。英語 && URIでも良いかもしれない。 これはすぐにはできないなぁ。

にしても、このブログにスパム書き込むために手間暇かけて……。 MTとかtDiaryとかターゲットにしてりゃ楽だろうに……。

そう言えば1月ころからブログ作りなおしを画策していたのに、 飽きるの早かったな……。 デザイン苦手だから、そこで「いけてないなー」と思うとやる気が消えるんですよ。 JavaScriptに夢中になれないのも同じ理由。 Cとかでカリカリやってるほうが向いてるのかも知れない。 外見上の美しさより実装の美のほうが興味あるし。 と言い訳しててもしょうがないんで、ブログは考えないといけないなぁ。

May 05, 2006

checkinstallつおい 02:02

debパッケージもcheckinstallでいけるんですね。便利便利。

Anthyのユーザ辞書をいじくるkasumiってソフトの バグに 困ってたんですが、最新の1.0にしたら直ってました。

正規表現の課題 16:43

うーん、課題4回目は正規表現がテーマなんだけど、おもしろいのが思いつかない。

とりあえず1つ考えてみた。簡単な設定ファイルを読み込むプログラム。

abc = 3.14
dir=/home/yz/mail

students = aho, taka,miya , pika

ignored line
hash= foo : 3, bar : 2 ,hoge:hage

wana1 = ab:,cd
wana2 = ef,gh:i

var = valueの組になっている行を対象として、正規表現を使って読み込むようにしてください、と。 varもvalueも文字列で。3.14と書いてあっても文字列で!

少しは負荷になるように、配列とハッシュもサポート。 面倒なので「,」と「:」があったら強引に切断。 wana1, wana2の対応とか、 「,」で終わる配列定義とかそういう雑多な処理は余力があればという感じ。

さて、数日触ってなかったけどまたSchemeで作ってみます。

;;; load-conf.scm

(use srfi-13)
(use gauche.collection)

(define (load-conf file-name)
  (define (read-lines port)
    (let ((line (read-line port)))
      (if (eof-object? line)
        '()
        (cons line (read-lines port)))))

  (filter (lambda (x) (not (null? x)))
          (map (lambda (line)
                 (let ((match (#/^(\w+)\s*=\s*/ line)))
                   (if match
                     (let ((variable (rxmatch-substring match 1))
                           (value (string-trim-right (rxmatch-after match))))
                       (cond ((#/^([^:,]+:[^:,]+,)*[^:,]+:[^:,]+$/ value)
                              (cons variable
                                    (map (lambda (pair)
                                           (let ((pairs (string-split pair #/\s*:\s*/)))
                                             (cons (car pairs) (cadr pairs))))
                                         (string-split value #/\s*,\s*/))))
                             ((#/,/ value)
                              (cons variable (string-split value #/\s*,\s*/)))
                             (else (cons variable value))))
                     '())))
               (read-lines (open-input-file file-name)))))

いい加減read-linesがめんどくさいんだけど、他に代わる手段が思いつかない……。

;;; test-load.scm

(load "./load-conf.scm")

(define (var item) (car item))

(define (value item) (cdr item))

(for-each (lambda (item) (format #t "var: ~a\tvalue: ~s\n" (var item) (value item)))
          (load-conf (car *argv*)))
yz@ubuntu prog_exercises% gosh test-load.scm conf
var: abc        value: "3.14"
var: dir        value: "/home/yz/mail"
var: students   value: ("aho" "taka" "miya" "pika")
var: hash       value: (("foo" . "3") ("bar" . "2") ("hoge" . "hage"))
var: wana1      value: ("ab:" "cd")
var: wana2      value: ("ef" "gh:i")

format, display, print, writeと、オレが知ってるだけで4つも表示用関数が。でもこれ、

Scheme Ruby format
display print ~a
print puts ~a
write p ~s

と対応づけるとなんとなくわかった気になる。 formatの~sはGJなんだけど、それでもprintfにしといてほしかった。

あとはsed劣化版でも作るかなぁ。それかこれを詰めるか。

正規表現は全2回の予定だったけど、4年生はまあ理解してる感じなので1回にしとこう。 思いつかないし。

次の課題はKWIC作成です。どう実装したもんか、というか、どこまで妥協するのか。 データも用意しないといけないし、オレだって作ったこと無いし、タスクが多すぎ……。

May 07, 2006

今週やること 23:30

ここに書くのが一番だと思うのでメモ。

やること、やりたいことが多くてなかなかTODOが消えない。 これって「あとで読む」って言っといて結局読まないままとか、 そのへんと似てる。 てことで期限を切ることに。

今週の金曜までに次のタスクを終わらせます。

  • 先月(先々月?)先生に「読んでまとめて」と言われてた論文みたいの(英語)
  • 課題のためのデータ作り(今途中)
  • (課題で使う)KWICを作ってみる

土日を含まないのがポイント。「土日にやればいいや」が通用しないように。

May 09, 2006

Vim 7 has been released!!! 01:57

キタ━━━━━━(゜∀゜)━━━━━━ !!!!!

includeとrequire 14:32

自信はないので独り言。

でも、なんでincludeはbarewordでOKなのにrequireはquoteがいるのかというのも、 Perlishな人々にはちょっと引っかかったりして。

Rubyの以下の表記について、片方はquoteがいるのにもう片方は不要であるというのはfrankly I hate that. とのこと。

include Math
require 'complex'

Kernel#require, Module#includeということなので、どうやら特殊な構文ではないみたいですねぇ。 つまり省略された括弧が存在して、

include(Math)
require('complex')

Mathは定数としてアクセスできるわけで'Math'とする必要はない (モジュールが定数Mathとして存在しているのに文字列で渡すのは直接的な感覚ではない)し、 またcomplexは定数・変数として存在しないんだから'complex'として渡す必要がある、と理解してます、オレは。

どちらも普通のメソッドの知識でカバーできるのがRubyという言語の「驚きが少ない」点と言えるかも。

Cの#includeとかJavaのimportは宣言的だけれど、 Rubyのincludeとrequireは書いた位置で実行されるわけで、 そもそもこの機能に対する扱いが異なるみたい。

May 11, 2006

スパマー氏ね 00:30

コメントスパムが止まらないから、 さっきif文にand条件加えてアルファベットとURLくさいのだけのやつはコメント書けないようにしてやったぜ。

てことなんで、コメントしてくれる奇特な方は日本語を入れるようにしてくださいね。

て、書けないようになってねーーーー! 網羅できてないのかしらん。

あの変な表示はむかーし書いた掲示板プログラムで使ってた お手製CSVライブラリがへぼいからみたいです。 マジでダメダメだ。やっぱり再発明イクナイ。

組合せ 01:22

今日授業で「{1, 2, 3, 4}の中から2個とる組合せを生成するにはどうプログラムを組む?」 なんて話があったんだけど、for文で多重ループって発想は出てこなかったよwwww 再帰してましたw

そのあと「{1, 2, ..., n}の中からk個とる組合せ」に話は一般化。 再帰はメモリ食うからダメポとのこと。でもきれいなんだよなぁ。

作ってみた。

(define (combination ls n)
  (cond ((< (length ls) n) '())
        ((= n 1) (map list ls))
        (else (append (map (lambda (cmb) (cons (car ls) cmb))
                           (combination (cdr ls) (- n 1)))
                      (combination (cdr ls) n)))))

(define (make-list n)
  (let loop ((num 1))
    (if (= num n)
      (list num)
      (cons num (loop (+ num 1))))))

(define (make-combination n k)
  (combination (make-list n) k))
gosh> (make-combination 5 3)
((1 2 3) (1 2 4) (1 2 5) (1 3 4) (1 3 5) (1 4 5) (2 3 4) (2 3 5) (2 4 5) (3 4 5))

わーい(=゜ω゜)ノ

こう丸括弧ばっかだと顔文字に見えてくるお。

((^ω^)(*゜∀゜)(・∀・)(´・ω・`)(゜ω゜) (`・ω・´) (゜д゜))

ちなみにC↓

#include <丶`∀´>

この授業が今後ただの数学になりませんように……。

Schemeで顔文字 01:50

こう丸括弧ばっかだと顔文字に見えてくるお。

やっちゃいました。

(define (we-came-from-vip mouths eyes)
  (if (or (null? mouths) (null? eyes)) '()
    (append (map (lambda (eye) (list eye (car mouths) eye))
                 eyes)
            (we-came-from-vip (cdr mouths) eyes))))
gosh> (we-came-from-vip '(∀ ω д) '(^ ・ ゜))
((^ ∀ ^) (・ ∀ ・) (゜ ∀ ゜) (^ ω ^) (・ ω ・) (゜ ω ゜) (^ д ^) (・ д ・) (゜ д ゜))

パターン増やしたい!

研究が… 21:21

今週進んでない……。

考えてみたら、ちょっと研究室の仕事しょいこみ過ぎな気がする。 なんか一人でいろんなことやってるような。 もっと分配したら?と言われましたよ。

任されるとしっかりやり切ろうって思ってしまうんだけど、 一番やらないといけないのは研究なんだからその時間がなくなってるんじゃしょうがない。 これからは人になすりつけよう……w

プログラミング課題も、よいコード見たほうが勉強になるだろうと思って 解答例を送ってみたけどなんて傲慢なんだろうねオレwww ウザスwwww  Perl少し忘れてて本引っ張り出してきちゃったよ。何こんなことに時間使ってるんだ……。

今週のは前のとほとんどかわんないから解答出すのやーめた。 課題考えるのも結構しんどいんで、実装方法もお任せにしようかな。

という感じでtodoが1つしか消えてないんだが、ほんとどうしよう……。 あ、KWICは実装お任せにするから消去。あと一つかぁ。

May 14, 2006

急に馴れ馴れしくなるWikipedia 20:28

野球中継のCM中にWikipedia見てたんだけど、なんだこれwwwww

現代野球において対左打者のワンポイントとして左のサイドスロー投手を ベンチ入りさせることが多くなっているよ。

May 15, 2006

先週の反省と今週の目標 02:00

先週は何に時間を使ってたんだろう……。

  • 先月(先々月?)先生に「読んでまとめて」と言われてた論文みたいの(英語)
  • 課題のためのデータ作り(今途中)
  • (課題で使う)KWICを作ってみる

データ作りはひとまず終えることができた。 KWICは実装お任せにするので、どう作るか検討する必要がなくなったんで消去。

論文みたいのって Issues, Tasks and Program Structures to Roadmap Research in Question & Answering ってやつなんだけど、ちょっとなめてました。量多いし。 てことで早速予定どおりにいかなかった(つД`)

今週はとりあえずこいつを読み切ることを目標にします。 もちろんゼミの予習をしたり授業に出つつ。

nautilusで共有フォルダ見れるんだね 21:17

オレのはnautilus 2.12.1だけど、場所を「smb://〜」て指定してやると Windowsの共有フォルダにアクセスできるのかー。

smbclientていうftpライクなのがあるみたいな話だったんで CLIでカリコリやるのかと思ってうんざりしてたけど、 これなら便利でいいですね。

あとはプリンタの設定だな……。

May 16, 2006

Ruby→Schemeに必要なものを整理 04:41

Rubyで良く使うのにSchemeでどうするのかわかってないものを 少し整理して、Schemeタンともっと仲良くなるよ!

やっと見つけたFile#readlinesにあたるやつ。これはport->string-listでおk。

String#sliceの代わり。

gosh> ((#/[sS]cheme/ "The Little Schemer"))
"Scheme"
gosh> ((#/([sS]cheme)r/ "The Little Schemer") 1)
"Scheme"
gosh> ((#/\s[sS]chemer/ "The Little Schemer") 'before)
"The Little"

これはカワユス!!

String#splitはstring-splitで。少し挙動が違うけど。

String#subとString#gsubはregexp-replaceとregexp-replace-allでよさげ。

String#scanも欲しいんだけど、結構探したんだけど見付からない……。 とりあえずでっちあげ。

(define (regexp-scan regexp string . proc)
  (define (return-match-list str)
    (let ((match (regexp str)))
    (if match
      (cons (match) (return-match-list (match 'after)))
      '())))

  (define (apply-proc str)
    (let ((match (regexp str)))
      (if match
        (begin
          ((car proc) (match))
          (apply-proc (match 'after))))))

  (if (null? proc)
    (return-match-list string)
    (apply-proc string)))
gosh> (regexp-scan #/[ab]/ "abcabc")
("a" "b" "a" "b")
gosh> (regexp-scan #/[ab]/ "abcabc" print)
a
b
a
b
#<undef>

うーん。Perlの//gでもいいのに。

簡単にグローバルマッチする方法ってないかな……?  (追記: やっぱり自分で書くみたい。「Schemeのグローバルマッチ」を参照)

とりあえず時間があれなので寝る。 

Schemeのグローバルマッチ 12:00

2ちゃんでページを教えてもらいました。 やっぱりグローバルマッチは自分で書くしかないのか……。

(use srfi-42)
(define (rxmatch-all re str)
  (let loop ((r '()) (str str))
    (let1 m (rxmatch re str)
      (if m
        (loop (let1 nmatch (rxmatch-num-matches m)
                (if (= nmatch 1)
                  (cons (m 0) r)
                  (append! (reverse! (list-ec (: i 1 nmatch) (m i))) r)))
              (m 'after))
        (reverse! r)))))

(rxmatch-all #/./ "abc")      ; => ("a" "b" "c")
(rxmatch-all #/.(.)/ "abcde") ; => ("b" "d")

なるほど。朝方書いたのは/.(.)/みたいに括弧で 括った部分のみ取り出したい場合を考慮してなかった。

にしても勉強になるなぁ。マッチ部分をreverse!してからrとappend!してるのは append!の計算量が1つ目の引数のリストの個数分かかるから、ですよね。 rのほうが長いリストになることが多いからこれは第1引数にしない、と。 そしてこれ末尾再帰になる、よね。

気になるのはappend!とreverse!の「!」で、第1引数を破壊的に変更するっていう動作だと思うんだけど、 上のコードだと「!」はなくても動くような。何かパフォーマンス的に理由があったりするのかなぁ。

あとlist-ecなにこれ。

gosh> (list-ec (: i 0 10) i)
(0 1 2 3 4 5 6 7 8 9)
gosh> (list-ec (: i 0 10) (* i i))
(0 1 4 9 16 25 36 49 64 81)

あーっ!! リストを作り出したいときは再帰で回すより絶対楽だ……。

ちなみにRubyのString#scanだと

>> "abcdef".scan(/./)
=> ["a", "b", "c", "d", "e", "f"]
>> "abcdef".scan(/(.)(.)/)
=> [["a", "b"], ["c", "d"], ["e", "f"]]

なので、

(use srfi-42)
(define (rxmatch-all re str)
  (let loop ((r '()) (str str))
    (let1 m (rxmatch re str)
          (if m
            (loop (let1 nmatch (rxmatch-num-matches m)
                        (if (= nmatch 1)
                          (cons (m 0) r)
                          (cons (list (list-ec (: i 1 nmatch) (m i))) r)))
                  (m 'after))
            (reverse r)))))

とすれば

gosh> (rxmatch-all #/./ "abcdefg")
("a" "b" "c" "d" "e" "f" "g")
gosh> (rxmatch-all #/(.)(.)/ "abcdefg")
(("a" "b") ("c" "d") ("e" "f"))

おし。

May 18, 2006

ぼやき 17:04

Perlって本の多さもまた魅力だよなー。

Rubyは今後に期待。Schemeは……。

May 21, 2006

apply 14:35

gaucheのリファレンスのapplyの 引数のところの(arg1 … . args)で意味がわかんなくなってたんだけど、 R5RSを 読んで氷解。

(apply proc arg1 ... args)

proc は手続きでなければならず,args はリストでなければな らない。proc を,リスト(append (list arg1 ... ) args) の各要素を各実引数として呼び出す。

なるほど。

(apply proc arg1 ... args)

   ↓

(apply proc (append (list arg1 ...) args))

ということみたいなので

gosh> (apply + '(1 2 3))
6
gosh> (apply + 1 '(2 3))
6
gosh> (apply + 1 2 '(3))
6
gosh> (apply + 1 2 3 '())
6

なるほど。

これでやっと、2次元配列の要素を縦に足すコードの 以下の2つが同じであることに合点がいく。

(define data '((1 2 3) (4 5 6) (7 8 9)))

(apply map (cons + data))
;=> (12 15 18)

(apply map + data)
;=> (12 15 18)

すげー。ここまで短くする脳味噌が早く欲しいです。

で、(append (list arg1 ... arg_n) args)を(arg1 ... arg_n . args)と書けるわけですか。 確かにarg_nのcdrがargs……。うーん、気づかなかった。

gosh> '(1 2 . (3 4 5))
(1 2 3 4 5)

ほんとだ。まだ慣れてないなぁ。

May 24, 2006

EffectiveとかEfficientとかまぎらわしー 13:46

ああーー、生協で本見てたら買っちゃったよ……。

Effective C++ 原著第3版
posted with amazlet on 06.05.24
スコット・メイヤーズ 小林 健一郎
ピアソン・エデュケーション (2006/04/29)

2色刷りとかいらないから安くしてほしい。

C++は数年前に学校で少しやって、あとは独習C++読んだくらいしか知識が無い。 この本に期待しているのは、どうやったらあのゴチャゴチャ感、マンドクセ感が整理されて くるのかってところ。Javaくらいに余計なこと考えずにできればいいんですが。

C++はそんなこんなでかなり嫌いな言語の部類に入るので、その偏見が取れればなと思う。

さて、生活費があと3週間くらいしかもたない。どうしたもんか……。 とりあえずネットと水道が止められると困るのでこれは払っておかないと……。

May 25, 2006

研究室のLinuxで音楽を 18:00

やっと音楽を聴く環境が整った。 いろいろあったんですよ。ALSAとかOSSとかESDとかわけわかんねーーー。

あとは前にiTunesでエンコードしたm4aファイルとVIP STARのmp3をRhythmbox Music Playerで再生できるように。 (参考:Re: [Rhythmbox-devel] Rhythmbox and m4a

(Ubuntu Breezy)
sudo aptitude install faad gstreamer0.8-faad gstreamer0.8-mad

これでやっとB'zが聴けるのだわ。B'zは最高よ。

May 30, 2006

日記始めました 20:06

http://d.hatena.ne.jp/yzatkatamayuで つまらない日記書きます。

ソースコードを見たくない人にはおすすめ。