\

【アルゴリズム】C# 配列要素を漏れ・ダブりなくランダムに取得する方法

この記事では、配列の要素をランダムに漏れ・ダブりなく取得するアルゴリズムについて説明します。

1. この記事で実現すること

たとえば、以下のような配列があったとします。

[1, 5, 8, 13, 35, 67]

この各要素をランダムに漏れ・ダブりなく抽出する方法を考えてみます。

  • 正しい結果

    • [ 35, 8, 13, 67, 5, 1]

    • [ 67, 1, 5, 35, 12, 5]

  • 間違った結果

    • 13 が重複している
    • [ 8, 1, 5, 13, 13, 35, 67]
    • 67が漏れている
    • [ 8, 1, 5, 13, 35]

2. アルゴリズムの概要

1. 0から配列の要素数 - 1 までの整数の乱数を取得します。

以下の場合、要素数は6個です。

[1, 5, 8, 13, 35, 67]
 
0~5の整数をランダムで選びます。ランダムで「3」が選ばれたとします。

2. ランダム数字に該当する配列の要素を取得します。

以下の場合、3番目の要素は「13」です(配列の1つ目の添え字を0とした場合)

[1, 5, 8, 13, 35, 67]

3. 抽出した配列の要素を、配列から削除します。

今回は「13」が選ばれましたので、「13」を配列から削除します。

削除前は以下のとおりです。

[1, 5, 8, 13, 35, 67]

削除後は、以下のようになります。

[1, 5, 8, 35, 67]

4. 「1.」に戻ります。0から配列の要素数-1までの整数の乱数を取得します。

先ほど、要素「13」が消えましたので、要素数は「5」です。

[1, 5, 8, 35, 67]

ランダムで「0」が選ばれたとします。

5. 「2.」の手順を行います。ランダム数字に該当する配列の要素を取得します。

以下の配列のうち、手順「4.」で取得した乱数0に対応する要素は「1」になります。

[1, 5, 8, 35, 67]

6. 「3.」の手順を行います。抽出した配列の要素を、配列から削除します。

今回は「1」が選ばれましたので、「1」を配列から削除します。

削除前は以下のとおりです。

[1, 5, 8, 35, 67]

削除後は、以下のようになります。

[5, 8, 35, 67]

7. 手順「4.」「5.」「6.」を繰り返します。配列の要素がなくなったら終了です。

3. c#で書くとどうなるか?

c#で書くと、こうなります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

int[] ArrayItems = { 1, 5, 8, 13, 35, 67 };
Random rand = new Random();
int choiceIdx = 0;


while(ArrayItems.Length > 0)
{
choiceIdx = rand.Next(0, ArrayItems.Length);

Console.WriteLine($"Output: {ArrayItems[choiceIdx]}");

List<int> ArrayItemsList = new List<int>();
ArrayItemsList.AddRange(ArrayItems);
ArrayItemsList.Remove(ArrayItems[choiceIdx]);
ArrayItems = ArrayItemsList.ToArray();
}

まず、抽出したい配列を定義します。

1
int[] ArrayItems = { 1, 5, 8, 13, 35, 67 };

次にRandomオブジェクトを生成します。

1
Random rand = new Random();

ランダム抽出対象の添え字ワークエリアを初期化します。

1
int choiceIdx = 0;

抽出対象の配列の要素数が「0より大きい」を満たすまでループします。

1
2
3
4
5
6
while(ArrayItems.Length > 0)
{

...

}

ランダム抽出対象の添え字を取得し、配列から要素を取得します。

1
2
choiceIdx = rand.Next(0, ArrayItems.Length);
Console.WriteLine($"Output: {ArrayItems[choiceIdx]}");

配列から要素を削除します。
配列から要素を直接削除する方法がわかりませんでしたので、一旦リストオブジェクトに変換し、リストから要素を削除して、配列に戻しています。

1
2
3
4
List<int> ArrayItemsList = new List<int>();
ArrayItemsList.AddRange(ArrayItems);
ArrayItemsList.Remove(ArrayItems[choiceIdx]);
ArrayItems = ArrayItemsList.ToArray();

以下のように出力されれば、成功です。

1
2
3
4
5
6
Output: 35
Output: 67
Output: 13
Output: 8
Output: 1
Output: 5

以上、アルゴリズムでした。

ExecNote.app リリースしました!

ExecNoteは、コードが実行できるMarkdownアプリケーションです。Markdownドキュメント内に記載したコードをクリックすると実行ができます。わざわざターミナルを 起動させる必要がありません!無料ですのでもしよければダウンロードをお願いします。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

短期集中で身に着ける おすすめc#勉強法

プログラミング言語やフレームワークはたくさんあります。しかし、どれも習得するまでにそれなりの時間がかかってしまいます。

この記事では、手っ取り早く短期間でc#を習得する方法について紹介します。

0. この記事のまとめ

手っ取り早く短期間で習得するには、必要性の認識が必要不可欠です。

これさえしっかりしていれば、挫折することなく短期間で習得することができると思います。

また、自分が作りたいと思ったプログラムを、自力で作成することをおすすめします。

