プログラミング所感 - 前へ 目次 次へ


04/01/09(金)

2004年だ。 なんか、全然余裕がない。倒れるかも。日経コンピュータが薄い。

04/01/27(火)

「ソフトウェア開発のカオス」から。
包括的言葉使い責任を分かつことを確認しつつ、状況を共通の困難として認識する
推論的言葉使い可能性の形をとって質問を投げかける
進歩的言葉使い小さく容易なステップで参画とコミットメントを築く
再帰的聴衆相手の言葉を繰り返す

04/02/19(木)

月一ペースだ。 詰まって解決したこと。
  • VirtualPCにRedHat9を入れて、色数はTrueColor16にする。
  • アンテナ制御部のEthernetのコネクタはパネルではなくボード直付けを使う。
  • ThinkPad G40にRedHat9を入れるとき、内蔵NICではなく、外付けNICを使う。
  • NFSの/etc/exportsに「ディレクトリ マシン名(rw)」と書いて、/etc/rc2.d/K20nfs stop とstart

04/03/08(月)

ClickOnceっていいね。 (dot Netマガジン4月号より)

なんか働きすぎのような気がする。

描画のバッファリング。

SetStyle(ControlStyles.ResizeRedraw
    |  ControlStyles.DoubleBuffer
    |  ControlStyles.AllPaintingInWmPaint,true);
スクロール。
どこかで AutoScrollMinSize = ...
Paintで
e.Graphics.Transform = new System.Drawing.Drawing2D.Matrix(1,0,0,1,
    AutoScrollPosition.X,AutoScrollPosition.Y);

04/03/16(火)

DataSetの XmlDataDocumentを通してRemoveAllできない。バグ?

XmlSchema作成プログラム。3行。


04/03/18(木)

GERTの概念を 広げたものを考えた。あるパスの所要時間が別のパスを実行することによって 変わるとする。このとき、クリティカルパスは?優先順位はどうなるか?
また、PERTで作業に共有リソースが必要な(同時進行できない)場合は? 段取り時間がある場合のPERTの理論は?

WindowsXPでisspaceがおかしい。


04/03/30(火)

ウィルスに感染しているといって、 Return Mailが山のように来る。しかし、Return Pathを見る限り、こっちから送った形跡はない。 いい加減にしてほしいのだが、一切、無視することにする。

04/04/09(金)

イラクに必要なのは、 紛争解決と国民の支持を受けた安定政権だ。 このために、テロは最善の方法ではない。 人質解放というシナリオ以外では、喜ぶのは軍事関係者だけだろう。 最悪の場合、両国の関係に数十年にわたる影響がでる。

04/04/21(水)

画像の拡大、縮小
		Bitmap b = (Bitmap)Bitmap.FromFile(...);
		int		w = b.Width * n,  h = b.Height * n;
		Bitmap bm = new Bitmap(w,h);
		Graphics g = Graphics.FromImage(bm);
		g.InterpolationMode = InterpolationMode.High;
		g.DrawImage(b,0,0,w,h);
圧縮率変更
		Bitmap b = new Bitmap(...);
		EncoderParameters ep = new EncoderParameters(1);
		ep.Param[0] = new EncoderParameter(Encoder.Quality,25L);
		ImageCodecInfo ic = null;
		foreach (ImageCodecInfo encInfo in ImageCodecInfo.GetImageEncoders()) 
		{
			if (encInfo.MimeType == "image/jpeg") {ic = encInfo; break;}
		}
		b.Save(...,ic,ep);

04/04/23(金)

