20191125のMySQLに関する記事は13件です。

Xiaomi Mijia Bluetoothを使用した温湿度ロギング環境構築

Xiaomi Mijia Bluetoothを使用した温湿度ロギング環境構築

AliExpressで入手した格安温湿度計を使った温湿度ロギング環境構築方法。
xiomi.jpg

環境

Debian 9.8
mysql Ver 15.1 Distrib 10.1.37-MariaDB
MySQL Workbench 8.0
Power BI Desktop

Raspberry Pi Zero W
Xiaomi Mijia Bluetooth 2個、1個あたり1300円くらいかと。
dynabook EX/56LWH、Windows10 Home 64bit

方針

Raspberry Pi Zero WとXiaomi Mijia Bluetooth 2個をBluetoothでペアリングし、Raspberry Pi Zero WのMySQLにデータを蓄積して、dynabookにインストールしたPower BIでグラフ化します。

設定

ラズパイと温湿度計を接続するまでは下記の記事を参考にしました。
Xiaomi 気温湿度計

室外だと外壁があるため、見通し1mも届かないようです。
窓のすぐ近くの物置内に室外用の温湿度計を設置して、室内窓際にRaspberry Pi Zero Wを設置してなんとかペアリング出来ました。室内に設置した温湿度計はRaspberry Pi Zero Wから2mくらい離してもOKみたいです。

(1)/home/pi/mitemp/demo_custom.pyを編集する。
温湿度計を2個設置したので、MACアドレスで区別してデータを蓄積するようにコードを追加して、Raspberry Pi Zero Wに作成したテーブルにデータを書き込みます。
MySQL Workbench 8.0で事前にデータベースとテーブルを作成しておきます。

demo_custom.py
def poll(args):
    """Poll data from the sensor."""
    backend = _get_backend(args)
    poller = MiTempBtPoller(args.mac, backend)
    print("Getting data from Mi Temperature and Humidity Sensor")
    print("FW: {}".format(poller.firmware_version()))
    print("Name: {}".format(poller.name()))
    print("Battery: {}".format(poller.parameter_value(MI_BATTERY)))
    print("Temperature: {}".format(poller.parameter_value(MI_TEMPERATURE)))
    print("Humidity: {}".format(poller.parameter_value(MI_HUMIDITY)))
    print("MAC: {}".format(args.mac))

    battery = format(poller.parameter_value(MI_BATTERY))
    temp = format(poller.parameter_value(MI_TEMPERATURE))
    humi = format(poller.parameter_value(MI_HUMIDITY))
    mac = format(args.mac)
    now = datetime.datetime.now()

    connection = MySQLdb.connect(host='192.168.**.***',user='****',passwd='****',db='pizero_db',charset='utf8')

    cursor = connection.cursor()

    sql = 'INSERT INTO env_table VALUES (%s, %s, %s, %s, %s)'
    data = (now,mac,battery,temp,humi)
    cursor.execute(sql, data)

    connection.commit()

    connection.close()

(2)crontabを編集する。
温湿度計が電池駆動なので1時間に1回の測定にしています。

0 * * * * python3 /home/pi/mitemp/demo_custom.py --backend bluepy poll mac_outside
0 * * * * python3 /home/pi/mitemp/demo_custom.py --backend bluepy poll mac_inside

(3)Power BIでグラフ化する。
冬が近づいているので、日ごとの最小値をプロットしてみています。
PBI.jpg

今後

分電盤のブレーカーにCTを設置して、AD変換したデータからラズパイで消費電力を求めるシステムを作っています。温湿度計のデータと連携させて、室外環境から消費電力を予測するシステムを作ろうかと思います。

以上

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Go】SpaceCloudでMySQL/GraphQLサーバを立ち上げる

本記事で触れないこと

  • GraphQLに関する解説
  • Rest APIとの比較に関して
    RestAPI GraphQL 比較等のキーワードでggると、参考になる記事がヒットすると思います

Space Cloudについて

  • フロントエンドからGraphQL(またはREST API)を呼び出すためのAPIサーバ
  • MySQL + GraphQLサーバを立ち上げる場合の有力候補
    prismaもかなり有名(比較/検証予定)
    ※ Postgressの場合はhasura/graphql-engineが人気みたい
  • Goで書かれており、クラウドネイティブのルールに従って水平方向にスケーリングしてくれるらしい

対応DB

  • MongoDB
  • PostgreSQL、およびPostgreSQL互換のデータベース(CockroachDB、Yugabyteなど)
  • MySQLおよびMySQL互換データベース(TiDB、MariaDBなど)

事前準備

Docker環境の用意

  • 公式のQuick startに従い、docker-composeで構築します
  • MySQL5.7バージョンを明示的に指定 + my.cnfの設定を上書き + DBデータの永続化を設定しています
docker-compose.yaml
version: "3.7"
services:
  space-cloud:
    image: spaceuptech/space-cloud
    ports:
      - "4122:4122"
      - "4126:4126"
    links:
      - testdb
    restart: always
    environment:
      ## The DEV environment lets you skip login in Mission Control
      DEV: "true"
      ## Change the login credentials of Mission Control (Admin UI)
      # ADMIN_USER: "admin"
      # ADMIN_PASS: "123"
      # ADMIN_SECRET: "some-secret" # This is the JWT secret used for login authentication in Mission Control
  testdb:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: testdb
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./testdb/data:/var/lib/mysql
      - ./testdb/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./testdb/sql:/docker-entrypoint-initdb.d
    ports:
      - 3306:3306
mysql/my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

[client]
default-character-set=utf8mb4

DBスキーマの作成

以下の要領でMySQLのスキーマを作成しておく
(docker-composeで作成したMySQLコンテナにログイン + MySQLに接続 + スキーマ作成)

$ docker-compose exec testdb bash

root@04ee656af514:/# mysql -u root -p root

mysql> create database testdb;
Query OK, 1 row affected (0.01 sec)

mysql> exit

Space Cloud操作

プロジェクト作成

任意のプロジェクト名を入力し、MSQLの項目を選択
image.png
※ キャプチャを撮り忘れたのでこちらから転載しています
(実際の操作ではMYSQLを選択しています)

DB接続設定

メニューのDatabaseからEdit Connectionを選択し、ダイアログ内にroot:root@tcp(testdb:3306)/を入力
image.png
※ こちらもキャプチャを忘れたので、先ほどと同じく転載画像です

テーブル作成

Add a tableボタンから、任意のテーブル名+テーブル定義を記載する
スクリーンショット 2019-11-25 16.19.30.png

create users table

type users {
  id: ID! @primary
  phone: String!
}

create post table

後のselect joinクエリのサンプルで利用したいので、もう一つテーブルを作っておく
先ほど作成したusersテーブルを「外部キー参照」したい場合は、以下のように@relationディレクティブを指定する

type post {
  id: ID! @primary
  title: String!
  users_id: users @relation
}

クエリ発行

メニューのExplorerから直接クエリの実行が可能
スクリーンショット 2019-11-25 16.27.25.png

INSERT

mutation {
 insert_users(
   docs: [
    { id: "1", phone: "09011112222"},
    { id: "2", phone: "09033334444"}
  ]
 ) @mysql {
   status
 }
}
mutation {
 insert_post(
    docs: [
      { id: "1", users_id: "1", title: "test_title1" },
      { id: "2", users_id: "1", title: "test_title2" },
      { id: "3", users_id: "2", title: "test_title3" },
      { id: "4", users_id: "2", title: "test_title4" }
    ]
 ) @mysql {
   status
 }
}

