メインコンテンツまでスキップ

AIエージェントにサイトマップを作ってもらう

野村
ディアシステム(株)開発一部第2課

昨今様々なAIが登場しており、みなさんも業務で活用されていると思いますが、
その中で今回は「AIエージェント」を紹介します。

AIエージェントとは、Googleによると
”人間が与えた目標を達成するために、自ら状況を判断・計画し、さまざまなツールを自動的に利用してタスクを実行する自律的なソフトウェアシステムです。単にテキストを生成する従来の生成AIとは異なり、外部ツールと連携して複雑な問題を解決し、継続的に学習・適応していく点が特徴です”

とのこと。

この分野も「manus」「Gamma」「Felo」などなどいろいろありますが
今回は「Genspark」でサイトマップの作成(Excel)を試してみます。

サイトリニューアルなどを行う際、
現行サイトのサイト構成を調べる必要があります。
ツールはあるのですが、サイトの構造はサイトごとに様々なので完全にこなしてくれるわけではありません。
果たして「AIエージェント」はどこまでやってくれるのか?

ここではGensparkについての解説は省きます。

無料プランで使用します。
毎日200クレジットが付与されるようです。

URLだけでやらせてみる

まずはどの程度の処理をしてくれるのか敢えて単純な内容でお願いしてみます。
弊社サイトでやってみましょう。

https://www.dsic.jp/ のサイトのサイトマップをエクセルで作成してください」

画像1

Pythonで処理するようです。これ以降、処理内容を逐一報告してくれますがここでは割愛します。

画像2

作成してくれました。

画像3

サイトマップをダウンロードしてみます。

画像4

悪くはないですね。

  • 階層構造:レベル0〜3の階層で整理
  • ハイパーリンク:各URLはクリック可能なリンク付き
  • 視覚的な区別:レベルごとに異なる色とフォントスタイルを適用
  • 詳細説明:各ページの説明を記載

といったことまで処理してくれています。
ページ内リンクについてまでも拾い上げて項目に作成してくれていますね。
ここは無くてもよいところです。

●もう少し改善してみたいですね。

下記をお願いしてみます。

  • 列には連番を振ってください。
  • 階層ごとに列を分けて視覚的に階層構造が把握できるようにしてください。

画像5

無料プランでは200クレジットをここで使い切ってしまったようです。。。
どこでどれだけクレジットを消費しているかわからないので言い値ですねw
また明日。

では続きをやってみます。

画像6

作成してくれました。
改善点はいろいろありますが一旦本日はここまで。

画像7

最後に

サイトマップの作成は他にも「manus」なども含め、実は何度も使用しているのですが、中規模サイト以上だと、サイトの構築の仕方によってはページが取れていなかったり、誤ったページURLが示されたりすることもありました。
具体的な指示を繰り返せば通常業務で使っている仕様に近い精度までは仕上げてくれます。

また、AIエージェントそのものはもちろん、外部ツールも使用するので入力する内容に秘匿性が高いものや、個人情報を扱う場合は注意が必要、というか避けるべきかなと思っています。
まだまだこちらのプロンプトにも改善の余地がありますが、企画提案書のドラフト作成やアイデア出しなど様々な業務に応用はできそうです。

新人エンジニアがオブジェクト指向を学ぶ意味

濱上
ディアシステム(株)開発二部第2課

こんにちは。開発2部の濱上です。

入社後すぐのJava研修でオブジェクト指向に触れたとき、「結局、理解して何が変わるの?」という疑問にぶつかりました。
プログラミング初心者の私にとって、それは大きな壁でした。
ですが、実際にコードを書く中で、オブジェクト指向は、コードの居場所を決めて全体図をつかみやすくする、大切な設計の基礎であることに気づきました。

まだ新入社員として学び途中ではありますが、オブジェクト指向に苦戦した中で見えてきた設計の大切さと、AI時代だからこそ必要な設計の考え方をまとめたいと思います。

オブジェクト指向とは何か

・“モノをそのままプログラムに持ち込む” という発想

オブジェクト指向は一言でいうと、

私たちの身の回りにある「モノ(=オブジェクト)」を、そのままプログラムに置き換える考え方

と理解しました。

例えば、「商品」、「ユーザー」、「注文」などの概念がそのままオブジェクトになります。

現実世界で 「商品がある → 値段がある → ユーザーが購入する」という流れを、プログラムでもクラスやメソッドを使って表現していくイメージです。

・“情報”と“役割”をセットにする

オブジェクト指向の大きな価値は、

「情報」と「その情報を扱う処理」を、ひとつのまとまり(オブジェクト)にできること

だと感じています。

初めて取り組んだ開発では、変数や関数がバラバラに存在していて、時間が経つと、どこに何があるのか分からなくなりました。

ですがオブジェクト指向に慣れてくると、

  • 商品クラスなら「商品のデータ」と「商品の振る舞い」
  • ユーザクラスなら「ユーザのデータ」と「ユーザの振る舞い」

といったように、自然に整理しやすくなり、担当者を決めるようなイメージで、コードが読みやすくなります。

・初心者こそ助けてもらえる考え方

理解が進むほど、初心者こそオブジェクト指向に救われるのでは?と思うようになりました。

  • コードの居場所がはっきりする
  • 重複を書かなくていい
  • プログラムの全体図をつかみやすい

など、迷子になりにくくなると感じています。

AI がコードを書く時代でも必要なのか

オブジェクト指向について調べていると、「AI が出てきたからオブジェクト指向は古い」といった意見を目にすることがありました。

ですが、AI にコードを書いてもらうと、分かりにくいコードが生成されることもあります。

  • クラスの役割が曖昧
  • 名前の統一感がない
  • 1つのクラスに機能が詰め込まれてしまう

など、読んでいて混乱することもあります。

そこで気づいたのは、以下の点です。

  • AI にはコードを書いてもらえるが、設計の判断は人間
  • オブジェクト指向を理解しているほど、AI が生成したコードも扱いやすい
  • AI に質問する際に明確に伝えられれば、返ってくる回答の精度も高くなる

AI 時代だからこそ、設計の基本となる考え方(オブジェクト指向)はもっと大事になるように感じます。

まとめ

オブジェクト指向はまだまだ勉強中ですが、理解が進むにつれてコードが読みやすくなり、作りやすくなるのを実感しています。
そして AI がどれだけ進化しても、設計の考え方は残るはずです。
これからプロジェクトで実際にコードを書く場面も増えていくので、 AI もうまく使いながら、自分自身の設計力も伸ばしていきます。

