関係データベースは正規形で正規化?

勉強のきっかけになった過去問

"受注明細"表は,どのレベルまでの正規形の条件を満足しているか。ここで,実線の下線は主キーを表す。
http://www.ap-siken.com/kakomon/29_haru/img/27.gif

ア. 第1正規形 イ. 第2正規形 ウ. 第3正規形 エ. 第4正規形
平成29年春期問27 どのレベルまでの正規形か|応用情報技術者試験.com

正規化は、データベースを使いやすくする設計規則です。

データの重複をなくし整合的にデータを取り扱えるようにデータベースを設計すること
www.oss-db.jp

正規化には、データを保護しながらデータベースをより柔軟にするよう設計された規則に従い、冗長性の除去および矛盾する従属関係を除去することによってテーブルを作成する作業、およびテーブル間のリレーションシップを確立する作業が含まれます。
データベースの正規化の基礎

なので、正規化していないと使いにくいデータベースになります。

非正規形 は正規化していなくて関係データベースに登録できない残念な状態です。

行単位の情報でしか登録できない関係データベースには、登録したくても、登録できない。
こうのような生のデータのことを非正規形と読んでいる。
http://gomocool.net/gomokulog/wp-content/uploads/2015/04/64c324157a5db9c2f283e07eac5b6aa5.png
データベースの正規化(正規形)とはなんぞや – gomokulog

正規形は、正規化するやり方の段階です。

正規形は数字が大きいほどいい感じに正規化できてます。

第1正規形は、分割する必要のない値だけを保持している状態です。

  • 一部しか違わないレコードが半端なくある状態
  • やり方
    1. 各テーブルで繰り返し現れるグループを除去します。
    2. 関連するデータごとに 1 つのテーブルを作成します。
    3. 関連するデータ セットを主キーで識別します。

1つの行にするために繰返し項目を無くして、単一値と呼ばれる形ににする。
http://gomocool.net/gomokulog/wp-content/uploads/2015/04/2bc236e2c3b8ecfcdfa5cfbc1c0b1cd9.png
データベースの正規化(正規形)とはなんぞや – gomokulog

すべての属性の値を単純な値にします。
http://ext-web.edu.sgu.ac.jp/HIKO/Prog03/SenpaiKyozai/shiohara/image/daiichiseikikei.gif
正規化

第2正規形は、属性ごとに集めて関係性を保持している状態です。

  • キーでまとめたけど何かまとめられそうな繰り返しがある状態
  • やり方
    1. 複数のレコードに該当する値のセットごとに 1 つのテーブルを作成します。
    2. これらのテーブルを外部キーと関連付けます。

第2正規化とは、部分関数従属性を取り除くこと。<省略>
主キーが複数のキーの組み合わせ(複合キー)の場合に、全部組み合わせとかしなくても、片方のキーだけで、決まっちゃうものがある場合、部分関数従属性があるという。
http://gomocool.net/gomokulog/wp-content/uploads/2015/04/8279c60ba39b3638a7311c3d9a2cb627.png
データベースの正規化(正規形)とはなんぞや – gomokulog

主キーに部分従属している属性を分離する作業です。
http://ext-web.edu.sgu.ac.jp/HIKO/Prog03/SenpaiKyozai/shiohara/image/daini.gif
正規化

第3正規形は、キーに紐づく情報も同じようなものは別テーブルにして関連付けた状態です。

  • 重複なくスッキリ整理できた状態
  • やり方 : キーに従属しないフィールドを除去します。

主キーじゃないやつを非キーって言うんだけど、非キーの中でも、これが決まれば実際全部求まるよね?な部分を取り除けば第三正規形になる。
http://gomocool.net/gomokulog/wp-content/uploads/2015/04/8937f2499c73899caf39f4df267a836c.png
データベースの正規化(正規形)とはなんぞや – gomokulog

テーブル内にある推移従属関係を分離して、どのテーブルであってもすべての属性が主キーに対して完全従属であるテーブルにします。
http://ext-web.edu.sgu.ac.jp/HIKO/Prog03/SenpaiKyozai/shiohara/image/daisanseikika.gif
正規化

付加情報の中で重複するようなデータをさらに分割する。
http://www.fellow-ship.com/tech/img/normalize3.gif
www.fellow-ship.com

他に知っておいたほうがいいことがあります。

やり過ぎると無駄にテーブルが多くなってしまうので、アプリケーションに合わせて正規化しましょう。

第 3 正規形を遵守することが理論上望ましくても、常に実用的とは限りません。<省略>
理論上、正規化は実践する価値があります。 しかし、小さいテーブルを数多く作成するとパフォーマンスが低下したり、開くことのできるファイルおよびメモリの容量を超える場合があります。
データベースの正規化の基礎

完全に正規化されたデータベースへのクエリ(検索質問)はパフォーマンスが良くないことがある。
関係の正規化 - Wikipedia

データ検索・データ更新の頻度やリレーションの階層などと、実際の業務バランスを見て正規化は行いましょう。
場合によっては意図的に正規化を行わず性能を向上させる設計も必要です。
www.fellow-ship.com