SELECT

単一テーブルのSELECT
query {
 users (
   where: {id: "1"}
 ) @mysql {
   id
   phone
 }
}
複数テーブルのJOINクエリのサンプル
query {
 users @mysql {
   id
   phone
   post(
     where: {users_id: "users.id"}
   ) @mysql {
     title
   }
 }
}

UPDATE

mutation {
 update_users (
   where: { id: "2"},
   set: {phone: "08077778888"}
 ) @mysql {
   status
 }
}

課題

クエリで日本語等のマルチバイト文字を送信した際に、Network error: Failed to fetchのエラーが出てしまったので、mysql/my.cnfで文字コードの設定などチューニングの必要がありそう

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SpaceCloudでMySQL/GraphQLサーバを立ち上げる

本記事で触れないこと

  • GraphQLに関する解説
  • Rest APIとの比較に関して
    RestAPI GraphQL 比較等のキーワードでggると、参考になる記事がヒットすると思います

Space Cloudについて

  • フロントエンドからGraphQL(またはREST API)を呼び出すためのAPIサーバ
  • MySQL + GraphQLサーバを立ち上げる場合の有力候補
    prismaもかなり有名(比較/検証予定)
    ※ Postgressの場合はhasura/graphql-engineが人気みたい
  • Goで書かれており、クラウドネイティブのルールに従って水平方向にスケーリングしてくれるらしい

対応DB

  • MongoDB
  • PostgreSQL、およびPostgreSQL互換のデータベース(CockroachDB、Yugabyteなど)
  • MySQLおよびMySQL互換データベース(TiDB、MariaDBなど)

事前準備

Docker環境の用意

  • 公式のQuick startに従い、docker-composeで構築します
  • MySQL5.7バージョンを明示的に指定 + my.cnfの設定を上書き + DBデータの永続化を設定しています
docker-compose.yaml
version: "3.7"
services:
  space-cloud:
    image: spaceuptech/space-cloud
    ports:
      - "4122:4122"
      - "4126:4126"
    links:
      - testdb
    restart: always
    environment:
      ## The DEV environment lets you skip login in Mission Control
      DEV: "true"
      ## Change the login credentials of Mission Control (Admin UI)
      # ADMIN_USER: "admin"
      # ADMIN_PASS: "123"
      # ADMIN_SECRET: "some-secret" # This is the JWT secret used for login authentication in Mission Control
  testdb:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: testdb
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./testdb/data:/var/lib/mysql
      - ./testdb/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./testdb/sql:/docker-entrypoint-initdb.d
    ports:
      - 3306:3306
mysql/my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

[client]
default-character-set=utf8mb4

DBスキーマの作成

以下の要領でMySQLのスキーマを作成しておく
(docker-composeで作成したMySQLコンテナにログイン + MySQLに接続 + スキーマ作成)

$ docker-compose exec testdb bash

root@04ee656af514:/# mysql -u root -p root

mysql> create database testdb;
Query OK, 1 row affected (0.01 sec)

mysql> exit

Space Cloud操作

プロジェクト作成

任意のプロジェクト名を入力し、MSQLの項目を選択
image.png
※ キャプチャを撮り忘れたのでこちらから転載しています
(実際の操作ではMYSQLを選択しています)

DB接続設定

メニューのDatabaseからEdit Connectionを選択し、ダイアログ内にroot:root@tcp(testdb:3306)/を入力
image.png
※ こちらもキャプチャを忘れたので、先ほどと同じく転載画像です

テーブル作成

Add a tableボタンから、任意のテーブル名+テーブル定義を記載する
スクリーンショット 2019-11-25 16.19.30.png

create users table

type users {
  id: ID! @primary
  phone: String!
}

create post table

後のselect joinクエリのサンプルで利用したいので、もう一つテーブルを作っておく
先ほど作成したusersテーブルを「外部キー参照」したい場合は、以下のように@relationディレクティブを指定する

type post {
  id: ID! @primary
  title: String!
  users_id: users @relation
}

クエリ発行

メニューのExplorerから直接クエリの実行が可能
スクリーンショット 2019-11-25 16.27.25.png

INSERT

mutation {
 insert_users(
   docs: [
    { id: "1", phone: "09011112222"},
    { id: "2", phone: "09033334444"}
  ]
 ) @mysql {
   status
 }
}
mutation {
 insert_post(
    docs: [
      { id: "1", users_id: "1", title: "test_title1" },
      { id: "2", users_id: "1", title: "test_title2" },
      { id: "3", users_id: "2", title: "test_title3" },
      { id: "4", users_id: "2", title: "test_title4" }
    ]
 ) @mysql {
   status
 }
}

SELECT

単一テーブルのSELECT
query {
 users (
   where: {id: "1"}
 ) @mysql {
   id
   phone
 }
}
複数テーブルのJOINクエリのサンプル
query {
 users @mysql {
   id
   phone
   post(
     where: {users_id: "users.id"}
   ) @mysql {
     title
   }
 }
}

UPDATE

mutation {
 update_users (
   where: { id: "2"},
   set: {phone: "08077778888"}
 ) @mysql {
   status
 }
}

課題

クエリで日本語等のマルチバイト文字を送信した際に、Network error: Failed to fetchのエラーが出てしまったので、mysql/my.cnfで文字コードの設定などチューニングの必要がありそう

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】we're sorry, but something went wrongでハマった話(2)

こんにちは!スージーです!
ローカル環境では問題なかったのに本番環境で発生したwe're sorry, but something went wrongの解決までを備忘録として

we're sorry, but something went wrong

このエラーは本番環境でちょいちょい見るのでproduction.logでエラーログを確認する

