2020年8月31日月曜日

Azure Automated Machine Learningを使ってみた。自動MLの可能性について

ノーコードで予測分析を実施してみました。

ノーコードと言いつつ、作成したモデルをデプロイしてサービス化したあとにサービスを使用するアプリケーションはコーディングが必要とあなります。

モデルのランキングは、RMSEがNO1は、StackEnsemble

自動MLで分析を実施して、約80のアルゴリズムで分析をかけます。

使用したアルゴリズムです。

AutoArima
MaxAbsScaler, DecisionTree
MaxAbsScaler, SGD
MinMaxScaler, DecisionTree
MinMaxScaler, ElasticNet
MinMaxScaler, LightGBM
MinMaxScaler, SGD
ProphetModel
RobustScaler, DecisionTree
RobustScaler, ElasticNet
RobustScaler, LassoLars
RobustScaler, LightGBM
RobustScaler, RandomForest
StackEnsemble
StandardScalerWrapper, DecisionTree
StandardScalerWrapper, ElasticNet
StandardScalerWrapper, ExtremeRandomTrees
StandardScalerWrapper, LassoLars
StandardScalerWrapper, RandomForest
StandardScalerWrapper, SGD
TruncatedSVDWrapper, LassoLars
VotingEnsemble

実験を
type algorithm.txt | sort | uniaue > algorithm_list.txt
で出力。

中身を見てみるとどの特徴がどのくらい影響を与えているかがわかります。



デプロイしてSwaggerでI/Fを確認

ヘルスがあるんですね。



クライントロジックの作成


using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

namespace MLWebServiceClient
{
	internal class InputData
	{

		[JsonProperty("data")]
		internal Request[] Data;
	}
	// The data structure expected by the service
	internal class Request
	{
		[JsonProperty("instant")]
		// The service used by this example expects an array containing
		//   one or more arrays of doubles
		internal int Instant;
		[JsonProperty("date"), JsonConverter(typeof(CustomDateTimeConverter))]
		internal DateTime Date;
		[JsonProperty("season")]
		internal int Season;
		[JsonProperty("yr")]
		internal int Year;
		[JsonProperty("mnth")]
		internal int Month;
		[JsonProperty("weekday")]
		internal int Weekday;
		[JsonProperty("weathersit")]
		internal int Weathersit;
		[JsonProperty("temp")]
		internal double Temp;
		[JsonProperty("atemp")]
		internal double ATemp;
		[JsonProperty("hum")]
		internal double Hum;
		[JsonProperty("windspeed")]
		internal double Windspeed;
	}
	class CustomDateTimeConverter : IsoDateTimeConverter
	{
		public CustomDateTimeConverter()
		{
			base.DateTimeFormat = "yyyy-MM-dd HH:mm:ss,ffffff";
		}
	}

	class Program
	{
		static void Main(string[] args)
		{
			Health();

			Score();
			Console.ReadKey();
		}
		private static void Health()
		{
			// Set the scoring URI and authentication key or token
			string scoringUri = "http://baeab633-xxxx-xxxx-xxxx-6b4317bfbbdf.westus.azurecontainer.io/";
			HttpClient client = new HttpClient();
			try
			{
				var request = new HttpRequestMessage(HttpMethod.Get, new Uri(scoringUri));
				request.Content = new StringContent("");
				request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
				var response = client.GetAsync(new Uri(scoringUri));
				Console.WriteLine(response.Result);
			}
			catch (Exception e)
			{
				Console.Out.WriteLine(e.ToString());
			}
		}
		private static void Score()
		{

			// Set the scoring URI and authentication key or token
			string scoringUri = "http://baeab633-xxxx-xxxx-xxxx-6b4317bfbbdf.westus.azurecontainer.io/score";
			string authKey = "<your key or token>";

			// Set the data to be sent to the service.
			// In this case, we are sending two sets of data to be scored.
			InputData payload = new InputData
			{
				Data = new[] {
			new Request
			{
				Instant = 732,
				Date = new DateTime(2013, 1, 1),
				Season = 1,
				Year = 2,
				Month = 1,
				Weekday = 5,
				Weathersit = 2,
				Temp = 0.215833,
				ATemp = 0.223487,
				Hum = 0.5775,
				Windspeed = 0.154846,
			}}
			};


			// Create the HTTP client
			HttpClient client = new HttpClient();
			// Set the auth header. Only needed if the web service requires authentication.
			//client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authKey);

			// Make the request
			try
			{
				Console.WriteLine(JsonConvert.SerializeObject(payload));
				var content = new StringContent(JsonConvert.SerializeObject(payload));
				content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
				var response = client.PostAsync(new Uri(scoringUri), content).Result;
				// Display the response from the web service
				Console.WriteLine(response.Content.ReadAsStringAsync().Result);
			}
			catch (Exception e)
			{
				Console.Out.WriteLine(e.ToString());
			}


		}
	}
}


