【ASP.NET】C# E-mailチェックとURLチェックの正規表現サンプル

入力フォームでE-mailやURLの入力をチェックするのに、正規表現を使って行うけど、ネットを探して見つけたサンプルが、全然使えなくて大変だった。笑
ただでさえ、C#のサンプルってあまりないのに。。。
MSDNのサイトのサンプルさえも使えなくて。。。
どのサンプルもURLチェックで、「-」(ハイフン)付きのURLがどうしても通らなくて。。。
正規表現の予約語で<host>とか<domain>とかってあるけど、あれって、どんな文字までチェックしてるんだろう。。。

RegularExpressionValidatorツールを使えば、まぁ簡単にE-mailやURLのチェックもしてくれるんだろうけど、実装上どうしても使えないときに手組みしないといけなくて。。。
でも、このRegularExpressionValidatorツールのプロパティ「ValidationExpression」に「正規表現エディタ」というのがあったので、こちらを使ってサンプルを実装。

正規表現エディタ
正規表現エディタ

VisualStudioってほんと便利だなぁ~。

正規表現、昔勉強したけど、完全に忘れていきそう。笑

E-mailチェックの正規表現サンプル

//Emailチェック
System.Text.RegularExpressions.Regex regex = 
  new System.Text.RegularExpressions.Regex(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*");
System.Text.RegularExpressions.Match m = 
    regex.Match("対象文字列");
if (!m.Success)
{
    string errorMsg = "E-Mailの入力が正しくありません。";
}

URLチェックの正規表現サンプル

//URLチェック
System.Text.RegularExpressions.Regex regex = 
  new System.Text.RegularExpressions.Regex(@"http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?");
System.Text.RegularExpressions.Match m = 
    regex.Match("対象文字列");
if (!m.Success)
{
    string errorMsg = "E-Mailの入力が正しくありません。";
}

詳説 正規表現 第3版

著者/訳者:Jeffrey E.F. Friedl

出版社:オライリージャパン( 2008-04-26 )

定価:

Amazon価格:¥ 5,184

大型本 ( 528 ページ )

ISBN-10 : 4873113598

ISBN-13 : 9784873113593


【ASP.NET】C# DataTable.Select()メソッドにはやはりバグがある!?

久しぶりに技術的な記事でも。
MSDNのフォーラムで非常に興味深い投稿があったので自分でも色々試してみた。

僕自身もDataTable.Select()メソッドはなんか変だなぁと違和感をずっと感じていた。
前もブログの記事にしたけど、

やっぱりDataTable.Select()メソッドには何かしらのバグがあるとしか思えない。

まず下のソースコードだが、フォーラムの投稿を僕の普段の環境Visual Studio 2005、.NET Framework 2.0という条件に書き直して実行してみた。

    DataTable dt = new DataTable();

    dt.Columns.Add("Column1", typeof(string)).AllowDBNull = false;
    dt.Columns.Add("Column2", typeof(string)).AllowDBNull = false;
    dt.Columns.Add("Column3", typeof(string)).AllowDBNull = false;

    // DataTable.Load などでは内部的に実行される
    dt.BeginLoadData();
    dt.EndLoadData();

    // (回避その1 → 削除しない)
    dt.Columns.Remove("Column1");

    // (回避その2 → テーブルを作り直す)
    //dt = dt.Copy();

    Random r = new Random();
    for (int i = 0; i < 1000; i++)
    {
        DataRow row = dt.NewRow();
        row["Column2"] = "";
        row["Column3"] = new string((char)r.Next('A', 'Z' + 1), 1);
        dt.Rows.Add(row);
    }

    // DataView による絞り込み
            DataView dv = new DataView(dt,"Column3 = 'C'",string.Empty,DataViewRowState.CurrentRows);
    int rowCount1 = dv.Count;
    // Select による絞り込み
    int rowCount2 = dt.Select("Column3 = 'C'").Length;
    // (回避その3 → 条件内で関数を使う)
    int rowCount3 = dt.Select("convert(Column3, 'System.String') = 'C'").Length;

    MessageBox.Show(
        string.Format(
            "1. DataView.RowFilter → {0}\r\n" +
            "2. DataTable.Select → {1}\r\n" +
            "3. DataTable.Select(2) → {2}",
            rowCount1, rowCount2, rowCount3));

MSDNの投稿にもあるように、DataTableからカラムを削除すると、DataViewにキャストしたときの件数、DataTable.Select()で取得した件数、DataTable.Select()メソッド内で関数を使った場合の件数それぞれが一致しなかった。
やはり、DataTable.Select()メソッドにはバグがあるように思えてしかたない。
普段、よく使うメソッドだけに、慎重に使用しないといけないと思い直した。

Microsoftさん。気づいていたら早急に対応して頂きたいものです。
それとも何か理由があるのだろうか??
また分かり次第、記事にしてみようと思う。

【ASP.NET】DataSet.ReadXml()のパフォーマンス向上(巨大xmlファイルの読込高速化)

ADO.NETでxmlファイルを読み込み、DataSetに格納するには、DataSet.ReadXml()を使用すると便利だが、xmlファイルが巨大化すると、時としてかなりのパフォーマンス低下が生じる。
なんかいい方法はないかといろいろ調べていたら、msdnにまさにドンぴしゃりの記事を見つけたのでメモ。

[msdn]XML からの DataSet の読み込み

非常に大きなファイルを読み込む際に ReadXml を呼び出すと、パフォーマンスが低下することがあります。大きなファイルを読み込む場合に、ReadXml のパフォーマンスを最大にするには、DataSet のテーブルごとに BeginLoadData メソッドを呼び出し、その後で ReadXml を呼び出します。最後に、次の例に示すように、DataSet のテーブルごとに EndLoadData を呼び出します。

以下の様に、DataSet.ReadXmlの前後で、BeginLoadDataメソッドとEndLoadDataメソッドを使用して処理する。

foreach (DataTable dataTable in dataSet.Tables)
   dataTable.BeginLoadData();

dataSet.ReadXml("file.xml"); 

foreach (DataTable dataTable in dataSet.Tables)
   dataTable.EndLoadData();

これでかなり大きなxmlファイルを使用するのでもものすごくパフォーマンスが向上し、読込速度が数段上がった。
BeginLoadData メソッド、EndLoadData メソッドは以下のような関数である。

DataTable.BeginLoadData メソッド
データを読み込む間、通知、インデックスの維持、および制約をオフにします。

DataTable.EndLoadData メソッド
データを読み込んだ後、通知、インデックスの維持、および制約をオンにします。

鹿児島市の災害情報他をTwitterにTweetするBotを作りました。

鹿児島市の災害情報・気象情報・市民発令情報・避難所情報をTwitterにTweetするBotを作りました。

僕自身も鹿児島市の消防団員であるということもあり、災害情報は常にチェックしてました。
鹿児島市消防局から災害情報・気象情報・市民発令情報・避難所情報をメールで配信する「安心ネットワーク119」というサービスもあります。

なんかのニュースでニューヨークの航空機不時着事故の際、Twitterが大活躍だったというのを見て、鹿児島市の災害情報もTwitterに流せないかなぁ~と思ってました。

まぁちょうど今Twitter APIに、はまってたとこだったし、ちょっと作ってみるかって感じで作ってみました。

PHPやASP.NETという選択肢もあったけど、今回はコンソールアプリを採用しました。
いわゆるコマンドプロンプト。これなら軽いしね。
コンソールアプリを作ってWindowsタスクで、10分おきに鹿児島市消防局の情報をチェックしにいき、Tweetするという流れです。

一日でも災害情報が流れない日が増えることを祈っております。

フォローはご遠慮なくお気軽に~。

【ASP.NET】C# キャッシュ(Cache)に時間制限を設ける方法

キャッシュを使用する際、時にセッションのように使用したいときがある。(時間制限という意味で)
そんなときは、CacheのInsertメソッドを使用するといい。
Cache[”key”] = object;
としがちだが、Insertメソッドが便利なので備忘録としてメモ。

//キャッシュのキー
string key; 
//キャッシュに格納するオブジェクト
object value;
//キャッシュに格納するオブジェクトとの依存関係
System.Web.Caching.CacheDependency cacheDependency;
//キャッシュからオブジェクトを削除する時間
DateTime absoluteExpiration;
//キャッシュの最終アクセスからオブジェクトがキャッシュから削除されるまでの時間
//ここでは10分で設定している。
TimeSpan timespan = TimeSpan.FromMinutes(10);

HttpContext.Current.Cache.Insert(key, value, cacheDependency, absoluteExpiration, timespan);

【ASP.NET】C# Basic認証のあるxmlファイルのダウンロード(Twitter API)

Twitter APIのようにBasic認証のあるxmlファイルのダウンロードする方法。
これまたよく忘れそうなのでメモ。

//Followしてる人のタイムラインを返すtwitter APIへのパス
string twitPath = "http://twitter.com/statuses/friends_timeline.xml";

//Basic認証情報をインスタンス化
System.Net.NetworkCredential nc = new System.Net.NetworkCredential("ユーザー名","パスワード");
System.Net.WebClient wc = new System.Net.WebClient();

//Basic認証情報のセット
wc.Credentials = nc;

//TwitterAPIからXMLファイルをダウンロード
wc.DownloadFile(twitPath, @"download.xml");
wc.Dispose();

【ASP.NET】C# webからファイル(html,txt,画像jpg,gif等)を取得(ダウンロード)する方法

よく使う処理だが、たまに忘れるなのでメモしておく。

ASP.NET C#を使って webからhtmlファイルのソースやtxtファイルの中身を取得する方法。

//WEBからファイル取得
System.Net.WebClient wc = new System.Net.WebClient();
byte[] pageData = wc.DownloadData("対象のURL");
wc.Dispose();

//UTF8にエンコードして文字列(ソース)を取得
string text = Encoding.UTF8.GetString(pageData);

次に画像ファイル(jpg,gif,png)やその他のファイルを、ローカルにダウンロードして保存する方法

//WEBからファイル取得
System.Net.WebClient wc = new System.Net.WebClient();
wc.DownloadFile("対象のURL",@"保存するローカルパス");
wc.Dispose();

【ASP.NET】VB.NETをC# C#をVB.NETにコード変換してくれるコードコンバーター

また便利なサイトを見つけたのでメモ。
僕自身はC#を使ってコーディングしている訳だが、ASP.NETの技術記事を検索すると、たまにVB.NETで記述されている記事を見かける。
なんとなく漠然とは理解できるが、C#で書いてくれてたらなぁ~と思うことがしばしば。
VB.NETをC#に変換してくれるサイトとかないのかなぁ~と思ってたら見つけたのでメモ。

Convert VB.NET to C#

逆にC#からVB.NETへの変換も出来る。
タブがあるのでそちらで切り替えてもOK.
Convert C# to VB.NET

【ASP.NET】C#冗長なViewStateをすっきりとSessionで管理する方法

ASP.NETでは、自動で、ページの状態を保持するViewStateがhtmlタグの
<input type=”hedden”>によって吐き出される。
ポストバックが起きて画面が変わっても、状態を保持しているため、細かい設定などしなくても入力値などが保持される。
しかし、GridView等で一覧を作った時など、このViewStateがかなりの長さになって出力に時間がかかったりすることがある。
実際に、仕様上どうしても数百件のデータをページング無しでGridView出力しないといけない画面があり、この画面のViewStateは数千行になった経験がある。
このViewStateをクライアントサイドに出力するのではなく、なんとかサーバーサイドに(Sessionとして)保持出来ないか、調べてみたところ、ASP.NET2.0ではViewStateを保持するSessionPageStatePersisterクラスというのがあるとのこと。
早速テストして試してみた。

まず新規のクラスファイル(SessionPageStateAdapter.cs)を作成し、以下のコードを記述。
これをApp_Codeフォルダに保存。

public class SessionPageStateAdapter :
    System.Web.UI.Adapters.PageAdapter
{
    public override PageStatePersister GetStatePersister ()
    {
        return new SessionPageStatePersister(this.Page);
    }
}

次に「ASP.NETフォルダの追加」で「App_Browsers」フォルダを作成。
そのフォルダの中に「App.browser」ファイル(ファイル名はなんでもいい)を作成し、以下のコードを記述。
この「browser」ファイルだが、各ブラウザごとにいろいろと設定を記述することが出来るファイルらしい。(初めて使用した)


  
    
      
    
  

以上の操作だけで、全画面のViewStateの出力がすっきりとし、パフォーマンス的にはいいんじゃないだろうか?
まぁ、まだテスト段階の使用なので問題などあれば追記していこうと思う。
このSessionPageStatePersisterクラス、将来的にはデフォルト使用されるようになる気がする。

参考サイト
ビュー ステート: 沈黙のパフォーマンス キラー
[.NET] ViewStateをセッションに保存する

【ASP.NET】C#DataTableの中身をdistinct(グルーピング)する方法

DataTableで重複データがあるときに重複を除去するため、distinctというか、グルーピングする方法は以下のようにする。

DataTable dtUnique = dtMyTable.DefaultView.ToTable(true, "Column1", "Column2");

これで、”Column1″, “Column2″ でグルーピングしたデータテーブルが帰ってくる。

プログラミングC#―C#2.0/.NET2.0/Visual Studio2005対応

著者/訳者:ジェシー リバティ

出版社:オライリージャパン( 2006-02 )

定価:¥ 5,040

単行本 ( 645 ページ )

ISBN-10 : 4873112648

ISBN-13 : 9784873112640