HOME | ドキュメント |  ブログ  |  BBS  |  瓦版  | 将棋プロジェクト |  物置小屋   

象歩 ドキュメント

Categories
Zope (46 items)
歳時記 (26 items)
工作 (19 items)
将棋 (25 items)
料理 (2 items)
Vine (27 items)
Squeak (2 items)
(1 items)
雑記 (4 items)
Python (19 items)
ZOPE3 (3 items)
Linux (6 items)
(1 items)
道具 (3 items)
買い物 (1 items)
PC工作 (2 items)
ボート (3 items)
Recent Entries XML
Recent Comments
Recent Trackbacks
Archives
道具

14 June 2007

万年筆

道具  

高校三年生の頃、友人 M. に貰った モンブラン の万年筆。 インディゴブルーのインクの臭いや色が好きでした。 これで物理の問題を描いてると自然に解答が浮かんで来たことを思い出します。 象歩サイトを立ち上げた時、フォントはこの色にしようと思った。

久しぶりに探し出して来ては見たものの、インクが切れてて今日は何も書けません。 志や夢や希望の類は自然に生まれて来るものだとばかり思っていたのですが、 近頃は習慣の大切さをつとに感じます。 seko さんのモチベーションの秘訣 を見てじっくり考えよう。


10 November 2007

128ビット整数クラス

C128 C++クラス
道具  

Athlon64X2 3800+ の SSE を利用して 128 ビットの論理演算が楽にできるのかと思ってたけど ビットシフトAND や SUB の使い勝手がいまいち良く無い (コツを知らないだけ?)。 しょうがないので C++ で クラス C128 を作った。 一応 128 ビットリニアな Shift-L, Shift-R, ADD, SUB と AND, OR, XOR, NOT だけ実装してみました。 乗算、除算はありません。オパピ^^

以下のようなコードで、実装的に一番遅いと思われるビットシフト演算の速度を測ったところ 0.584秒/億。

void test_shift()
{
    C128 c(1);
    for (long i = 0; i < 500000; i++) {
        for (long j = 0; j < 100; j++)
            c <<= 1;
        for (long j = 0; j < 100; j++)
            c >>= 1;
    }
}

上のプログラムの C128 を 64 ビットデータ型 (unsigned long long) を使うように修正し、 オプティマイズ無しでシフト演算してみると 0.340秒/億とあまり差が無い。 消費時間の大部分はループ処理の部分と思われるのであてにならないってことか。 (測定方法が悪いんでね;;)

話は違うけど、 単純な処理をいくつか NASM やインラインアセンブラのコードで試してみてたのですが C++ で組んでオプティマイズをかける (gcc -O3) のと大差ないようです。 特殊な事情が無ければ、今は C/C++ で十分なのだろう。


ソースコード C128.h (ヘッダ部)

// Copyright (C) 2007, Shu KONNO <owa@bg.wakwak.com>. All rights reserved.
// This program is free software licensed under the GPL 2 or above.
// Version: 1.0.0 (2007-11-10)
//
#ifndef _C128_H_
#define _C128_H_
typedef unsigned long long ULong;

class C128 {
private:
    ULong lo;
    ULong hi;
public:
    C128() : lo(0), hi(0) {}
    C128(ULong m, ULong n=0) : lo(m), hi(n) {}
    ~C128() {}
    ULong getl() const { return lo; }
    ULong geth() const { return hi; }
    C128& operator<<=(unsigned int);
    C128 operator<<(unsigned int n) const { return C128(*this) <<= n; }
    C128& operator>>=(unsigned int);
    C128 operator>>(unsigned int n) const { return C128(*this) >>= n; }
    C128& operator+=(ULong);
    C128& operator+=(C128);
    C128 operator+(ULong u) const { return C128(*this) += u; }
    C128 operator+(C128 c) const { return C128(*this) += c; }
    C128 operator+() const { return *this; }
    C128& operator-=(ULong);
    C128& operator-=(C128);
    C128 operator-(ULong u) const { return C128(*this) -= u; }
    C128 operator-(C128 c) const { return C128(*this) -= c; }
    C128 operator-() const { return C128() -= *this; }
    C128& operator&=(C128);
    C128 operator&(C128 c) const { return C128(*this) &= c; }
    C128& operator|=(C128);
    C128 operator|(C128 c) const { return C128(*this) |= c; }
    C128& operator^=(C128);
    C128 operator^(C128 c) const { return C128(*this) ^= c; }
    C128 operator~() const { return C128(~lo, ~hi); };
};
#endif // _C128_H_

