\

c#でPowerShellスクリプトを実行する方法

c# でPowerShellスクリプトを実行する方法を紹介します。

この記事での実行方法は、System.Management.Automationを使用する方法ではなく、Powershell.exe を呼び出して実行します。

実行するソースコード

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

//using System.Diagnostics;


/// <summary>
/// PowerShellスクリプトを実行する
/// </summary>
/// <param name="ps1FilePath">PowerShellスクリプト(*.ps1)ファイル名</param>
/// <param name="args">引数リスト</param>
/// <param name="stdOut">標準出力</param>
/// <param name="stdErr">標準エラー出力</param>
/// <param name="exitCode">終了コード</param>
public static void ExecPSProcess(string ps1FilePath, List<PowerShellArgs> args, out string stdOut, out string stdErr, out int exitCode)
{
stdOut = "";
stdErr = "";
exitCode = 0;

try
{
string cmdStr = "";
cmdStr = $"-File {ps1FilePath} ";
foreach(var item in args)
{
cmdStr = cmdStr + $"-{item.argName} {item.argValue}";
}

System.Diagnostics.Process process = new System.Diagnostics.Process();
ProcessStartInfo processStartInfo = new ProcessStartInfo("powershell.exe", cmdStr);

processStartInfo.CreateNoWindow = true;
processStartInfo.UseShellExecute = false;

processStartInfo.RedirectStandardOutput = true;
processStartInfo.RedirectStandardError = true;

process = System.Diagnostics.Process.Start(processStartInfo);
process.WaitForExit();

stdOut = process.StandardOutput.ReadToEnd();
stdErr = process.StandardError.ReadToEnd();
exitCode = process.ExitCode;

process.Close();

}
catch
{
throw;
}
}

以下のコードで、PowerShell.exe の後に続くコマンド文字列を作成します。
-FileスイッチでPowerShellスクリプトファイルパスを指定しています。
スクリプトの引数が格納されているargsforeachでループして、引数を指定するコマンド文字列を作成します。
PowerShellArgsクラスは後述しています。

1
2
3
4
5
6
string cmdStr = "";
cmdStr = $"-File {ps1FilePath} ";
foreach(var item in args)
{
cmdStr = cmdStr + $"-{item.argName} {item.argValue}";
}

プロセスオブジェクトを作成して、コマンド文字列を指定します。

1
2
System.Diagnostics.Process process = new System.Diagnostics.Process();
ProcessStartInfo processStartInfo = new ProcessStartInfo("powershell.exe", cmdStr);

ウィンドウの非表示などを指定します。
プロセスを開始し、標準出力、標準エラー出力、終了コードを取得します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
processStartInfo.CreateNoWindow = true;
processStartInfo.UseShellExecute = false;

processStartInfo.RedirectStandardOutput = true;
processStartInfo.RedirectStandardError = true;

process = System.Diagnostics.Process.Start(processStartInfo);
process.WaitForExit();

stdOut = process.StandardOutput.ReadToEnd();
stdErr = process.StandardError.ReadToEnd();
exitCode = process.ExitCode;

process.Close();

引数を指定するクラスPowerShellArgsクラス

PowerShellスクリプトに渡す引数は以下のクラスを用いて説明します。
上記で説明した関数では、複数指定されることを考慮し、リスト型にして渡しています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/// <summary>
/// PowerShellスクリプト呼び出し引数クラス
/// </summary>
public class PowerShellArgs
{
/// <summary>
/// 引数名称
/// </summary>
/// <value></value>
public string argName {get; set;}

/// <summary>
///
/// </summary>
/// <value></value>
public string argValue {get; set;}
}

実行方法

例えば、以下のようなPowerShellスクリプトを実行するとします。
引数OpenFileNameで指定したファイルを、Visual Studio Codeで開くという動作をします。

1
2
3
Param($OpenFileName)

code $OpenFileName

これを実行するためのExecPSProcess関数を呼び出すコードは以下になります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
string ps1FilePath = @"D:\OpenFileWithCode.ps1";
PowerShellArgs args = new PowerShellArgs();
args.argName = "OpenFileName";
args.argValue = @"D:\docs.md";

List<PowerShellArgs> argsList = new List<PowerShellArgs>();
argsList.Add(args);

string stdout = "";
string stderr = "";
int exitCode = 0;

ExecPSProcess(ps1FilePath, argsList, out stdout, out stderr, out exitCode);

Console.WriteLine(exitCode);
Console.WriteLine(stdout);
Console.WriteLine(stderr);

実行するPowerShellスクリプトファイルパスを指定し、引数を定義します。
引数はリスト型のPowerShellArgsオブジェクトに格納します。

1
2
3
4
5
6
7
string ps1FilePath = @"D:\OpenFileWithCode.ps1";
PowerShellArgs args = new PowerShellArgs();
args.argName = "OpenFileName";
args.argValue = @"D:\docs.md";

List<PowerShellArgs> argsList = new List<PowerShellArgs>();
argsList.Add(args);

標準出力、標準エラー出力、終了コードを取得する変数を定義し、ExecPSProcessを呼び出します。

1
2
3
4
5
6
7
8
9
string stdout = "";
string stderr = "";
int exitCode = 0;

ExecPSProcess(ps1FilePath, argsList, out stdout, out stderr, out exitCode);

