2015-02-06 今日のGlyphとLv10になった

会社を19:30頃出発。

ローソンでフライヤーを10枚印刷。

ドリプラでハックしていると、
昨日も遭遇した緑エージェントさんと再度出会う。

後、青のLv5エージェントさんをキャプチャ。
初フライヤー渡し。

Hack数:57
ポイント:389
累計ポイント:3482


まだやりたりないので静岡市街へ

ハックしたりワンコしたり、青エージェントさんを
リアルキャプチャしたりして、終わると2:00。

ハック数の記録はとり忘れたけど。
累計が4000くらいにはなってたので、
大分ハックしたとおもう。
フライヤーも2枚渡せて良かった。


最後にLv10になりました。

Disk2Vhdのコマンドラインでシステムで予約済みパーティションを含めつつドライブ指定をする

Windows Server 2008にはシステムで予約済みとかいう領域が勝手にできる。
この環境でVHDに含めたくないドライブがある場合、Disk2Vhdのコマンドラインが使えない。
しょうがないのでUWSCで実行した。

Option Explicit
//==============================================================================
//   Disk2vhd自動化スクリプト
//   Disk2vhdのコマンドラインだとSystem Reservedを指定できないのでUWSCにて実行
//   (アスタリスクもあるが、VHDに入れたくないドライブがある場合に対応できない)
//------------------------------------------------------------------------------
//   13.06.06 shey_nassy 新規作成
//==============================================================================
//============================================================
//   設定
//============================================================
//disk2vhdフルパス
CONST C_D2V_PATH = "C:\Documents and Settings\SheyNassy\デスクトップ\Disk2vhd\disk2vhd.exe"
//VHDファイル保存ディレクトリ(末尾\無し)
CONST C_VHD_DIR  = "F:\VHD"
//VHDファイルプレフィックス
CONST C_VHD_PREFIX = "bkup_vhd_"
//バックアップ対象ドライブ(例.aryBackUpDrive[] = "C:\","D:\")
Dim aryBackUpDrive[] = "C:\"
//============================================================
//   定数
//============================================================
//チェックボックス状態
CONST C_CHECKBOX_NULL    = -1
CONST C_CHECKBOX_OFF     =  0
CONST C_CHECKBOX_ON      =  1
CONST C_CHECKBOX_INVALID =  2

//ドライブレター用文字定数
CONST C_CHAR_C = 67
CONST C_CHAR_Z = 90
//============================================================
//   メイン処理
//============================================================

Dim WindowId=Exec(C_D2V_PATH)
If WindowId < 0 Then
   WindowId = GetId("Disk2vhd - Sysinternals: www.sysinternals.com","Disk2VhdClass")
   If WindowId < 0 Then
      ExitExit
   EndIf
EndIf

//VHDファイル名
GETTIME()
Dim strVhdFileName = C_VHD_DIR + "\" + C_VHD_PREFIX + G_TIME_YY4 + G_TIME_MM2 + G_TIME_DD2 + ".vhd"
sendstr(WindowId,strVhdFileName,1,TRUE)

//不要なドライブノチェックをはずす
Dim DriveIdx
Dim DriveLetter
Dim BackUpDriveIdx
For DriveIdx = C_CHAR_C to C_CHAR_Z
   DriveLetter = ChrB(DriveIdx) + ":\"
   For BackUpDriveIdx = 0 to Length(aryBackUpDrive) - 1
      If DriveLetter <> aryBackUpDrive[BackUpDriveIdx] Then
         CheckOff(WindowId,DriveLetter)
      EndIf
   Next
Next


//実行
//clkitem(WindowId,"Create",CLK_BTN)

//処理終了待ち合わせ
//未実装


//終了
//clkitem(WindowId,"Close",CLK_BTN)
//============================================================
//   チェック解除
//============================================================
Procedure CheckOff(pWindowId,pTitle)
   Dim strCheckStatus
   strCheckStatus = clkitem(pWindowId,pTitle,CLK_LSTVEW)
   
   If strCheckStatus = C_CHECKBOX_ON Then
      //Check Off
      CLKITEM(pWindowId,pTitle,CLK_LSTVEW)
      //クリックで選択しかされないのでスペースを送る
      SCKEY(pWindowId,VK_SPACE)
   EndIf
Fend

//============================================================
//   Memo
//============================================================
//【起動オプション】
//オプションなしでスクリプト名と引数を指定した場合は、スクリプトを実行し、実行後はUWSC本体を終了します。
//UWSC.exe スクリプト名 [引数...]
//
///L
///L オプションを付けると、実行はせずに、UWSC本体にファイルを読み込ませるのみとなります。
//UWSC.exe /L スクリプト名 [引数...]
//
///K
///K オプションを付けると、スクリプトを実行し、実行後はUWSC本体を起動したままにします。
//UWSC.exe /K スクリプト名 [引数...]
//

無効な viewstate です。に苦戦

元々、windows server 2003 IIS6.5で動いてるシステムを
windows server 2008 R2 IIS7.5に移植した時のお話。

稼動して半日、お昼休み明けに大量のExceptionが発生!!

System.Web.UI.ViewStateException: 無効な viewstate です。
System.Web.HttpException: viewstate MAC の検証フィールドです。このアプリケーションが Web Farm またはクラスタによってホストされている場合、<machineKey> 構成が同一の validationKey および検証アルゴリズムを指定していることを確認してください。AutoGenerate をクラスタで使用することはできません。

