2008/06/07

[Erlang] http:request の前に inets:start() が必要

ひさしぶりに Erlang で http:request とかしてみたら動かない。ドキュメント を読んでみるとまず inets:start() が必要らしい。

1> inets:start().
2> {ok, {Status, Header, Body}} = http:request("http://www.google.co.jp").

Ftp も同様に inets:start() が必要。さらに以前 ftp:open, ftp:close だったものが、inets:start(ftpc,...), inetsA:stopに変更されているみたい。

#!/usr/bin/env escript

main(_) ->
inets:start(),
{ok, Pid} = inets:start(ftpc, [{host, "ftp.example.com"}]),
ftp:user(Pid, "user", "password"),
ftp:cd(Pid, "/public_html/erlang"),
lists:foreach(fun(File) ->
ftp:send(Pid, File)
end,
["cookbook.html",
"cookbook.css",
"index.html"]),
inets:stop(ftpc, Pid).

Erlang はメジャーバージョンが12。着々とバージョンアップを重ね、着々と機能を向上させている。こういうところはとってもえらいと思うよ、Erlang.

2008/06/04

[Erlang][FUSE] 分散ファイルシステム

Eralng, UFSE, 分散ファイルシステムあたりのメモ。

ということで、分散ファイルシステムが欲しいと思っている今日この頃、Windows 分散ファイルシステムを Erlang で書いたらいいのに。。。

2008/06/03

[Emacs] Emasc で XIM を無効にする方法

Emasc で XIM を無効にする方法。以前も調べてまた今日も調べたのでメモ。

.Xresources に次のように書いておく。
Emacs*useXIM: false

Emacsでuimにキーを奪われる

関係ないけど、いつも href を herf と書いてしまう。

2008/05/30

[Common Lisp] Twitter というよりむしろ CL-JSON

以前、Common Lisp で Twitter API をたたいて妙なアクセサを作ったりしたけど、CL-JSON にはもっと便利な機能があった。

  • *json-symbols-package*
  • *json-object-factory*
  • *json-object-factory-add-key-value*
  • *json-object-factory-return*

などを上手に設定してやれば、ちゃんと Lisp のオブジェクトを構築してくれる。下のコードの twitter-status は user スロットに twitter-user を持つが、そのへんもきちんとめんどうみてくれる。CL-JSON かしこい。

まだきちんと把握してないが、以下コードの断片。

(in-package :twittcl)
;; 文字コードは UTF-8 で
(setf drakma:*drakma-default-external-format* :utf-8)

;; ボディを文字列で取得するために、テキストとして判定される Content-Type を追加
(pushnew '("application" . "json") drakma:*text-content-types* :test #'equal)


(defclass* twitter-api ()
((user)
(passwd)))

(defun authorization (twitter-api)
(list (user-of twitter-api)
(passwd-of twitter-api)))

(defun friends-timeline (twitter-api)
"friends_timeline を取得する。"
(multiple-value-bind (json http-status)
(drakma:http-request "http://twitter.com/statuses/friends_timeline.json"
:basic-authorization (authorization twitter-api))
(when (= 200 http-status)
(decode-twitter-status json))))

(defun public-timeline (twitter-api)
"public_timeline を取得する。"
(json:decode-json-from-string
(drakma:http-request "http://twitter.com/statuses/public_timeline.json"
:basic-authorization (authorization twitter-api))))


(defclass* twitter-user ()
((name)
(screen-name)
(description)
(location)
(profile-image-url)
(url)
(id)
(followers-count)))

(defclass* twitter-status ()
((created-at)
(id)
(user)
(text)
(in-reply-to-status-id)
(source)))

