Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

「わんくま同盟 東京勉強会 #90」に行ってきた(その2「ASP.NETで株価チャートを作る」by XENOさん)

f:id:JHashimoto:20140409044240j:plain

6/7に「わんくま同盟 東京勉強会 #90」に行ってきました。途中で帰らなければならなかったので、全部のセッションは聞けなかったのですが、2回に分けて勉強会の内容を紹介します。

わんくま同盟
先月はゴールデンウィークいかがでしたか? 今回はスピーカーデビューの方もゲームに関する楽しいセッションをやってくれるそうです。 ASPやMVPなんかのセッションもあれば、数学っぽいセッションもアリ。今回も皆さんと一緒に楽しいひとときを過ごしましょう。...

 

今回は2回目です。4つ目のセッション(ustreamで視聴しました)はXENOさんの「ASP.NETで株価チャートを作る」でした。

Blogに投稿した「ASP.NETで株価チャートを作る」シリーズのダイジェスト版だそうです。

xeno00 | Xeno's Labo

セッション内容

作成したもの

  • 上の画面
    • ローソク足
    • 移動平均
    • 出来高の棒グラフ
  • 下の画面で操作すると、上の画面のグラフが変わる

チャートコントロール

  • 画像生成しかしない。アニメーションはできない
  • リファレンスでは.NET4からになっているが、実際は3.5 SP1から使える
  • ツールボックスの[データ]のカテゴリにチャートコントロールがある
  • 表示するデータをDataTableに設定してバインドする

ローソク足

  • DataTableのカラム名を以下の順番でカンマ区切りで指定する
    • 高値、安値、始値、終値
Chart1.Series("Price").YValueMembers = "high_v.low_v,begin_v,end_v";

テクニカル指標の追加

  • DataManipulatorクラスのFinancialFormulaメソッドで系列を作成
  • 作成できる指標はMSDNを参照

財務に関する式
ここでは、グラフ コントロールがサポートする財務に関する式を紹介します。 ...

関連エントリー

「わんくま同盟 東京勉強会 #90」に行ってきた(その1「きっと怖くないMVVM&MVPVM」by 暁 紫電さん) - プログラマーな日々

 

「第一回 knockoutjsハンズオン」に行ってきた(その2「ASP.NETの変遷とKnockout.js」by 日本マイクロソフト松崎剛さん)

f:id:JHashimoto:20140409044240j:plain

5/17に、「第一回 knockoutjsハンズオン」に行ってきたので、6回に分けて勉強会の内容を紹介します。

初心者向けJavaScript入門からテラ・コーティングまで!JavaScriptフレームワークの主流、MVVMアーキテクチャパターンを採用しているknockoutjsを堪能する! : ATND

 

今回は2回目です。2つ目のセッションは、日本マイクロソフト松崎剛さんの「ASP.NETの変遷とKnockout.js」でした。

セッション内容

時代変遷とASP.NET Webフレームワーク

  1. ASP.NET Webフォーム(現在も非推奨というわけでははない)
  2. ASP.NET MVC(現在も非推奨というわけではではない)
  3. ASP.NET SPA
  • 背景
    • ハイパワーなクライアント
    • リソースの有効配分
    • Web標準の発展
    • 表現力の飛躍的的向上
  • 技術
    • Ajax
    • オフライン
    • LocalStrage

デモ

  •  スキャフォールディングでWeb APIを作成する

Knockout.js 3.1

  • パフォーマンスの向上
  • rateLimit extender
    • rateLimitで指定した時間が経過すると一回画面更新。後の変更も後から描画される
  • jQueryのロードタイミングの変更(依存性の低減)
  • valueAllowUnset
  • ko.computedContext
  • arrayユーティリティメソッドにおけるindex渡し
  • __proto__はfnを使用

セッション資料

ASP.NETの変遷とKnockout.js

解説資料

rateLimitの解説資料です。

