大切なセキュリティ対策の方針について学びます。

前回の勉強内容

ponsuke-tarou.hatenablog.com

勉強のきっかけになった問題

JIS Q 27001では,情報セキュリティは三つの特性を維持するものとして特徴付けられている。それらのうちの二つは機密性と完全性である。残りの一つはどれか。

ア. 安全性
イ. 可用性
ウ. 効率性
エ. 保守性
応用情報技術者平成24年春期問42 情報セキュリティの三要素|応用情報技術者試験.com

セキュリティ対策の方針は1つではありません。

情報セキュリティポリシーとは、どんな脅威からどんなふうにシステムを守るか決めた方針です。

情報セキュリティポリシーの策定
(1)組織・体制を確立
(2)基本方針を策定
(3)守るべき情報資産を把握、分類
(4)その情報資産のリスクアセスメントを行い、それにより自身の情報セキュリティにおける脅威と脆弱性とリスクを見極め
(5)それに応じた導入対策(管理策)を取捨選択
(6)対策基準を策定
(7)対策基準の周知徹底
(8)実施手順を策定
https://www.ipa.go.jp/security/manager/protect/pdca/policy.htmlwww.ipa.go.jp

情報セキュリティとは、機密性・完全性・可用性を維持して改善し続けることです。

組織が保護すべき情報資産について機密性・完全性・可用性(CIA)をバランスよく維持し改善すること。

  • 機密性(Confidentiality):アクセスを認可された者だけが情報に確実にアクセスできること
  • 完全性(Integrity):情報資産が完全な状態で保存され、内容が正確であること
  • 可用性(Availability):情報資産が必要になったとき、利用できる状態にあること

www.dqs-japan.jp

ISMSとは、技術対策だけではなく組織としてセキュリティレベル・プラン・資源配分を決めてシステムを運用していくことです。

Information Security Management Systemの略で、日本語では情報セキュリティマネジメントシステムと言います。

ISMSとは、個別の問題毎の技術対策の他に、組織のマネジメントとして、自らのリスクアセスメントにより必要なセキュリティレベルを決め、プランを持ち、資源を配分して、システムを運用することである。
ISMS(情報セキュリティマネジメントシステム)とは - 情報マネジメントシステム認定センター(ISMS-AC)

リスクアセスメントとは、リスクを洗い出して撲滅したり低減させていくことです。

IT世界だけのことではありません。

リスクアセスメントは、職場の潜在的な危険性又は有害性を見つけ出し、これを除去、低減するため手法です。
中災防:リスクアセスメントとは なぜリスクアセスメントが必要か

www.kensaibou.or.jp

anzeninfo.mhlw.go.jp

ISMS認証基準には、実施状況の確認や見直しについても定められています。

■第3 ISMS の要求事項
(2)マネジメント枠組みの確立
 各項目について、定期的もしくは必要に応じて見直しすること。
(3)管理策の実施
 管理策を講ずるために採用された手続きについて、第 4 10(2)に従いその有効性を確認すること。
(5)文書管理
 (ア) ISMS 文書の利用者が文書を容易に利用することができる
 (イ) ISMS文書の定期的な見直しを行い、情報セキュリティポリシーに対する準拠性を維持しながら必要に応じて改訂する
 (エ) ISMSを運用するために必要なすべての事業所等において ISMS文書が閲覧可能である
■第4 詳細管理策
(2)セキュリティポリシー遵守状況の確認
 ① すべての手続きが情報セキュリティポリシーに準拠して実行されていることを定期的に見直すこと。
 ② 情報システムが情報セキュリティポリシー及び関連する対策基準や手順書等に準拠していることを定期的に確認すること。

https://isms.jp/doc/ismsreq08.pdf

ISMSの基になっている規格は、国際版がISO/IEC 17799で日本版はJIS X5080です。

これらは異なる2つの基準ではなく、英国規格である「BS7799」という規格を基に策定されており、ISO化された(国際基準化された)ものがISO/IEC17799である。そしてISO/IEC17799が日本語に翻訳され、日本工業規格(JIS化)として策定されたものが、JIS X5080である。
ISMSの基盤となるISO/IEC 17799とJIS X5080:情報セキュリティマネジメントシステム基礎講座(1) - @IT

JIS Q 27002とは、企業などの組織における情報セキュリティマネジメントシステムの仕様を定めた規格です。

国際規格ではISO/IEC 27002になります。
JIS Q 27002において対象としている脅威は、悪い人々からの攻撃だけではありません。

住環境を共有する者(例えば,家族,友人)による,情報又は資源への認可されていないアクセスの脅威

