2010年12月24日金曜日

今日の無題

今年もVLCメディアプレイヤーは期間限定でクリスマス仕様みたいです。
(左:WindowsXP / 右:Ubuntu9.10)

去年(2009年)のスクリーンショット

2010年11月14日日曜日

[newLISP]guiserverをインストールせずに使いたい

newlispに付属のGUI(GUI-Server)は各種ファイルが既にインストールされている状態で ないと利用できないので、なるべく任意のディレクトリで使うようにするための方法です。

※newlispのバージョンアップに伴い利用できなくなる可能性があります
※Linux環境(CentOS_5)にて動作確認

環境変数NEWLISPDIRにguiserver.{jar.lsp}が置いてあるディレクトリを指定してプロセスを起動させる
(ソースパッケージを展開した場合は"newlisp-10.x.x/guiserver"以下にあるはず)

% pwd 
/home/kosh/src/newlisp-10.2.16/guiserver
% NEWLISPDIR=`pwd` newlisp table-demo.lsp
newLISP-GS v.1.42 on Linux
(guiserverが起動する)

いちいちタイプするのが面倒なら設定ファイル ~/init.lsp (または .init.lsp)に以下のコードを記述する

(env "NEWLISPDIR" "/path/to/guiserver"))

guiserverディレクトリ内にあるデモスクリプトを眺めるのはこれでOK

newLISPエディタを起動させる

エディタを起動させる場合にはもう少し手を加える必要がある。
guiserver-edit.lspを編集してハードコートされているnewlispのパスを書き換える。

% sed 's!"/usr/bin/newlisp "!/path/to/newlisp!g' newlisp-edit.lsp > newlisp-edit-alt.lsp
% newlisp newlisp-edit-alt.lsp

また、main-args関数にはnewlispが実行されたときの引数がリストとして格納されているので

"/usr/bin/newlisp " -> (main-args 0)

のように置換しても良い。

2010年11月8日月曜日

newLISP v10.2.X インストールメモ

以前書いた情報 がすっかり古くなったので書き直し。

現在(2010年11月時点)の安定版はnewlisp v.10.2.8
開発版はnewlisp v.10.2.17です。

このページは以下のURLと配布ファイルに同梱しているREADMEを参考に作成しています。

newLISP - Downloads

ダウンロードページ

配布されているtarballの中身

