銀行員からのRailsエンジニア

銀行員からのRailsエンジニア

銀行員から転身したサービス作りが大好きなRailsエンジニアのブログです。個人で開発したサービスをいくつか運営しており、今も新しいサービスを開発しています。転職して日々感じていること、個人開発サービス運営のことなどを等身大で書いていきます。

当ブログではアフィリエイト広告を利用しています

DIVE INTO CODEのDEMODAY(オリジナルwebサービスを発表するイベント)5thを見に行ってきました!

今年の4月に登壇者として参加したDEMODAYに、今回は見る側として参加してきました。

前回は登壇者目線でブログを書いたので、今回は観戦者目線で思ったことや、発表されたサービスについて書きました。

DIVE INTO CODEのDEMODAYってどんなイベント?という方や、DIVE INTO CODEに通った方は実際にどんなwebアプリケーションを作れるようになったの?という方の参考になれば嬉しいです。

f:id:ysk_pro:20181007192052j:plain

こちらはサービスプレゼン中の写真です。

熱気がすごい!

1. DEMODAYとは?

DEMODAYとは、僕が通っていたプログラミングスクール「DIVE INTO CODE」が主催する、スクール受講生が起業家、CTO、一般の方々の前で自分の作ったwebサービスをプレゼンし、その場で実際に使ってもらうイベントです。

第5回となる今回は、80名の方が来場し、渋谷ヒカリエのレバテックのおしゃれなオフィスで開催されました。

diveintocode.doorkeeper.jp

(こちら公式のイベント概要ページです)

 

2. 発表していただいた5つのサービスの紹介

僭越ながら、発表いただいたサービス5つ全てを紹介させていただきます。

2-1. Asuraku

https://asuraku.herokuapp.com/

f:id:ysk_pro:20181007194802p:plain

オンラインで運動の基礎が学べるサービスで、「筋トレ版Progate」と紹介していました。

f:id:ysk_pro:20181007195456p:plain

このように教材もしっかり作り込まれており、コンテンツが充実したら是非使ってみたいな、と思えるサービスでした。

このサービスのキモはコンテンツの質だと思ったので、どのように質を担保するのかを質問したところ、実際にトレーナーの方が作ることによって質を担保しているとのことでした。

〇〇版Progateのようなオンライン教材は、とても素晴らしい着眼点だと思いました。

 

2-2. KDN家電を買い叩け

https://buy-a-receipt.herokuapp.com/

f:id:ysk_pro:20181007194817p:plain

家電を買い叩くのが苦手な方のために、他の人が実際に買い物したレシートを共有して、それを使って家電を買い叩こうというサービスです。

JavaScriptを使って、画像アップロード時に隠したい情報を黒塗りすることができるなど、難しい技術も使って実装しており、会場からは技術的な質問も多かったです。

技術的にもう一歩踏み込んで文字認識機能があったら、とっても便利なサービスになりそうだな、と思いました。

 

2-3. Beaper

https://stormy-everglades-19869.herokuapp.com/

f:id:ysk_pro:20181007194834p:plain

助けを必要としている人と助けたい人を繋げるマッチングサービスです。

自身が怪我をしていた時の体験談からプレゼンが始まり、とても引き込まれました。

原体験から生み出されたサービスいいですよね。

高齢者がビーコン端末を押すと、近くのユーザーにLINE通知される、というシステムを実装していました。

イデアも素晴らしく、それを実際に形にされていて本当にすごいと思いました。

ビーコン端末の値段と高齢者にどのように普及させるかを質問したところ、端末は2,000円程度で、ボランティア団体を巻き込んで普及させていきたいとのことでした。

是非普及させて優しい世界を作っていって欲しいです。

こちらのサービスが審査員賞1つ最優秀賞を受賞しました。

 

2-4. にほんごきょうしのほしいもの。

https://nihongokyooshinohoshiimono.herokuapp.com/

f:id:ysk_pro:20181007194848p:plain

日本語教師教材用のリアルな日本語を集められたり日本語教育について相談できるサービスです。

作られた方が外国の方に日本語を教えている方で、自分が欲しいものを形にされていてすごいです。

既存で使いやすいサービスが無いという課題を当事者として持っており、実際に普及しそうだと思いました。

フォントも可愛くて素敵です。

こちらのサービスが審査員賞を2つ受賞しました。

 

2-5. ICHIOSHI

https://murmuring-gorge-36052.herokuapp.com/

f:id:ysk_pro:20181007194901p:plain

買って良かったものを投稿する実名制のレビューサイトです。

本当に良いものを人からのおすすめで見つけるというコンセプトに共感しました。

