C#

○.config – AppSettings

        public static string getConfValue(string name)
        {
            return ConfigurationManager.AppSettings[name];
        }

        public static string getConfValue(string name, string defValue)
        {
            if (isConfValue(name))
                return getConfValue(name);
            else
                return defValue;
        }

        public static bool isConfValue(string name)
        {
            return (Array.IndexOf(ConfigurationManager.AppSettings.AllKeys, name) >= 0);
        }

        public static eAppMode AppMode
        {
            get
            {                    
                if (isConfValue("APP_MODE"))
                    return eAppMode.Dev;
                else
                    return eAppMode.Non;
            }

        }

○プロパティ名を取得する

        public static string GetName(System.Linq.Expressions.Expression<Func> e)
        {
            var member = (System.Linq.Expressions.MemberExpression)e.Body;
            return member.Member.Name;
        }

        //使い方
        string s = GetName(() => DateTime.Today);

仮想化技術

Hyper-vを利用するにはVT-xとSLATが必要。SLATは
インテル® バーチャライゼーション・テクノロジーについて
のEPTにあたる。

VirtualBoxなどで64bitOSを利用するにはVT-xが必要

Disk2vhdツールで物理ディスク環境をVHDファイルに変換する

稼働中のマシンのHDDから、VMware Player用の仮想マシンを作る
PartImageでHDDをダンプする

利用中のPCを丸ごとVMware形式の仮想マシンへ変換「VMware vCenter Converter」

VMware/Hyper-Vの仮想ディスクを相互変換可能なフリーソフト【StarWind V2V Converter】
VHD to VMDK

vmware playerで既存のパーティションを起動する
VMware raw disk

VMware の仮想ディスクを物理ディスク構成に変更する方法
仮想マシンからローカルディスクに直接アクセスする

既にインストール済みのWindows 98をVMwareで使うには
IDEディスクを直接「rawディスクパーティション」として利用する

【参考】VMwareのディスクイメージをさくらのクラウドで利用する

VHD(仮想ハードディスク)をWindows7/Windows8/Windows Serverに直接マウントする方法

壊れたWindows PC(HDDは無事)のHDDを新マシン上のVMWareで仮想化して起動する

XPの物理PC実行環境を仮想マシンとして保存

VirtualBoxを使った仮想Linuxサーバのローカル開発環境構築

Remote App for Hyper-V (XP)

ASP.net 操作ログ採取 TableAdapter拡張 改良版

○TableAdapterの基底クラスを作成

using System.ComponentModel;
using System.Data.SqlClient;
using System.Reflection;
using System.Web;
using System;

namespace Logic.dataset
{
    public class TableAdapterBase : Component
    {
        public SqlDataAdapter InnerAdapter
        {
            get
            {
                return (SqlDataAdapter)GetType().GetProperty("Adapter",
                  BindingFlags.NonPublic | BindingFlags.Instance).GetValue(this, null);
            }
        }

        static public event SqlRowUpdatedEventHandler sqlRowUpdatedEvent = delegate { };
        static public event SqlRowUpdatingEventHandler sqlRowUpdatingEvent = delegate { };

        public TableAdapterBase() : base()
        {
            InnerAdapter.RowUpdated += rowUpdatedEventHandler;
            InnerAdapter.RowUpdating += rowUpdatingEventHandler;
        }

        private void rowUpdatedEventHandler(object sender, SqlRowUpdatedEventArgs e)
        {
            sqlRowUpdatedEvent(sender, e);
        }

        private void rowUpdatingEventHandler(object sender, SqlRowUpdatingEventArgs e)
        {
            sqlRowUpdatingEvent(sender, e);
        }    
    }
}

○TableAdapterの基底クラスを変更

○イベントを設定

・Page_Load部
  Logic.dataset.TableAdapterBase.sqlRowUpdatedEvent += putLogSqlRowUpdatedHandler;

・Page_Unload部
  Logic.dataset.TableAdapterBase.sqlRowUpdatedEvent -= putLogSqlRowUpdatedHandler;


        private static void putLogSqlRowUpdatedHandler(object sender, System.Data.SqlClient.SqlRowUpdatedEventArgs e)
        {
            putLog(e.Row);
        }

        private static void putLogSqlRowUpdatingHandler(object sender, System.Data.SqlClient.SqlRowUpdatingEventArgs e)
        {
            //putLog(e.Row);
        }

※dt.Update()系は拾えるが、dt.Delete()系はダメ。Update()でDeleteしていたら拾える?
 SqlDataAdapterはsealedの為、拡張できない。。。

ASP.net 操作ログ採取 DataTable

using System.Reflection;
namespace Logic.dataset {
    public delegate void LogEventHandler(object sender, EventArgs e);
    public partial class data_〇〇 {
        partial class ○○DataTable
        {
            static public event LogEventHandler logEvent = delegate { };
            public void myGetData()                
            {
                //イベント発生
                logEvent(this, EventArgs.Empty);
   :
   :


namespace myApp
{
    public class baseBasePage : System.Web.UI.Page
    {
        protected override void OnInit(EventArgs e)
        {
            //イベント追加
            Logic.dataset.data_〇〇.〇〇DataTable.logEvent += putLogHandler;
            base.OnInit(e);
        }

        protected override void OnUnload(EventArgs e)
        {
            //イベント削除
            Logic.dataset.data_〇〇.〇〇DataTable.logEvent -= putLogHandler;
            base.OnUnload(e);
        }
   :
   :


ASP.net 操作ログ採取 ボタン等

○基底クラス作成

    /// 
    /// ログ採取などの共通処理
    /// 
    public class baseBasePage : System.Web.UI.Page
    {
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);

            if (!IsPostBack)
            {                
                putLog(this.GetType().Name + " 初回表示");
            }
        }

        public override void RegisterRequiresRaiseEvent(System.Web.UI.IPostBackEventHandler control)
        {
            string str = string.Empty;

            if (control.GetType().Equals(typeof(Button)))
            {
                Button ctl = (Button)control;
                str += "ID=" + ctl.ID + " Txt=" + ctl.Text;
            }

            if (str != string.Empty)
            {
                str = this.GetType().Name + " - ■■■" + str + " (" + control.GetType().ToString() + ")";
                putLog(str);
            }

            base.RegisterRequiresRaiseEvent(control);
        }

        protected override void RaisePostBackEvent(System.Web.UI.IPostBackEventHandler sourceControl, string eventArgument)
        {
            string str = string.Empty;

            if (sourceControl.GetType().Equals(typeof(LinkButton)))
            {
                LinkButton ctl = (LinkButton)sourceControl;
                str += "ID=" + ctl.ID + " Txt=" + ctl.Text;
            }

            if (str != string.Empty)
            {
                str = this.GetType().Name + " - ■■■" + str + " (" + sourceControl.GetType().ToString() + ")";
                putLog(str);
            }

            base.RaisePostBackEvent(sourceControl, eventArgument);
        }

        public override void ProcessRequest(HttpContext context)
        {
            string key = string.Empty;

            key = "__CALLBACKID";
            if (context.Request.Params[key] != null)
            {
                putLog(MethodBase.GetCurrentMethod(), "■■■" + key + "=" + context.Request.Params[key]);
            }

            System.Diagnostics.Debug.Print("■context.Rezuest.Params cnt=" + context.Request.Params.Count.ToString());
            foreach (string s in context.Request.Params.Keys)
            {
                System.Diagnostics.Debug.Print(s + "=" + context.Request.Params[s]);
            }

            base.ProcessRequest(context);
        }
    }