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


03/01/06(月)

今年の着目技術など。
情報セキュリティや認証、Webサービス、SOAP、システム間連携、プロジェクトプロセスマネジメント。
去年のトピックはASP.NETだろうか。
室員に期待すること。誠実さと熱意。得意分野構築。顧客とのコミュニケーション。主体性。変革の継続。

安心症候群。ファイルに保存して安心。印刷して安心。コピーして安心。ブックマークして安心。スケジュール帳に書いて安心。


03/01/10(金)

利便性の向上スピードが 高くなっているが、不便性も同様だ。誰かがつまづいた時に、その対策をすぐに広げられることが必要だろう。

ソフトウェア産業、特に大手でない企業では営業力が重要になっている。 政府は、支援策を打ち出すべきだ。でないとどんどん弱体化し、インドや中国に遅れを取るようになるだろう。 企業の方も、これまでのように下流工程のみを受け持つのではなく、独自性を打ち出すことが必要だろう。

USER GROUP@IT 会議室 は非常に参考になる。まとめて、FAQを作ればさらに便利だと思う。書籍を作っても売れるのではないか。

ASP.NETにAdRotatorというのがある。ランダムではなく、日付等で表示を変更できると面白いのではないか。 Googleでよくやっているように。

過去の大きなプロジェクトで成功に必要と感じたものは、 顧客との良い関係づくり、実現イメージ、熱意だ。熱意は燃料のようなものだ。


03/01/17(金)

C#でCSV読むには、何を利用すればいいのか。 わからないので、自作してみた。
public class CSV 
{
	public static string[] GetCSV(string s)
	{
		ArrayList a = new ArrayList();
		int i = 0, j;
		while (i < s.Length) {
			bool b = s[i] == '"';
			if (b) ++i;
			j = s.IndexOf(b ? '"' : ',', i);
			if (j < 0) j = s.Length;
			a.Add(s.Substring(i,j-i));
			i = j + (b?2:1);
		}
		return (string[])a.ToArray(Type.GetType("System.String"));
	}
}

追記:4/3に修正。


03/01/20(月)

C#では、派生クラスの配列を 基底クラスの配列に暗黙的にキャストできる。C++ではできない。 理由は、a[i]などでアクセスする時に型のサイズが一致していないとおかしくなるからだ。
C#で可能なのは、配列もまたクラスだからだ。但し、構造体の配列は明示的にもキャストできない。

C#では、XMLの読み書きも簡単。
// CSVを読み込みXML書き出し
StreamReader st = new StreamReader("../../Test.csv");
string s;
ArrayList	a = new ArrayList();
while ((s = st.ReadLine()) != null)
{
  string[] ss = CSV.GetCSV(s);
  a.Add(new Product(ss));
}
st.Close();

XmlSerializer sr = new XmlSerializer(typeof(Product[]));
TextWriter tw = new StreamWriter("../../Test.xml");
sr.Serialize(tw,(Product[])a.ToArray(Type.GetType("Test.Product")));
tw.Close();
// XML読み込み
XmlSerializer sr = new XmlSerializer(typeof(Product[]));
TextReader tr = new StreamReader("../../Test.xml");
Product[] p = (Product[])sr.Deserialize(tr);
tr.Close();
foreach (Product a in p)
  Console.WriteLine(a);


03/01/21(火)

開発プロセスについて
プロセスとは、「仕事を楽にするためのもの」であり、それ以上でもそれ以下でもない。
  • ソフトウェア開発に関わる人は、プロセス推進を目指すべき。
  • 仕事が楽にならないプロセスは、正しくない。
品質とは確保すべき「制約」である。この制約を満たすための 方法はいろいろあるだろう。プロセスは、品質確保に必要なのではない。 品質確保に「楽だから」行うものである。

インスペクションも同様(プロセスの一部)である。
「ISO9000で仕事が大変になった」というのでは、正しいプロセスとは言えない。

具体的に、プロセスとは何か。
新人以外であれば、自分の仕事について何かしら説明できるだろう。 簡単に言えば、以下のような点を決めたものになるであろう。

  • 始める前に何が必要か
  • どのような手順で行うか
  • どのような形式で成果物ができるか
そして、大事なことは「仕事を楽にするため」に常にプロセスを変えていくことである。

プログラマの復権
日本では、ここ数年プログラマの開発能力が低下しているような気がする。
提言

  • プログラマは権力を持て
  • 技を磨け。そのような場所を持て。

03/01/23(木)

FormsAuthenticationでの認証では、 ReturnUrlという名前のhiddenが必要なようだ。

03/01/28(火)

ZIP用ユーティリティを作った。 SharpZipLibが必要。
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.Checksums;
/// <summary>
/// Zipによる圧縮と解凍
/// </summary>
public class ZipUtil 
{
	/// <summary>
	/// 圧縮
	/// </summary>
	/// <param name="outFile">作成するZIPファイル名</param>
	/// <param name="files">入力ファイル</param>
	/// <param name="level">圧縮レベル(0:無圧縮-9:高圧縮)</param>
	public static void Compress(string outFile,ArrayList files,int level)
	{
		Crc32 crc = new Crc32();
		ZipOutputStream zos = new ZipOutputStream(File.Create(outFile));
		zos.SetLevel(level);
		foreach (string fnam in files) 
		{
			FileStream fs = File.OpenRead(fnam);
			byte[] buf = new byte[fs.Length];
			fs.Read(buf,0,buf.Length);
			ZipEntry ze = new ZipEntry(fnam);
			ze.DateTime = DateTime.Now;
			ze.Size = fs.Length;
			fs.Close();
			crc.Reset();
			crc.Update(buf);
			ze.Crc  = crc.Value;
			zos.PutNextEntry(ze);
			zos.Write(buf,0,buf.Length);
		}
		zos.Finish();
		zos.Close();
	}
	/// <summary>
	/// 解凍
	/// </summary>
	/// <param name="inFile">読込むZIPファイル名</param>
	/// <param name="files">解凍されたファイル(nullも可)</param>
	public static void Decompress(string inFile,ArrayList files)
	{
		int sz;
		byte[] dt = new byte[4096];
		ZipEntry ze;
		ZipInputStream zis = new ZipInputStream(File.OpenRead(inFile));
		if (files != null) files.Clear();
		while ((ze = zis.GetNextEntry()) != null) 
		{
			if (files != null) files.Add(ze.Name);
			Directory.CreateDirectory(Path.GetDirectoryName(ze.Name));
			FileStream fs = File.Create(ze.Name);
			while ((sz = zis.Read(dt,0,dt.Length)) > 0) fs.Write(dt,0,sz);
			fs.Close();
		}
		zis.Close();
	}
}

C#でExcelファイルを扱う方法。 ASP.NETの場合、dcomcnfg.exeでMicrosoft Excelアプリケーションのセキュリティで アプリケーションを起動できるユーザにASPNETを追加する必要がある。
Excel.Application app = new Excel.Application();
Excel.Workbook wb = app.Workbooks.Open(ファイル名,
  Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,
  Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);
Excel.Worksheet ws = (Excel.Worksheet)wb.Sheets[1];
Excel.Range r = (Excel.Range)ws.Cells[1,1];
Console.WriteLine(r.Value.ToString());
app.Quit();


03/01/30(木)

どうでもいいんだけど、 AcrobatReaderで、左ボタンとホイールボタンを押してドラッグする時の動きが逆だ。 上下のスクロールバーと、左右のスクロールバーの操作性も違う。

03/02/03(月)

Office文書内の検索プログラム。
using System;
using System.IO;
using System.Reflection;
using System.Threading;