商品検索機能はあえて付けずに、商品との偶然の出会いも大切にしているという考え方も面白かったです。

f:id:ysk_pro:20181007201727p:plain

実際に使われているサービス顔負けのUIですよね。すごいです。

こちらのサービスが審査員賞を1つ受賞しました。

 

3. 観戦者として参加して思ったこと

サービス開発へのモチベーションアップ

自分の作ったサービスの素晴らしさ、世界観を真剣にプレゼンしている姿を見て、めちゃくちゃサービスが開発したくなりました

多分みんなそう感じてると思います。 

 

すごくいい機会・いいイベントだと思った

前回登壇した時も思いましたが、改めていいイベントだな、と思いました。

自分が作ったサービスを80人の前でプレゼンする機会なんてなかなか無いですよね。 

半年毎に開催されているので次回はおそらく来年の4月なのですが、次回是非また参加したいです、、!

 

4. おわりに

とってもいい成長機会になるので、DIVE INTO CODE受講生、卒業生の方は是非、チャレンジしてみてください!!

参考として、前回僕が登壇した時の記事はこちらです。

ysk-pro.hatenablog.com

DIVE INTO CODEを卒業した時に書いた記事がこちらなので、ご興味ある方はご覧ください。

ysk-pro.hatenablog.com

サービス開発楽しみましょう!!

 

 

 

エンジニアとして最近買ってよかったもの5選【2018年10月版】

個人的にこういうライフハックを読むのが好きで、いつか自分もやってみたいと思っていたので、ゆるく書いてみました!(短いのですぐ読めます)
エンジニアになって最近買ったものを5つ紹介しています。

f:id:ysk_pro:20181020082322p:plain

1. Amazon Echo Plus + Hueランプ(電球)

f:id:ysk_pro:20180930170431j:plain

ベッドの中からの「アレクサ、おやすみ」→ 消灯・就寝

というのは、小さなことですが一度経験してしまうと戻れなくなるくらい快適です。

音楽やニュースを聞くのにも使っており、手軽でいい感じです。

アレクサのスキルも開発できるらしいので、エンジニアとしていつかやってみたい、、!

 

2. ドラム式洗濯乾燥機

f:id:ysk_pro:20180930170519j:plain

これを買うまでは、洗濯物を干すこと天気予報を見ていつ干すか考えること急な雨で干してるものを心配することがストレスでしたが、買ってからはその全てから解放されました。

家を出る前にボタンを1つ押しておくだけで、帰ったら洗濯物がふわふわに仕上がっています。最高です。

時短は正義。

 

3. アーロンチェア(いい椅子)

f:id:ysk_pro:20180930173341j:plain

エンジニアはデスクワークなので、腰痛を未然に防ぐためにいい椅子は必須だと思っています。

新宿の大塚家具で色々な椅子の座り比べをしたのですが、アーロンチェアが圧倒的でした(値段も圧倒的でしたが...)。

背中の部分が位置にによって張りの強さを変えていることによって座りごごちが抜群で、前傾にもできてタイピングが楽で、12年保証が付いており品質も安心です。

座面がメッシュなのもお尻が蒸れなくて嬉しい、、!

【楽天】アーロンチェア リマスタード Bサイズ ポスチャーフィットSLグラファイト ハーマンミラー 送料無料

 

4. 電動昇降デスク

f:id:ysk_pro:20180930173401j:plain

全体像はアーロンチェアの項目の写真をご覧ください。

こちらの写真は高さを変えるボタンです。

職場が電動昇降デスクなのですが、立って仕事するのめっちゃいいです。

特に眠い時!笑

眠くない時もたまに立つことでメリハリがつき、運動不足解消にもなって気に入ったので家でも買っちゃいました 笑

電動なので高さを変えるのも楽々です。

【楽天】電動昇降デスク 送料無料 スタンディングデスク 幅120

 

5. 分離キーボード + Magic Trackpad

f:id:ysk_pro:20180930173731j:plain

こちらは僕の会社での開発環境です!

普通のキーボードをタイピングする姿勢って窮屈じゃないですか?

(手を中央に寄せるって結構不自然だと思う...)

分離式キーボードなら自然に両手を机に置いた姿勢でタイピングできて楽だなー、と思って買いました。

実際にすごく楽で、正しいタイピングも身につきました 笑

分離キーボードにはAppleのMagick Trackpadが相性抜群で、写真のようにキーボードの間に置いて使っています。 

Apple Magic Trackpad 2 MJ2R2J/A

Apple Magic Trackpad 2 MJ2R2J/A

 

 

