« 2008年1月 | トップページ | 2008年3月 »

2008年2月の6件の記事

2008年2月25日 (月)

rubyでexcel

備忘録。rubyでexcelをいじれるとのこと。シートがたくさんになると扱いが面倒なので自動化したい。具体的には・・・

・シートの数を数える
・シートごとの印刷設定をする

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

ペンローズのねじれた四次元

分ったこと。

  • この本は難しい
  • ペンローズは不可能な三角形だけじゃなくて天才だった
  • ペンローズのことをマーチン・ガードナーだと(なぜか)勘違いしていた
  • 空間の三次元と時間の一次元は対称ではない

 これ、分る人が読めば、あーなるほどそうだよねーと思えるんだろうけど、門外漢が読むとさっぱり分りません。ただ、著者がたとえを使って何とか「嘘をつかずに」分りやすく説明しようという熱意は伝わってきます。どうせ分らないんだから適当に文学的に表現してしまえーみたいなところを極力抑えていると思います。

僕は、ブラケットとか密度行列の辺りからさっぱり付いていけなくなりました。途中から分らなくなる大学の授業を思い出しました。。。

一般相対論と量子力学の統合に興味があって数学にお強い方、どうぞ。

p.s. 著者の竹内薫って、最近はベストセラー作家なんですね。おまけにJ-Waveで番組を持っているとか。本書の袖の写真に比べて、J-Waveのwebページの写真がチョイ悪親父風になってて、驚きました。

安かったので中古の値段も表示しておきます。

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

2008年2月17日 (日)

Linuxにおける時刻の処理

Linuxでの時刻情報の扱いについてまとめてみます。ちょっとややこしいので。

Linuxでは、3つの時刻があると考えてよいと思います。

  1. BIOSが保持する時刻(ハードウェアクロック)
  2. Linuxのシステムが保持する(システムクロック)
  3. ユーザから見える時刻(例:dateコマンドで表示される時刻)

この3者の関係が分りづらいのです。1.のハードウェアクロックからボトムアップに説明するやり方と、3.のユーザから見える時刻からトップダウン(?)に説明するやり方とあると思いますが、ここでは、1と2、2と3の関係について順に説明してみます。

  • 1.と2.の関係:同じ

。。。それだけです。要は、Linuxは内部的にはハードウェアクロックをそのまま採用しているということです。

  • 2.と3.の関係:以下に示す二つの設定項目によって決まる。

そう、設定項目は1つではなく、2つあるのです。

  1. システムクロック(=ハードウェアクロック)はUTCなのか?ローカルタイムかなのか?設定場所:/etc/sysconfig/clockファイルのUTCの項
  2. このLinuxシステムのロケールはどこか?(≒UTCからの時差は何時間か?)設定場所:/etc/localtime(のリンク先)

もし、1.で、システムクロック(=ハードウェアクロック)がUTCであると設定された場合(UTC=true)、UTCであるシステムクロックと、2.で指定されているロケールの場所(おそらくあなたのいる場所)の時刻にはきっと時差があるので、システムクロックに時差を加味した値が、ユーザからみえる時刻になります。逆に言うと、ユーザに見える時刻は、システムクロックの時刻に、時差を加味したモノになります。

一方、1.で、システムクロック(=ハードウェアクロック)が、ローカルタイムだと設定された場合は、2.で指定されているロケールの場所に寄らず、システムクロックの時刻が、そのままユーザに見えます。なぜなら、システムクロックがローカルタイムだと設定したんだから。

改めて見直してみると、まず、ハードウェアクロックにはタイムゾーンという考え方がそもそもありません。単に時刻です。Linuxはこの値をシステムクロックとして採用するわけですが、このときに、これはUTCなのか?ローカルタイムなのか?という意味づけを行います。つまり、システムクロックには単に時刻だけではなく、UTCなのか、ローカルタイムなのか?という意味づけがされています。そのUTCもしくはローカルタイムと意味付けされたシステムタイムと、/etc/localtimeファイル(のリンク先)に書かれたロケール情報の両方から、見た目上の時刻を表示しているわけです。

これを踏まえて、次回は、C言語における時刻情報の取り扱い方についてまとめて見ます。

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

2008年2月16日 (土)

デザインも考えてみる

本ブログのデザインは今までおしゃれ(?)なチャイナ柄だったのですが、コードをうまく表示できないなど、微妙な表現力に不満があったので、自分で作ることにしました。

チャイナ柄はココログ提供のデザインテンプレートなのですが、細かな修正ができないんですよね。コピーさせてくれれば良いのにな。パクろうと思えばパクれるのでしょうが。

というわけで、しょぼいデザインになりましたが、徐々に改善していきたいと思います。

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

2008年2月13日 (水)

strncpy再び

なんか、poderosaって画面が描画されないバグがあるみたいですね。会社でコーディングしているとき、スクロールさせるとうまく画面が更新がされないのでストレスたまりまくりです。にう。puttyとか使った方がよいのかなー。

さて、strncpyについて、コードで再度考えてみます。そもそもstrncpyの仕様は。。

char * strncpy(char *p_dst, const char *p_src, size_t n)

1.p_srcが指し示すアドレスから始まるnバイトの領域(領域Aとする)を、
  p_dstが指し示すアドレスから始まる領域(領域Bとする)にコピーする
2.ただし、領域Aの途中に'\0'があった場合は、それ以降はコピーでは
  なく、領域Bに'\0'をnバイトになるまで書き込む
3.二つの領域が重なっている場合の動作は未定義
4.返り値はp_dstの指すアドレス。つまりコピー先

です。簡単に言うと、あるアドレスから始まるnバイトの領域を、別のアドレスにコピーするというだけの関数です。ただし、途中に'\0'があった場合の動きがちょっと変です。
なので、これを文字列を扱う関数だと思って不用意に使うと痛い目に遭います。

中身を明示するためにコードで実装してみると。。。

char * strncpy(char *p_dst, const char *p_src, size_t n)
{
    int i = 0;

    // nバイト分繰り返す
    for ( i = 0; i < n; i++){
        // p_srcからp_dstに1バイトずつコピー
        p_dst[i] = p_src[i];

        // もし、p_srcの領域に'\0'が見つかったらコピーはやめる
        if ( '\0' == p_src[i] ){
            break;
        }
    }

    // '\0'以降は、nバイトになるまで、'\0'を書き込む
    for (; i < n; i++){
        p_dst[i] = '\0';
    }
    return p_dst;
}

こんな感じでしょうか(例によって未コンパイル、未試験)。繰り返しになりますが、strncpyは'\0'を書き込むことを保証しないので、strncpyで文字列を扱う場合には、つぎのいずれかの条件を、使う側で保証してあげる必要があります。

  • p_dstからnバイトより先に'\0'があること(strncpyが触る範囲外で'\0'終端する)
  • p_srcからnバイト以内に'\0'があること(strncpyのコピーする範囲で'\0'終端する)

では、また。

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

2008年2月11日 (月)

成功本50冊「勝ち抜け」案内

本書の売りは、最近読まれている「成功本」50冊を、
「成功本マニア」であるところの著者が、実感に基づいて
評価しているところ、そして、これら大量の成功本に共通する
10の「成功法則」を紹介しているところである。
・・・が、僕が感心した本書のキモは、p.274の次の文章に代表されるような、
著者の「成功」「成功本」に対するスタンスであった。

続きを読む "成功本50冊「勝ち抜け」案内"

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

« 2008年1月 | トップページ | 2008年3月 »