やりかけがいっぱい

  • C# で強い typedef っぽいことをするためのカスタムツール作成
  • MVP パターンのフレームワーク作成
  • DynamicObject 使って C# でプロトタイプベースなライブラリ作成
  • MVP パターンの記事
  • NotifyIcon 使った常駐アプリの作り方の記事
  • 公開用 NHibernate のサンプルプログラム作成
  • 公開用 TableModule のサンプルプログラム作成
  • 公開用 ActiveRecord のサンプルプログラム作成
  • 本気スケジューラアプリ作成
  • 本気 TODO List アプリ作成
  • etc...

だいたい三日〜一ヶ月位で冷めて放置というパターン
まともに何か達成したことがほとんどない件
とりあえず、typedef っぽいカスタムツール作成にまた興味出てきたけどいつまで続くか・・・w

WCF での P2P の参考 URL

[サンプル]
WCF のチャットのサンプル | Microsoft Docs
ピア チャネル セキュア チャット | Microsoft Docs
ピア チャネル カスタム ピア リゾルバ | Microsoft Docs
WCF を使用したピアツーピアの作業処理アプリケーション


[ピアリゾルバ]
ピア リゾルバー | Microsoft Docs
WCF and PNRP - MyProgrammingNote Wiki*
Peer Name Resolution Protocol | Microsoft Docs


[アーキテクチャ]
MSDN マガジンのバックナンバー | Microsoft Docs


log4net サンプル

Global.asax.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using log4net;
using log4net.Config;

namespace Sample
{
    public class Global : System.Web.HttpApplication
    {
        private static readonly ILog _log = LogManager.GetLogger("App");

        protected void Application_Start(object sender, EventArgs e)
        {
            XmlConfigurator.Configure();
        }

        protected void Application_Error(object sender, EventArgs e)
        {
            Exception lastError = this.Server.GetLastError();
            if (lastError is HttpUnhandledException)
            {
                _log.Fatal("未処理の例外が発生しました。", lastError);
            }
            else
            {
                _log.Error("エラーが発生しました。", lastError);
            }
        }
    }
}

Web.config

<?xml version="1.0" encoding="utf-8"?>

<configuration>
    <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
    </configSections>
    
    <system.web>
        <customErrors mode="RemoteOnly" defaultRedirect="Error.html"/>
    </system.web>

    <log4net>
        <appender name="ApplicationLog" type="log4net.Appender.RollingFileAppender">
            <file value="Logs/app" />
            <appendToFile value="true" />
            <maxSizeRollBackups value="10" />
            <rollingStyle value="date" />
            <staticLogFileName value="false" />
            <datePattern value='"."yyyy-MM-dd".log"' />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%d{HH:mm:ss.fff} [%t] %-5p %c - %m%n" />
            </layout>
        </appender>

        <appender name="NHibernateFileLog" type="log4net.Appender.RollingFileAppender">
            <file value="Logs/nhibernate" />
            <appendToFile value="true" />
            <maxSizeRollBackups value="10" />
            <rollingStyle value="date" />
            <staticLogFileName value="false" />
            <datePattern value='"."yyyy-MM-dd".log"' />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%d{HH:mm:ss.fff} [%t] %-5p %c - %m%n" />
            </layout>
        </appender>

        <appender name="DataLog" type="log4net.Appender.RollingFileAppender">
            <file value="Logs/data" />
            <appendToFile value="true" />
            <maxSizeRollBackups value="10" />
            <rollingStyle value="date" />
            <staticLogFileName value="false" />
            <datePattern value='"."yyyy-MM-dd".log"' />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%d{HH:mm:ss.fff} [%t] %-5p %c - %m%n" />
            </layout>
        </appender>
        
        <!-- levels: DEBUG, INFO, WARN, ERROR, FATAL -->
        <logger name="App" additivity="false">
            <level value="Error"/>
            <appender-ref ref="ApplicationLog"/>
        </logger>
        <!--<logger name="NHibernate" additivity="false">
            <level value="DEBUG"/>
            <appender-ref ref="NHibernateFileLog"/>
        </logger>
        <logger name="Pushable.Data" additivity="false">
            <level value="DEBUG"/>
            <appender-ref ref="DataLog"/>
        </logger>-->
    </log4net>
