2011-12-24
■ SPモードは端末固有IDを使えば良かったのか?

[続報]spモード障害、なぜ処理能力オーバーで「メールアドレスの置き換え」が起きたのか:ITproのブックマークコメントやTwitterのRTで、
「なんで端末固有IDで結びつけなかったの?」とか、
「MACアドレスで紐付ければいいものを」とか、
「動的なIPアドレスで紐付けるなんてやばすぎる」とかって、
コメントをたくさん見かけたので記事を書くことにした。
「固定のキーにすべきところを動的なキーにしてたのが間違いだった」と勘違いしている人がいるが、これは間違いである。
以前に携帯電話のかんたんログイン機能がセキュリティ問題として話題になった。これは端末固有IDが毎回同じ値を出していて、なりすましが容易になってしまうのが理由だ。*1 固定のIDには偽装されるという問題が常に発生しうる。もしSPモードのメールで端末固有IDを使用していたら、他人になりすましたメールを送受信可能になっていたかもしれない。*2 なので、端末固有IDだろうと、MACアドレスだろうと、IMEIだろうとそれを主キーにして紐付けてはいけない。
偽装を防ぐためには、サーバ-クライアント間で認証して割り振られたIDを使うべきだ。IPアドレスはTCPでやり取りする分には偽装はできないので、なりすまし防止という観点では○だっただろう。
では何が問題だったか、というと認証に使っていたIPアドレスが使い捨てでなく再利用されまくる、という点である。SPモードのIPアドレスがどれだけの帯域を使用していたかは把握していないが、範囲が狭いことが事故につながったのだ。 そして再利用されたIPアドレスによって他人のメールアドレスが表示された。(最善ではないと思うが)IPv6でアドレスを使い捨てていれば事故にはならなかったのではないか*3。
日経コンピュータの記事には
大きな理由の1つは、メールアドレスが端末固有のIDでなく、端末に振り出されたIPアドレスとひも付いていた点にある
と誤解を招きそうな書き方がされているが、これを鵜呑みにして固定-動的の差が問題だと考えてしまうと、次は自分がバグを作り込んでしまう番になるかもしれない。*4。
追記 12/24 8:04
どうやら本件はHTTPSを使っているそうです。意外だった…。
http://twitter.com/#!/HiromitsuTakagi/status/150310620942708736
なので、事態はもっと複雑でした。
使っていないサービスについて、あーだこーだ推測して言及するのは
危険ってことですね。
.
2011-08-19
■他言語プログラマ向けのExcelVBA 10の落とし穴

