2022年12月1日木曜日

vibe.d logをファイル出力

vibe.d ログをファイルに出力

import vibe.core.log;

void registerAppLoggers()
{
    registerLogger(cast(shared)new FileLogger("applog.log"));
}

void main()
{
    logTrace("Registering loggers");
    
    registerAppLoggers();
    
    logWarn("now logging with %d loggers", getLoggers().length);
    logError("ERROR: something unexpected happened");
}
https://wiki.dlang.org/Logging_mechanisms 

 

 

2022年11月21日月曜日

BulkInsertのサブルーチン 

 

BulkInsertのサブルーチン 

https://pg-life.net/csharp/sqlbulkcopy/ 

 とても助かりました。

datatableの項目にnullがあるとNGだったので、以下に修正

 

using System.Data;

    public void BulkInsert<T>(List<T> _list) {

string connectionId = "AppDbConnStr";
using (var conn = new SqlConnection(_config.GetConnectionString(connectionId))) {
conn.Open();
using (var tran = conn.BeginTransaction()) {
try {
var list = _list.ConvertAll(c => (T)c);
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn,
SqlBulkCopyOptions.Default,
tran)) {
//タイムアウト指定(デフォルトで30秒)
bulkCopy.BulkCopyTimeout = 60;

//テーブル名指定
bulkCopy.DestinationTableName = typeof(T).Name;

//一括Insert実行
bulkCopy.WriteToServer(ToDataTable<T>(list));

//コミット
tran.Commit();
}
}
catch (Exception) {
//ロールバック
tran.Rollback();
throw;
}
}
}
}

private static DataTable ToDataTable<T>(IEnumerable<T> data) {

var properties = typeof(T).GetProperties();
var typeCasts = new Type[properties.Count()];

for (var i = 0; i < properties.Count(); i++) {
if (properties[i].PropertyType.IsEnum) {
typeCasts[i] = Enum.GetUnderlyingType(properties[i].PropertyType);
}
else {
typeCasts[i] = null;
}
}

var dataTable = new DataTable();
for (var i = 0; i < properties.Count(); i++) {
// Nullable types are not supported.
var propertyNonNullType = Nullable.GetUnderlyingType(properties[i].PropertyType) ?? properties[i].PropertyType;
dataTable.Columns.Add(properties[i].Name, typeCasts[i] == null ? propertyNonNullType : typeCasts[i]);
}

foreach (var item in data) {
var values = new object[properties.Count()];
for (var i = 0; i < properties.Count(); i++) {
var value = properties[i].GetValue(item, null);
values[i] = typeCasts[i] == null ? value : Convert.ChangeType(value, typeCasts[i]);
}

dataTable.Rows.Add(values);
}

return dataTable;
}

 

2022年11月17日木曜日

MSSQL Bulk Insert C#では  System.Data.SqlClient.SqlBulkCopy

 System.Data.SqlClient.SqlBulkCopy を使用すると SQL Server のテーブルに大量データを高速に一括登録することが出来ます。

2022年11月16日水曜日

BulkInsertのサブルーチン 

BulkInsertのサブルーチン 

https://pg-life.net/csharp/sqlbulkcopy/ 

 とても助かりました。

using System.Data;

public static class IEnumerableExtention
{
    public static DataTable ConvertDataTable<T>(this IEnumerable<T> items)
    {
        var properties = typeof(T).GetProperties();
        var result = new DataTable();

        // テーブルレイアウトの作成
        foreach (var prop in properties)
        {
            result.Columns.Add(prop.Name, prop.PropertyType);
        }

        // 値の投げ込み
        foreach (var item in items)
        {
            var row = result.NewRow();
            foreach (var prop in properties)
            {
                var itemValue = prop.GetValue(item, new object[] { });
                row[prop.Name] = itemValue;
            }
            result.Rows.Add(row);
        }
        return result;
    }
}


 

using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;

public static void BulkInsert<T>(List<T> _list)
{
    //環境に応じて変えてください
    var connectionString = "接続文字列";

    using (var connection = new SqlConnection(connectionString))
    {
        connection.Open();
        using (var tran = connection.BeginTransaction())
        {
            try
            {
                var list = _list.ConvertAll(c => (T)c);
                using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection,
                                                              SqlBulkCopyOptions.Default,
                                                              tran))
                {
                    //タイムアウト指定(デフォルトで30秒)
                    bulkCopy.BulkCopyTimeout = 60;
                    //テーブル名指定
                    bulkCopy.DestinationTableName = typeof(T).Name;
                    //一括Insert実行
                    bulkCopy.WriteToServer(list.ConvertDataTable<T>());
                    //コミット
                    tran.Commit();
                }
            }
            catch (Exception)
            {
                //ロールバック
                tran.Rollback();
                throw;
            }
        }
    }
}

 