ターミナル
[ec2-user@ip-~~]$ cd /var/www/app-name
[ec2-user@ip-~~]$ cd log
[ec2-user@ip-~~]$ cat production.log
D, [2019-11-18T07:06:44.834244 #5661] DEBUG -- : hogehoge~~
D, [2019-11-18T07:06:44.834597 #5661] DEBUG -- : hogehoge~~
・
・・
・・・

この時はproduction.logにエラーログが無かった

デバックを考える

  • タイポ→× 開発環境でもエラーが再現されているはず
  • no method error→× 開発環境でもエラーが再現されているはず
  • ルーティングアクション,コントローラの記述がおかしい→× 開発環境でもエラーが再現されているはず
  • エラー発生ページshowアクション:idが本番環境にないのではないか?(同期が教えてくれた)

本番環境のMySQLにログインしてみる

同期の助言により、以前に本番環境下でseedファイルのデータが投入できなかった事を思い出す

ターミナル
[ec2-user@ip-~app-name]$  mysql -u root -p
Enter password:
・
・・
mysql > use app-name_production;
・
・・
database changed
mysql > describe meals;
# <エラーが発生するテーブル>
mysql > show * form meals;
# <レコードを確認>

mealsテーブル

Column Type Options
name varchar null: false
image text
food_stuff text
cooking_time integer null: false
cooking_method integer
post_id integer null: false
user_id integer null: false

エラー箇所特定

user_id:1で投稿したはずなのにmealsテーブルuser_idカラムにはuser_id:17で保存されている...
開発環境では問題なくuser_idが保存されているから道理でエラーが再現されないはずだ...

原因

このuser_idはデプロイ後に追加したカラム
開発環境でマイグレーションファイルを作成した後に以下の手順でdb:migrateした

ターミナル
[ec2-user@ip-~app-name]$ RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:drop
#<最新のDBにする為,一度drop>
[ec2-user@ip-~app-name]$ rake db:create RAILS_ENV=production
#<DBをcreateする>
[ec2-user@ip-~app-name]$ rake db:migrate RAILS_ENV=production
#<migrateする>
[ec2-user@ip-~app-name]$ cd current
#<currentディレクトリ下へ>
[ec2-user@ip-~app-name]$ rake db:seed RAILS_ENV=production
・
・・
・・・
Mysql2::Error: Field 'user_id' doesn't have a default value

上記エラーが最初出た時にuser_idカラムをMySQLにログインしてカラムを新規で作成し突っ込んでいた

ターミナル
database changed
mysql > ALTER TABLE meals ADD user_id int;
mysql > exit
[ec2-user@ip-~app-name]$ cd current
[ec2-user@ip-~app-name]$ rake db:seed RAILS_ENV=production
・
・・
・・・
Mysql2::Error: Field 'user_id' doesn't have a default value

またエラーが出ている...アプリを動かして投稿してみると新規投稿はできていたので、その時は一旦保留にしていたが、やはりここが今回のエラーの原因であるのは間違いなさそう

解決方法

なぜ最新のマイグレーションファイルが本番環境に反映されないのか

参考
【Rails】本番環境デプロイでよく使うコマンド集!AWS/unicorn/nginx/Capistrano使用
https://qiita.com/15grmr/items/7ad36caa82a0fa27c4bd

むむむ...db:migrateの手順が間違っていた...無理矢理に本番環境のDB構造を変えて正しくuser_idが保存されていないのが原因であれば正しくマイグレーションすればエラーは解決するはず。そうすればdb:seedでデータが投入されるはずである

ターミナル
[ec2-user@ip-~app-name]$ RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:drop
[ec2-user@ip-~app-name]$ rake db:create RAILS_ENV=production
# ここで一度自動デプロイをかけて、db:migrateに当たる操作を完了
# ローカルにて
app-name $ bundle exec cap production deploy
# 無事作成されたら、再度EC2のcurrentディレクトリでseedを反映させる
[ec2-user@ip-~app-name current]$ rake db:seed RAILS_ENV=production
・
・・
・・・
[ec2-user@ip-~app-name current]$

無事にseedファイルが本番環境に投下されwe're sorry, but something went wrongのエラーは解決

まとめ

今回、個人アプリで初めてデプロイ後のDB構造を変更・追加を行った。EC2内でdb:create→db:migrateまでしてから自動デプロイしても最新のマイグレーションファイルが本番環境へ反映されない事が原因だった。EC2内では古いDBをdropcreateする所までを行い、capistranoを使った自動デプロイで最新マイグレーションをファイルの読み込みmigrateする

今回のエラーはデプロイの手順の間違えで発生したものだったが、MySQLを触っているとRailsではマイグレーションファイルでバージョン管理してくれるし、ORMのお陰で生SQLを触る機会もほとんどないのでDB関連の知識が無くても動くアプリケーションが作れる。非常に便利だが、SQLの勉強は絶対にした方が良いと感じたエラーだった

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

WSL(Ubuntu)にssh、MySQL、PHP、Apache2 を入れるまで。

WSL(Ubuntu)にssh、MySQL、PHP、Apache2 を入れるまで。

WSL の Ubuntu をインストールする。

省略

初期設定。

// rootのパスワードを設定
$ sudo passwd root

# su -

// 日本語化
# apt install -y language-pack-ja manpages-ja manpages-ja-dev
# update-locale LANG=ja_JP.UTF8

// リポジトリ一覧の更新と、パッケージの更新。
# apt update
# apt upgrade -y

※ 途中、以下の「サービス再起動」に関して聞かれるので Yes で進む。
 Restart services during package upgrades without asking?   

// 終わったら再起動する。Windows を再起動するか、
// 管理者で Windowsコマンドプロンプト を開いて以下を実行してサービスを再起動する。
net stop LxssManager
net start LxssManager

WSLのプロンプトが見にくいので、tera term が使えるようにする。

# cd /etc/ssh
# vi sshd_config

PasswordAuthentication yes

※ この時、配色の関係で vi の画面が非常に見えにくい場合は以下を実行して色を無くす。
:syntax off

// ssh に必要なキーを作成するらしい。
# ssh-keygen -A
# service ssh start

// ここから tera term で繋ぐ。

MySQL を入れる。

// mysql が入っているかを確認。
# dpkg -l | grep mysql

// インストール(mysql-server-5.7 が入った)
# apt install mysql-server

// ↓で確認したら、mysql-client は一緒に入ってた。
# dpkg -l | grep mysql

// 起動して、とりあえず入れるところまで確認。
# service mysql start
# mysql

WindowsのCドライブは容量をあまり使いたくないのでデータディレクトリを D ドライブに移す。

// いったんプロセスを落とす。
# service mysql stop

// D ドライブを drvfs でマウントしなおす。これをしないと、chmod や chown が効かなかった。
# umount /mnt/d
# mount -t drvfs D: /mnt/d -o metadata

// my.cnf はあまり触りたくなかったのでデータディレクトリを移動して、シンボリックリンクを設定する。
# mv /var/lib/mysql /mnt/d/mysql/
# ln -s /mnt/d/mysql /var/lib/mysql

# service mysql start

php を入れる。

# apt install php

// ↑ だけで、apache2 も libapache2-mod-php も入ってきた。

# service apache2 start

// 動くか確認。
# cd /var/www/html
# echo '<?php phpinfo();' > index.php

// http://localhost/index.php で、Server API が "Apache 2.0 Handler" になっていることを確認。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

keycloakをAWS上にインストール・RDSと連携まで

この記事について

開発中のソフトウェアのログインにKeycloakを使用するので、セットアップ中に起こった問題とそれらに対するトラブルシューティングを備忘録として残す第二弾です。今回はAWS上に公式版(Github版ではない)のkeycloakをインストールし、RDSと連携させる手順を説明します。RDSはMySQLを使用しました
バージョンとクラス
keycloak: 6.0.1
AWS EC2: t2.micro
RDS: db.t2.micro, MySQL
日付:2019/11/22

目次

AWSの設定(VPC)

まず最初に、AWSサーバーがインターネットからアクセスできるようVPCを使ってネットワークを構築していきます。Amazon VPC(Vitual Private Cloud)を使用すると、定義したAWSアカウント専用の仮想ネットワーク内で AWS リソースを起動できます。設定の流れはVPCのIP アドレス範囲を指定して、サブネットを追加し、セキュリティグループを関連付けて、ルートテーブルを設定するといった具合です。

サブネットとは
サブネットは、VPC の IP アドレスの範囲です。AWS リソースは、指定したサブネット内に起動できます。インターネットに接続する必要があるリソースにはパブリックサブネットを、インターネットに接続しないリソースにはプライベートサブネットを使用してください。

インターネットにアクセスする
デフォルト VPC にはインターネットゲートウェイが含まれ、各デフォルトサブネットはパブリックサブネットです。デフォルトサブネット内に起動するインスタンスにはそれぞれ、プライベート IPv4 アドレスとパブリック IPv4 アドレスが割り当てられています。これらのインスタンスは、このインターネットゲートウェイを介してインターネットと通信できます。インターネットゲートウェイを使用すると、インスタンスは Amazon EC2 ネットワークエッジを介してインターネットに接続できます。
default-vpc-diagram.png
デフォルトでは、デフォルト以外のサブネットで起動した各インスタンスにはプライベート IPv4 アドレスが割り当てられていますが、パブリック IPv4 アドレスは割り当てられていません。
nondefault-vpc-diagram.png
デフォルト以外のサブネットで起動するインスタンスのインターネットアクセスを有効にするには、インターネットゲートウェイをその VPC (デフォルト VPC でない場合) にアタッチし、インスタンスに Elastic IP アドレスを関連付けます。
internet-gateway-diagram.png

1. VPCの作成
AWSマネジメントコンソールから、VPCを選択
ダッシュボードのVPCから、VPCの作成をクリック
適当に名前をつけ(わかりやすいようにkeycloak_vpcとか)、IPv4 CIDR ブロックにはまずは10.0.0.0/16を入れます
10.0.0.0/16が既に使われていた場合は10.1.0.0/16や20.0.0.0/16などでIPの数字をいい感じに上げます

2. サブネットの作成
サブネットにはパブリックなものと、プライベートなものがあります。前述したように、インターネットに接続したい場合はパブリックサブネットが必要になります。それに加え今回はインターネットには直接接続ししないデータベースも作るので、プライベートサブネットも必要になります。といっても初期設定でできる事はあまりありません。ダッシュボードからサブネット、サブネット作成で名前を仮にkeycloak_publicとkeycloak_privateにします。VPCは先ほど作成したkeycloak_vpcに関連付けします。アベイラビリティゾーンはここで設定したものを後の設定でも一貫してください。IPv4 CIDR ブロックは、VPCのIPアドレスの3番目の数字をひとつ大きくした数字を使い、ポートは24から使用できます。(例: VPCが10.0.0.0/16ならサブネットは10.0.1.0/24[keycloak_public]と10.0.2.0/24[keycloak_private])

3. インターネットゲートウェイの接続
次にインターネットへ接続するためにインターネットゲートウェイを作成します。同じくダッシュボードのインターネットゲートウェイから、インターネットゲートウェイの作成をクリックしてください。名前をkeycloak_gateとしてさくせいします。次に、インターネットゲートウェイ作成ボタンの隣にあるアクションというボタンから、VPCにアタッチを選択して先ほど作ったkeycloak_vpcに接続します。これでVPCからインターネットへアクセスする入口ができましたが、それをインスタンス(サブネット)に繋げるルートがありません。

4. ルートテーブルの作成
そこで、インターネットの入口からVPCの中身を繋ぐルートを作ります。ダッシュボードのルートテーブルからルートテーブルの作成をクリックしてください。名前をkeycloak_routeとしてVPCはkeycloak_vpcを選びます。次に作成ボタンの隣のアクションからルートの編集に行きます。
スクリーンショット 2019-11-22 13.30.21.png
デフォルトで上の様な設定になっていると思います。10.0.0.0/16はVPCのIPアドレスです。ここに送信先を0.0.0.0/0、ターゲットをkeycloak_vpcとしたルートを追加します。これで、インターネットゲートウェイからサブネットにIPの制限なく通信することができます。そして、画面の下の方にサブネットの関連付けというタブがあるので、keycloak_publicに関連付ければ、keycloak_publicサブネットからはインターネットにアクセスできます。

これでVPCの準備は完了です。

AWSの設定(EC2)

Amazon Elastic Compute Cloud (Amazon EC2) は、AWSクラウドでサイズが変更できるコンピューティングキャパシティーを提供します。必要な数の仮想サーバーを起動して、セキュリティおよびネットワーキングの設定と、ストレージの管理を行います。Amazon EC2 では、要件変更や需要増に対応して迅速に拡張または縮小できるため、サーバートラフィック予測が不要になります。インスタンスと呼ばれる仮想コンピューティング環境で開発・デプロイをしていきます。

1. インスタンスの作成
以下の設定で作成していきます
AMI: Amazon Linux 2 AMI (HVM), SSD Volume Type
インスタンスタイプ: 汎用t2.micro(無料利用枠)
ネットワーク: keycloak_vpc
サブネット: keycloak_public
自動割り当てパブリック IP: 有効
作成したら名前をkeycloak_serverとします

2. Elastic IP
これでインスタンスは作成し、VPCにも繋いでいるのでインターネットへのアクセスも可能です。しかし、現時点ではインスタンスを起動する度にパブリックIPアドレスが変わってしまうという欠点があります。これを回避するために、Elastic IPによってインスタンスのパブリックIPを固定します。ダッシュボードからネットワーク&セキュリティにElastic IPがあります。ここからElastic IPアドレスの割り当てをクリック、新たにパブリックIPアドレスを生成します。生成したIPを選択し、アクションタグのElastic IPアドレスの関連付けからkeycloak_serverに関連付けます。インスタンス画面に戻るとパブリックDNS(IPv4)とIPv4パブリックIPが固定されているはずです。

セキュリティグループ
実世界でパケットフィルタリングを構成するのは、ルーターやサーバー、もしくは専用のファイアウォール機器だが、AWSでは、インスタンスに対して、構成する「セキュリティグループ」がこの機能を担う。先ほどインスタンスに対して作ったセキュリティグループ(launch-wizard-<数字>)を見ると、デフォルトの構成でinboundを見ると、ポート22にたいして全ての通信(0.0.0.0/0)を許可する、という設定があり、それ以外の設定はないことがわかる。
スクリーンショット 2019-11-22 17.52.41.png
デフォルトのこの設定では、webサーバーソフトなどをインスタンスに入れた賭しても、阻まれて通信できないので、ソフトウェアのインストールとともに、セキュリティグループの構成も変更していく。最低限必要なのは以下の数個でしょうか。

タイプ プロトコル ポート範囲 ソース
HTTP TCP 80 <自分のIPアドレス>
HTTP TCP 80 < Elastic IP>
カスタムTCP TCP 8080 < Elastic IP>
SSH TCP 22 <自分のIP>
SSH TCP 22 < Elastic IP>
MYSQL TCP 3306 0.0.0.0/0
HTTPS TCP 443 0.0.0.0/0

接続できなかったり、必要があれば随時追加してください。

AWSの設定(RDS)

本稼働ではkeycloakは膨大な量のユーザーの情報を保管する可能性があります。EC2サーバーだけではおそらくパンクしてしまうので、Amazonが提供しているデータベースサービスのRDSへデータを保存します。
RDSを作成するには、EC2のダッシュボードではなくAWS マネジメントコンソールに行きます。RDSという項目があるのでクリックして、RDSのダッシュボードに行きます。データベースからデータベースの作成をクリックします。以下の設定で作成します。

作成方法: 標準方法
エンジン: MySQL
バージョン: 5.7.22(ここはデフォルト)
テンプレート: お好みのスペックで
名前: keycloak-rds
マスターユーザー名: admin
パスワード: 適当に
VPC: keycloak_vpc
サブネット: 新規作成
パブリックアクセス可能: はい(重要)
VPCセキュリティグループ: Default + 新規作成(内容はEC2のものと同じ)
アベイラビリティゾーン: EC2と同じ
ポート: 3306

RDSパラメータグループ設定
これでデータベースができました。しかしこのまま接続しても文字コードのエラーがでてしまいます。なぜなら、RDSのデフォルトは日本語に対応しているUTF-8ではなく、ラテン語に設定されているからです。

mysql> show variables like 'character%';
+--------------------------+-------------------------------------------+
| Variable_name            | Value                                     |
+--------------------------+-------------------------------------------+
| character_set_client     | utf8                                      |
| character_set_connection | utf8                                      |
| character_set_database   | latin1                                    |
| character_set_filesystem | binary                                    |
| character_set_results    | utf8                                      |
| character_set_server     | latin1                                    |
| character_set_system     | utf8                                      |
| character_sets_dir       | /rdsdbbin/mysql-5.7.22.R5/share/charsets/ |
+--------------------------+-------------------------------------------+
8 rows in set (0.00 sec)

普通ならば/etc/my.cnfをいじって設定を変更しますが、AWSのSQLの場合それができないのでダッシュボードのパラメータグループから新規にパラメータグループを作成します。作成したら、そのパラメータグループを選択してパラメータの編集をします。
"character"で検索をかけると8つ程パラメータが出てくるので、character_set_filesystem(デフォルトでbinary)以外をutf-8に変更します。

mysql> show variables like 'character%';
+--------------------------+-------------------------------------------+
| Variable_name            | Value                                     |
+--------------------------+-------------------------------------------+
| character_set_client     | utf8                                      |
| character_set_connection | utf8                                      |
| character_set_database   | utf8                                      |
| character_set_filesystem | binary                                    |
| character_set_results    | utf8                                      |
| character_set_server     | utf8                                      |
| character_set_system     | utf8                                      |
| character_sets_dir       | /rdsdbbin/mysql-5.7.22.R5/share/charsets/ |
+--------------------------+-------------------------------------------+
8 rows in set (0.00 sec)

これで日本語のデータが保存可能になります。
データベースの変更タグから、keycloak-rdsのパラメータグループの変更もお忘れなく。

インストール各種

JDK8のインストール

$ sudo yum update -y
$ sudo yum install java-1.8.0-openjdk

keycloakのインストール

$ cd /opt
$ sudo wget https://downloads.jboss.org/keycloak/6.0.1/keycloak-6.0.1.zip
$ sudo unzip keycloak-6.0.1.zip
$ sudo mv keycloak-6.0.1 keycloak

keycloakのSQLドライバー(Java Database Connector)のインストール

$ sudo mkdir /opt/keycloak/modules/system/layers/keycloak/com/mysql
$ sudo mkdir /opt/keycloak/modules/system/layers/keycloak/com/mysql/main
$ sudo cd /opt/keycloak/modules/system/layers/keycloak/com/mysql/main
$ sudo wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.42.zip
$ sudo unzip mysql-connector-java-5.1.42.zip
$ sudo cp mysql-connector-java-5.1.42/mysql-connector-java-5.1.42-bin.jar ./
$ sudo vi module.xml
/opt/KEYCLOAK_HOME/modules/system/layers/keycloak/com/mysql/main/module.xml
<?xml version="1.0"?>
<module xmlns="urn:jboss:module:1.3" name="com.mysql">
    <resources>
        <resource-root path="mysql-connector-java-5.1.42-bin.jar"/>
    </resources>
    <dependencies>
        <module name="javax.api"/>
        <module name="javax.transaction.api"/>
    </dependencies>
</module>

MySQLのインストール

$ sudo yum install mysql-community-server -y
$ mysqld --version

インストールにエラーが出たら下の参考文献をご覧ください(私はなぜかここでつまづいて結構時間取られました)

MySQLの設定

keycloakからログインする為のユーザーとデータベース作成

#EC2コンソールからRDSに接続します
#ユーザーネームとパスワードはRDS作成時に作ったものです
$ mysql -h <keycloak-rdsのエンドポイント> -P 3306 -u admin -p
<password>

#keycloakからログインする時用のユーザー作成
mysql> create user 'keycloak-user' identified by '<パスワード>';

#keycloakのデータ保存用のデータベース作成
mysql> create database keycloakDB character set utf8 collate utf8_unicode_ci;

#keycloak-userにkeycloakDB上の全権限付与
mysql> grant all privileges on keycloakDB.* to 'keycloak-user';

mysql> exit

keycloak内の設定

1. 外部IP、書き込み権限とログ

#keycloak用のなにかではあったが詳しくは不明(ないとうまく動作しない)
$ export EXTERNAL_IP=$(curl -s 169.254.169.254/latest/meta-data/local-ipv4)

#書き込み権限
$ sudo chmod 777 -R ./

#ログ用ディレクトリ作成
$ sudo mkdir /var/log/keycloak

2. サーバーコンフィグファイルの設定

/opt/KEYCLOAK_HOME/standalone/configuration/standalone-ha.xml
#データベースへの接続
<datasource jndi-name="java:jboss/datasources/KeycloakDS" pool-name="KeycloakDS" enabled="true" use-java-context="true" statistics-enabled="${wildfly.datasources.statistics-enabled:${wildfly.statistics-enabled:false}}">
    <connection-url>jdbc:mysql://<keycloak-rdsのエンドポイント>:3306/keycloakDB?characterEncoding=UTF-8&amp;useSSL=false</connection-url>
    <driver>mysql</driver>
    <security>
        <user-name>keycloak-user</user-name>
        <password><パスワード></password>
    </security>
</datasource>
<drivers>
    <driver name="mysql" module="com.mysql">
        <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
    </driver>
    <driver name="h2" module="com.h2database.h2">
        <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
    </driver>
</drivers>

.
.
.

#KeycloakサーバーのIPアドレスに変更
<interfaces>
        <interface name="management">
            <inet-address value="${jboss.bind.address.management:<EC2プライベートIP>}"/>
        </interface>
        <interface name="public">
            <inet-address value="${jboss.bind.address:<EC2プライベートIP>}"/>
        </interface>
        <interface name="private">
            <inet-address value="${jboss.bind.address.private:<EC2プライベートIP>}"/>
        </interface>
</interfaces>

3. ログインと通信設定

/opt/KEYCLOAK_HOME/
#初回ログイン用にアドミンユーザー作成
$ ./bin/add-user-keycloak.sh -r master -u admin -p admin

#起動
$ ./bin/standalone.sh --server-config=standalone-ha.xml -b <EC2のパブリックDNS> -Djboss.node.name=<EC2のパブリックDNS> -Djboss.bind.address.private=<EC2のパブリックDNS>

#アドミンとして認証情報を設定する
$ ./bin/kcadm.sh config credentials --server http://<プライベートIP>:8080/auth --realm master --user admin --password admin

#SSL requiredをNONEに変更
$ ./bin/kcadm.sh update realms/master -s sslRequired=NONE
change https listener

4. https通信への変更
一旦Control Cでサーバーを落とし、以下をして再起動します
proxy-address-forwarding="true"を追加

/opt/KEYCLOAK_HOME/standalone/configuration/standalone-ha.xml
<http-listener name="default" socket-binding="http" proxy-address-forwarding="true" redirect-socket="https" enable-http2="true"/>

5. ログイン
http://<IPv4パブリックIP>:8080/authにアクセス

完了です

参考文献

Keycloak 開発入門
AWSのEC2で行うAmazon Linux2(MySQL5.7)環境構築
Keycloakのインストール方法をわかりやすく手順化してみた

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

「Laravel DB Designer 」vol.3 使い方・仕様 について解説

今回は" Laravel DB Designer "の使い方・仕様について書きました(vol3)

『Laravelを使う人を幸せにしたいという思いから作った』

(vol2の続きです)[https://qiita.com/daisu_yamazaki/items/92dc3cc599a264c3fb0f]

e.jpg

https://laraveldb.com
※英語圏対応済み

主機能

  • ER図作成 (対応している”型”はページ下部に表記)
  • ER図作成 → Migrationファイルを生成
  • ER図作成 → チェック用クエリービルダーを自動生成
  • Migrationファイル → ER図を生成(リバース)

テーブル名

テーブル名の頭に"m_"を付けた場合(Master:都道府県のように最初から用意するテーブル)

  • 「 m_テーブル名 」とすると" $table->softDeletes(); "は追加されません

  • 「 m_テーブル名 」とすると" $table->timestamps(); "は追加されません

テーブル名の頭に"t_"を付けた場合(Transaction:ユーザーの入力でデータが追加されていくテーブル)

  • 「 t_テーブル名 」とすると" $table->softDeletes(); "が自動で追加されます

  • 「 t_テーブル名 」とすると" $table->timestamps(); "が自動で追加されます

テーブル名の頭に"t_"も"m_"も付けない場合(接頭辞を付けない場合)

  • "m_" や "t_"を付けなければ " $table->softDeletes(); "が自動で追加されます

  • "m_" や "t_"を付けなければ "$table->timestamps(); "が自動で追加されます

image.png

【使用時の気をつけるPOINT】

1)
フォルダにMigrationファイル(Schema::createのみ)一式集めZip圧縮したファイルをアップロードすることで、ER図へ変換(リバース)することが可能です。

2)
以下Migrationファイル 「 Schema::create 」のみ現在は可能
※ Schema::create以外は対応検討中

Schema::create("テーブル名", function (Blueprint $table) {...}

3)
外部キー(使った場合)親子の順番でMigrationファイルを選び、Migrateしなくてはいけない
※ 親子順でファイル名(時間等)を少しずらし対応検討中

4)
ダウンロードしたMigrationファイル(ZIP)をそのまま再アップロードは出来ません
一度解凍してから自身のPCでZIPしてアップロードしてください。(PHPでの圧縮アルゴリズムの問題かも)
※ 今後の調査対象の一つ