おわりに

それなりに高いものってやっぱり価値ありますよねー。

ここに買いたものは買ってよかったし、もっと早く買っておけば良かった、、と思うものばかりです。

もっと生活を楽に・良くしたいので、是非みなさんの「買ってよかったものリスト」教えてください〜!

Enjoy Shopping!!

【徳丸本勉強メモ】クッキー出力にまつわる脆弱性

はじめに

最近、会社で徳丸本(体系的に学ぶ 安全なWebアプリケーションの作り方 第2版)の勉強会が始まりました。

毎週持ち回りで発表していく形式で、僕の発表するパート(クッキー出力にまつわる脆弱性)についてまとめたので、ブログにも載せようと思います。

会社での勉強会の雰囲気などはこちらの記事をご覧ください。

www.wantedly.com

ちなみに、徳丸本というのはWebアプリケーションのセキュリティに関するめちゃくちゃ有名な本です。 

f:id:ysk_pro:20180924094455j:plain

サマリー

- Webアプリケーションではクッキーによるセッション管理が広く使われている

- クッキーにまつわる脆弱性

  ① クッキーを利用すべきでない目的でクッキーを使っている
  【対策】クッキーはセッションIDの保管場所として利用すべきで、それ以外のデータをクッキーに保存しない方が良い

  ② クッキーの出力時に脆弱性が発生する(クッキーのセキュア属性不備)
  【対策】HTTPS通信を用いるアプリケーションのクッキーにはセキュア属性を指定する

 

クッキーの不適切な利用について

Webアプリケーションで、ページをまたがる情報を保存する方法としては、セッション管理機構が用いられる。

一般的にセッション管理機構は、セッションIDのみをクッキーに保存して、データ自体はWebサーバーのメモリやファイル、データベースなどに保存している。

クッキーはアプリケーション利用者によって書き換えができるため、クッキーに保存すべきでないデータをクッキーに保存すると、脆弱性が発生する場合がある。

 

クッキーに保存すべきでない情報とは?

ユーザIDや権限情報

これらは書き換えられると困る情報である。

これらの情報をクッキーに保存していると、権限外の操作や情報閲覧ができてしまう場合がある。

クッキーに保存すべきでない情報以外であっても、一般的にクッキーにデータを保存しない方が良い

 

クッキーよりセッション変数を使うべき理由

セッション変数の方が便利で安全に使用できるため、通常はセッション変数を利用すべきである。

ただし、クッキーで実現できてセッション変数で実現できないのは、情報の寿命の制御と、異なるサーバーとの情報共有のみであり、これらが必要な場合はクッキーを利用する。

異なるサーバーでの情報共有のクッキーの使用例としては、ログイン画面の「ログイン画面を保持する」という機能がある。この機能はクッキーによりログイン状態が保持される。この時、クッキーに保存される情報はトークンという乱数で、IDやパスワードをクッキーに保存するわけではない。

クッキーにデータを保存する方法とセッション変数を使う方法の比較は下表の通り。

f:id:ysk_pro:20180924090256p:plain

(徳丸本 p.255 より抜粋)
 

クッキーのセキュア属性不備による脆弱性

クッキーにはSecureという属性があり、これを指定したクッキーはHTTPSの場合のみブラウザからサーバーに送信される

クッキーにはセッションIDなどセキュリティ上重要な情報が格納されている場合が多いので、クッキーが盗聴されると成りすましの被害に直結する

クッキーのセキュア属性不備への対策は、クッキーのセキュア属性を設定することである。

 

脆弱性が生まれる原因(クッキーにセキュア属性をつけない原因)

  • 開発者がセキュア属性について知らないケース
  • セキュア属性をつけるとアプリケーションが動かなくなるケース
  • HTTPとHTTPSが混在するWebアプリケーションの場合、セッションIDを保持するクッキーにセキュア属性を設定することは困難である。セッションIDのクッキーにセキュア属性をつけると、HTTPのページではセッションIDのクッキーが受け取れないため、セッション管理機構が使えなくなってしまう。サイト全体をHTTPSにするのが難しい場合、トークンを用いて対策する方法もある。
 

覚えておくべきこと

  • クッキーはセッションIDの保管場所として利用すべきで、それ以外のデータをクッキーに保存しない方が良い
  • HTTPS通信を用いるアプリケーションのクッキーにはセキュア属性を指定する

 

おわりに

この本は一度通して読んでいるのですが、勉強会で自分が発表するために読み直してまとめると、より理解が深まりました

会社で勉強会を行なっているように、実務ではセキュリティの知識は必須なので、セキュリティに関して自信が無いという方は是非こちら読んでみることをおすすめしますー! 

 

 