プロジェクトのメイン言語はイマドキのものを使っていたり、
顧客とのやり取りや事務処理になんだかんだでExcelやり取りしているところは、
結構あるんじゃないかなと思います。
けど、いざ作業自動化のためにVBAを使おうにも、
今更VBAの本をわざわざ買うってほどではないし、
かといってググってみてもプログラミング初心者向けサイトや、
類似サイトばかりヒットして疲弊するということがあるかもしれません。
というわけで、今回は既に2〜3言語以上は習得しているプログラマが、
初めてExcelマクロを書いたときに躓きやすいポイントをまとめてみました。
Integerは16bitである
範囲は-32768〜32767です。
意図して範囲を狭めているのでなければ32bitのLongを使用しましょう。
整数の割り算で / を使用すると偶数丸めになる
Dim a As Integer, b As Integer
a = 5 / 2
b = 7 / 2
Debug.Print "a=" & a & ",b=" & b
End Sub
上記のコードを実行すると、結果はa=2,b=4になります。
四捨五入や切り捨てではなく偶数丸めになっているため、
このような挙動になります。
wikipediaによると
端数が0.5より小さいなら切り捨て、端数が0.5より大きいならは切り上げ、端数がちょうど0.5なら切り捨てと切り上げのうち結果が偶数となる方へ丸める
という仕様だそうで、金融界隈ではよく使われているそうです。
ですが、C言語の / と同じような結果を期待している人にとっては、
躓きポイントになりやすいので要注意。
C言語と同じような結果(切り捨て)を求めるのなら、 / ではなく \(円マーク)を
使いましょう。
AndやOrは&&や||相当ではなく&や|相当だ
VBAのAndやOrは多くの言語にある&&や||相当ではありません。
またPythonのAnd,Orとも違います。
どこが違うかというと、Andを使用した場合、
前者の評価がFalseでも後者まで評価してしまう点が異なります。
つまり、他言語では可能だった
if (obj != null && obj.getHoge() > 4)
のような最初にNullチェックをしてその後中身の評価といった
書き方ができません。
以下のコードを実行するとエラーダイアログが表示されます。
Sub test() Dim a As Range ' セルaの値が1でないときに出力したい If Not a Is Nothing And a.Value <> 1 Then Debug.Print a.Value End If End Sub
またOrについては、前者がTrueでも後者まで評価してしまいます。
三項演算子相当のIIfの場合はtruePartとfalsePartの両方を評価してしまいます。
VB6ではAndAlsoやOrElseといった構文が新たに用意されているので、
そのうちVBAでも使えるようになるかもしれないです。(Excel2007では使えませんでした)
Forループの終了値指定部は都度評価されるけど再計算はされない
For文のto直後に書く終了値指定ですが、これは繰り返し判定としては評価されますが、
値については最初の1回しか計算されないようです。
これについては日本語で説明するよりもコードを読んだ方が理解が早いと思います。
Sub hoge() Dim i As Integer For i = 0 To 3 Debug.Print i i = i + 1 Next i End Sub
上記コードを実行した場合は、0,2が出力されます。
これはiが3を超えるかをループの都度チェックしているからです。
しかし、以下の例を見てみましょう。
Sub test() Dim s As String s = "abc" Dim i As Integer For i = 0 To Len(s) Debug.Print i s = "abcdefghi" Next i End Sub
上記のコードを実行した場合は、0,1,2,3が出力されます。
これは都度Len(s)を評価しているわけではないためです。
On Errorを同じ関数内で2度使用しない
VBAではファイルアクセスに失敗した時などのために、
エラー処理構文としてOn Error文が用意されています。
しかしこのOn Error、同じ関数内で2度使用すると2回目のエラーはキャッチしてくれません。
以下の例は、処理Aでチャレンジしてみてダメだったら処理Bで試してみる。
それでもダメだったら諦めるといったパターンです。
Dim a As Range, b As Range
On Error GoTo 処理スキップA
MsgBox a.Value
Exit Sub
処理スキップA:
MsgBox "処理A失敗のため処理Bでチャレンジ"
On Error GoTo 処理スキップB
MsgBox b.Value
Exit Sub
処理スキップB:
MsgBox "処理B終了のため、諦める"
End Sub
aとbに何も設定していないため、エラーになるのですが、
2回目は「処理スキップB」に飛ばずにVBAの実行時エラーになってしまいます。
対処としては関数を分けるか、
Resumeを使っていったんエラー情報をリセットしてあげましょう。
今回は文法編だけで終わってしまったので、次回はライブラリ操作の
落とし穴についてピックアップしていきます。
と思ったのですが、もしかしたら飽きてしまい趣味のJava7のネタか、
2009-08-02 お近くのふぁぼり数について調べてみた

ふぁぼられ数じゃなくてふぁぼり数について調べてみた。
Twitter新参者は片思いの有名人よりも、ふぁぼ魔と友達になれば
たくさんふぁぼってもらえてfollowing自然と増えるんじゃないかな!という魂胆です。
| 母数 | 26568ユーザ (totteのfollowingと followingのfollowing) |
|---|---|
| 集計日 | 2009/08/01の夜〜早朝にかけて |
| 集計方法 | http://twitter.com/users/show/SCREEN_NAME.xml内のfavourites_countを集計 |
3万ふぁぼ以上の人(82人)
30000万以下はこっち
ちなみに全体をグラフにするとこんな感じ。
・・・って、あまりにも偏っているので3万ふぁぼり以上の人をピックアップすると
こんな感じになった。
ソース→FavCounter.java(やっつけだからきちゃない)
調べようと思った経緯
Twitterって新参者にとってどんどん敷居が高くなるよねぇといったことを考えていた。
理由はfollowerが増えれば増えるほど読み切れない可能性が高くなって、
ツールで抽出したりふぉろー返ししない人が増えていくから。
そこで新参者でも手っとり早くfollower増やす方法について考えていた矢先、
僕が最近面白いなーと憧れてた山田にーちさんがfollow契機の集計をしていた。
http://favotter.matope.com/status.php?id=2891546982
やはり、ふぁぼったーの影響力は強いようだ。
ふぁぼられ数によってタイムラインの文字の色/大きさが変わるグリモンも出てくるし、
有名人がふぁぼりんこって言葉を使いだす時代ですし。
けれどふぁぼりんこって発言で400favられてる有名人は自分からは5favしかしてないので、
ふぁぼったークロール対象外。
これじゃあTwitter始めたばかりの人が
「とりあえず有名人をふぉろーしたけど、一方通行になってTwitter飽きて辞めてしまう」
なんてことになってしまいそう。
有名人の発言を読みたい目的でTwitterやってる人はfavられ数が多い人をfollowすればいいけど、
自分の発言が読まれたい人はたくさんfavってくれる人をfollowすればいいんじゃないかな!
って思いクロールしてみた。
考察
- ふぁぼ数上位者は色んな人のPOST読んでるなーって普段思っていた人たちが多かった。
- followingのfollowingが26000人いるのに驚いた。3か月ぐらい前に日本のTwitterアカウント数は8万程度ってTwitterクロールしてる人たちが言ってたからなんか色々すごい。
2009-05-09 [Java] Stringで今日やったミス

