気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

MySQL Supser権限を付与する

Supser権限を付与

テーブル定義+データインポートの際に、Super権限が必要との事だったので、付与

Super権限が付与されていないことを確認

SELECT host, user, Super_priv FROM mysql.user WHERE user='hoge';
+-----------+---------------+------------+
| host      | user          | Super_priv |
+-----------+---------------+------------+
| localhost | root          | Y          |
| localhost | mysql.session | Y          |
| localhost | mysql.sys     | N          |
| localhost | hoge          | N          |
+-----------+---------------+------------+

Super権限を付与する

UPDATE mysql.user SET Super_priv='Y' WHERE user='hoge';
SELECT host, user, Super_priv FROM mysql.user WHERE user='hoge';
+-----------+---------------+------------+
| host      | user          | Super_priv |
+-----------+---------------+------------+
| localhost | root          | Y          |
| localhost | mysql.session | Y          |
| localhost | mysql.sys     | N          |
| localhost | hoge          | Y          |
+-----------+---------------+------------+

DBアクセス MyBatisの各種ファイルを自動生成するための設定

公式の下記ページをGoogle翻訳した手順を貼っておく。

MyBatis各種ファイル自動設定 http://www.mybatis.org/generator/index.html

MyBatis各種ファイル自動生成する

以下、翻訳したものを引用

eclipseマーケットプレイスで、プラグイン「MyBatis Generator」を検索して、インストール

②構成ファイルを作成します。 ファイル>新規>その他 [MyBatis]カテゴリから[MyBatis Generator構成ファイル]を選択し、[次へ]をクリックします。 ファイルの場所とファイルの名前を指定します(デフォルトはgeneratorConfig.xml)。 ウィザードを終了する

③設定ファイルを書く 少なくとも、以下を指定する必要があります。 ・ターゲットデータベースへの接続方法を指定するjdbcConnection情報 ・javaModelGeneratorのターゲットパッケージとターゲットプロジェクト ・sqlMapGeneratorのターゲットパッケージとターゲットプロジェクト ・ターゲットパッケージ、ターゲットプロジェクト、およびjavaClientGeneratorのタイプ(またはJavaクライアントを生成したくない場合は、javaClientGenerator要素を削除できます) ・少なくとも1つのデータベーステーブル

ファイルを保存する

Eclipseのナビゲーター、またはパッケージ・エクスプローラーの構成ファイルを右クリックして、メニュー・オプション「Run As> Run MyBatis Generator」を表示してください。

自動生成コマンド実行時に発生したエラー

C:\work\workspace\.metadata\.plugins\org.mybatis.generator.eclipse.ui\.generatedAntScripts\sample-generationConfig.xml.xml:4:
The server time zone value ' (W)' is unrecognized or represents more than one time zone. 
You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
    <!-- スキーマ情報を取得する DB への接続設定 -->
    <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
        connectionURL="jdbc:mysql://localhost:3306/db_name"

接続先URLに「?serverTimezone=JST」とパラメータを付与して回避。

  javax.net.ssl.SSLException

  MESSAGE: closing inbound before receiving peer's close_notify

自動生成時のコンソールに上記エラー発生。「useSSL=false」もURLに付与してみたりしたが、今度は自動生成できなくなったので。一旦、放置。。

DBコネクションクローズ時のエラーのため、ファイル自体は生成できていた。

MySQLでちょっと動作確認するときに使えるTableとData

この程度のものなら、さっと自分で書いてもよいのかもしれないけど。 時間がないときにさっと作れるように残しておく。

データベースを作成していない場合は、以下の記事を参考にしてみてください。 http://tamata78.hatenablog.com/entry/2019/05/26/111113

サンプルテーブル

create table staff
(
id integer,
name char(16),
branch char(20),
age integer
);

サンプルデータ

INSERT INTO staff (id, name, branch, age) VALUES (1 ,'Tanaka','Tokyo',29);
INSERT INTO staff (id, name, branch, age) VALUES (2 ,'Yamada','Yokohama',31);
INSERT INTO staff (id, name, branch, age) VALUES (3 ,'Sugiura','Chiba',34);
INSERT INTO staff (id, name, branch, age) VALUES (4 ,'Yamano','Osaka',25);
INSERT INTO staff (id, name, branch, age) VALUES (5 ,'Nakajima','Yokohama',38);
INSERT INTO staff (id, name, branch, age) VALUES (6 ,'Suzuki','Tokyo',24);

MySQL公式のサンプルデータベースSakila

もう少し大規模なサンプルが欲しいときに使えるデータベース。 https://masayuki14.hatenablog.com/entry/sakila

テーブルに加え、ビュー、ストアドプロシージャ、トリガが含まれており、学習用に使える。

MySQL DBとUser作成して、テーブル作成できる状態にする

ローカルのMySQLで、SQL実行環境を作る際の一連の流れを以下に記載します。

