20210315のJavaに関する記事は13件です。

EasyBuggyとEasyBuggy BootをEclipseから同時に実行する

EasyBuggy / EasyBuggy Bootとは

メモリリーク、デッドロック、JVMクラッシュ、SQLインジェクションなど、バグや脆弱性の動作を理解するためにつくられたバグだらけのWebアプリケーションです。Apache 2.0ライセンスで公開されています。

EasyBuggyは基本的な技術のみが使われていますが、EasyBuggy BootはSpring Bootなどの新しい技術が使われています

やりたいこと

EasyBuggyEasyBuggy Bootを同時に実行・デバッグしたい。
具体的には下記のようなことを実現したい。

  • 伝統的なJavaのコードとSpring Frameworkに則ったコードを比較したい
  • それぞれのコードにおける脆弱性の修正を試みたい
  • それぞれの環境の切り替えのコストを下げたい

インストール

前提条件

Eclipseがインストールされていること。

また、GitとMavenがインストールされ、パスが通っていること。
下記のコマンドを実行することで確認が可能。

$ git --version
$ mvn -version

Eclipseプロジェクトの作成

EasyBuggy
$ git clone https://github.com/k-tamura/easybuggy.git
$ cd easybuggy
$ mvn eclipse:eclipse -Dwtpversion=2.0
EasyBuggy Boot
$ git clone https://github.com/k-tamura/easybuggy4sb.git
$ cd easybuggy4sb
$ mvn eclipse:eclipse

Eclipseへのインポート

  1. File > Import を選択する
  2. General > Existing Projects into Workspace を選択し、Import Projectsダイアログを表示する
  3. Select root directory に先ほどcloneしたフォルダ2つを選択する
  4. Finish ボタンを押す

無題.png

EasyBuggyの独自設定

Serverを追加

  1. Serversビューを開き、右クリック。 New > Server を選択する
  2. Tomcat v8.5 Server(他のでも良いと思う)を選択し、Nextボタンを押す
  3. Available から easybuggy を選択する。Add ボタンを押して Configured に移動させる
  4. Finish ボタンを押す

ポートを変更

そのままでは、EasyBuggy Bootと利用しているポートが衝突するため、ポートを変更する。

  1. 追加されたサーバーをダブルクリックし、Overviewビューを表示する
  2. Portsタブ以下のPort Name:HTTP/1.1のPort Numberを任意の値に書き換える(例: 9080)

無題2.png

EasyBuggy Boot側のポートを変更するよりも、EasyBuggy側のポートを変更するほうが手軽だと思われる。
EasyBuggy Boot側のポートを変更する場合は、src/main/resources以下のapplication.propertiesを書き換える

起動

EasyBuggy

Serversビュー内から追加されたサーバーを選択し、同ビュー内のStart the server in debug modeボタンを押す。
その後、下記にアクセスする。

EasyBuggy Boot

Package ExplorerからEasybuggy4sbApplicationクラスを選択し、EclipseのツールバーのDebug Easybuggy4sbApplicationボタンを押す。
その後、下記にアクセスする。

まとめ

おつかれさまでした。

image.png

トラブルシューティング

EasyBuggyの起動に失敗する場合

一度 mvn verify コマンドを実行することで、直ることがあります。

関連記事

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

EasyBuggyとEasyBuggy BootをEclipseから同時に開発・デバッグできるようにするまで

EasyBuggy / EasyBuggy Bootとは

メモリリーク、デッドロック、JVMクラッシュ、SQLインジェクションなど、バグや脆弱性の動作を理解するためにつくられたバグだらけのWebアプリケーションです。Apache 2.0ライセンスで公開されています。

EasyBuggyは基本的な技術のみが使われていますが、EasyBuggy BootはSpring Bootなどの新しい技術が使われています

やりたいこと

EasyBuggyEasyBuggy Bootを同時に実行・デバッグしたい。
具体的には下記のようなことを実現したい。

  • 伝統的なJavaのコードとSpring Frameworkに則ったコードを比較したい
  • それぞれのコードにおける脆弱性の修正を試みたい
  • それぞれの環境の切り替えのコストを下げたい

インストール

前提条件

Eclipseがインストールされていること。

また、GitとMavenがインストールされ、パスが通っていること。
下記のコマンドを実行することで確認が可能。

$ git --version
$ mvn -version

Eclipseプロジェクトの作成

EasyBuggy
$ git clone https://github.com/k-tamura/easybuggy.git
$ cd easybuggy
$ mvn eclipse:eclipse -Dwtpversion=2.0
EasyBuggy Boot
$ git clone https://github.com/k-tamura/easybuggy4sb.git
$ cd easybuggy4sb
$ mvn eclipse:eclipse

Eclipseへのインポート

  1. File > Import を選択する
  2. General > Existing Projects into Workspace を選択し、Import Projectsダイアログを表示する
  3. Select root directory に先ほどcloneしたフォルダ2つを選択する
  4. Finish ボタンを押す

無題.png

EasyBuggyの独自設定

Serverを追加

  1. Serversビューを開き、右クリック。 New > Server を選択する
  2. Tomcat v8.5 Server(他のでも良いと思う)を選択し、Nextボタンを押す
  3. Available から easybuggy を選択する。Add ボタンを押して Configured に移動させる
  4. Finish ボタンを押す

ポートを変更