Java の学習を振り返って

大野
ディアシステム(株)開発二部第1課

こんにちは。開発 2 部1課の大野です。

今回は、Java を学んでみての感想、Java を学ぶ上で参考になったテキストなどを掲載します。
これから Java を学ぼうとしている方々の参考になれば幸いです。

Java とは?

オブジェクト指向を中心に設計された、大規模開発にも向いている汎用プログラミング言語です。
JVM というソフトウェア上で動作する仕組みにより、プラットフォームに依存せずに実行できる特徴を持っています。
豊富な標準ライブラリやフレームワーク(Spring、JavaFX など)が揃っており、Web アプリ、業務システム、Android アプリなど幅広い分野で利用されています。
また、高い安全性や信頼性からエンタープライズシステムでも長年使用されており、現在も進化を続ける言語です。

Java を学んでみての感想

今年の4月の外部研修で初めて Java に触って以降、かれこれ半年以上が経ち、Java の仕組みに慣れてきました(まだまだ理解が浅い部分はありますが...)。

初めて Java を学んだときは、覚えることも多く、自分に扱いきれる代物なのかと疑っていました。
特にオブジェクト指向は、研修の講義内で説明されるだけでは何がなんだかさっぱり分からず、概要すらも難しく感じていました。
自作の単語帳を使って通勤中に復習したり、自宅のパソコンに eclipse をダウンロードして実際にコードを書いたりして、何とかオブジェクト指向について理解しようと悪戦苦闘していました。
しかし結局、オブジェクト指向についてほとんど理解できないまま研修が終わってしまいました。

そこで、このままではいけないと感じ、書店で参考書を購入し、自宅でじっくりオブジェクト指向と向き合うことにしました。
その結果、これまでのモヤモヤが払拭され、オブジェクト指向についての解像度が大幅に上がりました。
実際に、『徹底攻略 Java SE 17 Silver 問題集[1Z0-825]対応』(通称:黒本)の「クラスの定義とインスタンスの使用」や「継承とインタフェースの使用」に関する問題で7割以上の正答率を達成することができました。

今後はこれまで学んだことを活かしてチームに貢献し、経験を通じて更なるスキルアップを目指していきたいです。

Java を学ぶ上で参考になったテキスト

『スッキリわかる Java 入門 第 4 版』

Java を学ぶ際に初めて購入したテキストです。テキスト詳細
演算子からオブジェクト指向、例外処理まで幅広く扱っており、体系的に Java を学びたい方におすすめしたい一冊です。
今まで Java に触れたことがなかったとしても、ゲームの世界を例にした腹落ち感のある解説で、難しい単元もとっつきやすい印象を受けました。

『徹底攻略 Java SE 17 Silver 問題集[1Z0-825]対応 』

いわゆる黒本です。テキスト詳細
これまで学んできた分野の復習、兼 Java SE 17 Silver 取得に向けた勉強のために購入しました。
オブジェクト指向や例外処理などの基礎的な部分だけでなく、シール・クラスや try-with-resources 文など Java を便利に活用するために必要な知識も学ぶことができる有益な書籍です。実際のコードを用いて分かりやすく解説してくれるので、初めて触れる仕組みもスムーズに理解できました。
(ちなみに私は、この書籍の問題を3周して Java SE 17 Silver を取得することができました。)

まとめ

Java は現在でも様々なシステムで使われる言語で、学ぶ価値の高い言語だと思います。
中には理解しにくい部分もありますが、テキストを用いてインプットとアウトプットを繰り返すことで徐々に理解できるようになると思います。

ここまで読んでいただき、ありがとうございました!

データベースの学習に活用できる!【Local DB】

朝久野
ディアシステム(株)開発一部第4課

こんにちは。開発一部の朝久野です。C#の学習を進める過程で、マイクロソフト社のSQL Serverを簡易的にした「Local DB」に触れる機会がありました。Local DBの存在は先輩に教えていただきました。初心者の私が実際に利用してみて便利だと感じた点、つまずいたポイントを記載していきたいと思います。

環境にインストール済みのツール

  • Visual Studio 2022(ASP.NETとWeb開発、Azureの開発、.NETデスクトップにチェックを入れてインストール済み)

Local DBの使い方

Local DBはローカル環境でのみ動作する、SQL Serverの簡易版のようなものです。ローカルでありながら、実際と近い動作が可能であるため学習に便利です。

まずVisual Studioを利用してプロジェクトを作成してみます。
新しいプロジェクトの作成→コンソールアプリ→プロジェクト名の設定→フレームワークの設定(今回は.NET 8.0を利用しています)を行い、プロジェクトを作成します。

画像1

画像2

画像3

プロジェクト(techPj)が作成されました。次に、画面上部にある表示ボタンからSQL Serverオブジェクトエクスプローラーを選択します。

画像4

画像5

SQL Serverのエクスプローラーが開きました。作成したいインスタンス上、データベース上で右クリックを行い、新しいデータベースやテーブルの追加を行うことができます。こちらでLocal DBを利用することができます。

画像6

画像7

便利だと感じた点

  • データベースの環境準備が簡単でわかりやすい

データベースを利用するための準備は時間がかかるイメージがあったのですが、Local DBの場合「これだけの作業で構築できるのか!」と非常に驚きました。前述したようにローカル環境でのみで動作できるものですが、私のようにまず手を動かしてSQLやテーブルの動きを学習したい方にはもってこいの機能だと感じました。

  • GUI操作ができる

テーブルを選択して内容を入力するだけでテーブル定義が行えます。さらに、対応するSQL文も自動で生成してくれるので、「この定義をSQL文で書くとこうなるのか」と理解しやすくなりました。

画像8

つまずいたポイント

  • 型の定義

例えば「restaurant_name = 飲食店A」と日本語の文字列の値を入力したいとき、型定義が「varchar」だと認識してもらえず、文字化けした値が入ってしまいました。SQL Server(Local DB)の場合は「nvarchar」と定義する必要があるようで、修正するとうまく値が入るようになりました。
また、真偽値の定義にも注意が必要でした。他データベース、例えばPostgreSQLの場合はboolean型として定義されていますが、SQL Server(Local DB)の場合はbit型として定義する必要がありました。