Console.WriteLine(exitCode);
Console.WriteLine(stdout);
Console.WriteLine(stderr);

About Me

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

曖昧な問題点を具体化して解決策を検討する【GOAL, WHAT, WHO, HOWの明確化が必要】

会社員として働いていると、様々な問題を相談されたり、気付いたりします。

私は社内SEとして働いていますが、「開発効率を上げられないか」「業務担当者でもシステムを作れないか」「ナレッジ管理をしたい」など、です。

これらの問題は非常に曖昧でざっくりしており、何から考えたらいいか分からないことも多くあります。

この記事では、非常に曖昧な問題点を具体化して解決策を検討する方法を紹介します。

この記事のまとめ

  • 問題解決のゴールを明確にする
  • WHAT, WHO, HOW を明確にする

問題解決のゴールを明確にする

まずは、どこまで達成すればいいのか、目標(ゴール)を明確にしましょう。

「開発効率を上げられないか」であれば、「1人月で開発可能なステップ数」などです。具体的に数字で表しましょう。

数字で表すことで、目標に対してどれだけ達成しているのか、「達成率」も数字で表せます。経営陣への説明に効果を発揮します。

WHATを明確にする。

まずは問題点を具体化しないと、どのように解決していけばいいか、道筋が立てられません。

具体化するには、カテゴリ分けして考えてみるという方法があります。

「開発効率を上げる」ということを考えると、

  • **個別システム(ERPやEDIなど)の開発効率
  • 内製・外注などの開発担当の効率
  • プログラム言語やフレームワークの開発効率

などです。

「開発効率を上げる」だけでは、「何の」開発効率を上げるのか、曖昧です。まずはそこを具体化してみます。

「業務担当者でもシステムを作れないか」という問題に対して検討していくのであれば、「何の」システムを業務担当者が作るのか、を明確にしなければいけません。

「ナレッジ管理をしたい」のであれば、「何の」ナレッジを管理したいのか、検討しましょう。

WHOを明確にする。部門や担当者などに特化した解決方法を考えてみる

同じ問題を共有しているすべての人に対して、改善させてあげられたら、それは素晴らしいことです。しかし、それは中々難しい。

そのため、問題を解決させてあげる対象者や対象部門を明確にする必要があります。

「業務担当者でもシステムを作れないか」という問題であれば、「システムを作る人は誰か」を明確にする必要があります。

  • 簡単なプログラム言語の使用経験がある人
  • 開発ツールの使用方法を知っている人
  • ロジックの組立方も分からない、完全な非エンジニア

などです。

「開発ツールの使用方法をしっている人」または「使用方法を学んでもらう人」は、そのツールに特化した解決方法を実行できます。

一方で、「ロジックの組立方も分からない、完全な非エンジニア」であれば、勉強してもらうことからスタートしないといけません。

誰に対して解決方法を提供するのか、これを明確にしないと、アプローチの仕方が全く変わってきます。

HOWを明確にする。何があれば解決するのか、本質を見極める

ここまでくれば、「何を使って、どのように」解決するのかが検討可能になると思います。

具体的な解決方法の施策の検討です。

「業務担当者でもシステムを作れないか」という問題であれば、「UiPathの使い方を知っている人が、UiPathを使ってシステムを作る」などです。

HOWを明確にするということは、解決可能な範囲を明確にするということです。

その解決可能な範囲が、問題提起者にとって満足するかどうかをよく考えておく必要があります。

例えば、「UiPathを使って解決する」ということは、UiPathを使って開発可能なシステムしか解決できません。具体的にいうと、EXCELやOutlookなどを使用したシステム開発はできますが、多人数から情報を求めて集計するなど、サーバー型のシステムは作れません。

このHOWが決まれば、作業アイテムが明確になりますので、見積書を入手してプロジェクト企画書が作成できるようになります。

About Me

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

副業を考えているシステムエンジニアの本業の使い方

現在は、会社で働いていても収入が少ない・安定しないなど、会社勤め・本業に対する不安が多い時代になっています。

副業が重要になってきていますが、本業の実務経験や会社員としての権利を徹底的に副業に活かすべきです。

この記事では、副業を考えているシステムエンジニアの本業の使い方を紹介します。

この記事のまとめ

  • 会社のお金でセミナーを受講しよう
  • 企画書を作って、会社からお金とメンバーを使わせて貰おう
  • 同業他社交流会で他社の課題・問題点を聞いてこよう
  • 最新のツールやフレームワークを導入しよう
  • 有給休暇を使って副業しよう

有料のセミナーを受講する

新しい知識やスキルを身に着けるには、ハンズオンなどのセミナーを受講するのが一番手っ取り早いです。

そしてこのようなセミナーは、内容の濃いものになるほど有料になります。そして有料のセミナーは1回10万円前後するものもあり、かなり高額です。

正社員であれば必ず教育費用が予算に含まれているはずですので、これを積極的に使いましょう。会社員の権利です。

仕事が忙しくて時間が取れない場合や、外出規制されている場合は、eラーニングなどを使いましょう。

どのような副業をするかにもよりますが、副業に役に立つセミナーであれば積極的に活用しましょう。

企画書を作ってプロジェクトを立ち上げる

大きな仕事をするには、お金とチームメンバーが必ず必要になります。しかし、個人や副業では、お金とメンバー集めがなかなか大変です。