自分で仕様を決めて作るということは、サンプルコードを動かすことよりも数倍も身につくことが多いです。

1. なぜc#を勉強するのか、自分の考えを整理して、必要性を理解する

まず最初に、どうしてc#を習得したいのか、自分自身の考えを整理しましょう。これは、勉強に対するモチベーションに直結します。例えば、c#を習得したい理由として、以下のような内容が考えられます。

  • Windowsアプリやウェブアプリ、スマホアプリを作りたいから
  • スマホアプリやウェブアプリなど、幅広く使える言語だから
  • 仕事で使われていて、効率と品質を上げたいから

他にも、様々な理由があると思います。勉強したい理由は人それぞれですので、正解なんてありません。自分に嘘をついていない正直な内容であればOKです。

2. c#の基本的な文法や言語そのものを理解するおすすめ本

独習c#

やさしいc#

独習c#はかなりページ数の多い本ですが、各項目が詳細に書かれています。私も買いましたが、根気強く読んでいけば、誰でも理解できる内容になっていると思います。

3. ASP.NET おすすめ本

速習 ASP.NET Core 3 速習シリーズ

速習シリーズは、TypeScriptなど何冊か読みましたが、低価格でページ数が少ないのが魅力です。

「速習 ASP.NET Core 3」であれば500円程度で購入することができます。また、ページ数が少ないので、要点だけを短期間で習得することができます。ただし、この本を読んで分からないところがあれば、自力でネット検索して調べるか、有識者へ確認するなど、対応が必要になります。

4. 何かアプリを作ってみる

c#をある程度書けるようになったら、何かアプリを作ってみましょう。例えば、「High or Low 数字当てゲーム」(*)ですね。

(*)High or Low 数字当てゲーム

手順
1. コンピュータが1〜100 の中からランダムな数字を1つ選ぶ 57
2. プレーヤーが正解と思われる数字を入力する 48
3. 正解か不正解か判定する 不正解
4. 不正解の場合、入力した数字に対して、大きいか、小さいか、ヒントを与える 大きい
5. 以下、2〜4を繰り返す。正解になった時点で終了

今までに得た知識を集結して、わからないところは本を読み返したりネット検索したりして、独力開発してみましょう。

「High or Low 数字当てゲーム」でなくても、自分が作りたいと思うアプリなら何でもOKです。

自力でアプリを作れたら、もはやそのプログラミング言語は習得したと言って問題ないでしょう。

アプリを作る楽しみを忘れなければ、どんな言語もフレームワークも習得することができると思います。

ExecNote.app リリースしました!

ExecNoteは、コードが実行できるMarkdownアプリケーションです。Markdownドキュメント内に記載したコードをクリックすると実行ができます。わざわざターミナルを 起動させる必要がありません!無料ですのでもしよければダウンロードをお願いします。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

AngleSharpで属性の値を取得する方法

AngleSharpで属性の値を取得する方法について紹介します。この記事では、href属性の値を取得してみます。

0. この記事のまとめ

属性の値は、GetAttribute(“属性名”) で取得できます。

href属性を取得するには、

1
GetAttribute("href")

で、取得することができます。

1. AngleSharpとは

AngleSharp は、オープンソースの.net HTMLパーサーライブラリで、ウェブスクレイピングができるライブラリです。

2. Aタグのhref属性を取得するソースコード全文

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System;

using AngleSharp;
using AngleSharp.Html.Parser;
using System.Net;
using System.Threading.Tasks;


static void Main(string[] args)
{
Console.WriteLine("Hello World!");
Task t = WebscrapingSample();
}


static async Task WebscrapingSample()
{

var urlstring = "https://usefuledge.com";

WebClient wc = new WebClient();
try
{
string htmldocs = wc.DownloadString(urlstring);


var config = Configuration.Default;
var context = BrowsingContext.New(config);
var document = await context.OpenAsync(req => req.Content(htmldocs));

foreach ( var item in document.QuerySelectorAll("a"))
{
Console.WriteLine(item.TextContent.Trim() + " " + item.GetAttribute("href"));
}


}
catch (System.Exception)
{
throw;
}
}

以下のように出力されれば、成功です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Useful Edge /
Menu
Close
Home /
about me /profile.html
Archives /archives/index.html
仕事の依頼 /appdev.html
お問い合わせ /contact.html
ExecNoteでNodeJSコードスニペットを管理しよう /execnote-start-nodejs.html
9月 7, 2020 /execnote-start-nodejs.html
#1-ExecNoteとは?
https://execnote.app/ https://execnote.app/
#2-ドキュメントと一緒に保存できる
#3-ExecNoteで新しいファイルを作成しよう
#4-カレントディレクトリはどこ?
#3-標準出力
#4-コード実行方法
#5-コード実行前に確認画面を表示するには?
#5-乱数生成
#6-forループ
#8-おわりに
https://execnote.app
https://execnote.app/ https://execnote.app/
Tweet https://twitter.com/share?ref_src=twsrc%5Etfw
https://b.hatena.ne.jp/entry/
https://execnote.app/index.html
≫ExecNote のダウンロードはこちらから https://execnote.app/index.html
≫プロフィールはこちら /profile.html
≫システム開発のご依頼はこちら /appdev.html
≫お問い合わせはこちら /contact.html
≫Twitter https://twitter.com/Harus0313/
ExecNote /tags/ExecNote/index.html