まとめ

これまで複雑そうだと思っていたデータベース構築も、Visual Studio 2022とLocal DBを利用することで手軽に始められました。とっつきにくさが少なくなり、学習も取り組みやすくなりました。データベースの学習を始める際はぜひおすすめしたいです。

MVVMモデルでWPFプログラムを作ってみる

土井
ディアシステム(株)開発一部第2課

こんにちは。開発 1 部2課の土井です。
今回は WPF を MVVM モデル(Model-View-ViewModel)を使って、作ってみたいと思います。
自分自身、このモデルを使いながら作ることもあるのですが、作りながらこれってどんな仕組みで動いてるんだっけ?とか思うこともあり、ここで一旦内容をまとめたいと思います。

動作環境

  • Visual Studio Community 2022
  • .NET8.0

まずそもそも MVVM モデル(Model-View-VIewModel)とは?
アプリケーションを作る際に、Model-View-VIewModel の三つに分けて整理する考え方です。それぞれの役割を分割させることで、作りやすくて、直しやすいアプリができます。

  • Model(モデル)

データや計算など、アプリの中身の部分です。
例えば、「売上データを計算する」「ファイルから情報を読む」などを行う部分です。

  • View(ビュー)

ユーザーが見る画面の部分です。
こちらは XAML で作成されます。

  • ViewModel(ビューモデル)

View と Model の繋ぎ役です。
View からの操作(ボタンを押すなど)を受け取って、Model に伝えたり、Model からのデータを View に渡したりします。

MVVM モデルのメリット

  1. 画面と処理を分けられる → 直すときに楽!
  2. テストしやすい → 画面を動かさなくても、処理だけ確認できる!
  3. チームで作りやすい → 役割が分かれているから、分担しやすい!

では、早速実際のプログラムではどのようになるのか、お見せしようと思います。
「画面のボタンを押すと、テキストが変わる」というシンプルなものを作ってみます。

次のような構成で作成します。

画像1

  • View
MainWindow.Xaml
<Window x:Class="MvvmPractice.View.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MvvmPractice.ViewModel"
mc:Ignorable="d"
Title="MainWindow" Height="200" Width="300">

<Window.DataContext>
<local:MainViewModel />
</Window.DataContext>

<StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
<TextBlock Text="{Binding Message}" FontSize="10" Margin="10"/>
<Button Content="メッセージ表示" Command="{Binding ShowMessageCommand}" FontSize="10" />
</StackPanel>

</Window>

「Window.DataContext」は View と ViewModel を紐づけるための部分です。
「local:MainViewModel」と記載していますが、これは Window タグ内の xmlns:local の部分で、ViewModel までの名前空間を指定してあげる必要があります。
また、今回のプログラムでは XAML 内で記載していますが、MainWindow.xaml.cs 内で ViewModel を紐づけることも可能です。

TextBlock タグの「Binding Message」と書かれている部分ですが、これは「ViewModel の”Message”って名前のプロパティと紐づけるよー!」といった感じです。よくバインディングすると言ったりもします。なので、ここには ViewModel 側にある、Message プロパティの値が表示されます。

  • ViewModel
MainViewModel.cs
using MvvmPractice.Model;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace MvvmPractice.ViewModel
{
public class MainViewModel : INotifyPropertyChanged
{
private string _message;
private MessageModel _model;

public string Message
{
get => _message;
set
{
_message = value;
OnPropertyChanged(nameof(Message));
}
}

public ICommand ShowMessageCommand { get; }

public MainViewModel()
{
_model = new MessageModel();
ShowMessageCommand = new RelayCommand(ShowMessage);
}

private void ShowMessage()
{
Message = _model.GetMessage();
}

public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name) =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));

}
}

これが ViewModel の中身ですが、知らないものが多くあるかと思いますので、一つずつ解説していきます。

  • INotifyPropertyChanged

View にデータが変わったことを教えてくれる機能を持ったインターフェースです。今回だとこのクラスの「Message」のプロパティの値が変わった時に、View へとそのことを教える役割があります。WPF で MVVM モデルを使うときは、ほぼ必ず使うインターフェースです。

  • ICommand

UI 操作を ViewModel に伝えるためのインターフェースです。
今回で言うと、View 側の button タグ内で「Command="{Binding ShowMessageCommand}"」と記載し、ViewModel 側と紐づけています。

  • PropertyChangedEventHandler PropertyChanged

これは INotifyPropertyChanged インターフェースの中で定義されているイベントです。
INotifyPropertyChanged インターフェースを使う際には必ず、このイベントを実装する必要があります。
プロパティの値が変わったときは、この PropertyChanged を通じて View へと通知する必要があります。

  • protected void OnPropertyChanged(string name) =>
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));

ここが少し複雑ですが、一つ一つご説明します。

「=>」は式形式メソッドと呼ばれる記法です。
これを通常の構文に直すと以下のようになります。

protected void OnPropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}

PropertyChanged?は null 条件演算子と呼ばれるものです。この PropertyChanged が null でない場合だけ呼び出すということができます。

Invoke は「このイベントに登録されているメソッドを実行する」という意味です。
今回で言うと、

PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));

・PropertyChanged イベントに登録されているメソッドがあれば
・this(通知元)と PropertyChangedEventArgs(names)(変更されたプロパティ名)を渡して、
・そのメソッドを実行する(=通知する) という処理になります。

PropertyChangedEventArgs は PropertyChanged イベントが発火されたときに、「どのプロパティが変更されたか」を伝えるための情報を持つ PropertyChanged イベント専用の引数クラスです。引数に変更されたプロパティ名が入ります。

RelayCommand.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace MvvmPractice.ViewModel
{
public class RelayCommand : ICommand
{
private readonly Action _execute;

public RelayCommand(Action execute) => _execute = execute;

public event EventHandler CanExecuteChanged;

public bool CanExecute(object parameter) => true;

public void Execute(object parameter) => _execute();
}

}

こちらはボタンなどの操作を ViewModel に簡単に伝えるためのクラスです。
CanExecute、Execute、CanExecuteChanged はこのインターフェースを使うときには実装する必要があります。

  • CanExecute このコマンドが実行可能かどうかを返すメソッドです。
    true を返せば、ボタンなどの UI 要素は有効になります。

  • Execute 実際の処理を実行するメソッドです。
    parameter には、XAML から渡された値が入ります。

  • CanExecuteChanged CanExecute の結果が変わったときに通知するイベントです。

