2011年2月25日金曜日

斜蹴、襲来

Haskellを勉強していこうと思います。

--euler #001 / recursion
let fizzbuzz a = (a `mod` 3 == 0) || (a `mod` 5 == 0)
putStrLn(show(sum(filter (fizzbuzz) [1..999])))

referring Problem 1 - Project Euler

自問自答 - スネオヘアー - コード進行

Original Key Db / Capo. 1 / Play in C / Tempo 97

[intro]
C " " " | G " " " | Am7 " " " | F " " " |
C " C/B " | G/A# " Am " |
F " " " | G# " " " | C " " " | F " G " |

[verse]
C " " " | C " " " | Am7 " " " | Am7 " " " |
F " " " | Fm " " " | C " " " | E7 " " " |
F " " " | F " " " | C " " " | Am7 " " " |
F " " " | F " " " | G " " " | G " " " |

[chorus]
C " " " | C " " " | Am7 " " " | E7 " " " |
F " " " | G " " " | C " " " | C " " " |

[bridge]
F " " " | G " " " | C " " " | C " " " |
F " " " | G " " " | C " " " | F " G " |
(1st: go back to [verse])

[chorus2]
C " " " | C " " " | Am7 " " " | E7 " " " |
F " " " | G " " " |
C " " " | C " " " | Am7 " " " | E7 " " " |
F " " " | G " " " | C " " " | C " " " |

[pre-outro]
F " " " | G " " " | C " " " | Am7 " " " |
F " " " | E7 " " " |
Am7 " " " | G " " " | F " " " | E7 " " " |
( Am7 " " " | G " " " | F " " " | G " " " | )
C " C/B " | G/A# " Am " | F " G " |
C " C/B " | G/A# " Am " | F " G " |
C " C/B " | G/A# " Am " | F " G " |
C " C/B " | G/A# " Am " | F " G " |

[outro]
C " " " | G " " " | Am7 " " " | F " " " |
C " " " | G " " " | Am7 " " " | F " " " |
C " " " | G " " " | Am7 " " " | F " " " |
...


referring: 「自問自答」 | スネオヘアー 歌詞/コード検索サービス | 楽器.me


Metronome by BestMetronome.com

2011年2月23日水曜日

なぜ Null は要らない子なのか

という記事があって面白かったので。

一番はやはりNullチェックを一々コードに埋め込むのは冗長だということに尽きる。

例1

Null云々とは少し違うが、例えば Door クラスを作ったとして、以下の2つのプロパティを書いたとする。

class Door
    private bool isShut
    private bool isLocked

ここで、
!isShut && isLocked
という状態は有り得ないので、Doorクラスを扱う際は『常に』気を使う必要がある。
例えば、isShutのsetter内に、falseにセットするときに次のように書いたり。。

if(newval==true){
    this.isShut = true
}
else{
    this.isShut = false
    if(this.isLocked){
        this.isLocked = false
    }
}

例2

あるいは、次のようなPersonクラスに、名前の総文字数を計算するメソッドを用意することを考える:

class Person
    private string FirstName
    private string MiddleName
    private string LastName

当然ながら、string型は Null にもなるし、空文字にもなる。
ので、次のメソッドは不十分で:

let TotalNumCharsInPersonsName(p:Person) =
    p.FirstName.Length + p.MiddleName.Length + p.LastName.Length

こんな風に書かなきゃいけない:

let TotalNumCharsInPersonsName(p:Person) =
    (if p.FirstName=null then 0 else p.FirstName.Length)
    + (if p.MiddleName=null then 0 else p.MiddleName.Length)
    + (if p.LastName=null then 0 else p.LastName.Length)



これだけ見ても、どんだけアホなんだと言いたくなる。
(でもプログラムを長く書いていると、もう慣れてしまってそのアホさに鈍感になってくる。)
じゃあどうやって解決するのか。それは、新しい型をつくることだ。

例1なら、こうする。
type DoorState =
    | Open | ShutAndUnlocked | ShutAndLocked

# then I could define
class Door
    private DoorState state

例2なら、こうする。
(ここにstringはnon-nullであり、Option<T>は(T型の値 or null)である)

class Person
    private string FirstName
    private Option<string> MiddleName
    private string LastName

let TotalNumCharsInPersonsName(p:Person) =
    let middleLen = match p.MiddleName with
                    | None -> 0
                    | Some(s) -> s.Length
    p.FirstName.Length + middleLen + p.LastName.Length

もうここにアホさは残っていない。本質的に必要な処理だけをコーディングしている。

結論

Nullはコードを不要に複雑にする。複雑さは全てのソフトウェアにおいて『敵』であり、我々は常にこれを排除するよう努めなきゃいかん。


元記事

2011年2月15日火曜日

ターミナルに切り替えずにコマンドを実行&結果確認

以前の俺


エディタでコード書いて、alt-tabでターミナルひらいて、↑押して実行して結果を確認して、またエディタに戻って、あぁ、またブラウザ開いてしまった、…エディタに戻って、コード書いて、ターミナルに…ああまたブラウザに以下略

Vim使うようになってから

  • エディタからコマンドを実行可能に
  • でも以前の実行結果が見たい時があって困る
  • 実行結果を大量に吐くコード、一度に全部吐かないコードだとさらに困る

新たな解


Focus on a test in Vim — Codeography
tail コマンドを利用した妙技を発見。すなわち

  1. エディタからコマンド実行するときにファイルにリダイレクト
  2. そのファイルを tail -f で開いとく
  3. エディタの隣にターミナル置いておけば…Wow!!


注意

モニタが小さいとあまり恩恵がない

2011年2月6日日曜日

Chromeのマルチ検索機能

Google Chrome から好きな検索エンジンで検索する方法

ちょ
こんな便利すぎる機能があったのか…!
速攻で英辞郎とstackoverflow登録した

Biham-Middleton-Levine traffic model

ネットサーフィンしていて見つけた記事。

User:Purpy Pupple/BML - Wikipedia, the free encyclopedia

交通モデルに自己組織化。
シンプルなモデルながらスケールフリーな結果。
うーん、何に応用できるんだろう。

2011年1月27日木曜日

SuperMailer というサービスが面白い

フリーメールを2秒で取得 - Super Mailer(スーパーメイラー)

どのフリーメーラーも、初期登録のストレスを極力減らして登録数を増やそうとしていると思う。
この SuperMailer は、username(@より前の部分)だけ入力すればメールアドレスが取得できる。

まさにアイデアの勝利。ただし名前はダサい