もっと正規化した正規形はあるけどあんまり使わないらしいです。

ボイスコッド正規形 (BCNF) とも呼ばれる第 4 正規形、および第 5 正規形が存在しますが、実用的な設計と見なされることはほとんどありません。 これらの規則を無視すると、完全なデータベース設計とはならないことがありますが、機能的には影響しません。
データベースの正規化の基礎

ボイス・コッド正規形
ほとんどの場合第3正規形と等価であり、複数の属性からなる候補キーが複数存在する場合にのみ差異が生じうる。<省略>
第4正規形
候補キーではない属性への多値従属性をもった属性があってはならない。<省略>
第5正規形
その関係が第4正規形であり、さらにその関係に含まれる結合従属性の決定項が候補キーのみである
関係の正規化 - Wikipedia

わからない用語はわからないので調べました。

単一値とは、おんなじ組み合わせが繰り返さないデータのセット

データを何とか無理くりでもデータベースに登録しようとした場合、1つの行にするために繰返し項目を無くして、単一値と呼ばれる形ににする。
データベースの正規化(正規形)とはなんぞや – gomokulog

スカラ値とは、「もう分割できない!」とか「それ以上分解して操作する必要ない!」っていう値です。
  • スカラ値なもの : 数字とか人名とか物の名前とか
  • スカラ値じゃないもの : AKB48とか世界とか
  • 残った疑問 : リテラル値の違いって何?

scalarは「単体」を意味します。<省略>
簡単にイメージできるのは,プログラミング言語におけるchar,int,floatといった単一の値だけを保持するデータ型でしょう。反対に,配列,リスト,レコードなど複合的な値を保持するデータ型は,非スカラ型と呼ばれます。
gihyo.jp

導出項目とは、合計値みたいに既にある項目から計算とかすればわかる項目です。

他のデータ項目から処理や計算により導き出せる項目のことをいいます。
blog.goo.ne.jp

候補キーとは、ポスト主キーなキーです。

特定の行を識別できる列(項目)のこと
nwdb.exblog.jp

非キー属性とは、それだけでは情報を特定できないもののことです。

非キー属性は、キーに含まれない属性だ。一般的に、ほとんどの属性は単純な説明的なもので、かつこのカテゴリに含まれる。名前、苗字、誕生日という属性を考えると、大抵の場合は、非キー属性だ。
blog.livedoor.jp

関数従属性とは、キーになる項目がわかればその情報もわかることです。

一方の値が決まると他の項目の値も一意に決まる関係
http://ext-web.edu.sgu.ac.jp/HIKO/Prog03/SenpaiKyozai/shiohara/image/jyuzoku.gif
正規化

推移従属関係とは、キーになる項目とその項目でわかる情報の関係です。

主キー以外の項目に従属する関係
http://ext-web.edu.sgu.ac.jp/HIKO/Prog03/SenpaiKyozai/shiohara/image/suii.gif
正規化

更新時異常とは、更新したら情報がなくなったり矛盾が発生することです。

商品テーブル作ってないもんだから、薬草の値段変えたかったら、薬草の取引に関する部分全部変えなきゃダメとか、新しい商品追加したくても、取引明細テーブルにしか商品情報が書いてないから、登録できないとか、アホみたいなこと
データベースの正規化(正規形)とはなんぞや – gomokulog

第2正規形で起こる更新時異常には次の2種類があります。
(1) 行の修正に伴って修正前に格納されていた情報が無くなってしまう。<省略>
(2) 非キー属性に関数従属している属性の値を修正するときに、該当する行の全てを修正しなければならない。<省略>更新処理を誤るとデータの不整合が生じる。
平成22年春期問7 更新するときに発生する問題|データベーススペシャリスト.com

おわりに

このぺーじでは、いろんなサイトにある解説で理解しやすいなって思ったところを集めまくって勉強しています。
わかりやすい解説をしていただいているサイト様に心から感謝です。

信頼性設計のお話

勉強のきっかけになった過去問

システムの信頼性設計に関する記述のうち,適切なものはどれか。

  1. フェールセーフとは,ユーザの誤操作によってシステムがダウンしてしまうことのないように,単純なミスを発生させないようにする設計方法である。
  2. フェールソフトとは,故障が発生した場合でも機能を縮退させることなく稼動を継続する概念である。
  3. フォールトアボイダンスとは,システム構成要素の個々の品質を高めて故障が発生しないようにする概念である。
  4. フォールトトレランスとは,故障が生じてもシステムに重大な影響が出ないように,あらかじめ定められた安全状態にシステムを固定し,全体として安全が維持されるような設計手法である。

問35 システム信頼性設計 平成20年秋期|応用情報技術者試験.com

最期までしっかり働けるようにリスクを予め考慮するのが信頼性設計

システム・装置または部品が使用開始から寿命を迎えるまでの期間を通して、予め期待した機能を果たせるように、すなわち故障や性能の劣化が発生しないように考慮して設計する手法のこと。
信頼性設計 - Wikipedia

システムの設計ではなく機械や建築物など広い世界で行われる設計です。
人間にも使えるみたいです!
liginc.co.jp