5)
MySQLのみ対応
※ 要望が多ければPostgres,SQLite等の対応も検討

「ER図のSave/Load」機能

image.png

ER図データのLoad/Save

Save/Load機能 機能詳細
クラウドへ保存 Web上のDB(Firebase)に保存します。
クラウドデータ一覧 自身がWebに保存したデータ一覧
ブラウザに保存 LocalStorageに一時保存
ブラウザデータ一覧 自身がlocalに保存したデータ一覧

上記の「データ一覧」選択後、「 -- Data List -- 」の選択肢が表示されます。
そこに表示されるデータ項目を選択するとER図が復元します。

ER図から出力(外部出力)

Save/Load機能 機能詳細
ER図からSQLを作成 現在表示しているEQ図からMySQLテーブルを作成するSQL文を作成
Laravel(Migration) 現在表示しているEQ図からLaravel専用のMigrationファイルをZIP圧縮して一式ダウンロード

子テーブルへの外部キー制約が記載されてるMigrationファイルは、
「 5分遅らせた 」ファイル名が生成しています(現時点)。
理由)親テーブルをMigrateしてから子テーブルをMigrateしないとエラーになるため最低限の対応を追加しました。
今後は、外部キーの親・子を全て判断して順番を「時間でずらすことで対応」していこうと考えています(未実装)。

