Hatena::ブログ(Diary)

口内炎延焼

 |  

2010-08-28

サブアカの発言全部消した

while true
  begin
    c = OAuth::Consumer.new("fugafugafugafuga","hogehogehoge", {:site => "http://twitter.com"})
    t = OAuth::AccessToken.new(c, TOKEN, SECRET)
    JSON.parse(t.get("/statuses/user_timeline.json?count=200").body).each do |p|
      puts "#{p["id"]}: #{p["text"]}"
      p t.post("/statuses/destroy/#{p["id"]}.json") rescue nil
     end
    sleep 60
  rescue
    sleep 20
  end
end

こんなの。 /statuses/destroy は API 制限の適用対象外なので /statuses/user_timeline のところのみウエイトをかければよい。並列アクセスなどもしていないので警察に逮捕される可能性も少ないでしょう。

ところで周知の通り twitter の /statuses/user_timeline はその人の最新発言 3200 件までしか取ることが出来ない。じゃあその 3200 件を消しきってしまうとどうなるかというと、 API でも Web でもその人の発言が一切取得できなくなります。発言件数だけ取得できるけど、出てこない。ちなみに status id を指定して直叩きすれば取れる。

推測ですが、 status id を指定した場合はプライマリーキーで検索すればいいだけなので MySQL から取ってきてもコストが低いのでそうしているが、一覧はコストが高いので、一覧を作成してそれをキャッシュサーバーに載せて、一覧はキャッシュからの取得のみとしているのではないでしょうか。それが一覧取得 3200 件制限の理由。

3200 件全部消しきった後ある程度待つと、それより古い発言がまたポツポツと取得出来るようになります。なので上記スクリプトを回しっぱなしにしているといつか発言が全部消えます。 6000 件程発言していたサブアカの場合全消去には 5 日間程かかりました。

2010-08-27

ブラウザゲーム開発みたいのについて

今年の 4 月から IT エンジニアをやってます。もう 5 ヶ月ぐらい IT エンジニアをやってることになりました。ブラウザゲームの企画とプログラミングをやってます。

Rails でやってます。 RSpec でテストファーストという普通の感じです。僕の開発スタイルで普通と違うのは以下 2 点ぐらい。

まず NDD を採用しています。 NDD については http://ssig33.com/blog/2010-08-05-1.html こちらを御参照ください。かなりストレスの高い開発手法なので気をつけてください。

もう一つですが、Web アプリケーションではデータべースのスキーマーをどう決めるかとかが重要だと思うのですが、個人的な事情(RDBMS スキルが微妙)と仕事上の事情(スケジュールがアレなのでがっちり設計してがっちりスキーマー決めるとか難しい)ので、以下のようなスキーマーを採用しています。

  create_table "entities", :force => true do |t|
    t.string   "key",        :null => false
    t.text     "body"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  add_index "entities", ["key"], :name => "index_entities_on_key", :unique => true

  create_table "indices", :force => true do |t|
    t.integer  "entity_id"
    t.string   "name"
    t.integer  "sort"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  add_index "indices", ["entity_id"], :name => "index_indices_on_entity_id"
  add_index "indices", ["name", "sort"], :name => "index_indices_on_name_and_sort"
  add_index "indices", ["name"], :name => "index_indices_on_name"

テーブルは以上二つ。モデルは

class Entity < ActiveRecord::Base
  has_many :indices

  def value
    MessagePack.unpack(self.body) rescue nil
  end

  def value= args
    self.body = args.to_msgpack
  end
end

class Index < ActiveRecord::Base
  belongs_to :entity
end

こんな感じ。

e = Entity.create(:key => "fuck", :body => {:unko => "unko"}.to_msgpack)
value = e.value
value["shit"] = "shit"
e.value = value
e.save
e2 = Entity.create(:key => "kill", :body => {:unko => {:unkooooo => ""}}.to_msgpack)
Index.create(:name => "fucking", :entity_id => e.id, :sort => 1)
Index.create(:name => "fucking", :entity_id => e2.id, :sort => 2)
Index.find(:all, :conditions => {:name => "fucking"}, :order => "sort desc", :include => :entity)

こんな感じで使う。 Facebook のやつとか Lang-8 の SimpleResource とかを AR だけでやってる感じです。スキーマレスな DB を MySQL 上で実現できます。MySQL しか使ってないからトランザクションも使えます(使ってないけど)。スキーマレスなので思いついたら適当にスキーマを追加出来るし、機能追加などの時もいきなり機能の実装をはじめられます。

オススメ、と言えるやり方なのかどうかは微妙。 Rails の原則には真っ向勝負を挑んでいるわけだし。

コントローラーを厚くするのは微妙なので apps/model 以下にビジネスロジックを実装したコードが散っている。

もうちょっとかっこよくスキーマレス DB を Rails 上で使える方法が欲しい(SimpleResource はテストが難しいので却下)。

2010-08-25

海外通販での出来事。

昔購入したものについてトラブルがあってサポートとやり取りをしていたら、なんといきなり電話がかかってきた。しかも結構深夜。時差のことなど考えていないと思われる。

英語で早口で捲し立てられて何を言っているのか分からない。そこで俺は電話口で絶叫した。

プリーズスロウリー!!モア!!スロウリー!!!モストオブジャパニーズイズノットグットアットイングリッシュ!!ユーアーシュアーオルソーノー!!!ソープリーズスローリー!!!!!アイアムノットグットアットイングリッシュ!!!

