mojavy.com

Rainbow for Common Lisp 作りました

February 19, 2013 at 11:55 PM | categories: ruby, common lisp |

lisp

昨日のテンプレを流用して今日はcl-rainbowという地味なライブラリの宣伝をします。

https://github.com/taksatou/cl-rainbow

cl-rainbowとは、rubygemにあるrainbowをCommon Lispに移植したものです。 これを使うとターミナルの出力を簡単に色付けできます。

インストール

現在(2013-02-19) quicklisp登録申請中です。登録されれば以下でインストールできます。

(ql:quickload 'cl-rainbow)

使い方

以下のように使います。

(setf cl-rainbow:*enabled* t)
(print (cl-rainbow:color :red "red string"))
(print (cl-rainbow:color #x5599ff "rgb color code"))
(loop for c across "RAINBOW" do (format t "~A" (cl-rainbow:color (random #xffffff) c)))

特に解説は不要だと思いますが、端末はカラー表示に対応している必要があります。

RGBのカラーコード指定すると、256色にダウンサンプルして一番近い色を表示します。

その他、例にはのせてませんが、端末が対応していれば斜体や太字にもできます。詳細はソースを見てください。

まとめ

ログ出力のときとかにちょっと便利なときがあるかもしれません。

リードマクロで文字列リテラルをごにょごにょして色付けできるようにするともうちょっと便利になるような気がするので、そのうちチャレンジしてみたいと思います。

フィードバック等ありましたらコメント頂けるとうれしいです。



LTSV for Common Lisp 作りました

February 18, 2013 at 08:30 PM | categories: ltsv, common lisp |

lisp

ブームは過ぎ去ってしまいましたが、意外とまだなかったのでCommon LispのLTSVパーサつくりました。

https://github.com/taksatou/cl-ltsv

http://ltsv.org/

インストール

現在(2013-02-18) quicklisp登録申請中です。登録されれば以下でインストールできます。

(ql:quickload 'cl-ltsv)

使い方

以下のように使います。

CL-USER> (cl-ltsv:parse-line "host:127.0.0.1    ident:- user:frank")
(("host" . "127.0.0.1") ("ident" . "-") ("user" . "frank"))

CL-USER> (with-input-from-string (ss "host:127.0.0.1    ident:- user:frank
host:127.0.0.1  ident:- user:jane
host:127.0.0.1  ident:- user:john")
           (cl-ltsv:with-ltsv-from-stream (entry ss)
             (print entry)))

(("host" . "127.0.0.1") ("ident" . "-") ("user" . "frank")) 
(("host" . "127.0.0.1") ("ident" . "-") ("user" . "jane")) 
(("host" . "127.0.0.1") ("ident" . "-") ("user" . "john")) 
NIL

CL-USER> (cl-ltsv:alist-ltsv '(("host" . "127.0.0.1") ("ident" . "-") ("user" . "frank")))
"host:127.0.0.1 ident:- user:frank"
  • cl-ltsv:parse-lineするとalistを返します
  • cl-ltsv:with-ltsv-from-stream を使えば1行ずつパースしてループします
  • cl-ltsv:alist-ltsv でalistからltsv形式の文字列に変換できます

まとめ

ライブラリにするほどでもなかった気はしますが、Common Lispには文字列のsplitが標準でついてなくてちょっと面倒に感じることもあったのでないよりはましかな、ということで作りました。

フィードバック等ありましたらコメント頂けるとうれしいです。



common lispのdefconstantについての注意点

February 09, 2013 at 05:15 PM | categories: common lisp |

lisp

sbclでdefconstantすると以下のようなエラーがおきたりおきなかったりして不思議に思っていた。

The constant CL-GEARMAN::+REQUEST-MAGIC+ is being redefined
(from #(0 82 69 81) to #(0 82 69 81))
   [Condition of type DEFCONSTANT-UNEQL]
See also:
  Common Lisp Hyperspec, DEFCONSTANT [:macro]
  SBCL Manual, Idiosyncrasies [:node]

Restarts:
 0: [CONTINUE] Go ahead and change the value.
 1: [ABORT] Keep the old value.
 2: [TRY-RECOMPILING] Recompile protocol and try loading it again
 3: [RETRY] Retry loading FASL for #<CL-SOURCE-FILE "cl-gearman" "src" "protocol">.
 4: [ACCEPT] Continue, treating loading FASL for #<CL-SOURCE-FILE "cl-gearman" "src" "protocol"> as having been successful.
 5: [ABORT] Give up on "cl-gearman"
 --more--

Backtrace:
  0: (SB-C::%DEFCONSTANT ..)
  1: (SB-FASL::LOAD-FASL-GROUP ..)
  2: ((FLET SB-THREAD::WITH-RECURSIVE-LOCK-THUNK :IN SB-FASL::LOAD-AS-FASL))
  3: ((FLET #:WITHOUT-INTERRUPTS-BODY-88874 :IN SB-THREAD::CALL-WITH-RECURSIVE-LOCK))
  4: (SB-THREAD::CALL-WITH-RECURSIVE-LOCK ..)
  5: (SB-FASL::LOAD-AS-FASL ..)
  6: ((FLET SB-FASL::LOAD-STREAM :IN LOAD) ..)
  7: (LOAD ..)
  8: (SB-IMPL::%MAP-FOR-EFFECT-ARITY-1 ..)

先日公開したcl-gearmanでこれが発生していてしまい原因がわからずそのまま放置していたのだけど、以下のforumを発見した。

http://www.lispforum.com/viewtopic.php?f=33&t=4088

It's not a bug (in SBCL). The value in a DEFCONSTANT form is restricted to being something that's EQL to itself each time it's evaluated (that's horrible phrasing, I know), so using a vector is illegal (that is, you can use a vector, but you have to make sure you return the same vector each time -- so you can't use VECTOR or #(...) for the value).

DEFCONSTANTフォームの値はそれが何度評価されてもEQLになるようなものでなければならないらしい。 なので、vectorをDEFCONSTANTでバインドすることは可能だけど、DEFCONSTANTフォームの値の場所にVECTOR や #(...)で記述したフォームを書くことはできない。

CLtL2にもちゃんと書いてあった。

defconstantはdefparameterに似ているが、名前の値が固定されていることを前提としており、コンパイラは、コンパイルされるプログラムでの値について仮定を置くことが許されている。 (...中略...) コンパイラは置き換えたオブジェクトのコピーが定数の実際の値とeqlになるように注意しなければならない。たとえば、コンパイラは数のコピーは自由に作ってもよいが、値がリストであるときは十分に注意しなければならない。

なるほど。



Quicklinks 4

February 06, 2013 at 09:50 PM | categories: quicklinks |

前回 から2ヵ月くらいあいてしまいました。古いブックマークはブックマークしたこと自体を忘れてしまうのでもうちょいまめにまとめたいです。

Q-Gears

FF7のゲームエンジンのクローンを目指したものだそうです。 LinuxやWindowsで動くようにクロスプラットフォームな設計になっていて、将来的にはsquareの他のゲームも動かすためのフレームワークとしても提供することも考えているようです。

この資料にはシステムの概要が書かれてます。リバースエンジニアリングして集めた情報と思われますが、読み物としてもおもしろそうです。

Riemann

Clojureで書かれたnetwork event stream processing systemとのこと。

ここのイラストと説明を見れば大体イメージはわくと思います。 コンセプト的にはfluentdに近い気がしますが、集める対象がログではなくイベントそれ自体なので守備範囲はちょっと違うようです。 Riemann自体が落ちたときにどうなるか、とか実際に運用するとなると色々気になるところはありそうですが試してみる価値はありそうです。

設定をClojureで書けるというのもとがってていいと思います。

whistlepig

Cで書かれた軽量なリアルタイム全文検索のためのライブラリです。 複数プロセスでも同時にインデックスを読み書きできるようで、なかなか便利そうです。今度詳細を調べてみようと思います。

Montezuma

こっちはFerretをCommon Lispに移植したもの。ちなみにFerretはLuceneをRubyに移植したものです。 これはこれで便利だと思います。

OpenRTB

広告業界ではread-time biddingが最近のトレンドのようなので、関係者はこれを読んで理解を深めましょう。

iOS Security Internals

jailbreakやったりする人がつくった資料のようです。 これもなかなか興味深いです。

UNREAL4

Unity3でも十分すごいと思いましたが、最近のゲームエンジンはどれもすごいですね。

  • http://www.wmtdesigners.com/wordpress/game-2012-06-19

Leap Motion

xboxのkinect的なものですが、それよりはるかに上回る精度らしいです。プレオーダーしたので届いたら色々遊んでみます。



人気プログラミング言語ランキング(stackoverflow調べ)

February 05, 2013 at 11:00 PM | categories: programming |

stack

なんとなく気になったのでstackoverflowのでの人気プログラミング言語ランキングをつくってみました。(2013-02-05現在)

1.   c#              411382pt
2.   java            361120pt
3.   php             337941pt
4.   javascript      321791pt
5.   c++             175790pt
6.   python          160796pt
7.   html            145373pt
8.   objective-c     119891pt
9.   sql             115147pt
10.  css             113039pt
11.  c               83501pt
12.  ruby            64350pt
13.  xml             56444pt
14.  regex           51670pt
15.  vb.net          41260pt
16.  html5           27217pt
17.  linq            26200pt
18.  actionscript-3  24286pt
19.  perl            24092pt
20.  r               23256pt
21.  delphi          18866pt
22.  tsql            18119pt
23.  matlab          15289pt
24.  xaml            14115pt
25.  scala           13444pt
26.  vba             12300pt
27.  css3            11564pt
28.  xslt            11032pt
29.  haskell         9827pt
30.  assembly        7580pt
31.  razor           7385pt
32.  actionscript    6440pt
33.  excel-vba       6309pt
34.  groovy          5551pt
35.  vbscript        4926pt
36.  c++11           4894pt
37.  vb6             4886pt
38.  xhtml           4675pt
39.  plsql           4548pt
40.  svg             4540pt
41.  f#              4341pt
42.  python-3.x      4229pt
43.  awk             3481pt
44.  wsdl            3249pt
45.  lua             3183pt
46.  erlang          3077pt
47.  coffeescript    2754pt
48.  c#-3.0          2615pt
49.  latex           2570pt
50.  lisp            2395pt
51.  mathematica     2395pt
52.  prolog          2317pt
53.  scheme          2199pt
54.  uml             2093pt
55.  applescript     2092pt

-- 次点

go         1648pt
ocaml      1329pt
d          877pt

補足

  • stackoverflow APIを利用して調べました。stackoverflow公式のものではありません。
  • ランキングは質問につけられたタグの件数順です。
  • プログラミング言語のタグは、tag infoのエントリに/language/i がマッチするかどうかで抽出し、明らかにプログラミング言語じゃないものは手動で適当に除外しました。
  • マークアップ言語とかバージョン違いで複数ある言語とか微妙なのはそのまま残しました。
  • 次点以下の言語は、apiをしばらくクロールしてもでてこなかった言語のうち思いついたものを手動でしらべました。

所感

C#が1位なのはちょっと意外でしたがそれ以外は大体イメージ通りでした。 質問が多い順でもあるので、下位にある言語は質問が少なくて逆にイケてると言えなくもないですね。

D言語すばらしい。

ともあれ、stackoverflowのAPIは結構充実してるので色々遊べそうです。



About Me

pic
mojavy

Recent posts






Categories



Badges