【元銀行員の僕が教える】銀行のちょっと面白くて、役に立つこと 〜信用創造・ペイオフ編〜

こんにちは。ゆうすけです。

いきなりですが、実は僕、今はエンジニアをしていますが、新卒から4年間は銀行で中小企業から上場企業までを相手に、融資の提案などをしていました。

f:id:ysk_pro:20180915104907j:plain

1. この記事を書いたきっかけ

僕が今勤めている会社では、毎週金曜に、参加自由・発表自由・テーマ自由のゆるーいLT会があります。

みんな色んなテーマのことをLTしてて面白い、、!

 

そこで銀行に勤めていた経験から、「銀行について知ってたら面白いこと、役に立つこと」というテーマでLTしてみたら、みんなが興味示してくれたので、ブログにもしちゃおうかな〜と思いました。

シリーズ化も考えてますーー。

 

2つのことについて書いていきます。

 

2. 信用創造

f:id:ysk_pro:20180915090759p:plain

1つ目は信用創造についてです。

これは社会に対して銀行が担っている、重要な役割の中の1つです。

信用創造を一言で言えば、銀行がお金を貸せば貸すほど、世の中にお金が増えていく仕組み、となります。

ちょっと意味がわかりませんよね(笑)

次の図で解説しています。

f:id:ysk_pro:20180915090820p:plain

<図中の取引の説明>

① 銀行が100万円持っています

② 銀行はその100万円を会社Aに融資します

③ 会社Aはその100万円全額をすぐに使う予定はないので、90万円を銀行に預金します

④ 銀行はその90万円を会社Bに融資します

⑤ 会社Bも会社Aと同様に、全額をすぐに使う予定はないので、80万円を銀行に預金します

 

すると、、、会社A・会社B・銀行が使うことができるお金の合計は270万円(図中の赤字部分)になっています、、、!

銀行がお金を貸しただけで世の中のお金が増えましたよね。

ざっくりとですがこれが信用創造で、銀行が社会に果たしている重要な役割の1つなのです。

 

3. ペイオフ

f:id:ysk_pro:20180915090847p:plain

2つ目は知っておくと役立つことです。

最近、マイナス金利などで銀行の経営が危ないっていうニュース多いですよね〜。

銀行がもし、もし潰れてしまったら、預けている預金はどうなるんでしょうか、、、?

ちょっと心配ではないですか? 

 

f:id:ysk_pro:20180915090856p:plain

実は、銀行が潰れても、1人1銀行につき、元本1,000万円とその利息については、預金保険制度(ペイオフ)によって補償されます

なので、預金が1,000万円以上ある方は、銀行を分けて預金しておくとベターです。

 

 

ちなみに、信用創造の2枚目の図と、ペイオフの2枚目の図は、僕が夜な夜な資料を作っていたら、センスの無さに見かねて妻が綺麗にしてくれました。

めちゃ見やすい、、、すごい。

 

4. おわりに

いかがだったでしょうか?

当たり前のことばかりですか??

僕は信用創造を初めて知った時は、おおー、面白い、銀行すごいな〜と思いました。

 

そんな僕が銀行を辞めた理由・ITエンジニアになった理由についてはこちらのnoteに詳細を書き、多くの反響をいただいておりますので、もしよろしければ合わせて読んでみてください!

note.mu

また、最近何かと話題になる「個人型確定拠出年金iDeCo / イデコ)」について図を使って分かりやすくまとめたのでこちらの記事も是非合わせてご覧ください。

ysk-pro.hatenablog.com

お読みいただきありがとうございました。

【技術書メモ】現場で使えるMySQL 〜毎週アウトプットチャレンジ⑧〜

毎週 1冊技術書を読んでブログでアウトプットするチャレンジの第8弾ですー!

今回は、現場で使えるMySQL を読んでまとめました。

MySQL現場で使うための知識を、分かりやすく解説している技術書です。

現場で使える MySQL (DB Magazine SELECTION)

現場で使える MySQL (DB Magazine SELECTION)

 

f:id:ysk_pro:20180908194233j:plain

Chapter1 MySQLの概要と環境構築

  • データベース領域:インスタンスと1対1に対応した、データベースの物理領域。1つのデータベース領域の中に複数のデータベースが格納される
  • 権限データベース:mysqlという名前のデータベース。インスタンスへ接続するためのユーザー情報や、各データベース、テーブルにアクセスするための権限情報が複数のテーブル内に格納されている
  • 初期パラメータファイル:インスタンスの使用メモリやサイズやファイル配置などを決めるためのファイル
  • MySQLユーザー:MySQLインスタンスに接続するためのDBアカウント
 

