4月
27
2009
3

TwitMgr 更新。Twitter フレンズの管理が可能になりました。

一部の人にベータテストをお願いしつつ開発を進めていた TwitMgr Ver 1.1.0 ですが、このたび無事にリリースしました。

Ver 1.1.0 では従来のフォロワ管理に加えて、フレンズ管理を追加したので、フォロー外しなどが簡単に行えるようになっています。
他にも、一覧できる情報量が大幅に増え、ブロックする人/フォローを外す人の判断がしやすくなったかと思います。

さて次はどうしようかという話なのですが、そのベータテストをやってくれた某ユーザの方から、Your Twitter Karma なるものを教わって、このサイトの一覧性の良さ (画面キャプチャ) に惚れたので、このサイトを越えるものにしようと思います。

具体的には、Karma のようなアイコン表示でまず見れるのと、それに加えてリスト表示に切り替えられたり、一括チェックした上で一括処理できたりといったイメージです。
もちろん、ソートしたりフィルタリングしたりできるようにしたいですね。
そこまで出来れば、かなり上等じゃないでしょうか。

Written by Otchy in: Development | タグ:
4月
25
2009
2

Twitter ダイレクトメッセージ誤配送の原因を推測してみた

Twitterの最新のバグ: "ダイレクトメッセージの誤配達"」という記事があって、Twitter のダイレクトメッセージ (DM) に超重要な情報を流すような人は、セキュリティ意識が足りてないよね~、なんて事を思っていた矢先、自分のアカウントにどうも「誤フォロー」では無いかと思われるお知らせメールが届きました。

フォローしてきたのは外人さんなんですが、TL みても普通の人だし、フレンズ数も普通。その後何度か見てもフレンズがばんばん増えているわけでもなく、ボットやスパムのたぐいではなさそう。
じゃあ、本当に興味を持ってフォローしてくれたのかというと、そんな要素は欠片も感じません。

唯一特徴的な点があるとすれば、たかだか 1 時間前の発言がその人の最初の発言で、「twitter twitter twitter! I finally joined :d」となっている事でした。どうも、すごい最近 Twitter を始めた人のようです。
そこで、このフォローが誤フォローだったとすると、DM の誤配信と同じ原因ではないかと気づきました。その原因を推測してみます。

Twitter のアカウントを特定する ID として公開されているものに数字の ID と文字列の ID があります。
文字列の ID も全体で唯一のものなので、API の呼び出し時に指定したりもできるのですが、元々本来のプライマリーキーは数字の方であると思われます。
そしてその数字が 32bit で管理されていた場合に、その数値を使い切ってしまったのでは無いでしょうか?*1

Twitter の利用者数はまだまだ 1 億にも届かないですし、32bit あれば約 43 億まで扱えるので不思議に思うかも知れませんが、実際に利用されているアカウントだけではなく、ボットやスパマによって日々作られ、消されているアカウントがそれこそ膨大な数存在するはずです。

プライマリキーを使い切ってしまうと何が起こるかというと、またゼロに戻ってカウントし直しとかになり、プライマリーキーの重複が発生してしまいます。
根本的にはこれが DM 誤配送や、誤フォローの原因になったのではないかと思われます。

もちろん、Twtiter 側もただ手をこまねいていたわけではないでしょうから、DB やカラムを追加するなり、文字列 ID を活用するなりして、対処したのだと思いますが、修正に漏れがあってプライマリーキーだけで判断する古い処理が残ってしまい、それが原因になったというわけです。

さらに言うのであれば、プログラミング的なミスではないと思います。
さすがにそれは相当頑張ってテストをしてからリリースしているはずなので、むしろ本番サーバへのリリース時にミスがあったのではないでしょうか?

Twitter を運用しているサーバが全部で何台あるのかは知りませんが、相当な台数のサーバで平行してプログラムが稼働していると思われます。
前述の修正プログラムを適用する時に、適用が漏れてしまったサーバ、適用に失敗した事に気づいていなかったサーバが存在したとすると、”一部に” 誤配送があった事にも説明がつくのです。