前提条件

OS: macOS 10
SQLは、ターミナル上のコマンドラインで実行

MySQLのインストールが済んでいない方は以下を参考にしてみて下さい。

HomebrewでMySQLをインストールする

Windows版をインストールしたい方こちらから、インストーラーをダウンロードして、実行して下さい。

新しくデータベースを作成する

mysql> mysql -u root -pmypass;

mysql> create database db_name;
Query OK, 1 row affected (0.08 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db_name              |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

新しくユーザーを作成する

mysql> create user user@localhost IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.12 sec)

ユーザー一覧を表示する

mysql> SELECT host, user FROM mysql.user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| localhost | mysql.user    |
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+

作成したユーザーに作成したデータベースの操作権限を付与する

Gmysql> grant all privileges on db_name.* TO user@localhost;
Query OK, 0 rows affected (0.10 sec)

設定権限を確認する

mysql> show grants for user_name@localhost;
+------------------------------------------------------------+
| Grants for user_name@localhost                                 |
+------------------------------------------------------------+
| GRANT USAGE ON *.* TO `user_name`@`localhost`                  |
| GRANT ALL PRIVILEGES ON `db_name`.* TO `user_name`@`localhost` |
+------------------------------------------------------------+

もし間違った場合は、以下コマンドで権限変更できます。

mysql> revoke all privileges on studydb.* from user_name@localhost;
+------------------------------------------------------------+
| Grants for user_name@localhost                                 |
+------------------------------------------------------------+
| GRANT USAGE ON *.* TO `user_name`@`localhost`                  |
+------------------------------------------------------------+

「all privileges」の箇所に削除したい権限を指定。

権限はこちらを参照

設定を反映する

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

新しいデータベースに切り替える

mysql> use db_name;

新しいテーブルを作成する

mysql> create table dbname.product (name varchar(30), price int(5));
Query OK, 0 rows affected (0.02 sec)

mysql> show tables;
+-------------------+
| Tables_in_db_name |
+-------------------+
| product       |
+-------------------+
1 row in set (0.00 sec)

mysql> desc product;
+--------------------------+------------------+------+-----+---------+-------+
| Field                    | Type             | Null | Key | Default | Extra |
+--------------------------+------------------+------+-----+---------+-------+
| name                     | varchar(3)       | YES  |     | NULL    |       |
| price                    | smallint(5)      | YES  |     | NULL    |       |
+--------------------------+------------------+------+-----+---------+-------+

DB作成、ユーザー作成・権限付与、テーブル作成まで、できました。 お疲れ様でした。

【Java】DB設計書、ER図、クラス図を自動生成するツールたち

Javaで作られたシステムでドキュメントがない場合、システム理解を効率的に進めるためには、
DB設計書、ER図、クラス図の自動生成して、インプット情報とするのが良いです。

WindowsEclipseを使って開発する環境をイメージしています。

自動生成ツールの導入を紹介しているリンクを以下にまとめました。

DB関係のドキュメントを自動生成

DB設計書

A5:SQL Mk-2を使ってDB定義書を自動生成
MySQLPostgreSQLOracleSQL Serverなど幅広いDBMSに対応しており、 Excelまたは、HTMLで出力が可能です。

ER図

Oracle DBをERMasterでリバースエンジニアリングしてみる
Oracle以外のDBMSでも接続用ドライバーをDLして、設定すれば生成可能。Eclipseプラグインを使ってER図を自動生成

MySQLWorkbenchでDBからER図(モデル)を作成 – リバースエンジニアリング
MySQLの場合、MySQLWorkbenchでIE表記のER図が生成可能

A5:SQL Mk-2で実DBからDB定義書とER図を自動生成
→ DB設計書の出力時でも紹介した「A5:SQL Mk-2」でER図も出力可能。白黒でちょっとシンプル。幅広いDBMSに対応。

Java関係のドキュメントを自動生成

クラス図

eclipseにAmaterasUMLをインストールする
→ クラス図以外にもシーケンス図、UML図も作れる

【おまけ】システム構成図を自動生成

CloudMapperを使ってAWS環境を可視化する。
AWS環境のサーバーにおける、サブネット毎サーバーをまとめた図が出力されます。ざっくり全体を理解するのに使えそう。

httpd.confにおけるリダイレクト設定

いままで、設定済みのファイルをなんとなくその場しのぎで設定してきたため、 いざってときにさっと設定できなかったので、改めてまとめてみようと思う。

実現方法

いくつか実現方法があります。メリットが大きいため、基本的には、Webサーバーでのリダイレクトを行うと思います。

htmlのmetaタグでリダイレクト

  • タグの埋め込みのみで実現できるため、簡単
  • SEO的には、Googleの評価が低くなるため、サーバー側でのリダイレクトができない場合に選択すべき

JavaScriptでのリダイレクト

