Cwらぼっちゃ - IT技術研究ノート -

IT技術に関する記事を掲載します。

HAZOP

はじめに

HAZOP(HAZard and OPerability studies)は、プロセスや操作に潜んでいる外れ(リスク)を抽出するために用いるリスク評価手法の一つです。 HAZOPは当初、化学プロセスを対象としたものでしたが、現在では他の分野においてもその有効性が認められ、様々な分野で利用されています。

ソフトウェア開発の分野でもHAZOPを利用することで安全なシステム作りに役立てる事が可能です。 主に設計で利用しますが、開発やテストにもHAZOPが有効です。


誘導語

HAZOPはリスクを気付き易くするための誘導語が用意されており、特定のプロセスや操作をその誘導語に従って「外れ、原因、対策」を洗い出します。

誘導語には「無、逆、他、大、小、類、部、早、遅、前、後」の11語が定義されており、それぞれにグループ(分類)があります。

①「無、逆」

存在と方向を示した分類で、その逆現象を表します。

【外れの表現】
[無]:質または量が無い
[逆]:質または量が反対方向

②「他」

[逆]以外の方向とその他のものすべてを表します。

【外れの表現】
[他]:質または量がその他の方向

③「大、小」

空間の量を示した分類で、その逆現象を表します。

【外れの表現】
[大]:量的な増大 [小]:量的な減少

④「類、部」

空間の質を示した分類で、その逆現象を表します。

【外れの表現】
[類]:質的な増大 [部]:質的な減少

⑤「早、遅」

時間の量を示した分類で、その逆現象を表します。

【外れの表現】
[早]:時間が早い [遅]:時間が遅い

⑥「前、後」

時間の質を示した分類で、その逆現象を表します。

【外れの表現】
[前]:順番が前 [後]:順番が後


作業表

HAZOPを用いて評価を行うために作業表を作成します。作業表は誘導語を軸として評価に必要な要素を定義し、エクセル等でテンプレートを作成します。

f:id:CwLab:20190906154945p:plain

ここでは評価に必要な最低限の要素(原因、対策、残留リスク)を定義しました。 システムやプロジェクトの特性に合わせて要素は整理してください。


実際に評価してみる

それでは作成した作業表に従って評価を行います。今回は「DBに登録された宛先に毎日12時にメールを送信する」という対象について評価を行います。

f:id:CwLab:20190906155741p:plain

ありふれた内容ですが、思いつくリスクを出してみました。 考えた上でどうしても思いつかない箇所は「なし」と記載しています。

まだまだリスクはあると思いますが、あまり時間を欠けても出ないものは出ません。 1時間(長くとも2時間)が良い目安だと思います。上記の作業表で30分~1時間ほどでした。

作業表は作成して完了ではありません。 作成した作業表を他者やチームとレビューを行い、各リスクについて精査する必要があります。 また、Wikiによると、設計の前,設計中,設計後の三度実施するとよいとの記載もあります。

はじめは慣れないと思いますが、何度か実践すると自身の中で評価視点が積み重なってやり易くなると思います。


評価のポイント

  • 評価対象の流れと登場人物(物)を図に表してみる。
  • まずは評価対象の流れでなく登場人物(物)から外れを洗い出す。
  • 思いつくことをひとまずあげる。
  • ありえないことでも恥ずかしがらずに記載する。
  • 誘導語の対称性に着目して外れを洗い出す。
  • 1つの外れに複数の原因があることもある。
  • 1つの事象が複数の外れの原因になっていることもある。
  • どこまで評価すれば分からない場合はルールを設ける(制限時間を設ける、無大小だけでも評価するなど)。

まとめ

今回は特定のプロセスについて評価してみましたが、HAZOPはプログラムの製造やテストケースの洗い出し等にも有効です。障害の原因が分からない場合にも、対象のプロセスを誘導語にあてはめるだけでも効果的かと思います。

HAZOPはだれでもイメージしやすい誘導語が用意されており、難しい知識がなくとも取り入れやすい評価手法です。評価には専門的な知識も必要ですが、知らないからこそ気付けるリスクもあるかもしれません。よりよいシステムを構築するためにも、ぜひ取り入れてみてはいかがでしょう。


参考文献・URL

・HAZOP - Wikipedia
 https://ja.wikipedia.org/wiki/HAZOP
・HAZOP 基礎知識 | HAZOP&プラント安全促進会
 http://hazop.jp/hazop_basic.html
・効率的なHAZOPの進め方
 https://qiita.com/kaizen_nagoya/items/2b8eae196945b7976446

Vue.jsってなに?

Vue.js(ヴュージェイエス)、またはVueは、Webアプリケーションにおけるユーザーインターフェイスを構築するための、オープンソースJavaScriptフレームワークです。


特徴

・Vue.jsは構造がシンプルなため学習コストが低く、初心者、経験者問わず、すぐに開発に使用することができる

・Vue.js独自の規格やルールも少ないため、他のフレームワークよりも自分の好きなやり方でアプリ開発を行うことが可能

・高機能なシングルページアプリケーション(SPA)を構築することが可能

