kaeruspoon

近代工業的ベルトコンベア式健康診断

 昨日は日本橋のあたりまで健康診断のために行ってきました。息をすったり吐いたりベッドに横になったり口をひらいたり、素直にいわれたとおりに動くのが子供のころを思い出させてくれてなんだか楽しかったです。血を取られるのだけがイヤだったけど。注射は大嫌い。

 ubuntuでは仕事の書類も作成できたし印刷もできたしデジカメの写真や動画もUSB経由でWindows以上にスムーズにもってくることができて、想像以上にできる感じです。あとはデザインとかフォントがもっとよくなれば……と思う人がMacBookを買ったりするのでしょう。coLinuxとかなしに、ローカルに開発環境をおけるのは思っていたよりもストレスが軽減されていいですね。素晴らしい。

 それから、ubuntuを6.06から6.10へアップグレードしました。本家サイトのやり方ではうまくいかなかったけど、こちらのサイトを参考にやってみたらうまくいきました。よかったよかった。

 ユルさんと新宿で待ち合わせてぶらぶら。ヨドバシカメラでMacBookを見ます。やっぱりいいなあ、MacBook。でも、やっぱり白はみんな薄汚れています。これはちょっとイヤ。といって、黒はおさがりの学ランみたいに手が触れるところがテカテカしているし。買うならMacBook Proがいいですね。

 ubuntuからYoutubeに動画がアップできるかやってみました。これも簡単でしたね。まあWebなんだからプラットフォームが関係ないのは当り前なんだけど。動画はぼくのVAIOubuntuが起動するところです。

Try and say my name!

 藤堂さんからすごいプレゼントがやってきた!
83
 ケロロだ。
84
 うおー、ジャキ様だ。すごい。誕生日プレゼントにこんなのもらったのは初めてです。なにより、ネタのためにプレゼントをする藤堂さんがすごい。ありがとうございます。大事にお家にいるときにだけ着させていただきます。

 「2007年02月10日」の日記kaeruspoonのAmazon機能のソースをちょっとのせていたけど、オーバライドを使うのが自然だと思ったので以下のようにしてみました。

class AmazonList < ActiveRecord::Base
  include REXML
  has_and_belongs_to_many :diaries

  ASSOCIATE_TAG = 'アソシエートID'
  AWS_ACCESS_KEY_ID = 'ECS用ID'
  SEARCH_ELEMENT = 'ItemLookupResponse/Items/Item/'


  def self.find_by_asin(asin)
    Net::HTTP.version_1_2

    item = super(asin)
    if (item == nil) || (item.updated_on.to_time.since(7.days) < Time.now)
      amazon_list = Hash.new
      Net::HTTP::start('webservices.amazon.co.jp') do |http|
      ……以下略

 それからかえる記法のパーサに関しては、Windowsぶっ壊れ事件のごたごたでまだ手を付けていません。一時はコントローラにパーサの処理を持ってこようとも思ったのだけど(解析しながらAmazonのデータを取得する必要があるから)、habtmを使って日記とAmazon商品の間にリレーションシップをはりました。でもこれって、ヘルパー上のパーサで実際にAmazonデータを取得するときにDBにアクセスする気がする。コントローラ上でfindしたときはリレーションシップ先のレコードまで読まないよね?(違うかもしれないけど)
 Viewの処理中にDBにアクセスしていると思うとちょっと気持ち悪い気がするけど、ここまで気にしなくてもいいのかな。

仕事をしていると、十年前のPCを使っているみたいな気分になることがある

p:85:none
 Macのデスクトップのスクリーンショットみたいだけど、実はぼくのVAIOの上のubuntuのデスクトップだったりします。Lauri Taimilaさんのサイトにあった、Make ubuntu look like OSXのページを参考にしました。Taimilaさん本人はもう飽きちゃってるみたいだし、ぼくもそのうち違うデザインに変えるとは思うけど、とりあえずしばらくこのなんちゃってOSXデザインを使っていこうと思います。LinuxとfreeBSDベースということもあって、なんだかホントにOSXを使っている気がしてくるし、実際にそれほど大差はないでしょう。これがすべて無料なんだからすごい世の中です。
 それにしてもubuntuの出来はすばらしい。なんだかずっとこれを使いつづけたくなってきました。もうWindowsには戻らないかもしれません(Macにも行かない)。

 近所に住んでいると遊びました。名前はシロさんです。ぼくの名前じゃなくて、の名前ですよ。

