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クライアントをつくってるひとは対応してみては! (夏ラ希望)

Tags: ,

QSTwitter 1.1 (Quicksilver Twitter Plugin)

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の中の人に感謝!

参考 :

Tags: , , , ,

Quicksilverプラグインのつくりかた

December 15th, 2007  |  Published in hack

Quicksilverでプラグインをつくる方法をチュートリアルにしてまとめました。

このチュートリアルを読むことで、以下のものがつくれるようになります。

  • 基本的なQuicksilverプラグイン
  • プラグイン用の設定画面
  • 設定画面からのデータ取得

目次

  • ここでの環境
  • 必要なもの
  • 準備
  • つくりはじめる
  • PreferencePaneをつくる
  • Actionのコードを書く
  • おわりに
  • 参照

ここでの環境

  • Mac OS X Leopard 10.5.1
  • Quicksilver B53 (3814)
  • Xcode 3.0

必要なもの

  • Quicksilver Develop版
  • Xcodeのテンプレート。ほんとは本家からダウンロードできるはずなんだけど、12/15現在ダウンロードできないので、から相当するものをします。

準備

ビルドできるようになるまでの準備をします。

1. ダウンロードしたXcodeのテンプレートをインストール

Xcode 3.0 からは、カスタムテンプレートを置く場所が /Developer/Library/Xcode/Project Templates/ になっています。 (VIRTUOSO VIRTUOSOのところでは、 /Library/Application Support/Apple/Developer Tools/Project Templates/ に置くよう書かれている)

ここでは、 /Developer/Library/Xcode/Project Templates/Bundle/Quicksilver Plug-in というパスになるように、zipを展開したディレクトリを置きます。

2. Xcode プロジェクトをつくる

1がうまくいっていれば、このように Quicksilver Plug-in が選択できます。

すすめると、こんな画面に。

このチュートリアルでは、設定画面 (PreferencePane) もつくるので、 QSInterface.frameworkにもチェックして、リンクされるようにしておきましょう。

3. Source Trees

プラグインをビルドするには、Quicksilverのフレームワークが必要です。 ダウンロードしておいたQuicksilver Developer版の中に、フレームワークがあるのでそこをXcodeに指定します。

XcodeのPreferencesを開き、Source Treesタブに移動して、画面のように設定します (Pathのところは、Quicksilver Developer版を置いた場所に読み替えてください。 例:/Applications/QS-dev.app/Contents/Frameworks)

つくりはじめる

フレームワークにのっかってビルドできるところまでいってみましょう。

4. Info.plist

さて、ここまでで準備が完了しました。 ここからは実際にプラグインをつくっていくことになります。

プラグインの情報のほとんどは、Info.plistに書くことになります。 .plistなファイルはXMLなので、Property List Editorで開くと編集にラクができます。

デフォルトのInfo.plistをProperty List Editorで開くと、次のような感じ。

個々のキー/値については、 や Plist Specification が詳しいです。 ここでは、最小限の設定項目を埋めていきます。

5. QSPlugin

プラグインについてのメタ情報を書きます。

Before | After:

6. QSActions

実際にプラグインが何をするかについての情報を書きます。 まず、QSActionsTemplateからQSActionsに名前を変えておきます。

nameのところの値をタイプすることで、Quicksilverからこのプラグインが呼ばれるので、 それっぽい値を入れておくとよいでしょう。

directTypesのところで、受けつける入力の種類を判定するぽいです。 ここでは “*”を指定してなんでもこいにしてみました。

Before | After:

7. QSRegistration

いろいろ設定項目はありますが、ここではPreferencePaneについて。 まず、QSRegistrationTemplateからQSRegistrationに名前を変えておきます。

QSPreferencePanesの中に、classを指定できるところがあります。 ここには、後でつくるPreferencePane用のクラス名を指定します。

Before | After:

8. ビルド

そろそろこのページを見ながらちまちまと作業をするのにも飽きてきたことででしょう。 ここらでビルドして、実際に動いてるのを見ようではないですか。