・ディレクティブによって開発スピードを早められる

コンポーネント指向のため、再利用性が高くなり、デザインと技術の作業の簡易化が可能


環境構築の手順

それでは環境構築の手順について書いていきます。
※いくつか環境構築について書いているサイトはあったのですが、バージョンが古かったり、一つの記事に複数の構築方法が書いてあったりと見づらかったので1から書いていきたいと思います。

手順としては大きく分けて2つあります。
 ①Vue.jsを入れるためのyarnのインストール
 ②Vue.jsのインストール

PowerShellスクリプトの実行を一時的に許可する

PowerShellで行っていくので、WindowメニューからWindows PowerShellを選択、管理者権限で実行します。
デフォルトではスクリプトの許可がされていないので許可します。この許可はこのシェルでだけ有効です。

PS C:\windows\system32> Set-ExecutionPolicy RemoteSigned -Scope Process

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): y

実行ポリシーを変更するか聞かれるので「はい(y)」で答えます。

◎ scoopをインストールする

PS C:\windows\system32> iex (new-object net.webclient).downloadstring('https://get.scoop.sh')

Scoop was installed successfully! が表示されたらOK。

◎ scoopでNode.jsをインストールする

PS C:\windows\system32> scoop install nodejs

'7zip'がインストールされた後、Node.jsのインストールが開始されます。
'nodejs' (12.7.0) was installed successfully! が表示されたらOK。
※()内はバージョンです

◎ scoopでyarnをインストールする

PS C:\windows\system32> scoop install yarn

'yarn' (1.17.3) was installed successfully! が表示されたらOK。
※()内はバージョンです

◎ Node.jsとyarnがインストールされているか確認する

念のため、ここまできちんとインストールできているか確認しましょう。

PS C:\windows\system32> node -v
v12.7.0
PS C:\windows\system32> yarn -v
1.17.3

◎ Vue.jsをインストールする

さあ!では今回の目玉Vue.jsをインストールしていきましょう。

PS C:\windows\system32> yarn global add @vue/cli

ここで出てきたvue-cliについて少し補足です。
vue-cliは、Vue.js を含んだ各種のテンプレートに応じてスキャフォールディング (ひな形作成) をおこなってくれます。あらかじめ必要なライブラリが組み込まれた状態にしてくれるので、あとは必要に応じてソースファイルを修正していくだけでいいようになります。 標準のテンプレートとして webpack, webpack-simple, browserify などがあり、 webpack テンプレートは E2E テストなどもサポートするかなり高機能なもののようです。


こちらもインストールされたか確認しておきましょう。

PS C:\windows\system32> vue --version
3.9.3

※私がインストールしたときはver 3.9.3でした

さて、これでVueプロジェクトを作成する環境は整いました!
プロジェクトの作り方ですが、以下のサイトがわかりやすかったのでご参照ください。
Vue CLIを使ってvueプロジェクトの作成をする

※VueファイルのScript部分はJavaScriptやTypeScriptで書くことができます。
今回はTypeScriptを使用しているので、プロジェクト作成時にTypeScriptも追加したほうがわかりやすいかもしれないです。
TypeScriptの詳しい書き方は以下を参照してください。
TypeScriptの基本
Vue.js to TypeScriptの書き方一覧


実際にソースに触れてみる

実際にソースに触れる方がわかりやすいと思いますので、触れていきます。

vue create でプロジェクトを作成したら、App.vueとHelloWorld.vueの2つのvueファイルができていると思います。
これらはコンポーネントと呼ばれ、親コンポーネントがApp.vue、子コンポーネントがHelloWorld.vueとコンポーネントがネストしている状態になっています。
今回はHelloWorld.vueのほうを編集していきます。

公式サイトにも載っている簡単な例で、ユーザーが入力した値が即座に反映される、というページです。
JavaScriptjQuery)でも実装できますが結構面倒臭いですよね。
Vue.jsは瞬殺します。

まず、動くコードを用意しました。
以下のコードをHelloWorld.vueに書いてブラウザ上で動かしてみてください。
テキストボックスに入力した文字がそのまま下に表示されるはずです。

<template>
  <div class="hello">
    <h1>Hello Vue.js!</h1>
    <input type="text" v-model="message" />
    <p>{{ message }}</p>
  </div>
</template>

<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';

@Component
export default class HelloWorld extends Vue {
  private message = '';
}
</script>

これはv-modelが双方向データバインディングを作成してくれるため、
 <input type="text" v-model="message" />
によってmessageの文字列を変更でき、リアルタイムで
 {{message}}
に反映されているのです。
このv-modelなどの、「v-」で始まるものが、ディレクティブと呼ばれる特別な属性です。

ディレクティブ

Vue.jsが提供するViewの要素に付加できる独自属性です。ディレクティブを利用することでDOM (Document Object Model)操作をすることができ、HTML要素の表示・非表示などを柔軟に変化させることができます。さらに、直接DOMを操作するコードの記述量を減らすことができるため、開発スピードを早めることができます。

v-model

双方向データバインディングを作成してくれます。

v-bind

