佐々木屋

技術的なことから趣味まで色々書きます

ポストバック判断まとめ(備忘)

なんか同じこと何回も調べるので備忘。
初回実行時、フルポストバック、パーシャルポストバックのまとめ表。

※〇:True  ✕:False

項目 IsPostBack IsInAsyncPostBack
初回実行時
パーシャル
PostBackTrigger
submit

UpdatePanelからのPostBackを判断する方法

UpdatePanel利用でConditionalモードのポストバックで、通常のフルポストバックと(submit)とパーシャルポストバックを見分ける方法です。
ScriptManagerのIsInAsyncPostBackプロパティを利用します。

ScriptManager1.IsInAsyncPostBack;
//true:パーシャルポストバック
//false:フルポストバック


なお、マスターページにScriptManagerを配置した場合は、FindControlでScriptManagerコントロールを見つけてキャストする方法になりますが、結構面倒なのでマスターページにプロパティメンバーを追加する方が良いです。

public bool IsInAsyncPostBack {
   get {
      return ScriptManager1.IsInAsyncPostBack;
   }
}

回復環境が見つかりません対処法


Windows10には初期状態に戻す「回復」という機能がありますが、それが以下のようなエラーになる場合の対処法です。

Windows REを有効化する

回復環境であるWindows REが無効化されているかどうかを確認します。
コマンドで以下を実行すると、

reagentc /info
Windows 回復環境 (Windows RE) およびシステム リセット構成
情報:

    Windows RE の状態:         Disabled
    Windows RE の場所:
    ブート構成データ (BCD) ID: 00000000-0000-0000-0000-000000000000
    回復イメージの場所:
    回復イメージ インデックス: 0
    カスタム  イメージの場所:
    カスタム イメージ インデックス: 0

REAGENTC.EXE: 操作は成功しました。

こんな感じで、Windows REの状態が「Disabled」になっていれば無効化されていますので、有効化が必要になります。

reagentc /enable

これで問題なくエラーが出ず、有効化されればいいのですが、以下のエラーが出た場合は別途対処が必要です。

REAGENTC.EXE: Windows RE は、BitLocker ドライブの暗号化が有効になっているボリュームでは有効にできません。


BitLockerの無効化

恐らくBitLockerの状態が以下のようになっているはずです。

これを明確に無効化する必要があります。

「設定」→「更新とセキュリティ」→「デバイスの暗号化」まで開き、デバイスの暗号化を「オフにする」ボタンを押下します。

BitLockerの無効化が処理されます。



再度BitLockerの状態を確認すると、変更されていることが分かります。



後は再度「reagentc /enable」コマンドを実行すれば回復環境が使用可能になります。

GCPアカウントの認証と設定

GCPの認証関連について説明します。

【共通】gcloud CLIの初期化

gcloud init

なお、ブラウザベースの承認フローが開始されないようにするには、以下のようにフラグを追加します。

gcloud init --no-launch-browser

 

【共通】ログアウト

gcloud auth revoke

 
GCPアカウントへの認証方法は主に2つあり、それぞれの用途によって使い分けて下さい。

●設定を作成せずにユーザー アカウントを使用して承認を行う

gcloud auth login

●サービスアカウント秘密鍵による、jsonファイルによる認証

あらかじめサービスアカウントの秘密鍵が含まれたjsonファイルが必要です。

gcloud auth activate-service-account {サービスアカウントのメールアドレス} --key-file {jsonファイルパス}

 

認証が行われたかどうかは、現在設定されている認証情報を表示します。

gcloud auth list

うまく認証できていれば、ACTIVE ACCOUNT欄に表示されます。複数ある場合は現在アクティブなアカウントに対して※印がつきます。

PS C:\Users\user1> gcloud auth list
                                Credentialed Accounts
ACTIVE  ACCOUNT
*       {サービスアカウントのメールアドレス}

To set the active account, run:
    $ gcloud config set account `ACCOUNT`

gcloud CLI環境構築

WindowsへのGoogle Cloud CLIのインストールについての備忘です。

Google Cloud CLIとは?

gcloud、gsutil、bq コマンドライン ツールが含まれた、GCPGoogle Cloud Platform)のリソース管理ツールのことです。
WebブラウザでのGUI操作ではなく、PowerShellなどのCLI操作を行うことができます。

コマンド 内容
gcloud Google Cloud リソースの作成と管理を行う一連のツール
gsutil コマンドラインから Cloud Storage にアクセスできる Python アプリケーション
bq Python をベースにした BigQuery 用のコマンドライン ツール


