楽々ERDレッスンでER図の描き方を学んだ
tl;dr
- 楽々ERDレッスン+MySQL WorkbenchでER図を描く練習が捗る
取り組む前の自分のスキル・知識
- 業務でER図を読むことはある
- 業務でER図を描いたことはない
- IE記法は分かる、IDEF1X記法は分からない
動機
- 最近、実装より上のレイヤーの設計に関わる機会が増えた
- ER図がないとデータ構造を議論しにくい(ER図がない場合は自分で描けるようにしたい)
- ER図がないと自分もデータ構造を理解できない・問題に気づけない・忘れると思い出すのに時間がかかる
- というわけでER図を描く訓練したい
楽々ERDレッスンとは
...それに加えて、私が設計のスキルを付けるために実際に行ってきた「身の回りのものを題材にERDを書く」という方法のサンプルを今回は8種類書き下ろさせていただきました。手前味噌ではありますが、本書をお読みいただき実践していただくことで「実務で具体的に手が動く」というレベルに達していただけると考えています。
- ER図の演習問題と解答・解説が8セットも掲載されている
- 題材の例としてはレシート、注文書、請求書等
- 演習問題は全体の1/3ぐらいで、DBの論理設計周りの解説もあり
- 何事も手を動かすことは正義
どうやってER図を描くか
- MySQL :: MySQL Workbench: ビジュアルデータベース設計を使った
- ツールはあくまで手段なので、学習コストの低さと描きやすさがそれなりに両立していれば良いと思った
- 多少動きに癖はあるが、練習用・イメージを掴むのに使うのに丁度よいと感じた
- ER図からテーブル定義のDML発行可能
8回分完走してみて
所感
- 年末年始でコツコツ8回分進めた(内7回分のER図を実際に描いた)
- 答えの図だけでなく、始めにイベント系、次にリソース系のエンティティを見つけて項目を足してリレーションを考えて...という一定の型に沿った解説が凄く良かった
- (規模にもよるが)慣れれば一旦議論の場に出せるレベルのER図を描くのは難しくない。ツールに慣れていれば長くても30分ぐらいでできるタスクだと思った
- 作図のための型があったので、1,2回解説を読んで描いたら後の回は大体自力で描けて大体合ってた
- やっぱり図にすると業務の理解不足、考慮漏れが明らかになるので絶対描いたほうが良いと思った
- IDEF1X記法が解答や例で使われていたので少し馴染めた(MySQL Workbenchが両方の記法を切り替えできたのも良かった)
- あと掲載されている題材の画像がもっと大きいと良いなと思ったりもした(文字が細かくて読みにくい)
苦手意識
ER図を描いていて気づいた自分の弱点
- イベントを中心にリソースとリレーションを繋ぐ発想が浮かびにくかった
- (例)何となくUserテーブルの項目が多くなりがちだった
- 帳票等のサンプルからイベントを見つける/切り分けるという業務分析の考え方や経験が足りないなと思った
次は
- 練習したのはあくまで架空のシステムのER図なので、あとは実際に稼働している多くのシステムと対峙して経験を積んでいくかという気持ち
- 要件定義系の演習課題集も何冊か発売されているみたいなので少し興味ある
macOS 10.14でdark mode有効時にMySQL WorkbenchのUIが変になる問題の解決策
楽々ERDレッスン(羽生章洋)|翔泳社の本を読みながらER図を描きたかったので、MySQL Workbenchがいいかなと思いセットアップしていたら困ったのでメモ。
環境
事象
解決策
$ defaults write com.oracle.workbench.MySQLWorkbench NSRequiresAquaSystemAppearance -bool yes
- MySQL Bugs: #92902: MySQL Workbench with OSx 10.14 Color Issueに記載の通りMySQL Workbench起動時だけdark modeを無効にする
結果
- 直った
- 8.0.14で修正されるらしいのでアップデート待ち
bashの`printf "%.s" hoge`と`printf "%0s" hoge`の違い
環境
事象
$ printf "%0s" hoge hoge $ printf "%.s" hoge # 何も表示されない
疑問
- 文字列かつ精度指定は文字数の制限なので0を指定したら何も表示されないのでは
- "%.s"で何も表示されないのはピリオド=精度0と解釈されているからだと思う
オプションである精度は、ピリオド ('.') とそれに続く10進数という 形式で指定する (10進数はオプション) 。 10進数の文字列の代わりに "" や "m$" (m は 10 進整数)を書くこともできる。 "" と "m$" はそれぞれ、次の引き数と m 番目の引き数を精度として 使うことを指定する (これらの引き数は int 型でなければならない)。 精度として '.' だけが指定された場合、 精度はゼロとみなされる。 精度が負の数だった場合、 精度は指定されなかったものとみなされる。 d, i, o, u, x, X 変換では、表示される最小の桁数を指定する。 a, A, e, E, f, F 変換では、小数点以下に表示される数字の桁数を指定する。 g と G 変換では、有効数字の最大桁数を指定する。 s と S 変換では、文字列から出力される最大文字数を指定する。
解決
- 文字列の場合は
%5.3s
は全体5桁、最大3桁の文字列を出力する
$ printf "%5.3s" 123456 123 # 全体の長さが5なので半角空白が2つ入る
- したがって、
%.s
は%0.0s
と解釈されて最大0桁の文字列出力だから何も表示されなかった(推測)*1
$ printf "%0.0s" hoge # 何も表示されない
- ちなみに、
%0s
で表示されたのは最大桁の指定無しだったから(推測)- 全体の文字数<引数の文字数の場合は全て表示
$ printf "%1s" hoge hoge
精度は変換指定子によって意味が異なる
- 何となく
%f
で小数点以下を指定するイメージしかなかった - ちゃんと確認しよう
これがしたかった
- そもそもなんで気になっていたかというと、このスクリプトの原理が分からなかったからでした
$ printf hoge\\n"%.s" {1..5} hoge hoge hoge hoge hoge
参考
*1:実装は確認していないので
キャッシュレスな生活をしたい
たまにはライフハック的な記事でも
現金を使いたくない理由
- 紙幣や小銭を探すために時間がかかる
- 所持金を補充するためにATMを利用する必要がある
- 新生銀行はスタンダード会員の場合に1回あたり108円のATM利用手数料がかかるようになってしまった
- ATMは順番待ちする場合もあり時間がかかる、セキュリティ上のリスクもある
- 支払い金額に対して所持金が不足している可能性がある
- 財布を持たないといけない
- 小銭が増えるとかさばる
- 財布の紛失リスク
- 財布には現金以外に保険証やクレジットカード等も入っている
現金を使う場面と解決策を整理
- 自分が日々の生活で現金を利用する場面を整理した
- 下記以外の場面ではクレジットカードを使う(病院、家電量販店etc)
- もちろん下記の場面でもクレジットカードは使えるが、サインや暗証番号を求められるので日常的に使用するなら代替手段を見つけたい
- 割り勘は人依存(Kyash使えるとそれで済む)
場面 | 頻度 | 急ぎ度 | 解決策 |
---|---|---|---|
コンビニで買い物 | 毎日 | 高 | Suica |
スーパーで買い物 | 週2,3回 | 低 | なし(クレジットカード) |
ドラッグストアで買い物 | 週に1回 | 低 | なし(クレジットカード) |
スターバックス | 週2,3回 | 中 | スターバックスモバイルアプリ |
外食(昼食) | 週2,3回 | 中 | なし(クレジットカード) |
Suicaチャージ/定期券更新 | 月1,2回 | 高 | JREカードで自動化 |
- 急ぎ度は始業前、業務中等は高くなる
問題点
支払い方法
- スーパー、ドラッグストアは店舗によってはSuica利用可だが自宅周辺の店舗は未対応
- 諦めてクレジットカードで支払う?
- 大抵の飲食店はクレジットカードor現金しか選択肢がない
- ランチだと1000円でお釣りなしの場合も多いのでクレジットカードの方が支払い速度が遅くなりそう
小銭の処分
- 現金を使う場面が減ると小銭は減りにくくなる。ただし現金を一切利用しないわけではないので小銭が増えることはある
- 自宅に小銭を貯めるスペースを作る or 募金箱に投入する?
理想はJREカード1枚 + 小さくて安価な財布
所感
bashでUnicodeコードポイントから文字を表示する方法まとめ
シェル芸に取り組んでいるとUnicodeコードポイントを操作して文字を表示させることが多いのでまとめ。
環境
\uを利用する方法
- こんな感じのこと
$ echo -e \\u3043 ぃ
数値文字参照を利用する方法
- こういう方法もある
$ echo 'ぃ' | nkf --numchar-input ぃ
- 複数行に並べられたコードポイントを一括で文字に変換するときは便利かも?
- 何となくワンライナーの見通しが良い
$ for c in $(seq 0x3042 0x3050); do printf "&#x%x;\n" $c; done | nkf --numchar-input あ ぃ い ぅ う ...(略)
VSCodeで次の差分にジャンプするショートカットキー
環境
VSCodeのファイル差分の表示
command
+P
でコマンドパレットを開いてcompare
と入力すると、いくつかのファイル比較機能が候補として表示される- SI経験者にはお馴染みのWinMerge的な画面でWinMerge的なことができるので自分もたまに利用するが、たまに利用する程度なので次の差分へのジャンプとかできないのかなー、まあできなくてもいいかーと思って放置してた
- で、改めて調べてみたらちゃんとあった。デフォルトだと
option
+F5
で次の差分、shift
+option
+F5
で前の差分にジャンプ- タッチバー有りのMacBookだと変更した方が楽かも
{ "key": "alt+f5", "command": "workbench.action.editor.nextChange", "when": "editorTextFocus" }, { "key": "shift+alt+f5", "command": "workbench.action.editor.previousChange", "when": "editorTextFocus" },
シェルスクリプトの出力を画面に表示しつつファイル出力する方法について
環境
ターミナル上の作業ログを取りたい場合
script
コマンドを使うとターミナル上の操作と出力を全てファイルに記録できる
$ script Script started, output file is typescript $ echo hoge hoge $ ls hoge ls: cannot access 'hoge': No such file or directory $ exit
- 下記のように入力と標準出力と標準エラー出力が全て記録されている
// typescript Script started on Sun Dec 2 19:15:10 2018 bash-4.4$ echo hoge hoge bash-4.4$ ls hoge ls: cannot access 'hoge': No such file or directory bash-4.4$ exit exit Script done on Sun Dec 2 19:15:45 2018
実行するシェルスクリプトのログを画面に表示しつつファイル出力したい場合
script
は別プロセスを起動するのでうまく使えない.sh
ファイル実行中の標準出力と標準エラー出力をログとしてファイルへ出力しつつターミナルの画面にも出力する- 下記のコードはこちらの記事(bashのプロセス置換機能を活用して、シェル作業やスクリプト書きを効率化する - 双六工場日誌)を参考にした1
exec 1> >(tee -a stdout.log) exec 2> >(tee -a stderr.log) # 処理 echo hoge
- なる...ほど?
- シェルスクリプトに慣れ親しんでいないと分かりにくい(少なくとも自分は理解できなかった)
- 分解して考えてみる
リダイレクト
- 始めにリダイレクトの概念を知っている必要がある
リダイレクトは標準入出力の入力元、出力先を置き換える機能のこと
[三宅 英明 (2017) . 新しいシェルプログラミングの教科書 SBクリエイティブ P115より引用]
- 例えば
echo hoge 1> hoge.log
は標準出力をhoge.log
にリダイレクトする - 1はファイルディスクリプタの番号
- 0:標準入力、1:標準出力、2:標準エラー出力
1>
を省略すると>
になるのでecho hoge > hoge.log
でも良い
exec
コマンド
- 続いて
exec
execに指定したコマンドを実行する。このコマンドを実行する際に,新しいプロセスを作成せずに,現在のジョブと置き換えて実行される。...また,何もコマンドを指定せずにリダイレクトを利用すると,現在のシェルのリダイレクトを切り替えられる。
【 exec 】 現行のジョブに置き換えてコマンドを続行する | 日経 xTECH(クロステック)より引用
- ここではコマンドを指定していないのでシェルのリダイレクトを切り替えている
プロセス置換
<(command)
と>(command)
の2つがある
<(command)
<(command)
は、プロセス置換によって割り当てられたファイルにcommand
の標準出力を出力- シェル芸でも時々使う
$ echo <(echo test) /dev/fd/63 $ cat <(echo test) test
>(command)
>(command)
は、プロセス置換によって割り当てられたファイルの内容を標準入力としてcommand
を実行exec
と組み合わせることが多い模様- 今回はシェルの出力が、一時的に割り当てられたファイルへリダイレクトされ、それを標準入力としてコマンドが実行される
tee
コマンド
- 標準出力しつつファイルにも出力する
- 処理の流れがT字型のイメージ
-a
はファイルに追記のオプション
$ echo hoge | tee hoge.log hoge $ cat hoge.log hoge
これらを踏まえて
- もう1度見てみる
exec 1> >(tee -a stdout.log) exec 2> >(tee -a stderr.log)
- 現在のシェルの標準出力と標準エラー出力をそれぞれ
tee
の標準入力にすることで画面に出力しつつファイルへの記録を実現している - 処理の意味が理解できた!(と思う)
最後に
- シェルに詳しくないので他にも出力の方法はあるかも
- あとこの記事はチームスピリット Advent Calendar 2018 - Adventarの3日目の記事ということになってます
- 今年は参加率高い!
-
元記事の
exec 2> >(tee -a stderr.log >&2)
の>&2
はどうして必要なのかよく分からなかった。知っている方いたら教えてください↩