Chapter2 データ型とSQL

  • データや値の範囲チェックはアプリケーション側の責任であるという考え方に基づいて実装されている。例えば、どのデータ型でも、範囲を超えた値を格納しようとしてもエラーにはならず、削られたり最大値や0に変換されたりするので注意が必要
  • 文字列型で最大長を超える文字を格納しようとした場合、オーバーした部分は削られた上で正常終了する
  • ソートや文字列比較において、デフォルトでは半角英字の大文字/小文字を区別しない
  • 数値型のNUMERIC型は、NUMERIC(p,n)という形で定義され、pは全体の有効桁数、nは小数点以下の有効桁数を意味する。p,nどちらも指定しなかった場合、NUMERIC(10,0)となる
  • 日付/時刻型としては、YEAR/DATE/TIME/DATETIME/TIMESTAMPの5種類がある
  • 列挙型とは、あらかじめ復すの文字列値を定義しておいて、その中からしか選択できないようにするためのデータ型で、ENUMとSETの2種類がある。ENUM型は定義値の中から1つのみ選択できて、SET型は複数選択できる
 

Chapter3 テーブル定義

  • 主なストレージエンジンとその特徴
  • 整合性制約
    • 主キー制約:制約対象列にNULL値を入れないことと、値が重複しないことを保証する。これにより、制約対象列の値からテーブル内の行を一意に識別できる
    • 一意キー制約:制約対象列の値が重複しないことを保証する。NULL値は格納でき、NULL値同士は異なる値であると見なされる
    • 参照整合性制約(外部キー制約):子テーブルの制約対象列の値が、親テーブルの参照キーに含まれていることを保証するもので、子テーブルに定義する。利用するためには、親テーブル、子テーブルともInnoDBである必要がある
  • シーケンス:連続的な整数値を生成するオブジェクト。シーケンスから得られる数値のことをシーケンス番号、連番などと呼ぶ。一般的に、同一のシーケンスから得られるシーケンス番号は重複しないため、テーブルの主キーや一意キーとして使用されることが多い
 

Chapter4 トランザクション

  • 自動コミット機能:この機能を有効にするか無効にするかによって、トランザクションの開始/終了の方法が変化する
    • 有効にした場合:トランザクションは単一のSQL文を実行した時点で自動的に、または、START TRANSACTION文によって明示的に開始する。START TRANSACTION文を実行していない場合は、単一のSQL文が実行された時点で自動的にコミットし、ロールバックできない。一方、START TRANSACTION文を実行している場合は、単一のSQL文が終了しただけではコミットせず、COMMIT文を実行した時点ではじめてコミットする。また、ROLLBACK文を実行するとロールバックする
    • 無効にした場合:トランザクションは、SQL文の実行によって暗黙的に、またはSTART TRANSACTION文で明示的に開始する。いずれの場合も自動的にコミットしない。COMMIT文を実行した時点でコミットし、ROLLBACK文を実行した時点でロールバックする
  • デフォルトでは自動コミット機能が有効となっている
  • ロックとは、複数のトランザクション間での排他制御を実現するための仕組み。InnoDBでは、テーブルの行(レコード)単位でロックをかけられる。
  • フルスキャンはすべての行にロックがかかってしまうため、インデックス検索させるべきところにはきちんとインデックスを作成すべき
  • デッドロックは即座に検出される
 

Chapter6 日本語処理

  • クライアントとサーバーの文字コードをすべてutf8に統一できる環境ならば問題はないが、そうでなければ様々な注意事項が存在する
 

Chapter8 アーキテクチャ/ファイル構成

  • インスタンスMySQLサーバー側で動作するプロセス/スレッド群と、それらが使用するメモリの総称
  • MySQLは、複数のクライアント側プロセスと1つのサーバー側プロセス「mysqld」で構成される。多くのRDBMSがマルチプロセスで動作するのとは対照的に、MySQLのサーバー側はマルチスレッドで動作する
  • プロセスとは、UNIXコマンドで言えばcatやlsといった個々のプログラムの実行単位である。OS上の各プロセスには、それぞれの固有のメモリ空間が割り当てられる。一方スレッドとは、簡単に言えば1つのプロセス内で並行処理を行うためのものである。スレッドはプロセスの内部で生成され、プロセスのメモリ空間を共有する
  • ストレージエンジンはアプリケーション側から隠蔽されている。アプリケーション側から発行するSQL文は、インスタンス側で動作するパーサーと呼ばれるプログラムによって解析され、どのインデックスを使用するか、といった実行計画が作成された上で、はじめて対象のストレージエンジンに処理が渡る。アプリケーションから見ると、ストレージエンジンが変わったとしても、発行するSQLが変わるわけではない
 