namespace OfficeGrep
{
	/// <summary>
	/// OfficeGrep : Excel,Word,PowerPointの中から文字検索を行う。
	/// </summary>
	class Class1
	{
		static string[] Args = null;
		/// <summary>
		/// アプリケーションのメイン エントリ ポイントです。
		/// </summary>
		[STAThread]
		static void Main(string[] args)
		{
			if (args.Length < 1) 
			{
				Console.Error.WriteLine(
		"usage : OfficeGrep SearchString [file or directory...]");
				return;
			}
			Args = args;
			Thread th = new Thread(new ThreadStart(Do));
			th.Start();
			th.Join();
			th = null;
			GC.Collect();
		}
		static void Do()
		{
			Excel.Application appe = null;
			Word.Application appw = null;
			PowerPoint.Application appp = null;
			try 
			{
				if (Args.Length == 1) FindDirectory(Args[0],".",ref appe,ref appw,ref appp);
				else for (int i=1;i<Args.Length;++i) Find(Args[0],Args[i],ref appe,ref appw,ref appp);
			}
			finally 
			{
				object mv = Missing.Value;
				if (appe != null) { appe.Quit(); }
				if (appw != null) { appw.Quit(ref mv,ref mv,ref mv); }
				if (appp != null) { appp.Quit(); }
			}
		}
		static void Find(string wd,string obj,
			ref Excel.Application appe,ref Word.Application appw,ref PowerPoint.Application appp)
		{
			if (File.Exists(obj)) 
				FindFile(wd,obj,ref appe,ref appw,ref appp);
			else FindDirectory(wd,obj,ref appe,ref appw,ref appp);
		}
		static void FindDirectory(string wd,string dir,
			ref Excel.Application appe,ref Word.Application appw,ref PowerPoint.Application appp)
		{
			string[] ss = Directory.GetFiles(dir);
			foreach (string s in ss) FindFile(wd,s,ref appe,ref appw,ref appp);
		}
		static void Check(string fnam)
		{
			Console.WriteLine(fnam);
		}
		static void FindFile(string SearchWord,string FileName,
			ref Excel.Application appe,ref Word.Application appw,ref PowerPoint.Application appp)
		{
			object mv = Missing.Value;
			string fulnam = Environment.CurrentDirectory + "\\" + FileName;
			object ofnam = fulnam;
			object owd = SearchWord;
			string s = FileName.ToLower().Substring(FileName.Length-4);
			if (s == ".xls" || s == ".xlt") 
			{
				if (appe == null) appe = new Excel.Application();
				Excel.Workbook wb = appe.Workbooks.Open(fulnam,
					mv,mv,mv,mv,mv,mv,mv,mv,mv,mv,mv,mv);
				foreach (Excel.Worksheet ws in wb.Sheets) 
				{
					if (ws.Cells.Find(owd,mv,mv,mv,mv,Excel.XlSearchDirection.xlNext,mv,mv) != null)
					{
						Check(FileName);
						break;
					}
				}
				wb.Close(mv,mv,mv);
				wb = null;
			} 
			else if (s == ".doc") 
			{
				if (appw == null) appw = new Word.Application();
				Word.Document doc = appw.Documents.Open(ref ofnam,
					ref mv,ref mv,ref mv,ref mv,ref mv,ref mv,ref mv,ref mv,ref mv,ref mv,ref mv);
				Word.Find f = doc.Content.Find;
				if (f.Execute(ref owd,
					ref mv,ref mv,ref mv,ref mv,ref mv,ref mv,ref mv,
					ref mv,ref mv,ref mv,ref mv,ref mv,ref mv,ref mv))
					Check(FileName);
				doc.Close(ref mv,ref mv,ref mv);
			} 
			else if (s == ".ppt" || s == ".pps") 
			{
				/*
				if (appp == null) appp = new PowerPoint.Application();
				PowerPoint.Presentation prs = appp.Presentations.Open(fulnam,
					Office.MsoTriState.msoTrue,Office.MsoTriState.msoFalse,
					Office.MsoTriState.msoFalse);
				Console.WriteLine(prs.Name);
				foreach (PowerPoint.Slide sl in prs.Slides) 
				{
				}
				prs.Close();
				*/
			} 
			else 
			{
				StreamReader sr = new StreamReader(fulnam,System.Text.Encoding.Default);
				string st = sr.ReadToEnd();
				if (st.IndexOf(SearchWord) >= 0)
					Check(FileName);
				sr.Close();
			}
		}
	}
}
スレッドにしているのは、この辺を 参考にしたため。意味ないかも。PowerPoint内の検索ができない。あと、時々落ちる。

03/02/06(木)

Windows Server 2003 評価版を インストールした。Windows2000で開発したショッピングサイトをIIS6.0で動かしてみた。 OSもIISも軽そうである。ISAPIは動かなかった。何故。

「知識を共有する学習環境を作る」--XP懐疑編より


03/02/10(月)

メソッドの書く順番は、 重要なものから。また、修正が起こった時に、修正個所がまとまるように。

03/03/05(水)

前回の更新後から、諸般の都合によりJavaオンリーになってしまった。
ArrayList(C++ではvector)の末尾に追加するコードで、C++,C#,Javaの計測をした。 C++はC#の2-10倍ほど速い。C#はJavaの1-2倍速い。Javaは思ったより速いし、メモリ使用量も問題ない。 しかし、ArrayListに1600万個ほどしか入らない。(OutOfMemoryErrorになる) 使えん。Javaはオモチャか。

03/03/07(金)

ASPXのMLで 時間がかかる処理をする間、「お待ち下さい」画面を出すには?という質問があった。 クライアントで何かしないと無理だろうと思ったが、<meta http-equiv="refresh"...>でできるとの返事。 やってみると、確かにできる。

公平分割の方法(OR学会誌より)
2人なら、Aが分けてBが選べばよい。
3人の場合、Aが3等分する。Bが1番大きいものから2番目の大きさになるようカットする。(同じと思ったらカットしない)
Cが選ぶ。Bが選ぶ。但し、カットしていたのが残っていたらBはそれを選ばなければいけない。Aは残り。 Bがカットしていなかったらここで終わり。
カットしていたものをCが3等分する。Bが選ぶ。Aが選ぶ。Cが選ぶ。

検証してみよう。Aは自分で分けた3等分のうち、どれかを手に入れる。ので、文句はない。 Cは、3つの中から最初に選ぶので文句はない。カット分は自分で3等分するので最後にもらって文句はない。 Bは、2つある最大のどちらかを手に入れる。カットの3等分は、最初に選ぶので文句はない。
(元の方法は、もう少し複雑。カットは2等分でもいい。)


03/03/11(火)

ディスククリーンにするのは、Windows2000SP3についている ユーティリティでできるそうだ。(cipher /w)

03/03/14(金)

メソッド等の命名ルールについて。 単語の区切りの表記には、move_nextやMoveNextの2通りがよく使われる。 STLでは前者だが、私は後者を使うようにしている。
VS..NETで自動作成すると、button1_Clickのようなメソッド名になる。 アンダーバーの次の文字を大文字にするのは、あまりみられない。 しかし、これはこれで一貫性があり納得できるものである。そのルールとは、 プロパティに対応するものは、アンダーバーを付けてプロパティ名を付けるというものである。

03/03/27(木)

情報数理について。 例えば、高精度測定装置A(誤差±1cm)と低精度測定装置B(誤差±2cm)があったとしよう。 Aで測った結果(10cm)とBで測った結果(12cm)がある。さて、どう推定すればいいだろう。
  • 10.0cmとする。Aの方が精度が高いので、Aの結果を使う。
  • 11.0cmとする。2つ結果があるので、平均を使う。
