Kobarin's Development Blog

C#やASP.NETなどについての記録です。

ObjectDataSourceからクラスを呼び出してバインドする

Repeater等のデータリスト系コントロールから、データソースとしてObjectDataSource(以降ODS)を指定した際にクラスを呼び出す方法です。


私個人のやり方ですが、SQL文の定義を1つに集約するため、最近はSqlDataSourceやODSを個別に定義せず、クラスをObjectDataSourceから呼び出しています。
以下にサンプルを示します。
まずRepeaterのデータソースにODSを指定します。
ODSではFruitsクラスのItemsメソッドを呼び出し、パラメータに色タイプ(colorType)としてRedを指定しています。
Itemsメソッドでは、FruitクラスをGeneric化し返しています。

<asp:Repeater ID="rp1" runat="server" DataSource="ods1">
  <HeaderTemplate><ol></HeaderTemplate>
  <ItemTemplate>
    <li><%# Eval("Name") %>(<%# Eval("Price", "{0}円") %>)</li>
  </ItemTemplate>
  <FooterTemplate></ol></FooterTemplate>
</asp:Repeater>
<asp:ObjectDataSource ID="ods1" runat="server" SelectMethod="Items" TypeName="Products.Fruits">
  <SelectParameters>
    <asp:Parameter DefaultValue="Red" Name="colorType" Type="String" />
  </SelectParameters>
</asp:ObjectDataSource>

クラス

