iPhone 3GSの契約を見直した

iPhone 3GSを発売日に購入してから2年が経ち、契約更新月を迎えたので、近所のSoftbank Shopに契約内容の見直しに行ってきた。というのも、基本使用料の契約は自動的に更新されることになっており、また2年縛りの契約に突入してしまうことを知っていたからだ。

まず自分の契約内容は以下

  • 現在加入中のプランは「ホワイトプラン(i)」
  • 基本使用料割引として「2年契約(キャンペーン)」
  • パケット割引サービスとして「パケットし放題 for スマートフォン(キャンペーン)」

店員さんの案内によると、こうだ。

「2年契約(キャンペーン)」と「パケットし放題 for スマートフォン(キャンペーン)」はセット。どちらか一方だけをやめることはできない。

で、僕が今回やめたかったのは「2年契約(キャンペーン)」だ。ではそれとセットになる「パケットし放題 for スマートフォン(キャンペーン)」とは何か。

このサービスはパケット量によって1,029〜4,410円の料金が自動調節されるサービス。ほぼ使わなかった月は1,029円となる。通常の「パケットし放題フラット」というプランでは必ず料金は4,410円固定となる。ほぼ使わなかったとしても、4,410円。

つまり2年契約をやめるデメリットは、パケットサービスを使わなくても4,410円必ず取られる、という1点だけだ。そして、僕のようなヘビーユーザーは当然のように毎月Max料金までパケットサービスを使っているので、結果としてこれはデメリットにならない。

Softbankとの契約を今後2年続ける予定がないiPhoneユーザーは、契約更新月に2年契約をやめても全く問題ない、という結論に至ったのでこれを共有したかった次第。


…とはいえ、あくまでこれは2011年6月25日時点で、個人から発信されている情報です。現時点での正しい情報はSoftbank Shop、およびSoftbank公式サイトからご自身でご確認ください。

JavaScriptの変数についての考察

最近、Code Complete第2版という本を読んでいて、「変数の使用(第10章)」がとても為になる内容だったので、会社のチームメンバーに少しそのことについて話したら、JavaScriptについて興味深い話をすることができた。

第10章の内容について、議論の対象となった部分を引用する。

10.3 変数の初期化のガイドライン

変数は最初に使用する場所の近くで初期化する

リスト10-2: 悪い初期化(Visual Basic)
' すべての変数を宣言する
Dim accountIndex As Integer
Dim total As Double
Dim done As Boolean

' すべての変数を初期化する
acountIndex = 0;
total = 0.0
done = False
...

' accountIndexを使用するコード
...

' totalを使用するコード
...

' doneを使用するコード
While Not done
...
…中略

リスト10-2の例では、done変数を宣言した後、done変数を使用するコードが実行されるまでに、done変数が変更される可能性がある。

…中略

もう1つの問題は、すべての初期化を1か所にまとめると、done変数は最後の方でしか使用されないにもかかわらず、すべての変数がルーチン全体で使用されるという印象を与えることだ。

…中略

これは、「関連する作業を1つにまとめる」という近接の法則の一例である。

なるほどなるほど。しかし僕は普段の業務でプログラミング言語らしきものはJavaScriptしか使わないので、JavaScriptに置き換えて考えよう。

var accountIndex = 0,
    total = 0,
    done = false;
// accountIndexを使用するコード
...

// totalを使用するコード
...

// doneを使用するコード
while(!done) {
    
}
...

これが本書で「悪い例」とされているコードをJavaScriptに置き換えたコードだ。しかし関数の先頭で var hoge = 0, fuga = false; のようにして変数をまとめて宣言(&初期化)するのはJavaScriptではよく見られるコードだ。あのjQueryですらそのような記法を多用している。
JavaScript: The Good Partsによると

ほとんどの言語では、変数は一般的に最初に利用される場所で定義するのが最も良い方法だ。しかしこれは、ブロックスコープを持たないJavaScriptでは好ましくない。すべての変数は、それぞれの関数の先頭で定義したほうが良い。

とある。そう、JavaScriptはブロックスコープを持たない({}でくくられた部分限定の変数スコープ)といういわゆる変態言語であり、変数のスコープを生成するのは関数ブロックのみだ。それが理由で、変数はまとめて関数の先頭で宣言するという記法がベストプラクティスとされている。

さてしかし、Code Complete第2版による「変数は最初に使用する場所の近くで初期化する」ほうがよいという理屈の続きはこうだ。

10.4.1 変数の参照はまとめて

変数を参照してから次に参照するまでのコードは、「脆弱性の窓」(無防備な時間帯)である。その窓では、新しいコードが追加されたり、何気なく変数が変更されたり、変数に含まれていなければならない値が忘れられてしまったりする。変数の参照は、常に近いところにまとめて局所化するのが望ましい。