タグの中の属性を指定します。
v-bindについては以下のサイトがわかりやすく解説してたので見てください。
v-bindでclass名を動的に追加、削除する!

とりあえず、とても便利な機能です。

v-if

<template>
    <p v-if="visible">Trueのとき表示</p>
    <p v-else>Falseのとき表示</p>
</template>

<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';

@Component
export default class HelloWorld extends Vue {
  private visible = true;
}
</script>

flgの値の真偽値によって、要素をレンダリングします。
trueのときは1行目のp要素が、falseのときは2行目のp要素がレンダリングされます。

v-on

<template>
    <button v-on:click="doSomething"></button>
</template>

要素にイベントリスナをアタッチします。イベント種別は引数で示されます。
見たままですが、上記ではクリックしたらdoSomethingが呼ばれます。
doSomethingの部分を関数にすればクリックしたときにその関数が実行されます。
v-onは省略可能で、@clickと表すことができます。
イベントハンドリングはclickだけに限らず、マウスオーバー( @hover )などいろいろあります。

v-for

<template>
    <ul v-for="fruit in fruits" v-bind:key="fruit">
      <li>{{ fruit }}</li>
    </ul>
</template>

<script>
import { Component, Prop, Vue } from 'vue-property-decorator';

@Component
export default class HelloWorld extends Vue {
  private fruits: string[];

  constructor() {
    super();
    this.fruits = [ 'Apple', 'Banana' , 'Cherry'];
  }
}
</script>

fruitsの要素数だけ繰り返してレンダリングします。
書き方としてはKotlinのfor文、Javaの拡張for文に似ています。
v-forはkey要素を指定しないと怒られるので一意なものをv-bind:keyに渡してあげます。
ここでは文字列型の配列を使用しましたが、オブジェクトを扱う配列も使うことができます。 そのことについては以下のサイトを参照してください。

TypeScriptのオブジェクト型リテラルいろいろ


おまけ

vueのコードを触るにあたって、VSCodeを使う方はまずVeturとPrettier-Code Formatterをインストールすることをお勧めします。
Vetur:Vue.jsコードのシンタックスハイライトやコード補完、リント、フォーマットが使えるようになる
Prettier:Vue.jsのフォーマッター


終わりに

今回はVue.jsの始め方と簡単にコードを触ってみました。

Vue.jsは現在最も急成長しており、おそらく開発者コミュニティが最も熱心なJavaScriptフレームワークです。非常に詳しいドキュメントと、非常に低い学習曲線により、新しいフレームワークを試してみたいときに最適の選択肢と言えます。アーキテクチャとしてはReactやAngularに似ているため、他フレームワークからの移行も容易です。その小さいサイズ(20キロバイト)、速度、柔軟性が愛されており、他フロントエンドフレームワークに比較してパフォーマンスも良いです。

しかし、Vue.jsの市場シェアはReactやAngularに比べるとまだ小さいものです。 従って、Vue.jsの開発経験を持つ開発者を見つけるのは、ReactやAngularより難しいです。 Vue.jsがReactやAngularほどの人気を得られるかどうかは結果を待たなければなりませんが、開発者コミュニティの熱気や使用者の増加から見ると、Vue.jsは今後も熱心に開発が続けられると思われます。

次回はVue.jsを使ってTODOリストを作りたいと思います。


参考文献

・Udemyメディア【Vue.js入門】特徴や他のフレームワークとの比較などを紹介!

AWS にかかる費用の計算方法(AWS料金見積りツールの利用)

AWS のサービスを継続的に利用する場合、当然ながら費用が発生します。

ここでは、EC2 を例にAWS料金見積りツールを利用して 予想費用を計算してみます。

AWS にかかる費用の考え方

AWS は 基本的には 従量課金 です。

サービスの種類や内容により決められた時間当たりの費用が発生します。

逆に言うと使っていない時間帯にサービスを停止していれば、その分費用は抑えられます。

EC2 インスタンスの例で言うと、下図のように「インスタンスの状態」→「停止」の状態にしておくと、EC2 というサービスに対する費用は発生しません。

f:id:CwLab:20190731010934p:plain

ただし、EC2 インスタンス が利用する EBS ボリューム(ストレージ)はデータ保持のためストレージを占有しており、その分費用は発生し続けます。

つまり、EC2 インスタンスを停止しても費用は抑えられますが、費用がかからないという事にはなりません。

さて、「基本的には従量課金」と前述しましたが、従量課金は「オンデマンド・インスタンス」という種類の料金形態を指します。

これに対して「リザーブド・インスタンス」という種類の料金形態があります。

1年または3年の継続的サービスの利用を確約し、その分「割引」が適用され、オンデマンド・インスタンスで同期間継続利用するより費用を抑えられます。

24時間365日 概ね無停止で稼働させるシステムのインフラとして利用する場合は、リザーブド・インスタンスを利用するのがお得でしょう。

オンデマンド・インスタンスリザーブド・インスタンスの比較

以下にEC2 インスタンス の t2.medium を 東京リージョンで 1年間継続利用した場合にかかる費用の合計を比較してみます。

…と思いましたが、AWS比較表を用意してくれていました。

