人生投げてます?な日記 in March, 2005

さいととっぷへごー!

<< < 2005-03
Su Mo Tu We Th Fr Sa
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
TOPIC-LIST
31(Thursday)
お仕事[WORK]
魔王と踊れ!
30(Wednesday)
お仕事[WORK]
入門xyzzy
29(Tuesday)
お仕事[WORK]
魔王と踊れ!
28(Monday)
お仕事[WORK]
入門xyzzy[Shopping]
魔王と踊れ!
27(Sunday)
お買い物[Shopping]
換装
魔王と踊れ!
26(Saturday)
お仕事WORK]
お買い物[Shopping]
25(Friday)
お仕事[WORK]
お買い物[Shopping]
魔王と踊れ!
24(Thursday)
お仕事[WORK]
23(Wednesday)
お仕事[WORK]
QDBM on xyzzy
22(Tuesday)
お仕事[WORK]
QDBM on xyzzy0.0.0.1
21(Monday)
お仕事[WORK]
QDBM on xyzzyその3
20(Sunday)
QDBM on xyzzyその2
19(Saturday)
お買い物[Shopping]
QDBM on xyzzy
18(Friday)
お仕事[WORK]
QDBM、再び
17(Thursday)
お仕事[WORK]
xyzzy0.2.2.234
16(Wednesday)
お仕事[WORK]
animatewindow.lその3
Generated by nDiary version 0.9.4

2005.03.16 (Wed)

