ラベル みくった〜♪ の投稿を表示しています。 すべての投稿を表示
ラベル みくった〜♪ の投稿を表示しています。 すべての投稿を表示

2010年4月2日金曜日

はつねなLispのようなものを考え中

今、片手間にLispのようなプログラミング言語を作っている。プログラミング言語というよりは、処理をデータで表現したかっただけなのだが。

何故作ったし
みくった〜♪を柔軟に拡張できるようにするため

文法
S式とM式を合わせたような文法を採用。略してSMs(ry
だけど見た目はあんまりLispっぽくない。これは、できればプログラマでなくても多少使えるように、などいろいろ考えがある。以下に、みくった〜♪のフレンドタイムラインプラグインのコードを示す。

tl = gen-timeline[200]
regist-window[tl]
onupdate << { (watch msg)
add[tl msg]
}

Lispなんて言わなければ良かった(笑)S式だけで書くと以下のようになるだろう。

(setq tl (gen_timeline 200))
(regist-window tl)
(add onupdate (lambda (watch msg) (add tl msg)))

まず、特記事項はM式だ。これは、S[...]と表記し、(S ...)というリストに展開される。一般的な言語の関数呼び出しf(x)に近い書き方ができるし、S式に慣れていなくても比較的コードが見やすくなる。
次に、演算子。通常Lispでは計算式を次のように書く。

(+ 1 2 3)

いわゆる前置記法でとっつきにくい。演算子がリストの最初以外に現れた場合、その前後の値を括弧で括り、第一要素と演算子を入れ替える。文章では説明しづらいが、要するにパース時に要素の入れ替えが発生するというものだ。
例えば、

1 + 2 + 3
A B + C D
1 + 2 * 3 - 4

は、

(+(+ 1 2) 3)
(A (+ B C) D)
(+ 1 (- (*2 3) 4))

となる。
最後に中括弧だが、これはlambdaの省略記法。

(lambda (a b) (+ (* a a) (sqrt b)))

は、

{(a b) a * a + sqrt[b] }

と書ける。また、シンボル_は、その関数が呼ばれた時の引数リスト、_nのように数字をつければ、n個目の引数に束縛されている。普通の用途ならこれは不要かと思ったが、フィルタを書くために多用することになるので、あえて用意した。

フィルタ関数

では、本題のフィルタにうつる。たとえば、幾つかの優秀なツイッタークライアントでは、「ユーザaか、aへのリプライか、googleが含まれている」つぶやきだけを抽出したタブを作成できるが、これはこう書ける。

{ ()
or{
(assoc[_0 'user] == "a")
include?[assoc[_o 'message] "@a"]
include?[assoc[_o 'message] "google"]
}
}

(※注:orは引数をtが帰ってくるまで順次実行するマクロだが、はつねLispでは表記上の理由からlambdaも渡せる)
ちょっと複雑だ。Rubyだとこうなるだろう。

lambda{ |m|
m[:user] == 'a' or
m[:message].include?("@a") or
m[:message].include?("google")
}

あれ、かわんない。無理もない。はつねLispの関数は、以下の値のいずれかになる。
  1. =演算子でオーバライドされた関数
  2. はつねLispで定義されたプリミティブ関数
  3. 第一引数のクラスのメソッド
  4. 同名のRuby関数
例えばchomp[string]は、Rubyでstring.chompと書くのと同じ意味だ。しかしながら定数にはアクセス出来ないので、例えばnew[Time]のようなことはできない。これはあえて入れた制約で、これによって例えばはつねLispをJavaScriptなどで再実装する場合に、String, Numeric, Listくらいを再実装するだけではつねLispがすべて動かせるようになる。
また、はつねLispはほぼRubyに直訳出来る。プリミティブ関数も短いRubyコードだし、何よりほかのメソッド呼び出しは全てRubyのそれだからだ。つまり、高速化のためにRubyのコードに翻訳することが出来るのだ。

いわば、マクロを使えるようにしたRuby、という感じなのかもしれない。当然、Rubyとちがって全てS式にできるというのが最大のメリットだが。

2010年2月20日土曜日

みくった〜♪3 次までにやること

以前から開発を続けているみくった〜♪だが、テストしてくれている人が増えてきたので、既知のバグがなんなのか、最初のバージョンまでにどんな機能を実現したいのかを明確にしておきたい。

最初のバージョンの目標

目標としてどんな機能を付けるかを列挙しても良いのだが、ここでは「twitte.rbと同じ機能を実装する」とする。
理由は、具体的なクライアント名を上げた方が明確になることと、twitte.rbは基本的な機能をもっているクライアントの中では、機能が少ない方であること。このクライアントには、必要と思われる機能も一部含まれていないが、今回はあえてtwitte.rbに存在しない機能はこれ以上実装しない(削除機能、ふぁぼったつぶやき一覧など)。
なお、twitte.rbにある「アイコンアルバム」は今回実装しない。というのも、なくてもさしあたって困らないからだ(そのうち実装するつもり)。

人柱版までにやること

MMI作成時にフォーカスを移す
ボタンクリックで無数につぶやき入力欄を増やせるMMI(Multi Mumble Input)だが、これを作成した時に入力欄にフォーカスがいかないと、入力欄一つのインターフェイスよりクリック数が増えてしまう。
メモリバカ食いをやめさせる
つぶやきが溜まると、それを破棄しない仕様になっているため、タイムラインの流れが早い場合にメモリを数百MB消費してしまう場合がある。ページングすると操作性が落ちてしまうが、表示されていない部分についてはメモリを開放したりして、メモリ消費を抑える工夫をしなければならない。
ふぁぼる/アンふぁぼ
他人のつぶやきをお気に入れる/外す機能。
URL開く
URLをつぶやく人は多い。今はコピーできるようになっているが、クリックだけで開けるようにするべき。
ショートカットキーによる投稿(Ctrl+Enterとか)
現状、ボタン押下による投稿のみしか対応していない。
設定変更プラグイン
要するに、設定変更画面。内容は詳しく詰めていないが、以下のような物が最低限必要だと思う
  • 通知機能(サウンドを鳴らす、inotify、コマンド実行等)
  • 更新間隔(現在は一分固定、リプライは20分)
  • アカウント情報の変更
初回のアカウント入力/アカウント変更
現在、initialize.rbを実行することで初回の設定をするが、mikutter.rbを起動した時点でこれをするべき。
ポストする時にハッシュタグが2つつく
#mikutterなどとハッシュタグをつけると、#mikutter #mikutterと投稿される。
リプライ送るときに、宛先がデフォルトで入ってない
送信時に補完していたが、残り字数がわからなくなる。
<>問題
<>などがエンティティエンコードされた状態で表示される。
140文字に切り詰める
クライアントがこれをしないと、Twitterは140字以上の投稿をはじいてしまう。

是非ともやっておきたいこと

IMEのデフォルトONオプション
毎回つぶやき入力欄が消えるため、設定によっては毎回半角入力モードになってしまっている。
ダイレクトメッセージの実装
ただし、これはユーザのプロフィール画面と密接に関わる。そのため、今回はごく簡単なものになると思われる。

余裕があればやること
これは絶対に将来的にやりたい事だが、今回やろうとして却下したもの。理由は上記の通り、twitte.rbに実装されていないからだ。
  • 短縮URL
  • 画像表示
  • 自分のつぶやきを削除
  • スキン機能、というか見た目変更機能(フォントや文字色、背景など)
  • スクロールロック
もしかしたら、見落としているだけで実装されているかもしれないが、今回はこれらを見送る。なお、付けたい機能はこの他もいくらでもある。

まとめ

今回は、直近のやることをまとめた、いわばメモのようなものをかいたが、リリース前なので実装したい機能というよりは、バグ修正と最適化が主になっている。
次回くらいには、ここや私のWebページで「みくった〜♪」を配布したいと思っている。

2010年2月16日火曜日

みくった〜♪2 ちょっと作ってみた

みくった〜関連の記事しか書き込んでいないけど、それしかやっていないので。
ある程度インターフェイスがしっかりしてきたので、まだ殆どみっくみくにされていないけどスクリーンショットを公開する。なお、Ubuntu 9.10で撮影した。



これがフレンドタイムライン。いわゆるTL。モザイクの行は「toshi_a 伊吹萃香」のように表示されている。ツールバーの「つぶやく」ボタンや、各つぶやきにある「@」「RT」ボタンを押したらつぶやきを入力するスペースが現れる。普段表示しないことにより、つぶやきを少しでも多く表示出来るようになっているし、猫につぶやかれる心配も減るかもしれない。

目玉機能のマルチつぶやき機能。だけど名前を付けておかないとパクられたときに残念な気持ちになるので「Multi Mumble Input(MMI)」という名前を付けておく※1。つぶやきボタン等は、押せばいくらでも量産できるようになっているので、つぶやきを書いている途中で別のつぶやきにリプライを送りたくなったりしても、その内容をわざわざ覚えておいたり、書きかけのつぶやきを消す必要はない。それを覚えておくのはみくった〜♪の仕事なのだ。
※1 というか、パクられるまでになれたら嬉しいんだけど


リプライ画面。先ほどと基本的には変わらない。リプライ画面に限ったことではないが、カーソルを合わせたつぶやきが別のつぶやきへの返事だった場合、親つぶやきがツールチップで表示される。
表示方法はともかくとして、あるリプライが何に対してなのかが分からなくなることというのは、複数人と会話していたらよくある話だ。これが確認出来るクライアントが当然多く使われているはずだが、その数はそんなに多くないし、しかも大抵のクライアントでは相当確認が面倒だ。
・・・ということを考えると、現時点ではついったーでよく会話をする人に適したものになっていると考えられる。もちろん、通知機能、URLを開く機能など基本的な機能が揃っていないのでまだ使ってもらえる段階にも無いが、twitte.rbを超えるという最初の目標はすぐそこだ。

まとめ
今回は、現在の開発の進捗を報告した。今後の課題は、見た目がみっくみくにされていない点である。