newlisp-xx.yy.zz
|-- makefile_XXX - 各種Makefile
|-- newlisp.c - newlispのソースコード
...
|-- doc/ - ドキュメント・マニュアル
|   |-- MemoryManagement.html
...
|   `-- newlisp_manual.html
|-- example/ - サンプルスクリプト
|-- guiserver/
|   |-- guiserver.jar - GUI-Server本体
|   |-- guiserver.lsp - GUI-Serverとの通信用スクリプト
    ...
|   |-- images/ - 各種アイコン
|   `-- java/ - guiserver.jarのソースコード
|-- modules/ - モジュール
|-- qa-specific-tests/ - テスト用ファイル
|-- util/ - その他
...
|-- configure
|-- configure-alt
`-- README

インストーラからインストールする

WIn32/MacOSX/Ubuntuには公式でインストーラが配布されているので導入は楽

ただしWin32のUTF-8版バイナリはインストーラとは別に配布されている

wget http://www.newlisp.org/downloads/UTF-8_win32/newlisp.exe

公式のダウンロードページの下部には有志によるDebianリポジトリも作成されているので、これを利用して自動更新する方法もある。

apt and dpkg repository for newLISP

ソースからmakeする

野良ビルドの基本としてconfigureスクリプトがあるが、代わりに同梱されている configure-alt スクリプトを利用すると自分の環境に合わせたmakefileを作成して くれる。

具体的には以下

  • OSの判別
  • データ型モデル(LP64/ILP32)の判別
  • UTF-8の利用(デフォルトはyes)
  • readlineライブラリの有無
  • IPv4/6利用の選択(デフォルトはIPv4)
  • インストールディレクトリの選択 (--prefix=/usr/local)
  • などなど

※newLISPではこの辺をautomakeを使わずに自前で用意している。
※configure-altも失敗する可能性があるので、その時はconfigureスクリプトを使う

guiserverはソースと共にjarファイルが同梱されているのでjavaコンパイラは必要ない。もちろんguiserverを起動させる場合にはjava仮想マシン(JVM)がインストールされている必要がある。

実際にコンパイルしてみる

% wget http://www.newlisp.org/downloads/newlisp-10.2.X.tgz
% tar zxvf newlisp-10.2.X.tgz
% cd newlisp-10.2.X
% ./configure-alt
% make
% make check
% sudo make install

最小インストール

Win32,UNIX系OSどちらも実行バイナリ単体で動作する。

% sudo cp newlisp /usr/local/bin/newlisp

開発版と安定版を使い分ける場合はバージョン番号で管理すると便利。

% sudo install -m 755 ./newlisp /usr/local/bin/newlisp-10.2.16
% sudo ln -sf /usr/local/bin/{newlisp-10.2.16,newlisp}

% ls -l /usr/local/bin/newlisp*
    lrwxrwxrwx 1 root root     30 11月  1 11:59 /usr/local/bin/newlisp -> /usr/local/bin/newlisp-10.2.16
    -rwxr-xr-x 1 root root 270520 11月  1 11:57 /usr/local/bin/newlisp-10.2.16

2010年10月30日土曜日

今年読んだ本

なんとなく、今年(2010年)買った技術書を列挙してみる。

プログラミング言語系
JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス
Pythonチュートリアル 第2版
開発ツール
入門git
入門SSH
GDBハンドブック
HTML & CSS ビジュアル・リファレンス 改訂版
その他
Software Design 総集編 【2000~2009】(DVD付)
Puzzles for Hackers:スクリプトキディから大人のハッカーへ (IT Architects' Archive 知の連環)
Winnyの技術

後は図書館とか大学の蔵書をちょこちょこと。 「プログラミングClojure」や「Scheme手習い」などのLisp系の書籍は面白そうと思いながらも結局買ってなかったな…。

自分にしては珍しく色々と買ったような気がしたが、よく見ると入門書ばかり漁っていたらしいことにようやく気づいた。

2010年9月8日水曜日

[Emacs]Unicodeエスケープ文字を復元する

\u0040\u006b\u006f\u0073\u0068\u005f\u0062\u006f\u0074
上記のようなUnicodeエスケープ文字を元の文字列に戻すためのEmacs Lispです。ついでなので逆のエスケープする関数も書いておきます。

xyzzyの方は単純にElispのコードを書き換えただけ。xyzzyはemacsより書き方に幅があるようだけど、あんまりトリッキーなコードだとelisp<=>xyzzy間のコードの移植が大変になりそう。

emacsでこんな感じの置換操作を行う場合は以下のように書くのが定石らしい。

(while (re-search-forward "検索したい文字列" nil t)
  (replace-match "置換後の文字列" nil 'リテラルかどうか))

xyzzyならストリームを扱う関数を作ってed::text-decode-regionから呼び出すのが便利。

参考リンク

2010年7月20日火曜日

今日の無題

Debian4.0終了のお知らせ(遅)

半年くらい前にインストールしたcoLinuxを久々に 引っ張りだしてみたら、どうやら Debian-4.0r0-etch.ext3 ではディストリビュ ーションのバージョンが少々古くなってしまったらしい。

apt-getが使えないと色々困るので Debian -- ディストリビューションアーカイブ に書いてあるのを参考に /etc/apt/sources.list を書き換える必要がある。

    deb http://ftp.riken.jp/Linux/debian/debian-archive/ etch main contrib non-free
    deb-src http://ftp.riken.jp/Linux/debian/debian-archive/ etch main contrib non-free

もしくは素直にSourceForge.net からDebian 5.0 Lennyを持ってきたほうが賢いのかもしれないけど。

参考

2010年5月31日月曜日

[Emacs]sha1-file

舌足らずなブログ: あれ? がようやく解決したのでメモ。

こっちもxyzzyのエンコーディング指定と同じミスでした。
sha1.elはそれなりに長い文字列を受け取ると外部プロセスに処理を投げるので、その時の入力をバイナリ指定にしないといけないらしい。

(defun sha1-file (filename)
  (require 'sha1)
  (let ((coding-system-for-write 'binary))
    (with-temp-buffer
      (insert-file-contents filename)
      (sha1 (buffer-string)))))

ちなみにEmacs内部で処理する場合はエンコーディング指定は要らない。

(let ((sha1-use-external nil))
  (with-temp-buffer
    (insert-file-contents FILENAME)
    (sha1 (buffer-string))))

2010年5月19日水曜日

[newLISP]今日の無題

自作したnewlisp.elの挙動がおかしかった原因が少し分かったのでメモ。

newlispのREPLはデフォルトで行編集ライブラリ(readline)が使えるが、 複数行を入力する場合は[cmd]~[/cmd]タグでS式を囲まなければいけないのが newlispの面倒な仕様。

newlisp.elの newlisp-eval関数はその辺を考慮してプロセスに文字列を 送るようにしているのだけど、なぜか効果が無いようでREPLバッファに 入力が溜まってしまう現象がよく起きていた。

2010年2月9日火曜日

newLISP基礎文法最速マスター

待っていても誰も書きそうにないので自分で作りました。

これは何?

Lisp風スクリプト言語newLISPの文法一覧です。(→newLISP公式ページ)
S式について多少でも知っている人は他の処理系と比較してもよし。
そもそもS式を知らない人はLisp入門にしてもよし。 (先に他の有名なScheme処理系やCommon Lispに手を出す方が無難ですが)
newLISPの簡易リファレンスとして利用できるかと思います。ただし無保証です。

2010年2月1日月曜日

[xyzzy]zone.l移植

Emacsのジョークプログラムzone.elを移植したのでGitHubに置いておきますね。

壁||´・ω・`)っ kosh04/xyzzy-lisp/site-lisp/zone.l