Reverse ERD

Migrationファイル一式をZIP圧縮 → [ Reverse >>> ERD ]ボタンでアップロード
アップロード完了するとER図が表示されます。

Migration(ZIPファイルに一式纏めて) 機能詳細
[ Reverse >>> ERD ] Migrationファイル一式をフォルダに入れて、ZIP圧縮したファイルをアップロード

<< 要注意 >>
「Laravel DB Designer」からZIPファイルをダウンロードしたファイルをそのままアップロードは出来ません。必ず、一度解凍したものをZIP圧縮しなおしてuploadしてください。

今回vol3のまとめ

今回は「 Laravel DB Designer 」の操作方法とメイン機能である「 Save/Load 」と「 出力 」の解説をさせていただきました。まだまだUXの部分には力をいれられてないので、こういった使用説明が必要だと思い書きました。
少しでもご理解いただき使用していただければと存じます。
また、説明が抜けてるところがあるかもしれません、随時更新、内容によっては新しく解説記事を投稿して行こうと思います。

『Laravelを使う人を幸せにしたいという思いから作った』
https://laraveldb.com

以上
今後とも宜しくお願い致します。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【 Laravel 】「Laravel DB Designer」で設計から実装まで「ER図←→Migration」相互変換!” 「使い方・仕様 」について解説” vol3