Life is Playing

 どうでもいいお話ですが、今、ジャキ様のシャツを着ていたりします。

 どうでもいいお話ですが、ジャキ様の名前はジャキ様ではなくジャギ様でした。最後のキが濁るのです。あれだけ彼が「俺の名を言ってみろ」といってたのに、ぼくは間違えてました。

I had gone to Samezu where the people in Tokyo renew their licenses.

 今日の一言に、その日のできごとを英語で書いてみることにしました。間違っていたらびしばしつっこんでください。

 「2006年12月20日」の日記で書いていたかえる記法のパーサですが、以下のようになりました。

  def view_text(diary)
    html = ''
    lines = diary.text.chomp.gsub(/\r(?=\n)/,'').gsub(/\r/,"\n").concat("\n").scan(/.*\n/)

    until lines.empty?
      case
      when lines[0] == ">||\n"
        lines.shift
        buffer = ''
        until lines.empty?
          if lines[0] == "||<\n"
            lines.shift
            break
          end
          buffer << lines.shift
        end
        html << exchange_pre(buffer)
      when lines[0] =~ /^\[amazon:(.+?):detail\]$/
        lines.shift
        html << exchange_amazon_detail(Regexp.last_match[1], diary.amazon_lists)
      else
        buffer = ''
        until lines.empty?
          break if /^((>\|\|)|(\[amazon:(.+?):detail\]))$/ =~ lines[0]
          break if !buffer.empty? && (/^((\[p:(\d+?)(|:none)\])|(\[amazon:(.+?):image\]))$/ =~ lines[0])
          buffer << lines.shift
          break if buffer[-2..-1] =~ /\n\n/
        end
        html << exchange_paragraph(buffer.chomp, diary.amazon_lists)
      end
    end

    return html
  end

 仕様が変わったりしていますが(引数がStringからDiaryクラスに)、やっていることはほぼ同じです。けっこうすっきりしました。tDiaryのパーサみたいに一行ずつ処理するやり方です。でもまだちょっと不満はあります。正規表現のあたりとか……。Rubyで初めて正規表現に触れたし、なおかつほとんど触っていなかったのであまりまだ考え方がよくわかっていないのです。

Yuru who is my wife has just cut my hair.

 「ザクとは違うのだよ、ザクとは」は、渋いおっさんランバラルのセリフで、藤堂さんにもらったTシャツにも書かれています。ユルさんはそのシャツを「ザクティ(ザクのTシャツの意)」なんて呼んでいたので、
「違うよ、これはザクじゃなくてグフのことを言っているんだよ」
と教えてあげると彼女は
「ザクとは違うのだよ、グフだよ」
なんて言ったので大爆笑でした。おもしろい奥さんだ。

 今さっき、ユルさんに髪を切ってもらいました。すっきりです。

I met the people who work in the new office at which I'm going to work next month.

プログラミング言語C 第2版 ANSI規格準拠

 「「プログラミング言語C 第2版 ANSI規格準拠」」を書庫の奥から引っ張り出してきて再読しています。というのも、今度仕事でC言語を使うことになりそうだからです。何年ぶりでしょうか。ひさしぶりに読み返すとなかなか楽しいですね。ホントはぼく、Cが好きなんだ。

I decided that I went to bed before midnight.

 最近、「「すらすらと手が動くようになるSQL書き方ドリル」」をようやくやりはじめたんですが、これすごいです。めちゃくちゃわかりやすいし、SQLの書き方から内部の動き方も理解することができてひとつひとつが納得。group byとかhavingとか、よく理解できてなかったところもばっちりになりました。このグループ単位の集計を使えば、kaeruspoonのリンク元の集計なんてSQL一発でできちゃうな(いまはいろいろとぐりぐりやってます)。find_by_sqlを初めて使ってみようかな。次のお休みの日のサンデープログラムはこれにしよう。

 ubuntuの唯一の不満が日本語入力の部分。Anthyはちょっと不安定で、入力した文字を変換すると文字ごと消えてしまうことがあるのです。「ATOK X for Linux」とか欲しいなあ。