お金とメンバーを使ったプロジェクトの進め方を知っていれば、いざ副業で出来ることになったときに、パフォーマンスが違います。

これを会社で経験しましょう。会社の経営にマッチした企画書を作って、経営陣に説明して、お金(予算)とメンバーを確保してもらうのです。

私は社内SEとして働いており、開発期間の短縮化が課題でした。そのため、UiPathというRPAを導入する企画書を作成し、年間400万円というお金を会社に出してもらいました。

個人で年間400万円はかなり高額ですが、会社にとっては安いものです。積極的に会社にお金を出させましょう。

同業他社交流会に積極的に参加する

会社員として働いているということは、会社の看板を背負っているということです。しかし、これを重く受け止める必要はなく、利用してやるのがこの記事の目的です。

看板を背負って同業他社交流会に参加しましょう。このような交流会では、他社のノウハウや課題・解決方法・現在も困っていることなど、様々な情報が共有されます。

この情報を副業に活かすのです。困っていることは、お金を払ってでも解決したいものです。100万円は個人にとっては高額ですが、会社にとっては安価です。困っていることを副業サービスにしてお金を得られるようにすれば、副業収入も安定して楽しくなるはずです。

最新のツールや技術を積極的に導入・検討する

最新のツールや技術は、業界全体の課題を解決していることが多いです。RPAであれば非エンジニアでも簡単に業務効率化できる、Flutterでは、マテリアルデザインを用いてiOSとAndroidのクロスプラットフォームアプリが作れる、という感じです。

リリースしてあまり期間が経過していない場合は安定性や事例に乏しかったりしますので、適用時期は検討が必要ですが、これらの使用経験があるということは会社にとっても自分にとっても利益があります。

有給休暇を使って副業をする

有給休暇こそ会社員の最大の権利です。休んでもお金がもらえるとか最高です。

有給休暇を使って副業してしまいましょう。本業だけでは不安な世の中ですから、副業の収入を手厚くする必要があります。

積極的に有給休暇を使って、副業の基盤を構築しましょう。土日は少し休みたかったり、様々な予定が入ってしまいなかなか捗らないと思いますので、有給休暇を使って平日に副業をやるのです。

副業がうまくいけば、日々の生活がとても楽しくなるはずです。理想の自分になれるように、少しずつがんばりましょう。

About Me

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

システム障害報告書に記載するべき内容

システム開発をしていると、必ずといっていいほどシステム障害に見舞われることがあります。

システム障害が発生すると、業務や経営に多大な影響を及ぼします。そのため、できるだけ早く原因・対策・報告することが必要になります。

この記事では、システム障害報告書に記載するべき内容について紹介します。

この記事で取り扱うトラブル事例

この記事では、以下のトラブルが発生したという想定で説明したいと思います。

  • ネットワーク機器の故障により、インターネット通信が遮断された
  • これにより、お客様EDIシステムからのデータ受信ができず、計画・発注業務に影響があった
  • 機器のリプレイスを行うことで対策した

事象

事象とは、どのような障害が起こったのか、という内容です。具体的には、以下のような障害事象ですね。

  • 外部向けネットワーク通信が遮断された
  • お客様EDIシステムへからの受注データ受信に失敗した

システム目線で、何が起こったのかを明確に書くことがこのセクションの目的です。何が、どうなったのか、主語と述語を明確にしましょう。

発生日時

障害事象が何時からどれだけの期間発生したのか、書きましょう。

影響

影響とは、発生した事象に対して、業務にどのような損害があったのかを記載します。

例えば、上記の事象からは、以下の影響があったとします。

  • 生産計画の立案ができず、取引先様への注文データ送信が遅延した
  • 取引先様での計画立案が遅延した

特に業務影響は情報システム部門だけでは分からないことが多いです。業務部門へのヒアリングが必要になるでしょう。

直接原因

障害事象が発生した直接的な原因を記載します。この例でいえば、

  • ネットワーク機器の故障

などが該当するかと思います。

根本原因

根本原因は、なぜ「直接原因」に至ったのか、を書きます。
この例では「なぜネットワーク機器が故障したのか」「故障するまでリプレイスされなかったのか」という視点から書きます。

  • 廃番機種であり、新型機種へのリプレイスを検討中であったため、リプレイスされていなかった

など、直接原因を深堀した内容を記載しましょう。

暫定対策

暫定対策とは、発生した障害から回復するために対応した行動のことを書きます。今回は、故障したネットワーク機器をリプレイス
することですので、以下のような内容になります。

  • 障害が発生したネットワーク機器をリプレイスし、通信可能であることを確認した

恒久対策

恒久対策とは、今回のような障害が二度と発生しないような対策を指します。暫定対策で記載したネットワーク機器のリプレイスだけでは、他の機器も同じように故障してしまう可能性があるためです。

  • 廃番機種のリプレイス作業プロセスの見直し

このように、プロセス見直しを恒久対策とすれば、廃番機種が同様の障害に見舞われることはなくなります。

対策スケジュール

暫定対策・恒久対策が完了するまでのスケジュールを書きましょう。

いつになったら完了するのか、現在どこまで作業が進んでいるのか明確にするためです。

ガントチャートが便利で分かりやすいと思います。

About Me

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

BlazorでLiteDBのレコードを表示する方法

この記事では、BlazorでLiteDBのレコードを表示する方法を紹介したいと思います。