逆誤差関数の計算方法を調べてみたが、 探しきれなかったので、自作した。Splineはアルゴリズム事典を参考にした。
public class Spline
{
	private double[]	x,y,z;
	public Spline(double[] x0,double[] y0)
	{
		int		i, n = x0.Length;
		System.Diagnostics.Debug.Assert(n > 2 && n == y0.Length);
		x = new double[n];
		y = new double[n];
		z = new double[n];
		x0.CopyTo(x,0);
		y0.CopyTo(y,0);
		double	t;
		if (x[0] > x[1])
		{
			for (i=0;i<n/2;++i)
			{
				t = x[i]; x[i] = x[n-1-i]; x[n-1-i] = t;
				t = y[i]; y[i] = y[n-1-i]; y[n-1-i] = t;
			}
		}
		double[]	h = new double[n];
		double[]	d = new double[n];
		for (i=0;i<n-1;++i)
		{
			h[i  ] =  x[i+1]-x[i];
			d[i+1] = (y[i+1]-y[i]) / h[i];
		}
		z[0] = z[n-1] = 0;
		z[1] = d[2]-d[1]-h[0]*z[0];
		d[1] = 2*(x[2]-x[0]);
		for (i=1;i<n-2;++i)
		{
			t = h[i]/d[i];
			z[i+1] = d[i+2]-d[i+1]-z[i]*t;
			d[i+1] = 2*(x[i+2]-x[i])-h[i]*t;
		}
		z[n-2] -= h[n-2]*z[n-1];
		for (i=n-2;i>0;--i)
			z[i] = (z[i]-h[i]*z[i+1])/d[i];
	}
	public double Estimate(double t)
	{
		int		i,j,k, n = x.Length;
		double	d,h;
		i = 0;
		j = n-1;
		while (i < j)
		{
			k = (i+j)/2;
			if (x[k] < t) i = k+1;
			else j = k;
		}
		if (i > 0) --i;
		h = x[i+1] - x[i];
		d = t-x[i];
		return (((z[i+1]-z[i]) * d/h + z[i]*3) * d
			 + ((y[i+1]-y[i])/h - (z[i]*2+z[i+1])*h))*d + y[i];
	}
}
public class ErrorFunction
{
	#region data
	private static double[] data = {
	0.500000,0.496011,0.492022,0.488033,0.484047,0.480061,0.476078,0.472097,0.468119,0.464144,
	0.460172,0.456205,0.452242,0.448283,0.444330,0.440382,0.436441,0.432505,0.428576,0.424655,
	0.420740,0.416834,0.412936,0.409046,0.405165,0.401294,0.397432,0.393580,0.389739,0.385908,
	0.382089,0.378281,0.374484,0.370700,0.366928,0.363169,0.359424,0.355691,0.351973,0.348268,
	0.344578,0.340903,0.337243,0.333598,0.329969,0.326355,0.322758,0.319178,0.315614,0.312067,
	0.308538,0.305026,0.301532,0.298056,0.294598,0.291160,0.287740,0.284339,0.280957,0.277595,
	0.274253,0.270931,0.267629,0.264347,0.261086,0.257846,0.254627,0.251429,0.248252,0.245097,
	0.241964,0.238852,0.235762,0.232695,0.229650,0.226627,0.223627,0.220650,0.217695,0.214764,
	0.211855,0.208970,0.206108,0.203269,0.200454,0.197662,0.194894,0.192150,0.189430,0.186733,
	0.184060,0.181411,0.178786,0.176186,0.173609,0.171056,0.168528,0.166023,0.163543,0.161087,
	0.158655,0.156248,0.153864,0.151505,0.149170,0.146859,0.144572,0.142310,0.140071,0.137857,
	0.135666,0.133500,0.131357,0.129238,0.127143,0.125072,0.123024,0.121001,0.119000,0.117023,
	0.115070,0.113140,0.111233,0.109349,0.107488,0.105650,0.103835,0.102042,0.100273,0.098525,
	0.096801,0.095098,0.093418,0.091759,0.090123,0.088508,0.086915,0.085344,0.083793,0.082264,
	0.080757,0.079270,0.077804,0.076359,0.074934,0.073529,0.072145,0.070781,0.069437,0.068112,
	0.066807,0.065522,0.064256,0.063008,0.061780,0.060571,0.059380,0.058208,0.057053,0.055917,
	0.054799,0.053699,0.052616,0.051551,0.050503,0.049471,0.048457,0.047460,0.046479,0.045514,
	0.044565,0.043633,0.042716,0.041815,0.040929,0.040059,0.039204,0.038364,0.037538,0.036727,
	0.035930,0.035148,0.034379,0.033625,0.032884,0.032157,0.031443,0.030742,0.030054,0.029379,
	0.028716,0.028067,0.027429,0.026803,0.026190,0.025588,0.024998,0.024419,0.023852,0.023295,
	0.022750,0.022216,0.021692,0.021178,0.020675,0.020182,0.019699,0.019226,0.018763,0.018309,
	0.017864,0.017429,0.017003,0.016586,0.016177,0.015778,0.015386,0.015003,0.014629,0.014262,
	0.013903,0.013553,0.013209,0.012874,0.012545,0.012224,0.011911,0.011604,0.011304,0.011011,
	0.010724,0.010444,0.010170,0.009903,0.009642,0.009387,0.009137,0.008894,0.008656,0.008424,
	0.008198,0.007976,0.007760,0.007549,0.007344,0.007143,0.006947,0.006756,0.006569,0.006387,
	0.006210,0.006037,0.005868,0.005703,0.005543,0.005386,0.005234,0.005085,0.004940,0.004799,
	0.004661,0.004527,0.004397,0.004269,0.004145,0.004025,0.003907,0.003793,0.003681,0.003573,
	0.003467,0.003364,0.003264,0.003167,0.003072,0.002980,0.002890,0.002803,0.002718,0.002635,
	0.002555,0.002477,0.002401,0.002327,0.002256,0.002186,0.002118,0.002052,0.001988,0.001926,
	0.001866,0.001807,0.001750,0.001695,0.001641,0.001589,0.001538,0.001489,0.001441,0.001395,
	0.001350,0.001306,0.001264,0.001223,0.001183,0.001144,0.001107,0.001070,0.001035,0.001001,
	0.000968,0.000936,0.000904,0.000874,0.000845,0.000816,0.000789,0.000762,0.000736,0.000711,
	0.000687,0.000664,0.000641,0.000619,0.000598,0.000577,0.000557,0.000538,0.000519,0.000501,
	0.000483,0.000467,0.000450,0.000434,0.000419,0.000404,0.000390,0.000376,0.000362,0.000350,
	0.000337,0.000325,0.000313,0.000302,0.000291,0.000280,0.000270,0.000260,0.000251,0.000242,
	0.000233,0.000224,0.000216,0.000208,0.000200,0.000193,0.000185,0.000179,0.000172,0.000165,
	0.000159,0.000153,0.000147,0.000142,0.000136,0.000131,0.000126,0.000121,0.000117,0.000112,
	0.000108,0.000104,0.000100,0.000096,0.000092,0.000088,0.000085,0.000082,0.000078,0.000075};
	#endregion
	private static Spline	erf;
	private static Spline	inverf;
	static ErrorFunction()
	{
		double[] x = new double[data.Length];
		for (int i=0;i<x.Length;++i) x[i] = i*0.01;
		erf = new Spline(x,data);
		inverf = new Spline(data,x);
	}
	public static double GetErr(double t) {return erf.Estimate(t);}
	public static double GetInvErr(double t) {return inverf.Estimate(t);}
}
PS.もっといい方法があった。

04/05/07(金)

安全在庫を考えていて発見。 確率変数Xを平均a、標準偏差σの正規分布に従うとする。 Mを十分大きな数とする。確率変数Yを以下のように決める。 MからXの実現値を引いていき最初に負になったときの値を-yとする。このyで表される確率変数をYとする。
このとき、Yの密度関数は、(1-F(y))/aとなる。(但し、FはXの分布関数)
理由は不明だが、理論値とシミュレーションのヒストグラムが一致する。

もう1つ。確率変数ZをMax(N,x)とする。但し、xはXの実現値。 このとき、Zの実現値からXのaとσを求める方法も発見。これも理由は不明。


04/05/10(月)