Today, I may go to bed after midnight...

 find_by_sqlを使用して、リンク元の集計処理をするようにしてみました。

  def self.get_referer(id = nil)
    if id
      condition = "diary_id = #{id}"
    else
      condition = "diary_id IS NULL"
    end

    self.find_by_sql(<<-SQL)
      select
        url
      , COUNT(*) as 'count'
      from
        counters
      where
        #{condition}
      group by
        url
      order by
        count DESC
      ;
    SQL
  end

 すげー、超シンプル。今まではソートしたりなんだりいろいろやっていたのが、Rubyでのコードは一切不要になりました。たったこの一行のSQLだけで。SQL最高。なにより速いし。もっと勉強していろいろやってみよう。楽しくなってきました。method_missingを使うfind_by_*よりも、find_by_sqlを使うほうが全然速いんだろうなあ。

Sometimes, The various people have come to write various comments at my diary's board.

 今日はkaeruspoonのこまごましたバグをなおしました(リファラのリンク先とかタグの大文字小文字とかAmazon管理用のあれこれとか)。そろそろリファクタリングというか、コードをきれいにしたいな。まだキャッシュも使っていないのでそいつも適用していかないと。あと、やっぱりfind_by_*は重いみたいなので、find(:conditions)に変えようかと考えてます。それとSQLにしたほうがよさそうなところはfind_by_sqlに。あとはJavaScriptでフォームの値をリアルタイムにバリデートするライブラリまとめにあるように、いろいろと便利そうなライブラリがあるのでコメントのバリデートに使ってみようかと思います。

I and Yuru went to the Doutor which is coffee shop eating Zuwaigani bagels.

 今日はkaeruspoonのコードをちょっとリファクタリングしました。そこで今さらというかなんというか、初めて例外処理を使ってみました。

    begin
      album = Album.find(params[:id])
    rescue ActiveRecord::RecordNotFound
      redirect_to(unknown_url)
      return
    end

 コントローラ内の処理です。findはデータベースにないidが指定されたとき、RecordNotFound例外を発生させます。rescue節の中でリダイレクトのあとにreturnしているのは、実際にリダイレクトされるのはメソッドが終了したときで、ここでreturnを入れてないと以降の正常処理を走らせてしまうからです。
 でも、こんな使いかたでいいのかな? それにただ一行のfindのために例外処理を使うのも大げさな印象がある。find(:conditions)を使えば、レコードが存在しないときはnilが返ってくるのだから、それを見て処理をわければいいだけのような気もする。どちらがいいのでしょう。でもとりあえずぼくは、例外処理でやっていくことにします。

 こうすればいいことに気づいた。

    begin
      album = Album.find(params[:id])
      ……以降、通常処理
    rescue ActiveRecord::RecordNotFound
      redirect_to(unknown_url)
    end

 こっちのほうが従来の使いかたなのかな。begin節内の複数のfindに対応できるし。なんとなく突然、C言語のエラー処理で例外的にgotoを使うやり方を思い出しました。

 create系のDBアクセスも例外処理を入れてみました。今までは何も考えずにcreateメソッドばかり使っていたけど、例外を発生させてやるためにnew→save!もしくはbuild→save!を使うようにしてみました。これで大丈夫なのかな? いろいろと調べてみたのだけど、このあたりの動きがよくわからなかったのです。第8回のRails勉強会@東京に参加したときに、どなたかがこのあたりの話をしていたのだけど、どうだったか忘れてしまいました。このように、常にいろいろ興味を持っていないと、結局いつかは自分が困ることになります。

We enjoyed to play the Wii which is game machine which was made by Nintendo, in the house which Takeishi-san, Sima-san and Kazuho started to live in.

 ユルさんと一緒に武石さんたちの新居に遊びに行きました。他にはなつめさんと新婚のタケゾウ夫妻も。ぼくはちょっと風邪気味だったので、子供のカズ坊には近付かないようにしてました。彼はどんどん大きくなっています。
 ごはんをご馳走になって、あとは任天堂のWiiで遊びました。初めてやったのだけど、あのコントローラの出来はいいなあ。とてもおもしろかったです。

