Linuxのsystemdについて

目次

1.systemdとは
 systemdはLinuxのシステムを起動するときに様々なプログラムを動かす元となるプログラムです。
 systemdはユニット(unit)単位のユニットファイルで管理します。

2.systemdターゲット
 従来はランレベルによって実行するシステムサービスが定義されていましたが、ランレベルの概念がsystemdターゲットに代わり、ターゲットユニットをグループ化してサービスを起動します。
(1)default.target
 default.targetを起点として、ユニットが起動されます。
 default.targetの実体はシンボリックリンクでどのターゲットに紐づけられるかは下記のコマンドにより、/etc/systemd/system/default.target にあるシンボリックリンクを解決して結果を表示します。

$ systemctl get-default

ターゲットの種類は
・graphical.target:グラフィカル、マルチユーザシステムを設定
・multi-user.target:非グラフィカル、マルチユーザシステムを設定
・rescure.target:レスキューシェル(シングルユーザ)を設定
・emergency.target:エマージェンシーシェルを設定

3.現在のターゲットの表示
 読み込み済みのターゲットユニットの一覧の表示

$ systemctl list-units --type target

 UNIT:ユニットの正式名
 LOAD:ユニットが読み込まれているかどうか
 ACTIVE:ユニットファイルアクティベーションの状態
 SUB:詳細な状態
 DESCRIPTION:説明
 状態に関係なく読み込み済みユニットのすべてを表示する場合は、オプションの –all または -a を付けます。

$ systemctl list-units --type target --all

4.デフォルトターゲットの変更
 name を、デフォルトで使用するターゲットユニットの名前 (multi-user など) に置き換えます。

# systemctl set-default name.target

5.現在のターゲットの変更
 name を、デフォルトで使用するターゲットユニットの名前 (multi-user など) に置き換えます。

# systemctl isolate name.target

6.ユニットの起動リスト表示
 ユニットの依存関係の表示は下記のコマンドを実行します。

$ systemctl list-dependencies

7.ユニットの起動順番の表示
 ユニットの起動順番の表示は下記のコマンドを実行し、
plot.svgファイルをブラウザで開きます。

$ systemd-analyze plot > plot.svg

(参考文献)
・SYSTEMD によるサービス管理
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/chap-managing_services_with_systemd

The end

スクラム開発について

目次

1.スクラムとは 
 スクラムとは、アジャイル型ソフトウェア開発手法の一つで、チームで効率的に開発を進めることができる方法をまとめたもの。
 ※アジャイル開発とは(本サイト内のページ)

2.歴史
 Jeff Sutherland、John Scumniotales、Jeff McKenna が1993年にオブジェクト指向プログラミング設計・分析ツールを構築したときに実践した反復型の開発手法がスクラムの元となり、「The Scrum Guide」のまとめられ更新も行われている。
 Scrum Guide
 https://scrumguides.org/

3.スクラムの開発手法

3.1 スクラムの定義と考え方
(1)スクラムの定義
 ①プロダクトオーナーはプロダクトバックログに依頼する。
 ②スクラムチームはプロダクトバックログの目標を達成するためのアイテムを決めて、このアイテムをスプリントの中でインクリメント(成果)に変える。
 ③スクラムチームと利害関係者はインクリメントが目標に達しているか検査し次のスプリントに向けて調整する。
 ④上記を繰り返して、プロダクトを完成させる。
 このような流れでプロダクトを進める方法がスクラムであり、進行役としてスクラムマスターを必要とする。

(2)スクラムの考え方
 スプリントの中で検査と適応のために次の4つの正式なイベントがある。
 ①スプリントプランニング
 ②デイリースクラム
 ③スプリントレビュー
 ④スプリントレトロスペクティブ(振り返り)
 これらが機能するためには、透明性(プロセスの見える化)、検査(問題を検出するイベントを設ける)、適応(検査の結果に対する対応)の仕組みを備える。

3.2 スクラムチーム
 スクラムチームは、スクラムマスター、プロダクトオーナー、および複数の開発者で構成され、1チーム10人以下が推奨される。
(1)プロダクトオーナー
 顧客の意思の代表としての役割と、プロジェクト完了を保障する役割を持つ。

(2)スクラムマスター
 スクラムフレームワークが正しく適用されていることを保証する役割と、チーム内外の組織間調停(ファシリテーション)と外部妨害に対処してフレームワークが機能する役割を担う。

(3)開発者
 各スプリントにおいて作業を完了させる役割を担う。

3.3 方法論
(1)プロダクトゴール
 評価可能なプロダクトのゴールを1つ設定し、チームとステークホルダーで共有する。

(2)プロダクトバックログ
 プロダクトバックログはプロダクトのゴールと、ゴールを達成するための要素の集まりであるプロダクトバックログアイテム(PBI)から成る。

(3)インクリメント
 インクリメントはプロダクトバックログアイテム(PBI)の完成形の成果物のこと。

3.4 スプリント
 スプリントはプロダクトバックログアイテム(PBI)の開発を行う期間のことで、計画・開発・日次見直し・レビュー・調整の工程を含む。スプリント内ではこれらの工程の有無と順番のルールはない。
(1)スプリントのイベント
 スプリントでは検査と適応のために以下の4つのイベント(プロセス)を組み合わせて用いる。
①スプリントプランニング
スプリント期間の最初に行い、スクラムチームでスプリントバックログの生成、チームメンバー間の認識差異がないことの最終確認を行う。
②デイリースクラム
 スプリント期間中、チームは毎日スクラム会議を開く。スクラムマスターはチーム全員に対して、作業実績、問題、作業予定などの質問を行い開発者が答える。問題が報告された場合はスクラムマスターが即座に意思決定する責任と、問題が外的要因によるものである場合はその解決の責任を負う。
③スプリントレビュー
 スプリント最終盤にはスプリントレビューを行い、成果物が目標とする価値(プロダクトゴール)を実現しているかレビューする。インクリメントを中心にプロダクトが評価され、必要に応じてPBIが追加・変更される。このレビューには顧客・プロダクトオーナー・開発者(場合により営業・マーケター)が参加する。
④スプリントレトロスペクティブ(振り返り)
 スプリント終了時には振り返りを行い、開発工程への適応を行う。スプリントで発生した問題とその改善策などを検討し、必要に応じてプロセス改善のPBIを追加する。

(2)スプリントバックログ
 スプリントバックログは当該スプリントで実現したい成果(スプリントゴール)、そのために必要なPBI、PBIを生成する手順計画から成る。スプリントバックログはデイリースクラムで進捗を検査可能な程度の粒度が必要。スプリントプランニングで生成され、状況の変化に応じて適応する。

(3)スプリントゴール
 スプリントゴールはスプリントがプロダクト改良を通じて提供する価値の目標である。プロダクト(what)やプロダクト開発手順(how)の他、価値(why)に注目してスプリントゴールを設定する。

(参考文献)
・The Scrum Guide
 https://scrumguides.org/
・スクラム (ソフトウェア開発)(Wikipedia)

The end

Gradleプロジェクトの作成(javaビルドツール)

目次

1.Gradleとは
 Gradleはプロジェクト管理ツール(ビルドツール)で、プロジェクトの作成、ライブラリの管理、プログラムのビルド、テスト、実行、デプロイなど一連の開発に必要な作業ができます。
 GradleではGroovyというスクリプト言語でスクリプトを記述して管理します。

2.Groovyの準備
 Gradleを利用するためにGroovyを用意します。
(1)Groovyのダウンロード
 https://www.groovy-lang.org/

「apache-groovy-sdk-3.0.9.zip」を「全て展開」し、
「groovy-3.0.9」のフォルダを任意の場所に配置。
 C:\Users***\Documents\groovy-3.0.9

3.Gradleの準備
(1)Gradleのダウンロード
 http://gradle.org/

「gradle-7.3.1-all.zip」を「全て展開」し、
「gradle-7.3.1」のフォルダを任意の場所に配置。
 C:\Users***\Documents\gradle-7.3.1

(2)環境変数の追加
 コントロールパネル>システムとセキュリティ>システム>システムの詳細設定>環境変数

 Path>編集>新規ボタンでbinフォルダがあるディレクトリを設定します。
 ここでは、
 C:\Users*\Documents\groovy-3.0.9\bin
 C:\Users*\Documents\gradle-7.3.1\bin
を設定します。
 バージョンの確認
 > gradle -version

4.build.gradleの作成
 プロジェクトのフォルダ(ここでは「gradleapp」)を作成し、その中に「build.gradle」というファイルを作成し下記のスクリプトを記述します。
 ここでは、プロジェクトフォルダは
 C:\Users***\Documents\gradleapp
とします。
 ファイルの作成は、
 >type nul > build.gradle

 「build.gradle」

task helo{
 println("Hello! Gradle") 
}

 task タスクの名前{
 ・・・実行する処理・・・
 }
 コマンドプロンプトでプロジェクトフォルダのディレクトリに移動し、下記のコマンドでタスクを実行します。
 > gradle helo

5.アプリケーションのビルド
 前記では、「build.gradle」ファイルで、”task”で定義した名前のタスクをコマンドで実行できることが確認できました。ここでは、アプリケーションのビルドを確認します。 
(1)クラスファイルの作成
 プロジェクトフォルダの配下にsrc/main/java/gradleappのフォルダを作成し、クラスファイル「MyApp.java」を作成します。

「MyApp.java」

package gradleapp;

public class MyApp{
	public static void main(String[] args){
		System.out.println("Hello,This is Sample MyApp");
		System.out.println("build by Gradle!");
	}
}

(2)build.gradleの作成
 「build.gradle」

apply plugin:'application'

mainClassName = 'gradleapp.MyApp'

run{
	println("======= run app =======");
}

・プラグインの追加
 プラグインはGradleに機能を追加するときに記述します。
 apply plugin:プラグイン名
 プラグイン「application」はJavaアプリケーションのビルドの機能です。
・メインクラスの指定 
 「application」プラグインが必要とする設定で、”mainClassName”は、main()メソッドがあるクラスを示す変数、 
 mainClassName = ‘(パッケージ名).(クラス名)’
 で定義します。
・runタスクの作成
 「build.gradle」に記述することで、アプリケーションのビルドから実行まで行えるようになります。

(3)ビルドの実行
 > gradle build

(4)プログラムの実行
 > gradle run

6.プロジェクトの作成(gradle)
 initタスクを実行することで対話形式でgradleプロジェクトのフォルダを作成できます。
(1)プロジェクトの作成(init)
 > gradle init

C:\Users\***\Documents\gradleapp2>gradle init
Select type of project to generate:
  1: basic
  2: application
  3: library
  4: Gradle plugin
Enter selection (default: basic) [1..4] 2
 
Select implementation language:
  1: C++
  2: Groovy
  3: Java
  4: Kotlin
  5: Scala
  6: Swift
Enter selection (default: Java) [1..6] 3
 
Split functionality across multiple subprojects?:
  1: no - only one application project
  2: yes - application and library projects
Enter selection (default: no - only one application project) [1..2] 1
 
Select build script DSL:
  1: Groovy
  2: Kotlin
Enter selection (default: Groovy) [1..2] 1
 
Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no]                                                                                     no
 
Select test framework:
  1: JUnit 4
  2: TestNG
  3: Spock
  4: JUnit Jupiter
Enter selection (default: JUnit Jupiter) [1..4] 4
 
Project name (default: gradleapp2): gradleapp2
Source package (default: gradleapp2): gradleapp2
 
> Task :init
Get more help with your project: https://docs.gradle.org/7.3.1/samples/sample_building_java_applications.html
 
BUILD SUCCESSFUL in 1m 5s

 プロジェクトのワークフォルダ配下に下記のディレクトリが作成されます。

また、下記のファイルが作成されます。

「build.gradle」
 ビルドの定義はbuild.gradleファイルに記述します。

/*
 * This file was generated by the Gradle 'init' task.
 *
 * This generated file contains a sample Java application project to get you started.
 * For more details take a look at the 'Building Java & JVM projects' chapter in the Gradle
 * User Manual available at https://docs.gradle.org/7.3.1/userguide/building_java_projects.html
 */

plugins {
    // Apply the application plugin to add support for building a CLI application in Java.
    id 'application'
}

