プログラミング所感 - 前へ 目次 次へ
2002年である。
買ってもない宝くじが当たったと思うくらいの景気の良さが欲しい。
でも実を収穫するにはタネ蒔きからはじめよう。
GoF の Iterator は
Ruby で言う内部イテレータ、GoF の Visitor は Ruby で言う外部イテレータではないかと、
ふと思った。外部イテレータに渡すクラスは、関数内で宣言するといいかも。
CD-RW のメディアが180円だった。
技術のキーワードに関する会社の人の連携の機構が欲しい。
例えば、C# などの話題での情報交換など。
昔、都市工学で、1000m規模の超高層ビルでのエレベータの設置面積の研究を見たことがあったが、
1000m(500階?)もあるなら、1ラインにN台のエレベータがあるべきなのだろうか?
1階から500階まで1台というのは考えにくい。50階毎に分けたりするんだろうけど、
それより、1ラインにN台入れた方が効率がいいだろう。すれ違えるようになっているともっといいけど。
(かまぼこみたいなのが板で合わさっている形ですれ違う。目を回すか。)
ダブルディスパッチについて。
More Effective C++ で出てくる衝突の例のように、丸と四角と三角のオブジェクトの重なりをチェックしたいとしよう。
よい方法がある。
- 基底クラスは派生クラスを知らなくてよい。
- 高速である。(派生クラスの数に関係なく一定時間)
- 現在のクラスを変更せずに拡張できる。
- 書くのが簡単である。
さて、ちょっと長いけど、例は以下のようになる。
// shape.h
#define DBLDISP_IMP(i) int Id() {return i-1;} \
void Do(int id,CShape* p) {(this->*(func[id]))(*p);} \
static CFunc func[i];
#define DBLDISP_DEC1(T1) DBLDISP_IMP(1) \
void Check##T1(C##T1&);
#define DBLDISP_DEC2(T1,T2) DBLDISP_IMP(2) \
void Check##T1(C##T1&); \
void Check##T2(C##T2&);
#define DBLDISP_DEC3(T1,T2,T3) DBLDISP_IMP(3) \
void Check##T1(C##T1&); \
void Check##T2(C##T2&); \
void Check##T3(C##T3&);
#define DBLDISP_DEF1(T1) \
CShape::CFunc C##T1::func[1] = {(CFunc)Check##T1};
#define DBLDISP_DEF2(T1,T2) \
CShape::CFunc C##T2::func[2] = {(CFunc)Check##T1,(CFunc)Check##T2};
#define DBLDISP_DEF3(T1,T2,T3) \
CShape::CFunc C##T3::func[3] = {(CFunc)Check##T1,(CFunc)Check##T2,(CFunc)Check##T3};
// 上記マクロは十分に用意しておく
struct CShape {
typedef void (CShape::*CFunc)(CShape&);
virtual int Id() = 0;
virtual void Do(int id,CShape* p) = 0;
void Check(CShape* p) {
int id = Id(), id2 = p->Id();
if (id >= id2) Do(id2,p);
else p->Do(id,this);
}
};
// circ.h
#include "shape.h"
#include <cstdio>
struct CCircle : CShape {
DBLDISP_DEC1(Circle)
};
// circ.cpp
#include "circ.h"
DBLDISP_DEF1(Circle)
void CCircle::CheckCircle(CCircle&) {printf("Circ Circ\n");}
// rect.h
#include "circ.h"
struct CRect : CShape {
DBLDISP_DEC2(Circle,Rect)
};
// rect.cpp
#include "rect.h"
DBLDISP_DEF2(Circle,Rect)
void CRect::CheckCircle(CCircle&) {printf("Rect Circ\n");}
void CRect::CheckRect(CRect&) {printf("Rect Rect\n");}
// tri.h
#include "rect.h"
struct CTri : CShape {
DBLDISP_DEC3(Circle,Rect,Tri)
};
// tri.cpp
#include "tri.h"
DBLDISP_DEF3(Circle,Rect,Tri)
void CTri::CheckCircle(CCircle&) {printf("Tri Circ\n");}
void CTri::CheckRect(CRect&) {printf("Tri Rect\n");}
void CTri::CheckTri(CTri&) {printf("Tri Tri\n");}
// main.cpp
#include "tri.h"
int main()
{
CCircle circ;
CRect rect;
CTri tri;
CShape* p[] = {&circ,&rect,&tri};
int i,j, n = sizeof(p)/sizeof(*p);
for (i=0;i<n;++i) for (j=0;j<n;++j)
p[i]->Check(p[j]);
return 0;
}
|
ダブルディスパッチの肝は、1つ目のディスパッチを仮想関数で行った後、
2つ目のディスパッチをどのように行うかである。仮想関数でやれば、
手っ取り早いが、基底クラスが全ての派生クラスを知る必要があり拡張しにくい。
本では、マップを使用するのを薦めていたが、速度に難がある。
解決方法は、1つ目の仮想関数で2つ目の振り分けをしてしまうのだ。
そのとき、配列を用いれば、遅くならないし、依存関係も最小で済む。
後は、各クラス毎にユニークな整数値(ID)があればよい。
テンプレートの補助ライブラリを用意すれば、shape.h に相当するものをもっと汎用的に書けるだろう。
JR のスイカカードで
いろいろビジネスができそうだ。
localtime とすべきところを gmtime にしていて日付の取得でバグった。
午前9時までに実行しないと気づかないバグだった。
VC++ のプロジェクトをフォルダごとコピーして拡張していると、
修正しても何も反映されない。よくよく見ると、実行モジュールが元のフォルダのexeだった。
リビルドにも時間がかかってしばらく悩んだ。
もう、2002年だし、
これから年は下3桁にしよう。(2桁でも100年困らないけど。)
こんなこと書いている場合じゃないな。
PPList を修正した。
時刻、メッセージ、音声を自由に出せるようにした。
こういうタイマーの機能は、最初から PowerPoint の機能として入っていてもいいと思う。
開始時に指定ページから始めるというのを、(メッセージを投げずに)
起動時のオプションで指定できないだろうか。
Java はどこかで道を誤ったのではないか。
C# 対 Java の Sun と MS の構図を見ると、C# の方が分がありそうに思える。
C がこれほどまでに使われているのに、(明らかに便利になった) C++ が Cほど
普及していない現状を見て欲しい。C# もシンプルさを忘れないようにすべきだ。
ユーザが何を望んでいて(現状と将来において)何を提供できるのかを常に考えるべきだ。
国民の税金を何兆円も投入している
銀行で、何故、銀行員の給与が世間の水準以上なのか、
誰か説明して欲しい。あと、こういった税金の使い方の監査はどこがしているのか。
銀行の不良債権が、過去最高に
なっている。悪循環を断ち切るには、不要な所を切り捨てるしかない。
銀行自身も例外ではない。
「田中外相更迭はおかしい」との世論が高まっている。
小泉総理は間違った。「外務省内の連携がまずかった」という責任は、
田中外相にあるとはいえ、更迭すべきでなかった。
鈴木氏より田中氏の方が男らしい。
評価制度に透明性を持たせるには、横断的に判断するところが必要だと思う。
今年から、「室員は年に最低1回は学会に参加すること」にしよう。
Effective STL を読んでいる。
STL を効果的に使うには、STL の実装を知るのはいい方法だろう。
それには、STL 相当の簡単なものを自前で作成してみるといいかもしれない。
list::sort は安定だそうだ。試してみたが確かにそうなっている。でも、どこにも書いていない。
list::sort の引数ありのやつは逆順にできるだけだ(少なくともVC++6は)。
任意の比較関数を使いたいんだが。
STLport か
Dinkumware使えってか。
ついでに、SGI と
Boostもリンク張っておくか。
項目43「ループを書くよりアルゴリズムを優先して使おう」で for_each に関して
私は、いちいち関数オブジェクト書くのが嫌なので
for_each はほとんど使わない。
#define for_all(c,i) for (i=c.begin();i!=c.end();++i)
|
項目43の理由として、効率、正確さ、保守性を上げているが、上記マクロを
使用しても正確さ、保守性は損ねない。効率も for_each と比較したが、全く同じであった。
といいつつ、(begin、end を書くのに慣れてしまったので)上記マクロは使っていない。
Boost に
グラフクラスがある!ううむ、ちょっと見ただけだけど、使いにくそう。
(STLらしくない。隣接行列を使っている。)
ブッシュ政権が京都議定書を破棄したのはエンロンが糸を引いていたとの話を聞いた。
ADSL を引いた。
グラフクラスで、
多重辺を可能にするために、接続反復子のキーと値を入替えたが、
そうすると、2頂点の間に辺があるかどうか探すのに不便だな。
multimap にすればいいのかな。隣接行列持ってりゃ定数時間だけど、
隣接行列方式は、(1)メモリが無駄だし、(2)頂点の挿入・削除コストが高すぎる。
しかし、用途によっては便利だろう。ということで、Boost のグラフクラスでも使えるかもね。
余談だが、「グラフクラス」だと棒グラフや折れ線グラフの「グラフ」をイメージされるんじゃないかと思って、
「ネットワーククラス」と名前変えようかとも考えたが、Boost でもグラフと言っているので安心した。
次期 STL では、グラフもツリーも行列も使えるといいな。
あと、C++ でもブロックを無名の関数オブジェクトみたいに使えるといいな。
保守性を考えるなら、「この種類を増やすときは、これこれをしろ」みたいな手順書を
ある程度、強制できるようになっているといいかも。
(デザパタは強制してはないと思うが、強制しているようなパターンあったかな?
というか言語的に支援されてないと無理か。)
あと、前提条件などを(Smalltalkみたいに?)言語でも取り扱っているといいと思う。
まぁ、でもこういうのは lint みたいにアプリでも対応できるか、ある程度は。
2ch の AA を見てふと、
思ったのだが、AM(Ascii Movie)とか面白いかも。
こんなとこ書いたらもうだめだが、特許とると面白いかも。
Google で
プログラミングコンテストをするそうだ。
OR関係者なら、ネタ一杯持っていると思うんだけど。
統合オペレーション部会でいろいろやっているし。
Google で、画像検索もできるから、画像処理なんか狙い目じゃないだろうか
(大半は文字処理で応募しそうだから)。
サポートベクタマシンとか。
20億ページとか言っているから、画像は対象外か?
今気づいたが、Google で Usenet の記事を読んだり検索できる。
fj はないのかな(読まないけど)。
日経コンピュータ(2.11) にUFJ の記事載るかなと思っていたのだが、載ってないね。
Web にはあるけど。
システム統合はうまくいくという確信を得た
とか
統合システムを無事稼働
とか言ってたのにね。
日立ソフトが国内初の CMMI レベル3を取得だそうです。
2002年になってから、2回もひろゆき氏が日経コンピュータに顔写真付きで出ている。すごいね。
MS もセキュリティを気にしているという
パフォーマンスを見せている。
それ以前に、何故、セキュリティ意識のない製品(Windows,IE)
がインターネットでデファクトスタンダードになってしまったんだろう。
しかし、次から次へと
よく出るね。管理者としては、部内の誰がどこまでパッチ当てたかすぐわかるようになっているといいね。
またバグった。
ポインタのvectorをメンバに持つクラスに、コピーコンストラクタ、代入演算子(ビッグ2)を定義していなかった。
メンバにポインタもしくは、ポインタのコンテナを持っていてビッグ2を宣言していなかったら
警告を出すツールが欲しい。typedef を多用されていると、自前で作るのはつらい。
学研の電子ブロック、
予約しました。子供が壊さなきゃいいんだけど。
(2個買えばよかったと、一瞬思ったりして)
触られたら、間違いなく壊されそうだな。
(昔、買った電子ブロックもよく壊れて半田付けしてたし。)
高校でサーチエンジンの使い方の演習を
している。
実践事例(PDF)
どこを見て、何をキーワードにして、出てきたサイトのどこをクリックしてって全部書いてあるけど、
その通りに言っているんだろうか(相手は小学生か?)そのうち、先生が生徒に教わるようになるんじゃないの。
生徒間で自由に情報のやり取りができるようにもすべきだろう。
教育機関向けのポータルサイト構築ってビジネスになるかも。
「C# は、C++ をベースにしています。Java をまねたものではありません」
そうですか。。。いやいや言論の自由なんだけど、脱力するんだよね。
こういっている人を見たり読んだりすると。
メモ:医療向けの車両のカスタマイズ。
顧客にとっての魅力は何か?
総務省のデータ
を使って、数理計画の問題を解かせる。例題は?
期待する部下。
- 顧客の問題を理解する。
- 解決方法を提案できる。
- 顧客の言葉でコミュニケーションできる。
- 顧客の立場で(代替案等を)考えられる。
- 自分のすべきことをコミットし実行する。
- できそうかできそうでないかの判断ができる。
- 調査して解決できる。
- 最新技術に興味を持ち、常に技術力向上をする。
- ビジネスにも強い。
- 大局的判断ができる。
- 苦労を楽しむ。
まず、自分がそうなれと。
期待する上司。
とか。
技術士(情報工学)受かった。
よかった。よかった。
登録、名刺注文をしないと。
CGI で検索システムを作成している。
認証機能、セッション機能をC++で自前で作成した。
(CGI を C++ でやる人は殆どいないんだろうな)
検索時間が数秒もかかる。何故だ。
社内システムをWebサービスにして欲しい。
GUI が使いづらいので、申請の受付だけしてくれればいいんだけど。
要望メールを出したら、返事が来た。なんと、別途Excel等で作成して添付してもよいとのこと。
(前から掲示板に出てたようだ)
メモ:sprintf の代わりに snprintf を使う。
#include <string>
#include <vector>
#include <cstdarg>
using namespace std;
int strprintf(string& s,const char *format,...)
{
va_list va;
va_start(va,format);
vector<char> buf;
int k, n = 63;
while (n < 65536) {
buf.resize(n+1);
k = _vsnprintf(&buf[0],n,format,va);
if (k > 0 && k < n) break;
n = n*2 + 1;
}
va_end(va);
s.assign(buf.begin(),buf.end());
return k;
} |
そもそも、これ使えばいいね。
モンティ・ホール・ジレンマ
の話を見つけた。
Mr.X がA,B,Cのラベルのついたコップを伏せ、100円をどれか1つだけにあなたに見せないように入れた。
そして、あなたに100円の入っているコップを 1つ選ばせたあとで、
Mr.X は、あなたの選んだのと違うコップを明け、選択を変更してもよいと言った。
選択を変更すべきかどうか?
|
いろいろ調べたが、どこも「変えた方がよい」という答えしか見つからない。
しかし、答えは、Mr.X の思惑如何である。
#include <cstdio>
#include <cstdlib>
int Rand(int i){return (rand()>>8)%i;}
int main(int argc,char** argv)
{
int cnt,ex,suc,prz,you;
ex = argc <= 1 ? 0 : atoi(argv[1]);
cnt = suc = 0;
srand(1);
while (cnt < 10000) {
prz = Rand(3); // 当たり
you = Rand(3); // あなたの選んだもの
if ((you == prz ? 1 : -1)*(Rand(100) < ex ? -1 : 1) == 1)
continue; // Mr.X はお気に召さないので、残りを空けない
if (you == prz) ++suc;
++cnt;
}
printf("Mr.Xの思惑 %.2f\n試行結果 %.2f\n",ex*0.01,double(suc)/cnt);
return 0;
} |
Mr.X の思惑として 0-100 の値を引数にして実行してみよう。
問題に「Mr.X は、必ず空のコップを空けるものとする」という条件をつければ、
変えた方が当たる確率が高くなる。
単に「Mr.X がコップを空けた状態」での確率は0から100%までで決まらない。
(もっとも、モンティ・ホールは、必ず、ハズレを見せていたようだが)
長くなったけど、言いたいことは「条件をきちんと書かんと答えは決まらんよ」。
「1000万ステップ級のプロジェクトにPerl を採用」
... 日経コンピュータ 3.11号、動かないコンピュータより
いくらなんでも、1000万ステップ全部 Perl で書かないんじゃないの。
(ロジック部分は C とか)。Perl で1000万ステップ、仮に開発できても保守できるのかな。
(実際、開発できなかったようだが。)しかし、損害20億以上とはね。
私も、プログラミング言語C++第3版 23章でも読み直すかな。
Mersenne Twister だそうだ。自作の奴と速度と精度を比較してみるか。
#include<stdio.h>
#define T(u,v) ((((u)&0x8000000|(v)&0x7FFFFFFF)>>1)^((v)&1?0x9908b0df:0))
struct CMT {
enum {Seed = 4357, NSize = 624};
int m_pos;
unsigned long m_dat[624];
CMT()
{
m_dat[m_pos = 0] = Seed;
for (int i=1;i<NSize;++i) m_dat[i] = 69069 * m_dat[i-1];
}
void shuffle()
{
int K = 227, M = NSize-K;
for (int i=0;i<K;++i) m_dat[i] = m_dat[i+M]^T(m_dat[i],m_dat[i+1]);
for (;i<NSize-1;++i) m_dat[i] = m_dat[i-K]^T(m_dat[i],m_dat[i+1]);
m_dat[NSize-1] = m_dat[M-1]^T(m_dat[NSize-1],m_dat[0]);
m_pos = 0;
}
unsigned long MTrand()
{
unsigned long y;
if (++m_pos > NSize) shuffle();
y = m_dat[m_pos];
y ^= y>>11;
y ^= (y<<7)&0x9d2c5680;
y ^= (y<<15)&0xefc60000;
return y^(y>>18);
}
};
main()
{
CMT mt;
for (int i=0;i<10;++i) {
printf("%lx\n",mt.MTrand());
}
return 0;
} |
封筒の問題を1つ。
「Mr.X はさいころを手に持ってこう言った。『1から6までの2つの異なる数字を、別々のカードに書いてそれぞれ封筒に入れる。あなたは好きな方の封筒を1つ開けてカードを見てよい。それで、どちらの封筒の数字が大きいか答えよ』
Mr.X は私がどちらの封筒を開けても、答えが分からないように2つの数字を選んだと言ったが、そのようなことは可能か?」
答えは、可能である。さて、一方の封筒を開けてみると、その数字は、
. . . . . . .
3.1415926535897932 であった。
もう1つ。
「Mr.X は、2つの封筒にお金を入れたという。片方は、もう片方の倍の金額だそうだ。片方の封筒を開けてみると、
200円入っていた。もう片方の封筒には、100円か400円入っていることになる。期待値は、(100+400)/2 で250円だから、
もう片方の封筒を選んだ方がよい。本当かどうか?」
この条件だけではなんともいえない。
もう少し、問題を限定してみよう。Mr.X は、平均 n の指数分布に従う乱数1つ(r)を選び、
片方にr 円、もう片方に2r 円入れたとする。
さて、あなたが、封筒を開けると、a 円であった。あなたは、n を知っているとすると、
r がa (もう一方が2a)になる確率=exp(-a/n)/n、2r がa(もう一方が0.5a)になる確率=0.5exp(-0.5a/n)/n
なので、期待値が計算できる。戦略としては、a が n e以下ならもう一方を選び、n e 以上なら開けた方を選ぶ。
(但し、e=2.718281828)
もし、n =1000とすると、開けてみて2718円超えていれば、もう片方を選ばない方がよい。
(n を知らなかったら、どちらがいいかは判らない。もう片方の期待値は a かどうかも不明。
何故なら、もう片方の期待値がaとすると、2a の確率は、0.5a の半分と決定されてしまうから。)
この問題は、「Mr.X は100円か200円か400円のどれかを比が2になるように封筒に入れて、1つは200円だった。
もう片方は?」と考えればいい。しかし、比が2とした時点で、片方は必ず、200円である。
すなわち、片方開けても、何の情報にもなっていない。すなわち、「Mr.X は、100円か400円を
1つの封筒に入れた。
さてどちらが入っているか?」と聞いているのと同じことである。もちろん、判るわけがない。
現実において、2つの選択肢の確率が不明な場合に半々としてしまうのは、
計算しているのではなく仮定しているだけである。
std::random_shuffle がランダムじゃないので自作。
template <typename RanIt>
void random_shuffle2(RanIt b,RanIt e)
{
int n = e-b;
while (n) {
iter_swap(b,b+(rand()>>8)%n);
++b;
--n;
}
} |
ウィルスが広がっていく
ようすをシミュレーションすると面白いかも。
アドレス帳のサイズや exe を実行しちゃう人の確率を変えて、時間経過と感染数を見るとか。
添付ファイルのフォルダがわかっていれば、ウィルスを流行らせるのと同時に、
ワクチンメーカ等のトップページに(クラックして)例のセキュリティホールを埋め込んでおくと
やばいな。 いやいや、検索する人を考えると、ヒットしそうなキーワードを用意して、
自前でWebページ用意しててもやばいな。そもそも、HTML とかURLをメールで送っちゃえば、
もっとやばいかも。こんなこと書いてていいのか。
早よ、
セキュリティホール直してよ。
優れた情報漏洩後の対応。
- (過去) 本件発生原因・事実経過
- (現在) 現在のお客様情報管理体制
- (未来) 再発防止策
- (個別対応) 該当する顧客に対し、お詫びを書面で郵送する
ネットセキュリティの記事より。
参考:5/9
日本の現状
優れている要因
- 経済規模が大きい。GDP は4 兆1,472 億ドルで世界第2 位(2001 年)、1 人当たりGDP も3 万
7,540 ドルで世界第2 位の地位にある(2000 年)。
- 経常収支が黒字基調にある。最近やや停滞傾向にあるが、黒字のGDP 比率は2.5 %(2000
年)で、他の先進国より高い。貿易収支は最近減少傾向にあるが、海外投資による所得収
支がこれをカバーする成熟経済の構造になっている。
- 対外純資産は133 兆470 億円、外貨準備高は4,008.8 億ドル(2002 年1 月末)で、いずれも世
界第1 位である。
- 家計の貯蓄率は11.3 %で、先進国では最高であり、個人の金融資産は1,404 兆円に及ぶ。
- 製造業は比較優位を保っている。最近、モノづくりの海外移転が進みつつあるが、ハイテ
ク要素の高いモノづくり(チエモノ)は依然として優れている。労働力の質も高い。最近
では、積極的に構造改革に取り組む企業が増え、収益性を高めるため、提携合併、アウト
ソーシング、国際戦略の展開、規制緩和を活用した新規分野への進出などが拡がっている。
- 研究開発水準が高い。日本のR&D のGDP に対する比率は3.12%で、アメリカの2.63 %、ド
イツの2.37 %、フランスの2.17 %、イギリスの1.87 %よりも高い(1999 年)。特許権の登
録件数も23 万3,000 件で、アメリカ−19 万件、ドイツ−9 万2,000 件、フランス−4 万4,000
件、イギリス−2 万9,000 件を上回っている(1998 年)。
劣っている要因
- 経済成長力が低下している。財政、金融などの景気刺激策が作用しなくなり、1990 年代に
は年平均1 %の成長に止まった。失業率が2001 年12 月には5.6 %に達し、さらに上昇する
可能性が高い。潜在成長率は0.5 〜1.0 %程度に止まる。
- 日本の企業の収益性が低い(ROE :日本−2.17 %、アメリカ−12.9 %、イギリス−
11.43 %。(2000 年))。その背景として、労働分配率も資本係数も上昇傾向にあり、最近で
はアメリカのそれを上回っている。ベンチャービジネスは、アメリカはいうに及ばず、シ
ンガポール、韓国などより低調である。前出のIMD の国際競争力調査によると新規産業の
創出は最下位である。
- 市場機能の効率性に欠けている。規制緩和など構造改革が遅れているため、企業が新しい
市場開拓や技術に挑戦する気運が高まらない。企業の意思決定の責任のあいまいさが企業
の活力を損ねている。
- 政府の所得再配分機能への依存が高い。国土の均衡ある発展、福祉社会の実現などを目指
して、地方の公共投資の拡大、農業の保護、課税最低限の引き上げ、年金医療への支出増
大などが進み、財政を圧迫している。これは、同時に人々の政府依存の意識を高めている。
- 財政構造が悪化している。国の債務のGDP に対する比率は130 %にも及び、先進国の中で
は最低である。国債発行の格付けも、次第に下げられている。
- 情報化への対応が遅れている。パソコンの普及率が31.5 %(2000 年)、インターネットの
普及率が37.1 %(2000 年)で、アメリカ、北欧はおろかシンガポール、台湾、韓国よりも
遅れている。2005 年にIT 大国になるという目標が達成できるかが課題である。
- 国内の高コスト構造が是正されていない。そのため、製造業が中国を始めアジアに大幅に
移転し、製造業の競争力が低下している。その結果、国際収支構造が弱体化し、貿易収支
が1998 年のピーク時の16 兆円から、2000 年で12 兆円に、経常収支がピーク時の1998 年の
15 兆円から2000 年には12 兆円に減少している。その結果、円安傾向が進んでいる。
- 不良債権の処理が進まない。政府の対策の遅れと銀行経営者の決断の先送りから、金融不
安が一向に解消せず、その結果、海外の投資家の投資意欲をそぎ、株式市場の不振につな
がっている。
- 基礎研究(ライフサイエンス、ナノテクノロジーなど)、大型システムの開発などで、アメ
リカなど他の先進国に遅れをとっている。ノーベル賞の自然科学部門の受賞者は、2001 年
末までにアメリカ−198 人、イギリス−70 人、ドイツ−63 人、フランス−29 人であるのに
対し、日本はわずか7 人である。特に日本の研究活動は、オープン性と効率性に欠けている。
- 人口減少と高齢化が急速に進行する。人口は、2006 年の1 億2,774 万人をピークに減少に
転じ、2050 年には1 億59 万人、2100 年に6,400 万人に減少する。かつ高齢化が急速に進み、
65 歳以上の人口比は2000 年の17.4 %が、2025 年には28.7 % 2050 年には35.7 %に達する。
その結果、貯蓄率の低下、投資の停滞、成長力の鈍化、財政負担の増加、金融証券市場の
不安定化などを招く。
電通の記事(PDF)より
こういった問題に対応する専任グループを作って、各関係機関同士がスムーズな連携をできるように
して欲しい(>小泉さん)。特に、教育に関する問題は早急に何とかすべきだと思う。
個人は、ゆとりを持ち、変化を受け入れ、変化を生み出すようになるべきだと思う。
メモ:全国民にメールアドレス。ドメインを数百以上用意し、アドレスは姓名。
メーラに秘書的役割。世界的DB。
オンラインの電子データの印刷物以上の高信頼性。定理の検索。
検索向きの言語。推論可能に(例:「今週1位の映画の主題歌の歌手の誕生日」と入力して一発で結果表示)。
追加ハードなしのPCの最強の認証方法。
Flash or ActiveX で作成して「画像をなぞる」。なぞったのが終了したら、サーバに送信してチェック。
一筆書きでなくてもよいが、入力なしで2秒たったら送信。クライアント(Flash)自体は、
認証せずサーバに送るだけ。
技術ポイント
- 画像サイズは、PDAも考慮して世界共通(360x182とか、2バイトで表せる。変位を持てば、もっとでかくてもいいし、1バイトにできる。)。
- 情報は、折線のリスト list<list<pair<int,int> > > にする。クライアント側で、1本の折線の長さは、128点までにする。また、本数は32本(8192バイト)までにして、サーバへの転送量を抑える。
- 認証は、一筆ごとに。元と同じ比率で、点を再生成し、距離の平均をとる。
- サインと違い、背景があるので、起点を定めやすい。
特許取れるかな。サインそのものだからだめか。まじめにやれば、助成金もらえそうだけど。
「動かないコンピュータ」
(日経コンピュータ) のコープの事例は、興味深い。
サイト増強により、一部の顧客がアクセスできなくなった。
パッチを充ててない IE5.01 だけで起こる、SSL のマイナーなバグと判明。
SI ベンダに相談するも、サポート担当者から「サーバに問題なし」との回答。
しかし、サーバベンダは、サーバ側で対応できる修正パッチを(SI ベンダにも)既に配布してあった。
結局、週に1億の売上があるサイトを、1日後に対応できた所を3日かかった。
|
Webによる運用システムの大変さがわかる。
サポート担当者の対応は、適切とは言えないが、誰でもやってしまいそうで怖い。
みずほも初日から、
ATM が動かないようだ。
- テストぐらいやりましょう。(記事を見る限りしているようには思えない)
- 「障害を出すな」とは言わないけど、障害が出たときの対処方法ぐらい、きちんとしておきましょう。
これができていないときは、管理に問題があります。リリースは延期しましょう。
他山の石。
写真が取れる携帯が流行っている。巷でもよく見かける。
プリクラぐらいでいいから、印刷もできないだろうか。
名刺もらったときに、簡単に印刷できると嬉しいのだが。
どうでもいい話だが、
ある程度広めようという名前の場合、それなりにユニークにした方がいいだろう。
検索して関係ないのが引っかかったりしないように。
メガネの三城は、Prolog で
会計システムと人事管理システム構築ですか。
チャレンジャーですね。保守費用高くつきませんかね。
ある会社の話。
- ドキュメントが揃ってなく、「いついつまでに完成させる」と明言しない。
- 業績が悪化した原因を分析しない。利益を出すビジネスプランがない。
- 業務に必要な教育を行わない。
- 瑕疵担保期間がなく、バグ対応に追われ、士気が低下し赤字となる。
- 仕様変更とバグ対応の区別がない。できない。
- 開発にかかった工数を管理していない。
- 業務分析ができない。顧客の問題が理解できない。
- SEが設計するが、設計のバグはプログラマが対応する。
- 見積がおかしい。
- 会社で使うソフトが個人のもの。
公営地下鉄の累積赤字、
2.3兆で増加中だそうです。「民営化したら...」
JR は民営化したが、サービス業とは思えない。でも業績はいいんだよね。税金で借金返したくせに、納得いかん。
一昨日、昨日と事故ってたけど、案内の情報が全て不正確。
- 発生時刻:00:00 ... 間違っているなら書くなよ。
- 発生場所:武蔵小金井 ... 後で聞いたら四ツ谷になってたぞ。
- 発生路線:中央線快速 ... 各駅の総武線も止まってたみたいだが。
なんとかしろよ。駅員に誠意が感じられん。それにしても、中央線で事故ると快速と各駅停車と両方止まることが多い。
まぁ、片方だけ動いても混んで乗れないけど。
JR よ。事故ったら、「いつまでにどこが動くか」すぐにアナウンスせよ。対応悪すぎ。
プログラミング所感というよりグチになっているな。
「みずほパニック」とかいろいろ造語ができている。
ここまできたら、日経コンピュータで特集組んでくれ。
記者会見でのいろいろな社長の発言が、叩かれることが多い。
政治家みたいな答弁がいいとは言わないけど。
スラッシュドットで半角カナの話で盛り上がって
いる。(スコア5というのがあった)
思い出したこと。
- 基本的に、私は半角カナは使わない。ニュースのリーダが化けるかどうか、半角カナの投稿を local.test のしたら、「半角カナは止めましょう」とリプライされたことがあった。「半角カナはテストもしない方がいい?」、「テスト投稿の内容に返信するのもあり?」。
- 顧客のDB 内の名称が、半角英数や全角英数や半角カナや全角カナが入り乱れてたので、半角に統一してもらった。(上記と違うけど例外)
その後、顧客から、半角カナはやめて全角カナにしたいという当然の要望により変換作業を行ったのだが、問題が生じた。1対多対応なので、いちいち顧客に確認しないといけない(さらに恒久的にそれを使うようにしてもらう)。例えば、城ヶ島、城ケ島とか。
- 全角カナと半角カナのコードってばらばらだよね。
- VC++ のAppWizard って半角カナで生成しなかったけ。
結構使っている人多いよね。
POP で一定間隔でメール取ってくるときの取得メール数がポアソン分布に従っているかどうか調べると面白いかも。
無名でも匿名でも著作権は有効だそうだ。
但し、行使するには本人であることの証明がいるそうだ。
そういえば、そういう証明を商売にしているところがあったな。
PDAを使って車両管理システムを開発。データが揃ってくれば、何かできるかも。
組合わせ最適化演習ソフト
- 組合わせ最適化の例を体験する Windows ソフト。
- 画面上に地図を表示し、予め設定された顧客が点で表示される。
- マウスクリックにより店舗を追加できる。店舗が揃えているメニューも指定できる。
- 出店とメニューを揃えるには費用がかかり、予算の総額は設定されている。
- 顧客が出かける距離は設定されており、店を中心とした円で示される。
- 顧客はカバーされている最も近い店に注文したいメニューがあれば、1回だけ注文を出す。
- 店舗の配置を完了すると、売上高が表示される。売上高を最大にする出店計画を作成することが目的。
- 出店計画を手動で作成させてみる。次に、出店計画を自動で求めるアルゴリズムを作成させる。
但し、アルゴリズムからは、顧客情報にはアクセスできず、出店計画から売上高を求めることだけできる。
- アルゴリズムで行うときは、出店場所は、予め用意されたポイントだけにするとよいかも。
- 距離と注文するかどうかをランダムにして、複数回の試行の平均を出すようにしても面白いかも。
- 注文に複数の候補を持たせてもよいかも。
- 売上の上限は決まっているので、上限にどれだけ近いか確認できる。
単体法(Simplex法でないやつ)を説明しておくといいかも。
ネットワーク型の問題も何かないかな。
ソフトウェア職人気質を読んでいる。
いい本である。室内指定図書に入れよう。よい方法論に共通するものがある。
すなわち、「現状の認識、分析」、「フィードバッグ、改善の継続」、
「バランス感覚、潔さ」、「楽しさ、ボジティブ」である。
大学教育で、足りないものがある。ビジネスの基本(時間を守る。約束を守る。業務上の秘密を漏らさないなど)を抑えた上での、現場での実習である。
海外の大学では実施されているが、日本では殆ど行われていない。
是非、取り入れて欲しい。
ものごとをよくする単純な方法がある。「よいと信じる」ことだ。
ペアプログラミングは、言葉と裏腹に、実際には対等の関係は少なく、片方が片方に教えることが多いのではないだろうか。役割が変わることもたまにはあるだろうけど。
時事ネタとか占いとか人生相談をするAI ソフトが
できるんじゃないでしょうか。常時接続環境で、インターネットからネタを拾ってきたり
自分自身を勝手にバージョンアップしたり。ううむ、ポストペットが進化したらそうなるかも。
(既になっている?)
色の名前のついた OS があってもいいんじゃないかな。(Windows Black とか。Blue は落ちるのを連想するが。)Red Hat というのはあるな。
言語でもいいな。Dark Brown Java とか。なんかよくわからんけど。
PPList の人気がない。何でだ。
大規模システムについて。
いろいろな本(プログラミング言語C++第3版とか)にも書いてあるが、
成功する方法は1つと言ってもいい。すなわち、「小さく始めて大きくする」。
成功しても失敗したときほど注目されないだろう。
しかし、みずほ事件は、システム開発の大変さを広めることにはなっただろう。
経営者は株主等に対して、利益を出すことに責任があるわけなので、
(顧客離れという)業績悪化になった以上、ちゃんと責任取りましょう。
(損害賠償もあるかもしれないし。信用失墜という社会責任もあるし。)
(「実害はない」といっているようでは、責任を考えることはできないか。)
今回の事件で強調したいことがある。
「システム開発を成功させるプロ」は貴重であり、それなりの待遇をすべしということだ。
「間違ってはならないシステムが間違えた」というショックは大きい。
航空機や医療関係でも不安になる。
解決策は、システムをシンプルにすることだ。複雑なシステム、作業の大変さを自慢するのではなく恥とせよ。
モノポリーみたいなゲームを考えた。
名前は「ツリー」とでもしようか。
- n 人で行い、mターン終了後にポイントが高い人が勝ち。
- 最初、0 ポイント持っている。(ポイントは整数値とし、端数は切り捨て。)
- 「貰う」、「行動」、「払う」で1ターン。
- 「貰う」は、平均 100 の指数分布に従い、人とターン毎に独立。
- 「行動」は、「参加」「脱退」「交渉」の3つができる。
- 「払う」は、毎回 ちょうど 100 払う。払えなくなったらその場で破産して負けとなる。
- 「参加」は、どの主催者のグループに入るかを選ぶ。参加者は参加した順番に古株となる。(主催者が最も古株。)
- 主催者は、「参加」していない人、全員が対象となる。
主催者は、参加者に対し、必ず最低額を保証する。(ゲーム開始時にも決めておくこと。)
- どの主催者の最低保証も確認できる。
- 「参加」を申し込まれたら、必ず受け入れなければいけない。
- 参加者は、参加するときにグループ内の世話人に対して、貰うたびにその 5%(端数切捨て) を参加料として払わなければいけない。主催者は払わなくてよい。参加料は、下宿人から貰ってから算出する。
- 世話人は、古株から候補となる。但し、世話は2人までしかできない。候補が 2人を世話していたら、次に古株が候補となる。(構成はツリー上になる。)
- 各ターンでグループ内の個人が貰った総額をグループ内で均等に分配する。分配額が最低保証額に達しないときは、
主催者が自分のポイントで補充しなければいけない。補充できない場合、主催者は破産して負けとなり、次の古株が主催者となり保証しなければいけない。
- 参加者と主催者は、「脱退」できる。脱退したら、世話している人の内、古株の方が自分のポジションに移る。移った所も同様。
- 脱退したら、参加者が自分だけの新しく主催者となる。そのときに最低保証額を決めなければいけない。
- 「交渉」は、世話人の上の人に参加料(パーセントで整数)を提示することで行う。
- 提示された人は、提示額が、今の額を超えていれば受け入れなければいけない。受け入れられた場合、世話人と提示者のポジションを交換する。世話人の参加料は提示前の提示者の参加料とする。
- 「参加」は参加していないときのみ、「脱退」、「交渉」は参加しているときのみできる。「交渉」は、1,2,3番目の古株はできない。
- 人が少ないときは、1人で何役もやるといい。
順番はリアルタイムかターン制かどちらか。
ちなみに、a 保証したら、期待値は a + 100 exp(-a/100) かな。
卒論をネタに特許出願する人もいるようだ。
費用はどうするのだろう。
興味のあるもの。
C#、モジラ。
コンピュータは思考するようになるのか。
おそらくなるだろう。人間の脳だって突き詰めれば、生化学的な論理回路だ。
論理回路の集積が臨界点を超えれば、「感情が発生する」と言っていいのではないだろうか。
鍵は、サイズだ。小さい方が時間の流れは早い。あっという間に進化する可能性もある。
今ごろ書くのもなんだけど、
このページの読者は、本人とその子供を想定しています。
説明不足なのは、「直に聞いて」ということで。
システム開発の失敗は大小を問わず、
数多くあるだろう。原因は、担当者のスキル不足が大きいと思う。
大学や大学院では、もっと実践的なことを学べるようにすべきだ。
そのためにも、学生に魅力ある仕事として見られることが必要だ。
技術は人である。もっと、人を大切にすべし。
みずほ事件をいい機会にすべきだ。
USB デバイスを
インターネット接続された PC に指すだけで、どこでも
メールをやりとりできる装置と自動車積載のインターネット装置を組合わせると
面白いんじゃないでしょうか。携帯が大容量になればいらないか。
腕時計と組合わせると面白いかも。007 みたいだな。
USB デバイスにソフトを組込むと結構面白そうだな。
Web から(CGI 等でもきちんと)根こそぎとってきて、ローカルで同じように
動くようにするソフト(サービス)って面白いんじゃないだろうか。まだ、できてないよね。
残業問題の記事が
出ている。残業はなるべくしないでもいいようになるべきだが、自己研鑽のための勉強時間は確保すべきだろう。
声を大きく。休日出勤のルール。
前に書いた __finally のバグ。
int main()
{
__try {
return 0;
} __finally {
printf("ここには来る\n");
}
printf("ここには来ない\n");
return 0;
} |
この例だとうまくいかない。
物流のコンサルをするのであれば、
RFID みたいなものを
気にしておく必要があるだろう。
クロスサイトスクリプティング(XSS)対応用に、セッションキーを IPアドレスと関連付けるといいとのこと。
但し、コネクションごとに IPアドレスが変わる環境もあるとのこと。
「名前空間」と「名前を同じにすること」に関して。
名前空間を使えば、同じような機能に同じ名前を付けられる。
しかし、検索で煩わしい。かと言って、違う名前を付けるようにしていたら、
名前空間の意味が薄れる。では、どうすればいいか。
答えは、「名前空間を考慮した検索」である。
例えば、検索文字「CFile.Close」に対して、
struct CFile {
void Close();
};
void CFile::Close()
CFile f;
f.Close();
|
上記の太字のような部分が対象となり、他の Close は対象とならない。
リファクタリングツールでできるのかもしれないが。
理系を強化したスーパーサイエンスハイスクール
の話で、/. で盛り上がっている。
コミュニケーション能力高めた方が、就職には有利だと思う。(口だけなのは、本人も回りも困るが。)
2500万も何に使うのかな。
学生にベンチャーさせて、その資金にするというのはどうかな。儲けは10%を教師と学生がもらえるとか。
いっそのこと、全部、教師の給料にして、優秀な人を集めるとか。
顧客情報流出した TBC はどうすんのかね。データの内容が半端じゃないけど。 みんなも気をつけましょう。
こういうサービスが考えられるかも。
- 自分の情報が流出したかどうか知りたい。
- サービスサイトに、氏名、生年月日、メールアドレス、住所、電話番号を送り、同じ情報があるかどうか問い合わせる。
- サービスサイトは、Yes/No のみ返答する。
- サービスサイトには、問合せ情報を検索後、直ちに破棄することを明記しておく。
サービスサイトが、信用あるところでないとだめだろうけど。
C# でPSP やってみるか。
おそらく、世界中で誰もやってないだろうけど。
C# 用に PSPStudy を直すかな。
慣れない言語でやると、プログラミング演習になっちゃうんだけど。
Windows では、フォルダとディレクトリは意味が違うそうだ。UNIX 使いは無視か。
一般的な用語に特殊な意味を持たすのは、MS のお家芸か。
公開ソフトのダウンロード数を集計してみた。
1位はECirc 電気回路、2位は WinDiffEx、3位は FTPPut。
(それ以外は、単に公開しているだけだな。)気合の入れ方とダウンロード数は全然一致しない。
小中学校の教育向けのを何か作りたいな。
最近の Windows なら ECirc はサイズの小さい DLL 版でいいはず。(説明をちゃんと書くか)
毎年新人教育で、昔のを探すが見つからずに再作成しているので、
忘れないようにC++ のメモリ管理確認用のサンプルを張っとこう。
コマ:広く浅く、一点深く。
みずほの記事を読んでいて、
「部下に期待すること」に入れ忘れていた項目を思い出した。
すなわち、「まずいことをすぐに報告する」。
まぁ、今現在、できているが。
「マイナスの報告をするものにマイナスの評価をしない」とか、
「必要な情報を共有して、風通しのよい」環境にしておくことも必要だろう。
.net の CLR で連想したこと。最近のウィルスは、殆どメールを媒体に広がっている。
そこで、メーラから起動する場合は、サンドボックス内で動かす用にしたらどうだろう。
(CLR とかうまく利用できないだろうか)だめか。
新人教育用に最適化演習ツール
を作った。Excel のソルバーで同じ問題を解かせようとしたが、
制約を外してはるかに簡単にしても全く解けない。組合わせ最適化だからあたりまえか。
IEEE1394 の正式名称が FireWire になるそうです。
iLiNK とはもう言わないのかな。
アプリで致命的エラーになった場合に、
MSの保護違反エラーメッセージに酷似したダイアログを出すというアイデア。やるな。
情報漏洩の事件が続いているが、なんとかならないのかな。
常識は学校で教わらないとわからないのか。(>タカラ)
最近プログラミングの話が少ないね。
C++ のプログラムは、結構、書いているし、C# とか PHP の本を読んだりしているんだけど。
2ch の
Generic Programming with C++ Templateで、VC++7(or 6) に Loki を入れようとしているが、すごい。
既に、
Loki port to VC7で、VC++7 ではできているようだが、
発想は賞賛してもいいんではないだろうか。(しくみはよくわかってないんだが感動した)
C++ の奥深さは、私の手の届かない所にあるらしい。
eXtreme Programming Part.2の XP の話もいいね。
Visual C TechTipsの
Mr.コーヒーさんは、Windows Programing に非常に詳しい。
雪が融けて、氷山の一角が崩れ始めた。
役所は、「問題を大きくする前に解決する」責任があると思うのだが。
1回の出願で、日本とアメリカの両方で特許が取れるようにするらしい。
個人的には、ソフトウェアの特許は好きではないのだが、これにより特許出願が増えると予想される。
Mutex を使った便利クラス。CWaitCursor と同じく、宣言するだけ。
#include <afxmt.h>
struct CMyMutex {
CMutex m_mutex;
CMyMutex(const char* p) : m_mutex(FALSE,p) {m_mutex.Lock();}
~CMyMutex() {m_mutex.Unlock();}
};
|
整列されたデータについて。
コンテナの挿入と検索のスピードを計った。(PenIII 800MHz)
| n個の挿入(秒) | n個の検索(秒) |
非整列 vector | 5e-8 n (参考:ソート 7e-8 n log n) | 8e-10 n^2 |
整列 vector | 8e-10 n^2 | 2e-7 n log n |
非整列 list | 3e-7 n (参考:ソート 6e-7 n log n) | 3e-9 n^2 |
整列 list | 9e-9 n^2 | 2e-8 n^2 |
multimap | 7e-7 n log n | 5e-7 n log n |
hash_multimap | 2e-7 n log n | 3e-8 n log n |
尚、log の底は10。(検証に用いたプログラム)
- 作成でベストは非整列 vector。
- 最後に整列データが必要な場合も、ベストは非整列 vector。オーダはどれも同じで、比は約 1:9:10:3。
つまり、リストで最後にソートするのは、multimap と変わらない。
- 検索は、非整列 vector、非整列 list、整列 list がO(n^2)、その他はO(n log n) で比は約 7:17:1。
つまり、整列 vector の方が multimap より倍以上速い。
- 検索でベストは、hash_multimap。
- 総合でベストは、hash_multimap。
- 非整列 vector の検索と整列 vector の挿入は同じ時間。
- 整列 vectorの検索と hash_multimap の挿入は同じ時間。
- 整列 list は、どちらも最も遅い。
- キーが文字列だと、hash_map、hash_multimap (以下 Hash_map) はハッシュ関数で整列されているが、
文字列では整列されていないので使いにくいかも。
- Map では、operator< が必要とされる。Hash_map では、ハッシュ関数と operator== が必要とされる。
- Hash_map の挿入は定数と思っていたが、実験結果では、O(log n) のようだ。また、検索では、Map も Hash_map も O(log n) と O(n) の中間のようだ。(上表では、O(log n) にしているが。n 個だとその n 倍だが。)
次期、STL には、間違いなく hash_map が入るだろう。
それまでは、STLport でも使いましょう。
delete p;
としたら、自動的に p に 0 が代入されているようになっているとよかったかも。
表記の統一や類似検索などにより、データの不整合を防止するためのフリーのライブラリが欲しい。
- 全角、半角を統一。英数字は全て半角、カナは全角に変換。
- 特殊記号の削除
- 似たような文字の統一
別アプリにデータを送る方法 (MFC COPYDATA)
BOOL CXXXApp::InitInstance() // 送る方
{
HWND hWnd = ::FindWindow(0,AfxGetAppName());
if (hWnd) {
COPYDATASTRUCT cd;
char buf[256];
if (__argc > 1) {
strcpy(buf,__argv[1]);
} else {
CFileDialog dlgf(TRUE,0,0,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"Text Files(*.txt)|*.txt|All Files(*.*)|*.*||");
if (dlgf.DoModal() != IDOK) return FALSE;
strcpy(buf,dlgf.GetPathName());
}
cd.dwData = 0;
cd.lpData = (void*)buf;
cd.cbData = strlen(buf)+1;
::SendMessage(hWnd,WM_COPYDATA,0,(LPARAM)&cd);
return FALSE;
}
...
}
BOOL CDBTestServDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) // 受取る方
{
const char* p = (const char*)(pCopyDataStruct->lpData);
...
}
|
DLL でデータを共有 (VC++)
#pragma comment(linker, "/SECTION:.shared,RWS")
#pragma data_seg(".shared")
int nSharedInt = 0;
#pragma data_seg()
|
初期化が必要。
VC++6 に STLport 入れたら _MIN,_MAX が使えない。
MFC か何かのせいで min と max がマクロなのも困る。ということで、
stl_user_config.h に以下を追加した。
#define _STLP_NO_OWN_IOSTREAMS 1
#undef min
#undef max
|
CCriticalSection と CMutex の比較。
#include <cstdio>
#include <afxmt.h>
int main()
{
int i, n = 10000000;
CCriticalSection o;
// CMutex o(FALSE,"test");
clock_t t = clock();
for (i=0;i<n;++i) {
CSingleLock dmy(&o,TRUE);
}
printf("%.2f\n",double(clock()-t)/CLOCKS_PER_SEC);
return 0;
}
|
20倍以上 CCriticalSection の方が速い。但し、CCriticalSection ではスレッド内のみ有効。
(CMutex は他プロセスでも有効)。また、CCriticalSection は、CMultiLock で使えない。
ISAPI で使う分には、CCriticalSection をメンバに持ち、必要な所で、CSingleLock を宣言すればよい。
Lock 時の INFINITE は、2^32 秒=約 133年だ。
読込みと書出し別のロック用クラス
#include <afxmt.h>
// 読込みと書出し別のロック用クラス
// メンバなどで CRWCriticalSection rwcs; と宣言
// ロックしたい所で、以下のように使用する
// 読込み CRWCriticalSection::CReadLock dmy(rwcs);
// または
// 書出し CRWCriticalSection::CWriteLock dmy(rwcs);
// 読込みは指定数まで同時にアクセス可。書出しは全てと排他。
struct CRWCriticalSection {
// m_size 番目は WriteLock 用
int m_size;
bool* m_bLocked;
bool* m_bTmp;
CCriticalSection* m_cs;
CRWCriticalSection(int sz = 4) : m_size(sz < 1 ? 1 : sz), m_bTmp(0) {
m_bLocked = new bool[m_size];
memset(m_bLocked,false,sizeof(bool)*m_size);
m_cs = new CCriticalSection[m_size+1];
}
~CRWCriticalSection() {
delete[] m_bLocked; m_bLocked = (bool*)1;
delete[] m_bTmp; m_bTmp = 0;
delete[] m_cs; m_cs = (CCriticalSection*)1;
}
CCriticalSection& Get(bool** pLocked) {
int i,k;
static int df = 0;
for (i=0;i<=m_size;++i) if (!m_bLocked[k = (i+df)%m_size]) break;
++df;
*pLocked = &m_bLocked[k];
return m_cs[k];
}
void LockAll() {
int i;
m_cs[m_size].Lock();
if (!m_bTmp) m_bTmp = new bool[m_size];
for (i=0;i<m_size;++i) m_bTmp[i] = m_bLocked[i];
for (i=0;i<m_size;++i) if (!m_bTmp[i]) m_bLocked[i] = m_cs[i].Lock() != 0;
for (i=0;i<m_size;++i) if (m_bTmp[i]) m_bLocked[i] = m_cs[i].Lock() != 0;
}
void UnlockAll() {
int i;
for (i=0;i<m_size;++i) m_bLocked[i] = m_cs[i].Unlock() == 0;
m_cs[m_size].Unlock();
}
struct CReadLock {
bool* m_pLocked;
CCriticalSection& m_cs;
CReadLock(CRWCriticalSection& rwcs)
: m_cs(rwcs.Get(&m_pLocked)) {*m_pLocked = m_cs.Lock() != 0;}
~CReadLock(){*m_pLocked = m_cs.Unlock() == 0;}
};
struct CWriteLock {
CRWCriticalSection& m_rwcs;
CWriteLock(CRWCriticalSection& rwcs) : m_rwcs(rwcs) {m_rwcs.LockAll();}
~CWriteLock(){m_rwcs.UnlockAll();}
};
private:
CRWCriticalSection(const CRWCriticalSection&); // no def
CRWCriticalSection& operator=(const CRWCriticalSection&); // no def
}; |
CCriticalSection を使っているので、スレッド内のみ。
プロセス間なら、CSemaphore とか CMultiLock を使えばいいだろう。
ちなみに、インラインなので CReadLock は CSingleLock よりわずかに速い。
Get の static は VC++ ではインラインでも可。また、i<=m_size の <= も意図して書いている。
CEvent の使用例
待つ方
CEvent a(FALSE,FALSE,"test");
a.Lock();
イベントを送る方
CEvent a(FALSE,FALSE,"test");
a.SetEvent();
|
別プロセスでも可。Lock とすると、SetEvent されるまで必ず待つ。Lock 前に SetEvent しても意味なし。
ワーカスレッドを待つ方法
CWinThread* p = AfxBeginThread(f,0);
WaitForSingleObject(*p,INFINITE);
|
WC、日本対ロシア戦の最高視聴率 80%だそうです。
私は、見てませんでしたが、稲本のゴールの瞬間は判りました。
自動構成管理ツール
- 起動するときに、指定フォルダからソースをメモリに読込む。(Windows の StartUp に登録するといいかも)
- 一定時間ごとに監視する。(FindFirstChangeNotification を使ってもいいかも)
- 監視時にCPU使用率がしきい値以上ならスキップ。しきい値以下なら、指定フォルダの全ファイル内容とメモリの内容を比較し、差分をログに出力する。
- 終了時にもチェック作業をする。
つまり、普段は一切気にしないで、ファイルを過去の状態に戻すことができるようになる。時間があれば作りたい。
書くものがないときに、メモを自分宛にメールで送ったりしている。こういうことをしている人は多いのではないかと思う。
Java で double-checked locking が働かないというのは、Java の欠陥ではないのか?
できないからって
「同期化を恐れるな」というのは、開き直りか。
MS は 5000万行のコードをリファクタリングですか。
なんか間違ってるような。(建物作ってから土台直すなよ)
Windows Update 何度やっても、
.net Framework が出るんだけどバグか?(3度もやったぞ)
ウィルス配ったりしてるし、本当にセキュリティ強化する気あるのか。
STLport でのメモリのデバッグ。
#define _STLP_DEBUG
#define _STLP_MALLOC
#define _CRTDBG_MAP_ALLOC
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF);
|
STL を使用してから、メモリのバグは激減した。ほぼ0といってよい。理由は、
- そもそも自分では new を使ってない。
- vector の operator[] で添え字の範囲をチェックする assert を入れているので、範囲外にすぐ気付く。
C# や Java のように、CLR や VM 上で動かすには、GC は必要だろう。
しかし、プログラミングが楽になるからという理由では GC は不要だ。
GC がないとまともなプログラムが書けないのは、少なくとも私の周りには来て欲しくない。
みずほは賠償10億円以上ですか。
まぁ、何兆円からみたら誤差でしょう。
でも、目に見えない信用失墜は、何千億にもなると思います。
みずほ事件以降で、私の銀行観はかなり変わりました。(悪いのはごく一部なんだろうけどね。
図体だけでかい3流ってとこですね。)
1つだけ確かなのは、「銀行も変わらないといけない」ということでしょう。
東京三菱銀行のシステム部部長の机には、「Simple」、「Speed」、「Communication」と書いてある。
XP(「コミュニケーション」「シンプル」「フィードバック」「勇気」)みたいだな。
室の営業を強化したい。OR を掲げて、30年以上続けている所は、日本でも少ないだろう。
営業マテリアルも将来性を出す形にしたい。
日経コンピュータで、SAP 製品の価格の不満が高いとある。
不満の原因は、「使えていない」ことだろう。
(効果が出ていれば、誰も高いとは思わない。)
すなわち、どうやって効果を出すかを考えなければいけないのだ。
必要なのはコンサルを始めとするサービスだと思う。
ビジネスでも「不確実性を考慮したバックギャモンの戦法」に学ぶ所は多いのではないだろうか。
商用RDB の3,4倍速いと言われる MySQL とハッシュを比較してみた。
(検証用プログラム)
秒数 | hash_map | MySQL |
作成 | 2 10^-6 n | 2 10^-4 n |
検索 | 5 10^-7 n | 3 10^-4 n |
削除 | 7 10^-7 n | 3 10^-4 n |
- テーブルは整数のキーを持ち、文字列の値を持つ。
- 作成で2桁、検索削除で3桁の性能差。
- hash_map では、CCriticalSection でロックしている。
- MySQL は接続したままで繰返した性能。接続切断を考慮すれば、RDB はさらに遅くなる。
- hash_map が前の話(n log n)とオーダが違うが、大体の目安ということで。
チューニングすれば多少違うだろうが、参考にはなるだろう。
DB の最大のデメリットは、データ構造が「表形式」しか許されないことである。
この制約による性能差も1桁から3桁ぐらいでるだろう。DB のメリットはとっつきやすさであるが、
少し複雑になってくると苦しくなる。(正規化という概念が必要なことが不自由さを表している。)
DB で性能を出すには、ストアドプロシージャが必須である。しかし、同じ機能を実現するのに、
ストアドプロシージャより自前のデータ構造でやった方がはるかに楽であり速い。
DB の多くのメリットは承知しているが、私は使わないで済ませるようにしたい。
(つまり、DB がなくてもよい方向に持っていく。大規模なのは避ける。)
みずほに欠けているのは、
「リーダーシップを発揮する経営者」だ。
(もっと言えば、「リーダーシップを発揮できない経営者を交代させる株主」もいない)
「役員の減額半年」とは、「また、同じ事故を再発させます」と宣言しているようにしか聞こえない。
(権限のない CIO のしっぽ切りなど意味ない)
現在付き合いのあるところを除けば、みずほと付き合いたい SI は、いないのではないか。
必要なのは、東京三菱(もしくは北洋銀行やUFJ)のような経営者だ。
自己改革のできない三流銀行に公的資金を投入することなど、あってはならない。
プロジェクトマネジメントに求められる能力は、融資担当と共通するらしい。なるほど。
他にも共通する業務がありそうだ。(人を見る能力)
コンピュータウィルスのソースを公開したことに対し、
批判が集まっている。
私の意見
- 公開しないで研究した方がいいのでは。
- 研究者といえど、社会的影響を考慮すべき。
スラドのスコアは私の感覚と合わない。
2ch の裁判だが、最高裁まで行って負けたら、次の選挙で裁判官は罷免されるのではないか。
(とはいえ、法が大多数に負けるというわけではないが)
2ch は便所の落書きに例えられていることが多いが、私は「巨大ごみ捨て場」と認識している。
(見るのは「ごみ漁り」。面白いし、たまに真実らしきものも見つかる。)
STLport の反復子のサイズ。vector,list,set,map は4、hash_map は8。const も同じ。
何年か前は、日経ソフトウェアは、
VB の記事ばっかりだったが、最近は減ってきたようだ。
特集で、「バグを出さない...」の中に「再利用性/メンテナンス性の高いコードを書く」とある。
記者は、再利用性と保守性は別物だということを理解していない。
最初から再利用性の高いコードなど書けない。将来、どのように使われるかわからないのだから。
逆に、将来使うかどうかわからないものを入れるのはよくない。
「保守性を高くして再利用しやすくする」すべきであるが、再利用性は考慮すべきではない。
必要が生じたときに考えればよい。また、再利用には、システムのサポートが必要であり、
プログラミングだけではない。(部品の登録や検索、コラボレーションの場など。)
ソフトウェア開発の特徴は、全工程に占める「開発時間」の短さである。おそらく10%以下だろう。
殆どは、設計とコミュニケーションである。
規模によって各工程の占める割合は変わってくるが、規模が大きくなるほど、
「開発時間」の割合は小さくなる。ここでいう開発とは、コーディングである。
すなわち、設計を元にプログラムを作成することである。
ちなみに、設計でも「プログラムの作成」をすることはある。(実現方法の検証など)
とはいえ、(創造的な)設計を自動化するのは難しい。テンプレートなどが一般的だろうか。
ソフトウェア開発に組織的な取組みをするためには、
創造的な設計業務をテンプレートとして残していくのがよいのだろうか。
要件定義などでは、どうだろう。
作業のスピードが速い人と遅い人の差は、作業時間でなく段取り時間に出てくるようだ。
すなわち、先を見越して作業しているかどうか。
STLport を入れてから、size() を使うと
「C4018: signed と unsigned の数値を比較しようとしました」というメッセージが出るようになった。
list<int> l;
if (-1 < l.size())
|
上の if 文は真にはならない。signed と unsigned の比較で signed が unsigned になるからだ。
(-1 が UINT_MAX になる)
気になるので、以下のようなテンプレートでも使うか。
template <typename T>
inline int size(const T& t) {return t.size();}
|
というか、今まで、以下の上のように書いていたが、下のように書くだけで十分ということか。
(今ごろ気付いた)
if (i >= 0 && i < v.size())
if (i < v.size())
|
hash_map を使っていて、
最後の値をとりたいときに、困った。map なら、rbegin() でも end() を -- してもいいのだが、
hash_map にはどちらもない。手抜きじゃないのか。
数年して、動画配信が当たり前になると、
動画内に暗号を埋め込んで、流す所とか出そうだな。
文化庁のページが、
クッキーを使ってトップページ以外、リンクできないようになっている。
あまりスマートじゃないね。ちょっと見ただけだが、問題点がいつくかある。
(リンク切れとか、エラーページから戻れないとか、フレーム内に別の組織のトップページが出るとか。)
当然のことながら、Google などで検索した結果からもアクセスできない。
文化庁の人は、検索サイトについてどう考えているのだろうか。
(他人には使わせないが、自分は使うのか?)
Webページ丸ごとコピーツールがあれば、ミラーサイトができて、そっちの方が使われたりするかもしれない。
このような方式がどのくらいの負荷に耐えられるか知りたい。
文化庁は、一日何ページビューでそのうち、エラーページのページビューがどのくらいか公開して欲しい。
コインサイズ超小型発電装置『サーモ・ライフ』は、
体温で、3V程度の発電をするそうだ。
そのうち、体内にコンピュータとか埋め込まれるんだろうか。
視覚、聴覚情報を保存再生できるのは便利だな。
私は、記憶するとき、無意識にハッシュ値も併用しているようだ。
- 聞けば思い出すということが多い。
- 最初の文字が似ていると、間違えることがある。
- 頭の中で、考えている言語は、日本語ではない。
話すときに変換作業が必要になる。話すスピードより、考えるスピードの方が数倍以上速いと思う。
- 脳の容量は変わらなくても、たくさん記憶できるようだ。
他にもこういう人はいるように思える。
無音部分にも著作権があるとのことだ。なんか、(喉のあたりまで出かかって)言葉がでない。
家の電話が送信できなくなった。
電話機の故障らしく、古い電話機をつなぐと使える。
寝室のクーラーが壊れた。しょうがないので、居間のクーラーで代用している。
高機能より、高品質の方がいいと思うこのごろ。
VS.net を入れた。
マシンもPen4の2.5Gで新しくなった。
結論:「旧プロジェクトは VC++6.0で行く」
理由
- コンパイルできない。(例えば、snprintf 等の関数がなくなっている。
hash_map が標準で入っているが、hash_map<string,int> がそのまま使えない。)
- 作成された実行形式が、VS.net が入っていないマシンで原因不明で落ちる。
- 新規に作ると、MFC70.dll が必要になる。
- 遅い。STLport のhash_map と比べると、1.5 倍遅い。他も微妙に遅い。
- 慣れてないので、使い勝手が悪い。
ちなみに、hash_map<string,int> を使うには、以下を定義すればいい。
template <>
size_t hash_compare<string>::operator()(const string& s)const
{
unsigned long l = 0;
const char* p = s.c_str();
while (*p) l = 5*l + *p++;
return l;
}
|
プログラミングと関係ないが、
耳がはれたり、のどにしこりができたり、池の中でこけたりして
体中痛い。
hash_map について。
VC6 STLport でhash_map<CString,XXX> を使う場合
struct std::hash<CString> {
size_t operator()(const CString& s)const {
return hash<char*>()(s);
}
};
|
VC7 で hash_map<CString,XXX> を使う場合
template <>
size_t hash_compare<CString>::operator()(const CString& s)const
{
unsigned long l = 0;
const char* p = s;
while (*p) l = 5*l + *p++;
return l;
}
|
IE の検索先をGoogleに
変える方法がぬる℃家に出てた。
Win2k で
- Winnt\system32\shdoclc.dll をコピーし VC++ でリソースとして開き、
StringTable の 1211「http://auto.search.msn.com/response.asp?MT=%1&srch=%2&prov=%3&utf8」を
「http://www.google.com/search?num=100&hl=ja&newwindow=1&safe=off&btnG=Google検索&lr=lang_ja&ie=utf8&oe=utf8&q=%1」
に変更して保存。
- SRCpyで、「保護されたファイルのコピー削除を許可する」にチェックしてコピーを戻す。
(失敗しても責任は持たない)
02/08/27 追記:Windows Update したら元に戻った。
今野先生の本
「特許ビジネスはどこへ行くのか IT社会の落とし穴」を見つけた。
スラドでモチベーションの話が
出ていた。
私の考え。
- モチベーションは本人の問題である。しかし、会社は、成果主義にすることにより社員のモチベーションをあげることができる。
(何故なら、モチベーションがあがらない社員はクビになるので。)(日本の成果主義は違うかも)
- 全力疾走すると、次にスランプになりやすいので、気をつける。
(100km の道を走らなければいけないとき、最も速いのは、定期的に休み同じ速度で行くときだ。)
メールのヘッダに俳句を入れて著作権で守るというのは、面白いかも。
ここを読書記録にするか。
将来、有名人という言葉は、
一般名称ではなく、特定の人達を指すかもしれない。
それらの人達は、投資対象であり、芸能人だけでなく経営者、政治家、医者など。
(企業だけでなく個人が株式を発行する。株式人?いまいちイメージが湧かない。)
読書録
読書録
私の強みは、集中力だろうか。(特に読書時の)
読書録
あと34冊。
ギリシャでコンピュータゲーム禁止ですか。
(目的は、非合法ギャンブルの禁止とか)
日本でこんな法案通ったら、国外脱出するかも。
公私共に禁止というのが分からん。憲法違反じゃないの。
問題。
A,B,C 3人がいます。1ヶ月のコストは、それぞれ 100万円、75万円、50万円とします。
1000万円の売上がある仕事 X と 1500万円の売上がある仕事 Y があります。
それぞれ、1人でやると次のようにかかるとします。
| A | B | C |
仕事X | 10ヶ月 | 10ヶ月 | 20ヶ月 |
仕事Y | 10ヶ月 | 20ヶ月 | 40ヶ月 |
期間は 9ヶ月です。どのように仕事を割振ればよいでしょうか?
|
回答1
| A | B | C | コスト |
仕事X | | 10ヶ月 | | 750万円 |
仕事Y | 10ヶ月 | | | 1000万円 |
利益は、750万円で最大。Cさんは仕事しない。
回答2
| A | B | C | コスト |
仕事X | | 9ヶ月 | 2ヶ月 | 775万円 |
仕事Y | 9ヶ月 | | 4ヶ月 | 1100万円 |
利益は、625万円。Cさんは、3ヶ月暇。
回答3
| A | B | C | コスト |
仕事X | | 8.5ヶ月 | 3ヶ月 | 787.5万円 |
仕事Y | 8.6ヶ月 | | 5.5ヶ月 | 1137.5万円 |
利益は、575万円。みんなちょっと暇。
回答4
| A | B | C | コスト |
仕事X | 10ヶ月 | | | 1000万円 |
仕事Y | | 12ヶ月 | 16ヶ月 | 1700万円 |
利益は、-200万円。みんな忙しい。
さて、実際には、回答1のようにはできない。回答2と回答3ぐらいの間ぐらいに落ち着けばよいだろう。
しかし、回答4のようにしているところはないだろうか?忙しいからといって貢献していることにはならない。
逆に赤字の原因となっているかもしれない。
読書録
郵政民営化などで、民営化が歓迎されるべきことのように言われているが、
必要なのは、民営化でなく「真摯さ」である。
公的機関に真摯さと逆のものが目立つのは事実である。
しかし、民営化すれば解消するものでもない。
(例:東電、雪印、日ハム)
どうすればよいか。教育に対する意識を高める必要がある。何よりも土台が必要だ。
マネジメント、人事、評価、監査も重要だろう。
あらゆるところで、改革派と既得権益の擁護派の衝突が見られる。
対立ではなく同じ目標に向かって協調すべきである。
知識はそれだけでは役に立たない。
「何を求められているかを理解する能力」×「その分野の知識」となって役に立つ。
試験でも「何を求められているか」を理解すれば、答えを出しやすい。
グラフを使っていたら、バグった。
グラフのアークを表示するときに、順番に番号を表示していた。
そこで、番号を変更する必要が出てきた。
方法は3通り程考えられる。
- 属性として、番号を追加する。
- グラフをコピーする。但し、そのとき、順番を変える。コピーを元に戻す。
- private メンバに触って、アークの順番を無理やり変える。
最初の方法が正当だろう。
しかし、順番を利用している所がたくさんあり、修正が面倒だったので最後の方法にした。
そしたら、見事にバグった。
グラフクラスを熟知している人(そんな奴いないが)なら、接続関係が「キー=アーク反復子、値=ノード反復子の map」
ということを覚えているだろう。
(1) アーク反復子の比較関数は、アークのポインタのアドレス値の比較である。
(2) 順番の変更は、ポインタ値を swap した。
結局、キーの順番の根拠となる値を変えてしまい、map がぐちゃぐちゃに壊れてしまった。
「バグの多い所に、バグが残っている」の典型となってしまった。
以下、map が壊れるサンプル。
#include <cstdio>
#include <set>
using namespace std;
struct A {
int i;
A(int i0) : i(i0) {}
bool operator<(const A& a)const {
return ary[i] < ary[a.i];}
static int ary[];
};
int A::ary[] = {1,2,3};
void Print(const set<A>& s)
{
set<A>::const_iterator it;
for (it=s.begin();it!=s.end();++it)
printf("%d\n",it->i);
printf("\n");
}
int main()
{
set<A> s;
for (int i=0;i<2;++i) {
s.insert(A(1));
s.insert(A(2));
s.insert(A(0));
Print(s);
A::ary[0] = 4;
}
return 0;
} |
接続関係は、ノード反復子をキーにして、multi_hash_map にすればよかった。
STL に入れて欲しいコンテナ。
cache<Key,Value,Func,Size = 1024,Map = hash_map>。
キーから値を計算するのに時間がかかる場合、map に取っておくことがある。
しかし、全部、取っておくとメモリが足らない。そんなとき、キャッシュの出番である。
Size を超えて覚えようとするとき、使用頻度の少ないものを削除する。
読書録
-
凛冽の宙 著者の名前は、「まいん」と読むそうだ。
-
知的生産の技術 内容は古いが、参考になるかも。盛んにカードを勧めているが、
TreeMemo もカードに通じるところがあると思う。私は、ちなみに PostIt を持ち歩いている。
-
なぜこの店で買ってしまうのか―ショッピングの科学 著者の行動は、OR にも通じている。
顧客の立場で考えることが重要。
-
決定版 ハーバード流"NO"と言わせない交渉術 内容的には、「人を動かす」によく似ているが、
こちらの方が、より的を絞っている。お勧め。若いときに読むべき。
-
瀬島龍三 回顧録 幾山河 瀬島氏はすごい。今、90 ぐらいだと思うが、最近も TV に出ているらしい。
「ハーバード流...」を読んだ後に、この本の第2章を読むと、考えさせられる。
こういう本は、歴史の授業で取り上げるべきだと思う。(amazon でも売ってないけど)
-
ザ・ゴール 日本に紹介したら、「世界経済が大混乱に陥る」と著者が言っているが、
日本でも既にやっているでしょう。トヨタとか。
家族の話が出てくるのは、焦点がボケるだけだと思う。
京都に RAMP に行った。
小島先生は、マックのノートで、Acrobat Reader? で発表していた。さすが。
読書録
囲碁の先番のコミが、5目半から6目半に変更だそうだ。韓国は、変更済み。中国は、7目半だそうだ。
メモ:C# で C の sscanf を使うには、以下のようにする。
string s = "1.2 3.4";
string pat = "\\s*((\\d+\\.\\d*)|(\\d*\\.\\d+)|(\\d+))";
Regex r = new Regex(pat+pat);
double d,e;
Match m = r.Match(s);
if (m.Success)
{
d = double.Parse(m.Groups[1].ToString());
e = double.Parse(m.Groups[5].ToString());
Console.WriteLine("<{0}> <{1}>",d,e);
}
|
情報は、なぜ、
「情け(心のはたらき)」を「報せる」と書くのだろうか。「知らせる(inform)」の名詞化である information とは、
何を知らせるのか。inform を in(内に) と form(形式) と分けると面白い。
すなわち、規格化されてこそ情報として価値がある。(規格化に外れたものが無価値と言っているわけではない。)
印刷物から図にするのに、
一般的な方法はあるのだろうか。
次のようなことができるとうれしいのではないか。
- 図に90度ものさしを添えて、デジカメで撮る。
- 自動で、画像を取り込んで、ものさしを基準に、角度と縮尺を調整。
- 自動で、ものさしを消す。
- 自動で、輪郭のみ取り出し、開曲線と閉曲線にする。
- 曲線の長さと、閉曲線の面積を出す。
以前、PSP の話で
「コーディングとコンパイルを分けるかどうか」ということを考えた。
最近、VC# を使っているのだが、コーディング中に構文のチェックができてしまう。
ある意味、簡易にコンパイルしているようなものだ。やはり、
コーディングとコンパイルを、全く別に分けるというのは時代の流れとは言えないようだ。
DoCoMo では、人同士が触れただけで、データ交換を実用化したとのこと。面白そう。
こんな風にしてクレジットカード代わりに支払いできる?
- 支払い者にタッチし、支払い先を確認。
- 一連の動作(指を動かす)で支払いOKの状態に。
- 再度、支払い者にタッチして、支払い。
支払いOK の状態で、別の人に触っても支払われない。10秒たっても触らないとキャンセル。
C# でのソートの例
class CompFunc : IComparer
{
public int Compare(object i,object j)
{
return string.Compare(((Data)i).name,((Data)j).name);
}
}
ArrayList a = new ArrayList();
...
a.Sort(new CompFunc());
|
約235万件の日本語の図書検索に
かかる時間が0.1〜0.2秒ですか、Webcat。
しかも、連想検索。しかも、自前。やるな。
ワイヤレス電源というのがある。
ワイヤレスだと、無線のようだが、
そうではないようだ。もっとでかいのを椅子につけて、人が座るとつぼを
自動的に探して刺激してくれるというのはどうだろうか。
話を家電に戻すが、旅先でも使えるようなしくみがいいね。
MURAMASA 欲しい。
C#による PSP演習のための
PSPStudyCS
作りました。今日、PSPの勉強会をします。
私のステータス
- C++が気に入っている。
- Javaは気に入っていない。
- templateが気に入っている。
- オブジェクト指向は気に入っていない。
- C#は良さそうだ。
面白いもの見つけた。
public interface Employee
{
int GetSalary();
void GiveRaise(int amount);
}
public struct Clerk : Employee
{
private int salary;
public Clerk(int salary)
{
this.salary = salary;
}
public int GetSalary()
{
return salary;
}
public void GiveRaise(int amount)
{
salary += amount;
}
}
class Test
{
static void Main(string[] args)
{
Clerk c = new Clerk(1000);
((Employee)c).GiveRaise(50);
System.Console.WriteLine(c.GetSalary());
}
} |
出力は何か?struct をclass にすれば、答えは期待通り。
変数は、class だとポインタのように、struct だと実体のように扱われる。
読書録
C# で時間待ちは、System.Threading.Thread.Sleep を使える。
using (StreamReader sr = new StreamReader("...")) {...}
こういう構文使うと、自動で(Dispose を読んで)Closeしてくれる。
VS.net だと、HTML の編集がVisual にできる。すごい。
Google使っていると、
自分が「検索の仕方」が上手くなったように錯覚する。
発想には1つの方法がある。おそらく、小説家の多くも使っていると思う。
星新一の本のあとがきに、たしか書いてあった。
KJ法の「発想法」と「発想法 続」を読んだ。
KJ法でも、この原理に基づいた作業を行うのだが、驚いたことに、この原理についてはっきり言及していない。
どういう原理かはここでは書かない。
実は、この原理は、検索サイトで応用できる。
検索サイトを通した WWW は発想の宝庫といえるかも。馬鹿でかいけど。
テレフォンカード、Suica にも使われるICチップ(RFID)が、
日経コンピュータの特集だ。
IC チップは無茶苦茶、流行ると思う。ちょっと思った利用法。
洗濯しても大丈夫なようにし、衣類につける。タンスにリーダをつける。
あら不思議、どの衣類がどのタンスのどこにしまっているか分かる。
図書館では、本につける。3種類の大きさのボックスに本をしまい、自動で棚から取り出したりしまえるようにする。
私の読書生活は非常に便利だ。
- 読みたい本の ISBN をシステムに入れる。システムでは、書籍名等の情報はISBNから自動で設定される。
- システムで、読みたい本を選び、Web図書館で予約。
- 本が確保されると、その旨のメールが図書館から届く。
- 帰宅の途中で、20時まで空いている図書館に寄り、予約した本を受け取る。
以上の操作は、ISBN の入力を除けば、クリック数回するだけだ。
図書館にある本なら、予約した日に大体受取れる。
受取る図書館は、蔵書 22万冊以上で、自宅から100mもない。
この図書館にない図書でも予約すれば、区内の別の図書館(合計100万冊以上)から回送され、この図書館で受取れる。
(回送しても、早ければ予約当日借りられる)
ニッチビジネス:(DBを使わない)小中規模DB構築
読書録
坂本竜馬が何をしようとしたのか知った。歴史に詳しくなった。
C# でクラスと構造体の違いの一覧が
欲しい。
構造体を object または ValueType で参照していると、
あるメンバの値だけの変更ができない。(別途オブジェクト作って、代入するしかない)
構造体の配列にすればできるのだが。(もちろん、配列はクラスであって、構造体ではないけど)
構造体のポインタのように別の名前で制御するには、ref を付けるか配列にしないとできない。
ValueType の使いどころが分からない。
読書録
セブンインレブンの情報端末、撤廃だそうだ。ノウハウを技術指導料等で売れると思う。
銀行の経営者と
竹中(経済財政政策担当及び金融担当)大臣との対立の構図が浮彫りにされている。
両者、藪医者に見立てられているが、医者というより(ゾンビを相手にしている)まじない師じゃないだろうか。
銀行の経営者の言いたいことは、「経営責任など存在しない」ではないのか。
日本は資本主義ではなく社会主義化しているように感じられる。
(潰れるべき会社が潰されていない)
C# による
M/M/1 シミュレーション を作ってみた。
(ソース)
ところどころおかしい。
Webサーバが IIS のとき、上記の C# による exe のリンクをクリックすると問答無用で exe が実行される。
CLR 上で動くから、大丈夫と判断しているためか?
読書録
-
雄気堂々 上 第一銀行創立者渋沢栄一の人生。「竜馬が行く」で大政奉還までの歴史を知り、
この本で、その後の明治維新の歴史を知った。両方に、一橋慶喜が登場するが、異なる印象を受けた。
「雄気堂々」の慶喜の方が、立派で真実味がある。
渋沢栄一は今まで名前を聞いたことしかなかった。
日本経済の基礎を築いたと言われるだけのことはある。感銘した。
(貸し渋り、貸し剥がししている今日の銀行に、この精神は残っているのか。)
日本郵船の成立ちを知った。
-
雄気堂々 下
-
新史太閤記 上 傑作。
-
新史太閤記 下
-
マッキンゼー式世界最強の問題解決テクニック ゴール2に出てくる手法が説明されている。
ゴール2読んでいても感じたのだが、KJ法の方が使えそうだと思う。
あと、3冊。
メモ:SVM(サポートベクタマシン)による分類の一般化
選挙における1票の公平化について
選挙区の分け方を県単位でなく、市単位でかつ全くのバラバラにすれば、
1票の格差をかなり減らせるだろう。年毎に変更すればさらに減らせる。良いか悪いかは別にして。
分散最小化のWebサービスか ASP.net を作る。
ASP.net が楽しい。
勉強会でもやるかな。
C++ で CGI 作ったときの苦労が嘘のようだ。
ASP.net の本2冊買った。
ASP.net はすごいね。よく、こんなフレームワーク考えたね。ASP.net プログラマーが増えると予想。
C# だと GC がありがたい(宗旨変えした)。
所有か参照かをはっきりしないといけないのは、GC 使っていても必要([Serializable] 使っていても)。
このザウルス
(SL-C700)欲しい。
今度、ASP.NET の勉強会を部内でする。
勉強会その他の教育関連については、人事部からニュースグループ等を通じ社内に連絡される。
その結果、部外からも 4人も勉強会に参加したいと連絡があった。
4人の内3人は女性であり若い人が多い。このごろ、仕事に対して女性の方が積極的と感じることが多い。
ASP.NET に高い関心を持っている人も多いのだろう。
PDF に、Webコントロール埋め込みできるそうだ。
MS は、そのうち、Office にWindowsコントロールだけでなく、
Webコントロールを埋め込みできるようにするだろう。
すなわち、PDF と同じように xxx.xls をブラウザで開いて、ボタンを押すと、Webサーバで処理される。
データファイルとして、CSV を使うことがいまだに多い。理由は、Excel で開いて見やすいからだ。
データ形式として、XML が優れているのは言うまでもないが、見やすいとはいえない。
MS は、表形式の XMLスキーマを定め、Excel で読めるようにすべきだろう。
内容として、セルの属性の設定、罫線の設定、グラフの設定が可能だといい。変更後の保存も。
ASP.NET がサーバでちゃんと処理されないとき、
C:\Windows Directory\Microsoft.Net\Framework\v1.0.3705\aspnet_regiis -i
とすればいい。
熱意と誠実を合わせた言葉は、
何かないか。intensity は、いい言葉だと思う。
ディレクトリ内の全 aspx ファイルを表示する
サンプル。
DataGrid のサンプル。(例として良くないが)
ASP.NET で作ったページがクロスサイトスクリプティング等のセキュリティに対して、
危険かどうか判断するツールがあったら売れると思う。
ASP.NET で更新しても
PostBack になってしまうとき。URL の後ろに、「xxx.aspx?」とか書いて、
URL自体を変更すれば、PostBack にならない。
掲示板作ってみた。
VS.net のエディタ。pageLayout で
aspx(ASP.NET) を FlowLayout にとか、HTML を GridLayout にできるね。
PublicKeyToken の取り出し方。
"C:\Program Files\Microsoft Visual Studio .NET\FrameworkSDK\Bin\sn" -T assembly_filename
ASP.NET は、非常に楽だ。しかし、日本では未だに使おうとしない人が多い。
IIS でしか動かないことや、名前が ASP.NET であるため ASP の拡張として受けとめられているせいかもしれない。
しかし、ASP.NET と ASP,CGI,JSP,Servlet とは全くの別物であり、感覚的には Windows アプリケーションに近い。
ASP,CGI,JSP,Servlet の開発者は、ASP.NET の開発者に開発効率で負ける。
VB6 開発者はこぞって VB.NET に移行し、Windows アプリケーションしか作ったことがなくても、
ASP.NET の開発を始めるだろう。
広まるためのカギは、2003年4月?に出る IIS6.0 だろう。2003年には、サードパーティ製コンポーネントも増えるだろう。
情勢は、まだ混沌としているが、何もしなければ取り残されるのは間違いない。
ASP.NET について。
- 生産性、保守性は高い。
何故なら
- Windows アプリと同様にできる。
- 便利なコンポーネントが揃っている。
それ故
- VB6 開発者が飛びつく。
- 3rdParty、自社開発のコンポーネントが増える。
Webアプリ/Webサービスの今後
- 2002年まで ASP.NET ほぼなし
- 2003年 ASP.NET 50% (Java によるASP.NET 相当のものが登場)
- 2004年以降 ASP.NET 90%
ASP.NET の目玉の1つは、レンダリング技術にある。これは、Javaでも作成可能である。
しかし、ASP.NET の有利な点が2つある。1つは、VB6開発者からの移行が多いこと。
もう1つは、先行のメリットである。Java が同様のフレームワークで追い上げるには、
先行しているもの以上のフレームワークが必要である。しかし、それを 2003年中に、作成公開することは
不可能である。そこで、中途半端なものを出さざるを得ないが、それをして引き止めるのは無理である。
アンケートを作った。
delegate は関数ポインタに例えられるが、コンテナという側面や event や interface としても存在意義がある。
HTTP でファイルを取ってくる方法。
// 方法1
HttpWebRequest wr =
(HttpWebRequest)WebRequest.Create("http://localhost/");
HttpWebResponse w = (HttpWebResponse)wr.GetResponse();
Stream str = w.GetResponseStream();
StreamReader sr = new StreamReader(str,System.Text.Encoding.Default);
string s = sr.ReadToEnd();
sr.Close();
// 方法2
WebClient w = new WebClient();
Byte[] b = w.DownloadData("http://localhost/");
string s = (string)System.Text.Encoding.Default.GetString(b);
|
ASP.NET で [Serialize] 使って XMLで
読み書きしていたら、はまった。
xmlns:a1 の属性値が、ソース変更するたびに変わって、前に保存した XML が読めない。
f.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;
とすればいいようだ。
ArrayList は、Insert(0,...) とすると、無茶苦茶遅い上に、だんだん遅くなっていくので、
内部は、std::vector のようになっているようだ。インデクサは速い。
std::list 相当のは System.Collections に見当たらない。
認証の仕方。
デフォルトの Windows 認証は、IIS でやるだけ。
Form 認証は、Web.config の <system.web> の authentication を以下のように修正。
<authentication mode="Forms" />
<authorization>
<deny users="?" />
</authorization>
|
こうすると、login.aspx が必要になる。(ファイル名変更可)
FormsAuthentication.RedirectFromLoginPage(string ユーザ名, bool 別ブラウザで使用できるか);
承認時に、上記メソッドを呼べばいい。
もし、この中で、*.jpg ファイルに対しても、認証をしたいときは、
インターネット サービス マネージャで、該当フォルダのプロパティを開く。
ディレクトリの構成で、アプリケーションのマッピングに「.jpg」を「.aspx」と同じように追加する。
このようにすれば、直接 *.jpg の URL を叩いても、ログイン画面が開く。
新築マンション販売時に、
天井とかにプロジェクタつけて、映画が大画面で見れるようになっていると、売上伸びるんじゃないだろうか。
ADSL, Note PC, Printer, Projector, IP電話, デジカメ, 家庭内無線LAN 付きマンションとか。
ASP.NET のソースを貼り付けて実行。(公開してると危険)
新宿からビッグサイトへ埼京線一本?になった。
メモ:パスワードを忘れたら、ユーザにパスワードの入ったメールを送る。もしくは、管理者に通知する。
ASP.NET でファイルをダウンロードさせる方法。
チュートリアルを参考にしたが、
間違っているかも。
gif ファイルの例:
- IIS で該当仮想フォルダの「構成」の「アプリケーションのマッピング」で「.gif」を「.aspx」と同様にして追加。
- Web.config の system.web 内に以下を追加。
<httpHandlers>
<add verb="*" path="*.gif" type="MyNamespace.MyHandler,MyNamespace"/>
</httpHandlers>
|
- 以下のクラスを追加。
class MyHandler : IHttpHandler
{
public void ProcessRequest(HttpContext c)
{
FileStream fs = new FileStream(c.Request.PhysicalPath,FileMode.Open);
Byte[] b = new byte[fs.Length];
fs.Read(b,0,(int)fs.Length);
fs.Close();
c.Response.ContentType = "image/download";
c.Response.BinaryWrite(b);
}
public bool IsReusable {get{return true;}}
}
|
@IT 会議室に私が投稿したものをメモ。
(英語のより活発)
- ページ上のコントロール取得方法について
string ShowControl(ControlCollection cc, int k, string h)
{
string u, s = "", t = (h == null ? "" : h + "-");
foreach (Control c in cc)
{
u = t + (k++).ToString() + " ";
s += u + (c.ID == null ? "(" + c.ClientID + ")" : c.ID) + " ["
+ c.ToString().Replace("System.Web.UI.","") + "]<br>";
if (c.HasControls()) s += ShowControl(c.Controls,0,u);
}
return s;
}
void Page_Load(object sender, EventArgs e)
{
if (IsPostBack) return;
Response.Write(ShowControl(Controls,0,null));
} |
- DataGridについて(ItemDataBound)
<%@ page language="C#" %>
<html><head>
<script runat=server>
void Page_Load(object sender, EventArgs e)
{
d.DataSource = new string[]{"abc","def","xyz"};
d.DataBind();
}
private void f(object sender, DataGridItemEventArgs e)
{
if (e.Item.ItemIndex >= 0)
e.Item.Cells[0].Text = e.Item.Cells[0].Text.Replace("xyz","<i>xyz</i>");
}
</script>
<title>test</title></head>
<body>
<form runat=server>
<asp:datagrid id=d runat=server OnItemDataBound=f />
</form></body></html>
|
clicriというのが、
面白い。どう役に立つかは、よくわからないが。ASP.NETで作ってみるかな。
ホスト名:System.Net.Dns.GetHostByAddress(Request.ServerVariables["REMOTE_ADDR"]).HostName;
ASP.NET関連の書籍紹介。
@IT会議室から。
- ASP.NET実践 2180円。C#。2ページ毎にまとまっていて読みやすい。.NET Framework の説明がわかりやすい。カスタムサーバコントロール、ADO.NETなどが詳しい。お勧め。
- ASP.NET実践テクニック 4200円。VB.NET。数多くのテクニックが簡潔に例示されている。電子メール、IISの操作、データベースなども詳しい。お勧め。
- 標準ASP.NETプログラミング〈1〉 4200円。VB.NET。詳しい説明でも豊富な内容をカバー。モバイルコントロールの説明あり。お勧め。
- 標準ASP.NETプログラミング〈2〉 3800円。VB.NET。Webサービスの説明。未読。
- プロフェッショナルASP.NET〈上〉基本編 4980円。VB.NET。基本的な内容を丁寧に説明。概念を学びたい人に。
- プロフェッショナルASP.NET〈下〉応用編 5980円。VB.NET。C#。Webサービス、モバイル、セキュリティなども説明。読書中。
- Microsoft ASP.NET実践講座 4200円。未読。
- ユニバーサルHTML/XHTML 2200円。お勧め。ASP.NETの本ではないが、HTMLの基礎習得に。
ASP.NETについてちょっとまとめたもの
パネルのEnableを子供に設定
foreach (Control c in Panel1.Controls)
{
System.Reflection.PropertyInfo pi = c.GetType().GetProperty("Enabled");
if (pi != null) pi.SetValue(c,Panel1.Enabled,null);
} |
忘年会のビンゴで1等に当った。
TBCが
10人に1150万円の損害賠償を請求されたそうだ。慰謝料じゃないのか?
1/10の判決でも1人10万円。3万件だといくらだ。提訴される前に何をしていたんだ。
VS.netでTODO
を使ったことはなかったが、タスク一覧に出すことができ便利である。
System.BitConverterでbyte[]->stringにできる。
byte[]は、System.Text.Encoding.GetEncoding("Shift-JIS").GetBytes(s)などから生成。
FormsAuthentication.HashPasswordForStoringInConfigFile(s,"sha1")などで、ハッシュの生成。
Literal Webサーバコントロールを使うとタイトルの設定ができる。
TIPSから。
プログラミング所感 - 前へ 目次 次へ
|