そのままでは、EasyBuggy Bootと利用しているポートが衝突するため、ポートを変更する。

  1. 追加されたサーバーをダブルクリックし、Overviewビューを表示する
  2. Portsタブ以下のPort Name:HTTP/1.1のPort Numberを任意の値に書き換える(例: 9080)

無題2.png

EasyBuggy Boot側のポートを変更するよりも、EasyBuggy側のポートを変更するほうが手軽だと思われる。
EasyBuggy Boot側のポートを変更する場合は、src/main/resources以下のapplication.propertiesを書き換える。

起動

EasyBuggy

Serversビュー内から追加されたサーバーを選択し、同ビュー内のStart the server in debug modeボタンを押す。
その後、下記にアクセスする。

EasyBuggy Boot

Package ExplorerからEasybuggy4sbApplicationクラスを選択し、EclipseのツールバーのDebug Easybuggy4sbApplicationボタンを押す。
その後、下記にアクセスする。

まとめ

おつかれさまでした。

image.png

トラブルシューティング

EasyBuggyの起動に失敗する場合

一度 mvn verify コマンドを実行することで、直ることがあります。

関連記事

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Fizz Buzzに対抗して世界のナベアツプログラムを紹介します。

ヨーロッパで「Fizz Buzz」という多人数で1から順に数を数えて
・3の倍数を「Fizz」
・5の倍数を「Buzz」
・3でも5でも割り切れる数は「Fizz Buzz」
・それ以外は数字
を言うゲームがあります。世界のナベアツで有名な桂三度さんの
「3の倍数、3が付く数字を言うとアホになる」
というプログラムを書きました。JavaとPHPで1~50までのプログラムです。

Java

//世界の「ナベアツ」ゲーム
//1から50までのを対象に、
// 3の倍数、数字に3がつくと、アホになる
//
//
// 新規作成日 2021/3/15
// Author 乃木坂好きのITエンジニア

package paiza;

public class Sekainonabeatu {
 public static void main(String[] args) {
  for(int i=1;i<=50;i++)

 {

   if ((i % 3 ==0) ||( i/10 == 3) || (i%10 == 3)) {

       System.out.println(i + "になるとアホになる");

   }else {

       System.out.println(i);

   }

}

}

}

PHP
//
// ナベアツプログラム
// Date 2021/03/15 (新規作成)
// Author 乃木坂46好きのITエンジニア
//
//

<?php

for($i=0;$i<100;$i++)
{

if ($i % 3 ==0 || $i / 10 ==0 || $i++ )

{

   echo $i.";でバカになる\n";

} else {

    echo $i."\n";

}

}

?>
分岐処理をマスターした方は是非挑戦してみてください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

javaのmockitoを使用してリスト型データを返すには

Junitで単体テストをする。(ライブラリ下記を使用)
・Eclipse4.8
・Java 8
・mockit-1.10.19
・junit-4.12

package G_T.OfficeSystem.controller;
import java.util.List;

public class Test1  {

    //DBが無い時にリストデータを返すメソッド
    public  List<String> runSample(String ID,String PASS) {
        // 未実装
        return null;
    }

    //ただ、何か文字を返すメソッド
    public String runSample(String ID) {
        // 未実装
        return null;
    }
}
//DBが無い時にリストデータを返すメソッド
        Test1 hoge = mock(Test1.class);
        List<String> list = Arrays.asList(new String[] { "a","b","c" });

        when(hoge.runSample("one","1")).thenReturn(list);

        assertEquals( "a", list.get(0));

        List<String> list_結果= hoge.runSample("one","1");

        for (int i=0; i<list_結果.size(); ++i)
        {
            System.out.println(list_結果.get(i));
        }