repositories {
    // Use Maven Central for resolving dependencies.
    mavenCentral()
}

dependencies {
    // Use JUnit Jupiter for testing.
    testImplementation 'org.junit.jupiter:junit-jupiter:5.7.2'

    // This dependency is used by the application.
    implementation 'com.google.guava:guava:30.1.1-jre'
}

application {
    // Define the main class for the application.
    mainClass = 'gradleapp2.App'
}

/* 追加 JAR マニフェスト属性指定 */
jar {
    manifest {
        attributes 'Main-Class': 'gradleapp2.App'
    }
}

tasks.named('test') {
    // Use JUnit Platform for unit tests.
    useJUnitPlatform()
}

「settings.gradle」

/*
 * This file was generated by the Gradle 'init' task.
 *
 * The settings file is used to specify which projects to include in your build.
 *
 * Detailed information about configuring a multi-project build in Gradle can be found
 * in the user manual at https://docs.gradle.org/7.3.1/userguide/multi_project_builds.html
 */

rootProject.name = 'gradleapp2'
include('app')

./app/src/main/java/gradleapp2/App.java

/*
 * This Java source file was generated by the Gradle 'init' task.
 */
package gradleapp2;

public class App {
    public String getGreeting() {
        return "Hello World!";
    }

    public static void main(String[] args) {
        System.out.println(new App().getGreeting());
    }
}

./app/src/test/java/gradleapp2/AppTest.java

/*
 * This Java source file was generated by the Gradle 'init' task.
 */
package gradleapp2;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class AppTest {
    @Test void appHasAGreeting() {
        App classUnderTest = new App();
        assertNotNull(classUnderTest.getGreeting(), "app should have a greeting");
    }
}

(2)タスク一覧の表示(tasks)
 >gradle tasks
 gradleで実行できるタスクの一覧を表示します。

C:\Users\***\Documents\gradleapp2>gradle tasks
 
> Task :tasks
 
------------------------------------------------------------
Tasks runnable from root project 'gradleapp2'
------------------------------------------------------------
 
Application tasks
-----------------
run - Runs this project as a JVM application
 
Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles main classes.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles test classes.
 
Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.
 
Distribution tasks
------------------
assembleDist - Assembles the main distributions
distTar - Bundles the project as a distribution.
distZip - Bundles the project as a distribution.
installDist - Installs the project as a distribution as-is.
 
Documentation tasks
-------------------
javadoc - Generates Javadoc API documentation for the main source code.
 
Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'gradleapp2'.
dependencies - Displays all dependencies declared in root project 'gradleapp2'.
dependencyInsight - Displays the insight into a specific dependency in root project 'gradleapp2'.
help - Displays a help message.
javaToolchains - Displays the detected java toolchains.
outgoingVariants - Displays the outgoing variants of root project 'gradleapp2'.
projects - Displays the sub-projects of root project 'gradleapp2'.
properties - Displays the properties of root project 'gradleapp2'.
tasks - Displays the tasks runnable from root project 'gradleapp2' (some of the displayed tasks may belong to subprojects).
 
Verification tasks
------------------
check - Runs all checks.
test - Runs the test suite.
 
To see all tasks and more detail, run gradle tasks --all
 
To see more detail about a task, run gradle help --task <task>
 
BUILD SUCCESSFUL in 3s
1 actionable task: 1 executed

(3)テストの実行
 > gradle test

(4)JARファイルの作成
 > gradle jar

(5)クラスファイルの実行
 クラスパスにJARファイルのパスを指定してjavaコマンドで実行します。
 カレントディレクトリがプロジェクトフォルダ
 C:\Users***\Documents\gradleapp2
のとき、下記のコマンドでJavaアプリケーションが実行できます。
 > java -jar app/build/libs/app.jar

(6)アプリケーションの実行(gradle run)

7.Webアプリケーションの作成(Eclipse)
 jetty(Java Servletコンテナ/Webサーバ)を使ってWebアプリケーションを作成しようとしたところ、gradle-7.3.1ではjetty pluginが使えないようだったため、Eclipseでgradleプロジェクトを作成します。

(1)プロジェクトの作成
①ファイル>新規>その他

 ここではプロジェクト名:gradleapp3
とします。

②プロジェクトフォルダを選択してマウス右ボタン>プロパティ>プロジェクト・ファセット>「ファセット・フォームへ変換」

 「動的Webモジュール」にチェックし、「より詳しい構成が使用可能」を選択

 コンテンツ・ディレクトリーをsrc/main/webapp
とし、「web.xmlデプロイメント記述子の生成」をチェックします。

 デプロイメント・ディスクリプタ(web.xml)が作成されます。JSP&サーブレットの設定ファイルで、Webアプリケーションの配置情報をXMLで定義します。

「web.xml」

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>gradleapp3</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

(2)index.htmlの作成
「index.html」

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<p>Hello Gradle WebApp !</p>
</body>
</html>

(3)Webアプリケーションの実行
①プロジェクトフォルダを選択してマウス右ボタン>プロパティ>プロジェクト・ファセットで、javaのバージョンを設定します。

②プロジェクトフォルダを選択してマウス右ボタン>実行>サーバで実行を選択し、Tomcat v8.0を選択して「完了」押すと、サーバが起動します。

ブラウザでサーバにアクセス

(4)サーブレットクラスの作成
 上記(2)、(3)では、index.htmlの静的なページの表示でした。ここでは、サーブレットクラスを追加し、サーブレットクラスのレスポンスが表示されることを確認します。
①サーブレットクラスの作成
 src/main/java/gradleapp3配下にサーブレットクラス「HelloMsg.java」を作成します。

 ”「servlet-api.jar」というTomcatライブラリにパスが通っていない。”旨のエラーが表示されるときは、下記のようにビルド・パスを通す必要があります。
 プロジェクトを選択してマウス右ボタン>ビルド・パス>ビルド・パスの構成>「外部JARの追加」
「servlet-api.jar」を選択して「開く」押す。

import javax.servlet・・・のエラーが消えます

「HelloMsg.java」

package gradleapp3;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class HelloMsg
 */
@WebServlet("/HelloMsg")
public class HelloMsg extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * Default constructor.
     */
    public HelloMsg() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//response.getWriter().append("Served at: ").append(request.getContextPath());
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out=response.getWriter();
		out.println("<html>");
		out.println("Hello Gradleapp3!");
		out.println("</html>");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

②サーバを起動
 サーブレットクラスのdoGetメソッドのHTMLレスポンスが表示されます。

ブラウザからアクセス

(参考文献)
・「EclipseではじめるJavaフレームワーク入門 第5版」
 著者:掌田津耶乃 発行:株式会社秀和システム

The end

Linuxの基礎1

目次

1.Linuxディストリビューション
 Linuxの一般ユーザ向けのディストリビューションとしてRedHat系のCentOSとUbuntu/Debian系のUbuntuがあります。カーネル、ライブラリ、シェル、基本コマンドは同じですが、パッケージ管理とデスクトップ環境に違いがあります。
 パッケージ管理の違い

CentOS8.0のデスクトップ環境(GNOME)

CentOS8.0のパッケージグループ一覧
$ yum group list

Ubuntu16.04のデスクトップ環境(GNOME)

Ubuntu16.04のパッケージ一覧
$ dpkg -l | more

2.Linuxの仕組み

2.1 LinuxOSの構成
 LinuxOSの構成を下記に示します。ここでカーネル部分だけを指す場合はLinuxカーネル、システムコンポーネント、ユーザアプリケーションも含めたシステム全体をLinuxシステムと呼びます。

(1)Linuxカーネル
 Linuxカーネルはカーネルモードで動作(カーネル空間で実行され、ユーザ空間からはアクセスできない)するソフトウエアで主に以下の機能があります。
①プロセススケジューリング
 プロセスのライフサイクル(生成、実行可能、実行、待機、停止)を管理します。
②プロセス間通信
 プロセスは他のプロセスやカーネルと相互に通信することで自らの作業を行う。通信の仕組みとして、シグナル、パイプ、セマフォ、メッセージ、共有メモリなどがあります。
③メモリ管理
 プロセスにメモリを割り当てます。また物理メモリなどのストレージを仮想メモリとして管理して、巨大なアドレス空間の確保、プロセス毎に仮想アドレス空間を分けるなどデータ保護、複数のプロセスで共有できる仮想メモリなどの機能を有します。
④仮想ファイルシステム
 様々なブロックデバイス(ファイル)を単一(ドライブ番号やドライブ名といったデバイス識別子を使わない)の階層的なツリー構造に統合します。またブロックデバイスの操作の違いをブロックデバイスのデバイスドライバが担うことで、どのブロックデバイスも同じ方法でファイルとして操作できます。
⑤ネットワークシステム
 BSDソケット(BSD系UNIXを起源とするAPI)でIPベースのTCP/UDPプロトコルとネットワークデバイスとしてEthernet、PPP、SLIPをサポートします。
⑥デバイスドライバ
 デバイス間の差異を吸収し、カーネルが処理できるようにするカーネルのモジュールです。
 すべての物理デバイスは独自のハードウェア制御するコントローラを持っています。デバイスドライバはそのコントローラのデバイス間の差異を吸収して、同じ方法で操作あるいは管理できるようにするソフトウェアでメモリに常駐する共有ライブラリです。

(2)システムライブラリ
 システムライブラリはアプリケーションからカーネルを呼び出すために利用するシステムコールです。

(3)システムコンポーネント
①initデーモン
 メモリに常駐し、ファイルで指定されているプログラムを起動します。
②システムデーモン
 sshd(Secure Shell demon)はメモリに常駐して、sshクライアントから実行されたコマンドを実行します。
③ウィンドウマネージャー
 デスクトップ環境を提供します。

(4)ユーザアプリケーション
①シェル
 Linuxカーネルへ要求を伝達するプログラムです。シェルにはsh (Bourne shell/Bシェル)、bash(Bourne-Again shell)などがあります。またシェルへ送るコマンドの集まりをシェルスクリプトと言いいます。 
②ミドルウェア
 ミドルウェアは、オペレーティングシステムの機能の拡張、あるいはアプリケーションソフトウェアの汎用的(共通的)な機能を集めたソフトウェアです。(引用:Wikipedia)
③ライブラリ
 ライブラリは、汎用性の高い複数のプログラムを再利用可能な形でひとまとまりにしたソフトウェアです。(引用:Wikipedia)

2.2 LinuxOSの起動と停止
(1)起動
 起動は下記の順に行われます。

 systemdはカーネルが生成する最初のユーザプロセスで、デーモンの起動・停止、サービスの起動・停止、ファイルシステムのマウントなどのシステムの設定、システムの管理を行います。システム起動した後は、「systemctl」コマンドでsystemdプロセスにメッセージを送ることでシステムの管理を行います。

(2)シェル
 シェルはLinuxカーネルとユーザの仲立ちをするユーザインターフェースでコマンドプロンプトから入力されたコマンドを解釈してコマンドを実行します。シェルにはsh、bashなどがあります。
 シェルに組み込まれたコマンド(/bin/bash)の他、外部コマンド(/bin、/sbin)があります。
 現在使用しているシェルは、
 $ echo $SHELL
で確認できます。また、使用可能なシェルは
 $ cat /etc/shells
で確認できます。

 シェルは組み込みコマンドでないときは、環境変数PATHに登録されたディレクトリで探します。
 現在のパスの表示は下記のコマンドを実行します。
 $ echo $PATH
 環境変数の一覧の表示は下記のコマンドを実行します。
 $ export -p

(3)サービス管理
 systemdは多くのLinuxディストリビューションで使われているinitシステム(Linuxカーネルのブート後に起動させるコンポーネント)で、Unitという単位で管理して設定ファイルとして持ちます。
 起動時のシステムの設定やサービスの起動などはsystemdが行い、起動後はsystemctlコマンドでsystemdにD-busでメッセージを送って管理を行います。
 systemdを管理するための主なコマンドを下記に示します。
①全てのユニットファイルの表示
 systemdがロードしないものを含め、systemdパス内の利用可能な全てのユニットファイルの表示は下記のコマンドを実行します。
 # systemctl list-unit-files
②サービスの一覧
 # systemctl list-unit-files –type service
③ロード済みサービスの一覧
 # systemctl list-units –type service