今回は" Laravel DB Designer "の「 使い方・仕様 」について書きました(vol3)

『Laravelを使う人を幸せにしたいという思いから作った』
https://laraveldb.com
※英語圏対応済み

e.jpg

主機能

  • ER図作成 (対応している”型”はページ下部に表記)
  • ER図作成 → Migrationファイルを生成
  • ER図作成 → チェック用クエリービルダーを自動生成
  • Migrationファイル → ER図を生成(リバース)

テーブル名

テーブル名の頭に"m_"を付けた場合(Master:都道府県のように最初から用意するテーブル)

  • 「 m_テーブル名 」とすると" $table->softDeletes(); "は追加されません

  • 「 m_テーブル名 」とすると" $table->timestamps(); "は追加されません

テーブル名の頭に"t_"を付けた場合(Transaction:ユーザーの入力でデータが追加されていくテーブル)

  • 「 t_テーブル名 」とすると" $table->softDeletes(); "が自動で追加されます

  • 「 t_テーブル名 」とすると" $table->timestamps(); "が自動で追加されます

テーブル名の頭に"t_"も"m_"も付けない場合(接頭辞を付けない場合)

  • "m_" や "t_"を付けなければ " $table->softDeletes(); "が自動で追加されます

  • "m_" や "t_"を付けなければ "$table->timestamps(); "が自動で追加されます

image.png

【使用時の気をつけるPOINT】

1)
フォルダにMigrationファイル(Schema::createのみ)一式集めZip圧縮したファイルをアップロードすることで、ER図へ変換(リバース)することが可能です。

2)
以下Migrationファイル 「 Schema::create 」のみ現在は可能
※ Schema::create以外は対応検討中

Schema::create("テーブル名", function (Blueprint $table) {...}

3)
外部キー(使った場合)親子の順番でMigrationファイルを選び、Migrateしなくてはいけない
※ 親子順でファイル名(時間等)を少しずらし対応検討中

