備忘録

備忘録

CefSharpでリダイレクトURLを取得する方法

Ⅰ. はじめに

タイトルの通り「CefSharpでリダイレクトURLを取得する方法」です。

CefSharpに関する基本的な情報はこちら
http://kagasu.hatenablog.com/entry/2017/12/16/154109

Platform 動作確認
WPF OK
WinForms NG

2018/02/11時点でWinForms版CefSharpはCefSharp.IRequestHandlerに対応していないので動作しません。

Ⅱ. サンプルプログラム

MainWindow.xaml
public MainWindow()
{
  InitializeComponent();

  var browser = new ChromiumWebBrowser();
  browser.RequestHandler = new MyRequestHandler();
  browser.Load("http://127.0.0.1/test.php");
  Content = browser;
}
test.php
<?php
header("HTTP/1.1 302");
header("Location: http://example.com");
MyRequestHandler.cs
using CefSharp;
using System;
using System.Security.Cryptography.X509Certificates;

class MyRequestHandler : IRequestHandler
{
  bool IRequestHandler.OnBeforeBrowse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, bool isRedirect)
  {
    if (isRedirect)
    {
      Console.WriteLine($"リダイレクトURL: {request.Url}");
    }
    return false;
  }

  bool IRequestHandler.OnOpenUrlFromTab(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, WindowOpenDisposition targetDisposition, bool userGesture)
  {
    return false;
  }

  bool IRequestHandler.OnCertificateError(IWebBrowser browserControl, IBrowser browser, CefErrorCode errorCode, string requestUrl, ISslInfo sslInfo, IRequestCallback callback)
  {
    return false;
  }

  void IRequestHandler.OnPluginCrashed(IWebBrowser browserControl, IBrowser browser, string pluginPath)
  {
  }

  CefReturnValue IRequestHandler.OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)
  {
    return CefReturnValue.Continue;
  }

  bool IRequestHandler.GetAuthCredentials(IWebBrowser browserControl, IBrowser browser, IFrame frame, bool isProxy, string host, int port, string realm, string scheme, IAuthCallback callback)
  {
    callback.Dispose();
    return false;
  }
  void IRequestHandler.OnRenderProcessTerminated(IWebBrowser browserControl, IBrowser browser, CefTerminationStatus status)
  {
  }

  bool IRequestHandler.OnQuotaRequest(IWebBrowser browserControl, IBrowser browser, string originUrl, long newSize, IRequestCallback callback)
  {
    return false;
  }
  
  bool IRequestHandler.OnProtocolExecution(IWebBrowser browserControl, IBrowser browser, string url)
  {
    return false;
  }

  void IRequestHandler.OnRenderViewReady(IWebBrowser browserControl, IBrowser browser)
  {
  }

  bool IRequestHandler.OnResourceResponse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
  {
    return false;
  }

  void IRequestHandler.OnResourceLoadComplete(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength)
  {
  }

  public bool OnSelectClientCertificate(IWebBrowser browserControl, IBrowser browser, bool isProxy, string host, int port, X509Certificate2Collection certificates, ISelectClientCertificateCallback callback)
  {
    return false;
  }

  public void OnResourceRedirect(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, ref string newUrl)
  {
  }

  public IResponseFilter GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
  {
    return null;
  }
}

実行結果

f:id:kagasu:20180211020832p:plain

参考

Dapperの遅いINSERTをDapperPlusを使って高速化する

Ⅰ. はじめに

Dapperで以下のようなINSERTを実行した場合数秒かかります。

var values = Enumerable.Range(0, 10000).Select(x => new { a = x, b = x });
var count = connection.Execute(@"insert MyTable(ColA, ColB) values (@a, @b)", values);

原因はバルクインサートに対応していない為です。
1万回のINSERTを1回1回実行しています。
f:id:kagasu:20180208224806p:plain

残念ながらDapperはバルクインサートに対応していないので、バルクインサートに対応しているDapperPlus(有料)を使います。

Ⅱ. DapperPlusについて