(4)サービスの起動と停止
 # systemctl {サブコマンド}[サービス]
(例)apache2.service
①ユニット状態の表示
 # systemctl status apache2

②サービスの停止
 # systemctl stop apache2

③サービスの起動
 # systemctl start apache2

④サービスの再起動
 # systemctl restart apache2
⑤サービスの有効化と無効化
 systemdのブート時にサービスを自動的に起動するためには、enableコマンドでサービスを有効にします。
 # systemctl enable apache2
 サービスの自動起動を無効にするためにはdisableコマンドでサービスを無効にします。
 # systemctl disable apache2

(5)サービス設定ファイル(ユニットファイル)
 ユニットファイルは下記のコマンドで表示できます。
 $ systemctl cat [サービス]
 (例)
 $ systemctl cat apache2.service

(6)systemctlによる停止、電源OFF、再起動
①停止
 # systemctl halt 
②電源OFF
 # systemctl poweroff
③再起動
 # systemctl reboot

(7)shutdownコマンドによる電源OFF
 # shutdown now

3 ファイル操作
(1)ファイルの作成
 $ touch [オプション] ファイル名
 オプション:
  -i:[[CC]YY]MMDDhhmm[ss]形式のタイムスタンプに変更
  -a:アクセス日時のみ変更
  -m:更新日時のみ変更
(2)ファイルの削除
 $ rm [オプション] ファイル名
 オプション:
  -i:削除前にユーザに確認する
  -f:ユーザに確認無しで削除する
(3)ディレクトリの作成 
 $ mkdir ディレクトリ名

(4)ディレクトリの削除 
 $ rm [オプション] ディレクトリ名
 オプション:
  -i:削除前にユーザに確認する
  -f:ユーザに確認無しで削除する
  -R:指定されたディレクトリ内のファイル、ディレクトリも全て削除する

(5)ファイル・ディレクトリの移動
・ファイルの移動
 $ mv [オプション] 移動元ファイル名 移動先ディレクトリ名
・ディレクトリの移動
 $ mv [オプション] 移動元ディレクトリ名 移動先ディレクトリ名
 オプション:
  -i:上書きを確認する
  -f:強制的に上書きする

(6)標準入出力
 全てのプロセスには起動時に標準入力、標準出力、標準エラー出力が作成され、デフォルトは標準入力:キーボード、標準出力/標準エラー出力:コマンドを実行した端末になります。
 標準出力、標準エラー出力をリダイレクションとファイル記述子で出力先を変えることができます。 
(例)$ ls sample1 sample2 1> list 2> error
 カレントディレクトリのリストを「list」に格納し、エラーを「error」に格納する。
(例)$ cat < sample1 | head -3
 ファイルの内容をcatコマンドに取り込み、catコマンドの標準出力をパイプでheadコマンドの標準入力とする。
 ファイルの3行目までが端末に表示されます。 

(7)パーミッション
 ユーザは1つ以上のグループに属し、ユーザとグループでファイル所有者の管理を行います。また、ファイルやディレクトリは「誰に」「どのような操作」を許可するかを設定することができます。
・ログインしているユーザの所属グループの表示 
 $ groups
・ユーザ名を指定して所属グループの表示
 $ groups [ユーザ名]
・ログインしているユーザとグループの表示
 $ id [ユーザ名]
・パーミッションの確認
 $ ls -l
  drwxrwxr-x 2 **** **** 4096 12月 10 22:05 .
  -rw-rw-r– 1 **** **** 113 12月 10 21:30 error
  1列目:ファイルの種類(-:通常ファイル、d:ディレクトリ、l:シンボリックリンク)
  2列目-4列目:ユーザ(所有者)のアクセス権限
  5列目-7列目:ユーザが所属するグループのアクセス権限
  8列目-10列目:その他のアクセス権限    
 アクセス権限の3列は、順に読み込み、書き込み、実行の権限で、許可は「r」(読み込み)、「w」(書き込み)、「x」(実行)、無許可は「-」で表わす。
・パーミッションの変更
 $ chmod [オプション] モード ファイル名
 オプション:
  -R:ディレクトリに指定した場合にサブディレクトリを含めて再帰的にパーミッションが変更される。
 パーミッションの設定方法は、シンボリックモードとオクタルモードの2通りあります。
①シンボリックモード 
 (例)$ chmod a+x,g-w sample1
 ユーザ、操作、パーミッションの組み合わせで設定します。
ここで、ユーザは「u」:所有者、「g」:グループ、「o」:その他、「a」:全てのユーザ、操作は「+」:許可、「-」:許可を削除、パーミッションは「r」:読み取り権、「w」:
書き込み権、「x」:実行権とします。

②オクタルモード
(例)$ chmod 755 sample1
 パーミッションを8進数の数値で設定します。
 (4:読み取り権、2:書き込み権、1:実行権、0:権限無し)
 1列目:所有者の権限、2列目:グループの権限、3列目:その他の権限とします。
 上記の例では、所有者は7=4(:読み取り権)+2(:書き込み権)+1(:実行権)で、グループとその他ユーザは5=4(:読み取り権)+1(:実行権)となります。

(8)ファイル編集(viエディッタ)
 テキスト編集用のエディッタです。
 $ vi ファイル名
 使用方法はここでは記載しません。
 下記サイトを参考にさせていただきました。
 https://vim.jp.net/

4.ユーザ管理
 ログインユーザとして、管理者(root)と一般ユーザがあります。
(1)ユーザの登録
 $ useradd[オプション]ユーザ名
 オプション:
  -g:グループid(プライマリーグループ)
  -m:ホームディレクトリを作成する
  -M:ホームディレクトリを作成しない
  など
(例)
 # useradd testuser
 オプションを指定しないでコマンドを実行したときはデフォルト値(下記)で作成されます。
 $ cat /etc/default/useradd

(2)パスワードの設定
 $ passwd [オプション] [ユーザ名]
 オプションを省略したときは、対話形式でパスワードの設定を行います。

(3)ユーザアカウントの削除
 $ userdel [オプション] ユーザ名
 オプション:
  -r:ユーザのホームディレクトリを削除します。

(4)ユーザ一覧の表示
 $ less /etc/passwd
 (例)

(5)グループの新規作成・変更・削除
 Linuxは一つのコンピュータを複数のユーザで使うことを前提に作られているため、ファイルやディレクトリにパーミッション(権限)がグループ単位で設定できるようになっている。
 ユーザーは必ず1つ以上のグループに所属し、メインのプライマリーグループ(一般的にはユーザー名と同じグループ名で登録)とサブのセカンダリグループ(複数持てる)がある。
①グループの作成
 # groupadd [-g グループID] グループ名
 オプション:
  -g:オプションを指定しないときは、現在使用されている最大値+1が設定される
②グループの削除
 # groupdel グループ名
③グループ一覧
 $ cat /etc/group
 (例)

④グループの変更
 $ groupmod [オプション] 変更するグループ名
  オプション:
   -n 変更後グループ名:グループ名の変更
   -g 変更後グループID:グループIDの変更
   -p 変更後パスワード:パスワードの変更

(6)所属グループの変更
 $ usermod [オプション] ユーザー名
  オプション:
   -g グループ名:プライマリーグループの変更
   -G グループ名,…:セカンダリグループの変更、複数ある場合は「,」で区切って指定)、追加は-aオプションを同時に指定(-aG グループ名)する。

(7)ログイン管理
 Linuxでは複数のユーザで利用することを前提にしているため、アカウントの有効期限の設定やアカウントのロックなどを行うことができるようになっています。 
①アカウントのロック  
 # usermod -L ユーザ名
 又は
 # passwd -l ユーザ名
②ログインユーザの表示
 $ who、又は$ w
 現在ログインしているユーザを表示します。
 wコマンドは、カレントプロセスなども表示します。
③ログイン履歴の表示
 $ last

5.スクリプト
 シェルスクリプトはシェルを使って複数の処理をまとめて行うインタプリタ型のプログラムです。
(1)シェルスクリプトの作成
 1行目にはシェルスクリプトを実行するインタプリタを記述(シバンと呼びます)します。
 #! /bin/bash
(2)シェルスクリプトの実行
 $ ./シェルスクリプト
 シバンと呼んでインタプリタを起動します。
 $ bash [オプション]シェルスクリプト
 インタプリタを指定して、インタプリタを起動します。
  オプション:
   -n:文法エラーがないかチェックします
   -e:実行時エラーになったときエラーを返して実行を停止します。
   -x:シェルスクリプトで実行した内容を1ステップ毎にコマンドライン上に表示します。
(3)引数と特殊変数
 シェルスクリプトは特殊変数($0,$1~$n,・・・)を持ち、実行時の引数を取得したり、スクリプトの実行に利用されます。使える特殊変数には以下のようなものがあります。
 $0: シェルスクリプトのファイル名
 $1~$n:シェル引数の値。$1は第1引数、$2は第2引数…。
 $#: シェル引数の数
 $*:$0以外の引数を全て一つの文字列として格納。
 $$: 実行時のシェルのプロセスIDを格納。
 $?:終了ステータスで成功「0」、失敗「1」を格納。
などがあります。

6.システム管理

6.1 パッケージ管理
 Linuxではソフトウエアをプログラム、ライブラリ、設定ファイル、ドキュメントなどをまとめたパッケージ単位で管理します。このパッケージのインストール、アンインストールなどはパッケージ管理システムを使い、Linuxディストリビューションによってパッケージ形式が異なります。

6.2 CentOSのパッケージ管理

(1)パッケージ情報の表示
 # rpm [オプション] パッケージ
  オプション:
   -q,–query:指定したパッケージのバージョンの表示
   -a,–all:インストール済のrpmパッケージ情報を一覧表
   -i,–info:指定したパッケージの詳細情報を表示
   他

(2)パッケージのインストール、アンインストール
 # rpm [オプション] パッケージ
  オプション:
   -i,–install:パッケージのインストール(アップデートは行わない)。依存関係のあるパッケージがインストールされていないときはインストールを中断する。  
  -U,–upgrade:パッケージをアップグレードする
  -F,–freshen:パッケージをアップデートする
  -e,–erase:パッケージを削除する。他のパッケージに依存するときは削除を中断する。

(3)yumコマンド
 rpmパッケージを管理するユーティリティで、パッケージの依存関係を自動的に解決して、パッケージのインストール、削除、アップデートを行う。
 yumコマンドはインターネット上のリポジトリと通信してパッケージの管理を行う。
 また、yumコマンドを改善したDNF(Dandified Yum)コマンドもあります。
 $ yum [オプション] コマンド [パッケージ名など]
  オプション:
   -v –verbose: 詳細メッセージを出力する
  コマンド:
   install: 指定したrpmパッケージをインストールする
   remove:指定したrpmパッケージを削除する
   update:インストール済のrpmパッケージで更新可能なもの全て更新する
   upgrade:システム全体のパッケージのリリースバージョンアップを行う
   info:指定したrpmパッケージの詳細を表示する
   list:利用可能な全てのrpmパッケージ情報を表示する
   search:指定したキーワードでrpmパッケージの検索結果を表示する

(4)CentOSのリポジトリ
 リポジトリにはCentOSで公式にサポートされているパッケージを提供する標準リポジトリと、サードパーティによるパッケージを提供する外部リポジトリがあります。
 標準リポジトリは下記のディレクトリにインストールされます。
 # ls -l /etc/yum.repos.d

(5)CentOSの標準リポジトリミラーサイト
 Mirror List
 https://www.centos.org/download/mirrors/

6.3 Ubuntuのパッケージ管理
 Debian形式(.deb)のパッケージの管理を行う

(1)パッケージ情報の表示
 # dpkg [オプション] アクション
  オプション:
   -l,–list:指定したパターンにマッチするパッケージの一覧表示
   -L,–listfiles:指定したパッケージ名でインストールされたファイルの一覧表示

(2)パッケージのインストール、アンインストール
 # dpkg [オプション] アクション
  オプション:
   -i,–install:パッケージのインストール  
   -r,–remove:設定ファイルは残してパッケージを削除する。
   -P,–purge:設定ファイル含めてパッケージを削除する。