ソースコード C128.cpp (処理部)

// Copyright (C) 2007, Shu KONNO <owa@bg.wakwak.com>. All rights reserved.
// This program is free software licensed under the GPL 2 or above.
// Version: 1.0.0 (2007-11-10)
//
#include "C128.h"

C128& C128::operator<<=(unsigned int n)
{
    n &= 0x07f;
    if (n >= 64) {
        hi = lo << (n - 64);
        lo = 0;
    }
    else if (n) {
        hi <<= n;
        hi |= lo >> (64 - n);
        lo <<= n;
    }
    return *this;
}

C128& C128::operator>>=(unsigned int n)
{
    n &= 0x07f;
    if (n >= 64) {
        lo = hi >> (n - 64);
        hi = 0;
    }
    else if (n) {
        lo >>= n;
        lo |= hi << (64 - n);
        hi >>= n;
    }
    return *this;
}

C128& C128::operator+=(ULong u)
{
    ULong t = lo;
    if ((lo += u) < t)
        ++hi;
    return *this;
}

C128& C128::operator+=(C128 c)
{
    ULong t = lo;
    if ((lo += c.lo) < t)
        ++hi;
    hi += c.hi;
    return *this;
}

C128& C128::operator-=(ULong u)
{
    ULong t = lo;
    if ((lo -= u) > t)
        --hi;
    return *this;
}

C128& C128::operator-=(C128 c)
{
    ULong t = lo;
    if ((lo -= c.lo) > t)
        --hi;
    hi -= c.hi;
    return *this;
}

C128& C128::operator&=(C128 c)
{
    lo &= c.lo;
    hi &= c.hi;
    return *this;
}

C128& C128::operator|=(C128 c)
{
    lo |= c.lo;
    hi |= c.hi;
    return *this;
}

C128& C128::operator^=(C128 c)
{
    lo ^= c.lo;
    hi ^= c.hi;
    return *this;
}

14 May 2014

腹心の友

道具  

長年使って来たキーボードですが近頃打ち間違いが多くなりました。 私が劣化したのか、キーボードの寿命が来たのか分かりません。 新しいキーボードを購入しました。 東プレ製「NG0100 REALFORCE91U」です。

使っていると何か幸せを感じるキーボードです。 キータッチ、打鍵音、ツートーンカラーなど普通です。 でもこんな普通のキーボードは久しく見たことがありません。 本体の重量感もしっかりしてます。

Caps Lock 状態が分かりづらいのが強いて云えば欠点かな。 また vi 系エディタ使っていると時に画面が爆発します。 と云うか [ESC] キーの場所を [半角/全角] に奪われたのが痛いと言って分かってくれる友が何人居るだろうか。


左の写真は今まで使って来たキーボードです Windows95発売直後に購入した東芝Brezzaにおまけで付いてきたキーボードです。 それから18年くらい使用してたことになります。(拡大写真は載せません)

その後いろいろ安物のキーボードを購入しましたが、 これはなんやかんや云っても使いやすいキーボードだったので、 メインにずっと使用していました。

今回購入した東プレ製キーボードは配列も、キーのサイズもほぼ同じ。 打鍵感も似ているかもしれません。 東芝製キーボードは掃除して捨てずに仕舞って置くつもりです。


自家製ツールでキートップを外しケースも分解。
天気が良かったので (お薦めはしませんが) 水洗いしました。


とてもきれいになりました。
一応各キーの入力チェックはしました。大丈夫みたい。
これからは予備として緊急時に働いてもらいます。
今までタフな仕事にも付き合ってくれてありがとう。