LiteDBはC#で書かれたポータルNoSQLデータベースです。すべての.NETプラットフォームで使えますので、Blazorでも簡単に扱うことができます。

ゴール

以下のように、BlazorページでLiteDBのレコードを表示する機能を実装します。

データ定義とサンプルデータ

テーブル名をTaskInfoとします。

以下のようなデータクラスを定義します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/// <summary>
/// タスク情報データ
/// </summary>
public class Data
{
/// <summary>
/// NoSQL Unique ID (Auto Increase, Can be set null)
/// </summary>
public int id { get; set; }

public string taskID { get; set; }
public string taskTItle { get; set; }
public string taskDescription { get; set; }
public DateTime taskCreationDate { get; set; }
public string taskCreationUserID { get; set; }
public DateTime taskUpdateDate { get; set; }
public string taskUpdateUserID { get; set; }
}

テストデータとして、以下のデータを格納しました。

LiteDBの基本的な使い方とデータのインサート方法は以下の記事を参照ください。

.NET系言語でポータブルNoSQLデータベースを使うにはLiteDBがおすすめ

全レコードを取得するコード GetAllRecord()

以下のコードで全レコードを取得します。

返り値は、先ほどのデータクラスのリスト型オブジェクトとします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/// <summary>
/// 全レコード取得
/// </summary>
/// <returns></returns>
public static List<TaskInfo.Data> GetAllRecord()
{
using(LiteDatabase litedb = new LiteDatabase(liteDBPath))
{
var col = litedb.GetCollection<TaskInfo.Data>(taskInfoTableName);
var result = col.Query()
.ToList();

return result;
}
}

以下のコードでLiteDBに接続します。
liteDBPathには、LiteDBファイルのフルパスが格納されているものとします。

1
using(LiteDatabase litedb = new LiteDatabase(liteDBPath))

以下のコードでコレクションオブジェクトを取得します。

1
var col = litedb.GetCollection<TaskInfo.Data>("TaskInfo");

以下のコードで全レコードを取得し、リスト型に変換します。

1
2
var result = col.Query()
.ToList();

リスト型オブジェクトを返却します。

1
return result;

razorページ

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
<table class="table">
<thead>
<tr>
<td>タスクID</td>
<td>タスクタイトル</td>
<td>タスク説明</td>
<td>タスク作成日</td>
<td>タスク作成者</td>
<td>タスク更新日</td>
<td>タスク更新者</td>
</tr>
</thead>
<tbody>

@foreach (var item in taskInfoDataList)
{
<tr>
<td>@item.taskID</td>
<td>@item.taskTItle</td>
<td>@item.taskDescription</td>
<td>@item.taskCreationDate.ToString()</td>
<td>@item.taskCreationUserID</td>
<td>@item.taskUpdateDate.ToString()</td>
<td>@item.taskUpdateUserID</td>
<!--
<td><button @onclick="@(e => EditTaskData(@item.taskID))">Edit</button></td>
-->
</tr>
}

</tbody>
</table>



<button @onclick="DisplayTask">Display Task</button>

tbodyタグの中で、razor構文の@foreachを用いてループします。

@codeの中は以下のようにコーディングします。

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

/// <summary>
/// タスク情報リスト
/// </summary>
private List<TaskInfo.Data> taskInfoDataList = new List<TaskInfo.Data>();

/// <summary>
/// タスク情報表示
/// </summary>
private void DisplayTask()
{
taskInfoDataList = new List<TaskInfo.Data>();
taskInfoDataList = GetAllRecord();

}
}

foreachで出てきたtaskInfoDataListは、リスト型のオブジェクトです。

DisplayTask関数で、さきほどのGetAllRecord関数を呼び出し、taskInfoDataListにセットします。

これにより、razorページのforeachが処理され、データが表示されます。

動作確認

Blazorを実行してページを開き、Display Taskボタンをクリックすると、NoSQLデータベースの内容が表示されます。

About Me

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

PC事務作業を効率よく完了する方法

PC作業は、集中力が途切れていたり、分からないことやあったりして、効率よく作業が進まないことが多々あります。

この記事では、効率よくPC作業を完了させる方法を紹介します。

この記事のまとめ

  • 単純作業はマニュアル化。考えなくてもできるようにする
  • 情報システムを徹底的に活用する
  • 可能であれば自分でシステムやツールを開発する(おすすめはUiPathかExcelVBA)
  • 「今日のタスク一覧」を作成して、ゴールを明確にする
  • 突発的な作業が発生した場合は、期日を明確にする。後日でよければ、後日のタスク一覧に盛り込む
  • 仕事が終わったあとの自分へのご褒美を考える

単純作業はマニュアル化する。考えなくてもできるようにする。誰かに引き継ぐ

PC作業に必ずあるのは、単純作業です。請求書の作成であったり、社内申請書類の作成など、誰でもできるけど、それなりに量がある仕事です。

このような単純作業は、マニュアル化しましょう。考えなくても完了するくらいまでにマニュアル化して、集中力が途切れたときにやる仕事として位置付けると効果的です。

また、マニュアルになっていると、誰かに引き継ぎしやすくなります。

口頭で説明するよりも文書になっていた方が、引き継ぐ側も覚える量が少なくなりますので、スムーズに作業着手できます。