(3)aptコマンド
 deb形式のパッケージを管理するユーティリティで、パッケージの依存関係を自動的に解決して、パッケージのインストール、削除、アップデートを行う。
 aptコマンドはインターネット上のリポジトリと通信してパッケージの管理を行う。
 $ apt [オプション] サブコマンド
 サブコマンド:
  install: 指定したパッケージをインストールする
  remove:設定ファイルは残して、指定したrpmパッケージを削除する
  purge:設定ファイル含めてパッケージを削除する。
  update:パッケージインデックスファイルとソースの同期を行う
  upgrade:システムにインストールされている全てのパッケージを最新バージョンにアップグレードする。
  show:指定したパッケージの詳細を表示する
  list:利用可能な全てのパッケージ情報を表示する
  search:指定したキーワードでパッケージの検索結果を表示する

(4)Ubuntuのリポジトリ
 Ubuntuのリポジトリはaptコマンドによって新たにパッケージをインストールするときなどにアクセスされます。
 下記のディレクトリにリポジトリの設定ファイル(sources.list)が配置されます。
 # ls -l /etc/apt

「sources.list」
 リポジトリのURLなどが記載されています。

7.ディスクの管理
 1台の物理的なディスクを複数の独立した論理的なデバイスとして扱えるようにする操作をパーティションニングといい、分割された領域をパーティションといいます。
 パーティションに分けることでパーティション単位のバックアップなどが行えるようになります。

(1)デバイスファイル
 デバイスへアクセスするためのデバイスファイルは/devディレクトリ配下におかれ、デバイスの規格によってデバイスファイル名が決められます。
 ハードディスクはIDE,SATAなどの規格があり、SATAの場合はコントローラの1番目のポート(Port0)に接続されたディスクは/dev/sdaとなります。 

(2)ディスクパーティションの形式 
 ディスクパーティションの形式にはMBR(Master Boot record)とGPT(GUID Partition Table)があります。
 パーティション管理ツールとして、MBRパーティション管理用のfdiskとGPTパーティション管理用のgdiskがあります。

(3)MBRパーティション管理(fdisk)
 パーティションの表示は下記のコマンドで行います。
# fdisk -l

(4)ファイルシステム
 パーティション内にファイルを配置できるようにするために、パーティション内にファイルシステムを作成します。 
 ファイルシステムは、xfs(CentOS)、ext4(Ubuntu)などがあります。 
 ファイルシステムの種類は下記コマンドで確認できます。
 $ df -T

(5)マウント
 マウントはあるディレクトリにあるパーティションを接続する操作のことで、マウントすることで/(ルート)からのアクセスが可能となります。
 # mount [オプション] [デバイスファイル名(ファイルシステム)] [マウントポイント(ディレクトリ)]
 オプション:
  -oプション,–optionsオプション:マウントオプション(「,」区切りで複数指定可能)
  -r,–read-only:読み込み専用でマウントする
  -w,–rw:読み書き可能な状態でマウントする(デフォルト)
(例)デバイスをマウント
 # mount /dev/sdb1 /usr/local/data1
(例)usbをマウント
 ・デバイスが認識されていることを確認する
  $ dmesg
  dmesgコマンドはカーネルリングバッファのデータを表示するためのコマンド。

・# mount (デバイスファイル名) /mnt

(6)アンマウント
 # umount マウントポイント

8.ネットワーク管理
 ネットワークの設定はネットワークマネージャーで行います。
(1)ネットワークに関する設定ファイル
 ①/etc/services
  サービス名とポート番号の対応
 ②/etc/protocols
  プロトコル番号の一覧
 ③/etc/hosts
  ホスト名とIPアドレスの対応

(2)NetworkManager
 ネットワークの設定は、コンソール上で対話形式のツールのnmtui(NetworkManager Text User Interface)とコマンドベースのnmtcli(NetworkManager Command Line Interface)による方法があります。
①nmtuiによる設定
 $ mntui

②nmcli
 $ nmcli [オプション] オブジェクト
 オブジェクト:
  device:ネットワークデバイスと接続状態の表示
  connection:ネットワークデバイスの接続一覧表示
  radio:ネットワークの接続状態の表示

(3)ネットワーク監視コマンド
 iproute2パッケージのコマンドについて記載します。
 ip [オプション] オブジェクト [サブコマンド]
  オプション:
   -s:情報を詳しく表示する
  オブジェクト
   addr:ネットワークデバイスのIPアドレス
   route:ルーティングテーブルのエントリー
   link:ネットワークデバイス
 (例)
 ・デバイスの設定の一覧表示
  $ ip addr 
 ・指定したデバイスに設定されているIPアドレスの表示
  $ ip addr show dev enp0s3
 ・IPアドレスの追加
  $ ip addr add 192.168.2.101/24 dev enp0s3
 ・IPアドレスの追加
  $ ip addr del 192.168.2.101/24 dev enp0s3

(参考文献)
・The Linux Kernel
http://archive.linux.or.jp/JF/JFdocs/The-Linux-Kernel-6.html
・「本気で学ぶLinux実践入門」
著者:大竹龍史、山本道子 発行:SBクリエイティブ株式会社

The end

JAX-RSでRESTfulAPIの実装

目次

1.RESTfulAPIとは
 REST API (RESTful API) は、REST(Representational State Transfer)アーキテクチャに従い、 コンピュータで提供されるサービスとの対話を可能にするAPIです。RESTはプロトコルなど決められた仕様があるわけではなく、API設計のガイドラインです。
 RESTの4原則(Roy Fielding氏が2000年に提唱)はWebAPIの設計で考えると、
①ステートレスなクライアント/サーバプロトコル
 リクエスト(メッセージ)はその内容を理解するために必要な全ての情報を含むこと。このため、メッセージ間におけるセッションの状態を管理する必要がなく、シンプルな設計にできます。
②すべてのリソースに適用できる定義された操作のセット
 情報(リソース)を操作できる命令(”GET”、”POST”、”PUT”、”DELETE” などに相当するもの)が定義されていること。
③リソースを一意に識別する「汎用的な構文」
 すべてのリソースはUniform Resource Identifier (URI) で一意的に識別できること。
④情報と状態遷移の両方を扱うことができる「ハイパーメディアの使用」
 情報の一部として、別の状態や別の情報への参照を含めることができる。
(参考:Wikipedia「Representational State Transfer」)

2.WebAPIの設計
 RESTアーキテクチャに従い、WebAPIを考えることとします。

2.1 前提条件
 WebAPIは、通信ネットワークを介したリモートのコンピュータ(Webサーバ、又はHTTPサーバ)にあるリソースを要求するためのAPIです。Web APIでは通常、要求メッセージにHTTPを使用し、応答メッセージの構造を定義します。 
 応答メッセージの形式として、通常XMLまたはJSONがあります。ここでは、リクエストにHTTP、応答メッセージの構文としてJSON形式とします。

2.2 前提知識
(1)HTTPプロトコルについて
 ブラウザからHTTPでWebサーバにコンテンツを要求するときの電文は下図のようになります。

 HTTPプロトコルはクライアントからのリクエスト(要求)とサーバからのレスポンス(返信)でデータの受け渡しを行います。
 下記にリクエストとレスポンスの構造を示します。

 ブラウザとWebサーバ間で使うHTTPのメソッドはGETとPOSTの2つで以下のように使い分けています。
①GET
 URLの後にデータ(テキストのみ)を付加して送信します。 
 このため、検索フォームをGET送信するとURLの末尾に「/?パラメーター=値&パラメーター=値・・・」が付加され、履歴から再度検索することなどができます。
②POST
 POST送信はボディ部にデータ(テキスト、バイナリ)を付加するため、URIの履歴に残りません。履歴に残さないフォームの送信時に使います。
 HTTPにはGET、POSTメソッドの他、PUT、DELETEなどがあります。
(参考)
・RFC 2616: Hypertext Transfer Protocol — HTTP/1.1
 https://www.ietf.org/rfc/rfc2616.txt

(2)JSON形式
 JSON(JavaScript Object Notationの略)はJavaScriptのオブジェクトの表記方法の一つでテキスト形式のファイルをJSONファイル(拡張子は.json)といいます。
 JSONは{}の中にキーと値をコロンで区切って記述します。
 キーは必ずダブルクォーテーションで囲む必要があります。
 キーの値は、
 ・文字列 {“name”:”suzuki”}
 ・数値 {“id”:1}
 ・null {“id”:null}
 ・bool値 {“s1″:true,”s2”:false}
 の型が使えます。
  また、値を入れ子にするときは
 ・オブジェクト
  {“id”:1,”mdata”:{“name”:”suzu”,”age”:50}}
 ・配列
  {“id”:1,”code”:[100,300,700]}
 のようにオブジェクトと配列の型が扱えます。

2.3 設計
(1)リソースを決定
 APIの利用者が必要としている情報(リソース)を決めます。天気の情報では、観測地点(緯度経度)、気温、湿度、気圧などが該当します。

(2)リソースに対して提供する操作
 一般ユーザ向けのサービスでは参照のみと思いますが、決められたメンバーを対象とするサービスでは参照、新規登録、更新、削除などが考えられます。

(3)リソースの構造
 WebAPIで定義する操作をデータベースへの登録(新規、更新)、検索、削除を前提にする場合は、データベースの設計(データの正規化など)において、WebAPIの操作とリソースに対してWebサーバ側のデータが一意的に決まるようにしますが、WebAPIで扱うリソースの対象がデータベースにあるものとは限りません。WebAPIのリソース間の親子関係について不整合が生じないようにリソースの構造を決める必要があります。

(4)URI(Uniform Resource Identifier)の設計
 リソースの操作はHTTPメソッドで指示するようにします。 
 APIと分かるようなURIにします。

2.4 公開されているAPIの例
(1)都道府県内市区町村一覧取得API
 HTTPメソッド:GET
 URI:
 https://www.land.mlit.go.jp/webland/api/CitySearch?<パラメータ>
 パラメータ:都道府県コード
(例)東京都内の市区町村一覧を取得する
 https://www.land.mlit.go.jp/webland/api/CitySearch?area=13

(引用)
・API操作説明 – 土地総合情報システム – 国土交通省)
 https://www.land.mlit.go.jp/webland/api.html

(2)NHK番組表API
 HTTPメソッド:GET
 URI:
https://api.nhk.or.jp/v2/pg/list/{area}/{service}/{date}.json?key={apikey}
 パラメータ:
  area:地域ID(3byte)
  sercice:サービスID(2byte)
  date:日付(YYYY-MM-DD形式、当日から1週間先までの日付を指定)
apikey:APIキー(32byte)、ユーザに割り当てられる

 (例)area:130:東京、g1:NHK総合1
 https://api.nhk.or.jp/v2/pg/list/130/g1/2021-12-04.json?key=・・・

(引用)
・NHK番組表API
 https://api-portal.nhk.or.jp/

3.Jerseyを使ったWebアプリの実装
 ここではJAX-RS(Java API for RESTfulServices)フレームワークであるJerseyを使ったRESTfulServicesを作成します。

3.1 開発環境
 Windows10Pro(64bit)
 下記のソフトがインストールされている
 ・Apache Maven 3.8.4
 ・Eclipse JavaEE IDE Version: 2020-12 (4.18.0)
 ・Java version “15.0.2”

3.2 Jerseyのプロジェクト作成
 Jersey(ジャージー)はJAX-RSフレームワークの一つです。ここではjersey-quickstart-webappmavenアーキタイプを使用して、jerseyRESTful APIWebアプリケーションを作成します。
(1)Mavenによるプロジェクトの作成
 Webアプリケーションのプロジェクトを作成します。
 コマンドプロンプトで下記のコマンドを入力します。

mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-webapp -DarchetypeGroupId=org.glassfish.jersey.archetypes

ここでは、
 grpupId:test
 artifactId:jaxrs-sample1
とします。

下記のプロジェクトフォルダが作成されます。

 MavenはJavaのビルドツールの一つでxmlファイルに記述することでライブラリのインストールなどが行えます。

(本サイト内のコンテンツ)
Mavenプロジェクトの作成(javaビルドツール)

(2)Eclipseにインポート
 ①mvnコマンドで作成したプロジェクトフォルダをEclipseで使えるようにします。
 > cd jaxrs-sample1
 > mvn eclipse:eclipse

②Eclipseにインポート
 ファイル>インポート