</configuration>

最近買った本

成功者の告白 5年間の起業ノウハウを3時間で学べる物語

成功者の告白 5年間の起業ノウハウを3時間で学べる物語

非常識な成功法則―お金と自由をもたらす8つの習慣

非常識な成功法則―お金と自由をもたらす8つの習慣

メッセージリストコントロール

メッセージを手軽に扱うためのカスタムコントロール

コード

MessageList.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Sample.Controls
{
    [DefaultProperty("Items")]
    [ParseChildren(true, "Items")]
    [PersistChildren(false)]
    public class MessageList : CompositeControl
    {
        public MessageList()
        {
            this._items = new List<Message>();
        }


        private readonly List<Message> _items;


        [MergableProperty(false)]
        [PersistenceMode(PersistenceMode.InnerDefaultProperty)]
        public List<Message> Items
        {
            get
            {
                return this._items;
            }
        }


        protected override HtmlTextWriterTag TagKey
        {
            get
            {
                return HtmlTextWriterTag.Ul;
            }
        }


        public void ShowMessage(string messageId)
        {
            this.SetVisibleOfMessage(messageId, true);
        }

        public void HideMessage(string messageId)
        {
            this.SetVisibleOfMessage(messageId, false);
        }

        public void ShowAllMessages()
        {
            this.SetVisibleOfAllMessages(true);
        }

        public void HideAllMessages()
        {
            this.SetVisibleOfAllMessages(false);
        }


        private void SetVisibleOfMessage(string messageId, bool visible)
        {
            Message target = this._items.Find(item => string.Equals(item.ID, messageId, StringComparison.Ordinal));
            target.Visible = visible;
        }

        private void SetVisibleOfAllMessages(bool visible)
        {
            this._items.ForEach(item => item.Visible = visible);
        }


        protected override void CreateChildControls()
        {
            foreach (Message item in this._items)
            {
                this.Controls.Add(item);
            }
        }
    }
}

Message.cs

using System;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Sample.Controls
{
    public class Message : WebControl
    {
        public Message()
            : base(HtmlTextWriterTag.Li)
        {
        }


        public string Text
        {
            get
            {
                return (this.ViewState["Text"] as string) ?? string.Empty;
            }
            set
            {
                this.ViewState["Text"] = value;
            }
        }


        public void Show()
        {
            this.Visible = true;
        }

        protected override void RenderContents(HtmlTextWriter writer)
        {
            writer.Write(this.Text);
        }
    }
}

使用例

Execute.aspx (1)

<%@ Register Assembly="Sample" Namespace="Sample.Controls" TagPrefix="my" %>

Execute.aspx (2)

<my:MessageList runat="server" ID="_errorMessageList" CssClass="ErrorMessageList">
    <my:Message runat="server" ID="_hogeErrorMessage" Text="Hoge です。" />
    <my:Message runat="server" ID="_fugaErrorMessage" Text="Fuga です。" />
    <my:Message runat="server" ID="_piyoErrorMessage" Text="Piyo です。" />
</my:MessageList>

Execute.css

.ErrorMessageList li
{
    color: Red;
}

Execute.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    this._errorMessageList.HideAllMessages();
}

protected void _okButton_Click(object sender, EventArgs e)
{
    FooFacade.ResultOfExecute result = this._facade.Execute();
    switch (result)
    {
        case (FooFacade.ResultOfExecute.Success):
            this.Response.Redirect("~/Foo/Complete.aspx", false);
            break;

        case (FooFacade.ResultOfExecute.Hoge):
            this._hogeErrorMessage.Show();
            break;

        case (FooFacade.ResultOfExecute.Fuga):
            this._fugaErrorMessage.Show();
            break;

        case (FooFacade.ResultOfExecute.Piyo):
            this._piyoErrorMessage.Show();
            break;

        default:
            throw new ApplicationException();
    }
}