Knockout.js の依存の更新タイミングと rateLimit #html5biz - 松崎 剛 Blog - Site Home - MSDN Blogs
Knockout.js では ViewModel の更新 (update) がおこなわれると、関連する subscribable (obervable, computed, あるいは custom function など) に更新を伝搬します。この更新について、KnockoutJS ハンズオンで触れた rateLimit がどのように使えるか、こちらのブログでコードも含めて紹介しておきます。 ...

リンク

第1回のリンクです。

「第一回 knockoutjsハンズオン」に行ってきた(その1「JavaScript入門」by 坂巻瑞穂さん) - プログラマーな日々

 

第3回のリンクです。

「第一回 knockoutjsハンズオン」に行ってきた(その3「プロジェクトにMVVMを適用する狙い」by 河内俊浩さん) - プログラマーな日々

 

第4回のリンクです。

「第一回 knockoutjsハンズオン」に行ってきた(その4「タイトル未定」by 田中豪さん) - プログラマーな日々

 

第5回のリンクです。

「第一回 knockoutjsハンズオン」に行ってきた(その5「knockoutでグラフを描こう!Viewを極めるMVVM」by 鈴木健太さん) - プログラマーな日々

 

第6回のリンクです。

「第一回 knockoutjsハンズオン」に行ってきた(その6 ハンズオン) - プログラマーな日々

 

Web.configの先頭に改行があると500内部サーバーエラーが発生する

どういうこと?

Web.configの先頭に改行があると、500内部サーバーエラーが発生します。

f:id:JHashimoto:20140419091829p:plain

XMLの仕様で、先頭の改行を許可していないからです。

最初の行はXML宣言です。使用するXMLバージョン(1.0)と エンコーディング(ISO-8859-1 = Latin-1/West European 文字セット)を定義します。

XML Tree

どうすれば?

Visual Stuidioで編集すれば、誤って先頭に改行を入れてしまってもすぐに気付けます。

f:id:JHashimoto:20140419090806p:plain

運用環境のためテキストエディタを使っていたので、気付くのに時間がかかってしまいました。ご注意ください。

【ASP.NET】Postback時にチェックボックスの状態を変更しようとすると「'length' は Null またはオブジェクトではありません。」のエラーが発生する

ASP.NETで、Postback時にチェックボックスの状態を変更しようとすると「'length' は Null またはオブジェクトではありません。」というエラーが発生しました。(チェックボックスがかなり多い画面です)

原因がわかったので、トラブルシュートの経緯を書き残しておきます。

MaxRequestLengthを超えてしまっているのでは?

最初に疑ったのは、ViewStateが大きすぎてMaxRequestLengthを超えてしまっているのでは?ということでした。

.NET 開発日記 » Blog Archive » ビューステートが大きすぎて12031エラーが発生。
G社のSpreadツールを用いてCheckBox付の業務一覧を表示していたが、ある日Scriptエラーが発生し、ボタン操作が不能になるという問い合わせが来た ...

 

しかし、MaxRequestLengthの設定値を大きくしても、現象は変わりませんでした。

Requestに含まれるフォームキーの上限を超えているのが原因だった 

次にエラーが出た状態で、画面遷移しようとしてみました。

すると、以下のエラーが発生しました。

Message:オブジェクトの現在の状態に問題があるため、操作は有効ではありません。
StackTrace: 場所 System.Web.HttpValueCollection.ThrowIfMaxHttpCollectionKeysExceeded()
場所 System.Web.HttpValueCollection.FillFromEncodedBytes(Byte[] bytes, Encoding encoding)
場所 System.Web.HttpRequest.FillInFormCollection()

"ThrowIfMaxHttpCollectionKeysExceeded"という、わかりやすい名前のメソッドで例外がスローされていたので、このメソッド名で検索してみました。

そして、以下のフォーラムがヒットし、最終的にKBにたどり着きました。

URL にエンコードされたフォーム データが有効ではありません - Visual Basic - Visual Studio User Group
多くのフォーム キー、ファイル、または JSON ペイロード メンバーを含む ASP.NET 要求が例外が発生して失敗する
Microsoft セキュリティ更新プログラム MS11-100 は、HTTP 要求内のフォーム キー、ファイル、および JSON メンバーの最大数を 1000 に制限します。この変更のために、ASP.NET アプリケーションは、1000 を超えるこれらの要素を含む要求を拒否します。 ...

 