また、マニュアルがあったほうが、引継ぎ後も作業品質が上がりますので、ミスが少なくなります。

情報システムを徹底的に活用する

PC事務作業者ほど、自分でプログラムを作れるようになっていたほうがいいです。

なぜかというと、作業する人は自分なので、自分のやりやすいように、自分で作れるからです。

普通のシステム開発では、業務担当者が社内SEに開発を依頼し、社内SEがシステムベンダーに依頼するという、伝言ゲーム方式になっています。

これがかなりの無駄で、多人数に内容を正しく理解してもらうためには、設計ドキュメントの作成や打ち合わせなどを何度も実施する必要があります。

またシステムベンダーに開発を依頼するのであればお金もかかりますので、費用対効果の検証が求められます。

一方で、自分で使うものを自分の力で作れれば、これらの作業がすべて不要になります。

すぐに開発できて、必要なときに修正できる、このような仕事ができれば理想です。

それをどうやって実現するか?UiPathかExcelマクロを推奨します。

UiPath Community エディションのインストールと簡単なロボットの作成

ExcelVBAは覚える必要なし!書き方が分からなくなったら「マクロの記録」を使用してコードを自動生成しよう

「今日のタスク一覧」を作成する

今日どこまで終わったら帰れるのか、「今日のタスク一覧」を作成しましょう。

これらの作業が完了すれば、誰になんと言われようとも帰る!という固い決意をもって仕事を終わらせましょう。

人間はやはりゴールがないとモチベーションが上がりません。延々と続く仕事をだらだらと行い、今日までに終わらせなくてもいい仕事を今日やっていて、無駄に疲れて帰るようでは効率が上がりません。

会社によっては退社時刻が定められているところも多いと思いますが、フレックス勤務制になっている会社も多いと思います。

フレックスがあれば積極的に使って、定時前に帰りましょう。

フレックスが無い・またはトータル勤務時間の関係で使えない場合は、会社の休憩室でコーヒーでも飲みましょう。

残業して仕事して頑張ってるアピールをするのは時代遅れです。効率よく品質の高い仕事をして早く帰るほうが、自分にとっても会社にとってもメリットが大きいはずです。

問い合わせや作業依頼は、即レス・または後日対応する

「今日のタスク一覧」を作成しても、どうしても突発的に作業依頼が発生することがあります。

このような突発的な作業依頼は、まず、今日やらないといけないのか、後日でもいいのか、期日の明確にしましょう。

後日でもいいのであれば、翌日以降のタスク一覧に盛り込んで、一旦忘れましょう。

今日やらないといけない作業の場合は、即レスで終わらせましょう。本来予定していなかった作業ですので、割り当てる作業時間なんて本来はありません。

そのため、可能な限り短時間で集中して終わらせることが必要です。

また、「今日のタスク一覧」に影響してくる場合は、内容を見直し、翌日以降にずらしてもいいタスクが無いか、再検討しましょう。

人間、無理しないのが一番です。突発的な作業が入ったから予定が遅延している、というのは、誰もが認める真っ当な理由になると思います。

仕事が終わった後のことを考えてモチベーションを上げる

買い物に行くとか、飲みに行くとか、ジムに行くとか、仕事が終わった後にやることを考えておきましょう。

今日一日頑張った自分にご褒美をあげましょう。ご褒美があればかなりモチベーションがアップしますし、また明日も頑張ろうという気持ちになれます。

「仕事が終わってもやることがないなぁ。」と思っていると、モチベーションが上がらず仕事を効率よく完了できません。次にやることがあるから仕事を早く終わらせたい、そういう気持ちを大事にしないといけません。

仕事だけの生活では、何も楽しくないと思います。趣味や余暇など、仕事以外でエンジョイする人生設計をしましょう。

About Me

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

スコープを意識して変数を定義するメリット

プログラムを作る際、必ず変数を定義する必要があります。一言に変数と言っても、intstringなどの基本型だけでなく、何かのクラスオブジェクトの場合もあります。

この記事では、スコープを意識して変数を定義する理由とメリットを紹介します。

この記事のまとめ

  • 変数のスコープとは、参照・更新可能な範囲のこと
  • スコープの種類は、どこからでも参照できる「グローバル」や、「関数の中だけ」のスコープなどがある
  • すべてグローバル変数にしてしまうと、ソースコードは書きやすくなるが、思いがけないバグが発生する可能性がある
  • 基本的には関数内だけ参照・更新可能なスコープで定義し、関数の内外で受け渡ししたい場合は、引数でやりとりする

変数のスコープとは

  • スコープとは、参照・更新が可能な範囲のこと

変数のスコープとは、参照・更新が可能な範囲のことです。

スコープの種類はプログラム言語の思想によって種類が様々です。

例えば、

int score

という変数を定義した場合、どこからでも参照・更新可能なのか、一部の関数の中だけで参照・更新可能なのか、を考えるのがスコープです。

スコープの種類

  • グローバル
  • クラス内
  • 関数内
  • ルーチン内

例えばC#では、以下のようなスコープがあります。

スコープ概要

グローバル変数とは、どのクラス・関数からでも参照・更新可能な変数です。

クラス変数とは、そのクラスの中からのみ参照・更新可能。

「関数内」のみ参照・更新可能なスコープや、関数内の一部のルーチンの中だけ参照・更新可能なものなどがあります。