簡易グラフ確認クラスを作った。 (SimpleGraph.dll

  using SimpleGraph;
  SimpleGraphForm.ShowGraph(new Function(Math.Sin),0,Math.PI*2);

04/05/11(火)

ControlPaintという便利なクラスがある。

04/05/14(金)

地球上の ある点からある方向へある距離移動した点を求める。
public class ConvertPosition
{
	const double rad = Math.PI / 180;
	const double rr = 1.0 / 6378;
	/// <summary>
	/// 角度と距離からポイントを求める
	/// </summary>
	/// <param name="easAng">東経</param>
	/// <param name="norAng">北緯</param>
	/// <param name="angle">角度(度)</param>
	/// <param name="dist">距離(km)</param>
	/// <returns></returns>
	public static double[,] Calc(double easAng, double norAng, double[] angle,double[] dist)
	{
		System.Diagnostics.Debug.Assert(angle.Length == dist.Length);
		double[,]	res = new double[angle.Length,2];
		double[]	pnt = new double[3];	// 位置
		double[]	nor = new double[3];	// 北方向
		double[]	eas = new double[3];	// 東方向
		double[]	dir = new double[3];	// 角度方向
		double[]	tgt = new double[3];	// 目標
		int			i,k;
		double		d,d2;
		easAng *= rad;
		norAng *= rad;
		pnt[0] = -Math.Sin(easAng)*Math.Cos(norAng);
		pnt[1] =  Math.Cos(easAng)*Math.Cos(norAng);
		pnt[2] =  Math.Sin(norAng);
		nor[0] = -pnt[0];
		nor[1] = -pnt[1];
		nor[2] = -pnt[2] + 1/pnt[2];
		Normalize(nor);
		eas[0] = -pnt[1];
		eas[1] = pnt[0];
		eas[2] = 0;
		Normalize(eas);
		for (k=0;k<angle.Length;++k)
		{
			d = Math.Cos(angle[k] * rad);
			d2 = Math.Sqrt(1-d*d);
			//for (i=0;i<3;++i) d -= nor[i]*eas[i];
			for (i=0;i<3;++i) dir[i] = d*nor[i]
				 + d2*(i == 0 && angle[k] > 180 ? -eas[i] : eas[i]);
			Normalize(dir);
			d = dist[k] * rr;
			d = d*d/2;
			d2 = Math.Sqrt(d*(2-d));
			for (i=0;i<3;++i) tgt[i] = (1-d)*pnt[i] + d2*dir[i];
			res[k,0] = Math.Atan2(-tgt[0], tgt[1]) / rad;
			res[k,1] = Math.Asin(tgt[2]) / rad;
		}
		return res;
	}
	public static void Normalize(double[] v)
	{
		double	d = 0;
		for (int i=0;i<v.Length;++i) d += v[i]*v[i];
		d = 1 / Math.Sqrt(d);
		for (int i=0;i<v.Length;++i) v[i] *= d;
	}
}

public class Test
{
	public static void Main(string[] args)
	{
		int		i;
		double[] an = new double[36];
		double[] di = {1,0.2,0.3,0.5, 0.1,0.2,0.7,0.4, 0.3,0.6,1,0.3,
			 0.5,0.4,0.2,0.8, 0.9,0.7,0.6,0.1, 0.2,0.7,0.3,0.2,
			 0,0.4,0.8,0.6, 0.5,0.2,0.4,0.3, 0.6,0.4,0.3,0.4};
		for (i=0;i<an.Length;++i) an[i] = i*10;
		double[,] r = ConvertPosition.Calc(155,40,an,di);
		for (i=0;i<an.Length;++i) Console.WriteLine("{0},{1}",r[i,0],r[i,1]);
	}
} 
下流工程の在庫情報を持つときと持たないときの違いのシミュレーション
using System;
using NumericalLibrary.Numerical;
using NumericalLibrary.Simulation;

namespace StockSim
{
	class Class1
	{
		[STAThread]
		static void Main(string[] args)
		{
			int				l1 = 5;			// 親のLT
			int				l2 = 8;			// 子のLT
			int				n = 6;			// 子の数
			double			a = 100;		// 需要平均
			double			s = 10;			// 需要標準偏差
			double			r1 = a * n * l1 * 1.5;
			double			q2 = a * l2 * 1.2;	// 発注点
			double			r2 = a * l2 * 2.0;
			double[]		stc = new double[n+1];
			int[]			tim = new int[n+1];
			int				i,j,k,l,nLost,nOdr, nn = 100000;
			double			d,pl,cst,q1,qs;
			for (l=0;l<2;++l)
			{
				qs = a*n*l1*0.8 - (1-l)*(l2*a*n + 2300);
				for (k=0;k<10;++k)
				{
					NorRand			nr = new NorRand(1,a,s*s);
					q1 = qs + a*n*l1*k/10*0.2;
					for (j=0;j<stc.Length;++j)
					{
						stc[j] = r2 + nr.Double() * 3;
						tim[j] = -1;
					}
					stc[0] = 2*r1;
					nLost = nOdr = 0;
					cst = 0;
					for (i=0;i<nn;++i)
					{
						// 朝届く
						if (--tim[0] == 0)
						{
							stc[0] += r1;
						}
						for (j=1;j<stc.Length;++j)
						{
							if (--tim[j] == 0)
							{
								stc[0] -= r2;
								stc[j] += r2;
							}
						}
						if (tim[0] == 1 && stc[0] < 0) ++nLost;
						pl = 0;
						if (l == 0)
						{
							for (j=1;j<stc.Length;++j)
							{
								d = stc[j] - q2;
								if (d < 0) pl += 1;
								else pl += 1-DistributionFunction
								.NormCDF((d-a*l1) / Math.Sqrt(l1) / s);
							}
						}
						if (tim[0] <= 0 && stc[0] <= q1+pl*r2) tim[0] = l1;
						for (j=1;j<stc.Length;++j)
						{
							stc[j] -= nr.Double();
							if (tim[j] <= 0 && stc[j] <= q2) tim[j] = l2;
						}
						cst += stc[0];
					}
					cst /= nn;
					Console.WriteLine("{2},{0:F3},{3}{1:F3}",
						cst, 100.0 * nLost / nn, k, l == 0 ? "" : ",");
				}
			}
		}
	}
}

04/05/20(木)

未だに、毎日手作業で100通ぐらいのSPAMを 捨てている。メーラに似たようなメールをまとめて、 ツリー形式で表示してくれる機能があると助かる。そうすると、削除が楽になると思う。 要するに、SPAMは似たようなやつが多い。ウィルスの自動発信のものが多いからかもしれないが。 3週間ぐらいになるが、相変わらず、イギリス(uk)からのReturn Mailが多い。 ウィルス感染をほっといてSPAMを垂れ流すやからは、インターネットから排除した方がいいのではないだろうか。

04/05/21(金)

ケアレスミス
1-0が0になってしまい、見てもわからない。デバッガで追いかけてもわからない。 よくよくみると、1*-0になっていた。

04/05/24(月)

契約に関する留意点。
  • 秘密保持
  • 成果物の規定
  • 下請けの利用の可否
  • 仲裁機関
  • 免責対象
  • 報告の義務が発生する事象

04/05/25(火)

マスカスタマイゼイション。
産業は、手工業(多品種少量生産)、工場(少品種大量生産)から マスカスタマイゼイション(多品種大量生産)へとシフトしつつある。 例えば、Dellが有名。
ソフト開発でも、受託(多品種少量生産)、パッケージ(少品種大量生産)から 多品種大量生産への流れが広がるに違いない。それをしてこそ生き残ることができるのではないか。 それを実現するためには、汎用的な部品を用意しておいて、瞬時に組合わせて使えるようなことが必要だろう。 フレームワークや半製品なども組合わせる方法も進むだろう。

04/05/28(金)

ASP.NETで 特定のページを対象にするには、<location path="***.aspx">内に書けばよいようだ。 ページではなく、フォルダを指定することもできる。

04/06/01(火)

TSPのライブラリを作成。
1km四方内にn点をランダムに置く。 このとき、n点を通る巡回路は正規分布に従うようだ。 平均は、0.77√n+0.42、標準偏差はおよそ0.3となった。(n=5〜50で、それぞれ2000回の試行)

04/06/02(水)

美と芸術の追求を 政策とする政党や、健康だけを追及する政党があってもよいのではないだろうか。

「配列のある要素を別の場所に移動」をn回繰り返す。
public static void RandomMoveN(Random r,int n,int[] ary)
{
	if (ary.Length < 2) throw new ApplicationException("要素数が2以上必要");
	int[]	idx = new int[ary.Length];
	int		i,j,k,l;
	for (i=0;i<ary.Length-1;++i) idx[i] = i+1;
	idx[i] = 0;
	for (i=0;i<n;++i)
	{
		j = r.Next(ary.Length);
		k = r.Next(ary.Length-2);
		l = idx[j];
		while (k == j || k == l) k = (k+1)%ary.Length;
		idx[j] = idx[l];
		idx[l] = idx[k];
		idx[k] = l;
	}
	int[]	org = new int[ary.Length];
	ary.CopyTo(org,0);
	k = 0;
	for (i=0;i<ary.Length;++i)
	{
		ary[i] = org[k];
		k = idx[k];
	}
}


04/06/07(月)

たまに忘れるので貼っておく。 標準の数値書式指定文字列

04/06/08(火)

新ゲーム考案。バイポリーという名前にでもしようか。 n×nのマスでm人対戦。順番にマスを選ぶ。選んだマスにa分の資本を投下。既に他の資本があれば、 周りの状況によりある程度削減。投下資本は、周りの状況により推移。最終的に盤上の資本が多い人が勝ち。

より具体例をあげると。

  • 4×4のマスで2人。初期値は0とする。
  • 先手は選択マスに+6、後手は-6できる。但し、選択マスが逆符号の場合、+3,-3とする。
  • 周囲8マスに同符号が0個なら-3、1個なら-2、2個なら-1、3個なら0、4個なら+1

地図変換関数
public static void ConvMap(string dir)
{
	string[]	ss = Directory.GetFiles(dir);
	int			x,y;
	float		w = 600, h = 496,ww,hh;
	int[]		scls = {2,4,8};
	foreach (int scl in scls)
	{
		ww = w/scl;
		hh = h/scl;
		//Bitmap bb = new Bitmap((int)(ww*24),(int)(hh*33));
		Bitmap bb = new Bitmap((int)(ww*18),(int)(hh*23));
		Graphics g = Graphics.FromImage(bb);
		g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
		g.FillRectangle(new SolidBrush(Color.FromArgb(0,127,204)),0,0,bb.Width,bb.Height);
		foreach (string fnam in ss)
		{
			Bitmap b = new Bitmap(fnam);
			x = int.Parse(fnam.Substring(fnam.Length-6,2)) - 28 /* 22 */;
			y = 68 - int.Parse(fnam.Substring(fnam.Length-8,2));
			g.DrawImage(b,x*ww,y*hh,ww,hh);
			b.Dispose();
			b = null;
			GC.Collect();
		}
		bb.Save(dir + "/../japan" + scl + ".jpg",ImageFormat.Jpeg);
	}
}


04/06/11(金)

暇じゃないのに分析
図書館に予約した本が貸出し可能となった曜日。
曜日
回数956625
火曜が多く、土曜が少ない。月曜は休みなので0。

04/06/16(水)

複数のWebアプリケーションで ログイン処理を共通にしたい場合、前に、認証サーバを作って対応したりしたけど、 Web.config書き換えるだけで可能であった。
<configuration>
 <system.web>
  <machineKey
   validationKey="1234567890123456789012345678901234567890"
   decryptionKey="1234567890123456" />
  <authentication>
   <forms name="AnyName" loginUrl="/Login/login.aspx" path="/" />
  </authentication>
 </system.web>
</configuration>

04/06/24(木)

超簡単 名簿管理ツール(Windows)作成手順。
  • TypedDataGrid.dllを適当なところにコピー。
  • VS.NETのツールメニューの「ツールボックスアイテム追加と削除」でコピーしたやつを追加。
  • VS.NETでWindowsアプリケーションを新規作成。
  • フォームForm1にTypedDataGridをはる。
  • 以下のコードをForm1.csの最後に追加。
    public class Person
    {
    	[NumericalLibrary.Etc.DGSyncCol(0,"#",20, AutoIncrement=true, ReadOnly=true)]
    	public int id;
    	[NumericalLibrary.Etc.DGSyncCol(1,"名前")]
    	public string name;
    	[NumericalLibrary.Etc.DGSyncCol(2,"年齢",40,0, Alignment=HorizontalAlignment.Right)]
    	public int age;
    	public enum MF {男,女};
    	[NumericalLibrary.Etc.DGSyncCol(3,"性別",40,MF.男)]
    	public MF mf;
    	[NumericalLibrary.Etc.DGSyncCol(4,"登録日時",90,"0/1/1", Format="yy/MM/dd HH:mm")]
    	public DateTime date;
    }
  • コンストラクタなどを以下のように修正、追加。
    public Form1()
    {
    	InitializeComponent();
    	typedDataGrid1.RowType = typeof(Person);
    	try {typedDataGrid1.XmlLoad("../../test.xml");}
    	catch {}
    }
    private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
    	typedDataGrid1.XmlSave("../../test.xml");
    }