最初の誤フォローの話に戻ってみると、そのアカウントはかなり新しいものでした。
すなわち上記の推測が正しいとすると、最近友達何人かで Twitter を始める事になってお互いをフォローしあったんだけれども、最近の新しいアカウントはプライマリーキーが一周した後のアカウントだったため、同一のプライマリーキーを持った別アカウントをフォローしてしまった、というストーリーが考えられるわけです。

本当の原因は全然違うかも知れませんが、Twitter 側が「問題の原因は“弊社のサービスにおける基本的データの不整合性”にある」と言っている事からも、上記の推測もあながち外れていないように思うのです。

もし上記の推測が当たっていて、誤フォローが本当に発生したとすると、Twitter の発表とは裏腹に、まだ不具合が残っているかも知れません。
そもそも、公開を前提とした Twitter と、例えば Gmail のような非公開を前提としたサービスでは、設計思想からして異なっていて当然です。
今回の件に限らず、Twitter の DM が漏れる可能性は常にあると考えるべきです。
Twitter の DM 機能はあくまでオマケ機能として捉え、本当に重要な情報を Twitter でやり取りするのは控えた方が良いですね。

*1
実際の数値を見るとまだせいぜい 3000 万台がいいところなので、全然関係ないように見えるかも知れません。ですが、真のプライマリーキーは表に見せないのが普通なので、表に見ている数字の ID 自体、真のプライマリーキーから、アカウント作成時にエラーで弾かれたレコードを除いた総数なのだろうと考えています。
その場合であっても、真のプライマリキー自体はエラーで弾かれるたびに 1 つずつインクリメントされると思われるので、同様の論法が成り立ちます。

Written by Otchy in: Technology | タグ:
4月
22
2009
2

サイトの壁紙変えました

桜の季節も終わったので、桜から新緑へと壁紙を変更しました。

今回も、高画質壁紙写真集無料壁紙さんから写真をお借りして加工しています。

こういう壁紙サイトって、こんな使われ方は想定していないじゃないかなぁと思うんですね。
それこそ昔は、こんな大きな画像を背景に使うなんてありえなかったですし。
時代は変わったもんですね。

それだけのエントリでした。

Written by Otchy in: Information |
4月
19
2009
3

Google App Engine for Java 開発環境を USB メモリで持ち歩く (3)

Google App Engine の Java 開発環境を USB メモリに入れてどこでも開発できる環境を作りました。
レポート第 3 弾。GAE プロジェクトを作成し、最初の Hello world! が表示できるようになるまで。

Google App Engine SDK の設定

最初に Google Plugin をインストールした時と異なるドライブレターで USB メモリを使用している場合、Google App Engine SDK のパスがリンク切れを起こしてしまっています。
自動的にドライブレターの設定を書き換えられるのがベストなのですが、この設定はどうやら Plugin の設定ファイルに、XML がシリアライズされて保存されているため、安全な書き換えは事実上不可能です。
仕方がないので、下記の手順で複数の SDK を登録しておき、ドライブレターの異なる環境によってそれぞれ使い分けるようにします。

ウィンドウ → 設定 → Google → App Engine → 追加ボタン → 参照ボタン → U:\eclipse\plugins\com.google.appengine.eclipse.sdkbundle_1.2.0.*\appengine-java-sdk-1.2.0 → 表示名 : 任意 (自宅デスクトップ等) → OK ボタン

また、Web Toolkit も使用する場合は、同様の手順で SDK を追加する必要があります。

JRE 自体は、Eclipse 起動時にオプションで指定したものを共有できるのでいいんですが、この Google App Engine の SDK だけはスマートに解決できていないです。
良い解決方法を知っている方がいたら是非教えて下さい。

プロジェクトの新規作成

続いて Hello World を作ります。最初に作るのは Hello World と相場が決まっているのです。オールドタイプですいません。
ではまず、ツールバーのnew_app_buttonボタンをクリックして、ウィザードを起動します。

プロジェクト名 : HelloWorld → パッケージ : helloworld → Use Google Web Toolkit のチェックを外す → Use Google App Engine の Configure SDKs を選択 → 有効な SDK が選択されている事を確認 → OK ボタン → 完了ボタン → ちょっと待つ → 最低限必要なファイルが展開される

なんとこれだけで、Servlet クラスや web.xml はもちろん、その他に最低限必要なファイル一式が全てそろった状態でプロジェクトが作成されます。
Hello World を作成するのに、特別な何かをする必要はありません。