Chapter9 ユーザ管理/セキュリティ

  • MySQLにアクセスするにはまず認証を行う。認証とは、アクセス元が本人に間違いないことを確認することで、ユーザ名・アクセス元のホスト名/IPアドレス・パスワードの3つで認証する
  • OSユーザーとは別にMySQLユーザーという概念があり、MySQLインスタンスにアクセスする際に使用する。管理者ユーザーという特別なユーザーもあり、デフォルトではrootという名前になっている。MySQLユーザーは認証や権限管理のために存在する
  • 権限は、グローバル(全体)、データベース、テーブル、列の4種類ごとに設定する
  • 発行されたすべてのSQL文をファイルに記録する機能があるため、監査機能として使うことができる
 

Chapter10 バックアップ/リカバリ(前編)

  • バックアップ方法
    • コールドバックアップ:インスタンスを停止した状態で全体バックアップを取得する方法。したがって、バックアップの最中はインスタンスに対して一切アクセスできない。tarやcpなどのOSコマンドで取得する。
    • オンラインバックアップ:インスタンスを起動した状態でバックアップを取得する方法。
  • バックアップ/リカバリの基本的な流れは、バックアップ→メディア障害発生→リストア→リカバリである。
    • メディア障害とは、ディスクの故障やオペレーションミスなどにより、MySQLの実データが失われる障害のこと
    • リストアとはバックアップの時点まで復旧すること
    • リカバリは障害直前の時点まで復旧すること
 

Chapter11 バックアップ/リカバリ(後編)

  • MySQLのオンラインバックアップでの定番は「mysqldump」。データベース領域全体でも、テーブルやデータベース単位でもバックアップでき、バックアップデータはテキスト形式で、SQL文がそのまま記述される。MySQLインスタンスに接続→バックアップ対象のすべてのテーブルに対しSELECT文を実行し、テキスト形式で出力→すべてのバックアップが終了したら接続を終了、という流れで動作する
 

Chapter12 レプリケーション

  • レプリケーションとは、テーブルなどの各種オブジェクトの複製を他のサーバー上に生成するという技術。レプリケーションによって、負荷分散と可用性の向上を実現できる
  • 1台のマスターに対して更新を行うと、複数のスレーブにも同じ更新結果が反映される。検索は基本的にスレーブに対して行えばよいので、検索の負荷分散になる
  • レプリケーションは、スレーブにバックアップ機としての役割を持たせることによって、バックアップ/リカバリの手段としても利用できる
  • マスターに障害が発生した場合は、スレーブをマスターに昇格させてサービスを継続することで、サービス停止時間を短くすることができる
 

Chapter13 パフォーマンスチューニング(前編)

  • RDBMSのチューニングは単体チューニングとシステムチューニングの2つに大別できる
  • 単体チューニングとは、個々のSQL文の実行性能を改善する作業のことで、具体的にはインデックスの作成やSQL文の修正、アプリケーションロジックの見直しによるSQL発行回数を減らすことが含まれる
  • システムチューニングとは、システム全体の観点から、MySQLの初期化パラメータやOSのカーネルパラメータの設定を行うことが含まれる
  • 単体チューニングでは下記2つの手段を組み合わせる
    • スロークエリログから、実行時間の長いSQLや非効率なフルスキャンを行なっているSQL文の特定
    • 上記SQL文の実行計画をEXPLAIN文で確認し、必要に応じた改善
 

Chapter14 パフォーマンスチューニング(後編)

  • 基本的にデータ型は使用バイト数が少ないデータ型を選ぶことを心がけると良い。そうでないと、ファイルサイズが大きくなるだけでなく、多くのI/Oが発生するため性能面でも悪影響がある
  • SELECT/UPDATE/DELETE文のWHERE句で指定する列に対しては、インデックスを定義することでフルスキャンを防ぐのが一般的である。ただし、インデックスを作ると更新時にオーバーヘッドがかかることに注意する
  • バルクINSERT文とは、1つのSQL文で複数のレコードをまとめてINSERTする構文であり、通常のINSERT文を繰り返すのに比べ、大きな性能向上が図れる
  • テーブルのレコードデータをすべて削除する場合は、「DELETE FROM テーブル名;」よりも、「TRUNCATE TABLE テーブル名;」の方がはるかに高速
 

おわりに

ここまで読んでいただきありがとうございます。