TypedDataGridのDataプロパティを使うと、任意のクラスの配列とDataGrid間でやりとりできる。
DataGridをRDB(ADO.NET)と無関係に使う人は殆どいないだろうけど。

04/06/28(月)

「数字オンチの諸君!」より。 amazon
間違っていると言えるものはどれか選べ。
  • 宇宙は直径400億光年の球だとしよう。この中に、30cm×30cm×30cmのコンピュータをすき間なくしきつめても、 1無量大数(10^88)個より少ない。
  • スーパードクターKの元にガン検査にくる患者のうち、200人に1人は本当にガンである。 彼は、ガン患者を99%でガンと診断し、非ガン患者の95%を非ガンと診断し、不明とは言わない。 彼に「ガンだ」と診断されたとき、本当はガンでない可能性は90%以上ある。
  • プロ野球前半、打率1位はA選手、2位はB選手、後半も打率1位はA選手、2位はB選手であった。 年間では、打率1位はB選手、2位はA選手となった。
  • とある選挙にて。A候補は「有権者の2/3がBより私を支持している」。 B候補は「有権者の2/3がCより私を支持している」。C候補は「有権者の2/3がAより私を支持している」。 彼ら3人の言い分は正しい。
  • 4つの6面体のサイコロ(A,B,C,D)があり、各面には0から6までの整数が書いてある。 数字の大きい方を勝ちとする。どの2つのサイコロにも共通の数字はないので引き分けはない。 AはBに2/3の確率で勝ち、BはCに2/3の確率で勝ち、CはDに2/3の確率で勝ち、DはAに2/3の確率で勝つ。
答えは、











「間違っているといえるものはない」。
  • 4/3π(4 10^23)^3/(3 10^-4)^3≒10^82
  • ガンの確率は約9%(=1*0.99/(1*0.99+199*0.05))
  • 前半Aは30/100、Bは14/50、後半Aは20/50、Bは39/100であった。年間では、Aは50/150、Bは53/150となる。
  • 1/3の有権者はA,B,Cの順で、1/3の有権者はB,C,Aの順で、1/3の有権者はC,A,Bの順で支持していた。
  • Aの目は444400、Bの目は333333、Cの目は222266、Dの目は555111だった。