③Mavenプロジェクトに変換
 プロジェクト・エクスプローラーでプロジェクトを選択し、右ボタンのメニューから構成>「Mavenプロジェクトへ変換」を選択します。

 JAX-RSのプロジェクトにはデフォルトではサーブレットAPIが組み込まれないためエラーになりますが、ここではサーブレットは使わないため問題ありません。

 JSP/サーブレットを使うときはpom.xmlのに追加します。

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
</dependency>

④サーバを起動


 エラーの原因はmavenプロジェクト生成時に作成されたClassファイル「MyResource.java」において、importで指定するライブラリがJakarta EEのものとなっていました。
 また、jerseyのバージョンが3.xとなっていたため、2.xに修正します。
 javaEE(JakartaEE)のJerseyのバージョン
  Jakarta EE 9 :Jersey 3.x 
  Java EE8,EE11 :Jersey 2.x

・「MyResource.java」の修正

/* 修正前
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
*/
/* 修正後 */
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

:

・「pom.xml」の修正

<!-- 修正前 -->
<properties>
    <jersey.version>3.0.3</jersey.version>
</properties> 

<!-- 修正後 -->
<properties>
    <jersey.version>2.22.1</jersey.version>
</properties>

 「MyResource.java」と「pom.xml」を修正してリソースにアクセスできるようになりました。

(3)リソースファイルについて
 ・「MyResouce.java」

package test;
/*
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
*/

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

/**
 * Root resource (exposed at "myresource" path)
 */
@Path("myresource")
public class MyResource {

    /**
     * Method handling HTTP GET requests. The returned object will be sent
     * to the client as "text/plain" media type.
     *
     * @return String that will be returned as a text/plain response.
     */
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public Employee getIt() {
    	return "Got it!";
    }
}

・アノテーション
①@Path(“myresource”)
 URIは「http://localhost:8080/jaxrs-sample1/webapi/myresource」でリソースにアクセスできます。
 @Pathはこのクラスをマッピングするパスを指定します。
 また、web.xmlのでJerseyのサーブレットをマッピングします。

<servlet-mapping>
    <servlet-name>Jersey Web Application</servlet-name>
    <url-pattern>/webapi/*</url-pattern>
</servlet-mapping>

②HTTPリクエストのJavaメソッドへのマッピング用javax.ws.rsアノテーション
 @GET:HTTPのGETメソッドでアクセスされたとき呼び出されるメソッドで、URIにより識別されるリソースをクライアントに送信します。
 @PUT:URIで識別される特定のリソースの作成(主に更新)を行います。
 @DELETE:URIで識別されるリソースを削除します。
 @POST:URIで識別される特定のリソースの作成(主に新規)を行います。
 @HEAD:GETと同じ役割でレスポンス・ヘッダーのみを返し、メッセージはありません。
③ @Produces(MediaType.TEXT_PLAIN)
 サービスが返すメディアタイプを指定することで、指定された型式でクライアントに返すことができます。

3.3 リソースファイルの改造
 jersey-quickstart-webappmavenアーキタイプではテキストを返すのみでしたが、URIで指定したパラメータに従ってリソース(JSONファイル)を返すように改造します。
(1)RESTAPIのURI仕様
 ・リクエスト
  GET /webapi/myresource/{id}/{name}
・レスポンス
  JSON形式{“id”:id,”name”:name} 

(2)改造内容
 ・「MyResource.java」

package test;
/*
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
*/

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

/**
 * Root resource (exposed at "myresource" path)
 */
@Path("myresource")
public class MyResource {

    /**
     * Method handling HTTP GET requests. The returned object will be sent
     * to the client as "text/plain" media type.
     *
     * @return String that will be returned as a text/plain response.
     */
    @GET
    //@Produces(MediaType.TEXT_PLAIN)
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/{id}/{name}")
    public Employee getIt(@PathParam("id") int id,@PathParam("name") String name) {
    	Employee employee = new Employee(id, name);
    	return employee;
        //return "Got it!";
    }
}

 ・「Employee.java」

package test;

public class Employee {
	  /** 番号 */
	  public int id;
	  /** 名前 */
	  public String name;
	  /**
	   * コンストラクタ
	   * @param id 番号
	   * @param name 氏名
	   */
	  public Employee(int id, String name) {
	      this.id = id;
	      this.name = name;
    }
}

 ・「pom.xml」
 Jersey(ジャージー)の拡張モジュール「jersey-media-json-jackson」の追加します。Java オブジェクトと JSON の相互変換を行います。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>test</groupId>
    <artifactId>jaxrs-sample1</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>jaxrs-sample1</name>

    <build>
        <finalName>jaxrs-sample1</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <inherited>true</inherited>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.glassfish.jersey</groupId>
                <artifactId>jersey-bom</artifactId>
                <version>${jersey.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet-core</artifactId>
            <!-- use the following artifactId if you don't need servlet 2.x compatibility -->
            <!-- artifactId>jersey-container-servlet</artifactId -->
        </dependency>
        <!-- uncomment this to get JSON support
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-binding</artifactId>
        </dependency>
        -->
        <dependency>
        	<groupId>org.glassfish.jersey.media</groupId>
        	<artifactId>jersey-media-json-jackson</artifactId>
        </dependency>
    </dependencies>
    <properties>
        <jersey.version>2.22.1</jersey.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
</project>

リクエストGET /webapi/myresource/{id}/{name}のレスポンスとして、JSON形式{“id”:id,”name”:name}が返ります。

(参考文献)
・JAX-RSフレームワーク
 https://ja.wikipedia.org/wiki/JAX-RS

・Oracle® Fusion Middleware Oracle WebLogic Server RESTful Webサービスの開発と保護
 2 RESTful Webサービスの開発
https://docs.oracle.com/cd/E92951_01/wls/RESTF/develop-restful-service.htm

・「EclipseではじめるJavaフレームワーク入門 第5版」
 著者:掌田津耶乃 発行:株式会社秀和システム

The end

Mavenプロジェクトの作成(javaビルドツール)

目次

1.Mavenとは
 Apatch Mavenはプロジェクト管理ツール(ビルドツール)で、プロジェクトの作成、ライブラリの管理、プログラムのビルド、テスト、実行、デプロイなど一連の開発に必要な作業ができます。
・Mavenでは開発に必要な要素をPOM(Project Object Model)のファイル(pom.xml)に記述します。
・Mavenのプロジェクトのディレクトリ構成は決まっています。
・MavenはPOMファイルに記述されたライブラリなどを参照して、リモートリポジトリから自動的にローカルのリポジトリにダウンロードしてプロジェクトに組み込みます。その ローカルリポジトリのライブラリなどを参照してビルドを行います。

2.Mavenの準備
 下記はWindowsで使用する場合の説明です。
(1)Mavenのダウンロード
 https://maven.apache.org/

 バイナリファイルをダウンロードして、圧縮ファイルを展開します。

バイナリファイルを任意の場所に配置
(C:\Users***\Documents\apache-maven-3.8.4\)

(2)環境変数の追加
 コントロールパネル>システムとセキュリティ>システム>システムの詳細設定>環境変数

 Path>編集>新規ボタンでbinフォルダがあるディレクトリを設定します。
 ここでは、
 C:\Users***\Documents\apache-maven-3.8.4\bin
を設定し、Windowsを再起動します。

3.Mavenプロジェクトの作成
(1)コマンドプロンプト
 プロジェクトフォルダを作成するディレクトリに移動して下記のコマンドを実行します。
 > mvn archetype:generate

Enter押す

 デフォルト値でEnter押す
 ここでは、groupId:test、artifactId:sample1、version:デフォルト値、package:デフォルト値(groupIdが設定される)とします。

修正なければEnter押します。
下記の構造のプロジェクトフォルダが作成されます。

main/java/test/App.java

package test;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
    }
}

test/java/test/AppTest.java

package test;

import static org.junit.Assert.assertTrue;

import org.junit.Test;

/**
 * Unit test for simple App.
 */
public class AppTest 
{
    /**
     * Rigorous Test :-)
     */
    @Test
    public void shouldAnswerWithTrue()
    {
        assertTrue( true );
    }
}

(2)pom.xmlの作成

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>test</groupId>
  <artifactId>sample1</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>sample1</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
    	<plugin>
			<groupId>org.codehaus.mojo</groupId>
			<artifactId>exec-maven-plugin</artifactId>
			<configuration>
			<mainClass>test.App</mainClass>
			</configuration>
		</plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

・ライブラリの追記
 <dependencies>タグ
 プロジェクトで必要なライブラリをタグで追加します。

   <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

(ここに追加します)

  </dependencies>

・プラグイン情報の追記 
 <plugins> ~ </plugins>の中に<plugin>~</plugin>で
Mavenに組み込むプログラムを記述します。

	<plugin>
			<groupId>org.codehaus.mojo</groupId>
			<artifactId>exec-maven-plugin</artifactId>
			<configuration>
			<mainClass>test.App</mainClass>
			</configuration>
	</plugin>

 exec-maven-pluginは、javaのアプリケーションプログラムを起動するプラグインです。
 <configuration>タグに<mainClass>で起動するアプリケーションを指定します。

(3)Mavenのコマンド
 Mavenコマンドで下記の操作が行えます。
 ①プログラムのコンパイル
  > mvn compile

 targetフォルダが作成され、その中にclassファイルが作成されます。

②プログラムのインストール 
 ビルドしたプログラムをローカルリポジトリにインストールします。
 > mvn install
③Jarファイル作成
 プログラムをJarファイルにまとめます。またWarファイルにまとめることもできます。
 > mvn package
④ユニットテストの実行
 > mvn test
⑤mvn exec:java
 javaアプリケーションを実行します。 
 exec-maven-pluginが組み込まれているときに使えます。

⑥Eclipseプロジェクトとして利用
 Eclipseのプロジェクトとしてインポートして使えるようにします。
 > mvn eclipse:eclipse

・EclipseにMavenプロジェクトを取り込む
Eclipseのインポート>一般>「既存プロジェクトをワークスペースへ」を選択

 ルート・ディレクトリにMavenプロジェクトがあるフォルダを指定すると、Eclipseのワークスペースに取り込まれます。

 Eclipseのプロジェクト・エクスプローラーに表示されます。

・javaアプリケーションの実行
 プロジェクトを選択し、マウス右ボタンで実行メニューを表示し、「javaアプリケーション」を選択

(4)pom.xmlの編集
 Eclipseでは、pom.xml専用のエディタが使えます。

・「依存関係」タブ
 タグにまとめる依存関係の追加ができます。

 「追加」ボタンを押すと依存関係を記述するダイアログが表示されます。

 インデックスのダウンロードが使用不可(デフォルト)になっているときは、ウインドウ>設定>Mavenの「起動時にリポジトリ・インデックス更新をダウンロード」をチェックして、Eclipseを起動しなおします。

 インデックス更新が完了するまで待ちます(30分以上要しました)。
 グループId、アーティファクトIdのテキストの一部を入力すると、ライブラリの候補が表示されます。

・「依存関係階層」タブ
 <pluginManagement>タグでまとめる依存関係の追加ができます。

(5)リモートリポジトリの検索
 ライブラリの<dependency>タグ内に記述するgroupId、 artifactId、versionについて、Mavenリモートリポジトリを検索して調べることができます。
 https://search.maven.org/

(例)groupId:”org.junit.jupiter”のライブラリの検索

 バージョンを選択し、<dependency>の内容をpom.xmlに追加します。

4.EclipseによるMavenプロジェクトの作成
 ファイル>新規>Mavenプロジェクトを選択します。

 ここで、アーキタイプ(テンプレート)にはフィルタに「maven-archetype-q」を入力し、「maven-archetype-quickstart」を選択します。

 グループId、アーティファクトIdを設定します。パッケージ名はデフォルトで(グループId).(アーティファクトId)が設定されます。

 Mavenコマンド「> mvn archetype:generate」でプロジェクトを作成したときと同じフォルダ構成で作成されます。
 プロジェクト・エクスプローラーでプロジェクト名に(赤×マーク)が表示されましたが、Eclipseを起動し直して消えました(ライブラリ読み込み途中の状態表示が残っていたと思われます)。