MySQL、とても奥が深いですね、、、!
現場でMySQLを使っている方には特に本書オススメですー!
現場で使える MySQL (DB Magazine SELECTION)

現場で使える MySQL (DB Magazine SELECTION)

 

次もMySQLに関する技術書を読む予定です。

来週も頑張ります!

【技術書メモ】SQL 第2版 ゼロからはじめるデータベース操作 〜毎週アウトプットチャレンジ⑦〜

毎週 1冊技術書を読んでブログでアウトプットするチャレンジの第7弾ですー!

今回は、SQL 第2版 ゼロからはじめるデータベース操作 を読みました。

データベース・SQLについて、とても分かりやすく書かれた入門書です。 

SQL 第2版 ゼロからはじめるデータベース操作

SQL 第2版 ゼロからはじめるデータベース操作

 

f:id:ysk_pro:20180902101951j:plain

第1章 データベースとSQL

  • SQLは、RDBMSに与える命令の種類により、次の3つに分類される
    • DDL(Data Definition Language):データベースやテーブルを作成、削除などをする。(CREATE、DROPなど)
    • DML(Data Manipulation Language):テーブルの行を検索、変更などをする。(SELECT、INSERTなど)
    • DCL(Data Control Language):データベースに対して行った変更を確定、取消などをする。(COMMIT、ROLLBACKなど)
  • データ型
    • CHAR型:文字列を入れる型。CHAR(10)のように、入れることの出来る最長の長さを()で指定する。CHAR型は、固定長文字列という形式でデータが格納され、文字列の長さが最大長に満たない場合は、満たない分を文字の後に半角スペースを入れて埋める。
    • VARCHAR型:CHAR型と同じく文字列を入れる型。違いは、VARCHAR型は可変長文字列という形式で、文字数が最大長に満たない場合も半角スペースで埋めない点。
 

第2章 検索の基本

  • SELECTを使った検索で結果から重複を省く場合は、SELECTの後に「DISTINCT」をつける。DISTINCTを使った場合、NULLも1種類のデータとして扱われ、複数の行にNULLがある場合は、1つにまとめられる。
  • NULLを含んだ計算の結果は、問答無用でNULLになる。NULLを0で割る場合もエラーとならずNULLとなる。
 

第3章 集約と並び替え

  • COUNT関数は基本的にNULLを除外するが、COUNT(*)とすればNULLを含めた全行を数えることができる。
  • COUNT(*)以外の集約関数はNULLを除外して算出する。(0としても扱わない)
  • WHERE句には行に対する条件を書き、HAVING句にはグループに対する条件を書く。どちらにも書くことが出来る条件をWHERE句に書くべき理由は、可読性と実行速度。
  • ORDER BYでのソートキーにNULLが含まれる場合は、先頭か末尾にまとめられる。
  • ORDER BY句はSELECT句よりも実行されるのが後なので、SELECT句でつけた別名を使用できる。
 

第4章 データの更新

  • テーブルからデータを削除する方法として、DELETE文だけでなく、「TRUNCATE」というコマンドがある。TRUNCATEは必ずテーブルを全行削除し、DELETEよりも処理が高速という特徴がある。
  • DBMSトランザクションは、ACID特性と呼ばれる4つの特性がある。
    • 原子性(Atomicity):トランザクションが終わったとき、そこに含まれていた更新処理は、全て実行される or 全て実行されない状態で終わることを保証すること。
    • 一貫性(Consistency):トランザクションに含まれる処理は、データベースにあらかじめ設定された制約を満たすこと。
    • 独立性(Isolation):トランザクション同士が互いに干渉を受けないことを保証すること。トランザクション同士は入れ子になることはない。
    • 永続性(Durability):トランザクションが終了したら、その時点でのデータの状態が保存されることを保証すること。
 

第5章 複雑な問い合わせ

  • ビューとは、テーブルと同じように扱われる。違いは、テーブルの中には実際のデータが保存され、ビューの中にはSELECT文が保存されていること。
  • ビューのメリット
    • データを保存しないため、記憶装置の容量を節約できること。
    • 頻繁に使うSELECT文を、ビューとして保存することで、使い回せること。
  • サブクエリとは使い捨てのビューであり、SELECT文の実行終了後に消去される。
  • スカラ・サブクエリとは、戻り値が単一の値になるサブクエリであり、WHERE句などで使われる。
 