f:id:CwLab:20190731013608p:plain

f:id:CwLab:20190731014042p:plain

前払いだと、1年で37%、3年で57%もお得です。

レートが 108円/$ (19/7/30 実績 ) で計算すると、1年だとオンデマンド・インスタンスだと57,521円、リザーブド・インスタンスだと36,288円。21,233円お得です。でかいです。
3年だとオンデマンド・インスタンスだと172,564円、リザーブド・インスタンスだと74,196円。98,368円お得です。とてつもなくでかいです。

ただし、リザーブド・インスタンスはスケールアップすると適用外になるので、計画立てて購入する必要があります。

AWS料金見積りツールの利用

さて、前置きが長かったですが、いよいよAWS料金見積りツールを利用してみます。

前提

今回はEC2で Git Lab をインストールして本業務の合間を縫って行うシステム開発のために最小構成で利用したいので、その見積を行います。

以下の条件で見積を行います。

  1. まずはオンデマンド・インスタンスを利用する。
  2. OSは Linux を利用する。
  3. リージョンは東京とする。
  4. リソースは 2CPU、4G Mem (t2.medium) とする。
  5. EBSボリューム(ストレージ)は ファイルなども扱う想定のため、一旦 60G を確保。

見積開始

AWS料金見積りツール にアクセスし、「Create estimate」をクリックします。

f:id:CwLab:20190816082303p:plain

虫眼鏡アイコンのあるテキストボックスに「EC2」と入力し、AWSサービスの表示を絞り込みます。
「Aamzon EC2」の「Configure」をクリックし、見積へ進みます。
f:id:CwLab:20190816091525p:plain

以下の画面が表示されますので、赤枠の部分に 前提 を参考に採用するEC2インスタンスの情報を入力します。
f:id:CwLab:20190816093131p:plain

$51.58 と算出されました。
f:id:CwLab:20190816100016p:plain

108円/$ とした場合, 5,570.64円となります。

EC2の他に各種サービスの見積りが可能ですので概算コストの試算に利用してみてください。

Kotlin(ことりん)

Kotlinって?

Kotlinとは JetBrains 社が2011年ごろに発表したプログラミング言語で、 JVM上で動作し、Javaと相互利用可能なオブジェクト指向型言語です。

特徴

  • JVM上で動作する Kotlinファイル(.kt)はコンパイルするとクラスファイル(.class)が生成されるため、 Javaと同様にJVM上で動作可能となっています。

  • Javaと相互利用可能 Kotlin以外にScalaなど相互利用可能な言語が存在しますが、 公式サイト上で「Javaと完全に相互運用可能」をうたっているため、 より安全に利用することができます。

  • 静的型付けのオブジェクト指向で、静的なnull安全が保証 JavaでありがちなNullPointerExceptionを未然に防ぐことができます。

つまり、ソースコードがKotlinでもJavaでも、JVM上は同じクラスファイルを読み込むため、 どちらからでも相互に呼び出せたりできます。

2017年にAndroid公式開発言語に追加され、知名度が上がってきており、 Java有償化に伴い(Android開発では特に)Kotlinでの開発が加速しますし、 JVMを流用できるため、言語の切り替えなどの需要が今後高まってくることと思います。

Javaとの比較

今回は初歩的な以下の内容をJavaと比較しながら解説していきます。

文法の違い

Java

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}

Kotlin

fun main(args: Array<String>) {
    println("Hello, world!")
}

main関数のためのクラスの作成は不要です。

printlnはクラスに属するメソッドでなく、クラスに属さない関数として実装します。

関数=staticメソッドと同義なので、staticの記述も不要になります。

デフォルトがpublicため、publicの記述も不要になります。

文法の末尾の;も不要です。

変数宣言

Java

String s = "変数";
final String f = "定数";

Kotlin

var s: String = "変数"
val f: String = "定数"
var s1 = "型推論変数"
val f1 = "型推論定数"

finalはval 通常の変数はvar で宣言します。

var valが増えたことにより、タイピング数が増えることが懸念されますが、 JavaScriptと同様に型推論が可能のため、var val の宣言が必要となってきます。

Java

int i = 1;
final boolean b = true;
String s = Integer.toString(i); // int→String

Kotlin

var i: Int = 1
val b: Boolean = true
var s = i.toString() // Int→String

Javaでプリミティブ型として扱っているint,double,booleanなどについても、Kotlinではクラスとして振る舞います。

クラスとして振る舞うため、メソッドを呼ぶことができます。

[i: Int = 1]と書くことでオートボクシングしているように見えますが、 Kotlin内部ではプリミティブとして扱われるため、パフォーマンスの心配はありません。

if文

Java

// if文
String s;
if (i < 10) {
    s = "10より下";
} else {
    s = "10以上";
}
// 3項演算子
String s = i < 10 ? "10より下" : "10以上";

Kotlin

// if文
var s:String
if (i < 10) {
    s = "10より下";
} else {
    s = "10以上";
}
// 式の値を直接代入
var s = if (i < 10) {
    "10より下";
} else {
    "10以上";
}
// 3項演算子のような記述のif文
var s = if (i < 10) "10より下" else "10以上"