(uniqにブロックを与える書き方は http://ruby-doc.org/core-2.2.0/Array.html を参照)

参考資料
junit基礎 https://qiita.com/ryuutamaehara/items/c8efb304b73cc0542e6f

テストでよく使う検証メソッド一覧 https://qiita.com/opengl-8080/items/e57dab6e1fa5940850a3 を参照

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Spring Security使用時、localhost:8080でh2-consoleに接続できない

Spring Security使用時に、Http://localhost:8080/h2-console で接続できない場合、試したこと。

①まず、ログイン不要ページにh2-console/**を追加します。

ログインしていなくてもHttp://localhost:8080/h2-console/~ にアクセスできるように。

**はいずれかのファイル、という意味の正規表現
/webjars/** /css/** /login(ログイン画面) /signup(ユーザー登録画面)、などと一緒に直列で書く。(下は一例)

SecurityConfig.java
@Override
    protected void configure(HttpSecurity http) throws Exception {
        //ログイン不要ページの設定
        http.authorizeRequests().antMatchers("/webjars/**").permitAll().antMatchers("/css/**").permitAll()
                .antMatchers("/login").permitAll().antMatchers("/signup").permitAll().antMatchers("/h2-console/**")
                .permitAll().anyRequest().authenticated();
    }

②接続が拒否されないように下の一文を追加する。

SecurityConfig.java
@Override
    protected void configure(HttpSecurity http) throws Exception {

        //h2consoleを使用可能に(SpringSecurityを入れている場合consoleで接続を拒否される)
        http.headers().frameOptions().disable();
    }

③最後に、CSRF対策時に追加する項目。

理由:connectする時に、formを送信するため。CSRF対策では、トークン無しのformはログイン失敗とみなされる。なのでignoreさせます。
SecurityConfig.java
@Override
    protected void configure(HttpSecurity http) throws Exception {

        //h2-consoleのCSRF対策   
        http.csrf().ignoringAntMatchers("/h2-console/**");
    }

完成図

SecurityConfig.java
@Override
    protected void configure(HttpSecurity http) throws Exception {
        //ログイン不要ページの設定
        http.authorizeRequests().antMatchers("/webjars/**").permitAll().antMatchers("/css/**").permitAll()
                .antMatchers("/login").permitAll().antMatchers("/signup").permitAll().antMatchers("/h2-console/**")
                .permitAll().antMatchers("/admin","/userDetailAdmin/**").hasAuthority("ROLE_ADMIN").anyRequest().authenticated();
        //ログイン処理
        //ログイン処理のパス、ページの指定、ログイン失敗時の遷移先、
        //ログインページのID・パスワード、ログイン成功時の遷移先
        http.formLogin().loginProcessingUrl("/login").loginPage("/login").failureUrl("/login")
                .usernameParameter("userId").passwordParameter("password").defaultSuccessUrl("/home", true);
        //ログアウト処理
        http.logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutUrl("/logout")
                .logoutSuccessUrl("/login");
        //h2-consoleのCSRF対策
        http.csrf().ignoringAntMatchers("/h2-console/**");
        //h2consoleを使用可能(SpringSecurityを入れている場合consoleで接続を拒否される)
        http.headers().frameOptions().disable();
    }

まとめ

埋め込み式で便利なh2-console、Spring Security上で動かすときは、適宜SecurityConfig.javaに書いて対応しよう、という記事でした。

ご精読ありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Spring Security使用時に、Http://localhost:8080/h2-console で接続できない(CSRF対策)

Spring Security使用時に、Http://localhost:8080/h2-console で接続できない場合、試したこと。

①まず、ログイン不要ページにh2-console/**を追加します。

ログインしていなくてもHttp://localhost:8080/h2-console/~ にアクセスできるように。

**はいずれかのファイル、という意味の正規表現
/webjars/** /css/** /login(ログイン画面) /signup(ユーザー登録画面)、などと一緒に直列で書く。(下は一例)

SecurityConfig.java
@Override
    protected void configure(HttpSecurity http) throws Exception {
        //ログイン不要ページの設定
        http.authorizeRequests().antMatchers("/webjars/**").permitAll().antMatchers("/css/**").permitAll()
                .antMatchers("/login").permitAll().antMatchers("/signup").permitAll().antMatchers("/h2-console/**")
                .permitAll().anyRequest().authenticated();
    }

②接続が拒否されないように下の一文を追加する。

SecurityConfig.java
@Override
    protected void configure(HttpSecurity http) throws Exception {

        //h2consoleを使用可能に(SpringSecurityを入れている場合consoleで接続を拒否される)
        http.headers().frameOptions().disable();
    }

③最後に、CSRF対策時に追加する項目。

理由:connectする時に、formを送信するため。CSRF対策では、トークン無しのformはログイン失敗とみなされる。なのでignoreさせます。
SecurityConfig.java
@Override
    protected void configure(HttpSecurity http) throws Exception {

        //h2-consoleのCSRF対策   
        http.csrf().ignoringAntMatchers("/h2-console/**");
    }

完成図

SecurityConfig.java
@Override
    protected void configure(HttpSecurity http) throws Exception {
        //ログイン不要ページの設定
        http.authorizeRequests().antMatchers("/webjars/**").permitAll().antMatchers("/css/**").permitAll()
                .antMatchers("/login").permitAll().antMatchers("/signup").permitAll().antMatchers("/h2-console/**")
                .permitAll().antMatchers("/admin","/userDetailAdmin/**").hasAuthority("ROLE_ADMIN").anyRequest().authenticated();
        //ログイン処理
        //ログイン処理のパス、ページの指定、ログイン失敗時の遷移先、
        //ログインページのID・パスワード、ログイン成功時の遷移先
        http.formLogin().loginProcessingUrl("/login").loginPage("/login").failureUrl("/login")
                .usernameParameter("userId").passwordParameter("password").defaultSuccessUrl("/home", true);
        //ログアウト処理
        http.logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutUrl("/logout")
                .logoutSuccessUrl("/login");
        //h2-consoleのCSRF対策
        http.csrf().ignoringAntMatchers("/h2-console/**");
        //h2consoleを使用可能(SpringSecurityを入れている場合consoleで接続を拒否される)
        http.headers().frameOptions().disable();
    }

追記:csrf対策はデフォルトでONになっているので、ignoreを使わず、http.csrf().disable();とするのもありです。

CSRF対策をOFFにします。
一般的にはそう出てきますw
でもCSRF対策実装したいよね、、ということなので、よろしくお願いします。

まとめ

埋め込み式で便利なh2-console、Spring Security上で動かすときは、適宜SecurityConfig.javaに書いて対応しよう、という記事でした。

ご精読ありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SpringBoot + MySQL でTodoリストを作る!CRUDの実装(Read編)

はじめに

今回は、「SpringBootでMySQLからデータを取得して、Thymeleafを用いて画面に表示させる」をゴールとしています。

SpringBootを学び始めた方、復習をしたい方に向けて学んだ事を共有します。

開発環境

OS: macOS Mojave(バージョン 10.14.6)
$ java -version
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
$ mvn -version
Maven home: /usr/local/Cellar/maven/3.6.3_1/libexec
Java version: 15.0.2, vendor: N/A, runtime: /usr/local/Cellar/openjdk/15.0.2/libexec/openjdk.jdk/Contents/Home
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.14.6", arch: "x86_64", family: "mac"
$ spring --version
Spring CLI v2.3.1.RELEASE
$ mysql --version
mysql  Ver 8.0.23 for osx10.14 on x86_64 (Homebrew)

プロジェクトの作成(pom.xmlの編集)

Spring initializr でサクッとプロジェクトを作成します。

依存関係は以下の通りです。

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>todolist</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>todolist</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>11</java.version>
    </properties>

    <dependencies>

        <!-- テンプレートエンジン -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <!-- RESTfulを含んだWebアプリケーションライブラリの利用 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- ファイルの変更を検知すると自動で再起動する -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <!-- MySQL -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <!-- @Dataアノテーションを付与する事で,getter,setter等を自動生成してくれる -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- テスト用 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- DBとJavaオブジェクトやり取りを行う。 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

MySQLと接続

いきなりターミナルでmvn spring-boot:runを打ち込んで起動しようとしても出来ません。

terminal
$ mvn spring-boot:run

~以下略~

***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class

1.DBを作成、テストデータの作成

まずMySQLでデータベースを作成します。

データベース作成
CREATE DATABASE spring_todolist_qiita;
mysql
mysql> show databases;
+-----------------------+
| Database              |
+-----------------------+
| information_schema    |
| mysql                 |
| performance_schema    |
| spring_todolist_qiita | -- ←作成完了
| sys                   |
+-----------------------+

テーブルを作成してデータを追加します。

テーブル作成
mysql> use spring_todolist_qiita;

mysql> create table if not exists todolist (
  id integer not null auto_increment,
  content text not null,
  done boolean not null default 0,
  primary key (id)
);

データを何個か作っておきます。

データの追加
mysql> insert into todolist (content) values ("卵を買う");
--以下略--

2.SpringBootにMySQLの情報を定義する

application.propertiesにMySQLに接続するため記述します。

application.properties
# 接続先のDB名を設定
spring.datasource.url=jdbc:mysql://localhost/spring_todolist_qiita

# 接続しているDBの username と passwordを設定
# 〇〇と△△はご自身のusername,passwordを記載してください
spring.datasource.username=〇〇
spring.datasource.password=△△

# MySQL用JDBCドライバの設定
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver

再度ターミナルでmvn spring-boot:runを打ち込むと、起動はするようになります。

SpringBootとMySQL間のやり取りの実装

TodolistApplication.javaと同じ階層に各フォルダを作成して、それぞれ中身を実装していきます。

スクリーンショット 2021-03-13 10.53.56.png

1.エンティティモデルの作成

@Entityでエンティティクラスである事を宣言し、データベースのテーブルとマッピング。

@Table(name = "todolist")は、エンティティクラスとマッピングされるDBのテーブル名を指定する。

@Idは、主キーである事を、@GeneratedValue(strategy = GenerationType.IDENTITY)は、主キーが自動採番されるよう宣言。

Todo.java
package com.example.todolist.Model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.Data;

// データを格納するクラス(DBへ登録、更新時の入れ物)
@Entity
@Data
@Table(name = "todolist")
public class Todo {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Integer id;

  private String content;

  private boolean done;
}

2.DBにアクセスするRepositoryを作成

データベースから値の取得、更新などのメソッドが定義されているJpaRepositoryインターフェースを継承したインターフェースを用意する。

@RepositoryでDBアクセスのクラスであると宣言、DIコンテナに登録される。

TodoRepository.java
package com.example.todolist.Repository;

import org.springframework.stereotype.Repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.example.todolist.Model.Todo;

// DBにアクセスするためのインターフェース
@Repository
public interface TodoRepository extends JpaRepository<Todo, Integer> {
}

3.具体的な処理を行うServiceを作成

@Serviceでサービスクラスである事を宣言、DIコンテナに登録される。

@Autowiredで、DIコンテナに登録されているTodoRepositoryのインスタンスを生成して返してくれている。

TodoService.java
package com.example.todolist.Service;

import java.util.List;

import com.example.todolist.Model.Todo;
import com.example.todolist.Repository.TodoRepository;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

// DBとの具体的な処理(データの取得、新規作成など)を記述するクラス
@Service
public class TodoService {

  @Autowired
  TodoRepository todoRepository;

  // todolistを全件取得
  public List<Todo> searchAll() {
    return todoRepository.findAll();
  }
}

取得したデータを画面に表示させる

Controllerを用意してDBからデータを取得し、Viewに送って画面に表示させます。

1.Controllerを作成

@Controllerでコントローラークラスである事を宣言。

@Autowiredで、DIコンテナに登録されているTodoServiceのインスタンスを生成して返してくれている。

TodoController.java
package com.example.todolist.Controller;

import java.util.List;

import com.example.todolist.Model.Todo;
import com.example.todolist.Service.TodoService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;


@Controller
public class TodoController {

  @Autowired
  TodoService todoService;

  @GetMapping("/")
  public String home(Model model) {
    List<Todo> allTodo = todoService.searchAll();
    model.addAttribute("allTodo", allTodo);
    return "home";
  }
}

@GetMapping("/")でlocalhost:8080にアクセスすると、homeメソッドが呼び出される。

todoServiceのserarchAllメソッドで、DBからデータを全件取得してmodel.addAttributeでViewにJavaオブジェクトを渡している。

2.HTMLの作成

上記Controllerでreturn "home"としているので、home.htmlを作成する。

home.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <title>SpringTodoList</title>
</head>
<body>
  <div th:each="todo : ${allTodo}">
    <p th:text="${todo.content}"></p>
  </div>
</body>

</html>

Controllerから渡されたallTodoはList型なので、
th:each="todo : ${allTodo}"のループを回してtodoに一つずつデータを格納している。

todo.contentでcontentを描画している。

SpringBootの起動

MySQLのデータが画面に表示されているか確認します。

terminal
$ mvn spring-boot:run

localhost:8080にアクセスしてみると...

スクリーンショット 2021-03-13 11.27.00.png

無事表示されました。

終わりに

CSSの記述もしていないので味気ないページですが、SpringBootとMySQLを接続してデータを表示させる事が出来ました。

ご自身の環境でも試してみてください。

次は新規登録の実装をしてみたいと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ubuntu20.04デスクトップ を使って開発してみたい

はじめに…

初めての投稿です。おかしなところあるかもしれませんが、ご容赦ください。
間違っている情報は教えていただけると嬉しいです。

やりたい事

iPad のRDPアプリ(M社製)を使ってUbuntuへログイン
Eclipse開いてJava開発をしながらスタバでドヤってみたい

やった事

通常通りVirualBoxにUbuntu20.04デスクトップ を構築
UbuntuのIP固定(CentOSばかりやってたからUbuntuの変更方法新鮮でした。)
コンフィグ作成(ファイル名はたぶん何でも良い)
参考にさせていただいた記事

/etc/netplan/99_config.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    デバイス名:
      dhcp4: false
      dhcp6: false
      addresses: [設定したいIP/24]
      gateway4: 自宅のGateWay
      nameservers:
        addresses: [192.168.1.1, 8.8.8.8]

そしてネットワーク設定の反映
この時点でコンソールからではなく、ターミナルソフトからsshで操作を行っている場合にはじかれるのでご注意を(設定したIPアドレスで再ログインしてください。)

sudo netplan apply

xrdpとGNOEMデスクトップのインストール

以下でxrdpとgnomeをインストール(デスクトップ版はもうデフォルトで入っていたりしますが、なぜかM社製のアプリからログインしようとすると真っ暗で全く動かないため入れてます。わかる方いたら教えて欲しいです…)

sudo apt install ubuntu-gnome-desktop xrdp

このあとはsystemctlコマンドで永続化したりとかしますがこの辺りは環境によるかもしれません。(私の環境ではインストール後は勝手に永続化されてました。)

Eclipse環境の用意

参考にさせていただいた記事
まずJavaをインストールします。

sudo apt install -y openjdk-11-jdk

インストール終わったら、

2021年3月現在
cd /適当なディレクトリ

sudo wget http://ftp.jaist.ac.jp/pub/eclipse/technology/epp/downloads/release/2020-03/R/eclipse-java-2020-03-R-linux-gtk-x86_64.tar.gz

sudo tar xvfz eclipse-java-2020-03-R-linux-gtk-x86_64.tar.gz

cat << EOF | sudo tee /usr/share/applications/eclipse.desktop
#!/usr/bin/env xdg-open
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Exec=/適当なディレクトリ/eclipse/eclipse
Name=eclipse
Categories=Development;
Icon=/適当なディレクトリ/eclipse/icon.xpm
EOF

Java入れて、eclipseダウンロードして、アプリケーション設定をしただけの簡単な作業です。これで、リモデしたあとアプリケーションにeclipseがあれば成功です。

ログイン後にこんなんでた…

参考にさせていただいたURL

カラーマネジメントが云々かんぬん…
ただ私の環境だと、参考情報記載のようにキャンセルができずログアウトかシャットダウンしかできなかったので、とりあえず情報を参考にしルールファイルを作成しサーバ再起動。

でなくなったからOKなのかな?とりあえずはこれで運用していきます。

参考にさせていただいた情報

IPアドレスの固定設定
Ubuntu Eclipseの設定
カラープロファイル

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ポイントカードの集計方法

Javaのプログラム初心者向けにポイントカードの集計のプログラミング課題を作りました。

課題の内容を画像で貼ります。

1.jpg

2.jpg

是非Javaで作ってみてください。今回は例外処理の実装は必要ありません。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SpringBoot2とPostgreSQLで講座受講管理アプリを作った。

概要

SpringBoot2とPostgreSQLを使って「講座受講管理アプリ」を作りました。
会社の研修の管理や研修の申し込みをする用途を想定しています。
業務要件は「平成30年度秋期システムアーキテクト試験午後Ⅰ」を参考にして、機能の実装や画面デザインは「Spring Boot 2 入門: 基礎から実演まで Kindle」を参考にしました。

Github

アプリのurl

http://54.156.83.213:8080/
社員コード「12121212」
パスワード「12121212」
一般ユーザーでログインしてください。
管理者ユーザーに比べ、一般ユーザーは機能の制限がされています。
管理者ユーザーの機能は後の章「実行イメージ」を確認してください。

環境

・eclipse
・Java8
・PostgreSQL12
・Maven
・SpringBoot2.4.3

設計要点

要求

顧客の会社では社員の研修制度を設けている。
社員の研修の受講状況を把握するために、「受講管理システム」を導入する。
社員は研修の受講の登録をして、受講履歴を見られるようにする。

ユースケース図

要件定義 (1).jpg

ER図

er (2).jpg

実装機能一覧

・認証機能、認可機能
・入力バリデーション機能
・JavaScript(JQuery)による動的フォーム
・ページネーション機能

実行イメージ

管理者の機能を貼ります。

講座マスタ登録

講座名属性に文字列をセットして、データベースにレコードを登録します。
スクリーンショット 2021-03-15 5.18.15.png

開催講座登録

講座マスタの中から、日付を指定して実際に開催する研修を登録します。
講座マスタIDと開催回で一意制を保証しています。
スクリーンショット 2021-03-15 5.19.37.png
任意の数の日付を入力するために、JavaScript(JQuery)を使ってフォームを増減させられます。
これにより、実際の研修と日付の一対多の関係を実現しています。
スクリーンショット 2021-03-15 5.22.59.png

参加者一覧表示

スクリーンショット 2021-03-15 5.23.53.png
スクリーンショット 2021-03-15 5.25.08.png

課題

機能

・メール送信機能

インフラ

・https化
・docker、ciツールでdevops化

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SpringBoot2とPostgresqlで講座受講管理アプリを作った。

概要

SpringBoot2とPostgreSQLを使って「講座受講管理アプリ」を作りました。
会社の研修の管理や研修の申し込みをする用途を想定しています。
業務要件は「平成30年度秋期システムアーキテクト試験午後Ⅰ」を参考にして、機能の実装や画面デザインは「Spring Boot 2 入門: 基礎から実演まで Kindle」を参考にしました。

Github

アプリのurl

http://54.156.83.213:8080/
社員コード「12121212」
パスワード「12121212」
一般ユーザーでログインしてください。
管理者ユーザーに比べ、一般ユーザーは機能の制限がされています。
管理者ユーザーの機能は後の章「実行イメージ」を確認してください。

環境

・eclipse
・Java8
・PostgreSQL12
・Maven
・SpringBoot2.4.3

設計要点

要求

顧客の会社では社員の研修制度を設けている。
社員の研修の受講状況を把握するために、「受講管理システム」を導入する。
社員は研修の受講の登録をして、受講履歴を見られるようにする。

ユースケース図

要件定義 (1).jpg

ER図

er (2).jpg

実装機能一覧

・認証機能、認可機能
・入力バリデーション機能
・JavaScript(JQuery)による動的フォーム
・ページネーション機能

実行イメージ

管理者の機能を貼ります。

講座マスタ登録

講座名属性に文字列をセットして、データベースにレコードを登録します。
スクリーンショット 2021-03-15 5.18.15.png

開催講座登録

講座マスタの中から、日付を指定して実際に開催する研修を登録します。
講座マスタIDと開催回で一意制を保証しています。
スクリーンショット 2021-03-15 5.19.37.png
任意の数の日付を入力するために、JavaScript(JQuery)を使ってフォームを増減させられます。
これにより、実際の研修と日付の一対多の関係を実現しています。
スクリーンショット 2021-03-15 5.22.59.png

参加者一覧表示

スクリーンショット 2021-03-15 5.23.53.png
スクリーンショット 2021-03-15 5.25.08.png

課題

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Java-トランザクション制御

トランザクション

トランザクションとは、一連の処理を一つのまとまった処理として扱うための論理的な単位です。同一トランザクションに属するSQL処理が複数ある場合

  • すべてが成功して初めて処理結果を確定する(コミット)
  • 途中で失敗したら、トランザクション実行前の状態に戻す(ロールバック)

データベースの処理結果を確定させることをコミット(commit)、実行前の状態に戻すことをロールバック(rollback)といいます。

トランザクションの利用

Javaでは、JBDC(Java DataBase Connectivity)というデータベース操作専用のAPIが提供されています。
JBDCを用いてトランザクション制御を指示するには、Connectionオブジェクトを使います。

1. setAutoCommit()-接続が確立した直後

JBDCのデフォルトでは、SQLが一つ送信されるたびに自動的にコミットされるオートコミットモードになっています。以下の宣言を行うことで明示的にトランザクション制御をできます。

  • con.setAutoCommit(false); : 自動コミットモードの解除

そして、以下の宣言を行うことで自動的にコミットさレルオートコミットモードに戻すことができます。

  • con.setAutoCommit(true); : 自動コミットモードの設定

2. commit-一連のSQLを全て送信し終わったとき

一連ののトランザクションに必要なSQL文を全て送信したら、commitを呼び出してコミットします。

  • com.commit(); : 送信済みの処理要求の確定(コミット)

この呼び出しにより、前回のcommit()以降に送信された全てのSQL要求が一つのトランザクションとみなされ、実行結果が確定される。

3.rollback()-途中で異常を検知したとき

複数のSQL要求を送信している途中で異常を検知したらり、何らかの理由で処理をキャンセルしたい場合、rollback()を使います。

  • con.rollack(); : 送信済みの処理要求をキャンセル(ロールバック)

この呼び出しにより、commit()以降に送信されたすべてのSQl要求が全てロールバックされます。また、プログラム中で明示的にrollbackを呼び出さなくても、データベースの接続が途中で切断された場合やJavaプログラムまたはデータベースの強制終了によって最終的にcommit()が発行されない場合、データベースは自動的にロールバックを行います。

サンプルコード

import java.sql.*;


public class Main {
    public static void main(String[] args) {

        try {
            // JDBCドライバーの有効化
            Class.forName("org.h2.Driver");
        } catch(ClassNotFoundException e) {
            e.printStackTrace();
        }

        Connection con = null;
        try {
            // データベースの接続
            con = DriverManager.getConnection("jdbc:j2:~/rpgdb");  // JDBC URLを指定
            // オートコミット解除
            con.setAutoCommit(false);

            /** SQL発行処理(省略) */

            // トランザクションのコミット
            con.commit();
            // SQLExceptionが発生した場合の処理
        } catch(SQLException e) {
            try {
                // トランザクションのロールバック
                con.rollback();
            } catch (SQLException e2) {
                // スタックトレースを出力
                e2.printStackTrace();
            }
        } finally {
            if(con != null) {
                try {
                    // オートコミット有効化
                    con.setAutoCommit(true);
                    // データベース接続の切断
                    con.close();
                } catch(SQLException e3) {
                    // スタックトレースを出力
                    e3.printStackTrace();
                }
            }
        }
    }
}



  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ROS2Javaをビルドする

