今朝の日経から。
JT加ト吉TOBTOB総額は1000億ということです。

先週440円ぐらいで200株買ってました!
ラッキーです。
いや、それ以上に他の株がスゴイ下がってますけどね・・・

大方の予想では650円前後がTOB価格となる予想です。
楽しみですね。
ただ、TOB後は上場廃止っていうのがいまいち理解できません。
ずっと持っておいたらどうなるんだろ?
JT株と変えてくれたりするんだろうか?

最近、会社で使っている作業管理ツールを作り直しています。
もともとはASP.NET2.0でざっくり作ったWebアプリですが、
上司の要望を取り入れているうちにだんだんやっつけ仕事に…。
今後も使われ続ける様子なので、今のうちに作り直すことにきめました。

とりあえず今実装している機能はこんなところです。
・作業時間入力(カレンダーコントロールで日を選び、業務、作業の種類と時間帯を入力)
・時間帯ごとに合計時間を算出(残業時間A・B・C、所定勤務時間など)
・振替休日の反映
Excelの集計表2種類
・ユーザ管理(ID、パスワード、所属部署)
・業務マスタメンテナンス機能
・基準時間帯メンテナンス機能
・休日メンテナンス機能

機能はそのままに、UIとデータ設計を見直します。
データ設計は特に集計がしやすいように配慮して。
今は作業時間帯ごとの合計時間がアプリを通してしか
わからんのです。運用も考えると全てSQLでわかるようにしたほうがいいです。

開発はやはりASP.NET2.0で。
これからはSilverlightかASP.NETAJAXか?とも思いますが、
Webアプリ開発環境としてASP.NET2.0は一つの完成形かと思ってます。

TraceSourceの設定

TraceSourceを使う際のconfigの内容をメモしておきます。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.diagnostics>
      <sources>
        <source name="MainTraceSource" switchName="sourceSwitch" switchType="System.Diagnostics.SourceSwitch">
          <listeners>
            <!--<add name="EventLog" />-->
            <!--<add name="TextLog" />-->
            <!--<add name="Delimited" />-->
            <!--<add name="XmlWriter" />-->
            <!--<add name="Console" />-->
          </listeners>
        </source>
      </sources>
      <switches>
        <add name="sourceSwitch" value="Warning"/>
      </switches>
      <sharedListeners>
        <add name="EventLog"
          type="System.Diagnostics.EventLogTraceListener"
          initializeData="Test Application" />
        <add name="TextLog"
          type="System.Diagnostics.TextWriterTraceListener"
          initializeData="TextLog.txt" />
        <add name="Delimited" 
          type="System.Diagnostics.DelimitedListTraceListener"
          initializeData="DelimitedLog.txt" delimiter=","
          traceOutputOptions="DateTime" />
        <add name="XmlWriter"
          type="System.Diagnostics.XmlWriterTraceListener"
          initializeData="Log.xml" />
        <add name="Console"
          type="System.Diagnostics.ConsoleTraceListener"
          initializeData="true" />
      </sharedListeners>
    </system.diagnostics>
</configuration>

実際は上記のsourceタグのコメントをいずれか外して使います。
サンプルソースはこんな感じです。

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;

namespace TraceTest
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                TraceSource trace   =   new TraceSource("MainTraceSource");
                trace.TraceEvent(TraceEventType.Warning, 0, "警告");
                trace.TraceEvent(TraceEventType.Information, 1, "情報");
                trace.TraceEvent(TraceEventType.Critical, 2, "危機");
                trace.Flush();
            }
            catch (Exception ex)
            {
                Console.WriteLine("{0}\r\n{1}", ex.Message, ex.StackTrace);
            }
            Console.Read();
        }
    }
}

Page#Transactionに気づいた今日この頃

いろいろと忙しく滞っていた日記を久しぶりに更新。

こないだASP.NETのPageクラスのTransactionプロパティをはじめて知りました。
今までリファレンスで見ていたかもしれませんが、
あんまり気にしてなかったというのが実際のところです。

データアダプタ内部のCommandクラスはprivateなのでTransactionをセットできないので、
今までASP.NETADO.NETのデータアダプターをぺたぺた貼り付けても、
「これじゃトランザクションとれないよなあ」と
結局アダプタクラスを自作していました。
しかしながらASP.NETADO.NETの組み合わせによるRADは
このTransactionプロパティが前提なんでしょうね。
1.1からあったのに今頃知った…orz

でもビジネスロジックとUI層を分離すると結局
ビジネスロジック側でトランザクションを管理しなきゃいかんので、
このプロパティもやっつけで作るときぐらいにしか
使わないのかも。

というわけで今も使ってません。

C#のパフォーマンスカウンタ

『プログラミング .NET Framework 第2版』に簡単便利なパフォーマンスカウンタのコードがあったのでメモしておきます。

using System;
using System.Collections;
using System.Collections.Generic;
using Systme.Diagnostics;

internal sealed class OperationTimer : IDisposable {
	private Int64 m_startTime;
	private String m_text;
	private Int32 m_collectionCount;

	public OperationTimer(Sring text){
		PrepareForOperation();
		m_text	=	text;
		m_collectionCount	=	GC.CollectionCount(0);
		m_startTime	=	Stopwatch.GetTimestamp();
	}