KBを読んで、Web.configに以下の設定を追加し、MaxHttpCollectionの上限を変更すればいいことが、わかりました。

<add key="aspnet:MaxHttpCollectionKeys" value="2000" />

詳細な説明

MaxHttpCollectionの上限は、hashdosと呼ばれる攻撃に対応するために配布されたセキュリティ更新で導入されたものです。

(1000という上限は攻撃に必要なパラメータ数を下回ります)

ほとんどのWebサーバーに影響するメジャーなサービス拒否脆弱性
ASP.NETのパッチは、12月29日に提供されている。このパッチは、デフォルトサービスポリシーのWindows Azureの顧客には自動的に適用される。このパッチは、単一のPOSTフォームフィールド数を、サービス拒否の攻撃に必要な数を下回る1,000に制限する。 ...

hashdosについて

hashdosについては、以下のサイトが詳しいです。

Webアプリケーションに対する広範なDoS攻撃手法(hashdos)の影響と対策 | 徳丸浩の日記
これによると、PHPをはじめとする多くのWebアプリケーション開発プラットフォームに対して、CPU資源を枯渇させるサービス妨害攻撃(DoS攻撃)が可能な手法が見つかったということです。この攻撃は、hashdos と呼ばれています。 ...

 

hasdos攻撃が成功した場合の影響について引用します。

DoS攻撃の最中はCPU資源が攻撃に割り振られてしまい、サービスの提供が困難になると考えられます。Apache Killerと異なり、メモリ資源が枯渇するわけではないので、攻撃がやめば直ちにサービスは回復するようです。

参考サイト

Mikeのプログラミング・メモ: ASP.NETのセキュリティパッチ適用でエラー「Operation is not valid...」が発生する場合の対処

 

イベントハンドラはprotectedにしないとマークアップからは参照できない

イベントハンドラはprotectedにしないとマークアップのクラスからは参照できません。
ButttonコントロールのClickイベントを例として説明します。

どういうこと?

  1. ビハインドコードにイベントハンドラ(Button_Click)を作成し、アクセス修飾子をprivateまたはinternalにします。
  2. マークアップのコードに以下のように記述します。
<asp:Button ID="Button1" Text="Button" OnClick="Button_Click" />
  1. 実行すると、"CS0103: 名前 'Button_Click' は現在のコンテキスト内に存在しません。"の例外が発生します。

どうして?

aspxのクラスはビハインドコードのクラスを継承しています。Hoge.aspxだとすると、継承関係は以下のようになります。
Hoge.aspx → Hoge.aspx.cs → System.Web.UI.Pageクラス

どうすれば?

  • アクセス修飾子をprotectedにします。publicでも参照できますが、スコープはできるだけ限定します。

または、

  • ビハインドコードのクラス内で完結するようにします。
Button1.Click += Button_Click;

Evalの戻り値をメソッドの引数にする場合は明示的にキャストしなければならない

Evalの戻り値をビハインドコードのメソッドの引数にしたいことがあります。
例えば、以下のようなメソッドをマークアップから呼び出す場合です。

/// <summary>
/// コードから表示文字列を取得します。
/// </summary>
/// <param name="value">コード。</param>
/// <returns>変換された文字列。</returns>
protected string ConvertCodeToText(string value) {
    switch(value) {
        case "01":
            return "hoge";
        case "02":
            return "fuga"; 
        default:
            return "piyo";
    }
}

この場合、マークアップを次のように書くと、実行時エラーになります。

<asp:Label ID="Label1" runat="server" Text="<%# ConvertCodeToText(Eval("id")) %>" />

次のように明示的にキャストする必要があります。

<asp:Label ID="Label1" runat="server" Text="<%# ConvertCodeToText((string) Eval("id")) %>" />

DataBinder.Evalメソッドの戻り値がObject型だからですね。

DataBinder.Eval メソッド (Object, String) (System.Web.UI)
実行時にデータ バインド式を評価します。