AとBを平均するのはよくない。では、Aだけ使えばいいか?答えはNoである。 例え低精度でも情報量を増やすことになるので、Bを使う方が有利である。 Aの計測とBの計測の誤差が独立だと仮定しよう。すると、分散は、各々足したものになる。 推定値Eを(Aの結果×α+Bの結果)/(α+1)としよう。Eの期待値は元と同じである。 Bの分散は、Aの分散の4倍と考えられるので、Eの分散はAの分散の(α^2+4)/(α+1)^2倍である。 これが、最小になるようにαを求めればよい。微分して解けば、α=4となる。 結局、E=10.4となり分散はAの4/5になる。。

03/03/28(金)

Excelで、ドラッグコピーするときなど、 結果が確定する前に結果がわかるようになっている。 ある開発したシステムでも同じような機能がある。 その機能を入れようと考えたのはユーザの作業を見ていたときであった。 旧システムでモノを作成する時に、多めに作って削除していたのだ(2ステップ)。 このようなことをするのは、作成しないと「どこまでできたかわからない」ためである。 そこで、システムでは作成が確定する前に結果がグラフィカルに判るようにした。

メールの欠点は、修正が聞かない、相手が読んだか判らない、というのがある。 Webサーバを立ててURLを送るようにすれば、この問題は解決する。 社内であれば結構便利ではないだろうか。


03/04/01(火)

前の話の条件の書き方の続き。 条件Aの評価時間をTa、条件Bの評価時間をTbとする。 条件Aがtrueになる割合をRa、条件Bのtrueになる割合をRbとする。 このときの評価時間
  • 条件A and 条件B : Ta + Ra Tb
  • 条件B and 条件A : Tb + Rb Ta
  • 条件A or 条件B : Ta + (1-Ra) Tb
  • 条件B or 条件A : Tb + (1-Rb) Ta

C#によるグラフクラス(とりあえずVer0.0)
namespace Utility
{
	public class Graph 
	{
		public class NodeTag
		{
			public int			index;
			public ArrayList	link;
			public object		node;
			public NodeTag(int i,object o) 
			{
				index = i;
				node = o;
				link = new ArrayList();
			}
		}
		public class ArcTag 
		{
			public int			index;
			public int			left;
			public int			right;
			public object		arc;
			public ArcTag(int i,int l,int r,object o) 
			{
				index = i;
				left = l;
				right = r;
				arc = o;
			}
		}
		public Graph() 
		{
			nds = new ArrayList();
			acs = new ArrayList();
		}
		public NodeTag AddNode(object o) 
		{
			NodeTag nt = new NodeTag(nds.Count,o);
			nds.Add(nt);
			return nt;
		}
		public ArcTag AddArc(object o,int i1,int i2) 
		{
			if (i1 < 0 || i1 >= nds.Count || i2 < 0 || i2 >= nds.Count || i1 == i2)
				return null;
			ArcTag at = new ArcTag(acs.Count,i1,i2,o);
			Node(i1).link.Add(at);
			Node(i2).link.Add(at);
			acs.Add(at);
			return at;
		}
		public ArrayList Nodes {get {return nds;}}
		public ArrayList Arcs {get {return acs;}}
		public NodeTag Node(int i) {return (NodeTag)nds[i];}
		public ArcTag Arc(int i) {return (ArcTag)acs[i];}
		private ArrayList		nds;
		private ArrayList		acs;
	}
}
もっとましにしたら消すかも。


03/04/02(水)

OnMouseDown, OnMouseMove, OnMouseUpの ようなイベント形式の欠点は、処理が分断されることである。
namespace Utility 
{
	public class CheckMessage
	{
		private class MessageFilter : IMessageFilter 
		{
			public Message		msg;
			public bool PreFilterMessage(ref Message m) 
			{
				//Trace.WriteLine(m);
				if (m.Msg == 0x200 || m.Msg == 0x202) 
				{
					msg = m;
					return true;
				}
				return false;
			}
		}
		/// <summary>
		/// MouseMoveまたはMouseUpになるまでメッセージを処理する
		/// </summary>
		/// <param name="fm">呼び出し側のForm</param>
		/// <param name="e">MouseDownの引数。結果が入る。Clicks&4でShift、&8でCtrlの判別。</param>
		/// <returns>MouseMove中かどうか</returns>
		public static bool CheckMove(Form fm, ref System.Windows.Forms.MouseEventArgs e)
		{
			if (e.Button == MouseButtons.Right) return false;
			MessageFilter mf = new MessageFilter();
			Application.AddMessageFilter(mf);
			do Application.DoEvents();
			while (mf.msg.Msg != 0x200 && mf.msg.Msg != 0x202);
			Application.RemoveMessageFilter(mf);
			int		l = mf.msg.LParam.ToInt32(), w = mf.msg.WParam.ToInt32();
			e = new MouseEventArgs(MouseButtons.None,w, (l<<16)>>16, l>>16,0);
			if (mf.msg.Msg != 0x202) return true;
			fm.Capture = false;
			return false;
		}
	}
}
上記のCheckMoveを利用すれば、分断されずに記述できる。
		private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
		{
			int		x = e.X, y = e.Y, prex = x,prey = y;
			Graphics g = CreateGraphics();
			while (CheckMessage.CheckMove(this,ref e)) 
			{
				g.DrawLine(Pens.LightGray,x,y,prex,prey);
				g.DrawLine(Pens.Black,x,y,prex = e.X,prey = e.Y);
				Trace.WriteLine("X = " + e.X + "  Y = " + e.Y);
			}
			Trace.WriteLine("Up");
			g.Dispose();
		}
C#でXORできないのがつらい所だが。

C# CLR, Java VMのような仮想マシン上で動くことが当たり前になり、完全になくならないにしてもC/C++は廃れていくだろう。 理由は生産性の高さだ。


03/04/03(木)

CSV読込み関数を 10/26と同じく修正。
C#
namespace Utility
{
	public class CSV 
	{
		public static string[] GetCSV(string s)
		{
			ArrayList a = new ArrayList();
			int i = 0, j;
			string t;
			StringBuilder h = new StringBuilder();
			while (i < s.Length) 
			{
				bool b = s[i] == '"';
				if (b) ++i;
				j = s.IndexOf(b ? '"' : ',', i);
				if (j < 0) j = s.Length;
				t = s.Substring(i,j-i);
				if (b && j < s.Length-1 && s[j+1] == '"') 
				{
					h.Append(t);
					h.Append('"');
					i = j+1;
				} 
				else 
				{
					a.Add(h + t);
					h.Length = 0;
					i = j + (b?2:1);
				}
			}
			return (string[])a.ToArray(Type.GetType("System.String"));
		}
	}
}