	public void Dispose() {
		Console.WriteLine("{0,6:###.00} seconds (GCs={1,3}) {2}",
			(Double) Stopwatch.Frequency,
		GC.CollectionCount(0) - m_collectionCount, m_text);
	}

	private static void PrepareForOperation() {
		GC.Collect();
		GC.WaitForPendingFinalizers();
		GC.Collect();
	}
}

以下のように使います。

using System;

public static class Program {
        public static void Main() {
                using (new OperationTimer("何かの処理")){
                        // 時間を計測したい処理を書く。
                }
        }
}

Microsoft Loopback Adapterを使ったVirtualPCのネットワーク設定

VirtualPC 2004のホストOSとゲストOSとをMicrosoft Loopback Adapterで接続し、
インターネット共有を使ってゲストOSからインターネット接続を行う手順を紹介します。
ゲスト、ホストの構成は以下のとおりです。OSが異なる場合は適宜読み替えてください。

ホストOS Windows XP Professional
ゲストOS Windows 2000 Server

Microsoft Loopback Adapterのインストール

まずホストOSにMS Loopback Adapterをインストールします。
「スタート」→「コントロールパネル」→「ハードウェアの追加」をクリックして「ハードウェアの追加ウィザード」を起動後、
以下の手順でウィザードを進めてください。

ウィザードの質問 回答
既にこのハードウェアをコンピュータに接続していますか? はい、ハードウェアを接続しています
インストールされているハードウェア 新しいハードウェアデバイスの追加
インストール方法を選んでください 一覧から選択したハードウェアをインストールする
共通ハードウェアの種類 ネットワークアダプタ
製造元 Microsoft
ネットワークアダプタ Microsoft Loopback Adapter

ゲストOSのネットワークアダプタの選択

VirtualPCコンソールから対象となるゲストOSを選択し、「設定」をクリック。
設定画面から「ネットワーク」を選択し、アダプタとして「Microsoft Loopback Adapter」を選択します。

ゲストOSのネットワーク設定

ゲストOSを起動し、「スタート」→「コントロールパネル」→「ネットワークとダイヤルアップ接続」から、
ローカルエリア接続ののTCP/IPのプロパティを以下のように設定します。
IPアドレスを192.168.0.2としているのは、後のインターネット共有で
ホストOS側のIPとして192.168.0.1が指定されるためです。

設定項目
IPアドレス 192.168.0.2
サブネットマスク 255.255.255.0
デフォルトゲートウェイ 192.168.0.1
優先DNSサーバ [環境に応じた優先DNSサーバのIPアドレス]
代替DNSサーバ [環境に応じた代替DNSサーバのIPアドレス]

ホストOSのネットワーク設定

MS Loopback Adapterをインストールしたことで、
「スタート」→「コントロールパネル」→「ネットワーク接続」に、
MS Loopback Adapterのローカルエリア接続が追加されています。
(以後、これを「VirtualPC接続」とします)
これと異なる、インターネットに接続している実在のNICの接続(以後、これを「物理接続」とします)のプロパティを開きます。
「詳細設定」タブ→「インターネット接続の共有」の、
「ネットワークのほかのユーザに、このコンピュータのインターネット接続をとおしての接続を許可する」
にチェックをつけます。
すると、VirtualPC接続のIPアドレス設定が自動的に以下のようになり、
物理接続を通してゲストOSがインターネットにアクセスできるようになります。

Windows XPを利用する場合の注意点

導通試験のためにpingコマンドを利用する場合には、
WindowsファイアウォールによるICMPエコー要求の着信を拒否を外しておきましょう。
「スタート」→「コントロールパネル」→「Windowsファイアウォール」をクリックして、
「詳細設定」タブ→「ICMP」の設定→「エコー要求の着信を許可する」をチェックします。

平均年齢40歳の会社で思うこと

私の会社の平均年齢は40歳です。
その中にあっては30歳の私なんぞはまだまだ若手でして、
新卒の方にとっては下手すりゃお父さんお母さんぐらいの年齢の人が
たくさん働いています。
日本の多くの例外にもれず、私の会社も実質的にはまだまだ
年功序列なので、平均年齢の方はとてもいい給料貰ってます。

それに見合うだけの仕事をしていればいいのですが、
ここでもう一つの事実。
社員数100人に対して外部からの派遣社員が100人。
二人に一人が派遣社員です。
給与体系を支えるための安い労働力というわけです。
この本に書いてあるとおりですね。

若者はなぜ3年で辞めるのか? 年功序列が奪う日本の未来 (光文社新書)

若者はなぜ3年で辞めるのか? 年功序列が奪う日本の未来 (光文社新書)

そして哀しいことに、派遣の人のほうがよっぽど仕事できます。
技術力も高いし仕事に対するモチベーションも高い。
しかしながらヌルイ環境で育った社員のほうが高い給料を貰っているという事実。
たまに優秀な派遣社員の方から
私の会社で働きたいです、とうれしい言葉をもらいます。
私も出来ない社員とあなたを取り替えたいと思うのですが、
そんなことができるわけでもないので、いつも歯がゆい思いをしています。