Open Source WEB



2005-01-31 [ASCII] ASCIIコード表

「そんなことも知らんかったんかシリーズ」改め「おいおいシリーズ」(^^;)

ちょっと、ASCIIコードを調べたいときってありますよね。そんなとき、 「なんかのCの本の付録についてなぁ。」とかいって、本を探している そこの貴方(って、儂のこんとか)、「そんなんググれっ!」なんて言っている そこの貴方(って、これも儂のことか)、man でんがな!

% man ascii

--nobsun


Name:
Comment:
cut-sea: (Mon Jan 31 12:33:39 2005 )
似たようなネタで。

% man operator

ってのもありますよね。
演算の優先順位とか確認するのに便利なんでたまに使います。
shiro: (Mon Jan 31 16:32:46 2005 )
うは、知らんかった。
いつも (dotimes (n 128) (format #t "~2,'0x ~s\n" n (integer->char n)))
とかやってた。
nobsun: (Mon Jan 31 17:35:04 2005 )
儂のLinuxには、
man operator
がなかったorz
novice: (Tue Feb 1 11:03:42 2005 )
Perlのオペレータなら調べられるよ。

% man perlop
cut-sea: (Tue Feb 1 11:13:18 2005 )
scheme は…
要りませんね。(^^;
novice: (Tue Feb 1 14:50:09 2005 )
SunOSでは
% man kanji
とやったら、漢字コード表が出て来たのだが、他でもできるのかな?


2005-01-28 [emacs] キーボードマクロ

「そんなんも知らずに Emacs つことったんかいシリーズ」(おぃ)
編集中に必要になる一連のくりかえし動作をマクロとして定義できる。

(本当は、たいていの場合、すでにコマンドとして定義されている場合が 多いのだけれど。。。)

C-x (

定義開始

C-x )

定義終了

M-x apply-macro-to-region-lines

リージョン内の各行に対してマクロ適用

C-x ( C-a M-\ C-i C-x )

これは行頭にある空白全部を削除し、タブ1個を挿入するキーボード操作を マクロ定義したところです。 こうやっておいて、この操作を施したいリージョンを指定した上で、

M-x apply-macro-to-region-lines

とやると、そのリージョンで行頭の空白が、タブ1個に置き換わります。

--nobsun


Name:
Comment:

There is no comment.


2005-01-27 [fifo] 名前付パイプをつかって2つのログファイルを同時に見る

ネットワーク関連のプログラムの動作のようすを観察したいときなどに、 2つの別のプロセスのログを混ぜて監視したいことがある。そんなときは、 名前付パイプを使うことができる。

# mkfifo mergedlog
# tail -f kahua-spvr.log > mergedlog &
[1] 111
# tail -f kahua-cgi.log > mergedlog &
[2] 112
# cat mergedlog

とやるとコンソールに、kahua-spvr.log と kahua-cgi.log 混ぜあわされたものが 表示される。表示はジョブ%1と%2 を終了させれば止まる。

--nobsun


Name:
Comment:
ささだ: (Wed Feb 2 22:45:01 2005 )
tail -f で複数ファイル指定じゃ駄目ですか?
nobsun: (Fri Feb 4 14:07:13 2005 )
tail -f で複数ファイルを指定できると思っていなかった orz
思い込まずにやってみれば判ったのに > 儂


2005-01-26 [Apache] Cookie の追跡

mod_usertrack を利用する。Debian で Apache を使っているときには、

/etc/apache/httpd.conf の以下の箇所を変更

  1. usertrack_module の組込み
    #LoadModule usertrack_module /usr/lib/apache/1.3/mod_usertrack.so
    
    のようにコメントアウトされている部分のコメントを外して、
    LoadModule usertrack_module /usr/lib/apache/1.3/mod_usertrack.so
    
    とする。
  2. Cookie の追跡機能をONにする
    <IfModule mod_usertrack.c>
     CookieTracking on
     CookieExpires "3 days"
    </IfModule>
    
  3. ログ形式を設定
    LogFormat "%{cookie}n %{Referer}i -> %U" referer
    CustomLog "|/usr/local/sbin/cronolog /var/log/apache/referer.log.%Y%m%d" referer
    

Apache の再起動

# /etc/init.d/apache restart

こうすると

192.168.111.22.37181106597293347 [26/Jan/2005:05:17:51 +0900] http://www.example.org/kakkoii/web-application/links -> /kahua/index.html"

などというログが記録される。

--nobsun


Name:
Comment:

There is no comment.


2005-01-25 [X] スクリーンショットを取る

スクリーンショットを取るにはX Window Systemに付いてくる xwdコマンドが使える。

xwdコマンドのオプションには

  • -frame ウィンドウフレームを含める
  • -root 画面全体をダンプする
  • -id ウィンドウidを指定してダンプ などがあります。
#!/bin/sh

DATA=`date +%Y-%m-%d-%H:%M:%S`
xwd -frame | convert - ~/${DATA}.png

こんなスクリプトを用意しとけば、ファイル名に現在時刻を使った ダンプ画像が作れます。

マウスが自由な状態でスクリーンショットを取りたい場合は、sleepと-idオプションを 使ってダンプを遅延させます。

eval "sleep 5; xwd -frame -id `xwininfo | awk '/Window id/ {print $4}'`| convert - win.png"

5秒後に、選択したウィンドウのダンプ画像が作られます。

--shibata


Name:
Comment:
novice: (Tue Jan 25 18:54:34 2005 )
スクリーンショットを取るときには、別の端末からリモートログインして
xwdをよく使っていました。これなら、 sleep しなくても良くなるので、
作業が楽でした。


2005-01-24 [SICP] 超循環評価器をGaucheで動かす

名著 "Structure and Interpretation of Computer Programs 2nd. edition" (邦訳『計算機プログラムの構造と解釈 第二版』)に出てくるコードはすべて、 スクリプトファイルとして、 MIT Press の SICP サイト公開されています

第4章では、Scheme で Scheme のインタープリタを書くというトピックがあります。 その基本となるコードが、 ch4-mceval.scm です。 このコードは、MIT Scheme 用に書かれており、そのままでは、 Gaucheで動かす ことができません。

オリジナルのch4-mceval.scmと Gauche に適合させるためのパッチファイル ch4-mceval-gauche.patch と、解釈器の駆動ファイル run-mceval.scmを カレントディレクトリに置いて、以下のようにすると Gauche で動作させることが できます。

  1. パッチを ch4-mceval.scm に当てる。
    % patch -b < ch4-mceval-gauche.patch
    
  2. Gauche を起動する
    % gosh
    gosh>
    
  3. ロードパスにカレントディレクトリを加える
    gosh> (add-load-path ".")
    ("." "/usr/local/share/gauche/site/lib" "/usr/local/share/gauche/0.8.3/lib")
    gosh>
    
  4. run-mceval.scm をロードする
    gosh> (load "run-mceval.scm")
    
    
    ;; M-Eval input:
    ■
    

これで、入力待ちになります。デフォルトでは、組み込みの演算子などが 殆どありません(car、cdr、cons、null? のみ)ので、足し算もできません。 これでは困りますので、run-mceval.scm で少し追加してあります。 自分で追加するときは、run-mceval.scm の当該箇所をみて、追加してみてください。

;;; M-Eval input:
(define (fact n)
  (if (= n 0)
      1
      (* n (fact (- n 1)))))

;;; M-Eval value:
ok

;;; M-Eval input:
(fact 10)

;;; M-Eval value:
3628800

;;; M-Eval input:
■

--nobsun


Name:
Comment:

There is no comment.


2005-01-21 [MySQL] MacOS XでMySQLを削除する

sudo /usr/local/mysql/bin/mysqladmin shutdown
sudo rm -r -f /usr/local/mysql
sudo rm -r -f /Library/StartupItems/MySQL

MySQL 4.1.9では以下を削除。

sudo rm -r -f /Library/StartupItems/MySQLCOM

--yasuyuki


Name:
Comment:

There is no comment.


2005-01-20 [MacOS] MacOS X付属のApacheでユーザーディレクトリのCGIを有効にする

/private/etc/httpd/httpd.conf でcgi-scpritsのAddHandler宣言をコメント解除する。

    AddHandler cgi-script .cgi

/private/etc/httpd/users/<ログイン名>.conf を編集する。

例: ログイン名がyasuyukiの場合

編集前:

<Directory "/Users/yasuyuki/Sites/">
    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

編集後:

<Directory "/Users/yasuyuki/Sites/">
    Options Indexes MultiViews ExecCGI
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

[アップルメニュー]-[システム環境設定]-[共有]-[サービス] で「パーソナルWeb共有」を再起動する。

--yasuyuki


Name:
Comment:

There is no comment.


2005-01-19 [emacs] Emacs-w3m で Cookie

Emacs-w3m の現在の安定版では、 実験的にクッキーに対応している。 これを有効にするには、

 (setq w3m-use-cookie t)

を .emacs の適切な場所(大抵の場合、(require 'w3m-load)の後)に 書いておけばよい。

Kahua-webで構築されたサイトはログインしないと編集できないのだが、 Cookie が有効でないとログインができないのです。

--nobsun


Name:
Comment:

There is no comment.


2005-01-18 [grep] コンテキスト表示

『えーーっ。そんなんも知らんかったん?』シリーズ(またかい)。

たとえば、マッチした行の前後 2行も表示するには、

% grep -2 PATTERN FILE

などとする。(詳しくは、man grep)

実行例:

% grep -n -2 cvs *.lhs
DarcsArguments.lhs-676-The \verb!--summary! show a summary of the patches that would have been
DarcsArguments.lhs-677-pulled/pushed/whatever. The format is similar to the output format of
DarcsArguments.lhs:678:\verb!cvs update! and looks like this:
DarcsArguments.lhs-679-
DarcsArguments.lhs-680-\begin{verbatim}
--
IsoDate.lhs-97-
IsoDate.lhs-98-date_time :: CharParser a CalendarTime
IsoDate.lhs:99:date_time = choice [cvs_date_time,
IsoDate.lhs-100-                    old_date_time]
IsoDate.lhs-101-
IsoDate.lhs:102:cvs_date_time :: CharParser a CalendarTime
IsoDate.lhs:103:cvs_date_time = do y <- year
IsoDate.lhs-104-                   char '/'
IsoDate.lhs-105-                   mon <- month_num
--
RepoPrefs.lhs-118-                  "(^|/),","\\.class$","\\.prof$","(^|/)\\.DS_Store$",
RepoPrefs.lhs-119-                  "(^|/)BitKeeper($|/)","(^|/)ChangeSet($|/)",
RepoPrefs.lhs:120:                  "(^|/)\\.svn($|/)","\\.py[co]$","\\#","\\.cvsignore$"]
RepoPrefs.lhs-121-
RepoPrefs.lhs-122-darcsdir_filter :: [FilePath] -> [FilePath]

なぁーる。

ときどきは、man を見ようね。> 儂

--nobsun


Name:
Comment:

There is no comment.


2005-01-17 [nkf] ファイル名の文字コードを変更

Windowsで作った日本語名ファルをLinuxに持って来ると、ファイル名が化けてしまう事がある。

例えば、

 $ echo *.doc | kcc -c
 shift-JIS

こんな風にファイル名がshift-JISだと判別出来れば

 $ for i in *.doc; mv "$i" "`echo $i | nkf -e`"

と一括でファイル名の文字コードをEUCに変換できる(nkfの代わりにkccでも)。

--shibata


Name:
Comment:

There is no comment.


2005-01-14 [random] 与えられた引数をシャッフルする

複数(個数は一定ではない)の引数をシャッフルする

% ./shuffle 1 2 3
3 1 2 
% ./shuffle 1 2 3 4
3 4 2 1 
% ./shuffle 1 2 3 4 5
5 4 1 3 2 

Gauche のコード

#!/usr/local/bin/gosh
;;-*-scheme-*-
(use srfi-1)
(use srfi-27)
(use gauche.collection)

(define (main args)
  (random-source-randomize! default-random-source)
  (for-each (cut format (current-output-port) "~a " <>)
            (shuffle (list->vector (cdr args))))
  (newline))
            
(define (shuffle vec)
  (define (iter len vec)
    (if (= len 0)
        vec
        (iter (- len 1) (swap! vec len (random-integer len)))))
  (iter (- (size-of vec) 1) vec))

(define (swap! vec i j)
  (let1 x (vector-ref vec i)
    (vector-set! vec i (vector-ref vec j))
    (vector-set! vec j x)
    vec))

--nobsun


Name:
Comment:

There is no comment.


2005-01-13 [random] 与えられた引数をランダムに選択する

複数(個数は一定ではない)の引数からひとつだけランダムに選択する

% ./choice 1 2 3
2
% ./choice 1 2 3 4
1
% ./choice 1 2 3 4 5
5

Gauche のコード

#!/usr/local/bin/gosh
;;-*-scheme-*-
(use srfi-1)
(use srfi-27)

(define (main args)
  (random-source-randomize! default-random-source)
  (format (current-output-port)
          "~a~%" (choice "" (cdr args))))

(define (choice nv ls)
  (define (dotti n wm)
    (let ((w (car wm))
          (m (cdr wm)))
      (if (= (random-integer w) 0)
          (cons (+ w 1) n)
          (cons (+ w 1) m))))
  (cdr (fold dotti (cons 1 nv) ls)))

--nobsun


Name:
Comment:
shiro: (Thu Jan 13 14:23:23 2005 )
ランダムにひとつだけ、なんですよね?  これじゃだめなの?
(define (main args)
  (random-source-randomize! default-random-source)
  (print (list-ref (cdr args) (random-integer (- (length args) 1))))
  0)
nobsun: (Thu Jan 13 16:24:35 2005 )
あはっ。それで十分ですね。最初、入力がパラパラやってくる
ストリームのようなものを考えていたのでした。入力全体を保持するなら、
shiroさんがしめしたもので十分ですねぇ。
foldを使った時点で気づかないとはorz
ささだ: (Wed Feb 2 22:53:58 2005 )
puts ARGV[rand(ARGV.size)] if ARGV.size > 0


2005-01-12 [misc] Eliza

最初の?人工無能 Eliza。

Haskellインタープリタ Hugs98 に、デモスクリプト Eliza の一つとして付いてくる。 最初の Eliza の能力?に忠実なのかどうかは解らない。もちろん、英語でしか楽しめ ません。

Eliza.hs は古いライブラリを使っているので、

% hugs +P/usr/local/lib/hugs/oldlib:/usr/local/lib/hugs/libraries /usr/local/lib/hugs/demos/Eliza.hs

のように対話型のインタープリタを起動してください。

Eliza> 

のプロンプトが出たら、eliza を評価してください。Eliza の対話モードに入ります。 そうすると、

Eliza> eliza

Hi! I'm Eliza. I am your personal therapy computer.
Please tell me your problem.

> 

のように単純なプロンプト '> ' が表示されますので、あとは心ゆくまで ^^;

なお Hugs98 のインストールについては、 HowTo:Hugs を御覧ください。

--nobsun


Name:
Comment:

There is no comment.


2005-01-11 [script] 大きな整数の読み

漢数字表記のスクリプトをちょっと弄って、大きな整数の読みをひらがなで 表示するようにした。いちおう、連濁や促音便に対応したつもり ^^; です。

使い方

% yomi 10361234567890
じっ ちょう さん ぜん ろっ ぴゃく じゅう に おく さん ぜん よん ひゃく
ご じゅう ろく まん なな せん はっ ぴゃく きゅう じゅう 

スクリプトは以下のとおり

#!/usr/local/bin/runhugs +l
\begin{code}
module Main where

import System
import List

main = do { a:_ <- getArgs
          ; putStrLn $ yomikata a
          }

yomi,yomi' :: String -> String
yomi rstr
  = concat
  $ reverse
  $ zipWith mkname'' base10000
  $ map conv4
  $ every 4
  $ rstr

yomi' rstr
  = concat
  $ reverse
  $ zipWith mkname baseBig
  $ map yomi
  $ every 8
  $ rstr

yomikata str
 = case splitAt 52 $ reverse str of
     (s,"") -> yomi $ padding 4 s
     (s,b) -> if length b > 40
                 then "そんな大きな数の読み方は知りません"
                 else (yomi' $ padding 8 b) ++ yomi s
   where
     padding n s = s ++ replicate ((n - (length s `mod` n)) `mod` n) '0'

every _ [] = []
every n xs = hs : every n ts
 where (hs,ts) = splitAt n xs

base1 = ["","いち ","に ","さん ","よん ","ご ","ろく ","なな ","はち ","きゅう "]
base10 = ["","じゅう ","ひゃく ","せん "]
base10000 = ["","まん ","おく ","ちょう ","けい ","がい ","じょ ","じょう ","こう ","かん ","せい ","さい ","ごく "]
baseBig = ["ごうがしゃ ","あそうぎ ","なゆた ","ふかしぎ ","むりょうたいすう "]

conv4 rstr = zipWith mkname' base10
           $ map ((base1 !!) . read . (:[])) rstr

mkname _ "" = ""
mkname "" d = d
mkname p  d = d++p

mkname' "" "" = ""
mkname' "" d = d
mkname' p "" = ""
mkname' p "いち " = p
mkname' "ひゃく " "さん " = "さん びゃく "
mkname' "ひゃく " "ろく " = "ろっ ぴゃく "
mkname' "ひゃく " "はち " = "はっ ぴゃく "
mkname' "せん " "さん "   = "さん ぜん "
mkname' "せん " "はち "   = "はっ せん "
mkname' p d = d++p

mkname'' "" ["","","",""] = ""
mkname'' "" ds            = concat (reverse ds)
mkname'' p  ["","","",""] = ""
mkname'' "ちょう " ("はち ":rs) = concat (reverse rs) ++ "はっ ちょう "
mkname'' "ちょう " ("":"じゅう ":rs) = concat (reverse rs) ++ "じっ ちょう "
mkname'' "けい " ("はち ":rs) = concat (reverse rs) ++ "はっ けい "
mkname'' "けい " ("":"じゅう ":rs) = concat (reverse rs) ++ "じゅっ けい "
mkname'' "こう " ("はち ":rs) = concat (reverse rs) ++ "はっ こう "
mkname'' "こう " ("":"じゅう ":rs) = concat (reverse rs) ++ "じっ こう "
mkname'' "かん " ("はち ":rs) = concat (reverse rs) ++ "はっ かん "
mkname'' "かん " ("":"じゅう ":rs) = concat (reverse rs) ++ "じっ かん "
mkname'' "せい " ("はち ":rs) = concat (reverse rs) ++ "はっ せい "
mkname'' "せい " ("":"じゅう ":rs) = concat (reverse rs) ++ "じっ せい "
mkname'' "さい " ("はち ":rs) = concat (reverse rs) ++ "はっ さい "
mkname'' "さい " ("":"じゅう ":rs) = concat (reverse rs) ++ "じっ さい "
mkname'' p ds = concat (reverse ds)++p

\end{code}

--nobsun


Name:
Comment:
shiro: (Tue Jan 11 11:31:54 2005 )
一応、教科書的には「じゅっ」→「じっ」かな。最近は「じゅっ」も許容されるとおもうけど。
nobsun: (Wed Jan 12 10:54:14 2005 )
迷ったんです。>「じゅっ」or「じっ」
十把一絡なんかを「じっぱひとからげ」といって「はっ?」といわれたことがあったもんで。。。
nobsun: (Thu Jan 20 07:26:28 2005 )
修正しました。「じゅっ」 → 「じっ」


2005-01-07 [emacs] Infoを手軽に引く

プログラムを読む&書いていて知らない関数があった場合、emacsに付属している info-lookupのinfo-lookup-symbolコマンドを利用すれば手軽に調べられます。

info-lookup-symbolコマンドは、指定したシンボルに対する説明箇所を、 現在のメジャーモードに応じたinfoファイルから探してくれます。

(define current-page (make-parameter■ #f))

■にカーソルがある状態でinfo-lookup-symbolコマンドを実行すると、 カーソル位置にあるシンボルがデフォルトとしてミニバッファに入力されるので、 そのままエンターを押せば

 -- 機能: make-parameter value &optional filter
     [SRFI-39] 初期値がVALUEであるパラメータを作成します。
     もし省略可能な引数FILTERが与えられた場合……

の様にGaucheリファレンスマニュアルの索引を検索して該当ページを表示し、 指定したシンボルの説明箇所をハイライト表示してくれます。

ミニバッファでは索引のシンボルを補完しながら入力でき、 info-complete-symbolコマンドを利用するとミニバッファ以外でもシンボルを 補完入力できます。

info-lookupは標準でscheme-mode、lisp-mode、c-mode、makefie-modeなどの メジャーモードに対応しているが、info-lookup-add-helpコマンドを利用して 自由にカスタマイズできる。

info-lookup-add-helpは以下のような書式

 (info-lookup-add-help
  :topic ''HELP-TOPIC''
  :mode ''HELP-MODE''
  :regexp ''REGEXP''
  :ignore-case ''IGNORE-CASE''
  :doc-spec ''DOC-SPEC''
  :parse-rule ''PARSE-RULE''
  :other-modes ''OTHER-MODES'')
  • HELP-TOPIC: 'symbol か 'fileを指定
  • HELP-MODE: 対象モードを指定
  • REGEXP: 検索アイテムにマッチする正規表現を指定 (DOC-SPECで指定したドキュメント(索引など)から)
  • IGNORE-CASE: 大文字小文字を無視するか
  • PARSE-RULE: カーソル位置にある文字列から検索に使用する シンボルにマッチする正規表現か関数を指定(初期値はREGEXP)
  • OTHER-MODES: 相互参照するHELP-MODEをリストで指定
  • DOC-SPEC: 検索対象のinfoファイルとかを次の形式のリストで指定 (INFO-NODE TRANS-FUNC PREFIX SUFFIX)
    • INFO-NODE: Infoファイル名と索引のnode名を指定
    • TRANS-FUNC: 索引の項目名を変換する関数を指定、nilを指定したら REGEXPにマッチする物だけを使用、文字列を指定したら項目名の前に その文字列を追加
    • PREFIX: Infoページ内からシンボルを検索してハイライト表示する 正規表現(`PREFIX+ITEM+SUFFIX')の一部を指定
    • SUFFIX: 同上

scheme言語向けの設定なら以下のよう書きます。

  • ~/.emacs.el
    (define-key global-map "\C-\\\C-i" 'info-lookup-symbol)
    (eval-after-load "info-look"
      '(progn
         (info-lookup-add-help
          :topic 'symbol
          :mode 'scheme-mode
          :regexp "[^()`',\"\t\n]+"
          :ignore-case t
          :doc-spec '(("(gauche-refj.info)Index - 手続きと構文索引" nil
                       "^ -+ [^:]+: *" "[\n ]")
                      ("(gauche-refj.info)Index - モジュール索引" nil
                       "^ -+ [^:]+: *" "[\n ]")
                      ("(gauche-refj.info)Index - クラス索引" nil
                       "^ -+ [^:]+: *" "[\n ]")
                      ("(gauche-refj.info)Index - 変数索引" nil
                       "^ -+ [^:]+: *" "[\n ]")
                      ("(slib.info)Index" (lambda (item) (concat item " <slib>"))
                       "^ -+ [^:]+: *" "[\n ]")
                      ("(r5rs)Index" (lambda (item) (concat item " <r5rs>"))
                       "^[ \t]+-+ [^:]+:[ \t]*" "[\n ]"))
          :parse-rule "[^()`',\" \t\n]+"
          :other-modes nil)
    
         (info-lookup-add-help
          :mode 'inferior-scheme-mode
          :other-modes '(scheme-mode))
         ))
    

これで、delayと入力すれば

  • 'delay'、
  • 'delay <r5rs>'、
  • 'delay <slib>'、
  • ' delayed evaluation <r5rs>'、 の4つが補完できます。

しかし、emacs付属のinfo-lookupは複数のInfoファイルに同じ項目があっても、 全Infoファイルの索引を順に検索していき最初にマッチした項目を表示しちゃうので、 'delay <r5rs>'、'delay <slib>'を選択してもgauche-refj.infoファイルの中身が 表示されます。 これは期待する動きとは違うので、以下のパッチを当てて補完アイテムに自分の INFO-NODEを覚えてもらいます。

  • info-look.patch
    355c355
    <                   (Info-goto-node node)
    ---
    >                   (Info-goto-node (cddr entry))
    366c366
    <                    (concat "^\\* " (regexp-quote (or (cdr entry) (car entry)))
    ---
    >                    (concat "^\\* " (regexp-quote (or (cadr entry) (car entry)))
    367a368
    >               (backward-char 1)
    376c377
    <                      (concat prefix (regexp-quote (car entry)) suffix))
    ---
    >                      (concat prefix (regexp-quote (or (cadr entry) (car entry))) suffix))
    381c382
    <                          (re-search-forward (regexp-quote (car entry)))
    ---
    >                          (re-search-forward (regexp-quote (or (cadr entry) (car entry))))
    485c486
    <                                 (setq result (cons (cons item entry)
    ---
    >                                 (setq result (cons (cons item (cons entry node))
    
    $ wget 'http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/emacs/emacs/lisp/info-look.el?rev=1.44' -O info-look.el
    $ patch info-look.el < info-look.patch
    
    GNU Emacs 21.3.50.1とGNU Emacs 21.3.1で動作確認しました (一致項目が無い時、21.3.1だとassoc-string関数無いよエラーになりますが、 問題ないです)

--shibata


Name:
Comment:

There is no comment.


2005-01-06 [script] 整数の漢数字表記

英語圏文化では、大きな整数を認識しやすくするために、3桁ずつ区切るのだが、 日本人にとっては、大きな整数を認識しやすくするには、漢数字表記にするという 方法がある。というわけで、漢字表記してくれるスクリプト。使い方は、

% ./kansuuji 82182967821991
八十二兆千八百二十九億六千七百八十二万千九百九十一

Haskellのコードは少し長いけれど、以下のとおり

#!/usr/local/bin/runhugs +l
\begin{code}
module Main where

import System
import List

main = do { a:_ <- getArgs
          ; putStrLn $ toKanSuuji a
          }

toKan,toKan' :: String -> String
toKan rstr
  = concat
  $ reverse
  $ zipWith mkname base10000
  $ map (concat . reverse . conv4)
  $ every 4
  $ rstr

toKan' rstr
  = concat
  $ reverse
  $ zipWith mkname baseBig
  $ map toKan
  $ every 8
  $ rstr

toKanSuuji str
 = case splitAt 52 $ reverse str of
     (s,"") -> toKan $ padding 4 s
     (s,b) -> if length b > 40
                 then "こんな大きな数は漢数字名は知りません"
                 else (toKan' $ padding 8 b) ++ toKan s
   where
     padding n s = s ++ replicate ((n - (length s `mod` n)) `mod` n) '0'

every _ [] = []
every n xs = hs : every n ts
 where (hs,ts) = splitAt n xs

base1 = ["","一","二","三","四","五","六","七","八","九"]
base10 = ["","十","百","千"]
base10000 = ["","万","億","兆","京","垓","禾予","穣","溝","澗","正","載","極"]
baseBig = ["恒河沙","阿僧祇","那由他","不可思議","無量大数"]

conv4 rstr = zipWith mkname' base10
           $ map ((base1 !!) . read . (:[])) rstr

mkname "" "" = ""
mkname "" d = d
mkname p "" = ""
mkname p d = d++p

mkname' "" "" = ""
mkname' "" d = d
mkname' p "" = ""
mkname' p "一" = p
mkname' p d = d++p
\end{code}

--nobsun


Name:
Comment:

There is no comment.


2005-01-05 [script] 長い桁の整数を3桁ごとにカンマを入れて表示

Gauche スクリプトなら

#!/usr/local/bin/gosh
(define (main args) (format #t "~,,',,3:d~%" (x->number (cadr args))))

上のスクリプトを commaint というファイル名で保存し、実行パーミッションを ONにして実行

% ./commaint 1223334555677789
1,223,334,555,677,789

--nobsun


Name:
Comment:
shiro: (Wed Jan 5 08:34:11 2005 )
cadrの前に括弧が抜けてる?
ちなみにformat書式はCommon Lisp由来。個人的には見にくいからあんまり好きじゃない。
nobsun: (Wed Jan 5 12:35:57 2005 )
ぬけてた。修正しますた。
短く書きたいときにしか使わない?
shiro: (Wed Jan 5 20:38:23 2005 )
Common Lispのformat書式はad hocの塊っていう感じです。実装するのは、パズルとしてはおもしろいんですけどね。
処理系が手元にあったら、次の式を評価してみましょう。そりゃあったら便利な場面はあるだろうけど…Gaucheではこいつらはサポートしてません。
(format t "~r" 123456789)
(format t "~:r" 123456789)
(format t "~@r" 1234)


2005-01-04 [LG3D] Project Lookig Glassデスクトップをフルスクリーンで描画する

lg3d/bin/lg3d-devを実行すると表示されるデスクトップウインドウをフルスクリーンで描画させる。

lg3d/etc/lg3d/displayconfig/j3d1x1を書き換える。

(ScreenAttribute center WindowSize (800 600))

となっている箇所を以下のように変更。LinuxでもWindowsでも有効。

(ScreenAttribute center WindowSize NoBorderFullScreen)

参考文献: https://lg3d.dev.java.net/servlets/ReadMsg?list=interest_ja&msgNo=224

--yasuyuki


Name:
Comment:

There is no comment.


このサイトは、 IPA の「平成15年度オープンソフトウエア活用基盤整備事業」 の委託事業として開発されたKahuaで試験的に運用しております。

Copyright (c) 2004-2007 株式会社タイムインターメディア About Us