Xcodeでふつうにビルドすると、*.qsplugin というファイルが生成されます。 これがQuicksilverのプラグインなのですね。

ダブルクリックすると、Quicksilverに “プラグインをインストールする? “みたいに聞かれるのでYesで進みましょう。

9. 動いてるのを見る

「.」でテキスト入力モードにして何かうちこみ、TABでActionに移りましょう。 6.で設定してある名前を入力すればほら、いまつくったプラグインが呼び出せるではないですか! (とはいえ、いまのところ何もActionを実装していないので、実行したところで何も起こりません)

次に、QuicksilverのPreferenceを開いてみます。 左のリストに、いまつくったプラグインがあると思います。やったね !

PreferencePaneをつくる

ここからがお楽しみです。

10. PreferencePaneのクラスをつくる

File→Newから、Objective-C class をつくります。 ファイル名は、7で指定してたクラス名にするとよいでしょう。

を、QSPreferencePaneを継承するように書き換えます。

QSPluginTutorialPreferencePane.h:


import



QSPluginTutorialPreferencePane : QSPreferencePane { }

に、mainNibNameというメソッドを加えます。 このメソッドは、次につくるnibファイルの名前 (から.nibを除いたもの) を返すようにします。

QSPluginTutorialPreferencePane.m:


import "QSPluginTutorialPreferencePane.h"



QSPluginTutorialPreferencePane
-(NSString *)mainNibName { return @"QSPluginTutorialPreference"; }

ここまでのプロジェクトはこんな感じになるでしょう。

11. NIBをつくる

File→Newから、Window NIB をつくります。

12. File’s OwnerのクラスをPreferencePaneのクラスにする

このへんを 参考にして、File’s Ownerのクラスを、10でつくったクラスにします。

まず、QSPreferencePane.hと10でつくったクラスのヘッダファイルを、 NIBのウィンドウにドラッグ&ドロップします。

次に、File’s Ownerのオブジェクトを選択した状態でObject Identityの設定ウィンドウに行き、 Classを10でつくったクラス名にします。

13. File’s OwnerとWindowをつなげる

File’s OwnerのオブジェクトからCtrl+ドラッグしてWindowにドロップすると、 オブジェクトをつなげることができます。 Outlets _windowと出るので、_windowを選択しましょう。

14. コントロールを配置

好きなコントロールをWindowにつけましょう。 ここでは、シンプルなText Fieldコントロールをつけました。

15. 動かす

ふたたびXcodeでビルドし、.qspluginをつくり、インストールします。 QuicksilverのPreference→つくっているプラグインを選ぶと、ちゃんと右側にいまつくったText Fieldが 表示されることでしょう。やった !

16. バインドする

しかしこのままでは、設定画面で入力した値をどうやって使うのか分かりませんよね。 ここで、Cocoa Binding というテクニックをつかいます。

14で配置したコントロールを選択してBindngs設定ウィンドウに行き、次のように設定します。

  • Bind to: Shared User Defaults
  • Controller key: values
  • Model Key Path: 好きな文字列 (他のところからこの値を参照するときに使うキー)

ここでは、Model Key Path を QSPluginTutorial.someKey という値にしました。

Actionのコードを書く

したいことを何でも書くところ。

17. 入力 + 設定から得た値 => 出力

Actionのクラスの実装を書きます。 ここでは、入力された文字列に、PreferencePaneから得た値を組合せて、出力にすることにしました。 コードは以下のようになります。

QSPluginTutorialAction.m:

 QSPluginTutorialAction

  • (QSObject *)performActionOnObject:(QSObject *)dObject{ // get value from Preference Pane id values = [[NSUserDefaultsController sharedUserDefaultsController] values]; NSString *value = [values valueForKey:@"QSPluginTutorial.someKey"];

    QSObject *ret = [QSObject objectWithString: [NSString stringWithFormat:@"%@ hello, %@",[dObject stringValue], value]];

    return ret; }


18. 完成 !!!