先ほどの MainViewModel.cs に戻ると次のように書かれている箇所があるかと思います。

ShowMessageCommand = new RelayCommand(ShowMessage);

ここで Model 内で行っている処理を ViewModel のプロパティと紐づけています。
ShowMessageCommand は View の button タグ内でバインディングされているので、ボタンを押すと ShowMessageCommand が呼び出されて、ShowMessage メソッドが実行されるといった動きになります。

  • Model
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MvvmPractice.Model
{
public class MessageModel
{
public string GetMessage()
{
return "腹筋6LDKかい!";
}

}
}

こうして画面を起動して動かしてみましょう。

この画面でボタンを押すと、

画像2

こうなります。

画像3

実際にこの MVVM モデルを使用するときですが、INotifyPropertyChanged と ICommand を継承した ViewModel の Base のようなインターフェースを用意しておいて、ViewModel のクラスではそれを継承して使っていました。そうすることで ViewModel を作成するたびにインターフェースを継承するたびに、メソッドを実装しなくても良くなり、ViewModel 全体として共通する処理があれば、その中に記述できます。

このような形で MVVM モデルというものが活用できます。
ちなみにこの MVVM モデルでは画面とロジックを分離するという目的があるため、View のコードビハインド(MainWindow.xaml.cs など)には基本的には何も書かないという考えがあるのですが、新しい画面を別ウィンドウで開きたいときや、画面を閉じたいときなんかはどうしてもコードビハインドで実装しないといけなかったりします。(いいやり方あれば教えてほしい)
そこらへんがちょっと不便で、プログラムが複雑になったりもするので注意が必要です。

Visual Studio CodeでC#を触ってみる

土井
ディアシステム(株)開発一部第2課

C#の開発はずっと Visual Studio で行っているのですが、Visual Studio Code でも C#の開発ができるということで、一度使ってみたいと思います。

動作環境

  • Visual Studio Code

Visual Studio Code の拡張機能で、以下のインストールを行います。

  • C# Dev Kit

画像1

これをインストールすると「C#」という名前の C#用の拡張機能も自動でインストールされます。「C# Dev Kit」は VS Code で C#の開発をしやすくするための拡張機能のセットです。Microsoft が提供しています。
主な特徴としては次のような内容です。

  • Visual Studio に近い形で開発ができる
  • AI 支援(IntelliCode)によるコード保管や提案
  • ソリューションエクスプローラーやテストエクスプローラーなどの GUI 機能を提供

できるだけ Visual Studio に近い使い方をできるようにするものみたいです。

ではプロジェクトを作成してみます。作るときですが、GUI 上で作成する方法とターミナルで作成する方法があります。今回は Visual Studio に近いかたちで行いたいと思ったので、GUI 上で作成します。

次の手順で行います。

  1. Ctrl + Shift + P でコマンドパレットを開く
  2. 「.NET: New Project」を選択
  3. プロジェクトテンプレート(Console App など)を選ぶ
  4. ターゲットフレームワーク(Target Framework)の選択

1.Ctrl + Shift + P でコマンドパレットを開く

「Ctrl + Shift + P」を押してコマンドパレットを開いてください。

画像2

2.「.NET: New Project」を選択

画像3

3.プロジェクトテンプレート(Console App など)を選ぶ

以下のように様々なテンプレートが出てくるかと思います。
今回はコンソールアプリを選択します。

画像4

選択後、保存先を指定してください。
保存先を指定したら、プロジェクトの名前を決めてください。

画像5

その後、「.sln」を選択してください。

4.ターゲットフレームワーク(Target Framework)の選択

ここまで進めたら、「すべてのテンプレートオプションを表示する」を選択してください。

画像6

その後、「フレームワーク」を選択すると、以下のようにフレームワークを指定することができます。

画像7

ここでフレームワークを指定せずに作成した場合は、インストールされている.Net SDK の最も新しいバージョンのもので作成されます。
これで「プロジェクトの作成」を選択すると、新しいプロジェクトが作成されます。

ちなみに、ターミナルで作成する方法ですが、以下のコマンドを入力することで作成できます。
「dotnet new console --framework net8.0(ここで.NET のバージョンを指定) -n プロジェクト名 -o プロジェクト名を含めたパス」

作成されたプロジェクトの中身は次のようになっています。

画像8

一度動かしてみましょう!
「Program.cs」を選択して、以下のボタンを押してみてください。

画像9

ターミナルに次のように表示されていれば、OK です。

画像10

GUI でコンソールアプリを作成、デバックを行うことができました。
他にも ASP.NET Core のプロジェクトだったり、ユニットテスト用のプロジェクトが作成できたりと Visual Studio にある程度は近い感覚で使用することができました。ただ、WPF アプリケーションの項目がなかったので、VisualStudio のように GUI 上で画面を作るのはできないかもしれないです。
触ってみた感想としては、Visual Studio の方が使いやすいな・・・といった印象でした。
慣れとかの問題もある気がします。
特に私は WPF アプリケーションを作ることもあるので、そのあたりの機能もあればありがたかったです。
ただ、環境を作るのはそれほど難しくなかったので、VS Code をよく使用されている方はとても良いかと思います。
みなさんも是非 VS Code で C#を触ってみてください。

Pythonでファイルを収集してZip化する

友澤
ディアシステム(株)開発一部第3課

こんにちは、開発 1 部第 3 課の友澤です。

今年になって、初めて Python で開発する業務に就いたので、
簡単なスクリプトツールを作成してみました。
作成したのは、「Ubuntu 環境からファイルを収集して Zip 化する」になります。

仕様:
  • Python で作成する、スクリプトツール
    FileExplorer/FileExplorer.py
  • スクリプトの実行方法
    $ python3 FileExplorer.py
  • /var/log/から syslog を収集する(ローテートされたファイルも対象とする)
    上記、ファイルパスとキーワードはコード上で定義します。
  • スクリプト実行時に、ファイル格納用ディレクトリを作成し、
    収集したファイルを格納する
  • ファイル収集後、ファイル格納用ディレクトリを Zip 圧縮でまとめる
  • Zip ファイルのフォーマット
    FileExplorer_yyyymmdd_hhmmss.zip
  • Zip 圧縮後、ファイル格納用ディレクトリを削除する
開発メモ:
  • Zip ファイルのフォーマットに使用する現在日時は、
    datetime.now()で取得し、strftime()でフォーマットを指定します。
  • ファイル格納用ディレクトリはカレントディレクトリ(./FileExplorer/)に
    「FileExploerOutput」を作成します。
    カレントディレクトリのパスは、os.getcwd()で取得し、
    os.makedirs()でディレクトリを作成します。
    ※既に存在しているディレクトリを指定してもエラー(FileExistsError)にならない様、
    引数に exist_ok=True を記載しています。
  • ファイルが格納されているディレクトリ(/var/log/)から、
    ファイル名に"syslog"が含まれるファイルを部分一致検索でマッチングさせます。
  • マッチングしたファイルは、shutil.copy()でファイル格納用ディレクトリにファイルコピーします。
  • Zip 圧縮は、zipfile.ZipFile()で行い、zipfile.ZIP_DEFLATED(通常の ZIP 圧縮)とします。
  • Zip 圧縮後、shutil.rmtree()でファイル格納用ディレクトリを削除します。
コード:

画像1

スクリプトの実行:

※WSL の Ubuntu 環境にて実行したイメージになります。

画像2

  • スクリプト実行後、Zip ファイルが格納されています。

画像3

  • Zip ファイル内に、収集したファイルが格納されています。

画像4

まとめ:

・今回はあえてシンプルに「ファイル収集して Zip 化する」スクリプトを紹介しました。
使用している API もネット上で詳しく解説しているところが沢山見つかると思います。
なにかの参考になれましたら幸いです。

動画生成AI Sora2でディアシステムのCMを作成してみた

箕浦
箕浦
ディアシステム(株)開発二部

こんにちは。開発 2 部 箕浦です。
今回も生成 AI シリーズです。
今回は Open AI が最近リリースした動画生成 AI Sora2 を触ってみます。

まずは簡単に「Sora2」の紹介をします。
「Sora2」は、OpenAI が 2025 年 9 月に発表した最新の動画生成 AI モデルで、テキストや画像から高品質な動画を生成できる革新的なツールです。

Sora2 の主な特徴

1. テキストからリアルな動画生成

「公園でボールを投げる少年」といったテキストプロンプトを入力することで、リアルな映像を自動生成できます。
映像スタイルは映画風、アニメ風、写実的、超現実的など多彩に対応しています。

2. 音声・効果音の同期生成

映像に合わせてセリフや効果音、環境音を同期して生成できるため、映画のような没入感のある動画が作成可能です。

3. 物理法則の再現

物体の動きや重力、光の反射など、現実世界の物理法則を再現したリアルな映像表現が可能です。
これにより、より自然で説得力のある動画が生成されます。

4. 「カメオ」機能で自分や友人を登場させる

「カメオ」機能を使用することで、ユーザー自身や友人を動画のキャラクターとして登場させることができます。
これにより、パーソナライズされたコンテンツの制作が容易になります。

さっそく試してみる

Sora2 を利用するには、現在招待コードがないと利用できません。
招待コードはネットで出回っているので、まずはそれを入手してください。

招待コードが入手できたら以下の URL に行き、右上の「Login」から「Sora」を選択します
https://openai.com/index/sora-2/

以下のような画面になるので、Sora2 で作成した動画のサンプルが見れます。 画像7

右上の「Login」からログインします。Google アカウントから入れます。

画像8

ログインすると旧 Sora の生成画面に行くので、右下の「Join New Sora」を選択する。

画像9

この画面になるので、「Enter Invite Code」を選択する。

画像2

招待コードを入力する。

画像3

ログインできたら、以下のようにプロンプト入力欄が出てきます。

画像4

ここにプロンプトを入力します。
日本語でも OK です。
+ボタンで画像を 1 枚だけ添付できます。
カメオと呼ばれるキャラクターを動画に登場させたいときは、この中から選びます。
スマホアプリ版では、自分をカメラで撮影し、カメオとして登録して使うこともできるみたいです。

画像10

設定は、現時点では縦長か横長を選択するのみです。

画像11

試しに以下のプロンプトを入れてみます

画像12

入力すると以下のボタンから動画が見れます。
生成されるまで 2 ~ 3 分ほどかかります。

画像13

生成された動画がこちら
ちなみに無料版ではウォーターマークが入ります。

現在、無料版では 10 秒ほどの動画しか作成できないようです。

もう一つ、次は以下のプロンプトを試します。

画像14

生成された動画がこちら

それに近い動画が簡単に作れるのはすごいですね。

ディアシステムの CM を作ってみる

ディアシステムの CM 作成にトライしてみましょう。
まずは、どんな CM にするか ChatGPT に案を出してもらいます。
ディアのホームページにある画像を使ってみたいので以下の画像を添付して、

画像5

この画像を使って 動画生成AI Sora2でディアシステム株式会社のCMを作りたい。
8秒に収まるようにプロンプトを考えてください
https://www.dsic.jp/

と聞いてみます。
以下のように回答もらえました。

画像6

これをベースに以下のように変更して Sora2 のプロンプトに入れてみます。

(マルチカット、動きのあるように)
未来都市の朝焼けの中、背中にリュックを背負った少年が輝く都市を見つめている。
空には光が広がり、ガラスのようなひびが世界の変革を象徴している。
少年が空に向かって手を伸ばす。
ナレーション(優しく力強い声):「思い、Webテクノロジー 情報システムを変革し、未来の景色を変える。ディアシステム株式会社」
シーンがフェードアウトし、**「ディアシステム株式会社」**の文字が表示される。

映像全体は約8秒、静かなピアノと希望に満ちたサウンドトラックで締めくくる。
映像の雰囲気:温かく透明感のある光、未来と希望を感じさせるトーン。

完成した動画がこちらです。

別で実写版を作成してみました

いかがでしょうか

まとめ

Sora2 は短時間で高品質な映像と音声を同時に生成でき、物理表現やキャラクター活用(カメオ)など実用性の高い機能を備えています。
今回は基本的な操作を確認しつつ、企業イメージを 8 秒に凝縮する形で CM 試作まで行えました。
無料版では制約(尺・透かし・解像度など)はあるものの、コンセプト検証やイメージ共有には十分活用可能です。
試行回数を重ね、どの程度プロンプトで演出意図を再現できるか検証していきたいと思います。

ASP.NETについて

