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

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

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にインストールしてみる

pythonのコード解析プラグインを検討する

pythonのパッケージ管理に引き続き、 開発環境設定を進めてみる。

pythonのコード規約がわかっていないので、 規約を覚える意味でもプラグイン導入してみる。
導入は必須に近いツールな気がするが。。

以下を導入してみます。

  • コード解析ツール(flake8, flake8-vim)
  • コード解析関連ツール(autopep8, vim-autopep8, ale)

コード解析ツール(flake8, flake8-vim)

pythonパッケージ

$ pip3 install flake8

vimパッケージ

.vimrcのNeoBundleのプラグイン記載部分に追記
設定は以下ブログの設定を頂きました。

Vimメモ : flake8でPythonのコードをチェックする - もた日記

" python 構文エラーの検出
NeoBundle 'andviro/flake8-vim'

"-------------------------
" [python] vim-flake8
"------------------------
autocmd BufWritePost *.py call Flake8() " 保存時にチェックする
let g:flake8_quickfix_location="topleft" " Quickfixの位置
let g:flake8_quickfix_height=7 " Quickfixの高さ
let g:flake8_show_in_gutter=1  " 左端にシンボルを表示
let g:flake8_show_in_file=1  " ファイル内にマークを表示

コード解析によるエラーコード参考URL

Introduction — pycodestyle 2.4.0 documentation

Error / Violation Codes — flake8 3.5.0 documentation

コード解析関連ツール(autopep8, vim-autopep8, ale)

コード解析エラーを一部自動修正するプラグイン(tell-k/vim-autopep8)と コード解析結果をコード修正中にも非同期に反映させてくれる(w0rp/ale) も導入する。使って見てまた、変えるかもしれないけど。

pythonパッケージ

$ pip3 install autopep8

vimパッケージ

.vimrcのNeoBundleのパッケージ記載部分にに以下を追記

NeoBundle 'tell-k/vim-autopep8'
NeoBundle 'w0rp/ale'

非同期チェックの方は、Lintツールが正しく設定してあれば、 インストールのみでうまく動作するみたい。

プラグイン導入までに試したこと

Flake8-vimをインストールしてみる

Flake8-vimというflake8-vimと同じようなプラグイン(作者は同じ)
をいれてみたが、vimを開いた時点で以下のエラーが出力されてしまい、
うまく動作せず。

error: PyFlake.vim required vim compiled with +python

vimではpython3を使いたいのにpython2を使ってね。
と言われて、詰んだ。

githubをみたら、Flake8-vimは2013年で更新が止まっているっぽい。
flake8-vimは問題なく動いたので、Flake8-vimは~/.vim/bundleから手動で削除した。

synstasticにpythonの設定を追記して試してみる

以下を設定を.vimrcに設定して、動作確認してみたりした。

let g:syntastic_python_checkers = ["flake8"]

動作違和感はなかったけど、
vim-flake8はflake8専用だし、手軽かもってどっかのブログに書いてたので、
思い直してこちらを使うのはやめた。rubyの方がsynstasticを使っている。

Pythonパッケージ管理は、venvを使うことにした

最近、個人的にpythonselenium動かしていろいろ情報収集するツールを
作って遊んでいます。パッケージ管理がいけてなかったので、見直しました。

pyenvを元々使っていたが、プロジェクトごとの
パッケージ管理をやりたいと思い、python3に入っているvenvを使用することにした。
https://docs.python.org/ja/3/library/venv.html#module-venv

自分の開発環境を確認してみる

% where python
/usr/local/bin/python
/usr/bin/python

% where python3
/usr/local/bin/python3

% python -V
Python 2.7.15

% python3 -V
Python 3.7.0

% where pip
/usr/local/bin/pip

% where pip3
/usr/local/bin/pip3

% pip -V
pip 18.0 from /usr/local/lib/python2.7/site-packages/pip (python 2.7)

% pip3 -V
pip 18.0 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)

pythonはhomebrewでいれたものとsystemのものがあります。

仮装環境を作成し、適用する

# myenvという名前で仮想環境を構築する
# Python 3.6以降
% python3 -m venv myenv

# 仮装環境を適用
% . myenv/bin/activate

# 仮装環境から抜ける
% deactivate

仮装環境にパッケージをインストールする

# 一つ一つ入れる場合
% pip3 install flask

# まとめて入れる場合は、freezeで出力したrequirements.txtを読み込む
% pip3 install -r requirements.txt

環境設定って経緯とかやり方とかすぐに忘れてしまうので、残して置かないとね。