yn2011's blog

技術メモ

楽々ERDレッスンでER図の描き方を学んだ

f:id:pokuwagata:20190108100308p:plain:w500

tl;dr

  • 楽々ERDレッスン+MySQL WorkbenchでER図を描く練習が捗る

取り組む前の自分のスキル・知識

  • 業務でER図を読むことはある
  • 業務でER図を描いたことはない
  • IE記法は分かる、IDEF1X記法は分からない

動機

  • 最近、実装より上のレイヤーの設計に関わる機会が増えた
    • ER図がないとデータ構造を議論しにくい(ER図がない場合は自分で描けるようにしたい)
    • ER図がないと自分もデータ構造を理解できない・問題に気づけない・忘れると思い出すのに時間がかかる
  • というわけでER図を描く訓練したい

楽々ERDレッスンとは

...それに加えて、私が設計のスキルを付けるために実際に行ってきた「身の回りのものを題材にERDを書く」という方法のサンプルを今回は8種類書き下ろさせていただきました。手前味噌ではありますが、本書をお読みいただき実践していただくことで「実務で具体的に手が動く」というレベルに達していただけると考えています。

楽々ERDレッスン(羽生章洋)|翔泳社の本より引用

  • ER図の演習問題と解答・解説が8セットも掲載されている
    • 題材の例としてはレシート、注文書、請求書等
    • 演習問題は全体の1/3ぐらいで、DBの論理設計周りの解説もあり
  • 何事も手を動かすことは正義

どうやってER図を描くか

  • MySQL :: MySQL Workbench: ビジュアルデータベース設計を使った
  • ツールはあくまで手段なので、学習コストの低さと描きやすさがそれなりに両立していれば良いと思った
  • 多少動きに癖はあるが、練習用・イメージを掴むのに使うのに丁度よいと感じた
  • ER図からテーブル定義のDML発行可能

8回分完走してみて

所感

  • 年末年始でコツコツ8回分進めた(内7回分のER図を実際に描いた)
  • 答えの図だけでなく、始めにイベント系、次にリソース系のエンティティを見つけて項目を足してリレーションを考えて...という一定の型に沿った解説が凄く良かった
  • (規模にもよるが)慣れれば一旦議論の場に出せるレベルのER図を描くのは難しくない。ツールに慣れていれば長くても30分ぐらいでできるタスクだと思った
    • 作図のための型があったので、1,2回解説を読んで描いたら後の回は大体自力で描けて大体合ってた
    • やっぱり図にすると業務の理解不足、考慮漏れが明らかになるので絶対描いたほうが良いと思った
  • IDEF1X記法が解答や例で使われていたので少し馴染めた(MySQL Workbenchが両方の記法を切り替えできたのも良かった)
  • あと掲載されている題材の画像がもっと大きいと良いなと思ったりもした(文字が細かくて読みにくい)

苦手意識

ER図を描いていて気づいた自分の弱点

  • イベントを中心にリソースとリレーションを繋ぐ発想が浮かびにくかった
    • (例)何となくUserテーブルの項目が多くなりがちだった
  • 帳票等のサンプルからイベントを見つける/切り分けるという業務分析の考え方や経験が足りないなと思った
    • (例)図書館の予約(リクエスト)申込書が、1つの紙面に予約と置いていない本のリクエストという2つの役割を担っている等
    • これはありがちで、設計が難しくなるパターンの1つだという実感がある

次は

  • 練習したのはあくまで架空のシステムのER図なので、あとは実際に稼働している多くのシステムと対峙して経験を積んでいくかという気持ち
  • 要件定義系の演習課題集も何冊か発売されているみたいなので少し興味ある

macOS 10.14でdark mode有効時にMySQL WorkbenchのUIが変になる問題の解決策

楽々ERDレッスン(羽生章洋)|翔泳社の本を読みながらER図を描きたかったので、MySQL Workbenchがいいかなと思いセットアップしていたら困ったのでメモ。

環境

事象

f:id:pokuwagata:20190101202524p:plain

解決策

$ defaults write com.oracle.workbench.MySQLWorkbench NSRequiresAquaSystemAppearance -bool yes

結果

f:id:pokuwagata:20190101202822p:plain

  • 直った
  • 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 変換では、文字列から出力される最大文字数を指定する。

Man page of PRINTFより引用

解決

  • 文字列の場合は%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枚 + 小さくて安価な財布

  • JREカードはスマホケースに入れる
  • 財布紛失時のリスクを最小に抑える
    • 財布の中は千円札数枚、少し遠出するなら新生銀行のキャッシュカードも持つ
  • 財布はこういうイメージ? もっと小さいのもあるかも

www.muji.net

所感

  • ストレスフリーな完全キャッシュレス生活のためには下記のどれか、あるいは全部の実現が必要そう

    • クレジットカードの支払いが爆速になる
    • どこでもSuica支払い可能になる
    • PayPay等のスマホ決済サービスが普及する
  • 現状では完全キャッシュレス生活の実現は難しいが、個人として可能な範囲では努力したい所存

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
あ
ぃ
い
ぅ
う
...(略)
  • 数値文字参照は、文字参照の1つ
    • 詳細はこちら文字参照 - Wikipedia
    • HTMLで<&lt;と表記する方法は文字実体参照と呼ぶとのこと(Dom Based XSSの回避策としても利用されるので、名前は知らなくても見覚えのある人は多そう)
  • 10進数の場合は&#;で、16進数の場合は&#x;文字集合のコードポイントを表記する

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

実行するシェルスクリプトのログを画面に表示しつつファイル出力したい場合

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はファイルディスクリプタの番号
  • 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コマンド

  • 最後にtee

    tee(ティー)はUnixのコマンドの一つ。 コマンドの標準出力 (stdout)を他のファイルにコピーできる機能を提供する。

tee (UNIX) - Wikipediaより引用

  • 標準出力しつつファイルにも出力する
  • 処理の流れが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の標準入力にすることで画面に出力しつつファイルへの記録を実現している
  • 処理の意味が理解できた!(と思う)

最後に


  1. 元記事のexec 2> >(tee -a stderr.log >&2)>&2はどうして必要なのかよく分からなかった。知っている方いたら教えてください