xyttr起動用anything source (xyttr Advent Calendar 1日遅れの21日目)

この記事はxyttr Advent Calendar 2011の記事です。

ランチャーとして使えるxyttr専用のanything sourceを作ってみました。
xyttrの各種コマンド起動用 anything source

※ .xyzzyかsite-lispからロードして下さい。

xyzzy用anythingは配布元のサイト(http://ottt.x0.com/)が死んでるっぽいので、ミラーとして下記URLに配布ファイルをアップしておきました。
http://dl.dropbox.com/u/215714/xyzzy/ottt-mirror/anything0.1.5.lzh
未インストールの場合このファイルをDLして手動でインストールしてください。

M-x anything-xyttr で起動します。
http://gyazo.com/da615a6b7e4b6b038f1b24c99bcfa382.png

グループの順番変えられないのがちょっと残念。
しかしanythingのカスタムソース表示は色々応用が効きそう。リスト選択とかのUIとして組み込んでしまいたい。

xyttr v1.1.2 release (xyttr Advent Calendar 1日遅れの20日目)

この記事はxyttr Advent Calendar 2011の記事です。

◆ v1.1.1 → v1.1.2の変更点

  • タイムラインバッファリロード時に実行するフック *timeline-reload-hook* を追加
  • xyttr-listコマンドに引数としてリスト名(@screen_name/listname)を渡して起動できるように修正
  • search-timelineでin_reply_to_status_idをツイートデータに含めるよう修正

以下詳細

◆ リロードフックの追加

*timeline-reload-hook* はタイムラインバッファのリロード時(バッファ更新完了後)にrun-hook-with-args関数で実行され、フック関数には引数として新着ツイートのリストが渡されます。
昨日紹介したGrowlでの新着通知機能の亜種をこのフックで実装してみると

(require "growl")
(in-package :xyttr)

;; home-timelineの新着を通知
(defun notify-new-tweets (tweets)
  (when (eq :xyttr (timeline-mode buffer-timeline))
    (when (> (length tweets) 10)
      (setq tweets (subseq tweets 0 10)))
    (dolist (tw tweets)
      (w/json (user.screen_name user.profile_image_url text) tw
	(growl:notify (concat "@" user.screen_name) text
		      :name "xyttr" :icon user.profile_image_url)))))

(add-hook '*timeline-reload-hook* 'notify-new-tweets)

こんな感じに。タイムラインバッファを開いている時しか通知できませんがシンプルに書けます。

◆ xyttr-listコマンドの変更

今まではxyttr-listコマンドには引数がなく、処理の中でread-string関数を使ってリスト名の入力を取得していましたが、今回の修正でリスト名を引数として渡せるようになりました。

anythingからリストを起動する例

(require "anything/anything")
(in-package :user)

(add-anything-sources
 :name "xyttr-list"
 :candidates (lambda () (mapcar #'car xyttr::*list-subscriptions*))
 :action (lambda (l) (xyttr-list l)))

http://gyazo.com/8a73059f3b18a94da7d7e8611a178a5b.png

M-x xyttr-list での実行は相変わらずcomplete+導入推奨です。

◆ search-timelineの変更

返信先ツイート表示(pキー)がちょっと速くなりました。




そろそろリスト関係の機能を強化するべきかなーと思いつつ、リストほとんど使ってないのでなかなかやる気が起きない…

Growl連携 その2 (xyttr Advent Calendar 1日遅れの19日目)

この記事はxyttr Advent Calendar 2011の記事です。

6日目に続いて、xl-growlとの連携ネタ。

MacOSTwitterクライアントによくあるGrowlでの新着通知機能を作ってみます。

tweets-notifier.l

※ xl-growl ver.1.0.0にはnotify-with-socket-callbackにバグがあったのでNetInstallerより1.0.1をインストールしておいてください。

◆使い方

tweets-notifier.l は site-lisp等require可能な場所に置いて、下記のようなコードを.xyzzyか ~/.xyttr/config.l に書き込みます。

;;; xyzzy起動時に通知を開始するなら .xyzzy に
;;; xyttr起動時から通知を開始するなら ~/.xyttr/config.l に書く

(require "tweets-notifier")

;; Mentionを通知
(xyttr:define-notifier mentions
 :apifunc #'xyttr:api-mentions-async  ; timeline系API関数 (必ず非同期版を指定する事)
 :sticky t                            ; 通知ウィンドウをクリックorキー操作で閉じるまで表示し続ける
 :interval 300                        ; 新着取得間隔 (秒)
 :callback (lambda (tweet) (user::xyttr-mentions))) ; クリック時に実行するコールバック関数

;; "xyzzy -RT" の検索結果を通知
(xyttr:define-notifier search-xyzzy
 :apifunc #'xyttr:api-search-async
 :params (:lang "ja" :q "xyzzy -RT" :include_entities "true")  ; apifuncに渡すパラメータ
 :sticky t
 :interval 300
 :callback (lambda (tweet) (user::xyttr-search "xyzzy -RT")))

;; 通知開始
(xyttr:start-notifier mentions)
(xyttr:start-notifier search-xyzzy)

define-notiferマクロで通知設定を定義し、start-notifer(これもマクロ)で通知を開始します。
通知を開始すると初回に5件ツイートを表示し、以後指定した秒数ごとに新着ツイートを取得して表示します。

http://gyazo.com/1a315480736b11b35fb3935bfef97517.png

通知をクリックすると表示したツイートのデータを指定したコールバック関数に渡して実行します。
通知を止める時は (xyttr:stop-notifier name) もしくは xyttr:stop-all-notifiers を実行します。



以上Growlを使った新着表示の実装方法の紹介でした。

はてブコメント表示 (xyttr Advent Calendar 18日目)

この記事はxyttr Advent Calendar 2011の記事です。

時間がなくなった為また小ネタ。
カーソル下のURLに付けられたはてなブックマークのコメントを表示します。

(in-package :xyttr)

(defun show-hatebu-comments ()
  (interactive)
  (whenlet url (expand-focused-url)
    (xhr:with-xhr-get-async ("http://b.hatena.ne.jp/entry/jsonlite/"
                             :query `(:url ,url)
                             :encoding *encoding-utf8n*
                             :key #'xhr:xhr-response-values)
      (on :success (res status header)
          (w/popupbuf ((format nil "*comments on ~A*" url) t)
            (if (string= res "null")
                (format t "No bookmarks on ~A" url)
              (w/json (count bookmarks title) (json:json-decode res)
                (format t "~A  - ~A user~%~A~%~%" title count url)
                (dolist (e bookmarks)
                  (w/json (user tags comment) e
                    (format t "~&~A: ~{[~A]~}~:[~%  ~A~;~]"
                            user tags (string= "" comment) comment))))))
          (refresh-screen))
      (on :failure (&rest a) (msgbox "[hatebu] error: ~S" a)))))

(define-key *xyttr-timeline-keymap* #\B #'show-hatebu-comments)

http://gyazo.com/8ba98a4243078ad55743183983f90459.png

w/popupbufマクロはconfig.lサンプルのフォルダ(~/site-lisp/xyttr/dot_xyttr_example)にあるwindow.lで定義されているので、~/.xyttrにコピーしてload-pluginする等してロードしておいてください。

streaming-api (未対応) (xyttr Advent Calendar 17日目)

この記事はxyttr Advent Calendar 2011の記事です。

xyttrではstreaming-apiを使用したツイートの取得は現在サポートしていませんが、以前サポートしようとコードは書いていて、9月までは実際にデータ取得ができていました。
xyttrでstreaming-apiを使用 (とりあえずfilter.jsonのtrackのみ)

xml-http-requestではストリーミング受信ができないのでconnect関数でHTTPアクセスし、タイマーを使ってデータを受信しています。
Ruby会議の日にイベント用ハッシュタグを一日中トラックしてみましたがパフォーマンス的には全く問題がなく、その後アニメ実況タグを追ってみたりもしましたが、#ゆるゆり くらいなら編集操作はほとんどブロックされず快適に表示できていました。

が、10月に入ってstreaming-apiHTTPS接続限定にされ、connect関数でのアクセスができなくなった為お蔵入りに。

streaming機能はとても便利だと思うので、データ取得をcurl.exe等に丸投げするような形で復活させたいなーと考えています。

技術系 Advent Calendarの全てをxyzzyから選べるanythingソースを書いた (xyttr Advent Calendar 16日目)

この記事はxyttr Advent Calendar 2011の記事です。

最早完全にxyttrと関係ないですが、一応この連載を辿り易くなるって事で一つ。
anything advent-calendar-2011 for #xyzzy

参考

カレンダーのリストはUniteソースに埋め込まれていた物(元はこの表)を拝借しました。

◆ 依存ライブラリ

現在anythingは入手困難?? ミラーないのかな…

◆ 使い方

このソースをload-pathに置いてrequireするかバッファに貼り付けてeval-buffer等してから、M-x advent-calendar-2011 で起動します。
http://gyazo.com/09920eb5213761445f1561b129645b2d.png

適当に絞って

http://gyazo.com/29ce7bf50aa0ed1d7e4ed95338062049.png

リターンを押すと

http://gyazo.com/1b66064d739eb1dd1c071d02fa511c0a.png

選択したAdvent CalendarがRSS、もしくはatnd.orgのコメント欄でエントリーのURLを告知してる場合、各記事のメニューが表示されます。 (その他の場合はブラウザで集約ページを開きます。)

そして記事を選んでリターンを押すと、ブラウザで表示されます。



以上、anything advent calendarの紹介でした。

JSONデータ確認用ユーティリティ (xyttr Advent Calendar 15日目)

この記事はxyttr Advent Calendar 2011の記事です。

Twitter API関数等で得られるJSONデータを見やすい形で出力するためのユーティリティーです。

(in-package :xyttr)
(defun format-json (json str)
  (labels
      ((rec (data indent)
         (cond ((consp data)
                (format str "{~%")
                (dolist (kv data)
                  (format str "  ~V@T~A: " (* indent 4) (car kv))
                  (if (consp (cdr kv))
                      (rec (cdr kv) (1+ indent))
                    (format str "~S~%" (cdr kv))))
                (format str "~V@T}~%" (* indent 4)))
               (t (format str "~V@T~S~%") (* indent 4) data))))
    (rec json 0)))

1つ目の引数はjson:json-decodeで得られる連想リストで、2つ目の引数は出力先ストリームです。
ストリームにnilを渡すと文字列になりそうな雰囲気ですがなりません。(手抜き)
出力を文字列にしたい場合はwith-output-to-string等と併用してください。

*scratch*バッファでの実行例

(xyttr::format-json (xyttr:api-show-status :id 147162365903900673) t)
{
  geo: nil
  truncated: nil
  id_str: "147162365903900673"
  retweet_count: 0
  favorited: nil
  in_reply_to_screen_name: nil
  in_reply_to_user_id: nil
  in_reply_to_status_id_str: nil
  user: {
      profile_use_background_image: t
      protected: nil
      is_translator: nil
      follow_request_sent: nil
      following: t
      geo_enabled: nil
      profile_text_color: "333333"
      name: "ネコと和解せよ"
      id_str: "424679891"
      statuses_count: 258
(以下40行ほど略)

S式じゃないと見にくい、って人は{}を()に変えて、7行目の~Aとコロンの位置を入れ替えるとplistっぽくなって良いと思います。

また、下記のようなコマンドを作っておくと、タイムラインバッファ上のツイートデータの中身をサクっと確認できて便利です。

(defmacro w/popupbuf ((name &optional read-only) &body body)
  (w/uniq (km wc closer)
    `(let ((,km (make-sparse-keymap))
	   (,wc (current-window-configuration)))
       (labels ((,closer ()
		  (interactive)
		  (delete-buffer ,name)
		  (set-window-configuration ,wc)))
	 (define-key ,km #\q #',closer))
       (with-output-to-temp-buffer (,name t)
	 ,@body)
       (setq buffer-read-only ,read-only)
       (use-keymap ,km))))

(setf (get 'w/popupbuf 'ed::lisp-indent-hook) 1)

(defun show-jsondata ()
  (interactive)
  (multiple-value-bind (s json) (entry-point)
    (w/popupbuf ("*tw:jsondata*")
      (format-json json t))))

(define-key *xyttr-timeline-keymap* #\T 'show-jsondata)

タイムラインバッファ上でTを押すとツイートデータをポップアップバッファに表示します。ポップアップバッファはqを押すと閉じます。

なおこのコマンドのコードはconfig.lサンプルフォルダにwindow.l、dump.lというファイル名で収録されていますので、参考にしてみてください。