<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>やってみた | SMS DataTech</title>
	<atom:link href="https://www.sms-datatech.co.jp/category/try/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.sms-datatech.co.jp</link>
	<description></description>
	<lastBuildDate>Mon, 27 Apr 2026 04:15:18 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://www.sms-datatech.co.jp/wp-content/uploads/2022/09/cropped-cropped-favicon-180x180-1-32x32.png</url>
	<title>やってみた | SMS DataTech</title>
	<link>https://www.sms-datatech.co.jp</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【はじめてのJava】ダッシュボードAPIを作成しよう！②コース情報取得編</title>
		<link>https://www.sms-datatech.co.jp/column/try_java-2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=try_java-2</link>
		
		<dc:creator><![CDATA[後藤]]></dc:creator>
		<pubDate>Mon, 27 Apr 2026 00:00:00 +0000</pubDate>
				<category><![CDATA[やってみた]]></category>
		<guid isPermaLink="false">https://www.sms-datatech.co.jp/?p=34978</guid>

					<description><![CDATA[<p>マーケターからエンジニアへ転身した社員による、Javaを用いたダッシュボードAPI作成の実践録。サーバーサイド初心者に向けて、コース情報取得APIの設計から実装ステップ、開発を通じて得たリアルな気づきまでをわかりやすく解説します。</p>
<p>The post <a href="https://www.sms-datatech.co.jp/column/try_java-2/">【はじめてのJava】ダッシュボードAPIを作成しよう！②コース情報取得編</a> first appeared on <a href="https://www.sms-datatech.co.jp">SMS DataTech</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">はじめに</h2>



<p>こんにちは！マーケターから未経験のエンジニアに転職した社員Tです。<br>開発を始めて1年が経ち、サーバーサイド開発にも触れるようになりました。</p>



<p>今回は、Javaを使用したダッシュボードAPIの作成についてご紹介します。 <br><strong><mark style="background-color:#fdff84" class="has-inline-color">これまでフロントエンド中心の開発を行っていた私が、サーバーサイドのAPI開発に挑戦していく様子をお届けします。</mark></strong></p>



<h2 class="wp-block-heading">本記事の対象の方</h2>



<ul class="wp-block-list">
<li>サーバーサイド開発をこれから学びたい方</li>



<li>JavaでのAPI開発に興味がある方</li>



<li>ダッシュボードの作成を通じて、実践的な技術を学びたい方</li>
</ul>



<h2 class="wp-block-heading">Javaとは？</h2>



<p>Javaは、非常に人気のあるオブジェクト指向プログラミング言語で、さまざまなアプリケーションの開発に広く使用されています。</p>



<p>詳しい説明については、<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-blue-2-color"><a href="https://www.sms-datatech.co.jp/column/try_java-1/"><span style="text-decoration: underline;">過去のブログ記事</span></a></mark>をご参照ください。</p>



<h2 class="wp-block-heading">環境構築</h2>



<p>環境構築に関しては、内容が広範囲にわたるため、別の記事で詳細に解説する予定です。</p>



<h2 class="wp-block-heading">ダッシュボードAPIの作成</h2>



<p><strong><mark style="background-color:#fdff84" class="has-inline-color">今回作成したいのは、こんなダッシュボード画面です。ユーザーがコースを選択することで、自分の学習状況を一目で確認できるようにすることを目指しています。</mark></strong></p>



<p>全体の作成の流れとしては、下記の通りとなります。</p>



<ol class="wp-block-list">
<li>ユーザー情報を取得</li>



<li>コース情報を取得</li>



<li>各グラフ描画に必要なデータを取得</li>
</ol>



<p>今回は、2.コース情報を取得するAPIIの実装について詳しく触れていきたいと思います。</p>



<p>1. ユーザー情報の取得については、<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-blue-2-color"><a href="https://www.sms-datatech.co.jp/column/try_java-1/"><span style="text-decoration: underline;">過去のブログ記事</span></a></mark>をご参考ください。</p>



<h2 class="wp-block-heading">コース情報取得APIの設計</h2>



<p>取得したユーザー情報から法人IDをリクエストに含め、コースリストを取得する</p>



<h3 class="wp-block-heading">エンドポイント</h3>



<div style="background-color:#1e1e1e; border-radius:8px; padding:16px 20px; margin:10px 0; overflow-x:auto;">
<code style="color:#d4d4d4; font-family:'Consolas','Monaco','Courier New',monospace; font-size:14px; line-height:1.6; white-space:pre;">/top/getCourseListByCorporateId</code>
</div>



<ul class="wp-block-list">
<li>HTTPメソッド: POST</li>



<li>リクエストボディ: 法人ID</li>



<li>レスポンス: エラーメッセージリスト、コースリスト</li>
</ul>



<h3 class="wp-block-heading">リクエスト例</h3>



<div style="background-color:#1e1e1e; border-radius:8px; padding:16px 20px; margin:10px 0; overflow-x:auto;">
<pre style="margin:0; color:#d4d4d4; font-family:'Consolas','Monaco','Courier New',monospace; font-size:14px; line-height:1.6;"><span style="color:#9cdcfe;">{</span>
  <span style="color:#9cdcfe;">"corporateId"</span><span style="color:#d4d4d4;">:</span> <span style="color:#b5cea8;">1</span>
<span style="color:#9cdcfe;">}</span></pre>
</div>



<p>今回はパスパラメータではなく、リクエストボディから法人IDを受け取る設計にしています。これにより、柔軟なデータの受け渡しが可能となります。</p>



<h3 class="wp-block-heading">レスポンス例</h3>



<div style="background-color:#1e1e1e; border-radius:8px; padding:16px 20px; margin:10px 0; overflow-x:auto;">
<pre style="margin:0; color:#d4d4d4; font-family:'Consolas','Monaco','Courier New',monospace; font-size:14px; line-height:1.6;"><span style="color:#9cdcfe;">{</span>
    <span style="color:#9cdcfe;">"errorMessageList"</span><span style="color:#d4d4d4;">:</span> <span style="color:#569cd6;">null</span><span style="color:#d4d4d4;">,</span>
    <span style="color:#9cdcfe;">"courseList"</span><span style="color:#d4d4d4;">:</span> <span style="color:#d4d4d4;">[</span>
        <span style="color:#9cdcfe;">{</span>
            <span style="color:#9cdcfe;">"course_id"</span><span style="color:#d4d4d4;">:</span> <span style="color:#b5cea8;">1</span><span style="color:#d4d4d4;">,</span>
            <span style="color:#9cdcfe;">"corporate_id"</span><span style="color:#d4d4d4;">:</span> <span style="color:#b5cea8;">1</span><span style="color:#d4d4d4;">,</span>
            <span style="color:#9cdcfe;">"course_name"</span><span style="color:#d4d4d4;">:</span> <span style="color:#ce9178;">"プログラミング基礎"</span><span style="color:#d4d4d4;">,</span>
            <span style="color:#9cdcfe;">"create_date"</span><span style="color:#d4d4d4;">:</span> <span style="color:#ce9178;">"2024-06-01T01:00:00.000+00:00"</span><span style="color:#d4d4d4;">,</span>
            <span style="color:#9cdcfe;">"update_date"</span><span style="color:#d4d4d4;">:</span> <span style="color:#ce9178;">"2024-06-01T01:00:00.000+00:00"</span>
        <span style="color:#9cdcfe;">}</span><span style="color:#d4d4d4;">,</span>
        <span style="color:#9cdcfe;">{</span>
            <span style="color:#9cdcfe;">"course_id"</span><span style="color:#d4d4d4;">:</span> <span style="color:#b5cea8;">2</span><span style="color:#d4d4d4;">,</span>
            <span style="color:#9cdcfe;">"corporate_id"</span><span style="color:#d4d4d4;">:</span> <span style="color:#b5cea8;">1</span><span style="color:#d4d4d4;">,</span>
            <span style="color:#9cdcfe;">"course_name"</span><span style="color:#d4d4d4;">:</span> <span style="color:#ce9178;">"データベース管理"</span><span style="color:#d4d4d4;">,</span>
            <span style="color:#9cdcfe;">"create_date"</span><span style="color:#d4d4d4;">:</span> <span style="color:#ce9178;">"2024-06-15T00:00:00.000+00:00"</span><span style="color:#d4d4d4;">,</span>
            <span style="color:#9cdcfe;">"update_date"</span><span style="color:#d4d4d4;">:</span> <span style="color:#ce9178;">"2024-06-15T00:00:00.000+00:00"</span>
        <span style="color:#9cdcfe;">}</span>
    <span style="color:#d4d4d4;">]</span>
<span style="color:#9cdcfe;">}</span></pre>
</div>



<p>レスポンスでは、courseList というフィールドにコース情報のリストが返されます。<br>このリストには、各コース情報が含まれます。もしエラーメッセージがあれば、errorMessageListにリストとして含まれますが、今回はエラーがない想定です。</p>



<h2 class="wp-block-heading">コース情報取得APIの実装</h2>



<p><strong><mark style="background-color:#fdff84" class="has-inline-color">今回は、ユーザー情報をもとにコースリストを取得するためのAPIを実装します。このAPIは、法人IDに基づいて、対応するコースの情報を返す役割を果たします。</mark></strong></p>



<h3 class="wp-block-heading"><strong>コース情報を管理するモデルクラスの作成</strong></h3>



<p>まず最初に、ユーザー情報を格納するためのエンティティクラスを作成します。<br>このクラスは、データベースのテーブルとマッピングされ、ユーザー情報を格納する役割を持ちます。ここで定義したクラスを基に、データベース操作を行います。</p>



<p>例えば、以下のような CourseEntity クラスを作成します。</p>



<div style="background-color:#1e1e1e; border-radius:8px; padding:16px 20px; margin:10px 0; overflow-x:auto;">
<pre style="margin:0; color:#d4d4d4; font-family:'Consolas','Monaco','Courier New',monospace; font-size:14px; line-height:1.6;"><span style="color:#c586c0;">package</span> <span style="color:#4ec9b0;">jp.co.smsdatatech.questiongenerate.entity</span><span style="color:#d4d4d4;">;</span>

<span style="color:#c586c0;">import</span> <span style="color:#4ec9b0;">java.io.Serializable</span><span style="color:#d4d4d4;">;</span>
<span style="color:#c586c0;">import</span> <span style="color:#4ec9b0;">java.sql.Timestamp</span><span style="color:#d4d4d4;">;</span>

<span style="color:#c586c0;">import</span> <span style="color:#4ec9b0;">jakarta.persistence.Column</span><span style="color:#d4d4d4;">;</span>
<span style="color:#c586c0;">import</span> <span style="color:#4ec9b0;">lombok.Data</span><span style="color:#d4d4d4;">;</span>

<span style="color:#6a9955;">/**</span>
<span style="color:#6a9955;"> * courseテーブルEntity</span>
<span style="color:#6a9955;"> */</span>
<span style="color:#dcdcaa;">@Data</span>
<span style="color:#569cd6;">public class</span> <span style="color:#4ec9b0;">CourseEntity</span> <span style="color:#569cd6;">implements</span> <span style="color:#4ec9b0;">Serializable</span> <span style="color:#d4d4d4;">{</span>

    <span style="color:#6a9955;">/** シリアルバージョンUID */</span>
    <span style="color:#569cd6;">private static final</span> <span style="color:#569cd6;">long</span> <span style="color:#4fc1ff;">serialVersionUID</span> <span style="color:#d4d4d4;">=</span> <span style="color:#b5cea8;">1L</span><span style="color:#d4d4d4;">;</span>

    <span style="color:#6a9955;">/** コースID */</span>
    <span style="color:#569cd6;">private</span> <span style="color:#4ec9b0;">Integer</span> <span style="color:#9cdcfe;">course_id</span><span style="color:#d4d4d4;">;</span>

    <span style="color:#6a9955;">/** 法人ID */</span>
    <span style="color:#569cd6;">private</span> <span style="color:#4ec9b0;">Integer</span> <span style="color:#9cdcfe;">corporate_id</span><span style="color:#d4d4d4;">;</span>

    <span style="color:#6a9955;">/** コース名 */</span>
    <span style="color:#569cd6;">private</span> <span style="color:#4ec9b0;">String</span> <span style="color:#9cdcfe;">course_name</span><span style="color:#d4d4d4;">;</span>

    <span style="color:#6a9955;">/** 作成日 */</span>
    <span style="color:#569cd6;">private</span> <span style="color:#4ec9b0;">Timestamp</span> <span style="color:#9cdcfe;">create_date</span><span style="color:#d4d4d4;">;</span>

    <span style="color:#6a9955;">/** 更新日 */</span>
    <span style="color:#569cd6;">private</span> <span style="color:#4ec9b0;">Timestamp</span> <span style="color:#9cdcfe;">update_date</span><span style="color:#d4d4d4;">;</span>
<span style="color:#d4d4d4;">}</span></pre>
</div>



<h3 class="wp-block-heading"><strong>MapperXMLの作成</strong></h3>



<p>次に、データベースからコース情報を取得するためのクエリを定義する MapperXML を作成します。このXMLファイルは、MyBatisなどのORMツールと組み合わせてデータベースとのやり取りを行います。</p>



<div style="background-color:#1e1e1e; border-radius:8px; padding:16px 20px; margin:10px 0; overflow-x:auto;">
<pre style="margin:0; color:#d4d4d4; font-family:'Consolas','Monaco','Courier New',monospace; font-size:14px; line-height:1.6;"><span style="color:#808080;">&lt;?</span><span style="color:#569cd6;">xml</span> <span style="color:#9cdcfe;">version</span><span style="color:#d4d4d4;">=</span><span style="color:#ce9178;">"1.0"</span> <span style="color:#9cdcfe;">encoding</span><span style="color:#d4d4d4;">=</span><span style="color:#ce9178;">"UTF-8"</span><span style="color:#808080;">?&gt;</span>
<span style="color:#808080;">&lt;!</span><span style="color:#569cd6;">DOCTYPE</span> <span style="color:#569cd6;">mapper</span> PUBLIC <span style="color:#ce9178;">"-//mybatis.org//DTD Mapper 3.0//EN"</span> <span style="color:#ce9178;">"http://mybatis.org/dtd/mybatis-3-mapper.dtd"</span><span style="color:#808080;">&gt;</span>
<span style="color:#808080;">&lt;</span><span style="color:#569cd6;">mapper</span> <span style="color:#9cdcfe;">namespace</span><span style="color:#d4d4d4;">=</span><span style="color:#ce9178;">"jp.co.smsdatatech.questiongenerate.repository.CourseMapper"</span><span style="color:#808080;">&gt;</span>
    <span style="color:#808080;">&lt;</span><span style="color:#569cd6;">select</span> <span style="color:#9cdcfe;">id</span><span style="color:#d4d4d4;">=</span><span style="color:#ce9178;">"getAllByCorporateId"</span> <span style="color:#9cdcfe;">parameterType</span><span style="color:#d4d4d4;">=</span><span style="color:#ce9178;">"Integer"</span> <span style="color:#9cdcfe;">resultType</span><span style="color:#d4d4d4;">=</span><span style="color:#ce9178;">"jp.co.smsdatatech.questiongenerate.entity.CourseEntity"</span><span style="color:#808080;">&gt;</span>
        <span style="color:#569cd6;">SELECT</span>
            <span style="color:#9cdcfe;">course_id</span>,
            <span style="color:#9cdcfe;">corporate_id</span>,
            <span style="color:#9cdcfe;">course_name</span>,
            <span style="color:#9cdcfe;">create_date</span>,
            <span style="color:#9cdcfe;">update_date</span>
        <span style="color:#569cd6;">FROM</span>
            <span style="color:#4ec9b0;">course</span>
        <span style="color:#569cd6;">WHERE</span>
            <span style="color:#9cdcfe;">corporate_id</span> <span style="color:#d4d4d4;">=</span> <span style="color:#dcdcaa;">#{corporateId}</span>
        <span style="color:#569cd6;">ORDER BY</span>
            <span style="color:#9cdcfe;">course_id</span>
    <span style="color:#808080;">&lt;/</span><span style="color:#569cd6;">select</span><span style="color:#808080;">&gt;</span>
<span style="color:#808080;">&lt;/</span><span style="color:#569cd6;">mapper</span><span style="color:#808080;">&gt;</span></pre>
</div>



<h3 class="wp-block-heading"><strong>サービスクラスの作成</strong></h3>



<p>次に、サービスクラスを作成してコース情報の取得処理を実装します。このクラスでは、リポジトリや Mapper を使ってデータベースから情報を取得し、レスポンスとして変換します。</p>



<div style="background-color:#1e1e1e; border-radius:8px; padding:16px 20px; margin:10px 0; overflow-x:auto;">
<pre style="margin:0; color:#d4d4d4; font-family:'Consolas','Monaco','Courier New',monospace; font-size:14px; line-height:1.6;"><span style="color:#c586c0;">import</span> <span style="color:#4ec9b0;">org.springframework.beans.factory.annotation.Autowired</span><span style="color:#d4d4d4;">;</span>
<span style="color:#c586c0;">import</span> <span style="color:#4ec9b0;">org.springframework.stereotype.Service</span><span style="color:#d4d4d4;">;</span>

<span style="color:#c586c0;">import</span> <span style="color:#4ec9b0;">jp.co.smsdatatech.questiongenerate.entity.CourseEntity</span><span style="color:#d4d4d4;">;</span>
<span style="color:#c586c0;">import</span> <span style="color:#4ec9b0;">jp.co.smsdatatech.questiongenerate.repository.CourseMapper</span><span style="color:#d4d4d4;">;</span>

<span style="color:#6a9955;">/**</span>
<span style="color:#6a9955;"> * コーステーブルService</span>
<span style="color:#6a9955;"> */</span>
<span style="color:#dcdcaa;">@Service</span>
<span style="color:#569cd6;">public class</span> <span style="color:#4ec9b0;">CourseService</span> <span style="color:#d4d4d4;">{</span>

    <span style="color:#6a9955;">/** ログ出力クラス */</span>
    <span style="color:#569cd6;">private static final</span> <span style="color:#4ec9b0;">Logger</span> <span style="color:#9cdcfe;">log</span> <span style="color:#d4d4d4;">=</span> <span style="color:#4ec9b0;">LoggerFactory</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">getLogger</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">clazz</span><span style="color:#d4d4d4;">:</span><span style="color:#4ec9b0;">CourseService</span><span style="color:#d4d4d4;">.</span><span style="color:#569cd6;">class</span><span style="color:#d4d4d4;">);</span>

    <span style="color:#6a9955;">/** courseテーブルMapper */</span>
    <span style="color:#dcdcaa;">@Autowired</span>
    <span style="color:#569cd6;">private</span> <span style="color:#4ec9b0;">CourseMapper</span> <span style="color:#9cdcfe;">courseMapper</span><span style="color:#d4d4d4;">;</span>

    <span style="color:#6a9955;">/**</span>
<span style="color:#6a9955;">     * コース検索（法人ID検索）</span>
<span style="color:#6a9955;">     * 1.機能概要</span>
<span style="color:#6a9955;">     * courseテーブルから法人IDに紐づくコースを取得し、Listで返却する。</span>
<span style="color:#6a9955;">     * 2.処理フロー</span>
<span style="color:#6a9955;">     * ①DB接続・抽出</span>
<span style="color:#6a9955;">     * ②返却</span>
<span style="color:#6a9955;">     *</span>
<span style="color:#6a9955;">     * @param corporateId 法人ID</span>
<span style="color:#6a9955;">     * @return {@literal List&lt;CourseEntity&gt; コース一覧}</span>
<span style="color:#6a9955;">     */</span>
    <span style="color:#569cd6;">public</span> <span style="color:#4ec9b0;">List</span><span style="color:#d4d4d4;">&lt;</span><span style="color:#4ec9b0;">CourseEntity</span><span style="color:#d4d4d4;">&gt;</span> <span style="color:#dcdcaa;">getAllByCorporateId</span><span style="color:#d4d4d4;">(</span><span style="color:#4ec9b0;">Integer</span> <span style="color:#9cdcfe;">corporateId</span><span style="color:#d4d4d4;">) {</span>
        <span style="color:#4ec9b0;">List</span><span style="color:#d4d4d4;">&lt;</span><span style="color:#4ec9b0;">CourseEntity</span><span style="color:#d4d4d4;">&gt;</span> <span style="color:#9cdcfe;">courseList</span> <span style="color:#d4d4d4;">=</span> <span style="color:#9cdcfe;">courseMapper</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">getAllByCorporateId</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">corporateId</span><span style="color:#d4d4d4;">);</span>
        <span style="color:#9cdcfe;">log</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">info</span><span style="color:#d4d4d4;">(</span><span style="color:#ce9178;">"courseテーブルから法人ごとのレコードを取得しました。"</span><span style="color:#d4d4d4;">);</span>
        <span style="color:#c586c0;">return</span> <span style="color:#9cdcfe;">courseList</span><span style="color:#d4d4d4;">;</span>
    <span style="color:#d4d4d4;">}</span>
<span style="color:#d4d4d4;">}</span></pre>
</div>



<h3 class="wp-block-heading"><strong>コントローラークラスの作成</strong></h3>



<p>最後に、リクエストを処理する TopRest コントローラークラスを作成します。</p>



