システム全体の可用性から検討する
冗長構成 ハードウェア:CPU , I/O, 伝送路, 電源、スイッチ
DRも含むのか
検討事項 目的:システム復旧、データ復旧 バックアップ対象:基盤、アプリケーションデータ、ユーザデータ 取得周期・世代数:目標復旧時間(RTO), 目標復旧時点(RPO)24時間なら一日1回 取得可能時間 方法:backup、スナップショット、手動バックアップ(更新作業じなど) 取得媒体
システム全体の可用性から検討する
冗長構成 ハードウェア:CPU , I/O, 伝送路, 電源、スイッチ
DRも含むのか
検討事項 目的:システム復旧、データ復旧 バックアップ対象:基盤、アプリケーションデータ、ユーザデータ 取得周期・世代数:目標復旧時間(RTO), 目標復旧時点(RPO)24時間なら一日1回 取得可能時間 方法:backup、スナップショット、手動バックアップ(更新作業じなど) 取得媒体
■ログイン後に一度だけ読み込まれるファイル
(1) /etc/profile globalに適用される
(2) .bash_profile .bash_profileが存在しない場合、.bash_login→.profileの順で探す ログイン時に起動されるので、 よく使われる内容 ログインの際に環境変数を設定する目的で使うことが多い コンソールの表示を定義する
※ログイン中に読み込み直したいときは source ~/.bash_profile ※ログインシェルは/etc/passwdに指定されている
■シェル起動時に毎回起動されるファイル .bashrc bashを起動する際に毎回呼ばれる シェル関数、コマンドライン補完、エイリアスの定義などで使われる *bash_profileで予め読んでおく
■ログインシェルが終了するた度に読み込まれて実行されるファイル
.bash_logout
■一時的に環境変数を変更 Export 環境変数=値 ※永続的に設定する場合は、profileなどに記載しておく。
■その他
bashの利用履歴が残る
Export
ログインシェル セキュリティ対策としてApache等のアカウントはシェルの指定を解除したほうがよい MACでは.bash_profileは最初準備されていないので、自分で作成する touch .bash_profile touch .bashrc
ログインし直すか、以下コマンドで反映 source ~/.bashrc
プロンプトの色を変える PS1="[\e[34m]\u@\h \W[\e[0m] $ " [ と ]で囲んだところは「エスケープシーケンス」(なくても一応動く) \e[ はASCIIのエスケープ文字を使う意味で、1mは「太字」、0mは「装飾をリセットする」という意味。
設定例 \h ホスト名 \u ユーザー名 \w ディレクトリ(フルパス) \W ディレクトリ \t 時間24 \T 時間12 \@ AM / PM \d 日付 \D 日時 # コマンドの番号 \n 改行 \$ 一般ユーザの時$, rootの時#を表示
色 30m 黒 31m 赤 32m 緑 33m 黄 34m 青 35m 紫 36m 水色 37m 白
例えば社内LANでProxyが設定してある場合、何も設定していないままだと Gradleでのライブラリの読み込みが失敗します。
そんな時は、以下の設定を行えば読み込むことが出来るようになるでしょう。
STSのメニューから[Window] >> [Preferences]
以下の画面で設定すればOKです。(画面は設定前)
いまいちボヤっとしてましたので、調べた範囲でまとめておきます。
Exceptionの特徴
実際に,指定されたパス名で示されるファイルが開けなかった場合は、FileNotFoundExceptionに投げられると
思いますが、このクラスは、以下の様にException-IOExceptionの配下ですね。(RuntimeException配下ではない)
java.lang.Object ┗ java.lang.Throwable ┗java.lang.Exception ┗java.io.IOException ┗java.io.FileNotFoundException
FileNotFoundException (Connected Device Configuration (CDC), バージョン 1.1.2)
RuntimeExceptionの特徴
0で除算した場合は、ArithmeticExceptionに投げられると思いますが、このクラスは以下のようにRuntimeExceptionの配下ですね。
java.lang.Object ┗java.lang.Throwable ┗java.lang.Exception ┗java.lang.RuntimeException ┗java.lang.ArithmeticException
ArithmeticException (Connected Device Configuration (CDC), バージョン 1.1.2)
その他補足
全ての例外に対して全部Try Catchしたらコードが分かり辛くてしょうがない
ユーザ定義例外についても、リカバリ処理の要否の観点でどちらのサブクラスにするかを決める
今回調査したのは、ユーザ定義例外をどうしようかな。。と思っていたことが発端でした。
Spring BootとThymeleafを利用してログイン画面を作成してみます。
まずはHTMLにてログイン画面を作成します。
<!doctype html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title>Login</title> </head> <body> <form id="form" action="/login" method="POST"> <table> <tr> <td> ID </td> <td> <input type="text" id="loginId" name="loginId" value=""> </td> </tr> <tr> <td> Password </td> <td> <input type="password" id="password" name="password" value=""> </td> </tr> <tr> <td colspan="2"> <input type="submit" value="login"/> </td> </tr> </table> </form> </body> </html>
次に、ログイン結果を表示する画面をHTMLで作成します。 ${message}はコントローラからログイン結果の値を受けとって表示します。 th:textはthymeleafのタグです。
<!doctype html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title>Login Result</title> </head> <body> <h1 th:text="${message}"></h1> </body> </html>
次はDatabase、環境はMySQLを使っています。 かなり雑ですが、以下のようにテーブルを作っています。 今回必要なのは、idとpasswordだけです。
mysql> desc employee; +------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+-------+ | id | varchar(100) | YES | | NULL | | | name | varchar(50) | YES | | NULL | | | email | varchar(50) | YES | | NULL | | | updated_at | varchar(50) | YES | | NULL | | | created_at | varchar(50) | YES | | NULL | | | password | varchar(100) | YES | | NULL | | +------------+--------------+------+-----+---------+-------+
SpringとMySQLの接続は、application.propertiesに以下を追加します。コンパイル環境はGradleです。
[databasename]の箇所にDB名を指定して、DBへの接続ユーザおよびパスワードを指定します。
spring.datasource.url=jdbc:mysql://localhost:3306/[databasename]?autoReconnect=true&useSSL=false spring.datasource.username=xxxx spring.datasource.password=xxxx
次に、テーブルと紐付いたEntityを作成します。SetterとGetterは省略しています。
package com.hello.entity; import java.sql.Timestamp; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "Employee") public class EmployeeEntity { private static final long serialVersionUID = 1L; @Id @Column private String id; @Column private String name; @Column private String email; @Column private Timestamp updatedAt; @Column private Timestamp createdAt; @Column private String password;
続けてテーブルからデータを取得するためのRepositoryを作成。
呼び出し元からidとpasswordは渡されます。
findByIdAndPasswordについては、JPAのルールに従って記載すればSQLなしで同等の処理を行ってくれます。
package com.hello.repository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import com.hello.entity.EmployeeEntity; @Repository public interface EmployeeRepository extends JpaRepository<EmployeeEntity, String> { EmployeeEntity findByIdAndPassword(String id, String password ); }
最後はControllerの編集。loginメソッドでは、ルートへアクセスされた場合はログイン画面を表示
するようにします。
loginCheckメソッドでは、ログイン画面のSubmitを押下後にログインチェックを
行い、結果を別の画面に返すようにしています。
package com.hello; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; import com.hello.entity.EmployeeEntity; import com.hello.repository.EmployeeRepository; @Controller public class HelloController { @Autowired EmployeeRepository employeeRepository; @RequestMapping(path = "/", method = RequestMethod.GET) public ModelAndView login(ModelAndView mav) { mav.setViewName("login"); //ModelAndViewクラスにViewのページ名を指定 return mav; //ModelAndViewを返す } @RequestMapping(path = "/login", method = RequestMethod.POST) public ModelAndView loginCheck(@RequestParam("loginId") String id, @RequestParam("password") String password, ModelAndView mav) { String idd = id; EmployeeEntity employeeEntity = employeeRepository.findByIdAndPassword(id, password); if(employeeEntity == null) { mav.addObject("message", "FAILURE!!"); }else { mav.addObject("message", "SUCCESS!!"); } mav.setViewName("result"); //ModelAndViewクラスにViewのページ名を指定 return mav; //ModelAndViewを返す } }
では確認してみます。
まずはログイン画面へアクセス。
正しいIDとパスワードを入力して、loginボタンを押下すると・・・
でましたーー!
かなり端折ってしまいましたが・・・(汗)
時間があるときに説明書きを増やせたらいいなと思っています。
Spring BootでJPAを利用する際に、使ったSQLをログに出力する方法をメモしておきます。 方法は簡単です。
apprication.propertiesに以下入力するだけ。
logging.level.org.hibernate.SQL=debug
ただし、これだけだとバインドされるパラメータがわからないので、以下も追記すれば
パラメータも表示することができます。
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=trace logging.level.org.hibernate.type.EnumType=trace
画像はちょっとSQLが切れてるけど、こんな感じ。パラメータも出てますね。