※コード内の説明文はシフトJISなのでブラウザから開くとたぶん文字化けしますん。

2010年1月30日土曜日

Scheme コードバトンに参加

次回3月予定のShibuya.lispに向けて、現在面白げな企画が進行中です。

Shibuya.lisp に向けて Scheme コードバトンするのはどうか?
第1回 Scheme コードバトンのお知らせ - ひげぽん OSとか作っちゃうかMona-

;; ■ これは何か?
;; Scheme のコードをバトンのように回していき面白い物ができあがるのを楽しむ遊びです。
;; 次回 Shibuya.lisp で成果を発表します。
;; Scheme 初心者のコードを書くきっかけに、中級者には他人のコードを読む機会になればと思います。
;;
;; ■ 2 つのルール
;;
;; (1)自分がこれだと思える変更をコードに加えて2日以内に次の人にまわしてください。
;; 「人に優しい」変更なら何でも良い。1文字の変更でも可。
;; 「人に優しい」とは例えば、次の人が読みやすいコードを書くなど。
;; コードを削るのもあり。
;;
;; (2)次の人にまわしコードが変更されるのを"見守る"。
;; この説明書きを含めてバトンが伝わった事を必ず確認してください。
;; 止まっていたら助けてあげてください。

自分もg00001さんのバトンから派生したCL版を弄らせてもらいました。ライブラリまわりの導入に手間取ったのがちょっと痛かったかも…とりあえずテスタくらいの役割は果たせたんじゃないかと思います。

それと、newlispも一応lisp風スクリプト言語ということで大元となるhigeponさんのバトンからforkしてnewlisp版も作ってみることに。
こちらはCLやSchemeと違って正しいコーディングスタイルが分かってないので、つらつらと手の赴くままに。

動作例は以下

[~/code/newlisp]$ newlisp scheme_button.lsp http://gist.github.com/273424.txt # 辞書ファイルをURLから取得
allowance: 割当量 [y/n/q]? y
defect: 欠点 [y/n/q]? n
errand: 使いっ走り [y/n/q]? y
exploration: 探査、探検 [y/n/q]? y
heap: 積み重ねた物 [y/n/q]? y
;; saving dict...done
[~/code/newlisp]$ cat words.txt
(allowance "割当量" 1 0)
(defect "欠点" 0 1)
(errand "使いっ走り" 1 0)
(exploration "探査、探検" 1 0)
(heap "積み重ねた物" 1 0)

scheme版と同様にコマンドラインからの利用で、 newlispバイナリ一つあれば動作するようになっているとは思います。

CL版弄った時間もあわせると2日以上かかっていますがまあ気にしない。

2010年1月15日金曜日

今日の無題

小野和俊のブログ:成長しないプログラマーの7つの悪習慣

4つほど該当。

ただ、自分にとって不満な事柄を「人のせいにする」のではなく「自分のせいにして無限ループに陥る」ことも悪習慣の一つなんじゃないかな。。

今年は少しずつでいいから出来ることを噛み締めて形にしていこうと思います。

2010年1月7日木曜日

[xyzzy]分かったけど解決はしていない

xyzzyを初期化ファイルなし(xyzzy.exe -q)で起動するとメニューバーの [表示]->[ツールバー]部分が表示されない問題の原因が分かったのでメモ。

これはどうやらツールバーメニューの初期化を行う関数 (ed::load-command-bar-info) が *load-history-hook* から呼び出されていて、さらにこのフック変数を実行する関数 (load-history-file) が.xyzzyのロードと共に呼び出されている為に -q オプションを 指定して起動するとツールバーメニューが空になる現象が起こるらしい。

;; estartup.l:148:
(unless no-init-file
  (trap-errors
    (let ((*loading-user-initial-file* t))
      (load (namestring (if (file-system-supports-long-file-name-p "~/")
                            "~/.xyzzy" "~/_xyzzy"))
            :if-does-not-exist nil :verbose nil :print nil)))
  (unless *inhibit-history-load*
    (ignore-errors (load-history-file))))

[追記]

根本的な解決策ではないが、以下をsiteinit.lに入れてダンプファイル削除+再起動で直ったことにしておこう。

(defun load-command-bar-info-if-xyzzy-q ()
  (let ((cl (car si:*command-line-args*)))
    (when (or (equal cl "-q")
              (equal cl "-no-init-file"))
      (ed::load-command-bar-info))))
(add-hook '*pre-startup-hook* #'load-command-bar-info-if-xyzzy-q)