QSWassr
July 3rd, 2008 | Published in hack
さいきんのTwitterの狼藉には目が余るわッッ! wassr やろうぜ!! みたいな意見をよく目にするようになったので、QSTwitterのwassr版、QSWassrをつくってみました。15分間ハッキング。
やったこと
ほとんど s//api.wassr.jp/g
なだけです。APIのエンドポイントを差し替えただけですね。QSTwitterは送信専用クライアントなので、おきらくでした。 とってもダーティなハック (following処理とかtwitterのがそのまま残ってる) なのですが、とりあえずでも動くものがあるほうがよいと思って公開しています。 興味をもたれた物好きな方は、ためしてみてください。
つかいかた
インストール方法、トリガーの設定方法なんかは、QSTwitterのやり方がほとんどそのまま使えます (s/QSTwitter/QSWassr/
に注意)。
注意
QSTwitterといっしょに動かせません。 どういうわけか、Quicksilverのプラグインとして、RubyCocoaで書かれたものが複数存在できないようなのです (軽く調べた程度でですが)。
今後
やるとすれば。
- QSTwitterと融合
- Twitter, wassr の (両方に | 選択的に) ポストできるように
- そうすると、ほかのミニブログとも融合したいところ
- following対応
- 融合させた場合も、ちゃんとTwitter,wassrそれぞれのfollowingをうまく扱えるようにしたい
その他
ミニブログを移ると、これまで築いてきたfollow関係がもっていけないから… と躊躇しがちですが、そこはそれ、心機一転すっきりと人間関係をつくりなおすのも面白いとおもいます。ナンバーポータビリティなんか気にしない! 人間関係は定期的にリセットするんだ! 的な心情ですね。
まとめ
wassrはTwitter ライクなAPIをもってるので、Twitterクライアントをつくってるひとは対応してみては! (夏ラ希望)
Rubigraph 0.1.0
May 29th, 2008 | Published in hack
Rubigraph を 0.1.0 にバージョンアップしました。 gem install rubigraph
でアップグレードできます。
変更点
Ubigraph alpha-0.2.2 に対応
Rubigraph 0.0.1 だと、Ubigraph alpha-0.2.2 でうまく動きません。(XML-RPCの返り値が変わったため) バージョンアップ推奨です。
Ubigraphの中の人と、ブログコメントやメールでのやりとりを行い、Ubigraph alpha-0.2.2 から、Rubigraph が含まれることになりました。やった!
証拠魚拓:
公式ドキュメントの中に、ちゃんとクレジットはいってます。
しょぼくてもいいから、とにかくなんかつくって素早く公開する、ということが大事ですね。最初からすごくなくてもいい。公開したあと、徐々に良いものにしていけばいい。
Rubigraph
May 25th, 2008 | Published in hack
一行でサマリ
Rubigraph という、Ubigraph のRubyラッパを書きました。
Ubigraphとは
Ubigraph というグラフ生成ツールを最近見つけました。 Graphvizが静的なグラフ生成をしてくれるのに対して、Ubigraphは動的にノードやエッジを追加/削除/属性変更できるのがミソです。これがたのしい。 どれくらい楽しいかについては、デモを見ていただければと思います。
クライアントサーバ型であり、サーバのコードは非公開だけれどXML-RPCのAPIが用意されているので簡単にクライアントがつくれます。なので、クライアント側の言語は問わないと謳ってるわけですね。サーバのバイナリはMacとLinuxが用意されてます。
Rubigraphとは
ですが、いちいちAPIリファレンス見ながらXML-RPCを書いてられない。 なので、簡単なクラスをつくってラップしたものをRubigraphとして公開します。
インストール
Rubyforgeにプロジェクトをつくっておきました。 gem install rubigraph
としてインストールできます。
コード
どう書けるようになるのか
require 'rubigraph'
Rubigraph.init # XML-RPCクライアントの初期化などする
v1 = Vertex.new
v2 = Vertex.new
e12 = Edge.new(v1, v2)
v1.color = '#003366'
v2.shape = 'sphere'
e12.label = 'edge between 1 and 2'
かんたんですね!
まとめ
ダイナミックにグラフで可視化するのはたのしいものです。ぼくは関数コールトレーサにつかっていて、とても便利に感じています。 Ubigraph++。
Safariの文字列検索を追う
May 5th, 2008 | Published in hack
Safariで、ページ内検索がどのように行われているかを、ちょっと追ってみました。以下かんたんなメモ。
準備
Safari.appはリリースビルドなので、WebKit をつかいます。 Debugging WebKit の手順どおりやると、デバッグシンボルのついたWebKitでSafariがつかえるようになります。
set breakpoint
search というキーワードで、WebKit の中を検索してみたところ、いくつかひっかかります。 WebView:searchFor というのが怪しいんじゃないか、と勘であたりをつけ、ブレークポイントを張り、デバッグ実行 (Cmd-Y)。
実際に、Cmd-F してページ内検索を実行し、ブレークポイントにひっかかったところ:
まんまとひっかかりましたね。
最終的には、WebCore::CircularSearchBuffer::isMatch という関数内で文字列の比較がmemcmpで行われています。
まとめ
ソースを静的に解析してブレークポイントにあたりをつけ、実行時の挙動を見てハックするポイントをさがす、という例でした。 次は、じっさいにこのあたりに手を入れてみます。
Tags: safari
夏ライオンのおれおれビルド
May 4th, 2008 | Published in hack
Twitterクライアントの夏ライオンを、きわめて自分好みに改造しました。作者の 曰く、 だそうなので、ここで公開しておくことにしました。
ダウンロード
-
NatsuLion-tweaked-GW.zip
-
ソース
夏ライオンに従って、修正BSDライセンスです。
なにがちがうか
その1: 詰め込み表示
以下の画像の左がオリジナル、右がここで公開してるもの。
いっぺんに表示できるメッセージを増やして、より世界の風を感じることができるようになっています。
その2: メッセージフィルタリング
夏ライオンにメッセージフィルタリングをつけるハック で書いたパッチを適用しています。
ほんと、ソースが公開されてるってすばらしいですね! akr++。
IDAvailability updated
April 24th, 2008 | Published in hack
おととい公開した IDAvailability にいくつか改善を施しました。
1. IDをURLのどこにでも書けるようにした
チェックするURLの末尾にしかIDを書けなかった (‘http://website/user/ここ‘) ので、登録できないサイトがいくつかありました。 そこで、#{ID} という値があれば入力されたIDで置換するようにしました (‘http://#{ID}.website/ → ‘http://置換された.website/’)。 mattnさんのコメントによる指摘 を反映させたものです。
2. HTTP 404 以外を返すサイトへの対応
ユーザがいない場合に、HTTP 404 を返すのではなく、3xx などを返してくるサイトがあります。 これまでサイトのHTMLをとってくるのには、サーバサイドのRubyスクリプトでopen-uri をつかっていました。 open-uri はとても手軽でよいのですが、3xx を受け取ると自動的にリダイレクトし、その結果が返ってきます。 これだと、正常にリクエストが行われたように見えてしまい、ユーザがいるかいないかの判定に使えませんでした。
よりローレベルなNet::HTTPをつかうことで、HTTP レスポンスのstatus codeをチェックするようにして問題を回避しました。
3. 横並びに
縦にずらずらっとサイトを並べていたのを横に並べることで、俯瞰性を高めました。
2008.04.24 8AM 現在で、サイト数が28 になりました。 wedataというオープンなデータストアだからこそですね。
ToDo
Tags: id, idAvailability, webapp
Aipo4 on Debian etch
March 11th, 2008 | Published in hack
Aipo4というオープンソースのグループウェアがなかなかいかしてます。 Linux版のインストーラは、RedHat系のものしか用意されていないんですが、Debian etchなマシンにインストールできたのでやりかたを書いておきます。
1. パッチあて
aipo4-debian-patch を展開して出てきた installer-debian.patch を、aipo/bin/fc にて
# patch -p0 < installer.sh-debian.patch
のようにしてあてます。下に貼りつけときますが、やってることは単に必要なrpmがインストールされてるかどうかのチェックをコメントアウトしてるだけ、というもの。
2. 必要なライブラリのインストール
libreadline-dev, zlib1g-dev が必要ぽいので、apt-get install しておきます。
3. install
# cd aipo/bin/fc && sh installer.sh
でOK。
と書いてきましたが、まとめるほどのことではないですね。コメントアウトしておわり。簡単ですね。
パッチ
--- installer.sh.orig 2008-03-10 14:45:28.000000000 +0900
+++ installer.sh 2008-03-10 14:46:36.000000000 +0900
@@ -183,31 +183,31 @@
rpm -qa --qf "%{GROUP},%{NAME}\n" > $path/bin/rpmlist
-tmp_str=cat $path/bin/rpmlist | grep readline-devel
-if [ "$tmp_str" != "" ]; then
- echo "checking readline... ok"
-else
- echo "checking readline... error"
- check_str="ERROR"
-fi
-tmp_str=cat $path/bin/rpmlist | grep zlib-devel
-if [ "$tmp_str" != "" ]; then
- echo "checking zlib... ok"
-else
- echo "checking zlib... error"
- check_str="ERROR"
-fi
-
-if [ "$check_str" != "AIPO_INSTALL_OK" ]; then
- if [ "$1" != "check_pass" ]; then
- echo "Aipo$aipo_versionのインストールに失敗しました"
- userdel -r ${postgres_user}
- exit 0
- fi
-fi
+#tmp_str=cat $path/bin/rpmlist | grep readline-devel
+#
+#if [ "$tmp_str" != "" ]; then
+# echo "checking readline... ok"
+#else
+# echo "checking readline... error"
+# check_str="ERROR"
+#fi
+
+#tmp_str=cat $path/bin/rpmlist | grep zlib-devel
+#if [ "$tmp_str" != "" ]; then
+## echo "checking zlib... ok"
+#else
+# echo "checking zlib... error"
+# check_str="ERROR"
+#fi
+
+
+#if [ "$check_str" != "AIPO_INSTALL_OK" ]; then
+# if [ "$1" != "check_pass" ]; then
+# echo "Aipo$aipo_versionのインストールに失敗しました"
+# userdel -r ${postgres_user}
+# exit 0
+# fi
+#fi
Ticket2RTM
January 18th, 2008 | Published in hack
A Trac plugin that synchronizes Trac tickets and Remember the Milk tasks.
- when a ticket is created, a RTM task also will be added.
- when you close a ticket, the associated RTM task will be completed.
Screenshot
Screencast
Download
The source code is on github: http://github.com/mootoh/ticket2rtm/
Benefits
- unified Task List
- check tickets from mobile
Install
build
- edit Makefile and set PLUGINS_DIR to your Trac plugin dir
- make
or:
- python setup.py –bdist_egg
- copy dist/TracTicket2RTMPlugin*.egg into your Trac plugin dir
RTM API key, token
This plugin requires RTM API key, shared secret, and write-permitted token. You can obtain your API key and shared secret from here.
After acquired key and shared secret, you can get your token by using bundled script. Run as follow:
% python get_token.py
Configuration
- copy/paste contents of trac_ini_sample.txt to your trac.ini
- set rtm_api_key, rtm_api_secret, rtm_api_token to ones acquired above
- enjoy !
Ticket2RTM 0.1
January 18th, 2008 | Published in hack
TracのチケットからRemember the Milkのタスクを自動生成するTracプラグインをつくりました。 詳しくは trac:Ticket2RTMに。
スクリーンショット
チケットがつくられたら、自動的にRTMのタスクがつくられます。
スクリーンキャスト
ダウンロード
ticket2rtm-0.1.zip
動機
やることリストを1つにしたいと思ったのでした。
- RTMで日々のやることを管理しつつ、何かつくるときはTracでチケットを切ってる → タスクがあちこちに分散
- 複数のプロジェクトを同時にTracですすめる → チケットがあちこちにありすぎ
あちこちにタスクが散らばっていては、やらなきゃいけないことを見落としてしまったり、やらないことを決めるためのコストが増えてしまったりで、ストレスフリーな状態になかなかなれません。
ぜんぶまとめて1つのインターフェイスで見られたら幸せだろうな、RTMのインターフェイスはいいよな、と考えてプロトタイプをつくってみたのでした。
あと、RTMはモバイル版もあるので、チケットをケータイからも確認できるという副作用的メリットもあります。
学んだこと
Python
Pythonのコードをまともに書くのは始めてでした。selfうっとうしいとか、正規表現めんどいとか、インタラクティブ環境でのreloadを最初しらなくてえらい非効率だったりとか、switchないの? とか驚きの連続でしたが、なんとかなるもんですね。 プラグインをつくるためにTracのコードを読んでたのですが、インデント強制な言語はコードリーディングにいいですね。 ものの見方を増やせたのはよかったかなと。
RTM連携させるために、RTM APIのPythonラッパの一部を書くことになりました。 これには1年ほど前にrtmilk.rbというRuby版をつくっていた経験が活きました。多少言語のsyntaxが変わろうが、やりたいことがはっきりしてれば考え方は同じ。
Trac Plugin
TracでPluginを書くのは思っていたよりも簡単でした。 これをとっかかりにして、いろいろなアイデアを形にしていこうかなと。
今年のアウトプット第一弾はTrac+RTMハックでした。 1/14から始めて、夜なべでつくり、1/18に0.1リリース。思いつき駆動だなー。 しかしこれで明日のShibuya.trac ミーティング1.0、明後日のRemember The Milk 交流会 in 東京で話せるネタができたということで。
December 22nd, 2007 | Published in hack
QSTwitter (Quicksilver Twitter Plugin) 1.1を公開します。
QSTwitter.zip をダウンロードしてダブルクリック!
変更点は、Twitterエントリの”from=…”のところに、”QSTwitter”が入る、というものです。ユーザーエージェントみたいなものですね。
おまけ : どうやって自作Twitterアプリでfrom=”…”に自分のアプリ名を入れるか
- Twitterの中の人にメールを送る
- 自分アプリで投稿するときに “source=YourAppName“というパラメータを追加
- Twitter側の対応を待つ
でした。 僕の場合は、10日ほどで対応してもらえました。Twitterの中の人に感謝!
参考 :