基本的な部分の記述方法に大きな違いはありません。

式の値を直接変数に代入することが可能です。

代わりに3項演算子がKotlinにはなく、if文で代用することになります。

while

Javaと同じため、割愛します。

for

Java

// for文
for (int i = 0; i < 100; i++) {
    System.out.println(i);
}
// 拡張for文
int numbers[] = {1, 2, 3, ....};
for (int num : numbers) {
    System.out.println(num);
}

Kotlin

// for文
for (i in 0 until 100) {
    println(i)
}
// 拡張for文
for (num in numbers) {
    println(num)
}

KotlinにはJavaでいう拡張for文しかありません。

: の代わりに in を利用します。

Javaでいうfor文相当の利用したい場合の記述も載せています。

この until は特殊構文ではなく、ただのメソッド[0.until(100)]と同じです。

Kotlinでは + * のような二項演算子と同じような中置記法のメソッドを作ることができます。

個人的意見ですが、中置記法のメソッドはかなり使い勝手がよさそうなメソッドですので、 ぜひ、次回記載時にもう少し詳細に紹介できればと思います。

開発環境

自分のマシンにインストールする方法も他サイトで公開されていますが、 ここまでの部分をお試しでやってみたい方にお勧めしたいのが、 以下のサイトです。 https://try.kotlinlang.org/try.kotlinlang.org

一切の準備が不要でサイト上でKotlinを体験できます。 興味を持った方は是非お試しください。

終わりに

今回は初歩的な部分までの記事となりますが、 皆さんが一番気になるインストールからコンパイルまでとJavaとの互換性など、 次回掲載時に載せたいと思います。

ここで皆さんがやる気になるおまじない記事を一つ 少しでも興味を持っていただければ、ぜひ触れて楽しんでみてください。

Kotlinの認知度はまだまだ低いため、開発現場で使用される機会は少ない状況です。

f:id:CwLab:20190725233015p:plain
プログラミング言語のランキング
lanchesters.site

しかし、言語別の年収を見るとKotlinが上位に食い込んできていることがわかると思います。

f:id:CwLab:20190725233120p:plain
プログラミング言語別年収ランキング
lanchesters.site

qiita.com

Markdown記法

はじめに

Markdownは、ジョン・グルーバー(John Gruber)氏らによって考案されたマークアップ言語(文章を記述するための言語)です。

開発場面のみならず、ブログを書く際にも利用されています。この「はてなブログ」では編集モードに「Markdownモード」があり、この記事もMarkdown記法を使用して書いています。


特徴

Markdownは軽量マークアップ言語に分類され、HTMLなどのマークアップ言語と比較して記法が簡易であるという特徴があります。

また、Markdownはパーサ(構造化された文書を解析して別の構文に変換するプログラム)によってHTMLへ変換されます(*1)が、 別のブログやアプリ(Markdownに対応しているもの)では見栄えが変わります。

HTMLとの比較

例として、GitHubのReadMeに以下の通り記載する場合、 f:id:CwLab:20190627155931p:plain

それぞれの平文は以下の通りです。
[ HTML ]
f:id:CwLab:20190627155954p:plain

[ Markdown ]
f:id:CwLab:20190627160010p:plain

Markdownは記法が簡単であるため、HTMLに比べ平文のままでも読みやすいという特徴があります。


メリット

  • 記法が簡単であるため覚えやすい。
  • 手軽に読みやすい文章が書ける。
  • 平文でも読みやすい。

デメリット

  • 特になし

代表的な記法

①強調表現

【平文】
**強調したい文章**  
【表示例】

 強調したい文章


②引用

【平文】
>大切なのは、
疑問を持ち続けることだ。
神聖な好奇心を失ってはならない。  
-アルバート・アインシュタイン-  

(※文頭に 「> 」を付ける。)

【表示例】

大切なのは、 疑問を持ち続けることだ。 神聖な好奇心を失ってはならない。
-アルバート・アインシュタイン-


③テーブル

【平文】
|header1|header2|header3|
|:--|--:|:--:|
|align left|align right|align center|
|a|b|c|
【表示例】
header1 header2 header3
align left align right align center
a b c


ソースコードの記述

Javaソースコード
ファイル名:HelloLaboccha.java

【平文】
```Java:HelloLaboccha.java
public class HelloLaboccha {
     public static void main(String[] args) {
      System.out.println("hello, laboccha");
     }  
}
```
【表示例】
public class HelloLaboccha {  
     public static void main(String[] args) {  
      System.out.println("hello, laboccha");  
     }  
}




余談

PHP用に機能拡張された「Markdown Extra」もあるそうです。
PHP Markdown Extra(全文英語)
 https://michelf.ca/projects/php-markdown/extra/
・意訳して下さっているサイト様
 https://hibara.org/blog/2013/03/11/php-markdown-extra-jp/


参考文献


GitLab on EC2

GitLab は ソフトウェア開発 における Git リポジトリ マネージャーです。
Git リポジトリマネージメント を主機能として、その他様々な機能があります。