…中略

これを測定する方法は、変数の「持続間隔」を計算することである。

…中略
リスト10-6: 1と0の持続間隔(Java)
a = 0;
b = 0;
c = 0;
b = a + 1;
b = b / c;

この場合、bの1つ目の参照と2つ目の参照の間にコードが1行あるので、その持続間隔は1である。bの2つ目の参照と3つ目の参照の間にはコードがないので、その持続間隔は1である。bの2つ目の参照と3つ目の参照の間にはコードがないので、その持続間隔は0である。

…中略

リスト10-6では、bの平均持続間隔は (1 + 0) / 2 = 0.5 である。変数の参照を近くにまとめると、コードの読み手がコードをセクションごとに読んでいけるようになる。

…中略

10.4.2 変数の「寿命」はできるだけ短く

変数の持続間隔に関連して、変数の「寿命」という概念がある。変数の寿命とは、変数が存続する期間内に存在するステートメントの合計である。

…中略

変数の持続間隔とは異なり、変数の寿命は、最初に参照されてから最後に参照されるまでの変数の使用回数を計算に入れない。変数が最初に1行目で参照され、最後に25行目で参照された場合、変数の寿命は25(ステートメント)である。

…中略

変数の持続間隔と同様に、変数の寿命もできるだけ短くする、つまりステートメントの数を少なくすることが目標となる。持続間隔と同様に、ステートメントの数を少なくすると、脆弱性の窓が小さくなるという利点がある。

…中略

寿命を短くするもう1つの利点は、コードを正確に把握できることである。変数に10行目で値を代入し、45行目まで使用しない場合、2つの参照の間に空いている空間は、変数がその間に使用されていることを暗示する。

…中略

変数の寿命が短いと、コードが読みやすくなる。読み手が一度に頭に入れなければならないコードの行数が少なければ少ないほど、コードは理解しやすい。

変数には「平均持続間隔」と「寿命」という概念があるという。そしてそれらが短くなった方がコードの読み手にとって読みやすいコードになるという。

去年、僕がとある案件で数千行に及ぶJavaScriptを書いた際、最も頭を悩ませたのはコードを頭に入れることだった。機能を追加・修正するために一度に頭に入れなければならないコードが多すぎたため、開発が進めば進む程、コードの修正は困難を極めた。

プログラミング初心者が誰しも一度はぶつかる壁なのかもしれない。コードの分割をはじめとする、コードの設計の重要性を肌で感じた瞬間だった。
だからこそ、上記の「読み手が一度に頭に入れなければならないコードの行数が少なければ…」というくだりに深く納得したのだった。

さて、ではJavaScriptにおいて「変数の寿命を短くする」ことと「関数の先頭ですべての変数を宣言する」ことは両立するのだろうか?これについて隣席の@keiskeyの意見はこうだった。

関数1つの長さ自体を短くしてしまうのがいいのでは。Google Closure Libraryのコードを見ていると、中身が2行しかないメソッドに長々とした名前が付いていたりする。そんな長い名前を付けるんだったら直接コードを書いてしまえばいいやん、と思うけど、「変数の寿命」のポリシーをもって書かれていると考えると合点がいく。

なるほど…と再び納得するとともに、「この話、共有してよかった」と思った。

例えば上述(リスト10-2)のコードを一つの関数だと考えるとこうなる。

function Account() {
    var accountIndex = 0,
        total = 0,
        done = false;
    // accountIndexを使用するコード
    ...

    // totalを使用するコード
    ...

    // doneを使用するコード
    while(!done) {
        
    }
    ...
}

この関数をクラス風に書き直し、機能分割するとこういう感じになる。

function Account() {
    // コンストラクタ
    ...
}
Account.prototype = {
    getAccountIndex: function() {
        var accountIndex = 0;
        // accountIndexを使用するコード
        ...
        return accountIndex;
    },
    getTotal: function() {
        var total = 0;
        // totalを使用するコード
        ...
        return total;
    },
    checkStatus: function() {
        var done = false;
        // doneを使用するコード
        while(!done) {
            ...
        }
    }
}

prototypeにぶら下げたメソッド1つ1つを短くまとめて上手に機能分割することが、限りなく正解に近いのではないかと思った次第。

僕はプログラマと呼ばれる職種ではないのだけれど、プログラミングに関わる人間として、こういった考察はとてもおもしろいと感じる。また何か同じような話があったら書いていきたい。

GWにライブやります

マイギター 今年2つ目のエントリーがこういう内容になるとは自分も想像していませんでした。来るGWの5/4(水)に私がギタリストとしてライブに出演します。
鈴木・ロック・フェス2DAYS」と称されたイベントで、THE YELLOW MONKEYのカバーバンドをやります。