長い道のりでしたが、ついにこれで終わりです。
ビルドし、インストールして、PreferencePaneから値を入れておきます。

テキストを入力し、Actionを選択して実行します。

もういちどQuicksilverを起動すると、入力のところに結果が入っています。やったね !

おわりに



Quicksilverでプラグインをつくる方法をチュートリアルにしてまとめました。
Quicksilver Twitter Plugin (日本語) で、Quicksilverのプラグインをつくっているとき、まとまった情報がない、情報が古い、日本語の情報が見当たらない、と何かと苦労してました。 このチュートリアルでQuicksilver野良プラグインを書く人が増えればいいなあと。 (そして素晴しいプラグインが増えて僕も幸せになれればいいなぁとw)
Catalogの扱い方とかまだ調べてみたいところがたくさんあるので、情報持ってる方いればぜひご連絡ください。

参照



Vacuous Virtuoso: ほぼ唯一のQuicksilverプラグインづくりの情報源。 基本はここを以下の順に読むとよいです。


docs.blacktree.com: 本家。でもドキュメントが散逸してます…
                
Tags: , ,

WP CalendarCloud plugin

November 28th, 2007  |  Published in hack

よくあるタグクラウドのカレンダー版をつくりました。 ただずらっと年月のリストがあるよりも、ちょっとばかりは見た目が楽しくなるんではないでしょうか。

WordPressのCustom Template Tag として実装してあります。 CodeReposに置いておきました

実際に動いているものが、このサイトのサイドバー、アーカイブのところにあります。 詳しくは、こちらをご覧ください。


明日以降に、WordPressのplugin レポジトリにも登録できないか調べてみます。今日はもう寝なきゃなので…

Tags: calendar, , wordpress

WordPress CalendarCloud plugin

November 28th, 2007  |  Published in Uncategorized

What ?

A WordPress TemplateTag plugin that displays yearly calendars containing 12 months weighed by their post counts, like Tag Cloud.

Example

and, live demo is placed in the sidebar of this blog.

Download

calendar_cloud.zip (20KB)

Install

  1. Upload and unzip calendar_cloud.zip to the /wp-content/plugins/ directory
  2. Activate the plugin through the ‘Plugins’ menu in WordPress

Use css to customize look & feel. See an example in style.css.

Usage

put following line in your template:


ChangeLog

  • 0.2 : accordance with WordPress Coding Standard.
  • 0.1 : initial release.

Feel free to send any feedbacks.

Tags: , wordpress

SocketReaderPatch 0.1

June 16th, 2007  |  Published in hack

SocketReaderPatch

Mac OSX の Quartz Composer で、Socketから文字列を読み込んで後段に渡すGeneratorパッチ

を書きました。

晴れた土曜の勢いで書いたのでなにかとバグがあるかもしれませんが、プロトタイプを出すことがたいせつなので公開します。フィードバックいただけるとたいへん喜びます。

2007.06/16 20:34 追記

英語の説明文も追加。QuartzComposer CustomPatch Xcode template 配布サイトに感謝のコメントを残しておいた。

2007.06/16 22:50 追記

ScreenCast を追加しました。

ScreenCastには、 Making Free Screencasts on OS X を参考にして、vnc2swfを使いました。マウスカーソルはでないのだけど、フリーでScreenCastがつくれるのは著しく便利です。

swf → mpeg4 には、QuickTime Proをつかって。なぜかH.264ではエンコードできなかったのでMPEG-4。

Tags: , ,

TopCoderのプラグイン

April 27th, 2007  |  Published in Uncategorized

Gulfweed::TopCoderでCodeProcessor+TZTester+FileEdit のエントリを見て、おおそんな便利なプラグインがあるのか! と試してみました。

僕はC++を使うのですが、defaultのテンプレートではローカルでそのままコンパイルできなかったので、少し手を加えてみたのが以下です。

C++用テンプレート

$BEGINCUT$
#if 0
$PROBLEMDESC$
#endif // 0
#include 
#include 
$ENDCUT$
#line $NEXTLINENUMBER$ "$FILENAME$"
#include 
#include 
using namespace std;
class $CLASSNAME$ {
   public:
   $RC$ $METHODNAME$($METHODPARMS$) {

   }