(参考文献)
・「EclipseではじめるJavaフレームワーク入門 第5版」
 著者:掌田津耶乃 発行:株式会社秀和システム

The end

Bootstrapの基本

目次

1.Bootstrapとは
 BootstrapはウェブサイトやWebアプリケーションを作成するフロントエンドWebアプリケーションフレームワークである。(引用:Wiki)
 主にHTML要素のCSSフレームワーク(デザインテンプレート)として使われ、class属性に指定するだけで見やすいデザインを作成できる。また、ボタンやjavascriptの拡張機能がHTMLおよびCSSベースのデザインテンプレートとして用意されている。 

 Bootstrapの日本語サイト
 https://getbootstrap.jp/

2.使い方
(1)CDNを使ったBootstrapの導入
 Bootstrapを使うためにインストールする方法とCDN(Content Delivery Network)からスクリプトファイルを読み込む方法があります。ここでは、CDNを使う方法について記載します。

①CSS
 <head>内に他のスタイルシートよりも先に入れます。

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">

②JS
 ドロップダウン、ポップオーバー、ツールチップを利用する際はpopper.jsが必要になります。
 最初にpopoer.js を読み込み、次にJavaScriptプラグインを読み込みます。

<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.4/dist/umd/popper.min.js" integrity="sha384-q2kxQ16AaE6UbzuKqyBE9/u/KzioAlnx2maXQHiDX9d4/zp8Ok3f+M7DPm+Ib6IU" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.min.js" integrity="sha384-pQQkAEnwaBkjpqZ8RU1fF1AKtTcHJwFl3pblpTlHXybJjHpMYo79HY3hIi4NKxyj" crossorigin="anonymous"></script>

(2)基本テンプレート
 sample1.html

<!doctype html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
    <title>Bootstrapのページ</title>
  </head>
  <body>
    <!-- ここに本文を置く -->
    <h1 class="bg-secondary text-white display-4 px-3">Bootstrap</h1>
    <div class="container">
      <p>This is sample page.</p>
    </div>    
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.4/dist/umd/popper.min.js" integrity="sha384-q2kxQ16AaE6UbzuKqyBE9/u/KzioAlnx2maXQHiDX9d4/zp8Ok3f+M7DPm+Ib6IU" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.min.js" integrity="sha384-pQQkAEnwaBkjpqZ8RU1fF1AKtTcHJwFl3pblpTlHXybJjHpMYo79HY3hIi4NKxyj" crossorigin="anonymous"></script>
  </body>
</html>

・Bootstrap は HTML5 doctype を使用する必要があります。 <!doctype html>
・レスポンシブ用メタタグを追加します。 <meta name=”viewport” content=”width=device-width, initial-scale=1″>
“viewport”は仮想の表示領域を設定する属性値で、”width=device-width”で閲覧している画面サイズに合わせてサイズ変更、”initial-scale=1″でページを表示したときの初期倍率を指定できます。

3.Containers (コンテナ)
 コンテナはBootstrap基本的なレイアウト要素で、コンテナの中にBootstrapの各要素を記述することで、デバイスのサイズに応じてコンテンツに適切な余白を与え整列させることができます。containerはウィンドウの横幅に応じて段階的に横幅が変動し、各レスポンシブブレークポイントで 幅が設定されます。ブレークポイントはデフォルトの設定では、Extra small<576px、Small≥576px、Medium≥768px、Large
≥992px、X-Large≥1200px、XX-Large≥1400pxとなっています。
 Bootstrapには.container、container-fluid、.container-{breakpoint} の3つの異なるコンテナがあり、下図のように幅が変わります。

.containerクラスを設定したときの例を示します。

<h1 class="bg-secondary text-white display-1 px-3">Bootstrap</h1>
<div class="container bg-info">
    <p>This is sample page.</p>
</div>

.container-fluidクラスを設定したときの例を示します。
 横幅はどのデバイス(画面幅)でも画面幅全体になります。

4.Grid system (グリッドシステム)
(1)カラム数を指定しないで分割
 グリッドシステムは、一連のコンテナ、行、列を使用してコンテンツをレイアウトします。
 下記の例ではコンテナを3分割します。col-sm(Small≥576px)では幅が576px未満になると3行の100%表示になります。

 sample2.html

<!doctype html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
    <title>Bootstrapのページ</title>
  </head>
  <body>
    <!-- ここに本文を置く -->
    <div class="container bg-info">
      <div class="row">
        <div class="col-sm bg-primary">
          One of three columns
        </div>
        <div class="col-sm bg-secondary">
          One of three columns
        </div>
        <div class="col-sm bg-success">
          One of three columns
        </div>
      </div>
    </div>
       
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.4/dist/umd/popper.min.js" integrity="sha384-q2kxQ16AaE6UbzuKqyBE9/u/KzioAlnx2maXQHiDX9d4/zp8Ok3f+M7DPm+Ib6IU" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.min.js" integrity="sha384-pQQkAEnwaBkjpqZ8RU1fF1AKtTcHJwFl3pblpTlHXybJjHpMYo79HY3hIi4NKxyj" crossorigin="anonymous"></script>
  </body>
</html>

・container、row、colクラスのレイアウトの役割
 containerクラスはコンテンツの器となります。
 rowクラスは行をまとめる役割をします。
 colクラスはブレークポイント(smなど)とカラム数を指定することができます。カラム数は画面を12分割した列の数です。

(2)カラム数を指定して分割

(3)ブレークポイントの異なるカラムを設定
 ”.col-sm”、”.col-lg”のブレークポイントの異なる2つのクラスを指定した例です。

 sample4.html

<!doctype html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
    <title>Bootstrapのページ</title>
  </head>
  <body>
    <!-- ここに本文を置く -->
    <div class="container bg-info">
      <div class="row">
        <div class="col-sm col-lg bg-primary">
          One of three columns
        </div>
        <div class="col-sm col-lg bg-secondary">
          One of three columns
        </div>
        <div class="col-sm col-lg bg-success">
          One of three columns
        </div>
      </div>
    </div>
       
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.4/dist/umd/popper.min.js" integrity="sha384-q2kxQ16AaE6UbzuKqyBE9/u/KzioAlnx2maXQHiDX9d4/zp8Ok3f+M7DPm+Ib6IU" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.min.js" integrity="sha384-pQQkAEnwaBkjpqZ8RU1fF1AKtTcHJwFl3pblpTlHXybJjHpMYo79HY3hIi4NKxyj" crossorigin="anonymous"></script>
  </body>
</html>

5.Gutters (ガター)
 ガターはカラム間にパディングを入れます。
 .gx-クラスを使うと水平方向のガター、.gy-クラスを使うと垂直方向のガター、.g-*クラスは水平・垂直ガターを設定することができます。

 sample5.html

<!doctype html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
    <title>Bootstrapのページ</title>
  </head>
  <body>
    <!-- ここに本文を置く -->
    <div class="container overflow-hidden bg-info">
      <div class="row g-5">
        <div class="col-6">
         <div class="p-3 border bg-light">Custom column padding</div>
        </div>
        <div class="col-6">
          <div class="p-3 border bg-light">Custom column padding</div>
        </div>
           <div class="col-6">
         <div class="p-3 border bg-light">Custom column padding</div>
        </div>
        <div class="col-6">
          <div class="p-3 border bg-light">Custom column padding</div>
        </div>
      </div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.4/dist/umd/popper.min.js" integrity="sha384-q2kxQ16AaE6UbzuKqyBE9/u/KzioAlnx2maXQHiDX9d4/zp8Ok3f+M7DPm+Ib6IU" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.min.js" integrity="sha384-pQQkAEnwaBkjpqZ8RU1fF1AKtTcHJwFl3pblpTlHXybJjHpMYo79HY3hIi4NKxyj" crossorigin="anonymous"></script>
  </body>
</html>

6.Typography (タイポグラフィ)
(1)Headings
 HTMLの見出し<h1>から<h6>が利用できます。または、.h1 から .h6 クラスも利用できます。 <h1>sample text</h1>
<p class=”h1″>sample text</p>

(2)Display headings

<h1 class="display-1">Display 1</h1>
<h1 class="display-2">Display 2</h1>
<h1 class="display-3">Display 3</h1>
<h1 class="display-4">Display 4</h1>
<h1 class="display-5">Display 5</h1>
<h1 class="display-6">Display 6</h1>

(3)Lead
  .leadを追加して目立たせることができます。

<p class="lead">
  This is a lead paragraph. 
</p>

(4)Inline text elements
 一般的なインラインのためのスタイリング要素です。

<!-- Inline text elements -->
<p>mark tag to <mark>highlight</mark> text.</p>
<p>del tag to <del>This line of text is meant to be treated as deleted text.</del></p>
<p>s tag to <s>This line of text is meant to be treated as no longer accurate.</s></p>
<p>ins tag to <ins>This line of text is meant to be treated as an addition to the document.</ins></p>
<p>u tag to <u>This line of text will render as underlined.</u></p>
<p>small tag to <small>This line of text is meant to be treated as fine print.</small></p>
<p>strong tag to <strong>This line rendered as bold text.</strong></p>
<p>em tag to <em>This line rendered as italicized text.</em></p>

(5)Abbreviations
  要素で略語を表し、title=”…” で指定すると略語が点線の下線付きで表示され、ホバーしたときtitle=”…” で指定した内容が表示されます。文字サイズを少し小さくするときは.initialism を追加します。

<!-- Abbreviations -->
<p><abbr title="attribute">attr</abbr></p>
<p><abbr title="HyperText Markup Language" class="initialism">HTML</abbr></p>

7.Tables (テーブル)
 に .tableクラスを追加することでbootstrap の標準のテーブルとなります。
(1)基本テーブル
 sample9.html

<!doctype html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
    <title>Bootstrapのページ</title>
  </head>
  <body>
    <!-- Tables (テーブル) -->
    <table class="table">
      <thead>
        <tr>
          <th scope="col">#</th>
          <th scope="col">First</th>
          <th scope="col">Last</th>
          <th scope="col">Handle</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <th scope="row">1</th>
          <td>Mark</td>
          <td>Otto</td>
          <td>@mdo</td>
        </tr>
        <tr>
          <th scope="row">2</th>
          <td>Jacob</td>
          <td>Thornton</td>
          <td>@fat</td>
        </tr>
        <tr>
          <th scope="row">3</th>
          <td colspan="2">Larry the Bird</td>
          <td>@twitter</td>
        </tr>
      </tbody>
    </table>
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.4/dist/umd/popper.min.js" integrity="sha384-q2kxQ16AaE6UbzuKqyBE9/u/KzioAlnx2maXQHiDX9d4/zp8Ok3f+M7DPm+Ib6IU" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.min.js" integrity="sha384-pQQkAEnwaBkjpqZ8RU1fF1AKtTcHJwFl3pblpTlHXybJjHpMYo79HY3hIi4NKxyj" crossorigin="anonymous"></script>
  </body>
</html>

(2)zebra-striping
 zebra-striping を追加するには、.tableに.table-stripedを追加します。
 sample10.html

<!doctype html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
    <title>Bootstrapのページ</title>
  </head>
  <body>
    <!-- Tables (テーブル) -->
    <table class="table table-striped">
      <thead>
        <tr>
          <th scope="col">#</th>
          <th scope="col">First</th>
          <th scope="col">Last</th>
          <th scope="col">Handle</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <th scope="row">1</th>
          <td>Mark</td>
          <td>Otto</td>
          <td>@mdo</td>
        </tr>
        <tr>
          <th scope="row">2</th>
          <td>Jacob</td>
          <td>Thornton</td>
          <td>@fat</td>
        </tr>
        <tr>
          <th scope="row">3</th>
          <td colspan="2">Larry the Bird</td>
          <td>@twitter</td>
        </tr>
      </tbody>
    </table>
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.4/dist/umd/popper.min.js" integrity="sha384-q2kxQ16AaE6UbzuKqyBE9/u/KzioAlnx2maXQHiDX9d4/zp8Ok3f+M7DPm+Ib6IU" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.min.js" integrity="sha384-pQQkAEnwaBkjpqZ8RU1fF1AKtTcHJwFl3pblpTlHXybJjHpMYo79HY3hIi4NKxyj" crossorigin="anonymous"></script>
  </body>
</html>