坂口
ディアシステム(株)開発二部第2課

開発二部 坂口です。
ASP.NET を知ったきっかけは上司の方がサーバーについての説明をしていただいたときです。その際に最近では ASP.NET をよく使われているとおっしゃっていたので今回調べてみることにしました。

ASP.NET とは、マイクロソフトが開発した Web アプリケーション開発フレームワークの ことです。言語は主に C#、VB.NET などが使用されています。
ASP.NET を使用すると、「会員登録・ログイン機能のある Web サイト」「DB と連携した業務システム」「EC サイト」など動的な Web アプリケーションを作成することが出来ます。
ASP.NET を使ったアプリ開発で必要なツールは、Vusial Studio です。

実際に少し触ってみようと思います。
プロジェクト構成は以下のようになっております。

画像1

Web アプリでは、DB も必要となってきます。
ASP.NET MVC では、スキャホールディングというプロジェクトに必要なコードやビューの骨組みを自動生成する機能が搭載されているため、すぐに CRUD を実装することが出来ます。
手順も最も簡単です。
Models フォルダ作成し「追加」>「新しい項目」でクラスを作成します。
以下のように、作成したい DB 項目を記述していきます。

画像2

次に「Contollre」フォルダを作成し右クリックで「追加」>「新規スキャフォールディングアイテム」を選択する。

画像3

画像4

モデルクラスには、モデルフォルダ配下のクラスの名前を選択し、DbContext クラスには、【プロジェクト名】.Models.【プロジェクト名】Context を記入します。
追加ボタンを押すと、Create・Delete などのクラスと HTML が自動で作成できました。

今回、以前から気になっていたものを調査できて良かったです。実際に業務では触る機会がなかったので、もし機会があれば触ってみたいと思いました。

コンソールアプリからステップアップ!テンプレートから学ぶ .NET Worker Service

鶴田
ディアシステム(株)開発一部第2課

こんにちは。ディアシステム開発1部開発2課の鶴田です。

はじめに

みなさんは、昔から動いているコンソールアプリを「そろそろサービス化したいな」と思ったことはありませんか? 私自身そんな場面に出会い、調べてみると 「Worker Service」 という仕組みが .NET では一般的だと知りました。

せっかくなので勉強してみたところ、「これならコンソールアプリの延長線上で、ちゃんとした常駐サービスが作れるじゃないか!」と感じました。

この記事では、その時の学びをまとめつつ、最小限のサンプルコード(HelloWorld!)をもとに紹介していきます。 読んでいただいた方にとってコンソールアプリからのステップアップのきっかけになればうれしいです。

コンソールアプリと Worker Service の違い

実務で「ずっと動かしておきたい処理」をコンソールアプリで作ると、ちょっと不便が出てきます。

  • 自分で「終了条件」や「再起動」の仕組みを用意しないといけない
  • Windows ならサービスとして登録するのが面倒
  • Linux なら systemd などと組み合わせる必要がある

そこで登場するのが Worker Service です。 Worker Service は、コンソールアプリと似た書き心地なのに「常駐サービスとして動かす」ことに特化しています。しかもライフサイクル管理(開始・停止)、ログ出力、DI(依存性注入)まで標準で備わっているので、実務で安心して使えます。

コンソールアプリと Worker Service を比較し表にしました。

項目コンソールアプリWorker Service
終了管理自前で実装が必要OSからの停止通知を受け取れる
適した用途ツール、簡単なバッチ処理ファイル監視や定期処理などの常駐処理

お手軽なコンソールアプリと、実務面で強化された Worker Service といった感じですね。

Worker Service の最小サンプル

「Worker Serviceってどうやって書くの?」と気になりますよね。今回は標準的なテンプレートを作成、内容を細かく確認し、 HelloWorld してみましょう(笑)

まずはテンプレートを作成します。作成するには、.NET SDK が必要ですのであらかじめインストールしておいてください。

コマンドプロンプトで

dotnet new worker -n sampleworker

と入力します。なんやかんやと出てきていろいろ作ってくれます。 このdotnetコマンドは .NET SDK に含まれる機能で、テンプレートを作成してくれるコマンドです。今回は worker サービスと呼ばれる「常駐サービスの基本形」をつくってもらいました。

作成されたフォルダを VSCode で開いて細部を確認してみましょう!2つのcsファイルが作成されているはずです。

Program.cs

using sampleworker;

var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddHostedService<Worker>();

var host = builder.Build();
host.Run();

Worker.cs

public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;

public Worker(ILogger<Worker> logger)
{
_logger = logger;
}

protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
if (_logger.IsEnabled(LogLevel.Information))
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
}
await Task.Delay(1000, stoppingToken);
}
}
}

では1つずつ解説です。

Program.csの解説

Program.cs、最初の1行目より!

var builder = Host.CreateApplicationBuilder(args);

これ、.NET 6 以降の定番の書き方らしいです。えらく短いです。

Host.CreateApplicationBuilder ですが、.NET 6 以降で導入されたそうです。 実行環境を構成するためビルダーと呼ばれるインスタンスオブジェクトを作成します。

このビルダーを使うと

  • サービスの登録
  • アプリの設定ファイル
  • ログ出力機能の構成

など、たいていの Worker で必要な設定をまとめて行ってくれるそうです。便利です!

あともう一つ。args ですが、これは昔の書き方にすると・・・

public int main(string[] args)
{
}

と記述されていた時の args です。いわゆるコマンドライン引数ですね。 このコマンドラインは設定や構成(例:DB接続情報、RestAPI接続情報など)に使うことが一般的なようです。

つぎです。

builder.Services.AddHostedService<Worker>();

CreateApplicationBuilderコマンドで作成された builder には、依存性注入(DI)用の領域があります。これがDIコンテナーサービスです。この Services プロパティを通じて、アプリケーション全体で利用できるサービス(クラスやインターフェース)を追加・設定できます。

当テンプレートでは Worker クラスをバックグラウンドサービスとして登録しているのが分かります。 ちなみにですが、AddHostedService メソッド以外にも様々なメソッドが用意されており、用途によって使い分けることができます。

