正規表現でgrepする

grepと言えば、指定したファイルで特定の文字列がある行だけを抽出するUNIXの有名なコマンドですよね。それを正規表現を使って、テキストエディタとかで似たような動作をさせてみようというものです。バイト先で聞かれてメールで答えたんだけど、言った本人がすでに忘れているので、送ったメールを見ながらメモっておく、と。

s/^((?!hoge).)*$\r?\n?//g

Perlの構文で書いています。使うときは"hoge"を適当な文字列に変えて実行してみてください。
簡単に説明すると、"((?!hoge).)"が後に"hoge"が続かない「位置(文字じゃなくて)」の次の1文字にマッチします。なので、"((?!hoge).)*"は、現在の位置から"hoge"より前までのマッチとなります。これを挟んで ^$ を指定しているので、"^((?!hoge).)*$"は、"hoge"を含まない行にマッチします。あとの"\r?\n?"は、改行文字にマッチさせて改行を消しているだけです。
grepが標準で使えないWindows環境だと役に立つ・・・かもしれないw
ちなみに、先読みが使えない正規表現エンジン(sedとか)だと動きません。

最近の傾向


8:45 授業開始
12:00 午前の授業終了
13:00 実験開始
17:00 実験終了
17:30 帰宅、休憩
19:30 食事
21:00 予習、課題
23:00 風呂
0:00 自由時間
1:00 就寝

こうして見ると、地味に忙しいな・・・。「予習、課題」が実際もうちょっと長くかかってる気がするし。最近何かだるく感じるのは、自由に使える時間が少ないからなんだろうか。。まあ、これからしばらくこんな感じの生活になるだろうから、早めに体を慣らしていかないといけないんだろうな。
というわけなので、さっさと寝よう

PythonでSingleton

GOFデザインパターンにSingletonパターンというものがありますが、これをC#で実装するとこんな感じになります。

class Singleton
{
    private static _singleton = null;

    public static Singleton getSingleton()
    {
        if (Singleton._singleton == null) {
            Singleton._singleton = new Singleton();
        }
        return Singleton._singleton;
    }

    private Singleton()
    {
    }
}

・・・

// 使い方
int main()
{
    test = Singleton.getSingleton();

    return 0;
}


では、これをPythonで実装しようと思ったらどうなるか? ということでこんな感じで実装してみました。

class Singleton:
    _instance = None

    def __init__(self):
        raise RuntimeError, "This class cannot be instantiated."

    def __init_impl__(self):
        # 初期化処理
        pass

    @staticmethod
    def get_singleton():
        if not Singleton._instance:
            class _Singleton(Singleton):
                def __init__(self):
                    self.__init_impl__()
            Singleton._instance = _Singleton()
        return Singleton._instance

# 使い方
test = Singleton.get_singleton()


Pythonにはpublic, privateの違いがないので、無理矢理Singletonクラスを初期化できないようにしています。でもPythonの流儀からすると、わざわざこんな面倒くさいことせずに、使う側がインスタンスを生成しないようにするべきなんですかね。

Djangoのテンプレートで奇数・偶数判定

縞模様の表を作るときに、ループ番号の奇数・偶数判定が必要になりますよね。PHPだと直接コードを書けるので何の問題もないのですが、Djangoだとそうはいかないので、タグ、あるいはフィルタの自作をすることになってしまいます。もともとそういう風にDjangoは設計されているのかもしれないのですが、面倒くさいので何か方法はないかと考えて、こんな感じで実装してみました。

<table>
  <tbody>
    {% for item in list %}
      <tr class="{{ forloop.counter|divisibleby:2|yesno:'even,odd' }}">
        <td>{{ item }}</td>
      </tr>
    {% endfor %}
  </tbody>
</table>

「forloop」というのは自動的に生成される変数で、その「counter」属性が1から始まるループ番号です。他にもfirstとかlastとか・・・。
で、「divisibleby」が値を引数で割りきれる場合にTrueを返してくれるフィルタなので、「forloop.count」に対してこのフィルタを掛ければ、偶数の場合はTrue、奇数の場合はFalseが出力されることになります。後は、「yesno」フィルタで、Trueの場合、Falseの場合に出力する文字列を指定してやればOKです。

デジカメ購入

ここで欲しいー欲しいーと言ってたデジカメですが、今日ビックカメラに行って買ってきました。
買ったのは、リコーのCX3。裏面反射型CMOS搭載モデルで、価格.comでも売れ筋No.1の・・・。え? 考えていたのと違うって? 気のせいでしょう。じゃなくて、ちゃんとした理由がありまして。。
いろいろなサイトの評判と自分の独断と偏見でCyber-shotのWX1とLUMIXのFX66に絞ったのですが、いざ店頭に行ってみるとこの2つで散々悩みまして。。ぱっと見た感じだと画質は似たような感じで(所詮素人)、夜景がきれいらしいWX1がいいとは思ったんですけど、操作感はFX66の方がよくて、記録媒体の点でもFX66の方がよくて・・・。で、悩んでるときに、何気なくCX3を触ってみると、「おおっ」と。カメラの液晶画面上とはいえ非常に精細で、前の2つとは段違いの画質のように感じられました。あと操作感もよく、細かく制御もできるということで、これに決定したという次第です。
で、そのカメラで撮った写真がこの写真。文鎮です。これだけ小さくするなら携帯で撮っても変わらなかったかorz

Firefoxがフリーズする

最近やけにFirefoxがフリーズするようになりました。メモリ不足というわけでもなく、特にCPUに負荷がかかっているわけでもないのに、突然フリーズ。。
アドオンを大量に入れると動作が不安定になるっていうのはよくある話なので、いらないやつを消していっても相変わらず・・・。というか、セーフモードで起動しても、やっぱりフリーズするという・・・。
これって何なんですかね。頻繁に起こる話ではなく、特定のページを見たときに決まってフリーズしているので、レンダリングエンジンの問題かもしれませんね。まあ、どうしても見たければChromeで見ればいいか。。

セーフモードでの起動方法 メモ


"C:\Program Files\Mozilla Firefox\firefox.exe" -safe-mode