1 おはようございます
6:00、起床。うー、眠いー
外は曇り空。早く雪が溶けないかなぁ
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「今日は確か何かの講習会があったような?」
カレン「あるけど、忘れてるの?」
LKPTeam「……思い出しましたよ」
カレン「ということは、忘れてたのね?」
LKPTeam「あぅー」
さ、さて、仕事に行くか(^^;
2 お仕事...とか[WORK]
のらりくらりと会議の準備とか書類の作成とか。んー、今日は結構忙しかったかも<かもかよ
3 animatewindow.lその3...とか[xyzzy]
PlatformSDKとか英語ですけど参考になりますね。あとbcc55のIncludeディレクトリ配下にあるヘッダファイルとか。……ぜんぜんlispの参考資料じゃないですけど(^^;
こんなところかなぁ、タダの資料って。あとはWebで探せば大抵は見つかるし
xyzzylispの解説が付いてくるらしい『入門xyzzy』は資料が少ないxyzzylispにとっては結構助かるのかもしれない……
ということで、今日はボタンテストのコードを実験してみた
(require "animatewindow")
(c::*define IDC_BUTTON_OK 10)
(c::*define IDC_BUTTON_CANCEL 11)
(delete-hook 'win-user::*animatewindow-after-parentwindow-hook*
             'win-user::create-child-window)
(add-hook 'win-user::*animatewindow-after-parentwindow-hook*
          #'(lambda (hWnd clientrect)
              (let ((height 20) (margin-x 5) (margin-y 5))
              (winapi::CreateWindowEx
                 0
                 (si:make-string-chunk "Static")
                 (si:make-string-chunk "ボタンテスト")
                 (logior winapi::WS_BORDER
                         winapi::WS_CHILD
                         winapi::WS_VISIBLE
                         win-user::SS_CENTER)
                 (+ (winapi::RECT-left clientrect) margin-x)
                 (- (winapi::RECT-bottom clientrect) (+ height margin-y))
                 (- (- (winapi::RECT-right clientrect)
                       (winapi::RECT-left clientrect)) (* 2 margin-x))
                 height
                 hWnd
                 0
                 (winapi::GetModuleHandle 0)
                 0)
                (winapi::CreateWindowEx
                   0
                   (si:make-string-chunk "Button")
                   (si:make-string-chunk "OK")
                   (logior winapi::WS_CHILD
                           winapi::WS_VISIBLE
                           )
                   (+ (winapi::RECT-left clientrect) margin-x)
                   (+ (winapi::RECT-top clientrect) margin-y)
                   (/ (- (- (winapi::RECT-right clientrect)
                            (winapi::RECT-left clientrect)) (* 2 margin-x))
                      2)
                   height
                   hWnd
                   IDC_BUTTON_OK
                   (winapi::GetModuleHandle 0)
                   0)
                (winapi::CreateWindowEx
                   0
                   (si:make-string-chunk "Button")
                   (si:make-string-chunk "Cancel")
                   (logior winapi::WS_CHILD
                           winapi::WS_VISIBLE
                           )
                   (+ (winapi::RECT-left clientrect)
                      (* 2 margin-x)
                      (/ (- (- (winapi::RECT-right clientrect)
                               (winapi::RECT-left clientrect))
                            (* 2 margin-x))
                         2))
                   (+ (winapi::RECT-top clientrect) margin-y)
                   (- (/ (- (winapi::RECT-right clientrect)
                            (winapi::RECT-left clientrect))
                         2)
                      (* 2 margin-x))
                   height
                   hWnd
                   IDC_BUTTON_CANCEL
                   (winapi::GetModuleHandle 0)
                   0)
                )))
(c::defun-c-callable winapi::LRESULT win-user::animate-window-wndproc
  ((winapi::HWND hWnd) (winapi::UINT msg) (winapi::WPARAM wparam) (winapi::LPARAM lparam))
                  (cond
                     ((= msg winapi::WM_NCDESTROY)
                      (return-from win-user::animate-window-wndproc 0)
                      )
                     ((= msg winapi::WM_CTLCOLORSTATIC)
                      (win-user::SetBkMode wparam win-user::TRANSPARENT)
                      (return-from win-user::animate-window-wndproc
                        (win-user::CreateSolidBrush (win-user::RGB 224 255 255)))
                      )
                     ((= msg winapi::WM_CREATE)
                      (return-from win-user::animate-window-wndproc 0)
                      )
                     ((= msg winapi::WM_COMMAND)
                      (cond ((= (winapi::LOWORD wparam) IDC_BUTTON_OK)
                             (ed::msgbox "OK button Clicked!")
                            )
                            ((= (winapi::LOWORD wparam) IDC_BUTTON_CANCEL)
                             (ed::msgbox "Cancel button Clicked!")
                             ))
                      (return-from win-user::animate-window-wndproc 0)
                      )
                     )
  (winapi::DefWindowProc hWnd msg wparam lparam))
(create-animate-window
   :window-height 60
   :window-show-style (logior winapi::AW_SLIDE winapi::AW_HOR_POSITIVE)
   :window-hide-style (logior winapi::AW_HIDE winapi::AW_CENTER winapi::AW_BLEND)
   )
すぐに消えるからアレだけど。こういうボタンを使う用途も考えるとアニメーションの箇所も自分で再定義できるように作り替える必要があるなぁ。*animatewindow-effect-hook*とか作るかな。でもそうなるとanimatewindowじゃなくなる可能性もあるよねぇ……ファイル名も変えるか(笑)
というか、このいびつなlispコード(*1)の利用価値ってスライドアニメーションとかそういう箇所くらいしかないんだけどな。そういうのをメインに据えないとなるといまいち価値がなくなるなぁ
でもまぁ、自分で使ってるから別にいいか(^^;
$Date: 2005-03-17 01:03:50 +0900 (Thu, 17 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050316.diary $

*1: lispコードと言っていいのかどうか分からんが。ある意味ほとんどWindowsSDKのコードだもんなぁ(^^;
ぺーじとっぷへごー

2005.03.17 (Thu)

1 おはようございます
6:00、起床。うー、今日も眠いー
外は曇り空。晴れてはいないけど、そんなに寒いわけではない様子。どんどん春めいてくるなぁ……って本当はもうかなり暖かくなってないといけないんだけど(^^;
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「今日も仕事、明日も仕事」
カレン「その台詞は聞き飽きたから止めなさい」
LKPTeam「うーあー(^^;」
カレン「まぁ、今日明日仕事したら休みでしょう?」
LKPTeam「はっ、そういえば」
カレン「覚えてなさいよ……」
LKPTeam「あ、あははは」
2 お仕事...とか[WORK]
うぅ、忙しくて自分の時間が取れないー。ということで今日は真面目に仕事してましたとさ。いつもしてるけど。……疲れたですよ……
3 xyzzy0.2.2.234...とか[xyzzy]
バージョンアップしてました。MLでなんかいつもよりも量が多いなと思ってたら(^^;
というわけでさっそくバージョンアップ。変更点は……なんかいろいろ?(笑)
ちょこちょことソースも読んでいかないとなぁ……
$Date: 2005-03-18 01:02:39 +0900 (Fri, 18 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050317.diary $
ぺーじとっぷへごー

2005.03.18 (Fri)

1 おはようございます
6:00、起床。うーん、眠い
外は晴れ模様?ちょっと雲が多いけどいい天気だ
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「今日もいい天気ですねぇ」
カレン「雪、早く溶けるといいわね」
LKPTeam「ですね」
LKPTeam「さて、今週の仕事も今日で終了ですよ」
カレン「頑張らないとね」
LKPTeam「うぃ」
2 お仕事...とか[WORK]
ふふふ、今日はあまり仕事をしなかったよ(笑)<ダメじゃん
3 QDBM、再び...とか[xyzzy]
ということで、会社で何をしてたかと言いますと、一度挫折してるQDBMを動かすための勉強をしてました(笑)
いやぁ、あのときは勉強不足でイテレータの使い方が、というよりもチャンクの使い方がよく分からなくて挫折したんだよね。でも今回はちょっと違うぜ
使ったQDBMのバージョンは最新だと思われる1.8.21、Windowsのバイナリであります。それを解凍して出てくるディレクトリの中にあるDLLを全てxyzzy.exeと同じディレクトリに放り込んでおきます。以上が下準備その1
次に以下のコードをqdbm.lとして$XYZZYHOME/site-lisp以下に放り込んでおきましょう
;;; -*- MODE: Lisp; PACKAGE: QDBM; -*-
;;;
 
(defpackage "qdbm"
 (:use "lisp" "editor" "foreign"))
 
(c::*define-c-struct DEPOT
 ((char *) name)       ; /* type of structure for a database handle */
 (c::int wmode)        ; /* name of the database file */
 (c::int inode)        ; /* whether writable or not */
 (c::int mtime)        ; /* inode of the database file */
 (c::int fd)           ; /* last modified time of the database */
 (c::int fsiz)         ; /* file descriptor of the database file */
 ((char *) map)        ; /* size of the database file */
 (c::int msiz)         ; /* pointer to the mapped memory */
 ((c::int *) buckets)  ; /* pointer to the bucket array */
 (c::int bnum)         ; /* number of the bucket array */
 (c::int rnum)         ; /* number of records */
 (c::int fatal)        ; /* whether a fatal error occured or not /*
 (c::int ioff)         ; /* offset of the iterator */
 (c::int mroff)        ; /* offset of the last moved region */
 (c::int mrsiz)        ; /* size of the last moved region */
 (c::int align))       ; /* basic size of alignment */
 
(c::*define DP_ENOERR  0)  ;/* no error */
(c::*define DP_EFATAL  1)  ;/* with fatal error */
(c::*define DP_EMODE   2)  ;/* invalid mode */
(c::*define DP_EBROKEN 3)  ;/* broken database file */
(c::*define DP_EKEEP   4)  ;/* existing record */
(c::*define DP_ENOITEM 5)  ;/* no item found */
(c::*define DP_EALLOC  6)  ;/* memory allocation error */
(c::*define DP_EMAP    7)  ;/* memory mapping error */
(c::*define DP_EOPEN   8)  ;/* open error */
(c::*define DP_ECLOSE  9)  ;/* close error */
(c::*define DP_ETRUNC  10) ;/* trunc error */
(c::*define DP_ESYNC   11) ;/* sync error */
(c::*define DP_ESTAT   12) ;/* stat error */
(c::*define DP_ESEEK   13) ;/* seek error */
(c::*define DP_EREAD   14) ;/* read error */
(c::*define DP_EWRITE  15) ;/* write error */
(c::*define DP_ELOCK   16) ;/* lock error */
(c::*define DP_EUNLINK 17) ;/* unlink error */
(c::*define DP_EMKDIR  18) ;/* mkdir error */
(c::*define DP_ERMDIR  19) ;/* rmdir error */
(c::*define DP_EMISC   20) ;/* miscellaneous error */
 
(c::*define DP_OREADER (ash 1 0)) ; /* open as a reader */
(c::*define DP_OWRITER (ash 1 1)) ; /* open as a writer */
(c::*define DP_OCREAT (ash 1 2))  ; /* a writer creating */
(c::*define DP_OTRUNC (ash 1 3))  ; /* a writer truncating */
(c::*define DP_ONOLCK (ash 1 4))  ; /* open without locking */
(c::*define DP_OSPARSE (ash 1 5)) ; /* create as a sparse file */
 
(c::*define DP_DOVER 0) ;   /* overwrite an existing value */
(c::*define DP_DKEEP 1) ;   /* keep an existing value */
(c::*define DP_DCAT  2) ;   /* concatenate values */
 
(let ((dll "qdbm.dll"))
 (c::*define-dll-entry (DEPOT *) dpopen ((char *) c::int c::int) dll)
 (c::*define-dll-entry c::int dpclose ((DEPOT *)) dll)
 (c::*define-dll-entry c::int dpput ((DEPOT *) (char *) c::int (char *) c::int c::int) dll)
 (c::*define-dll-entry c::int dpout ((DEPOT *) (char *) c::int) dll)
 (c::*define-dll-entry (char *) dpget ((DEPOT *) (char *) c::int c::int c::int (c::int *)) dll)
 (c::*define-dll-entry c::int dpgetwb ((DEPOT *) (char *) c::int c::int c::int (char *)) dll)
 (c::*define-dll-entry c::int dpvsiz ((DEPOT *) (char *) c::int) dll)
 (c::*define-dll-entry c::int dpiterinit ((DEPOT *)) dll)
 (c::*define-dll-entry (char *) dpiternext ((DEPOT *) (c::int *)) dll)
 (c::*define-dll-entry c::int dpsetalign ((DEPOT *) c::int) dll)
 (c::*define-dll-entry c::int dpsync ((DEPOT *)) dll)
 (c::*define-dll-entry c::int dpoptimize ((DEPOT *) c::int) dll)
 (c::*define-dll-entry (char *) dpname ((DEPOT *)) dll)
 (c::*define-dll-entry c::int dpfsiz ((DEPOT *)) dll)
 (c::*define-dll-entry c::int dpbnum ((DEPOT *)) dll)
 (c::*define-dll-entry c::int dpbusenum ((DEPOT *)) dll)
 (c::*define-dll-entry c::int dprnum ((DEPOT *)) dll)
 (c::*define-dll-entry c::int dpwritable ((DEPOT *)) dll)
 (c::*define-dll-entry c::int dpfatalerror ((DEPOT *)) dll)
 (c::*define-dll-entry c::int dpinode ((DEPOT *)) dll)
 (c::*define-dll-entry c::int dpmtime ((DEPOT *)) dll)
 (c::*define-dll-entry c::int dpfdesc ((DEPOT *)) dll)
 (c::*define-dll-entry c::int dpremove ((char *)) dll)
 (c::*define-dll-entry c::int dprepair ((char *)) dll)
 (c::*define-dll-entry c::int dpexportdb ((DEPOT *) (char *)) dll)
 (c::*define-dll-entry c::int dpimportdb ((DEPOT *) (char *)) dll)
 (c::*define-dll-entry c::int dpinnerhash ((char *) c::int) dll)
 (c::*define-dll-entry c::int dpouterhash ((char *) c::int) dll)
 (c::*define-dll-entry c::int dpprimenum (c::int) dll)
 (c::*define-dll-entry c::void dpecodeset (c::int (char *) c::int) dll)
 (c::*define-dll-entry (c::int *) dpecodeprt () dll)
 (c::*define-dll-entry c::int dpmemsync ((DEPOT *)) dll)
 (c::*define-dll-entry c::int dpgetflags ((DEPOT *)) dll)
 (c::*define-dll-entry c::int dpsetflags ((DEPOT *) c::int) dll)
 )
次にテスト用スクリプト。こっちはqdbmtest.lとでもしておいて、さっきと同様$XYZZYHOME/site-lisp以下に置いておきます
(require "qdbm")
(defconstant dpdatabase "DEPOT.qdbm")
(setq db (make-DEPOT))
(defmacro qdbm-dbopen (command dbname mode bucket)
  `(let ((result nil))
     (setq result (,command ,dbname ,mode ,bucket))
     (insert
        (format nil
                "~20a ~[failed. ~;success.~] [~a]\n"
                ',command
                (if (eql 0 result)
                    0
                  1)
                result))
     result))
     
(defmacro qdbm-test-1 (test error-value command cmdname &rest args)
 `(let ((result nil)
        (rval nil))
    (setq rval (,command ,@args))
    (setq result
          (funcall ,test ,error-value rval))
    (insert (format nil
                    "~20a ~[failed. ~;success.~] [~a]\n"
                    ',cmdname (if result 0 1) rval))
    (if result nil t)))
 
(defun qdbm-test ()
 (interactive)
 (let ((result nil)
       (dkey (si:make-string-chunk "dummy-key"))
       (dval (si:make-string-chunk "dummy-value"))
       )
   (insert (format nil "~20a command-result\n" 'command))
   ;;; qdbm::DEPOT test
   (let ((db nil))
     (and
        (progn
          (setq db (qdbm-dbopen
                      dpopen
                      (si:make-string-chunk dpdatabase)
                      (logior DP_OWRITER DP_OCREAT)
                      0))
          (if (eql db 0) nil t))
        (qdbm-test-1 'eql 0 dpclose dpclose db)
        (progn
          (setq db (qdbm-dbopen
                      dpopen
                      (si:make-string-chunk dpdatabase)
                      (logior DP_OWRITER DP_OCREAT)
                      0))
          (if (eql db 0) nil t))
        (qdbm-test-1 'eql 0 dpput dpput db dkey -1 dval -1 DP_DKEEP)
        (qdbm-test-1 'eql 1 dpput dpput[DP_DKEEP] db dkey -1 dval -1 DP_DKEEP)
        (qdbm-test-1 'eql 0 dpput dpput[DP_DOVER] db dkey -1 dval -1 DP_DOVER)
        (qdbm-test-1 'eql 0 dpout dpout db dkey -1)
        (qdbm-test-1 'eql 0 dpput dpput[DP_DCAT]  db dkey -1 dval -1 DP_DCAT)
        (qdbm-test-1 'eql 0 dpput dpput[DP_DCAT]  db dkey -1 dval -1 DP_DCAT)
        (qdbm-test-1 'eql 0 dpclose dpclose db)
        (progn
          (setq db (qdbm-dbopen
                      dpopen (si:make-string-chunk dpdatabase)
                      DP_OREADER 0))
          (if (eql db 0) nil t))
        (qdbm-test-1 'eql 0 dpget dpget db dkey -1 0 -1 0)
        (qdbm-test-1 'eql 0 dpclose dpclose db)
        (progn (setq db (qdbm-dbopen
                           dpopen (si:make-string-chunk dpdatabase)
                           DP_OREADER 0))
          (if (eql db 0) nil t))
        (progn
          (let ((buf (si:make-chunk 'string 300)))
            (qdbm-test-1 'eql -1 dpgetwb dpgetwb db dkey -1 0 (si:chunk-size buf) buf)))
        (qdbm-test-1 'eql -1 dpvsiz dpvsiz db dkey -1)
        (qdbm-test-1 'eql 0 dpiterinit dpiterinit db)
        (qdbm-test-1 'eql 0 dpiternext dpiternext db 0)
        (qdbm-test-1 'eql 0 dpclose dpclose db)
        (progn (setq db (qdbm-dbopen
                           dpopen (si:make-string-chunk dpdatabase)
                           DP_OWRITER 0))
          (if (eql db 0) nil t))
        (qdbm-test-1 'eql 0 dpsetalign dpsetalign db 15)
        (qdbm-test-1 'eql 0 dpsync dpsync db)
        (qdbm-test-1 'eql 0 dpoptimize dpoptimize db -1)
        (qdbm-test-1 'eql 0 dpname dpname db)
        (qdbm-test-1 'eql -1 dpfsiz dpfsiz db)
        (qdbm-test-1 'eql -1 dpbnum dpbnum db)
        (qdbm-test-1 'eql -1 dpbusenum dpbusenum db)
        (qdbm-test-1 'eql -1 dprnum dprnum db)
        (qdbm-test-1 'eql 0 dpwritable dpwritable db)
        (qdbm-test-1 'eql 1 dpfatalerror dpfatalerror db)
        (qdbm-test-1 'eql -1 dpinode dpinode db)
        (qdbm-test-1 'eql 0 dpmtime dpmtime db)
        (qdbm-test-1 'eql 0 dpfdesc dpfdesc db)
        (qdbm-test-1 'eql 0 dpclose dpclose db)
        (qdbm-test-1 'eql 0 dprepair dprepair (si:make-string-chunk dpdatabase))
        (progn (setq db (qdbm-dbopen
                           dpopen (si:make-string-chunk dpdatabase)
                           DP_OREADER 0))
          (if (eql db 0) nil t))
        (let ((exportdb (si:make-string-chunk (format nil "ext~a" dpdatabase)))
              (importdb (si:make-string-chunk (format nil "imp~a" dpdatabase))))
          (qdbm-test-1 'eql 0 dpexportdb dpexportdb db exportdb)
          (qdbm-test-1 'eql 0 dpclose dpclose db)
          (progn (setq db (qdbm-dbopen
                             dpopen importdb
                           (logior DP_OWRITER DP_OCREAT) 0))
          (if (eql db 0) nil t))
          (qdbm-test-1 'eql 0 dpimportdb dpimportdb db exportdb)
          (qdbm-test-1 'eql 0 dpclose dpclose db)
          (qdbm-test-1 'eql 0 dpremove dpremove exportdb)
          (qdbm-test-1 'eql 0 dpremove dpremove importdb)
          )
        (progn (setq db (qdbm-dbopen
                           dpopen (si:make-string-chunk dpdatabase)
                           DP_OREADER 0))
          (if (eql db 0) nil t))
        (qdbm-test-1 'eql 0 dpinnerhash dpinnerhash dkey -1)
        (qdbm-test-1 'eql 0 dpouterhash dpouterhash dkey -1)
        (qdbm-test-1 'eql 0 dpprimenum dpprimenum 100)
        (insert "\n[DEPOT] All the commands succeeded. \n\n"))
     (qdbm-test-1 'eql 0 dpclose dpclose db)
     (qdbm-test-1 'eql 0 dpremove dpremove (si:make-string-chunk dpdatabase))
     )))
両方をファイルに保存したら、新しいxyzzyを立ち上げて、*scratch*バッファにでも以下を打ち込んで
(require "qdbmtest")
C-Enterで評価(*1)。そして、M-x qdbm-test。全てのコマンドが成功して、
command              command-result
dpopen               success. [44571456]
dpclose              success. [1]
dpopen               success. [44571536]
dpput                success. [1]
dpput[DP_DKEEP]      success. [0]
dpput[DP_DOVER]      success. [1]
dpout                success. [1]
dpput[DP_DCAT]       success. [1]
dpput[DP_DCAT]       success. [1]
dpclose              success. [1]
dpopen               success. [44571616]
dpget                success. [44571696]
dpclose              success. [1]
dpopen               success. [44571728]
dpgetwb              success. [22]
dpvsiz               success. [22]
dpiterinit           success. [1]
dpiternext           success. [44571808]
dpclose              success. [1]
dpopen               success. [44571824]
dpsetalign           success. [1]
dpsync               success. [1]
dpoptimize           success. [1]
dpname               success. [44572304]
dpfsiz               success. [135]
dpbnum               success. [5]
dpbusenum            success. [1]
dprnum               success. [1]
dpwritable           success. [2]
dpfatalerror         success. [0]
dpinode              success. [0]
dpmtime              success. [1111157015]
dpfdesc              success. [3]
dpclose              success. [1]
dprepair             success. [1]
dpopen               success. [44572496]
dpexportdb           success. [1]
dpclose              success. [1]
dpopen               success. [44569152]
dpimportdb           success. [1]
dpclose              success. [1]
dpremove             success. [1]
dpremove             success. [1]
dpopen               success. [44569600]
dpinnerhash          success. [776845421]
dpouterhash          success. [277264121]
dpprimenum           success. [103]
 
[DEPOT] All the commands succeeded. 
 
dpclose              success. [1]
dpremove             success. [1]
なんて出力が得られたらxyzzyから動かした時の動作確認は終了です(*2)。ちなみに[]の中の数値は多少違うことになると思うので、そっちは気にしなくてもいいでしょう。さて次にいよいよイテレータを動かします。前回もイテレータは動いていたのですが、戻り値が(char *)なんていう型だったので、xyzzyでどういう風にやれば文字列に戻せるのか分からなかったのですが、以下のようにすればxyzzyで読める文字列に変換することが出来ることが分かったでありますよ
(require "qdbm")
; データベース名の設定
(setq dbname (si:make-string-chunk "DEPOT.qdbm"))
; 登録するキー1、キー2
(setq dkey (si:make-string-chunk "dummy-key"))
(setq dkey2 (si:make-string-chunk "dummy-key2"))
; 登録する値1、値2
(setq dval (si:make-string-chunk "dummy-value"))
(setq dval2 (si:make-string-chunk "dummy-value2"))
; データベースを書き込みモードで開く
(setq db (dpopen dbname (logior DP_OWRITER DP_OCREAT) 0))
; キー、値の書き込み
(dpput db dkey -1 dval -1 DP_DKEEP)
(dpput db dkey2 -1 dval2 -1 DP_DKEEP)
; データベースを閉じる
(dpclose db)
; データベースを読み取りモードで開く
(setq db (dpopen dbname DP_OREADER 0))
; イテレータの初期化
(setq iterator (dpiterinit db))
; 取得データのサイズを書き込むための領域を確保
(setq size (si:make-chunk 'c::int 4))
; イテレータを使ってキーが書き込まれている領域へのポインタを取得
(setq buf-pointer (dpiternext db size))
; 書き込まれた領域を参照するチャンクの作成
(setq buf (si:make-chunk 'char (si:unpack-int32 size 0) nil buf-pointer))
; lispで読み込める形に変換
(setq keyname (si:unpack-string buf 0 (si:unpack-int32 size 0)))
"dummy-key"
; チャンクをクリア
(si:clear-chunk buf)
(si:clear-chunk size)
; 値の取得
(setq buf-pointer (dpget db (si:make-string-chunk keyname) -1 0 -1 size))
; 書き込まれた値の領域を参照するチャンクの作成
(setq buf (si:make-chunk 'char (si:unpack-int32 size 0) nil buf-pointer))
; lispで読み込める形に変換
(setq valuename (si:unpack-string buf 0 (si:unpack-int32 size 0)))
"dummy-value"
(dpclose db)
1
コメントも一緒でちょっと分かりづらいですが。ようするに(char *)で戻ってくるのが領域の先頭のアドレスということなので、そこを先頭とするチャンクを作ってしまえば、あとはxyzzyで読み込めるわけだったんですね。何で前は気がつかなかったんだろう(^^;
でもこれでとりあえずイテレータも使えることが分かったし、Curiaも動かせるかも、という希望が見えてきたですよ(^^;
$Date: 2005-03-19 00:06:57 +0900 (Sat, 19 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050318.diary $

*1: あるいはC-jでも可
*2: Windowsでの動作確認にはwin32check.batがあるのでそっちを使ってください。
ぺーじとっぷへごー

2005.03.19 (Sat)

1 おはようございます
9:00、起床。んー、もう少し寝ていたかったかも
外は曇り空。まぁまぁの天気ですな
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「連休初日ー」
カレン「特にすることないけどね」
LKPTeam「ぐさっ」
LKPTeam「そういう事は言わなくてもいいのにー」
カレン「あはは、ごめんね」
LKPTeam「それに今日はちゃんとすることがありますですよ」
カレン「買い物、なんていうのはダメよ?」
LKPTeam「……」
カレン「図星なの?(^^;」
LKPTeam「うー」
カレン「ワンパターンねぇ」
LKPTeam「いいじゃないですカー」
うぅ、うぅ……(笑)
2 お買い物...とか[Shopping]
とりあえずは先週買い逃した暗黒館の下巻を査収するべく本屋へ。どうやらまだ売れ残ってたみたいで購入。そして今日のメインイベントへ
家でPCを使うときってやっぱりパソコン机とかが多いとは思うんだけど、家では違って今はもう使ってないオーディオラックを分解して、天板なんかを再利用して自作のテーブルみたいなものを作ってその上にモニタを、テーブルの隣にPC本体を置いて、キーボードとかマウスはモニタを置いているテーブルの手前にバラしたオーディオラックの残りパーツを利用して床からおおよそ8センチくらいの高さの小さいテーブルを作って、その上に置いてるわけです。かなり特殊な配置方法だとは思うんだけど、結構使いやすい(*1)
でもこの状態は床に寝そべりながらだと使いやすいけど、床に座ってキーボードを打つときなんかは結構使いにくい。キーボードの位置が床に近くて、気持ち前のめりになりながらキーボードを打つ格好になるから
そこで!床に座りながら快適にキーボードとマウスを使うべく、キーボードとマウス専用のテーブルを買おう!ということに(^^;
LKPTeam「以上が今日のメインイベントであります」
カレン「……相変わらずどうでもいいことに全力を傾けるわね(笑)」
LKPTeam「いやいや、快適にキーボードを打つためですよ。これはどうでもいいことじゃないでしょう?」
カレン「パソコン用の机買ったら?」
LKPTeam「……」
カレン「……」
いや、部屋が狭いから<苦しい言い訳だな(笑)
ということで、家具を取り扱ってる店とかに行ってみたんだけど、要望ぴったりのテーブルがないんですよ。結構小さいと思われるテーブルもキーボードを打つときのことを考えると背が高い気がするし、かといってパソコン用の机とかは今のPCの設置方法だと高さの兼ね合いで完全に除外になっちゃうし
その時にチラと目に入ったのが壁に取り付けるタイプの小物を載せる棚?のようなもの。こういうのは大抵が取り付け作業が必要で、そうか、既製のものがなければ作っちゃえばいいのか、と。金属製のシステムラックみたいなものも検討したんだけど、金属だと手が冷たくなるからパスと言うことで(笑)
で、作るといってもいろいろあるわけで。材料を買ってきて一から作るのか、あるいはパーツを組み合わせて作るのか。材料を買って一から作るのはさすがに手間が掛かりすぎると思ったので、今回はパーツを組み合わせて作るタイプにすることに決定
ホームセンターとかに行くと多分売ってると思うんだけど、天板とかキャスターとか柱とかがバラバラになって売ってて、それを組み合わせて作るタイプのテーブルというか棚?をチョイス。天板のサイズははHHKLiteが置けて、隣にマウスを乗せるといっぱいいっぱいになるくらいのサイズを。高さは20センチくらい。以上を満たすようなテーブルがないかなぁと探してたらありましたよ!
マグニックスインテリアユニットM型。S型でもよかったんだけど、それだとマウスの置き場所がちょっとなくなるかな、と思ってM型にしました。天板のサイズは幅600ミリ、奥行き300ミリ。柱は22センチタイプを選んで購入。キャスターとかアジャスターはいらないのでパス
組立はあまりにも簡単なので説明しません。で、キーボードとマウスを置いて見た図。うーん、他の用途には使えないなぁ、小さすぎて(笑)
しかしこれで座った状態でのキーボードがだいぶ打ちやすくなったですよ
カレン「でもこれで例えばいまやってるQDBMのコードが早く完成するかというと……」
LKPTeam「それとこれとは話が違うでしょう?」
カレン「そうよね(^^;」
いや、実際躓いてるしな(笑)
今日のお買い物は……
暗黒館の殺人 下巻 講談社 ISBN4-06-182389-2
MAGNIX ユニットパイプ UPD-S22NT 2本入り x 2
MAGNIX メラミン化粧板 MB-4525BB 1枚
……でしたっ
3 QDBM on xyzzy...とか[xyzzy]
詰まってます(笑)。Curiaは一応動く事は動きます。crfsizd、データベースのサイズを取得するこの関数以外は。crfsizが動くから別にいいかなぁ、とか思ってます。だってエラーの原因が分からないから。いつもAccess violationで堕ちるから(笑)
あとCabinもちょっと無理かも、とか。define-dll-entry関数で定義する関数の引数に関数へのポインタがあって、その関数に渡す引数のポインタをどうやって渡すのかがよく分からない。すいませんねぇ、勉強不足で。でもDEPOTとCURIAなら多分普通に使えると思うから、そのうちパッケージにして公開するかもしれず。まぁ、昨日のあのコードがあればDEPOTは使えるからアレだけで十分な気もするけど
$Date: 2005-03-19 22:37:50 +0900 (Sat, 19 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050319.diary $

*1: 寝そべりながらキーボードとかが打てるから(笑)
ぺーじとっぷへごー

2005.03.20 (Sun)

1 おはようございます
8:30、起床。うーむ、いまいち寝足りないなぁ
外は曇り空。ちょっと風が強いかも
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「はぅ、気がついたらもう昼ですよ」
カレン「ぼーっとしてるからでしょ」
LKPTeam「あぅあぅあぅ」
2 QDBM on xyzzyその2...とか[xyzzy]
とりあえずCabinとVilla、Odeumはひとまず諦めました。DepotとCuriaだけは普通に動く様子。あとDLL内のAPIを直接叩くのはチャンク関係の処理が面倒で嫌だと思ったので、そういうところを意識しないようにxyzzylispでラップしたマクロとか関数を一通り揃えてみたり
チャンク関係だとdpget関数なんかが顕著かも。APIを直接叩く場合は
(c:define-dll-entry (c::char *) dpget ((DEPOT *) (c::char *) c::int c::int c::int (c:int *)) dll)
といった感じで、戻り値が文字列へのポインタでxyzzylispで読み込むには、戻り値のポインタのアドレスを先頭とするチャンクを文字列のバイト数分だけ確保、それからチャンクをsi:unpack-stringで読めるように変換、という手順を踏むんだけど、毎回毎回同じ事をするのが面倒なので、以下のようなラッパーを作って、
(defun dp-get (db key)
  (let ((siz (si:make-chunk 'c::int 4))
        (ptr nil))
    (case (setq ptr (dpget db (si:make-string-chunk key) -1 0 -1 siz))
      (0 nil)
      (t (si:unpack-string
            (si:make-chunk 'c::char (si:unpack-int32 siz 0) nil ptr)
            0 (si:unpack-int32 siz 0))))))
戻り値がそのままxyzzylispで読める文字列の形式にしてみたり。こういうのを一通りは揃えておいたから直接APIを叩くも良し、あるいはラッパーを使うも良し、と
そして現状のテストスクリプトの状況
QDBM command test
 
QDBM::DEPOT
command              command-result
dp-open              success. [44569056]
dp-close             success. [t]
dp-put               success. [t]
dp-put[DP_DKEEP]     success. [nil]
dp-put[DP_DOVER]     success. [t]
dp-put[DP_DCAT]      success. [t]
dp-out               success. [t]
dp-get               success. [dummy-value]
dp-vsiz              success. [11]
dp-iterinit          success. [t]
dp-iternext          success. [dummy-key]
dp-setalign          success. [t]
dp-sync              success. [t]
dp-optimize          success. [t]
dp-name              success. [DEPOT.qdb]
dp-fsiz              success. [137]
dp-bnum              success. [5]
dp-busenum           success. [1]
dp-rnum              success. [1]
dp-writable          success. [t]
dp-fatalerror        success. [nil]
dp-inode             success. [0]
dp-mtime             success. [Sun Mar 20 13:44:02 2005]
dp-fdesc             success. [3]
dp-remove            success. [t]
dp-repair            success. [t]
dp-exportdb          success. [t]
dp-importdb          success. [t]
dp-innerhash         success. [776845421]
dp-outerhash         success. [277264121]
dp-primenum          success. [103]
 
[DEPOT] All the commands succeeded. 
 
dp-close             success. [t]
dp-remove            success. [t]
 
QDBM::CURIA
command              command-result
cr-open              success. [44572400]
cr-close             success. [t]
cr-put               success. [t]
cr-put[CR_DKEEP]     success. [nil]
cr-put[CR_DOVER]     success. [t]
cr-put[CR_DCAT]      success. [t]
cr-out               success. [t]
cr-get               success. [dummy-value]
cr-vsiz              success. [11]
cr-iterinit          success. [t]
cr-iternext          success. [dummy-key]
cr-setalign          success. [t]
cr-sync              success. [t]
cr-optimize          success. [t]
cr-name              success. [CURIA.qdb]
cr-fsiz              success. [345]
cr-bnum              success. [9]
cr-busenum           success. [1]
cr-rnum              success. [1]
cr-writable          success. [t]
cr-fatalerror        success. [nil]
cr-inode             success. [0]
cr-mtime             success. [Sun Mar 20 13:44:02 2005]
cr-remove            success. [t]
cr-repair            success. [t]
cr-exportdb          success. [t]
cr-importdb          success. [t]
cr-putlob            success. [t]
cr-putlob[CR_DKEEP]  success. [nil]
cr-putlob[CR_DOVER]  success. [t]
cr-putlob[CR_DCAT]   success. [t]
cr-outlob            success. [t]
cr-putlob            success. [t]
cr-getlob            success. []
cr-getlobfd          success. [9]
cr-vsizlob           success. [t]
cr-rnumlob           success. [t]
 
[DEPOT] All the commands succeeded. 
 
cr-close             success. [t]
cr-remove            success. [t]
 
 
QDBM All commands succeeded.
All commands、じゃあないですけど(笑)。残りは各コマンドのドキュメントとかの整備とか。まぁそのあたりはQDBMのサイトを見ればもっと詳しいのが載ってるからいらないと言えばいらないんだけど、簡単でもdescribe-functionで参照できたら便利かも、と思って頑張ることに
パッケージ化はもう少し先かなぁ
$Date: 2005-03-20 23:24:57 +0900 (Sun, 20 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050320.diary $
ぺーじとっぷへごー

2005.03.21 (Mon)

1 おはようございます
6:00、起床。うーん、眠い。めちゃくちゃ眠い(^^;
外は晴れ模様。いい天気になりそう
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「lisp組むのに夢中になって暗黒館の殺人を読むのが遅々として進みませんよ」
カレン「そりゃあ、どちらかに集中しないとダメだからでしょう?」
カレン「というか昨日はずっとlisp組んでたのなら本を読む時間なんてあるわけないでしょう」
LKPTeam「そりゃあまぁ、そうなんですが」
カレン「とりあえず、今日からすこしづつでも読んでいったら?」
LKPTeam「そうしませう」
カレン「……」
LKPTeam「なにか?」
カレン「いいえ、別に」
というか今日は仕事なんだよ!だからこんな早くに起きてるんだよぅ……うぅ、なんてこったい(^^;
2 お仕事...とか[WORK]
うぅ、祝日なのに仕事とはこれ如何にー
3 QDBM on xyzzyその3...とか[xyzzy]
いやぁ、QDBMのラッパー関数、エラーのことをさっぱり考えてなかったです
LKPTeam「てへり」
カレン「不気味だから止めなさい」
LKPTeam「うあー(^^;」
LKPTeam「というか冷静すぎですよ」
カレン「いいからさっさと止める!」
LKPTeam「ひぅぃー」
うぅ、なんてこったい。というか初めから気づけよ、自分
っぱりエラーチェックはちゃんとしないとなぁ
しかし面倒だなぁ……
はぅ、ベンチマーク動かしたらCPUの焼き付き防止機能が働いて自動シャットダウンしたよ(笑)<初めはCPUが焼き付いてしまったのかと思った
はぁー、焦ったぁ……
ちなみに動かしたベンチマークは
(require "qdbm")
(use-package "qdbm")
 
(defun benchmark-depot (&optional (outerloop 10) (innerloop 1000))
  (interactive)
  (let* ((lst nil)
         (start nil)
         (end nil)
         (dbname "DEPOT.qdb")
         (dbmode (logior DP_OWRITER DP_OCREAT DP_OTRUNC))
         (db nil)
         (key "dummy-key")
         (value "dummy-value"))
    (long-operation
      (insert "benchmark-depot start.\n\n")
      (do ((i 0 (1+ i)))
          ((>= i outerloop))
        (setq start (si:performance-counter))
        (setq db (dp-open dbname dbmode))
        (do ((c 0 (1+ c)))
            ((> c innerloop))
          (dp-put db (format nil "~a~a" key c) (format nil "~a~a" value c))
          (do-events)
          )
        (dp-close db)
        (dp-remove dbname)
        (setq end (si:performance-counter))
        (push (- end start) lst)
        (insert (format nil "~2,'0D Start: ~a End: ~a Time: ~a AVG: ~a\n"
                        (1+ i) start end (- end start)
                        (truncate
                           (let ((result 0))
                             (dolist (item lst) result
                               (setq result (+ result item)))
                             result) (length lst)))))
      (insert "\nbenchmark end.\n"))))
こんなの。そんなに厳しいベンチマークだとは思えないんだけど、あいにく家のCPUは常時かなりの温度になってたようであっさり堕ちた(笑)
やはり1000レコードはきつかったか?うぅ、もうベンチマークは動かさない(笑)
ちなみに結果は
(qdbm::benchmark-depot 20 100)
benchmark-depot start.
 
01 Start: 20986351703 End: 20987814818 Time: 1463115 AVG: 1463115
02 Start: 20987818818 End: 20989297288 Time: 1478470 AVG: 1470792
03 Start: 20989301326 End: 20990760185 Time: 1458859 AVG: 1466814
04 Start: 20990763939 End: 20992231642 Time: 1467703 AVG: 1467036
05 Start: 20992236329 End: 20993699170 Time: 1462841 AVG: 1466197
06 Start: 20993703710 End: 20995157823 Time: 1454113 AVG: 1464183
07 Start: 20995162952 End: 20996672603 Time: 1509651 AVG: 1470678
08 Start: 20996677465 End: 20998158854 Time: 1481389 AVG: 1472017
09 Start: 20998165579 End: 20999645023 Time: 1479444 AVG: 1472842
10 Start: 20999651475 End: 21001110201 Time: 1458726 AVG: 1471431
11 Start: 21001116263 End: 21002574327 Time: 1458064 AVG: 1470215
12 Start: 21002580687 End: 21004088854 Time: 1508167 AVG: 1473378
13 Start: 21004095203 End: 21005546459 Time: 1451256 AVG: 1471676
14 Start: 21005553349 End: 21007059762 Time: 1506413 AVG: 1474157
15 Start: 21007068701 End: 21008534468 Time: 1465767 AVG: 1473598
16 Start: 21008542527 End: 21010024620 Time: 1482093 AVG: 1474129
17 Start: 21010032234 End: 21011480354 Time: 1448120 AVG: 1472599
18 Start: 21011488924 End: 21012964157 Time: 1475233 AVG: 1472745
19 Start: 21012972834 End: 21014430953 Time: 1458119 AVG: 1471975
20 Start: 21014439438 End: 21015947195 Time: 1507757 AVG: 1473765
 
benchmark end.
t
こんな感じ。si:performance-counterの数値をどう変換したらいいのか分からなかったのでそのまま使ってます。あと比較用にファイルの入出力を使って似たようなことをしようと思ったんだけど、前述の通りPCが堕ちたので中止することに(笑)
というかqdbm.lをまだ公開してないから↑のコードなんか挙げられても分からないよな(笑)
まぁ、もうしばらくお待ち下さい、だな。今日は予定外のことが起きてさっぱり進まなかった(笑)
追記:う、同じレコードを入れようとしてるじゃん(笑)。ということで差し替えとデータも一緒に差し替え
$Date: 2005-03-22 01:46:30 +0900 (Tue, 22 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050321.diary $
ぺーじとっぷへごー

2005.03.22 (Tue)

1 おはようございます
6:05、起床。んー、眠い
外は曇り空。今日は暖かくなるのかな、ならないのかな
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「そういえば昨日、会社のお昼休みにxyzzyの本を注文したですよ」
カレン「あー、ネットで?」
LKPTeam「うぃ」
LKPTeam「すぐには届かないっぽいんですけどね」
カレン「ま、予約してたわけじゃないしね」
LKPTeam「ですです」
LKPTeam「そんなに急がなくてもいいかな、と」
カレン「でも早く読みたいんでしょう?」
LKPTeam「それは当然ですよ(^^;」
噂の付録が気になるデスよ
2 お仕事...とか[WORK]
今日は真面目に仕事してましたよ、と書けば普段は真面目に仕事してないのかよ、と言われそうだな。……半分ホントで半分嘘だな(笑)
3 QDBM on xyzzy0.0.0.1 ...とか[xyzzy]
リリースしました。インストールはNetInstallerからどうぞ。readme.txtにも書きましたが、QDBM本体は別途インストールが必要ですので注意してください。あとreadme.txtと同じ内容のhtmlを用意しました
まぁ、これをインストールしたからと言ってすぐに使えるというわけでもないので、結構しょんぼりですが(笑)
そのうちに何かQDBMを使って書こうかな、くらいには思ってますです。……そのうちにね
あ、readme.txtとかには書いていませんが、msvcrt.dll内の関数も若干使ってますので、もしかしたら動かない人もいるかもしれません。XPSP2と2kでは動作を確認していますが、それ以外のOSでの動作確認には至っていません。その辺をよく分かっている人は使うって事で。使ってる関数はqdbm.lにありますのでソース読んでください。基本的な関数だけ使ったつもりだから、多分大丈夫だとは思うんだけど、……でもそういうのに限って躓くんだよな(笑)
ライセンスについてですが、以前、私のパッケージにはNYSLを採用する、と書いた覚えがあるのですが、QDBM本体がGPL2.1を採用していることもあり、合わせておいた方が無難かな、と思ってこのパッケージに関してはQDBM本体と同じライセンスにしてありますので、そこの所だけ注意してください。……というか、大丈夫だよね?ね?(^^;>なんかまずかったら連絡下さい
あー、readme.txt書いたりHTML書いたりでコード組むのよりも疲れた(笑)
$Date: 2005-03-22 23:54:05 +0900 (Tue, 22 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050322.diary $
ぺーじとっぷへごー

2005.03.23 (Wed)

1 おはようございます
6:00、起床。んー、今日も眠いですなぁ
外は曇り空。雪解けは着々と進んでいる様子
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「なんか、「入門xyzzy」の注文が速攻取り消されているんですが?」
カレン「在庫切れ?」
LKPTeam「うぃ」
LKPTeam「うーあー、なんてことだー」
カレン「ま、次の機会にしなさいって事ね」
LKPTeam「がーん?!」
うぅ、どうしてだよぅ
2 お仕事...とか[WORK]
のらりくらりとお仕事。今日はのんびり出来ていいなぁ、と思ってたんだけど、OutlookのPSTファイルの2GBオーバーの問題にぶち当たっていらぬ時間を取られたり。うぅ、なんてことだー
3 QDBM on xyzzy...とか[xyzzy]
たとえば、私も使ってるbsfilterはデータベースにSDBMなんかを使う設定がデフォルトだったと思ったけど、このspamfilterを移植したときにQDBMがあるとSDBMよりは速くて便利かも、とか思ったり。ほら、QDBMが使えるとrubyがなくても動きそうだし。rubyのSDBMのキーや値の制限を見る限りではQDBMのDEPOTでも十分だと思うし、と何とはなしに言ってみる(^^;。いや、本当はVillaとかOdeumが使いたかったんですよ、ですよ、ですよーっっ(笑)
というかそのspamfilterで使ってるChasenとかはどうするよ、とか。その辺はほら、DLLじゃなくてコマンドを使って何とか、とかあるから(*1)
そんなことよりもまず移植するのかよ、という問題がありますが。……聞かないでくれ(笑)<今すぐ、は無理らしい
4 夜...とか
今日からはしばらくのんびり過ごそうかな、とか。最近ずっとxyzzyいじってたからなぁ。楽しいんだけど、やっぱりちょっと疲れたですよ
まぁ、本当は今週、魔王と踊れ!(*2)が届くから(笑)
$Date: 2005-03-24 00:41:10 +0900 (Thu, 24 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050323.diary $

*1: まぁヘッダファイルを見たらちょっと無理だ、と思っただけだが。実は一番最初に見たのがMecabの方で、結構いけるかな、とかも思ったんだけど、結局無理っぽいのが分かって、それからChasenに流れたんだけど(^^;。ま、ChasenもダメでじゃあKakasiか?とか思ってKakasiのヘッダファイルを見たらやっぱり無理だった、と(^^; ChasenもMecabもKakasiもコマンドを使えば何とかなるかもしれないけど……試してないから何とも言えないな
*2: CATWALK http://catwalk.product.co.jp/
ぺーじとっぷへごー

2005.03.24 (Thu)

1 おはようございます
6:00、起床。うーむ、眠い
外は晴れ模様。今日はいい天気になりそう
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「うー、眠いデスよぅ」
カレン「我慢しなさい」
LKPTeam「最近、活動時間帯がまた深夜よりになってきてるみたいです」
カレン「うーん、夜遅くまでごそごそやってたからね、最近」
LKPTeam「まあ、それが嫌だ、とは感じてはいないんですけど」
カレン「でも仕事に身が入らないようじゃダメでしょう?」
LKPTeam「いえいえ、真面目にやってますよー」
カレン「真面目にやっても、成果が上がらないんじゃ同じ事よ?(^^;」
LKPTeam「うぅ、厳しいお言葉」
カレン「といっても早く寝ようなんて……」
LKPTeam「ああ、それはまた別の話ですから」
カレン「いや、同じなんだけどね(^^;」
2 お仕事...とか[WORK]
のらりくらりとお仕事。……そして昨日と同じようにPCのサポートにかり出される(笑)。まぁいいんだけどね
それはそうと、エクセルのワークシート関数を使うときに、よく使うワークシート関数は引数の意味とか暗記してるから関数の引数を入力する際に、なんてていうのかな……ツールバーから関数を入力するボタンを押すと、段数を選択するダイアログボックスが出てきて、例えばVLOOKUPなんかを選ぶと、また別のダイアログボックスが出てきてワークシート関数の簡単な説明とか、引数を入力するためのテキストボックスみたいなのが出てくるじゃないですか。あのダイアログボックスで、引数を入力するためのボックスにフォーカスを移すと、下の関数の説明文が表示されてるところに、引数の説明も出てくるんですよ。あれがやりたくてやりたくて!(笑)<説明長すぎ
オブジェクトブラウザで自分で作ったユーザー定義関数を選択して、右クリックでコンテキストメニューを表示、そこにある「プロパティ」をクリックして出てくるダイアログボックスの「説明」テキストボックスにふにふにー、とでも書いて保存すればユーザー定義関数の説明文は表示させることが出来るのは分かったんだよ(*1)
でも選び方に問題があるのか、ときどき設定しても反映されないことがある。オブジェクトブラウザのモジュールの選択ボックスに「VBAProject」と入れて選べばいいのか、あるいは全てのモジュール?だったかなを選んで設定すればいいのか。もしかしたら私の勘違いなのかもしれないけど、オブジェクトブラウザからの設定は上手くいったりいかなかったりしました
なので、解決策。そのモジュールファイルをテキストエディタで開いて、たとえばユーザー定義関数hogehogeの定義箇所が、
Public Function hogehoge(dummy as Date, dummy2 as String) as Boolean
    Dim hugahuga as Variant, ...
    ...
    ...
    hogehoge = True
End Function
なんてのがあったとすると、
Public Function hogehoge(dummy as Date, dummy2 as String) as Boolean
Attribute hogehoge.VB_Description = "ここにユーザー定義関数の説明文を入力します"
Dim hugahuga as Variant, ...
    ...
    ...
    hogehoge = True
End Function
というふうに書き換えて上書き保存、その後にファイルのインポートなんかで取り込んで、エクセルで関数の入力補助ダイアログを使ってみれば、関数の説明文の箇所に設定した説明文が表示されちゃいます
しかし!問題はこの後で、エクセルに元からあるワークシート関数は関数の入力補助ダイアログで引数を入力するボックスにフォーカスを移すと引数の説明文が表示されるんですよ。ぼかぁ、あれがやりたいわけです!(笑)
ユーザー定義関数の説明文も設定できるなら、引数の説明文も設定できるはずだと考えるのは間違ってますデスカー
カレン「というか、ユーザー定義関数の説明文に引数の説明文も含めちゃえば問題ないんじゃないの?」
LKPTeam「あーあーあーあー」
LKPTeam「全く聞こえません。全然聞こえませーん」
カレン「……ばか(^^;」
LKPTeam「あぅー」
多分、なにかしら方法はあるんだろうけど、というかAttribute ??????.VB_Description でいけると思うんだけど、肝心のそこの資料が探せなくて結局挫折。最近こんなのばっかりだ(笑)
$Date: 2005-03-25 00:12:04 +0900 (Fri, 25 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050324.diary $

*1: ここまで調べるのに1時間くらい掛かった(笑)
ぺーじとっぷへごー

2005.03.25 (Fri)

1 おはようございます
6:00、起床。うー、寒い
外は雪模様。寒いです。何とかしてください<無理
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「うわー、朝起きたら外が真っ白でした、なんてこの時期にやられても困るデスよ」
カレン「確かにねぇ(^^;」
LKPTeam「うぅ、もうすぐ4月なのに、4月なのにー」
カレン「我慢するしかないでしょ」
LKPTeam「あぅ」
カレン「ほらほら、さっさと準備しなさいな」
LKPTeam「あーい」
2 お仕事...とか[WORK]
今日ものらりくらりとお仕事ー。それはそうと外は吹雪いてて帰りが怖い(^^;
メモとか。まぁ昨日の続きみたいなもの?
3 お買い物...とか[Shopping]
予定通り『魔王と踊れ!』が届いたなりー
ということで、今日のお買い物は……
CATWALK / 魔王と踊れ! 〜Legend of the Lord of Lords〜 初回版
……でしたっ
4 魔王と踊れ!...とか[GAME]
さて、さくさくっとインストール。最近PCの調子が思わしくなくてインストール中に落ちないか不安だったけど、なんとか免れた様子(^^;
とりあえず1章最後まで。案外さくさくっと進むなぁ。ま、はじめはこんなものかな
$Date: 2005-03-26 00:12:25 +0900 (Sat, 26 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050325.diary $
ぺーじとっぷへごー

2005.03.26 (Sat)

1 おはようございます
6:00、起床。うー、さむいー
外は今日も雪模様。本当に冬に逆戻りだよ(^^;
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「そして今日も仕事な訳ですよ」
カレン「我慢しなさい、そのくらい」
LKPTeam「にゅー」
やる気でねー(笑)
2 お仕事...とかWORK]
ということで、のらりくらりとお仕事。まぁ土曜日なんだから、やる気がないのは当然でしょう(^^;
3 お買い物...とか[Shopping]
勢いに任せて(^^;<何のだよ
今日のお買い物は……
鉄壱智 1巻 一迅社 ISBN4-7580-5126-7
……でしたっ
$Date: 2005-03-27 07:43:08 +0900 (Sun, 27 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050326.diary $
ぺーじとっぷへごー

2005.03.27 (Sun)

1 おはようございます
8:00、起床。うー、昨日早く寝すぎたか?
外は晴れ模様。いい天気になりそう
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「ということで、今日はPCを換装しましょう」
カレン「……お金、ないわよ?」
LKPTeam「下ろしましょう!」
カレン「銀行から?」
カレン「手数料かかるのに?」
LKPTeam「ほらほら、思い立ったら吉日、というでしょう?」
カレン「それとこれとは話が」
LKPTeam「ほらほらほら(^^;」
カレン「強引すぎ!(^^;」
あははは(^^;
2 お買い物...とか[Shopping]
まぁ、最近PCの調子が悪くなってきたし、ちょうどいいかな、ということで
今日のお買い物は……
AMD / Atholon64 3000+ Socket939 [BOX]
ASUS / A8V-E Deluxe NW
Leadtek / WinFast PX6600
……でしたっ
私はASUSファンなので今回もASUSでいくことにしました。AMDなのも前と同じ。ただし64にはなったけど。そしてGPUにはNVIDIAを選択。というか玄人志向のRDX6PRO-E128CLが売ってなくて、ほかにやすいPCI-Express対応のGPUがなかっただけだったりして(^^;
3 換装...とか[PC]
まぁ、そんなには難しくはないはず……なんだけど、てこずるてこずる。まず既存の電源が20ピン、新しいマザーボードの電源が24ピンではて、どうしよう、と。あわてて変換コネクタを買いに走る(笑)
そして次。玄人志向のサウンドカード、CMI8738-6CHLPを挿したままで音楽を聴こうとするとPCがフリーズする。もう何度やっても駄目で、結局オンボードのサウンドを使って回避することに。いやぁ、疲れたよ……(^^;
でもこれでまた1年は大丈夫……だと思いたい(^^;
4 魔王と踊れ!...とか[GAME]
第2章終了。んー、1章はさくさくっと進んだけど2章の最後で躓く躓く。先制攻撃できるか否かがポイントですな(^^;
$Date: 2005-03-27 23:09:53 +0900 (Sun, 27 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050327.diary $
ぺーじとっぷへごー

2005.03.28 (Mon)

1 おはようございます
6:00、起床。うー、今日も寒いなぁ
外は晴れ模様。空は晴れてるけど、地面には雪がまだどっさりだよ。道路にはさすがにないけどさぁ……
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「しかし、いつになったら雪が解けるんでしょうね」
カレン「もう4月になるっていうのにね」
LKPTeam「ほんとですよ」
カレン「でもまぁ、これ以上降ることはないんじゃないの?」
LKPTeam「いやいや、油断大敵ですよ、隊長!」
カレン「誰が隊長よ(^^;」
LKPTeam「ぐはー」
さて、今日も仕事に行くかー
2 お仕事...とか[WORK]
さくさくっとお仕事。いろいろと遅れてるからねぇ。でもやっぱり週の初めはのんびりモードでありますよ。いやまぁいつものんびりなんだけれども(^^;
3 入門xyzzy...とか[Shopping]
仕事中に注文したり。Amazonさんは未だ品切れだったので、オーム社で注文することに。ネットで注文は楽でいいねぇ
カレン「というか、また品切れで注文キャンセルにならなきゃいいけど(^^;」
LKPTeam「ぎゃー、そういうことはいわないでくださいー」
カレン「あはは(^^;」
いや、マジで(^^;
4 魔王と踊れ!...とか[GAME]
第3章終了。うむ、この辺になると戦闘もだいぶ楽になるね。やはり2章のボスが今のところ一番の強敵か
$Date: 2005-03-29 00:02:21 +0900 (Tue, 29 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050328.diary $
ぺーじとっぷへごー

2005.03.29 (Tue)

1 おはようございます
6:00、起床。うー、今日も眠い
外は晴れ模様。多少雲があるみたいだけど、今日もいい天気になりそう
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「ということで、火曜日ですよ」
LKPTeam「といっても、火曜日だからといって特別な何かがあるわけではありませんが」
カレン「ただいってみたかっただけでしょ」
LKPTeam「うぐ」
LKPTeam「さすが、分かってらっしゃる(^^;」
カレン「そりゃあね」
LKPTeam「といえば、PCを換装する前にですね?」
カレン「ん?」
LKPTeam「CPUファンを注文してたんですよ?」
カレン「CPUファンって、Athlon64用?」
LKPTeam「いえ、AthlonXP用の」
カレン「……」
LKPTeam「いやほら、はじめはCPUファンだけ交換してみて様子見、という予定だったのですが」
カレン「ついつい衝動買いしてしまったと?」
LKPTeam「いやまぁ、……そう、なりますかね?」
カレン「……ちなみに、CPUファンの値段は?」
LKPTeam「送料込みで4810?」
カレン「無駄遣いしちゃダメっていってるでしょうが!」
LKPTeam「あぅー」
でもほら、古いAthlonXPもまた使うこともあるだろうし、その時用に、とか考えれば……ってやっぱり無理があるよなぁ(笑)
2 お仕事...とか[WORK]
のらりくらりとお仕事。うーむ、WORDは使いにくいなぁ
3 魔王と踊れ!...とか[GAME]
4章のダンジョン途中。むぅ、敵が強くなってきてる(^^;<当然だ
$Date: 2005-03-29 23:53:17 +0900 (Tue, 29 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050329.diary $
ぺーじとっぷへごー

2005.03.30 (Wed)

1 おはようございます
6:00、起床。んー、眠い。すごく眠い
外は今日も雪模様。どうなってますか今年はー。もうすぐ4月なのにー、なのニー
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「そういえば昨日、CPUファンが届きましたよ」
カレン「使わない予定のね」
LKPTeam「うぐ」
LKPTeam「……まぁ、封を開けてもいませんけど(^^;」
カレン「ほらー(^^;」
LKPTeam「あぅあぅあぅ」
LKPTeam「いらほら、昨日は開けなかっただけで、今日は」
カレン「外箱を捨てるために開けるのよね」
LKPTeam「そうそう」
カレン「ほらね」
LKPTeam「……うぅ」
カレン「ま、いいけどね」
LKPTeam「い、いじめだぁ」
カレン「人聞きの悪い(^^;」
いやぁ、計画性のなさっぷりにたじたじですな<自分で言うな
2 お仕事...とか[WORK]
あーうー、予防処置が、予防処置がー<微妙にやばいっぽい(^^;
3 入門xyzzy...とか
届いてました。やたっ
さて、読むか
うーん、軽く流し読みした感じだと、本当に入門用なんだな、と。12章までは特にその通りな気がする。13章からの拡張Lispの導入、14章の機能のカスタマイズなんかは多少難しい気もするけど。そして付録はxyzzy lispの入門用にぴったりな気がするな
LKPTeam「でも私が知りたかったのは、解説してくれなかった箇所なんですよぅ(^^;」
カレン「あきらめなさいな(^^;」
LKPTeam「あぅー」
いや、不満はないけどさ。でも付録の割合が結構多いのはいいですね。簡単なリファレンスに使えなくもないし。……reference.{chm|xml}があれば十分な気もするけど。まぁ、基本機能のリファレンスに、ということで#
 ……その基本機能のリファレンスですらもdescribe-keyやhelpのキー割り当て一覧で代用できてしまうけど。でも本はいい本だ(^^;
とりあえず、著者の皆様、お疲れ様〜、ということもあり、トップページにオーム社の入門xyzzyの紹介ページへのリンクを設置してみたり
$Date: 2005-03-31 00:54:04 +0900 (Thu, 31 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050330.diary $
ぺーじとっぷへごー

2005.03.31 (Thu)

1 おはようございます
6:00、起床。うーん、眠い
外は曇り空。はぁ、今日も冬模様っぽいなぁ
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「うぅ、眠いデスよ」
カレン「我慢しなさい」
LKPTeam「そんなに夜更かししてるつもりはないんだけどなぁ」
カレン「年ね」
LKPTeam「うわーん」
2 お仕事...とか[WORK]
はぁ、やる気でねー(^^;
3 魔王と踊れ!...とか[GAME]
5章中盤。どうでもいいけどダンジョンでかいな……MAPを表示させてると邪魔で邪魔で(^^;
$Date: 2005-04-01 00:54:25 +0900 (Fri, 01 Apr 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050331.diary $
ぺーじとっぷへごー

つっこみ

LKPTeam / ykaltenative@mue.biglobe.ne.jp
さいととっぷへごー!