全てグローバル変数として定義した場合、何が懸念されるか?

  • バグの温床になる
  • 変数名が冗長化しやすい、多くの変数が定義されてしまう
  • ソースコードが読みにくくなる

すべてグローバル変数で定義してしまえば、プログラミングが簡単にできそうです。

確かに、プログラムはたくさんのクラスや関数からできています。1つの変数をどのクラス・関数からでも参照・更新できれば、柔軟性が上がります。

しかし、問題点がいくつかあります。

1つ目は、思いがけないタイミングで変数が更新されてしまい、バグの温床になります。

例えば「得点」を保持する変数を定義した場合、

  • 初期化
  • 特定の科目の得点
  • 合計得点
  • 平均点

など、様々な利用用途・更新タイミングが考えられます。

利用用途を制限して、更新タイミングが明確に把握できていれば問題ありませんが、グローバル変数を使用するということは、これらを明確にしないといけないということです。

利用用途を分けるために、別々の変数を定義するという方法が考えられます。

2つ目の問題点は、変数名が冗長化しやすいということです。

上記の「得点」という変数の例で言えば、

  • 初期化 = initializedScore
  • 特定の科目の得点 = mathScore, englishScore
  • 合計得点 = totalScore
  • 平均点 averageScore

など、変数名が長くなってしまい、余計な変数が生まれてしまいます。

今はパソコンのCPUやメモリが多く搭載されていますので問題になりませんが、余計な変数を定義するということは、余計なメモリを消費するということに直結します。

3つ目の問題点は、ソースコードが読みにくくなることです。

グローバル変数であるということは、どこからでも更新が可能ということですので、その変数がどの値になっているかは、先頭から順番にソースコードを読んでいかないと分かりません。

規模の小さいプログラムであれば問題になりませんが、大きなプログラムであれば、もはや人間が解読できるコードからかけ離れてしまう可能性もあります。

ソースコードが読める規模というのは、保守やメンテナンスがし易くなります。

正しいスコープの使い方

  • できるだけ、関数内やクラス内のスコープを使用する
  • グローバル変数は基本的には使用しない

正しく変数を使うためには、できるだけ関数内のスコープに留めておきましょう。

必要であればクラス内スコープを使用し、グローバル変数の使用は避けましょう。

理由としては、上述したとおり、バグの温床になったり、ソースコードが読みにくくなるためです。

プログラムは1度作成すれば完成になることはほとんどありません。必ずといっていいほど修正が発生します。

その修正のタイミングが、まだ記憶に新しい数日後などであればいいですが、1年後や2年度、もしくは他の誰かが作ったソースコードの修正を任された場合などは、読みやすさが重要になります。

読みやすいソースコードを書くためのアイデアは、以下にもまとめていますので、よろしければご覧ください。

ソースコードを読みやすくするためのアイデア

About Me

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

.NET系言語でポータブルNoSQLデータベースを使うにはLiteDBがおすすめ

.NET系言語でポータブルNoSQLデータベースを探している場合は、LiteDBがおすすめです。すべての.NETプラットフォームで使用可能であり、C#で書かれており親和性があり、DLLも軽量です。

詳しく説明します。

litedb.org

LiteDB - Embedded NoSQL database for .NET

NoSQLデータベースとは

  • リレーショナルデータベースと違い、テーブル定義が不要
  • キー項目を確定すれば、データ項目は可変でOK
  • DB設計工程の工数削減が期待できます。

NoSQL とは、一般的なリレーショナルデータベースとは異なり、キー項目を検索条件にして値を取得します。

テーブルレイアウトは可変であり、同じテーブル内のレコードであっても、項目を変えることができます。

リレーショナルではテーブル定義を決定しないと、データを格納できません。しかし、NoSQLデータベースでは、キー項目のみ確定しておけば、残りの項目は後から変更可能です。テーブル定義も不要です。

厳密にテーブル定義を決定する必要がないので、DB設計工程を大幅に短縮することができます。開発期間の短縮が見込まれ、アジャイル開発等で積極的に利用されています。

なぜおすすめか

  • すべての.NETプラットフォームで使える
  • C#で書かれており、親和性がある
  • Nugetで簡単インストール、DLLのファイルサイズが450KB以下
  • LiteDB.StudioというGUIツールが使える

C#でポータブルなNoSQLデータベースを使う場合、LiteDBをおすすめします。

LiteDB - Embedded NoSQL database for .NET

LiteDBはC#で書かれており、.NETフレームワークの共通言語ランタイムで処理可能な中間コードで実装されています。

.NET 4.5 または .NET Standard 2.0 以上で使用可能です。これにより、Windowsだけでなく、MacやLinux、Xamarinなど、すべての.NETプラットフォームで動作するNoSQLデータベースです。

NuGetから簡単にダウンロードでき、単一のDLLで構成されています。DLLのファイルサイズは450KB以下と軽量です。

以下で説明するLiteDB.STUDIOを使用すると、データベースの内容をGUIで操作することが可能です。

LiteDB.Studio の使い方

https://github.com/mbdavid/LiteDB.Studio

LiteDB.Studio はLiteDBv5で使用可能で、NoSQLのデータを表示・編集するためのGUIツールです。

上記のGithubリポジトリから、exeとソースコードを入手可能です。exeも同梱されていますので、コンパイルは不要です。

起動すると、以下のような画面が表示されます。