   $TESTCODE$
};

// BEGIN CUT HERE
int main() {
$CLASSNAME$ ___test;
___test.run_test(-1);
}
// END CUT HERE

しかし、ほんと便利。一時期自分でフレームワークを作ろうとしていたのだけれど、やっぱり誰かが既にやっているものなのですね。 あとは解決能力を伴わせなければ…

Tags: ,

Hikiでタグクラウド

August 22nd, 2006  |  Published in hack

Rubyで書かれているWikiエンジンであるHikiで、タグクラウドを実現するプラグインを書きました。

ダウンロード

CodeRepos

背景

やっぱりカテゴリよりもタグの方が手軽です。 HIkiにはもともとキーワードというタグのような機能があったので、これを利用できないかと思い、keywordプラグインを使ってみたところ、ほぼ期待通りのことができて小躍りしていました。

んじゃせっかくだし、タグクラウド (tag cloud) みたいな表示もできないかな、とkeywordプラグインを改造してみました。フォントサイズのアルゴリズムなんかは、blosxomでのタグクラウド実装の1つであるBLOGGING IS FUTILE : Blosxom plugin tagging を参考にしました。

ライセンスは、Hiki及びBlosxom plugin taggingに従って、GPL v2以降です。

ソースは続きにて。

ソース


show keywords like tag-cloud


Licensing: GPL v2 or newer, http://www.gnu.org/licenses/gpl.txt



#

Original:


$Id: keyword.rb,v 1.5 2005/09/30 11:45:49 fdiary Exp $


Copyright (C) 2003 TAKEUCHI Hitoshi <>



THRESHOLD = 1 MAX = 156 MIN = 32
def keyword_cloud(key) # sort by category list = keywords(key).to_a.sort {|a,b| a[0].downcase <=> b[0].downcase}
max = 1 min = 0 list.each do |j| sz = j[1].size next if sz < THRESHOLD
max = sz if sz > max
min = sz if sz < min


end
diff = max - min
s = '' list.each do |j| sz = j[1].size next if sz < THRESHOLD
category = j[0]
p = j[1]

fts = MIN + (((MAX-MIN)/diff.to_f) * (sz-min+1))

## for debug
# s << "<h4>"
# s << [sz, max, min, MIN, (MAX-MIN), diff, (MAX-MIN)/diff.to_f, (sz-min+1), fts].join(', ')
# s << "</h4>"

s << "<span id='tag' style='font-size:#{fts}%'>#{view_title(category)}</span> "


end
s end
def keywords(*keyword) keyword.collect! {|a| a.unescapeHTML}
key = Hash::new do |info| next unless info.values[0][:keyword] info.values[0][:keyword].each do |k| if keyword.size == 0 || keyword.index(k) key[k] = [] unless key[k] key[k] << info end end end key end
def keyword_entries_n(pages) p = j[1]
end
export_plugin_methods(:keyword_cloud)

Tags: , , ,

はてブ sidebar for Typo

January 17th, 2006  |  Published in hack

はてなブックマークをのサイドバーに表示するプラグインを書いた。午前のクイックハック。最近の20エントリが表示されます。

typo/component/sidebar/READMEを読みながら、del.icio.usとかflickrのプラグインのまねをしていたら書けていた。 これらのプラグインは、XMLの要素を引っ張ってくるのにXPathを使っているのだけど、パフォーマンスはどうなんだろう。

もの

hbm_typo.tgz

インストール方法

typoのルートディレクトリで、

% tar zxvf hbm_typo.tgz

とします。

また、はてなブックマーク取得のために、 はてなブックマークAtomAPI バインディング for Ruby のHatenaBMを使っています。 こちらのサイトから、hatenabm.rbを落としてきて、typo/lib あたりに放り込んでください。

動作確認

typo svn trunk rev 825

ToDo

  • キャッシュを使う
Tags: , , , sbm