3. href属性を取得するコード

href 属性は以下のコードで取得しています。

1
2
3
4
foreach ( var item in document.QuerySelectorAll("a"))
{
Console.WriteLine(item.TextContent.Trim() + " " + item.GetAttribute("href"));
}

foreach文で、Aタグを抽出して1レコードずつループします。item変数に格納されます。

1
2
3
4
foreach ( var item in document.QuerySelectorAll("a"))
{
...
}

href属性の値はitem.GetAttribute("href")で取得します。

以下のコードで、Aタグ内のテキストと、href属性の値を標準出力に出力します。

1
Console.WriteLine(item.TextContent.Trim() + " " + item.GetAttribute("href"));

ExecNote.app リリースしました!

ExecNoteは、コードが実行できるMarkdownアプリケーションです。Markdownドキュメント内に記載したコードをクリックすると実行ができます。わざわざターミナルを 起動させる必要がありません!無料ですのでもしよければダウンロードをお願いします。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

ExecNoteでNodeJSコードスニペットを管理しよう

1. ExecNoteとは?

ExecNoteは、コードを直接実行できるMarkdownエディタです。

Markdown内に記載したコードをワンクリックで実行できます。

そのため、コンソール画面やコードエディタにコピペする必要はありません。

2020年9月現在、Python・PowerShell・NodeJSに対応しています。

ExecNoteは以下からダウンロードできます。

https://execnote.app/

2. ドキュメントと一緒に保存できる

ExecNoteは、Markdownエディタであり、コード実行プラットフォームです。

そのため、コードとドキュメントを1つのファイルに保存することができます。

スニペットコードを書いていて、ドキュメントを残しておきたいということはありませんか?

ExecNoteを使えば、画像、見出し、箇条書き、ウェブリンク、HTMLで表現できることすべてをドキュメントに活用することができます。

3. ExecNoteで新しいファイルを作成しよう

NodeJSコードスニペットを管理するためのファイルを作成しましょう。

画面左上の「ファイル」をクリックし、その下の「新規作成」をクリックします。

ファイル名入力欄が表示されますので、ファイル名を入力します。

以下のとおり、ファイルが作成されます。

4. カレントディレクトリはどこ?

カレントディレクトリは、画面右上に表示されているパスになります。

以下の画像で言えば、C:\Users\Haru\Documents\ExecNoteです。

パスをクリックすると、フォルダの中身をエクスプローラーで開きます。

3. 標準出力

Nodeに限らず、JavaScriptで標準出力に出力するには、console.logを使用します。

それでは、以下の図のように、中央のエディターペインに入力してみましょう。

4. コード実行方法

コードを実行するには、画面右側のPREVIEWペインのコードをクリックします。

以下のように、コードの下に出力内容が表示されれば、成功です。

5. コード実行前に確認画面を表示するには?

デフォルトでは、コードをクリックすると即座に実行されます。

しかし、場合によっては、コード実行前に確認画面を表示したいときもあると思います。

その場合は、「設定」メニューの「設定」から設定画面を表示します。

デフォルトでは「コード実行時の確認画面を省略する」にチェックが入っています。

コード実行前に確認画面を表示するには、チェックを外して、「適用」ボタンをクリックします。

もう一度、PREVIEWペインのコードをクリックすると、以下のような確認画面が表示されます。

「実行」ボタンをクリックすると、コードが実行されます。

5. 乱数生成

続いて、乱数を生成してみましょう。

JavaScriptで乱数を出力するには、Math.random()を使用します。

以下の「2. 乱数生成」のようにMarkdownを書き、PREVIEWペインのコードをクリックしてみましょう。乱数が生成されるはずです。

ちなみに、1~10の整数をランダムで出力するには、以下のように書きます。

1
2
3
4
5
6
7

var max = 10;
var min = 1

var randInt = Math.floor(Math.random() * (max + 1 - min)) + min

console.log(randInt);

コードをクリックして、1~10のランダムな整数が出力されるか、確認しましょう。

6. forループ

JavaScriptのforは、for(var i = 0; i < 10; i++)のように書きます。

ここでは、ランダムな数字を10回連続で生成してみます。

このようにコードをクリックすると、簡単に結果を取得できます。

8. おわりに

ExecNoteがあれば、Markdownドキュメントとコード+実行環境を1つに集約することができます。

コンソールコマンドを実行する必要もなくコードを実行可能ですので、作業効率が向上します。

今なら無料で使用可能ですので、ぜひ、ダウンロードしてみてください。

https://execnote.app/

ExecNote.app リリースしました!

ExecNoteは、コードが実行できるMarkdownアプリケーションです。Markdownドキュメント内に記載したコードをクリックすると実行ができます。わざわざターミナルを 起動させる必要がありません!無料ですのでもしよければダウンロードをお願いします。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