フリーで利用できる代表的な機能として、以下のような機能があります。

  • 課題管理機能
  • 工数の予実管理機能
  • マージリクエス
  • 承認機能
  • チャットを使用したデプロイ機能

その他たくさんの機能が用意されていますので、詳細は 本家サイト を確認してください。

GitLab を利用するには GitLab WEB サイトにアカウント登録をして Git リポジトリ を利用する方法と、サーバーにインストールをして、インターネットに繋がっていないクローズド環境でも利用できる方法があります。

ここでは AWS EC2 にインストールしていきます。
※準備として AWSアカウント登録EC2 インスタンスの作成 を行ってください。

以下の手順で構築を進めます。

  1. 必要な依存ライブラリの確認
  2. Postfix のインストール確認
  3. GitLabのインストール
  4. 初期設定
  5. メール通知設定
  6. HTTPS のアクセス設定 ※簡易的に自己署名証明書オレオレ証明書)を利用します。

必要な依存ライブラリの確認

Tera Term や RLogin から 作成済みの EC2 インスタンスSSH でログインします。

必要なライブラリは以下の4つ。
Amazon Linux には標準で入っていると思いますが、念のため確認します。

  • curl
  • policycoreutils
  • openssh-server
  • openssh-clients
[ec2-user@ip-10-0-0-10 ~]$ sudo yum list installed | grep curl  
curl.x86_64                           7.61.1-9.amzn2.0.1             installed  
libcurl.x86_64                        7.61.1-9.amzn2.0.1             installed  
python-pycurl.x86_64                  7.19.0-19.amzn2.0.2            installed  
[ec2-user@ip-10-0-0-10 ~]$ sudo yum list installed | grep policycoreutils  
policycoreutils.x86_64                2.5-22.amzn2                   installed  
[ec2-user@ip-10-0-0-10 ~]$ sudo yum list installed | grep openssh  
openssh.x86_64                        7.4p1-16.amzn2.0.5             installed  
openssh-clients.x86_64                7.4p1-16.amzn2.0.5             installed  
openssh-server.x86_64                 7.4p1-16.amzn2.0.5             installed

インストールされていることが確認できます。

インストールされていない場合は以下のコマンドでインストールして、sshd サービスの自動起動設定と sshd サービスの起動を併せて行ってください。

[ec2-user@ip-10-0-0-10 ~]$ sudo yum install curl policycoreutils openssh-server openssh-clients  
[ec2-user@ip-10-0-0-10 ~]$ sudo systemctl enable sshd  
[ec2-user@ip-10-0-0-10 ~]$ sudo systemctl start sshd

Postfix のインストール確認

GitLab からメールを送信するための Postfix がインストールされているか確認します。
Amazon Linux には標準で入っていると思いますが、念のため確認します。
※なお、今回メールの送信は Gmail を利用しますので Postfix は不要なのですが、手順として記載しておきます。

[ec2-user@ip-10-0-0-10 ~]$ sudo yum list installed | grep postfix
postfix.x86_64                        2:2.10.1-6.amzn2.0.3           installed

インストールされていることが確認できます。

インストールされていない場合は以下のコマンドでインストールして、postfixサービスの自動起動設定と postfix サービスの起動を併せて行ってください。

[ec2-user@ip-10-0-0-10 ~]$ sudo yum install postfix  
[ec2-user@ip-10-0-0-10 ~]$ sudo systemctl enable postfix  
[ec2-user@ip-10-0-0-10 ~]$ sudo systemctl start postfix  

GitLabのインストール

curl コマンド と bash コマンドの組み合わせで Git リポジトリ を登録します。

[ec2-user@ip-10-0-0-10 ~]$ sudo curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash  
Detected operating system as amzn/2.  
Checking for curl...  
Detected curl...  
Downloading repository file: https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/config_file.repo?os=amzn&dist=2&source=script  
 ・  
 ・  
 ・  
The repository is setup! You can now install packages.  

Git リポジトリ の登録が完了したら、以下のコマンドで GitLabをインストールします。

[ec2-user@ip-10-0-0-10 ~]$ sudo yum install -y gitlab-ce  
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd  
Resolving Dependencies  
 ・  
 ・  
 ・  
Dependency Installed:  
  audit-libs-python.x86_64 0:2.8.1-3.amzn2.1  checkpolicy.x86_64 0:2.5-6.amzn2         libcgroup.x86_64 0:0.41-15.amzn2  
  libselinux-python.x86_64 0:2.5-12.amzn2.0.2 libsemanage-python.x86_64 0:2.5-11.amzn2 policycoreutils-python.x86_64 0:2.5-22.amzn2  
  python-IPy.noarch 0:0.75-6.amzn2.0.1        setools-libs.x86_64 0:3.3.8-2.amzn2.0.2  
  
Complete!  

インストールが完了しました。

初期設定

インストールが完了すると、初期設定を行います。

/etc/gitlab/gitlab.rb を編集していきます。

[ec2-user@ip-10-0-0-10 ~]$ sudo vi /etc/gitlab/gitlab.rb

テキストエディタが開きますので以下の通り変更します。
※ここでは一旦アクセス先の URL および タイムゾーン のみ設定します。

