2011年9月23日金曜日

簡易的メールアドレスチェックC# 正規表現. easy mail address validation checker in C# with regular expression.

文字列がメールアドレスとして正しいか判定 (正規表現を使用)
(RFCの連続メールアドレスまでは準拠しません。1つのメールアドレスに対応してます。)

以下の形式に対応します。
1. user123@example456.co.jp メールアドレスのみの形式 ( mail address only)
2. hoge ホゲ  ユーザ名+<メールアドレス> 形式 ( name + )

// メールアドレス正当性チェックメソッド
public static bool IsValidMailAddrString(string mailAddrStr)
{
    if (mailAddrStr.Contains("<")) {
         // name + <mail addr>;              
         //                    
         // 正規表現を設定。
         string regPattern = @"^\s*[^<]*\s*[<]\s*[^@\s]+[@]([^.\s]+[.]){1,}[^.\s]+\s*[>]\s*$";              
         return System.Text.RegularExpressions.Regex.IsMatch(mailAddrStr, regPattern);          
     }          
     else
     {
        // mail addr only
        // user@example.co.jp
        string regPattern = @"^[^@\s]+[@]([^.\s]+[.]){1,}[^.\s]+\s*$";
        return System.Text.RegularExpressions.Regex.IsMatch(mailAddrStr, regPattern);
     }
}

/// この関数を使う場合は以下のようにある程度許容性を持たせてくださいね。
// TextBox
private void txtMailText_Validating(object sender, CancelEventArgs e)      
{
    // text box ?
    TextBox tb;
    if (sender.GetType() == typeof(TextBox))
    {
        tb = (TextBox)sender;
        if (tb.Text == "") return;  // ignore empty string
        // メールアドレス妥当性チェック
        if (!IsValidMailAddrString(tb.Text))
        {
            // if it doesnt look like mail addr
            if (MessageBox.Show("メールアドレス形式が不正のようです。このまま使用しますか?", "Mail Address Validation", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.No)
            {
                e.Cancel = true;
            }
        }
    }
}

2011年9月10日土曜日

MacOS X でsyslogd udp(514)受信する設定 (How to receive syslog udp(514) with MacOS X)

使用環境: MacOS X 10.6 (Snow Leopard)

以下のファイルを編集。(管理者ユーザー/sudo)
edit the file bellow. (with root user / sudo)
/System/Library/LaunchDaemons/com.apple.syslogd.plist

ファイル末尾の以下の部分をアンコメント。
un-comment  these part bellow.
<!--
        Un-comment the following lines to enable the network syslog protocol listener.
-->
                <key>NetworkListener</key>
                <dict>
                        <key>SockServiceName</key>
                        <string>syslog</string>
                        <key>SockType</key>
                        <string>dgram</string>
                </dict>
        </dict>
</dict>

syslogdをリロード。
reload syslogd
> launchctl unload com.apple.syslogd.plist
> launchctl load com.apple.syslogd.plist


受信待機(Listen)確認。
check if mac really start listening to.
> netstat -an |grep 514
udp6       0      0  *.514                  *.*                    
udp4       0      0  *.514                  *.*

できた!
done!

2011年9月8日木曜日

Quated-PrintableデコードのC#ソース。How to decode BASE64 and Quated-Printable with C#.

ネット見てもQuated-Printableデコードのサンプルが
あまりなかったのでVisual C#サンプルソースをここに大公開!!
How to decode base64 and quated-printable string.

2013/3/28
そういえば、twitterで文字化け現象が起きてるそうな。
なんか最近やたらとこのページのアクセスが多かったのは、
やっぱりBASE64関係だったのか。
こういう意味でもコードの使用は自己責任でお願いします。

public static String DecodeMailString(String str)
{
        try
        {
            if (str == null || str == "") return "";

            // ?で区切り
            // separate with "?"
            String[] s = str.Split('?');
            byte[] b;
            String ret;

            if (s.Length < 3)
            { 
                // quatedなら少なくとも?は3つ
               // this judge its normal string, if they dont hae ? at least 3.
                return str;
            }

            if (s[2] == "B")
            {
                //Base64 encoding
                b = System.Convert.FromBase64String(s[3]);
                // s[1] specifies eincoding
                string dec = System.Text.Encoding.GetEncoding(s[1]).GetString(b);
                //if(s[4] != "=")
                //{
                //    ret += s[4];
                //}
                // =?x2022-JP?B?の処理
                ret = System.Text.RegularExpressions.Regex.Replace(str, @"""?=[?][^?]*[?][^?]*[?][^?]*[?]=""?", dec);
            }
            else if (s[2] == "Q")
            {
                // Quoted-printable
                // http://homepage1.nifty.com/glass/tom_neko/web/web_03.html#Q_encode

                // sample:
                // "=?utf-8?Q?=E8=8F=8A=E5=9C=B0_=E5=BA=83=E8=A1=8C?=" 
                string target = s[3]; // =E8=8F=8A=E5=9C=B0_=E5=BA=83=E8=A1=8C
                List b16 = new List();
                Encoding enc;
                try
                {
                    enc = Encoding.GetEncoding(s[1]);
                }
                catch (Exception ex)
                {
                    enc = Encoding.GetEncoding("UTF-8");
                }
                for (int i = 0; i < target.Length; i++)
                {
                    if (target[i] == '=')
                    {
                        if (target.Length >= i + 2)
                        {
                            string hexStr = new string(target.ToCharArray(i + 1, 2));
                            b16.Add(System.Convert.ToByte(hexStr, 16));
                            i += 2; 
                        }
                        else
                        {
                            break;
                        }
                    }
                    else if (target[i] == '_')
                    {
                        b16.AddRange(enc.GetBytes(" "));
                    }
                    else
                    {
                    }
                }
                string dec = enc.GetString(b16.ToArray());

                ret = System.Text.RegularExpressions.Regex.Replace(str, @"""?=[?][^?]*[?][^?]*[?][^?]*[?]=""?", dec);

                LogRotation.Log.WriteLine(LogRotation.Level.Information, "DecodeMailString", "Quoted-printable from: " + target + " , to:" + dec );
            }
            else
            {
                //throw new Exception("decode error : " + str);
                return str;
            }
            return ret;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }