2008-09-25
バビリムナマコ
これがもうキモいのなんのって!
外面もキモいし、内臓もキモい。
実はこれは地球外生物です、と言われても信じてしまいそう。
なんかエイリアン9を思い出してしまう。
で、たまたまドルアーガの塔の小説を読み返したばかりで、「バビロニアンキャッスルサーガ」と「バビリムナマコ」のを連想したところにバビローンとか吹き出しがあって、一瞬そういうネタなのかなと思ったのだけど、別に関係なかったかな…
2008-09-02
型の最大最小値
これがしたかっただけなんだけど、ずいぶん大げさになってしまった。
// 型の最大値
template <typename X> struct max_of {
typedef typename SelectNegativePresentation
<X, limits_of_u<X>, limits_of_s2<X>, limits_of_s1<X>, limits_of_sa<X>
>::Result Selected;
static X value() { return Selected::max(); }
};
// 型の最小値
template <typename X> struct min_of {
typedef typename SelectNegativePresentation
<X, limits_of_u<X>, limits_of_s2<X>, limits_of_s1<X>, limits_of_sa<X>
>::Result Selected;
static X value() { return Selected::min(); }
};
ちなみに、シフトによる桁あふれがあるのでg++でコンパイルするとご丁寧に警告を出してくれるのだけど、これが3000行近かったりするw
型の選択
// 型選択
// flagが真ならResultがT1、偽ならResultがT2となるクラステンプレート
template <bool flag, typename T1, typename T2> struct Select {
typedef T1 Result;
};
template <typename T1, typename T2> struct Select<false, T1, T2> {
typedef T2 Result;
};
// 整数の表現形式を選択する
template <typename X, typename U, typename S2, typename S1, typename SA>
struct SelectNegativePresentation {
typedef typename Select<
is_unsigned<X>::value, U,
typename Select<has_sign_and_abs_part_unsafe<X>::value, SA,
typename Select<
is_1s_complement_unsafe<X>::value, S1, S2
>::Result
>::Result
>::Result Result;
};
こいつを使うと、型の最大最小がわかるはず…
整数の表現形式ごとの最大最小
1の補数表現と2の補数表現が同じになってしまってあれっと思ったけど、そういえば+1されてるかどうかの違いだった… 忘れてるなあ。
// 2の補数表現での最大最小
template <typename X> struct limits_of_s2 {
static X max() { return msb<X>::value() ^ ~X(0) ; }
static X min() { return msb<X>::value(); }
};
// 1の補数表現での最大最小
template <typename X> struct limits_of_s1 {
static X max() { return msb<X>::value() ^ ~X(0) ; }
static X min() { return msb<X>::value(); }
};
// 符号ビット+絶対値表現での最大最小
template <typename X> struct limits_of_sa {
static X max() { return msb<X>::value() ^ ~X(0); }
static X min() { return ~X(0); }
};
// 符号なし整数の最大最小
template <typename X> struct limits_of_u {
static X max() { return ~X(0); }
static X min() { return X(0); }
};
整数型のビット数
// Xの範囲で1 << Nが算術的に桁あふれするならvalue==1
template <typename X, unsigned N> struct arith_overflow {
// 1<<0は算術的に桁あふれしないと定義する。
// N>0に対しては、1<<(N-1)が算術的に桁あふれしておらず、
// かつ(1<<N)/2 == 1<<(N-1)が成立する場合、
// 1<<Nは算術的に桁あふれしないと定義する。
// なお、Nビット幅の整数Xに対して(X(1)<<N)==0は必ずしも成立しない。
enum { value = arith_overflow<X, N-1>::value
|| X(X(1) << N) / 2 != X(1) << (N - 1) };
};
template <typename X> struct arith_overflow<X, 0> {
enum { value = 0 }; // 定義より、1<<0は算術的に桁あふれしない
};
// 整数型の有効桁のビット数を得る
template <typename X, unsigned N = 0, bool flag = false> struct valid_bits_of {
// X(1)<<Nが桁あふれする場合(flag != false)の定義
enum { value = N };
};
template <typename X, unsigned N> struct valid_bits_of<X, N, false>
{
// X(1)<<Nが桁あふれしない場合(flag == false)の定義
enum {
// N+1〜N+3で桁あふれするか調べ、分からなければN+4で調べる
value = arith_overflow<X, N + 1>::value ? N + 1
: arith_overflow<X, N + 2>::value ? N + 2
: arith_overflow<X, N + 3>::value ? N + 3
: valid_bits_of<X, N + 4,
arith_overflow<X, N + 4>::value>::value
};
};
// 整数型のビット数を得る
template <typename X> struct bits_of {
enum {
value = valid_bits_of<X>::value + is_signed<X>::value
};
};
// MSBのみが立った数を得る
template <typename X> struct msb {
static X value() {
return X(1) << (bits_of<X>::value - 1);
}
};
valid_bits_ofで名前あってるかな?
なんで4つ飛びに調べてるかというと、Sun C++でテンプレートのネストが深すぎると警告がでたため。
符号つき数値型の表現方式判定
ただし、クラス定義の中で静的クラス変数を定義できる処理系かちょっと思い出せなかったので、列挙定数に置き換え。
あと、符号なしの型を与えるとコンパイルエラーになるようにちょっとだけ修正。
// condが成立しない場合にコンパイルエラーにするマクロ
#define STATIC_ASSERT(cond) typedef char assertFailed[(cond) ? 1 : -1]
// 符号ありの型Xが2の補数表現ならvalue==1
template <typename X> struct is_2s_complement_unsafe {
enum { value = (X(-1) & 3) == 3 };
};
template <typename X>
class is_2s_complement: public is_2s_complement_unsafe<X> {
STATIC_ASSERT(is_signed<X>::value);
};
// 符号ありの型Xが1の補数表現ならvalue==1
template <typename X> struct is_1s_complement_unsafe {
enum { value = (X(-1) & 3) == 2 };
};
template <typename X>
class is_1s_complement: public is_1s_complement_unsafe<X> {
STATIC_ASSERT(is_signed<X>::value);
};
// 符号ありの型Xが符号ビット+絶対値表現ならvalue==1
template <typename X> struct has_sign_and_abs_part_unsafe {
enum { value = (X(-1) & 3) == 1 };
};
template <typename X>
class has_sign_and_abs_part: public has_sign_and_abs_part_unsafe<X> {
STATIC_ASSERT(is_signed<X>::value);
};
型の符号有無判定
ということで、似たようなものをテンプレートメタプログラミングでつくれないかなと試行錯誤中。はてさて…
まずは型の符号有無をコンパイル時に判定するテンプレート。
// Xが符号つきの型ならvalue==1こんな調子でいいのかな?
templatestruct is_signed {
enum { value = 0 > X(-1) };
};
// Xが符号なしの型ならvalue==1
templatestruct is_unsigned {
enum { value = 0 < X(-1) };
};
long longの左シフト
そんなわけで、検証プログラム。
#include <iostream>
int main(int argc, char *argv[]) {
signed long long sll = 1;
unsigned long long ull = 1;
for(int i = 30; i < 70; i++) {
std::cout << "1ll<<" << i << " = " << (sll << i)
<< "\t1ull<<" << i << " = " << (ull << i)
<< std::endl;
}
return 0;
}
Sun C++でコンパイルして実行してみると
1ll<<60 = 1152921504606846976 1ull<<60 = 1152921504606846976
1ll<<61 = 2305843009213693952 1ull<<61 = 2305843009213693952
1ll<<62 = 4611686018427387904 1ull<<62 = 4611686018427387904
1ll<<63 = -9223372036854775808 1ull<<63 = 9223372036854775808
1ll<<64 = 4294967296 1ull<<64 = 4294967296
1ll<<65 = 8589934592 1ull<<65 = 8589934592
1ll<<66 = 17179869184 1ull<<66 = 17179869184
1ll<<67 = 34359738368 1ull<<67 = 34359738368
1ll<<68 = 68719476736 1ull<<68 = 68719476736
1ll<<69 = 137438953472 1ull<<69 = 137438953472
g++でコンパイルして実行してみると
1ll<<60 = 1152921504606846976 1ull<<60 = 1152921504606846976CPUはいずれもAMD Opteron。コンパイラのバージョンは
1ll<<61 = 2305843009213693952 1ull<<61 = 2305843009213693952
1ll<<62 = 4611686018427387904 1ull<<62 = 4611686018427387904
1ll<<63 = -9223372036854775808 1ull<<63 = 9223372036854775808
1ll<<64 = 1 1ull<<64 = 1
1ll<<65 = 2 1ull<<65 = 2
1ll<<66 = 4 1ull<<66 = 4
1ll<<67 = 8 1ull<<67 = 8
1ll<<68 = 16 1ull<<68 = 16
1ll<<69 = 32 1ull<<69 = 32
CC: Sun C++ 5.7 Patch 117831-02 2005/03/30
g++ (GCC) 3.4.3 (csl-sol210-3_4-branch+sol_rpath)
まあ、ビット幅を越えてシフトした場合の振る舞いは未定義だった気がするので、その意味ではおかしくはない。けど、コンパイラによって振る舞いが違うってのはちょっと意外だったなあ。
けど、ビット幅Nの型Xに対して常に(X)(X(1)<<N)==0が成立するとばかり思い込んでいたので、ちょっと期待が外れてしまったりして。
たらいまわし関数その2
ちなみにg++のバージョンはg++ (GCC) 3.4.3 (csl-sol210-3_4-branch+sol_rpath)。ちょっと古いかもしれないので、4.xでは改良されているかもしれない。
で、今度はSun C++で挑戦。
% CC -V
CC: Sun C++ 5.7 Patch 117831-02 2005/03/30
% time CC tarai_t.cc
7.08u 0.17s 0:07.49 96.7%
% ./a.out
Tarai(384, 192, 0) = 384
これもかなり古いけど、意外とあっさりと成功。
2008-09-01
テンプレート版たらいまわし関数
template <bool flag, typename T1, typename T2> struct Select {
typedef T1 Result;
};
template <typename T1, typename T2> struct Select<false, T1, T2> {
typedef T2 Result;
};
template <int x, int y, int z> struct Tarai;
template <int x, int y, int z> struct Tarai1 {
enum { value = y };
};
template <int x, int y, int z> struct Tarai2 {
enum { value = Tarai<
Tarai<x-1,y,z>::value,
Tarai<y-1,z,x>::value,
Tarai<z-1,x,y>::value
>::value };
};
template <int x, int y, int z>
struct Tarai {
typedef Select< (x <= y), Tarai1<x, y, z>, Tarai2<x, y, z> > Selected;
enum { value = Selected::Result::value };
};
#include <iostream>
int main()
{
//enum { x = 768, y = 384, z = 0 };
enum { x = 384, y = 192, z = 0 };
std::cout << "Tarai(" << x << ", " << y << ", " << z << ") = " << Tarai<x,y,z>::value << std::endl;
}こんなものかな。しかし、テンプレートメタプログラミングはコンパイラのエラーを理解するのが大変だなあ…
% time g++ -ftemplate-depth-8000 tarai_t.cc
virtual memory exhausted: 資源が一時的に使用できません。
1215.41u 3.25s 22:23.57 90.7%
(´・ω・`)ショボーン
2008-08-30
d20 system
もっとも、セーブファイルを保存していたり、デバッガを使ってwizardモードに入ったり、識別の魔法が好きな時に使えるパッチを作ったりというまっとうでない遊び方ではあるのだけど…
そんなわけで、D&D由来の文化はすこしばかりなじみがあり、Beolineliedさんの博識っぷりもどっぷり楽しめるクチである。
で、思い出したのだけど、そういえば中学生の時(約20年前)にD&D、しかもDMをやってんだよね… うーん、黒歴史だw
娯楽らしい娯楽もなかった田舎の中学生にとっては、翻訳調丸出しのルールブックも新鮮で楽しかったなあ。もっとも、部活だの仲間割れ(キャラクタのじゃなくてプレーヤーのw)なんだので、ベーシックルールセットさえ終えられなかった気がする。しかもシナリオは完全に自作で、今考えると超赤面ものですよ orz...
で、当時は(というか今でも?)ルールブックはめちゃめちゃ高くて、高レベル(一応当時でもイモータルのルールはあったような気がする)の世界はまったくの未知の世界だったりする。また、NetHackはAD&Dがベースになっているはずだけど、やはりこちらも一度も読んだことがない。
そんなわけで、Beolineliedさんとこを楽しんだはいいものの、「D&D3.5eとか4eってどうなってるんだろ、ルールブック買ってみたいけど、セッションやるわけじゃないし…」と悶々としていたある日のこと、そのベース部分がd20 systemとしてルールが公開されているという情報が!
さっそく見てると… これはすごい。企業戦略も見えなくはないんだけど、「あのルールブックの値段は何だったんだろう?」と思うほどあっけらかんと情報が詰まっていて、英語なのに夢中で読んでしまった次第。
そろそろ日本語でも4版が出るらしいのだけど、私家翻訳版とか作ってみたいなあポワワ (遅いってw)
2008-08-23
sendmailのスマートホストとOBP25
sendmailもしばらく使ってなかったなあ。ローカル配送自体やってなかったし、人間が読むメールはすべてISP頼みだったし。
そもそもsendmail.cfやCF自体いじったことがほとんどない。
大学にいたときはバリバリにsendmailを使っていたけれども、宛先に該当するユーザのGIDでリレーホストを切り替えるという凝ったことをやっていたので、末端の管理者は直接いじらずに過ごせていたので…
そんなわけで、まずはWebmin(w
/usr/sfw/lib/webmin/sendmail/以下のファイルはすべて/usr/local/bin/perlで起動するようになっているので、これを修正してさくっと設定… できなかった orz...
スマートホストは「ホスト経由でメールを送信」をいじれば簡単に設定可能なんだけど、最近のOBP25の設定まではできないようで、ISPのサーバからは接続を拒否されてしまう。
そんなわけで、重い腰を挙げてsendmail.cfの生成にチャレンジ。/etc/mail/cf/cf/sendmail.mcに
を追加し、
define(`SMART_HOST', `メールサーバのアドレス')
define(`RELAY_MAILER_ARGS', `TCP $h ポート')
cd /etc/mail/cf/cf/
make sendmail.cf
cp sendmail.cf /etc/mail
svcadm restart sendmail
でおk
2007-12-06
勤勉なバカは銃殺すべき#3
でも、まだまだ施策がある。
それというのが「コミュニケーションミーティング」なるものだ。
…と書いてはみたが、名前から中身が想像できる人がどれくらいいるのだろう?
実態は、単なる昼礼(フレックス制なので朝礼ではなくて昼礼)の拡大版だったりする。
半年で15回実施したのだけど、自グループの方針説明が7回、
他グループ(ただし同じ部門)の方針説明が3回、開発以外の業務紹介が3回、コンプライアンス・オフショア開発・技術説明会・資格試験の話がそれぞれ1回ずつ。
上で決めたことを単に情報展開しているだけであっても一応情報伝達とは呼べなくはない。
その点においてはたしかに「コミュニケーションの改善」にはなっているw
でも、決定済みのことを一方的に伝えるだけなので、質問も意見も大して出ないし、出たとしても無理やり出しているだけ。まあ、自由闊達に議論しても反映されないので、フラストレーションを溜めるよりは黙ってしまったほうが精神衛生上良いのかもしれないけど。
わざわざ人を集めなくたって、Power Pointの資料配って「読んどいて」で済む話なんだけどね。
これだけの時間を浪費して、いったい何をしたいんだろう?
これも費用は15回*60分*2000円/時×30人=90万といったところか。
あと書いてて気がついたけど、開発部と名前がつく部署なのに、技術関係の話って1回しかなかったのね orz...
2007-11-29
勤勉なバカは銃殺すべき#2
部門内のコミュニケーションのスコアが低かったらしい。そのスコアの算出元となった設問はたしか「職場は暖かい雰囲気か」とか「同僚や上司と協力しあえる環境か」だったと思う。
たしかに飲み会とか喫煙場みたいな濃密な付き合いは昔よりは減っているかもしれないと思うことはある。でもそれは時代の空気というもので、アルコールにしろタバコにしろ、それ自体が廃れつつあるだけの話にしか過ぎない。一方でヘンリエッタのフィギュアや初音ミクをネタに同僚と盛り上がれる(もちろん休み時間にですよ?)ようなふいんきはあるわけで、コミュニケーションが悪いといったことは個人的にはないと思っている。
でも、それについていけないエライ人はそうは思わないみたい。なんと、部門の活動方針として「コミュニケーションの改善」を挙げてしまったのだ。そうなると、中間管理職たちも追従せざるを得ない。その目的のためにとりあえず何かはやりました、という形だけは残さないといけなくなるわけだ。たとえとんちんかんな活動であっても、だ。
で、自分のグループでは何をやったかというと、各自が部員全員の前で好きなテーマで短いスピーチをやること。そしてコミュニケーションミーティングなるものの開催だったりする(こちらは後のエントリで)。
スピーチのほうは、自分の趣味や旅行・イベントのことを話す人が多い。また、そういう「親しみやすい」ネタを話させるのがねらいでもあるのだろう。でも、超インドア派のヲタにとっては、趣味丸出しの話題も出しにくいし、話すべきイベントもない。温泉に行った話なんか聞いても面白くもなんともないし、もともと温泉好きであることは直接聞いて知っているから何の意外性もない。したがってコミュニケーションの改善にはあんまり約に立っていない(少なくとも自分にとっては)。
でも、こんなのでも年間の費用は50週*2回/週*3分*2000円/時*30人=30万円といったところかな。だったら会社の金で焼き肉パーティでもやったほうがずっと効果高いだろうにと思うんだけど。
勤勉なバカは銃殺すべき#1
で、このモラルサーベイだが、部門ごとの集計もエライ人には通知されるようだ。士気の低さが数値として出てしまうわけなので、そういう部門の部門長さんはそれなりに頭を悩ますものらしい。まあ、悩んだ結果、労務管理が改善されてくれればそれはそれでありがたいことではある。なんだかんだ言っても過重労働は減っているし、サービス残業があまりないのは誇るべきことだ(レベル低いw)。
ただ、やはりエライ人クオリティというか、悩んだ結果がとんでもないあさっての方向に突っ走ってしまうこともなくはないという、そんな話。
メールボックス移動中
考えてみれば、このメールボックスってマイラインの登録のおまけに過ぎなかったんだよね。容量が少ないとはいえ、無料でちゃんとした(=フリーメールではない)アドレスがもらえるというのはありがたかった。でも、現在では月200円の有料サービスにしかすぎない。
接続業者としてYahoo!BBを使っているので一応そこのメールボックスも使えるのだけど、自分の中ではybb.ne.jpドメインはなんだか微妙なところ。それにYahoo!に移る時だってけっこうめんどうくさい思いをしたので、接続業者の提供するメールボックスはちょっと避けたい。
で、Niftyとかの大手ISPの従量制コースに申し込むか、レンタルサーバ屋のメールボックスを使うかとなった。ちょっと調べたところ、後者に属するさくらインターネットが年1000円で使えるらしく、そこに決めた次第。
さっそく申し込んで、あちこちに登録したメールアドレスを変更しているけど… けっこう大変だw
2007-11-28
リインフォースIIのフィギュア予約
一応ヲタの端くれとして蒐集癖があるので、ワンルームアパート住まいとしては際限なく集めるわけにもいかず。
で、そのおそれが早くも現実のものとなりますたw
http://www.alter-web.jp/figure/08/04_1/index.html
さっそく最安のamazonで予約。
そして、あちこちで突っ込まれてるけど、はやてマダー?
ヘンリエッタのフィギュアもらった、会社で
会社にヲタな同僚がいるわけですよ。
で、なかなか濃い人なんだけど、翠星石のフィギュアを飾りたいので、
それまで飾っていたヘンリエッタのフィギュアをあげるというありがたい申し出があって。
欲しくないと言ったらウソになる、というよりむしろ超欲しかったので、ちょっと迷ったんだけど頂いちゃいました。
1/8スケールとのことで、なかなかに存在感がある。
いままでリカヴィネやら電撃大王の付録には手を出していたのだけど、これらは5cm程度だからなあ。
まあ、そんなでかいのを会社で飾っていた某氏はそれだけすごいってことでw