アイレム コレクション ポンコツ浪漫大活劇バンピートロット

 武石さんが貸してくれたゲームをさっそくやってみました。おもしろいね、これ。腹ぺこになるところとか(そこかよ)。

 「2007年01月11日」の日記でcronによって更新pingを送信するスクリプトを書いていたけど、その部分をWebAPIみたいにとあるURIにアクセスすると更新pingを打つような仕様に変更してみた。もちろん、自サーバからのアクセスの場合のみに適用されて、それ以外はエラーページに飛ぶようにしています。
 WebAPIの部分は

  def (WebAPIのメソッド名)
    if request.remote_ip == '(サーバのIPアドレス)'
      diary = Diary.find(:first, :conditions => ["open_date = ?", Date.today])
      ping_send(diary) if diary
      render(:text => 'ping_check end', :layout => false)
    else
      redirect_to(unknown_url)
    end
  end

毎日零時すぎに実行されるcron呼出のスクリプトは

#!/usr/local/bin/ruby
require 'net/http'
Net::HTTP.version_1_2

Net::HTTP::start('kaeruspoon.net') do |http|
  http.get("(WebAPI用のURI)")
end

という感じでシンプル。これでいちよ動いています。

I was suffering from a so bad asthenopia with headache and nausea today afternoon.

 しばらくリファクタリングをやっていましたけど、これをやりながらいろいろな不具合に気づくので困りものです。リファクタリングは動く状態で機能は変えずにコードの整理整頓をやるものだと思うのだけど、動かない状態があることを次々に発見してしまうのでそこからやり直しているような状況です。普段、ちゃんと動いていて不具合がないように思えても、いろいろとバグがあるものですね。まあ、ソースを見て気づけるようなものなのだから、最初からちゃんと見ておけよというお話です。
 コントローラに関してはとりあえずリファクタリングを終了です。モデルとビューに関してはまた後日。しばらくSQLの勉強とC言語の復習に時間を使おうかと思います。

 最近、ようやくscreenを使いはじめました。うわー、すごい便利だね、これ。もっと早く使っておけばよかったよ。あと残るはEmacsか……。でもぼくはvimでいきます。

I'm always disgusted at members of a labor union and their activity.

 C言語の復習をちょっとやってみました。関数へのポインタとかなつかしいです。関数へのポインタは構造体のメンバになれるんだっけ、と思ったので試してみました。
 まずはヘッダファイルのkaeru_string.h。

#ifndef _INCLUDE_KAERU_STRING_
#define _INCLUDE_KAERU_STRING_

typedef struct kaeru_string {
        int (*str_set)();
        char *(*str_put)();
} *String;

extern String str_new(void);
extern void str_free(String);

#endif

 次にkaeru_string.c。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "kaeru_string.h"

static int string_set(const char *);
static char *string_put(void);

static char *data;

String str_new(void)
{   
    String  new;

    new = (String)malloc(sizeof(String));
    new->str_set = string_set;
    new->str_put = string_put;
    data = NULL;

    return new;
}

void str_free(String self)
{   
    free(data);
    data = NULL;
    free(self);
    self = NULL;
}

static int string_set(const char *source)
{   
    int size;

    size = strlen(source);
    if (size < 0) {
        return -1;
    }

    data = (char *)malloc(size + 1);
    strcpy(data, source);

    return 0;
}

static char *string_put(void)
{
    return data;
}

 そしてmain.c。

#include <stdio.h>
#include "kaeru_string.h"

int main(void)
{   
    String a;

    a = str_new();

    if (a->str_set("I'm C Programmer!")) {
        printf("error\n");
        return -1;
    }

    printf("%s\n", a->str_put());

    str_free(a);

    return 0;
}

 結果は

I'm C Programmer!

 クラスみたいなものが作れないのかな、と思ったので関数へのポインタを構造体のメンバにしてみたのだけど、すぐにおかしいことに気づいた。main.cを

int main(void)
{
    String a;
    String b; 

    a = str_new();
    b = str_new();

    if (a->str_set("I'm C Programmer!")) {
        printf("error\n");
        return -1;
    }

    if (b->str_set("And I'm Ruby programmer!!")) {
        printf("error\n");
        return -1;
    }

    printf("%s\n", a->str_put());

    str_free(a);
    str_free(b);

    return 0;
}