処理した結果

うまくコード200が返ってきて予測値が取得できました。

2020年8月29日土曜日

StackEditから持ってきたテーブルタグのレイスト修正。CSS3を使ってこのBlogのテーブルを美しく装飾する。


修正方法

テーマをHTML編集して、タグの直前に下記のコードを挿入します。


<!-- start テーブルタグの装飾を実装 -->    
<style>
table {
  width: auto;
  border-spacing: 0;
  font-size:14px;
  box-shadow: 2px 2px 1px rgba(0,0,0,0.1);
}
table th {
  color: #000;
  padding: 8px 15px;
  background: #eee;
  background:-moz-linear-gradient(#eee, #ddd 50%);
  background:-webkit-gradient(linear, 100% 0%, 100% 50%, from(#eee), to(#ddd));
  font-weight: bold;
  border-top:1px solid #aaa;
  border-bottom:1px solid #aaa;
  line-height: 120%;
  text-align: center;
  text-shadow:0 -1px 0 rgba(255,255,255,0.9);
  box-shadow: 0px 1px 1px rgba(255,255,255,0.3) inset;
}
table th:first-child {
  border-left:1px solid #aaa;
  border-radius: 5px 0 0 0;	
}
table th:last-child {
  border-radius:0 5px 0 0;
  border-right:1px solid #aaa;
}
table tr td {
  padding: 8px 15px;
  text-align: center;
}
table tr td:first-child {
  border-left: 1px solid #aaa;
}
table tr td:last-child {
  border-right: 1px solid #aaa;
}
table tr {
  background: #fff;
}
table tr:nth-child(2n+1) {
  background: #f5f5f5;
}
table tr:last-child td {
  border-bottom:1px solid #aaa;
  
}
table tr:last-child td:first-child {
  border-radius: 0 0 0 5px;
}
table tr:last-child td:last-child {
  border-radius: 0 0 5px 0;
}
table tr:hover {
  background: #eee;
  cursor:pointer;
}
</style>
<!-- end テーブルタグの装飾を実装 -->   

対応した結果

MarkDownで作成したテーブルが下記のレイアウトで表示される様になりました。

参考

ここのスタイルを修正して作成しています。
http://weboook.blog22.fc2.com/blog-entry-329.html

2020年8月28日金曜日

デバック実行のためのビルドでエラー:/Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS/Xamarin.iOS.Common.targets(3,3): Error MSB6006: “codesign” はコード 1 を伴って終了しました。 (MSB6006) (application-name)が発生した。


発生したエラーメッセージ

/Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS/Xamarin.iOS.Common.targets(3,3): Error MSB6006: “codesign” はコード 1 を伴って終了しました。 (MSB6006) (application-name)

環境

Xamarin
Visual Stuido 2019 for Mac

対応は、

問題は2つあり、

  1. 一つは、xcodeで確認すると開発用のCertificatesがなくなっていました。
    Xcodeのメニューから、xcode->Preferencesを起動して、対象の署名IDのApple development Certificatesを新規作成しました。
    その後、Apple Developerサイトに2つのCertificatesが出来るので古い方を削除しました。


直前に6つのApple Developer Certificateがあって整理したときに消してしまったようです。

  1. 2つ目は、ProfilesとCertificatesの関連設定が切れていました。
    Apple Developerサイトにログインして、「Certificates, IDs & Profiles」->「Profiles」から対象のProfileを開くと上段で作成した新しいCertificateとの関連が出来ていなかったので、チェックを追加して対応しました。


CertificateとIdentifierとProfileをキチンと意識して連携してやらないといけません。



2020年8月27日木曜日

Stackeditを使用してBloggerを更新してみたけど、ソースコードの扱いがイマイチだったのでGoogleのcode-prettifyへの変換を書いてみた。


StackeditのMDにてのコード挿入の使い方

バックシングルクォートを使用する。(Charpの場合)
```cs
source code
```

採用したコード表示用のHTML用埋め込みスクリプト

GitHub https://github.com/googlearchive/code-prettify

テンプレートの拡張方法

下記の内容テンプレートの</HEAD>に直前に挿入する。

<!-- start StackEditから取り込んだ際にcodeをcode-prettifyで処理させる。 -->
<script src="https://cdn.jsdelivr.net/gh/google/code-prettify@master/loader/run_prettify.js?skin=sons-of-obsidian"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<style>
pre {
  overflow: auto;
  resize: horizontal;
}
pre.my-code {
  overflow: auto;
  resize: horizontal;
}
</style>
<script language='javascript' type='text/javascript'>
  $(function() {
    // for each pre class='prettyprint';
    $('pre>code.prism').parent().each(function(a, e) {
		console.log('calss=' + $(this).attr('class'));
		var lang = $(this).attr('class').replace(' language-', '');
		console.log('lang=' + lang);
		$(this).addClass('prettyprint linenums').attr('lang', lang);
		PR.prettyPrint();
    })
  }
);
</script>
<!-- end StackEditから取り込んだ際にcodeをcode-prettifyで処理させる。 -->

デザインについて

私は、skin=sons-of-obsidianを使用しました。
テーマの説明 https://8oclockis.blogspot.com/2018/04/google-code-prettifyblogger.html

使用できるコードについて

“bsh”, “c”, “cc”, “cpp”, “cs”, “csh”, “cyc”, “cv”, “htm”, “html”, “java”,
“js”, “m”, “mxml”, “perl”, “pl”, “pm”, “py”, “rb”, “sh”, “xhtml”, “xml”, “xsl”
https://github.com/googlearchive/code-prettify

Stackeditとの連携についての対応について

規程のコードの出力は、
<pre class=" language-html"><code class=“prism language-html”>
となります。しかし、Googleのcode-prettifyが求めいるタグが、
<pre class=“prettyprint”>
であり、私は、
<pre class=“prettyprint linenums” lang=“html”>
としたい。
それをJavascriptでコーディングしてみました。

<script language='javascript' type='text/javascript'>
  $(function() {
    // for each pre class='prettyprint';
    $('pre>code.prism').parent().each(function(a, e) {
		console.log('calss=' + $(this).attr('class'));
		var lang = $(this).attr('class').replace(' language-', '');
		console.log('lang=' + lang);
		$(this).addClass('prettyprint linenums').attr('lang', lang);
		PR.prettyPrint();
    })
  }
);
</script>

対応したことで↓のようにキチンと表示されました。



2020年8月26日水曜日

httpを使用したChrome 84からのシームレスなURLスキーム連携について

現象

Chromeのバージョンがアップに伴い、httpではURLスキーム連携を使用した際にダイヤログを表示させないということができなくなりました。(httpsは対応可能)

対応方法について

Chromeの「chrome://flags」に移動し、「Insecure origins treated as secure」に対象のサイト(例:http://example.com)を追加するとチェックボックスが表示され、選択が記憶できるようになります。
対象は、Chrome 84/MS Edge 84
(Edgeは開くと、安全でないオプションを使用しているという警告が表示されます。)

この対応で、両方のブラウザでこのフラグの設定が表示され、フラグを設定したあとにその内容が記憶され、ポップアップが出ずにシームレスな連携が実現できる形になります。


設定することでhttpでもチェックボックスが表示され、チェックをつけることで次回からブラウザからローカルのアプリをシームレスに起動できるよになります。


2020年8月25日火曜日

ADO.NET/Entity Frameworkにてコネクションプールが枯渇する。エラー:タイムアウトに達しました。プールから接続を取得する前にタイムアウト期間が過ぎました。プールされた接続がすべて使用中で、プール サイズの制限値に達した可能性があります。

パフォーマンスモニタでの監視

注目すべきは、コネクションプールが100個を超えた場合、コネクションプールからのコネクション取得タイムアウトは、コネクションタイムアウト15秒を待つことです。
15秒後にエラーが発生します。

この画像は、テストコードでコネクション数を自由にいじってみて監視してみました。テストコードで「U」キーでコネクションを増やして、「D」キーでコネクションを減らして見ました。


パフォーマンスカウンタを動作させる対応

発生しているエラー

System.InvalidOperationException
  HResult=0x80131509
  Message=タイムアウトに達しました。プールから接続を取得する前にタイムアウト期間が過ぎました。プールされた接続がすべて使用中で、プール サイズの制限値に達した可能性があります。
  Source=System.Data
  スタック トレース:
   場所 System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
   場所 System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   場所 System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   場所 System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
   場所 System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
   場所 System.Data.SqlClient.SqlConnection.Open()
   場所 ConsoleAppLegacy.Program.<Main>d__0.MoveNext() (D:\dev\sample_gomi\20200819_.NETCore_ADO.NET\ConsoleAppLegacy\ConsoleAppLegacy\Program.cs):行 22
   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   場所 ConsoleAppLegacy.Program.<Main>(String[] args)

  この例外は、最初にこの呼び出し履歴 
    System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(System.Data.Common.DbConnection, System.Threading.Tasks.TaskCompletionSource<System.Data.ProviderBase.DbConnectionInternal>, System.Data.Common.DbConnectionOptions, System.Data.ProviderBase.DbConnectionInternal, out System.Data.ProviderBase.DbConnectionInternal)
    System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(System.Data.Common.DbConnection, System.Data.ProviderBase.DbConnectionFactory, System.Threading.Tasks.TaskCompletionSource<System.Data.ProviderBase.DbConnectionInternal>, System.Data.Common.DbConnectionOptions)
    System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(System.Data.Common.DbConnection, System.Data.ProviderBase.DbConnectionFactory, System.Threading.Tasks.TaskCompletionSource<System.Data.ProviderBase.DbConnectionInternal>, System.Data.Common.DbConnectionOptions)
    System.Data.SqlClient.SqlConnection.TryOpenInner(System.Threading.Tasks.TaskCompletionSource<System.Data.ProviderBase.DbConnectionInternal>)
    System.Data.SqlClient.SqlConnection.TryOpen(System.Threading.Tasks.TaskCompletionSource<System.Data.ProviderBase.DbConnectionInternal>)
    System.Data.SqlClient.SqlConnection.Open()
    ConsoleAppLegacy.Program.Main(string[]) (Program.cs 内)
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task)
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task)
    System.Runtime.CompilerServices.TaskAwaiter.GetResult()
    ...
    [呼び出し履歴が切り捨てられました] でスローされました

エラーを検証したソース

		/// <summary>
		/// key u			::処理を実行してクローズしない。
		/// key n			::処理を実行してクローズ(normal)
		/// key d			::処理を実行して2つクローズ
		/// </summary>
		/// <param name="args"></param>
		/// <returns></returns>
		static async Task Main(string[] args)
		{
			Console.WriteLine("Hello World!");
			try
			{
				List<SqlConnection> persistantConnections = new List<SqlConnection>();
			start:
				var key = Console.ReadKey();

				SqlConnection con = new SqlConnection("Server=SQLServerIP;Database=kiyotaka;user id=sa;password=p@$$w0rd;");
				con.Open();
				var cnt = 0;
				SqlCommand cmd = new SqlCommand($@"begin tran;
insert test values(1,'{++cnt}');
insert test values(1,'{++cnt}');
commit;", con);

				cnt = await cmd.ExecuteNonQueryAsync();
				switch (key.Key)
				{
					case ConsoleKey.U:
						persistantConnections.Add(con);
						break;
					case ConsoleKey.D:
						con.Close();
						if (persistantConnections.Count > 0)
						{
							persistantConnections[0].Close();
							persistantConnections.RemoveAt(0);
						}
						break;
					default:
						con.Close();
						break;
				}

				Console.WriteLine($"cnt={cnt}");
				goto start;
			}
			catch (Exception ex)
			{
				Console.WriteLine(ex.ToString());
			}
			Console.ReadKey();
			return;
		}