気になった点。
「兄か弟のいる確率は2/3」という記述において、名前を特定する仮定の下では、確率は1/2が正しい。
「体重は正規分布に従う」には、異論のある人もいると思う。

文字置換 RepFiles.exe


04/06/29(火)

プログラマは、 作家、職人、芸術家と通ずるものがある。それ故、私は、ユーザが感動するものを作りたい。

04/06/30(水)

家族に大地震の予知を するんだけど、2回外れた。予知の根拠はインスピレーションだけ。

04/07/01(木)

ハリポタ公開初日に見たら えらい混んでた。

子供に、ニモのおもちゃを作った。 「ヒレを動かすと目が動く」(A)はずだったのだが、 「目を動かさないとヒレが動かない」(B)ものになってしまった。 AとBは対偶の関係で数学的には同値のようだが、実際のBの状態では、ヒレを主体的に動かせない。 (目を動かすとヒレは動くのだが、ヒレを動かそうとしても壊れそうになる)


04/07/02(金)

javascript Tips
アンカーがクリックされたときに、そのページが画面全体になるようにするには、そのページに
if (top.location != self.location) top.location = self.location;
と書いておくとできる。

04/07/08(木)

VC#2005Expressをインストールした。 快適。早く製品版が出て欲しいものだ。genericが使える。リファクタリングもある。 .net framework 1.1より微妙に早い。 Listが先頭への挿入がArrayListの2倍くらい早い(ListとLinkedListは同じくらい)。

04/07/22(木)

ゲイツは、ボーナス 0.3兆円ですか。私と11桁ぐらい違うね。

昨日、熱けいれんらしきものにかかった。早退したかったのだが、顧客と打合せがあるので、 スタミナドリンクでごまかした。経緯は、昼、外に出たら5分ぐらいで、全身悪寒、全身脱力、軽いけいれん になった。おそらく、一気に大量の汗が出て塩分不足になったようだ。対処法は、安静にして 塩分(スポーツドリンクなど)補給なのだが、昨日は、水(お茶)しか補給しなかった。 水だけだと、塩分濃度が薄まって逆効果だったようだ。
普段は塩分取りすぎのはずだが、最近はそうでもなかったようだ。

今日は非常勤講師初日。


04/07/28(水)

普段使うPCをノートPCにした。

04/07/29(木)

DVD-RAMでVirtual PCを使うと 100倍くらい遅い。 単にデータの保存だけならそこそこ速い。削除は早い(戻せないが)。 Visual Studio.NETのソリューションを直接作れない。 CD-Rよりは、断然お手軽である。
NDoc格好いいね。

04/07/30(金)

はぁ。 がっくり。ゲイツとの桁数の差は6桁ぐらいかな。絶対値で。

04/08/04(水)

ノートPCが調子悪く なったので、出荷時に戻して再インストールした。面倒くさい。

04/08/05(木)

携帯で 麻雀の上がりの写真を撮って送ると点数が返ってくるというサービスはどうだろう。

DVD-RAMに作業データをミラーリングするようにした。 25000ファイルの2Gbyteのバックアップが(差分だけなので)2分で終わる。


04/08/06(金)

ミニノートPC考察。
要件
  • OS:Win2000をずっと使ってたけど、XPでもいいや。WinXP Homeは却下。従って、WinXP Pro。
  • CPU:特に理由はないんだけど、Pentium Mで。
  • メモリ:多けりゃいいんだけど、768MB以上で。
  • HD:多けりゃいいんだけど、40GB以上で。
  • 内蔵ドライブ:やっぱり、DVDマルチドライブで。
  • ネットワーク:やっぱり、無線LAN内蔵で。
  • 重量:軽けりゃいいんだけど、1.5kg以下で。
  • 価格:20万以下かなぁ。
結論、20万以下じゃ、ないっすね。参考
  • ThinkPad X40。HD20G。CD/DVDなし。バッテリが3.3時間。
  • ThinkPad X31。重量1.64kg。HD20G。CD/DVDなし。バッテリが5.2時間。
  • dynabook SS 1610。CD/DVDなし。要ビジネス向けカスタマイズ。1.1kg。USB3口。
  • dynabook SS S9。CD/DVDなし。1.3kg。
  • PCG-V505T4/P。DVD-RAMなし。2kg。
  • PCG-TR。DVD-RAMなし。
  • CF-W2DW6AXR。21万くらいか。1.3kg。
  • CF-T2DW1AXR。CD/DVDなし。1.1kg。
  • CF-R3DW1AXR。CD/DVDなし。1.0kg。
  • DELL Inspiron 300m。CD/DVDなし。1.3kg。
  • LaVie J。DVD-RAMなし。1.4kg。
  • PriusGear150H2LVPT。XP Proは?1.7kg。バッテリが2.6時間。DVDと代えればTVが見れる。ソフトもたくさん。生産中止?30万くらい?
CF-R3でDVDマルチドライブ外付け。外部モニタという手もある。

04/08/16(月)

社内メールサーバから、 私がウィルスメールを送ったので遮断したというメールがきた。 社外メールサーバからは山のように来るので無視していたが、社内なので調べてもらった。 結果は送信サーバを偽装したものだった。

04/08/18(水)

ファイル名からパスだけ取り出すとき、 いつもSubstring使っていたが、System.IO.Path.GetDirectoryNameを使えばよかった。

System.IO.Path.ChangeExtensionの機能用件を読み、(1)どのようなテストが必要か、(2)実装はどうなるかという 演習は面白いかもしれない。


04/08/20(金)

Windows Updateが変わった。 前より使いやすくなったんだろうか。UIを変えて、更新が速くなったのか。

プラグインのサンプルソース。 実行して、編集-新規を2回くらいして、MyPlugin1やMyPlugin2をダブルクリックする。 ソースは例によってTakeMani でも取り出せる。


04/08/25(水)

割り込み率というのを考えた。
割り込み率=必要作業時間 / (作業終了期限 − 頼んだ時刻)
「仕事を頼むときは割り込み率が0.05以下になること」というのが広まればいいんじゃないだろうか。

04/09/06(月)

急にいろんな案件がたてこんで、 忙しい。

04/09/08(水)

ProAtlas W3を買った。 これは便利。昔、南ア縦走のとき、標高グラフを手で作成したが、今ならクリック数回でできる。山歩きする人には、ジオラマも嬉しいだろう。

青色レーザーDVDが数年後には標準になるか。台風18号は広島で風速60mだそうだ。デジタルTVがヨーロッパで普及拡大しているらしい。 日本にも追い風となるだろう。


04/09/16(木)

携帯を持つことになった。 字が読みづらい。

04/09/30(木)

アクセスの負荷分散が できるそうだ。無料CDNを公開