こうすると結果は、

And I'm Ruby programmer!!

 シングルトンみたいになってしまった。外部変数のchar *dataはただひとつの変数なのだから当然だけど。さらにfreeでdataを何度も開放していることになってしまっていてヤバそう。
 そういえば、static指定の関数でも、関数へのポインタ経由なら他ファイルからもアクセスできてしまうみたい。static指定の情報まではポインタに引き継がれないんだね。当然と言われれば当然なのだろうけど。

 シングルトンはイヤなので、dataを構造体の中にいれてみよう。こっちのほうがクラスっぽくて自然だろうし。
 と思ったけどすぐにダメなことに気づいた。構造体の中のdataを指すためにStringへのポインタ自体を関数の引数にしなくちゃいけなくて、結局構造体の中へ関数へのポインタを入れる意味がなくなっちゃうのです。つまりは、薄々感じていた平凡な形になってしまうわけです。kaeru_string.h, kaeru_string.c, main.cの順に並べると、

#ifndef _INCLUDE_KAERU_STRING_
#define _INCLUDE_KAERU_STRING_

typedef struct kaeru_string {
        char *data;
} *String;

extern String str_new(void);
extern void str_free(String);
extern int string_set(String, const char *);
extern char *string_put(String);

#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "kaeru_string.h"

String str_new(void)
{   
    String  new;

    new = (String)malloc(sizeof(String));
    new->data = NULL;

    return new;
}

void str_free(String self)
{   
    free(self->data);
    self->data = NULL;
    free(self);
    self = NULL;
}

int string_set(String self, const char *source)
{   
    int size;

    size = strlen(source);
    if (size < 0) {
        return -1;
    }

    self->data = (char *)malloc(size + 1);
    strcpy(self->data, source);

    return 0;
}

char *string_put(String self)
{   
    return self->data;
}
#include <stdio.h>
#include "kaeru_string.h"

int main(void)
{
    String a;
    String b;

    a = str_new();
    b = str_new();

    if (string_set(a, "I'm C Programmer!")) {
        printf("error\n");
        return -1;
    }

    if (string_set(b, "And I'm Ruby programmer!!")) {
        printf("error\n");
        return -1;
    }

    printf("%s\n", string_put(a));
    printf("%s\n", string_put(b));

    str_free(a);
    str_free(b);

    return 0;
}

結果は

I'm C Programmer!
And I'm Ruby programmer!!

 とりあえず形にはなったけど、なんだかクラスっぽさはなくなったね。本来ならprivateにしたいchar *dataにアクセスできちゃうし、そのデータと関数との関連も疎になった感じ。C言語でクラスみたいなものを作ろうというのが変なのかも。

 追記です。

typedef struct kaeru_string {
        char *data;
} *String;

 これってもう構造体の意味がなかったね。ただのcharポインタでOKです。

I've just rented an apartment in the HappyGarland city today. It's story in the game.

 またゲームをしてました。ピアノを弾くのが楽しいのです。「2」が制作中みたいですね。絶対買います! ゲームをしなくなったぼくにここまで言わせるとは……。

 C言語の勉強はちょっとだけ。そういえば共用体ってあったね。今も昔もなんに使えるのかいまいちピンときません。

Yuru and I were invited in for a meal to their house where Sakura-san and her husband live.

 今日は食事に招待されたのでさくらさんのお宅におじゃましてきました。初めてお伺いしたのですが、ペンションみたいに素敵なところでした(料理も)。さくらさんの旦那さんとはバイクのお話。ひさしぶりに人とバイクの話ができてとても楽しかったです。時間をまったく気にせずに、テーブルを囲んで他にもずいぶんといろいろなお話をしました。リラックスしてゆったりとしたひととき。素晴らしい一日でした。

