週記くらい

  • Profile

Monthly Archives: August 2007

Second Life人口遷移

Posted on 2007/08/28 by smeghead

唐突にSecond Lifeネタ。

Second Lifeのサイト(http://secondlife.com/)には、下のような情報が表示されています。

Total Residents: 9,142,279

Logged In Last 60 Days: 1,574,518

Online Now: 28,746

US$ Spent Last 24h: $1,173,115

LindeX Activity Last 24h: $236,869

過去のいろんなブログに、上の情報の魚拓が貼られています。これらを調べることで、過去からの人口遷移が見れることに気がつきました。

Second Life人口遷移

(注意:集計結果には全く責任もてませんので、興味のある人は真面目に集計してくださいm(_ _)m )

Second Life 人口遷移

赤: 全人口

青: 過去60日にログインしたユーザ数

緑: ログイン中ユーザ


分析は苦手ですが、全人口の増加のペースは話題になってるだけあって凄いです。あと、ログイン中ユーザは、時間によって違うので人口遷移の観点では全く信用できません。でも、過去60日にログインしたユーザ数は2007年7月くらいから減少傾向のようです。定着率は決して高いとは言えないみたいです。7月からだから、カジノ廃止の影響を受けているのかもしれません。

エロとギャンブルのSecond Lifeからギャンブルが消えたと言っても、様々なサービスがエロから開始したことを考えると、スタートは絶好調なのかもしれません。今後の展開はどうなるんでしょうか。

Posted in free | Leave a comment |

テキストブラウザ #6

Posted on 2007/08/27 by smeghead

前回(id:smeghead:20070825:ncurses2)の続き

ファイヤープロジェクト

http://www.fireproject.jp/

ここのサイトのの情報って幅広さと濃さが凄いですね。かなり前から色々な言語でお世話になっています。

matsuさんという方が個人で作成しているらしいです。頭が下がりますm(_ _)m

パッド

パッドを使用すると論理画面にまとめて表示データを格納しておいて,必要な分だけ物理画面で表示することが可能になる.しかも簡単に.

http://www.fireproject.jp/feature/c-language/curses/pad.html#2

以前、仮想画面と勘違いしていたのはパッドでした。ということでパッドを試してみました。

今回は、上のサイトで紹介されている「なんちゃってless」をcommon lispで書いてみました。

  • オリジナルのなんちゃってlessから変更した点
    • w3mのようにカーソルがある点
    • キーバインドをw3m風に(といってもhjklqしか作ってません)
curses-wrapper.lisp

継ぎ接ぎだらけですがここに置いてみました。

追加したマクロ

(defmacro with-pad (pad-name initial-proc &body body)
`(progn
(setq ,pad-name ,initial-proc)
,@body
(delwin ,pad-name)))
less.lisp
(load "/usr/lib/clisp/asdf.lisp")
(setf asdf:*central-registry*
'(*default-pathname-defaults*
#p"/usr/lib/clisp/system/"))
(asdf:oos 'asdf:load-op :cffi :verbose nil)
(load "curses-wrapper.lisp")
(use-package :curses-wrapper)
(defun get-contents (file-name)
(with-open-file (stream file-name :direction :input)
(loop for line = (read-line stream nil 'eof)
until (equal line 'eof)
collect line)))
(defun setup-pad (contents)
(let ((pad-y 0)
(pad-x 0))
(loop for line in contents
for i from 0
do (mvwprintw *stdpad* i 0 line))
(defun pad-down ()
(if (and (eql (getcury *stdscr*) (1- *LINES*))
(< (+ pad-y *LINES*) (getmaxy *stdpad*)))
(prefresh *stdpad* (incf pad-y) pad-x 0 0 (1- *LINES*) (1- *COLS*))
(wmove *stdscr* (1+ (getcury *stdscr*)) (getcurx *stdscr*))))
(defun pad-up ()
(if (and (eql (getcury *stdscr*) 0)
(> pad-y 0))
(prefresh *stdpad* (decf pad-y) pad-x 0 0 (1- *LINES*) (1- *COLS*))
(wmove *stdscr* (1- (getcury *stdscr*)) (getcurx *stdscr*))))
(defun pad-left ()
(if (and (eql (getcurx *stdscr*) 0)
(> pad-x 0))
(prefresh *stdpad* pad-y (decf pad-x) 0 0 (1- *LINES*) (1- *COLS*))
(wmove *stdscr* (getcury *stdscr*) (1- (getcurx *stdscr*)))))
(defun pad-right ()
(if (and (eql (getcurx *stdscr*) (1- *COLS*))
(< (+ pad-x *COLS*) (getmaxx *stdpad*)))
(prefresh *stdpad* pad-y (incf pad-x) 0 0 (1- *LINES*) (1- *COLS*))
(wmove *stdscr* (getcury *stdscr*) (1+ (getcurx *stdscr*)))))))
(defun main (args)
(if (not args)
(format *error-output* "Usage: clisp less.lisp filename~%")
(progn
(let ((contents (get-contents (car args))))
(with-curses
(cbreak)
(noecho)
(scrollok *stdscr* FALSE)
(with-pad *stdpad* (newpad (length contents)
(loop for line in contents
maximize (length line)))
(setup-pad contents)
(refresh)
(prefresh *stdpad* 0 0 0 0 (1- *LINES*) (1- *COLS*))
(input-loop key
(((char-code #\q) (char-code #\Q)) (return))
((char-code #\h) (pad-left))
((char-code #\j) (pad-down))
((char-code #\k) (pad-up))
((char-code #\l) (pad-right)))))))))
(main *args*)

いろいろ試すいい機会なので、マクロとかクロージャも積極的に使う方向でやってみています。

でも大域変数使いすぎで汚ないです;;ncursesプログラミングはこんなもんなのかな?

実行方法

$ clisp less.lisp <text file name>

感想

パッドは便利。

Posted in lisp | Leave a comment |

テキストブラウザ #4

Posted on 2007/08/25 by smeghead

id:smeghead:20070824:ncurses で最小限の状態でclispからncurses(Cライブラリ)呼出しを動かしてみたものの続きです。curses-wrapper.lispは、どんどん大きくなってきて、貼り付けられない状態になってます。

Ncurses 入門

http://linuxmag.sourceforge.jp/Japanese/March2002/article233.shtml

上のサイトにあるサンプルを、curses-wrapper.lispを使って、common lispに翻訳しました。翻訳なので、lispらしさは無いです。



(load "/usr/lib/clisp/asdf.lisp")
(setf asdf:*central-registry*
'(*default-pathname-defaults*
#p"/usr/lib/clisp/system/"))
(asdf:oos 'asdf:load-op :cffi :verbose nil)
(load "curses-wrapper.lisp")
(use-package :curses-wrapper)
(defconstant ENTER 10)
(defconstant ESCAPE 27)
(defun init_curses ()
(initscr)
(start_color)
(init_pair 1 COLOR_WHITE COLOR_BLUE)
(init_pair 2 COLOR_BLUE COLOR_WHITE)
(init_pair 3 COLOR_RED COLOR_WHITE)
(curs_set 0)
(noecho)
(keypad *stdscr* TRUE))
(defun draw_menubar (menubar)
(wbkgd menubar (COLOR_PAIR 2))
(waddstr menubar "Menu1")
(wattron menubar (COLOR_PAIR 3))
(waddstr menubar "(F1)")
(wattroff menubar (COLOR_PAIR 3))
(wmove menubar 0 20)
(waddstr menubar "Menu2")
(wattron menubar (COLOR_PAIR 3))
(waddstr menubar "(F2)")
(wattroff menubar (COLOR_PAIR 3)))
(defun draw_menu (start-col)
(let (items
(first-item (newwin 10 19 1 start-col)))
(wbkgd first-item (COLOR_PAIR 2))
;     (box first-item *ACS-VLINE* *ACS-HLINE*)
(setq items (loop for i from 1 to 8
collect (subwin first-item 1 17 (1+ i) (1+ start-col))))
(loop for item in items
for i from 1
do (wprintw item (format nil "Item~d" i)))
(wbkgd (first items) (COLOR_PAIR 1))
(wrefresh first-item)
(cons first-item items)))
(defun scroll-menu (items menu-start-col)
(let ((selected 0))
(loop for key = (getch)
do (case key
((258 259) ; KEY_DOWN KEY_UP
(wbkgd (nth (1+ selected) items) (COLOR_PAIR 2))
(wnoutrefresh (nth (1+ selected) items))
(if (equal key 258) ; KEY_DOWN
(setf selected (mod (1+ selected) (1- (length items))))
(setf selected (mod (+ selected (1- (length items)) -1) (1- (length items)))))
(wbkgd (nth (1+ selected) items) (COLOR_PAIR 1))
(wnoutrefresh (nth (1+ selected) items))
(doupdate))
((260 261) ; KEY_LEFT || key == KEY_RIGHT
(delete_menu items)
(touchwin *stdscr*)
(refresh)
(return (scroll-menu (draw_menu (- 20 menu-start-col)) (- 20 menu-start-col))))
((27) ; ESCAPE
(return))
((10) ; ENTER
(return selected))))))
(defun delete_menu (items)
(loop for item in items do
(delwin item)))
(defun main ()
(handler-case
(progn
(init_curses)
(bkgd (COLOR_PAIR 1))
(let ((menubar (subwin *stdscr* 1 80 0 0))
(messagebar (subwin *stdscr* 1 79 23 1)))
(draw_menubar menubar)
(move 2 1)
(printw "Press F1 or F2 to open the menus. ")
(printw "ESC quits.")
(refresh)
(loop for key = (getch)
until (equal key ESCAPE)
do
(let (selected_item menu_items)
(werase messagebar)
(wrefresh messagebar)
(cond
((equal key (KEY_F 1))
(setq menu_items (draw_menu 0))
(setq selected_item (scroll-menu menu_items 0))
(delete_menu menu_items)
(if (minusp selected_item)
(wprintw messagebar "You haven't selected any item.")
(wprintw messagebar (format nil "You have selected menu item ~d." (1+ selected_item))))
(touchwin *stdscr*)
(refresh))
((equal key (KEY_F 2))
(setq menu_items (draw_menu 20))
(setq selected_item (scroll-menu menu_items 20))
(delete_menu menu_items)
(if (minusp selected_item)
(wprintw messagebar "You haven't selected any item.")
(wprintw messagebar (format nil "You have selected menu item ~d." (1+ selected_item))))
(touchwin *stdscr*)
(refresh)))))
(delwin menubar)
(delwin messagebar))
(endwin))
(error (c)
(endwin)
(print "error!")
(print c))))
(main)

コメントアウトしてある部分ですが、box関数呼出しの第三、第四引数を扱おうとするとエラーが発生してしまう状態が回避できませんでした。box関数のプロトタイプ宣言は下のようになっていました。(curses.h)

extern NCURSES_EXPORT(int) box (WINDOW *, chtype, chtype);        /* generated */

chtypeってなんだろう。

#if 1 && defined(_LP64)
typedef unsigned chtype;
typedef unsigned mmask_t;
#else
typedef unsigned long chtype;
typedef unsigned long mmask_t;
#endif

curses-wrapper.lisp の中のbox関数と ACS_VLINE と ACS_HLINE に対応る型宣言を :unsigned-long にしてみたり、 :pointer にしてみたりしましたが、改善せず。こうゆうときに、Cの経験の少ないゆとりプログラマは弱いorz.


ふと疑問に思ったのは、共有ライブラリの実体には、#defineのマクロ定義は残っているんだろうか?プリプロセッサで評価されて消えてしまうんじゃないのか?でも、マクロ定義している関数は呼べてるな。externしてるのは呼べるようになってるのかな。

#define refresh()      wrefresh(stdscr)

あと、ちょっと嵌ったのは、caseマクロ の keys に指定する値が評価されないということ。

case は最初にキーとなる S 式を受け取り、そのあと cond と同様に複数の節が続きます。 cond には節の先頭に条件部がありましたが、 case の場合はキーリストというものがあります。まず、キーとなる S 式を評価します。次に、この評価結果とキーリストに格納された要素を比較します。このとき、キーリスト本体や要素は評価されないことに注意してください。

http://www.geocities.jp/m_hiroi/xyzzy_lisp/abclisp17.html

そのせいで、マジックナンバーが入ってます。


まぁ、制限付きですが、普通にncursesを呼出すことはできているので、lispらしく書き直していきたいです。

Posted in lisp | Leave a comment |

テキストブラウザ #5

Posted on 2007/08/25 by smeghead

2個マクロ書いた。initscr と endwin とエラー処理(何もしてないけど)を纏めるwith-cursesと、キーボード入力待ちループ用のinput-loopです。しかし、それほど呼び出し側のコードがすっきりするわけでも無かった。

(defmacro with-curses (&body body)
`(handler-case
(progn
(initscr)
,@body
(endwin))
(error (c)
(endwin)
(apply #'format t
(simple-condition-format-control c)
(simple-condition-format-arguments c)))))
(defmacro input-loop (key &body test-proc-lst)
`(loop for ,key = (getch)
do (cond
,@(loop for test-proc in test-proc-lst
collect (if (and (listp (car test-proc)) (not (fboundp (car (car test-proc)))))
`((member ,key (list ,@(car test-proc)) :test #'equal) (progn ,@(cdr test-proc)))
`((equal ,key ,(car test-proc)) (progn ,@(cdr test-proc))))))))

gensymの使いどころがわかってないけど、input-loop の引数 key は、gensymが必要なんだろうか?

Posted in lisp | Leave a comment |

同意

Posted on 2007/08/25 by smeghead

id:nowokay:20070825

きしださんが、スカっと全部言ってくれました。

そろそろ、業務でもrailsを使うプロジェクトの話が、近くでも聞こえてきているので、近い将来railsをやるかもしれません。でも、銀の弾丸とは思えず(勿論そうではないんでしょうけど)、準備 *1 (個人で勉強とか)に乗り気になれない状況です。

上司からは「Lispで遊んでる暇があったら、rails覚えろ」と言われそうですな;;rubyを上手に使うためには、rubyが影響を受けているLispを覚えてからの方いいと思います(言い訳です)。

*1:scaffoldの次の段階の情報が少ないのか、何をしていいかわからない。railsのソースを読むとか?

Posted in free | 1 Comment |
Next Page »

Pages

  • Profile

Archives

  • March 2018
  • May 2015
  • February 2015
  • January 2015
  • December 2014
  • November 2014
  • October 2014
  • September 2014
  • April 2014
  • November 2013
  • October 2013
  • July 2013
  • April 2013
  • March 2013
  • February 2013
  • January 2013
  • December 2012
  • November 2012
  • October 2012
  • September 2012
  • August 2012
  • July 2012
  • June 2012
  • May 2012
  • April 2012
  • March 2012
  • February 2012
  • January 2012
  • December 2011
  • November 2011
  • October 2011
  • September 2011
  • August 2011
  • July 2011
  • June 2011
  • May 2011
  • April 2011
  • March 2011
  • February 2011
  • January 2011
  • December 2010
  • November 2010
  • October 2010
  • September 2010
  • August 2010
  • July 2010
  • June 2010
  • May 2010
  • April 2010
  • March 2010
  • February 2010
  • January 2010
  • December 2009
  • November 2009
  • October 2009
  • August 2009
  • July 2009
  • June 2009
  • May 2009
  • April 2009
  • March 2009
  • January 2009
  • December 2008
  • November 2008
  • October 2008
  • September 2008
  • August 2008
  • July 2008
  • June 2008
  • May 2008
  • April 2008
  • March 2008
  • February 2008
  • January 2008
  • December 2007
  • November 2007
  • October 2007
  • September 2007
  • August 2007
  • July 2007
  • June 2007
  • May 2007
  • April 2007
  • March 2007
  • February 2007
  • January 2007
  • December 2006
  • July 2006

Categories

  • android (35)
  • apache (1)
  • bison (1)
  • BTS (18)
  • c# (23)
  • cgi (1)
  • chrome (9)
  • chromeextention (18)
  • clclcl (9)
  • clojure (13)
  • cloudbug1 (2)
  • css (4)
  • cygwin (7)
  • C言語 (21)
  • dart (1)
  • dotnet (11)
    • vb.net (2)
  • e-hash.jp (1)
  • eclipse (2)
  • emacs (10)
  • excel (1)
  • flex (1)
  • framework (11)
  • free (92)
  • gae (4)
  • gcc (4)
  • gimmehash.in (1)
  • glipper (3)
  • golang (7)
  • howm (1)
  • html (3)
  • ikushipe (1)
  • java (47)
  • JavaScript (28)
  • linux (16)
  • lisp (92)
  • lua (34)
  • luatinycgi (2)
  • mba (1)
  • Meadow (4)
  • memo (1)
  • music (5)
  • mysql (1)
  • neta (5)
  • O/Rマッピングツール (4)
  • obj-c (6)
  • OOP (6)
  • oracle (1)
  • perl (48)
  • php (38)
    • CakePHP2 (2)
  • PostgreSQL (8)
  • PowerShell (1)
  • putty (1)
  • python (14)
  • redmine (2)
  • ruby (7)
  • s3 (1)
  • sakura (5)
  • screen (1)
  • Selenium (1)
  • SF (1)
  • SKK (4)
  • slime (6)
  • sql (8)
  • sqlite3 (4)
  • starbug1 (179)
  • tthttpd (3)
  • twitter (7)
  • ubuntu (14)
  • Uncategorized (4)
  • unix (14)
  • unkode-mania (5)
  • vba (3)
  • vim (24)
  • w3m (1)
  • Windows (16)
  • wordpress (1)
  • zsh (6)
  • 愚痴 (1)

WordPress

  • Log in
  • WordPress

Subscribe

  • Entries (RSS)
  • Comments (RSS)

Pages

  • Profile

Archives

  • March 2018
  • May 2015
  • February 2015
  • January 2015
  • December 2014
  • November 2014
  • October 2014
  • September 2014
  • April 2014
  • November 2013
  • October 2013
  • July 2013
  • April 2013
  • March 2013
  • February 2013
  • January 2013
  • December 2012
  • November 2012
  • October 2012
  • September 2012
  • August 2012
  • July 2012
  • June 2012
  • May 2012
  • April 2012
  • March 2012
  • February 2012
  • January 2012
  • December 2011
  • November 2011
  • October 2011
  • September 2011
  • August 2011
  • July 2011
  • June 2011
  • May 2011
  • April 2011
  • March 2011
  • February 2011
  • January 2011
  • December 2010
  • November 2010
  • October 2010
  • September 2010
  • August 2010
  • July 2010
  • June 2010
  • May 2010
  • April 2010
  • March 2010
  • February 2010
  • January 2010
  • December 2009
  • November 2009
  • October 2009
  • August 2009
  • July 2009
  • June 2009
  • May 2009
  • April 2009
  • March 2009
  • January 2009
  • December 2008
  • November 2008
  • October 2008
  • September 2008
  • August 2008
  • July 2008
  • June 2008
  • May 2008
  • April 2008
  • March 2008
  • February 2008
  • January 2008
  • December 2007
  • November 2007
  • October 2007
  • September 2007
  • August 2007
  • July 2007
  • June 2007
  • May 2007
  • April 2007
  • March 2007
  • February 2007
  • January 2007
  • December 2006
  • July 2006

Categories

  • android (35)
  • apache (1)
  • bison (1)
  • BTS (18)
  • c# (23)
  • cgi (1)
  • chrome (9)
  • chromeextention (18)
  • clclcl (9)
  • clojure (13)
  • cloudbug1 (2)
  • css (4)
  • cygwin (7)
  • C言語 (21)
  • dart (1)
  • dotnet (11)
    • vb.net (2)
  • e-hash.jp (1)
  • eclipse (2)
  • emacs (10)
  • excel (1)
  • flex (1)
  • framework (11)
  • free (92)
  • gae (4)
  • gcc (4)
  • gimmehash.in (1)
  • glipper (3)
  • golang (7)
  • howm (1)
  • html (3)
  • ikushipe (1)
  • java (47)
  • JavaScript (28)
  • linux (16)
  • lisp (92)
  • lua (34)
  • luatinycgi (2)
  • mba (1)
  • Meadow (4)
  • memo (1)
  • music (5)
  • mysql (1)
  • neta (5)
  • O/Rマッピングツール (4)
  • obj-c (6)
  • OOP (6)
  • oracle (1)
  • perl (48)
  • php (38)
    • CakePHP2 (2)
  • PostgreSQL (8)
  • PowerShell (1)
  • putty (1)
  • python (14)
  • redmine (2)
  • ruby (7)
  • s3 (1)
  • sakura (5)
  • screen (1)
  • Selenium (1)
  • SF (1)
  • SKK (4)
  • slime (6)
  • sql (8)
  • sqlite3 (4)
  • starbug1 (179)
  • tthttpd (3)
  • twitter (7)
  • ubuntu (14)
  • Uncategorized (4)
  • unix (14)
  • unkode-mania (5)
  • vba (3)
  • vim (24)
  • w3m (1)
  • Windows (16)
  • wordpress (1)
  • zsh (6)
  • 愚痴 (1)

WordPress

  • Log in
  • WordPress

CyberChimps WordPress Themes

© 週記くらい@やーづ

With Google+ plugin by Geoff Janes