LiteDB Studio起動画面

「Connect」をクリックして、LiteDBファイルを選択します。

LiteDB Connection Manager

テーブルなどのオブジェクト一覧が内容が表示されます。テーブルをクリックするとコマンドが表示されますので、「Run」をクリックして実行すると、テーブル内容が表示されます。

LiteDB

LiteDBパッケージのインストール

Nugetから簡単インストールできます。

https://www.nuget.org/packages/LiteDB

名前空間は、LiteDBです。

インサートするコード

以下のデータ項目をクラスとして定義します。

1
2
3
4
5
6
7
8
public class customer
{
public int id { get; set; }
public string name { get; set; }
public string[] phones { get; set; }
public bool isActive { get; set; }
public string additional { get; set; }
}

idは、NoSQLデータベースのキー項目です。LiteDBが自動的に採番しますので、ソースコード上は値の設定が不要です。

以下のコードで、LiteDBファイルの作成とテーブルへのインサートを行います。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static void createLiteDB()
{
using (LiteDatabase litedb = new LiteDatabase(@"C:\jwork\@Programming\CoreConsole\DataBase\lite.db"))
{
var col = litedb.GetCollection<customer>("customers");

customer cus = new customer
{
name = "John Doe123",
phones = new string[] { "000-0000", "111-1111" },
isActive = true,
additional = "additional data"
};

col.Insert(cus);
}
}

以下のコードでLiteDBファイルを読み込みます。存在しなければ、自動的に作成されます。

1
using (LiteDatabase litedb = new LiteDatabase(@"C:\jwork\@Programming\CoreConsole\DataBase\lite.db"))

コレクションオブジェクトを作成します。

“customers”はLiteDBのテーブル名です。

1
var col = litedb.GetCollection<customer>("customers");

customerクラスのオブジェクトを作成します。

1
2
3
4
5
6
7
customer cus = new customer
{
name = "John Doe123",
phones = new string[] { "000-0000", "111-1111" },
isActive = true,
additional = "additional data"
};

最後に、コレクションオブジェクトの Insertメソッドを使用して、インサートします。

1
col.Insert(cus);

以下のようにデータが格納されれば、成功です。

LiteDBデータ表示

データ抽出するコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static void queryLiteDB()
{
using(LiteDatabase litedb = new LiteDatabase(@"C:\jwork\@Programming\CoreConsole\DataBase\lite.db"))
{
var col = litedb.GetCollection<customer>("customers");

var result = col.Query()
.Where(x => x.name.StartsWith("J"))
.OrderBy(x => x.name)
.ToList();

foreach(var item in result)
{
Console.WriteLine(item.name);
}


}
}

コレクションオブジェクトのQueryメソッドでデータを抽出します。

LINQが使えます。

1
2
3
4
var result = col.Query()
.Where(x => x.name.StartsWith("J"))
.OrderBy(x => x.name)
.ToList();

抽出結果が複数レコードの場合は、foreachで1つずつ抽出が可能です。

1
2
3
4
foreach(var item in result)
{
Console.WriteLine(item.name);
}

About Me

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

ナレッジをドキュメントに書き起こすことの重要性【色々と効率的になります】

ナレッジをドキュメントとして書くことは、一見すると無駄なことのように見えます。自分の仕事が他人に奪われてしまう不安もあるでしょう。

しかし、ドキュメントを書くことは様々なメリットがあります。この記事では、ドキュメントを書くことのメリットを紹介します。

この記事のまとめ

  • ドキュメントになっていると、口頭説明の手間が省ける
  • 覚えなくていい
  • 「思い出す」時間を節約できる
  • 使用頻度の少ない知識こそ、ドキュメントにするべき
  • チーム全体に知識が浸透すると、チームの底力がアップする

ドキュメントを書くのは中々面倒ではありますが、メリットはたくさんあります。

デメリットは、「書くのが面倒」「時間がかかる」くらいです。

口頭説明の手間が省ける

ドキュメントとして文書になると、口頭で説明する手間が省けます。口頭で説明するときは、話し手と聞き手が同じ時間に合わせないといけません。

これはかなりのデメリットです。具体的には以下のデメリットがあります。

  • 口頭で説明する時間を調整しないといけない
  • 質疑応答含めて、調整した時間内に終わらせないといけない
  • 説明が完全に理解できていないと、場合によっては作業や仕事に着手できない

わざわざ時間を作って説明しないと仕事ができないという状況は、かなりの非効率です。

これがもしドキュメントになっていて、「読んでわからないことがあったら聞いて」としておけば、かなりラクになり、仕事の着手までの時間も短時間になります。

覚えなくても済む

  • 必死に覚えなくても、ドキュメントを見ればいい
  • 年に数回など、使用頻度の少ない情報こそ、ドキュメントにするべき

人間、覚えておける知識量には限界があります。頻繁に使う知識は長い時間覚えていられますが、ほとんど使わない知識は、すぐに忘れてしまいます。

日々や毎週の業務に関する内容も大事ですが、年に1回か数回しか発生しない作業にこそ、ドキュメントにするべきです。

何故かというと、誰も覚えていられず、作業が発生する度に思い出さないといけないからです。

思い出すという作業もかなり非効率です。前は知ってたのに、アレなんだっけ?と思い出すまで作業が止まる。そのぶんだけ家に変える時間も遅くなってしまいます。

