Release “I have been pocketing his money.”

お金を借りたのに返すのを忘れたとき”着服してすいません”とtweetする”I have been pocketing his money.”を作りました。

UseCase
手持ちに小銭がなくてお金を借りたとき、あとで一万円札コンビニで崩して返そうと思ってそのまま忘れることがよくあります。そんなとき”木曜日ばけおに借りた弁当将軍代500円を着服してすいません @sanemat” と自分のアカウントでtweetしてくれるアプリです。”I have been pocketing his money.“。事前に設定した時間内にお金を返したら、コマンドを入力する $ bin/bakeo-snooze ことでtweetを止めることができます。

ありがとうございます!

広告

How many mentions does Justin Bieber have?

Justin Bieberにどれぐらいmentionがくるか体感してみたい!

# depend on earthquake and keyword plugin
$ earthquake
:filter keyword justinbieber
:config keyword {pattern: /@justinbieber/i, filter: true, notify: false}

# When you want to return
:filter off
:config keyword nil

感想
多すぎ。streamを感じる。たぶんこれが世界で一番多いmentionじゃないのかなあ。ladygagaとmasasonしか比較して見てないけどgagaより圧倒的に多い。話しかけやすい? あとは日本語圏でmention多そうな人のイメージでmasason。followersだけで一桁違っちゃう(masason: 1_672_307, ladygaga: 25_517_205, justinbieber: 23_113_574)から仕方ない。private accountからのmentionは知らない。
過程
@justinbieberだけ欲しくていろいろ探しちゃったんだけど、結局無理そうなので
filter track justinbieberして 必要ならinput_filter 的なもので絞ればいいんじゃない?
とある程度あきらめた。
実際叩いてみると分かるんだけどtrack justinbieber で流れてくるのは体感で8割以上@justinbieberなのね。status中にjustin bieberの話をするときは 空白開けるでしょ。裏取ってないけど。あと”キムタク”的な愛称があるんじゃない。適当。
keyword plugin入れて

:plugin_install https://gist.github.com/899506
config keyword {pattern: /@justinbieber/i, filter: true, notify: false}

うわー目がーってなったら適当にhighlignt上書きしちゃう。
:config color { highlight: 0 }
飽きたら
:filter off
でも上書きしたkeyword消えてないので
:config keyword nil
highlight戻すのは 正確には戻ってないけど
:config color { highlight: nil }
config reload的なのがありそうな気がするけど探してない。
このぐらいのコマンドはつくってもいいかなとおもったけどやめた。
:keyword set {}
:keyword off
:highlight on
:highlight off
言い訳。keyword setするときにpatternとignoreと…って書式keyword plugin見ないと分かんないでしょ。keyword off は 困ったら:exit してまた立ち上げればいいじゃん。:highlight on, offはちゃんとやるならhighlightオプション見るようにするのかな、無理やりやるならoutput_filterでitem[“_highlights”]消すのかなあ、それはそれで読み込む順番に依存しそうな気がするし、どっちでもいい。
filter 切り替えしてるとすぐ420返してくる。rate limit??

⚡ :filter keyword justinbieber
⚡ earthquake: error: invalid status code: 420.
earthquake: reconnecting in: 10 seconds
terminate called after throwing an instance of ‘std::runtime_error’
what(): call SetTlsParms before calling StartTls
Abort trap

see: shellのカラーコード

sample_stream plugin for Earthquake

つなぐapiをTwitter Public streamsの最大で1%拾えるendpointに切り替える。streamsこんな感じなんだー的に使う。
Usage
:sample
で切り替わる。気が済んだら
:sample off
でUser Streamに戻る。
Install
感想
見よう見まねでちょろっと書いて動くとキモチイイ

twttus release! (shorten permalink you tweet)

twttus give you permalink for your tweet!
http://twtt.us/

usecase

when you want to tweet about others tweet, you can use bit.ly and ow.ly for shorten tweet url.
but they shorten anything urls (they have black list you know), you fear you jump anywhere you don’t know.

it is twttus case!
twttus only jump tweet in twitter.com.
and you can use twttus easy.

http://twitter.com/twttus/status/7909061689
->
http://twtt.us/7909061689

enjoy twitter life!

twitterの検索APIは発言内の読点を無視して検索結果を返してくる

