Hatena::ブログ(Diary)

とて日記 このページをアンテナに追加 RSSフィード

2011-12-24

SPモードは端末固有IDを使えば良かったのか?  SPモードは端末固有IDを使えば良かったのか?を含むブックマーク

SPモードメール障害は設計ミス - とある技術屋の戯言

[続報]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

なので、事態はもっと複雑でした。

使っていないサービスについて、あーだこーだ推測して言及するのは

危険ってことですね。

.

*1:もう一つの理由として、サイト間で同じ値が使われることによるプライバシーの問題もあるが

*2iモードメールメールヘッダ偽装による なりすましメールが可能だった

*3Facebookで話していたところ、きちんと認証するにはSSLVPN使えよという話になった。

*4:僕はセキュリティの専門家じゃないから、この記事も恥ずかしいことを書いちゃっているかもしれない。きゃー(>ロ<)ノ

トラックバック - http://d.hatena.ne.jp/totttte/20111224

2011-08-19

言語プログラマ向けのExcelVBA 10の落とし穴 他言語プログラマ向けのExcelVBA 10の落とし穴を含むブックマーク

プロジェクトのメイン言語はイマドキのものを使っていたり、

チーム内ではBTSWeb上での進捗管理をしていても、

顧客とのやり取りや事務処理になんだかんだで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になります。

f:id:totttte:20110819134553p:image


四捨五入や切り捨てではなく偶数丸めになっているため、

このような挙動になります。

wikipediaによると

端数が0.5より小さいなら切り捨て、端数が0.5より大きいならは切り上げ、端数がちょうど0.5なら切り捨てと切り上げのうち結果が偶数となる方へ丸める

という仕様だそうで、金融界隈ではよく使われているそうです。

ですが、C言語の / と同じような結果を期待している人にとっては、

躓きポイントになりやすいので要注意。

C言語と同じような結果(切り捨て)を求めるのなら、 / ではなく \(円マーク)を

使いましょう。

f:id:totttte:20110819134554p:image


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

f:id:totttte:20110819134555p:image


また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が出力されます。

f:id:totttte:20110819164300p:image

これは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が出力されます。

f:id:totttte:20110819154206p:image

これは都度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のネタか、

本業のLinux/C++周りの話を書いているかもしれないです。

トラックバック - http://d.hatena.ne.jp/totttte/20110819

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人)

idふぁぼ数
katoyuu168268
yamifuu110489
maybowjing106723
Wing_of_Blood 98924
breeziness 98376
shy_azusa 94392
barekichi 94307
Uchimata 90977
ta_boP 90676
fune 88656
uinyun 79441
kegelstatt 78394
ynk 76323
myu65 76221
denimu 75417
yuiseki 71910
zeppel 69668
zero_zaki_ 68078
phji 67402
tyoro 65450
miru 62770
sagittarius72 62037
harsch 60661
ngtn310 57284
chch 56458
fuba 55620
ravi2beat 54794
sahiro 54742
mio_sakamoto 53824
yuzupepper 52613
shikaikilyou 51389
llcheesell 50999
myrmecoleon 49987
wyinoue 49163
Palpha 48849
kckm 48708
tato256 47663
onodera_sf 47277
a_halka 45788
0nasu 45561
kiwofusi 45544
isbsh 44742
rurero 43253
hironao 43215
VoQn 42419
yomayoma 42229
s1tutu985 41205
mizuami 41037
flashingwind 40693
syochin 40553
todesking 40430
wideangle 40084
sachi_volta 39575
seaki 38209
kossie89 38050
sween 38016
long_voyager 37776
watarumode 36770
c_cha 36696
balanco 36658
aotako 36547
GUMIMI 36495
saeko 36443
yisual 35585
jumitaka 35308
hironica 35083
ryukaiy 34740
Erl_ 34626
96neko 34590
nezike 33901
n_3 33786
halciondaze 33574
hawelka 32810
garandou 32759
maccolli 32660
shikachanman 32236
R_Kakolog003 31426
h_hiro 30900
tengennsui 30817
f_jiro 30672
Eccentricer 30541

30000万以下はこっち

favcount.txt


ちなみに全体をグラフにするとこんな感じ。

f:id:totttte:20090802120532p:image

・・・って、あまりにも偏っているので3万ふぁぼり以上の人をピックアップすると

f:id:totttte:20090802120533p:image

こんな感じになった。

ソースFavCounter.java(やっつけだからきちゃない)

調べようと思った経緯

Twitterって新参者にとってどんどん敷居が高くなるよねぇといったことを考えていた。

理由はfollowerが増えれば増えるほど読み切れない可能性が高くなって、

ツールで抽出したりふぉろー返ししない人が増えていくから。

そこで新参者でも手っとり早くfollower増やす方法について考えていた矢先、

僕が最近面白いなーと憧れてた山田にーちさんがfollow契機の集計をしていた。

f:id:totttte:20090802123233p:image

          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);  // ふっぽかわいいよ

まとめ

見やすさのために文字列改行することよくあるけど、

改行するとどの文字列に対してメソッドが実行されるのかを間違えやすいので要注意。

トラックバック - http://d.hatena.ne.jp/totttte/20090509

2009-05-08 [GAE/J]作業記録 このエントリーを含むブックマーク

作業メモなので、頭の中に思いついた順に書いていっているので文章のまとまりはないでs


5/3

今年のGWは GoogleAppEngineでなんかするぞーとは決めていたものの、

何をやるかは決めていなかったので、周りでTwitter-bot作りが流行っていたので、

Twitter4j使ってbot動かそうとする。

ローカルでは動くのに、サーバからcronで叩くと動かない

⇒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

@nezike セッション情報知っちゃうけど。。

2:14 AM May 6th webで nezike宛

@nezike DMおくた

2:16 AM May 6th webで

動かない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に動かなかったのはこれなのかー。

というわけで、

  • クッキーセッションを手打ちして自分で登録
  • 取得系はスクレイピング / 投稿系はTwitterAPI

にすればAPI制限を回避しつつ動かせることは判明。確認済み。

(でもクッキーセッションを手打ちはさすがに微妙w



まとめ

  • GAE/JのセキュリティマネージャーはGoogleオリジナルのものを積んでいる模様。
  • Twitterのスクレイピングは、ローカルで可能だがGAEからアクセスするとダメ(原因はhostかUser-Agentかなぁ(確認とれず))
  • TwitterAPI使えばいけるっぽい

今後

人のパスワードを(GAEのサーバとはいえ)保存するのは嫌なので、携帯版Twitterはやらないかなぁ。。

(自分専用クライアントなら作るかもしれんが、スクレイピングでない携帯版Twitterクライアントは

既にいくつか素晴らしいのがあるので、車輪の再開発は嫌だから)

(それOAuthでできるよ?なのかな、わからにゃー

なので、他のプログラム書いていこうかしらん。

tohaetohae 2009/05/08 07:46 OAuthは人様のパスワードをいただくことなく、認証が必要なAPIにアクセスするプロトコルです。現在セキュリティの問題が出ていますが、twitterのOAuthは復活してるようです。一応各言語に対応したライブラリもあるので、ある程度は簡単に試せそう。まぁGAEだと大変そうですが…

トラックバック - http://d.hatena.ne.jp/totttte/20090508