04/10/01(金)

気象庁が システム障害で、津波情報を送れなかった。対策として、障害を起こさないようにすることと、 障害発生時でも独立したシステムで情報を送れるように準備することも必要だろう。 システムといっても、バックアップ用で使用頻度が少ないのだから、ハードもソフトも最小限でよい。 極端な話、電話の連絡網ならばコストはほとんどかからない。実際、今回もFAXで対応したようだが、 この対応を「障害時の通常対応」として徹底させていれば、混乱はなかったかもしれない。

円周上にランダムに3点をとり三角形を作ると、鋭角三角形になる確率は1/4。球面上だと1/2。
using System;

public class Test
{
	public static void GetPos(bool bFlat,Random r,double[] pnt)
	{
		double	p,s,t;
		while (true)
		{
			s = (bFlat ? 0.5 : r.NextDouble()) * Math.PI;
			p = Math.Sin(s);
			if (r.NextDouble() <= p) break;
		}
		t = r.NextDouble() * Math.PI * 2;
		pnt[0] = p * Math.Sin(t);
		pnt[1] = p * Math.Cos(t);
		pnt[2] = Math.Cos(s);
	}
	public static double GetAngle(double[] pnt1,double[] pnt2,double[] pnt3)
	{
		double	d,x1,y1,z1,x3,y3,z3;
		x1 = pnt1[0] - pnt2[0];
		y1 = pnt1[1] - pnt2[1];
		z1 = pnt1[2] - pnt2[2];
		x3 = pnt3[0] - pnt2[0];
		y3 = pnt3[1] - pnt2[1];
		z3 = pnt3[2] - pnt2[2];
		d = (x1*x3+y1*y3+z1*z3) / Math.Sqrt((x1*x1+y1*y1+z1*z1)*(x3*x3+y3*y3+z3*z3));
		return Math.Acos(d) * 180 / Math.PI;
	}
	static void Main(string[] args)
	{
		Random	r = new Random(1);
		double[][]	pnts = new double[][]{new double[3],new double[3],new double[3],};
		double		v1,v2,v3;
		for (int k=0;k<2;++k)
		{
			double		sum = 0, n = 100000;
			for (int i=0;i<n;++i)
			{
				GetPos(k == 0,r,pnts[0]);
				GetPos(k == 0,r,pnts[1]);
				GetPos(k == 0,r,pnts[2]);
				v1 = GetAngle(pnts[0],pnts[1],pnts[2]);
				v2 = GetAngle(pnts[1],pnts[2],pnts[0]);
				v3 = GetAngle(pnts[2],pnts[0],pnts[1]);
				if (v1 < 90 && v2 < 90 && v3 < 90) ++sum;
			}
			Console.WriteLine("{0}面上で鋭角三角形になる確率 {1}%",
				k == 0 ? "平" : "球", 100.0 * sum / n);
		}
	}
}

あなたは、ある路線の終電にたまに乗ることがある。 この終電の乗客は、平均n人のポアソン分布に従っているとする。この平均には、あなたも含まれている。
さて、ある日、あなたがこの終電に乗ったとする。あなた以外の乗っている乗客人数の期待値は何人か? 答えはn人である。(P(x)をポアソン分布の密度関数とすると、Σx*xP(x) / n = n+1)
public static int PoissonN(Random r,double l)
{
	int x = 0;
	l = Math.Exp(l) * r.NextDouble();
	while (l > 1)
	{
		++x;
		l *= r.NextDouble();
	}
	return x;
}

2種類のコインAとBがある。コインAは10g、コインBは10.1gで見ただけではわからない。 コインBの割合をrとし、わかっているものとする。あなたの仕事は混ざった中からAとBを分けることである。 確認は秤を使って行うが、なるべく少ない回数で分別したい。そこで、次のように調べることにした。
まず、m個をいっぺんに量る。全部同じでないならば、m個を1つづつ調べる。
このとき、1個当りの秤を使う平均回数aは、0.75√(1-(2r-1)^2)となる。但し、mは切捨て(2.4/a)。


04/10/04(月)

遂に電話加入権が なくなりそうだ。売っちゃえばよかったな。

04/10/14(木)

半角カナの判定。 Regex.IsMatch(s,"[。-゚]")

04/10/24(日)

プログラム開発の時間は、 概ね機能から予測できる。予測しにくいのは、設計の難しい部分、バグ対応などである。 予測において、しやすいのとしにくいものは、分けて実績を計り分けて予測すべきだろう。

04/10/27(水)

今年、一番やりたかった仕事が 失注した。残念。

文字列の順列
using System;
using System.Collections;
using System.Reflection;

public class Test
{
	public static void Reverse(object[] ary,int i,int j)
	{
		while (i < --j)
		{
			object o = ary[i];
			ary[i++] = ary[j];
			ary[j] = o;
		}
	}
	public static bool NextPermutation(object[] ary)
	{
		return NextPermutation(ary,0,ary.Length);
	}
	public static bool NextPermutation(object[] ary,int i,int k)
	{
		int		j = k-1;
		if (k < 2) return false;
		while (true)
		{
			int j1 = j;
			if (((IComparable)ary[--j]).CompareTo(ary[j1]) < 0)
			{
				int k1 = k;
				while (((IComparable)ary[j]).CompareTo(ary[--k1]) >= 0) /* nop */;
				{object o = ary[j]; ary[j] = ary[k1]; ary[k1] = o;}
				Reverse(ary,j1,k);
				return true;
			}
			if (j == i)
			{
				Reverse(ary,i,k);
				return false;
			}
		}
	}
	static void Main(string[] args)
	{
		if (args.Length == 0 || args[0].Length == 0) 
		{
			Console.WriteLine("usage : {0} string_data",
				Assembly.GetExecutingAssembly().GetName().Name);
			return;
		}
		string		s = args[0];
		int[]		idx = new int[s.Length];
		for (int i=0;i<idx.Length;++i) idx[i] = i;
		object[]	a = new ArrayList(idx).ToArray();
		do
		{
			foreach (int i in a) Console.Write(s[i]);
			Console.WriteLine();
		} while (NextPermutation(a));
	}
}
行カウント
using System;
using System.IO;

public class Test
{
	static void Main(string[] args)
	{
		int		n = Math.Max(1,args.Length);
		string	s;
		for (int i=0;i<n;++i)
		{
			int		l = 0;
			try
			{
				TextReader sr = args.Length == 0 ? Console.In : new StreamReader(args[i]);
				while ((s = sr.ReadLine()) != null) ++l;
				sr.Close();
				Console.WriteLine("{0}{1}",args.Length < 2 ? "" : args[i]+" : ", l);
			}
			catch
			{
				Console.Error.WriteLine("Read error {0}",args[i]);
			}
		}
	}
}
uniq
using System;
using System.IO;

