OmniAICreator/Qiita-1.07M huggingface dataset:
正規化(Normalization)と正則化(Regularization)

# はじめに
正規化と正則化は，機械学習の中で戸惑いそうなキーワードの一つではないでしょうか？
私自身，軽く「似たようなものでしょ？」って思ってた時に調べて「違うじゃん！」ってなった要素を備忘も兼ねてメモしておこうと思います．

# 正規化
英語ではNormalizationになる．似た言葉はScalingがある．通常，機械学習で使用する仮説関数$h_\Theta(x)$のパラメータ$\Theta$は複数ある．そして，学習データの情報もたくさんある．その中でも，スケールが異なるものがものが少なくない．

たとえば，機械学習で物件の価格を予測しようとしたら，土地の面積や部屋数，階数，駅からの距離などが特徴量(Feature)となるだろう．これらはすべて単位が異なり，取りうる値も異なる．
集めてきたデータをそのまま学習させようとすると，収束速度が遅く，なかなか最小値に近づいてくれない．これは，土地の面積が0～200平米，部屋数が0～5部屋としていたら，この2つから取りうる範囲というのが横長（縦長）になる．これを避けて，比較的同じ範囲を取れるような加工をする．つまり，土地の面積，部屋数を$0 \le x \le 1$になるようにする．この処理を正規化という．
正規化の方法の１つにMean Normalizationというのがある．これは，

```math
x := \frac{x - average}{max-min}
```

という計算をする．
また数値の範囲は，$0 \le x \le 1$ が理想ではあるが，$-3 \le x \le 3$や$-1 \le x \le 3$ などでも安定してパラメータ$\Theta$の最適化ができるらしい．

# 正則化
英語ではRegularizationになる．
正則化という言葉の由来は，線形代数の正則行列(Regular Matrix)らしい．
機械学習に置ける正則化とは，過学習(Over-fitting)の回避が目的となっている．
回帰モデルのコスト関数$J(\Theta)$は以下のようになる．

```math
J(\Theta) = \frac{1}{2m}\sum_{i=1}^{m}\|h_\theta(x^{(i)})-y^{(i)}\|^2
```

これは，単純に各学習データの計算結果と期待値の誤差の二乗の平均値である．
この式に，正則化を加えると，

```math
J(\Theta) = \frac{1}{2m}\sum_{i=1}^{m}\|h_\theta(x^{(i)})-y^{(i)}\|^2 + \lambda\sum_{j=1}^{n}(\theta_j)^2
```

というようにパラメータ$\Theta$の二乗和を追加するのである．この項を正則化項と呼ぶ．こういうことをすると，$\Theta$の値がどれかに偏ったりすることを防ぎ，満遍なく$\Theta$に値があるように抑制させておくことが出来る．これが過学習を防ぐ働きにになる．

上式では，二乗和にしていたがそれ以外に絶対値を取る方法もある．
これ以外にも，正則化項は存在し，

```math
\begin{align}
Lasso\ Regularization &: \sum_{j=1}^{n}|\theta_j| \\
Ridge\ Regularization &: \sum_{j=1}^{n}\theta_j^2 \\
\end{align}
```

LassoはLeast absolute shrinkage and selection operator の略で，L1正則化と言う．RidgeはL2正則化という．さらに，L0正則化は$max(\theta_j)$となり，LassoとRidgeの合わせ技などある．

# まとめ
機械学習では様々なデータから学習をするため，データ間で値域のばらつきがあることによる学習速度の低下が起こりえる．これを回避するために，Mean Normalizationなどの正規化を行うことで改善が見込めるようになる．
また学習しすぎて，汎化能力がなくなる，ロバスト性に欠けるという状態を起こす過学習(Over-fitting)については正則化項の導入により，避けることが出来，汎化能力を維持することができる．
Docker MySQLコンテナ起動時に初期データを投入する

DockerのMySQLイメージは、「/docker-entrypoint-initdb.d」にマウントしたディレクトリに「.sql」「.sh」「.sql.gz」という拡張子でファイルを配置しておくと、MySQLイメージからコンテナを生成・起動する時に、それらのファイルを読み込み実行してくれます。この仕組みを利用して、MySQLコンテナ生成・起動時に初期データを登録してみます。
https://docs.docker.com/samples/library/mysql/#docker-secrets
※Initializing a fresh instance

### 前提
* Dockerがインストールされていること

### docker-compose.ymlの作成
まずは、docker-compose.ymlを書きます。

```docker-compose.yml
db:
  image: mysql:latest
  volumes:
    - ./initdb.d:/docker-entrypoint-initdb.d
  environment:
    - MYSQL_ROOT_PASSWORD=root
```

このように書くことで、docker-compose.ymlと同階層にある「initdb.d」という名前のディレクトリ配下の「.sql」「.sh」「.sql.gz」ファイルを実行してくれます。

 

### 初期データ登録用SQLファイルの作成
ここでは、以下のようなテーブル作成と初期データを登録してみます。

```Employee.sql
DROP SCHEMA IF EXISTS sample;
CREATE SCHEMA sample;
USE sample;

DROP TABLE IF EXISTS employee;

CREATE TABLE employee
(
  id           INT(10),
  name     VARCHAR(40)
);

INSERT INTO employee (id, name) VALUES (1, "Nagaoka");
INSERT INTO employee (id, name) VALUES (2, "Tanaka");
```

 

### MySQLイメージからコンテナ生成・起動
以下のコマンドでMySQLイメージからコンテナの生成・起動を行います。

```
docker-compose up
```

上記コマンドにより、docker-compose.ymlでdocker-entrypoint-initdb.dにマウントしたディレクトリ（今回の例でいうと、./initdb.dディレクトリ）にあるSQLファイルが実行され、初期データが登録されます。

以上です。
Django初心者の忘備録3(Modelの作成〜Adminまで)