信頼設計の種類

被害を最小限に抑えるフェールセーフ

fail(故障) + safe(安全) = フェールセーフ

こんな感じ

誤操作・誤動作による障害が発生した場合、常に安全側に制御する
フェイルセーフ - Wikipedia

転倒すると自動的に消火するよう設計されている石油ストーブ
www.hamabiz.jp

必ず事故や誤りは起きる、という前提からの設計思想
フェールセーフ

踏切遮断機が故障した場合
⇒重力により自らしゃ断かんが降りてくる(自重降下)機構により踏切通行者の安全を確保します。
www.signal.co.jp

故障した機能に無理をさせず全体の停止を防ぐフォールバック

fall(落ちる) + back(戻る) = 縮退運転

こんな感じ

何らかの問題が発生した際に「止まるよりは、しょぼい方がマシでしょ?」な考えに基づいて、機能や性能を制限して動かし続けること
http://wa3.i-3-i.info/word14810.html

機能停止を部分的なものに留めることで、稼動完全にシステムが使えなくなることを防ぐことができる。
www.weblio.jp

何らかの要因でIPv6による通信ができない場合に、 それを諦めてIPv4での通信に切り替える動作、もしくはその逆の、 IPv4での通信からIPv6での通信に切り替える動作
インターネット用語1分解説~IPv6/IPv4フォールバックとは~ - JPNIC

性能を落としたり機能を制限したりして限定的ながら稼動を続行すること。あるいは、利用したい機能が条件が悪く使えない場合に、代替となる機能に切り替えること。
e-words.jp

故障が起きないようにするフォールトアボイダンス

fault(障害) + avoidance(回避) = 障害回避

こんな感じ

なるべく故障や障害が生じないようにする
e-words.jp

問題を起こさない前提で「どうすればヤバいことにならないかな?」を考えて備えること
http://wa3.i-3-i.info/word14814.html

高信頼素子の採用や高信頼化設計, 徹底的なテスト・検証, 品質管理体制の整備など
www.weblio.jp

故障が発生したときに対処するのではなく,品質管理などを通じてシステム構成要素を信頼性を高めること
問15 システムの信頼性向上技術 平成25年春期|応用情報技術者試験.com

故障しても止まらないようにするフォールトトレラント

fault(障害) + tolerant(耐える) = 障害耐性

こんな感じ

構成要素の一部が故障、停止などしても予備の系統に切り替えるなどして機能を保ち、正常に稼動させ続ける
e-words.jp

片方のCPUエンクロージャ内に障害が発生しても、障害は自動で検出され、システムから切り離されます。残りのCPUが正常稼動を続けているので、OSやアプリケーションには影響を与えず、システムは稼動しつづけます。
www.stratus.co.jp

「問題が起こってもお手上げにならないように、あれやこれやと備えておくぜ!」な心意気
http://wa3.i-3-i.info/word14813.html

どこか一部分が故障しても、全体を停止させずに障害から回復できるように設計する
http://www-higashi.ist.osaka-u.ac.jp/~nakata/mobile-cp/chap-07j.pdf

大きな問題がないようにするフェールソフト

fail(故障) + soft(穏やか) = フェールソフト

こんな感じ

システム全体を停止させずに性能・機能を落として稼働を継続(縮退運転)するような仕組みや考え方
e-words.jp

「多少しょぼくなっても、止まるよりはマシだよね?」な考えに基づいて、機能や性能を制限して動かし続ける
http://wa3.i-3-i.info/word14811.html

故障が発生しても、全面停止とせず、必要最小限の機能を維持する。
フェールソフト、フェールセーフ [徹底研究!情報処理試験]

ハードウェアの障害時に,パフォーマンスは低下するが,構成を縮小して運転を続けられるようにする。
問24 フェールソフトの例はどれか 平成25年春期|情報処理安全確保支援士.com

うっかり者が使っても問題がおこらないようにするフールプルーフ

fool(愚か者) + proof(耐える) = フールプルーフ

こんな感じ

操作に不慣れな人も利用するシステムでは,間違ったデータが入力されることが想定される。誤入力が発生しても,プログラムやシステムを異常終了させずに,エラーメッセージを表示して次の操作を促す
問22 フールプルーフ 平成23年特別|情報処理安全確保支援士.com

フタを閉めないかぎりドラムが回転しない洗濯機
www.hamabiz.jp

自動車のオートマチック車の場合,ブレーキを踏まないとシフトレバーをパーキング(P)の位置から動かすことができないようになっている
http://pub.maruzen.co.jp/index/kokai/oyoshinri/570.pdf

使用者が誤った操作をしても危険な状況を招かないように、あるいはそもそも誤った操作をさせないようにと、配慮して設計
www.sophia-it.com

誤った操作や危険な使い方ができないような構造や仕掛け
e-words.jp

電子メールでの返信が必要とされる受付システムの入力画面で、 メールアドレスの入力フィールドを二つ設けて、同一かどうかをチェック機能や、 アプリケーションを間違って終了してもデータを失わないように、 アプリケーション側の機能で編集中のデータのコピーを常に記憶媒体に保存する
hidekit.hatenablog.com