4)
ダウンロードしたMigrationファイル(ZIP)をそのまま再アップロードは出来ません
一度解凍してから自身のPCでZIPしてアップロードしてください。(PHPでの圧縮アルゴリズムの問題かも)
※ 今後の調査対象の一つ

5)
MySQLのみ対応
※ 要望が多ければPostgres,SQLite等の対応も検討

「ER図のSave/Load」機能

image.png

ER図データのLoad/Save

Save/Load機能 機能詳細
クラウドへ保存 Web上のDB(Firebase)に保存します。
クラウドデータ一覧 自身がWebに保存したデータ一覧
ブラウザに保存 LocalStorageに一時保存
ブラウザデータ一覧 自身がlocalに保存したデータ一覧

上記の「データ一覧」選択後、「 -- Data List -- 」の選択肢が表示されます。
そこに表示されるデータ項目を選択するとER図が復元します。

ER図から出力(外部出力)

Save/Load機能 機能詳細
ER図からSQLを作成 現在表示しているEQ図からMySQLテーブルを作成するSQL文を作成
Laravel(Migration) 現在表示しているEQ図からLaravel専用のMigrationファイルをZIP圧縮して一式ダウンロード

子テーブルへの外部キー制約が記載されてるMigrationファイルは、
「 5分遅らせた 」ファイル名が生成しています(現時点)。
理由)親テーブルをMigrateしてから子テーブルをMigrateしないとエラーになるため最低限の対応を追加しました。
今後は、外部キーの親・子を全て判断して順番を「時間でずらすことで対応」していこうと考えています(未実装)。

Reverse ERD

Migrationファイル一式をZIP圧縮 → [ Reverse >>> ERD ]ボタンでアップロード
アップロード完了するとER図が表示されます。

Migration(ZIPファイルに一式纏めて) 機能詳細
[ Reverse >>> ERD ] Migrationファイル一式をフォルダに入れて、ZIP圧縮したファイルをアップロード

<< 要注意 >>
「Laravel DB Designer」からZIPファイルをダウンロードしたファイルをそのままアップロードは出来ません。必ず、一度解凍したものをZIP圧縮しなおしてuploadしてください。

今回vol3のまとめ

今回は「 Laravel DB Designer 」の操作方法とメイン機能である「 Save/Load 」と「 出力 」の解説をさせていただきました。まだまだUXの部分には力をいれられてないので、こういった使用説明が必要だと思い書きました。
少しでもご理解いただき使用していただければと存じます。
また、説明が抜けてるところがあるかもしれません、随時更新、内容によっては新しく解説記事を投稿して行こうと思います。

『Laravelを使う人を幸せにしたいという思いから作った』
https://laraveldb.com

以上
今後とも宜しくお願い致します。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【 Laravel 】「Laravel DB Designer 」を便利に使うための知識 ”使い方・仕様 ”について解説 Vol.3

今回は" Laravel DB Designer "の使い方・仕様について書きました(vol3)

『Laravelを使う人を幸せにしたい』という思いから作った「Laravel DB Designer」
(vol2の続きです)[https://qiita.com/daisu_yamazaki/items/92dc3cc599a264c3fb0f]

e.jpg

https://laraveldb.com
※英語圏対応済み

主機能

  • ER図作成 → 対応している”型”はvol2記事の下へ
  • ER図作成 → Migrationファイルを生成
  • ER図作成 → チェック用クエリービルダーを自動生成
  • Migrationファイル → ER図を生成(リバース)再設計可能

テーブル名

テーブル名の頭に"m_"を付けた場合(Master:都道府県のように最初から用意するテーブル)

  • 「 m_テーブル名 」とすると" $table->softDeletes(); "は追加されません

  • 「 m_テーブル名 」とすると" $table->timestamps(); "は追加されません

テーブル名の頭に"t_"を付けた場合(Transaction:ユーザーの入力でデータが追加されていくテーブル)

  • 「 t_テーブル名 」とすると" $table->softDeletes(); "が自動で追加されます

  • 「 t_テーブル名 」とすると" $table->timestamps(); "が自動で追加されます

テーブル名の頭に"t_"も"m_"も付けない場合(接頭辞を付けない場合)

  • "m_" や "t_"を付けなければ " $table->softDeletes(); "が自動で追加されます

  • "m_" や "t_"を付けなければ "$table->timestamps(); "が自動で追加されます

「ER図のSave/Load」機能

ER図データのLoad/Save

Save/Load機能 機能詳細
クラウドへ保存 Web上のDB(Firebase)に保存します。
クラウドデータ一覧 自身がWebに保存したデータ一覧
ブラウザに保存 LocalStorageに一時保存
ブラウザデータ一覧 自身がlocalに保存したデータ一覧

上記の「データ一覧」選択後、「 -- Data List -- 」の選択肢が表示されます。
そこに表示されるデータ項目を選択するとER図が復元します。

ER図から出力(外部出力)

Save/Load機能 機能詳細
ER図からSQLを作成 現在表示しているEQ図からMySQLテーブルを作成するSQL文を作成
Laravel(Migration) 現在表示しているEQ図からLaravel専用のMigrationファイルをZIP圧縮して一式ダウンロード

子テーブルへの外部キー制約が記載されてるMigrationファイルは、
「 5分遅らせた 」ファイル名が生成しています(現時点)。
理由)親テーブルをMigrateしてから子テーブルをMigrateしないとエラーになるため最低限の対応を追加しました。
※子の子テーブル等の外部キー制約は自身で順番にMigrateの必要があります!

Reverse ERD

フォルダにMigrationファイル(Schema::createのみ)一式集めZip圧縮したファイルをアップロードすることで、ER図へ変換(リバース)することが可能です。

Migrationファイル一式をZIP圧縮 → [ Reverse >>> ERD ]ボタンでアップロード
アップロード完了するとER図が表示されます。

Migration(ZIPファイルに一式纏めて) 機能詳細
[ Reverse >>> ERD ] Migrationファイル一式をフォルダに入れて、ZIP圧縮したファイルをアップロード

1.注意
以下Migrationファイル 「 Schema::create 」のみ現在は可能
※ Schema::create以外は対応検討中