はじめに

とある研修の教材作りにROS2を使用してはどうか、たまたま周りにJavaできる人多いよねという事で、私が手始めにROS2Javaを触ってみることにしました。
(この記事は身内向けの記事ですが、他にROS2Javaを試してみたい方にも参考になるかもしれないので投稿しました。)
まずはROS2Javaのリポジトリを見て、自分のMacBook Airにインストールしてみようと思いましたがbrew/pipで入れる依存モジュールやROS/ROS2の依存モジュールのバージョンの組み合わせが悪いのかビルドがうまくいきませんでした。
今回はいろいろ試行錯誤してできたビルド手順をまとめておきたいと思います。
macのローカルではなくUbuntu18.04のDockerコンテナ内でのビルドになります。

環境

  • OS : macOS 10.15.7
  • CPU : 1.2 GHz クアッドコアIntel Core i7
  • Docker : 20.10.0

ビルド手順

Docker Imageのダウンロード

これを研修で使うにあたり、参加者のそれぞれのPCのローカルでROS2Javaをビルドするものならば環境の違いでビルドが通らないことが往々にして発生しうるだろうということで、Dockerコンテナ内でビルド環境を作ってこれを配布した方がいいと思いました。
既にビルド環境が整っているUbuntuのImageを見つけたので、これを使用することにします。