違いがわかりにくい方々

フェールセーフは「事故が起こった時」を想定して、フールプルーフは「事故を起こさない」ようにする

フェールセーフは必ず起きる誤作動・故障を考えて設計する手法ですが、「フールプルーフ」は事前に誤作動・故障を防ぐために配慮した設計思想です。
フェールセーフとフールプルーフの違いについて~設計思想と事例~ | SAT衛生管理者公式BLOG

フェールセーフは「ものは壊れる」「発生頻度を下げる」に対応する代表的な安全設計手法です。「人は間違える」「発生頻度を下げる」に対応する安全設計手法の代表はフールプルーフです。
www.monodukuri.com

フェールセーフは「安全第一」、フェールソフトは「継続第一」

排熱ファンが故障してしまったとき、フェールソフトの考え方であれば、あらかじめ部品を冗長的に構成しておき、故障部分を切り離して運用を続行できることを第一に考えます。フェールセーフであれば、熱による他の部品への影響や、火災発生といった事態を防ぐようシステムを停止するなど、安全性を第一に考えます。
フェールソフト、フェールセーフ [徹底研究!情報処理試験]

飛行機の場合、フェイルセーフのように完全に機能を停止すると墜落するため、フェイルソフトの概念により、故障したエンジンを切り捨て(燃料等の供給を行わないようにする)、故障していないエンジンだけで飛行できるような設計をとる必要がある。
フェイルソフト - Wikipedia

フェールソフトの考え方にそってフォールバックをする

フェイルソフトの思想に従って、縮退運転(フォールバック)を行う
http://wa3.i-3-i.info/word14811.html

フェールソフトは概念や技術を意味し、フォールバックは縮退運転と説明されるように、行為を指します。
sm.seeeko.com

フェールソフトの考え方にそってフォールトトレラントする

フォールトトレランスは,フェールソフトな動作を 達成するための一つの手段である。
JIS X 0014:1999 情報処理用語—信頼性,保守性及び可用性

フェールセーフは「安全が目標」、フォールトトレラントは「信頼向上が目標」

機械が故障しても、とにかく安全だけは確保しようとするのがフェールセーフで,出来るだけ機械の正しい機能を維持することで安全を確保しようとするのが,フォールトトレランスです.フェールセーフが直接,安全性を目標にしているのに対して,フォールトトレランスは,信頼性の向上を目標にしています.
http://www.mukaidono.jp/100303fault.pdf

Windows10においてTortoiseSVNを使ってBacklogのSubversionを使う方法

  • 環境
    • OS : Windows10 64bit
    • インストールするもの : TortoiseSVNhttps://static.osdn.net/thumb/g/0/26/36x36_0.gif
    • 使うSVN : BacklogのSVN

Subversionの概要

バージョン管理システムというものがあります。
e-words.jp

バージョン管理システムの1つがSubversionです。
e-words.jp

今回は、SubversionリポジトリWindowsマシンにCheckoutして使います。
e-words.jp

Checkoutとは・・・
リポジトリから作業コピーを取得する作業
作業コピーのチェックアウト

TortoiseSVNをインストールする

TortoiseSVNは、Windows用のSubversionクライアントツールです。

  1. サイトのページを表示します。ja.osdn.net
  2. 環境にあったものをダウンロードします。f:id:ponsuke_tarou:20170809224359p:plain
  3. ダウンロードしたファイルをダブルクリックしてインストールを開始します。
  4. [Next]ボタンを押下して進めます。f:id:ponsuke_tarou:20170809225031j:plainf:id:ponsuke_tarou:20170809225036j:plain
  5. [Brows]ボタンを押下するとインストール先を指定できます。f:id:ponsuke_tarou:20170809225040j:plainf:id:ponsuke_tarou:20170809225045j:plain
  6. [Next]ボタンを押下して進めます。f:id:ponsuke_tarou:20170809225049j:plainf:id:ponsuke_tarou:20170809225053j:plainf:id:ponsuke_tarou:20170809225057j:plainf:id:ponsuke_tarou:20170809225100j:plain

ポイント
インストールしたTortoiseSVNはクリックしたりスタートメニューから選択してアプリを起動しません。インストールされるとマウスで右クリックして出てくるメニューにTortoiseSVNの項目が追加されます。その項目からアプリを起動していきます。

BacklogのSubversionリポジトリをCheckoutする

  1. リポジトリをダウンロードしたいフォルダをエクスプローラーで表示します。
  2. 右クリックするとメニューに表示される[SVN Checkout...]を選択します。f:id:ponsuke_tarou:20170809235506j:plain
  3. ダイアログが開きます。f:id:ponsuke_tarou:20170809235608j:plain
  4. [URL of repository]にBacklogからコピーしたSubversionリポジトリのURLを貼り付けます。f:id:ponsuke_tarou:20170809234914p:plain
  5. [OK]ボタンを押下します。
  6. IDとパスワードの入力を求められた場合は、Backlogへのログインと同じものを入力します。
  7. リポジトリに格納されているものの大きさにもよりますが、checkoutが終わるまでそれなりに待ちます。f:id:ponsuke_tarou:20170810001534j:plain