Schema::create("テーブル名", function (Blueprint $table) {...}

2.注意
「Laravel DB Designer」からZIPファイルをダウンロードしたファイルをそのままアップロードは出来ません。必ず、一度解凍したものをZIP圧縮しなおしてuploadしてください。

今回vol3のまとめ

今回は「 Laravel DB Designer 」の操作方法とメイン機能である「 Save/Load 」と「 出力 」の解説をさせていただきました。まだまだUXの部分には力をいれられてないので、こういった使用説明が必要だと思い書きました。

また、シンプルな記法(ベーシックな?)をベースに仕様/処理を考えたため、複雑な、又はイレギュラーな記述が入ってるケースでは思った通りの出力にならないこともあるかも知れません。しかし、1から全て書いて行くよりは、楽になると思っています。また、設計後に再度ER図からのやり返しができるので、そこも利点だと思います。
少しでもご理解いただき使用していただければと存じます。

また、説明が抜けてるところがあるかもしれません、随時更新、内容によっては新しく解説記事を投稿して行こうと思います。(現在はMySQLのみ対応:要望が多ければPostgres,SQLite等の対応も検討する予定です)

『Laravelを使う人を幸せにしたい』という思いから作った
Laravel DB Designer https://laraveldb.com
今後とも宜しくお願い致します。

以上、今回はここまで。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

「Laravel DB Designer 」vol.3 「使い方・仕様 」について解説”

今回は" Laravel DB Designer "の「 使い方・仕様 」について書きました(vol3)

『Laravelを使う人を幸せにしたいという思いから作った』
https://laraveldb.com
※英語圏対応済み

e.jpg

主機能

  • ER図作成 (対応している”型”はページ下部に表記)
  • ER図作成 → Migrationファイルを生成
  • ER図作成 → チェック用クエリービルダーを自動生成
  • Migrationファイル → ER図を生成(リバース)

テーブル名

テーブル名の頭に"m_"を付けた場合(Master:都道府県のように最初から用意するテーブル)

  • 「 m_テーブル名 」とすると" $table->softDeletes(); "は追加されません

  • 「 m_テーブル名 」とすると" $table->timestamps(); "は追加されません

テーブル名の頭に"t_"を付けた場合(Transaction:ユーザーの入力でデータが追加されていくテーブル)

  • 「 t_テーブル名 」とすると" $table->softDeletes(); "が自動で追加されます

  • 「 t_テーブル名 」とすると" $table->timestamps(); "が自動で追加されます

テーブル名の頭に"t_"も"m_"も付けない場合(接頭辞を付けない場合)

  • "m_" や "t_"を付けなければ " $table->softDeletes(); "が自動で追加されます

  • "m_" や "t_"を付けなければ "$table->timestamps(); "が自動で追加されます

image.png

【使用時の気をつけるPOINT】

1)
フォルダにMigrationファイル(Schema::createのみ)一式集めZip圧縮したファイルをアップロードすることで、ER図へ変換(リバース)することが可能です。

2)
以下Migrationファイル 「 Schema::create 」のみ現在は可能
※ Schema::create以外は対応検討中

Schema::create("テーブル名", function (Blueprint $table) {...}

3)
外部キー(使った場合)親子の順番でMigrationファイルを選び、Migrateしなくてはいけない
※ 親子順でファイル名(時間等)を少しずらし対応検討中

4)
ダウンロードしたMigrationファイル(ZIP)をそのまま再アップロードは出来ません
一度解凍してから自身のPCでZIPしてアップロードしてください。(PHPでの圧縮アルゴリズムの問題かも)
※ 今後の調査対象の一つ

5)
MySQLのみ対応
※ 要望が多ければPostgres,SQLite等の対応も検討

「ER図のSave/Load」機能

image.png

ER図データのLoad/Save

Save/Load機能 機能詳細
クラウドへ保存 Web上のDB(Firebase)に保存します。
クラウドデータ一覧 自身がWebに保存したデータ一覧
ブラウザに保存 LocalStorageに一時保存
ブラウザデータ一覧 自身がlocalに保存したデータ一覧

上記の「データ一覧」選択後、「 -- Data List -- 」の選択肢が表示されます。
そこに表示されるデータ項目を選択するとER図が復元します。

ER図から出力(外部出力)

Save/Load機能 機能詳細
ER図からSQLを作成 現在表示しているEQ図からMySQLテーブルを作成するSQL文を作成
Laravel(Migration) 現在表示しているEQ図からLaravel専用のMigrationファイルをZIP圧縮して一式ダウンロード

子テーブルへの外部キー制約が記載されてるMigrationファイルは、
「 5分遅らせた 」ファイル名が生成しています(現時点)。
理由)親テーブルをMigrateしてから子テーブルをMigrateしないとエラーになるため最低限の対応を追加しました。
今後は、外部キーの親・子を全て判断して順番を「時間でずらすことで対応」していこうと考えています(未実装)。

Reverse ERD

Migrationファイル一式をZIP圧縮 → [ Reverse >>> ERD ]ボタンでアップロード
アップロード完了するとER図が表示されます。

Migration(ZIPファイルに一式纏めて) 機能詳細
[ Reverse >>> ERD ] Migrationファイル一式をフォルダに入れて、ZIP圧縮したファイルをアップロード

<< 要注意 >>
「Laravel DB Designer」からZIPファイルをダウンロードしたファイルをそのままアップロードは出来ません。必ず、一度解凍したものをZIP圧縮しなおしてuploadしてください。

今回vol3のまとめ

今回は「 Laravel DB Designer 」の操作方法とメイン機能である「 Save/Load 」と「 出力 」の解説をさせていただきました。まだまだUXの部分には力をいれられてないので、こういった使用説明が必要だと思い書きました。
少しでもご理解いただき使用していただければと存じます。
また、説明が抜けてるところがあるかもしれません、随時更新、内容によっては新しく解説記事を投稿して行こうと思います。

『Laravelを使う人を幸せにしたいという思いから作った』
https://laraveldb.com

以上
今後とも宜しくお願い致します。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【laravel】 migrationでindexの削除

削除出来ない

usersテーブルのtextカラムにindexを以下のように貼った時、

 $table->index('text');

削除を以下のようにして php artisan migrate:rollback を実行すると。

$table->dropIndex('text');
PDOException::("SQLSTATE[42000]: Syntax error or access violation: 1091 Can't DROP 'text'; check that column/key exists")

怒られる。

なぜ

laravelはindex名は命名規則に基づいて定められる。

'users_id_primary' // 主キー
'users_email_unique' // ユニークキー
'users_name_index' // 基本インデックス
'users_location_spatialindex' // 空間インデックス

なので、今回の場合はindex名は users_text_index となっている。

そういうindexは無いので怒られる。

解決

消したいindexが貼ってあるカラム名を配列にして入れることで、命名規則に従ったindexが削除される。

$table->dropIndex(['text']);
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

mysql 5.5 source download

download

mariadb について

  • mariadb 5.5 までは mysql 5.5 互換。

  • mariadb のビルドには zlib-develが必要

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

よく使うSQL文 チートシート | MySQL編

mysqlのインストール

mac OSでhomebrewが入っている場合

brew install mysql

window OSの場合
こちらをご覧ください
https://webkaru.net/mysql/install-windows/

ログイン

パスワードがない場合

mysql -u root

パスワードがある場合

mysql -u root -p

データベースの一覧を表示

SHOW DATABASES;

データベースへの作成

CREATE DATABASE DB名;

データベースの削除

DROP DATABASE DB名;

データベースの選択

USE DB名;

テーブル一覧を表示

SHOW TABLES;

テーブルを作成

CREATE TABLE テーブル名;

テーブルを削除

DROP TABLE テーブル名;

テーブルへデータを追加

INSERT INTO テーブル名 (カラム名, カラム名) VALUES ("データ"、"データ");

テーブルのデータの変更

SETの後のカラム名には、変更したいデータを入れます。
WHEREの後のカラム名には、どのデータを変更したいか入れます。

UPDATE テーブル名 SET カラム名="データ",カラム名="データ" WHERE カラム名="データ";

テーブルのデータを取得

SELECT * FROM テーブル名;

テーブルのデータを削除

DELETE FROM meta_data;

大文字と小文字はどっちでもいいの?

どっちでもいいです。

参考

https://qiita.com/knife0125/items/bb095a85d1a5d3c8f706
https://dev.mysql.com/doc/refman/5.6/ja/select.html

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む