メソッド名用途
AddSingleton<TService, TImplementation>() アプリケーション全体で1つだけインスタンスを生成し、使い回します。
AddScoped<TService, TImplementation>() スコープ(通常は1リクエスト)ごとにインスタンスを生成します。
AddTransient<TService, TImplementation>() サービスが要求されるたびに新しいインスタンスを生成します。
AddDbContext<TContext>() Entity Framework Core のDbContextを登録します。
AddLogging() ロギング機能を追加します。
AddHttpClient() HTTP通信用の HttpClient をDIコンテナに登録します。

つぎです。

var host = builder.Build();

builder へ設定した、アプリケーション全体で利用できるサービス(クラスやインターフェース)をもとに、ホストオブジェクトを生成する処理です。Build() メソッドを呼び出すと、サービスに登録した仕組みが初期化され、利用可能になります。

つぎです。

host.Run();

host.Run() を呼び出すことで、アプリケーションが起動します。 起動後は登録済みのサービスは変更できなくなります。

ここまでが Program.cs の説明です。

次から Worker.cs の説明です。同様に1行ずつ確認していきます。

Worker.csの解説

public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;

public Worker(ILogger<Worker> logger)
{
_logger = logger;
}

protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
if (_logger.IsEnabled(LogLevel.Information))
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
}
await Task.Delay(1000, stoppingToken);
}
}
}

では最初の1行めからです。

public class Worker : BackgroundService

BackgroundService を継承しています。 BackgroundService とはどのようなクラスでしょうか

Microsoft Learn BackgroundService クラス

Learn を確認すると、最初に実行されるのは ExecuteAsync( CancellationToken ) のようですが・・・CancellationTokenとはなんだ??(ΦωΦ)

Microsoft Learn CancellationToken 構造体

この解説によると、操作を取り消す通知を配信してくれるそうです。

取り消しが要求されたかどうかは、プロパティ IsCancellationRequested を確認するとよい、と。この機能を使って、

  • 取り消しが要求されるまで、一定時間ごとに処理を繰り返す。例: while (!stoppingToken.IsCancellationRequested)

機能を実現できるというわけですね。BackgroundServiceについては後で詳細に確認します。

つぎです。

    public Worker(ILogger<Worker> logger)
{
_logger = logger;
}

Workerクラスのコンストラクタです。引数として ILogger<Worker> を指定しています。しかし、Program.cs にて ILogger<Worker> は一切指定していません。ILogger<Worker> とは何者なのでしょうか。ソースを確認してみましょう。VSCode上で選択し、F12でソースを確認できます。

interface ILogger<out TCategoryName> の解説

// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

namespace Microsoft.Extensions.Logging
{
/// <summary>
/// A generic interface for logging where the category name is derived from the specified
/// <typeparamref name="TCategoryName"/> type name.
/// Generally used to enable activation of a named <see cref="ILogger"/> from dependency injection.
/// </summary>
/// <typeparam name="TCategoryName">The type whose name is used for the logger category name.</typeparam>
public interface ILogger<out TCategoryName> : ILogger
{

}
}

コメントをAIに翻訳してもらいましょう

【AIによる翻訳ここから】

指定された 型名からカテゴリ名が導出される、ロギング用のジェネリックインターフェース。 通常、依存性注入から名前付き を有効化するために使用される。 ロガーのカテゴリ名として使用される型。

【AIによる翻訳ここまで】

名前空間と合わせて考えると、 Microsoft が用意した標準的なロギング用のインターフェースのようです。

