Chat (Lingr.com)
Informaiton
Daily
Column
- MySQL日本語の旅(5/1)
- アクセス向上秘伝(5/9)
- 一風変ったHaskellλ門(6/13)
- SICP Answer Book (5/31) 問題3.26追加
Zope Solution
Extra
アーカイブ
OSS案内所
Site Info
関連リンク
- 2004: 01 02 03 04 05 06 07 08 09 10 11 12
- 2005: 01 02 03 04 05 06 07 08 09 10 11 12
- 2006: 01 02 03 04 05 06 07 08 09 10 11 12
- 2005-01-31 [ASCII] ASCIIコード表
- 2005-01-28 [emacs] キーボードマクロ
- 2005-01-27 [fifo] 名前付パイプをつかって2つのログファイルを同時に見る
- 2005-01-26 [Apache] Cookie の追跡
- 2005-01-25 [X] スクリーンショットを取る
- 2005-01-24 [SICP] 超循環評価器をGaucheで動かす
- 2005-01-21 [MySQL] MacOS XでMySQLを削除する
- 2005-01-20 [MacOS] MacOS X付属のApacheでユーザーディレクトリのCGIを有効にする
- 2005-01-19 [emacs] Emacs-w3m で Cookie
- 2005-01-18 [grep] コンテキスト表示
- 2005-01-17 [nkf] ファイル名の文字コードを変更
- 2005-01-14 [random] 与えられた引数をシャッフルする
- 2005-01-13 [random] 与えられた引数をランダムに選択する
- 2005-01-12 [misc] Eliza
- 2005-01-11 [script] 大きな整数の読み
- 2005-01-07 [emacs] Infoを手軽に引く
- 2005-01-06 [script] 整数の漢数字表記
- 2005-01-05 [script] 長い桁の整数を3桁ごとにカンマを入れて表示
- 2005-01-04 [LG3D] Project Lookig Glassデスクトップをフルスクリーンで描画する
2005-01-31 [ASCII] ASCIIコード表
「そんなことも知らんかったんかシリーズ」改め「おいおいシリーズ」(^^;)
ちょっと、ASCIIコードを調べたいときってありますよね。そんなとき、 「なんかのCの本の付録についてなぁ。」とかいって、本を探している そこの貴方(って、儂のこんとか)、「そんなんググれっ!」なんて言っている そこの貴方(って、これも儂のことか)、man でんがな!
% man ascii
--nobsun
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
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
tail -f で複数ファイル指定じゃ駄目ですか?
tail -f で複数ファイルを指定できると思っていなかった orz 思い込まずにやってみれば判ったのに > 儂
2005-01-26 [Apache] Cookie の追跡
mod_usertrack を利用する。Debian で Apache を使っているときには、
/etc/apache/httpd.conf の以下の箇所を変更
- usertrack_module の組込み
#LoadModule usertrack_module /usr/lib/apache/1.3/mod_usertrack.so
のようにコメントアウトされている部分のコメントを外して、LoadModule usertrack_module /usr/lib/apache/1.3/mod_usertrack.so
とする。 - Cookie の追跡機能をONにする
<IfModule mod_usertrack.c> CookieTracking on CookieExpires "3 days" </IfModule>
- ログ形式を設定
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
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
スクリーンショットを取るときには、別の端末からリモートログインして 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 で動作させることが できます。
- パッチを ch4-mceval.scm に当てる。
% patch -b < ch4-mceval-gauche.patch
- Gauche を起動する
% gosh gosh>
- ロードパスにカレントディレクトリを加える
gosh> (add-load-path ".") ("." "/usr/local/share/gauche/site/lib" "/usr/local/share/gauche/0.8.3/lib") gosh> - 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
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
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
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
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
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
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
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
ランダムにひとつだけ、なんですよね? これじゃだめなの? (define (main args) (random-source-randomize! default-random-source) (print (list-ref (cdr args) (random-integer (- (length args) 1)))) 0)
あはっ。それで十分ですね。最初、入力がパラパラやってくる ストリームのようなものを考えていたのでした。入力全体を保持するなら、 shiroさんがしめしたもので十分ですねぇ。 foldを使った時点で気づかないとはorz
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
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
一応、教科書的には「じゅっ」→「じっ」かな。最近は「じゅっ」も許容されるとおもうけど。
迷ったんです。>「じゅっ」or「じっ」 十把一絡なんかを「じっぱひとからげ」といって「はっ?」といわれたことがあったもんで。。。
修正しました。「じゅっ」 → 「じっ」
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
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
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
cadrの前に括弧が抜けてる? ちなみにformat書式はCommon Lisp由来。個人的には見にくいからあんまり好きじゃない。
ぬけてた。修正しますた。 短く書きたいときにしか使わない?
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
There is no comment.