設定項目 設定値
external_url http://[EC2 のドメイン]/
gitlab_rails['time_zone'] Asia/Tokyo

reconfigure を実行し、設定をもとに GitLab を構成する各種サーバーアプリの設定を変更します。

ここでは一旦設定は何も変更せずに reconfigure を実行します。
※最初はインスタンスタイプを無料枠で使用できる t2.micro でトライしましたが reconfigure にあえなく失敗しました。
 t2.small にインスタンスタイプを変更し、再実行しました。

[ec2-user@ip-10-0-0-10 ~]$ sudo gitlab-ctl reconfigure  
 ・  
 ・  
 ・  
Running handlers:  
Running handlers complete  
Chef Client finished, 152/910 resources updated in 50 seconds  
gitlab Reconfigured!  

reconfigure が完了したので、GitLab にアクセスします。

EC2 のドメインが ec2-XX-XX-XX-XX.ap-northeast-1.compute.amazonaws.com の場合、以下のようにブラウザへ URL を入力します。

http://ec2-XX-XX-XX-XX.ap-northeast-1.compute.amazonaws.com/

GitLab のパスワード変更画面が表示されました。

f:id:CwLab:20190610005632p:plain

デフォルト の root ユーザでログインしますので、 root ユーザのパスワードを変更します。
確認用(Confirm)も含め登録するパスワードを入力し、「Change your password」をクリックします。

f:id:CwLab:20190610010207p:plain

ユーザIDとパスワードの入力を求められますので、デフォルトのユーザID「root」と先ほど変更したパスワードを入力し、「Sign in」をクリックします。

f:id:CwLab:20190611005646p:plain

無事 GitLab にログインできました。

f:id:CwLab:20190611005956p:plain

※ちなみに /etc/gitlab/gitlab.rb に URL の設定をする前に reconfigure を実行し、GitLab にアクセスした場合は、以下のようにとてつもなくエラーになりましたので必ず URL の設定は行って下さい。

f:id:CwLab:20190610013815p:plain

メール通知設定

GitLab から各種メール通知を送信するためには、/etc/gitlab/gitlab.rb にメール通知設定を行う必要があります。

※メールアドレスはここでは Gmail を利用します。
 その他のメールを設定する場合は GitLab のドキュメントサイト を参照してください。
 Gmail で送信するには、設定するアカウントでブラウザからログインし、 「安全性の低いアプリのアクセス」 から、「安全性の低いアプリの許可」を有効に設定しておきます。
設定をしていないと GitLab からの通知メールの送信の際に Gmail の認証が通らずメールが送信できませんでした。

それでは以下のように gitlab.rb を編集してください。

設定項目 設定値
gitlab_rails['gitlab_email_enabled'] true
gitlab_rails['gitlab_email_from'] xxxxxxxx@gmail.com(送信元メールアドレス)
gitlab_rails['gitlab_email_display_name'] Cw Git Man(送信元表示名)
gitlab_rails['gitlab_email_reply_to'] xxxxxxxx@gmail.com(届いたメールの返信先メールアドレス)
gitlab_rails['gitlab_email_subject_suffix'] [CwGitmanInfo] (メールタイトルの末尾に付ける文字列)
gitlab_rails['smtp_enable'] true
gitlab_rails['smtp_address'] smtp.gmail.com
gitlab_rails['smtp_port'] 587
gitlab_rails['smtp_user_name'] xxxxxxxx@gmail.com(送信ユーザのメールアドレス)
gitlab_rails['smtp_password'] xxxxxxx(送信ユーザのパスワード)
gitlab_rails['smtp_domain'] smtp.gmail.com
gitlab_rails['smtp_authentication'] login
gitlab_rails['smtp_enable_starttls_auto'] true
gitlab_rails['smtp_tls'] false(デフォルト)
gitlab_rails['smtp_openssl_verify_mode'] none(デフォルト)]

設定を保存し、再度 reconfigure を実行します。

[ec2-user@ip-10-0-0-10 ~]$ sudo gitlab-ctl reconfigure  

reconfigure が完了するまで7分30秒ほどかかりました。
やはり GitLab はそこそこ重たいようで t2.small でも苦しいようです。

メール設定の反映が完了したらルートユーザのメールアドレスを変更し、メールが送信されるか確認します。

右上のメニューアイコンから「Profile」をクリックします。

f:id:CwLab:20190611014124p:plain

「鉛筆(Edit Profile)アイコン」をクリックします。

f:id:CwLab:20190611233318p:plain

「Email」に root アカウントのメールアドレスを入力し、「Update profile settings」をクリックします。

f:id:CwLab:20190611014407p:plain

設定したメールアドレスに GitLab からメールが送信されました。

f:id:CwLab:20190611234546p:plain

「Confirm your email address」をクリックし、変更を完了します。

HTTPS のアクセス設定

GitLab との通信を暗号化するために、オレオレ証明書を発行し HTTPS 通信の設定を行います。