作業コピーのファイルを見る

  1. 他の人が更新していることがあるので必ず[http://ponsuke-tarou.hatenablog.com/entry/2017/08/12/120539#Update:title=[Update]します。]
  2. Subversion以外のファイル同様に見ることができます。

作業コピーのファイルを更新する

  1. [http://ponsuke-tarou.hatenablog.com/entry/2017/08/12/120539#Update:title=[Update]します。]
  2. ファイルの内容を更新します。
  3. [http://ponsuke-tarou.hatenablog.com/entry/2017/08/12/120539#Commit:title=[Commit]します。]

Subversionの基本操作

Update

Updateとは・・・
サーバーから作業コピーに変更を取り込む作業
他人の変更に伴う作業コピーの更新

  1. Checkout中のフォルダを選択して右クリックします。
  2. [SVN Update]を選択します。f:id:ponsuke_tarou:20170812104637j:plain
  3. https://tortoisesvn.net/docs/release/TortoiseSVN_ja/images/UpdateFinished.png

Commit

Commitとは・・・
サーバへ作業コピーの変更を送信すること
変更のリポジトリへのコミット

  1. 対象のフォルダを選択して右クリックします。
  2. [TortoiseSVN] > [Commit]を選択します。
  3. コミットダイアログが表示されます。http://tgk.zkzk.org/image/svn/tsvn_4-8.png
  4. コメントを記載します。
    • 1行目:BacklogチケットのID・タイトル (必須)
    • 2行目:空行
    • 3行目:作業もしくは変更内容の要約
    • 4行目以降:要約に対する補足説明 (任意)
  5. [OK]ボタンを押下します。
  6. https://tortoisesvn.net/docs/nightly/TortoiseSVN_ja/images/CommitProgress.png

Crean up

Crean upとは・・・
Subversion コマンドが正常に終了しなかったなどで起こる作業コピーの矛盾状態を解決する。
クリーンアップ

  1. 対象のフォルダを選択して右クリックします。
  2. [TortoiseSVN] > [Clean up...]を選択します。
  3. https://tortoisesvn.net/docs/nightly/TortoiseSVN_ja/images/Cleanup.png
  4. [OK]ボタンを押下します。
  5. f:id:ponsuke_tarou:20170812103855j:plain

エラーになったら

TortoiseSVN\bin\SendRpt.exe not found.

f:id:ponsuke_tarou:20170812101207j:plain

  • 対応 : パソコンを再起動します。

stackoverflow.com

Additional errors:

f:id:ponsuke_tarou:20170810001914j:plain

  • 対応 : [Clean up]後に[Update]します。

REPORT request on {URL} failed

f:id:ponsuke_tarou:20170812101022j:plain

  • 対応 : [Clean up]後に[Update]します。

その他

d.hatena.ne.jp

MacのVirtualBoxに作ったCentOS7にRAS鍵の認証で接続できるように設定する

MacVirtualBoxに作ったCentOSを少し便利にできたので、いよいよ鍵認証のログイン許可を設定します。
ponsuke-tarou.hatenablog.com

  • 目的 : Linux環境でSSHの鍵作成から設定まで勉強したい!
  • 環境

設定ファイル(sshd_config)のバックアップを取る

設定に失敗したり元の設定に戻したくなった時のためにバックアップを取ります。

  1. rootとしてログインします。
  2. 設定ファイルの存在を確認します。
  3. 設定ファイルをコピーしてバックアップを取ります。
$ ssh root@192.168.0.6
root@192.168.0.6's password: 
Last login: Mon Jul 31 23:34:36 2017 from 192.168.0.7
# ls -la /etc/ssh/
<省略>
-rw-------.  1 root root       4361  4月 12 23:05 sshd_config
# cp /etc/ssh/ssh_config /etc/ssh/ssh_config.20170731bak
# ls -la /etc/ssh/
<省略>
-rw-------.  1 root root       4361  4月 12 23:05 sshd_config
-rw-------.  1 root root       4361  8月  1 00:12 sshd_config.20170731bak

設定ファイル(sshd_config)を編集する

  1. viエディタで開きます。
  2. 以下のコメントアウトを外します。なければ追記します。
    • RSAAuthentication yes
    • RhostsRSAAuthentication no
    • PubkeyAuthentication yes
    • AuthorizedKeysFile .ssh/authorized_keys
  3. 保存して閉じます。
  4. sshdサービスを再起動します。
# vi /etc/ssh/ssh_config
▼▼▼▼▼▼▼▼▼▼▼▼▼ssh_configの中身▼▼▼▼▼▼▼▼▼▼▼▼▼
#       $OpenBSD: ssh_config,v 1.28 2013/09/16 11:35:43 sthen Exp $
<省略>
# Host *
#   ForwardAgent no
#   ForwardX11 no
   RhostsRSAAuthentication no # RHosts認証を許可しない
   RSAAuthentication yes # RAS認証を許可する
   PubkeyAuthentication yes # 公開鍵認証を許可する
   AuthorizedKeysFile .ssh/authorized_keys # 公開鍵登録ファイルのパスと名前
#   PasswordAuthentication yes
#   HostbasedAuthentication no
<省略>
▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
# systemctl restart sshd

MacのVirtualBoxに作った仮想マシンを少し便利にする

MacVirtualBoxに作った仮想マシンVirtualBox Guest Additionsをインストールしたので便利に使えるように設定します。
ponsuke-tarou.hatenablog.com

  • 目的 : Linux環境でSSHの鍵作成から設定まで勉強したい!
  • 環境
    • VirtualBox : Version 5.1.22 r115126 (Qt5.6.2)
    • ホストOS : macOS Sierra Virsion 10.12.5
      • 操作は基本的にホストOSからTerminalでSSH接続して行いました。
    • ゲストOS : CentOS Linux 7.3.1611(Core)
    • VirtualBox Guest Additions : 5.1.22 r115126

ローケルとキーボードを設定する

日本語のキーボードになるようにします。

e-words.jp

  1. ローケルを日本語に設定します。
  2. キーボードを日本語のキーマップ「jp106」に設定します。
# 最初の状態を確認する
$ localectl status
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: jp
      X11 Layout: jp

# ローケルを日本語に設定する
$ sudo localectl set-locale LANG=ja_JP.utf8

# ローケルの設定ファイルを確認する
$ cat /etc/locale.conf 
LANG=ja_JP.utf8

# 利用可能な日本語のキーマップを確認する
$ localectl list-keymaps | grep jp
jp
jp-OADG109A
jp-dvorak
jp-kana86
jp106

# キーマップを設定する
$ sudo localectl set-keymap jp106

# キーマップの設定ファイルを確認する
$ cat /etc/vconsole.conf
KEYMAP=jp106
FONT=latarcyrheb-sun16

# 変更後の状態を確認する
$ localectl status
   System Locale: LANG=ja_JP.utf8
       VC Keymap: jp106
      X11 Layout: jp
       X11 Model: jp106
     X11 Options: terminate:ctrl_alt_bksp

ホストOSとゲストOSでコピーバッファを共有できるようにする

コピペができたほうが便利なのでコピーバッファを共有します。

  1. Oracle VM VirtualBox Managerで対象のゲストOSを選択し、[General]リンクを押下します。f:id:ponsuke_tarou:20170723223530p:plain
  2. [Advanced]を押下し、[Shared Clipboard :]で「Bidirection」を選択します。f:id:ponsuke_tarou:20170723223610p:plain
  3. [OK]ボタンを押下します。

画面を大きくする

老化のせいか小さいと見づらいので画面を大きくします。

  1. 設定ファイルをviで開きます。
  2. GRUB_CMDLINE_LINUX」を探します。
  3. 設定値にに「vga=***」を追加します。
$ sudo vi /etc/default/grub
▼▼▼▼▼▼▼▼▼▼grubの中身▼▼▼▼▼▼▼▼▼▼
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet vga=771" <------ ここ
GRUB_DISABLE_RECOVERY="true"

MacのVirtualBoxに作った仮想マシンへVirtualBox Guest Additionsをインストールする

MacVirtualBoxに作った仮想マシンへ他のPCからもアクセスできるようになったので、仮想マシンを少し便利に使うためのVirtualBox Guest Additionsをインストールします。
ponsuke-tarou.hatenablog.com

  • 目的 : Linux環境でSSHの鍵作成から設定まで勉強したい!
  • 環境
    • VirtualBox : Version 5.1.22 r115126 (Qt5.6.2)
    • ホストOS : macOS Sierra Virsion 10.12.5
      • 操作は基本的にホストOSからTerminalでSSH接続して行いました。
    • ゲストOS : CentOS Linux 7.3.1611(Core)
    • インストールするVirtualBox Guest Additions : 5.1.22 r115126

1. Guest Additionsに必要なパッケージをインストールする

CentOSを起動します。

kernel-develをインストールします。

# OSのカーネルのバージョンと、kernel-devel のバージョンが揃えるためにupdate
$ sudo yum update
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.nara.wide.ad.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
No packages marked for update

# CentOSのカーネルのバージョン
$ uname -r
3.10.0-514.26.2.el7.x86_64

$ sudo yum install kernel-devel 
<省略>
インストール:
  kernel-devel.x86_64 0:3.10.0-514.26.2.el7                                                                                                                   

依存性関連をインストールしました:
  perl.x86_64 4:5.16.3-291.el7                     perl-Carp.noarch 0:1.26-244.el7                   perl-Encode.x86_64 0:2.51-7.el7                        
  perl-Exporter.noarch 0:5.68-3.el7                perl-File-Path.noarch 0:2.09-2.el7                perl-File-Temp.noarch 0:0.23.01-3.el7                  
  perl-Filter.x86_64 0:1.49-3.el7                  perl-Getopt-Long.noarch 0:2.40-2.el7              perl-HTTP-Tiny.noarch 0:0.033-3.el7                    
  perl-PathTools.x86_64 0:3.40-5.el7               perl-Pod-Escapes.noarch 1:1.04-291.el7            perl-Pod-Perldoc.noarch 0:3.20-4.el7                   
  perl-Pod-Simple.noarch 1:3.28-4.el7              perl-Pod-Usage.noarch 0:1.63-3.el7                perl-Scalar-List-Utils.x86_64 0:1.27-248.el7           
  perl-Socket.x86_64 0:2.010-4.el7                 perl-Storable.x86_64 0:2.45-3.el7                 perl-Text-ParseWords.noarch 0:3.29-4.el7               
  perl-Time-HiRes.x86_64 4:1.9725-3.el7            perl-Time-Local.noarch 0:1.2300-2.el7             perl-constant.noarch 0:1.27-2.el7                      
  perl-libs.x86_64 4:5.16.3-291.el7                perl-macros.x86_64 4:5.16.3-291.el7               perl-parent.noarch 1:0.225-244.el7                     
  perl-podlators.noarch 0:2.5.1-3.el7              perl-threads.x86_64 0:1.87-4.el7                  perl-threads-shared.x86_64 0:1.43-6.el7                

完了しました!

# kernel-develのカーネルのバージョンを確認する
$ ls -la /usr/src/kernels/
合計 4
drwxr-xr-x.  3 root root   40  7月 18 00:57 .
drwxr-xr-x.  4 root root   58  7月 18 01:34 ..
drwxr-xr-x. 22 root root 4096  7月 18 00:57 3.10.0-514.26.2.el7.x86_64

gccとbzip2コマンドをインストールします。

$ sudo yum install bzip2
<省略>
インストール:
  bzip2.x86_64 0:1.0.6-13.el7                                                                                                                                 

完了しました!

$ sudo yum install gcc
<省略>
インストール:
  gcc.x86_64 0:4.8.5-11.el7                                                                                                                                   

依存性関連をインストールしました:
  cpp.x86_64 0:4.8.5-11.el7    glibc-devel.x86_64 0:2.17-157.el7_3.4  glibc-headers.x86_64 0:2.17-157.el7_3.4  kernel-headers.x86_64 0:3.10.0-514.26.2.el7 
  libmpc.x86_64 0:1.0.1-3.el7  mpfr.x86_64 0:3.1.1-4.el7             

完了しました!

2. Guest Additionsをインストールする

[Devices] > [Insert Guest Additions CD image...]を選択します。

[VBoxGuestAdditions.iso]が追加されたことを確認します。

f:id:ponsuke_tarou:20170723175156p:plainf:id:ponsuke_tarou:20170723175204p:plain

マウントしてインストールします。

# マウント用のディレクトリを作成します。
$ sudo mkdir /mnt/cdrom/

# マウントします
$ sudo mount /dev/cdrom /mnt/cdrom/
mount: /dev/sr0 is write-protected, mounting read-only

# 中身を確認します
$ ls /mnt/cdrom/
32Bit  AUTORUN.INF  VBoxLinuxAdditions.run    VBoxWindowsAdditions-amd64.exe  VBoxWindowsAdditions.exe  cert
64Bit  OS2          VBoxSolarisAdditions.pkg  VBoxWindowsAdditions-x86.exe    autorun.sh                runasroot.sh

# インストールします
$ sudo sh /mnt/cdrom/VBoxLinuxAdditions.run
Verifying archive integrity... All good.
Uncompressing VirtualBox 5.1.22 Guest Additions for Linux...........
VirtualBox Guest Additions installer
Removing installed version 5.1.22 of VirtualBox Guest Additions...
Copying additional installer modules ...
Installing additional modules ...
vboxadd.sh: Starting the VirtualBox Guest Additions.

もし、ここで「Could not find the X.Org or XFree86 Window System, skipping.」という表示があっても記にせず進めます。
qiita.com

CentOS7を再起動します。

$ sudo systemctl reboot
Connection to 192.168.0.6 closed by remote host.
Connection to 192.168.0.6 closed.

3. Guest Additionsのバージョンを確認する

$ modinfo vboxguest
filename:       /lib/modules/3.10.0-514.26.2.el7.x86_64/misc/vboxguest.ko
version:        5.1.22 r115126
license:        GPL
description:    Oracle VM VirtualBox Guest Additions for Linux Module
author:         Oracle Corporation
rhelversion:    7.3
srcversion:     E747E9F0126BD23943BF4B1
alias:          pci:v000080EEd0000CAFEsv00000000sd00000000bc*sc*i*
depends:        
vermagic:       3.10.0-514.26.2.el7.x86_64 SMP mod_unload modversions 

他の方法もこちらで紹介されていました。
qiita.com

SASSの基本を理解するための講習会

前提の環境

なぜSASSを使うのだろう?と思ったら

SASSのメリットを実感するには書き方の理解が大切です。
SASSの書き方を勉強して下さい。
lifequest-blog.com

blog.nest-online.jp

qiita.com

英語が読めるなら本家サイトへGo!です。
sass-lang.com

SASSを使える環境構築

  1. RubyGemsをインストールします。qiita.com
  2. Conpassとbootstrap-sassをインストールします。qiita.com
    • 「おまけ」部分は基本的に不要です。

SASSの構成

親ディレクトリ
├ css
|├ *.css <------ *.sassファイルをコンパイルして出力される
|└ *.css.map <------ *.sassファイルをコンパイルして出力される
└ sass
 ├ *.scss <------ このファイルを編集する。CSSと同じような記述が可能。
 └ sass.bat <------ *.scssファイルの状態を監視して保存を検知したらコンパイルしてくれるバッチ

スタイルを編集する方法

① *.scssの監視を開始する

  1. sass.batを起動します。Eclipseのプロジェクトエクスプローラーなどでダブルクリックしても起動します。
  2. コマンドプロンプトが起動して *.scssファイルの監視がはじまります。

② *.scssファイルを編集する

追加・変更・削除したい内容を*.scssファイルに記述して保存します。
sass.batを止めるまでsassディレクトリ配下の*.sassファイルはどれを何回更新してもOKです。
書き方は勉強して下さい。
tetra-themes.com

コンパイルでエラーがないことを確認する

  1. 表示されたコマンドプロンプトなどを見る
  2. 以下のようにエラーなく出力されていることを確認する
>>> Change detected to: sass/{ファイル名}.scss
      write css/{ファイル名}.css
      write css/{ファイル名}.css.map

④ *.scssの監視を終了する

  1. 表示されたコマンドプロンプトで「Ctrl + C」を押下します。
  2. コマンドプロンプトが閉じて監視がおわります。

⑤ *.cssコンパイル結果を確認する

  1. コンパイルで出力された*.cssを見ます。
  2. 編集した内容のみ変更されていることを確認します。

ポイント : SourceTreeなどGitのツールやコマンドを使って差分を確認すると楽できます。

コンパイルで出力される物を知る

*.css

スタイルシートです。
SASSを導入している場合は、このファイルを直接編集することは決してなりません!

直接編集すると恐ろしいことが!例えば・・・

  1. Aさんが*.cssを直接編集する
  2. Aさんがテストして変更内容を確認する
  3. Bさんが*.scssを編集してコンパイルする
  4. *.cssは再出力されてAさんが編集した内容は消える
  5. テストが終わったはずのAさんの編集内容は無くなりデグレとなる・・・

*.css.map

これは、ソースマップファイルといいます。

ソースマップファイルは、SASSだけに存在するわけではありません。
lealog.hateblo.jp

ソースマップファイルがあればブラウザで表示した時に*scssファイルのどこにスタイルが記載されているかわかります。
blog.webcreativepark.net

Gitなどで管理していた時に大人の事情でソースマップファイルはコミットはしない場合があります。
そんな場合は、.gitignoreなどに定義して誤ってコミットされることを防ぎます。

*.scssc

これは、キャッシュファイルです。

キャッシュファイルもソースマップファイル同様にコミットはしない場合があります。
そんな場合は、やはり.gitignoreなどに定義して誤ってコミットされることを防ぎます。

バッチファイルを知る

cd /d %~dp0
cd ..
sass --watch sass:css --style expanded -E utf-8

qiita.com

コンパイル時にエラーが出たら原因を調べて解決するべし

Invalid UTF-8 character {Unicodeのバイト}

原因 : *.scssファイルの文字コードが「UTF-8」以外で日本語が記載されています。
対応 : ファイルの文字コードを「UTF-8」にして下さい。

Invalid CSS after "...style-type none": expected "{", was ";")

原因 : スタイル定義の書き方が誤っている(このエラーの場合「list-style-type: none;」の「:」がない)
対応 : 対象となっている行の書き方を修正して下さい。

EISDIR: Is a directory @ io_fread - sass

原因 : 監視ではなくコンパイルをするのにディレクトリを指定している
対応 : コンパイルであればファイル、監視であればファイルまたはディレクトリを指定する

$ sass sass:css <-------- 「--watch」オプションがないのでコンパイル
Errno::EISDIR: Is a directory @ io_fread - sass
  Use --trace for backtrace.
$ sass sass/style.scss:css/style.css <--------- コンパイルはファイルを指定する

Error: Undefined variable: "${定義されていない変数}".

原因 : 定義されていない変数が使われている
対応 : どの変数を記載しようとしているのか、定義してから使用しているのか見直して下さい。

$ sass sass/style.scss:css/style.css
Error: Undefined variable: "$widthpx".
        on line 11 of sass/style.scss, in `width'
        from line 41 of sass/style.scss
  Use --trace for backtrace.

$ cat sass/style.scss <--------- 修正前
<省略>
@mixin width($width) {
    width: $widthpx; <-------------- width: 10px;的なノリで記載したが「$widthpx」という変数になった。
}
<省略>

$ cat sass/style.scss <--------- 修正後
<省略>
@mixin width($width) {
    width: $width + px;
}
<省略>

$ sass sass/style.scss:css/style.css <------ エラーなくコンパイル完了

その他

原因 : 調べる

調査方法① メッセージをよく読む
調査方法② トレースしてみる
$ cd {親ディレクトリ}
$ sass --trace sass:css
調査方法③ メッセージを完コピしてググる