docker pull theosakamg7/ros2_java_docker:ubuntu-ros2java

コンテナ起動

念のためコンテナ内のビルドに使用するディレクトリをローカルにマウントしておきます。
ローカルにマウント用のディレクトリを作っておきます。

mkdir volume

起動のための
docker-compose.ymlを用意します。

docker-compose.yml
version: '3'
services:
  ros2java_ubuntu:
    image: theosakamg7/ros2_java_docker:ubuntu
    command: bash -c "/bin/bash"
    tty: true
    stdin_open: true
    volumes:
      - ./volume:/home/travis

コンテナ内に入りましょう。

docker-compose up -d
docker-compose exec ros2java_ubuntu bash 

ビルド作業

amentのビルド

amentとはcmakeベースのビルドツールです。
ROS2をビルドする際に使用します。
まずは作業ディレクトリを作っておきましょう。

cd /home/travis/
mkdir ament_ws/src
cd ament_ws
touch ament_java.repos

ament_java.reposに以下を記述します。

ament_java.repos
repositories:
  ament/ament_cmake:
    type: git
    url: https://github.com/ament/ament_cmake.git
    version: 0.5.1
  ament/ament_index:
    type: git
    url: https://github.com/ament/ament_index.git
    version: 0.5.1
  ament/ament_lint:
    type: git
    url: https://github.com/ament/ament_lint.git
    version: 0.5.2
  ament/ament_package:
    type: git
    url: https://github.com/ament/ament_package.git
    version: 0.5.2
  ament/ament_tools:
    type: git
    url: https://github.com/esteve/ament_tools.git
    version: win32-platform
  ament/googletest:
    type: git
    url: https://github.com/ament/googletest.git
    version: 4b6e624e78ba3d43c1602ffc80478ee7253e0b04
  ament/osrf_pycommon:
    type: git
    url: https://github.com/osrf/osrf_pycommon.git
    version: 0.1.5
  ament/uncrustify:
    type: git
    url: https://github.com/ament/uncrustify.git
    version: 0.66.1
  ament_java/ament_java:
    type: git
    url: https://github.com/esteve/ament_java.git
    version: master

