ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

m1 macでschemaspyをdocker composeで動かす

概要

  • 参考にしてた記事で動かんくなってたので辛い
  • 改めて整理して色々試して動くようになったのでそれだけ貼り付ける

ディレクト

$ tree
.
├── Dockerfile
├── docker-compose.yml
├── initdb.d
│   └── 01-init.sql
├── mysql
│   └── custom
│       └── my.cnf
├── output
└── schemaspy
    └── schemaspy.properties

ファイルの内容

Dockerfile

FROM openjdk:8u212-jdk-alpine

ENV DRIVER_URL https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.30/mysql-connector-java-8.0.30.jar
ENV APP_URL https://github.com/schemaspy/schemaspy/releases/download/v6.1.0/schemaspy-6.1.0.jar

WORKDIR /app
COPY schemaspy/schemaspy.properties .

RUN apk --update add graphviz ttf-dejavu && \
    apk --update add --virtual .builddep tzdata wget libressl && \
    cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
    mkdir /drivers && \
    wget -O /drivers/mysql-connector-java.jar ${DRIVER_URL} && \
    wget -O schemaspy.jar ${APP_URL} && \
    apk del .builddep && \
    rm -rf /var/cache/apk/*

docker-compose.yml

version: "3.9"
 
volumes:
  db-store:
 
services:
  db:
    image: mysql:8.0-oracle
    volumes:
      - db-store:/var/lib/mysql
      - ./initdb.d:/docker-entrypoint-initdb.d
      - ./mysql/custom:/etc/mysql/conf.d
    environment:
      - MYSQL_DATABASE=my_database
      - MYSQL_ROOT_PASSWORD=root
 
  schemaspy:
    build:
      context: .
    image: schemaspy
    volumes:
      - ./output:/output
    tty: true

initdb.d/01-init.sql

CREATE DATABASE IF NOT EXISTS my_database;
USE my_database;

CREATE TABLE `pokemon` (
    `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    `name` VARCHAR(255) NOT NULL
);

CREATE TABLE `type` (
    `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    `name` VARCHAR(255) NOT NULL
);

CREATE TABLE `waza` (
    `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    `name` VARCHAR(255) NOT NULL,
    `type_id` INT NOT NULL,
    FOREIGN KEY (`type_id`) REFERENCES `type`(`id`)
);

CREATE TABLE `pokemon_type` (
    `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    `pokemon_id` INT NOT NULL,
    `type_id` INT NOT NULL,
    FOREIGN KEY (`pokemon_id`) REFERENCES `pokemon`(`id`),
    FOREIGN KEY (`type_id`) REFERENCES `type`(`id`)
);

CREATE TABLE `pokemon_waza` (
    `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    `pokemon_id` INT NOT NULL,
    `waza_id` INT NOT NULL,
    FOREIGN KEY (`pokemon_id`) REFERENCES `pokemon`(`id`),
    FOREIGN KEY (`waza_id`) REFERENCES `waza`(`id`)
);

schemaspy/schemaspy.properties

schemaspy.t=mysql
schemaspy.dp=/drivers/mysql-connector-java.jar
schemaspy.host=db
schemaspy.port=3306
schemaspy.db=my_database
schemaspy.s=my_database
schemaspy.u=root
schemaspy.p=root
schemaspy.implied=true
schemaspy.norows=true
schemaspy.nopages=true

mysql/custom/my.cnf

[mysqld]
character-set-server=utf8

[mysql]
default-character-set=utf8

実行

$ docker compose up -d
$ docker compose exec schemaspy java -jar schemaspy.jar -o /output/

参考記事

gmor-sys.com

qiita.com

zenn.dev

Railsでのデバッグ

これまでprintデバッグプログラマだったが、さすがに辛いということでPythonのipdbみたいのないかなってぐぐってみたらあった。

techracho.bpsinc.jp

あったけど、どうせControllerのデバッグとかめんどいでしょ?とか思ったんだけど、RSpecで試したらちゃんと停止した!!!!!?

覚えた

サブクエリの結果とjoinする

概要

  • SQLだったら、2つのサブクエリの結果をjoinして結果を出したかった
  • Railsでのやりかたわからんかったので色々試す

目的

TableAのvalueをidごとに集計するんだけど、①全集計と②とある条件で集計した結果をidごとに紐付けて差分とる。というようなSQLを書きたかった

やり方

こちら参考

takakisan.com

table_a_all_sum = TableA.group(:id).select('id', 'sum(value) AS sum_value')
table_a_con_sum = TableA.where("条件").group(:id).select('id', 'sum(value) AS con_sum_value')

ここまではおk

で、記事を参考にしたところ、サブクエリは joins にも食わすことができるとのことなのでこうした

TableA.joins("inner join (#{table_a_all_sum.to_sql}) table_a_all_sum on table_a.id = table_a_all_sum.id", "inner join (#{table_a_con_sum.to_sql}) table_a_con_sum on table_a.id = table_a_con_sum.id")

そしたら無事できた。あとは引くだけ

"↑の続きで".select('table_a_all_sum.sum_value - table_a_con_sum.con_sum_value AS sub_value')

ぼくたちに旅行はまだ早かった

概要

  • 4歳と2歳つれて初めて家族旅行しました(僕の両親+弟付)
  • 正直、旅行どころではなかった
  • ぼくたちにはまだ早かったかもしれない

旅程

  • 大阪観光
  • USJで遊ぶ
  • 京都観光
  • 淡路島でゴジラ!! 急遽旅程変更して海遊館

前知識

  • 長男は療育をうけている子。1年前とくらべてだいぶ話せるようにはなってきているが、スイッチ入ると暴れん坊
  • 次男はおとなしいと思ってたが、2歳になり覚醒。イヤイヤ期真っ只中
  • I hava a 長男, I hava a 次男, ummm...!
_人人人人人人人人_
> 暴れん坊将軍 <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^ ̄

振り返り

うちの子は暴れん坊将軍の生まれ変わりなのかもしれない

エピソード(抜粋)

  • 飛行機で前の席を蹴りまくる(次男)
    • 長男は飛ぶ飛行機に夢中(お利口さん・・・・!)
  • 次男を道頓堀で見失う。やばい(数分後に確保)
  • 長男が道頓堀でデビルバットゴースト。見失う(数十分後に確保)
  • 次男、二条城の橋で鳩に手渡しで餌をあげて時間を消費する
  • 城跡を見下ろせる高いところで大人の悲鳴が聞こえる
    • 次男が柵をくぐってあともうちょっとで落ちるところだったあぶない(本当に危ない)
      • 悲鳴は他の観光客。悲鳴あげてくれてありがとう(気づけたので助かった)
    • 柵越しに背中を捕まえて徐々に上に持ち上げて、柵超える
    • パパの心臓はいくつあっても足りない
  • 金閣寺で砂利で遊び通行人を遮る
  • ホテルで自室の鍵を解除し、フロアを奇声をあげながら駆け巡る
    • すみません皆様すみません
  • 兄弟揃って水族館でデビルバットゴー(ry

落ち着いてご飯が食べれない

  • (この子らをつれて食事が)無理
    • 次回食べるなら別れる必要がある(誰かが食べに行っている間は誰かが見る)
  • もちろん夕飯も無理
    • 諦めてデリバリーしましょう
    • ホテルによってはセキュリティ観点でデリバリーNGなところあるので注意
  • 旅行なのにコンビニ飯が捗る
  • 京都で奇跡が起きた。長男も次男もおとなしくラーメンを食べていた。奇跡
    • 長男次男をわけるように席を分けたのがよかったのかも(一緒になるとお互いそれぞれの行動がトリガーになって遊ぶ暴れる(席から)消える)
    • 奇跡がおきた店: https://retty.me/area/PRE26/ARE115/SUB11501/100001443855/
    • 美味しかった

レンタカーの車種・車の広さは事前に確認ください

  • なんの車種をレンタルしたか覚えていないが、7 ~ 8人乗りって書いてあったからレンタルしたところ、トランクがない
  • つまり荷物が乗らない。辛い

大阪の道が怖い

  • 都心に入っているはずなのに、なんかぐるぐるしている感じがあって怖い
  • 道なりです。とナビに案内されたら、まっすぐいくと進入禁止で陸橋をクロスするように陸橋を超えた左側の道に移動しないといけなかったり
    • 初心者殺しすぎる
  • 右折すると、絶対止まらないいけない信号があって、そこで停止しないといけなかったり
    • でも普通は信号があっても止まらない道が多いと思うんだよね。そこだけ「止まれ」の文字があるので止まったら正解だった。無理よ
  • ETCカードもっていくと高速乗り降りが楽で良い
    • あと、高速入り口で前金?払う仕組みがおもろかった。移動するだけで金が飛ぶ

USJの遊び方

入場チケットとエクスプレスパスなるものがある

  • 入場チケットとあわせてエクスプレスパスを手にれているとアトラクションへの待ち時間がカットできる
  • エクスプレスパスは全アトラクションではなく、プランによって一部アトラクションへの待ち時間カットなので注意
  • 予め乗りたいアトラクションをみんなで話し合って決めてからチケット購入すると良い

USJは身長制限があります。ご注意ください

  • 105cmぐらい?からじゃないと同伴で乗れない
  • うちの子100cmで乗れない。なんだとー!!!!ってなってたがしょうがない
  • というわけでエクスプレスパスがぱぁになった。注釈書いておいておくれ〜〜〜〜

ただし、アトラクション利用基準に満たない場合には、対象のアトラクションを利用できません。

(確認しなかった僕も悪いが)これじゃわからん

あと大人だけで乗って思ったのが、ジェットコースターとか明らかに乗れないのはわかるものの、子供向けのコンテンツでもアトラクションは思いの外ガシャンガシャン動くので、乗ったあと「たしかにな」って思った

じゃあ小さい子は遊べないのか

これ

恐竜のイベント(?)が見れたので満足

  • ジュラシックパークはお土産屋以外だと、アトラクションに乗らないと恐竜が見れない
  • ふえ〜〜〜〜〜〜ってなってたら、たまたま足を運んだタイミングでYoutubeでよく見るやつのパークでのトリケラトプスとかラプトル(たぶん)がでてきた
  • 次男と目を輝かせながら一緒に見てた
  • 長男は恐竜だー!っていってそそくさどっかにいってしまった

京都はとてもよかった

  • バス1日乗り放題(700円)のチケット?があるので、京都駅で手に入れたらのんびりバスに揺られながら観光できます
    • ただ、旅行シーズンだと、めっちゃ上の道混むらしいので、地下鉄に乗り換えて電車で移動しても良い
  • 思いの外、城とかがよかった
    • TVで見る印象とだいぶ違うので、やっぱり1次情報にふれるというのはとても良い
  • ただし、子供は砂利で遊びます

まとめ

  • 疲れた
  • まだ早かったなと思ったので、来世では子供がまだこの年齢だと旅行をやめておこうと思いました

Railsのassociationでaliasをつける方法とFactoryBotのassociationでaliasをつける方法

概要

  • ハマったので調べたメモ

Rails

qiita.com

  • ~/app/models/user.rb
  • ~/app/models/book.rb

user:bookは 1:N とする

user側はhas_manyになるが、book側はbelongs_toになる。

belongs_to :user, foreign_key: 'user_id'

aliasに変更したい場合は、こう

belongs_to :borrow_user, class_name: 'User', foreign_key: 'user_id'

class_name にターゲットのモデル名を渡してあげたらおk

注意点として、aliasをつけたので、 find とか使う先に指定する名前はaliasを指定する必要があります

FactoryBot

www.rubydoc.info

Railsと同じかしら?と思ってましたが、違ってたのでハマりました。ドキュメント読みましょう(戒め)

色々書き方はありそうですが、僕はこうしました。

borrow_user { association :user }