クラスタなんてしてないし、どうしたものかと。。。

現象を再確認

  1. 出力されるExceptionは上記2つ
  2. 作業し続けるとエラーは出ずに、30分以上放置してから再度画面を触るとエラーが発生
  3. POST時のみ
  4. でない場合もある

解決方法


IISのアプリケーションプールを「DefaultAppPool」から「Classic .NET AppPool」に変更する





解決に至るまで

  • MAC検証無効でよくね?

検証エラーのViewState受け入れちゃダメでしょ、とつっこまれこの手は使えず
チナミニ、下記みたいな注意もあるので、これは安易に手をつけなくて良かったかもしれない。

重要 : 問題の診断に役立てるときにだけ、ビューステートの MAC 機能をオフにしてください。ビューステートの MAC をオフにしたままにして問題を回避しないでください。そうした場合は、セキュリティ ホールをもたらす可能性があります。詳細については、以下の MSDN Web サイトを参照してください。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpdnaspp/htm/SecNetch08.asp

  • 時間が立つとでるエラーだから、クッキーやらアイドルセッションやらの時間延ばせば。。。

意味無かった。。。

  • formタグにactionとかあるんじゃ

ソース見たけどそんなものは無かった

終わってみて

なんかすごい時間掛けて調べた割りに、やってみれることは少なかった。
このエラーがでて困っている人がいたら。


まずはここをみて切り分けてみたり

@IT:.NETエンタープライズWebアプリケーション開発技術大全 Webアプリケーションの状態管理
クラスタならこの辺がんばるらしいし
(僕はクラスタでは無いのでろくに見てないけど)

何?このエラー ( ホームページ ) - とあるプログラマーのグチ - Yahoo!ブログ
formタグにactionとか書いてないか見直してみたり


それでも直らないなら、アプリケーションプール変えて見るといいかもね

CPU使用率の監視の設定とテスト

遅々として進まないZabbixの設定
なんか優先度上げにくい感じがなぁ

そんな中、今日はCPU使用率の監視とテストをしました。

アイテム

トリガー

テスト

下のコードをtest.jsとかにして実行する。

var x = 0;
var y = 0;

for (i = 0; i < 10000000; i++){
   x = 0.000001;
   y = Math.sin(x);
   y = y + x;
}
WScript.echo("END");

CPUのコア数分実行すると、数分間CPU使用率が100%に張り付いてくれる。
途中で止めたいときはWScript.exeのプロセスを止めてあげる。

またしばらくZabbixと戯れる時間は取れそうもないなぁ

DataGridViewのコピペで苦戦


DataGridView上でコピペしたい!!と言われました。
で、ためしに「Ctrl+C」「Ctrl+V」してみたけど何もおこらない。
むぅ、しょうがないので、「Ctrl+V」が押されたらイベントを発火する
ユーザーコントロールを作ってみました。

MyDataGridView.vb

Public Class MyDataGridView
    Inherits DataGridView
    ''' <summary>
    ''' ペースト後のイベント
    ''' </summary>
    Public Event AfterPaste As EventHandler


    Private Sub MyDataGridView_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        'ペーストの時
        If e.Control = True And _
           e.KeyCode = Keys.V Then
            Me.SelectedCells(0).Value = Clipboard.GetText
            RaiseEvent AfterPaste(sender, e)
        End If
    End Sub
End Class

で、呼出元で

    Private Sub MyDataGridView1_AfterPaste(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyDataGridView1.AfterPaste
        Dim tmpDgv As MyDataGridView = DirectCast(sender, MyDataGridView)
        Dim intLastIdx As Integer = tmpDgv.Rows.Count - 1
        If String.IsNullOrEmpty(tmpDgv.Rows(intLastIdx).Cells(0).Value) = False Then
            tmpDgv.Rows.Add()
        End If
    End Sub

としてみたのですが・・・

なぜか、新規行が一番下に追加されない。。。
で、ぐぐってみると
http://social.msdn.microsoft.com/Forums/ja-JP/vbgeneralja/thread/f1424a11-08a1-4e3e-88a3-64177f5534c0/

素敵なことが書いてありました。

結局呼び出し元を下のようにして解決

    Private Sub MyDataGridView1_AfterPaste(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyDataGridView1.AfterPaste
        Dim tmpDgv As MyDataGridView = DirectCast(sender, MyDataGridView)
        Dim intLastIdx As Integer = tmpDgv.Rows.Count - 1
        tmpDgv.BeginEdit(True)
        tmpDgv.NotifyCurrentCellDirty(True)
        tmpDgv.EndEdit()
    End Sub

これ、でも、CellValidatingが呼び出されていない感じ
1行ずつしかコピペしないなら最後にDataGridView.BeginEdit(True)呼べばいいかなぁ
この点についてはもう少し調べないとな。

Excelの数字が文字になっているのを数字に戻す賢い方法を見た


こんな風に数字が文字列になっている時に、列全体を数値にしたい時って結構ありませんか。

今までのやり方

  1. セルの書式を「数値」に変える
  2. 列全体をコピー
  3. テキストエディタに貼り付け
  4. テキストエディタの文字を全コピ
  5. Excelに貼り付け

ってやってました。

今日会社の人がやってた方法

  1. 文字列になっってる列の隣に列を新規に挿入
  2. 数式で「=A1*1」※A列が文字列になっちゃってるとして
  3. 連続コピー

ってやってるの見た。

賢いなぁ