Hatena::ブログ(Diary)

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

2012-09-17 Swingで変数数縛りプレイ このエントリーを含むブックマーク

コードを読みやすくするにはどうしたら良いか?

この疑問に対する答えについて、最近の僕のスタンス

「頭のワーキングメモリ(レジスタの本数)を使わなくて済むコード」

だと考えるようになっている。*1

ワーキングメモリ削減を実現するサブミッションとして、

「分かりやすい変数名にしましょう」とか

「変数のスコープは出来るだけ狭くしましょう」とか

「変数を出来るだけ減らしましょう」といったアプローチ

どんな言語でも取り組みやすい対策だと思う。


そんなわけで最近は変数削減史上主義に走っている僕ですが、

GUI絡みのコードはどうしても変数数が多くなってしまいがちだった。

そこで無理やり削ってみたらどこまで減らせるかチャレンジしてみたくなった。

以下はID/PASS/ボタンの3点セットのよくあるログインフォーム

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class NonUseVariant {
    public static void main(String[] args) {
        new JFrame(){
            public void $() {
                setTitle("変数削減縛りプレイ");
                setBounds(100, 100, 320, 120);
                setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
                add(new JPanel(){
                    public JPanel $() {
                        setLayout(new BorderLayout());
                        add(new JLabel("UserName"), BorderLayout.WEST);
                        add(new JTextField(), BorderLayout.CENTER);
                        return this;
                    }
                }.$());
                add(new JPanel(){
                    public JPanel $() {
                        setLayout(new BorderLayout());
                        add(new JLabel("Password"), BorderLayout.WEST);
                        add(new JPasswordField(), BorderLayout.CENTER);
                        return this;
                    }
                }.$());
                add(new JButton("ログイン"){
                    public JButton $(){
                        if(getActionListeners().length >= 1) return this;
                        
                        addActionListener(new ActionListener() {
                            @Override
                            public void actionPerformed(ActionEvent e) {
                                System.out.println(
                                    ((JTextField)((JPanel)$().getParent().
                                    getComponent(0)).getComponent(1)).getText()
                                );
                            }
                        });
                        return this;
                    }
                }.$());
                setDefaultCloseOperation(EXIT_ON_CLOSE);
                this.setVisible(true);
            }
        }.$();
    }
}

どうしてもないと困る2つ(mainメソッド引数とActionListener#actionPerformedをオーバーライドしたときの引数)以外は削減することができた。保守性や見た目は犠牲になりました。

*1テストしやすいコードや、変更・保守に強いコードはまた別のスタンスがあるが

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

2012-03-21 NOT TVはこうすればおっぱじまっていたのでは このエントリーを含むブックマーク

「NOT TV」と検索すると、関連検索で

「失敗」が出てくるとか、「始まる前から終わっていた」とか、

タイムラインで言われていた。

僕もNOT TVはダメそうな予感がしているけども、

ダメ出しするだけなら簡単なので、

「こうすればnotテレビになれたんじゃないかなー」と思ったことを

つらつらと書いてみる。

価格戦略や掲載コンテンツについてダメなところはありそうだけども、

僕の守備範囲ではないので妙案は思いつかない。

あくまでシステム面での既存テレビとの差異化を検討してみる。


追っかけ再生機能

NOT TVはワンセグの10倍の画質で見れることがウリらしいけども、

画質をよくするくらいだったら、追っかけ再生機能を用意して欲しかった。

例えば、1チャネル目はリアルタイム放送、2チャネル目は30秒遅れの放送、

3チャネルは2分遅れ放送にする。3チャネルを纏めて受信できるように

なっていれば、追っかけ再生は実現可能だと思う。こうすれば

トンネル入っても続けて見られたのに。通勤時間帯にワンセグを

見たいけども、映りが途切れ途切れになるのが嫌で結局見ていないという

需要はそこそこある気がする。また、後述の機能と組み合わせれば、

面白いことができると考えている。


字幕APIテロップAPIを提供する

せっかくスマートフォンに乗せるのが前提の放送なのだから、

色んなAPIを提供しようって考えがあって欲しかった。

更に「動画部分と音声部分は受信しないでテロップのみ受信する」

という省エネモードがあれば、例えば「字幕にこんなキーワード

現れたら追っかけ再生を開始する」アプリが出てきたかもしれない。

NOT TVは番組を一緒に見て盛り上がることをウリにしているようだけど、

色んな連携アプリが出てくるようになっていれば、

見逃すこともなくなって盛り上がれたのでは、と思う。

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

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を使用しましょう。


整数の割り算で / を使用すると偶数丸めになる

Sub test()
    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で試してみる。

それでもダメだったら諦めるといったパターンです。

Sub test()
    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クロールしてる人たちが言ってたからなんか色々すごい。
Connection: close