開発環境をPCからスマホに変更するための方法

私事で大変恐縮ですが、愛用していた Surface Go が充電できなくなりました。

修理に出していないのでもしかしたら直るかもしれませんが、これを機に、開発用端末をPCからスマホに変更できないかと検討してみました。

運用3日目ですが、やっぱりノートPCを買うかもしれませんが、どんな環境で作業しているか紹介します。

1. コンピューティング環境 → AWS EC2 Windows Server

プログラミング環境を構築しますので、やはりWindowsやMacのようなコンピューティング環境が無いと話しになりません。

AndroidであればTurmuxなどが使えますが、やはり Visual Studio Code のような自動補完機能のあるコードエディタが欲しいです。

よって、AWS EC2 のようなクラウドコンピューティング環境を用意しましょう。

クラウドですので、物理的に壊れる心配はありません。CPUやメモリも、必要に応じて多く割り当てたり少なくしたりすることが可能です。

デメリットは、やはり高価です。AWS EC2 であれば、起動時間に応じて料金が発生しますので、集中して短時間で作業を終わらせられるようにしましょう。

2. スマホアプリ(リモートクライアント)

スマホからクラウドコンピューティングに接続するアプリをインストールしましょう。

ここではリモートクライアントと記載していますが、要はRemote Desktop や VNC Viewer のようなものです。

私の場合はAWS EC2 上にあるWindows に接続する必要があり、以下のRDPというアプリを使用しています。

https://apps.apple.com/jp/app/remote-desktop-rdp/id288362053

純正のRemote Desktopアプリよりも使いやすくて好きです。

3. ストレージサービス

ストレージサービスは、スマホとクラウドPC両方から使用可能なものを選びます。

私は、AWS S3 と、One Drive を使っています。

AWS S3 にはソースコードを主に保存しています。

One Drive は主にExcelやPowerPointなどのドキュメントの保存に使用しています。

One Drive を採用した理由は、実体のファイルにアクセスしやすいことです。

Google Drive なども候補に上がりましたが、One Drive だと Windows エクスプローラからアクセスができますので、効率が上がります。

4. スマホアプリ(コードエディタ)

AWS S3 上にコードを保存しますので、コードエディタは S3 に直接アクセスできた方がいいです。

私は、以下のコードエディタを使っています。

https://apps.apple.com/jp/app/code-editor-by-panic/id500906297

このアプリは、S3のファイルを直接操作できます。また、HTMLやJavaScriptのコード補完機能もあります。

また、SSHクライアント機能もありますので、リモートPCへのアクセスも可能です。

5. マウス

マウスは、Bluetooth接続が可能なものであれば、お好みのものでいいでしょう。

人それぞれですが、左クリック、右クリック、ホイールぐりぐりがあれば十分だと思います。

6. キーボード

キーボードもBluetooth接続が可能なものが必要ですが、英語配列のキーボードにしましょう。

日本語配列のキーボードを使っていますが、英語配列として認識してしまいます。キーボードに書いてある記号を押してもその通りに入力できないので、腹が立ちます。

英語配列は一般的ではありませんが、すぐに慣れると思います。どのキーを押せば何が入力できるのか分かるほうが良いです。

7. ヘッドマウントディスプレイ

スマホの画面は小さいです。解像度の高いリモートPCを表示させようと思うと、米粒のような文字を読む必要があり、かなり目が疲れます。

外部ディスプレイに接続する方法もありますが、ここではヘッドマウントディスプレイを紹介します。

ヘッドマウントディスプレイは、ゴーグルにスマホをセットして使用します。

外箱の外観はこんなかんじです。

visorx-1

見た目はこんな感じです。

visorx-2

ここにスマホをセットします。

visorx-2

スマホをセットしたゴーグルを被って、Bluetoothとキーボードとマウスを使ってプログラミングするイメージですね。

この注意点は、首が疲れます。30分くらいすると、すごく疲れました。

これと関係があるか分かりませんが、翌日、ひどい頭痛に襲われました。

8. 最後に

スマホって10万円くらいするのに、TwitterとLINEとネットサーフィンくらいしか使ってないのはもったいないなと思って、挑戦しました。

でもやっぱり、PCの操作性には敵わないと思います。

現場からは以上です。

ExecNote.app リリースしました!

ExecNoteは、コードが実行できるMarkdownアプリケーションです。Markdownドキュメント内に記載したコードをクリックすると実行ができます。わざわざターミナルを 起動させる必要がありません!無料ですのでもしよければダウンロードをお願いします。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

c# でリスニング状態のポートを確認する方法

c# でリッスン状態のTCP/IPポートを確認する方法について説明します。

ipad-820272_640.jpg

IPGlobalProperties クラスと IPEndPointクラスを使用します。

IPGlobalProperties Class

IPEndPoint Class

以下のコードでは、portNo変数に指定したポート番号「8080」が、TCP/IPリスナーで使用されているかチェックします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//using System.Net.NetworkInformation;
//using System.Net;

int portNo = 8080;