サーブレットコンテナの起動とデバッグ

さあ、いよいよサーブレットとして動作させる時が来ました。また、開発環境を名乗るからには当然、デバッガが正しく動作している事も確認する必要がありますね。

実行 → デバッグの構成 → Web アプリケーション → HelloWorld → デバッグボタン → 初回起動時は Windows ファイアウォールの警告 → ブロックを解除する

これでエラーが発生せず、コンソールに「The server is running at http://localhost:8080/」と表示されれば OK です。
なんて楽なんでしょう。全てのお膳立ては、あらかじめ Google Plugin が済ませておいてくれています。

src/helloworld/HelloWorldServlet.java を開く → 適当にブレークポイントを設定する → ブラウザで、http://localhost:8080/ を開く → HelloWorldServlet リンクを選択 → ブレークポイントでプログラムの実行が一時停止する事を確認

これで問題がなければ、デバッガも正常に動作しています。
ここまでで一応、開発環境の構築は完了です。後は普通の Java やサーブレットの作法に則って、好きなライブラリを追加するなり、好きなフレームワークを導入するなり、開発を進める事が出来ます。

なお、前述の通り、ドライブレターが異なる環境で動作させようとすると、Google App Engine SDK のパスが切れてエラーになってしまいます。
その場合は、Google App Engine SDK を再設定するだけで問題なく動作させられるので、あわてる必要はありません。
ただ、毎回設定し直すのは面倒ですので、もし開発を行う環境で管理者権限があるようだったら、あらかじめ USB メモリのドライブレターを固定させておくのが楽です。

Win +R → diskmgmt.msc → Enter → 対象のドライブを右クリック → ドライブ文字とパスの変更

この設定を 1 回やっておけば、次から同じ USB メモリを指した時はそのドライブに固定されてマウントされるはずです。
様々な環境で他のドライブとかぶらない文字を選んでおくと良いでしょう。

今後の話

3 回に分けて掲載してきた、Google App Engine for java 開発環境の構築はいったんこれで終了です。まあ、正直なところあまり面白くない内容ですよね。
今後、Google App Engine サーバへのデプロイとか、Google App Engine SDK による、Google アカウントの利用とか、DB の利用とかそんなところも、上手く動かせたらレポートしたいと思います。

それと、Java とは直接関係ないのですが、開発環境を USB に入れたついでに、Firefox も USB に入れるといいなぁとか思いました。
他にも、(個人的な) 需要がありそうだったら、PHP 開発環境を USB に入れるとか、MySQL を USB に入れるとかそんなのにも挑戦してみたいですね。PHP なんかの場合は、Apache も入れないといけないので難易度が上がりそうです。

Written by Otchy in: Development | タグ: , , ,
4月
19
2009
2

Google App Engine for Java 開発環境を USB メモリで持ち歩く (2)

Google App Engine の Java 開発環境を USB メモリに入れてどこでも開発できる環境を作りました。
レポート第 2 弾。USB メモリ向け設定を施した Eclipse のインストールから、日本語化を行って Eclipse が起動するまで。

Eclipse のインストール

Eclipse 公式ページから、Eclipse 本体をダウンロードします。最新版である、3.4 系を使用します。

Eclipse IDE for Java Developers → ミラーサイトを選択

ダウンロードしたファイルを解凍して、USB メモリにコピーします。

U:\eclipse

ここでいったん、USB メモリ上の JRE で Eclipse が起動するかの確認をしたいと思います。
Eclipse の起動時パラメータに JRE のパスを指定する事で、任意の JRE で Eclipse を起動する事が出来るのですが、USB メモリでは困った問題が 1 つあります。
USB メモリを利用する環境によってドライブレターが異なるため、ショートカットなどが利用できないという事です。

そこで、VB Script を使用してこの問題を解決します。
以下の内容を eclipse.vbs という名前で USB メモリのルートに保存して下さい。
このスクリプトは、USB メモリを使用している環境に合わせてドライブレターを取得した上で、JRE とワークスペースを指定して Eclipse を起動します。 

Set fso = CreateObject("Scripting.FileSystemObject")
Set shell = CreateObject("WScript.Shell")
drive = fso.GetDriveName(WScript.ScriptFullName)
shell.CurrentDirectory = ".\eclipse"