続けてみていきましょう。ほかにも不思議な箇所があります。インターフェース ILogger を インターフェース ILogger<out TCategoryName> で再定義していますね・・・(´・ω・`)ナンデヤロ? 目的を確認してみましょう。

  • 依存性注入(DI)で ILogger<Worker> のように型を指定するだけで、そのクラス専用のロガーが自動で注入される
  • クラスごとに自動でカテゴリ名(通常はクラス名)が割り当てられ、ログ出力時に「どのクラスから出たログか」が明確になる
  • ログのフィルタリングや出力先の切り替えなどを、カテゴリ単位で柔軟に制御できる

なるほど・・・カスタマイズ済みのロガーを自動で注入できるようになり、ログの出力元が分かるようになり、さらにログの使い分けもできる、と。かなり柔軟でええ感じにできそうです。これでテックブログ1本かけそう!

横道に逸れそうなので深堀りはしないでおきます。

つぎぃ!

abstract class BackgroundService の解説

protected override async Task ExecuteAsync(CancellationToken stoppingToken)

override しているのは・・・そーいえば BackgroundService を継承していましたね。継承元の BackgroundService は、 Worker Service の基本動作を「共通化」するクラスです。BackgroundService を確認してみましょう。

// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using System.Threading;
using System.Threading.Tasks;

namespace Microsoft.Extensions.Hosting
{
/// <summary>
/// Base class for implementing a long running <see cref="IHostedService"/>.
/// </summary>
public abstract class BackgroundService : IHostedService, IDisposable
{
private Task? _executeTask;
private CancellationTokenSource? _stoppingCts;

/// <summary>
/// Gets the Task that executes the background operation.
/// </summary>
/// <remarks>
/// Will return <see langword="null"/> if the background operation hasn't started.
/// </remarks>
public virtual Task? ExecuteTask => _executeTask;

/// <summary>
/// This method is called when the <see cref="IHostedService"/> starts. The implementation should return a task that represents
/// the lifetime of the long running operation(s) being performed.
/// </summary>
/// <param name="stoppingToken">Triggered when <see cref="IHostedService.StopAsync(CancellationToken)"/> is called.</param>
/// <returns>A <see cref="Task"/> that represents the long running operations.</returns>
/// <remarks>See <see href="https://learn.microsoft.com/dotnet/core/extensions/workers">Worker Services in .NET</see> for implementation guidelines.</remarks>
protected abstract Task ExecuteAsync(CancellationToken stoppingToken);

/// <summary>
/// Triggered when the application host is ready to start the service.
/// </summary>
/// <param name="cancellationToken">Indicates that the start process has been aborted.</param>
/// <returns>A <see cref="Task"/> that represents the asynchronous Start operation.</returns>
public virtual Task StartAsync(CancellationToken cancellationToken)
{
// Create linked token to allow cancelling executing task from provided token
_stoppingCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);

// Store the task we're executing
_executeTask = ExecuteAsync(_stoppingCts.Token);

// If the task is completed then return it, this will bubble cancellation and failure to the caller
if (_executeTask.IsCompleted)
{
return _executeTask;
}

// Otherwise it's running
return Task.CompletedTask;
}

/// <summary>
/// Triggered when the application host is performing a graceful shutdown.
/// </summary>
/// <param name="cancellationToken">Indicates that the shutdown process should no longer be graceful.</param>
/// <returns>A <see cref="Task"/> that represents the asynchronous Stop operation.</returns>
public virtual async Task StopAsync(CancellationToken cancellationToken)
{
// Stop called without start
if (_executeTask == null)
{
return;
}

try
{
// Signal cancellation to the executing method
_stoppingCts!.Cancel();
}
finally
{
#if NET8_0_OR_GREATER
await _executeTask.WaitAsync(cancellationToken).ConfigureAwait(ConfigureAwaitOptions.SuppressThrowing);
#else
// Wait until the task completes or the stop token triggers
var tcs = new TaskCompletionSource<object>();
using CancellationTokenRegistration registration = cancellationToken.Register(s => ((TaskCompletionSource<object>)s!).SetCanceled(), tcs);
// Do not await the _executeTask because cancelling it will throw an OperationCanceledException which we are explicitly ignoring
await Task.WhenAny(_executeTask, tcs.Task).ConfigureAwait(false);
#endif
}

}

/// <inheritdoc />
public virtual void Dispose()
{
_stoppingCts?.Cancel();
}
}
}

BackgroundService クラスは、インターフェースである IHostedService と IDispose を実装しています。インターフェースそれぞれの役割は以下の通りです。

インターフェース名役割
IHostedServiceアプリが起動するときと終了するときに呼ばれる処理を定義するためのインターフェース
IDisposeガベージコレクションでは解放できないリソースを解放するための仕組みを提供するインターフェース

まずは IHostedService を少し深堀してみましょう。

interface IHostedService の解説

IHostedService には、2つ のメソッドしかありません。

// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Threading;
using System.Threading.Tasks;

namespace Microsoft.Extensions.Hosting
{
/// <summary>
/// Defines methods for objects that are managed by the host.
/// 訳:ホストによって管理されるオブジェクトのためのメソッドを定義する
/// </summary>
public interface IHostedService
{
/// <summary>
/// Triggered when the application host is ready to start the service.
/// 訳:アプリケーションホストがサービスを開始する準備が整ったときに発動される
/// </summary>
/// <param name="cancellationToken">Indicates that the start process has been aborted. 訳:開始処理が中止されたことを表す</param>
/// <returns>A <see cref="Task"/> that represents the asynchronous Start operation. 約:非同期の開始処理を表す</returns>
Task StartAsync(CancellationToken cancellationToken);

/// <summary>
/// Triggered when the application host is performing a graceful shutdown. 訳:アプリケーションホストが正常にシャットダウン処理を実行しているときに呼ばれる
/// </summary>
/// <param name="cancellationToken">Indicates that the shutdown process should no longer be graceful. 訳:シャットダウン処理がこれ以上正常に行われるべきでないことを表す</param>
/// <returns>A <see cref="Task"/> that represents the asynchronous Stop operation. 訳:非同期の停止処理を表す</returns>
Task StopAsync(CancellationToken cancellationToken);
}
}

IHostedService にて実装を強要しているのは2つのメソッドです。

Task StartAsync(CancellationToken cancellationToken);

コメントの訳:アプリケーションホストがサービスを開始する準備が整ったときに発動される

  • アプリケーション起動時に呼ばれる
  • サービスの開始処理を書く場所(例: タイマー開始、バックグラウンドスレッドの起動、接続確立など)
  • cancellationToken が渡されるので、起動処理中にキャンセル(例: 起動失敗、強制終了)が可能

Task StopAsync(CancellationToken cancellationToken);

コメントの訳:アプリケーションホストが正常にシャットダウン処理を実行しているときに呼ばれる

  • アプリケーション終了時に呼ばれる
  • サービスの停止処理を書く場所(例: バックグラウンド処理をキャンセル、接続のクローズ、ログ出力)
  • cancellationToken が渡されるので、終了処理が可能(例: シャットダウンが一定時間で強制終了されるときに使う)

併せて考えると、 BackgroundService クラスは、IHostedService インターフェースを通じて上記2つの基礎的かつ具体的な実装を提供している、ということになります。

結果的にみると、BackgroundService クラスを継承することで、バックグラウンドで動作する標準的な機能を簡単に作成できるように設計、効率的に実装できます。

次です。

interface IDisposable の解説

//
// 概要:
// Provides a mechanism for releasing unmanaged resources. 訳:アンマネージリソースを解放する仕組みを提供する
public interface IDisposable
{
//
// 概要:
// Performs application-defined tasks associated with freeing, releasing, or resetting
// unmanaged resources. 訳:アンマネージリソースの解放・破棄・リセットに関連する、アプリケーション定義の処理を実行する
void Dispose();
}

C# には ガベージコレクション(GC) という仕組みがあり、使わなくなったオブジェクトが占有していた メモリ を自動で解放してくれます。 しかし、すべてのリソースが自動で解放されるわけではありません。たとえばファイルハンドルやデータベース接続、COMコンポーネントなどは、開発者自身が明示的に解放処理を記述する必要があります。

そこで登場するのが IDisposable インターフェース です。これを実装することで、リソース解放処理を Dispose メソッド にまとめ、標準的な方法で呼び出せるようになります。 また、using ステートメントを利用すれば、スコープを抜けたタイミングで自動的に Dispose が実行されるため、後片付け漏れを防ぐことができます。

BackgroundService クラスの確認は以上です。Worker.csにもどります。

Hello World をかくところ!

    while (!stoppingToken.IsCancellationRequested)
{
if (_logger.IsEnabled(LogLevel.Information))
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);

Console.WriteLine("Hello, World!");

}
await Task.Delay(1000, stoppingToken);
}

ExecuteAsync メソッドの引数、stoppingToken.IsCancellationRequested != 真 の間、処理を続けます。

この while 句の中に定義したい実装を記述します。 " Hello World! " するならここです(笑)

今回は .NET Worker Service で常駐サービスを作るために SDKが作成するテンプレートを勉強しました。継承している抽象クラスやインターフェースのソースを確認し、目的を調べることができました。

これで Worker Service で書けそうです。実際に書いてみて沢山の失敗を経験することにします(笑)

未経験から始める
システムエンジニア

一生モノのITスキルを身につけよう

あなたの経験とスキルを
ディアシステムで発揮してください!