« 2007年4月 | トップページ | 2007年6月 »

2007年5月の5件の記事

2007年5月28日 (月)

それは名誉の問題なのです!

Sarah BrightmanのDVDを借りて観た。ベッキー似の意外とかわいい顔をしている・・・

って、そんなことはともかくすばらしいステージでした。曲の力も強いし、それを表現するサラタンも凄い。前日思わずアマゾンでポチって同じ日に観たPerfumeも悪くないんだけどね。相手が悪かった。

| | コメント (0) | トラックバック (0)

2007年5月27日 (日)

Linuxカーネル解読室

値段が高いので1週間ほど悩んだ挙句に買いました。内容は流石に難解ですが、むしろその難解さにゾクゾクします。とはいえ、最初にカーネル全体の構成について数ページで概観しながら、本書の章立てについて解説しているので、各章がカーネル全体のどの位置づけにあるのかが把握できるようになっており、そういう意味では読みやすいと思います。難しい内容をシンプルな構成で分かりやすく表現しようという気配りがすばらしいです。分かりやすいコードを書く人たちなんだろうなぁと思いました。

どの章も興味深いのですが、まず惹かれるのはネットワークプロトコルスタックの実装の章。プロトコル自体の解説+実装の解説があってすばらしい。これ以上の解説を望むのであれば、もうソースかRFCを読むしかないのでしょう。

#素直にソースとRFCを読めって?

カーネルといえばソフトウェアの最下層、最深部です。その先にはハードウェアの世界が待っています。どこまで潜れるか。頑張ってみます。

| | コメント (0) | トラックバック (0)

2007年5月24日 (木)

coLinuxその1

お手軽Linux環境として、WindowsXP上にVMWare + FedoraCore6を入れているんですが、いかんせん遅い。そこで、速いと評判のcoLinux環境を構築しようとしているのですが。。。なぜかうまくいきません。SourceForgeからcoLinux-stableのcoLinux-0.6.4.execolinux-0.6.4-20060912-update.zipとRoot FS Images - 2.6.x-basedのFedoraCore6-20070502.exe を落としてD:\freesoft\colinuxに展開したのはいいのですが。。

start-FedoraCore6.batを起動するとWindowsXPが落ちちゃいます。バッチファイルの中のmem=256のオプションがまずいんかな。

coLinuxのオフィシャルWikiでも読んで勉強します。

| | コメント (0) | トラックバック (0)

2007年5月18日 (金)

インターバルタイマ

そもそもCでシグナルとか扱った経験が無いのを常々反省しておりまして、ためしにインターバルタイマなど調べて使ってみました。以下やっとこさ書いたダメソース。

setitimer()システムコールを使って2秒(実時間)のインターバルタイマを開始。2秒おきにSIGALRMを受信すると、現在時刻(timeval構造体)を取得して、その「マイクロ秒部分」を表示する。

#include <stdio.h>
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>

/* シグナルハンドラ */
void handler(int sig){
  struct timeval tv;

  /* 現在時刻取得 */
  gettimeofday(&tv, NULL);

  /* マイクロ秒部分を表示 */
  printf( "%ld usec\n", tv.tv_usec);
}

/* main */
int main(int argc, char **argv){
  struct itimerval itimer;
  struct timeval interval;
  struct sigaction m_act;

  /* 時間間隔設定 */
  interval.tv_sec = 2;
  interval.tv_usec = 0;

  /* インターバルタイマ変数設定 */
  itimer.it_interval = interval;
  itimer.it_value = interval;

  /* sigaction構造体設定。シグナルハンドラの設定等 */
  m_act.sa_handler = handler;
  sigemptyset(&m_act.sa_mask);
  m_act.sa_flags = 0;

  /* シグナル動作変更 */
  sigaction(SIGALRM, &m_act, NULL);

  /* インターバルタイマ開始 */
  setitimer(ITIMER_REAL, &itimer, NULL);

  /* 空回り無限ループ */
  while(1){
 
  } 
  exit(0);
}

 空回り無限ループは何とかならんかと思ったのですが。最初sleepとかしてたんだけど、それだとSIGALRMがかぶってプロセス終了しちゃうし。(なんでだろ?理由を考えよ>ワシ)

 あと、シグナルハンドラの中ってちょっと危険地帯なので、printfとか使っちゃダメらしい。理由はなんとなくしか分かんないんだけど(ってことは分かってない)。それに関連してるのかも知れんけど、上記プログラムを二つのウィンドウで二つ並行して実行したら、出力が2秒ごとにならなくなった。互いに干渉しているっぽい。なんでだろ?gettimeofdayやprintfがまずい?Linuxのシグナル処理のバグ?どうやらウィンドウを切り替える時にタイミングがずれる。負荷がかかるせいかな?

| | コメント (0) | トラックバック (0)

2007年5月16日 (水)

FizzBuzz

流行のFizzBuzzやってみました。私のベストスコアは84↓です

main(i){for(;i<101;i++)printf("%s%s%.d\n",i%3?"":"Fizz",i%5?"":"Buzz",i%3*i%5?i:0);}

Webで調べつつやったけど^^;これ以上縮まらない(´・ω・`)。ポイントは

  • includeなんかしない
  • if文の代わりに三項演算子
  • for文でブロックのための中括弧は使わない
  • argcが1になるのを利用。変数名はi。変数の宣言と初期化を省く
  • 倍数の判定に==を使わない(次に「i%3<1」ってやってたけど、それもやめた)
  • 「15の倍数の場合に"FizzBuzz"とする」を明示的に書かない
  • "Fizz","Buzz"系の文字列を出力するときと、数値を出力するときでprintf()を分けない%.dがミソ)

よくわからないのですが、さらに短くするためには・・・

  • "Fizz"と"Buzz"の"zz"を共通化する?
  • printfを使わない?
  • 数値を表示するための条件を簡素化する?
  • "%s%s"を簡素化する?
  • for文を使わない?
  • bit演算を活用する?
  • asciiコードを活用する?

という方向性があるのかなぁ。。。世界記録は73バイト。大きな発想の転換が要るのか、はたまた地道な作業が要るのか、超テクニカルな技が要るのか。。。

| | コメント (0) | トラックバック (0)

« 2007年4月 | トップページ | 2007年6月 »