- 投稿日:2021-03-15T18:55:25+09:00
EasyBuggyとEasyBuggy BootをEclipseから同時に実行する
EasyBuggy / EasyBuggy Bootとは
メモリリーク、デッドロック、JVMクラッシュ、SQLインジェクションなど、バグや脆弱性の動作を理解するためにつくられたバグだらけのWebアプリケーションです。Apache 2.0ライセンスで公開されています。
EasyBuggyは基本的な技術のみが使われていますが、EasyBuggy BootはSpring Bootなどの新しい技術が使われています。
やりたいこと
EasyBuggyとEasyBuggy Bootを同時に実行・デバッグしたい。
具体的には下記のようなことを実現したい。
- 伝統的なJavaのコードとSpring Frameworkに則ったコードを比較したい
- それぞれのコードにおける脆弱性の修正を試みたい
- それぞれの環境の切り替えのコストを下げたい
インストール
前提条件
Eclipseがインストールされていること。
また、GitとMavenがインストールされ、パスが通っていること。
下記のコマンドを実行することで確認が可能。$ git --version $ mvn -versionEclipseプロジェクトの作成
EasyBuggy$ git clone https://github.com/k-tamura/easybuggy.git $ cd easybuggy $ mvn eclipse:eclipse -Dwtpversion=2.0EasyBuggy Boot$ git clone https://github.com/k-tamura/easybuggy4sb.git $ cd easybuggy4sb $ mvn eclipse:eclipseEclipseへのインポート
File > Import
を選択するGeneral > Existing Projects into Workspace
を選択し、Import Projectsダイアログを表示するSelect root directory
に先ほどcloneしたフォルダ2つを選択するFinish
ボタンを押すEasyBuggyの独自設定
Serverを追加
- Serversビューを開き、右クリック。
New > Server
を選択する- Tomcat v8.5 Server(他のでも良いと思う)を選択し、
Next
ボタンを押す- Available から
easybuggy
を選択する。Add
ボタンを押して Configured に移動させるFinish
ボタンを押すポートを変更
そのままでは、EasyBuggy Bootと利用しているポートが衝突するため、ポートを変更する。
- 追加されたサーバーをダブルクリックし、Overviewビューを表示する
- Portsタブ以下のPort Name:
HTTP/1.1
のPort Numberを任意の値に書き換える(例: 9080)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
ボタンを押す。
その後、下記にアクセスする。
まとめ
おつかれさまでした。
トラブルシューティング
EasyBuggyの起動に失敗する場合
一度
mvn verify
コマンドを実行することで、直ることがあります。関連記事
- 投稿日:2021-03-15T18:55:25+09:00
EasyBuggyとEasyBuggy BootをEclipseから同時に開発・デバッグできるようにするまで
EasyBuggy / EasyBuggy Bootとは
メモリリーク、デッドロック、JVMクラッシュ、SQLインジェクションなど、バグや脆弱性の動作を理解するためにつくられたバグだらけのWebアプリケーションです。Apache 2.0ライセンスで公開されています。
EasyBuggyは基本的な技術のみが使われていますが、EasyBuggy BootはSpring Bootなどの新しい技術が使われています。
やりたいこと
EasyBuggyとEasyBuggy Bootを同時に実行・デバッグしたい。
具体的には下記のようなことを実現したい。
- 伝統的なJavaのコードとSpring Frameworkに則ったコードを比較したい
- それぞれのコードにおける脆弱性の修正を試みたい
- それぞれの環境の切り替えのコストを下げたい
インストール
前提条件
Eclipseがインストールされていること。
また、GitとMavenがインストールされ、パスが通っていること。
下記のコマンドを実行することで確認が可能。$ git --version $ mvn -versionEclipseプロジェクトの作成
EasyBuggy$ git clone https://github.com/k-tamura/easybuggy.git $ cd easybuggy $ mvn eclipse:eclipse -Dwtpversion=2.0EasyBuggy Boot$ git clone https://github.com/k-tamura/easybuggy4sb.git $ cd easybuggy4sb $ mvn eclipse:eclipseEclipseへのインポート
File > Import
を選択するGeneral > Existing Projects into Workspace
を選択し、Import Projectsダイアログを表示するSelect root directory
に先ほどcloneしたフォルダ2つを選択するFinish
ボタンを押すEasyBuggyの独自設定
Serverを追加
- Serversビューを開き、右クリック。
New > Server
を選択する- Tomcat v8.5 Server(他のでも良いと思う)を選択し、
Next
ボタンを押す- Available から
easybuggy
を選択する。Add
ボタンを押して Configured に移動させるFinish
ボタンを押すポートを変更
そのままでは、EasyBuggy Bootと利用しているポートが衝突するため、ポートを変更する。
- 追加されたサーバーをダブルクリックし、Overviewビューを表示する
- Portsタブ以下のPort Name:
HTTP/1.1
のPort Numberを任意の値に書き換える(例: 9080)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
ボタンを押す。
その後、下記にアクセスする。
まとめ
おつかれさまでした。
トラブルシューティング
EasyBuggyの起動に失敗する場合
一度
mvn verify
コマンドを実行することで、直ることがあります。関連記事
- 投稿日:2021-03-15T17:23:26+09:00
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"; }}
?>
分岐処理をマスターした方は是非挑戦してみてください。
- 投稿日:2021-03-15T16:39:49+09:00
javaのmockitoを使用してリスト型データを返すには
Junitで単体テストをする。(ライブラリ下記を使用)
・Eclipse4.8
・Java 8
・mockit-1.10.19
・junit-4.12package 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 を参照
- 投稿日:2021-03-15T15:58:28+09:00
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に書いて対応しよう、という記事でした。
ご精読ありがとうございました。
- 投稿日:2021-03-15T15:58:28+09:00
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に書いて対応しよう、という記事でした。
ご精読ありがとうございました。
- 投稿日:2021-03-15T14:13:27+09:00
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 class1.DBを作成、テストデータの作成
まずMySQLでデータベースを作成します。
データベース作成CREATE DATABASE spring_todolist_qiita;mysqlmysql> 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と同じ階層に各フォルダを作成して、それぞれ中身を実装していきます。
1.エンティティモデルの作成
@Entity
でエンティティクラスである事を宣言し、データベースのテーブルとマッピング。
@Table(name = "todolist")
は、エンティティクラスとマッピングされるDBのテーブル名を指定する。
@Id
は、主キーである事を、@GeneratedValue(strategy = GenerationType.IDENTITY)
は、主キーが自動採番されるよう宣言。Todo.javapackage 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.javapackage 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.javapackage 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.javapackage 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:runlocalhost:8080にアクセスしてみると...
無事表示されました。
終わりに
CSSの記述もしていないので味気ないページですが、SpringBootとMySQLを接続してデータを表示させる事が出来ました。
ご自身の環境でも試してみてください。
次は新規登録の実装をしてみたいと思います。
- 投稿日:2021-03-15T13:43:36+09:00
Ubuntu20.04デスクトップ を使って開発してみたい
はじめに…
初めての投稿です。おかしなところあるかもしれませんが、ご容赦ください。
間違っている情報は教えていただけると嬉しいです。やりたい事
iPad のRDPアプリ(M社製)を使ってUbuntuへログイン
Eclipse開いてJava開発をしながらスタバでドヤってみたいやった事
通常通りVirualBoxにUbuntu20.04デスクトップ を構築
UbuntuのIP固定(CentOSばかりやってたからUbuntuの変更方法新鮮でした。)
コンフィグ作成(ファイル名はたぶん何でも良い)
参考にさせていただいた記事/etc/netplan/99_config.yamlnetwork: 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 applyxrdpと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 EOFJava入れて、eclipseダウンロードして、アプリケーション設定をしただけの簡単な作業です。これで、リモデしたあとアプリケーションにeclipseがあれば成功です。
ログイン後にこんなんでた…
カラーマネジメントが云々かんぬん…
ただ私の環境だと、参考情報記載のようにキャンセルができずログアウトかシャットダウンしかできなかったので、とりあえず情報を参考にしルールファイルを作成しサーバ再起動。でなくなったからOKなのかな?とりあえずはこれで運用していきます。
参考にさせていただいた情報
- 投稿日:2021-03-15T09:39:05+09:00
ポイントカードの集計方法
- 投稿日:2021-03-15T03:58:14+09:00
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設計要点
要求
顧客の会社では社員の研修制度を設けている。
社員の研修の受講状況を把握するために、「受講管理システム」を導入する。
社員は研修の受講の登録をして、受講履歴を見られるようにする。ユースケース図
ER図
実装機能一覧
・認証機能、認可機能
・入力バリデーション機能
・JavaScript(JQuery)による動的フォーム
・ページネーション機能実行イメージ
管理者の機能を貼ります。
講座マスタ登録
講座名属性に文字列をセットして、データベースにレコードを登録します。
開催講座登録
講座マスタの中から、日付を指定して実際に開催する研修を登録します。
講座マスタIDと開催回で一意制を保証しています。
任意の数の日付を入力するために、JavaScript(JQuery)を使ってフォームを増減させられます。
これにより、実際の研修と日付の一対多の関係を実現しています。
参加者一覧表示
課題
機能
・メール送信機能
インフラ
・https化
・docker、ciツールでdevops化
- 投稿日:2021-03-15T03:58:14+09:00
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設計要点
要求
顧客の会社では社員の研修制度を設けている。
社員の研修の受講状況を把握するために、「受講管理システム」を導入する。
社員は研修の受講の登録をして、受講履歴を見られるようにする。ユースケース図
ER図
実装機能一覧
・認証機能、認可機能
・入力バリデーション機能
・JavaScript(JQuery)による動的フォーム
・ページネーション機能実行イメージ
管理者の機能を貼ります。
講座マスタ登録
講座名属性に文字列をセットして、データベースにレコードを登録します。
開催講座登録
講座マスタの中から、日付を指定して実際に開催する研修を登録します。
講座マスタIDと開催回で一意制を保証しています。
任意の数の日付を入力するために、JavaScript(JQuery)を使ってフォームを増減させられます。
これにより、実際の研修と日付の一対多の関係を実現しています。
参加者一覧表示
課題
- 投稿日:2021-03-15T01:37:15+09:00
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(); } } } } }
- 投稿日:2021-03-15T01:00:00+09:00
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.ymlversion: '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.reposament_java.reposに以下を記述します。
ament_java.reposrepositories: 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: mastervcsを用いてソースコード一式をダウンロードし、amentをビルドします。
なお、vcsはDocker Imageにプリインストール済みなのでいきなり使えます。vcs import src < ament_java.repos src/ament/ament_tools/scripts/ament.py build --symlink-install --isolatedROS2Javaのビルド
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.reposrepositories: 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: 124823291a0a7d35e983b2e00abc8803ec4cdbb2ROS2Javaをビルドします。
まだまだ付け焼き刃的な対応が入っているので、追々根本的な調査と修正を行ってから追記する予定です。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