ゼロからわかるRuby超入門を読んでいる
先日RubyWorld Conference 2018で発売が発表されていた
を本屋で見つけたので購入。
読んでいて「知らなかった!」というのがいくつか出て来たのでメモ。
gets
コンソールでいじるようなプログラムをそんなに書かないということもあり、実行時に引数を渡せる書き方を知らなかった。
input1 = gets input2 = gets
と書くと、文字列
で入力をそれぞれ受け取れる。
binding.irb
pryじゃないの?と思ったら、2.4.0からbinding.irb
でirbが起動して
デバッグできるんですね。
rubyのバージョンが追いついていればpryをGemfileから消しても問題なさそう。 Readmeに
Pry also aims to be more than an IRB replacement; it is an attempt to bring REPL driven programming to the Ruby language.
とあるからpryにしかなくて、irbだとできない機能とがあるのかな?
カスタマイズが効くなどがありそう。
参加メモ/中国地方DB勉強会 in 渋谷
SQLアンチパターンでおなじみの、 和田 省二さんに会えると聞いて、参加してきました。 会場を提供いただいたVoyageGroup様、主催の id:Soudai さんはじめ、参加者の皆様ありがとうございました。
控え目にいって最高の勉強会でした
最近大きめのDB負債と戦っているところだったので、何かヒントが得られるかと思って参加しましたが、 いい意味で期待を裏切られました。 ブログを書くまでが勉強会ということで、以下メモ。
Postgreの内部構造と監視の話
- ふだんMySQL使ってますが、他のDBMSとの比較もありつつ、参考になった。
- MySQLの内部構造がわかるようになりたさが増した。
- 監視の基本:
推測->計測(点で見る)->観測(継続的に見る) - 計測に使うライブラリの選定には、企業が作ってるものを選ぶ。
- 個人が作っているものだと、メンテが突然止まってしまうことがあり、長いスパンで見ないといけないものを計測するにはその方が安心感ある。
pg_stats_reporter読影会
- グラフを定期的にみんなで見ながら障害の振り返りや、各種メトリクスグラフの勘所などを共有する試み。
- (Mackerelなどのグラフを見るだけだから)事前準備が不要。
- 2週に1回定期開催してるそう。
- 良さしかなさそうなので、来週から早速やっていきたい。
- 監視サービスを複数使う際は、担当範囲の重なりと視点の違いを意識して使う。
和田さんによるデータモデリングの話
- データと情報の違い
- データ: 事実。変えようがない。取り損ねたらおしまい。
- 情報: データを加工して取り出したもの
- アプリケーションで扱うのは「情報」。データベースが扱うのは「データ」
SQLアンチパターン 監訳者まえがき xii より
さて、皆さんは「情報」と「データ」の違いをご存知でしょうか。
(中略)
データは唯一無二の事実値ですから、それから作り出される情報はどれも正しく、互いに整合性が取れています。
もうお分かりと思いますが、「データ」を永続化して蓄えるのに適しているのがRDBであり、それから「情報」を生成するのに適しているのが「SQL」なのです。
データモデリングの話
正規化まで行かないといけないデータモデリング
- ERDで森を鳥瞰する。テーブル定義書で木を見る。
- Entity: 6W2H(When, Where, Who, What, Why, Whom, How, How much/How many)で表す。
- Event: 定期的に繰り返されるコト。When(これが一番大事), How much/How manyで表されるコト。
- 事実なので過去しかない。システムに「現在」は存在しない。
- Resource: 登録するモノ。Eventのやつ以外で表されるモノ。
- 権利や資格など目に見えないモノも含む。
- 発生〜消滅がある期間。未来開始もあり。消滅時点が未設定もあり。
- Relationship: EventにResourceを供給する
- EntityもResourceもKeyを持った集合。
- キー
- 最近はORマッパーの都合でサロゲートキーが濫用されている。SQLアンチパターン「とりあえずID」を参照のこと。
- サロゲートキーが登場するのは、代用キー(Alternate Key)が複数のキー項目で構成される場合に、論理的なポインタとして利用する時。
- 関数従属
- 多値従属
- 4NF, 5NFの理解には必須。
- Key1が決まれば、Key2, Key3が決まる→4NF
- Key1が決まれば、Key2, Key3が決まる。Key2が決まればKey3が決まる→5NF
- Key2, Key3だけの集合を作り、一方をPK、もう一方をAKにする→BCNF
- 4NF, 5NFの理解には必須。
- 最近はORマッパーの都合でサロゲートキーが濫用されている。SQLアンチパターン「とりあえずID」を参照のこと。
- Event: 定期的に繰り返されるコト。When(これが一番大事), How much/How manyで表されるコト。
時間割を例にした5NF化
クラス(学級)の時間割表なら、x軸に曜日・y軸に時限。
— 腹周りたぷたぷ (@hanahiro_aze) August 18, 2018
属性として、学級(年度、学期、学年、組番号<これらがAK)、時間割セル(曜日×時限)、学科、担当する教師、授業を実施する教室があるはず。
#chugokudb
ここに制限がかかってくる
— 腹周りたぷたぷ (@hanahiro_aze) August 18, 2018
- 学級によって学科が制限される(文系・理系など)
- 学科ごとに教えられる教師が制限される
- 学科ごとに教室が制限される(音楽室、理科室など)
- 曜日によって開始時間が変わる
- 曜日によって教師の出勤状況が制限される
#chugokudb
(学科)--(担当教科)--(教師)
— 腹周りたぷたぷ (@hanahiro_aze) August 18, 2018
(学科)--(履修科目)--(学級)
(学科)--(使用教室)--(教室)
(学級)--(授業)--(時間割セル)
(時間割セル)--(執務約束)--(教師)
#chugokudb
それぞれのエンティティの中間に作ったエンティティで時間割を構成するようにすれば…
— 腹周りたぷたぷ (@hanahiro_aze) August 18, 2018
鳥肌が立っております!!!!
#chugokudb
BCNF以降の正規化は本を読んでも具体的な例が少なくて、今までちゃんと理解できてなかった。 というより、理解する努力を怠っていたと言うべきか。反省。
LT
- SR(Streaming Replication)+FDW(Foreign Data Wrapper)による集計バッチ
- 集計の計算をマスタから分離したところでやってもらうことで、負荷をかけずに集計処理をするはなし。
- MySQL関連のパラメータ(主にInnoDB)について - hiroi10の日記
メルカリのDB分割の話
- 巨大テーブルからカラムを別テーブルとして切り出す垂直分割
- CIで落ちたところが変更後に影響を受けるところだ。というあたりの付け方。
- テストがしっかりあるからこそできる。
次回開催時には何か発表できるようになりたいなぁ。
Lean Architecture / DCI Evening参加メモ
スーパーエンジニア Richardさん来日 meetup参加記録
@imunew さんのお誘いで、スーパーエンジニア Richardさん来日 meetupに参加してきた。imunewさんの参加記録は↓。
11時から8時間近くの長丁場でしたが、全く時間を感じないほどでした。 主催してくださった@koriym さん、@ksetaさん、会場を提供してくださったサイボウズスタートアップスさん、 そして何より、@mackstarさんありがとうございました!!
以下個人的なハイライト
@mackstarによるおはなし
技術以外のこと
- デザイナーを最初から入れてきちんとブランディングしている。(http://www.bbc.co.uk/iplayer)
- オフィス中にsystem healthが表示されている
- コミュニケーション大事
技術的な話
- HEADLESS CMS
- PHPで使われてるフレームワークはSymfony/Laravelがほとんど
- MessageDriven
- ドメインに適合する方式だった。
- RESTで作ってるけど、様々なサービスから同じAPIがコールされるので効率が悪い
- キャッシュも統一されていない
- 並列実行はelixer/Erlangの言語に組み込まれているから便利
- オフラインモードのためにキャッシュストア、セッションストア、オフラインストア
- GraphQL
- 古いモバイル端末にも対応
- スキーマ設計が難しい
- messge : 何があったか/何をしたいか
- CQRS
- EventSourcing
- イベントを全て記録しておけば、ある日のある時点の再現が可能
- circui-breaker pattern
- サービスごとに時期によってautoscalingするby queue inspection
- 人が少ない時に情報を取っておいて、ローカルストアに入れておく
- ドメインに適合する方式だった。
郡山さんのおはなし
ハイパーメディアアフォーダンス
Hypermedia Affordance // Speaker Deck
- 使う側と物の間に意味を与える
- JSONにリンクでアフォーダンスをつけたのがハイパーメディア(HAL)
- htmlはformタグでわかる
- Location header
- asyncでも使える
- べき等性:支払いにはべき等性があるのでput
- 2回送るなではなく、2回受け付けるな
- 自己記述的
- トップ(ルート)にアクセスすれば、どこのリソースにアクセスできるかわかる。全てのリソースはトップからアクセスできる
- discoverable
- ドキュメントを用意しなくても出来上がっている
- 機能を実現するコード・構造を実現するコード
- REST!= CRUD over HTTP
- information + (affordance)
- /menu /order
- 自分のアフォーダンスをネットワーク網に取り付けること
- 長期的な関心は慎重に
- どうでもよいことは流行に従い、 重大なことは道徳に従い、 芸術のことは自分に従う。(小津安二郎)
リチャードさんへの質問
- pair programmingが普通
- ペアプロしてない=idea/codeを分かち合っていないサイン。
- pair programmingをしていないことが問題なのではなく、コミュニケーションをとっていないのが問題
- あるいは難しいことをしていない
- コミュニケーションを取らないことが、自分の成長できるチャンスを捨てている
- 他の人が考えていないことまで考えられる人が評価される
- 特にマイクロサービスを運用していく上では、ヘルスチェックを細かく監視する必要。
- ビジネスがうまく行っていることを他の人に見せる必要。
- テストピラミッド
- 2-3時間あれば理解できるコード
- 満足しないことがスキルアップに大切。
- death by strangulation
- レガシーとの戦い
- wrapperで小さく始める
- 順次使い始める
- creativity/idea oriented が日本では少ないと感じる
- workerかlaborかみたいな話。
勉強会の合間に、gemを公開できたので、LTもしてきました。 今日発表した内容はまとめ直してアップしますが、元ネタだけおいておきます。
久しぶり(転職以来初)の勉強会参加で、良いインプットになった。 今年もあと4ヶ月ほどしかない。もっと成長するために動かなければ。