以前にも同じミスをしたことあるので戒めも込めて投稿。
for(String animal : Arrays.asList("fox dog wolf horse sheep deer cat nyaa".split("\\s"))) System.out.println(animal);
・・・と書いていて、リストが長くなってきたので、Eclipseでリストの途中を改行してみた。
for(String animal : Arrays.asList("fox dog" + " wolf horse sheep deer cat nyaa".split("\\s"))) System.out.println(animal);
実行結果
fox dog[Ljava.lang.String;@1546e25
"fox dog" + " wolf horse sheep deer cat nyaa".split("\\s");
は、
"fox dog" + 文字列配列
を連結したことになってしまう。対処として、
("fox dog" + " wolf horse sheep deer cat nyaa").split("\\s");
のように括弧でくくればおk
修正後
for(String animal : Arrays.asList(("fox dog" + " wolf horse sheep deer cat nyaa").split("\\s"))) System.out.println(animal);
実行結果
fox dog wolf horse sheep deer cat nyaa
他のStringメソッドでも同様の注意をしないといけない
String hoge = "ふぉくすけのしっぽかわいいよ".substring(6); System.out.println(hoge); // しっぽかわいいよ
String hoge = "ふ" + "ぉくすけのしっぽかわいいよ".substring(6); System.out.println(hoge); // ふっぽかわいいよ
まとめ
見やすさのために文字列改行することよくあるけど、
改行するとどの文字列に対してメソッドが実行されるのかを間違えやすいので要注意。
2009-05-08 [GAE/J]作業記録

作業メモなので、頭の中に思いついた順に書いていっているので文章のまとまりはないでs
5/3
今年のGWは GoogleAppEngineでなんかするぞーとは決めていたものの、
何をやるかは決めていなかったので、周りでTwitter-bot作りが流行っていたので、
Twitter4j使ってbot動かそうとする。
⇒cronの設定うまくいってないのかな? と思いとりあえず断念。
(実はcronはうまく動いてたけど、別問題だったことが後で判明する
5/5
botいまさら作っても、もう既存に優秀なbotがたくさんあるし、使わないだろうなーと思う。
(mtwitter.comはページ遷移で挙動おかしいところあるし、何よりもAPI制限なし&&アイコンがあるクライアントが欲しい!
んでAPI制限ひっかからないやつを使いたい
⇒途中 JDOの設定で結構手こずる(JDO使うの初めてだったので
⇒さっそくパケットキャプチャしながらスクレイピングのクライアント作る
⇒ HttpURLConnection.setFollowRedirects(false)でSecurityManager()でエラー
⇒GAEは色々制限あるらしいと聞いていたけどこれか!
⇒Googleが推奨してきてる方法 (URLFetchでアクセス)とやらを試す
⇒こちらではリダイレクトがうまくいく
⇒ローカルで動いた!
当時のPOST
自作くらいあんt
2:09 AM May 6th mobile webで
2:14 AM May 6th webで nezike宛
@nezike DMおくた
2:16 AM May 6th webで
動かないw これはひどいw
2:20 AM May 6th webで
ローカルだといけるんだけどな、、
2:31 AM May 6th webで
GAEからアクセスすると403…
3:11 AM May 6th mobile webで
というわけで、ローカルで動くけど、GAEからアクセスするとだめぽ。
5/6
5/6 Google App Engine 対応 の Twitter4J 2.0.1 リリース
きゃーーー、5/3に動かなかったのはこれなのかー。
というわけで、
にすればAPI制限を回避しつつ動かせることは判明。確認済み。
(でもクッキーセッションを手打ちはさすがに微妙w
まとめ
- GAE/JのセキュリティマネージャーはGoogleオリジナルのものを積んでいる模様。
- Twitterのスクレイピングは、ローカルで可能だがGAEからアクセスするとダメ(原因はhostかUser-Agentかなぁ(確認とれず))
- TwitterAPI使えばいけるっぽい
今後
人のパスワードを(GAEのサーバとはいえ)保存するのは嫌なので、携帯版Twitterはやらないかなぁ。。
(自分専用クライアントなら作るかもしれんが、スクレイピングでない携帯版Twitterクライアントは
既にいくつか素晴らしいのがあるので、車輪の再開発は嫌だから)
(それOAuthでできるよ?なのかな、わからにゃー
なので、他のプログラム書いていこうかしらん。
tohae
2009/05/08 07:46
OAuthは人様のパスワードをいただくことなく、認証が必要なAPIにアクセスするプロトコルです。現在セキュリティの問題が出ていますが、twitterのOAuthは復活してるようです。一応各言語に対応したライブラリもあるので、ある程度は簡単に試せそう。まぁGAEだと大変そうですが…