(3)Hoverable rows
 テーブル内でマウスオーバー行をホバー状態にするためには.tableに.table-hoverを追加します。
 sample11.html

<!doctype html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
    <title>Bootstrapのページ</title>
  </head>
  <body>
    <!-- Tables (テーブル) -->
    <table class="table table-hover">
      <thead>
        <tr>
          <th scope="col">#</th>
          <th scope="col">First</th>
          <th scope="col">Last</th>
          <th scope="col">Handle</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <th scope="row">1</th>
          <td>Mark</td>
          <td>Otto</td>
          <td>@mdo</td>
        </tr>
        <tr>
          <th scope="row">2</th>
          <td>Jacob</td>
          <td>Thornton</td>
          <td>@fat</td>
        </tr>
        <tr>
          <th scope="row">3</th>
          <td colspan="2">Larry the Bird</td>
          <td>@twitter</td>
        </tr>
      </tbody>
    </table>
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.4/dist/umd/popper.min.js" integrity="sha384-q2kxQ16AaE6UbzuKqyBE9/u/KzioAlnx2maXQHiDX9d4/zp8Ok3f+M7DPm+Ib6IU" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.min.js" integrity="sha384-pQQkAEnwaBkjpqZ8RU1fF1AKtTcHJwFl3pblpTlHXybJjHpMYo79HY3hIi4NKxyj" crossorigin="anonymous"></script>
  </body>
</html>

(4)その他のテーブルクラス
・ .table-bordered
 テーブルとセルの四方の境界線をつける
・.table-borderless
 テーブルとセルの四方の境界線を削除
・ .table-sm
 セルの padding を半分にしてテーブルをコンパクトにする
・.table-responsive
 .table を .table-responsiveでラップすることで、すべてのビューポートに対応したレスポンシブテーブルにすることができます。
 sample12.html

<!doctype html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
    <title>Bootstrapのページ</title>
  </head>
  <body>
    <!-- Tables (テーブル) -->
    <div class="table-responsive">
      <table class="table">
        <tr>
          <th>#</th>
          <th>1+++</th>
          <th>2+++</th>
          <th>3+++</th>
          <th>4+++</th>
          <th>5+++</th>
          <th>6+++</th>
          <th>7+++</th>
          <th>8+++</th>
          <th>9+++</th>
          <th>10++</th>
        </tr>
        <tr>
          <td>1</td>
          <td>a</td>
          <td>b</td>
          <td>c</td>
          <td>d</td>
          <th>e</th>
          <td>f</td>
          <td>g</td>
          <td>h</td>
          <td>i</td>
          <td>g</td>
        </tr>
      </table>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.4/dist/umd/popper.min.js" integrity="sha384-q2kxQ16AaE6UbzuKqyBE9/u/KzioAlnx2maXQHiDX9d4/zp8Ok3f+M7DPm+Ib6IU" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.min.js" integrity="sha384-pQQkAEnwaBkjpqZ8RU1fF1AKtTcHJwFl3pblpTlHXybJjHpMYo79HY3hIi4NKxyj" crossorigin="anonymous"></script>
  </body>
</html>

8.Figures (図)
.figure-captionクラス
.figure-caption クラスを使用して、画像に関連するテキストを表示します。
 sample13.html

<!doctype html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
    <title>Bootstrapのページ</title>
  </head>
  <body>
    <!-- Figures (図) -->
    <figure class="figure">
      <img src="sample13.png" class="figure-img img-fluid rounded" alt="...">
      <figcaption class="figure-caption">A caption for the above image.</figcaption>
    </figure>
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.4/dist/umd/popper.min.js" integrity="sha384-q2kxQ16AaE6UbzuKqyBE9/u/KzioAlnx2maXQHiDX9d4/zp8Ok3f+M7DPm+Ib6IU" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.min.js" integrity="sha384-pQQkAEnwaBkjpqZ8RU1fF1AKtTcHJwFl3pblpTlHXybJjHpMYo79HY3hIi4NKxyj" crossorigin="anonymous"></script>
  </body>
</html>

9.Forms (フォーム)
 .form-textでフォームに関連するテキストを表示できます。

 sample14.html

<!doctype html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
    <title>Bootstrapのページ</title>
  </head>
  <body>
    <!-- Figures (図) -->
    <div  class="container bg-info">
      <form>
        <div class="mb-3">
          <label for="exampleInputEmail1" class="form-label">Email address</label>
          <input type="email" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp">
          <div id="emailHelp" class="form-text">We'll never share your email with anyone else.</div>
        </div>
        <div class="mb-3">
          <label for="exampleInputPassword1" class="form-label">Password</label>
          <input type="password" class="form-control" id="exampleInputPassword1">
        </div>
        <div class="mb-3 form-check">
          <input type="checkbox" class="form-check-input" id="exampleCheck1">
          <label class="form-check-label" for="exampleCheck1">Check me out</label>
        </div>
        <button type="submit" class="btn btn-primary">Submit</button>
      </form>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.4/dist/umd/popper.min.js" integrity="sha384-q2kxQ16AaE6UbzuKqyBE9/u/KzioAlnx2maXQHiDX9d4/zp8Ok3f+M7DPm+Ib6IU" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.min.js" integrity="sha384-pQQkAEnwaBkjpqZ8RU1fF1AKtTcHJwFl3pblpTlHXybJjHpMYo79HY3hIi4NKxyj" crossorigin="anonymous"></script>
  </body>
</html>

10.Accordion(アコーディオン)
 sample15.html
 (引用:Bootstrap v5.0のドキュメント)

<!doctype html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
    <title>Bootstrapのページ</title>
  </head>
  <body>
    <!-- Accordion(アコーディオン) -->
    <div class="accordion" id="accordionExample">
      <div class="accordion-item">
        <h2 class="accordion-header" id="headingOne">
          <button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
            Accordion Item #1
          </button>
        </h2>
        <div id="collapseOne" class="accordion-collapse collapse show" aria-labelledby="headingOne" data-bs-parent="#accordionExample">
          <div class="accordion-body">
            <strong>This is the first item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.
          </div>
        </div>
      </div>
      <div class="accordion-item">
        <h2 class="accordion-header" id="headingTwo">
          <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
            Accordion Item #2
          </button>
        </h2>
        <div id="collapseTwo" class="accordion-collapse collapse" aria-labelledby="headingTwo" data-bs-parent="#accordionExample">
          <div class="accordion-body">
            <strong>This is the second item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.
          </div>
        </div>
      </div>
      <div class="accordion-item">
        <h2 class="accordion-header" id="headingThree">
          <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseThree" aria-expanded="false" aria-controls="collapseThree">
            Accordion Item #3
          </button>
        </h2>
        <div id="collapseThree" class="accordion-collapse collapse" aria-labelledby="headingThree" data-bs-parent="#accordionExample">
          <div class="accordion-body">
            <strong>This is the third item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.
          </div>
        </div>
      </div>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.4/dist/umd/popper.min.js" integrity="sha384-q2kxQ16AaE6UbzuKqyBE9/u/KzioAlnx2maXQHiDX9d4/zp8Ok3f+M7DPm+Ib6IU" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.min.js" integrity="sha384-pQQkAEnwaBkjpqZ8RU1fF1AKtTcHJwFl3pblpTlHXybJjHpMYo79HY3hIi4NKxyj" crossorigin="anonymous"></script>
  </body>
</html>

11.その他のクラス
 様々なサンプルを下記からダウンロードできます。
 https://getbootstrap.jp/docs/5.0/getting-started/download/

12.CSSの基本知識
(1)Webページのスタイルの適用方法
 CSSをHTMLに組み込む方法は、①HTMLのタグの中に直接、style属性でCSSを記述する方法、②内部参照(HTMLのhead内部にCSSを書き込む方法)、③外部参照(CSSファイルを作成しHTMLとリンクさせる方法)の3つがあります。
 ②、または③の場合、セレクタ(HTMLタグ名、クラス名、id名)に対してスタイルを定義します。 

(2)メディアクエリ
 Webページのスタイルを記述するCSSの仕様の一つで、表示された画面環境に応じて適用するスタイルを切り替える機能です。
 下記の例では、画面サイズが480pxまではここで指定したスタイルシートが使われます。
①link要素として指定する場合

<link rel="stylesheet" href="style.css" media="screen and (max-width:480px)">

②スタイルシート(CSSファイル)で指定する場合

@media screen and (min-width:480px) { 
    /* 画面サイズが480pxからはここを読み込む */
 
}

(3)Sass(Syntactically Awesome StyleSheet)
  CSSの拡張言語のことで、Bootstorapでも使われている

(4)レイアウト
 HTMLページのレイアウトには大きく分けてフレックスボックスとグリッドレイアウトがあります。
 ①フレックスボックス
  一次元のレイアウトモデルで、親要素となるコンテナとその中に入るアイテムから成ります。コンテナのタグにdisplay: flexを定義します。
 ②グリッド
二次元レイアウトモデルで、アイテムをタグで囲んで、そのタグにdisplay: grid、親要素の列(grid-templete-columns)と行(grid-template-rows)を定義します。

(本サイト内のページ) 
 CSSの基本

(参考文献)
・Bootstrap v5.0のドキュメント
 https://getbootstrap.jp/
 
 サンプルプログラムの一部は、Bootstrap v5.0のドキュメントから引用しています。

The end

ROS (Robot Operating System)の基本1

目次

1.概要
 ROSはオープンソースで提供されるロボット向けのメタ・オペレーティングシステム(既存のOS上で動くミドルウェアやソフトウェアフレームワークの一種)でハードウェア抽象化、低レベルなデバイス制御、一般的な機能性、プロセス間通信、そしてパッケージ管理など一般的なオペレーティングシステムに要求されるサービスを提供します。
(引用:Wiki)

2.歴史
 ROSはSAIL(Stanford Artificial Intelligence Laboratory:スタンフォード人工知能研究所)が「STAIR(STanford AI Robot)」というロボットを生み出す際に開発され、アメリカのウィローガレージ社に開発が引き継がれてオープンソースとして共有・連携・再利用を促進する枠組みが構築された。
 現在はOSRFのオープンロボティクス(Open Robotics) が開発を引き継ぎ、2017年ROS 2正式版「Ardent Apalone」をリリース。(参考:Wiki)
ROS公式サイト
https://www.ros.org/
https://wiki.ros.org/ja

3.特徴
(1)plumbing(通信)
 ROSは迅速で容易に分散コンピューティングシステムを構築できるよう設計され、Publish/Subscribeメッセージングと呼ばれる通信モデルでノード(ソフトウェア)同士の通信基盤を提供する。

・MCU(Micro Controller Unit):
 MCUとは一つの集積回路の中にメモリ、I/Oなど周辺機能をコンピュータシステムとしてまとめた組み込み用のマイクロプロセッサのこと。
・MPU(Micro-Processing Unit):
 MPUとは、演算や制御などの機能を半導体チップに集積したものでコンピュータのCPU(中央処理装置)としても用いられる

(2)tools(ツール群)
 ROSは分散コンピューティングシステムの設定・起動・監視・デバッグ・可視化・ログ取得・テスト・停止を行う広範囲にわたるツールを提供する。

(3)capabilities(機能群)
 ROSは移動・マニピュレーション・知覚といった機能をロボットに実装する多様なライブラリ群を提供する。

(4)ecosystem(エコシステム)
 ROSは統合とドキュメンテーションに重点をおき、大規模なコミュニティにより支えられ進歩している。ROSのコミュニティサイトであるros.orgは、世界中の開発者から提供された大量のROSパッケージを取得し学習できるワンストップサービスである。
(参考:Wiki)

4.ROS環境構築
(1)インストールするマシン環境
 本稿ではWindows10pro上のVirtualBoxのゲストOS(Ubuntu16.04LTS)にROSをインストールします。
 Ubuntuのバージョンに対してインストールするROSのバージョンが決められいて、Ubuntu16.04LTSにはROS Kineticを下記の手順に沿ってインストールします。
 ・ROS Kinetic の Ubuntu へのインストール手順
 http://wiki.ros.org/ja/kinetic/Installation/Ubuntu

(2)Ubuntuレポジトリを構成する
 Ubuntuのレポジトリを”restricted”、 “universe”、 “multiverse”を許可する設定にします。