第6章 関数、述語、CASE式

  • 関数
    • ||:文字列連結
    • REPLACE:文字列中のある一部分を、別の文字列に置き換える
    • CURRENT_TIMESTAMP:現在の日時(CURRENT_DATE + CURRENT_TIME)
    • EXTRACT:日付データからその一部分(年や月)を、数値型として切り出す
    • CAST:型変換を行う
    • COALESCE:可変数の引数を取り、最初にNULLでない値を返す。NULLを別の値に変えて扱いたい場合などに使われる。
  • 述語:戻り値が真理値になる関数
    • IS NULL:ある列がNULLの行を選択する場合に、=は使うことができず、IS NULLを使う必要がある。反対にNULL以外の行を選択する場合は、IS NOT NULLを使う。
    • IN:ORの便利な省略形。反対はNOT IN。INは引数にサブクエリを指定する使い方もされる。
    • EXISTS:ある条件に合致するレコードの存在有無を調べる。INによってほぼ代用できる。
  • CASE式:場合分けを記述する時に使用する。ELSE NULLは省略可能であるが、可読性の観点から省略しない方がよい。
 

第7章 集合演算

  • 集合演算子は重複行を排除する。ALLを追加すれば重複行は排除されない。
  • UNION:レコードの足し算を行う。
  • INTERSECT:2つのレコードの共通部分を選択する。
  • EXCEPT:レコードの引き算を行う。
  • 結合(JOIN)は、別のテーブルから列を持ってきて、列を増やす集合演算。UNIONがテーブル同士を行方向(縦方向)に連結するのに対し、結合は列方向(横方向)に連結する。
  • 内部結合(INNER JOIN)は2つのテーブルの両方に存在する情報だけを選択するのに対して、外部結合(OUTER JOIN)はどちらか一方のテーブル(LEFT or RIGHTで指定する)に存在しているならば、そのテーブル情報が欠けることなく出力される。
 

第8章 SQLで高度な処理を行う

  • ウィンドウ関数は、ランキング、連番生成など通常の集約関数ではできない高度な操作を行う
  • GROUPING演算子は、GROUP BY句と集約関数ではできなかった小計・合計を同時に求めることができる

 

おわりに

ここまで読んでいただきありがとうございます。

Railsから入ったりすると、DB・SQLの学習は後回しになりがちですが、大規模なDBを扱う実務ではDBの知識はめちゃくちゃ重要です。

本書は基本的なところから書かれているので、とても分かりやすくスッと読むことができ他ので、DB・SQLに自信がない方にもオススメです!

SQL 第2版 ゼロからはじめるデータベース操作

SQL 第2版 ゼロからはじめるデータベース操作

 

 次はDBについてのもう少し高度な本を読む予定です。

来週も頑張ります!

 

Railsでお買い物メモ & Amazon・楽天のランキング1位を返してくれるLINE bot作りました

みなさん、「あれ買わなきゃ!」って思った時どうしていますか?

(例:家のトイレで「あ、トイレットペーパーラスト1つやんけ、買わなきゃ」の時)

f:id:ysk_pro:20180826173319j:plain

僕はevernoteにメモったり、可能な時はその場でポチったり、今日の帰り道に買うぞって思って結局忘れちゃったりしています。

 

みなさんがどうしているか気になったので、Twitterアンケート取ってみました。

(協力いただいた方ありがとうございます)

 

みなさん同じような感じですね〜、記憶に頼ってる方が一番多い、という感じですね。

 

皆さんが常に使ってるアプリ、LINEでお買い物メモ取れたら便利じゃないですか?

 

さらにもう一つ。

買う商品ってどうやって選んでますか?

 

選ぶ時間が勿体無いので、僕はほとんどAmazonのランキング1位を何も考えずに買っちゃいます。

 

お買い物メモで、リストを表示するときにAmazon(or 楽天)の1位の商品とリンクを返してくれたら便利じゃないですか?

 

この2つを組み合わせてLINE bot作っちゃいました。

 

↓こちらの動画を見れば、使い方が分かると思います。

 

使い方はとてもシンプルです。

「買わなきゃいけないもの」を送信するとLINE botが覚えてくれます

「リスト」と送信するとそれまでに送信した買わなきゃいけないものリストとそれぞれのAmazon or 楽天のランキング1位の商品を返してくれます

Amazonor楽天と送信すると検索対象を切り替えられます

「クリア」と送信するとリストの中身を全て削除できます

 

買わなきゃいけないものをよく忘れちゃう方evernoteなどにメモしているけどちょっとめんどくさいな、と感じている方、是非一度使ってみてくださいー!

 

↓こちらのボタンから簡単にお友達追加できます!

友だち追加

 

また、作り方をまとめたチュートリアルを作成したのでご興味あればぜひご覧くださいー!

note.mu