public class Test
{
	static void Main(string[] args)
	{
		int		n = Math.Max(1,args.Length);
		string	s, p = null;
		for (int i=0;i<n;++i)
		{
			try
			{
				TextReader sr = args.Length == 0 ? Console.In : new StreamReader(args[i]);
				if (args.Length > 1) Console.WriteLine("{0}",args[i]);
				while ((s = sr.ReadLine()) != null)
				{
					if (s == p) continue;
					Console.WriteLine("{0}",s);
					p = s;
				}
				sr.Close();
			}
			catch
			{
				Console.Error.WriteLine("Read error {0}",args[i]);
			}
		}
	}
}


04/10/29(金)

Google Desktop Searchを入れた。 強力すぎ。検索範囲を絞って、なまずの代わりにしたい。

04/11/10(水)

引継ぎのときに、ドキュメントなどは引き継いでも、 アーキテクチャを引き継ぐことはほとんどないような気がする。 アーキテクチャは引き継がなくてもいいように、もとから統一しておけばいいとも思うが。 アーキテクチャのメモでも作るか。

ハンカチのデザインにでも
public MainForm()
{
	InitializeComponent();
	Assembly asm = Assembly.GetExecutingAssembly();
	bmp = new Bitmap(asm.GetManifestResourceStream("CSWTest.Bitmap.bmp"));
}
private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
	Graphics g = e.Graphics;
	int			w = pictureBox1.Width, h = pictureBox1.Height;
	float		ww = w/2F, hh = h/2F;
	int			n = 1;
	for (int i=0;i<20;++i)
	{
		if (bCross)
		{
			for (int j=0;j<n;++j)
			{
				g.DrawImage(bmp,w-(2*j+1)*ww,(2*j+1)*hh,-ww,-hh);
				g.DrawImage(bmp,w-(2*j+1)*ww,(2*j+1)*hh,ww,hh);
			}
		}
		else if (i > 0)
		{
			for (int j=1;j<n;++j)
			{
				g.DrawImage(bmp,j*ww,hh,ww,hh);
				g.DrawImage(bmp,w-j*ww,hh,-ww,hh);
				g.DrawImage(bmp,j*ww,h-hh,ww,-hh);
				g.DrawImage(bmp,w-j*ww,h-hh,-ww,-hh);
				if (j == 1) continue;
				g.DrawImage(bmp,ww,j*hh,ww,hh);
				g.DrawImage(bmp,w-ww,j*hh,-ww,hh);
				g.DrawImage(bmp,ww,h-j*hh,ww,-hh);
				g.DrawImage(bmp,w-ww,h-j*hh,-ww,-hh);
			}
		}
		ww /= 2;
		hh /= 2;
		if (ww < 2 || hh < 2) break;
		n *= 2;
	}
}


04/11/11(木)

VISAの詐欺メールが4つも来て、 試しにそのフィッシングサイトを見てみたら、トロイの木馬がしかけてあった。冷や汗。 関連記事

04/11/16(火)

ペルソナ/シナリオ法は、 面白そうだ。今度、やってみるか。

04/11/17(水)

1.4MbのOSモナ面白そうだね。 未実装のところは多々あるが。VirtualPCだと簡単に試せていいね。

XP SP2入れてから更新できない。FTPできない。


04/11/18(木)

家が盗難にあって、メインマシンとバックアップマシンも 盗られソースコードがなくなったという話が話題になっている。
私のメインマシンは、NotePCで、毎日DVD-RAMにミラーリングしている。 これは、HDクラッシュへの対策。DVD-RAMは、NotePCに入れっぱなしなので、 盗難対策として、DVD-RAMを1週間に1度は交換するようにしている。
他のリスクとしては、
  • 地震や火事や盗難
  • メディア(DVD-RAM)の劣化
  • 不注意な操作による消去
などが考えられる。バックアップをインターネット上に置いたりすれば安心できるだろう。 最近は、ちょっとしたプログラムは、exeにソースコードを埋め込んでいるが、 大きいプログラムでもソースコードを暗号化して埋め込むというのは面白いかも。

04/11/22(月)

XMLに限らないが、シリアライズするときに、 問題になるのがアクセス権限である。
public class Sample {
  public int ID {get {return id;}}
}
例えば、このようなクラスを読み込もうとしても、シリアライザからIDを設定することができない。実際、XmlSerializerでは、IDはシリアライズ対象にならない。シリアライズのためだけに、setterを作るのは本末転倒であるが、シリアライザ以外から呼ばれたら、例外を吐くという手もある。 最もエレガントなのは、.net frameworkが対応することだろう。例えば次のように。(.net では、privateメソッドでもリフレクションで呼べるので、privateにしてある。)
  [XmlSetter("SetID")] public int ID {get {return id;}}
  private void SetID(int i) {id = i;}

TestDriven.NETを入れてみた。使ってみるか。


04/11/24(水)

たまにC++を書くと、 newしそうになる。しても間違いじゃないが、deleteするのが面倒。

04/11/26(金)

MSNでブログ始めた。 2つ更新するのは面倒なので、そのうちやめるかも。

作家のタマゴを支援するサイトの案。ブログではなく、小説をWebに公開。Webでは、小説が本のように読める。 小説の更新は、専用ツールで行い、手間はかからない。小説が完成したら、すぐに印刷できる。 印刷のための、小説データの2次加工は不要。すなわち、小説データは、Webでも印刷でも、 そのまま使える。製本までしてくれるハードがあればいいのだが。
既にあったりして。

読書リスト

本棚

04/11/27(土)

Scale Free Networkの要件は、 成長することと優先的選択だそうだ。
実際にやってみると、優先的選択だけでもよさそうだ。モデルは、
  • ノード数はずっと固定で、有向グラフとする。
  • ルートノードを1つ決め、他の全ノードはルートノードから来るリンクと行くリンクを持つ。
  • 有向グラフを単純マルコフ過程と捉え、リンクを追加する毎に定常確率を求める。
  • 1本ずつリンクを追加することを繰り返す。Fromはランダム、Toは定常確率でランダム。
ノード数やリンク数に関わらず同じような傾向になる。 400ノードの場合、定常確率の分布入ってくるリンクの分布
GoogleのPageRankも単純マルコフ過程の定常確率である。

04/11/28(日)

しきい値秘密分散法は面白い。 いろいろ応用できないかな。

04/12/02(木)

アトピーを苦にして、 心中。悲しい事件である。うちの子供もかなりひどかったが、今では、あともなくきれいに直っている。 宮城病院に1ヶ月入院していたおかげであるが。
(アトピーの原因は、さまざまで、他人の方法でうまくいくとも限らないが。)

UFJは信じていたのだが、、、残念。


04/12/07(火)

RealProxyが面白そうだ。 調べる時間がないが。

04/12/09(木)

