IT graph

気になったデバイスやプログラムで楽しくやっていけたら良いなと思っております。

バックアップ / リストア運用

システム全体の可用性から検討する

冗長構成  ハードウェア:CPU , I/O, 伝送路, 電源、スイッチ

DRも含むのか

検討事項  目的:システム復旧、データ復旧  バックアップ対象:基盤、アプリケーションデータ、ユーザデータ  取得周期・世代数:目標復旧時間(RTO), 目標復旧時点(RPO)24時間なら一日1回  取得可能時間  方法:backup、スナップショット、手動バックアップ(更新作業じなど)  取得媒体

Linux profileについて

■ログイン後に一度だけ読み込まれるファイル

(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_history

 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 白

Spring boot 2でのプロキシ設定 / Proxy setting in spring boot2

例えば社内LANでProxyが設定してある場合、何も設定していないままだと Gradleでのライブラリの読み込みが失敗します。

そんな時は、以下の設定を行えば読み込むことが出来るようになるでしょう。

STSのメニューから[Window] >> [Preferences]
f:id:ice_black:20180603124112p:plain

以下の画面で設定すればOKです。(画面は設定前)
f:id:ice_black:20180603124337p:plain

ExceptionとRuntimeExceptionの違い(Java)

いまいちボヤっとしてましたので、調べた範囲でまとめておきます。

Exceptionの特徴

  • 例外発生時にリカバリ処理が想定される(指定されたパス名で示されるファイルが開けなかった等)
  • Try Catchが必要(Catch内でリカバリ処理を行う)
  • コンパイル時にチェックされる

実際に,指定されたパス名で示されるファイルが開けなかった場合は、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で割った等)

  • Try Catchは必要なし

  • コンパイル時にチェックされない

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 Boot2でログイン画面を作ってみた / How to create login function with Spring Boot2!

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を返す
    }
}

では確認してみます。
まずはログイン画面へアクセス。

f:id:ice_black:20180502113546p:plain

正しいIDとパスワードを入力して、loginボタンを押下すると・・・ でましたーー!
f:id:ice_black:20180502113814p:plain

かなり端折ってしまいましたが・・・(汗)
時間があるときに説明書きを増やせたらいいなと思っています。

MACでスクリーンショットをクリップボードに保存!

いつもMACスクリーンショットの撮り方を忘れてしまうのでメモ。

■画面全体をスクリーンショット
command + shift + control + 3
■画面上を範囲選択してスクリーンショット
command + shift + control + 4

Spring BootでJPAのSQLログを出力する方法 / How to output JPA SQL log in Spring Boot

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が切れてるけど、こんな感じ。パラメータも出てますね。 f:id:ice_black:20180429164020p:plain