namespace Products
{
  public class Fruits
  {
    public Fruits(){ }
    public List<Fruit> Items(string colorType)
    {
      List<Fruit> fruits = new List<Fruit>();
      switch(colorType)
      {
        case "Red":
          fruits.Add(new Fruit("Apple", 100);
          fruits.Add(new Fruit("Cherry", 250);
          break;
        case "Yellow":
          fruits.Add(new Fruit("Banana", 200);
          fruits.Add(new Fruit("Pineapple", 400);
          break;
        default: break;
      }
      return fruits;
    }
  }

  public class Fruit
  {
    public Fruit(string name, int price)
    {
      Name = name;
      Price = price;
    }
    public string Name{ get; set; }
    public int Price{ get; set; }
  }
}

実行結果

1. Apple(100円)
2. Cherry(250円)

タスクマネージャーをGoogleリーダーで代替

Googleリーダーを利用してスケジューラーにしてしまおう」という記事です。



当方の環境では、タスクマネージャーで定期的(月次、週次、日次、毎時)にスケジュールさせているコンソールアプリケーションがありますが、やり方が悪いのか、未だに結構トラブルが多いです。

知らない間に実行されていない事もありますし、実行形式のファイルなのでバグが見つかった場合、コンパイルし直してexeファイルをサーバーに置いてやったりしなくてはならない等、asp.netに比べると使い勝手が悪いと感じています。



そこで表題の件になりますが、要は「定期的に実行する」事さえ出来ればいいわけで、必ずしもタスクスケジューラーに依拠する必要はないと考えました。というか実践済み。



そこで当方が考えたのが、表題の件になりますが、Googleリーダーで呼び出してやる方法です。
Googleリーダーの説明をしますと、クラウド型のRSSリーダーで、フィードのアドレスを指定しておくと、定期的にアクセスし、新規の記事を蓄積してくれるサービスです。



RSSだけでしょ?」と思われるかもしれませんが、asp.netXMLの出力形式に対応しているため、(擬似的に)RSSとして振る舞う事も可能なのです。

この性質を利用して、asp.netページにC#VB.NETでプログラムを記述し、RSSに準拠した出力を行い、Googleリーダーにフィード登録しておけば、スケジューラーの設定をするまでもなく、Googleが勝手に読み込んでくれる事になります。



更に付加的な機能として、フィードのtitleやdescriptionに結果データ(処理件数やエラー内容など)を書きだすようにしておけば、Googleリーダーを通して結果報告を知る事も出来て、面倒なメール通知などの機能を盛り込む必要さえなくなります。



以下、メリット・デメリットをまとめました。

メリット

  1. スケジューラーの設定・管理をせずに済む
  2. 記述の慣れたasp.netでプログラムを書ける
  3. プログラムの更新の際に、サイトのaspxファイルを書き換えるだけで良い
  4. エラー時も、web.configのcustomerrors等で定義しておけば、メール通知等可能
  5. Googleリーダーを通じて出力結果を参照できる
  6. AndroidiPhoneのアプリには、googleリーダーに対応したRSSリーダーがあるため、スマフォやタブレットで結果を確認・共有できる

デメリット

  1. 実行時間が長くかかる処理だと、Googleが読み込んでくれない可能性がある
  2. フィードを読み込むタイミングを設定できないため、例えば日次処理などの場合、何度も実行される事があっても、不具合のないようにプログラムを書く必要がある(例:当日実行済みならその日は処理しない…等)
  3. 原則、public公開されるため、RSSに吐き出す内容には極秘情報は入れられない(メールで送信すればいいんですが)
  4. 当然ですが、DBの処理等をする場合、アクセス権を適切に設定する必要がある(原則、全てストアドプロシージャで実行させるのが安全でしょう)

特に重要になるのは、デメリットの1と2あたりでしょうか。
しかし定期的にレコード件数をDBに書きだすとか、そういった類の処理にはうってつけだと思いますが、いかがでしょうか。

また、Googleリーダーの巡回以外のIPアドレスasp.netページへのアクセスを遮断しちゃえばよりセキュアになる気もしますが、まー面倒でしょう。


サンプルプログラムなんかも載せたかったのですが、時間がないのでここまで。リクあれば載せます。
その他ご意見等あれば、コメントお願いいたします。

Windows Server 2008におけるタスクの設定

タスクスケジューラーで毎日あるいは毎時実行するはずのタスクが実行されず、履歴にも実行された形跡がないため、改めてタスクスケジューラーの設定を見直します。
参考にしたのはTechnet「タスクの設定( for WinServer2008 and Vista)」です。
http://technet.microsoft.com/ja-jp/library/cc722178(WS.10).aspx


とりあえず以下の設定で週末運用し、来週確認してみようと思います。黒く塗りつぶした箇所がチェックONを表します。


■タスクを要求時に実行する
□スケジュールされた時刻にタスクを開始できなかった場合、すぐにタスクを実行する
□タスクが失敗した場合の再起動の間隔
■タスクを停止するまでの時間
■要求時に実行中のタスクが終了しない場合、タスクを強制的に停止する
□タスクが再度実行するようにスケジュールされていない場合に削除されるまでの時間
・タスクが既に実行中の場合に適用される規則
 ○新しいインスタンスを開始しない
 ○新しいインスタンスを並列で実行
 ●新しいインスタンスをキューに追加
 ○既存のインスタンスの停止

SQLのINSERT文とUPDATE文の相互変換

プログラムで作りました。
http://nfs.jp/tools/dev/sql_replace.aspx

SQL文のINSERTかUPDATEのいずれか一方を記述し、残る一方を自動変換・置換するサービスです。

プログラムやDBサーバーのストアドプロシージャ作成をしていると、 INSERT文を書いた後にUPDATE文を書く(その逆も然り)場面が多々あります。
しかし実際、カラム名は勿論、値として渡すパラメータ名もほぼ同じである事が多く、重複作業になりがちです。

一見コピペで済むようでも、実際にはINSERTはカラムの連続を記述した後に値の連続を記述するのに対し、UPDATEは「カラム=値」のセットを連続させるため、単なるコピペでは処理できません。

当サービスは、こうした問題を解決するために用意されました。

Gmailで、(件名なし) (送信者不明)メールをフィルタで削除

以前よりずっと課題だったフィルタが解決したのでメモ。


Gmail(というかGoogle Apps)で受信したスパムメールは通常、そのままスパムフォルダに送られます。ただ当方の場合、1日にして数十通の頻度で、「件名なし、送信者不明」のメールが届き、これがGmailスパムフィルタで制御できない問題が続いていました。


Googleのフォーラムの件名・本文が全くないメールのフィルタ方法にもありますが、一般的に解決されていないようです。

フィルタ例

そこで当方が考えたのが、このフィルタです。

フィルタ : -(to:.jp OR to:.com)

基本的にこれでフィルタは有効になりました。
後は削除なりフォルダに移動なり、自由にルールを決めて下さい。
それと当然ですが、当方は自社ドメインとしてJP、Gmail用にCOMドメインを持っているためこうしたフィルタですが、INFOやNETもお持ちの方は以下のようになります。

フィルタ : -(to:.jp OR to:.com OR to:.info OR to:.net)

解説

ドメインにも依存しますが、今回悩んでいたメールは、fromとsubject以外にもtoも空の状態であったため(bccで届いていたのでしょうか)、あらかじめ絞り込みが可能なtoに着目しました。
なぜなら、toは自アドレスであるため、そのドメイン或いはトップレベルドメインを指定できる為です。

意味

  1. 「.jp」で終わるドメイン、または「.com」で終わるドメイン宛てのメールを抽出。
  2. 「(」と「)」で囲む事でグループ化
  3. 先頭に「-」を置くことで否定となる。従って「.jpか.comを宛先としないメールをフィルタ」となる。

これで毎朝の(件名なし)メールの削除作業から解放される……

飲食店に関わる統計情報の歴史

飲食店に関する統計データが欲しくて探していたら、元々は商業統計に含まれていたらしいのですが、現在は経済センサスに移行した事がわかったので、ちょっとメモしときます。


ちなみに、経済センサス基礎調査は、業態や開設時期・従業員数など、事業所・企業統計に含まれる項目が多いようです。一方、活動調査に関しては、事業内容や売上や費用といった、商業統計に近い項目が含まれているようです。


雇用政策や産業構造の実態調査にも転用されるらしく、かなり包括的な調査資料のようです。
経済センサス総合ガイド解説ページまで用意されています。


さて、飲食店データの経緯を示します。
下表では、○は調査実施した(或いは、これから行う)事を示し、●は飲食店データが含まれている事を示します。
なお、先程調べたばかりのメモ程度の情報ですので、自己責任をご了承の上で参考にして下さい。

商業統計 サービス業
基本調査結果
経済センサス
基礎調査
経済センサス
活動調査
S47 ○● . . .
S49 ○● . . .
S51 ○● . . .
S54 ○● . . .
S57 ○● . . .
S60 ○● . . .
S63 ○● . . .
H03 ○● . . .
H06 ○● . . .
H09 ○● . . .
H11 ○● . .
H14 . . .
H16 ○●
調査廃止。
経済センサス創設。
. .
H19 . . .
H21 . . ○● .
H24 . . ○●

家計に占めるネットショッピングの金額の割合

商業統計の小売業販売額が、どの程度ECによって影響を受けているのかを調べたくなったので、
家計支出に占めるネットショッピング金額の割合を調べてみた。


H14で0.3%だったのがH19時点で0.9%のようだ。
ネットショッピングの状況 −「情報化月間」にちなんで−(「家計消費状況調査」及び「社会生活基本調査」の結果から)


この他、家計消費状況調査のExcelファイルをDLして最新のH22を見た所、1.2〜1.3%。確実に増えてはいるものの、まだまだ商業統計の数値から割り引いて考える程の影響ではないという印象。
一方、金額的には年間で50,000円程度で、月額4,000円強。