VB.NET
Namespace Utility
    Public Class CSV
        Public Shared Function GetCSV(ByVal s As String) As String()
            Dim a As ArrayList = New ArrayList()
            Dim i As Integer = 0, j As Integer
            Dim t As String
            Dim h As StringBuilder = New StringBuilder()
            While (i < s.Length)
                Dim b As Boolean = (s.Chars(i) = """"c)
                If (b) Then
                    i += 1
                    j = s.IndexOf(""""c, i)
                Else
                    j = s.IndexOf(","c, i)
                End If
                if (j < 0) then j = s.Length
                t = s.Substring(i, j - i)
                If (b AndAlso j < s.Length - 1 AndAlso s.Chars(j + 1) = """"c) Then
                    h.Append(t)
                    h.Append(""""c)
                    i = j + 1
                Else
                    h.Append(t)
                    a.Add(h.ToString)
                    h.Length = 0
                    i = j + 1
                    If (b) Then i += 1
                End If
            End While
            GetCSV = CType(a.ToArray(Type.GetType("System.String")), String())
        End Function
    End Class
End Namespace
MSの戦略に乗せられている気もするが、C#、VB.NETの両方を覚えるつもり。Javaも多少。メインはC#。 こんな感じの比較表を作っている。
内容 C# Java C++
1 メッセージを出す MessageBox.Show MessageBox mb = new MessageBox(shell);
mb.setMessage(...);
mb.open();
AfxMessageBox
2 配列の書き方 string[] a = new string[]{"1","2","3"};
string[] a = {"1","2","3"};
String a[] = new String[]{"1","2","3"};
String a[] = {"1","2","3"};
string a[] = {"1","2","3"};
3 デバッグ出力 System.Diagnostics.Trace.WriteLine TRACE
4 計算時間評価 System.currentTimeMillis() clcok()
5 配列からArrayList コンストラクタ ArrayList a = new ArrayList(Arrays.asList(ss));

03/04/04(金)

VB.NETで気になったところ。
  • Dim s As Stringでファイルから行を読込みIf (s = Nothing)でファイルの終わりかどうかを見ていた。 ところが、空行でTrueになる。If (s Is Nothing)とすれば期待通りになった。
  • 代入と等号比較が共に=なので、a=b=0とか書くのが気持ち悪い。
  • continueに対応するものがない?
  • Moduleって何?
  • C#より行が増える。
  • AndAlsoとすべきところをAndとして実行エラーになった。
  • WebReportはできない?
  • C#<->VB.NETコンバータが欲しい。
  • キーワードが多くないか?
  • 配列の宣言がサイズではなく、添え字。Dim i(3) As Integerで4個できる。

03/04/05(土)

メモ
  • 顧客にセミナの講師になってもらう。
  • 在席したまま、セミナの受講。講師の操作が遠隔地で確認。
  • パターンをビジネスにする。保守契約で更新パターンの配信。非利益部門を利益部門に。
  • コンフィグのエンジン作成。

マウスでクリックした時、線分がクリックされたか判定する方法。 簡単なのは、内積から角度を出す方法。しかし、線分両端では判定されにくい。 まともなのは、線分に太さがあるようにして長方形で判断する方法。 線が重なっている時に、クリックしていくと選択が切替わっていくことが望ましい。


03/04/07(月)

アトムの誕生日だそうだ。 ドラえもんは、2112.9.3だそうだ。アトムのようなハードウェアはいつできるだろうか。 ソフトウェアは時間がかかりそうだ。

03/04/08(火)

C#とVB.NETで移植性をよくするために 思いついたこと。
  • C#で大文字小文字で区別しないようにする。(countとCountなど)
  • C#とVB.NETの予約語は使わない。
  • C#の==nullはVB.NETでIs Nothingとする。
  • VB.NETで配列の宣言は、()を変数に付ける。また、()内の数は要素数-1とする。
  • C#で代入をつなげない。(a=b=0など)
  • C#でcontinueを使わない。
  • VB.NETでModuleを使わない。
  • VB.NETでは、AndとOrを使わない。代わりに、AndAlsoとOrElseを使う。
  • C#で三項演算子を使わない。
  • C#で条件式中に代入を使わない。

03/04/14(月)

成功体験こそ失敗の元。 初心忘れるべからず。勝って兜の緒を締めよ。

03/04/15(火)

BASICからプログラミングを始めて21年。 また、BASIC(VB.NET)に戻った。 VB.NETでもかつてのBASICの文法に近いものが残っているのは驚きである。

Q:C#とVB.NET(とJavaとC++)のどれを覚えたらいいでしょうか?
A:全部覚えて下さい。


03/04/17(木)

What is the Matrixが面白い。

5月にXMLの勉強会をする。

あるシステムのあるアイテムが値を持っている。値は、string,int,double,DateTimeの何れかだとしよう。(本当は違うが)
ここで、intはdoubleで代用できないか考えてみる。2つ理由が考えられる。 個数のように整数値しか許されないケースをモデル化したいケース。 演算時に計算誤差をなくしたいケース。後者は、C#ならdecimalを使えばよい。 前者は、入力チェックではじくか。ついでにDateTimeもdecimalで扱えないかな。

プログラムが世にあふれている。しかし、最近のプログラマは他人のプログラムを読むことをしない。 (私は、ベーマガ(20年以上前)やJUNET(10数年以上前)に流れていたソースなんかをよく読んだり打ったりしたものだが。)
好奇心の幅も狭いように感じる。できないと思ってやろうともしない。 (昔、自分も言われてたかもしれないが)


03/04/22(火)

新人への提言。
  • あなたたちは、顧客の問題を解決するプロとならなければならない。
  • 顧客は、あなたたちを専門家として信頼する。その信頼に応えなければならない。
  • 知識を仕入れ、実践し、経験を積むこと。
  • 正解はない。よりよい方法があるだけだ。常によりよい方法を考えよ。
  • 自分を問題解決の医者だと考えよ。
  • 成功は失敗の元である。初心を忘れるな。

03/04/23(水)

C#の勉強会は、他部から たくさん来たけど、XMLは1人も来ない。16ページ資料用意した。

PSP+XPでCSP(Collaborative Software Process)というのがあるらしい。 ペアプログラミングに出てきた。

名著プログラミングの心理学のパクリではないが、 「ペアプログラミングの心理学」という題で小説タッチで書くと受けるんじゃないだろうか。


03/04/24(木)

ΣBookがいい。 胸ポケットに入るくらいだといいんだけど。本だけじゃなくて、各種広告表示等に使われるだろう。 松下の株買いか。

03/04/25(金)

IEのバグで、 「<input type>」とだけ書いたhtmlを開くと落ちる。

03/05/01(木)

日経システム構築5月号の特集は、「.NETかJavaか」だ。 400社(有効回答349)のアンケートで、将来増えるのは.NETと回答したのがJavaの3倍だそうだ。 .NETの事例も増えているようだ。Windows上で将来も開発するならば、.NETは避けることはできないだろう。 このような競争はユーザにとっても歓迎すべきであろう。開発者は覚えることが多くて大変かもしれないが。 (dotNETのようなパラダイムシフトも刺激があって面白いのだが。)

03/05/02(金)

日経コンピュータにヤンマー農機での XPの事例が出ていた。日経コンピュータははっきり言って技術的な話は殆どない。 しかし、動かないコンピュータや最新事例やSEの心構えなど面白い。 部下ができたせいだろうか。

心構え:成功は顧客の能力、失敗は自分の能力不足。

一般的なアプリケーションの保存時に。
Temporaryフォルダがあれば、変更前のものを「ハイフン数字」を付けて移動。 Backupフォルダがあれば、同じものを日付を付けて保存。 起動後に一度だけ、Temporaryフォルダは24時間前のものは削除、 Backupフォルダは2ヶ月以上前のものは削除する。 また、修正後、保存しないで終了した時もTemporaryには保存する。
このようになっていると、結構便利ではないだろうか。(Undo,Redoが充分できて、異常終了さえしなければ)


03/05/07(水)

グラフクラスで、ノードとアークのアクセスは、配列と同じく ランダムアクセスできる方がよい。

03/05/09(金)

MSまたかよ、 という感じ。 Hotmailと.NET Passportにアカウント乗っ取りの大穴
Windows Server 2003もちゃんと頼むよ。

03/05/13(火)

デフレになる前、 (4,5年前か?)「デフレは良くない」という記事を良く見た。
実際にデフレになってみると、物は安いし得した気がした。 (100円ショップなどは、奇跡としか思えない。)
しかし、給料が上がらないどころか下がってくると困ってきた。 経済学者から見れば、当たり前のことなのかもしれないが、 「デフレが良くない」というのが実感を伴ってきた。以下、雑感
  • バブルは良くない。
  • デフレも(インフレも)良くない。
  • 急に経済環境が良くなることはなさそうだ。
  • 高度成長と呼ばれるような状態になることもなさそうだ。(他国はあるだろうが)
さて、どうすればいいだろうか。「よりよい将来」を目指してコツコツやるか。 (私は努力は好きではないが。)運動もした方がよさそうだ。

03/05/14(水)

映像の著作権が 日本でも50年から70年になったそうだ。 映像じゃないミッキーはいいのか?

妻が腹筋してたら娘(5歳)が「フッキングしてる」と言ってた。英語が得意だが、テレビはテベリと言っている。 (テレビは日本語だけど)


03/05/20(火)

Base64のコンバータ。
public static void Main(string[] args)
{
	if (args.Length == 0)
	{
		MessageBox.Show("ドラッグ&ドロップして下さい");
		return;
	}
	string s = args[0];
	string t = s.Replace(".","_.");
	if (t == s) t = s + "_";
	File.Move(s,t);
	try
	{
		FileStream fs = new FileStream(t,FileMode.Open);
		byte[] b = new Byte[fs.Length];
		fs.Read(b,0,b.Length);
		fs.Close();
		char[] c = new char[b.Length];
		b.CopyTo(c,0);
		fs = new FileStream(s,FileMode.Create);
		byte[] bb = System.Convert.FromBase64CharArray(c,0,c.Length);
		fs.Write(bb,0,bb.Length);
		fs.Close();
	}
	catch (FileNotFoundException fe)
	{
		MessageBox.Show("ファイルが見つかりません");
	}
}

03/05/21(水)

メールの文面から日付をキーにして 検索したいとする。(例えば、2003年1月1日を検索したい)
該当するものが、「2003年1月1日」「1月1日」「2003/01/01」「01/01」「1/1」「01/01/2003」「平成15年1月1日」 と無数に考えられる。こんなとき、XMLになっていると便利である。
<type:date><year>2003</year>年0<month>1</month>月 0<dayOfMonth>1</dayOfMonth>日</type:date>という感じか。

この方がいいな。
<type:date year="2003" month="1" dayOfMonth="1">2003年1月1日</type:date>
<type:date year="2003" month="1" dayOfMonth="1">01/01</type:date>
<type:date year="2003" month="1" dayOfMonth="1">平成15年1月1日</type:date>
書く時に表現を統一すればすむ話ではある。しかし、メタ情報を持たせると使い道が広がるだろう。

ユーロ紙幣にICチップですか。確かに便利だろうな。盲点だった。


03/05/22(木)

どうすれば、Visual Studio.NET 2003を 一番安く買えるんだろう。(もう、持っているけど) Eclipseからの優待価格って何?

ひまわり引退!お疲れ様でした。以下、妄想。

  • 月面に基地と工場を作る。
  • 工場は、月面の材料を元に、規格化された半製品を作れる。
  • 工場では、地球からの指示で、半製品を組合わせてロボットや衛星などの製品を作る。
  • レールガンで衛星打ち上げ。

ペアプロの疑問。ペアプロがシングルプロよりいいなら、プログラミング以外でも ペアでやる方がいいのか?意思決定の殆どは1人でやっている。 2人でやる方が間違いやすさは少ないのは確かだ。では、何故、2人で意思決定しないのか。
もう1つ、1日の作業は実に多彩なことをしている。すなわち、プログラミングばかりしているわけではない。 ペアプロだとそのリズムが維持できない。


03/05/23(金)

今年は冬休み3日分少ないそうだ (振替になるが)。毎年減っていく。

03/05/27(火)

新ライフゲーム。 歳属性を持つ。年取ると死ぬ。その代わり、混んでても死なない。

LinuxとWindowsのどちらかを購入検討していると言うと、9割引になるといいな。 Linux強いね。


03/05/28(水)

全身全霊傾けられる夢を持とう。 何か始めて続けなければ、可能性はない。

iSCSIというのが気になる。

SVGとかSMILとかXMLの規格がある。この規格に対応したクラスライブラリがあれば便利じゃないだろうか。


03/06/04(水)

東京三菱銀行の作成している エンタープライズ・アーキテクチャ(EA)はどんなものだろうか。

Webサービスを実務で使ってみたい。社内システムを、全部Webサービスベースに移行すればいいと思う。

VS.NET 2003に完全に移行した。C#は問題なし。C++は、templateで大量のエラーが発生。 typenameを書いたら通った。


03/06/05(木)

正規分布の乱数。
public class NormalRandom
{
	private bool		bWhc;
	private Random		rnd;
	private double		mean_;
	private double		std_;
	private double[]	temp;
	public double Mean {get {return mean_;} set {mean_ = value;}}
	public double Std {get {return std_;} set {std_ = value;}}
	public NormalRandom() {Reset(); rnd = new Random();}
	public NormalRandom(int seed) {Reset(); rnd = new Random(seed);}
	private void Reset() {bWhc = false; mean_ = 0; std_ = 1; temp = new double[3];}
	public double NextDouble()
	{
		bWhc = !bWhc;
		if (bWhc) {
			do 
			{
				temp[0] = 2 * rnd.NextDouble() - 1;
				temp[1] = 2 * rnd.NextDouble() - 1;
				temp[2] = temp[0]*temp[0] + temp[1]*temp[1];
			} while(temp[2] > 1);
			if (temp[2] > 0)
				temp[2] = Math.Sqrt(-2 * Math.Log(temp[2]) / temp[2]);
		}
		return temp[bWhc ? 0 : 1] * temp[2] * std_ + mean_;
	}
}

03/06/10(火)

DOMでXPathを使う記事を読んで。 任意のクラスで、XPathを使えるようにすると面白いと思う。こんな感じ。
using System;
using System.Collections;
using System.Reflection;

public class MyPath
{
	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Property)]
	public class TargetAttribute : Attribute {}
	[AttributeUsage(AttributeTargets.Property)]
	public class IDAttribute : Attribute {}
	public static ArrayList SelectNodes(object o,string path)
	{
		string[] pth = path.Split('/');
		ArrayList res = new ArrayList();
		Parse(res,o,pth,1);
		return res;
	}
	public static void Parse(ArrayList a,object o,string[] pth,int idx)
	{
		if (idx >= pth.Length) return;
		IEnumerable e = o as IEnumerable;
		if (e != null)
		{
			foreach (object b in e) Parse(a,b,pth,idx);
			return;
		}
		Type t = o.GetType();
		object[] o1 = t.GetCustomAttributes(true);
		if (o1.Length == 0 || !(o1[0] is TargetAttribute)) return;
		PropertyInfo[] pis = t.GetProperties();
		if (pis == null) return;
		foreach (PropertyInfo pif in pis)
		{
			object[] o2 = pif.GetCustomAttributes(true);
			if (o2.Length == 0) continue;
			object p = o2[0];
			if (p is IDAttribute)
			{
				string s = pif.GetValue(o,null).ToString();
				if ((pth[idx] == s || pth[idx] == "*") && idx == pth.Length-1) a.Add(o);
			}
			else if (p is TargetAttribute)
			{
				Parse(a,pif.GetValue(o,null),pth,idx+1);
			}
		}
	}
}
[MyPath.Target]
public class Pref
{
	private	string name;
	private ArrayList list;
	[MyPath.ID]
	public string TagName {get {return name;}}
	[MyPath.Target]
	public ArrayList List {get {return list;}}
	public Pref(string s) {name = s; list = new ArrayList();}
	public void Add(City c) {list.Add(c);}
}
[MyPath.Target]
public class City
{
	private	string name;
	private ArrayList list;
	[MyPath.ID]
	public string TagName {get {return name;}}
	[MyPath.Target]
	public ArrayList List {get {return list;}}
	public City(string s) {name = s; list = new ArrayList();}
	public void Add(Town t) {list.Add(t);}
}
[MyPath.Target]
public class Town
{
	private	string name;
	[MyPath.ID]
	public string TagName {get {return name;}}
	public Town(string s) {name = s;}
}
public class Class1
{
	public static void Main(string[] args)
	{
		Town	t1 = new Town("町1"), t2 = new Town("町2");
		Town	t3 = new Town("町3"), t4 = new Town("町4");
		City	c1 = new City("千代田"), c2 = new City("新宿");
		Pref	p = new Pref("東京");
		p.Add(c1); p.Add(c2);
		c1.Add(t1); c1.Add(t2);
		c2.Add(t3); c2.Add(t4);
		ArrayList a;
			
		a = MyPath.SelectNodes(p,"/東京");
		foreach (object o in a) Console.WriteLine(o.GetType().GetProperty("TagName").GetValue(o,null));
		a = MyPath.SelectNodes(p,"/東京/*");
		foreach (object o in a) Console.WriteLine(o.GetType().GetProperty("TagName").GetValue(o,null));
		a = MyPath.SelectNodes(p,"/東京/*/*");
		foreach (object o in a) Console.WriteLine(o.GetType().GetProperty("TagName").GetValue(o,null));
	}
}

