昨日は日本橋のあたりまで健康診断のために行ってきました。息をすったり吐いたりベッドに横になったり口をひらいたり、素直にいわれたとおりに動くのが子供のころを思い出させてくれてなんだか楽しかったです。血を取られるのだけがイヤだったけど。注射は大嫌い。
ubuntu では仕事の書類も作成できたし印刷もできたしデジカメの写真や動画もUSB経由でWindows以上にスムーズにもってくることができて、想像以上にできる感じです。あとはデザインとかフォントがもっとよくなれば……と思う人がMac Bookを買ったりするのでしょう。coLinuxとかなしに、ローカルに開発環境をおけるのは思っていたよりもストレスが軽減されていいですね。素晴らしい。
それから、ubuntu を6.06から6.10へアップグレードしました。本家サイトのやり方ではうまくいかなかったけど、こちらのサイト を参考にやってみたらうまくいきました。よかったよかった。
ユルさん と新宿で待ち合わせてぶらぶら。ヨドバシカメラでMac Bookを見ます。やっぱりいいなあ、Mac Book。でも、やっぱり白はみんな薄汚れています。これはちょっとイヤ。といって、黒はおさがりの学ランみたいに手が触れるところがテカテカしているし。買うならMac Book Proがいいですね。
ubuntu からYoutubeに動画がアップできるかやってみました。これも簡単でしたね。まあWebなんだからプラットフォームが関係ないのは当り前なんだけど。動画はぼくのVAIO でubuntu が起動するところです。
藤堂さんからすごいプレゼントがやってきた!
ケロロだ。
うおー、ジャキ様だ。すごい。誕生日プレゼントにこんなのもらったのは初めてです。なにより、ネタのためにプレゼントをする藤堂さんがすごい。ありがとうございます。大事にお家にいるときにだけ着させていただきます。
「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にアクセスしていると思うとちょっと気持ち悪い気がするけど、ここまで気にしなくてもいいのかな。
p:85:none
Mac のデスクトップのスクリーンショットみたいだけど、実はぼくのVAIO の上のubuntu のデスクトップだったりします。Lauri Taimilaさんのサイトにあった、Make ubuntu look like OSX のページを参考にしました。Taimilaさん本人はもう飽きちゃってるみたいだし、ぼくもそのうち違うデザインに変えるとは思うけど、とりあえずしばらくこのなんちゃってOSXデザインを使っていこうと思います。LinuxとfreeBSDベースということもあって、なんだかホントにOSXを使っている気がしてくるし、実際にそれほど大差はないでしょう。これがすべて無料なんだからすごい世の中です。
それにしてもubuntu の出来はすばらしい。なんだかずっとこれを使いつづけたくなってきました。もうWindowsには戻らないかもしれません(Mac にも行かない)。
近所に住んでいる猫 と遊びました。名前はシロさんです。ぼくの名前じゃなくて、猫 の名前ですよ。
どうでもいいお話ですが、今、ジャキ様のシャツを着ていたりします。
どうでもいいお話ですが、ジャキ様の名前はジャキ様ではなくジャギ様でした。最後のキが濁るのです。あれだけ彼が「俺の名を言ってみろ」といってたのに、ぼくは間違えてました。
今日の一言に、その日のできごとを英語で書いてみることにしました。間違っていたらびしばしつっこんでください。
「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 で初めて正規表現に触れたし、なおかつほとんど触っていなかったのであまりまだ考え方がよくわかっていないのです。
「ザクとは違うのだよ、ザクとは」は、渋いおっさんランバラルのセリフで、藤堂さんにもらったTシャツにも書かれています。ユルさん はそのシャツを「ザクティ(ザクのTシャツの意)」なんて呼んでいたので、
「違うよ、これはザクじゃなくてグフのことを言っているんだよ」
と教えてあげると彼女は
「ザクとは違うのだよ、グフだよ」
なんて言ったので大爆笑でした。おもしろい奥さんだ。
今さっき、ユルさん に髪を切ってもらいました。すっきりです。
「「プログラミング言語C 第2版 ANSI規格準拠」 」を書庫の奥から引っ張り出してきて再読しています。というのも、今度仕事でC言語を使うことになりそうだからです。何年ぶりでしょうか。ひさしぶりに読み返すとなかなか楽しいですね。ホントはぼく、Cが好きなんだ。
最近、「「すらすらと手が動くようになるSQL書き方ドリル」 」をようやくやりはじめたんですが、これすごいです。めちゃくちゃわかりやすいし、SQLの書き方から内部の動き方も理解することができてひとつひとつが納得。group byとかhavingとか、よく理解できてなかったところもばっちりになりました。このグループ単位の集計を使えば、kaeruspoon のリンク元の集計なんてSQL一発でできちゃうな(いまはいろいろとぐりぐり やってます)。find_by_sqlを初めて使ってみようかな。次のお休みの日のサンデープログラムはこれにしよう。
ubuntu の唯一の不満が日本語入力の部分。Anthyはちょっと不安定で、入力した文字を変換すると文字ごと消えてしまうことがあるのです。「ATOK X for Linux」 とか欲しいなあ。
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を使うほうが全然速いんだろうなあ。
今日はkaeruspoon のこまごましたバグをなおしました(リファラのリンク先とかタグの大文字小文字とかAmazon管理用のあれこれとか)。そろそろリファクタリングというか、コードをきれいにしたいな。まだキャッシュも使っていないのでそいつも適用していかないと。あと、やっぱりfind_by_*は重いみたいなので、find(:conditions)に変えようかと考えてます。それとSQLにしたほうがよさそうなところはfind_by_sqlに。あとはJavaScriptでフォームの値をリアルタイムにバリデートするライブラリまとめ にあるように、いろいろと便利そうなライブラリがあるのでコメントのバリデートに使ってみようかと思います。
今日は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 勉強会@東京に参加したときに、どなたかがこのあたりの話をしていたのだけど、どうだったか忘れてしまいました。このように、常にいろいろ興味を持っていないと、結局いつかは自分が困ることになります。
ユルさん と一緒に武石さんたちの新居に遊びに行きました。他にはなつめさんと新婚のタケゾウ夫妻も。ぼくはちょっと風邪気味だったので、子供のカズ坊には近付かないようにしてました。彼はどんどん大きくなっています。
ごはんをご馳走になって、あとは任天堂の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
という感じでシンプル。これでいちよ動いています。
しばらくリファクタリングをやっていましたけど、これをやりながらいろいろな不具合に気づくので困りものです。リファクタリングは動く状態で機能は変えずにコードの整理整頓をやるものだと思うのだけど、動かない状態があることを次々に発見してしまうのでそこからやり直しているような状況です。普段、ちゃんと動いていて不具合がないように思えても、いろいろとバグがあるものですね。まあ、ソースを見て気づけるようなものなのだから、最初からちゃんと見ておけよというお話です。
コントローラに関してはとりあえずリファクタリングを終了です。モデルとビューに関してはまた後日。しばらくSQLの勉強とC言語の復習に時間を使おうかと思います。
最近、ようやくscreenを使いはじめました。うわー、すごい便利だね、これ。もっと早く使っておけばよかったよ。あと残るはEmacsか……。でもぼくはvimでいきます。
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です。
ゲームばかりやってたような気がする一日です。こんなにゲームするのはひさしぶり。何年ぶりだろう。バンピートロット、めちゃくちゃおもしろいです。
またゲームをしてました。ピアノを弾くのが楽しいのです。「2」が制作中 みたいですね。絶対買います! ゲームをしなくなったぼくにここまで言わせるとは……。
C言語の勉強はちょっとだけ。そういえば共用体ってあったね。今も昔もなんに使えるのかいまいちピンときません。
いけませんいけません。ゲームのやりすぎです。しばらく、一日一時間制限です。だって大人なんだもの。
今日は食事に招待されたのでさくらさんのお宅におじゃましてきました。初めてお伺いしたのですが、ペンションみたいに素敵なところでした(料理も)。さくらさんの旦那さんとはバイク のお話。ひさしぶりに人とバイク の話ができてとても楽しかったです。時間をまったく気にせずに、テーブルを囲んで他にもずいぶんといろいろなお話をしました。リラックスしてゆったりとしたひととき。素晴らしい一日でした。
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 は気持ちいいな。
ちょっと疲れがたまっている感じ。のんびり好きなことして過ごそう。
サーチエンジンのリンク元の処理のところは以下のようにしてみました。
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
瑣末な修正。今日はあまり頭が働いていない感じです。お風呂でゆっくりしよう。
ぼくはぐりぐり 君(どんぐりの木)とカンタロー (いよかんの木)を育てているのですが、最近土が痩せてきたので裏山の土を取りに行きました。土をスコップで掘っていると、女の子がやってきてじーっとぼくの作業を見つめます。ぼくは「こんにちは」とあいさつだけして早々に引き上げました。親とか現れて、変なおっさんとか思われたら嫌だもの。
ずいぶんひさしぶりに日記を書きます。というのも、サーバが起動しなくなっていたから。原因は停電によって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にするかもです。
というわけでサービスは回復しました。結局、ディストリビューションはCentOSにしました。FreeBSDにも心惹かれたのだけど。
バックアップのタイミングのせいで、最近のコメントの一部が失われています。書き込みしてくれていた武石さん、すみませんでした。
日記のタイトルが内容に関係ないものだと、あとから記事を探すときに苦労するということを今日実感しました。英語の一言日記は本文の中に書くことにしましょう。
写真を一枚追加 しました。
おとといは伊豆にドライブ に行きました。天城峠を越えて河津のほうまで。
ドライブ 中に立ち寄った萬城の滝です。
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 Mac hida station.
はてなのサーバは自作のものでFedoraCoreを使っているのは有名だったけど、さくらインターネットのデータセンタへサーバを移行 したのを機に、はてなブックマークではDellのサーバを使い、OSはCentOSを使うようになったみたい。
kaeruspoon はOSこそ同じCentOSだけど、マシンは自作のタワー型で、CPUはPentium3の800Mhz、メモリは512MB、ハードディスクは80GBx2のソフトウェアRAID1という貧弱な構成。こんな感じで玄関の収納の上のほうに置いてあります。もちろん空調もなにもないし台所とつながっているから調理の熱がもろに行くし実際に去年の夏にはハードディスクがお亡くなりになったりしています。
もう少しコンパクトで強固なサーバにしたいなあとも考えていますが、欲しいものがいろいろあってなかなか手を出していません。はてなのDellサーバがうらやましい。一番安い構成で15万円くらいみたい。安いよね。
ステータス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.
高校の学習指導計画書に「高橋メソッド」と「もんたメソッド」が! という記事。ここまで有名だったのか。すげー。笑ったけど。Ruby の名前まで出てるし。
Javascript でソースコードに色をつけるgoogle-code-prettifyを使ってみました。使いかたはとても簡単(こちらを参照 )。さっそくkaeruspoon に適用してみました。
1.まずはここで prettify.cssとprettify.jsを手に入れます。それぞれのファイルを、Rails Root/public/stylesheets/とRails Root/public/javascript s/に置きます。
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 でもいけるね。スタイルシートのほうで色指定できるので、後で調整してみよう。