<div style="background-color:#1e1e1e; border-radius:8px; padding:16px 20px; margin:10px 0; overflow-x:auto;">
<pre style="margin:0; color:#d4d4d4; font-family:'Consolas','Monaco','Courier New',monospace; font-size:14px; line-height:1.6;"><span style="color:#6a9955;">/**</span>
<span style="color:#6a9955;"> * コースリスト取得.</span>
<span style="color:#6a9955;"> *</span>
<span style="color:#6a9955;"> * 法人IDに紐づくコースリストを取得し、CorporateCourseResponseForm に詰めて返却する。</span>
<span style="color:#6a9955;"> *</span>
<span style="color:#6a9955;"> * &lt;h3&gt;処理フロー&lt;/h3&gt;</span>
<span style="color:#6a9955;"> * 1. コース情報（コースIDとコース名）を取得&lt;br&gt;</span>
<span style="color:#6a9955;"> * 2. 取得したリストを返却</span>
<span style="color:#6a9955;"> *</span>
<span style="color:#6a9955;"> * @param form Top画面Form</span>
<span style="color:#6a9955;"> * @param result バリデーション結果</span>
<span style="color:#6a9955;"> * @return コースリスト CorporateCourseResponseForm</span>
<span style="color:#6a9955;"> */</span>
<span style="color:#dcdcaa;">@PostMapping</span><span style="color:#d4d4d4;">(</span><span style="color:#ce9178;">"/top/getCourseListByCorporateId"</span><span style="color:#d4d4d4;">)</span>
<span style="color:#569cd6;">public</span> <span style="color:#4ec9b0;">CorporateCourseResponseForm</span> <span style="color:#dcdcaa;">getCourseListByCorporateId</span><span style="color:#d4d4d4;">(</span><span style="color:#dcdcaa;">@RequestBody</span> <span style="color:#dcdcaa;">@Valid</span> <span style="color:#4ec9b0;">TopForm</span> <span style="color:#9cdcfe;">form</span><span style="color:#d4d4d4;">,</span>
        <span style="color:#4ec9b0;">BindingResult</span> <span style="color:#9cdcfe;">result</span><span style="color:#d4d4d4;">) {</span>
    <span style="color:#9cdcfe;">log</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">debug</span><span style="color:#d4d4d4;">(</span><span style="color:#ce9178;">"TopRest (getCourseListByCorporateId) 呼び出し開始"</span><span style="color:#d4d4d4;">);</span>

    <span style="color:#4ec9b0;">CorporateCourseResponseForm</span> <span style="color:#9cdcfe;">responseForm</span> <span style="color:#d4d4d4;">=</span> <span style="color:#569cd6;">new</span> <span style="color:#4ec9b0;">CorporateCourseResponseForm</span><span style="color:#d4d4d4;">();</span>
    <span style="color:#4ec9b0;">List</span><span style="color:#d4d4d4;">&lt;</span><span style="color:#4ec9b0;">String</span><span style="color:#d4d4d4;">&gt;</span> <span style="color:#9cdcfe;">errorMessageList</span> <span style="color:#d4d4d4;">=</span> <span style="color:#569cd6;">new</span> <span style="color:#4ec9b0;">ArrayList</span><span style="color:#d4d4d4;">&lt;&gt;();</span>

    <span style="color:#4ec9b0;">Set</span><span style="color:#d4d4d4;">&lt;</span><span style="color:#4ec9b0;">String</span><span style="color:#d4d4d4;">&gt;</span> <span style="color:#9cdcfe;">processedFields</span> <span style="color:#d4d4d4;">=</span> <span style="color:#569cd6;">new</span> <span style="color:#4ec9b0;">HashSet</span><span style="color:#d4d4d4;">&lt;&gt;();</span>

    <span style="color:#6a9955;">// バリデーションエラーがある場合、詳細なエラーメッセージを追加</span>
    <span style="color:#c586c0;">if</span> <span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">result</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">hasErrors</span><span style="color:#d4d4d4;">()) {</span>
        <span style="color:#c586c0;">for</span> <span style="color:#d4d4d4;">(</span><span style="color:#4ec9b0;">FieldError</span> <span style="color:#9cdcfe;">fieldError</span> <span style="color:#d4d4d4;">:</span> <span style="color:#9cdcfe;">result</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">getFieldErrors</span><span style="color:#d4d4d4;">()) {</span>
            <span style="color:#6a9955;">// フィールド名を基に重複チェック</span>
            <span style="color:#c586c0;">if</span> <span style="color:#d4d4d4;">(!</span><span style="color:#9cdcfe;">processedFields</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">contains</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">fieldError</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">getField</span><span style="color:#d4d4d4;">())) {</span>
                <span style="color:#4ec9b0;">String</span> <span style="color:#9cdcfe;">errorMessage</span> <span style="color:#d4d4d4;">=</span> <span style="color:#9cdcfe;">messageSource</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">getMessage</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">fieldError</span><span style="color:#d4d4d4;">,</span> <span style="color:#4ec9b0;">Locale</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">getDefault</span><span style="color:#d4d4d4;">());</span>
                <span style="color:#9cdcfe;">errorMessageList</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">add</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">errorMessage</span><span style="color:#d4d4d4;">);</span>
                <span style="color:#9cdcfe;">processedFields</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">add</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">fieldError</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">getField</span><span style="color:#d4d4d4;">());</span>
            <span style="color:#d4d4d4;">}</span>
        <span style="color:#d4d4d4;">}</span>
        <span style="color:#9cdcfe;">responseForm</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">setErrorMessageList</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">errorMessageList</span><span style="color:#d4d4d4;">);</span>
        <span style="color:#c586c0;">return</span> <span style="color:#9cdcfe;">responseForm</span><span style="color:#d4d4d4;">;</span>
    <span style="color:#d4d4d4;">}</span>

    <span style="color:#6a9955;">// 法人IDを整数に変換</span>
    <span style="color:#4ec9b0;">Integer</span> <span style="color:#9cdcfe;">corporateId</span> <span style="color:#d4d4d4;">=</span> <span style="color:#4ec9b0;">Integer</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">parseInt</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">form</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">getCorporateId</span><span style="color:#d4d4d4;">());</span>

    <span style="color:#6a9955;">// 法人IDを基にコースリストを取得</span>
    <span style="color:#4ec9b0;">List</span><span style="color:#d4d4d4;">&lt;</span><span style="color:#4ec9b0;">CourseEntity</span><span style="color:#d4d4d4;">&gt;</span> <span style="color:#9cdcfe;">courseList</span> <span style="color:#d4d4d4;">=</span> <span style="color:#9cdcfe;">courseService</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">getAllByCorporateId</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">corporateId</span><span style="color:#d4d4d4;">);</span>

    <span style="color:#c586c0;">if</span> <span style="color:#d4d4d4;">(</span><span style="color:#4ec9b0;">CollectionUtils</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">isEmpty</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">courseList</span><span style="color:#d4d4d4;">)) {</span>
        <span style="color:#6a9955;">// コースが見つからなかった場合</span>
        <span style="color:#9cdcfe;">errorMessageList</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">add</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">messageSource</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">getMessage</span><span style="color:#d4d4d4;">(</span><span style="color:#4ec9b0;">ErrorMessages</span><span style="color:#d4d4d4;">.</span><span style="color:#4fc1ff;">COURSE_NOT_FOUND</span><span style="color:#d4d4d4;">,</span> <span style="color:#9cdcfe;">args</span><span style="color:#d4d4d4;">:</span><span style="color:#569cd6;">null</span><span style="color:#d4d4d4;">,</span> <span style="color:#4ec9b0;">Locale</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">getDefault</span><span style="color:#d4d4d4;">()));</span>
        <span style="color:#9cdcfe;">responseForm</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">setErrorMessageList</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">errorMessageList</span><span style="color:#d4d4d4;">);</span>
        <span style="color:#9cdcfe;">log</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">debug</span><span style="color:#d4d4d4;">(</span><span style="color:#ce9178;">"CourseRest (getCourseList) コースが見つかりません: "</span><span style="color:#d4d4d4;">);</span>
        <span style="color:#c586c0;">return</span> <span style="color:#9cdcfe;">responseForm</span><span style="color:#d4d4d4;">;</span>
    <span style="color:#d4d4d4;">}</span>

    <span style="color:#6a9955;">// コースリストをレスポンスに設定</span>
    <span style="color:#9cdcfe;">responseForm</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">setCourseList</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">courseList</span><span style="color:#d4d4d4;">);</span>
    <span style="color:#c586c0;">return</span> <span style="color:#9cdcfe;">responseForm</span><span style="color:#d4d4d4;">;</span>
<span style="color:#d4d4d4;">}</span></pre>
</div>



<p><strong><mark style="background-color:#fdff84" class="has-inline-color">今回の実装では、リクエストボディのバリデーション に @NotBlank と @Pattern のアノテーションを適用することで、不正なデータによる例外発生を未然に防ぐ設計 になっています。</mark></strong></p>



<h2 class="wp-block-heading">実装内容の振り返り</h2>



<p>今回のコース情報取得に関して、情報が頻繁に変更されることはないため、キャッシュの活用が有効であることに実装後に気付きました。<br>現状ではリクエストごとにDBへのアクセスを行っていますが、キャッシュを導入することで、レスポンス速度の向上やDB負荷の軽減が期待できると考えています。</p>



<p>これについては、今後の改善点として検討していく予定です。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p><strong><mark style="background-color:#fdff84" class="has-inline-color">今回の実装を通じて、実装前に視野を広げ、さまざまな手段を自分の引き出しに入れておく重要性を実感しました。</mark></strong>そのためには、「もっと良い方法はないか」と常にベストを探し続けることが大切だと感じました。経験を積むことと同時に、探究心を持ち続けることで、自然と「より良いものを作りたい」という気持ちが湧いてきます。今後もこの姿勢を大切にし、より良い設計と実装を目指して学び続けていきたいと思います。</p>



<div class="author__card">
  <div class="author-data">
    <img decoding="async" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/11/author-3.png" alt="筆者イメージ">
    <div>
      <p>筆者：K・T（20代）</p>
      <p>所属：ハイブリット・マルチクラウド部</p>
    </div>
  </div>
  <div class="author-intro">
    <p>マーケターとしてWEB広告運用やアパレルブランドの運営に携わってきたが、エンジニアとしての新たな挑戦を決意した転職組。<br>好奇心が旺盛で、新しいことに挑戦する姿勢が彼女の魅力。<br>マーケター×エンジニアの強みを生かし、UI/UXの提案から実装まで幅広く対応し、彼女自身がブランドを育てているのだろうと思わせてくれる、そんな20代の乙女。</p>
  </div>
</div>


<div class="block-block-22">
	<div class="Editor-wrap">
					<div class="Editor-wrap__titleMsg">まずはお気軽にご相談ください</div>
			<div class="Editor-wrap__title">お問い合わせフォーム</div>
			</div>
</div>


<script charset="utf-8" type="text/javascript" src="//js.hsforms.net/forms/embed/v2.js"></script>
<script>
  hbspt.forms.create({
    region: "na1",
    portalId: "23171742",
    formId: "b36c7c3b-83a0-43c4-8daa-8e055d6805e9"
  });