03/06/11(水)

delegateを動的に作れる。
MethodInfo mi = typeof(Class1).GetMethod("func");
ThreadStart ts = (ThreadStart)Delegate.CreateDelegate(typeof(ThreadStart),mi);
Thread th = new Thread(ts);
th.Start();

03/06/16(月)

FreeStyleWikiを真似て、 C#で作ってみた。 Operaでちゃんと表示されない。{{edit}}、{{acess}}、{{recentdays}}などは実装した。3日で作ったので、バグは多いかも。
インストーラ(要IIS、.NET Framework 1.1)
インストール時の注意
  • 「アプリケーションの追加と削除」からIISを入れる。
  • WindowsUpdateで .NET Framework 1.1を入れる。
  • SetupWikiCS.msiをインストールする。
  • http://localhost/WikiCS/ で確認する。
  • 表示が変な場合、ASP.NETが稼動していない可能性がある。 「C:\WINNT\Microsoft.NET\Framework\v1.1.4322\aspnet_regiis.exe -i」を実行すること。
  • 書込みができない場合、C:\Inetpub\wwwroot\WikiCSフォルダのセキュリティタブで、ユーザASP_NETにフルコントロールを与えること。

03/06/19(木)

Wikiのように 動的にHTMLを作るのにASP.NETは向いていない?マークアップに対応した、 カスタムコントロールを作って、動的にコントロールをAddするか。 <form>にrunatつけなければ、Webコントロールは使えないが、複数のformを使える。