自己署名証明書はおすすめするわけではありませんが、お試しで使用する環境で最低限通信を暗号化したい場合であれば自己署名で十分でしょう。
※大事なシステムを構築する際は必ず正規のルートから証明書を取りましょう。

まずは以下のコマンドでCA証明書を作成します。

sudo openssl genrsa -out ca.key 2048
sudo openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -subj "/CN=My Private CA"

次に以下のコマンドで秘密鍵を作成します。

[ec2-user@ip-10-0-0-10 ~]$ sudo openssl genrsa -out cert.key 2048

次に秘密鍵を使って証明書署名要求(CSR)を作成します。

※本来は 認証局にお渡しするファイルです。

[ec2-user@ip-10-0-0-10 ~]$ sudo openssl req -new -key cert.key -out cert.csr -subj "/CN=xx-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com"

CA署名付きのサーバー証明書を作成します。

[ec2-user@ip-10-0-0-10 ~]$ sudo openssl x509 -req -days 3650 -CA ca.crt -CAkey ca.key -CAcreateserial -in cert.csr -out cert.crt

作成した証明書および秘密鍵を所定の場所に配置します。

※ WEB サーバー(nginx )が読める場所であればどこでもいいのですが、一般的お作法に沿って配置します。

[ec2-user@ip-10-0-0-10 ~]$ sudo mv cert.crt /etc/pki/tls/private/
[ec2-user@ip-10-0-0-10 ~]$ sudo mv cert.key /etc/pki/tls/certs/

/etc/gitlab/gitlab.rb を以下のように編集します。

設定項目 設定値
external_url https://[EC2 のドメイン]/
nginx['ssl_certificate'] /etc/pki/tls/private/cert.crt
nginx['ssl_certificate_key'] /etc/pki/tls/certs/cert.key

reconfigure を実行し、設定を反映します。

[ec2-user@ip-10-0-0-10 ~]$ sudo gitlab-ctl reconfigure  

最後に AWS のコンソール から HTTP の許可を外し、HTTPS を許可します。

EC2 ダッシュボード から対象のインスタンスを選択(ここでは一つしかありませんが)し、セキュリティグループ名のリンクをクリックします。

f:id:CwLab:20190612004254p:plain

セキュリティグループ設定画面の下部「インバウンド」タブをクリックし、「編集」をクリックします。

f:id:CwLab:20190612004616p:plain

「HTTP」を「HTTPS」に変更し、「保存」をクリックします。

f:id:CwLab:20190612004925p:plain

GitLab にアクセスする URL を 「https」に変えてアクセスします。

とてつもなく警告されていますが、かまわず「詳細」→「危険性を承知で続行」をクリックします。

f:id:CwLab:20190612014043p:plain

警告は出ていますがまがいなりに HTTPS でアクセスできました。

f:id:CwLab:20190612010100p:plain

EC2 インスタンスタイプの変更

EC2 にサーバーソフトウェアをインストールをしたものの、CPU や メモリ などのリソースが不足して思うように パフォーマンス が出ないことがあります。

筆者も 無料枠の t2.micro で頑張っていたのですが、某記事を書きながらサーバーソフトウェア をインストールしたものの、SSH 接続が頻繁にハングし、しまいには切断されてしまいどうにもお手上げ状態になりました。

そんな時でも AWS は簡単にスケールアップをすることができます。

ここでは t2.micro から t2.small にスケールアップする手順を記載します。

オンデマンドインスタンスの料金表 を見ると、t2.small で 0.0272 USD / 時間、t2.medium で 0.0544 USD / 時間 なので、本記事を書いた時は 108.17 円 / $ ですので、それぞれ 2.94 円 / 時間と 5.88 円 / 時間 です。
学習で少し使う程度なら全く問題ないでしょう。
使っていないときは停止しておけば OK です。
ただし、EBS ボリュームは領域を確保している間は EC2 を停止させていたも 料金 はかかるので注意しましょう。
筆者は相変わらず無料枠範囲の 30G で頑張ります。

EC2 インスタンスの停止

EC2 インスタンスをスケールアップするには、まずは対象の EC2 インスタンスを停止します。

「EC2 ダッシュボード」 のサイドメニューから「インスタンス」をクリックします。

対象の EC2 インスタンスを選択し、ダッシュボード上部にある「アクション」をクリックします。

続けて「インスタンスの状態」→「停止」をクリックし、インスタンスを停止します。

f:id:CwLab:20190607013428p:plain

インスタンスが停止したことを確認します。

インスタンスタイプの変更

「アクション」から、「インスタンスの設定」→「インスタンスタイプの変更」をクリックします。

f:id:CwLab:20190607015103p:plain

インスタンスタイプの変更」ダイアログが表示されますので、変更したいインスタンスタイプを選択(ここでは t2.small )し、「適用」をクリックします。

f:id:CwLab:20190607015724p:plain

このとおり、あっという間に変更されました。
便利ですね。
f:id:CwLab:20190607015940p:plain

停止状態なので、あとは「アクション」から「インスタンスの状態」→「開始」をクリックし、起動しましょう。

※ちなみに、起動すると1時間経過しなくても1時間分の料金は発生しますのでご注意ください。
(しれていますが)