</script><p>The post <a href="https://www.sms-datatech.co.jp/column/try_java-2/">【はじめてのJava】ダッシュボードAPIを作成しよう！②コース情報取得編</a> first appeared on <a href="https://www.sms-datatech.co.jp">SMS DataTech</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【はじめてのJava】ダッシュボードAPIを作成しよう！① ユーザー情報取得編</title>
		<link>https://www.sms-datatech.co.jp/column/try_java-1/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=try_java-1</link>
		
		<dc:creator><![CDATA[後藤]]></dc:creator>
		<pubDate>Thu, 26 Mar 2026 01:52:04 +0000</pubDate>
				<category><![CDATA[やってみた]]></category>
		<category><![CDATA[システム開発]]></category>
		<guid isPermaLink="false">https://www.sms-datatech.co.jp/?p=34967</guid>

					<description><![CDATA[<p>マーケターからエンジニアへ転身した社員による、Java（Spring Boot × MyBatis）を用いたダッシュボードAPI作成の実践録。サーバーサイド初心者に向けて、ユーザー情報取得APIの設計から実装ステップ、開発を通じて得たセキュリティ面でのリアルな気づきまでをわかりやすく解説します。</p>
<p>The post <a href="https://www.sms-datatech.co.jp/column/try_java-1/">【はじめてのJava】ダッシュボードAPIを作成しよう！① ユーザー情報取得編</a> first appeared on <a href="https://www.sms-datatech.co.jp">SMS DataTech</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">はじめに</h2>



<p>こんにちは！マーケターから未経験のエンジニアに転身した社員Tです。<br>開発を始めて1年が経ち、サーバーサイド開発にも触れるようになりました。</p>



<p><strong><mark style="background-color:#fdff84" class="has-inline-color">今回は、Javaを使用したダッシュボードAPIの作成についてご紹介します。</mark></strong><br>これまでクライアントサイド中心の開発を行っていた私が、サーバーサイドのAPI開発に挑戦していく様子をお届けします。</p>



<h3 class="wp-block-heading">本記事の対象の方</h3>



<ul class="wp-block-list">
<li>サーバーサイド開発をこれから学びたい方</li>



<li>JavaでのAPI開発に興味がある方</li>



<li>ダッシュボードの作成を通じて、実践的な技術を学びたい方</li>
</ul>



<h2 class="wp-block-heading">Javaとは？</h2>



<p>クライアントサイドしか触れてこなかった私は、サーバーサイドについては全くの初心者でした。そこで、まずは「Javaとは何か？」というところからお話ししたいと思います。</p>



<p><strong><mark style="background-color:#fdff84" class="has-inline-color">Javaは、非常に人気のあるオブジェクト指向プログラミング言語で、さまざまなアプリケーションの開発に広く使用されています。</mark></strong>特に、サーバーサイド開発や大規模システム開発において強力なツールとなっており、以下のような特徴があります。</p>



<h3 class="wp-block-heading">プラットフォームに依存しない</h3>



<p>Javaで開発されたアプリケーションは、どのOSでも実行可能で、クロスプラットフォームで動作します。これにより、Javaで書かれたコードは、Windows、Mac、Linuxなど、異なる環境でも問題なく実行できます。</p>



<h3 class="wp-block-heading">オブジェクト指向</h3>



<p>Javaはオブジェクト指向プログラミングに基づいているため、コードが整理されていて、再利用性が高く、保守性に優れています。これにより、アプリケーションの規模が大きくなっても、管理がしやすくなります。</p>



<h3 class="wp-block-heading">豊富なライブラリとフレームワーク</h3>



<p>Javaには、開発を効率化するための豊富なライブラリやフレームワークが存在します。特に、Spring BootやHibernateなどは、サーバーサイド開発において非常に便利で、効率的に開発を進めることができます。</p>



<p>このように、Javaは非常に強力で多用途な言語です。これからサーバーサイド開発に取り組む際に、大きな武器となってくれること間違いなしです。</p>



<h2 class="wp-block-heading">環境構築</h2>



<p>環境構築に関しては、内容が広範囲にわたるため、別の記事で詳細に解説する予定です。</p>



<h2 class="wp-block-heading">ダッシュボードAPIの作成</h2>



<p><strong><mark style="background-color:#fdff84" class="has-inline-color">今回作成したいのは、こんなダッシュボード画面です。</mark></strong>ユーザーがコースを選択することで、自分の学習状況を一目で確認できるようにすることを目指しています。</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="465" src="https://www.sms-datatech.co.jp/wp-content/uploads/2026/02/image1-3-1024x465.png" alt="" class="wp-image-34969" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2026/02/image1-3-1024x465.png 1024w, https://www.sms-datatech.co.jp/wp-content/uploads/2026/02/image1-3-300x136.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2026/02/image1-3-768x349.png 768w, https://www.sms-datatech.co.jp/wp-content/uploads/2026/02/image1-3-1536x698.png 1536w, https://www.sms-datatech.co.jp/wp-content/uploads/2026/02/image1-3.png 1736w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>全体の作成の流れとしては、下記の通りとなります。</p>



<ol class="wp-block-list">
<li>ユーザー情報を取得</li>



<li>コース情報を取得</li>



<li>各グラフ描画に必要なデータを取得</li>
</ol>



<p>今回は、その中でも最初のステップとして、<br>「1.ユーザー情報を取得」するAPIの実装について詳しく触れていきたいと思います。</p>



<h2 class="wp-block-heading">ユーザー情報取得APIの設計</h2>



<p>まず最初に、ユーザー情報を取得するAPIの設計方針を考えます。</p>



<p><strong><mark style="background-color:#fdff84" class="has-inline-color">今回のAPIでは、指定されたメールアドレスを基に、ユーザーIDと法人IDを取得し、画面に返すことが目的です。</mark></strong>従って、POSTメソッドを使用し、リクエストボディからメールアドレスを受け取るシンプルなAPI設計にします。</p>



<h3 class="wp-block-heading">エンドポイント</h3>



<div style="background-color:#1e1e1e; border-radius:8px; padding:16px 20px; margin:10px 0; overflow-x:auto;">
<code style="color:#d4d4d4; font-family:'Consolas','Monaco','Courier New',monospace; font-size:14px; line-height:1.6; white-space:pre;">/top/getUserDetailsByEmail</code>
</div>



<ul class="wp-block-list">
<li>HTTPメソッド： POST</li>



<li>リクエストボディ： メールアドレス</li>



<li>レスポンス： ユーザーIDと法人ID（JSON形式）</li>
</ul>



<h4 class="wp-block-heading">リクエスト例</h4>



<div style="background-color:#1e1e1e; border-radius:8px; padding:16px 20px; margin:10px 0; overflow-x:auto;">
<pre style="margin:0; color:#d4d4d4; font-family:'Consolas','Monaco','Courier New',monospace; font-size:14px; line-height:1.6;"><span style="color:#9cdcfe;">{</span>
  <span style="color:#9cdcfe;">"mailAddress"</span><span style="color:#d4d4d4;">:</span> <span style="color:#ce9178;">"[email protected]"</span>
<span style="color:#9cdcfe;">}</span></pre>
</div>



<p>今回はパスパラメータではなく、リクエストボディからメールアドレスを受け取る設計にしています。これにより、柔軟なデータの受け渡しが可能となります。</p>



<h4 class="wp-block-heading">レスポンス例</h4>



<div style="background-color:#1e1e1e; border-radius:8px; padding:16px 20px; margin:10px 0; overflow-x:auto;">
<pre style="margin:0; color:#d4d4d4; font-family:'Consolas','Monaco','Courier New',monospace; font-size:14px; line-height:1.6;"><span style="color:#9cdcfe;">{</span>
  <span style="color:#9cdcfe;">"userId"</span><span style="color:#d4d4d4;">:</span> <span style="color:#b5cea8;">175</span><span style="color:#d4d4d4;">,</span>
  <span style="color:#9cdcfe;">"corporateId"</span><span style="color:#d4d4d4;">:</span> <span style="color:#b5cea8;">1</span><span style="color:#d4d4d4;">,</span>
  <span style="color:#9cdcfe;">"errorMessageList"</span><span style="color:#d4d4d4;">:</span> <span style="color:#569cd6;">null</span>
<span style="color:#9cdcfe;">}</span></pre>
</div>



<p>このレスポンスでは、指定されたメールアドレスに対応するユーザーの情報（ユーザーIDと法人ID）をJSON形式で返します。もしエラーが発生した場合は、errorMessageListにエラーメッセージを追加することで、エラー対応を行います。</p>



<h2 class="wp-block-heading">ユーザー情報取得APIの実装</h2>



<p>次に、このAPIを実際に実装していきます。Spring Bootを使って実装を行い、リクエストを受け取った後にデータベースからユーザー情報を取得し、レスポンスを返す流れになります。</p>



<h3 class="wp-block-heading">ユーザー情報を管理するモデルクラスの作成</h3>



<p><strong><mark style="background-color:#fdff84" class="has-inline-color">まず最初に、ユーザー情報を格納するためのエンティティクラスを作成します。</mark></strong>このクラスは、データベースのテーブルとマッピングされ、ユーザー情報を格納する役割を持ちます。ここで定義したクラスを基に、データベース操作を行います。</p>



<p>例として、LoginHistoryEntityエンティティクラスを作成します。</p>



<div style="background-color:#1e1e1e; border-radius:8px; padding:16px 20px; margin:10px 0; overflow-x:auto;">
<pre style="margin:0; color:#d4d4d4; font-family:'Consolas','Monaco','Courier New',monospace; font-size:14px; line-height:1.6;"><span style="color:#c586c0;">package</span> <span style="color:#4ec9b0;">jp.co.smsdatatech.questiongenerate.entity</span><span style="color:#d4d4d4;">;</span>

<span style="color:#c586c0;">import</span> <span style="color:#4ec9b0;">java.io.Serializable</span><span style="color:#d4d4d4;">;</span>
<span style="color:#c586c0;">import</span> <span style="color:#4ec9b0;">java.sql.Timestamp</span><span style="color:#d4d4d4;">;</span>
<span style="color:#c586c0;">import</span> <span style="color:#4ec9b0;">lombok.Data</span><span style="color:#d4d4d4;">;</span>

<span style="color:#6a9955;">/**
 * ログイン履歴テーブルEntity
 */</span>
<span style="color:#dcdcaa;">@Data</span>
<span style="color:#569cd6;">public class</span> <span style="color:#4ec9b0;">LoginHistoryEntity</span> <span style="color:#569cd6;">implements</span> <span style="color:#4ec9b0;">Serializable</span> <span style="color:#d4d4d4;">{</span>

    <span style="color:#6a9955;">/** シリアルバージョンUID */</span>
    <span style="color:#569cd6;">private static final long</span> <span style="color:#4fc1ff;">serialVersionUID</span> <span style="color:#d4d4d4;">=</span> <span style="color:#b5cea8;">1L</span><span style="color:#d4d4d4;">;</span>

    <span style="color:#6a9955;">/** ユーザーID */</span>
    <span style="color:#569cd6;">private</span> <span style="color:#4ec9b0;">Integer</span> <span style="color:#9cdcfe;">userId</span><span style="color:#d4d4d4;">;</span>

    <span style="color:#6a9955;">/** 法人ID */</span>
    <span style="color:#569cd6;">private</span> <span style="color:#4ec9b0;">Integer</span> <span style="color:#9cdcfe;">corporateID</span><span style="color:#d4d4d4;">;</span>

    <span style="color:#6a9955;">/** ログイン日時 */</span>
    <span style="color:#569cd6;">private</span> <span style="color:#4ec9b0;">Timestamp</span> <span style="color:#9cdcfe;">loginDate</span><span style="color:#d4d4d4;">;</span>
<span style="color:#d4d4d4;">}</span></pre>
</div>



<p>Serializable インターフェースを実装することで、オブジェクトのシリアライズが可能となり、永続化や通信に利用できるようになっています。</p>



<h3 class="wp-block-heading">MyBatisのMapper設定</h3>



<p>次に、データベースからユーザー情報を取得するためのクエリを定義するXMLファイルを作成します。このXMLファイルは、MyBatisなどのORMツールと組み合わせてデータベースとのやり取りを行います。</p>



<div style="background-color:#1e1e1e; border-radius:8px; padding:16px 20px; margin:10px 0; overflow-x:auto;">
<pre style="margin:0; color:#d4d4d4; font-family:'Consolas','Monaco','Courier New',monospace; font-size:14px; line-height:1.6;"><span style="color:#808080;">&lt;?</span><span style="color:#569cd6;">xml</span> <span style="color:#9cdcfe;">version</span><span style="color:#d4d4d4;">=</span><span style="color:#ce9178;">"1.0"</span> <span style="color:#9cdcfe;">encoding</span><span style="color:#d4d4d4;">=</span><span style="color:#ce9178;">"UTF-8"</span><span style="color:#808080;">?&gt;</span>
<span style="color:#808080;">&lt;!</span><span style="color:#569cd6;">DOCTYPE</span> <span style="color:#4ec9b0;">mapper</span> <span style="color:#9cdcfe;">PUBLIC</span> <span style="color:#ce9178;">"-//mybatis.org//DTD Mapper 3.0//EN"</span>
  <span style="color:#ce9178;">"http://mybatis.org/dtd/mybatis-3-mapper.dtd"</span><span style="color:#808080;">&gt;</span>

<span style="color:#808080;">&lt;</span><span style="color:#569cd6;">mapper</span> <span style="color:#9cdcfe;">namespace</span><span style="color:#d4d4d4;">=</span><span style="color:#ce9178;">"jp.co.smsdatatech.questiongenerate.repository.CustomerMapper"</span><span style="color:#808080;">&gt;</span>

  <span style="color:#808080;">&lt;</span><span style="color:#569cd6;">select</span> <span style="color:#9cdcfe;">id</span><span style="color:#d4d4d4;">=</span><span style="color:#ce9178;">"getByMailAddress"</span>
          <span style="color:#9cdcfe;">parameterType</span><span style="color:#d4d4d4;">=</span><span style="color:#ce9178;">"String"</span>
          <span style="color:#9cdcfe;">resultType</span><span style="color:#d4d4d4;">=</span><span style="color:#ce9178;">"jp.co.smsdatatech.questiongenerate.entity.CustomerEntity"</span><span style="color:#808080;">&gt;</span>
    <span style="color:#569cd6;">SELECT</span>
      <span style="color:#9cdcfe;">user_id</span>,
      <span style="color:#9cdcfe;">user_name</span>,
      <span style="color:#9cdcfe;">mail_address</span>,
      <span style="color:#9cdcfe;">address_prefecture</span>,
      <span style="color:#9cdcfe;">address_municipality</span>,
      <span style="color:#9cdcfe;">birthday</span>,
      <span style="color:#9cdcfe;">gender</span>,
      <span style="color:#9cdcfe;">create_date</span>,
      <span style="color:#9cdcfe;">update_date</span>
    <span style="color:#569cd6;">FROM</span>
      <span style="color:#4ec9b0;">customer</span>
    <span style="color:#569cd6;">WHERE</span>
      <span style="color:#9cdcfe;">mail_address</span> <span style="color:#d4d4d4;">=</span> <span style="color:#dcdcaa;">#{mailAddress}</span>
  <span style="color:#808080;">&lt;/</span><span style="color:#569cd6;">select</span><span style="color:#808080;">&gt;</span>

<span style="color:#808080;">&lt;/</span><span style="color:#569cd6;">mapper</span><span style="color:#808080;">&gt;</span></pre>
</div>



<p>#{mailAddress}： この部分が、実際に呼び出し元から渡された email パラメータの値に置き換えられます。</p>



<h3 class="wp-block-heading">サービスクラスの作成</h3>



<p>次に、サービスクラスを作成してユーザー情報の取得処理を実装します。このクラスでは、リポジトリやMapperを使ってデータベースから情報を取得し、必要に応じてレスポンスに変換します。</p>



<div style="background-color:#1e1e1e; border-radius:8px; padding:16px 20px; margin:10px 0; overflow-x:auto;">
<pre style="margin:0; color:#d4d4d4; font-family:'Consolas','Monaco','Courier New',monospace; font-size:14px; line-height:1.6;"><span style="color:#c586c0;">import</span> <span style="color:#4ec9b0;">lombok.extern.slf4j.Slf4j</span><span style="color:#d4d4d4;">;</span>
<span style="color:#c586c0;">import</span> <span style="color:#4ec9b0;">jp.co.smsdatatech.questiongenerate.util.DateUtils</span><span style="color:#d4d4d4;">;</span>

<span style="color:#6a9955;">/**
 * ログイン履歴テーブルサービス
 */</span>
<span style="color:#dcdcaa;">@Slf4j</span>
<span style="color:#dcdcaa;">@Service</span>
<span style="color:#569cd6;">public class</span> <span style="color:#4ec9b0;">LoginHistoryService</span> <span style="color:#d4d4d4;">{</span>

    <span style="color:#569cd6;">private final</span> <span style="color:#4ec9b0;">LoginHistoryMapper</span> <span style="color:#9cdcfe;">loginHistoryMapper</span><span style="color:#d4d4d4;">;</span>

    <span style="color:#6a9955;">// コンストラインジェクションを使用</span>
    <span style="color:#dcdcaa;">@Autowired</span>
    <span style="color:#569cd6;">public</span> <span style="color:#dcdcaa;">LoginHistoryService</span><span style="color:#d4d4d4;">(</span><span style="color:#4ec9b0;">LoginHistoryMapper</span> <span style="color:#9cdcfe;">loginHistoryMapper</span><span style="color:#d4d4d4;">)</span> <span style="color:#d4d4d4;">{</span>
        <span style="color:#569cd6;">this</span><span style="color:#d4d4d4;">.</span><span style="color:#9cdcfe;">loginHistoryMapper</span> <span style="color:#d4d4d4;">=</span> <span style="color:#9cdcfe;">loginHistoryMapper</span><span style="color:#d4d4d4;">;</span>
    <span style="color:#d4d4d4;">}</span>

    <span style="color:#6a9955;">/**
     * 指定されたメールアドレスに基づいてユーザー情報を取得する。
     *
     * @param email メールアドレス
     * @return ユーザーIDと法人IDを含むリスト。
     */</span>
    <span style="color:#dcdcaa;">@Transactional</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">readOnly</span> <span style="color:#d4d4d4;">=</span> <span style="color:#569cd6;">true</span><span style="color:#d4d4d4;">)</span>
    <span style="color:#569cd6;">public</span> <span style="color:#4ec9b0;">Map</span><span style="color:#d4d4d4;">&lt;</span><span style="color:#4ec9b0;">String</span><span style="color:#d4d4d4;">,</span> <span style="color:#4ec9b0;">Object</span><span style="color:#d4d4d4;">&gt;</span> <span style="color:#dcdcaa;">getUserDetailsByEmail</span><span style="color:#d4d4d4;">(</span><span style="color:#4ec9b0;">String</span> <span style="color:#9cdcfe;">email</span><span style="color:#d4d4d4;">)</span> <span style="color:#d4d4d4;">{</span>
        <span style="color:#9cdcfe;">log</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">debug</span><span style="color:#d4d4d4;">(</span><span style="color:#ce9178;">"format: メールアドレス {} に基づくユーザー情報を取得します。"</span><span style="color:#d4d4d4;">,</span> <span style="color:#9cdcfe;">email</span><span style="color:#d4d4d4;">);</span>
        <span style="color:#c586c0;">return</span> <span style="color:#9cdcfe;">loginHistoryMapper</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">getUserDetailsByEmail</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">email</span><span style="color:#d4d4d4;">);</span>
    <span style="color:#d4d4d4;">}</span></pre>
</div>



<p>getUserDetailsByEmail メソッドは、@Transactional アノテーションを使用してトランザクションを管理し、指定されたメールアドレスに基づいてユーザー情報を取得します。</p>



<h3 class="wp-block-heading">コントローラークラスの作成</h3>



<p>最後に、リクエストを処理するコントローラークラスを作成します。このクラスで、リクエストボディからメールアドレスを受け取り、サービスクラスを呼び出して情報を取得し、その情報をレスポンスとして返します。</p>



<p>例えば、TopRestクラスを以下のように作成します。</p>



<div style="background-color:#1e1e1e; border-radius:8px; padding:16px 20px; margin:10px 0; overflow-x:auto;">
<pre style="margin:0; color:#d4d4d4; font-family:'Consolas','Monaco','Courier New',monospace; font-size:14px; line-height:1.6;"><span style="color:#569cd6;">public class</span> <span style="color:#4ec9b0;">TopRest</span> <span style="color:#d4d4d4;">{</span>

    <span style="color:#6a9955;">/**
     * ログイン状況取得。
     *
     *&lt;p&gt;login_historyテーブルからユーザーIDに基づくログイン状況を取得し、
     * LoginHistoryResponseFormに詰めて返却する。
     *
     *&lt;h3&gt;処理フロー&lt;/h3&gt;
     * 1. ログイン履歴を取得
     * 2. 取得データを返却
     *
     *&lt;h3&gt;レスポンス構成&lt;/h3&gt;
     * "loginHistorysByDay" -&gt; 曜日ごとのログイン状況 (キー：曜日, 値：true/false)
     * "error" -&gt; エラー発生時のメッセージ
     *
     *@param form Top画面UserId用form
     *@param result バリデーション結果
     *@return ログイン履歴情報 LoginHistoryResponseform
     */</span>
    <span style="color:#dcdcaa;">@PostMapping</span><span style="color:#d4d4d4;">(</span><span style="color:#ce9178;">"/getLoginHistoryByUserId"</span><span style="color:#d4d4d4;">)</span>
    <span style="color:#569cd6;">public</span> <span style="color:#4ec9b0;">LoginHistoryResponseForm</span> <span style="color:#dcdcaa;">getLoginHistoryByUserId</span><span style="color:#d4d4d4;">(</span>
            <span style="color:#dcdcaa;">@RequestBody</span> <span style="color:#dcdcaa;">@Valid</span> <span style="color:#4ec9b0;">UserIdForm</span> <span style="color:#9cdcfe;">form</span><span style="color:#d4d4d4;">,</span>
            <span style="color:#4ec9b0;">BindingResult</span> <span style="color:#9cdcfe;">result</span><span style="color:#d4d4d4;">)</span> <span style="color:#d4d4d4;">{</span>

        <span style="color:#4ec9b0;">List</span><span style="color:#d4d4d4;">&lt;</span><span style="color:#4ec9b0;">String</span><span style="color:#d4d4d4;">&gt;</span> <span style="color:#9cdcfe;">errorMessageList</span> <span style="color:#d4d4d4;">=</span> <span style="color:#569cd6;">new</span> <span style="color:#4ec9b0;">ArrayList</span><span style="color:#d4d4d4;">&lt;&gt;();</span>
        <span style="color:#4ec9b0;">LoginHistoryResponseForm</span> <span style="color:#9cdcfe;">responseForm</span> <span style="color:#d4d4d4;">=</span> <span style="color:#569cd6;">new</span> <span style="color:#4ec9b0;">LoginHistoryResponseForm</span><span style="color:#d4d4d4;">();</span>
        <span style="color:#4ec9b0;">Set</span><span style="color:#d4d4d4;">&lt;</span><span style="color:#4ec9b0;">String</span><span style="color:#d4d4d4;">&gt;</span> <span style="color:#9cdcfe;">processedFields</span> <span style="color:#d4d4d4;">=</span> <span style="color:#569cd6;">new</span> <span style="color:#4ec9b0;">HashSet</span><span style="color:#d4d4d4;">&lt;&gt;();</span>

        <span style="color:#6a9955;">// バリデーションエラーがある場合、詳細なエラーメッセージを追加</span>
        <span style="color:#c586c0;">if</span> <span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">result</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">hasErrors</span><span style="color:#d4d4d4;">())</span> <span style="color:#d4d4d4;">{</span>
            <span style="color:#c586c0;">for</span> <span style="color:#d4d4d4;">(</span><span style="color:#4ec9b0;">FieldError</span> <span style="color:#9cdcfe;">fieldError</span> <span style="color:#d4d4d4;">:</span> <span style="color:#9cdcfe;">result</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">getFieldErrors</span><span style="color:#d4d4d4;">())</span> <span style="color:#d4d4d4;">{</span>
                <span style="color:#6a9955;">// フィールド名を基に重複チェック</span>
                <span style="color:#c586c0;">if</span> <span style="color:#d4d4d4;">(!</span><span style="color:#9cdcfe;">processedFields</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">contains</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">fieldError</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">getField</span><span style="color:#d4d4d4;">()))</span> <span style="color:#d4d4d4;">{</span>
                    <span style="color:#4ec9b0;">String</span> <span style="color:#9cdcfe;">errorMessage</span> <span style="color:#d4d4d4;">=</span> <span style="color:#9cdcfe;">messageSource</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">getMessage</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">fieldError</span><span style="color:#d4d4d4;">,</span> <span style="color:#4ec9b0;">Locale</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">getDefault</span><span style="color:#d4d4d4;">());</span>
                    <span style="color:#9cdcfe;">errorMessageList</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">add</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">errorMessage</span><span style="color:#d4d4d4;">);</span>
                    <span style="color:#9cdcfe;">processedFields</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">add</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">fieldError</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">getField</span><span style="color:#d4d4d4;">());</span>
                <span style="color:#d4d4d4;">}</span>
            <span style="color:#d4d4d4;">}</span>
            <span style="color:#9cdcfe;">responseForm</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">setErrorMessageList</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">errorMessageList</span><span style="color:#d4d4d4;">);</span>
            <span style="color:#c586c0;">return</span> <span style="color:#9cdcfe;">responseForm</span><span style="color:#d4d4d4;">;</span>
        <span style="color:#d4d4d4;">}</span>

        <span style="color:#6a9955;">// ユーザーIDを整数に変換</span>
        <span style="color:#4ec9b0;">Integer</span> <span style="color:#9cdcfe;">userId</span> <span style="color:#d4d4d4;">=</span> <span style="color:#4ec9b0;">Integer</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">parseInt</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">form</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">getUserId</span><span style="color:#d4d4d4;">());</span>

        <span style="color:#6a9955;">// サービス層で曜日ごとのログイン履歴を取得</span>
        <span style="color:#4ec9b0;">Map</span><span style="color:#d4d4d4;">&lt;</span><span style="color:#4ec9b0;">String</span><span style="color:#d4d4d4;">,</span> <span style="color:#4ec9b0;">Boolean</span><span style="color:#d4d4d4;">&gt;</span> <span style="color:#9cdcfe;">dailyLoginHistoryMap</span> <span style="color:#d4d4d4;">=</span>
            <span style="color:#9cdcfe;">loginHistoryService</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">getLoginHistoryByUserIdAndDateRange</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">userId</span><span style="color:#d4d4d4;">);</span>

        <span style="color:#6a9955;">// ログイン履歴が空かどうかをチェック</span>
        <span style="color:#c586c0;">if</span> <span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">dailyLoginHistoryMap</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">isEmpty</span><span style="color:#d4d4d4;">())</span> <span style="color:#d4d4d4;">{</span>
            <span style="color:#9cdcfe;">errorMessageList</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">add</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">messageSource</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">getMessage</span><span style="color:#d4d4d4;">(</span>
                <span style="color:#4ec9b0;">ErrorMessages</span><span style="color:#d4d4d4;">.</span><span style="color:#4fc1ff;">NO_LOGIN_HISTORY</span><span style="color:#d4d4d4;">,</span> <span style="color:#569cd6;">null</span><span style="color:#d4d4d4;">,</span> <span style="color:#4ec9b0;">Locale</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">getDefault</span><span style="color:#d4d4d4;">()));</span>
            <span style="color:#9cdcfe;">responseForm</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">setErrorMessageList</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">errorMessageList</span><span style="color:#d4d4d4;">);</span>
            <span style="color:#c586c0;">return</span> <span style="color:#9cdcfe;">responseForm</span><span style="color:#d4d4d4;">;</span>
        <span style="color:#d4d4d4;">}</span>

        <span style="color:#9cdcfe;">responseForm</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">setDailyLoginHistoryMap</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">dailyLoginHistoryMap</span><span style="color:#d4d4d4;">);</span>
        <span style="color:#c586c0;">return</span> <span style="color:#9cdcfe;">responseForm</span><span style="color:#d4d4d4;">;</span>
    <span style="color:#d4d4d4;">}</span></pre>
</div>



<p>このメソッドは、リクエストボディで受け取ったユーザーID（form）に対してバリデーションを実行します。<br>もしバリデーションエラーがあれば、そのエラーメッセージをリストに追加し、LoginHistoryResponseForm にセットしてエラーレスポンスとして返却します。</p>



<p>バリデーションエラーがなければ、ユーザーIDを整数に変換し、loginHistoryService.getLoginHistoryByUserIdAndDateRange を使用して、指定されたユーザーの曜日ごとのログイン履歴を取得します。</p>



<p>もしログイン履歴が存在しない場合は、エラーメッセージをリストに追加し、早期リターンします。<br>ログイン履歴が取得できた場合は、その情報をレスポンスフォームに設定し、正常なレスポンスとして返却します。</p>



<h2 class="wp-block-heading">実装内容の振り返り</h2>



<p><strong><mark style="background-color:#fdff84" class="has-inline-color">Mapの便利さゆえに使用しがちですが、型安全性の欠如やコードの可読性を考慮すると、DTOやEnumを利用した実装に統一していく方が望ましいと感じました。</mark></strong></p>



<p>また、作成中に感じた点として、サーバーサイドに情報を送信する際にリクエストが改ざんされる可能性があるというセキュリティ上の懸念が浮き彫りになりました。特に、クライアントサイドから送信されたデータがそのままサーバーで利用されるため、不正な操作を防ぐためにセキュリティ対策を強化する必要があると痛感しました。この点については、Javaのフィルターや認証・認可の仕組みを活用し、より安全なシステムを構築するという課題が残りました。次回制作時には、このセキュリティ部分を改良していきたいと思います。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p>まだ知識が浅く、試行錯誤しながら進めている部分も多いですが、実装を通じて多くのことを学びました。<strong><mark style="background-color:#fdff84" class="has-inline-color">今後は、より洗練された設計を目指し、コードの可読性や保守性を高めるための改善に取り組んでいきたいと思います。</mark></strong>また、セキュリティやパフォーマンスに関する課題も意識し、これらの分野についてさらに学び、システム全体をより堅牢で効率的なものにしていきたいと考えています。</p>



<div class="author__card">
  <div class="author-data">
    <img decoding="async" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/11/author-3.png" alt="筆者イメージ">
    <div>
      <p>筆者：K・T（20代）</p>
      <p>所属：ハイブリット・マルチクラウド部</p>
    </div>
  </div>
  <div class="author-intro">
    <p>マーケターとしてWEB広告運用やアパレルブランドの運営に携わってきたが、エンジニアとしての新たな挑戦を決意した転職組。<br>好奇心が旺盛で、新しいことに挑戦する姿勢が彼女の魅力。<br>マーケター×エンジニアの強みを生かし、UI/UXの提案から実装まで幅広く対応し、彼女自身がブランドを育てているのだろうと思わせてくれる、そんな20代の乙女。</p>
  </div>
</div>


<div class="block-block-22">
	<div class="Editor-wrap">
					<div class="Editor-wrap__titleMsg">まずはお気軽にご相談ください</div>
			<div class="Editor-wrap__title">お問い合わせフォーム</div>
			</div>
</div>


<script charset="utf-8" type="text/javascript" src="//js.hsforms.net/forms/embed/v2.js"></script>
<script>
  hbspt.forms.create({
    region: "na1",
    portalId: "23171742",
    formId: "b36c7c3b-83a0-43c4-8daa-8e055d6805e9"
  });
</script>