#環境＆目的
前回の記事と同様
[Django初心者の忘備録](https://qiita.com/Soichi888/items/2d5369a3929c9ae0dbd6)

#Modelの作成
Modelは本質的には、データベースのレイアウトと、それに付随するメタデータである。(Djangoチュートリアル参照)今回より、Djangoチュートリアルに習いApplication名を”Polls”、Project名を"mysite"と定義する。
pollsのApplicationでは投票項目(Questions)と選択肢(Choice)という2つのModelを作成する。
QuestionのModelには質問内容と投稿日を、Choiceには選択肢と投票数とそれぞれフィールドを作成する。また、各ChoiceはQuestionと関係付けられている。

```python:polls/models.py
from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
　　　#　ForeiginKeyを設定することで、ChoiceとQuestionが関係付けられていることを
     #　Djangoに伝える事ができる様になる
　　　#　Django2.xからForeignKeyを使う場合"on_delete"を設定する必要がある
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
```

#Modelの有効化
上で作成したModelを利用するためにはProjectに”polls”というApplicationを追加したということを知らせなければならない。

```python:mysite/settings.py
INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

```
ちなみに、'polls.apps.PollsConfig'でなく'polls'でもOK

コードを書き終えたら、

```
python manage.py makemigrations polls

```
とTerminalでコマンドを入力する。これで、migrationファイルが作られる。
その後
```
python manage.py migrate
```
とコマンド入力をすれば、Modelの適用が完了する。

#Adminサイトを使う
まず最初に管理者ユーザーの登録をしなければAdminサイトにログインできない。

```
python manage.py createsuperuser
```
このコマンドを実行することで、管理者登録をすることができる。
最初にユーザー名の登録

```
Username: 好きな名前
```
次にアドレスの設定

```
Email address: 好きなアドレス
```
最後にパスワードの設定

```
Password: 好きなパスワード
Password (again): もう一度同じパスワードを入力
Superuser created successfully.
```

これで、管理ユーザーの登録が完了。

```
python manage.py runserver
```
上のコマンドでサーバーを起動してadminサイト(http://127.0.0.1:8000/admin)
にアクセスすると下の画像の様にユーザー名とパスワードを求められるので、先程設定したユーザー名とパスワードを入力
![Screen Shot 2018-12-17 at 11.45.09 AM.png](https://qiita-image-store.s3.amazonaws.com/0/121124/2c1c4a8d-2dc1-14da-80ca-9241b82fb1fa.png)
ログインに成功すると、下のようなAdomin画面に行く。
![Screen Shot 2018-12-17 at 11.53.05 AM.png](https://qiita-image-store.s3.amazonaws.com/0/121124/e50c9364-725a-a197-d8c4-84709d63cb64.png)

さて、次はPollsアプリをAdminページで編集するためにpolls/admin.pyに下のコードを追加する。

```python:polls/admin.py
from django.contrib import admin
from .models import Question

admin.site.register(Question)
```


カナダから日本に帰国する準備でバタバタしてたら更新が遅くなってた。。。
ダックタイピング についての覚書

#はじめに
ダックタイピングは、巷ではよく「もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである」
と表現されます。どういうことなのでしょうか。
Go言語で簡単なソースをコーディングしてみました。コメントベースで追っていきましょう。

#ソース

```go

package main

import "fmt"

// Fish interfaceは Swimメソッドを持つ。
type Fish interface {
	Swim() string
}

// Bird interfaceは Flyメソッドを持つ。
type Bird interface {
	Fly() string
}

// アヒルは泳げるし、少し飛べる。
// それらを踏まえて Duck ストラクトを定義する。
type Duck struct {
	duckSwim string
	duckFly  string
}

// Duck ストラクトにSwimメソッドを持たせる。
func (d *Duck) Swim() string {
	return d.duckSwim
}

// Duck ストラクトにFlyメソッドを持たせる。
func (d *Duck) Fly() string {
	return d.duckFly
}

// このFishSwim関数は Fish interface以外の引数は取らない
func FishSwim(f Fish) string {
	return f.Swim()
}

// このBirdFly関数は Bird interface 以外の引数は取らない
func BirdFly(b Bird) string {
	return b.Fly()
}

func main() {
	// 先程定義したストラクト Duckに文字列をセット
	dc := &Duck{
		"私は泳げます。",
		"私は飛べます。",
	}

	// アヒルなので、泳げる。
	fmt.Println(dc.Swim())
	// アヒルなので、飛べる。
	fmt.Println(dc.Fly())

	// FishSwim関数の引数はFishのみのはずだが、Duckを渡すと泳げると言う。
	fmt.Println(
		"SaySwim :",
		FishSwim(dc),
	)

	// BirdFly関数の引数はBirdのみのはずだが、Duckを渡すと飛べると言う。
	fmt.Println(
		"SayFry :",
		BirdFly(dc),
	)
}
```

#まとめ
引数にFishしか受け取らないはずのFishSwim関数と
引数にBirdしか受け取らないはずのBirdFly関数が
Duckストラクトを受け取って「飛べる」とか「泳げる」とか言えるようになりました。
インターフェイス型のFish,Birdが必要なメソッドを持っていたからですね。
オブジェクトの振る舞いが問題なければ、
それを必要な引数として取り扱える事が
ダックタイピングの概要でしょうか。
そしてElmになる

**Elm**になります。**HTML**が。

そんな**Atom拡張**を作りました。

![screen](https://user-images.githubusercontent.com/26040158/50131094-ec6dae00-02c3-11e9-893c-7cf3d48170b4.gif)

# HTMLからElm化したい
既にコーディング済みのHTMLをElm化したいときってありませんか？
**僕はあんまり無いです。**

あんまり無いんですが、
「HTMLのコードを**コピペするだけ**で**Elmのコードに変身する**」拡張機能があったら便利かも、と思って作りました。
**Atom用**です。

# html-elmfier
**html-elmfier**という名前の拡張機能です。

**リポジトリ：**
[https://github.com/jzmstrjp/atom-html-elmfier](https://github.com/jzmstrjp/atom-html-elmfier)

**Atomのパッケージ紹介ページ：**
[https://atom.io/packages/html-elmfier](https://atom.io/packages/html-elmfier)

## 使い方
HTMLソースの中で**Elmのコードに変換したい部分**をコピーして、
.elmファイルにペーストすると**Elmのコードに変身**します。
**それだけです。**

![screen](https://user-images.githubusercontent.com/26040158/50131094-ec6dae00-02c3-11e9-893c-7cf3d48170b4.gif)

# 似たようなのあった
似たような拡張機能で「html-to-elm」というのがありました。
こちらはコピペしただけでは変換されませんが、変換したい部分を選択した状態で
「HTML To Elm: Convert」というコマンドを実行するとElmのコードに変換されます。
「選択してからコマンド実行」というひと手間はありますが、こっちでもいいかもしれません。
よかったら両方使ってみて、気に入ったほうを使ってみてください。

# まとめ
Atomの拡張機能はVSCodeやBracketsと同じくJavaScriptで書けるので、割と誰でも作れます。
[公式サイト](https://atom.io/docs/api)のリファレンスみたいなのも豊富なので、
**「このメソッドは何をすんねや？」
「引数は何をぶち込めばええんや？」**
ってなったときもけっこう調べやすかったです。
すべて英語でしたが、私は**英検3級**を保有しているので、Chromeで**ページ丸ごと翻訳**したらだいたい読めました。

おかしな挙動とかありましたら、おしえてください。

# 追記
会社をやめたら**無職**になりました。
**雇ってくださる会社を募集中**です。
（神奈川県・35歳男性・無職）

# 追記2
もうひとつ[**Harry Coderと謎のコメント**](https://qiita.com/jzmstrjp/items/831d23536ae1310447e6)というElm関連の記事を書いたから読んでいってや？

「いいね」押してね。
LaravelでS3へファイルをアップロード&参照・表示

#はじめに
LaravelでS3に画像をリサイズしてアップロードして表示するのにめちゃくちゃ困ったので同じ悩みを抱えてる人向けに記録を残しておきます。

#前提
・s3にバケットを作っておく
　やり方がわからない人は[この記事](https://qiita.com/tiwu_official/items/ecb115a92ebfebf6a92f)を参考にしてください。
・[Intervention Image](http://image.intervention.io/)を追加しておく

#やり方

```PostController.php
// formから送信されたimgファイルを読み込む
$file = $request->file('post_img');
// 画像の拡張子を取得
$extension = $request->file('post_img')->getClientOriginalExtension();
// 画像の名前を取得
$filename = $request->file('post_img')->getClientOriginalName();
// 画像をリサイズ
$resize_img = Image::make($file)->resize(1200, 675)->encode($extension);
// s3のuploadsファイルに追加
$path = Storage::disk('s3')->put('/uploads/'.$filename,(string)$resize_img, 'public');
// 画像のURLを参照
$url = Storage::disk('s3')->url('uploads/'.$filename);
```

#最後に
あくまで初学者の例なので参考程度にお願いします。
わからないことがあればどんどん聞いてください。答えられる範囲で答えます。
OpenCV(C++)のfilter2Dでコンパイル時に未定義参照エラー

`filter2D`関数を使うためにはlibopencv_imgproc.so をリンクしないといけない。
筆者の場合`-lopencv_imgproc`をg++に渡した。

ソースコードは公式チュートリアルの[Mask operations on matrices](https://docs.opencv.org/3.4/d7/d37/tutorial_mat_mask_operations.html)。
`filter2D`関数が使われており、

```
g++ sample.cpp  -I/usr/local/include/opencv2 -I/usr/local/include/opencv -L/usr/local/lib -lopencv_core -lopencv_imgcodecs -lopencv_highgui
```
でコンパイルすると

```
/usr/bin/ld: /tmp/cc3rtebF.o: シンボル '_ZN2cv8filter2DERKNS_11_InputArrayERKNS_12_OutputArrayEiS2_NS_6Point_IiEEdi' への未定義参照です
//usr/local/lib/libopencv_imgproc.so.3.4: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
```

エラーが出る。
`-lopencv_imgproc`を追加すれば通るはず。

```
g++ sample.cpp  -I/usr/local/include/opencv2 -I/usr/local/include/opencv -L/usr/local/lib -lopencv_core -lopencv_imgcodecs -lopencv_highgui -lopencv_imgproc
```

参考：
[OpenCVでコンパイルがうまくいかない。Ubuntu環境下です。](https://teratail.com/questions/135174)
Pythonの基礎中の基礎をグラレコでまとめる part２

[Pythonの基礎中の基礎をグラレコでまとめる](https://qiita.com/piyocco/items/6a5212f55c67b0006fbe)
の続き。

他の言語を既に勉強済みの人向けな感じ。
細かい説明は無しで「使うときはこんな感じ！」というまとめ。

## (4)Pythonの関数とインポート方法
![pythonの基礎4.jpg](https://qiita-image-store.s3.amazonaws.com/0/321104/fd9391e4-07a3-9819-f246-49ef2888efe6.jpeg)

##(5)Pythonのクラス
![py十honの基礎5.jpg](https://qiita-image-store.s3.amazonaws.com/0/321104/0991ae6c-41f1-bdc3-9cd2-3361a021b68a.jpeg)
さて

これまで国内外の各地を訪ねてきたのですが，ここ最近ガジェットが増えてきたこともあって，simカードの設定が乱立してきてしまいました。そのため，今後いつでも参照できて国内外でのプログラミング活動に支障のないよう，当時の設定をこちらにまとめておきます（QiitaのタグにもSIM+Wifiがあるわけだしね）。

【注意】本ページの設定は，筆者が渡航当時に利用した内容に基づくものであり，以後も同じ内容で利用できることを保証するものではありません。本ページの記載内容の利用は，全て自己責任でお願い致します。

### sim端末 (wifiルーター+通話機器)
- Nichephone-S 4G, sim free.
- NEC MR04LN, sim free.
- E-mobile D25HW, sim free.
- iPhone 5s, docomo sim locked.

### sim利用履歴
- mineo (日本), mineo-D 3G.
- Orange (France), Orange Holiday Europe.
- Orange (France), Pass Let's Go.
- Three (UK), データ通信専用プリペイドSIM 3GBタイプ.
- China Unicom (中国), 中国聯通プリペイドSIMカード 4G対応.
- Vodafone (Czech Republic), Tailor-made card.

### 接続端末
- MacBook Pro
- iPad
- Let's Note
macOS 上で ISO ファイルを外部ディスクに焼く

書き込み先ディスク `/dev/diskN` の確認 (数字 `N` の特定)

```sh
$ diskutil list
```

ディスク初期化とアンマウント
  
```sh
$ diskutil eraseDisk MS-DOS UNTITLED /dev/diskN
$ diskutil unmountDisk /dev/diskN
```

ISO の書き込み

```sh
$ sudo dd if=/path/to/data.iso of=/dev/rdiskN bs=1M
```

ディスク取り出し

```sh
$ diskutil eject /dev/diskN
```
タイヤの沢山あるビークルを手っ取り早く作るはなし

Unreal Engine 4 で乗り物が作りたいと思うけど、ビークルテンプレートって４輪車しか作れなくね？
と思ったときに、装甲車みたいな６輪駆動車や戦車、バイクの様な２輪車はどうやって作るのだろうか。。

よし今日は寝よう。

となりがちな僕のような人のために、やっぱもう少しやってくか。。となる
きっかけになればいいなと思い、ビークルのムーブメントコンポーネントについて浅く紹介できれば。。
といった内容の記事です。

この記事を作る上で使用したEngineバージョンは4.21.1です。


#ビークルテンプレート！

セダンやトラックなど、４輪車なら何の問題もなくテンプレートで動いてくれます。
しかし世の中にはシューターで戦車使いたい人や、欧州市場狙いでバイクを作りたい人も
まあいるのではないかと思います。

そんな時、何となくビークルテンプレートのセダンBPを複製してメッシュを変え、
Vehicle Movementコンポーネントのホイールの設定（配列に４つの設定が入っているはず）を
増やしたり、減らしたりしてプレイしてみると。。

はい動きません。

となって、なんでやねん！と思った人もいる事でしょう。
はい。ホイール設定は４つでないと動きません。これはプログラム的な仕様です。
（WheeledVehicleMovementComponent4WクラスのSetupVehicleDrive関数で、はじかれます）

頑張ってテンプレートで使われているコンポーネントで、いろんな工夫をして何とかする方法も
あるのかもしれないのですが、この先の内容を読んでいただき、なにとぞ検討願います。


#いまある機能で作る！

これは、SimpleWheeledVehicleMovementComponentを使えば作れます。

このコンポーネントの使い方は、公式のドキュメントにもあります。
[Simple Wheeled Vehicle Movement コンポーネント](http://api.unrealengine.com/JPN/Engine/Physics/Vehicles/SimpleWheeledVehicleMovementComponent/)

このコンポーネントを使えばホイールの数をＮ個に設定できるので、設定して後はホイールを回せばOKです。
さすがUnreal Engine、超簡単ですね。

ただしこのコンポーネント、名前にSimpleとある通り普段ビークルテンプレートで使っているものと違って
エンジンやギアの設定がありません。ですのでアクセルやスロットルの操作で進んで、ブレーキで止まる。
バックするといった機能もありません。

ですので動くだけでよいならいいのですが、車としての挙動を求めるなら色々と工夫が必要になります。
ブループリント等で何とかフォローできないこともないのですが、なかなかどうして真に迫るのは大変です。[^1]

手っ取り早くＮ輪車を動かしたいなら必要十分ですし、対応も非常に簡単なので
まず試しに使ってみるのが良いと思います。

[^1]: 例えば戦車です。世間一般の戦車だと動輪と転輪ってのがあってだな。。となるわけですが、まじめに動輪だけホイールを設定して動かしても、戦車は動きません。地面に接触しているホイールが動いていないと。。じゃあ転輪にもホイール設定するぜ！とやると動きます。割と戦車っぽい移動をするかもしれません。ですが戦車を横から見ると、全てのホイールがバラバラの速度で回転していて、あかんわ。。ってなります。それでも更なる工夫により、それっぽく見せることは出来ると思います。


#いまない機能で作る！

やっぱり、ない機能は作るに限りますよねー。

どうやらUnreal Engine 4の機能ではなくてその向こう側、PhysX側の機能を使ってやれば。。出来ないこともない？
という話になるのですが、これが中々と簡単ではありません。でした。。

出来ればこの投稿で簡単な概要だけでもと考えてはいたのですが、ちょっと時間が足りなくなってしまいました。

休みのうちに計画を立てて、この辺りまとめて投稿できればと考えていますので、今しばらく時間をください。。

また、ストアでプラグインが売っています。[^2]　お急ぎの方は購入をご検討ください。

[^2]: DcxVehicle Pluginとか。。これしかない？


#さいごに

僕自身まだまだビークルに対する愛と理解と技術と諸々と、そしてなによりも速さが足りておらず。。
精進を重ねて、次回にはもう少し役に立つ話が速く出来たらなと思う今日この頃です。
社内でモブプロランチを始めた

この投稿は[Mohikanz Advent Calendar 2018](https://adventar.org/calendars/2950)の17日目です。
昨日はゆいなさんの[今年やったLT・セッションを振り返ってみよう](https://yu1056y.hatenablog.com/entry/2018/12/16/132750)でした。
あちこちで登壇されてて、私も見習いたいところです。

さて、今回は社内でモブプロランチを始めた話を書きます。

## 事の始まり
去年のこの時期に[社内で技術系ランチミートアップ(Tech Meetup)を始めた](https://qiita.com/gimKondo/items/ab1248afb218fb80bad0)という記事を書きました。
(そういえば[Mohikanz Advent Calendar 2017](https://adventar.org/calendars/2578)に投稿してました)

このTech Meetupはほぼ毎週1回開催で最近まで続いていて、社内の技術共有、今興味のある分野の頭出し、若手へのプレゼンの機会の提供などに役立っていました。一方で、参加者がもっと「参加感」を感じられる会にできないかな、という思いもありました。
1年目の社員が多く参加してくれるようになってきた、という背景もあります。

また、少し前から業務でペアプロを取り入れていたのですが、最近、チームのほとんどが対象の開発知識を持っていないプロジェクトでモブプロを取り入れ、メンバからかなり好評だったことがありました。

「これはお昼のミートアップでもやれるんじゃないか？」
「ドライバを交代すればナビゲータは食いながら口出せばいいし(行儀が悪いけど)。」
という私の中の機運が高まり、Tech Meetupを乗っ取る形でモブプロランチを始めることにしました。

本当を言うと、Tech Meetupと隔週のつもりだったんですが、モブプロランチが思った以上に好評で、Tech Meetupよりモブプロしようぜって流れになって完全に乗っ取られる形になりました。
(みんな開発・コーディングが好きですね～)

### 補足:モブプロとは
モブプロをよく知らない方はこちらのスライドを参照して頂ければ
[MobProgramming - A Whole Team Approach](https://www.slideshare.net/couger2010/mobprogramming-at)

## モブプロランチの流れ
1. 毎週火曜の昼休みに昼食を持って集まる
2. 1人がPCを持ち込み、プロジェクタで投影
3. ドライバにPCを渡して、ナビゲータの指示に従ってコーディングさせる
4. ナビゲータは昼食を食べながら口を出す
5. ドライバは適宜交替する(交替時はコミットする)

### 補足:お題
- クラウドインフラ、バックエンド、フロント(スマホ)を構成要素としたWebサービス
- 具体的な中身は営利プロジェクトになる可能性があるので伏せておきます(後述)

### 補足:メンバ構成
自由参加なので、その時々によって変わりますが、主要な参加者の年次はだいたいこんな感じです。

- 新卒1年目×2
- 新卒2年目×2
- 新卒5年目×1
- 中途入社4年目×1(私)

実際には、この他の人が来ることもあるし、この中の人が来れないこともあります。

## 良かったところ
- 1からサービスを作る機会を提供できた
    - 仕事をしていると、なかなか完全に1からサービスを作る経験ができないことがあります
    - モブプロランチでは規模は小さくても完全に1からサービスを作る流れを体験できます
- git、IDE、エディタなどの開発ツールの実用的な共有ができた
    - 年次が若い人が多いこともあって、実際に開発に使っているツールやテクニックを実用しながら共有できたのは有意義でした
- 知らない技術も皆で触れば怖くない
    - 例えば、スマホ開発しかやったことない人がAWSコンソールを触ったり、サーバサイドプログラミングをしたり、ということが普通に発生します。
    - 仕事だけだと、どうしても得意分野にアサインされがちなので、いい機会になったのではと思ってます
- 営利プロジェクトになる…かも
    - お題を持ち込んでくれた参加者が形が見えたら営利プロジェクトに…という野望を持っている
    - 元々、勉強のためのプロジェクトという立ち位置だったけど、ここから製品が生まれるなら、それはそれで！
- 参加者が開発を楽しめている(**ここ重要**)

## 改善したいところ・問題点
- 昼休みは短い
    - 週1回、1時間だとうまく進捗出すのが難しい
    - 進捗が出ないと飽きる
    - 今のところ、有志が事前に調べ物や準備をすることによって成り立っている面もある
- 誰も知らない技術をやるのはしんどい
    - 当たり前ですが、誰も知らない技術で進める場合には調べながらやることになります
    - 実際、AWSのLambdaを作るのに「Node飽きたしPythonやろうぜ」ってノリで誰一人経験の無いPython選んだら進捗出ずに辛くなる回がありました
        - 次の回までに有志が調べてくることによって何とか進められました
        - 最低限、誰か一人は知ってる人がいると良い

## まとめ
半ば思い付きで始めたモブプロランチですが、参加者の反応は概ね好評で(…のはず)、開発を楽しんでもらえているようです。
その中で、テストやリファクタリングの思想からgit等のツールの細かいテクニックまで色々吸収できているようです。

業務でも自分が関わったプロジェクトに関してはレビューなどを通して知識を共有するようにしていますが、プロジェクトを跨いでの共有は難しく、個人的に課題だと思っていました。
今回、普段の業務ではバラバラのチームにいる人たちが集まって、知識・技術を共有しながら開発する機会を作れたのは、その課題を解決するのにも一役買ってくれそうです。

さて、新年は今作ってるサービスを業務に引き渡して製品サービスとしてローンチされたらいいなー、なんて考えています。
そうなったら、モブプロランチではまた別のお題でやることになると思いますが、それはまた別のお話。
[超簡単]Hangouts Chat の incoming webhooks を使ってAPIから簡単にメッセージを投稿する


## 概要
* タイトル通りです。
* Hangouts Chat は ルーム毎に超簡単にwebhook用のURLを払い出すことが出来ます。
* 投稿もとても簡単です。
* なお、Hangouts Chatは、G suite を利用されていればご利用頂けます。
* 社内ツールとしてバンバン活用しましょう！


## 準備
*  webhook の エンドポイントを払い出します。

1.  喋らせたい部屋のメニューから「Webhookを設定」を開きます。
![s1 [2].jpg](https://qiita-image-store.s3.amazonaws.com/0/21391/9ac8d8c8-28d6-ca15-24f9-4835e041bad8.jpeg)

1. bot名を決めます

![s2 [2].jpg](https://qiita-image-store.s3.amazonaws.com/0/21391/12f24c4f-8571-644a-dff6-3649775aeb65.jpeg)

1. 投稿用URLが払い出されるのでメモしておきます。

![s3 [2].jpg](https://qiita-image-store.s3.amazonaws.com/0/21391/a0a6c00b-fe12-9034-c840-74e84793edda.jpeg)


## curl から投稿してみる

* 簡単なJSON構造をPOSTすることで簡単に投稿出来ます！

```sample.sh
curl -H 'Content-Type:application/json' -d '{ "text": "Hello World :)" }' "WebhookのURL"
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21391/39babb9a-a5f0-fa77-1244-0ecf9de64e81.png)

* か、、簡単！＼(^o^)／

## php からの投稿

* 簡単なサンプルコードを記載します。

```sample.php
<?php
define('WEBHOOK_URL', 'WebhookのURL');

function post_message($text)
{

    $content = json_encode(['text' => $text]);

    $options = [
        'http'=> [
            'method' => 'POST',
            'header' => "Content-Type: application/json\r\n"
            . "Content-Length: " . strlen($content) . "\r\n" ,
            'content' => $content
            ]
        ];
    $context = stream_context_create($options);
    $resultJson = file_get_contents(WEBHOOK_URL, FALSE, $context);

    if(strpos($http_response_header[0], '200')){
        return true;
    }
    return false;
}

post_message("Hello World :)");
```


## あれこれ

* Webhook の説明は[Using incoming webhooks](https://developers.google.com/hangouts/chat/how-tos/webhooks)をご覧ください。簡単な英語です。
* 投稿のフォーマットをもっとリッチにしたいときは、
* 今回使った投稿フォーマットの説明は[こちら](https://developers.google.com/hangouts/chat/reference/message-formats/basic)。太文字や打ち消し線、コードなどに対応しています。
* もっとリッチに画像入れたりする場合は、[cards](https://developers.google.com/hangouts/chat/reference/message-formats/cards)というフォーマットを見てみましょう。  今回はやりませんでしたが、こちらも比較的簡単に出来ます。

# まとめ
* 単純な送信であれば、Webhook のURLに JSONを投げつけるだけで簡単にbot が実装可能です！＼(^o^)／
* 「簡単」という単語が本文中に１０回出現します。
Docker for windows をつかってみる

## はじめに
* 情報発信の練習
* 備忘録的に使う（いつもは雑なのでhackmd...

## Docker for windowsとは
* windowsOS向けDocker
* linuxOSのコンテナも利用可能
    * linuxOSはカーネルが異なるため動かないように思うが、内部的にVM(MobyLinuxVM)を立てることで利用可能にしている
* docker-composeも使える

## 実施環境

* surface laptop
    * Windows 10 Pro
    * Intel Core m3-7Y30 @ 1.00GHz
    * memory 4GB

## インストール

* [Docker公式サイト](https://www.docker.com/)へアクセス
    * Get Started
      ![image.png](https://qiita-image-store.s3.amazonaws.com/0/321477/3dd90aea-9602-8ae5-9aab-cbdf9a6ca73b.png)
    * Download for windows
      ![image.png](https://qiita-image-store.s3.amazonaws.com/0/321477/49dd34f4-a2e5-19ff-31b1-62ab65cb48c8.png)
    * Please login to donwload
        * アカウントを作成してログイン
      ![image.png](https://qiita-image-store.s3.amazonaws.com/0/321477/f70432ca-26e5-cdb3-c990-f491a737be6a.png)
    * Get Docker Desktop - Windows(stable)
      ![image.png](https://qiita-image-store.s3.amazonaws.com/0/321477/f27d1a08-f267-9ccb-e3f7-3cca90441a77.png)
* ダウンロードしたファイルでインストール
    * インストール完了後再起動するとエラー。。。
      ![image.png](https://qiita-image-store.s3.amazonaws.com/0/321477/bf405398-4496-5c52-4953-3d816cc9dc08.png)
    * windows updateを走らせたら、なおった。
    * 次は以下のようなダイアログが表示
      ![image.png](https://qiita-image-store.s3.amazonaws.com/0/321477/378b9f94-ee53-1177-27a7-88494fae669a.png)
    * Windows10proでVMを利用する場合、[hyper-Vの有効化](https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v)を行う必要がある、上記をOKにすると勝手に有効化される
      ![image.png](https://qiita-image-store.s3.amazonaws.com/0/321477/291d7fdc-6e7e-aa31-7128-96826fde0df1.png)
    * 再起動後、またダイアログが
      ![image.png](https://qiita-image-store.s3.amazonaws.com/0/321477/d2ebf57c-b28f-1f72-feb0-e6cff2d16ce5.png)
    * out of memory とのことなのでDockerのsettingでメモリ使用量を制限
      ![image.png](https://qiita-image-store.s3.amazonaws.com/0/321477/ef57985b-1c74-996e-2027-5dd2d77aa174.png)
    * memory4GBじゃ少なすぎてまた失敗したけど、ほかのアプリおとしたりしたら無事起動（しかし重たい。。）
    * 重いので、Windows起動時にDockerデーモンが起動しないように設定
        * settings
        * 「Start Docker Desktop when you log in」をOffに
          ![image.png](https://qiita-image-store.s3.amazonaws.com/0/321477/3a22b425-bf9b-901d-b7a9-7deea26e820f.png)
* 試してみる
    * コマンドプロンプト起動
        * `docker run docker/whalesay cowsay Hello!`
          ![image.png](https://qiita-image-store.s3.amazonaws.com/0/321477/cab23fe1-c9d0-1ab8-cc8c-fe14135b12bc.png)

## 追記
* apt-getしようとするとエラー
    * dnsの設定が通ってないみたい
    * settings => network からdnsを固定で設定したらうまくいった

## ひとまずここまで
* あとやること
    * bash環境も整備したい
Matter.jsとCanvasを重ねる

#使いどころ
Matter.jsでアニメーションやゲームを作った上に物理演算とは関係ない文字・画像をCanvasで表示したい時

#HTML
```index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" type="text/css" href="style.css">
    <title>Document</title>
</head>
<body>
    <canvas id="world"></canvas>
    <canvas id="overlay"></canvas>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/matter-js/0.10.0/matter.min.js"></script>
    <script src="main.js"></script>

</body>
</html>

```
- canvasを2枚用意して別のID("world", "overlay")を付けます

#CSS
```style.css
canvas {
  position: absolute;
}
#overlay {
  background-color: transparent;
}
```
- canvasにposition:absoluteを指定することで、2つ重ねて表示することができます
（absoluteを指定しないと2枚のcanvasが横に並んでしまう）
- 前面のキャンバス(#overlay)の背景を透明にすることでオーバーレイできます

#JS

```main.js
  // 前面キャンバス (id="overlay")　箱を置くだけ
(function() {
  'use strict';

  var stage = document.getElementById('overlay');
  var ctx;

  if (typeof stage.getContext === 'undefined') {
    return;
  }
  ctx = stage.getContext('2d');

  stage.width = 600;
  stage.height = 600;

  ctx.strokeRect(300, 300, 100, 60);

})();

  // 背面キャンバス (id="world")　玉が地面に落下するだけ
  var Engine = Matter.Engine,
      Render = Matter.Render,
      World = Matter.World,
      Bodies = Matter.Bodies;

  var engine = Engine.create(),
      world = engine.world;

  var winWidth = 600;
  var winHeight = 600;

  var canvas = document.getElementById('world');

  var render = Render.create({
      canvas: canvas,
      engine: engine,
      options: {
        width: winWidth,
        height: winHeight,
        background: '#8bc2c9',
        wireframes: false
      }
  });

  // 玉
  var boxA = Bodies.circle(300, 200, 40, {
    render: {
      fillStyle: 'white',
      strokeStyle: 'transparent'
    }
  });

  // 地面
  var ground = Bodies.rectangle(winWidth/2, winHeight, winWidth, 10, {
    isStatic: true,
    render: {
      fillStyle: 'white',
      strokeStyle: 'transparent'
    }
  });

  World.add(engine.world, [boxA, ground]);
  Engine.run(engine);
  Render.run(render);

```
![qiita.gif](https://qiita-image-store.s3.amazonaws.com/0/221796/be525fc0-5252-67ce-253f-6a2ed2d671d6.gif)



#参考記事
- [JavaScript用物理エンジン、Matter.jsをとりあえず動かす](https://qiita.com/sabineko/items/cd0638dd95a28174afb3)
- [HTML5 キャンバスのレイヤー化によるレンダリングの最適化](https://www.ibm.com/developerworks/jp/web/library/wa-canvashtml5layering/index.html)
nginxでプロキシサーバを立ててNode.jsのアプリケーションを動かす

## はじめに
[NGINX Advent Calendar 2018
](https://qiita.com/advent-calendar/2018/nginx)の17日目のアドベントカレンダーが空いていたので投稿してみます。
ネタが古いですが、ご容赦下さい。

## 概要
業務でプロキシサーバを立てる必要が出てきました。

nginxでプロキシサーバを立てられると聞いたので試してみます。
ポートが80以外のほうがわかりやすいので、Node.jsで作ったアプリケーションを動かしてみます。
OSはCentOS7を使います。

## 環境構築
### CentOS7にインストール
#### パッケージを登録
```bash
sudo rpm -ivh  http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
```

#### インストール
```bash
yum -y install nginx
```

#### インストール確認
```bash
nginx -v
```

### nginxでプロキシサーバを設定

```conf
server {
    listen      80 default;
    server_name  localhost;
    location / {
        proxy_pass http://IP:port;
    }
}
```

### Node.jsで作ったアプリケーション立ち上げ
Node.jsで作ったアプリケーションを立ち上げます。
アプリケーションは個人で作った[こちら](https://github.com/juve534/TIL/blob/master/Socket.IO/workspace/app.js)を使います。

```bash
$ node app.js
```

これで準備は整いました。
ブラウザからアクセス確認をします。

![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/39671/1b195462-d867-a5e0-6e4a-0d7e6a1c2d9f.gif)

これでブラウザからアクセスできることも確認でき、nginxでプロキシサーバの立ち上げができました。
最後まで読んで頂きありがとうございます。

## 参考資料
* [さくらVPSでnode.jsをインストール＆nginxのリバースプロキシでポート80で動かすまでメモ](https://qiita.com/n0bisuke/items/1b3b4bf95b5fdfce90f8)
音声のアラインメントについてのメモ

音声データ(e.g. mp3)とテキスト(text)から, 音声データに対して文字や音素のアラインメント(どの文字/音素がどの時刻に位置するか)をしたい.

この分野のツールのまとめ

Installing and Using the Penn Forced Aligner (P2FA) Chinese
https://congzhanglinguist.wordpress.com/2018/07/30/p2fa_chinese/

HTK(HTS) をベースにするものが多くありますが, HTK はライセンスが微妙 http://htk.eng.cam.ac.uk/docs/license.shtml なので, Montreal Forced Aligner や Gentle を見てみます.

text-to-speech で音声を生成すれば, テキストだけで audio と transcript(台本)を用意することができます.


## 用語

* HTK : Hiden Markov Model Toolkit http://htk.eng.cam.ac.uk/ 
* Forced Aligner 強制アライナー? 
* Transcript 台本
* Phoneme 音素 https://ja.wikipedia.org/wiki/%E9%9F%B3%E7%B4%A0
* Phone 音, 単音 https://en.wikipedia.org/wiki/Phone_(phonetics)
* Viseme 口形素(音素に対応した口の形状. Visual 的なもの)
* Vowel 母音
* Syllable 音節
* Grapheme 書記素 https://ja.wikipedia.org/wiki/%E6%9B%B8%E8%A8%98%E7%B4%A0
* G2P Grapheme-to-Phoneme 
* IPA 国際音声記号 International Phonetic Alphabet https://en.wikipedia.org/wiki/International_Phonetic_Alphabet 
* Lexicon : 語彙目録(語彙の辞書)

## Montreal Forced Aligner

https://montreal-forced-aligner.readthedocs.io/en/latest/

音声認識ツールキット Kaldi http://kaldi-asr.org/doc/about.html をベースにしている.

Windows バイナリなどがあってとりあえず動かせて楽で良いですが, 使い方にくせがあります.

結果は TextGrid 形式で出力されます. GUI があるっぽい?

https://montreal-forced-aligner.readthedocs.io/en/latest/data_format.html

アラインは以下のようにする.

https://montreal-forced-aligner.readthedocs.io/en/latest/example.html

```
bin/mfa_align /path/to/input /path/to/librispeech/lexicon.txt english /path/to/output_aligned
```

.wav などファイルを個別で指定はできず, フォルダ単位でのバッチ処理になるので注意.
.lab(台本を大文字アルファベットだけなどで構成したもの)が必要.

**出力フォルダはすでに存在するディレクトリを指定するとエラーになります**.
面倒ですが, 毎回出力フォルダは存在しないディレクトリを指定する必要があります(もしくは `mfa_align` の前に毎回出力フォルダを削除するか)

また, wav のサンプリングレートは 44.1k Hz あたりが推奨. 16K とかだと処理中に落ちたりする.
サンプリングレート変換は sox あたりをつかうとよい.

http://sox.sourceforge.net/
 
成功すると, `.TextGrid` ファイルが生成されます(コンソールでは, 成功したかどうかはレポートしてくれない模様)

### oovs_found.txt 

https://github.com/MontrealCorpusTools/Montreal-Forced-Aligner/issues/84

アラインメントの検出に失敗すると, `.TextGrid` が生成されず, oovs_found.txt などのファイルが生成されます.
(OOV = Out of vocabrary)

辞書にない単語があったり, アルファベット以外の文字(カンマやピリオドなど)の文字が `.lab` にあります. `.lab` の内容をチェックしましょう.
(とくに, `.lab` にはピリオドを含めてはいけないのですが, ピリオドを含めてしまうケースがよくあります)



## Gentle

https://lowerquality.com/gentle/

これも Kaldi をベースにしている. Kaldi は Apache 2.0 ライセンスでよい. Gentle も MIT ライセンスでよい.


## ツールまとめ

ありがとうございます.

https://github.com/pettarin/forced-alignment-tools

Speech analysis and transcription tools


## データセット

* 3D 顔スキャンと音声 Biwi 3D Audiovisual Corpus of Affective Communication - B3D(AC)^2  http://www.vision.ee.ethz.ch/datasets/b3dac2.en.html

## TODO

* Picth(抑揚)などの情報も同時に取得できないか?
  * とりあえず, 別途 Praat を使えば pitch は取得できるっぽいが http://www.fon.hum.uva.nl/praat/
* Phoneme Recognition using RecNet 試したい https://github.com/joergfranke/phoneme_recognition
[graphql-ruby] 型クラスを拡張する

# 型クラスを拡張するって？
graphql_ruby 1.8から型の定義がclassベースになりましたが、実はまだ内部ではレガシーオブジェクトが使われています。
ではどう変換が行われているかというと各型オブジェクト(`GraphQL::Schema::Object`とか)に生えている`to_graphql`というメソッドがレガシーオブジェクト(`GraphQL::ObjectType`とか)を返すようになっています。
よってこの`to_graphql`メソッドをオーバーライドして古い型オブジェクトをいじることで型オブジェクト共通のメタデータなどを設定することができます。これを一言で「型クラスの拡張」と表現しました。

# オブジェクト型を拡張してみる
オブジェクト型の`to_graphql`をオーバーライドします。

```rb
module Types
  class BaseObject < GraphQL::Schema::Object
    def self.to_graphql
      type_defn = super
      type_defn.description = 'hogehoge'
      type_defn
    end
  end
end
```
適当にユーザーという型を用意しました。

```rb
module Types
  class UserType < Types::BaseObject
    field :id, Integer, null: false
    field :name, String, null: false
  end
end
```

コンソールでオブジェクト型の拡張が確認できました。

```rb
[1] pry(main)> Types::UserType.to_graphql.description
=> "hogehoge"
```

# 注意点
graphql-rubyは2.0時点でのレガシーオブジェクトの撤廃を予定しており、そのタイミングで`to_graphql`メソッドも使えなくなります。
また2.0になる前にgemの挙動が変わる可能性もあるので、この拡張を使う際はその辺に注意する必要があります。

# 参考
詳しくは[公式ドキュメント](https://github.com/rmosolgo/graphql-ruby/blob/master/guides/type_definitions/extensions.md)を参照ください。
OpenCVで画像のトリミングをしてみた

## なにをしたか？
####→OpenCVを使って画像のトリミング

### <実装手順>
1.ライブラリのインポート
2.画像の読み込み
3.高さ・幅の定義
4.画像のトリミング
5.画像の保存

##実際にやってみた
###1.ライブラリの読み込み
~~~Python
import cv2
~~~ 

###2.画像の読み込み
~~~Python
img = cv2.imread('./data/pict/image1.jpg')
~~~ 

imread関数を使って画像の読み込みを行います。

###3.高さ・幅の定義
~~~Python
height = img.shape[0]
width = img.shape[1]
~~~

shape[0],shape[1]がそれぞれ高さ、幅を意味しています。

###4.画像のトリミング
~~~Python
image6 = img[80:height , 80:width]
~~~
左上から高さ・幅80ピクセルずつ除きます。


###5.画像の保存
~~~Python
cv2.imwrite('./data/pict/image6.jpg' , image6)
~~~
imread関数を使って画像を保存します。


その結果、
####もとの画像(image1)
![image1.jpg](https://qiita-image-store.s3.amazonaws.com/0/317125/bef48595-69a4-0b1b-9cef-07c70d834c11.jpeg)

を読み込み

####出力後の画像(image6)
![image6.jpg](https://qiita-image-store.s3.amazonaws.com/0/317125/4880e9c8-cbad-6c57-a9d6-94061b807bbe.jpeg)


が保存され、
左上からx,y方向に80ピクセルの部分がカットされ、画像がトリミングされていることが確認できました。
Webアクセシビリティについて改めて考える（2018年）

## 概要
本記事は、Webアクセシビリティの具体的な対応方法については述べず、Webアクセシビリティに関する大まかな概要と動向についてまとめています。「Webアクセシビリティって結局なにかれやればいいんだっけ？」というような方の参考になれば幸いです。

## Webアクセシビリティとは？
**高齢者や障害者など年齢的・身体的条件に関わらず、すべての人が等しく、情報にアクセスし利用できること**（アクセシビリティ対応≠障害者対応）
### Webアクセシビリティは大きく分けて2つに分類できる

#### ヒューマンリーダブル（人が理解できること）
**人が身体的感覚で情報を読み取れること**
見やすく、聞きやすく、探しやすい、読みやすい、区別しやすい、予測しやすい（表示や挙動）
#### マシンリーダブル（機械が理解できること）
**機械（プログラム）が情報を読み取れること**
画像や写真、動画の代替テキストを設定しているか、セマンティックなマークアップであるか

参考：[次世代Webはブラウザの外にある](https://yasuhisa.com/could/article/nextwebconf-2015/)
（余談ですが[yasuhisa](https://twitter.com/yhassy)さんが配信されている[Automagic Podcast](https://yasuhisa.com/could/)はアクセシビリティ関連の話題もよくされていておすすめです）

## 日本においての状況
2016年4月の障害者差別解消法をきっかけに、JIS X 8341-3:2016 レベルAAへの準拠が公的機関のウェブサイトに求められるようになった。また、2020年の東京オリンピック、企業のグローバル進出やそれに伴う各国の法規制など、Webアクセシビリティ対応の重要性が増している。
（実際、駆け込み需要的に自治体からのアクセシビリティについての相談や依頼が多くなったと感じます）

参考：[米国でウェブアクセシビリティ訴訟は増加の一途](http://agora-web.jp/archives/2028130-2.html)

## どのガイドラインを参考にすればいいのか
JIS規格（IS X 8341-3:2016）と国際規格（ISO/IEC 40500:2012）は、W3Cのガイドライン（WCAG2.0）と同じ内容になったため、JIS X 8341-3:2016に対応することで、WCAG 2.0にも準拠することになる。つまり、JISのガイドラインに従うことで、最低限満たしておくべき品質（アクセシビリティ）の確保ができるということ。

参考：[ウェブアクセシビリティ規格「JIS X 8341-3:2016」について理解しよう](https://www.asobou.co.jp/blog/web/jisx8341-32016)

## Webアクセシビリティ対応の進め方
実際に取り組むにあたって、どこから始めていいか迷う方も多いと思いますが、おおまかに下記の順序に沿って対応を進めます。比較的規模の大きいサイトでは、最初から全てのページで取り組むのは現実的ではないため、主要50ページ等対象範囲を決めてから、順次対応していきます。

1. ウェブアクセシビリティ方針の策定（対象範囲や目標を決める）
2. 対象範囲内で実際に取り組む
3. ガイドラインを元に対応したページの試験を実施
4. サイトに試験結果を公開
5. 運用・改善

参考：
[みんなの公共サイト運用ガイドライン（2016年版）](http://www.soumu.go.jp/main_sosiki/joho_tsusin/b_free/guideline.html)
[miChecker（アクセシビリティチェックツール）](http://www.soumu.go.jp/main_sosiki/joho_tsusin/b_free/michecker.html)

## 各社の取り組みについて
- [「アクセシビリティに取り組むことが価値あるサービスづくりにつながる」サイバーエージェント技術者たちの取り組み](https://developers.cyberagent.co.jp/blog/archives/7041/)
- [Frontrend Vol.9 – 春の新人歓迎 マークアップ/アクセシビリティのキホン サイバーエージェント](https://developers.cyberagent.co.jp/blog/archives/6758/)
- [freeeのアクセシビリティ、いまとこれから](https://docs.google.com/presentation/d/1D2DP0aP4l5N3MKNtt-LbfLeAEexkXYs4snC8vmzur3o/edit#slide=id.g30bc8c2c73_0_274)
- [アクセシビリティへの取り組み | サイボウズ](https://cybozu.co.jp/efforts/accessibility/)
- [アクセシビリティの取り組み「インクルーシブデザイン」の活用 | ヤフー](https://about.yahoo.co.jp/blog/column/2017/12/27/accessibility.html)

興味のある方は、[「アクセシビリティの祭典」](http://accfes.com)というイベントも毎年開催されているようなので参加してみてはどうでしょうか（私は地方なので参加難しそうですが。。動画配信を切実に希望）

## 最後に
昨今、Webアクセシビリティと同じ文脈で「インクルーシブデザイン」という言葉を聞きますが、これは *高齢者、障がい者、外国人など、従来、デザインプロセスから除外されてきた多様な人々を、デザインプロセスの上流から巻き込むデザイン手法* を指しているようです。

アクセシビリティ対応を行っていく上で、ガイドラインに準拠することが目的になってしまいがちですが、その先の利用するユーザーを第一に考えるということを忘れず、今後もWebアクセシビリティについて注視していきたいと思います。

参考：[英語圏のウェブアクセシビリティ コミュニティで語られる「インクルーシブデザイン (inclusive design)」について](https://website-usability.info/2017/07/entry_170720.html)
HTML5 Conference 2018でのアクセシビリティに関するセッション
[アクセシビリティ、はじめよう! 〜「できない」から脱出するための20（仮）のネタ🍣〜](https://docs.google.com/presentation/d/1iaF3oQbx-nN8h1suyvDRFm5DAgvZE1DwbFwkmlV2JYU/edit#slide=id.g46e8befc71_0_291)
メモ：「３０日でできる！OS自作入門 」2日目

### 第２章 プログラム本体のアセンブリ
- レジスタの説明も命令の説明も雰囲気で理解した

```
entry:
    MOV AX, 0
    MOV SS, AX
    MOV SP, 0x7c00
    MOV DS, AX
    MOV ES, AX
putloop:
    MOV AL, [SI]
    ADD SI, 1
    CMP AL, 1
    JE fin
    MOV AH, 0x0e
    MOV BX, 15
    INT 0x10
    JMP putloop
fin:
    HLT
    JMP fin
msg:
    DB 0x0a, 0x0a
    DB "hello, world"
    DB 0x0a
    DB 0
```

AX - Accumulator
CX - Counter
DX - Data
BX - Base

SP - Stack Pointer
BP - Base ...
SI - Source Index
DI - Dest Index

AL, AH, EAX の違いはなんとなく分かっていた。

ES - Extra Segment
CS - Code Segment
SS - Stack Segment
DS - Data Segment
FS - Extra2
GS - Extra3

BX, BP, SI, DI は Indexとして使える。なるほど

CMP, JE, INT は雰囲気で理解した

- community.osdev.info が動いていないことが今分かった（たまたま？）

0x7c00 を決めたのは IBM のおじさんｗ

lst ファイルは disassembly したものと似たようなもの

付いている Makefile は Windows 用なので、.exe を消したりして動くようにした。

edimg とかは挙動あまり分かっていない。（img 作ってくれるぐらい）

helloos3, helloos4, helloos5 問題なく動いた。

helloos5 の JMP entry を JMP msg にしても qemu 上は何も表示されなかった。

さて明日は 第３章の C のコンパイルできるかなぁ。。gcc / clang あたりでやりたいですが、この調子だと動かなさそう。。
Netlify で Devops 的にサイトを管理してみる

# Netlify で Devops 的にサイトを管理してみる

[Netlify](https://www.netlify.com/) はサイトをホスティングできるサービスですが、[GitHub](https://github.com/) にサイトのデータを置いて連携していく感じです。

## 前提条件

- GitHub に適当なレポジトリを作成して、適当な `index.html` でもコミットしておきましょう。

## とりあえず Netlify に登録

[Netlify](https://www.netlify.com/) に行って、右上の [Sign up](https://app.netlify.com/signup) をクリックします。

![netlify_001.png](https://qiita-image-store.s3.amazonaws.com/0/318450/c5c0f6c3-a036-4b80-da0f-3b71fb19f646.png)

今日は GitHub と連携したいので、GitHub でサインアップしてください。

## レポジトリろ連携します

![netlify_002.png](https://qiita-image-store.s3.amazonaws.com/0/318450/2d36840b-d79b-bcf0-eb8f-cb1d9da63bf0.png)

[New site from Git](https://app.netlify.com/start) をクリックします。

![netlify_009.png](https://qiita-image-store.s3.amazonaws.com/0/318450/71c29b6f-c971-3b30-a065-49572425a9c5.png)

GitHub をクリックします。

作成しておいたレポジトリを選択してから、Deploy site をクリックします。

これで、連携できました。

## サイトを表示してみる

連携後に表示された画面に URL(https://<サブドメイン>.netlify.com/) が書かれているのでクリックしてみましょう。
GitHub にコミットしていた HTML が表示されると思います。

## サイトを修正してみる

`index.html` を修正してコミットしなおしてみます。
コミット後に、修正されたサイトが表示されるはずです。

## まとめ

コミットしたら、自動デプロイされるというちょっと DevOps 的なサイト公開フローになったと思います。
Netlify へのレポジトリ登録も DevOps 的に Terraform でやろうとしたのですが、時間不足でうまくいかなかったのでまた今度やりたいと思います。
utuntu18.04にansible-playbookを実行したらpython: not foundになった時の対処

- ubuntu18.04のサーバにansibleでセットアップしようとしたら、以下のエラーがでた。pythonコマンドが見つからないという。

```
$ ansible-playbook -i staging server_provision.yml -C -v                                                                                                                                   

PLAY [web02] ******************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************
fatal: [stg.server]: FAILED! => {"changed": false, "module_stderr": "Shared connection to 35.***.***.*** closed.\r\n", "module_stdout": "/bin/sh: 1: /usr/bin/python: not found\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 127}
        to retry, use: --limit @/Users/user01/playbook/gce_server_provision.retry

PLAY RECAP ****************************************************************************************************************************
stg.server : ok=0    changed=0    unreachable=0    failed=1   
```

- 今時のubuntuでpythonがないなんてことあるんかいな…と思ってサーバ上で確認するうと`python3`という名前では使える。python2とpython3の同居のためなのか、pythonという名前にはlinkしていないようだ。
- 対処法を探してみると、ansibleのFAQに以下のような説明があった。
    - [Frequently Asked Questions — Ansible Documentation](https://docs.ansible.com/ansible/latest/reference_appendices/faq.html#how-do-i-handle-python-not-having-a-python-interpreter-at-usr-bin-python-on-a-remote-machine)  
- 要点だけ書くと`「inventryファイルの任意のホストに変数ansible_python_interpreterでインタプリタを指定すればそれで置換するよ。」`とのこと。

- inventoryに以下をのように記述を追加した。

```:staging
[web02]
stg.server   ansible_python_interpreter=/usr/bin/python3
```

- 再度、ansible-playbookしたらうまく行った。
- pythonの2と3の奴には、何年経ってもたまにつまづくね。。。
LaravelのプロジェクトにAdd to homescreenを実装してみた

# GameWith Advent Calendar 2018

この記事は[GameWith Advent Calendar 2018](https://qiita.com/advent-calendar/2018/gamewith) の18日目になります！

# はじめに

自分で作ったサイトに勉強を兼ねてAdd to homescreenを実装しました。

AndroidやWindowsで最新Chromeであればこのようにデスクトップに追加できます。

[https://www.holy-place-photo.com/](https://www.holy-place-photo.com/)にアクセスをし、右側の三点リーダーから『「Holy Place Photo」インストールしています』をクリックします。

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/81308/3fa954ab-dc65-0e04-5278-553d354a6a17.png)

バナーが表示されるので「インストール」をクリックします。

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/81308/eb229cc9-d607-c8f6-09e6-5ec3f720dc87.png)

クリックするとブラウザではなく単独のアプリケーションとしてHoly Place Photoが起動します。

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/81308/97e262a9-2795-6889-5083-4c9df1ce62cb.png)

単独のアプリケーションなのでデスクトップにアイコンができ、タスクバーにも表示されます。

![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/81308/afc0313e-bb08-b281-bf7e-bc335ed32910.png)

また、Chromeのアプリ一覧にも表示されます。

![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/81308/2aec68c9-3ebd-6972-7657-4bd185a53584.png)

削除するときはChromeのアプリ一覧から右クリックをし、「Chromeから削除...」をクリックすることで、削除できます。

![6.PNG](https://qiita-image-store.s3.amazonaws.com/0/81308/333aee73-5c1a-62be-0965-2fec267970fb.png)

## 実装

### manifest.json

まずはAdd to homescreenの肝であるmanifest.json。

public直下に置いています。

また、auncher-144x144.pngとlauncher-512x512.pngもpublic直下に置いてます。

```json:manifest.json
{
  "short_name": "HPP",
  "name": "Holy Place Photo",
  "icons": [
    {
      "src": "launcher-144x144.png",
      "type": "image/png",
      "sizes": "144x144"
    },
    {
      "src": "launcher-512x512.png",
      "type": "image/png",
      "sizes": "512x512"
    }
  ],
  "background_color": "#fff",
  "theme_color": "#e1e4e8",
  "orientation": "portrait",
  "start_url": "/",
  "display": "standalone"
}
```



### HTML

作成したmanifest.jsonはlinkタグで読み込みます。

```html
<link rel="manifest" href="/manifest.json">
```

### service worker

fetchを書かないと動かないそうです（空でよい）

public直下に置きます。

```javascript:sw.js
self.addEventListener('install', (e) => {
  console.log('ServiceWorker install')
});

self.addEventListener('fetch', (e) => {
});
```

### JavaScript

上記に書かれているsw.jsを読み込んでいます。

```javascript
if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/sw.js').then( (registration) => {
    // 登録成功
    console.log('ServiceWorker registration successful with scope: ', registration.scope);
  }).catch((err) => {
    // 登録失敗 :(
    console.log('ServiceWorker registration failed: ', err);
  });
}
```

## デバッグ

Chromeであれば開発者ツールのApplicationのManifestの「Add to homescreen」からテストができます。

※ただし、localhost or httpsでアクセスしているときのみ

<img width="641" alt="スクリーンショット 2018-12-18 0.33.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/a2dc7ff3-7fb8-904d-b9ae-77b1571a09d1.png">

# おわりに

コピペで簡単に実装できますが、デスクトップアプリケーションになったことで、デメリットもあります（単独のアプリケーションで動くので、検索したいときにChromeに切り替えたりなど）

HTML5でのセッションでも、プロダクトにはUIUX設計をしてから入れるべきと会話されていました。

~~それでも新しい技術使いたい気持ちもわかる~~

次はオフラインキャッシュ実装してみようと思います！
Progressive sampling の最近の発展(2018 年)

主にレンダラで用いられる progressive sampling の最近の発展をまとめました.


Sequences with Low-Discrepancy Blue-Noise 2-D Projections
https://perso.liris.cnrs.fr/dcoeurjo/publications/perrier18eg.html

利点: Progressive 対応. ソースコードつき(ライセンスは不明)

Progressive Multi-Jittered Sample Sequences
https://graphics.pixar.com/library/ProgressiveMultiJitteredSampling/paper.pdf

利点: Pierrer18 では, サンプル数が 16 のべき乗でないとうまく分布しないが, progressive multi-jitter はサンプル数の制約が少ない

http://extremelearning.com.au/a-simple-method-to-construct-isotropic-quasirandom-blue-noise-point-sequences/

利点: Christensen18 に比べてシンプルで実装が容易. 

C++ で実装してみました.
https://gist.github.com/syoyo/831c4b1926aa88c0da9221211723da2d
[Mac]VScode で ruby-rubocop が動かなくなったら executePath を設定してみよう

世間では Advent Calendar が大変盛り上がっている今日この頃ですが今日もふつうの小ネタ記事をお送りいたします＼(^o^)／

## 概要
Windows で Rails 等の開発をしていた際に、VScode に ruby-rubocop をインストールして、リアルタイムに rubocop のエラーが出るようにしていました。

- [ruby-rubocop - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=misogi.ruby-rubocop)

ちょっと前に Mac に作業環境を移行した際にも同様の拡張機能をインストールしましたが、何故か Mac では rubocop のリアルタイムチェックが行われませんでした。それを解消した際の記録を事例として紹介します。

## 対象環境
- MacBook Air (13-inch, Early 2015)
- macOS 10.13.6 High Sierra
- Visual Studio Code(バージョン 1.27.2)

## 事象
https://github.com/misogi/vscode-ruby-rubocop#rubocop-for-visual-studio-code
Windowsで開発していたころは上記のように rubocop の警告内容がリアルタイムに表示されていたのですが、Macでは下線も警告も何も出ていないことに気がつきました。(rubocop の警告が何も出ていないと思い込んでいた)

さらに VScode の通知欄をよく見ると、下記2点のエラーが出ていたことに気がつきました。

- `rubocop is not excutable` 
- `execute path is empty! please check ruby.rubocop.executePath`

## 解消手順
ということで前述のエラーの解消をすれば直るんじゃないか？と思った次第です。
上記のメッセージに従って、ruby.rubocop.executePath を追加しましたのでその際の流れを下記に記載します。

### 1. rubocop の実行パス確認
コマンドで確認するのが簡単で確実ですね。

```sh
$ which rubocop
/Users/{MyUserName}/.rbenv/shims/rubocop
```



### 2. VScode の設定ファイルに追記
基本設定 > 設定 > ユーザー設定 > 拡張機能 > ruby-rubocop に前項で控えたものを下記のように貼り付けます。rubocop コマンドを実行するフォルダまでわかればいいので、最後の rubocop までは書く必要ありません。
![貼り付けた画像_2018_12_17_16_32.png](https://qiita-image-store.s3.amazonaws.com/0/70638/00abe5f6-cfb0-341d-25e9-79538384c3f3.png)


## 結果
リアルタイムで rubocop の警告が出るようになりました。
![スクリーンショット_2018-12-17_16_43_32.png](https://qiita-image-store.s3.amazonaws.com/0/70638/e89ce5e3-3510-8388-d20e-085c21c180f2.png)


## 推定要因
> //If not specified searches for 'rubocop' executable available on PATH (default and recommended)
> "ruby.rubocop.executePath": "",

上記は [公式ドキュメント](https://github.com/misogi/vscode-ruby-rubocop#configuration) からの引用です。
推測の域は出ませんが、上記のとおり本来はこの項目の設定はしなくても rubocop の実行パスは環境変数からうまいこと取得してくれるようです。ただ、当方の環境では [rbenv](https://github.com/rbenv/rbenv) 経由で ruby を使っているからそのへんがうまくいってないゆえに起こる事象のように思えます。
Windows では ruby のインストーラで直接インストールしていたのでこの問題は起きなかったと考えれば辻褄は合いそうです。

このリアルタイム警告があるとないでは作業効率がぜんぜん違うと思います。もし同様の例が起きた際には参考にしていただければ幸いです。とはいえ最終的にはコマンドで `rubocop` すれば済むので急ぎの方はコマンドで対応しましょう(身も蓋もないですがｗ


## 参考
- [misogi/vscode-ruby-rubocop: Rubocop extension for Visual Studio Code](https://github.com/misogi/vscode-ruby-rubocop#configuration)
- [ruby - rubocop on VScode not working.Error "rubocop is not executable" - Stack Overflow](https://stackoverflow.com/questions/53367947/rubocop-on-vscode-not-working-error-rubocop-is-not-executable)
Firebase超概要

# Firebaseとは
* 爆速でサービスが作れるGoogleのすごいPaaSです
* 次のサービスがあります
  * 静的コンテンツを提供できるHosting
      * htmlやjavascriptファイルを置きます
  * サーバレスのfunctions
      * サーバーとして動的コンテンツ生成
      * 他のサービスのイベントをトリガーとして処理を実行
  * オブジェクトストレージのStorage
      * 画像とかのファイル保管に使えます
      * 一時URLを発行し、コンテンツ共有等にも使えます
  * NoSQL DB の Firestore
      * jsonをそのまま突っ込めるデータベースです
      * クエリも使えます。トランザクションもあります
      * クライアントからwebsocketでアクセスし、**DBの変更をリアルタイムにクライアントに反映**できます
          * お堅いインフラ屋としては、クライアントがDBに直接アクセスするとかいろいろ衝撃でした 
      * 完全なオフライン時には、キャッシュからデータを引き出してくれます
  * いろんな認証をサポートするAuthentication
      * GoogleアカウントやTwitterアカウントでの認証がかなり簡単にできます         
  * Google アナリティクス 連携
  * ABテスト
  ...等

* **無料です！！**
  * ただし、無料だと制限もあります
  * 一番大きいのは、**FunctionsがGoogle外部へアクセスできない**という制約です
      * Qiita APIを呼び出して。。。等の処理ができません:cry:  
  * 後はアクセス数とか容量とかそのへんの制約です
  * [料金とプラン](https://firebase.google.com/pricing/?hl=ja)に詳細があります

* よくMBaaSと言われますが、それだけではありません
  * 普通にSPAのWebサイトも作れます
  * 話題のPWAも作れます

* SPAのシステムを作る場合のサービス構成例
![image.png](https://qiita-image-store.s3.amazonaws.com/0/304012/fb6b6a17-9ab3-f8db-b3b4-c1a1b7395d09.png)



* これは使うしかないですね！
  * という訳でFirebaseの解説記事を連載していきます
      * [Firebase+Reactの開発環境構築とはまりどころ解説](https://qiita.com/ozota/items/2afff1267ef0d7524725)
テストってなにすればいいの？

#前説
普通のウォータフォールの開発工程で、テストケースを作るときにどうゆうところに気をつければいいのか、って記事です。
#観点
スタートとなるのは、**そのテストで何を確認したいのか**を意識すること。
黙々とマトリクスを作ったりしてると、これを忘れがちです。
ケースの作成は手段であって目的ではありません。
工数との兼ね合いかと思いますが、思考迷子になったら初心に立ち返りましょう。
単体、結合、総合、って感じで規模が大きくなっていくので、その規模に合わせてケースを考えます。
その場合、テストの単位が小さいほど人間性を排して網羅的な思考が必要となり、大きくなるほど業務的なユースケースを想定した思考が必要になります。

##単体
ここでいう単体は、一番小さい単位のテストを指しています。
単位テストは基本的に**処理の分岐**が確認したいです。

```java
if (varNumber < 100)
```
↑こうゆうのが出てきたらvarNumberが100より下のパターンと100以上のパターンをやろう、ってことです。
また、その場合境界値でチェックするのが基本です。

```java
if (varNumber < 100 || varNumber2 < 50 ) 
```
↑条件が二つ出てきた場合、真偽値がそれぞれ「true:true」「true:false」「false:true」「false:false」のパターンはやっておくべきかと思います。

```java
if (varNumber < 100 || varNumber2 < 50 ) 
  if (varChar == "hoge" || varChar2 == "hogee") {
    // いろいろ処理
  }
}
```
↑これは条件が4つあるので本来は2の4乗のパターンでやるのが理想かと思います。
ただ、処理のところでも分岐があったりすると膨大な数になるので、Numberの4パターン、Charの4パターン、という風に似た意味の分岐でわけて実施するのが現実的です。

```java
multiNumber = varNumber * varNumber2;
```
↑四則演算が出てくるところは注意が必要で、上限値がいくつになるのか、小数点はどこまで許容するのか、など考慮しつつケースを作成する必要があります。

ここらへんは機能のことを考えつつ取捨選択の必要がありますし、プロジェクトの方針に沿ってよしなにやりましょう。
##結合
結合は機能と機能をくっつけて行うテストなので、**機能同士の連携**と**データの受け渡し**の確認が主です。
機能Aで作ったデータを利用して、機能Bがちゃんと処理してくれるかを見ます。
ありえるエラーパターンとしては、機能Aで作ったデータの型や値の範囲が機能Bで許容できないものだった、などです。

・APIとの結合
この場合、エラーコードのパターンを見ておく必要があります。
WebAPIを呼ぶ際、不正な値を渡してるつもりなのにHttpStatusCode500を返してくるのはおかしいよね、って話です。

・Web画面での結合
フロントエンドだと画面遷移が観点に入ってくるので、起こりうる遷移パターンを網羅するケースを考えます。
##総合
呼び名は色々あるかと思いますが、システム全体を通してのテストを指しています。
システムとしてのテストなので、**要件を満たしているか**、がすべてです。
実際に運用するときのことを想定し、存分にユースケースを考えましょう。
結合まで行っているのであれば機能としての繋がりは保証されているはずなので、このフェーズでエラーが出ることはそうありません。
無いと信じたい。

#おわり
もともとテストケースのわかりやすい書き方の記事のつもりだったのに観点の話だけで終わってしまった。
GitHubPagesを使ったBlogに草を生やす

GitHubPagesを使って、[Blog](https://19700101000000.github.io/)を書いているのですが、GitHubPagesに草を生やす機能を作成したので、ざっくり解説します。

## 前提知識
- GitHubPagesでは[Jekyll](https://jekyllrb.com/)を利用したWebPageを作成することが可能で、BlogはJekyllを利用して書いています。
- Jekyllでは[CoffeeScript](https://coffeescript.org/)を使用することが出来るので、使用しています。
- また、個人的に[vue.js](https://vuejs.org/)を気に入っているので、使用しています。

## 作ったもの
![Screenshot_20181217_192628.png](https://qiita-image-store.s3.amazonaws.com/0/288199/6a1a4436-b313-130b-1302-c8bdb98ed5e0.png)
こんな感じのものを作成しました。

## 解説
- [/assets/json/posts_date.json](https://github.com/19700101000000/19700101000000.github.io/blob/master/assets/json/posts_date.json)
- [/_data/grow-grass.yml](https://github.com/19700101000000/19700101000000.github.io/blob/master/_data/grow-grass.yml)
- [/assets/js/grow-grass.coffee](https://github.com/19700101000000/19700101000000.github.io/blob/master/assets/js/grow-grass.coffee)

上記3つのファイルで構成されています。

### posts_date.json
このJSONファイルは、書いた記事を日付別に扱うために存在しています。
~~Jekyllの記法を使って書いていること、JSON出力結果に無駄な空白を入れないために非常に可読性の低いファイルになっています~~
`Jekyll`では、記事一覧をループを使用して取り出すことは出来るのですが、日付別に取り出すことが出来ない＆仮に独自に日付毎に取り出すプラグインを作成したとしても、`GitHubPages`で使えない可能性がある(※未検証)ため、このようなファイルを作成しています。
非常に可読性が悪いのですが、最終的に次のような`JSON`が出力されています。

```json:posts_date.json
{
  "yyyy-mm-dd": [
    {"title": "...","url": "..."},
    ...
  ],
  ...
}
```
この`JSON`ファイルを利用して、日付毎の記事の有無を判定しています。

### gorw-grass.yml
このファイルは、背景色、月名、曜日名の値をまとめたものになります。
変更するときに、いちいちソースコードを読むのが面倒なのでこのように外部に出しています。

```yml:gorw-grass.yml
# BackGroundColor
less: 'dimgray'
one: 'rosybrown'
two: 'indianred'
more: 'firebrick'

# MonthName
month:
  jan: 'Jan'
  feb: 'Feb'
  mar: 'Mar'
  apr: 'Apr'
  may: 'May'
  jun: 'Jun'
  jul: 'Jul'
  aug: 'Aug'
  sep: 'Sep'
  oct: 'Oct'
  nov: 'Nov'
  dec: 'Dec'

# WeekName
week:
  sun: ''
  mon: 'mon'
  tue: ''
  wed: 'wed'
  thu: ''
  fri: 'fri'
  sat: ''
```
`less` ~ `more` はそれぞれ`CSS`の背景色に対応しています。

- `less`: 記事が0件
- `one`: 1件
- `two`: 2件
- `more`: 3件以上

`month`と`week`は月名と曜日名に対応しています。
ここを日本語に書き換えれば、日本語の曜日名と月名を表示可能です。
表示しない場合は、空文字を指定します。

### grow-grass.coffee
この`*.coffee`は`*.js`に置き換わります。
なので、`HTML`側で呼び出すときは、`grow-grass.js`を呼び出します。

```coffeescript:grow-grass.coffee
grow_grass = new Vue {
  delimiters: [
    '$'
    '$'
  ]
  el: `#grow-grass'
  # ...
}
```
`jekyll`で変数を呼び出す場合と`vue.js`で変数を呼び出す場合に、どちらも2重波括弧を使用します。なので`vue.js`側を`$`囲みに変更しています。
あとは、良い感じに`coffeeScript`で`vue.js`を書いています。

```html
<div id="grow-grass"></div>
<script async src="{{ site.url }}/assets/js/grow-grass.js"></script>
```
これで表示されます。

## まとめ
今回文字色と背景色は指定していないため、読み込んだ環境に依存すると思います。
なので、`gorw-grass.yml`の色さえ変更してしまえば、比較的どの環境にも移植しやすいのかな？と思います。
もし、`GitHubPages`で、`Jekyll`を使ってブログを書く機会があれば使用してみてください。
どのような感じに表示されるか気になる方は[こちら](https://19700101000000.github.io/)で確認してみてください。