vcsを用いてソースコード一式をダウンロードし、amentをビルドします。
なお、vcsはDocker Imageにプリインストール済みなのでいきなり使えます。

vcs import src < ament_java.repos
src/ament/ament_tools/scripts/ament.py build --symlink-install --isolated

ROS2Javaのビルド

cd /home/travis
mkdir ros2java_ws/src
cd ros2java_ws
touch ros2_java_desktop.repos

公式リポジトリのREADME通りではビルドエラー吐きまくるので、試行錯誤しました。。。
2021/03/13現在以下の依存モジュールのバージョンでビルドできました。
ros2_java_desktop.reposに以下を記述します。

ros2_java_desktop.repos
repositories:
  eProsima/Fast-CDR:
    type: git
    url: https://github.com/eProsima/Fast-CDR.git
    version: v1.0.7
  eProsima/Fast-RTPS:
    type: git
    url: https://github.com/eProsima/Fast-RTPS.git
    version: 7a0b0fe7ca8d2c4ea41e36744c6024c263a6505a
  ros/class_loader:
    type: git
    url: https://github.com/ros/class_loader.git
    version: 1.1.0
  ros/console_bridge:
    type: git
    url: https://github.com/ros/console_bridge.git
    version: ad25f7307da76be2857545e7e5c2a20727eee542
  ros2/console_bridge_vendor:
    type: git
    url: https://github.com/ros2/console_bridge_vendor.git
    version: 1.3.0
  ros2/ament_cmake_ros:
    type: git
    url: https://github.com/ros2/ament_cmake_ros.git
    version: 0.5.0
  ros2/common_interfaces:
    type: git
    url: https://github.com/ros2/common_interfaces.git
    version: 0.5.0
  ros2/example_interfaces:
    type: git
    url: https://github.com/ros2/example_interfaces.git
    version: 0.5.0
  ros2/launch:
    type: git
    url: https://github.com/ros2/launch.git
    version: 0.5.2
  ros2/libyaml_vendor:
    type: git
    url: https://github.com/ros2/libyaml_vendor.git
    version: 1.0.0
  ros2/poco_vendor:
    type: git
    url: https://github.com/ros2/poco_vendor.git
    version: 1.1.1
  ros2/tinydir_vendor:
    type: git
    url: https://github.com/ros2/tinydir_vendor.git
    version: v1.0.0
  ros2/rcl:
    type: git
    url: https://github.com/ros2/rcl.git
    version: 0.5.1
  ros2/rcl_interfaces:
    type: git
    url: https://github.com/ros2/rcl_interfaces.git
    version: 0.5.0
  ros2/rclpy:
    type: git
    url: https://github.com/ros2/rclpy.git
    version: 0.5.3
  ros2/rcutils:
    type: git
    url: https://github.com/ros2/rcutils.git
    version: 0.5.1
  ros2/rmw:
    type: git
    url: https://github.com/ros2/rmw.git
    version: 0.5.0
  ros2/rmw_fastrtps:
    type: git
    url: https://github.com/ros2/rmw_fastrtps.git
    version: 0.5.1
  ros2/rmw_implementation:
    type: git
    url: https://github.com/ros2/rmw_implementation.git
    version: 0.5.1
  ros2/rmw_opensplice:
    type: git
    url: https://github.com/ros2/rmw_opensplice.git
    version: 0.5.2
  ros2/ros2cli:
    type: git
    url: https://github.com/ros2/ros2cli.git
    version: 0.5.3
  ros2/rosidl:
    type: git
    url: https://github.com/ros2/rosidl.git
    version: 0.5.1
  ros2/rosidl_typesupport_opensplice:
    type: git
    url: https://github.com/ros2/rosidl_typesupport_opensplice.git
    version: 0.5.0
  ros2/rosidl_typesupport:
    type: git
    url: https://github.com/ros2/rosidl_typesupport
    version: 0.5.0
  ros2/rosidl_dds:
    type: git
    url: https://github.com/ros2/rosidl_dds.git
    version: 0.5.0
  ros2/rosidl_defaults:
    type: git
    url: https://github.com/ros2/rosidl_defaults.git
    version: 0.5.0
  ros2/rosidl_python:
    type: git
    url: https://github.com/ros2/rosidl_python.git
    version: 0.5.2
  ros2_java/ros2_java:
    type: git
    url: https://github.com/esteve/ros2_java.git
    version: 62918477f4fb8810d4df0ac9c9e67b885b635d01
  ros2_java/ros2_java_examples:
    type: git
    url: https://github.com/esteve/ros2_java_examples.git
    version: 4305e58493bfa37484457b3fe12525cbc0f87319
  ros2/unique_identifier_msgs:
    type: git
    url: https://github.com/ros2/unique_identifier_msgs.git
    version: 2.2.0
  ros2/test_interface_files:
    type: git
    url: https://github.com/ros2/test_interface_files.git
    version: 124823291a0a7d35e983b2e00abc8803ec4cdbb2

ROS2Javaをビルドします。
まだまだ付け焼き刃的な対応が入っているので、追々根本的な調査と修正を行ってから追記する予定です。

vcs import src < ros2_java_desktop.repos
. ../ament_ws/install_isolated/local_setup.sh
# 途中Javaソースコードのコンパイルエラーが起きるので、一旦回避するため変えておく
sed -ie 's/client\.waitForService()/true/' ./src/ros2_java/ros2_java_examples/rcljava_examples/src/main/java/org/ros2/rcljava/examples/client/AddTwoIntsClient.java
# test_msgsだけビルドエラーが消えなかったので一旦スキップ
ament build --symlink-install --isolated --skip-packages test_msgs
. ./install_isolated/local_setup.sh

これでビルドが完了すればros2コマンドが使用できるはずです。

最後に

ここのリポジトリに作業用のワークスペースを作ったので、よかったら使ってみてください。
https://github.com/sho-hama/building_ros2_java

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む