<p></p><p>The post <a href="https://www.sms-datatech.co.jp/column/try_java-1/">【はじめてのJava】ダッシュボードAPIを作成しよう！① ユーザー情報取得編</a> first appeared on <a href="https://www.sms-datatech.co.jp">SMS DataTech</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【学習アプリ開発記】Vue.jsとChart.jsを使ってグラフ描画してみた。</title>
		<link>https://www.sms-datatech.co.jp/column/try_chart-js/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=try_chart-js</link>
		
		<dc:creator><![CDATA[後藤]]></dc:creator>
		<pubDate>Fri, 20 Feb 2026 06:18:58 +0000</pubDate>
				<category><![CDATA[やってみた]]></category>
		<category><![CDATA[システム開発]]></category>
		<guid isPermaLink="false">https://www.sms-datatech.co.jp/?p=34947</guid>

					<description><![CDATA[<p>このブログ記事は、JavaScriptのフレームワークであるVue.jsを学びたい初学者や、実際にアプリケーションを開発したい方を対象にしています。<br />
また、グラフやチャートを使ってデータを視覚化したい方に向けて、Chart.jsの魅力や具体的な使い方をご紹介します。</p>
<p>The post <a href="https://www.sms-datatech.co.jp/column/try_chart-js/">【学習アプリ開発記】Vue.jsとChart.jsを使ってグラフ描画してみた。</a> first appeared on <a href="https://www.sms-datatech.co.jp">SMS DataTech</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">はじめに</h2>



<p>こんにちは！マーケターから未経験のエンジニアに転職した社員Tです。再びブログを執筆できる機会をいただき、とても嬉しく思います。<br><a href="https://www.sms-datatech.co.jp/column/try_vue-js/" title=""><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-blue-2-color"><span style="text-decoration: underline;">前回のブログ</span></mark></strong></a>から半年が経ちましたが、その間に学んだことや身につけた技術を引き続き皆さんと共有できたらと思っています。</p>



<p>今回は、Vue.jsと、Chart.jsを組み合わせて視覚的にデータを表現する方法にチャレンジしてみました！</p>



<h2 class="wp-block-heading">本記事の対象の方</h2>



<p>このブログ記事は、JavaScriptのフレームワークであるVue.jsを学びたい初学者や、実際にアプリケーションを開発したい方を対象にしています。<br>また、グラフやチャートを使ってデータを視覚化したい方に向けて、Chart.jsの魅力や具体的な使い方をご紹介します。</p>



<h2 class="wp-block-heading">vue.jsとは？</h2>



<p><strong><mark style="background-color:#fdff84" class="has-inline-color">Vue.jsは、JavaScriptのフレームワークのひとつで、HTMLとJavaScriptの間でデータの連携を行う役割を果たします。</mark></strong><br>詳しい説明については、<a href="https://www.sms-datatech.co.jp/column/try_vue-js/" title=""><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-blue-2-color"><span style="text-decoration: underline;">過去のブログ記事</span></mark></strong></a>をご参照ください。</p>



<h2 class="wp-block-heading">vue.js環境構築</h2>



<p>Vue.jsを使うための環境構築についても、<a href="https://www.sms-datatech.co.jp/column/try_vue-js/" title=""><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-blue-2-color"><span style="text-decoration: underline;">過去のブログ</span></mark></strong></a>を参考にしてください。<br>具体的な手順を詳しく解説していますので、導入方法や初期設定の詳細を確認できます。</p>



<h2 class="wp-block-heading">メリット</h2>



<p>Chart.jsを使用することで、データを視覚的に表現することが可能になります。<br>そのメリットをいくつかご紹介します。</p>



<h3 class="wp-block-heading">1. 簡単な導入と使いやすさ</h3>



<p>シンプルなAPIで、初心者でもすぐに利用できるのが魅力です。</p>



<h3 class="wp-block-heading">2. 豊富なチャートタイプ</h3>



<p>折れ線グラフや円グラフなど、多彩なグラフを簡単に作成できます。</p>



<h3 class="wp-block-heading">3. カスタマイズ性</h3>



<p>デザインを統一しやすく、自由にカスタマイズが可能です。<br>そして、Vue.jsと組み合わせることで、さらに次のような利点があります。</p>



<h3 class="wp-block-heading">4. リアクティブデータの自動反映</h3>



<p>Vue.jsのリアクティブシステムを活用することで、データが更新されるたびにグラフも自動で再描画されます。<br>これにより、動的なデータ表示が簡単に実現します。</p>



<h3 class="wp-block-heading">5. コンポーネントベースでの再利用性</h3>



<p>Vue.jsでは、グラフをコンポーネントとして再利用できるため、プロジェクト全体で効率的にグラフ描画が行えます。</p>



<p><strong><mark style="background-color:#fdff84" class="has-inline-color">これらの組み合わせによって、ユーザーにとっては視覚的にわかりやすいデータ表示が可能になり、開発者にとっては効率的な実装が実現します！</mark></strong>
</p>



<h2 class="wp-block-heading">Chart.js環境構築</h2>



<p>Chart.jsを使用するには、以下の方法があります。</p>



<ul class="wp-block-list">
<li>scriptタグを埋め込む</li>



<li>NPMを利用してインストール</li>



<li>CLIを利用してインストール(単一ファイルコンポーネントが利用可)</li>
</ul>



<p>今回は、&lt;body&gt;終了タグの直後にscriptタグを挿入しました！</p>



<div
    style="background-color: #1d2020; border-radius: 8px; padding: 16px 20px; margin: 16px 0; overflow-x: auto; font-family: 'Courier New', Consolas, monospace; font-size: 14px; line-height: 1.6;">
    <code><span style="color: #b7b7b7;">&lt;</span><span style="color: #ff6b6b;">script</span> <span style="color: #ebd247;">src</span><span style="color: #b7b7b7;">=</span><span style="color: #00ff00;">"https://cdn.jsdelivr.net/npm/chart.js@4.2.1"</span><span style="color: #b7b7b7;">&gt;&lt;/</span><span style="color: #ff6b6b;">script</span><span style="color: #b7b7b7;">&gt;</span></code>
</div>



<p>この方法なら、すぐに使い始められるので、手軽にグラフを表示したい場合に便利です。</p>



<h2 class="wp-block-heading">描画領域の準備</h2>



<p>Chart.jsは、HTMLの&lt;canvas&gt;要素にグラフを描画します。まずは&lt;canvas&gt;要素をHTMLに追加します。ここでは、idとして&#8221;learningTimeChart&#8221;を指定しています。</p>



<div
    style="background-color: #1d2020; border-radius: 8px; padding: 16px 20px; margin: 16px 0; overflow-x: auto; font-family: 'Courier New', Consolas, monospace; font-size: 14px; line-height: 1.6;">
    <code><span style="color: #b7b7b7;">&lt;</span><span style="color: #ff6b6b;">canvas</span> <span style="color: #ebd247;">id</span><span style="color: #b7b7b7;">=</span><span style="color: #00ff00;">"learningTimeChart"</span> <span style="color: #ebd247;">class</span><span style="color: #b7b7b7;">=</span><span style="color: #00ff00;">"chart"</span><span style="color: #b7b7b7;">&gt;&lt;/</span><span style="color: #ff6b6b;">canvas</span><span style="color: #b7b7b7;">&gt;</span></code>
</div>



<p>次に、canvas要素のコンテキストを取得して、描画のための準備をセットしていきます。</p>



<div
    style="background-color: #1d2020; border-radius: 8px; padding: 16px 20px; margin: 16px 0; overflow-x: auto; font-family: 'Courier New', Consolas, monospace; font-size: 14px; line-height: 1.6;">
    <code><span style="color: #4a86e8;">let</span> <span style="color: #ffffff;">canvas</span> <span style="color: #ebd247;">=</span> <span style="color: #ffffff;">document</span><span style="color: #b7b7b7;">.</span><span style="color: #ebd247;">getElementById</span><span style="color: #b7b7b7;">(</span><span style="color: #00ff00;">'learningTimeChart'</span><span style="color: #b7b7b7;">);</span></code>
</div>



<h2 class="wp-block-heading">グラフ描画エリア設定</h2>



<p>Vue.jsでChart.jsを使用して、チャートを作成します。サンプルコードは以下の通りです。</p>



<div
    style="background-color: #1d2020; border-radius: 8px; padding: 16px 20px; margin: 16px 0; overflow-x: auto; font-family: 'Courier New', Consolas, monospace; font-size: 14px; line-height: 1.6;">
    <pre style="margin: 0; color: #b7b7b7;"><code><span style="color: #4a86e8;">var</span> <span style="color: #ffffff;">myLineChart</span> <span style="color: #ebd247;">=</span> <span style="color: #4a86e8;">new</span> <span style="color: #ff6b6b;">Chart</span><span style="color: #ffffff;">(ctx, {</span>
  <span style="color: #ff6b6b;">type</span><span style="color: #ffffff;">:</span> <span style="color: #00ff00;">'doughnut'</span><span style="color: #ebd247;">,</span> <span style="color: #b7b7b7;">// グラフの種類</span>
  <span style="color: #ff6b6b;">data</span><span style="color: #ffffff;">: data</span><span style="color: #ebd247;">,</span>       <span style="color: #b7b7b7;">// データ</span>
  <span style="color: #ff6b6b;">options</span><span style="color: #ebd247;">:</span> <span style="color: #ffffff;">options</span> <span style="color: #b7b7b7;">// オプション設定</span>
<span style="color: #ffffff;">});</span></code></pre>
</div>



<p>それぞれの設定項目の詳細を表形式でまとめました。</p>



<table style="border-collapse: collapse; border: 1px solid #ccc;" width="1040">
    <thead>
        <tr>
            <th style="width: 33%;">設定項目</th>
            <th style="width: 67%;">設定内容</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>type</td>
            <td>描画するグラフの種類</td>
        </tr>
        <tr>
            <td>data</td>
            <td>ラベルとデータセット</td>
        </tr>
        <tr>
            <td>options</td>
            <td>オプション設定</td>
        </tr>
    </tbody>
</table>



<p>先ほど紹介したHTMLをもとに、scriptを記述してグラフを描いていきます。</p>



<h2 class="wp-block-heading">グラフ描画の実践</h2>



<p>円グラフを表示するサンプルを示します。</p>



<div
    style="background-color: #1d2020; border-radius: 8px; padding: 16px 20px; margin: 16px 0; overflow-x: auto; font-family: 'Courier New', Consolas, monospace; font-size: 14px; line-height: 1.6;">
    <pre style="margin: 0; color: #b7b7b7;"><code><span style="color: #ebd247;">createChart</span><span style="color: #ffffff;">(labels, data) {</span>
  <span style="color: #4a86e8;">let</span> <span style="color: #ffffff;">canvas</span> <span style="color: #ebd247;">=</span> <span style="color: #ffffff;">document</span><span style="color: #b7b7b7;">.</span><span style="color: #ebd247;">getElementById</span><span style="color: #b7b7b7;">(</span><span style="color: #00ff00;">'learningTimeChart'</span><span style="color: #b7b7b7;">);</span>
  <span style="color: #4a86e8;">if</span> <span style="color: #ffffff;">(canvas) {</span>
    <span style="color: #4a86e8;">let</span> <span style="color: #ffffff;">ctx2</span> <span style="color: #ebd247;">=</span> <span style="color: #ffffff;">canvas</span><span style="color: #b7b7b7;">.</span><span style="color: #ebd247;">getContext</span><span style="color: #b7b7b7;">(</span><span style="color: #00ff00;">'2d'</span><span style="color: #b7b7b7;">);</span>
    <span style="color: #4a86e8;">if</span> <span style="color: #ffffff;">(ctx2) {</span>
      <span style="color: #4a86e8;">if</span> <span style="color: #ffffff;">(</span><span style="color: #4a86e8;">this</span><span style="color: #b7b7b7;">.</span><span style="color: #ffffff;">learningTimeChart) {</span>
        <span style="color: #4a86e8;">this</span><span style="color: #b7b7b7;">.</span><span style="color: #ffffff;">learningTimeChart</span><span style="color: #b7b7b7;">.</span><span style="color: #ebd247;">destroy</span><span style="color: #b7b7b7;">();</span>
      <span style="color: #ffffff;">}</span>

      <span style="color: #4a86e8;">this</span><span style="color: #b7b7b7;">.</span><span style="color: #ffffff;">learningTimeChart</span> <span style="color: #ebd247;">=</span> <span style="color: #4a86e8;">new</span> <span style="color: #ff6b6b;">Chart</span><span style="color: #ffffff;">(ctx2, {</span>
        <span style="color: #ff6b6b;">type</span><span style="color: #ffffff;">:</span> <span style="color: #00ff00;">'doughnut'</span><span style="color: #ffffff;">,</span>
        <span style="color: #ff6b6b;">data</span><span style="color: #ffffff;">: {</span>
          <span style="color: #ff6b6b;">labels</span><span style="color: #ffffff;">: labels,</span>
          <span style="color: #ff6b6b;">datasets</span><span style="color: #ffffff;">: [{</span>
            <span style="color: #ff6b6b;">data</span><span style="color: #ffffff;">: data,</span>
            <span style="color: #ff6b6b;">backgroundColor</span><span style="color: #ffffff;">: [</span><span style="color: #00ff00;">'#36A2EB'</span><span style="color: #ffffff;">,</span> <span style="color: #00ff00;">'#FF6384'</span><span style="color: #ffffff;">],</span>
            <span style="color: #ff6b6b;">hoverBackgroundColor</span><span style="color: #ffffff;">: [</span><span style="color: #00ff00;">'#36A2EB'</span><span style="color: #ffffff;">,</span> <span style="color: #00ff00;">'#FF6384'</span><span style="color: #ffffff;">]</span>
          <span style="color: #ffffff;">}]</span>
        <span style="color: #ffffff;">},</span>
        <span style="color: #ff6b6b;">options</span><span style="color: #ffffff;">: {</span>
          <span style="color: #ff6b6b;">cutout</span><span style="color: #ffffff;">:</span> <span style="color: #00ff00;">'0%'</span><span style="color: #ffffff;">,</span>
          <span style="color: #ff6b6b;">plugins</span><span style="color: #ffffff;">: {</span>
            <span style="color: #ff6b6b;">legend</span><span style="color: #ffffff;">: {</span>
              <span style="color: #ff6b6b;">display</span><span style="color: #ffffff;">:</span> <span style="color: #4a86e8;">false</span>
            <span style="color: #ffffff;">},</span>
            <span style="color: #ff6b6b;">tooltip</span><span style="color: #ffffff;">: {</span>
              <span style="color: #ff6b6b;">enabled</span><span style="color: #ffffff;">:</span> <span style="color: #4a86e8;">false</span>
            <span style="color: #ffffff;">},</span>
            <span style="color: #ff6b6b;">datalabels</span><span style="color: #ffffff;">: {</span>
              <span style="color: #ff6b6b;">display</span><span style="color: #ffffff;">:</span> <span style="color: #4a86e8;">false</span>
            <span style="color: #ffffff;">}</span>
          <span style="color: #ffffff;">}</span>
        <span style="color: #ffffff;">}</span>
      <span style="color: #ffffff;">});</span>

      <span style="color: #4a86e8;">this</span><span style="color: #b7b7b7;">.</span><span style="color: #ffffff;">isLoading</span> <span style="color: #ebd247;">=</span> <span style="color: #4a86e8;">false</span><span style="color: #ffffff;">;</span>
    <span style="color: #ffffff;">}</span>
  <span style="color: #ffffff;">}</span>
<span style="color: #ffffff;">},</span></code></pre>
</div>



<p>以下のようなグラフが描画されます。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="505" height="378" src="https://www.sms-datatech.co.jp/wp-content/uploads/2026/02/image1-1.png" alt="" class="wp-image-34957" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2026/02/image1-1.png 505w, https://www.sms-datatech.co.jp/wp-content/uploads/2026/02/image1-1-300x225.png 300w" sizes="(max-width: 505px) 100vw, 505px" /></figure>
</div>


<p>今回は、円グラフを使って目標時間と総学習時間を表示しています。</p>



<h2 class="wp-block-heading">グラフのタイプとデータ設定</h2>



<p>上記の表でもご説明した通り、グラフのタイプは、typeプロパティで指定します。今回の円グラフを描く際は、&#8217;doughnut&#8217;を指定します。<br>データはdataプロパティで設定し、Vue.jsのコンポーネントとしてグラフを作成することで、データが変更されるたびに自動的にグラフも再描画されます。<br><br>既存のグラフがある場合は、destroyメソッドを呼び出して破棄し、Chartコンストラクタを使用して新しいグラフを生成します。<br><br>今回の実装では、Axiosを使用してJSONファイルからデータを取得し、モックデータとして活用しています。</p>



<div
    style="background-color: #1d2020; border-radius: 8px; padding: 16px 20px; margin: 16px 0; overflow-x: auto; font-family: 'Courier New', Consolas, monospace; font-size: 14px; line-height: 1.6;">
    <pre style="margin: 0; color: #b7b7b7;"><code><span style="color: #00ff00;">"learning_time_data"</span><span style="color: #ffffff;">: {</span>
  <span style="color: #00ff00;">"labels"</span><span style="color: #ffffff;">: [</span><span style="color: #00ff00;">"学習時間"</span><span style="color: #ffffff;">,</span> <span style="color: #00ff00;">"残りの時間"</span><span style="color: #ffffff;">],</span>
  <span style="color: #00ff00;">"data"</span><span style="color: #ffffff;">: [200, 120]</span>
<span style="color: #ffffff;">},</span></code></pre>
</div>



<p>この方法により、リアルなAPIレスポンスを模倣でき、データがない状態でもスムーズに開発やテストが可能です。</p>



<p>実際の開発時には、学習時間を表示するグラフをコンポーネント化することで、異なるページで再利用が容易になり、プロパティを通じて異なるデータを渡すことで開発効率が向上します！</p>



<h2 class="wp-block-heading">オプションの設定</h2>



<p><span style="background-color: #f3f3f3;">options</span> オブジェクトを使うことで、グラフの見た目や動作をカスタマイズできます。</p>



<ul class="wp-block-list">
<li>cutout: 円グラフの中心の空間のサイズを指定</li>



<li>legend: 凡例の表示</li>



<li>tooltip: ツールチップの表示</li>



<li>datalabels: データラベルの表示</li>
</ul>



<p>そのほかにも、スタイルの設定で背景色を変更したり、アニメーションを加えたりと、色々と楽しむことができます。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p>プロジェクトで使う機会があったので、Chart.jsの使い方をまとめてみました。<br><strong><mark style="background-color:#fdff84" class="has-inline-color">これ一つで色々なグラフが生成できるのは本当に便利ですね！</mark></strong></p>



<p>今後もさまざまなグラフを作成していきたいと思います。<br>最後までお読みいただき、ありがとうございました！</p>



<h2 class="wp-block-heading">参考サイト(公式)</h2>



<ul class="wp-block-list">
<li><a href="https://ja.vuejs.org/guide/quick-start.html"><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-blue-2-color"><span style="text-decoration: underline;">クイックスタート |
                        Vue.js</span></mark></strong></a></li>



<li><a href="https://www.chartjs.org/"><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-blue-2-color"><span style="text-decoration: underline;">Chart.js</span></mark></strong></a></li>
</ul>



<div class="author__card">
  <div class="author-data">
    <img decoding="async" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/11/author-3.png" alt="筆者イメージ">
    <div>
      <p>筆者：K・T（20代）</p>
      <p>所属：ハイブリット・マルチクラウド部</p>
    </div>
  </div>
  <div class="author-intro">
    <p>マーケターとしてWEB広告運用やアパレルブランドの運営に携わってきたが、エンジニアとしての新たな挑戦を決意した転職組。<br>好奇心が旺盛で、新しいことに挑戦する姿勢が彼女の魅力。<br>マーケター×エンジニアの強みを生かし、UI/UXの提案から実装まで幅広く対応し、彼女自身がブランドを育てているのだろうと思わせてくれる、そんな20代の乙女。</p>
  </div>
</div>


<div class="block-block-22">
	<div class="Editor-wrap">
					<div class="Editor-wrap__titleMsg">まずはお気軽にご相談ください</div>
			<div class="Editor-wrap__title">お問い合わせフォーム</div>
			</div>
</div>


<script charset="utf-8" type="text/javascript" src="//js.hsforms.net/forms/embed/v2.js"></script>
<script>
  hbspt.forms.create({
    region: "na1",
    portalId: "23171742",
    formId: "b36c7c3b-83a0-43c4-8daa-8e055d6805e9"
  });
</script>



<p></p><p>The post <a href="https://www.sms-datatech.co.jp/column/try_chart-js/">【学習アプリ開発記】Vue.jsとChart.jsを使ってグラフ描画してみた。</a> first appeared on <a href="https://www.sms-datatech.co.jp">SMS DataTech</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【学習アプリ開発記：はじめてのVue.js】問題解答画面を作成してみた！</title>
		<link>https://www.sms-datatech.co.jp/column/try_vue-js/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=try_vue-js</link>
					<comments>https://www.sms-datatech.co.jp/column/try_vue-js/#respond</comments>
		
		<dc:creator><![CDATA[後藤]]></dc:creator>
		<pubDate>Thu, 26 Sep 2024 04:12:42 +0000</pubDate>
				<category><![CDATA[やってみた]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[自動化]]></category>
		<guid isPermaLink="false">https://betaarena.local.sdt-autolabo.com/?p=22111</guid>

					<description><![CDATA[<p>Vue.jsとは、JavaScriptのフレームワークの1つであり、HTMLとJavaScriptの間でデータの連携を行う役割を果たします。このデータの連携には、Vue特有の機能であるディレクティブが使用されます。「ディレクティブ」とは、HTML内で特定の属性や要素に指示を記述することで、Vue.jsがその部分を監視し、データの変更に応じて動的にHTMLを更新します。<br />
本記事では、Vue.jsの基本的な機能やメリットから、環境構築方法や外部APIからのデータ取得、ディレクティブの活用方法などを解説しています。</p>
<p>The post <a href="https://www.sms-datatech.co.jp/column/try_vue-js/">【学習アプリ開発記：はじめてのVue.js】問題解答画面を作成してみた！</a> first appeared on <a href="https://www.sms-datatech.co.jp">SMS DataTech</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">はじめに</h2>



<p>こんにちは！マーケターから未経験のエンジニア職に転身した社員Tです。<br>この度は、初めてのブログ記事を執筆する機会を得て、とても嬉しく思います。<br>この記事では、自身の学びと成長を振り返りながら、過去に実施した vue.js について書いていきたいと思います。</p>



<h2 class="wp-block-heading">本記事の対象の方</h2>



<p><strong><mark style="background-color:#fdff84" class="has-inline-color">本記事は、JavaScriptのフレームワークであるVue.jsを学びたい初学者や、Vue.jsを実際に使用してアプリケーションを開発したい方が対象です。</mark></strong>記事では、Vue.jsの基本的な機能やメリットから始めて、環境構築方法や外部APIからのデータ取得、ディレクティブの活用方法などを解説しています。</p>



<h2 class="wp-block-heading">vue.jsとは？</h2>



<p><strong><mark style="background-color:#fdff84" class="has-inline-color">まずVue.jsとは、JavaScriptのフレームワークの1つであり、HTMLとJavaScriptの間でデータの連携を行う役割を果たします。</mark></strong>このデータの連携には、Vue特有の機能であるディレクティブが使用されます。「ディレクティブ」とは、HTML内で特定の属性や要素に指示を記述することで、Vue.jsがその部分を監視し、データの変更に応じて動的にHTMLを更新します。</p>



<h2 class="wp-block-heading">メリット</h2>



<p>Vue.jsを扱うメリットは、<strong><mark style="background-color:#fdff84" class="has-inline-color">JQueryよりも記述が簡単であり、初心者でも扱いやすいことです。</mark></strong><br>さらに、Vue.jsは※双方向のデータバインディングが可能です。<br>つまり、<strong><mark style="background-color:#fdff84" class="has-inline-color">UIとデータのいずれか一方が更新されれば、もう一方も自動的に更新される仕組みになっています。</mark></strong>これにより、データとUIが常に同期されるため、開発効率が向上します。<br>初学者の私には、理想的な学習機会となりました。<br>※データモデルとUI（ユーザーインターフェース）の間でデータが自動的に同期される仕組み</p>



<h2 class="wp-block-heading">環境構築の手順</h2>



<h3 class="wp-block-heading">Vue.jsを導入する方法</h3>



<p>Vue.jsは、いくつかの方法で使用することができます！</p>



<ul class="wp-block-list">
<li>scriptタグを埋め込む</li>



<li>NPMを利用してインストール</li>



<li>CLIを利用してインストール(単一ファイルコンポーネントが利用可)</li>
</ul>



<p>今回はbody終了タグの直後にscriptタグを挿入しました！</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXed-70DqeIZZbUA9f9Ic818qECoD4zxTOPLMCMIwbOD6F1e_B6v9-nLKyWDxza9BSVUiwshl92ZCKFitrHbE_3wSsLkAn_fyIDDJJKbkiflpS8o0Tar0SQuLxFdmx-0omOjcgkwwptuM1wJa3pjpyOogru6?key=ATiY26x7e9T2g768UR-ZKg" alt=""/></figure>



<h3 class="wp-block-heading">Vue.jsの拡張機能をインストール</h3>



<p>事前にお使いのブラウザにVue Devtoolsをインストールしておくことをおすすめします。<br><strong><mark style="background-color:#fdff84" class="has-inline-color">Vueコンポーネントの階層構造や状態を視覚化できます。</mark></strong><br>私はchromeを使うため、拡張機能<strong><a href="https://chromewebstore.google.com/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd?hl=ja&amp;pli=1" target="_blank" rel="noopener" title=""><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-blue-2-color"><span style="text-decoration: underline;">vuejs-devtools</span></mark></a></strong>を入れました。</p>



<h2 class="wp-block-heading"><br>問題取得とディレクティブの活用</h2>



<p>タイトルに記載のとおり、学習アプリの制作に挑戦しました。<br>このアプリは、ユーザーに問題を提供し、解答を受け付け、解説を表示する、一問一答のサービスです。<br><strong><mark style="background-color:#fdff84" class="has-inline-color">ここからは、特に問題の取得とVue.jsのディレクティブの活用にフォーカスしてみたいと思います。</mark></strong></p>



<h3 class="wp-block-heading">問題の取得と表示</h3>



<p>問題の取得や回答の解説表示にはChatGPTのAPIを利用しています。<br>具体的には、JAVA側でAPIエンドポイントを指定し、axiosを使用してHTTPリクエストを送信しています。<br>これにより、アプリが動的に問題を取得し、表示することが可能になります。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcZk5C4i4ubIiCky6wAGER6XkdmlJL4q1RI_wEqMTcN39MkYbDgMTzcanvUKh8xVsjC0EJLJxueEg3O5j1TsDKnRnjzAqnSR0_of0OVoeZMShx5aDkBIs4tBB1c4x0FWzWpRnyDm8PDpjD1-MkzFXsGr-HH?key=ATiY26x7e9T2g768UR-ZKg" alt=""/></figure>



<h3 class="wp-block-heading">デザイン（ディレクティブの活用）</h3>



<p>Vue.jsのディレクティブを活用して、動的な表示を実現します。<br>具体的には、v-ifやv-cloakなどのディレクティブを利用しました。</p>



<h4 class="wp-block-heading">エラーテキストの表示</h4>



<p><strong><mark style="background-color:#fdff84" class="has-inline-color">条件に応じて要素を表示または非表示にしたい場合には、「v-if 」ディレクティブを利用しています。</mark></strong><br>今回はシステム上、なにかしらの問題が発生した際にはエラーを表示させたいが、通常時は表示したくない場合に「v-if 」ディレクティブを活用しました。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXecq4vSZ_b_aCdcajSzD_BiPOj_hruCkVQFQUImySeTSvmW3OlJ25JPnAgFOUSs4mFNmHE8BO6DBmRvZZ7Oz5bAeaVbz1MrZaDjIp5IGKTFCn4qNhP19SL6yQRfoHsz1luCEomMFVkpnBORh-jGCgrlVsmi?key=ATiY26x7e9T2g768UR-ZKg" alt=""/></figure>



<h4 class="wp-block-heading">解説の非表示</h4>



<p>演習を行うアプリでは、問題を解いている際に回答が見えてしまったら使いものになりません。<br>そのため、ユーザーが回答の閲覧を希望するまでは解説を非表示にする必要があります。<br>さらに、次の問題に進む際には、新しい問題と回答が再取得されるため、<strong><mark style="background-color:#fdff84" class="has-inline-color">一時的にデータが表示されることを防ぐために今回は、v-cloak ディレクティブを使用しました。</mark></strong></p>



<p>v-cloak ディレクティブは、Vue.jsの初期化が完了するまで要素を隠すためのディレクティブです。初期化が完了する前にデータが表示されてしまうことを防ぎ、見栄えを向上させます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdpriB_yQqS2i51OIoLEVNteLhNfBS2uLpBnT5NZmKQ38wVajP_3sZYm2zO4EePjyy22vChaEYs7xx3xF1B_Oe2f8hzrghBwJwnaqVjB8kAISzssxfb63Q0OXZVoiJiEGfnTciOJoEQjmAuKRw1BvrOTQM?key=ATiY26x7e9T2g768UR-ZKg" alt=""/></figure>



<p>これらのディレクティブを活用することで、アプリの見た目や動作をスムーズに調整することができます。</p>



<h2 class="wp-block-heading">おわりに</h2>



<p>以上、Vue.jsを使用して問題の取得からディレクティブの活用までをご紹介させていただきました！<br>次回も、Vue.jsについてさらに深く掘り下げていきたいと思います。<br>皆さんもぜひ、Vue.jsを使った開発に挑戦してみてください！</p>



<div class="author__card">
  <div class="author-data">
    <img decoding="async" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/11/author-3.png" alt="筆者イメージ">
    <div>
      <p>筆者：K・T（20代）</p>
      <p>所属：ハイブリット・マルチクラウド部</p>
    </div>
  </div>
  <div class="author-intro">
    <p>マーケターとしてWEB広告運用やアパレルブランドの運営に携わってきたが、エンジニアとしての新たな挑戦を決意した転職組。<br>好奇心が旺盛で、新しいことに挑戦する姿勢が彼女の魅力。<br>マーケター×エンジニアの強みを生かし、UI/UXの提案から実装まで幅広く対応し、彼女自身がブランドを育てているのだろうと思わせてくれる、そんな20代の乙女。</p>
  </div>
</div>


<div class="block-block-22">
	<div class="Editor-wrap">
					<div class="Editor-wrap__titleMsg">まずはお気軽にご相談ください</div>
			<div class="Editor-wrap__title">お問い合わせフォーム</div>
			</div>
</div>


<script charset="utf-8" type="text/javascript" src="//js.hsforms.net/forms/embed/v2.js"></script>
<script>
  hbspt.forms.create({
    region: "na1",
    portalId: "23171742",
    formId: "b36c7c3b-83a0-43c4-8daa-8e055d6805e9"
  });
</script>



<p></p><p>The post <a href="https://www.sms-datatech.co.jp/column/try_vue-js/">【学習アプリ開発記：はじめてのVue.js】問題解答画面を作成してみた！</a> first appeared on <a href="https://www.sms-datatech.co.jp">SMS DataTech</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.sms-datatech.co.jp/column/try_vue-js/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>RedmineのSSO設定をAWSで行う</title>
		<link>https://www.sms-datatech.co.jp/column/try_redmine/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=try_redmine</link>
					<comments>https://www.sms-datatech.co.jp/column/try_redmine/#respond</comments>
		
		<dc:creator><![CDATA[後藤]]></dc:creator>
		<pubDate>Thu, 15 Aug 2024 02:05:00 +0000</pubDate>
				<category><![CDATA[やってみた]]></category>
		<category><![CDATA[業務効率化]]></category>
		<category><![CDATA[ITコンサルティング]]></category>
		<category><![CDATA[DX]]></category>
		<guid isPermaLink="false">http://192.168.10.58/?p=19671</guid>

					<description><![CDATA[<p>こんにちは。社員Mです。<br />
前回の記事ではECSでRedmineを構築する方法について解説しました。<br />
ECSでRedmineを構築することで、サーバーの管理・運用業務を効率化することができました。<br />
本記事では、次のステップとして、AWS SSOの設定をやってみたいと思います。AWSでRedmineを構築しており、シングルサインオン(SSO)設定をしたいという方を対象としております。<br />
※現在、omniauth samlのpluginsに脆弱性が発見されております。<br />
導入する際は気を付けて下さい。</p>
<p>The post <a href="https://www.sms-datatech.co.jp/column/try_redmine/">RedmineのSSO設定をAWSで行う</a> first appeared on <a href="https://www.sms-datatech.co.jp">SMS DataTech</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">はじめに</h2>



<p>こんにちは、株式会社SMSデータテックの社員Mです。<br>前回の記事ではECSで<strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-blue-2-color"><span style="text-decoration: underline;"><a href="https://www.sms-datatech.co.jp/column/try_ecs-redmine/" title="">Redmineを構築する方法</a></span></mark></strong>について解説しました。<br>ECSでRedmineを構築することで、サーバーの管理・運用業務を効率化することができました。<br><strong><mark style="background-color:#fdff84" class="has-inline-color">本記事では、次のステップとして、AWS SSOの設定をやってみたいと思います。</mark></strong></p>



<h2 class="wp-block-heading">本記事対象の方</h2>



<p>AWSでRedmineを構築しており、シングルサインオン(SSO)設定をしたいという方を対象としております。<br>※現在、omniauth samlのpluginsに脆弱性が発見されております。<br>導入する際は気を付けて下さい。</p>



<h2 class="wp-block-heading">SSO設定をするメリット</h2>



<p><strong><mark style="background-color:#fdff84" class="has-inline-color">AWSコンソールにログインすることができれば、ワンクリックでRedmineにアクセスすることができます。</mark></strong><br>また、初アクセスの際にアカウントが作成されるため、アカウント作成も必要ありません。</p>



<h2 class="wp-block-heading">使用技術について</h2>



<h3 class="wp-block-heading">SSOとは</h3>



<p>SSOとは、Single Sign-Onとして知られる認証の仕組みのことです。SSOを使用すると、ユーザーは1度の認証で複数の関連システムやアプリケーションにアクセスできます。これは、ユーザーが複数のアカウントやアプリケーションに対して別々にログインする必要がなくなるため、利便性が向上し、セキュリティが向上します。</p>



<h3 class="wp-block-heading">IAM Identity Centerとは</h3>



<p>AWS IAM アイデンティティセンターは、AWS アプリケーションもしくは複数の AWS アカウントに対するワークフォースのアクセスを管理するために推奨されるサービスです。</p>



<h2 class="wp-block-heading">RedmineにSSO設定を導入する方法</h2>



<p>手順は以下の通りになります。</p>



<ol class="wp-block-list">
<li>IAM Identity Centerでアプリケーションの設定</li>



<li>omniauth samlファイルインストール</li>



<li>samlファイルを編集</li>
</ol>



<p>それぞれ説明していきます。</p>



<!--HubSpot Call-to-Action Code --><span class="hs-cta-wrapper" id="hs-cta-wrapper-bab8f25f-71bf-498b-b9bf-dbc6f6233b49"><span class="hs-cta-node hs-cta-bab8f25f-71bf-498b-b9bf-dbc6f6233b49" id="hs-cta-bab8f25f-71bf-498b-b9bf-dbc6f6233b49"><!--[if lte IE 8]><div id="hs-cta-ie-element"></div><![endif]--><a href="https://cta-redirect.hubspot.com/cta/redirect/23171742/bab8f25f-71bf-498b-b9bf-dbc6f6233b49" target="_blank" rel="noopener"><img decoding="async" class="hs-cta-img" id="hs-cta-img-bab8f25f-71bf-498b-b9bf-dbc6f6233b49" style="border-width:0px;" src="https://no-cache.hubspot.com/cta/default/23171742/bab8f25f-71bf-498b-b9bf-dbc6f6233b49.png" alt="新規CTA"></a></span><script charset="utf-8" src="https://js.hscta.net/cta/current.js"></script><script type="text/javascript"> hbspt.cta.load(23171742, 'bab8f25f-71bf-498b-b9bf-dbc6f6233b49', {"useNewLoader":"true","region":"na1"}); </script></span><!-- end HubSpot Call-to-Action Code -->



<h2 class="wp-block-heading">IAM Identity Center</h2>



<p>IAM Identity Centerのアプリケーションから、アプリケーションの追加を行います。</p>



<h3 class="wp-block-heading">アプリケーションの追加</h3>



<p>写真</p>



<p>こちらの情報は、後述するsamlファイルに記述するので、メモしておいてください。</p>



<p>アプリケーションメタデータ</p>



<p><img decoding="async" width="637" height="271" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXcg3cYSMOq84te2A2Wsj-nxcrSYUMs03Q7eKULMdN7tuVt4OUsBbDukjQAtFdwxCTEi5IAWYHNnf45FXWuiC9Ce5TFN-pwDnDFg8JX4hXn28n9-Ehdr0O-qKlfnwWI3YhYnxZwH9FyJh94FjWk8A2B3Mfgy?key=Jwhf6CorFZ4aqYz3VopuJg"></p>



<p>「メタデータ値をマニュアルで入力する」を選択</p>



<p>入力項目は下記内容を記述<br>アプリケーションACS URL：URL/auth/saml/callback<br>アプリケーションSAML対象者：IAM Identity Center SAML 発行者 URL</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="245" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-1024x245.png" alt="" class="wp-image-19674" style="width:682px;height:163px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-1024x245.png 1024w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-300x72.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-768x184.png 768w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image.png 1036w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">属性マッピングの編集</h3>



<p>属性マッピングについては、AWS公式ドキュメントを参照しています。</p>



<p>下記表の通り記述</p>



<figure class="wp-block-table"><table><tbody><tr><td>アプリケーションのユーザー属性</td><td>ユーザー属性マッピング</td><td>形式</td></tr><tr><td>Subject</td><td>${user:AD_GUID}</td><td>Persistent</td></tr><tr><td>name</td><td>${user:subject}</td><td>basic</td></tr><tr><td>firstname</td><td>${user:givenName}</td><td>basic</td></tr><tr><td>email</td><td>${user:email}</td><td>basic</td></tr><tr><td>lastname</td><td>${user:familyName}</td><td>basic</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">omniauth samlファイル編集</h2>



<p>→<a href="https://github.com/chrodriguez/redmine_omniauth_saml" target="_blank" rel="noopener" title=""><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-blue-2-color"><span style="text-decoration: underline;">omniauth saml</span></mark></strong></a></p>



<p>AWSからSSOログインが可能になるpluginです。</p>



<p>Start画面からワンクリックでredmineにアクセスできるようになります。</p>



<p>※version5.1.1でも導入できますが、脆弱性が検知されているため、注意が必要です。</p>



<h3 class="wp-block-heading">インストール方法</h3>



<p>dockerfileが存在するディレクトリにpluginsというディレクトリを作成します。<br>そのディレクトリに移動し、下記コマンドを実行します。</p>



<figure class="wp-block-table"><table><tbody><tr><td>git clone https://github.com/chrodriguez/redmine_omniauth_saml.git</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">2saml.rbの編集</h3>



<p>samlファイルを編集します。<br>sample-saml-initializers.rbをコピーし、編集していきます。</p>



<p><img decoding="async" width="632" height="399" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXe26vJ8p3bwskGLqlBL3GoUeSyjri4JKmoyyPDd_Ma4Ux6w0t96PJGB5lvw35crju-6uCzm9iXIhGHhjdx1__oZZL8VgNiHoAj2RoVe0n7UdgffMZFQmkd_y2bL9MY8MMh_WJufd_lkVOhDuKcyjX2T_WX9?key=Jwhf6CorFZ4aqYz3VopuJg"></p>



<p>assertion_consumer_service_url =&gt; ”URL/auth/saml/callback”<br>issue &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =&gt; ”URL/”<br>idp_sso_target_url&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =&gt; “IAM Identity Center SAML 発行者 URL”<br>idp_cert &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =&gt; “IAM Identity Center証明書”<br>name_identifier_format &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =&gt; &#8220;urn:oasis:names:tc:SAML:2.0:nameid-format:persistent&#8221;<br>idp_slo_target_url &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =&gt; &#8220;URL&#8221;<br>login&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =&gt; &#8216;extra.raw_info.name&#8217;,<br>mail &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =&gt; &#8216;extra.raw_info.email&#8217;,<br>firstname &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =&gt; &#8216;extra.raw_info.firstname&#8217;,<br>lastname &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =&gt; &#8216;extra.raw_info.lastname&#8217;</p>



<p>※Redmineのversion4以下だとこのままで良いのですが、version5以上になるとエラーが発生してしまいます。<br>そのため、version5以降は下記設定が必須となります。</p>



<h3 class="wp-block-heading">Redmine version5以降の追加設定</h3>



<p>このsamlファイルの一行目に</p>



<figure class="wp-block-table"><table><tbody><tr><td>require File.expand_path(&#8216;../../../plugins/redmine_omniauth_saml/lib/redmine_omniauth_saml&#8217;, __FILE__)</td></tr></tbody></table></figure>



<p>と入力します。(自身が設定しているディレクトリから/redmine_omniauth_saml/lib/redmine_omniauth_samlを見に行ってください。デフォルトのディレクトリはusr/src/redmineです。)<br>このディレクトリにはSSOログインに関係するファイルがあります。</p>



<p>以上で設定完了です。</p>



<p>AWSコンソール画面のアプリケーションから、直接Redmineにアクセスできるようになります。</p>



<p>写真追加</p>



<h2 class="wp-block-heading">おわり</h2>



<p>今回は、ECSで構築したRedmineにシングルサインオン(SSO)設定を導入してみました。AWS SSOを活用してRedmineに接続する方法についての情報が少なく、設定にはかなり苦労しました。特に、SAMLファイルの編集やIAM Identity Centerの登録に関する部分が難しかったです。<br>しかし、設定後は面倒なアカウント作成が不要になり、ワンクリックで接続できるようになったため、非常に便利になりました。ただ、一部の脆弱性がまだ解消されておらず、その点が気がかりです。<br>試行錯誤の末に作り上げたAWS SSO認証が、他の方々のお役に立てることを願っています。</p>



<div class="author__card">
  <div class="author-data">
    <img decoding="async" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/11/author-2.png" alt="筆者イメージ">
    <div>
      <p>筆者：R・M（20代）</p>
      <p>所属：ハイブリット・マルチクラウド部</p>
    </div>
  </div>
  <div class="author-intro">
    <p>まったくの未経験でこの業界に飛び込んできた若手。<br>パッと見はビジュアル系？<br>でもプレゼンしだすと、少し胡散臭さもあわせもったセールスように華麗なプレゼンを見せる。<br>読者と一緒にAWSのプロになりたい、そんな20代。</p>
  </div>
</div>



<!--HubSpot Call-to-Action Code --><span class="hs-cta-wrapper" id="hs-cta-wrapper-0a5030d3-78e1-46b3-94b3-b77077a201ba"><span class="hs-cta-node hs-cta-0a5030d3-78e1-46b3-94b3-b77077a201ba" id="hs-cta-0a5030d3-78e1-46b3-94b3-b77077a201ba"><!--[if lte IE 8]><div id="hs-cta-ie-element"></div><![endif]--><a href="https://cta-redirect.hubspot.com/cta/redirect/23171742/0a5030d3-78e1-46b3-94b3-b77077a201ba" target="_blank" rel="noopener"><img decoding="async" class="hs-cta-img" id="hs-cta-img-0a5030d3-78e1-46b3-94b3-b77077a201ba" style="border-width:0px;" src="https://no-cache.hubspot.com/cta/default/23171742/0a5030d3-78e1-46b3-94b3-b77077a201ba.png" alt="新規CTA"></a></span><script charset="utf-8" src="https://js.hscta.net/cta/current.js"></script><script type="text/javascript"> hbspt.cta.load(23171742, '0a5030d3-78e1-46b3-94b3-b77077a201ba', {"useNewLoader":"true","region":"na1"}); </script></span><!-- end HubSpot Call-to-Action Code -->


<div class="block-block-22">
	<div class="Editor-wrap">
					<div class="Editor-wrap__titleMsg">まずはお気軽にご相談ください</div>
			<div class="Editor-wrap__title">お問い合わせフォーム</div>
			</div>
</div>


<script charset="utf-8" type="text/javascript" src="//js.hsforms.net/forms/embed/v2.js"></script> <script> hbspt.forms.create({ region: "na1", portalId: "23171742", formId: "b36c7c3b-83a0-43c4-8daa-8e055d6805e9" }); </script><p>The post <a href="https://www.sms-datatech.co.jp/column/try_redmine/">RedmineのSSO設定をAWSで行う</a> first appeared on <a href="https://www.sms-datatech.co.jp">SMS DataTech</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.sms-datatech.co.jp/column/try_redmine/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ECSでRedmineを構築する</title>
		<link>https://www.sms-datatech.co.jp/column/try_ecs-redmine/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=try_ecs-redmine</link>
					<comments>https://www.sms-datatech.co.jp/column/try_ecs-redmine/#comments</comments>
		
		<dc:creator><![CDATA[後藤]]></dc:creator>
		<pubDate>Wed, 14 Aug 2024 09:04:23 +0000</pubDate>
				<category><![CDATA[やってみた]]></category>
		<category><![CDATA[業務効率化]]></category>
		<guid isPermaLink="false">http://192.168.10.58/?p=19696</guid>

					<description><![CDATA[<p>こんにちは、社員Mです。<br />
今回はdockerfile編集とECSの設定を解説します。ECS環境で立ち上げる理由としては、サーバーなどの管理運用が不要なためという点です。<br />
また、最初の環境構築が終われば、イメージのタグを編集するだけでアップデート可能です。</p>
<p>The post <a href="https://www.sms-datatech.co.jp/column/try_ecs-redmine/">ECSでRedmineを構築する</a> first appeared on <a href="https://www.sms-datatech.co.jp">SMS DataTech</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">はじめに</h2>



<p>こんにちは、株式会社SMSデータテックの社員Mです。<br>今回はdockerfile編集とECSの設定を解説します。</p>



<h2 class="wp-block-heading">本記事対象の方</h2>



<p>ドメインの設定や環境の構築を、ご自身で設定できる方</p>



<h2 class="wp-block-heading">ECSで構築するメリット</h2>



<p>ECS環境で立ち上げる理由としては、サーバーなどの管理運用が不要なためという点です。<br>また、最初の環境構築が終われば、イメージのタグを編集するだけでアップデート可能です。</p>



<!--HubSpot Call-to-Action Code --><span class="hs-cta-wrapper" id="hs-cta-wrapper-0a5030d3-78e1-46b3-94b3-b77077a201ba"><span class="hs-cta-node hs-cta-0a5030d3-78e1-46b3-94b3-b77077a201ba" id="hs-cta-0a5030d3-78e1-46b3-94b3-b77077a201ba"><!--[if lte IE 8]><div id="hs-cta-ie-element"></div><![endif]--><a href="https://cta-redirect.hubspot.com/cta/redirect/23171742/0a5030d3-78e1-46b3-94b3-b77077a201ba" target="_blank" rel="noopener"><img decoding="async" class="hs-cta-img" id="hs-cta-img-0a5030d3-78e1-46b3-94b3-b77077a201ba" style="border-width:0px;" src="https://no-cache.hubspot.com/cta/default/23171742/0a5030d3-78e1-46b3-94b3-b77077a201ba.png" alt="新規CTA"></a></span><script charset="utf-8" src="https://js.hscta.net/cta/current.js"></script><script type="text/javascript"> hbspt.cta.load(23171742, '0a5030d3-78e1-46b3-94b3-b77077a201ba', {"useNewLoader":"true","region":"na1"}); </script></span><!-- end HubSpot Call-to-Action Code -->



<h2 class="wp-block-heading">構成図</h2>



<p><img decoding="async" width="633" height="493" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXfU_-zJ84WvJnpWlwkSgxoKMZjynPNQsPq4w-UUaXT6ltKmnAW3Ts8GDW5TRf5KPrX_l-KwJeVA74qxoJBzC3gYvADwnZIVDVaGYmEJHYlfuTTG6bCtiNs_zLxsoHuopFzQz3AQBld15AbWWMoKEuCnkV8?key=xIqU2rDk1ojTPSjIp60C5g"></p>



<p>全体の構成図となります。<br>本記事で紹介する内容はECSとdockerfileです。<br>ELBについても紹介していますが、設定に必要な部分のみ記載しています。<br>今回は、上記構成図の赤線で囲った箇所以外のAWS環境が作成できている前提で進めていきます。</p>



<h2 class="wp-block-heading">使用技術について</h2>



<p>今回使用するサービス、技術について簡単に説明します。</p>



<h3 class="wp-block-heading">ECSとは</h3>



<p>ECSとは、Amazon Elastic Container Service（Amazon ECS）の略です。AWS上で、Dockerコンテナを簡単に管理、配置、スケーリングをすることができます。</p>



<h3 class="wp-block-heading">ECRとは</h3>



<p>ECRとは、Amazon Elastic Container Registry（Amazon ECR）の略です。AWSが提供する、Dockerコンテナイメージのプライベートレジストリサービスのことです。ECRを使用することで、Dockerイメージを安全に保存、管理、デプロイできます。</p>



<h3 class="wp-block-heading">ELBとは</h3>



<p>ELBとはElastic Load Balancing（Amazon ELB）の略です。AWSが提供する負荷分散サービスです。ELBは、複数のEC2インスタンスや他のサービス間でネットワークトラフィックを自動的に分散させることで、高可用性とスケーラビリティを提供します。これにより、アプリケーションのパフォーマンスが向上し、障害が発生した際の影響を最小限に抑えることができます。</p>



<h3 class="wp-block-heading">Dockerとは</h3>



<p>Dockerとは、ソフトウェアのコンテナ化を実現するためのオープンソースのプラットフォームのことです。コンテナは、アプリケーションと定ファイルなどをまとめてパッケージ化し、どの環境でも一貫して動作させることができる技術です。</p>



<h3 class="wp-block-heading">Dockerfileとは</h3>



<p>Dockerfileとは、Dockerのイメージを作成するための手順を記載したテキストファイルのことです。テキストファイルで操作するため、編集管理が非常に簡単です。</p>



<h2 class="wp-block-heading">DockerfileからRedmineを構築する方法</h2>



<p>手順は下記の通りに進めていきます。</p>



<ol class="wp-block-list">
<li>Pluginsをインストール</li>



<li>Dockerfileの編集</li>



<li>ECRにpush</li>



<li>ELB作成</li>



<li>ECS設定</li>



<li>ELB編集</li>
</ol>



<h2 class="wp-block-heading">Pluginsインストール</h2>



<p>dockerfileが存在するディレクトリにpluginsというディレクトリを作成します。</p>



<p>そのディレクトリに移動し、下記コマンドを実行します。</p>



<pre class="wp-block-code has-black-background-color has-background"><code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-white-color">git clone https://github.com/redmica/redmine_issues_panel 
git clone https://github.com/redmica/redmica_ui_extension 
git clone https://github.com/suer/redmine_absolute_dates 
git clone https://github.com/tkusukawa/redmine_work_time</mark></code></pre>



<h3 class="wp-block-heading">各種Pluginsについての説明</h3>



<p>Redmineの使用を改善していくためにDockerfileに幾つかのpluginsをinstallしています。<br>どんなpluginsなのか簡単に説明していきます。</p>



<h4 class="wp-block-heading">issues panel</h4>



<p>→<a href="https://github.com/redmica/redmine_issues_panel.git" target="_blank" rel="noopener" title=""><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-blue-2-color"><span style="text-decoration: underline;">issure panel</span></mark></strong></a></p>



<p>チケットをパネル形式で表示してくれるものです。<br>チケットがステータス毎で分かれているので、進捗状況が分かりやすくなります。</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="329" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-1-1024x329.png" alt="" class="wp-image-19775" style="width:768px;height:247px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-1-1024x329.png 1024w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-1-300x96.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-1-768x247.png 768w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-1.png 1053w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h4 class="wp-block-heading">ui extension</h4>



<p>→<a href="https://github.com/redmica/redmica_ui_extension" target="_blank" rel="noopener" title=""><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-blue-2-color"><span style="text-decoration: underline;">ui extension</span></mark></strong></a></p>



<p>セレクトボックスで検索が行えるようになります。<br><img decoding="async" width="538" height="309" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXcrkxRDTScpVxkhXkVsbcCIje6ybTn3jIjK4O-UYAagaNN1KaREWezfKv19t8ZgXjNRKa0MGDO_XYhn0ptRAdbbGmOOF7IQYc6jMd74QPe0MsD6Mw2I-vNIhyd0ZWjTeT_WXU9fCbGaRgIw6hbYvgdWAFKx?key=xIqU2rDk1ojTPSjIp60C5g"></p>



<h3 class="wp-block-heading">absolute dates</h3>



<p>→<a href="https://github.com/suer/redmine_absolute_dates" target="_blank" rel="noopener" title=""><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-blue-2-color"><span style="text-decoration: underline;">absolute dates</span></mark></strong></a></p>



<p>Redmineはデフォルトのままだと「〇日前」と表示されます。</p>



<p>このpluginsを入れると、日付が表示されるようになります。</p>



<h3 class="wp-block-heading">work time</h3>



<p>→<a href="https://github.com/tkusukawa/redmine_work_time" target="_blank" rel="noopener" title=""><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-blue-2-color"><span style="text-decoration: underline;">work time</span></mark></strong></a></p>



<p>このpluginsで工数の設定、算出が行えるようになります。</p>



<p><img decoding="async" width="626" height="384" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXc4baj1jek1vWVPyFrRopGzbgfiP488yq1F5tUzhfBCS29PiVVhJScAy1qLPEzQWY6FgEawTe4YTPkV-ZT5oEtG3zbBA8XX_EUeTtVBTSbKSfkYVTJUCm5Vx6n8dPB3T060Yovbm7vTl6IjyisrUmNcjI2L?key=xIqU2rDk1ojTPSjIp60C5g"></p>



<h2 class="wp-block-heading">Dockerfile編集</h2>



<p>ここからDockerfileの編集を行っていきます。<br>Dockerのイメージを作成し、実行することでDockerコンテナを作成することができます。<br>今回使用するイメージredmine:5.1.1です。</p>



<p>→<a href="https://hub.docker.com/layers/library/redmine/5.1.1/images/sha256-9eab9c59e1f9da04c31ec5dac4e50c084dc2d01a856529d0045f536f53b6e0ff?context=explore" target="_blank" rel="noopener" title=""><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-blue-2-color"><span style="text-decoration: underline;">redmine:5.1.1</span></mark></strong></a></p>



<figure class="wp-block-image is-resized"><img decoding="async" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXf6mJx7CH4lGzQcDoe3PlcSWZtZXlSK08mGFIq6sL7MHr0EOlw-ussXR9mTQ9YjGkkMzZYyPfEHFpCXFD5dc476yYizH_FP0jYtybrjaTOD55Hck80NFaBaGBuPdHQBwRVXeupuuHf70knNkzQMBi2NdK9u?key=xIqU2rDk1ojTPSjIp60C5g" alt="" style="width:580px;height:490px"/></figure>



<h3 class="wp-block-heading">実行内容の説明</h3>



<p>ビルドするイメージのベースとなるイメージを指定しています。</p>



<pre class="wp-block-code has-black-background-color has-background"><code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-white-color">FROM redmine:5.1.1</mark></code></pre>



<p>必要なパッケージを更新させ、不要なパッケージを削除します。<br>イメージの容量を小さく保つことができます。</p>



<pre class="wp-block-code has-black-background-color has-background"><code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-white-color">RUN apt-get update
RUN apt-get clean
RUN rm -rf /var/lib/apt/lists/*</mark></code></pre>



<p>ローカルに保存したpluginsを、コンテナ内にコピーしています。<br>左側でローカルに保存したpluginsのディレクトリを参照し、右側でコンテナ内のディレクトリを指定しています。</p>



<pre class="wp-block-code has-black-background-color has-background"><code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-white-color">COPY ./plugins/redmine_issues_panel/ /usr/src/redmine/plugins/redmine_issues_panel
COPY ./plugins/redmica_ui_extension /usr/src/redmine/plugins/redmica_ui_extension
COPY ./plugins/redmine_absolute_dates /usr/src/redmine/plugins/redmine_absolute_dates
COPY ./plugins/redmine_work_time /usr/src/redmine/plugins/redmine_work_time</mark></code></pre>



<p>ディレクトリを/usr/src/redmineにします。相対参照で動いているファイルもあるので、必ずこのディレクトリに移動させます。</p>



<pre class="wp-block-code has-black-background-color has-background"><code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-white-color">WORKDIR /usr/src/redmine</mark></code></pre>



<p>所有権をredmineで統一させます。</p>



<pre class="wp-block-code has-black-background-color has-background"><code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-white-color">RUN chown -R redmine:redmine ./</mark></code></pre>



<p>saml.rbをconfig/innitializers/saml.rbにコピーさせます。samlファイルはここを参照して動いています。</p>



<pre class="wp-block-code has-black-background-color has-background"><code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-white-color">RUN cp plugins/redmine_omniauth_saml_saml.rb config/initializers/saml.rb</mark></code></pre>



<p>最後にbundle installを行います。ファイルの依存関係をインストールします。</p>



<pre class="wp-block-code has-black-background-color has-background"><code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-white-color">RUN bundle install</mark></code></pre>



<h2 class="wp-block-heading">ECRにpush</h2>



<p>作成したdockerfileをECRにpushしていきます。<br>コマンドについては、ECRの画面「プッシュコマンドの表示」から参照できます。</p>



<p>認証トークンを取得し、レジストリに対してDocker クライアントを認証</p>



<pre class="wp-block-code has-black-background-color has-background"><code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-white-color">aws ecr get-login-password --region &lt;リージョン&gt; | docker login --username AWS --password-stdin &lt;AWSアカウントID&gt;</mark></code></pre>



<p>Docker イメージを構築します。</p>



<pre class="wp-block-code has-black-background-color has-background"><code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-white-color">docker build -t &lt;イメージ名&gt; .</mark></code></pre>



<p>リポジトリにイメージをプッシュできるように、イメージにタグを付けます。</p>



<pre class="wp-block-code has-black-background-color has-background"><code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-white-color">docker tag &lt;イメージ名&gt;:&lt;tag&gt; &lt;pushするイメージ名&gt;:&lt;tag&gt;</mark></code></pre>



<p>新しく作成した AWS リポジトリにこのイメージをプッシュします</p>



<pre class="wp-block-code has-black-background-color has-background"><code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-white-color">docker push &lt;pushするイメージ名&gt;:&lt;tag&gt;</mark></code></pre>



<h2 class="wp-block-heading">ELB作成</h2>



<p>ロードバランサーはALB、インターネット向けで作成します。<br>リスナーとルーティングは後ほど設定しますので、デフォルトで作成してください。</p>



<h3 class="wp-block-heading">ターゲットグループ作成</h3>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="759" height="955" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-2.png" alt="" class="wp-image-19776" style="width:613px;height:771px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-2.png 759w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-2-238x300.png 238w" sizes="(max-width: 759px) 100vw, 759px" /></figure>


<div class="block-block-12">
	<div class="Editor-block-caption">
				<div class="Editor-block-caption__text"><p>ターゲットタイプ:IPアドレス<br />
プロトコルポート:HTTP<br />
ポート番号:3000<br />
ヘルスチェックパス:/login<br />
間隔:300</p>
</div>
	</div>
</div>


<p>その他はデフォルトでOKです。</p>



<h2 class="wp-block-heading">ECS設定</h2>



<h3 class="wp-block-heading">タスク定義</h3>



<p>ECRにpush後、ECSのタスク定義を作成します。</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="772" height="580" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-3.png" alt="" class="wp-image-19777" style="width:579px;height:435px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-3.png 772w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-3-300x225.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-3-768x577.png 768w" sizes="(max-width: 772px) 100vw, 772px" /></figure>


<div class="block-block-12">
	<div class="Editor-block-caption">
				<div class="Editor-block-caption__text"><p>起動タイプ:Fargate<br />
オペレーティングシステム:Linux/X86_64<br />
CPU:0.5vCPU<br />
メモリ:1GB<br />
タスクロール:デフォルトのままで問題ありません<br />
タスク実行ロール:デフォルトのままで問題ありません</p>
</div>
	</div>
</div>


<p>メモリ、CPUは最小要件で作成しています。</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="772" height="332" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-4.png" alt="" class="wp-image-19778" style="width:579px;height:249px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-4.png 772w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-4-300x129.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-4-768x330.png 768w" sizes="(max-width: 772px) 100vw, 772px" /></figure>



<p>環境変数：</p>



<figure class="wp-block-table"><table><tbody><tr><td>キー</td><td>値のタイプ</td><td>値</td></tr><tr><td>REDMINE_DB_DATABASE</td><td>値</td><td>データベース名</td></tr><tr><td>REDMINE_DB_MYSQL</td><td>値</td><td>RDSエンドポイント</td></tr><tr><td>REDMINE_DB_PASSWORD&nbsp;</td><td>値</td><td>RDSパスワード&nbsp;&nbsp;</td></tr><tr><td>REDMINE_DB_USERNAME</td><td>値</td><td>RDSユーザー名</td></tr><tr><td>REDMINE_PLUGINS_MIGRATE</td><td>値</td><td>true</td></tr></tbody></table></figure>



<p>pluginsを導入しない場合、REDMINE_PLUGINS_MIGRATEは不要です。</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="917" height="370" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-5.png" alt="" class="wp-image-19779" style="width:688px;height:278px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-5.png 917w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-5-300x121.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-5-768x310.png 768w" sizes="(max-width: 917px) 100vw, 917px" /></figure>



<p>デフォルトのままで問題ありません。<br>awslogs-groupはタスク定義の名前が自動的に入ります。</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="892" height="577" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-6.png" alt="" class="wp-image-19780" style="width:669px;height:433px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-6.png 892w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-6-300x194.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-6-768x497.png 768w" sizes="(max-width: 892px) 100vw, 892px" /></figure>


<div class="block-block-12">
	<div class="Editor-block-caption">
				<div class="Editor-block-caption__text"><p>ボリュームタイプ:EFS<br />
ファイルシステム:作成したEFS<br />
ルートディレクトリ:「/」のままで問題ありません<br />
アクセスポイントID:なし</p>
</div>
	</div>
</div>


<figure class="wp-block-image size-full"><img decoding="async" width="909" height="297" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-7.webp" alt="" class="wp-image-19806" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-7.webp 909w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-7-300x98.webp 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-7-768x251.webp 768w" sizes="(max-width: 909px) 100vw, 909px" /></figure>


<div class="block-block-12">
	<div class="Editor-block-caption">
				<div class="Editor-block-caption__text"><p>ソースボリューム:ボリューム名<br />
コンテナパス:/usr/src/redmine/files</p>
</div>
	</div>
</div>


<p>redmineのファイルは、files配下に保存されるため、コンテナパスは/usr/src/redmine/files<br>となります。</p>



<h3 class="wp-block-heading">クラスター作成</h3>



<figure class="wp-block-image is-resized"><img decoding="async" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXcOaHdA5BnoUWoY_Dg5kYOLWXz7WWk84m8DLgrT9n4fzbFYbv5p3Y54hcGh2_WQVmNyU3qkfjBkEhzxcQqZ1Jq1nFxAcJcpR5rkugtscn-d6iyRKqLxAIe9S_SCNl42eJUk56GY4Hyf1_x7nmvtwnLG4dZ-?key=xIqU2rDk1ojTPSjIp60C5g" alt="" style="width:624px;height:472px"/></figure>



<p>デフォルトの設定でOK</p>



<h3 class="wp-block-heading">サービス作成</h3>



<figure class="wp-block-image is-resized"><img decoding="async" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXdFK7Hu2T8ools5wsvAV0aSaYykbDjrAq4jLXtAZL6UR3JoB8RR4VY7TvwX7yt-OB-opp0la0m6xHZwz_Z9qzM3ozfuwlIA_7PrXSduagBfgw2hwXVj5w5cOHXoNFeak2SpgJgzoNGdN672_eZaVzWavwo?key=xIqU2rDk1ojTPSjIp60C5g" alt="" style="width:617px;height:496px"/></figure>


<div class="block-block-12">
	<div class="Editor-block-caption">
				<div class="Editor-block-caption__text"><p>ファミリー:タスク定義で設定したタスク定義名</p>
</div>
	</div>
</div>


<figure class="wp-block-image size-full is-resized"><img decoding="async" width="690" height="548" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-8.png" alt="" class="wp-image-19782" style="width:606px;height:480px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-8.png 690w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-8-300x238.png 300w" sizes="(max-width: 690px) 100vw, 690px" /></figure>


<div class="block-block-12">
	<div class="Editor-block-caption">
				<div class="Editor-block-caption__text"><p>VPC:ECSを配置するVPC<br />
サブネット:prvate subnet<br />
セキュリティグループ:80番、443番、3000番が空いたセキュリティグループ<br />
パブリックIP:オフ</p>
</div>
	</div>
</div>


<figure class="wp-block-image size-large is-resized"><img decoding="async" width="734" height="1024" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-9-734x1024.png" alt="" class="wp-image-19783" style="width:612px;height:854px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-9-734x1024.png 734w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-9-215x300.png 215w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-9-768x1072.png 768w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-9.png 783w" sizes="(max-width: 734px) 100vw, 734px" /></figure>


<div class="block-block-12">
	<div class="Editor-block-caption">
				<div class="Editor-block-caption__text"><p>ロードバランサーの種類Application Load Balancer<br />
ヘルスチェック猶予時間:900秒<br />
リスナー:既存のリスナーを使用<br />
ターゲットグループ:作成したターゲットグループ</p>
</div>
	</div>
</div>


<h2 class="wp-block-heading">ELB編集</h2>



<p>ELBにリスナーを追加します。</p>



<figure class="wp-block-image is-resized"><img decoding="async" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXeTLRmmb0ABGlCcjwRxthrlMPCbd7rKXE0Kk6_Yvf9G_eOmqfiht8UrAijkz9IkDOy23Ljxq10PUHk0Tm79bnqWNPBUE5u6E5N4Ji3ej2m4-u5zqVvVzgzo8MHxn6bVuTDhtjZfZeWZpzvNQS7tosTgbjk3?key=xIqU2rDk1ojTPSjIp60C5g" alt="" style="width:606px;height:650px"/></figure>


<div class="block-block-12">
	<div class="Editor-block-caption">
				<div class="Editor-block-caption__text"><p>アクションのルーティング:ターゲットグループへ転送<br />
ターゲットグループ:作成したターゲットグループ</p>
</div>
	</div>
</div>


<p>証明書は取得した証明書を選択してください。</p>



<p>HTTPS:443の条件を編集します。</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="777" height="459" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-10.png" alt="" class="wp-image-19784" style="width:609px;height:359px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-10.png 777w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-10-300x177.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-10-768x454.png 768w" sizes="(max-width: 777px) 100vw, 777px" /></figure>



<p>ホストヘッダーを選択し、redmineのURLを入力<br>HTTPS:443の設定は以上です。</p>



<p>最後にHTTP:80のデフォルトの設定も編集していきます。</p>



<figure class="wp-block-image is-resized"><img decoding="async" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXdSxwdFiMHBiWRqsHUDtksTv-mcGvC1cGKBnhT1ouw4tA6GGvXUITkIqOlcQKXLoCFMno22nMJUju5MNOkrxYLElZwLQDWMMcbswiXX0tQOcEyL-6DnGfoetFwvuD7vjsWsvrHvdHG5YQ9JEQj1LIetCN0?key=xIqU2rDk1ojTPSjIp60C5g" alt="" style="width:615px;height:684px"/></figure>



<p>アクションのルーティングをURLにリダイレクト</p>



<p>以上で設定終了です。</p>



<p>ECS起動後、URLからredmineにアクセスできるようになります。</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="943" height="216" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-11.png" alt="" class="wp-image-19785" style="width:670px;height:153px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-11.png 943w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-11-300x69.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/image-11-768x176.png 768w" sizes="(max-width: 943px) 100vw, 943px" /></figure>



<h2 class="wp-block-heading">おわり</h2>



<p>ECSでRedmineを構築してみました。多くの記事がdocker-composeやEC2を使った方法を紹介していますが、ECSでの動作方法についてはあまり見かけませんでした。ECSでRedmineを運用することで、Dockerfileのアップデートだけで済み、サーバーの管理が不要になる点は非常に大きなメリットです。<br>アップデートも簡単で、バージョンを変更してupgradeコマンドを実行するだけで済むため、時間もかかりません。この方法により、管理の負担を大幅に軽減できます。<br>この記事が、他の方々の負担を少しでも減らすことができることを願っています。</p>



<p><a href="https://www.sms-datatech.co.jp/column/try_redmine/" title=""><strong><span style="text-decoration: underline;"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-blue-2-color">⇒STEP2：RedmineのSSO設定をAWSで行う</mark></span><br></strong></a></p>



<div class="author__card">
  <div class="author-data">
    <img decoding="async" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/11/author-2.png" alt="筆者イメージ">
    <div>
      <p>筆者：R・M（20代）</p>
      <p>所属：ハイブリット・マルチクラウド部</p>
    </div>
  </div>
  <div class="author-intro">
    <p>まったくの未経験でこの業界に飛び込んできた若手。<br>パッと見はビジュアル系？<br>でもプレゼンしだすと、少し胡散臭さもあわせもったセールスように華麗なプレゼンを見せる。<br>読者と一緒にAWSのプロになりたい、そんな20代。</p>
  </div>
</div>



<!--HubSpot Call-to-Action Code --><span class="hs-cta-wrapper" id="hs-cta-wrapper-0a5030d3-78e1-46b3-94b3-b77077a201ba"><span class="hs-cta-node hs-cta-0a5030d3-78e1-46b3-94b3-b77077a201ba" id="hs-cta-0a5030d3-78e1-46b3-94b3-b77077a201ba"><!--[if lte IE 8]><div id="hs-cta-ie-element"></div><![endif]--><a href="https://cta-redirect.hubspot.com/cta/redirect/23171742/0a5030d3-78e1-46b3-94b3-b77077a201ba" target="_blank" rel="noopener"><img decoding="async" class="hs-cta-img" id="hs-cta-img-0a5030d3-78e1-46b3-94b3-b77077a201ba" style="border-width:0px;" src="https://no-cache.hubspot.com/cta/default/23171742/0a5030d3-78e1-46b3-94b3-b77077a201ba.png" alt="新規CTA"></a></span><script charset="utf-8" src="https://js.hscta.net/cta/current.js"></script><script type="text/javascript"> hbspt.cta.load(23171742, '0a5030d3-78e1-46b3-94b3-b77077a201ba', {"useNewLoader":"true","region":"na1"}); </script></span><!-- end HubSpot Call-to-Action Code -->


<div class="block-block-22">
	<div class="Editor-wrap">
					<div class="Editor-wrap__titleMsg">まずはお気軽にご相談ください</div>
			<div class="Editor-wrap__title">お問い合わせフォーム</div>
			</div>
</div>


<script charset="utf-8" type="text/javascript" src="//js.hsforms.net/forms/embed/v2.js"></script>
<script>
  hbspt.forms.create({
    region: "na1",
    portalId: "23171742",
    formId: "b36c7c3b-83a0-43c4-8daa-8e055d6805e9"
  });
</script><p>The post <a href="https://www.sms-datatech.co.jp/column/try_ecs-redmine/">ECSでRedmineを構築する</a> first appeared on <a href="https://www.sms-datatech.co.jp">SMS DataTech</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.sms-datatech.co.jp/column/try_ecs-redmine/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>いまさらSystemCenterVirtual MachineManager2022を試す</title>
		<link>https://www.sms-datatech.co.jp/column/aut_system-center-virtual-machine-manager/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=aut_system-center-virtual-machine-manager</link>
					<comments>https://www.sms-datatech.co.jp/column/aut_system-center-virtual-machine-manager/#respond</comments>
		
		<dc:creator><![CDATA[後藤]]></dc:creator>
		<pubDate>Thu, 23 May 2024 15:15:00 +0000</pubDate>
				<category><![CDATA[やってみた]]></category>
		<category><![CDATA[システム運用]]></category>
		<category><![CDATA[業務効率化]]></category>
		<category><![CDATA[自動化]]></category>
		<guid isPermaLink="false">http://192.168.10.58/?p=18244</guid>

					<description><![CDATA[<p>今回AWSのドキュメントを眺めていたら、EC2を管理するSystem Center Virtual Machine Managerのアドインがあるのを見かけました。<br />
どんな感じなのか見てみたので、VirtualMachineManagerを試しに構築してみる様子とアドインの追加の様子を記事にしています。<br />
また、インストール自体は完了しましたが、つまずいた箇所についても触れていきます。</p>
<p>The post <a href="https://www.sms-datatech.co.jp/column/aut_system-center-virtual-machine-manager/">いまさらSystemCenterVirtual MachineManager2022を試す</a> first appeared on <a href="https://www.sms-datatech.co.jp">SMS DataTech</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">はじめに</h2>



<p>こんにちは、社員Dです。<br>今回AWSのドキュメントを眺めていたら、EC2を管理するSystem Center Virtual Machine Managerのアドインがあるのを見かけました。<br>どんな感じなのか見てみたので、<strong><mark style="background-color:#fdff84" class="has-inline-color">VirtualMachineManagerを試しに構築してみる様子とアドインの追加の様子を記事にしています。</mark></strong><br>また、インストール自体は完了しましたが、つまずいた箇所についても触れていきます。</p>



<p><a href="https://www.sms-datatech.co.jp/column/consulting_ec2/"><span style="text-decoration: underline;"><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-blue-2-color">⇒Amazon EC2とは</mark></strong></span></a></p>



<h2 class="wp-block-heading">本記事の対象の方</h2>



<p>この記事では、前提として必要なActiveDirectoryの設定、WindowsServerのセットアップなどは、ご自身で設定できる方を対象としています。</p>



<h2 class="wp-block-heading">System Center Virtual Machine Managerとは</h2>



<p>私自身の認識ですが、SystemCenterVirtualMachineManagerはオンプレミスのデータセンターにて複数のHyper-Vをホストするサーバー、仮想環境を管理する製品です。</p>



<h3 class="wp-block-heading">メリット</h3>



<p>大規模なデータセンターを抱える企業では、多くの仮想環境を抱えている事が有ります。<br>この製品は、その様な複数の仮想マシンやホストの管理を集約し運用の効率化、テンプレート化によって仮想マシンの展開を高速化できるメリットが有ります。</p>



<h2 class="wp-block-heading">環境構築の手順</h2>



<h3 class="wp-block-heading">作るもの</h3>



<p>WindowsServerとSystemCenterVirtualMachineManagerの評価版を利用し、管理サーバ、管理クライアントにAWS管理アドインをインストールしていきます。<br>Virtual Machine Manager(以下VMM)は下記のコンポーネントが要件となっている為、これらからも同時にインストールを進めていきます。</p>



<p style="font-size:16px">●Windows ADK<br>●SQL Server</p>



<h3 class="wp-block-heading">事前準備</h3>



<p>VMMではActiveDirectoryのドメインのVMM管理サーバ・VMホストに特権をもつドメインユーザが必要です。<br>これらはVMMのSQLServerのインストールにも必要なので、事前に用意します。<br>また、各インストーラもあらかじめダウンロードします。</p>



<h4 class="wp-block-heading">仮想マシンとWindowsServer2022評価版のインストール</h4>



<p>仮想マシン上で構築を進めていきます。<br>OSインストールについては細かい部分は省きますが、OSの種類はデスクトップエクスペリエンスをインストールします。</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="851" height="635" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-36.png" alt="" class="wp-image-18305" style="width:638px;height:476px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-36.png 851w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-36-300x224.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-36-768x573.png 768w" sizes="(max-width: 851px) 100vw, 851px" /></figure>



<h4 class="wp-block-heading">インストール完了後ドメイン参加も進めておきます。</h4>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="895" height="807" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-1.png" alt="" class="wp-image-18269" style="width:671px;height:605px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-1.png 895w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-1-300x271.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-1-768x692.png 768w" sizes="(max-width: 895px) 100vw, 895px" /></figure>



<h3 class="wp-block-heading">&nbsp;VMM構築</h3>



<h4 class="wp-block-heading">Windows ADKのインストール</h4>



<p>今回試すサーバはインターネットに接続できるので、ダウンロードしたADKのインストーラのみで進めて行きます。</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="885" height="657" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-2.png" alt="" class="wp-image-18270" style="width:664px;height:493px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-2.png 885w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-2-300x223.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-2-768x570.png 768w" sizes="(max-width: 885px) 100vw, 885px" /></figure>



<p>インストールする機能は「Deployment Tools」のみ必要です。<br>他の機能はインストールしません。</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="886" height="655" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-5.png" alt="" class="wp-image-18273" style="width:665px;height:491px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-5.png 886w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-5-300x222.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-5-768x568.png 768w" sizes="(max-width: 886px) 100vw, 886px" /></figure>



<p></p>



<h4 class="wp-block-heading">WindowsPEアドオンのインストール</h4>



<p>VMMに必要な機能ですが、WindowsADKのインストーラーには含まれておらず、独立しています。<br>こちらも同じくインストールします。</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="885" height="651" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-3.png" alt="" class="wp-image-18271" style="width:664px;height:488px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-3.png 885w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-3-300x221.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-3-768x565.png 768w" sizes="(max-width: 885px) 100vw, 885px" /></figure>



<p></p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="885" height="651" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-4.png" alt="" class="wp-image-18272" style="width:664px;height:488px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-4.png 885w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-4-300x221.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-4-768x565.png 768w" sizes="(max-width: 885px) 100vw, 885px" /></figure>



<p></p>



<h4 class="wp-block-heading">SQLServer2022インストール</h4>



<p>評価版のインストールを進めていきます。</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="888" height="776" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-6.png" alt="" class="wp-image-18274" style="width:666px;height:582px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-6.png 888w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-6-300x262.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-6-768x671.png 768w" sizes="(max-width: 888px) 100vw, 888px" /></figure>



<p></p>



<p>途中に出てくるAzureの拡張機能はインストールしません。</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="889" height="778" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-7.png" alt="" class="wp-image-18275" style="width:667px;height:584px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-7.png 889w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-7-300x263.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-7-768x672.png 768w" sizes="(max-width: 889px) 100vw, 889px" /></figure>



<p></p>



<p>インストールする機能には「データベースエンジンサービス」を選択する</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="883" height="775" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-8.png" alt="" class="wp-image-18276" style="width:662px;height:581px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-8.png 883w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-8-300x263.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-8-768x674.png 768w" sizes="(max-width: 883px) 100vw, 883px" /></figure>



<p></p>



<p>照合序列は規定値から「Latin1_General_100_CI_AS」を選択</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="883" height="773" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-9.png" alt="" class="wp-image-18277" style="width:662px;height:580px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-9.png 883w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-9-300x263.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-9-768x672.png 768w" sizes="(max-width: 883px) 100vw, 883px" /></figure>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="894" height="566" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-10.png" alt="" class="wp-image-18278" style="width:671px;height:425px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-10.png 894w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-10-300x190.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-10-768x486.png 768w" sizes="(max-width: 894px) 100vw, 894px" /></figure>



<p></p>



<p>認証モードはsaも使えるようにしておきたいので、混合モードを設定<br>管理者に事前準備で作成したドメインのVMM用アカウントを設定します。</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="888" height="776" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-11.png" alt="" class="wp-image-18279" style="width:666px;height:582px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-11.png 888w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-11-300x262.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-11-768x671.png 768w" sizes="(max-width: 888px) 100vw, 888px" /></figure>



<h4 class="wp-block-heading">System Center Virtual Machine Managerのインストール</h4>



<p>ここからVMMのインストールに入りますが、ダウンロードしてきた評価版のファイルは展開する必要があるようです。</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="788" height="612" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-13.png" alt="" class="wp-image-18281" style="width:591px;height:459px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-13.png 788w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-13-300x233.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-13-768x596.png 768w" sizes="(max-width: 788px) 100vw, 788px" /></figure>



<p>デフォルトではCドライブにフォルダが作成され、その中に必要なファイルが展開されます</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="895" height="331" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-14.png" alt="" class="wp-image-18282" style="width:671px;height:248px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-14.png 895w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-14-300x111.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-14-768x284.png 768w" sizes="(max-width: 895px) 100vw, 895px" /></figure>



<p>Setup.exeをクリックしてセットアップを開始します。</p>



<p>インストールメニューが表示されますが、上はVMM管理のインストールで、下はVMMの管理下に入る仮想のホストマシンへのエージェントインストールです。<br>今回は管理サーバのインストールを進めます。</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="882" height="637" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-15.png" alt="" class="wp-image-18283" style="width:662px;height:478px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-15.png 882w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-15-300x217.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-15-768x555.png 768w" sizes="(max-width: 882px) 100vw, 882px" /></figure>



<p>機能選択は「VMM管理サーバー」を選択します。<br>同時にVMMコンソールのチェックが自動で入ります。</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="886" height="670" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-16.png" alt="" class="wp-image-18284" style="width:665px;height:503px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-16.png 886w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-16-300x227.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-16-768x581.png 768w" sizes="(max-width: 886px) 100vw, 886px" /></figure>



<p>プロダクトキーは空欄のまま進みます。</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="886" height="670" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-37.png" alt="" class="wp-image-18307" style="width:665px;height:503px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-37.png 886w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-37-300x227.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-37-768x581.png 768w" sizes="(max-width: 886px) 100vw, 886px" /></figure>



<p>DB設定を進めます。インスタンス名はSQLServerインストール時に設定したものをリストボックスから選択します。今回はデフォルトでインストールしているのでMSSELSERVERを選択。</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="774" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-18-1024x774.png" alt="" class="wp-image-18286" style="width:768px;height:581px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-18-1024x774.png 1024w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-18-300x227.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-18-768x580.png 768w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-18.png 1088w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>VMM用に用意したドメインユーザを設定します。</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="774" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-19-1024x774.png" alt="" class="wp-image-18287" style="width:768px;height:581px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-19-1024x774.png 1024w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-19-300x227.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-19-768x581.png 768w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-19.png 1087w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>ポート構成、ライブラリ構成についてはデフォルトのまま進めます。</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="774" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-20-1024x774.png" alt="" class="wp-image-18288" style="width:768px;height:581px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-20-1024x774.png 1024w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-20-300x227.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-20-768x581.png 768w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-20.png 1091w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="776" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-21-1024x776.png" alt="" class="wp-image-18289" style="width:768px;height:582px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-21-1024x776.png 1024w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-21-300x227.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-21-768x582.png 768w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-21.png 1088w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p></p>



<p>インストールが完了しました。</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="775" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-22-1024x775.png" alt="" class="wp-image-18290" style="width:768px;height:581px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-22-1024x775.png 1024w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-22-300x227.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-22-768x581.png 768w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-22.png 1088w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>成功している様子で記事を作成していますが、実はここで躓きました・・・。<br>次章で起きた事と私が解決できた方法を記載します。</p>



<p>コンソールの接続が表示されるので接続確認をします。</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="735" height="819" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-24.png" alt="" class="wp-image-18292" style="width:551px;height:614px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-24.png 735w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-24-269x300.png 269w" sizes="(max-width: 735px) 100vw, 735px" /></figure>



<p><br>無事VMMの構築が完了しました。</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="554" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-25-1024x554.png" alt="" class="wp-image-18293" style="width:768px;height:416px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-25-1024x554.png 1024w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-25-300x162.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-25-768x416.png 768w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-25.png 1097w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h4 class="wp-block-heading">VMMのインストール失敗例と対策</h4>



<p>ライブラリ構成の後、インストール確認を経てセットアップに入ります。<br>しかし、セットアップ中に完了できない旨を伝えるメッセージが表示されセットアップに失敗しました。</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="775" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-26-1024x775.png" alt="" class="wp-image-18294" style="width:768px;height:581px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-26-1024x775.png 1024w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-26-300x227.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-26-768x581.png 768w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-26.png 1089w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>原因はMicrosoft.ComponentStudio.Common.dllがないとの事。<br>WindowsADKで「Deployment Tools」をインストールしていれば、有る筈ですがエラーになっています。<br>実際のファイルパスを確認したところ確かにありません。</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="883" height="344" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-27.png" alt="" class="wp-image-18295" style="width:662px;height:258px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-27.png 883w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-27-300x117.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-27-768x299.png 768w" sizes="(max-width: 883px) 100vw, 883px" /></figure>



<p>試しにamd64の中を確認すると、目的のファイルが入っています。<br>どうやら最新版はarmなどに対応した為なのか、アーキテクチャ毎にフォルダ分けがされてしまっているようです。<br>なのでここから少し古いバージョンのWindowsADKをダウウンロードしてインストールしなおしました</p>



<p><span style="text-decoration: underline;"><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-blue-2-color"><a href="https://learn.microsoft.com/ja-jp/windows-hardware/get-started/adk-install#other-adk-downloads" target="_blank" rel="noopener" title="">https://learn.microsoft.com/ja-jp/windows-hardware/get-started/adk-install#other-adk-downloads</a></mark></strong></span></p>



<h3 class="wp-block-heading">AWSアドイン追加</h3>



<p>ここからSCVMM用のアドインをダウンロードします。</p>



<p><a href="https://aws.amazon.com/jp/windows/system-center/" target="_blank" rel="noopener" title=""><span style="text-decoration: underline;"><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-blue-2-color">https://aws.amazon.com/jp/windows/system-center/</mark></strong></span></a></p>



<p>ZIPダウンロードがダウンロードされます。</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="989" height="185" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-28.png" alt="" class="wp-image-18296" style="width:742px;height:139px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-28.png 989w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-28-300x56.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-28-768x144.png 768w" sizes="(max-width: 989px) 100vw, 989px" /></figure>



<p>これを設定のコンソールアドインから追加します。</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="647" height="1017" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-29.png" alt="" class="wp-image-18297" style="width:647px;height:1017px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-29.png 647w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-29-191x300.png 191w" sizes="(max-width: 647px) 100vw, 647px" /></figure>



<p>アドイン追加はウィザードにて追加できます。</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="770" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-30-1024x770.png" alt="" class="wp-image-18298" style="width:768px;height:578px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-30-1024x770.png 1024w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-30-300x226.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-30-768x578.png 768w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-30.png 1097w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>追加が完了するとメニューにEC2ボタンが出てきます。</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="354" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-31-1024x354.png" alt="" class="wp-image-18299" style="width:768px;height:266px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-31-1024x354.png 1024w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-31-300x104.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-31-768x266.png 768w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-31.png 1099w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>しかし、AmazonEC2から接続設定に入れますが、押せなくなっています。</p>



<p>VMとサービスで「すべてのホスト」を選択すると押せるようになります。</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="988" height="1024" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-32-988x1024.png" alt="" class="wp-image-18301" style="width:741px;height:768px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-32-988x1024.png 988w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-32-289x300.png 289w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-32-768x796.png 768w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-32.png 1097w" sizes="(max-width: 988px) 100vw, 988px" /></figure>



<p>アクセスキーとシークレットキーを設定すると、一度コンソールが閉じられます。</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="479" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-33-1024x479.png" alt="" class="wp-image-18300" style="width:768px;height:359px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-33-1024x479.png 1024w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-33-300x140.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-33-768x359.png 768w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-33.png 1097w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>再度起動するとEC2インスタンスの状態が確認できるようになりました。</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="550" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-34-1024x550.png" alt="" class="wp-image-18302" style="width:768px;height:413px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-34-1024x550.png 1024w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-34-300x161.png 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-34-768x412.png 768w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-34.png 1097w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>起動・停止等は出来るようですが、作成画面を確認するとリージョン等表示はなく、表示も崩れています。<br>私の環境が原因かアドインのアップデートがされていないのか、原因は不明ですがインスタンスは作成できないようです。</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="887" height="1024" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-35-887x1024.png" alt="" class="wp-image-18303" style="width:665px;height:768px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-35-887x1024.png 887w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-35-260x300.png 260w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-35-768x886.png 768w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-35.png 935w" sizes="(max-width: 887px) 100vw, 887px" /></figure>



<p>以上でアドインの追加まで設定しました。</p>



<h3 class="wp-block-heading">おわり</h3>



<p>まだ、ホスト追加、仮想マシンの作成等が残ってはいますが、今回はここまでにします。<br>以前VMM 2012を使たことはありますが、大きく変わった様子はなくAzure連携関連の機能が増えたようです。<br>AWSのアドインについては、今後修正されるかは不明ですが、今後のアップデートの後、再度確認してみます。<br>VMM自体、大規模なオンプレミスの仮想環境を抱える企業向けといった印象で、中小規模なシステムではクラウドや、WindowsServer標準のhyper-Vマネージャーで十分といった印象です。</p>



<div class="author__card">
  <div class="author-data">
    <img decoding="async" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/08/author.png" alt="筆者イメージ">
    <div>
      <p>筆者：H・D（30代）</p>
      <p>所属：ハイブリット・マルチクラウド部</p>
    </div>
  </div>
  <div class="author-intro">
    <p>興味をもったことはとことん追求してしまうＤ氏。<br>自宅にはオリジナルのサーバはもちろん、それを監視するパトランプまであるそう。<br>温度が規定値に達すると、手持ちのスマホにアラートが届くほど。<br>彼こそ、まさにインフラの申し子。</p>
  </div>
</div>


<div class="block-block-22">
	<div class="Editor-wrap">
					<div class="Editor-wrap__titleMsg">まずはお気軽にご相談ください</div>
			<div class="Editor-wrap__title">お問い合わせフォーム</div>
			</div>
</div>


<script charset="utf-8" type="text/javascript" src="//js.hsforms.net/forms/embed/v2.js"></script>
<script>
  hbspt.forms.create({
    region: "na1",
    portalId: "23171742",
    formId: "b36c7c3b-83a0-43c4-8daa-8e055d6805e9"
  });
</script>



<div class="wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex">
<div class="wp-block-button aligncenter"><a class="wp-block-button__link wp-element-button" href="https://www.sms-datatech.co.jp/contact/">お問い合わせはこちら　　</a></div>
</div><p>The post <a href="https://www.sms-datatech.co.jp/column/aut_system-center-virtual-machine-manager/">いまさらSystemCenterVirtual MachineManager2022を試す</a> first appeared on <a href="https://www.sms-datatech.co.jp">SMS DataTech</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.sms-datatech.co.jp/column/aut_system-center-virtual-machine-manager/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>生成AI（ChatGPT）でポスター生成してみた！</title>
		<link>https://www.sms-datatech.co.jp/column/try_chatgpt-jirei/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=try_chatgpt-jirei</link>
					<comments>https://www.sms-datatech.co.jp/column/try_chatgpt-jirei/#respond</comments>
		
		<dc:creator><![CDATA[後藤]]></dc:creator>
		<pubDate>Thu, 16 May 2024 01:09:00 +0000</pubDate>
				<category><![CDATA[やってみた]]></category>
		<category><![CDATA[生成AI]]></category>
		<category><![CDATA[業務効率化]]></category>
		<category><![CDATA[自動化]]></category>
		<guid isPermaLink="false">http://192.168.10.58/?p=18153</guid>

					<description><![CDATA[<p>当社（SMSデータテック）では、全社員が『QC（Quality Control）サークル活動』と呼ばれる日常業務の品質向上を目的とした業務改善の小集団活動に取り組んでいます。<br />
業務改善を自発的に行なうことの出来る若手リーダー育成の機会として、業務改善発表会という社内イベントを毎年開催しています。各部署から選抜された優れたQCサークル活動の改善事例を、全社員に対して業務改善発表会を通じてナレッジ共有を行ってます。<br />
本稿では、社内イベントを企画・運営するQC事務局の担当者として、業務改善発表会という社内イベント向けのポスター作成を効率的に行う為に、生成AI（ChatGPT）を業務に活用した事例をご紹介します。</p>
<p>The post <a href="https://www.sms-datatech.co.jp/column/try_chatgpt-jirei/">生成AI（ChatGPT）でポスター生成してみた！</a> first appeared on <a href="https://www.sms-datatech.co.jp">SMS DataTech</a>.</p>]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-image size-full"><img decoding="async" width="1020" height="720" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/sdt_thumbnail_img-241138.jpg" alt="生成AI（ChatGPT）業務活用事例【社内イベント向けのポスター作成】" class="wp-image-21105" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/sdt_thumbnail_img-241138.jpg 1020w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/sdt_thumbnail_img-241138-300x212.jpg 300w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/07/sdt_thumbnail_img-241138-768x542.jpg 768w" sizes="(max-width: 1020px) 100vw, 1020px" /></figure>



<p class="has-text-align-center">株式会社SMSデータテック　営業推進本部　黒石</p>



<p class="has-text-align-center"><img decoding="async" src="https://lh7-us.googleusercontent.com/sN6MlW9kydcZZ2ybu768s4RLQ151eOl7X_kXwDO0Sg7L7e4bgFv1Ynm7b-1csRgL0kRmb9cqeyMddQAEFltYc9RK13zCUxeow9mXdYysGtQ0F-DJkJ6dntsRgXMBfe_zQhCIJbjjE5S91iJeZXS6BvQ" width="270" height="226"></p>



<h2 class="wp-block-heading"><strong>はじめに</strong></h2>



<p>こんにちは。株式会社SMSデータテック営業推進本部の黒石です。<br>当社（SMSデータテック）では、全社員が『QC（Quality Control）サークル活動』と呼ばれる日常業務の品質向上を目的とした業務改善の小集団活動に取り組んでいます。<br>業務改善を自発的に行なうことの出来る若手リーダー育成の機会として、業務改善発表会という社内イベントを毎年開催しています。各部署から選抜された優れたQCサークル活動の改善事例を、全社員に対して業務改善発表会を通じてナレッジ共有を行ってます。<br><strong><mark style="background-color:#fdff84" class="has-inline-color">本稿では、社内イベントを企画・運営するQC事務局の担当者として、業務改善発表会という社内イベント向けのポスター作成を効率的に行う為に、生成AI（ChatGPT）を業務に活用した事例をご紹介します。</mark></strong></p>



<h2 class="wp-block-heading"><strong>生成AI業務活用の背景</strong></h2>



<p>社内イベントの開催情報について、できるだけ多くの社員に対して認知してもらうことが、イベント告知の目的となります。<strong><mark style="background-color:#fdff84" class="has-inline-color">実現方法としては「オンライン」と「リアル」の観点から伝達したい情報を、複数の媒体を活用して情報発信を行います。</mark></strong></p>



<p>情報発信の手段は下記３つの方法で実施します。</p>



<ul class="wp-block-list">
<li>手段１：社内ポータルサイトの社内報として情報を発信する</li>



<li>手段２：各組織のグループメールアドレス宛に情報を発信する</li>



<li>手段３：社内フロアで目につき易い場所に対して情報が掲載されたポスターを掲示する</li>
</ul>



<p>情報発信を行う為の「手段１」および「手段２」については、QC事務局として前年度に情報発信した文章を流用して作成することで、過不足のない情報発信を行うことが出来ます。<br>「手段３」のポスターの作成については、昨年度に使用したポスターの類似したデザインやレイアウトを流用することは新規性に欠けることとなり、掲示物のポスター内容を当社社員に見てもらえなくなってしまう状況が想定された為、新規作成する必要があると考えました。</p>



<p>今回は予算の関係上、掲示用ポスター作成を社外のデザイナーに対して外注を行わずに、生成AI（ChatGPT）の画像生成機能を有効活用することはできないかと考えて、イベント告知用ポスターの制作に取り組みました。</p>



<p>イベント告知用のポスター作成に向けた考慮点は下記となります。<br>①掲示したい場所を確認して、大枠のポスターサイズを決定します。（例：A2サイズ）<br>②ポスター作成後に印刷業者に印刷作業の発注を行う事を想定して、発注先の業者が推奨するファイルデータ（テンプレート）を利用して、ポスターに使用する画像を作成します。</p>



<h2 class="wp-block-heading"><strong>社内掲示用ポスターに使用する画像の生成</strong></h2>



<p>生成AIとして著名なChatGPTの開発元はOpen AI社です。ChatGPTに最新AI画像生成ツール「DALL-E3」と呼ばれる画像生成機能が2023年10月に追加されました。<br>今回は、月額20$で使用することができる『ChatGPT Plus』プランの『GPT-4』を使用して、社内イベント告知用のポスター作成に必要な画像生成の作業を行います。</p>



<p>初めにChatGPTでは、チャット入力欄にMessage（テキスト文章や添付ファイルデータ等）を入力する情報のことを「プロンプト」といいます。<br><strong><mark style="background-color:#fdff84" class="has-inline-color">ChatGPTに対して「プロンプト」として具体的な指示を行なうことによって、目的に適したデザインの画像を生成することが可能となります。</mark></strong><br>ChatGPTのチャット欄に入力した「プロンプト」と出力された「画像生成結果」の事例について、ご紹介します。</p>



<h3 class="wp-block-heading">事例１</h3>



<h4 class="wp-block-heading"><strong>ChatGPTのプロンプト入力</strong></h4>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow"><div class="block-block-12">
	<div class="Editor-block-caption">
				<div class="Editor-block-caption__text"><p>You<br />
あなたはデザイナーです。業務改善発表会に向けてポスターを作成したいです。<br />
業務改善発表会は動画を視聴する形式で開催されます。<br />
動画視聴を促すポスターデザインをできるだけ多く表示して下さい。</p>
</div>
	</div>
</div></div></div>



<h4 class="wp-block-heading"><strong>ChatGPTの画像生成結果</strong></h4>



<p>ChatGPTの機能を利用して画像生成をおこなった出力結果は下記となります。</p>



<p class="has-text-align-center"><img decoding="async" width="553" height="371" src="https://lh7-us.googleusercontent.com/w-w5mJcKiRm2qTOeZh5DFJy8SgoTUInfcQRGeae8Ig7JkOWjPmDSnxuNFTR8ySH4l82CwQEj6GkXjN4XB8k7epxNwN0OBwLSorhjJBNjOsUNbu-xvgUXnnlBFRt_nP3ZRphxUrWghPM4AolhQ7txRts"></p>



<h4 class="wp-block-heading"><strong>画像生成結果に対する考察</strong></h4>



<p>社内イベント告知用ポスターとして使用したい画像のイメージとは違うものの、ChatGPTに任意の「プロンプト」を入力して実行をする事で、落ち着いたデザインの画像を生成できることを確認できました。</p>



<h3 class="wp-block-heading"><strong>事例２</strong></h3>



<h4 class="wp-block-heading"><strong>ChatGPTのプロンプト入力</strong></h4>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow"><div class="block-block-12">
	<div class="Editor-block-caption">
				<div class="Editor-block-caption__text"><p>You<br />
業務改善発表会が伝わるように、文字列を大きく表示して下さい。<br />
アニメのようなデザインにして下さい。</p>
</div>
	</div>
</div></div></div>



<p></p>



<h4 class="wp-block-heading"><strong>ChatGPTの画像生成結果</strong></h4>



<p class="has-text-align-center"><img decoding="async" width="602" height="497" src="https://lh7-us.googleusercontent.com/zCxKQEcmRLJ2cl8Lft-vVqHyc696PopozYx3wA93ySV6D5cmS4NMg11-zUVKdSGMLKUD5yXljPYFn_Ym3HJtBURjf8oVsoTeK-b4UqCBqVOZ-6NZu-FsY7a0BtC3kVL8iYgQIFs2GXT1EwVhICqKMoo"></p>



<h4 class="wp-block-heading"><strong>画像生成結果に対する考察</strong></h4>



<p>業務改善発表会のイベント内容が伝わる画像として、英語のスペルに誤りがあるものの、アニメのような画像の生成結果を確認できました。</p>



<h3 class="wp-block-heading">事例３</h3>



<h4 class="wp-block-heading"><strong>ChatGPTのプロンプト入力</strong></h4>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow"><div class="block-block-12">
	<div class="Editor-block-caption">
				<div class="Editor-block-caption__text"><p>You<br />
日本国内のSMSデータテックという会社のロゴマークを画像のイメージに使用してください。ロゴの色は緑色です。形は葉っぱの形をしています。特徴として、葉っぱのデザインの中にSDTという文字列が記載されています。アニメのような画像デザインにして下さい。</p>
</div>
	</div>
</div></div></div>



<p></p>



<h4 class="wp-block-heading"><strong>ChatGPTの画像生成結果</strong></h4>



<p class="has-text-align-center"><img decoding="async" width="563" height="329" src="https://lh7-us.googleusercontent.com/Nqvw5K5hmF_h8b_lxlRSiAj8gyB7QYLon-qaq36tXgewJfslGBoV7Hk9_3uo9m6WRSLOReAEQhMYE22pbsPrgkvMiILlEE10vd4tN7Xfgc3anrM4dh6_N8XBsUZw6XYRJASdfEaopNuO1w31IF1y4cI"></p>



<h4 class="wp-block-heading">画像生成結果に対する考察</h4>



<p>業務改善発表会のイベント内容が伝わる画像イメージが、生成AI（ChatGPT）の機能を活用することで、アニメのような画像の生成結果を確認することができました。こちらの画像を採用して、最終的に社内イベント告知用のポスターを作成しました。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img decoding="async" width="731" height="1024" src="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-39-731x1024.png" alt="" class="wp-image-18340" style="width:548px;height:768px" srcset="https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-39-731x1024.png 731w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-39-214x300.png 214w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-39-768x1075.png 768w, https://www.sms-datatech.co.jp/wp-content/uploads/2024/05/image-39.png 780w" sizes="(max-width: 731px) 100vw, 731px" /></figure>
</div>


<h2 class="wp-block-heading"><strong>４．生成AI活用のポイント</strong></h2>



<p>生成AI（ChatGPT）活用のポイントについて説明します。</p>



<h3 class="wp-block-heading">１．具体的な指示をプロンプトで入力する</h3>



<p>AIは具体的な指示に基づいて動作します。<strong><mark style="background-color:#fdff84" class="has-inline-color">期待する結果を得るためには、具体的で明確な指示を入力することが重要です。</mark></strong></p>



<h3 class="wp-block-heading">２．AIの能力を理解する</h3>



<p>AIは多くのタスクを実行できますが、その能力は限定されます。AIの能力と限界を理解することで、より効果的に活用することができます。</p>



<h3 class="wp-block-heading">３．データの品質を確保する</h3>



<p>AIの性能は、使用するデータの品質に大きく依存します。<strong><mark style="background-color:#fdff84" class="has-inline-color">信頼性の高いデータ（言語情報等のデータ）を使用することで、より正確な結果を得ることができます。</mark></strong></p>



<h3 class="wp-block-heading">４．結果の解釈を適切に行う</h3>



<p>AIが提供する結果は、適切な解釈とコンテキスト（場面／文脈）が必要です。結果の解釈を適切に行うことで、有用な洞察を得ることができます。</p>



<h3 class="wp-block-heading">５．倫理的な使用を心掛ける</h3>



<p>AIの使用は、プライバシー、公正性、透明性などの倫理的な問題を引き起こす可能性があります。これらの問題を考慮に入れ、倫理的な使用を心掛けることが重要です。</p>



<p></p>



<p>これらのポイントを踏まえ、生成AI（ChastGPT）を効果的に業務活用してください。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p>本稿では、生成AI（ChatGPT-4）を使用したポスター制作の体験談について記述しました。<br>有料版のChatGPT-4（DALL-E）の機能を使用して画像生成を行い、社内イベント告知用のポスター制作を行いました。<br>生成AI（ChatGPT-4）を使って様々なデザインを試して、最終的に満足のいくデザインを制作することが出来ました。ChatGPTの便利さや限界、さらに活用する際のポイントについて学びました。<br>具体的なプロンプトの重要性、ChatGPTのメリットとデメリット、そしてやり取りを続けることで理想の回答や結果を得られる可能性について触れました。<br>皆様も自組織のルールに準拠したうえで、生成AI（ChatGPT等）の便利な機能を業務に利活用してみてはいかがでしょうか。</p>



<h2 class="wp-block-heading">SMSデータテックでは、一緒に働くメンバーを大募集しています！</h2>



<ul class="wp-block-list">
<li><strong>OJT制度があり初心者でも安心</strong></li>



<li><strong>チームで協力し合って仕事ができる</strong></li>



<li><strong>仕事もプライベートも充実◎</strong></li>



<li><strong>世の中になくてはならないシステムに携われる</strong></li>



<li><strong>資格取得支援制度で新しい資格にチャレンジしやすい</strong></li>
</ul>



<p>私たちと一緒に、エンジニアとして楽しく働きませんか？</p>



<!--HubSpot Call-to-Action Code --><span class="hs-cta-wrapper" id="hs-cta-wrapper-ec8badd4-3010-4fbb-bc83-9ab8ffb43425"><span class="hs-cta-node hs-cta-ec8badd4-3010-4fbb-bc83-9ab8ffb43425" id="hs-cta-ec8badd4-3010-4fbb-bc83-9ab8ffb43425"><!--[if lte IE 8]><div id="hs-cta-ie-element"></div><![endif]--><a href="https://cta-redirect.hubspot.com/cta/redirect/23171742/ec8badd4-3010-4fbb-bc83-9ab8ffb43425"><img decoding="async" class="hs-cta-img" id="hs-cta-img-ec8badd4-3010-4fbb-bc83-9ab8ffb43425" style="border-width:0px;" src="https://no-cache.hubspot.com/cta/default/23171742/ec8badd4-3010-4fbb-bc83-9ab8ffb43425.png" alt="新規CTA"></a></span><script charset="utf-8" src="https://js.hscta.net/cta/current.js"></script><script type="text/javascript"> hbspt.cta.load(23171742, 'ec8badd4-3010-4fbb-bc83-9ab8ffb43425', {"useNewLoader":"true","region":"na1"}); </script></span><!-- end HubSpot Call-to-Action Code -->


<div class="block-block-22">
	<div class="Editor-wrap">
					<div class="Editor-wrap__titleMsg">まずはお気軽にご相談ください</div>
			<div class="Editor-wrap__title">お問い合わせフォーム</div>
			</div>
</div>


<p><script charset="utf-8" type="text/javascript" src="//js.hsforms.net/forms/embed/v2.js"></script> <script>
  hbspt.forms.create({
    region: "na1",
    portalId: "23171742",
    formId: "b36c7c3b-83a0-43c4-8daa-8e055d6805e9"
  });
</script></p><p>The post <a href="https://www.sms-datatech.co.jp/column/try_chatgpt-jirei/">生成AI（ChatGPT）でポスター生成してみた！</a> first appeared on <a href="https://www.sms-datatech.co.jp">SMS DataTech</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.sms-datatech.co.jp/column/try_chatgpt-jirei/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