結果としてはなんだ話せてるじゃないかみたいなこと言われてそのままのスピードで話されて殺意が湧いた。電話は表情を伝えられないから駄目だと 20 年と少しの人生ではじめて感じた瞬間だった。

その後気合でコミュニケーションを取ることが出来たので、案外なんとかなるのだとも思った。ちなみに俺が郵便番号を書き間違えていたという話だった。

しかしながら高校教育までしか受けておらず、その後特に英語教育を受けたわけでもない日本人の英語力では海外 EC サイトの担当者と電話するのはかなり厳しい。イギリス人というのは実に容赦が無い。その電話に実に 15 分も消費した。

アウアッアウッエッウアッアウアッ!!プリーズイーメール!!イーメールプリーズ!!とか絶叫してさっさとメールでのコミュニケーションを図った方が早く解決したものと思われる。

そんな思い出。

ホメオパシー信じて死ぬのと同じだよねこれ。

今敏監督の話。

http://konstone.s-kon.net/modules/notebook/archives/565

忘れもしない今年の5月18日。

武蔵野赤十字病院、循環器科の医師から次のような宣告を受けた。

「膵臓ガン末期、骨の随所に転移あり。余命長くて半年」

なんで僅か 3 ヶ月で死んだのだろうかと思ったらあっさり理由が書いてあった

歩行にも大きく困難を生じ、鍼灸師やカイロプラクティックなどに通っていたのだが

抗ガン剤は拒否し、世間一般とは少々異なる世界観を信じて生きようとした。「普通」を拒否するあたりが私らしくていいような気がした。

ようは現代医療を信じず代替医療を信じたらあっさり死んだというそういう話だった。

創作に携わる人間は普通の感覚では食っていけないというのはもちろん少なからずある。それも程度問題で死ねば創作に携わることはできない。

代替医療カルトがこの世に無ければ今敏監督はもっと長生きしてもっと作品を作ったかもしれない(ガンは普通に治療すればだいたい宣告された余命よりは長生きする)。

代替医療カルトは壊滅すべきというふうに思いました。

2010-08-24

Firefox の add on

プロファイル作り直すのでその前に入れてる add on をリストアップしておく

  • BarTab 再起動した時重くならないようにするやつ(ちょっと違う)
  • chaika firefox を 2ch 専用ブラウザの機能付与するやつ
  • DownThemAll! ダウンロードマネージャー。分割ダウンロードとか出来る。
  • Elasticfox EC2 を管理出来るやつ
  • EPUBReader ePub 読める
  • FaviconizeTab Tab を favicon サイズにまで小さくするやつ
  • Hatena Bookmark はてブをいろいろ出来る
  • RefControl リファラいじれる
  • SQLite Optimizer sqlite3 の vacuum とか reindex とかを自動化するやつ
  • Stop Autoplay Flash とか QT とか自動再生しないようにするやつ
  • Tombloo いろんなところに投稿出来るやつ
  • Vimperator Chrome の権限で JavaScript 実行しまくれるやつ
  • XUL/Migemo 検索に Migemo 使えるようにするやつ
  • Stylish user css 簡単に適用できるやつ
  • Greasemonkey ユーザースクリプト簡単に適用できるやつ
RefControl の設定
  • fc2.com 阻止
  • japan.cnet.com 偽装
  • stat.ameba.jp 阻止
Greasemonkey 入れてるもの一覧

Minibuffer

Autopagerize

LDRize

LDR + Tombloo

LDR Full Feed

Logo Hanamasize

nicovideo downloader

hitodenize

twitter.AutoPager

hatena-star-user-icon

ldr_relative_rate

twitter following checker

Greased Lightbox

Twittfilter hitode909-RT

twitter-average-length

Query Cutter

Youtube HD Suite

Colorful Favstar.fm

follow theDanielJRadcl

2010-08-23

Java で暗号化したデータを Ruby で復号しようとしたら大変だった件

blowfish で暗号化するからキーはこれね、と適当なことを言われてデータを渡された。

経緯はこれ http://d.hatena.ne.jp/download_takeshi/20100819/1282173492 と殆ど一緒。

padding 方式とか暗号化方式とか一切聞かなかったのも元記事と同様。全然 Ruby で正しく復号も手元で暗号化することも出来ない。

  • Q. そこで私はどうしたか。
  • A. Rjb を使いました。

Rjb を使うことで Ruby プログラマーは Java のクラスを Ruby のクラスのように使うことが出来ます。とても便利。

Ruby でどうこうするというのは早晩諦めて(いろいろ調べるのめんどくさいし時間もなかったし Java の場合のリファレンス的なものは先方から貰えたので)、 Java のクラスを Rjb 経由で Ruby から使用することにしました。 Ruby 側のコードは

require "rjb"
Decrypt = Rjb::import "Decrypt"
str = Decrypt.decrypt clusterfuck_encrypted_message #なんとダサいクラス名とメソッド名だろうか。

こんな感じ。実際には config/enviroments.rb とかサービス層とかにいろいろ分かれて置かれているのだが。非常に簡単。パフォーマンス的な問題も(今のところ)発生していない。

適当な仕事の進め方はよくない、しかし案外なんとかなる、ということが分かった一件です。

 |