1ヶ月のお試しは無料です。
毎月の初めに最新バージョンをダウンロードすることでお試しの延長ができます。*1
※日付がハードコードされてチェックが行われています。
月に一度このハードコードされた部分が修正されてリリースされます。
つまり、厳密には1ヶ月のお試しではなく各バージョンごとに月末まで使えます。
ダウンロード数を伸ばしたいという作者の意図がありそうです。

if (DateTime.Now < new DateTime(2018, 3, 1)) {
...
}

Ⅲ. DapperPlusの使い方

1. NuGetからZ.Dapper.Plusをインストールする
Install-Package Z.Dapper.Plus
2. サンプルプログラム
using MySql.Data.MySqlClient;
// (NuGet) Install-Package System.ComponentModel.Annotations
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using Z.Dapper.Plus;

[Table("my_table")]
public class Data
{
  [Column("col_a")]
  public int ColA { get; set; }

  [Column("col_b")]
  public int ColB { get; set; }
}

static void Main(string[] args)
{
  var values = Enumerable.Range(0, 10).Select(x => new Data { ColA= x, ColB = x });

  // MySqlConnection は NuGet から MySqlConnector をインストールすると使える
  var conn = new MySqlConnection("userid=user001;password=mypassword;database=mydb;Host=127.0.0.1;charset=utf8");
  conn.Open();

  /*
  // オプションの設定(必須ではない)
  DapperPlusManager
   .Entity<Data>()
   .Table("my_table") // テーブル名を指定する(クラス名とテーブル名が違う場合)
   .BatchSize(100); // バルクインサートを100件づつにする
  */

  // バルクインサートする
  conn.BulkInsert(values);
}
実行結果

f:id:kagasu:20180209003620p:plain

MariaDBのデータ復旧方法

Ⅰ. はじめに

MariaDBが異常停止して二度と起動しない状態になった場合、原因究明よりもとにかくデータを復旧したい場合のやり方です。

Ⅱ. やり方

1. innodb_force_recovery の値を設定する

1~6まで1ずつ値を起動するまで増やし、MariaDBが起動できるようになるまで試します
/etc/my.cnf.d/server.cnf

[mysqld]
innodb_force_recovery = 1
2. バックアップを取る(mysqldumpする)
# 「テーブル定義」「テーブルデータ」をダンプする
mysqldump -u root -p my_db> my_db.sql

# 「テーブル定義」「テーブルデータ」「イベント」をダンプする
mysqldump -u root -p my_db --events > my_db.sql

# 「テーブル定義」「テーブルデータ」「ストアドプロシージャ」「イベント」をダンプする
mysqldump -u root -p my_db --events --routines> my_db.sql

# 「テーブル定義」「テーブルデータ」「ストアドプロシージャ」「イベント」「トリガー」をダンプする
mysqldump -u root -p my_db --events --routines --triggers > my_db.sql

# 「イベント」だけダンプする
mysqldump -u root -p my_db --no-data --no-create-db --no-create-info --routines --triggers --skip-opt --events > my_db_event.sql

# gzipにする
mysqldump ... | gzip > my_db_event.sql.gz
3. 復元する
# gzip -d my_db.sql.gz
mysql -u root -p my_db < my_db.sql

留意点

  • イベントにコメントを記述している場合にmysqlコマンドを利用して復元した時、コメントが消える場合がある

Linuxでディスク容量を確認する(ncduコマンド)

Ⅰ. はじめに

ディスク容量や使用率等だけであれば「dfコマンド」、どのディレクトリがどれだけというのは「duコマンド」で見ることが出来ます。
しかし「duコマンド」は毎回ディレクトリを指定する必要がある為面倒です。
そこで ncdu を使います。

Ⅱ. ncduとは

CUIでグラフィカルにディスク使用率を確認することができるコマンドです。

Ⅲ. 使い方

1. ncduをインストールする
yum -y install ncdu
2. ncduを起動する

任意のディレクトリに移動してから起動します。

cd /
ncdu
実行結果

f:id:kagasu:20180206175450p:plain

その他
  • 十字キー」で操作ができます。
  • 「iキー」でファイル情報
  • 「dキー」でファイル/フォルダ削除