IPGlobalProperties ipGlobalProperties = IPGlobalProperties.GetIPGlobalProperties();
IPEndPoint[] tcpConnInfoArray = ipGlobalProperties.GetActiveTcpListeners();

foreach (IPEndPoint endpoint in tcpConnInfoArray)
{
if (endpoint.Port == portNo)
{
//ポート使用中
}
}

IPEndPointクラスには、アドレスやポート番号といったプロパティが定義されています。

以下のように書くと、現在使用中のアドレスとポート番号を表示します。

1
2
3
4
5
6
7
8
9
10
//using System.Net.NetworkInformation;
//using System.Net;

IPGlobalProperties ipGlobalProperties = IPGlobalProperties.GetIPGlobalProperties();
IPEndPoint[] tcpConnInfoArray = ipGlobalProperties.GetActiveTcpListeners();

foreach (IPEndPoint endpoint in tcpConnInfoArray)
{
Console.WriteLine($"{endpoint.Address}:{endpoint.Port}");
}

- 実行例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
0.0.0.0:21
0.0.0.0:80
0.0.0.0:135
0.0.0.0:445
0.0.0.0:5040
0.0.0.0:49664
0.0.0.0:49665
0.0.0.0:49666
0.0.0.0:49667
0.0.0.0:49668
0.0.0.0:49669
0.0.0.0:49670
127.0.0.1:2323
127.0.0.1:60183
127.0.0.1:60206
127.0.0.1:60207
192.168.2.111:139
:::21
:::80
:::135
:::445
:::49664
:::49665
:::49666
:::49667
:::49668
:::49669
:::49670

ちなみに、アクティブなUDPリスナーを参照するには、GetActiveUdpListeners()を使用します。

1
2
3
4
5
6
7
8
9
10
//using System.Net.NetworkInformation;
//using System.Net;

IPGlobalProperties ipGlobalProperties = IPGlobalProperties.GetIPGlobalProperties();
IPEndPoint[] tcpConnInfoArray = ipGlobalProperties.GetActiveUdpListeners();

foreach (IPEndPoint endpoint in tcpConnInfoArray)
{
Console.WriteLine($"{endpoint.Address}:{endpoint.Port}");
}

- 実行例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
0.0.0.0:5050
0.0.0.0:5353
0.0.0.0:5353
0.0.0.0:5353
0.0.0.0:5355
127.0.0.1:1900
127.0.0.1:49664
127.0.0.1:63487
127.0.0.1:63488
127.0.0.1:63684
127.0.0.1:63685
127.0.0.1:64536
127.0.0.1:64612
127.0.0.1:64613
127.0.0.1:64850
127.0.0.1:64851
192.168.2.111:137
192.168.2.111:138
192.168.2.111:1900
192.168.2.111:64535
:::5353
:::5353
:::5355
::1:1900
::1:64534
fe80::c567:d05e:b3fa:a62e%4:1900
fe80::c567:d05e:b3fa:a62e%4:64533

ExecNote.app リリースしました!

ExecNoteは、コードが実行できるMarkdownアプリケーションです。Markdownドキュメント内に記載したコードをクリックすると実行ができます。わざわざターミナルを 起動させる必要がありません!無料ですのでもしよければダウンロードをお願いします。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

【議事メモのススメ】議事録ではなく、要点のみ記載した議事メモを書こう

会議のとき、議事録を書いていますか?

議事録は「誰が」「何を」「いつ」発言したかを事細かに記載したもので、無駄が多かったり要点が分かりにくいなどのデメリットがあります。

一方で、要点だけをまとめた「議事メモ」を書くと、少ない文章量で簡潔に会議結果を表すことができます。

この記事では、議事メモの書き方、メリットについて紹介します。

議事メモとは?

議事メモとは、会議の結果を要点だけ記載したメモです。

具体的には、以下のような内容を書きます。

  • 出席者
  • 会議の開催日時
  • 決定事項
  • 特記事項(決定に至った経緯など)
  • 宿題事項
  • 今後の検討事項

議事メモの特徴は、要点だけを書くということです。

議事録と議事メモの違い

議事メモは、会議の要点だけを書きます。

そのため、少ない文章量で書ききることができます。

一方で、議事録は、誰がどう発言したか、会議の進行内容が分かるように書くのが一般的です。

会議時間や出席者が多くなると、議事録の記載内容は多くなります。

議事録のデメリット

議事録のデメリットは、以下のとおりです。

  • 一人ひとりの発言を文章に残すため、無駄が多い
  • 結論や決定事項に影響しない内容も議事録に残す必要がある。

議事録は無駄が多いです。細かい発言内容を記録する必要がありますが、その内容が必要になることなんてほとんどありません。

会議の種類・重要度にも因りますが、議事録ほどの情報量は必要ない場合がほとんどです。

議事メモのメリット

議事メモのメリットは、以下のとおりです。

  • 少ない文章量で会議の結果を表すことができる
  • 文章量が少ないので、書き手も読み手も時間短縮になる。
  • 宿題事項や決定事項がまとまっているので、読みやすく理解しやすい