再学習の無駄を無くすためにも、ドキュメントに残しておきましょう。

形式知になり、チーム内の常識として知識が浸透する=底力がアップする

  • ナレッジやスキルは、人のレベルアップに直結する
  • チーム全体に波及させるには、口頭説明では不可能
  • ドキュメント作成は、チーム力底上げの第一歩

ナレッジやスキルがチーム全体に浸透して、形式知になると、くどくど説明しなくても理解してもらえるようになります。

そうすると、チーム全体の常識となり、底力がアップします。

ナレッジやスキルは、学ぼうとしないと学べません。世の中には本やオンライン講座がたくさん溢れているのに、学ぼうとしている人はごく一部です。

しかし、ナレッジやスキルは、人の知識レベルや作業レベルが上がりますので、習得するとその人自身のレベルアップに直結します。

これが組織全体に波及すると、チーム力の底上げになります。

チーム全体に浸透させるには、口頭説明だけでは不可能で、必ずドキュメントが必要になります。

その第一歩が、ドキュメント作成なのです。

About Me

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

作業をコードに書き起こすことのメリット【作業自動化への第一歩】

会社員の人であれば、ほぼ毎日PCを使って事務作業をしていると思います。

このPC作業が少しでも自動化できれば、ゆっくり休憩できたり、他の仕事をしたりして早く帰れたりするなど、メリットが大きいと思います。

この記事では、作業をコードに書き起こすことのメリットを紹介します。

作業をコードに書き起こすことのメリット

  • PC作業が自動化できる
  • 手作業ではないので、どんなコンディションでも作業品質が同じ
  • 時間を有効に使える

まず、作業を自動化できると、手を動かす必要が無いので、疲れません。楽ちんで仕事ができるようになります。

夜中まで飲んでいたり夜更かしして、翌朝のコンディションが悪くても、自動化できていれば、作業品質を同じレベルに保つことができます。

また、自動化できているということは作業スピードが早くなりますので、早く帰ったり、他の仕事をしたりするなど、時間を有効活用できます。

コードに書き起こす方法

  • がっつりプログラミングする
  • UiPathなどのRPA製品を使う
  • Excelマクロを使う

まず「がっつりプログラミングする」方法ですが、これはプログラミングの知識がないとなかなか難しいです。プログラミングの知識があったとしても、それなりにコーディングに時間がかかってしまいます。

おすすめなのは、UiPathなどのRPA製品を使う方法です。UiPathは「アクティビティ」という単位で作業を配置してプログラムが作れますので、自動化した作業の流れや作業内容が分かりやすくなります。

UiPathのインストール方法は以下にまとめています。

UiPath Community エディションのインストールと簡単なロボットの作成

そのほかのUiPathの使い方は以下にまとめています。

UiPath関連記事

次におすすめなのは、Excelなどのマクロを使う方法です。

ご存知の方も多いと思いますが、Excelにはマクロ記録機能がありますので、Excelで操作した内容を自動的にコードに変換することができます。

ただし、UiPathと違うところは、目に見える部分がすべてコードであり、一見すると分かりにくいところです。そのため、コメントを多用して、日本語での説明文を書いておくなど、忘れてもいいようにしておくことが重要です。

Excelマクロ記録機能の使い方は以下に書いています。

ExcelVBAは覚える必要なし!書き方が分からなくなったら「マクロの記録」を使用してコードを自動生成しよう

VBAプログラミングについては、以下にまとめています。

VBA関連記事

どれぐらいの作業をコードに変換するか

  • 作業全体を一度にコーディングするのではなく、1作業ずつコーディングする
  • 例えば、「メール作成画面を開く」「ファイルを開く」「文字列を置換する」「文字列を転記する」など
  • 作業全体の中で、プログラムを実行する順番をメモしておく

一連の作業全体を1度にコードに起こそうとすると、なかなか時間が取れず、テストもしないといけないので、難しいと思います。

まずは、1ステップずつコードに起こすことをおすすめします。

1ステップとは、以下のように、可能な限り細かく分解できる作業1つ分のことです。

  • メール作成画面を起動する
  • ファイルを開く
  • 文字列を置換する
  • 文字列を転記する
  • ファイルを保存する

あまり効果が無いと思われるかもしれませんが、まずはこのくらいのレベルで作成しておいて、問題なく仕事ができるか確認します。

そのあとで、これらの作業ステップをつなぎ合わせて、全体の一連作業を自動化するという方法をとると、間違いや手戻りを最小限にすることができます。

この、つなぎ合わせる作業で必要になってくるのが「どの順番で作業を進めて、プログラムを実行するか」という情報です。

基本的には頭の中に入っていますので、わざわざメモするような情報ではないかもしれませんが、これが文章になっていれば、つなぎ合わせる作業が簡単になります。

コードの横にコメントくらいのレベルで構いませんので、順番をメモしておきましょう。

コードの書き方が分からなければ、お気軽にお問い合わせください

私はシステムエンジニア歴11年目で、UiPathの社内導入や、VBAを用いたアプリ開発、メキシコへのシステム導入など、多くのシステム開発を行ってきました。

TwitterのDMや、ブログの問い合わせフォーム、マシュマロでもどれでも構いません。お金もかかりませんので、お気軽にご連絡ください。

Twitter

お問い合わせ

マシュマロ

About Me

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