(省略)
潜在的な物理的及び環境的脅威[例えば,盗難,火災,爆発,ばい(煤)煙,水(又は給水の不具合)

(省略)

システムセキュリティ又はサービスに脅威をもたらすおそれのある,潜在的なあい(隘)路(bottlenecks)及び主要な要員への依存度合いを特定し,回避するために,管理者は,この情報を用いることが望ましく,また,適切な処置を立案することが望ましい。
JISQ27002:2014 情報技術-セキュリティ技術-情報セキュリティ管理策の実践のための規範

怖い人達から守れるか確認するペネトレーションテスト

勉強のきっかけになった問題

ペネトレーションテストの目的はどれか。

  1. 暗号化で使用している暗号方式と鍵長が,設計仕様と一致することを確認する。
  2. 対象プログラムの入力に対する出力結果が,出力仕様と一致することを確認する。
  3. ファイアウォールが単位時間当たりに処理できるセッション数を確認する。
  4. ファイアウォールや公開サーバに対して侵入できないことを確認する。

平成26年春期問42 ペネトレーションテストの目的|応用情報技術者試験.com

ペネトレーションテストとは、対象システムへ侵入してみるテスト技法です。

英語では、penetration test です。侵入テストとか侵入実験とも言います。
penetrationは和訳すると「侵入、進出」になります。
実際にネットワークの外部から内部へ侵入してみるテストで、ファイアウォール部分なんかのテストに使います。

通信ネットワークで外部と接続されたコンピュータシステムの安全性を調査するテスト手法の一つで、既に知られている手法を用いて実際に侵入や攻撃を試みる方式。
e-words.jp

目的は、テスト対象に侵入できないことを確認することです。

ネットワークに接続された情報システムは、外部からの攻撃にさらされる可能性があるので、対策をします。
例えば・・・

  • セキュリティ用のソフトなどの導入
  • ファイアーウォールの導入

とはいえ・・・

  • 設定が十分じゃないかも
  • 新たな脆弱性をついた攻撃手法が開発されるかも

そこで、ペネトレーションテストを実施して

  • システムが攻撃に対して安全かな?
  • 攻撃を受けた場合にどこまでセキュリティツールは耐えてくれるかな?
  • 侵入されたらそこを踏み台にして他のネットワークを攻撃しないかな?

とかとか不安なことを観点にテストします。

例えば、「ネットワークへのアクセスコントロールが有効に機能しているか。」をチェックします。

侵入テストでは、セキュリティ強化を目指す管理者側が敢えてセキュリティホールの探査を攻撃を試みる。事前にあらゆる方法の攻撃を仕掛けてみることによって、セキュリティ上の問題を早期に発見し、対策を講じることができる。
www.sophia-it.com

近年インターネットの普及が目覚ましく、新たな技術がばりばり進出し・・・便利 VS 危険な状態です。

会社でもセキュリティのお話はよく出てきます。
labs.opentone.co.jp
labs.opentone.co.jp
labs.opentone.co.jp
labs.opentone.co.jp
labs.opentone.co.jp

造ったら使う前にちゃんとセキュリティの脆弱性をチェックしなきゃならない世の中です。

エンディアンは複数バイトのデータを並べる方法です。

勉強のきっかけになった問題

16進数 ABCD1234 をリトルエンディアンで4バイトのメモリに配置したものはどれか。ここで, 0~+3はバイトアドレスのオフセット値である。

ア. http://www.ap-siken.com/kakomon/29_haru/img/21a.gif
イ. http://www.ap-siken.com/kakomon/29_haru/img/21i.gif
ウ. http://www.ap-siken.com/kakomon/29_haru/img/21u.gif
エ. http://www.ap-siken.com/kakomon/29_haru/img/21e.gif
平成21年秋期問24 リトルエンディアンで配置したもの|応用情報技術者試験.com

エンディアンとは、メモリにデータを送る時のデータの並べ方です。

バイトオーダーとも言います。
コンピュータでデータをメモリに読み書きしたり、ディスクに読み書きするときには、1バイトを最小単位にして行います。
エンディアンでは4バイト単位で管理してメモリにデータを送ります。

エンディアンとは、複数のバイト(多バイト、マルチバイト)で構成されるデータを記録・伝送する際に、どのような順番で各バイトを記録・伝送するかを表す順序のこと。
e-words.jp

トルエンディアンは、4バイトにデータを後ろから順に格納していく方法です。

例えば・・・ 16進数 : ABCD1234(10101011 11001101 00010010 00110100) をトルエンディアンで4バイトに格納すると

  • 1バイト目 : 34(00110100)
  • 2バイト目 : 12(00010010)
  • 3バイト目 : CD(11001101)
  • 4バイト目 : AB(10101011)

となります。
※. ()内は2進数です。

https://upload.wikimedia.org/wikipedia/commons/thumb/3/3c/Little-Endian-ja.svg/280px-Little-Endian-ja.svg.png
エンディアン - Wikipedia

ビッグエンディアンは、4バイトにデータを前から順に格納していく方法です。

例えば・・・ 16進数 : ABCD1234(10101011 11001101 00010010 00110100) をビッグエンディアンで4バイトに格納すると

  • 1バイト目 : AB(10101011)
  • 2バイト目 : CD(11001101)
  • 3バイト目 : 12(00010010)
  • 4バイト目 : 34(00110100)

となります。
※. ()内は2進数です。

https://upload.wikimedia.org/wikipedia/commons/thumb/7/75/Big-Endian-ja.svg/280px-Big-Endian-ja.svg.png
エンディアン - Wikipedia

どのエンディアンが使われるかはCPUによって決まります。

f:id:ponsuke_tarou:20171009204140p:plain
Endian(エンディアン)ってなに? | 学校では教えてくれないこと | [技術コラム集]組込みの門 | ユークエスト株式会社

バイエンディアンは、トルエンディアンビッグエンディアンを切り替えられる方法だそうです。

実際にエンディアンを見てみる

任意の16進数をトルエンディアンビッグエンディアンに変換する方法

こちらのサイトでカンタンに変換してくれます。

web.save-editor.com

自分のパソコンのエンディアンを確認する方法

Linuxのodコマンドでファイルのマジックナンバーを見ることで確認できます。
OSがmacOS SierraでプロセッサがIntel Core i7(x86)のパソコンに置いた拡張子.pngのファイルを見てみます。
.pngマジックナンバーは、16進数で「89 50 4E 47」です。

$ od -t x -A x /Users/mana/Desktop/ThisIsPingFile.png | head -1
0000000          474e5089        0a1a0a0d        0d000000        52444849

「474e5089」となっていることからトルエンディアンであることがわかります。

【 od 】 バイナリ・ファイルの内容を閲覧す

  • オプション
    • -A 表示するオフセットの基数を指定する
    • -t 表示のタイプを指定する
  • 表示タイプ
    • x 16 進数

Linuxコマンド集 - 【 od 】 バイナリ・ファイルの内容を閲覧する:ITpro

【 head 】 ファイルの先頭部分を表示する

  • オプション
    • -n ファイルの先頭からN行を表示する

Linuxコマンド集 - 【 head 】 ファイルの先頭部分を表示する:ITpro

マジックナンバー (magic number)とは
ハードコーディングされた(ソースコードの中に直接埋め込まれた)何らかの意味を持つ値のこと
http://wa3.i-3-i.info/word12868.html

qiita.com

qiita.com

CPUに役立っているレジスタの種類を知る

勉強のきっかけになった問題

CPUのスタックポインタが示すものはどれか。

ア. サブルーチン呼出し時に,戻り先アドレス及びレジスタの内容を
  格納するメモリのアドレス
イ. 次に読み出す機械語命令が格納されているアドレス
ウ. メモリから読み出された機械語命令
エ. 割込みの許可状態,及び条件分岐の判断に必要な演算結果の状態
平成24年秋期問10 スタックポインタが示すもの|応用情報技術者試験.com

CPUとは、パソコンの脳みそです。

省略しないと、Central Processing Unitです。
日本語で言うと、中央演算装置です。
マイクロプロセッサに半導体チップとして入っていて、計算処理なんかをしてくれるパソコンの脳みそです。

CPUの種類はパソコンで見るとこんな感じで表示されています。
f:id:ponsuke_tarou:20171001191331p:plain

マイクロプロセッサの見た目はこんな感じ。

https://shop-media.intel.com/api/v2/helperservice/getimage?url=http://images.icecat.biz/img/gallery/23221218_49.jpg&height=550&width=550
www.intel.com

レジスタとは、CPUが計算する時に使う記憶装置です。

CPUに入っている記憶装置のことです。計算に使うデータや計算結果、次にやることの情報などCPUのためになることを覚えています。
CPUのために速攻でデータを授受してくれまが、あんまりたくさん覚えることができません。なので、用途に応じて担当を決めています。

http://itpro.nikkeibp.co.jp/article/COLUMN/20070404/267385/zu03.jpg
itpro.nikkeibp.co.jp

プログラムカウンタは、次にやることが書いてあるメモリの場所を記憶するレジスタです。

略してPCです。プログラムレジスタ(PR)とか命令ポインタ(IP)とも言うらしいです。

CPU内にあるアドレス(番地)を収める場所で、そのCPUが次に実行する命令が置かれている番地が書かれています。ある番地の命令を実行した後、次はどこの番地にある命令を実行したらよいのか、その答えを示しているのがプログラムカウンタです。
https://www.renesas.com/ja-jp/media/support/technical-resources/engineer-school/mcu-programming-peripherals-06/img_01.jpg
www.renesas.com

スタックポインタは、次に使えるメモリにあるスタックの番地を記憶するレジスタです。

OSがプログラムをロードすると,メモリ上に「スタック」と呼ばれるデータ領域が割り当てられる。アセンブラでは,主に汎用レジスタの値を一時的に退避する目的でスタックが使われる。スタックの最上段のアドレスを保持するのがSPだ
http://itpro.nikkeibp.co.jp/article/COLUMN/20070404/267385/zu05.jpg
itpro.nikkeibp.co.jp

そもそもスタックとは、メモリ上にある一時的な置き場です。

コンピュータで用いられる基本的なデータ構造の1つで、データを後入れ先出し(LIFO: Last In First Out; FILO: First In Last Out)の構造で保持するものである。
https://upload.wikimedia.org/wikipedia/commons/thumb/8/8c/Stack-sv.png/200px-Stack-sv.png
スタック - Wikipedia

割り込み要求が発生した場合、割り込みが発生する直前まで実行していたプログラムのフラグやPCの値を一時的に退避する場所
CPUの全体構成:スタックとスタックポインタ | 東芝 半導体&ストレージ製品

メモリ上の領域の一つであり注3,プログラム実行時の作業領域として使用します.スタック領域は,コード領域やデータ領域,ヒープ領域と同じように,メモリ上に領域を排他的に(ほかの領域とは重なり合わないように)確保しています.
http://www.kumikomi.net/archives/2008/07/15stack/zu04_01.gif
www.kumikomi.net

命令レジスタは、実行中の処理を記憶するレジスタです。

インストラクションレジスタ(IR)とも言うらしいです。
プログラムカウンタから次にやることが書いてあるメモリの場所を取得して、やることをメモリから読み出して記憶します。

主記憶から読み出された命令が格納される。この内容が命令デコーダ(命令解読器)で解読される。
http://ofmlsty.zashiki.com/magenju/terakoya/2syu_p/img/CPU_kihon.GIF
コンピュータの動作原理|コンピュータの仕組み|第二種 午前 まるごと要点|寺子屋|魔幻樹

取り出した命令を一時的に記憶しておくレジスタ。IRなどとも呼ばれる。
http://userdisk.webry.biglobe.ne.jp/013/235/62/N000/000/000/ALU.JPG
s.webry.info

メモリからやることを読み出すことをフェッチと言います。
メモリからフェッチしたやることを解析することをデコードと言います。

ステータスレジスタは、計算処理中に桁あふれを起こしたとか計算結果が0になったとか処理の状態を記憶するスレジスタです。

フラグレジスタとも言うらしいです。
決まったビット数の塊で、割込みOKだよとかエラーになったよとか計算結果がこうなったよとかをビットの値を変更することで記憶します。

演算,比較,およびデータの読み書きを行った結果が,自動的に設定される。
http://itpro.nikkeibp.co.jp/article/COLUMN/20070404/267385/zu06.jpg
itpro.nikkeibp.co.jp

CPUが演算命令を実行すると,指定されたデータ(汎用レジスタやメモリに置かれる場合が多い)をALUに送って演算を行い,結果を指定された記憶場所(汎用レジスタやメモリ)に保存します.このとき,演算結果が持つ特徴を,フラグ・レジスタ(またはステータス・レジスタ)と呼ばれる特別なレジスタに書き込みます
http://www.kumikomi.net/archives/2009/11/ep57hwsw/ep57hwsw_f05b.jpg
www.kumikomi.net

データベース管理システムにおけるロールバックとロールフォワード

ロールバックとロールフォワードの概要

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

DBMSをシステム障害発生後に再立上げするとき,前進復帰(ロールフォワード)すべきトランザクションと後退復帰(ロールバック)すべきトランザクションの組合せとして,適切なものはどれか。ここで,トランザクションの中で実行される処理内容は次のとおりとする。
http://www.ap-siken.com/kakomon/20_haru/img/67.gif

http://www.ap-siken.com/kakomon/20_haru/img/67a.gif
平成20年春期問67 DBMSの障害回復|応用情報技術者試験.com

知っ得用語

DBMSとは、データベース管理システムの略称です。

データベースを管理し、外部のソフトウェアからの要求に応えてデータベースの操作を行う専門のソフトウェア。
e-words.jp

チェックポイントとは、データファイルにバックアップした時のことです。

DBMSは,COMMIT時にはいったんログファイルに操作ログだけ残しておいて,データファイルへの変更反映は後でゆっくりやっているのです(このデータファイルへの反映処理をチェックポイントと呼びます)
http://image.gihyo.co.jp/assets/images/dev/serial/01/db-academy/0002/thumb/TH400_002.png

gihyo.jp

ログファイルについてはWALプロトコルに従ってディスクへ即時書出しされますが、メモリバッファの内容については入出力効率向上のために、一定の間隔ごとにまとめてディスクに反映する方式をとっています。このディスクと同期を取るタイミング「チェックポイント」といいます。
平成25年春期問16 チェックポイントで行っている処理|データベーススペシャリスト.com

ロールバックとは、障害発生時に正常だった状態まで戻すことです。

  • 対象になる障害 : 論理的障害トランザクション障害、コミット前に「やべっ間違った」っと気が付いた時
  • やり方
    1. ジャーナルファイルを使って処理をなかったコトにします。
    2. 処理前の状態に戻ります。
  • 英語 : roll back
  • 日本語 : 後退復帰

トランザクション処理の途中で障害が発生したときは、ジャーナルファイルを用いてトランザクション処理開始時点の状態に戻してデータの整合性を保つ処理
http://www.it-license.com/Database/Images/RollBack.gif
www.it-license.com

障害発生時に処理途上でコミットされていないトランザクションの処理をすべて取り消し、最初の時点に戻すことを意味する。
e-words.jp

知っ得用語

ジャーナルファイルとは、やった処理を記録したファイルです。
  • ログファイルって言われたりします。

トランザクション処理によって一体として処理されるべき更新情報をジャーナルに記録する。更新中に障害などで中断した場合には、ジャーナルの記録を元にすべての処理を取り消して元に戻したり、中途の処理を完了させて更新を確定したりする。
e-words.jp

ロールフォワードとは、障害発生時にバックアップする前の状態まで戻して処理をやり直すことです。

  • 対象になる障害 : 物理的障害、システム障害、媒体障害
  • やり方
    1. 壊れたものを壊れていないものに交換します。
    2. バックアップデータでチェックポイントまでデータを復元します。
    3. ジャーナルファイルで処理をやり直します。
    4. 壊れる前の状態に戻ります。
  • 英語 : roll forward
  • 日本語 : 前進復帰

バックアップファイルとジャーナルファイルを用いて、ハードディスクの障害発生以前の状態に復元する。
http://www.it-license.com/Database/Images/RollForward.gif
www.it-license.com

データベースの更新中に何らかの障害が発生した場合、データを障害発生の直前の記録までさかのぼり、そこから処理をあらためて開始することである。
www.weblio.jp

「よし、その障害は起きなかったことにしよう!」なデータベースの復元作業のこと。
http://wa3.i-3-i.info/img/data/1100/d001148-18.png
http://wa3.i-3-i.info/img/data/1100/d001148-19.png
http://wa3.i-3-i.info/img/data/1100/d001148-20.png
http://wa3.i-3-i.info/word11148.html

おわりに

このぺーじでは、理解できる説明をかき集めています。
さるでも理解できるようにいろんな説明をしてくれているサイト様に感謝感謝です。

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

前回の勉強内容

ponsuke-tarou.hatenablog.com

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

"受注明細"表は,どのレベルまでの正規形の条件を満足しているか。ここで,実線の下線は主キーを表す。
受注明細

受注番号 明細番号 商品コード 商品名 数量
015867 1 TV20006 20型テレビ 20
015867 2 TV24005 24型テレビ 10
015867 3 TV28007 28型テレビ 5
015868 1 TV28007 28型テレビ 8

ア. 第1正規形 イ. (正解)第2正規形 ウ. 第3正規形 エ. 第4正規形
出典 : 応用情報技術者試験 平成29年春期 午前 問27

正規化は、データベースを使いやすく整えることです。

同じ内容が複数のテーブルに分散していると、項目を更新するのが大変になるだけでなくディスク領域が浪費されてしまうので「データの重複」がなくなるように設計します。
各テーブルの関係性を保てるように「従属関係を定義」したりします。
このようにデータベースを作ることで「冗長なデータ」「矛盾する従属関係」を排除し、使いやすくデータを整理してデータベースを作っていくことを「正規化」といいます。
なので、正規化していないと使いにくいデータベースになります。

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

正規化していなくて、1行に複数データが何度も出てくるような状態を「非正規形」といいます。

例えば以下のようなデータは、1つの受注情報に[明細番号]で始まる明細情報が複数あって「非正規形」となります。

受注番号 受注日 明細番号 商品コード 商品名 数量 明細番号 商品コード 商品名 数量 明細番号 商品コード 商品名 数量
015867 2023-09-01 1 TV20006 20型テレビ 20 2 TV24005 24型テレビ 10 3 TV28007 28型テレビ 5
015868 2023-11-19 1 TV28007 28型テレビ 8

例えば以下のようなデータも、「非正規形」となり1行に複数の明細情報があって関係データベースに入れることもできません。

受注番号 受注日 明細番号 商品コード 商品名 数量
0158672023-09-01 1 TV20006 20型テレビ 20
2 TV24005 24型テレビ 10
3 TV28007 28型テレビ 5
015868 2023-11-19 1 TV28007 28型テレビ 8

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

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

第1正規形は、繰り返す項目をなくした状態です。

「1行に複数データが何度も出てくるような状態」を解消するだけで「第1正規形」になります。

例えば、「1つの受注情報に明細情報が複数」だったのを「明細情報1つ1つに受注情報をくっつける」と「第1正規形」になります。

受注番号 受注日 明細番号 商品コード 商品名 数量
015867 2023-09-01 1 TV20006 20型テレビ 20
015867 2023-09-01 2 TV24005 24型テレビ 10
015867 2023-09-01 3 TV28007 28型テレビ 5
015868 2023-11-19 1 TV28007 28型テレビ 8

なので、「繰返し属性が存在しない」にはなるのですが、「一部しか違わないレコードが半端なくある状態」となります。

第2正規形は、部分関数従属している項目を別テーブルへ切り出した状態です。

レコードを一意にすることができる項目の組み合わせを「候補キー」といいます。
この「候補キー」の1つの項目値が決まると他の項目値も決まる関係のことを「部分関数従属」といいます。
「繰り返す項目をなくした」だけの「第1正規形」から「部分関数従属している項目を別テーブルへ切り出した状態」が「第2正規形」となります。
「第1正規形」の例を見ると、{受注番号, 明細番号}が候補キーになり、[受注日]は[受注番号]に「部分関数従属」している項目です。
ponsuke-tarou.hatenablog.com
「部分関数従属」している[受注日]を別テーブルにして・・・

受注番号 受注日
015867 2023-09-01
015868 2023-11-19

元のテーブルで[受注番号]に外部キーを作って[受注日]を抜き出すことができ、「第2正規形」になります。

受注番号 明細番号 商品コード 商品名 数量
015867 1 TV20006 20型テレビ 20
015867 2 TV24005 24型テレビ 10
015867 3 TV28007 28型テレビ 5
015868 1 TV28007 28型テレビ 8

第3正規形は、推移的関数従属している項目を別テーブルへ切り出した状態です。

推移的関数従属とは、1つの項目値が決まると玉突き的に他の項目値も決まる関係のことです。
「第2正規形」の例を見ると、{受注番号, 明細番号}が決まると1つの明細に1つの商品なので[商品コード]が決まります。
[商品コード]が決まると[商品名]が決まります。
このように玉突き的に値が決まるのが「推移的関数従属」です。
「推移的関数従属」している[商品名]を別テーブルにして・・・

商品コード 商品名
TV20006 20型テレビ
TV24005 24型テレビ
TV28007 28型テレビ

元のテーブルで[商品コード]に外部キーを作って[商品名]を抜き出すことができ、「第3正規形」になります。

受注番号 明細番号 商品コード 数量
015867 1 TV20006 20
015867 2 TV24005 10
015867 3 TV28007 5
015868 1 TV28007 8

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

おわりに

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

信頼性設計のお話

前回の勉強内容

ponsuke-tarou.hatenablog.com

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

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

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

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

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

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

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

f:id:ponsuke_tarou:20220315202419j:plain
2021-08-08 豊島区の妙法湯

信頼設計の種類

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

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

こんな感じ

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

転倒すると自動的に消火するよう設計されている石油ストーブ
フェイルセーフ(fail safe)とは - IT用語辞典 e-Words

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

踏切遮断機が故障した場合
⇒重力により自らしゃ断かんが降りてくる(自重降下)機構により踏切通行者の安全を確保します。
http://www.signal.co.jp/products/railway/basic-knowledge/faq/2010/03/post-2.php

交通管制システムが故障したときには,信号機に赤色が点灯するようにする。
平成31年春期問47 フェールセーフの設計|応用情報技術者試験.com

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

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

こんな感じ

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

機能停止を部分的なものに留めることで、稼動完全にシステムが使えなくなることを防ぐことができる。
フォールバックの意味や定義 Weblio辞書

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

性能を落としたり機能を制限したりして限定的ながら稼動を続行すること。あるいは、利用したい機能が条件が悪く使えない場合に、代替となる機能に切り替えること。
フォールバック(縮退運転)とは - IT用語辞典 e-Words

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

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

こんな感じ

なるべく故障や障害が生じないようにする
フォールトアボイダンス(fault avoidance)とは - IT用語辞典 e-Words

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

高信頼素子の採用や高信頼化設計, 徹底的なテスト・検証, 品質管理体制の整備など
フォールトアボイダンスとは何? Weblio辞書

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

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

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

こんな感じ

ハードディスクにRAID1*1を採用して,MTBF*2で示される信頼性が向上するようにする。
平成31年春期問47 フェールセーフの設計|応用情報技術者試験.com

構成要素の一部が故障、停止などしても予備の系統に切り替えるなどして機能を保ち、正常に稼動させ続ける
フォールトトレランス(フォールトトレラント)とは - IT用語辞典 e-Words

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

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

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

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

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

こんな感じ

システム全体を停止させずに性能・機能を落として稼働を継続(縮退運転)するような仕組みや考え方
フェイルソフト(fail soft)とは - IT用語辞典 e-Words

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

故障が発生しても、全面停止とせず、必要最小限の機能を維持する。
http://mt-net.vis.ne.jp/ADFE_mail/0301.htm

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

ネットワークカードのコントローラを二重化しておき,片方のコントローラが故障しても運用できるようにする。
平成31年春期問47 フェールセーフの設計|応用情報技術者試験.com

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

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

こんな感じ

乾電池のプラスとマイナスを逆にすると,乾電池が装填できないようにする。
平成31年春期問47 フェールセーフの設計|応用情報技術者試験.com

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

フタを閉めないかぎりドラムが回転しない洗濯機
http://www.hamabiz.jp/content/view/1708/36/

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

使用者が誤った操作をしても危険な状況を招かないように、あるいはそもそも誤った操作をさせないようにと、配慮して設計
フールプルーフとは (fool proof): - IT用語辞典バイナリ

誤った操作や危険な使い方ができないような構造や仕掛け
フールプルーフ(foolproof)とは - IT用語辞典 e-Words

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


f:id:ponsuke_tarou:20220315202717j:plain
2021-08-21 足立区の江北湯

違いがわかりにくいのでもう一度

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

フェールセーフは必ず起きる誤作動・故障を考えて設計する手法ですが、「フールプルーフ」は事前に誤作動・故障を防ぐために配慮した設計思想です。
Loading...

フェールセーフは「ものは壊れる」「発生頻度を下げる」に対応する代表的な安全設計手法です。「人は間違える」「発生頻度を下げる」に対応する安全設計手法の代表はフールプルーフです。
フェールセーフとは:安全設計手法(その1) - ものづくりドットコム

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

排熱ファンが故障してしまったとき、フェールソフトの考え方であれば、あらかじめ部品を冗長的に構成しておき、故障部分を切り離して運用を続行できることを第一に考えます。フェールセーフであれば、熱による他の部品への影響や、火災発生といった事態を防ぐようシステムを停止するなど、安全性を第一に考えます。
http://mt-net.vis.ne.jp/ADFE_mail/0301.htm

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

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

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

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

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

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

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

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

f:id:ponsuke_tarou:20190823235418j:plain
黒姫山

次回の勉強内容

ponsuke-tarou.hatenablog.com

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

  • 環境
    • OS : Windows10 64bit
    • インストールするもの : TortoiseSVN
    • 使う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に作ったゲストOSにRSA鍵の認証で接続できるように設定する

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

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

今回使うのは、公開鍵暗号方式です。

www.atmarkit.co.jp

設定ファイルを使って設定します。

sshd_configのバックアップを取ります。

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

# rootとしてログインします。
$ ssh root@192.168.0.6
root@192.168.0.6s password: 
Last login: Fri Oct 20 15:35:12 2017 from 192.168.56.1

# sshd_configの存在を確認します。対象の設定ファイルは、ssh_configではなくsshd_configです。
$ ls -la /etc/ssh/*config*
-rw-r--r--. 1 root root 2276 1020 06:52 /etc/ssh/ssh_config
-rw-------. 1 root root 4358 1018 23:50 /etc/ssh/sshd_config
-rw-------. 1 root root 3907 1020 06:52 /etc/ssh/sshd_config.rpmnew

# ファイルをコピーしてバックアップを取ります。
$ cp /etc/ssh/ssh_config /etc/ssh/ssh_config.20170731bak

# ファイルを確認します。
$ ls -la /etc/ssh/*config*
-rw-r--r--. 1 root root 2276 1020 06:52 /etc/ssh/ssh_config
-rw-------. 1 root root 4358 1018 23:50 /etc/ssh/sshd_config
-rw-------. 1 root root 4361  81 00:12 /etc/ssh/sshd_config.20170731bak
-rw-------. 1 root root 3907 1020 06:52 /etc/ssh/sshd_config.rpmnew

sshd_configを編集します。

# viエディタで開きます。
$ vi /etc/ssh/ssh_config
#       $OpenBSD: sshd_config,v 1.93 2014/01/10 05:59:19 djm Exp $
<省略>
# Authentication:

#LoginGraceTime 2m
#PermitRootLogin yes
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

RSAAuthentication yes #<------------------------ コメントアウトを外します(RAS認証を許可する)。
PubkeyAuthentication yes #<------------------------ コメントアウトを外します(公開鍵認証を許可する)。

# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
# but this is overridden so installations will only check .ssh/authorized_keys
AuthorizedKeysFile      .ssh/authorized_keys #<------------------------ コメントアウトを外します(公開鍵登録ファイルのパスと名前)。

#AuthorizedPrincipalsFile none

#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody

# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
RhostsRSAAuthentication no #<------------------------ コメントアウトを外します(RHosts認証を許可しない)。
# similar for protocol version 2
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# RhostsRSAAuthentication and HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
#PermitEmptyPasswords no
PasswordAuthentication yes
<省略>
# 保存して閉じます。
:wq

# sshdサービスを再起動します。
$ 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

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

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

http://e-words.jp/w/%E3%83%AD%E3%82%B1%E3%83%BC%E3%83%AB.htmle-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
調査方法③ メッセージを完コピしてググる

MacのVirtualBoxに作ったゲストOSにブリッジアダプターを設定する

MacVirtualBoxに作ったゲストOSへホストOSから接続できるようにしたので、他のPCからもアクセスできるようにします。
ponsuke-tarou.hatenablog.com

  • 目的 : Linux環境でSSHの鍵作成から設定まで勉強したい!
  • 環境
    • ホストOS : macOS Sierra Version10.12.4
    • VirtualBox : Version 5.1.22 r115126 (Qt5.6.2)
    • ゲストOSへ接続したいOS : Windows10

これまで設定してきたNAT + ホストオンリーアダプターで、

  • ゲストOSでインターネットに接続できる
  • ホストOSからゲストOSに接続できる

という状態でした。

しかし、これではホストOSではない「ローカルネットワーク*1にあるPC」からの接続はできません。
そこで、ネットワークをブリッジアダプターにして「ローカルネットワーク」内にあたかもゲストOSが他のPCのように接続している状態を作り、「ローカルネットワークにあるPC」からの接続を試みます。

■ブリッジアダプター
  ・ゲストOSがホストOSのネットワーク設定をブリッジしてホストOSのネットワークを使用する
   (ゲストOSがホストOSと同一のネットワークに存在するかのように動作する)
  ・ホストOSからゲストOSへの接続可能
  ・インターネットの相互間通信可能(外部ネットワークと直接つながる)
  ・ゲストOSも物理的にIPアドレスを利用する(ホストOSのネットワークからゲストOSが見える)
  ・VirtualBoxのブリッジは少々動作が不安定なので注意が必要
  ・柔軟性が高いがセキュリティの脅威にさらされやすい
http://blog-imgs-79.fc2.com/3/k/a/3ka2w/nw003.png
http://blog-imgs-79.fc2.com/3/k/a/3ka2w/nw004.png
Virtual Boxのネットワーク設定 - ぐ~だらびより。

ブリッジアダプタを設定します。

設定に使うものを準備します。

qiita.com
www.atmarkit.co.jp

Oracle VM Managerで設定します。

  1. Oracle VM ManagerでゲストOSを選択して[Network]リンクを押下します。f:id:ponsuke_tarou:20170611125439p:plain
  2. [Attached to:]で「Bridged Adapter」を選択して[OK]ボタンを押下します。f:id:ponsuke_tarou:20170611125806p:plain

ゲストOSを起動して状態を確認します。

$ ssh mana@192.168.56.202

$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:67:e7:fc brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.9/24 brd 192.168.0.255 scope global dynamic enp0s3
       valid_lft 86398sec preferred_lft 86398sec
    inet6 2408:210:9080:4000:a00:27ff:fe67:e7fc/64 scope global mngtmpaddr dynamic 
       valid_lft 2591936sec preferred_lft 604736sec
    inet6 fe80::a00:27ff:fe67:e7fc/64 scope link 
       valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:ce:e2:cd brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.202/24 brd 192.168.56.255 scope global enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fece:e2cd/64 scope link 
       valid_lft forever preferred_lft forever

$ nmcli c
名前    UUID                                  タイプ          デバイス 
enp0s3  862d8f79-a10c-35d8-8b38-6d982fca83ce  802-3-ethernet  enp0s3   
enp0s8  0cf4cb12-cd52-463e-91eb-5990197860b6  802-3-ethernet  enp0s8   

$ nmcli d
デバイス  タイプ    状態      接続   
enp0s3    ethernet  接続済み  enp0s3 
enp0s8    ethernet  接続済み  enp0s8 
lo        loopback  管理無し  --    

ブリッジアダプター用のConnectionを作成します。

# Connectionを追加します。
$ sudo nmcli c add type bridge ifname br0
接続 'bridge-br0' (b720a4bd-2dd8-462d-b17d-8967805d64c4) が正常に追加されました。

$ nmcli c
名前        UUID                                  タイプ          デバイス 
bridge-br0  b720a4bd-2dd8-462d-b17d-8967805d64c4  bridge          br0      
enp0s3      862d8f79-a10c-35d8-8b38-6d982fca83ce  802-3-ethernet  enp0s3   
enp0s8      0cf4cb12-cd52-463e-91eb-5990197860b6  802-3-ethernet  enp0s8   

$ nmcli d
デバイス  タイプ    状態                       接続       
enp0s3    ethernet  接続済み                   enp0s3     
enp0s8    ethernet  接続済み                   enp0s8     
br0       bridge    接続中(IP 設定を取得中)  bridge-br0 
lo        loopback  管理無し                   --    

ifnameでインターフェースを指定した場合

/etc/sysconfig/network-scripts/ifcfg-bridge-のファイルが作成される。
DEVICEのエントリ: ifnameの値
NAMEのエントリ: bridge-になる。
STP=yesになる
nmcliでブリッジインターフェースを作成する2 · GitHub

追加したブリッジアダプター用のConnectionを設定します。

# STPを止めます。
$ sudo nmcli c modify bridge-br0 stp no

# IPv6は使わない設定にします。
$ sudo nmcli c modify bridge-br0 ipv6.method ignore

# IPv4を固定のIPアドレスにします。
$ sudo nmcli c modify bridge-br0 ipv4.method manual ipv4.addresses '192.168.0.6/24' ipv4.gateway '192.168.0.1' ipv4.dns '8.8.8.8'

# NetworkManagerを再起動します。
$ sudo systemctl restart NetworkManager

# 状態を確認します。
$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:67:e7:fc brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.9/24 brd 192.168.0.255 scope global dynamic enp0s3
       valid_lft 86393sec preferred_lft 86393sec
    inet6 2408:210:9080:4000:a00:27ff:fe67:e7fc/64 scope global mngtmpaddr dynamic 
       valid_lft 2591618sec preferred_lft 604418sec
    inet6 fe80::a00:27ff:fe67:e7fc/64 scope link 
       valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:ce:e2:cd brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.202/24 brd 192.168.56.255 scope global enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fece:e2cd/64 scope link 
       valid_lft forever preferred_lft forever
4: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000
    link/ether 02:ca:2b:d2:32:7d brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.6/24 brd 192.168.0.255 scope global br0
       valid_lft forever preferred_lft forever

$ nmcli c
名前        UUID                                  タイプ          デバイス 
bridge-br0  b720a4bd-2dd8-462d-b17d-8967805d64c4  bridge          br0      
enp0s3      862d8f79-a10c-35d8-8b38-6d982fca83ce  802-3-ethernet  enp0s3   
enp0s8      0cf4cb12-cd52-463e-91eb-5990197860b6  802-3-ethernet  enp0s8   

$ nmcli d
デバイス  タイプ    状態      接続       
br0       bridge    接続済み  bridge-br0 
enp0s3    ethernet  接続済み  enp0s3     
enp0s8    ethernet  接続済み  enp0s8     
lo        loopback  管理無し  --         

$ sudo cat /etc/sysconfig/network-scripts/ifcfg-bridge-br0 
DEVICE=br0
STP=no
TYPE=Bridge
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=bridge-br0
UUID=b720a4bd-2dd8-462d-b17d-8967805d64c4
ONBOOT=yes
IPADDR=192.168.0.6
PREFIX=24
GATEWAY=192.168.0.1
DNS1=8.8.8.8

www.infraexpert.com

IPADDRには、ゲストPCに固定で割り当てたいIPアドレスを指定します。ホストPCやLAN上の他のPCとは異なる値を設定してください。<省略>
BOOTPROTOはnoneにすることで動的なIPアドレス割り当てがされないようになります。
ja.stackoverflow.com

バイスにはそれぞれ独自の設定ファイルがあるため、管理者は、各インターフェースがどう機能するか個別に制御できます。
9.2. インターフェース設定ファイル

奴隷を作ります。

# 奴隷用のConnectionを作成します。
$ sudo nmcli c add type bridge-slave ifname enp0s3 master bridge-br0
接続 'bridge-slave-enp0s3' (f3a0186b-e1ea-439d-84a8-5589863feb91) が正常に追加されました。

# NetworkManagerを再起動します。
$ sudo systemctl restart NetworkManager

# 状態を確認します。
$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:67:e7:fc brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.9/24 brd 192.168.0.255 scope global dynamic enp0s3
       valid_lft 86396sec preferred_lft 86396sec
    inet6 2408:210:9080:4000:a00:27ff:fe67:e7fc/64 scope global mngtmpaddr dynamic 
       valid_lft 2591879sec preferred_lft 604679sec
    inet6 fe80::a00:27ff:fe67:e7fc/64 scope link 
       valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:ce:e2:cd brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.202/24 brd 192.168.56.255 scope global enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fece:e2cd/64 scope link 
       valid_lft forever preferred_lft forever
4: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000
    link/ether 02:ca:2b:d2:32:7d brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.6/24 brd 192.168.0.255 scope global br0
       valid_lft forever preferred_lft forever

$ nmcli c
名前                 UUID                                  タイプ          デバイス 
bridge-br0           b720a4bd-2dd8-462d-b17d-8967805d64c4  bridge          br0      
enp0s3               862d8f79-a10c-35d8-8b38-6d982fca83ce  802-3-ethernet  enp0s3   
enp0s8               0cf4cb12-cd52-463e-91eb-5990197860b6  802-3-ethernet  enp0s8   
bridge-slave-enp0s3  f3a0186b-e1ea-439d-84a8-5589863feb91  802-3-ethernet  --       

$ nmcli d
デバイス  タイプ    状態      接続       
br0       bridge    接続済み  bridge-br0 
enp0s3    ethernet  接続済み  enp0s3     
enp0s8    ethernet  接続済み  enp0s8     
lo        loopback  管理無し  --   

# 不要となった既存のConnectionを削除します。
$ sudo nmcli c del enp0s3
接続 'enp0s3' (862d8f79-a10c-35d8-8b38-6d982fca83ce) が正常に削除されました。

# NetworkManagerを再起動します。
$ sudo systemctl restart NetworkManager

# ここでうまく設定が反映されない場合はゲストOSを再起動します。

# 状態を確認します。
$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP qlen 1000
    link/ether 08:00:27:67:e7:fc brd ff:ff:ff:ff:ff:ff
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:ce:e2:cd brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.202/24 brd 192.168.56.255 scope global enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fece:e2cd/64 scope link 
       valid_lft forever preferred_lft forever
4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
    link/ether 08:00:27:67:e7:fc brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.6/24 brd 192.168.0.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 2408:210:9080:4000:a00:27ff:fe67:e7fc/64 scope global mngtmpaddr dynamic 
       valid_lft 2591972sec preferred_lft 604772sec
    inet6 fe80::a00:27ff:fe67:e7fc/64 scope link 
       valid_lft forever preferred_lft forever

$ nmcli c
名前                 UUID                                  タイプ          デバイス 
bridge-br0           b720a4bd-2dd8-462d-b17d-8967805d64c4  bridge          br0      
bridge-slave-enp0s3  f3a0186b-e1ea-439d-84a8-5589863feb91  802-3-ethernet  enp0s3   
enp0s8               0cf4cb12-cd52-463e-91eb-5990197860b6  802-3-ethernet  enp0s8   

$ nmcli d
デバイス  タイプ    状態      接続                
br0       bridge    接続済み  bridge-br0          
enp0s3    ethernet  接続済み  bridge-slave-enp0s3 
enp0s8    ethernet  接続済み  enp0s8              
lo        loopback  管理無し  -- 

こちらを参考にさせて頂きました。
qiita.com

e-words.jp

ホストOSからブリッジアダプターのIPアドレスで接続してみます。

$ ssh mana@192.168.0.6
mana@192.168.0.6s password: 
Last login: Tue Oct 24 01:46:41 2017 from 192.168.56.1

$ nmcli c
名前                 UUID                                  タイプ          デバイス 
bridge-br0           b720a4bd-2dd8-462d-b17d-8967805d64c4  bridge          br0      
bridge-slave-enp0s3  f3a0186b-e1ea-439d-84a8-5589863feb91  802-3-ethernet  enp0s3   
enp0s8               0cf4cb12-cd52-463e-91eb-5990197860b6  802-3-ethernet  enp0s8  

接続できました。

ローカルネットワークにあるWindows10からpingで確認してみます。

ping 192.168.0.6

192.168.0.6 に ping を送信しています 32 バイトのデータ:
192.168.0.6 からの応答: バイト数 =32 時間 =94ms TTL=64
192.168.0.6 からの応答: バイト数 =32 時間 =100ms TTL=64
192.168.0.6 からの応答: バイト数 =32 時間 =19ms TTL=64
192.168.0.6 からの応答: バイト数 =32 時間 =34ms TTL=64

192.168.0.6 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 19ms、最大 = 100ms、平均 = 61ms

つながりました。

*1:今回は、「お家で使っているLANにつながっている」ということです。

MacのVirtualBoxに作ったゲストOSにホストオンリーアダプターを設定する

MacVirtualBox仮想マシンを作ってインターネットに接続できることを確認できたのでホストOSからアクセスできるようにします。
ponsuke-tarou.hatenablog.com

ホストOSからゲストOSへアクセスできるようにホストオンリーアダプタを設定します。

VirtualBox仮想マシンではデフォルトでNAT*1に設定されており、DHCPIPアドレスなども自動的に割り当てられるため何もしないでもインターネットに接続できました。
しかし、この状態ではホストOSからはアクセスできないので、さまざまな検証を行うための環境としては不十分です。
gihyo.jp

■ホストオンリーアダプター
  ・ゲストOSとホストOS間のみ通信ができるネットワーク
  ・外部との通信はできない
http://blog-imgs-79.fc2.com/3/k/a/3ka2w/nw007.png
Virtual Boxのネットワーク設定 - ぐ~だらびより。

VirtualBoxにホストオンリーネットワークを作ります。

  1. Oracle VM VirtualBox Managerのメニューにある[VirtualBox] > [Preference...]を選択します。f:id:ponsuke_tarou:20170607214243p:plain
  2. [Network] > [Host-only Network] > [+]アイコンを選択すると「vboxnet0」が追加されます。f:id:ponsuke_tarou:20170607214817p:plain
  3. ドライバアイコンを選択してダイアログを開きます。f:id:ponsuke_tarou:20170607214912p:plain
  4. [DHCP Server] > [Enable Server]チェックボックにチェックを入れます。
  5. 各パラメータに値を設定し、[OK]ボタンを押下して設定を完了します。f:id:ponsuke_tarou:20170607215404p:plain

サーバーアドレス:VirtualBoxに作成されるDHCPサーバーのIPアドレスを指定
サーバーマスク:ゲストOSにDHCPで割り当てるIPアドレスのネットマスクを指定
アドレス下限:ゲストOSにDHCPで割り当てるIPアドレスの範囲の最小値を指定
アドレス上限:ゲストOSにDHCPで割り当てるIPアドレスの範囲の最大値を指定
VirtualBox CentOS6.7 64bitでNAT、ホストオンリーアダプターを使用 | kakiro-web カキローウェブ

Oracle VM VirtualBox Managerで設定します。

この時点で仮想マシンが起動している場合は停止してから追加します。

$ shutdown -h now
  1. Oracle VM VirtualBox Managerから仮想マシンを選択して右側のウィンドウから[Network]リンクを押下してダイアログを開きます。f:id:ponsuke_tarou:20170607220159p:plain
  2. [Adapter 2] > [Enable Network Adapter]チェックボックにチェックを入れます。
  3. [Attached to]で「Host-only Adapter」を選択します。(Host-only Adapterが複数無ければ[Name]に先程作成した「vboxnet0」が表示されるはず)。
  4. [OK]ボタンを押下してダイアログを閉じます。f:id:ponsuke_tarou:20170607220847p:plain
  5. ホストオンリーアダプタが追加されました。f:id:ponsuke_tarou:20170607221039p:plain

ゲストOSの状態を確認します。

  1. ゲストOSを起動してログインします。
  2. 「ip addr show」「nmcli c(connection)」「nmcli d(device)」で現状を確認します。
    • enp0s8がホストオンリーアダプターです。f:id:ponsuke_tarou:20171023214214p:plain
  3. ホストOSから接続できることを確認します。
    • ホストオンリーアダプターのIPアドレスはまだ固定されていないので変わることがあります。

ホストOSからゲストOSへ接続してみます。

$ ping 192.168.56.201
PING 192.168.56.201 (192.168.56.201): 56 data bytes
64 bytes from 192.168.56.201: icmp_seq=0 ttl=64 time=0.541 ms
64 bytes from 192.168.56.201: icmp_seq=1 ttl=64 time=0.494 ms
64 bytes from 192.168.56.201: icmp_seq=2 ttl=64 time=0.337 ms
<省略>
$ ssh mana@192.168.56.201
mana@192.168.56.201s password: 
Last login: Mon Oct 23 21:39:48 2017
$ nmcli c
名前        UUID                                  タイプ          デバイス 
enp0s3      862d8f79-a10c-35d8-8b38-6d982fca83ce  802-3-ethernet  enp0s3   
有線接続 1  320cd23e-b9a4-324d-b0ff-3dd16b0544db  802-3-ethernet  enp0s8 

NetworkManagerを使って新しいConnectionを作成します。

前回は、「nmtuiコマンドを使ってGUIで設定」をやったので
今回は、「nmcliコマンドを使って設定」する方法にします。

# 「enp0s8」Connectionを追加します。
$ sudo nmcli c add type ethernet con-name enp0s8 ifname enp0s8
接続 'enp0s8' (0cf4cb12-cd52-463e-91eb-5990197860b6) が正常に追加されました。

# Connectionが作成されたことを確認します。
$ sudo ls -la /etc/sysconfig/network-scripts/ifcfg-enp0s*
-rw-r--r--. 1 root root 226 1023 21:20 /etc/sysconfig/network-scripts/ifcfg-enp0s3
-rw-r--r--. 1 root root 282 1023 22:36 /etc/sysconfig/network-scripts/ifcfg-enp0s8
$ nmcli c
名前        UUID                                  タイプ          デバイス 
enp0s3      862d8f79-a10c-35d8-8b38-6d982fca83ce  802-3-ethernet  enp0s3   
有線接続 1  320cd23e-b9a4-324d-b0ff-3dd16b0544db  802-3-ethernet  enp0s8   
enp0s8      0cf4cb12-cd52-463e-91eb-5990197860b6  802-3-ethernet  --       
$ nmcli d
デバイス  タイプ    状態      接続       
enp0s3    ethernet  接続済み  enp0s3     
enp0s8    ethernet  接続済み  有線接続 1 
lo        loopback  管理無し  --    

# IPv4を手動に設定します。
$ sudo nmcli c modify enp0s8 ipv4.method manual

# IPアドレスを固定します。
$ sudo nmcli c modify enp0s8 ipv4.addresses '192.168.56.202/24' ipv4.dns '8.8.8.8'

# IPv6は使わない設定をします。
$ sudo nmcli c modify enp0s8 ipv6.method ignore

# NetworkManagerを再起動します。
$ sudo systemctl restart NetworkManager


# なぜか既存の「有線接続 1 」のNIC名が「enp0s8」になりました・・・。
$ nmcli c
名前    UUID                                  タイプ          デバイス 
enp0s3  862d8f79-a10c-35d8-8b38-6d982fca83ce  802-3-ethernet  enp0s3   
enp0s8  cb2d1cde-9064-4dfb-89c2-3a6246ce916e  802-3-ethernet  enp0s8   
enp0s8  0cf4cb12-cd52-463e-91eb-5990197860b6  802-3-ethernet  --       
$ nmcli d
デバイス  タイプ    状態      接続   
enp0s3    ethernet  接続済み  enp0s3 
enp0s8    ethernet  接続済み  enp0s8 
lo        loopback  管理無し  --     

# 既存の「enp0s8(有線接続 1 )」をNIC名では区別がつかないのでUUIDで削除します。
$ sudo nmcli c del cb2d1cde-9064-4dfb-89c2-3a6246ce916e
接続 'enp0s8' (cb2d1cde-9064-4dfb-89c2-3a6246ce916e) が正常に削除されました。

# 当然ですが、IPアドレスが変わったのでここでホストOSとの接続が一旦切れます。
# 再び新しく設定したIPアドレスで接続します。
$ ssh mana@192.168.56.202
The authenticity of host '192.168.56.202 (192.168.56.202)' can't be established.<------------- ☆'
ECDSA key fingerprint is SHA256:j+mhEbwrkV5GaVU8gat34VZs2A4+q4q8HaKjOg9m33I.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.56.202' (ECDSA) to the list of known hosts.
mana@192.168.56.201s password: 
Last login: Mon Oct 23 23:29:33 2017

# NetworkManagerを再起動します。
$ sudo systemctl restart NetworkManager

☆で表示されたメッセージは初回接続(今回はIPアドレスが変わって初回)でしか出ません。
SSHで接続するとホストOS側の公開鍵の有無を確認し、公開鍵がないことからホストOSの~/.ssh/known_hostsファイルに設定するかを尋ねられています。
ここで「yes」を入力することでknown_hostsに公開鍵を保存し、次回接続からはメッセージは表示されなくなるのです。
http://www.turbolinux.co.jp/products/server/11s/user_guide/sshconnect.html

今回使われたのはECDSA*2というデジタル署名です。

やり方はこちらを参考にさせて頂きました。

ゲストOSの状態を確認します。

$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:67:e7:fc brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3
       valid_lft 86387sec preferred_lft 86387sec
    inet6 fe80::a00:27ff:fe67:e7fc/64 scope link 
       valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:ce:e2:cd brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.202/24 brd 192.168.56.255 scope global enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fece:e2cd/64 scope link 
       valid_lft forever preferred_lft forever
$ nmcli c
名前    UUID                                  タイプ          デバイス 
enp0s3  862d8f79-a10c-35d8-8b38-6d982fca83ce  802-3-ethernet  enp0s3   
enp0s8  0cf4cb12-cd52-463e-91eb-5990197860b6  802-3-ethernet  enp0s8   
$ nmcli d
デバイス  タイプ    状態      接続   
enp0s3    ethernet  接続済み  enp0s3 
enp0s8    ethernet  接続済み  enp0s8 
lo        loopback  管理無し  --   

設定できました。

MacのVirtualBoxに作ったゲストOSにNATを設定する

MacVirtualBox仮想マシンを作ってCentOSをインストールしたので仮想マシンのネットワークを確認します。
ponsuke-tarou.hatenablog.com

NATを設定することでゲストOSからホストOSを利用してインターネットに接続できるようにします。

http://blog-imgs-79.fc2.com/3/k/a/3ka2w/nw002.png
Virtual Boxのネットワーク設定 - ぐ~だらびより。

ネットワークを設定してみます。

Oracle VM VirtualBox Managerで設定します。

  1. [Setting]を押下します。https://camo.qiitausercontent.com/3232c87ebdb022cf2f99ad5e110a26ead94702fd/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3135393736312f39373331616536372d383435612d633537642d663361642d3533666632646438383362332e706e67
  2. [Network]を押下します。
  3. [Adapter 1] > [Attached to:] > 「NAT」を選択します(何も設定していないとデフォルトでNATになっています)。
  4. [OK]を押下します。

ゲストOSの状態を確認します。

  1. VirtualBox仮想マシンを起動してログインします。
  2. 「ip addr show」「nmcli c(connection)」「nmcli d(device)」で現状を確認します。

enp0s3がNATです。
f:id:ponsuke_tarou:20171023205847p:plain

IPアドレスは、DHCPなのでグローバルのアドレスではありません。

インストール時にネットワーク接続の設定を行っていないため、DHCP*1を使って自動的にIPアドレスが取得されるようになっています。
gihyo.jp

NetworkManagerを使って設定します。

CentOS7においてネットワークの設定方法はいくつかあります。

今回は、「nmtuiコマンドを使ってGUIで設定する」やり方です。

  1. 「nmtui」コマンドを打って[NetworkManager TUI]画面を起動します。f:id:ponsuke_tarou:20171023210039p:plain
  2. ここからは矢印キーとEnterで操作します。
  3. [Edit a connection] > [enp0s3]を選択します([enp0s3]がない場合は[Add]で作ります)。https://server-setting.info/images/sakura/os/centos/network2/net2_s.png
  4. 以下を設定します。f:id:ponsuke_tarou:20171023210939p:plain
    • IPv4 CONFIGURATION : Automatic
    • IPv4 CONFIGURATION : Ignore
    • Automatically connect : X(スペースキーでチェックをON/OFFできます)
  5. [OK] > [Back] > [Quit]を押下して画面を閉じます。
  6. Network Managerを再起動します。
$ sudo systemctl restart NetworkManager

設定を確認します。

  1. /etc/sysconfig/network-scripts配下のifcfg-eth*ファイルを確認します。f:id:ponsuke_tarou:20171023211452p:plain
    • [ONBOOT]が「no」になっている場合
      • インターネットに接続できません。[NetworkManager TUI]画面で[Automatically connect] にチェックが入っているか確認します。
  2. curl」コマンドでインターネットに接続できることを確認します。
$ curl ifconfig.me
// ちょっと時間がかかりますがインターネットに繋がっていればグローバルIPアドレスが取得できます。