ポストバック判断まとめ(備忘)
なんか同じこと何回も調べるので備忘。
初回実行時、フルポストバック、パーシャルポストバックのまとめ表。
※〇: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 ドライブの暗号化が有効になっているボリュームでは有効にできません。
GCPアカウントの認証と設定
GCPの認証関連について説明します。
【共通】gcloud CLIの初期化
gcloud init
なお、ブラウザベースの承認フローが開始されないようにするには、以下のようにフラグを追加します。
gcloud init --no-launch-browser
●設定を作成せずにユーザー アカウントを使用して承認を行う
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 コマンドライン ツールが含まれた、GCP(Google 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で良いでしょう。