聞こえますか…あなたの心に直接…で始まるこのテンプレート. 誰かが「文章入力したら…を自動で入れてくれるのないかな」って呟いてたのでつくってみた.
サクッと作成 TinySegmenterで単語分割, ランダムに…を単語の間に挿入して出力してみた.
聞こえますか… この程度なら数十分あれば作れますね.
挿入位置を学習してみる さて,実際やってみるとちょっと挿入位置が不自然な気がします. 世の中に出回っているツイートでは単語間ではなく文節の間に挿入しているのが多いように見えます.
しかし,TinySegmenterは品詞情報をつけてはくれないので文節の判定は少し面倒ですね.
・・・待てよ・・・このテンプレートを使ったツイートなんて大量に手に入る・・・これから学習すればいいんじゃね?
はい,やってみましょう.
ツイートを集める Twitter APIを使ってテンプレートを使っているようなツイートを拾ってきます. ** 「聞こえますか OR きこえますか -RT」** で検索してみました.
普段Twitter APIを叩くときはTweepyを使っているのですが,これで検索するとあまり古いツイートは取れません. API 1.1 を使うと古いツイートも取ってこれるらしいので,強引にTweepyを書き換えて1.1対応. ** 72,529ツイートの取得に成功しました. ** プログラムについてはTweepyの書き換えでゴチャゴチャしているのでまた今度.
TinySegmenterMakerに放り込む カッコで囲まれている部分を抽出,点々を空白に置換,パクリツイッタラー消去などの処理をした後, TinySegmentermakerに放り込みます. 実際に学習に使ったツイートは49,573ツイートです. 10000回の繰り返しで,学習結果は以下のようになりました.
Result: Accuracy: 94.794% (3466578/3656961) Precision: 90.9504% (526277/578642) Recall: 79.2234% (526277/664295) System/Answer p/p p/n n/p n/n: 526277 52365 138018 2940301 約95%の精度という非常に高い性能を示してくれましたが, 区切るところ(p)よりも区切らないところ(n)のほうが多いためですね. Recallが8割しかありませんが,人によるばらつきが大きそうなので,まあこんなもんでしょう.
学習が終わったら最後にオリジナルのTinySegmenterを学習後のもので置き換えるだけ. チェックボックスで単語分割とツイートの学習結果,どちらを使うか選択できます. なんだかそれっぽくなりましたかね・・・?
元ネタについて ところでこのテンプレートの元ネタについて調査している方がいらっしゃるようです.
「聞こえますか…心に直接…」のオリジナル検証 ゲームが元ネタだ,っていう人を時々見かけたけど, 検証してみると微妙に内容が違うらしい. もちろん影響は受けているんだろうけどね. マンガとかゲームで始めて心に直接語りかけたのって何なんだろう?
AndroidからTwitterへアクセスするためのライブラリとして,Twitter4Jが有名です. これを使ってみようと,「Android Twitter4J」と検索すると 認証にWebViewを使った例がたくさん出てきます.
・・・いや,ちょっとまて. それはちょっとまずいだろう.
そういうわけでもうちょっと賢い方法を探してみました.
何がまずいのさ 「Android Twitter4J」と検索すると,上位にこんなページが出てきます.
Twitter4jを使ってOAuth認証をアプリ内で行う方法 Twitter4j-2.2.xを使ったOAuth認証のコーディング例 twitter4jでツイートする Android+Twitter4JでOAuthするためのソースコード 上のサイトでは次の様は方法をとっています.
アプリ内にWebViewを貼り付け WebViewでTwitterの認証画面を表示 onPageStarted や onPageFinished をオーバーライドして callback URL へのアクセスを検出 URL に入っている認証コードで認証 アプリ内でWebViewを使うとURLが表示されません. つまり ** 本当にツイッターにアクセスしているかわからない ** のです. もし,表示されるのが偽の認証画面だったら,アプリから簡単にパスワードがわかってしまいます.
じゃあ,URL を表示させればいいかというとそういうわけでもありません. 画面上のURL表示なんて簡単に偽装できてしまいます. どんな工夫をしても ** アプリがパスワードの要求をしていることには変わりありません ** . アプリはパスワードを簡単に取得できます.
アプリのユーザはTwitterに限らずSNSへのログイン時にブラウザを開かないアプリは信用しないようにしましょう. どこかでパスワードの抜かれている可能性があります. (ただし,公式アプリは除く.公式アプリが信用できないならそもそもサービスを利用できないもんね.)
じゃあどうするのさ じゃあ,開発者はどうするのかって話ですが,もう少し詳しく検索してみましょう. 他の方法を使っているページもでてきます.
PINコードを利用 TwitterでPIN番号認証を行う Intent Fileterを利用しコールバック twitter4jを使用したAndroid Twitterアプリケーション作成 Twitter4Jを使ってAndroidアプリでStreamingAPIのUserTimelineを取得する TwitterでOAuth認証を行う Twitterへのアプリケーション登録 Twitterの認証ページをブラウザで開く Access Tokenを取得する PIN コードを利用 一つ目の方法はPC版クライアントでよく使われる方法. 認証後にPINコードと呼ばれる数字が表示されるので,それをアプリに入力します. twiccaなんかでも使われてますね. Twitter へのアプリケーション登録のときにコールバックURLを入力しないとこの認証方式になります.
認証画面に,ブラウザを開くボタン,PINコードの入力ボックス,ログインボタンを用意しておきます.
<?xml version="1.0" encoding="utf-8"?
TinySegmenterは工藤さん作のJavaScriptだけで書かれたコンパクトな分かち書きソフトウェアです. わずか20kバイト程度のサイズしかなく,お手軽に使える分かち書きソフトウェアですが, 当たり前のことながら学習データに使った新聞記事以外の文章の精度はイマイチ. 改善しようにも学習用のプログラムが公開されていないのでモデルの修正が大変です.
ないなら作ってしまいましょう!
ダウンロード ソースはgithubで公開しています.cloneするなりzipファイルを落としてくるなりしてください.
TinySegmenterMaker 学習方法 スペースで分かち書きしたコーパスをあらかじめ準備しておきます. コーパスから分かち書きの情報と素性を取り出します.
$ ./extract < corpus.txt > features.txt AdaBoostを用いて学習します. 新しい弱分類器の分類精度が0.001以下,繰り返し回数が10000回以上となったら学習を終了します.
$ g++ -O3 -o train train.cpp # コンパイル $ ./train -t 0.001 -n 10000 features.txt model # 学習 きちんと分割できるが実際に試してみます.
$ ./segment model 私の名前は中野です 私 の 名前 は 中野 です ライブラリの作成 TinySegmenterは実装が簡単なためいろいろな言語へ移植されています. モデルの更新のたびにそれらへの言語の移植バージョンを作るのは大変です. というわけで,makerコマンドで各種言語用のライブラリを作れます. 学習結果のモデルはライブラリのなかに組み込まれ,ファイル単体で簡単に使用することができます. allを指定することで,対応しているすべての言語向けのライブラリを出力します.
$ ./maker javascript < model $ ./maker perl < model $ ./maker ruby < medel $ .
2012/11/8にくいなちゃんさん主催で開催された6さいカンファレンスのまとめ。 第9回は「マスタリングの技法 ~音圧を上げよう~」です。
勝手にまとめてしまったので、何か問題があれば@shogo82148まで。
よるほー くいなちゃん: みなさん、自分が作った曲が、市販のCDの曲にくらべ、 音量が小さい (最大まで波形を上げたにも関わらず)と悩んだことはありませんか?
くいなちゃん: しかし、心配はいりません。 今回のことを実践していただくと、 みなさんの曲も、市販の楽曲並みに、音圧をあげることができるですん! では次の波形をご覧ください。
くいなちゃん: http://kuina.tes.so/6saiconf_9/img0.png はい、さっき作った曲です。 いい曲ですね! しかし、なんだか音量が小さいですね… それでは、波形に注目してください。 この図では、波形が-1.0~1.0 の範囲で 示されていますが、この範囲に比べ、明らかに波形が小さいです。 余白が空きすぎです!
くいなちゃん: え、mp3ファイルがどこにあるかって? キニシナイ! では、とりあえず、この波形を -1.0~1.0 まで拡大してみましょう。 http://kuina.tes.so/6saiconf_9/img1.png はい、赤い矢印で示されたところが、確かに-1.0~1.0 の範囲に到達していますね。 素人さんは、この状態で完成、と思うでしょう。 しかし、それではダメダメですん☆
くいなちゃん: なぜなら、緑の2本線で示された範囲がメインの波形であって、 そこから飛び出た いわゆる魚の骨は、音量を上げる邪魔をするものだからです。 この魚の骨さえなければ、もっと音量が上がるのに…そう考えてください。
くいなちゃん: 市販のCD の音楽なんかは、こんな波形をしています。 http://kuina.tes.so/6saiconf_9/img2.png これは、全体が波形で埋まった、いわゆる海苔みたいなことになっているので、 業界でもしばしば 海苔 と言われます。 ここまで来ると、相当 音量が大きく聞こえます。 波形のピークは、魚の骨と同じなんですけどね。
くいなちゃん: で、素人さんは、この状態にしようと、魚の骨を無視して、 波形のレベルを上げるわけです。 しかし、これには問題があるのです。
くいなちゃん: http://kuina.tes.so/6saiconf_9/img3.png この図を見ればわかるのですが、青のラインが -1.0 ~ 1.0 の範囲をしめしています。 で、無理やり波形を拡大すると、青のラインを超えた部分が潰されて、 右の波形のようなことになってしまいます。これは、元の波形から変わっているので、 当然音も変わります。大抵、ノイズが入った汚い音になってしまいますですー
くいなちゃん: じゃあ、どうするのか。 それは、波形を潰すことなく、波形のピークを下げて -1.0 ~ 1.
隣の人がHadoopいじって遊んでたので,自分もちょっとやっておこうかなと思い少し触ってみました. 実際にマシンを借りて大規模な計算をするのは大変なので, 仮想マシンを作って遊んでみました.
仮想Hadoop環境の構築 巷ではVMWareが人気だったりしますが,今回はVirtualBoxを使ってみたいと思います. なぜかというとVirtualBoxをコンソールから扱えるVagrantで遊んでいたので, ちょうどパソコンにインストールされていたから. 以下,VirtualBoxは既にインストールされているものとして話を進めます.
Cloudera’s Hadoop Demo VM for CDH4に VMWare, KVM, VirtualBox用の各種イメージが置いてあるので, VirtualBox用のものをダウンロードしてきます. tar.gzで圧縮されているので解凍しましょう. 中にcloudera-demo-vm.vmdkというファイルが入ってます.
VirtualBoxを起動してHadoop用のマシンを新規作成します. 設定は以下のとおりに
デモイメージはCentOSベースらしいのでOSタイプとして RedHat**(64bit版)** を選択 メモリは3Gバイト以上 ハードディスクは後で設定するので,「起動ディスク」のチェックを外し割り当てしない 新規作成したら設定を少しいじります.
IO APICが有効化されていることを確認 ストレージにcloudera-demo-vm.vmdkを追加.この時 IDEコントローラ の下にいれること. ネットワークアダプタをホストオンリーアダプタに設定 これで実行できるようになります.
遊んでみる せっかくなので少し遊んでみる事にします. イメージの置いてあったページにあるHadoop Tutorialをやってみましょう. Hadoopの例として必ず最初に出てくるであろう,Word Countです.
まずソースコードを入力します.
package org.myorg; import java.io.IOException; import java.util.*; import org.apache.hadoop.fs.Path; import org.apache.hadoop.conf.*; import org.apache.hadoop.io.*; import org.apache.hadoop.mapred.*; import org.apache.hadoop.util.*; public class WordCount { public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { String line = value.
日本語構文解析器CaboChaをPythonから使ってみたメモ.
インストール CaboCha自体のインストールは公式のドキュメントを参照. ググれば他の人のレポートも出てくるはず.
CaboChaのソースコードを展開したディレクトリの中の pythonディレクトリにPython-bindingが入ってます. そこに移動した後,管理者権限で以下のコマンドを実行すればインストール完了.
python setup.py install 食べ方 解析結果を文字列出力 python/test.py に書いてあるとおり.
#!/usr/bin/python # -*- coding: utf-8 -*- import CaboCha # c = CaboCha.Parser(""); c = CaboCha.Parser() sentence = "太郎はこの本を二郎を見た女性に渡した。" print c.parseToString(sentence) tree = c.parse(sentence) print tree.toString(CaboCha.FORMAT_TREE) print tree.toString(CaboCha.FORMAT_LATTICE) 以下のような結果が得られれば成功.
<PERSON>太郎</PERSON>は-----------D この-D | 本を---D | 二郎を-D | 見た-D | 女性に-D 渡した。 EOS <PERSON>太郎</PERSON>は-----------D この-D | 本を---D | 二郎を-D | 見た-D | 女性に-D 渡した。 EOS * 0 6D 0/1 2.
TogetterはTwitterの投稿をまとめられる非常に便利なサイトですが, 編集画面が異様に使いにくいです. そんなわけで前回は 自動的に検索ボタンを押してくれるブックマークレットを書いてみました.
それをユーザスクリプトにして, ついでに編集画面の不便なところを修正してみました.
編集を便利にするユーザスクリプト スクリプトはGistにあげておきました.
https://gist.github.com/3953476 インストールはこちら Chrome拡張Tampermonkey で動作を確認しました. この拡張,ユーザスクリプトの管理ができてオススメです.
変更内容 ユーザスクリプトは編集画面に対して次のような変更をします.
画面レイアウトの変更 自動検索機能 重複削除・ソートの高速化 選択動作の変更 元に戻す機能 ショートカットキーの追加 画面レイアウトの変更 Togetterの編集画面のレイアウト,非常に使いにくいです. ツイート一覧をスクロールしようとしたら画面全体がスクロールしてしまって, 編集用のボタンが隠れてしまう,ということが編集中に何度もあってイライラします.
** 余計なものでごちゃごちゃし過ぎなんだ! **
** 僕は編集に集中したいんだ! **
編集と関係の無いヘッダやナビゲーションは要らないので消えてもらうことにしました. ツイートの一覧が画面いっぱいに表示され, 編集用のボタンは常常に画面上に表示されます.
自動検索機能 前回ブックマークレットで実現した機能です. 検索キーワードと一回あたりの読み込み回数を設定し, 「自動検索開始」ボタンを押しましょう. すると,繰り返し間隔を聞いてくるので秒単位で時間を指定しましょう. カウントダウンが始まり,周期的に検索・ソート・重複削除が行われます.
重複削除.ソートの高速化 Togetterのソートのスピードはびっくりするほど遅いです. 例えば,「劇的ビフォーアフター佐世保高専ラグビー部部室をリフォーム」には 1190個のツイートが含まれています. これを時間順にソートしてみたところ, 三回の平均で9.978秒(それぞれの結果は10.118秒, 9.925秒, 9.892秒)かかりました. 1000ツイート程度のソートに約10秒です.遅い!
ソート自体は数ミリ秒で終わるのになんでこんなに遅いというと,結果を画面に反映するのにjQueryのセレクタを大量に呼び出しているから. ソートのときに一回読み込んだものをキャッシュしておけばもっと速くなるはず.
ってことで自前で実装してボタンを置き換えました. 結果0.171秒(0.174, 0.177, 0.161)まで短縮することができました. 約58倍の高速化!
高速化とは直接関係ないけど, 「選択したところだけソート」にしました. ツイートを内容ごとに分類してるときとかに, 一部分だけソートできます(例:ロボコン死亡かるた). 何も選択されてないときは何もしません. 全体をソートしたい時は明示的に全選択する必要があります.
重複削除とかも実装しなおしました. 約200ミリ秒かかってたのが約20ミリ秒に高速化!
選択動作の変更 もともとの編集画面では,ツイートをクリックするとクリックしたツイートの選択状態が切り替わります. 他に選択しているツイートがある場合,そのツイートは選択されたままです. Excelとかではセルをクリックすると他のセルは非選択状態になるので, それに慣れているとなんだか違和感があるんですよね. そういうわけで,ツイートをクリックしたときはクリックしたツイートのみ選択されるようにしました. 複数選択ができないのも困るので, Ctrlキーと同時クリックでクリックしたツイートを全部選択, Shiftキーと同時クリックで範囲内のツイートを全部選択にしました. Excelとかと一緒ですね.
2012/10/25にくいなちゃんさん主催で開催された6さいカンファレンスのまとめ。 第7回は「Windowsのアプリをクラックしよう!(再)」です。
第4回「Windowsのアプリをクラックしよう!」はどこへいってしまったのでしょう? 頑張って探したけどこれしか情報が無い・・・?
昨日の 6さいカンファレンスは盛り上がりましたね (第4回 「Windowsのアプリをクラックしよう!」) 来週は、作曲講座をしようと思っています。 お楽しみに☆ #6saiconf
— くいなちゃんさん (@kuina_tesso) 9月 28, 2012 厳しい緘口令が敷かれているのか,参加者がくいなちゃんさんしか居なかったのか,そもそもそんなのなかったのか・・・.
勝手にまとめてしまったので、何か問題があれば@shogo82148まで。 (カンファレンスの内容にはくいなちゃんライセンスが適用されるらしいです.怖!)
—–キリトリセン—– くいなちゃん: 10/25(木) 21:00 から、第7回 6さいカンファレンスを開催します。 テーマは、「Windowsのアプリをクラックしよう!(再)」 です。 ** (再) と付いていますが、前回やった記憶はございません。 ** 参加されない方は、今のうちにご退場お願いします。 ROMでの参加も歓迎ですん☆ それでは、もうしばらくお待ちください。
くいなちゃん: それでは、第7回 6さいカンファレンスを開催します。 テーマは、「Windowsのアプリをクラックしよう!(再)」 ですん☆ しかし、これを開始する前に、いくつかの免責事項をお伝えしなければなりません。 (6さい的な事情)
くいなちゃん: まず、実際に既存の Windowsアプリをクラックする、という流れで 話を進めていきますが、実際にクラックを行っているわけではなく、 また画像も合成です。 実際に既存のアプリに対してクラックする行為は、 場合によっては犯罪となりますので、** 決してマネしないでください **。 本講座は、犯罪を助長する意図があるわけではなく、 むしろ攻撃側を知ることで、防衛スキルを身に着けようというものです!
マインスイーパ! くいなちゃん: はい、よろしいでしょうか。 では、本日クラックするアプリはこちらです! http://kuina.tes.so/6saiconf_7/img0.png
くいなちゃん: みなさん大好きな、マインスイーパですん☆ くいなちゃんは、マインスイーパが得意ではないので、上級をクリアする頃には、 時間が999になってしまいます。 そこで、この時間が経過しないよう、改造することを今日の目標としましょう。
くいなちゃん: まず、ollydbg というフリーソフトを起動します。 これは、主に アプリをクラックするのに使われるソフトです[要出典] http://kuina.tes.so/6saiconf_7/img1.png 画像は、ollydbg 上でマインスイーパを起動したところです。
コンシューマキー流出? 朝のTLにTwitter公式クライアントのコンシューマキーなるものが流れてきたので, なにか面白いことに使えないか セキュリティ的に何か問題になるのか 考えてみました.
コンシューマキーとは コンシューマキーとはクライアントの身分証眼書のようなものです. Twitterはコンシューマキーを使用してクライアントを識別します.
このコンシューマキーがどのように使われるのかを知るために, Twitterの認証方式であるOAuthについて簡単なスライドを描いてみました.
OAuthの認証は大きく分けて次の6ステップからなります.
認証開始 Twitterの使用を開始するためにユーザはクライアントに認証の開始を指示します 鍵の使用申請書の要求 開始指示を受けたクライアントは,コンシューマキーを利用して身分証明を行います 証明できたクライアントに対してTwitterは鍵の使用申請書を渡します ユーザの使用許可をもらう クライアントはユーザに使用申請書を渡し使用許可を求めます 使用申請書はウェブページのアドレスの形で渡されるので,多くの場合ここで自動的にブラウザが立ち上がります Twitter認証 ユーザはTwitterにパスワードを渡し,クライアントに使用許可することを伝えます ハンコを受け取る 使用許可の証としてPINコード(ハンコ)を受け取ります PINコードをクライアントに渡します 申請書を鍵を交換 クライアントは使用申請書とTwitterに渡し,鍵をもらいます 次回以降,クライアントは鍵を利用してTwitterにアクセスすることができます コンシューマキーが流出したということは, ステップ2のクライアントの身分証明の際に「自分は公式クライアントだ!」と名乗ることができてしまうという事です.
一般ユーザに対する影響 さて,これによる一般ユーザへの影響について考えてみましょう.
認証画面の偽装 ステップ4のTwitter認証の際,画面にはクライアント名が表示されます. 公式クライアントのコンシューマキーを使えばここに「Twitter for iPhone」「Twitter for Android」等, 公式クライアントの名前を表示することができてしまいます. これは間違えて認証してしまいそうですね!
・・・でも,ちょっと待ってください. ステップ4にたどり着くには,ユーザ自身が「ステップ1.認証開始」をする必要があります. これをするには,ユーザ自身がソフトをダウンロードして,解凍して,実行する必要があります. ** まともな ** な情報リテラシーを持ったユーザであれば,怪しいソフトは実行すらしませんよね?
偽装Webアプリ Webサイトであれば,アクセスしただけで「ステップ1.認証開始」をしたことにするのは技術的に難しくありません. ステップ1をクリアしてしまえば,流出したクライアントキーを使ってステップ4まで進むことができてしまいます. この時表示されるクライアント名は公式クライアントのものなので,悪意のあるサイトなのか本物なのか見分けが付きません.
ここで間違えてパスワードを入力し,使用許可を出してしまったとしましょう. Twitterにはクライアントアプリ(自分のPCで実行するもの)と Webアプリ(ブラウザを使うもの)の2種類があり,この違いによってステップ5での動作が少し変わります.
公式クライアントアプリに偽装していた場合, ステップ5でPINコードが表示されます. ** まともな ** なTwitterユーザであればこの時点で気が付きますよね? 一般的なWebアプリではPINコードが表示されることはまずありません. WebアプリのくせにPINコードが表示されたら認証を中止しましょう.
Webアプリに偽装していた場合, PINコードに当たるものが自動的にWebアプリに送られます. この送り先はアプリの作者にしか指定することができないため, 悪意のあるサイトの手にわたることはありません.
一般ユーザに対する影響まとめ コンシューマキーが漏れたからといって特別なことをする必要はありません.
** 怪しいアプリは実行しない ** ** 怪しいサイトでTwitterの認証をしない ** という,当たり前のことさえ気をつけていれば大丈夫です. このことさえ注意していれば鍵が盗まれることはありません. なんか最近犯罪予告の冤罪事件も発生しているので気を付けないといけませんね.
togetterでたくさんツイートをまとめたい Twitterは手軽に情報収集ができ他人とのコミニュケーションができる楽しいSNSですが、 古いツイートはしばらく経つとタイムラインや検索結果からはたどれなくなってしまいます。 過去のイベントに関するつぶやきを後から見たい、といった場合に不便です。
そこで登場するのがtogetterというサービス。 Twitterのツイートを引用して、「まとめ」を作ることができます。 Twitter上での議論やイベントに対するみんなの反応がわかりやすく見れるので便利です。 僕もJO_RI_botのツイートをまとめたりといろいろとお世話になってます。
簡単なまとめを作るのには非常に便利なtogetter。 しかし、ツイート数が多くなると少し大変です。 例えば何かのイベントのハッシュタグのついたツイートをまとめたい場合、 検索に現れるツイートの数には上限があるので、 漏れ無くツイートを集めるにはイベントの最中にまとめを作る必要があります。 togetterには自動更新機能がないので、数分毎に「検索」ボタンを押さなければなりません。 これは面倒だ・・・
ブックマークレットを書いてみたよ 面倒なので、自動的に検索ボタンを押すブックマークレットを書いてみた。
** ユーザスクリプトで書き直してみたよ! **
上のリンクをブックマークに登録しておき、togetterのまとめ作成ページを開くと、 検索ボックスのしたにテキストボックスとボタンが追加されます。 テキストボックスに検索ボタンを押す間隔(秒単位)を入れ、開始ボタンを押すと、 自動的に検索・移動・重複ツイートの削除・ソートをしてくれます。
スクリプト 元のスクリプトをgistにあげておきます。
{% gist 3883841 %}
ブラウザ拡張のほうが便利だろうけどブックマークレットとして実装しているのは、togetterのスクリプトやjQueryを自前のスクリプトから呼びたかったから。 ブラウザ拡張でも実現する方法はあるんだろうけど、調べるの面倒だからやってない。 DOMの操作だけでもなんとかなりそうだから、余力があれば書きなおすかも。
これ作るにあたって、togetterのソース見てたけど、重複削除やソートアルゴリズムがなんだか残念な感じ。 ツイート数に比例した回数だけjQueryのセレクタを呼び出している。 jQueryのセレクタって結構重い処理だし、オーダーが O( n^2 ) になるわけで・・・。 単なるソートにしては重すぎだろ、とは思ってはいたんだ。まさかこんな中身だとは。