議事メモは要点だけを書きます。そのため、書く時間が大幅に短縮できます。また、文章量が少ないので、読む人も簡単に読むことができます。

会議の内容にも因りますが、5分~10分ほどで書くことができるでしょう。

議事メモを書くときの注意事項

  • 議事メモの内容の漏れ・記載誤りが無いか、出席者に確認する

要点だけを書くという性質上、何を書くべきで何が不要なのか、ここを間違えてしまうと、残すべき情報が残らないということが発生します。

そのため、議事メモを書いたら必ず他の出席者に「内容の漏れ・誤りが無いか出席者に確認」しましょう。

おわりに

一般的な会議では、議事録ほどの情報量が必要なことはあまりありません。

要点だけをまとめた議事メモの方が、今後の作業方針や宿題事項などが分かりやすいです。時間短縮もできます。

無駄な時間を使わないよう、議事メモを積極的に活用してみてはいかがでしょうか。

ExecNote.app リリースしました!

ExecNoteは、コードが実行できるMarkdownアプリケーションです。Markdownドキュメント内に記載したコードをクリックすると実行ができます。わざわざターミナルを 起動させる必要がありません!無料ですのでもしよければダウンロードをお願いします。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

BlazorServerでリッスンポート番号を変更する方法

BlazorServerはデフォルトで http://localhost:5000https://localhost:5001 でリッスンしています。

このポート番号を変更する方法について紹介します。

IWebHostBuilder UseUrls を使う

Program.cs では、以下のとおりCreateHostBuilderが記述されています。

1
2
3
4
5
6
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});

webBuilder.UseStartupのあとに.UseUrlsを使ってURLを指定します。

localhostのURLを1つだけ定義する

以下のように書くと、10111番ポートでhttpリクエストを受け付けます。

1
2
3
4
5
6
7
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>()
.UseUrls("http://localhost:10111");
});

localhostのURLを2つ以上定義する方法

UseUrlsはString型配列を引数として持つことができますので、以下のように複数のURLを定義することもできます。

このように書くと、http://localhost:10111https://localhost:10112 の2つで受け付けることになります。

1
2
3
4
5
6
7
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>()
.UseUrls(new string[] {"http://localhost:10111", "https://localhost:10112"});
});

外部ネットワークに向けてポートを解放する方法

URLをlocalhostではなくIPアドレスで指定すると、外部ネットワークに向けてポートを解放することもできます。

1
2
3
4
5
6
7
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>()
.UseUrls(new string[] {"http://192.168.2.112:10111", "https://192.168.2.112:10112"});
});

ExecNote.app リリースしました!

ExecNoteは、コードが実行できるMarkdownアプリケーションです。Markdownドキュメント内に記載したコードをクリックすると実行ができます。わざわざターミナルを 起動させる必要がありません!無料ですのでもしよければダウンロードをお願いします。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

【超簡単】c#でJSONを読み書きする方法

c#でJSONファイルに変換したり、JSONファイルを読み込む方法について紹介したいと思います。

使用するアセンブリ

この記事では System.Text.Json を使用しています。

そのため、ソースコードの先頭に以下を記述します。

1
using System.Text.Json;

クラスオブジェクトをJSONに変換する

以下のようなクラスがあったとします。

1
2
3
4
5
class Data {
public int id {get; set;}
public string name {get; set;}
public string dept { get; set;}
}

このクラスに値をセットして、JSONに出力するソースコードは以下になります。

1
2
3
4
5
6
7
8
9
10
11
12
static void JsonSer()
{
Data data = new Data();

data.id = 1;
data.name = "john";
data.dept = "Purchase";

string jsonStr = JsonSerializer.Serialize(data);
Console.WriteLine(jsonStr);

}

Dataクラスを dataとしてオブジェクトを作成して、値をセットします。

1
2
3
4
5
Data data = new Data();

data.id = 1;
data.name = "john";
data.dept = "Purchase";

シリアライズ(JSON形式に変換)し、string型変数に格納します。

1
string jsonStr = JsonSerializer.Serialize(data);

以下のように出力されれば、成功です。

1
{"id":1,"name":"john","dept":"Purchase"}

配列のクラスオブジェクトをJSONに変換する

配列オブジェクトも簡単にシリアライズできます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
static void JsonSerArray()
{
Data[] data = new Data[3];

data[0] = new Data();
data[0].id = 1;
data[0].name = "john";
data[0].dept = "Purchase";

data[1] = new Data();
data[1].id = 2;
data[1].name = "Mickey";
data[1].dept = "Sales";

data[2] = new Data();
data[2].id = 3;
data[2].name = "Donald";
data[2].dept = "Planning";

string jsonStr = JsonSerializer.Serialize(data);
Console.WriteLine(jsonStr);

}

以下のように出力されれば、成功です。

1
[{"id":1,"name":"john","dept":"Purchase"},{"id":2,"name":"Mickey","dept":"Sales"},{"id":3,"name":"Donald","dept":"Planning"}]

JSONを読み込み、クラスオブジェクトに格納する方法