Dapper BulkInsert 感謝です、素晴らしい

 Dapper BulkInsert 感謝です、素晴らしい

通常のInsert 11757件をCOMMIT無しでSQL発行したら

実行時間は約10秒位になった。

Dapper BulkInsertを使用したら 0.3秒で終了

え、処理速度が違いすぎる 、このライブラリーを作った人に感謝です。

 https://dapper-plus.net/


 よ~く見ると 1 developer $799 / Year なのね

でも そのぐらい支払いしても良いと思うライブラリです。

2022年9月21日水曜日

2022年9月6日火曜日

JSONをコンパクトにするライブラリ

JSONをコンパクトにするライブラリ

https://msgpack.org/ja.html

複数の言語で扱っている

go言語でEXCELファイルを扱う

 go言語でEXCELファイルを扱う

https://github.com/qax-os/excelize

 

中国企業のコミットが凄い

 

ASP.NET MVCでBootstrap 5.2を使用するとエラーになる

 ASP.NET MVCでBootstrap 5.2を使用するとエラーになる

実行すると bootstrap.jsを読み込んだ箇所でエラー

System.Web.MVC.dll が見つかりません

System.NullReferenceException
  HResult=0x80004003
  Message=Object reference not set to an instance of an object.
  Source=WebGrease
  StackTrace:
   at Microsoft.Ajax.Utilities.JSParser.ParseObjectLiteralProperty(Boolean isBindingPattern)
   at Microsoft.Ajax.Utilities.JSParser.ParseObjectLiteral(Boolean isBindingPattern)
   at Microsoft.Ajax.Utilities.JSParser.ParseLeftHandSideExpression(Boolean isMinus)
   at Microsoft.Ajax.Utilities.JSParser.ParseUnaryExpression(Boolean& isLeftHandSideExpr, Boolean isMinus)
   at Microsoft.Ajax.Utilities.JSParser.ParseExpressionList(JSToken terminator)
   at Microsoft.Ajax.Utilities.JSParser.ParseMemberExpression(AstNode expression, List`1 newContexts)
   at Microsoft.Ajax.Utilities.JSParser.ParseLeftHandSideExpression(Boolean isMinus)
   at Microsoft.Ajax.Utilities.JSParser.ParseUnaryExpression(Boolean& isLeftHandSideExpr, Boolean isMinus)
   at Microsoft.Ajax.Utilities.JSParser.ParseExpressionStatement(Boolean fSourceElement)
   at Microsoft.Ajax.Utilities.JSParser.ParseStatement(Boolean fSourceElement, Boolean skipImportantComment)
   at Microsoft.Ajax.Utilities.JSParser.ParseBlock()
   at Microsoft.Ajax.Utilities.JSParser.ParseArrowFunction(AstNode parameters)
   at Microsoft.Ajax.Utilities.JSParser.ParseLeftHandSideExpression(Boolean isMinus)
   at Microsoft.Ajax.Utilities.JSParser.ParseUnaryExpression(Boolean& isLeftHandSideExpr, Boolean isMinus)

 

解決方法

https://stackoverflow.com/questions/68009152/mvc-5-scripts-render-bundles-bootstrap-error-object-reference-not-set-to

 

         bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                    "~/Scripts/jquery.validate*"));

        // Geliştirme yapmak ve öğrenme kaynağı olarak yararlanmak için Modernizr uygulamasının geliştirme sürümünü kullanın. Ardından
        // üretim için hazır. https://modernizr.com adresinde derleme aracını kullanarak yalnızca ihtiyacınız olan testleri seçin.
        bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
                    "~/Scripts/modernizr-*"));

        bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include(
                  "~/Scripts/bootstrap.js"));

        bundles.Add(new StyleBundle("~/Content/css").Include(
                  "~/Content/bootstrap.css",
                  "~/Content/site.css"));

        bundles.Add(new Bundle("~/bundles/bootstrap").Include(
                   "~/Scripts/bootstrap.js",
                   "~/Scripts/respond.js",
                   "~/Content/site.css"));
    }
}

 

 

Bundleを追加する


 

2022年7月16日土曜日

ばあちゃんのトマトが一番上手い

 母親の実家の小さな庭先にばあちゃんがトマトを作っていた。

他の野菜も育てていたらしいけど、夏に食べるばあちゃんのトマトが一番上手い。

甘く美味しいと記憶している。

ばあちゃん ありがとう。

 

知らないおばちゃん、40年前だけど、ありがとう

 もう 40年近くになるが

確か 小学校4年生くらいだったと記憶している

夏休みに母親の実家に帰省して、父親と二人で

日本海の海岸 に行き、海で遊んで

バスで帰る最中のこと

始発から乗ったバス もしくは遊び疲れて 自分は眠っていた。

降りるバス停になって父親は降りたらしい。

そしてバスは走り去る、眠っている自分を乗せて。

バスが走り去ってから父親は自分が降りていないことを初めて認識したらしい。

自分の両親は自動車免除を持っていないので、慌てて母親の実家に帰ってバス会社に電話したらしい。

そして知る、息子さんはバスから降りましたよと。

父親がバスを降りてから数分後に自分は目覚めて知らない場所だったから急いでバスから降りた、でも その時子供だったのでお金を持っていないから

支払い出来なかった。

田舎のバスは運賃後払い方式

たまたま居合わせた、おばちゃんが支払いをしてくれた。

今では考えられない 見ず知らずの子供の運賃を支払いしてくれた。

 ありがとう、とても助かりました。

母親の実家は電波塔の見える場所だったので、降りたバス停からその電波塔が見えていた。

普通なら反対車線のバスに乗って行けば良いが、そこは子供、かつ お金が無いので徒歩でその電波塔を目指して歩き始めた、夏なので 当日は赤色が好きだったらしく、広島カープの野球帽子をかぶって、バス通りを歩いていた。

何分、何時間歩いたか覚えていないが

無事に母親の実家に帰ることができた。

帰ったら、姉と兄に歩いて帰って馬鹿だねぇとお叱りを受けた。

タクシーで帰って来れば良いじゃん。

お金を持っていない当日の子供の自分にそんな発想はなかったのでびっくりしたと記憶している。

でも 良く考えたら 田舎 しかもバス通りでも都合良くタクシーなんて在りませんよ。

父親は鬼門に入っているが、夏になると ちょっと思い出す。

父親はこの件で母親に怒られたらしいが、仲が良い両親だから問題なかったと思われる。

喧嘩した所を余り見たことが無い

両親だった、車が無いのに海 とかに出掛けた記憶が有るので、自分の子供たちにも、同じように色々つれ回したが、役に立ったのかはジジィになってから解るのかも知れない。

 降りるバス停に母親が居た時に遠くの方に赤い帽子が見えたそうな

 



2022年5月6日金曜日

Team Explorer 2013 の通信をTLS1.2に設定する方法

 Team Explorer 2013 の通信をTLS1.2に設定する方法

.NET framework v4の初期通信がtls1.2では無いので

dev.azure.com に接続出来ないのと visual studio 2013のloginが出来なくなっていた。


以下の方法で解決

https://jpdsi.github.io/blog/internet-explorer-microsoft-edge/dotnet-framework-tls12/


[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]  
"SchUseStrongCrypto"=dword:00000001  

64 ビット OS 環境の場合は下記にも設定します。

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]  
"SchUseStrongCrypto"=dword:00000001  

2022年4月28日木曜日

Amazon, アプラス, イオンカ-ドを装った詐欺メール

 Amazon, アプラス, イオンカ-ドを装った詐欺メールが頻繁に届くようになりました。

 

2022年4月13日水曜日

メルカリを装った詐欺メール

 

こんにちは

 メルカリアカウントが第三者に悪用されたことが検出され,アカウントが制限されました。メールを受信したらすぐに关连情报を确认して制限を解除してください。リンクをクリックしない场合は注意してください。以下の12时间以内の确认のため,アカウントは常に制限されます。ご容赦ください。メルカリチームは常にお客様の资产情报のセキュリティ保护に取り组んでいます。

情报を确认すると,5000円のショッピング割引が适用されます。ご协力ありがとうございます。

 

気を付けてください。

2022年4月1日金曜日

C# EntityFrameWork Error 3023

 現象

C# EntityFrameWork Error 3023 

テーブルに項目を追加したが手動でソースを変更したが

Error 3023が発生した。

 edmxのソースを3か所修正しないとNGだった。

 

1番目:クラスの定義

2番目: データベースの定義

3番目:マッピング

 

3番目のマッピングが必要でした。