(3)sources.listの設定

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

(4)鍵の設定
・curlコマンドを使えるようにします。
 curlはURLで示されるネットワーク上の場所との間でデータの送受信を行うためのコマンド

$ sudo apt install curl

・鍵を設定します。
 APTキーリング(/etc/apt/trusted.gpg)にリポジトリの鍵を登録します。

$ curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -

(5)インストール
・パッケージ・インデックスを最新のものにします。

$ sudo apt-get update

・すべてのデスクトップ環境のインストール:(推奨):
 ROS、rqt、rviz、ロボットの一般的なライブラリ、2D/3Dシミュレータ、ナビゲーション、2D/3D認識が含まれます。

$ sudo apt-get install ros-kinetic-desktop-full

(6)rosdepの初期化
 rosdepはコンパイル対象となるソースのシステム依存のインストールを簡易化し、ROSの中でいくつかコアとなるコンポーネントを実行するために必須とされています。

$ sudo rosdep init
$ rosdep update

(7)環境設定
 bashを起動したときにROSの環境変数が読み込まれるように.bashrcに追加します。

$ echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
$ source ~/.bashrc

(8)rosinstallの準備
 膨大なROSパッケージのソースツリーを簡単にダウンロードできるようにツールをインストールします。

$ sudo apt-get install python-rosinstall

(9)インストールの確認
 roscore は ROSノードが通信するために実行しておく必要があり、ROS Master、ROS Parameter Server、ROS ロギングノードを立ち上げるコマンドです。

$ roscore

(10)Rizeのインストール
 ROSのデータの3次元の可視化を行うツール
  ・インストール

# apt install rviz

 ・起動

# rviz

5.サンプルプログラム
 turtlesimというROS のサンプルプログラムを用いて ROSのノード間の通信などの動作を確認します。
http://wiki.ros.org/turtlesim

(1)ROSマスタの起動

$ roscore

(2)亀の軌跡を表示するノードの起動

$ rosrun turtlesim turtlesim_node

(3)矢印キーの入力を受け付けるノードの起動
 矢印キーを押すと亀が移動します。

$ rosrun turtlesim turtle_teleop_key

(4)起動しているノードの確認

$ rosnode list

・rosout
・teleop_turtle
・turtlesim
の3つのノードが起動しています。

(5)ノード情報の確認
 $ rosnode info /パッケージ名

①「rosout」ノード

$ rosnode info /rosout

②「teleop_turtle」ノード

$ rosnode info /teleop_turtle

③「turtlesim」ノード

$ rosnode info /turtlesim

(6)通信しているトピックの一覧の確認

$ rostopic list

(7)トピックが配信、受信しているメッセージの確認
 rostopic echo [topic]

$ rostopic echo /turtle1/cmd_vel

(8)メッセージの型名の確認
 rostopic type [topic]

$ rostopic type /turtle1/cmd_vel

(9)rosmsg showコマンド
 rosmsg showコマンドでgeometry_msgs/Twistの情報を確認します。
 rosmsg show [options]

$ rosmsg show geometry_msgs/Twist

 linear及びangularは,それぞれ64ビットのfloat型の変数を3つ持っていることがわかります。

(10)rostopicコマンドでトピックを配信
 トピックを配信して亀を動かします。
 rostopic pub [topic] [msg_type] [args]

$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -1 -- '[1.0, 0.0, 0.0]' '[0.0, 0.0, 2.0]'

(11)グラフの表示

$ rosrun rqt_graph rqt_graph

 ノード/teleop_turtleからノード/turtlesimにトピック/turtle1/cmd_vel を配信していることを表しています。
 楕円はノード,矢印はトピックを表わします。

6.ROSの通信
 前記5項のサンプルの動作で確認したように、ROSは下記のようにノード間でトピックを介して通信が行われます。

7.団体、コミュニティなど
・ROS開発者会議”ROSCon”の日本版
 https://roscon.jp/

The end

Vue3の基本3(コンポーネント間のデータ受け渡し)

目次

(参考資料)
・Vue3 日本語ドキュメント
 https://v3.ja.vuejs.org/
・Vue.js3超入門(掌田津耶乃著)秀和システム

1.Vueの動作環境
(1)動作環境
 ・Windows 10 Pro
 ・XAMPP Control Panel v3.2.4 
 ・Node.js v16.13.0

2.プロジェクトの作成
(1)Viteツールを使ったプロジェクトの作成
 > npm init vite-app sample-app
 > cd sample-app
 > npm install

(2)プロジェクトの実行
  > npm run dev

 前編(Vue3の基本2)に続き、プロジェクトファイルを使ったVueアプリケーションの作成を行います。

3.親子間のコンポーネントのデータ受け渡し
(1)概要
 コンポーネント間のデータの受け渡しを通して、Vueの機能について確認します。

・コンポーネント内のHTML(テンプレート)にデータを表示するとき、テンプレートの外でデータを設定するときは、Vueに渡すオブジェクトのdata()メソッドに変数を記述する。
・コンポーネントを使う側で子コンポーネントのタグに属性としてデータを渡すときは、子コンポーネントのオブジェクトのpropsプロパティに変数を記述しておく。
さらにコンポーネントを使う側でタグに属性として渡すデータをテンプレートの外で設定するときは、テンプレート側の変数をオブジェクト側の変数にバインド「v-bind:(オブジェクト側の変数)=”(テンプレート側の変数)”」する必要がある。
・$emit()メソッドを使い、子コンポーネントから親コンポーネントにカスタムイベントと引数を通知することができる。
 親コンポーネント側ではv-on (カスタムイベント)でコンポーネント内のオブジェクトのメソッドを起動する。

(2)作成するアプリケーション
 text1、text2の表示は各々のコンポーネント内のVueオブジェクトで設定、親コンポーネント(App)は子コンポーネントを使い、その属性text3に”message”を設定し、子コンポーネント側で表示します。
 子コンポーネントで入力したテキストを「click」ボタンを押したイベント名とともに親コンポーネントに通知します。

(3)ソースリスト
 index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <link rel="icon" href="/favicon.ico" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Vite App</title>
</head>
<body>
  <div id="app"></div>
  <script type="module" src="/src/main.js"></script>
</body>
</html>

 main.js

import { createApp } from 'vue'
import App from './App.vue'
import './index.css'

createApp(App).mount('#app')

 App.vue

<template>
  <p>{{text1}}</p>
  <hello 
    v-bind:text3="message"
    v-on:c-event="appAction"
  />
  <p>{{text4}}</p>
</template>

<script>
import hello from './components/hello.vue'

export default {
  name: 'App',
  components: {
    hello
  },
  data(){
    return {
      text1:'親コンポーネントを表示します',
      message:'親側でtext2属性に設定したメッセージです',
      text4:'子コンポーネントで入力したテキストが入る場所'
    }
  },
  methods:{
    appAction(m_input){
      this.text4='子コンポーネントの入力:'+m_input
    },
  }    
}
</script>

 hello.vue

<template>
  <p> {{text2}} </p>
  <p> {{text3}} </p>
  <input type=text v-model="input">
  <button v-on:click="bton">Click</button>
  <p>子コンポーネントのテンプレート・・ここまで</p>
</template>

<script>
export default {
  name: 'hello',
  props: ['text3'],
  data(){
    return{
      text2:'子コンポーネントのテンプレート・・はじまり',
      input:'テキストを入力してClickしてください!'
    }
  },
  methods:{
    bton(){
      this.$emit('c-event',this.input)  //親にイベントを通知し、入力フォームの値を引数で渡す
    }
  }
}
</script>

アプリケーションの起動
 > npm run dev

最初にアクセス、またはリロードしたとき

入力フォームからテキストを入力して「Click」したとき

The end

Vue3の基本2(プロジェクトファイルを使ったVueアプリケーションの作成)

目次

(参考資料)
・Vue3 日本語ドキュメント
 https://v3.ja.vuejs.org/
・Vue.js3超入門(掌田津耶乃著)秀和システム

1.Vueの動作環境
(1)動作環境
 ・Windows 10 Pro
・XAMPP Control Panel v3.2.4 
 ・Node.js v16.13.0

2.プロジェクトの作成
(1)Viteツールを使ったプロジェクトの作成
 Vue3ではViteツールが使えるようになっています。
 npm init vite-app プロジェクト名
 > npm init vite-app sample-app

 > cd sample-app
 > npm install

プロジェクトの実行
 > npm run dev

3.プロジェクトファイルを使った開発
 前編(Vue3の基本1)までは、Webサーバに公開できるファイルとして、HTML文の他、JavaScript文、Vueの読み込むためのscript文、コンポーネントの定義、vueオブジェクトの生成とHTMLタグへの紐付け(マウント)を記述したhtmlファイルを作成しました。
 ここからはプロジェクトファイルを使った開発を行います。

(1)プロジェクトフォルダ、ファイルの役割

①「index.html」ファイル
 ブラウザがWebサーバにアクセスしたときに返すWebページのファイル。

②「App.vue」ファイル
 アプリケーションで使うコンポーネントファイル
③「main.js」ファイル
 アプリケーションプログラム
④「component」フォルダ
 コンポーネントファイルを置くところ

⑤「***.vue」ファイル
 コンポーネントファイル

(2)プロジェクトファイルの編集
 前項でViteツールを使って作成したプロジェクトファイルを編集してアプリケーションを作成します。
 ここでは、Vue3の基本1で作成したsample12をプロジェクトファイルに置き換えるように編集します。

(Vue3の基本1のsample12)
 コンポーネントのタグの属性に設定した文字列をテンプレートに表示するサンプルです。

index.html

<!DOCTYPE html>
<html>
<head>
  <title>My first Vue app</title>
  <script src="https://unpkg.com/vue@next"></script>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
  <div id="app">
    <p>{{message}}</p>
    <hello name="Suzuki"/>
  </div>
  
  <script>
  const appdata = {
    data() {
      return {
        message : 'コンポーネントを表示します'
      }
    }
  }

  let app = Vue.createApp(appdata)

  app.component('hello', {
      props:['name'],
      template: '<p> Hello component! {{name}} </p>'
  })
  app.mount('#app')
  </script>
</body>
</html>

上記のアプリケーションをプロジェクトファイルに置き換えます。
sample19
①「index.html」ファイル

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <link rel="icon" href="/favicon.ico" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Vite App</title>
</head>
<body>
  <div id="app"></div>
  <script type="module" src="/src/main.js"></script>
</body>
</html>

②「App.vue」ファイル

<template>
  <p>{{message}}</p>
  <hello name="Suzuki"/>
</template>

<script>
import hello from './components/hello.vue'

export default {
  name: 'App',
  components: {
    hello
  },
  data() {
      return {
        message : 'コンポーネントを表示します'
      }
  }
}
</script>

③「main.js」ファイル

import { createApp } from 'vue'
import App from './App.vue'
import './index.css'

createApp(App).mount('#app')

④「components/hello.vue」ファイル

<template>
  <p> Hello component! {{name}} </p>
</template>

<script>
export default {
  name: 'hello',
  props: ['name'],
}
</script>

プロジェクトを実行し、ブラウザからアクセスします。 > npm run dev

(3)プロジェクトのビルド
 > npm run build
「dist」フォルダが作成されます。

index.html

・「_assets」フォルダにJavaScriptファイルとcssファイルが作成され、これを読み込む形になります。

(4)アプリケーションの公開
「dist」フォルダに作成されたフォルダ、ファイル一式をWebサーバのドキュメントルートに置くことで公開されます。
 ここではXAMPPのApatchサーバを起動し、distフォルダ内のファイル、フォルダをhtdocs配下に置きます。

 ブラウザからアクセスし、Webサーバで公開されたことが確認できます。

(5)プロジェクトファイルの仕組み
 htmlファイル内でVueアプリケーションの組み立てからオブジェクトを作るところまでのコードについて、
①Vueアプリケーションのオブジェクトを作る部分の記述を別ファイルにする(main.jsファイル)
②ルートコンポーネントのテンプレートとVueアプリケーションの記述を別ファイルにする(App.vueファイル)
③ルートコンポーネント(親)以外のコンポーネントは別ファイルとして「components」フォルダに置く(***.vueファイル)
に分けて作成します。

The end