いくつか書き方がある。

window.location = "http://abc.com";
window.location.href = "http://abc.com";
window.location.assign("http://abc.com");
window.location.replace("http://abc.com"); 
  • 簡単に実装できるかつ、GoogleクローラーJavaScriptを実行できるため SEO的にも良い。
  • JavaScriptの実行をOFFにしているユーザーは、転送されない。
  • パラメータの引き続きを意識的に設定しないと、パラメータなしで転送してしまう。

HTTPでのリダイレクト(Apache)

こちらの方法が一番オススメ。

  • SEO的に一番良い。301リダイレクトをすることでGoogleに評価を引き継いでもらえる。
  • HTTPステータスコードで、301(恒久的な転送)、302(一時的な転送)など意図を伝えらえる。
  • URLに対して正規表現を用いることでURLの書き換えや転送先の指定を柔軟に行える。

こちらに関しては、設定方法を以下で詳しくみていく。

HTTPリダイレクト設定方法(Apache)

.htaccess、または、httpd.confへ設定を追記することで実現する。
httpd.confが親の設定ファイルで、.htaccesshttpd.confの設定を上書きする形で反映される。

今回は、httpd.confに記載する前提とする。

mod_rewriteが使用可能かを確認

/etc/httpd/conf/httpd.conf内の以下の行が存在し、コメントアウトされていないことを確認。

LoadModule rewrite_module modules/mod_rewrite.so

もし設定を修正した場合は以下のコマンドで、確認・反映

apachectl configtest
/etc/init.d/httpd graceful

gracefulはリクエスト処理を中断しないで反映する。
httpd reloadでも反映可能。こちらは、リクエスト処理を中断して、反映する。

リダイレクト設定の書き方

同一ドメイン同一ディレクトリ内でのリダイレクト

DocumentRoot /var/www/html

RewriteEngine On
RewriteRule ^/main/index¥.html$ /main/index2.html [R, L]

<Directory "/var/www/html">
AllowOverride All
</Directory>
  • RewriteEngineでURL書き換え処理をONとして、RewriteRuleでリダイレクトの設定を行う
  • RewriteRule 【ドメイン以下のリダイレクト元パス(先頭/付き)の正規表現】【リダイレクト先パス】

ドメイン切り替え

・・・
RewriteEngine on
RewriteCond %{HTTP_HOST} ^abc.com$
RewriteRule (.*) http:/www.abc.com/$1 [R=301, L]
・・・
  • RewriteRule リダイレクト元を正規表現の()で囲むことで、遷移先のURLで 後方参照($1)として利用可能となる。
  • 後方参照することで、()内のドメイン以下のリダイレクト元パスを別ドメインに切り替え可能
  • RewriteRuleの前にRewriteCondで条件を設定すると、条件マッチした場合のみRewriteRuleによる リダイレクト処理が実行される

その他、よくある書き方

RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /404.html [R=404,L]
  • ファイルがない、またはディレクトリがない場合は、404を返却する
ErrorDocument 404 /404.html
  • リクエストステータスが404のときに表示させるページを指定したい場合は、 上記のように設定する。

RewriteとRedirectの違い

RewriteとRedirectってどう違うのって最初疑問に思ったので書いておく。

Rewriteは、Rオプションをつけない場合、リクエストURLを書き換えない。 RedirectはリクエストURLを常に書き換え、元URLはわからなくなる。

Redirect

例) Redirect [status] /main/ http://www.abc.com/index.html
Redirect 301 /main/ http://www.abc.com/index.html
Redirect permanent /main/ http://www.abc.com/index.html

status:301(恒久的に移動の意味。permanentと301の別名キーワードを書いてもいい)

redis-cliの基本コマンド

ローカル環境でRedisを使う際に使った基本コマンドをメモしておきます。

一回一回、redis-cliをコマンドの前につけて実行してもよいですが、
接続してコマンド叩いた方良いかな。

$ redis-cli -h 【host_name】

ホスト名指定しないとローカルにアクセスします。

基本コマンド

コマンド 説明
keys "*" 本番環境では使ってはいけない。ロックがかかる。登録しているすべてのKeyの一覧を表示
get【key】 【key】に紐づくstringで登録された値を表示
set【key】【value 【key】に対して【value】文字列を保存する
flushdb 選択しているDBの全データをクリア。気を付けて使う
expire 【key】【second】 【key】に紐づくキャッシュの有効期限のsecond秒に設定する
TTL 【key】 【key】に紐づくキャッシュの有効期限のsecond秒を返却する

上記記載は以下から拾ってきました。
redis コマンドリファレンス

keys "*"は、ロックがかかり、パフォーマンス低下させる可能性があるため、デバッグのみで使用。
代わりにSCANを使うべき。
KEYS

インストールは以下などを参照

[Redis]RedisをWindowsにインストールしてみる