I won't go out home today because I've been a little tired.

 kaeruspoonのリンク元としていろいろな検索サイトが増えてきたので、ちょっとコードをさわりました。

  def search_engine_check(ref_url)
    engine = nil
    engine = "google" if ref_url.index("http://www.google") == 0
    engine = "google blogsearch" if ref_url.index("http://blogsearch.google") == 0
    engine = "blogpeople" if ref_url.index("http://bst.blogpeople") == 0
    engine = "yahoo" if ref_url.index("http://search.yahoo") == 0
    engine = "yahoo blog" if ref_url.index("http://blog-search.yahoo.co.jp/") == 0
    engine = "goo blog" if ref_url.index("http://blog.goo") == 0
    engine = "Ask" if ref_url.index("http://ask.jp/") == 0
    engine = "technorati" if ref_url.index("http://www.technorati") == 0
    engine = "Live Search" if ref_url.index("http://search.live.com/") == 0
    engine = "Matome" if ref_url.index("http://www.matome.jp/") == 0

    if engine
      url = ref_url + '&'
      url.scan(/.*(MT|p|q|keyword|tag|search)(=|\/)(.+?)(&|\?)/) do |id, mark1, words, mark2|
        word_array = words.split(/[  \+]+/).select{|word| word.size > 0}.uniq
        ref_url = "#{engine}検索 [#{word_array.join(' ')}]"
      end
    end

    return ref_url
  end

 ああ、やっぱりRubyは気持ちいいな。

 ちょっと疲れがたまっている感じ。のんびり好きなことして過ごそう。

I've moved to Kamome-sou which is an apartment in the Suhmsuhm city.

 サーチエンジンのリンク元の処理のところは以下のようにしてみました。

  def search_engine_check(ref_url)
    sites = [ 
              {:name => 'google', :url => 'http://www.google'},
              {:name => 'google blogsearch', :url => 'http://blogsearch.google'},
              {:name => 'blogpeople', :url => 'http://bst.blogpeople'},
              {:name => 'yahoo', :url => 'http://search.yahoo'},
              {:name => 'yahoo blog', :url => 'http://blog-search.yahoo'},
              {:name => 'goo blog', :url => 'http://blog.goo'},
              {:name => 'Ask', :url => 'http://ask.jp/'},
              {:name => 'technorati', :url => 'http://www.technorati'},
              {:name => 'Live Search', :url => 'http://search.live'},
              {:name => 'Matome', :url => 'http://www.matome.jp/'}
            ]


    engine = nil
    sites.each do |site|
      if ref_url.index(site[:url]) == 0
        engine = site[:name]
        break
      end
    end

    if engine
      url = ref_url + '&'
      url.scan(/.*(MT|p|q|keyword|tag|search)(=|\/)(.+?)(&|\?)/) do |id, mark1, words, mark2|
        word_array = words.split(/[  \+]+/).select{|word| word.size > 0}.uniq
        ref_url = "#{engine}検索 [#{word_array.join(' ')}]"
      end
    end

    return ref_url
  end

 瑣末な修正。今日はあまり頭が働いていない感じです。お風呂でゆっくりしよう。

My side has been hurting since yesterday. Yuru is saying it may be intercostal neuralgia.

 ぼくはぐりぐり君(どんぐりの木)とカンタロー(いよかんの木)を育てているのですが、最近土が痩せてきたので裏山の土を取りに行きました。土をスコップで掘っていると、女の子がやってきてじーっとぼくの作業を見つめます。ぼくは「こんにちは」とあいさつだけして早々に引き上げました。親とか現れて、変なおっさんとか思われたら嫌だもの。

We looked a rainbow after a long time when Yuru and I ware driving in Odawara.

 ずいぶんひさしぶりに日記を書きます。というのも、サーバが起動しなくなっていたから。原因は停電によってMBRが壊れてしまったこと。なんだかやる気が起きなくてしばらく放置してました。ドライブに行ったりとかトロットビークルに乗ったりしていたし……。
 MBR上のGRUBが壊れたようだと考えたのは、起動中に「GRUB」のメッセージが出てそれ以上処理が進まなくなってしまうから。
 回復するためにSystemRescueCdを使います。CDブートさせたら「boot:」のプロンプトはリターンキーで進めて、「22」のjaを選択、あとはgrub-installをかますだけです。

mkdir /mnt/mydir
mount /dev/hda1 /mnt/mydir
grub-install --no-floppy --root-directory=/mnt/mydir /dev/hda

こんな感じ。
 で、無事に起動できたのですが、実はGRUBだけでなくてその他のデータもあちこちが飛んでいて使いものにならなかったという悲惨な状況が待っていたのでした。とほほ。停電恐いよ。次期サーバはノートPCを使おう。
 というわけで、またサーバの構築しなおしです。DebianにしようかFreeBSDにしようかとも考えたりしていますが、メンドくさいのでやっぱりcentOSにするかもです。