(defun decode-twitter-status-status (obj key value)
(let ((slot (json::json-intern (substitute #\- #\_ key))))
(when (null obj)
(setf obj (if (eq 'name slot)
(make-instance 'twitter-user)
(make-instance 'twitter-status))))
(when (slot-exists-p obj slot)
(setf (slot-value obj slot) value)))
obj)

(defun decode-twitter-status (json)
(let ((json:*json-symbols-package* (find-package :twittcl))
(json:*json-object-factory* #'(lambda () (list)))
(json:*json-object-factory-add-key-value*
'decode-twitter-status-status)
(json:*json-object-factory-return* #'identity))
(json:decode-json-from-string json)))

2008/05/28

[アセンブラ] アセンブラで Brainf*ck のコア部分のみ

Brainf*ck の Hello, world! を アセンブラで実装してみた。コア部分のみ。Hello, world! のハードコーディング。

Direct threaded code になっているはず。

bits 64

section .text

%macro next 0
lodsq
jmp rax
%endmacro

;;; >
g:
inc r12
next
;;; <
l:
dec r12
next
;;; +
p:
inc byte [r12]
next
;;; -
m:
dec byte [r12]
next
;;; .
d:
mov r13, rsi
mov rax, 1
mov rdi, 1
push qword [r12]
mov rsi, rsp
mov rdx, 1
syscall
pop rax
mov rsi, r13
next
;;; ,
c:
mov r13, rsi
mov rax, 0
mov rdi, 0
push rax
mov rsi, rsp
mov rdx, 1
syscall
pop rax
mov [r12], rax
mov rsi, r13
next
;;; [
w:
mov rax, [r12]
and rax, 0x00000000000000ff
jnz .next
mov rsi, [rsi]
next
.next:
add rsi, 8
next
;;; ]
e:
mov rsi, [rsi]
next


global _start
_start:
mov r12, memory

baha:
mov rsi, .main
next
align 8
.main:
dq p
dq p
dq p
dq p
dq p
dq p
dq p
dq p
dq p
begin1:
dq w
dq end1
dq g
dq p
dq p
dq p
dq p
dq p
dq p
dq p
dq p
dq g
dq p
dq p
dq p
dq p
dq p
dq p
dq p
dq p
dq p
dq p
dq p
dq g
dq p
dq p
dq p
dq p
dq p
dq l
dq l
dq l
dq m
dq e
dq begin1
end1:
dq g
dq d
dq g
dq p
dq p
dq d
dq p
dq p
dq p
dq p
dq p
dq p
dq p
dq d
dq d
dq p
dq p
dq p
dq d
dq g
dq m
dq d
dq m
dq m
dq m
dq m
dq m
dq m
dq m
dq m
dq m
dq m
dq m
dq m
dq d
dq l
dq p
dq p
dq p
dq p
dq p
dq p
dq p
dq p
dq d
dq m
dq m
dq m
dq m
dq m
dq m
dq m
dq m
dq d
dq p
dq p
dq p
dq d
dq m
dq m
dq m
dq m
dq m
dq m
dq d
dq m
dq m
dq m
dq m
dq m
dq m
dq m
dq m
dq d
dq g
dq p
dq d
dq exit

exit:
mov rax, 60
xor rdi, rdi
syscall

section .bss
memory resq 1024 * 1024

2008/05/25

[Forth] Threaded Code

Threaded Code. マルチスレッドではない。コードの実行方法か。http://en.wikipedia.org/wiki/Forth_virtual_machine

言語を作るのなら重要項目の一つだね。

Threaded Code
このサイトが有名らしい。各種 threaded code を説明している。
Moving Forth: Part 1
図つきて各種 threaded code の説明がある。
Speed of various interpreter dispatch techniques V2
各 threaded code の性能比較。やはり DTC が速いのかな。repl-switch.c と switch.c の違いがよくわからん。make 一発で実行できるのが嬉しい。

Forth では次のような感じの実装になる。64bit アセンブラで。NASM ね。

rsi レジスタがバイトコードのアドレス。loadsq で rax に次に実行するバイトコードのアドレスをロードして(rsi はインクリメントされる)、ジャンプする。

Indirect threaded code

        lodsq
jmp qword [rax]

Direct threaded code

        lodsq
jmp rax

Token threaded code

        lodsq
jmp [token_table + rax * 8]

2008/05/22

[assembler] 64bit アセンブラで Hello World! こっちかな

どうやら 64bit だとシステムコールに syscall を使い、システムコールの番号も使うレジスタも違うみたい。

http://www.milw0rm.com/papers/110

        ;; -*- mode: asm; coding: utf-8; -*-
;; nasm -f elf64 nasm.asm
;; ld -s -o nasm nasm.o
;; ./nasm

section .text

global _start

_start:
mov rax, 1 ; 出力システムコール
mov rdi, 1 ; 標準出力
mov rsi, msg ; 文字列のアドレス
mov rdx, len ; 文字列の長さ
syscall ; システムコール実行

mov rax, 60 ; exit システムコール
mov rdi, 0 ; exit コード
syscall ; システムコール実行

section .data

msg db 'Hello World!', 0ah, 'まみむめも♪', 0ah
len equ $ -msg