今度は逆にJSONをファイルから読み込み、クラスオブジェクトに格納してみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
static void readJson()
{

string jsonStr = ReadAllLine("jsonStr.json", "utf-8");

Data jsonData = new Data();
jsonData = JsonSerializer.Deserialize<Data>(jsonStr);

Console.WriteLine($"jsonData.id = {jsonData.id}");
Console.WriteLine($"jsonData.name = {jsonData.name}");
Console.WriteLine($"jsonData.dept = {jsonData.dept}");

}

読み込むファイルjsonStr.jsonの中身は、以下のとおりです。

1
{"id":1,"name":"john","dept":"Purchase"}

ReadAllLine関数は、ファイルを全行読み込む処理を行います。

1
2
3
4
5
6
7
8
public static string ReadAllLine(string filePath, string encodingName)
{
StreamReader sr = new StreamReader(filePath, Encoding.GetEncoding(encodingName));
string allLine = sr.ReadToEnd();
sr.Close();

return allLine;
}

JSONデータを読み込み(デシリアライズ)するには、JsonSerializer.Deserialize<T>を使用します。

1
jsonData = JsonSerializer.Deserialize<Data>(jsonStr);

以下のように標準出力に出力されれば成功です。

1
2
3
jsonData.id = 1
jsonData.name = john
jsonData.dept = Purchase

配列型JSONを読み込み、クラスオブジェクトに格納する方法

今度は配列型のJSONをデシリアライズしてみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
static void readJsonArray()
{

string jsonStr = ReadAllLine("jsonStrArray.json", "utf-8");
Console.WriteLine(jsonStr);

Data[] jsonData = new Data[3];
jsonData = JsonSerializer.Deserialize<Data[]>(jsonStr);

foreach(Data item in jsonData)
{
Console.WriteLine($"jsonData.id = {item.id}");
Console.WriteLine($"jsonData.name = {item.name}");
Console.WriteLine($"jsonData.dept = {item.dept}");
}

}

読み込むファイルjsonStrArray.jsonの中身は以下のとおりです。

1
[{"id":1,"name":"john","dept":"Purchase"},{"id":2,"name":"Mickey","dept":"Sales"},{"id":3,"name":"Donald","dept":"Planning"}]

このデータは配列要素が3つありますので、Dataクラスオブジェクトを要素3の配列として定義します。

1
Data[] jsonData = new Data[3];

デシリアライズする際の型はData[]になります。

1
jsonData = JsonSerializer.Deserialize<Data[]>(jsonStr);

以下のように出力されれば成功です。

1
2
3
4
5
6
7
8
9
jsonData.id = 1
jsonData.name = john
jsonData.dept = Purchase
jsonData.id = 2
jsonData.name = Mickey
jsonData.dept = Sales
jsonData.id = 3
jsonData.name = Donald
jsonData.dept = Planning

ソースコード全文

この記事を書くにあたって使用したソースコードの全文を記載します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
using System;
using System.Text.Json;
using System.IO;
using System.Text;


namespace csjson
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
readJsonArray();
}

class Data {
public int id {get; set;}
public string name {get; set;}
public string dept { get; set;}
}

static void JsonSer()
{
Data data = new Data();

data.id = 1;
data.name = "john";
data.dept = "Purchase";

string jsonStr = JsonSerializer.Serialize(data);
Console.WriteLine(jsonStr);
writeFile("utf-8", "jsonStr.json", jsonStr);

}

static void JsonSerArray()
{
Data[] data = new Data[3];

data[0] = new Data();
data[0].id = 1;
data[0].name = "john";
data[0].dept = "Purchase";

data[1] = new Data();
data[1].id = 2;
data[1].name = "Mickey";
data[1].dept = "Sales";

data[2] = new Data();
data[2].id = 3;
data[2].name = "Donald";
data[2].dept = "Planning";

string jsonStr = JsonSerializer.Serialize(data);
Console.WriteLine(jsonStr);
writeFile("utf-8", "jsonStrArray.json", jsonStr);

}

static void readJson()
{

string jsonStr = ReadAllLine("jsonStr.json", "utf-8");
Console.WriteLine(jsonStr);

Data jsonData = new Data();
jsonData = JsonSerializer.Deserialize<Data>(jsonStr);

Console.WriteLine($"jsonData.id = {jsonData.id}");
Console.WriteLine($"jsonData.name = {jsonData.name}");
Console.WriteLine($"jsonData.dept = {jsonData.dept}");

}



static void readJsonArray()
{

string jsonStr = ReadAllLine("jsonStrArray.json", "utf-8");
Console.WriteLine(jsonStr);

Data[] jsonData = new Data[3];
jsonData = JsonSerializer.Deserialize<Data[]>(jsonStr);

foreach(Data item in jsonData)
{
Console.WriteLine($"jsonData.id = {item.id}");
Console.WriteLine($"jsonData.name = {item.name}");
Console.WriteLine($"jsonData.dept = {item.dept}");
}

}





public static void writeFile(string encodingName, string filePath, string writeText)
{

Encoding encoding = Encoding.GetEncoding(encodingName);
StreamWriter writer = new StreamWriter(filePath, false, encoding);
writer.WriteLine(writeText);

writer.Close();

}