会場はWild Side Tokyoという新宿の靖国通り沿いのライブハウス。
全部で5バンドくらいが出演するようで、ラルクアンシェルやエックスのカバーバンドなどが出るとか・・・(詳細未決)

THE YELLOW MONKEYのカバーバンドは、ほぼ同じメンバーで2度目のライブです(前回は約2年半前)。
私は普段からバンド活動を行っている人間ではないので、上手な演奏ができるとは我ながら到底思いませんが、精一杯楽しもうと思います。今の生活スタイルだと普段から楽器をやることは困難なのですが、良い機会があればやりますよ、というスタンスでたまーにバンドやっています。
メンバー中で私が最年少、かつ現役で普段からバンドをやっていないのが私だけ、という非常に恐縮な状況なのですが・・・頑張ります。

もし「観に行きたいかも」なんて少しでも思った方は気軽に遊びに来てください。

2010年振り返りと2011年の展望

野沢温泉スキー場 毛無山頂上にて

明けましておめでとうございます。本年もどうぞよろしくお願いいたします。
昨年のざっくりとした振り返りと、今年は何をしたいか、ある程度記しておきたいと思います。

昨年は少し無理をして、(主に精神の)健康を損なってしまいました。悪いことというのは重なるもので、一時期は完全に参ってしまい、げっそりと痩せてしまいました。自分の20代史上で最も体重が落ちてしまう事態に。
そのときはリフレッシュを図ろうと人生初の一人旅に出かけました。行き先は、京都。7月でした。真夏の京都は非常に日差しが強くて暑く、大汗をかきながらあっちこっち歩き回るという、忘れられない旅となりました。

むちゃくちゃな事態に飛び込んで行って、何かを得られるような年齢では最早ないのかなぁと。ボロボロになることが分かっているなら、最初から退却した方が得策な場合もあることが分かった、というか。自分一人の頑張りではどうしようもない事態もある、ということを強く感じました。自分がどれほどの力を持つ人間なのか、どういうことが得意でどういうことが不得意なのか、どういうことが好きでどういうことが嫌いなのか、より理解したと言い換えることができるかもしれません。

職場では自分の所属するチームメンバーの入れ替わりがありまして、かなり雰囲気が変わったことが大きな出来事でした。新人さん達の新鮮な気持ちに、自分もかなり刺激を受け、良いエネルギーをいただいたと思います。

また、以前より記事を書きためてきた社内ブログを公開したり、会社のウェブサイトのリニューアルプロジェクトが立ち上がったりと、例年より意欲的な制作活動ができたのではないかと思います。当サイトはかなり更新の頻度が下がっていますが、制作のエネルギーを社内での活動に注いでいるのが原因だという言い訳はできるのかな、とお茶を濁しておきます。

今までやったことのないものに挑戦することが多い年だったかもしれません。仕事面ではもちろん、プライベートではダーツをやってみたり、皇居ランニングをやってみたり、スキーをやってみたり、一人旅に出かけてみたり、と割とアクティブに外に出ていた印象が強いです。昨年を漢字一文字で表現するならば「挑」だったのではないでしょうか。

今年はこの私、三十歳になります。
今年はこうありたいと思うキーワードは「原点回帰」です。漢字一文字で表現するなら「捨」。
やりたいこと、というよりは「やらないこと」ですね。「いらないもの」をとにかく捨ててシンプルな状態を目指そうと、漠然と考えています。そして自分の原点と思えるポイントは大事にしたい。いい状態で三十路を迎えたいです。

抽象的な話ばかりになってしまいましたね。ま、いずれにしても向上心は「捨」てずに腐らずやっていきたいと思います。改めて本年もどうぞよろしくお願いいたします。

Re: gVim でウィンドウの位置とサイズを記憶する

マルチモニタ環境で、セカンドモニタにVimを開いた状態で:tabeとか:vspするとメインモニタにVimが何故か強制的に移動してしまい困っていました。それを見事解決できたのがこちらのVim Script。

Vim-users.jp – Hack #120: gVim でウィンドウの位置とサイズを記憶する

このスクリプトを.gvimrcに書き込んでおけば、$HOME.vimwinposというファイルが作られそこに前回Vim終了時のウィンドウのX座標、Y座標、横幅、縦幅が保存されます。

1点気をつけるべき点がありました。.gvimrc内にtransparencyオプションの設定がしてある場合、それより後に書かないとウィンドウの位置が強制的にメインモニタ内に移動してしまいます。
(理由は定かではありませんがtransparencyオプションが使用するWindowsの描画機能の影響・・・?)
これを回避できれば全く問題なしです。ありがとうございました!