03/06/24(火)

VS.NETで久しぶりにC++のプロジェクトを作ろうとしたら、 見慣れないものが。ASP.NETはWebサービスならばC++でもできるようだ。

03/06/27(金)

「RIAAは数千人を訴訟対象」 ですか。頼むから、ちゃんと訴えろよ。(私は口先だけの奴は好きじゃない。)

JavaOneで「数年でJava開発者1000万人」ですか。「数年」って毎年言いつづけないように。2006年とか限定しろよ。 Project Rave、JSFはASP.NETの後追いですね。 JavaもC#もVB.NETもお互い刺激しあっていけばいいんじゃないでしょうか。 (Java開発者1000万人は、無理だろうけど。)私はC#、メインで行きます。


03/06/30(月)

日経ソリューションビジネスを読んでいる。 「CIOから『IT業界は詐欺師』説。2割引いてくれと言われれば、根拠もなく2割引く。」
確かに、最もな部分もある。しかし、経費管理はしている。2割引いた場合は、引かない場合より、 作業量が少なくなるように調整している。では、何故、最初から引かないのか。
それは、人件費が固定費に近いからである。仕事を断っているような状態では、問題ないかもしれないが、 そうではないので、当然、受注額が大きい方がこちらとしてもよいからだ。

上記雑誌のM男は、島耕作をねらっているのか。


03/07/04(金)

リッチクライアントWikiでも作ってみるかな。 おそらく、誰も作ったことないだろうし。

ビタビアルゴリズムとローカルサーチとの比較をしてみたい。 合成が3つならば、1つの受信信号が3つの値の組合わせに対応する。 この対応の組合わせ毎に、確度が決まるので、確度順に決定していく方法も考えられる。 (実行不能になったらバックトラックする)


03/07/08(火)

行番号を挿入するVS.NET2003のマクロ
Imports EnvDTE
Imports System.Diagnostics
Imports System.IO
Imports System.text.RegularExpressions
Imports Microsoft.VisualBasic
Imports Microsoft.VisualBasic.ControlChars

Public Class MyUtil
    Shared lineid As Integer     ' for AddLine
    Shared Function RepText(ByVal m As Match) As String
        lineid += 1
        Return String.Format("{0:D3}:", lineid)
    End Function

    Shared Sub AddLineNo()
        Dim doc As Document = ActiveDocument()
        Dim ts As TextSelection = doc.Selection
        ts.SelectAll()
        Dim s As String = ts.Text
        lineid = 0
        If (s.StartsWith("001")) Then
            s = Regex.Replace(s, "^.{4}", "", RegexOptions.Multiline)
        Else
            s = Regex.Replace(s, "^", AddressOf RepText, RegexOptions.Multiline)
        End If
        Dim fs As StreamWriter = New StreamWriter(doc.FullName)
        fs.Write(s)
        fs.Close()
    End Sub
End Class

03/07/09(水)