twitterの検索APIは発言内の読点を無視して検索結果を返してくる

現象

「うんこ」で検索した結果に「うん、この中に(以下略)」が入っていた
「うんこ」だけをまぬけに置換していると「うん、この中に」がすり抜ける
「うんこ」で検索した結果の中で「うんこ」を別の文字に置き換えて改変tweetする迷惑botを動かしてて気づいた

対策

「うんこ」にほかの文字が入っていても置き換えてしまうのも悪くはない
でも置き換えが出来なかったらその発言無視して次の発言の改変に行く方がシンプルで楽そう
頻度が低ければorどうでもよければ 気にしないのがいい

句点がどうなのかとかほかの記号がどうなのかとかは知らない
ゲンミツにやりたいときは気をつける
そういうのが入りやすい検索キーワードで何かしたいときは頭の片隅に入れておく

全文検索ってこういうものなのを知らなかっただけかもしれない

twitter4rでtwitter検索するのに思ったより苦戦 そしてtwitterの仕様

twitter4rでtwitter検索するのに思ったより苦戦したのでメモを残す
twitter4rはruby用のtwitterライブラリ

2009-09-16時点
$ gem list –local | grep twitter
twitter4r (0.3.1)
Twitter API 仕様書はtsupoさん訳のもの。第31版。

twitter検索の大まかな使い方

twitter = Twitter::Client.new
iterator = twitter.search(:q => "四時 OR 4時 OR 4時", :lang => ‘ja’)
iterator.each do |tweet|
  p tweet.text
end

これで検索対象発言が取り出せる。無指定だと15件。
:lang => jaが日本語限定。「 OR 」でOR検索ができる。
試してないけど「 AND 」でAND検索できるんじゃね。このへんはAPI仕様書参照。

発言者名の取得

「show_user=true の場合」に発言ユーザ名でprefixが入るのはsearch.atomの場合のみ。
search.jsonの場合入らない。 twitter4rはjsonをパースするので、結局発言ユーザ名は入らない。

ググった結果から
tweet.user.screen_name
tweet.user.name
勘で探すけどいない

tweetは :source と :text と :created_ at しか持っていないように見える。 jsonのレスポンスには他にも居るのに!
仕方がないので↓こんな感じでライブラリを書き換えて

*** /usr/local/lib/ruby/gems/1.8/gems/twitter4r-0.3.1/lib/twitter/model.rb
     2009-09-14 00:55:27.000000000 +0900
— /path/to/model.rb  2009-09-14 00:54:59.000000000 +0900
***************
*** 227,233 ****
      include ModelMixin
      @@ATTRIBUTES = [:id, :text, :source, :truncated, :created_at, :user,
                      :favorited, :in_reply_to_status_id, :in_reply_to_user_id,
!                     :in_reply_to_screen_name]
      attr_accessor *@@ATTRIBUTES

      class << self
— 227,233 —-
      include ModelMixin
      @@ATTRIBUTES = [:id, :text, :source, :truncated, :created_at, :user,
                      :favorited, :in_reply_to_status_id, :in_reply_to_user_id,
!                     :in_reply_to_screen_name, :from_user]
      attr_accessor *@@ATTRIBUTES

      class << self
***************
eachのなかでユーザ名を取得した。
tweet.from_user

まず間違いなくもっとbetterな方法があると思うけど、web検索にもでてこないし、用は足りたので一応よかったことにする。
見つけたら加筆修正する。おしまい。

以下参考資料

UT blog: Twitter crawler with ruby 2
http://yyuto.blogspot.com/2009/06/twitter-crawler-with-ruby-2.html
RC3の無職しょ日記:Twitter4Rの歩き方
http://blog.livedoor.jp/r_c_3/archives/50648653.html
rdocは古いので参考意見にしかならない
http://twitter4r.rubyforge.org/rdoc/


2009-10-03 15:00追記

twitter4r 0.3.2以降でsearchでもfrom_user, to_userが取れるようになった
そのため、本エントリの修正は以後不要

時間に関するつぶやきをするtwitterbot「tokisaka」をつくりました

時間に関するつぶやきをするtwitterbot「tokisaka」をつくりました。
http://twitter.com/toki_b

cronでまわしてランダムで登録済みの発言をPOSTします。
話しかけられても特に返事はしません。フォロー周りも実装していません。
あらかじめ登録済みの発言をたんたんとPOSTするのみです。