gcloud CLI をインストール

以下を参考にインストールします。なお、適宜管理者権限が必要です。
cloud.google.com

Cloud SDKインストーラがダウンロードされ、実行されます。
セットアップ画面は割愛しますが、基本的には迷うことはないでしょう。
pythonが必要になりますが、SDKに含まれているかVSに含まれているので、特に気にする必要はなさそうです。

インストール確認

PowerShellで以下を実行して問題なくバージョン情報が表示されれば完了です。

gcloud --version
Google Cloud SDK 419.0.0
bq 2.0.85
core 2023.02.17
gcloud-crc32c 1.0.0
gsutil 5.20


これで環境構築は完了です。

NULLを考える②(COALESCE関数)

前回NULLの扱いで、NULLIF関数の話をしました。
これを使うと簡単に0除算エラーの対策が可能になります。

SELECT col_a / NULLIF(col_b, 0) 
FROM SomeTable

演算でNULLが来た場合はNULLを返す仕様をそのまま利用する形です。

基本形はこれだけど、これだと結果が NULLが返ります。C#であればそのまま結果NULLを自作関数に入れて数値等へ変換しちゃう場合が多いですが、NULL許容ではない場合だと少し不便ですよね。そうすると、NULLの場合の条件分岐が必要なので、以下のように長くなってしまいます。

SELECT CASE col_b WHEN 0 THEN 0 ELSE col_a / col_b END
FROM SomeTable

この場合、COALESCE 関数とNULLIF関数を併用すると簡単に解決します。
COALESCE 関数は、与えられた引数で最初に見つけたNULL以外の引数を返します。つまり、以下の場合は「3」が返ります。

SELECT COALESCE(NULL,NULL,3)

つまり、以下のように簡単になるわけです。

    -- col_bが0の場合、0になる
    -- COALESCE関数の第二引数を変更することで、-1とかにもできる
SELECT COALESCE(col_a / NULLIF(col_b, 0), 0)
FROM SomeTable


何かの比率を求める、ってのはよくあることなので、この手法は結構使う形ですので覚えておくと良いでしょう。

型変換は何を使う?(値型⇒String型)

今回は値型⇔string型です。共通認識は前回と一緒です。

  • VB.NETのCIntやCDecなどのC●●●は、CTypeと等価なので全てCTypeで検証
  • 時間計測はSystem.Diagnostics名前空間のStopwatchクラスを利用
  • 繰り返し回数maxは10,000,000回とする
  • それぞれを3回ずつ実行する

今回考えられる候補は、ToString、Convert、CType(VB.NETのみ)です。

int a = 123456789;

sw.Start();
for (int i = 1; i <= max; ++i) {
    string res = a.ToString();
}
sw.Stop();
Console.WriteLine(sw.Elapsed.ToString() + " ToString");
sw.Reset();

sw.Start();
for (int i = 1; i <= max; ++i) {
    string res = Convert.ToString(a);
}
sw.Stop();
Console.WriteLine(sw.Elapsed.ToString() + " Convert");
sw.Reset();
Dim a As Integer = 123456789

sw.Start()
For i As Integer = 1 To max
    Dim res As String = a.ToString()
Next
sw.Stop()
Console.WriteLine(sw.Elapsed.ToString() & " ToString")
sw.Reset()

sw.Start()
For i As Integer = 1 To max
    Dim res As String = Convert.ToString(a)
Next
sw.Stop()
Console.WriteLine(sw.Elapsed.ToString() & " Convert")
sw.Reset()

sw.Start()
For i As Integer = 1 To max
    Dim res As String = CType(a, String)
Next
sw.Stop()
Console.WriteLine(sw.Elapsed.ToString() & " CType")
sw.Reset()

結果は以下の通りです。

項目 C#
VB.NET
ToString 00:00:02.7788599
00:00:01.9934980
00:00:02.7895854
00:00:02.7907917
00:00:02.6248466
00:00:02.7211354
Convert 00:00:02.1907958
00:00:01.9914505
00:00:02.0879492
00:00:02.0197473
00:00:02.1154300
00:00:02.1438101
CType × 00:00:01.5729566
00:00:02.0180006
00:00:02.0006762


以外な結果です。最速はVB.NETのCType(CStr)でした。それでもToString、Convertと大差ありません。ToStringは書式指定が可能ですね。あとはnullの処理をどうするかだけかと思います。

結論、値型⇒String型はToStringで良いでしょう。