Visual Studioは 全バージョン使っていた。(1.0, 1.5, 2.0, 4.0 4.1, 4.2, 5.0, 6.0, 7.0(.net 2002)) 7.1(.net 2003)で10バージョン目だ。今、メインは6.0と7.1だ。 6.0も捨てがたいのだが、新規は、7.1(C#)で行くことにしている。

インターネット 業界 トラブルニュース が閉鎖となった。著作権違反かどうかはよくわからないが、何とかならないのかね。


03/07/10(木)

日刊工業新聞の1面に、9年前に、研究したシステムが 全廃との記事が出てた。初めてC++を採用したプロジェクトだ。

03/07/11(金)

ブラウザオブジェクトでPOSTできるかな。 Webアプリのテストツール欲しいな。 Webサービスだと簡単にテストできるんだけど。

メガネ型携帯電話ってどうかな。SFみたいにメガネに情報が表示されるので、他人から覗き見されない。 また、操作は視線でする。目が疲れそうだな。


03/07/23(水)

ゲームを考えた。
GGP
CPP
PCC
  • お互いにわからないように、Aが行をBが列を選ぶ。
  • 表の該当の手がAの手となる。A,BがAの手を知る。
  • Aが列をBが行を選ぶ。表の該当の手がBの手となる。
  • G(グー)、C(チョキ)、P(パー)でじゃんけん。
  • 以下、繰返し。
表を時々シャッフルすると面白いかも。

C#でも共用体のようなことができる。
[StructLayout(LayoutKind.Explicit)] struct A
{
	[FieldOffset(0)] int i;
	[FieldOffset(0)] double d;
}
public static void Main(string[] args)
{
	Console.WriteLine(Marshal.SizeOf(typeof(A)));
}
結果は8となる。

Webアプリケーション用に自動テストツールを作った。回帰テストのやり方。

  • 入力用のXMLファイルを用意。操作の流れ(入力内容やどのボタンを押すかなど)を記述。
  • 保存モードで実行して、結果ファイルを作成する。
  • Webアプリケーションのリファクタリング。または、パッチの適用。
  • チェックモードで実行する。前の結果とHTMLレベルで異なる場合、エラー表示される。
ASP.NETでもできる。クッキーにも対応しているのでログイン処理もかける。 実行毎に文字列が異なる場合は、結果ファイル内の該当文字を*にすると無視する。

03/07/24(木)

パイプでできたアーチ型の橋を見て気づいた。 直線のパイプが繋がってできている。CGと同じように見える。

03/07/25(金)

SSL-VPNが良さそうだ。

動かないコンピュータの記事の社会保険庁は大問題だね。4万人、324億円、最長12年の間ミス。


03/07/31(木)

ノータッチ デプロイメント コンテスト、 一番のり(No.0013)。大して面白くない。子供には受けたんだが。

03/08/01(金)

簡易電卓をだしたのだが、 バグっている。1+2*(3+4)が3*7になってしまう。

03/08/05(火)

コンテスト、1人しか参加 していないようだ。
セキュリティが厳しい。1画面で完結しているものしかできない。 ゲームでも作るか。Anagramはゲーム部門でもいいんだけど。

名前に空白の入ったフォルダの作り方。

md "test \"
消し方
rd "test \"
上記以外では消せない。

03/08/13(水)

分離ストレージは、サーバ側かと思いきや、 クライアント側だった。よく見れば、 記事にそう書いてある。 アンケートの意味がないな。PictureViewerもデバッグ用のメッセージ入ったままだし。 数値計算シリーズ(電卓、グラフ、積分)の他にMATLABみたいなのもできるかも。

ShowDialog()はOKだが、ShowDialog(this)がセキュリティ違反になる。


03/08/15(金)

本来であれば、二重化は避けるべきである。 DRY(Don't Repeat Yourself)原則。
諸般の事情により、二重化するとき、こんなツールはどうだろう。 マスタとコピーを指定しておいて、コピーがマスタと違っていたら日付などを出してコピーするかどうか確認メッセージを出す。 マシン起動時に自動チェックするなど。

03/08/18(月)

コンテスト、参加者が増えた。 Font Viewerシンプルだけどいいね。

ゴールを明確に。
SCM:原料・包材から消費者に至るまでの、全ての調達、購入、移動(物流)、保管、受注出荷、システムの管理を全体最適化すること。
ロジスティクス:1つのファンクションで在庫を統合的に管理する機能
第1段階:情報システムの統合
第2段階:需給調整機能の統合
第3段階:物流管理機能の統合


03/08/19(火)

よくSPAMが来る。
メルアドを公開しているので、部の他の人より多いんじゃないかと思っていたが、 これを利用すると次のようなサービスができる。
  • 私は、手動で削除。その時、FromをDBに覚える。
  • 他の人には、フィルタリングサービスを提供。
  • 定期的にPOPサーバを覗いて、該当メールを削除する。
既にあると思うが、そのDBはどのくらい有効なんだろうか。 自分のメリットは同じ所からなら削除が一回で済むことか。 削除しないで退避する方が良さそうだ。メーラで対処する方がいいが、運用の手間がかかるしね。

ファイルの監視はFileSystemWatcherでできる。


03/08/20(水)

今回のワームは、 社内でも感染していたようだ。原因は、感染の可能性のあるPC全てに対し、 責任者がいないことであろう。共有型PCの場合でも責任者をはっきりさせ、 責任者はきちんと対策すべきであろう。
セキュリティ責任者は、お盆明けの出勤者に対し、PCの電源を入れる前に 「対策をしていない場合、ネットワークを切って起動後、この対策ソフトを入れること」 と指導すべきではなかったか。

社員の価値観は多様である。上司は部下の価値観を理解し認める必要がある。 正当な価値観は奨励し、不当な価値観は解消するようにすべきである。

不況の元凶が銀行の不良債権にあると言われている。 処理は進んでいるものの不良債権は逆に増加している。 不良債権が増加している原因は、不況にある。これでは堂堂巡りか。 不況を脱する方法は、仕事を増やし、需要を増やすことである。 そうすれば、不良債権は減少する。元々日本は輸出が盛んで国内需要は高くなく、 海外に需要を求めていた。では、国内需要を喚起するために公共事業を増やすべきか。 しかし、既にかなりの税金を既につぎ込んでいるが効果は薄いようだ。 アメリカのように投資家を呼び込み需要を拡大するにはどうすればよいか。

議事録テンプレートがある。


03/08/21(木)

Blastに関して、MS非難の記事がいくつかある。 が、的を外していないだろうか。MSは1ヶ月前に深刻度:緊急でパッチを出している。

03/08/22(金)

最近正規表現バカになりつつある。

システム間連携とかやっていきたいな。

先週の日曜に子供とアトムを見ていて初めて知った。
「アトムは一瞬でデバッグできる」
プログラマいらないってことか。


03/09/02(火)

コンテストの参加者が増えてきた。 OSPFコストシミュレータは力作だが、結果が正しくない。

03/09/03(水)

手と手を触れ合う、 または導電体を通して触れ合うと会話ができるものがあると 売れるんじゃないだろうか。少なくともゲームができる。

日本は北朝鮮の国民に対し、緊急に物資援助すべきだろう。 そして、追いつめないようにしながら交渉し、お互いの妥協点を探るべきだ。

RSSいいね。SharpReaderの簡易版だったら、簡単にできそうだ。

日立のICタグ、小さくてよい。名刺に入れて、簡単整理ができそうだ。

  • 普通に名刺交換。
  • 名刺をリーダに通して、URLとキーを取得。
  • URLとキーからインターネットで情報を取得。
キーは、64文字で数種類あり、取得できる情報量が異なる。 安全管理をもっと考えた方がいいな。

expander理論。一方が自分あるいは自社、他方が顧客。 (1)自らの生産性をあげ、コストを下げなければいけない。 (2)顧客の価値を最大限に高める努力をしなければいけない。
(1)により、対価は下がる。(2)により、対価は上がる。 対価から見れば、相反することを目指すのでexpander理論と名づけた。 投資効果から見れば、どちらも高める方向になる。


03/09/17(水)

健康診断の結果が返ってきた。 再検査はなかったが、悪いところが年々増えていく。

03/10/01(水)

高顧客満足は、 自分のためでもある。しかし、顧客の立場に立てないのは何故か。

03/10/06(月)

exeにプログラムソースを埋め込む方法。 usage表示時にクリップボードにコピーする。
public static void Main(string[] args)
{
	string s;
	if (args.Length != 1)
	{
		Assembly asm = Assembly.GetExecutingAssembly();
		Console.Error.WriteLine("usage: {0} plan_file",asm.GetName().Name);
		//Console.Error.Write("  show source? (y/n) ");
		//string res = Console.ReadLine();
		//if (!res.StartsWith("n"))
		{
			StreamReader srd = new StreamReader(
				asm.GetManifestResourceStream("CSTest.src.txt"),Encoding.GetEncoding("shift-jis"));
			s = srd.ReadToEnd();
			srd.Close();
			//Console.WriteLine(s);
			System.Windows.Forms.Clipboard.SetDataObject(s,true);
		}
		return;
	}
	...
}
ビルド前のコマンドに「copy ..\..\Class1.cs ..\..\src.txt」を登録しておき、src.txtは埋め込みリソースにする。

03/10/09(木)

汎用的なクラスを作ることがある。 多くのプロジェクトで使用するのだが、全てコピー&ペーストである。 理由は、管理が面倒なのと、下方互換性を保つのが面倒なためだ。 C#でアセンブリにすれば、管理は楽になるだろう。バージョンも適切に使えば、互換性も気にしなくてよいに違いない。

03/10/22(水)

自己記述式実行モジュール を作った。Evolve.zipを解凍して実行してみよう。 「Hello world」が表示される。次に、コントロールキーを押しながら実行してみよう。 プログラムソースが表示される。これを編集して終了時に保存すると、Evolve.exeが自動的に書き換わる。 これらの処理は、表示される200行の中に全て書いてある。
.netのすごさが実感できる。
MainForm.csをコピーして、 「C:\WINNT\Microsoft.NET\Framework\v1.1.4322\csc /r:cscompmgd.dll /t:winexe /out:evolve.exe /res:mainform.cs mainform.cs」 としても、Evolve.exeを作成できる。)

03/10/28(火)

ちょこっと作った、 カレンダー。ノータッチデプロイにすると面白いかも。 実行するとソースをクリップボードにコピーする。

03/10/30(木)

水が、 センサーで自動で流されるトイレが多い。例えば、最後に流した時刻を覚えておいて、 センサー作動時に現在時刻-最後の時刻<5分ならば、その差分時間後に流すようにシステムを 変更すれば、混雑時には結構節約になるんじゃないだろうか。

03/11/11(火)

マニフェストの取り出しツール。
using System;
using System.IO; 
using System.Reflection;
using System.Text;
using System.Windows.Forms;

public class Test 
{
	public static void Main(string[] args)
	{
		if (args.Length == 0)
		{
			MessageBox.Show("Drag&Drop Assembly");
			return;
		}
		Assembly asm = Assembly.LoadFile(args[0]);
		string[] mm = asm.GetManifestResourceNames();
		if (mm.Length == 0)
		{
			MessageBox.Show("Manifestはありません");
			return;
		}
		else if (MessageBox.Show("Manifest\r\n "+ string.Join("\r\n ",mm) + "を展開しますか?","",
			MessageBoxButtons.YesNo,MessageBoxIcon.Question) != DialogResult.Yes)
		{
			return;
		}
		Directory.SetCurrentDirectory(new FileInfo(asm.Location).DirectoryName);
		Encoding enc = Encoding.GetEncoding("shift-jis");
		foreach (string nam in mm)
		{
			StreamReader sr = new StreamReader(asm.GetManifestResourceStream(nam),enc);
			StreamWriter sw = new StreamWriter(nam);
			sw.Write(sr.ReadToEnd());
			sw.Close();
			sr.Close();
		}
	}
}
exe

03/11/20(木)

TreeMemoの内容を プログラムから扱いたい。TreeMemo見たいなものを作るか。

スケジュール管理ソフトで、例えば、委員会をどのメンバーでいつ開くかの予定を入れとくと、 その参加者のPCに時刻前にウィンドウを出すようなのはどうだろうか。

ちょっと作ったWebServiceで、初期化に250msec、呼出しに4msecかかる。WebServiceにする前より100倍遅い。


03/11/21(金)

WebServiceの性能テストを してたらログが7MBになっていた。

確率分布の確認ツールとか面白いかも。

WebServiceの例。サービス元
using System;
using System.Web.Services;
using System.Web.Services.Protocols;

public class Test 
{
	[WebServiceBinding(Name="ZipServiceSoap", Namespace="urn:zipsearch-service")]
	public class ZipService : System.Web.Services.Protocols.SoapHttpClientProtocol 
	{
		public ZipService() 
		{
			Url = "http://nile.esm.co.jp:8080/soap/servlet/rpcrouter";
		}
		[SoapRpcMethod("getAddressByZipcode",
			 RequestNamespace="urn:zipsearch-service", ResponseNamespace="urn:zipsearch-service")]
		public string[] getAddressByZipcode(string zipcode)  
		{
			return (string[])Invoke("getAddressByZipcode", new object[]{zipcode})[0];
		}
	}
	public static void Main(string[] args)
	{
		ZipService zs = new ZipService();
		string[] ss = zs.getAddressByZipcode("1000000");
		Console.WriteLine(string.Join(" ",ss));
	}
}
.netでは、[SoapDocumentMethod("http://tempuri.org/MethodName", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/")] のように記述する。


03/11/29(土)

N元1次連立方程式。
	/// <summary>
	/// N元1次連立方程式を解く
	/// </summary>
	public static double[] SolveMatrix(double[,] A, double[] b)
	{
		int			N = b.Length;
		if (N == 1)
		{
			return new double[]{b[0] / A[0,0]};
		}
		else if (N == 2)
		{
			double d = A[0,0]*A[1,1] - A[0,1]*A[1,0];
			return new double[]{(A[1,1]*b[0]-A[0,1]*b[1])/d, (-A[1,0]*b[0]+A[0,0]*b[1])/d};
		}
		else if (N == 3)
		{
			double d = A[0,0]*A[1,1]*A[2,2] + A[0,1]*A[1,2]*A[2,0] + A[0,2]*A[1,0]*A[2,1]
					 - A[0,2]*A[1,1]*A[2,0] - A[0,0]*A[1,2]*A[2,1] - A[0,1]*A[1,0]*A[2,2];
			return new double[]{
					(b[0]*A[1,1]*A[2,2] + A[0,1]*A[1,2]*b[2] + A[0,2]*b[1]*A[2,1]
				   - A[0,2]*A[1,1]*b[2] - b[0]*A[1,2]*A[2,1] - A[0,1]*b[1]*A[2,2])/d,
					(A[0,0]*b[1]*A[2,2] + b[0]*A[1,2]*A[2,0] + A[0,2]*A[1,0]*b[2]
				   - A[0,2]*b[1]*A[2,0] - A[0,0]*A[1,2]*b[2] - b[0]*A[1,0]*A[2,2])/d,
					(A[0,0]*A[1,1]*b[2] + A[0,1]*b[1]*A[2,0] + b[0]*A[1,0]*A[2,1]
				   - b[0]*A[1,1]*A[2,0] - A[0,0]*b[1]*A[2,1] - A[0,1]*A[1,0]*b[2])/d};
		}
		else
		{
			int			i,j,k;
			double[,]	a = (double[,])A.Clone();
			double[]	x = (double[])b.Clone();
			double		d;
			for (i=0;i<N;++i)
			{
				d = a[i,i];
				for (j=i;j<N;++j) a[i,j] /= d;
				x[i] /= d;
				for (j=i+1;j<N;++j)
				{
					d = a[j,i];
					for (k=i;k<N;++k) a[j,k] -= a[i,k]*d;
					x[j] -= d*x[i];
				}
			}
			for (i=N-1;i>0;--i)
			{
				for (j=0;j<i;++j) x[j] -= a[j,i]*x[i];
			}
			return x;
		}
	}

03/12/03(水)

人の発展に言語能力が大きく関わっているとしたら、 将来、コンピュータ言語が発達すると人工知能が感情を持つと言えるぐらいになるだろうか。

InfoPathのCOMを使おうとしたが、うまくいかない。内部的にMSXML2を使っているようだ。

XPathの学習ツール。Ctrl+P, Ctrl+Nで履歴が出る。Ctrl+Sでソースが出る。


03/12/04(木)

最大素数更新。 2^20,996,011-1 。630万桁。40番目のメルセンヌ数だそうだ。分散コンピュータで発見とのこと。

03/12/08(月)

netlibみたいな テスト用問題をWebサービスにすると、面白いんじゃないだろうか。

03/12/09(火)

POP before SMTPの回避方法。 未実験。
    using (System.Net.Sockets.TcpClient tcp = new System.Net.Sockets.TcpClient())
    {
        tcp.Connect(POPサーバー名,110);
        using (StreamWriter sw = new StreamWriter(tcp.GetStream()))
            sw.Write("USER ユーザ名\nPASS パスワード\nSTAT\nQUIT\n");
    }

03/12/25(木)

3か月分を清算した。 交通費6.5万、出張費2.5万、その他5万。3時間かかった。

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