eclipse = drive & "\eclipse\eclipse.exe"
javaw = drive & "\jdk\jre\bin\javaw.exe"
ws = drive & "\workspace"
cmd = eclipse & " -vm " & javaw & " -data " & ws

Call shell.Run(cmd, 1, False)

ここで作成した、eclipse.vbs を起動すると、USB メモリ上の JRE で Eclipse が起動するはずです。
無事に Eclipse が起動して Welcome 画面が表示されれば OK です。

Google Plugin for Eclipse のインストール

いよいよ、GAE 開発環境のインストールを行います。
起動した Eclipse 上からネットワークインストールが可能なので、下記の通り実行します。
参考) Google App Engine – Installing the Java SDK

Help → Software Updates → Available Software タブ → Add site ボタン → Location: http://dl.google.com/eclipse/plugin/3.4 入力 → OK ボタン → http://dl.google.com/eclipse/plugin/3.4 にチェック → Install ボタン → ちょっと待つ → Next ボタン → I accept … にチェック → Finish ボタン → しばらく待つ → Yes ボタン → Eclipse 再起動

以上で、Google Plugin のインストールは完了ですが、Eclipse にはもう少しプラグインを足しておきます。
個人的には重要度の高いプラグインを導入していますが、この作業は必須でないので、好みによって飛ばしたり、別のプラグインを追加しても良いでしょう。

Eclipse の日本語化 (Pleiades)

Eclipse が起動していたらいったん落とします。
Pleiades 公式サイトより、プラグインをダウンロードして、eclipse をインストールしたフォルダ以下に展開します。

Pleiades 本体ダウンロード → 安定版 1.3.0 → pleiades_1.3.0.zip 解凍 → plugins フォルダ、features フォルダを U:\eclipse 以下にコピー

Pleiades を有効にするために U:\eclipse\eclipse.ini を編集し、最終行に下記を追加します。

-javaagent:plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar

ついでなので、昨今の PC スペックに合わせて eclipse.init を多少カスタマイズしておきます。
この辺は各自の環境に合わせて、調整が必要です。

-Xms512m
-Xmx512m

Pleiades を利用する際は、その仕組み上、プラグインが追加されるたびに clean オプション付きで Eclipse を起動しなければなりません。
そのため、Pleiades にはそれを行うためのバッチファイルが同梱されていますが、USB メモリ上では上手く動作しません。

ですので、eclipse.vbs をコピーして、eclipse-clean.vbs を作成しておきます。

Set fso = CreateObject("Scripting.FileSystemObject")
Set shell = CreateObject("WScript.Shell")
drive = fso.GetDriveName(WScript.ScriptFullName)
shell.CurrentDirectory = ".\eclipse"

eclipse = drive & "\eclipse\eclipse.exe -clean"
javaw = drive & "\jdk\jre\bin\javaw.exe"
ws = drive & "\workspace"
cmd = eclipse & " -vm " & javaw & " -data " & ws

Call shell.Run(cmd, 1, False)

作成した eclipse-clean.vbs を使用して Eclipse を起動し、メニューなどが日本語化されていたら、Pleiades の導入は完了です。
clean 起動はかなり時間がかかるので、必要時のみ行うようにした方が良いです。
すなわち、eclipse-clean.vbs は、プラグインを追加するごとに 1 回ずつ使用するスクリプトという事です。

全角スペース、タブの可視化 (JStyle)

Eclipse が起動していたらいったん落とします。
JStype 公式サイトより、プラグインをダウンロードして、eclipse をインストールしたフォルダ以下に展開します。

ダウンロード → Eclipse 3.4.2 用 → jstyle_3.4.2.3.zip 解凍 → plugins フォルダを U:\eclipse 以下にコピー

プラグインの追加を行ったので、1 回 eclipse-clean.vbs で起動させます。
起動後は、Jstyle 推奨の設定を行っておいた方が良いでしょう。

ウィンドウ → 設定 → 一般 → 外観 → 色とフォント → 基本 → テキスト・フォント→ 変更ボタン → MS ゴシック → 標準 → 9 ポイント → OK ボタン → OK ボタン

Written by Otchy in: Development | タグ: , , ,

Powered by WordPress | Aeros Theme | TheBuckmaker.com