開発・本番環境とコード管理は↓にまとめました。
實松アウトプット: gitとProjectLockerでtwitterbotをリリースするまで

構成はruby1.8.7 + Twitter4r0.3.1 + MySQL5.1.32 + ActiveRecord2.3.3 (+Rake 0.8.3)です。
まずは登録発言をふやさな。

gitとProjectLockerでtwitterbotをリリースするまで

gitとProjectLockerを利用してtwitterbotを管理してリリースしました。bot自体はlinode.comで動かしています。

ProjectLocker説明

ProjectLockerはワンストップのバグトラッキングシステムのホスティングサービスです。いわゆるBTS一式+ソース管理。プロジェクトごとにgitかsubversionのリポジトリを選択して使います。githubではなくこちらを選んだ理由はプライベートのリポジトリが無料で持てるから。tracやwikiはあるらしいけど利用してないので知りません。複数ユーザの管理や権限分けも可能。ただそもそも運営がDQNぽいのであんまり使わない方がいいと思います。

すぐやり方を忘れるので手順。gitはローカルリポジトリとconfig周りを設定済み。project locker, twitterはアカウント取得済み。

プロジェクト名を決める

決めるとやる気が出るので。今回は「時逆(tokisaka)」。

ローカルのディレクトリ構成を決める

$ mkdir $HOME/app/tokisaka
$ cd app/tokisaka
$ mkdir lib
$ mkdir spec
$ touch lib/foo.txt
$ touch spec/bar.txt

ローカルのディレクトリ構成の雛形は以上。gitはデフォルトだと(?)空ディレクトリを無視するのでファイルを作った。

ローカルリポジトリの準備

$ git init
$ git add .
$ git commit -m "initial commit"

ローカルリポジトリの準備ができた。

ProjectLocker側の準備

アカウントをとったあとどこからログインするのかいつも分からないので書いておく。ここからログインする。
ProjectLocker User Portal: Login
https://portal.projectlocker.com/

ログインしたら、左ペインの「Account Links」の中の「Add Project」からプロジェクトを追加する。入力するのはプロジェクト名とプロジェクト概要とgit/svn。
gitを選んでプロジェクトを作成完了。

プロジェクト一覧が出てくる。これは左ペインの「Account Links」の中の「List Project」と同じ。作ったプロジェクトの「Name」をクリックする。ここは直感的に。

「Users in Project」に誰もいなくて、「Account Users not Assigned to this Project」に自分がいるのでメールアドレスの隣の「Add To Project」をクリックする。「Users in Project」に自分が入る。

gitのリポジトリの場所が分からなくなったので後で追記する。左ペインの「User Links」から「User Home」を選択すると、プロジェクトごとのリポジトリURLとアカウントが表示される。tokisakaは「git-foobar@free2.projectlocker.com:tokisaka.git」

公開鍵を登録

「User Links」の中の「Manage Public Keys」に自分の公開鍵を登録する。「id_dsa.pub」の中身。

リモートリポジトリを登録

ローカルに戻る。
$ git remote add origin git-foobar@free2.projectlocker.com:tokisaka.git
$ git push
pushするとエラーが出る

To git-foobar@free2.projectlocker.com:tokisaka.git
! [rejected]        master -> master (non-fast forward)
error: failed to push some refs to ‘git-foobar@free2.projectlocker.com:tokisaka.git’
なので先にpullしてやる

$ git pull git-foobar@free2.projectlocker.com:tokisaka.git
してから
$ git push
するとpushができる。ProjectLocker側でリポジトリを作ったときに「README」ってファイルが自動で生成されるが、それとぶつかるかららしい。
push, pullの時には鍵のパスフレーズを要求されるので入力する。

本番サーバ側(linode.com)からpull

秘密鍵を本番サーバに転送する。ProjectLockerに登録した公開鍵とペアのもの。その鍵を使って認証する。git initとgit pullでファイルを取得。pullするものを選べば反映したいブランチを適応できるんじゃないかな。HEADをガツンと反映するので知らない。

$ git init
$ git pull git-foobar@free2.projectlocker.com:tokisaka.git
パスフレーズを入力するとProjectLockerのリポジトリからpullしてくる。

リリース完了。
http://twitter.com/toki_b