英語とか写真とかドライブとか列車

 日記のタイトルが内容に関係ないものだと、あとから記事を探すときに苦労するということを今日実感しました。英語の一言日記は本文の中に書くことにしましょう。

 写真を一枚追加しました。

87
 おとといは伊豆にドライブに行きました。天城峠を越えて河津のほうまで。

 ドライブ中に立ち寄った萬城の滝です。

 I saw the trains which had connected each other when I went to Shinagawa station.

 ダイナミックDNSへの登録を忘れていて、外部から接続できないことに会社で気づきました。すぐさま登録して解決。LAN内にいたから気づきませんでした。忘れないようにしなくちゃだよ。

マネージメントとか

 今の仕事はマネージメント的なこともやっているのだけど、マネージメントってのは雑用係みたいなもので別にえらくもなんともないし、主役は実際に現場の仕事をやっているメンバたちなのだ。
 ということをこの仕事を始めるまで全然気づいていなかった。そして、始めるまでは到底ぼくにはこなせないと思っていたこの仕事も、今では自分の庭にいるみたいに気楽にやれている。なんでもやってみなければわからないものだ。

送別会がありました

 今週で今の仕事が終わるので送別会がありました。いろいろお話してすごく一体感を覚えたというか、みなさんがぼくの思いを理解してくださっていたんだなあと実感できてうれしかったです。素敵な送別会でした。

I passed at the station that should be gotten off, and I went to the Machida station.

kaeruspoonとはてなのサーバ

 はてなのサーバは自作のものでFedoraCoreを使っているのは有名だったけど、さくらインターネットのデータセンタへサーバを移行したのを機に、はてなブックマークではDellのサーバを使い、OSはCentOSを使うようになったみたい。
88
 kaeruspoonはOSこそ同じCentOSだけど、マシンは自作のタワー型で、CPUはPentium3の800Mhz、メモリは512MB、ハードディスクは80GBx2のソフトウェアRAID1という貧弱な構成。こんな感じで玄関の収納の上のほうに置いてあります。もちろん空調もなにもないし台所とつながっているから調理の熱がもろに行くし実際に去年の夏にはハードディスクがお亡くなりになったりしています。
 もう少しコンパクトで強固なサーバにしたいなあとも考えていますが、欲しいものがいろいろあってなかなか手を出していません。はてなのDellサーバがうらやましい。一番安い構成で15万円くらいみたい。安いよね。

404エラーを返さなくちゃだよ

 ステータス200なのに「その商品はありません」の記事を読んでたしかにそのとおりだと思いました。なので、kaeruspoonでも404エラーに該当するunknownのページはステータス404を返すようにしてみました。

  def unknown
    render(:status => 404)
  end

 超簡単。

I've just finished to work at current office today. It was office like high school.

ソースコードに色をつけるgoogle-code-prettifyを使ってみた

 高校の学習指導計画書に「高橋メソッド」と「もんたメソッド」が!という記事。ここまで有名だったのか。すげー。笑ったけど。Rubyの名前まで出てるし。

 Javascriptでソースコードに色をつけるgoogle-code-prettifyを使ってみました。使いかたはとても簡単(こちらを参照)。さっそくkaeruspoonに適用してみました。

1.まずはここでprettify.cssとprettify.jsを手に入れます。それぞれのファイルを、RailsRoot/public/stylesheets/とRailsRoot/public/javascripts/に置きます。

2.ヘッダでprettify.cssとprettify.jsをインクルードします。

<%= javascript_include_tag "prototype", "effects", "prettify" %>
<%= stylesheet_link_tag 'kaeru', 'prettify' %>


3.bodyタグにonload="prettyPrint()"を指定します。

<body onload="prettyPrint()">


4.preタグ、またはcodeタグにclass="prettyprint"を指定します。

  def exchange_pre(text)
    "<pre class=\"prettyprint\">\n#{h(text)}\n</pre>\n"
  end


 これだけです。ホントはC言語とかJava用みたいだけどRubyでもいけるね。スタイルシートのほうで色指定できるので、後で調整してみよう。