子供のバレエ発表会のDVDが来た。 子供の出番は数分だったが、全体で4時間ぐらい。DVD3枚。

04/12/10(金)

つり革の握り方の調査があった。 一番多いのは、順手握りだそうだ。私の場合は、 「つかまらない」、「手首まで入れる」、「人差し指と中指で箸のようにつまむ」だろうか。 1本指で持つこともある。指は親指以外どれでもOK。薬指1本や小指1本で つり革につかまっている人を、自分以外に見たことはない。 「人差し指と中指で箸のようにつまんで」持っている人も見たことないなぁ。 つり革が遠いと、これでしか持てないのだが。

振り込め詐欺の被害が222億円ですか。いやはや。


04/12/13(月)

meiさんからBooを紹介 してもらった。 cat
import System
import System.IO

def Main(args as (string)):
	return if args.Length == 0
	sr = StreamReader(args[0])
	while (s = sr.ReadLine()):
		print(s)
	Console.ReadLine()
WinFormテスト
import System
import System.Drawing from System.Drawing
import System.Windows.Forms from System.Windows.Forms

t = Form(Text:"test!")
t.Paint += def(s as object,e as PaintEventArgs):
	g as Graphics = e.Graphics
	g.DrawString(""+Math.Sin(1),t.Font,Brushes.Black,10,10)
t.ShowDialog()

04/12/14(火)

正規分布の確認やらのツールを 作った

04/12/15(水)

パッケージ販売しているので、講習用の ノートPCが何台かあり、セキュリティパッチをあてるのだが、単純な繰り返し作業である。
こんなPCがあればよいと思うのだが。コンセプトはクローンPC。
このPCのOSはホストOSという。
ホストOSは、非常にシンプルで、限定されたネットワーク機能とゲストOSの管理しかできない。 ゲストOSは、ネットワーク上にある。
ホストOSが起動すると、指定されたネットワーク上のゲストOSを確認し、ローカルのキャッシュより新しければ 自動的にダウンロードする。ネットワークがオフなら確認はしない。その後、キャッシュされたゲストOSにスイッチする。 ホストOSの起動中に割り込みをかけたり、ゲストOSを終了したりすると、 ホストOS上で、ゲストOSの管理画面となる。
このようなPCならば、1カ所の更新で、何台ものPCを更新できる。現状でも、ある程度はできるが。 VirtualPCの仮想ディスクにRAMを使って、メモリをたくさん積むとか。後は、ものすごく軽いVirtualPCの動くホストOSがあればいい。 (VirtualPCの実行速度は、ホストOSとほぼ互角だが、ディスクアクセスが遅いのとメモリをたくさん使うのが難点)

04/12/16(木)

Booの紹介ページを 作った

04/12/17(金)

個人情報の定義は 何だろうか? あなたのDNAはあなたの個人情報だろうか?著作物だろうか? あなたの抜けた髪はあなたのものだろうか?(髪からもDNAが取れる) あなたのDNAに特殊な性質(特定の病気の治療など)があって、その情報から収益を 得たらあなたの権利は発生するのか?(アメリカの判例では発生しない)

04/12/21(火)

ロジスティック回帰分析を 検索したら、わかりやすい説明がなかったので、書いてみる。

ロジスティック回帰分析とは
被説明変数(Y)を説明変数(Xi)で回帰分析する。被説明変数は従属変数、説明変数は独立変数ともいう。
Z=a0+ΣaiXiとしたとき、推定式は、Y=1/(1+exp(Z))+errとなる。 これを最小二乗法で、Σerr^2を最小になるようにすれば係数aiが求められる。(n次元非線形最適化)

サポートベクターマシン(SVM)でも、トレーニングデータから、n次元空間で、Yes/No(1または0)の判定ができる。 一般的には、ロジスティック回帰分析よりSVMの方が精度がよいだろう。しかし、サポートベクターマシンでの 分割超平面の法線ベクトルを利用して、ロジスティック回帰分析を行えば、01ではなく、確率を出すことができる。 従って、誤り率を考慮した判定が可能になる。


04/12/23(木)

わかりやすさ、 スピード、提案から保守まで。

Acrobat Reader 7.0を入れた。起動は早いが、IEからだとおかしい。更新は待った方がいいだろう。

上限付きデータ、または打ち切りデータの元の分布のパラメータ推定において、 生存時間解析が行われるが、最適化問題として素直に捉えることもできる。
打ち切りの原因となる上限の分布は、元の分布と独立ならば推定に影響しない。
元の分布が正規分布なら、最尤確率関数の非線形最適化で平均と標準偏差を推定可能である。
元の分布が指数分布なら、同様の方法で解析的に解ける。実現値をXiとすると、 推定平均はΣXi/(n-m)である。nはデータ数で、mは打ち切りのデータ数。
正規分布と指数分布では、最尤確率関数の構成が微妙に異なる。

さすがに休日は仕事のメールが来ないな。

平均aの一様乱数(0〜2a)のn個の実現値Xiからaを推定するには、通常、平均(a=ΣXi/n)を使う。 他にもm=max(Xi)として、a=m*(n+1)/n/2でも平均を推定できる。最大値を使った推定は、 n個の数値の内の1個しか用いないので、通常の平均より精度が悪そうだが、逆にいつでもよい。


04/12/24(金)

分散の計算式。 Xiを観測値とする。
  • Σ(Xi-Ave)^2/n-1:母集団の推定値(Aveが未知。通常知りたいもの)
  • Σ(Xi-Ave)^2/n:標本集団の推定値
  • Σ(Xi-Ave)^2/n:母集団の推定値(Aveが既知)

平均aの指数分布の観測値からaを推定するのに、分散でもできるが平均を使うより悪い。(分散の方がよい確率は36%)
観測値が2個の場合、小さい方を2倍して平均を推定することもできる。このときも、よい確率は36%。 あるいは、大きい方を2/3倍してもいい。このときは、よい確率45%。 両者の平均(小さい方+大きい方の1/3)でもよい確率は45%。 あるいは、任意のrに対して、2(min+r*max)/(1+3r)で推定すると、最もよいのはr=1すなわち通常の平均のとき。
観測値がn個の場合、最小値の期待値はa/nである。最大値の期待値はaΣ1/iである。 このときも通常平均の精度が最もよい。すなわち、指数分布の平均を求めるときに、外れ値を取らない方がいい。

データdataの最大値を知りたいとき、

double max = int.MinValue;
foreach (double d in data) if ([...]) max = d;
...の部分をどう書くか。 (1) d > max
(2) max < d
(1)の主体dで、(2)の主体はmaxである。この場合は(1)の書き方を勧める。

打ち切りデータに関して知りたいこと。

  • 分布が既知の場合の計算方法の体系化
  • 分布が未知の場合の分布の推定と検定

04/12/27(月)

初めて出張先から 更新。明日は5時起き。

プログラミング所感 - 前へ 目次 次へ