public static string ReadAllLine(string filePath, string encodingName)
{
StreamReader sr = new StreamReader(filePath, Encoding.GetEncoding(encodingName));
string allLine = sr.ReadToEnd();
sr.Close();

return allLine;
}


}
}

ExecNote.app リリースしました!

ExecNoteは、コードが実行できるMarkdownアプリケーションです。Markdownドキュメント内に記載したコードをクリックすると実行ができます。わざわざターミナルを 起動させる必要がありません!無料ですのでもしよければダウンロードをお願いします。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

JavaScriptからBlazor関数を呼び出す方法

Blazorを使うとSPAを簡単に開発することができます。C#プログラマーにとってはうれしいフレームワークです。

この記事では、JavaScriptからBlazor関数を呼び出す方法について紹介します。

引数なし、返り値なしでBlazor関数を呼び出す

引数なしで関数を呼び出すには、以下のようき書きます。

  • 呼び出し側のJavaScript
1
2
3
4
function CallBlazorFunc()
{
DotNet.invokeMethodAsync('20200713', 'JSInvokableFunc1')
}
  • JavaScriptから呼び出されるBlazor関数
1
2
3
4
5
[JSInvokable]
public static void JSInvokableFunc1()
{
Console.WriteLine("JSInvokableFunc1 called");
}

JavaScript側は、DotNet.invokeMethodAsyncを使用します。

第一引数は、呼び出す関数の名前空間を指定します。

第二引数は、呼び出すBlazor関数名を指定します。

ブラウザからJavaScriptを実行すると、以下のようにIISウェブサーバー標準出力に「JSInvokableFunc1 called」が表示されれば成功です。

引数ありでBlazor関数を呼び出す

引数を与えるには、DotNet.invokeMethodAsyncの第三引数以降に記載します。

  • 呼び出し側のJavaScript
1
2
3
4
5
6
function CallBlazorFuncWithParam()
{
let param1 = 'param1';
DotNet.invokeMethodAsync('20200713', 'CallBlazorFuncWithParam', param1)

}
  • JavaScriptから呼び出されるBlazor関数
1
2
3
4
5
[JSInvokable]
public static void CallBlazorFuncWithParam(string param1)
{
Console.WriteLine($"CallBlazorFuncWithParam called : {param1}");
}

引数に「param1」を与えた場合、以下のようにIISウェブサーバー標準出力に「CallBlazorFuncWithParam called : param1」が表示されれば成功です。

Blazor関数を呼び出し、返り値を取得する

Blazor関数の返り値をJavaScript側に返すこともできます。

  • 呼び出し側のJavaScript
1
2
3
4
5
6
7
function CallBlazorFuncRetValue()
{
DotNet.invokeMethodAsync('20200713', 'CallBlazorFuncRetValue')
.then(data => {
console.log(data);
})
}
  • JavaScriptから呼び出されるBlazor関数
1
2
3
4
5
6
[JSInvokable]
public static string CallBlazorFuncRetValue()
{
Console.WriteLine("CallBlazorFuncRetValue");
return "CallBlazorFuncRetValue";
}

thenメソッドでデータを取得して利用します。

実行すると、以下のようにブラウザコンソールに「CallBlazorFuncRetValue」が出力されれば成功です。

ソースコード全文

この記事で紹介したソースコードです。

  • 呼び出し側のJavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function CallBlazorFunc()
{
DotNet.invokeMethodAsync('20200713', 'JSInvokableFunc1')
}

function CallBlazorFuncWithParam()
{
let param1 = document.getElementById("param1").value;
console.log(param1);
DotNet.invokeMethodAsync('20200713', 'CallBlazorFuncWithParam', param1)

}

function CallBlazorFuncRetValue()
{
DotNet.invokeMethodAsync('20200713', 'CallBlazorFuncRetValue')
.then(data => {
console.log(data);
})
}
  • razorページ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
@page "/fromJS"

<h1>From JavaScript Function</h1>

<button onclick="CallBlazorFunc()">CallBlazorFunc</button>

<hr>

<input type="text" placeholder="param1" id="param1"/>
<button onclick="CallBlazorFuncWithParam()">CallBlazorFuncWithParam</button>

<hr>

<button onclick="CallBlazorFuncRetValue()">CallBlazorFuncRetValue</button>



@code {

[JSInvokable]
public static void JSInvokableFunc1()
{
Console.WriteLine("JSInvokableFunc1 called");
}

[JSInvokable]
public static void CallBlazorFuncWithParam(string param1)
{
Console.WriteLine($"CallBlazorFuncWithParam called : {param1}");
}

[JSInvokable]
public static string CallBlazorFuncRetValue()
{
Console.WriteLine("CallBlazorFuncRetValue");
return "CallBlazorFuncRetValue";

}
}

ExecNote.app リリースしました!

ExecNoteは、コードが実行できるMarkdownアプリケーションです。Markdownドキュメント内に記載したコードをクリックすると実行ができます。わざわざターミナルを 起動させる必要がありません!無料ですのでもしよければダウンロードをお願いします。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