OmniAICreator/Qiita-1.07M huggingface dataset:
Matplotlibの使い方

## 準備
```plot_figure.py
import numpy as np
import matplotlib.pyplot as plt
```

## plot関数
平面の折れ線グラフや散布図に使う

**折れ線グラフ**

```plot_figure.py
x = np.arange(-3,3,0.1)
y = np.sin(x)
plt.plot(x,y)
plt.show()
```

=> x=-3,3,0.1の時のsinの値をグラフ化
![plt1.png](https://qiita-image-store.s3.amazonaws.com/0/145075/7fa0c1cd-2575-f337-93b7-f3e3cbc2bc03.png "plt1.png")


- `np.arange`はx軸になる数字の列を作成するもの
- plot関数の第一引数がx軸、第二引数がy軸になる
- show()でグラフを描写

**散布図**

```plot_figure.py
x = np.random.randint(0,10,30)
y = np.sin(x) + np.random.randint(0,10,30)
plt.plot(x,y,"o")
plt.show()
```

![plt2.png](https://qiita-image-store.s3.amazonaws.com/0/145075/a943de80-4eaa-ab41-2aa2-18ab111ea733.png "plt2.png")

- plot()の第三引数の"o"は小さい円マーカー
- "ro"で赤(red)のマーカーにすることもできる

## hist関数
ヒストグラムを描写する

```plot_fugure.py
plt.hist(np.random.randn(1000))
plt.show()
```

![plt3.png](https://qiita-image-store.s3.amazonaws.com/0/145075/e44ce80c-d81a-33cb-5a79-c8e84e56277c.png "plt3.png")

## タイトル => title関数

```plot_figure.py
plt.hist(np.random.randn(1000))
plt.title("Histgram")
plt.show()
```

![plt4.png](https://qiita-image-store.s3.amazonaws.com/0/145075/fb563d86-2d93-32be-1ae0-c023afaff6a7.png "plt4.png")

## y軸の範囲 => ylim関数

```plot_figure.py
x = np.arange(0,10,0.1)
y = np.exp(x)
plt.plot(x,y)
plt.title("exponential function $ y = e^x $")
plt.ylim(0,5000) # y軸を0~5000の範囲に指定
plt.show()
```

![plt5.png](https://qiita-image-store.s3.amazonaws.com/0/145075/febefdb2-2312-0578-395c-5605ed35aaf6.png "plt5.png")

## 破線を引く => hlines関数
複数のグラフを同じ領域に描写するには、単純に2度呼び出せば良い
y=-1,y=1の直線をhlines関数で描写する

```plot_figure.py
xmin, xmax = -np.pi, np.pi
x = np.arange(xmin, xmax, 0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)
plt.plot(x, y_sin)
plt.plot(x, y_cos)
plt.hlines([-1, 1], xmin, xmax, linestyles="dashed")  # y=-1, 1に破線を描画
plt.title(r"$\sin(x)$ and $\cos(x)$")
plt.xlim(xmin, xmax)
plt.ylim(-1.3, 1.3)
plt.show()
```

![plt6.png](https://qiita-image-store.s3.amazonaws.com/0/145075/177a9afc-ab60-1428-07a7-f08a51c3131d.png "plt6.png")

## 別々のグラフを1つの図に描写する => subplot関数
1つの図に収めたいプロットの行数、列数、プロットの番号を指定

```
plt.subplot(行数、列数、プロットの番号)
```

先ほどの図の2つの関数を上下に分割してみる
上下に分割するので行数は2となる
列数は1

```plot_figure.py
xmin, xmax = -np.pi, np.pi
x = np.arange(xmin, xmax, 0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)

# sinのプロット
plt.subplot(2,1,1)
plt.plot(x,y_sin)
plt.title(r"$\sin x$")
plt.xlim(xmin,xmax)
plt.ylim(-1.3,1.3)

# cosのプロット
plt.subplot(2,1,2)
plt.plot(x,y_cos)
plt.title(r"$\cos x$")
plt.xlim(xmin,xmax)
plt.ylim(-1.3,1.3)

plt.tight_layout() # タイトルの被りを防ぐ
plt.show()
```

![plt7.png](https://qiita-image-store.s3.amazonaws.com/0/145075/b6c7de9f-5b8b-4452-536d-4754e8e4ebaf.png "plt7.png")

- subplot(2,1,1)の代わりにsubplot(221)と書くこともできる

## 参考
[matplotlib入門](http://bicycle1885.hatenablog.com/entry/2014/02/14/023734)を参考に勉強させていただきました。
VMware ESXi 4.1をHP Proliant ML110 G5にインストール with Mac

# 概要
VMware ESXi 4.1をHP Proliant ML110 G5にインストールする。 
 インストール用ISO ファイルをCD-ROMに焼いて起動してもインストーラがDVD-ROMを認識しないのでMacで起動用USBを作成する。

# 環境
* VMWare ESXi 4.1 Update 3
* HP Proliant ML110 G5, CPU Celeron 440, 2GB Memory  
  VMWare 5は2コアが必要なのでインストール出来なかった。
* macOS Sierra

# 手順

1. ESXi 4.1のISOイメージをダブルクリックしマウントする。
2. imagedd.bz2をデスクトップにコピーする。
3. imagedd.bz2をダブルクリックして解凍する。
4. USBメモリを挿す。
5. USBメモリのマウントポイントを確認する。

    ```コマンド
$ diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *1.0 TB     disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                  Apple_HFS Macintosh HD            999.3 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
　
/dev/disk3 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *1.0 GB     disk3
   1:                 DOS_FAT_32 VMWARE                  1.0 GB     disk3s1
```

6. USBメモリをアンマウント

    ```
$ sudo unmount /dec/disk3s1
Password:
Volume VMWARE on disk3s1 unmounted
```

7. 解凍したimageddをUSBに書き込む  

    ```
$ sudo dd bs=1m if=~/Desktop/imagedd of=/dev/disk3
Password:
900+0 records in
900+0 records out
943718400 bytes transferred in 1308.918382 secs (720991 bytes/sec)
```

8. USBメモリに出来たパーティションを取り出す
9. USBメモリをMacから抜く
10. USBメモリをML110 G5のUSBポートに挿して起動

### 動いたっぽい！
AWS CLI での備忘録

AWS コマンドラインインターフェイスは基本コンソールでGUI操作するって人も知っておくとかなり便利です。
私がよく使うコマンドを備忘録がわりに投稿します。
ちなみに、今は開発者プレビューですが、オートコンプリートとかをしてくれる[aws-shell](https://github.com/awslabs/aws-shell)ってのも出てます。

# 基本設定

## AWS-Cliのインストール（Mac）

```
pip install awscli
```

AWS-CliにはPython 2.6.5 以降が必要です。
pythonが入っていない場合(Macはプリインストールされてるはずなので、ないとは思いますが、、)
[Python.org/downloads](https://www.python.org/downloads/)から落とすか、下記を実行

```
python --version　　# これで2.6.5以上であればOK
brew install python # homebrew入ってればこれでインストールできる
```

pipが入っていない場合は、

```
python get-pip.py
```

## AWS-Cli設定
下記のAccess KeyとSecret Access KeyはIAMの[認証情報] > [アクセスキー]から作成する

```
$ aws configure
Access Key ID: XXXX
Secret Access Key: XXXX 
region: ap-northeast-1 # 自分が主に使っているリージョンを設定
```


# S3操作
S3でよく使うのは下記

## バケット一覧表示
```
$ aws s3 ls
```
## ローカルとS3とのファイル操作
```
aws s3 cp . s3://hoge/ --recursive  # localのhoge_localというdirectoryをhogeというバケットに全部アップロードする場合
aws s3 cp s3://hoge/ ./hoge_local --recursive # localのcurrent directoryにhogeというバケットの中身を全部コピーする場合
```
## ローカルとの同期
```
$ aws s3 sync hoge_local/ s3://hoge/ --delete # localのhoge_localというdirectoryをhogeというバケットを同期
``` 
## ファイル削除
```
$ aws s3 rm s3://hoge/ --recursive  # hogeというバケットを削除
```
任意の日付フォーマットでgit logを表示する

メモ



git logのフォーマットを指定する
http://qiita.com/harukasan/items/9149542584385e8dea75


上のリンクにあるように `$ git log --date=<option>` でいくつかのオプションを指定できるのですが
local, iso, rfcは文字列が長いし、shortだと日時が表示されません。
`$ git log --oneline` や `$ git log --graph` の時に短くて自分にとって視認性の高いフォーマット指定やりたいですよね。

こんな指定をすれば、任意のフォーマットで表示できます。
`--date=format:'%Y/%m/%d %H:%M:%S'`

sample

```
$ git log --oneline --pretty=format:'%h [%cd] %d %s <%an>' --date=format:'%Y/%m/%d %H:%M:%S'
8e3fce6 [2017/01/23 06:18:17]  (HEAD -> master, origin/master, origin/HEAD) aliases <nobuyasu tomura>
967ce49 [2017/01/23 06:18:17]  npm-debug.log.*対策 <nobuyasu tomura>
6609919 [2017/01/23 06:18:17]  sdkman, aws cli complettioon, http status 確認コマンド の設定 <nobuyasu tomura>
aeea2f8 [2017/01/23 06:18:17]  rustの設定など <nobuyasu tomura>
```
構造学習メモ [MP3]

# **[*] 基礎知識**

##[*]MP3
可聴域の音を極端な劣化を伴わず圧縮されたデータ
[ISO 11172-3]で規格化
##[*]ID3

| バージョン名 | 特徴 |
|:-:|:-:|
|ID3v1   |サイズは128バイト |
|ID3v1.1 |ID3v1のコメント部を2バイト小さくし、トラック番号を追加   |
|ID3v2   | サイズは256MB  |

# **[*]基本的構造配置**
## [*]MP3
MP3は2種類のデータが層を形成している。

|行数|構造1|構造2|
|:--------:|:-----------:|:------------------:|
|1         | ID3v2       |オーディオデータ       |      
|2         |オーディオデータ|[ID3v1] OR [ID3v1.1]|

[!]タグは[ID3v2]と、[ID3v1]か[ID3v1.1]の２種類を埋め込むこともある(3層構造)
そのとき、上記を組み合わせた構造となる

##[*]ID3
ID3v1.1

| 長さ | 説明 |
|:-:|:-:|
|3   |タグの識別子   |
|30   |曲タイトル   |
|30   |アーティスト名   |
|30   |アルバム名   |
|4   |日付   |
|28   |コメント   |
|1   | 終了用バイト(NULL)  |
|1   |トラック番号   |
|1   |ジャンル番号   |
[!] ID3v1はトラック番号部を減らし、コメント部を２バイト大きくしたもの

ID3v2
各項目の使用可能領域が16MBに増加
Unicodeをサポート
画像の挿入可能

## **[*]感想**

初投稿。
リバースエンジニアリングできるようになりたいと日々考えている。
そのために、データの構造を知り、自分の手で解析してみたくなった。
これからも、データを見ていきたい。
Sping bootを始めてみる

以下のサイトを参考に環境構築

Spring boot

http://dev.classmethod.jp/server-side/java/using_spring_boot_1/

http://jsug-spring-boot-handson.readthedocs.io/en/latest/GettingStarted.html

http://qiita.com/uzresk/items/31a4585f7828c4a9334f

http://qiita.com/park-jh/items/8d731226918e75055c95
ヘルパを対応した名前空間のみで使えるようにする

#### 要旨
下記の変更を施すと、対応したディレクトで動作する view のみで、helper に書かれたメソッドが利用可能になる。
デフォルトでは、全てのヘルパメソッドが全ての view から利用可能。

```ruby:application.rb
# config.action_controller.include_all_helpers = true
config.action_controller.include_all_helpers = false
```
#### 付録
詳細は下記のページに書いてある。
http://api.rubyonrails.org/classes/ActionController/Helpers.html
#### 背景
複数の view で、同じ名前のヘルパを利用したかったが、呼び出し元の view によって動作を変更させたかった。
#### 感想
最初から false にして欲しいな、と思う設定だった。
なぜ初期状態は true なのだろうか？
iTerm2ショートカット


|コマンド|機能|
|---|---|
|cmd+;|補完|
|cmd+d|縦分割|
|cmd+shift+d|横分割|
|cmd+[|次のペインに移動|
|cmd+]|前のペインに移動|
|cmd+u|透明度を切り替え|
|cmd+t|新しいタブを作成|
|cmd+数字|数字のタブに移動|
|cmd+n|新しいウィンドウを作成|
|cmd+w|ウィンドウ・ペインを削除|
|ctrl+r|過去のコマンドを検索|
|cmd+opt|矩形選択モード|
|cmd+r|画面をクリア|
|ctrl+a|行頭へ移動|
|ctrl+e|行末へ移動|
|ctrl+k|カーソル位置から行末まで一気にカット|
|ctrl+w|カーソル位置から行末まで1文字ずつカット|
|ctrl+u|カーソルの行をカット|
Microsoft Flowを使ってリマインド作業を自動で行う

作業を管理する立場になると、勤怠の管理や社内で実施すべき作業のチェックも行う責務も与えられるため、勤怠を締めたかどうかをチェックしたり、XX日提出の書類を提出したかどうかなどの状況をウォッチしていかないといけません。
<br>
一方、管理される側も本業に専念するあまり上記のような作業を疎かにしがちです。そのため、管理する側から締切日前にリマインドすることもあるかと思います。その都度メールを書いて知らせるのも煩わしいので事前にある程度設定しておけば自動的にリマインドを送るようにMicrosoft Flowを使って実現したいと思います。

# トリガーはOutlookスケジュール

Microsoft Flowには以下のようなスケジュール機能があるのですが、定期的な繰り返ししかサポートされていないので、「毎月末の2営業日前」など細かいセッティングができません。
<br>

![WS000025.JPG](https://qiita-image-store.s3.amazonaws.com/0/159178/9e1ba8fc-f357-c151-5d26-5a3baf5fdcef.jpeg)


<br>

ですので今回は、Outlookスケジュールにスケジュール登録をしておいてそのイベントが開始されたタイミングで処理が動くようにしていきましょう。
<br>
もちろん、Microsoft Flowのスケジュールでサポートできる範囲の繰り返しであればそれを使ってもらえればOKです。

<br>

#(番外)Outlookで違う予定表を作成する

上記のとおり、リマインドを起動させるためのスケジュールをOutlookに登録するわけですが、普段自分の予定に登録しているスケジュールに混じるとややこしいですよね。
<br>
そんなときは、それらのスケジュールと混じらないように別のスケジュールを作成することが可能です。下記のようにOutlookのスケジュールの「自分の予定表」の右のプラスを押すと新しくカレンダーを作成できますので、そこに今回のリマインド用のスケジュールを登録しましょう。（カレンダー：月末リマインド）

<br>

![WS000026.JPG](https://qiita-image-store.s3.amazonaws.com/0/159178/f17a0e86-baab-3d12-3614-9ad31b01d203.jpeg)

<br>

#フローの作成

今回はOutlookのスケジュール有無をチェックして、存在すればメールを送信するという流れになるので、Outlookのフローを組み合わせて使います。

<br>

![WS000031.JPG](https://qiita-image-store.s3.amazonaws.com/0/159178/1963864a-1603-939b-51e0-d0e3899fd75a.jpeg)

<br>

Outlookから「予定しているイベントがすぐに開始されるとき」を選択します。
2つの入力項目があり、予定表IDでは自分の予定表の中に作成しているスケジュールを選択できるので先ほど作成した「月末リマインド」を選択

<br>

![WS000027.JPG](https://qiita-image-store.s3.amazonaws.com/0/159178/329253ca-e256-0163-eb1a-461327b7e624.jpeg)


<br>

つぎにルックアヘッドタイムというものがありますが、スケジュール開始何分前に起動させるかという意味だと推測しています。これは１に設定しておきます。

<br>

本来はメールを送信する処理に入るのですが、その前にタイマーを設定します。理由は結局分からず、これをすることで動作しました。最後に触れたいと思います。とりあえず待ち時間としては2分で設定します。

<br>

![WS000029.JPG](https://qiita-image-store.s3.amazonaws.com/0/159178/46f9c0b5-9fae-dc69-9529-d2698fde8fb5.jpeg)


<br>

そして、最後にメール送信設定。宛先および、リマインドする本文を設定します。

<br>

![WS0000310.jpg](https://qiita-image-store.s3.amazonaws.com/0/159178/fb8369cd-b048-4b81-1bae-bcabf4aaae3d.jpeg)


<br>

#フローの実行

Outlookで設定した時間になると、以下のようなメールが飛んでくることを確認できればOKです。

<br>

![WS000032.JPG](https://qiita-image-store.s3.amazonaws.com/0/159178/c6d33675-49ef-f006-13c8-1d93a6aac300.jpeg)


<br>

#まとめ

途中で言及しましたが、なぜかルックアヘッドタイムを1秒、そして2分の待機時間をおかないと正しく動作しませんでした。原因はまだ分かっていません。Microsoft Flowの中にコミュニティのページがあるのでそこで聞いてみて何が原因なのか、引き続き調査していきたいと思います。

おわり
[C#] サロゲートペアを含む文字列で文字を個別に取り扱う

サロゲートペアを含む文字列で、文字を個別に取り扱いたいときの方法メモ

Char型にしてしまうと、サロゲートペアをもつ文字(32bit)では２分割されてしまい、意図した文字ではなくなってしまう。
そのため `System.Globalization.StringInfo.GetTextElementEnumerator(str)` を使用する。

```csharp
TextElementEnumerator charEnum = StringInfo.GetTextElementEnumerator(s);
while (charEnum.MoveNext()) {
    string element = charEnum.GetTextElement();
}
```

# 参考
[StringInfo.GetTextElementEnumerator メソッド (String) (System.Globalization)](https://msdn.microsoft.com/ja-jp/library/x2f3k4f6(v=vs.110).aspx)
[Unicode のサロゲートペアとは何か - ひだまりソケットは壊れない](http://vividcode.hatenablog.com/entry/unicode/surrogate-pair)
[サロゲートペアや結合文字が含まれているか調べる: .NET Tips: C#, VB.NET](http://dobon.net/vb/dotnet/string/issurrogatepair.html)
[文字列から1文字取得する、文字列内の文字を列挙する: .NET Tips: C#, VB.NET](http://dobon.net/vb/dotnet/string/stringchars.html)
ido で flex と migemo の両方を使う

ido でmigemo を使いたい、でも ido-migemo はflex が使えないから手を出せない、そんな人には
拙作 ido-flex-with-migemo がおすすめ！
#インストール
##本体
https://github.com/ROCKTAKEY/ido-flex-with-migemo.git
##依存package
###flx
https://github.com/lewang/flx
###migemo
https://github.com/emacs-jp/migemo
(追記:migemoは設定しないと使えません。設定は[こちらのサイト(主にlinux用)](http://emacs.rubikitch.com/migemo/)か、[こちらのサイト(Windows用)](http://nagayasu-shinya.com/emacs-cmigemo-windows/)で)
#使い方
それぞれをload-pathに通したら、
```
(ido-flex-with-migemo-mode)
```
これを実行するだけ。これをinit.elにでも書いておけば、毎回勝手にオンになる。
ちなみに、ido-flex-with-migemo-excluded-func-list に migemo が必要ないido の関数をadd-listしておけば、必要のない時にmigemoが発動してしまって全然絞りこめない、なんてこともなくなる。
A Tour of GoのExerciseの解答

### [Exercise: Loops and Functions](https://go-tour-jp.appspot.com/flowcontrol/8)

```go
package main

import (
    "fmt"
)

func Sqrt(x float64) float64 {
    z := 5.0
    for i := 0; i <= 10; i++ {
        z = z - (z * z - x) / (2.0 * z)
    }
    return z
}

func main() {
    fmt.Println(Sqrt(2))
}
```

### [Exercise: Slices](https://go-tour-jp.appspot.com/moretypes/18)

```go
package main

import "golang.org/x/tour/pic"

func Pic(dx, dy int) [][]uint8 {
	// 一旦、2次元配列を0で初期化
	result := make([][]uint8, dy)
	for i := range result {
		result[i] = make([]uint8, dx)
	}

	for y := 0; y < dy; y++ {
		for x := 0; x < dx; x++ {
			//result[x][y] = uint8((x + y) / 2)
			//result[x][y] = uint8(x * y)
			result[x][y] = uint8(x ^ y)
		}
	}

	return result
}

func main() {
	pic.Show(Pic)
}
```

### [Exercise: Maps](https://go-tour-jp.appspot.com/moretypes/23)

```go
package main

import (
	"golang.org/x/tour/wc"
	"strings"
)

func WordCount(s string) map[string]int {
	counts := make(map[string]int)
	fields := strings.Fields(s)
	for _, field := range fields {
		counts[field] += 1
	}
	return counts
}

func main() {
	wc.Test(WordCount)
}
```

### [Exercise: Fibonacci closure](https://go-tour-jp.appspot.com/moretypes/26)

```go
package main

import "fmt"

// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
	var f0, f1, f2 int = 0, 1, 0
	return func() int {
		fib := f0
		f2 = f0 + f1
		f0 = f1
		f1 = f2
		return fib
	}
}

func main() {
	f := fibonacci()
	for i := 0; i < 10; i++ {
		fmt.Println(f())
	}
}
```
Angular2をAWS EC2で起動する方法

意外と起動しなくてはまったので、メモしておきます。

#Angular2がAWS上だと動かなかった
ローカル環境で開発してた時と同じように下記のコマンドでAngular2のモジュールをビルドしました。

```$ ng serve```

<img width="865" alt="スクリーンショット 2017-02-05 22.43.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/85181/fc3387a6-5ed2-7e1c-cfaa-9fb1b535c70a.png">
しかし、上記の画面がずっと出て、angularの画面にアクセスできませんでした。

#AWS用にhostを指定
```ng serve --host 0.0.0.0(AWSのhost名) --port 4201```

--hostを指定しないと通常通り、localhostを向いて実行されるみたいですね。
他にも良い方法はありそうですが、一旦はこれで解決しました

#参考
https://github.com/angular/angular-cli
JavaのWebアプリをHerokuにデプロイする

herokuにはGithubを使ったやり方やコマンドラインを使ったやり方などいろいろありますが、それを見てやってもうまくいかなかったので、同じようにうまくいかなかった人と自分の覚書のためにここに記します。このやり方ではかなり簡単にできます。

##warファイルを使う

warファイルとは、アプリケーション全体を圧縮したファイルのことです。


このコマンドでheroku deployコマンドが有効になります。
`heroku plugins:install heroku-cli-deploy`




　
`heroku deploy:war dist/アプリの名前.war`



distの部分はパスになります。パスが正しくないとnot foundが出ますので注意してくださいね。
Tiny Core LinuxでHDDの完全消去（shred編）

「[Tiny Core Linux 7をUSBメモリにインストール](42bc90c13e35d0f81467)」で作ったTiny Core Linuxでshredを使ったデータ消去です。

shredは最近のLinuxなら標準で入っている（と思う）削除専用コマンドです。ddで/dev/urandomを使うと遅いし、といって/dev/zeroでは不安という場合に使えると思います。

古いshredは/dev/urandomを使っていたようですが、今時のshredは/dev/urandomを使わないようですので速度面で期待できます。

## shredのインストール
Tiny Core Linuxの場合は標準ではインストールされていないのでインストールします。shredはcoreutilsというパッケージに含まれます。

```console
$ tce-load -wi coreutils
```

バージョンを確認してみると8.24と結構新しいようです。

```console
$ shred --version
shred (GNU coreutils) 8.24
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Colin Plumb.
```

## 本当に速いの？
/dev/urandomと比較して本当に速いのか書き込んで比較してみます。

```console
$ time shred -s 128M -n 1 /dev/null
real	0m 0.36s
user	0m 0.35s
sys	0m 0.00s
$ time shred --random-source=/dev/urandom -s 128M -n 1 /dev/null
real	0m 30.98s
user	0m 0.00s
sys	0m 30.95s
```

明らかに速いようです。

## 使ってみる
という訳でshredを使ってみます。デフォルトでランダムな値を3回書き込みますので至ってシンプルです。

```console
$ shred -v /dev/sda
shred: /dev/sda: pass 1/3 (random)...
```

1回だけ書き込むなら以下のようにします。

```console
$ shred -v -n 1 /dev/sda
shred: /dev/sda: pass 1/1 (random)...
shred: /dev/sda: pass 1/1 (random)...204MiB/75GiB 0%
```

## 実際の速度は？
ちょっと気になったので所要時間を測ってみたところ、乱数の書き込みでもddで/dev/zeroを書き込んだのと同じくらいの速度が出ているようです。

```console
$ time shred -v -n 1 /dev/sda
shred: /dev/sda: pass 1/1 (random)...
shred: /dev/sda: pass 1/1 (random)...204MiB/75GiB 0%
（省略）
shred: /dev/sda: pass 1/1 (random)...75MiB/75GiB 100%
real    36m 12.27s
user    7m 19.18s
sys     0m 51.09s

$ time shred -v -n 0 -z /dev/sda
shred: /dev/sda: pass 1/1 (000000)...
shred: /dev/sda: pass 1/1 (000000)...204MiB/75GiB 0%
（省略）
shred: /dev/sda: pass 1/1 (000000)...75MiB/75GiB 100%
real    36m 12.18s
user    0m 5.26s
sys     1m 18.27s

$ cat /dev/zero | pv | dd of=/dev/sda bs=1M
74.5GiB 0:36:04 [35.3MiB/s] [<=>                                                 ]
2782+585345 records in
2782+585344 out
80026361856 bytes (80GB) copied, 2176.6 s, 36.9 MB/s
```

## 関連リンク

- [UbuntuからTiny Core Linux 7をUSBメモリにインストール](42bc90c13e35d0f81467)
- [Tiny Core LinuxでHDDの完全消去（Secure Erase編）](c8cc9418c84d563bee29)
- [Tiny Core LinuxでHDDの完全消去（dd編）](28e15e54700dc9aadb44)
- [Tiny Core LinuxでHDDにエラーがないかを調べる](bdeb60a8b671113e54d7)
Jbuilderファイルを利用してJSONデータを返却する

# はじめに
理解が曖昧なため、ところどころワードが変なところがあるかもしれません。問題ある点はご指摘いただけると幸いです。

# version
Ruby: 2.3.1
Rails: 5.0.1

# ぶつかった問題
![gif.gif](https://qiita-image-store.s3.amazonaws.com/0/158026/191f62f6-6d79-411f-8222-8ead111be18c.gif)

簡易チャットアプリを作成中。
Controller = 投稿機能を持つAPIとして使用し、非同期通信にてメッセージ投稿を行なっている。

ControllerからJavaScriptにメッセージの情報を返す際に、

```messages_controller.rb
respond_to do |format|
  format.html { redirect_to :root }
  format.json { render json: @messages }
end
```

というようにして@messagesを送ると、JavaScript内でアソシエーションを利用したデータの取り出しができない(ex @message.user.nameなど)。どうやら、送られたデータはインスタンスではなく、単なるJson形式（ハッシュ）のデータのためにJavaScript内で@message.user.nameのような記述ができない模様。

# したいこと
JavaScript内でアソシエーションを利用したデータの取り出しをできるようにする。

# 対応策

```messages_controller.rb
respond_to do |format|
 format.html { redirect_to :root }
 format.json { render 'messages', handlers: 'jbuilder' }
 # handlersで、 拡張子「.jbuilder」のファイルだと指定している。
 # format.json { render 'messages.json.jbuilder' }と書いても可
end
```

上記のようにコードを変更し、

```messages.json.jbuilder
json.body @message.body
json.name @message.user.name
```
Jbuilderファイルを作成し、
json.bodyに@message.bodyを、json.nameに@message.user.nameを定義することで、
JavaScript内でデータを取得できるようになりました。


# 参考サイト
・[Git Hub / Jbuilder](https://github.com/rails/jbuilder)
・[Rails Document](http://railsdoc.com/references/render)
・[しめ鯖日記　「Rails4でJSONを作るならto_jsonよりjbuilder」](http://llcc.hatenablog.com/entry/2015/03/07/103121)
・[東京伊勢海老通信 「RailsでJSONを返却するAPIを作成する時のあれこれ」](http://altarf.net/computer/rails/2523)
super evilなパッケージ？？

マシン環境が変わったので、Node.jsに入っていたパッケージ類も再インストールが必要となりました。そして、（既存のコードもあるので）CoffeeScriptを入れようとしたのですが…

```
$ npm i coffeescript -g
npm WARN deprecated coffeescript@99.999.99999: You misspelled 'coffee-script'

> coffeescript@99.999.99999 preinstall /path/to/coffeescript
> node super-evil-script-omg-for-reals.js

You misspelled 'coffee-script'
npm ERR! Windows_NT 10.0.14393
npm ERR! argv "/path/to/node" "/path/to/node_modules/npm/bin/npm-cli.js" "i" "coffeescript"
npm ERR! node v4.4.7
npm ERR! npm  v2.15.8
npm ERR! code ELIFECYCLE

npm ERR! coffeescript@99.999.99999 preinstall: `node super-evil-script-omg-for-reals.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the coffeescript@99.999.99999 preinstall script 'node super-evil-script-omg-for-reals.js'.
npm ERR! This is most likely a problem with the coffeescript package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node super-evil-script-omg-for-reals.js
npm ERR! You can get information on how to open an issue for this project with:
npm ERR!     npm bugs coffeescript
npm ERR! Or if that isn't available, you can get their info via:
npm ERR!
npm ERR!     npm owner ls coffeescript
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
```

# ネタばらし
`super-evil-script`なんて出て面食らったのですが、いちばん上にあるように、CoffeeScriptコンパイラの正しいパッケージ名は`coffee-script`です（[npm](https://www.npmjs.com/package/coffee-script)）。誰かが`coffeescript`にこんなパッケージを入れていたようですが、エラーで止まってくれるので、これはまだジョークの範囲で済みます（[Gist](https://gist.github.com/captn3m0/782e8d6c660a4255a349)）。

# 実際に起きていた
そして、別件でnpmを覗いていたところ、[`crossenv` malware on the npm registry](http://blog.npmjs.org/post/163723642530/crossenv-malware-on-the-npm-registry)というような記事を発見しました。いわく、`cross-env`（本物）に対する`crossenv`のような、「有名なパッケージと似た名前を使って、マルウェアをインストールさせる」という事態が実際に起きていた、とのことでした。ハイフン・アンダーバー・何もなしなど、単語区切りは間違いやすいので、本当に入念な注意が必要そうです。
スライサー（FDM式３Ｄプリンタ向け）の作成　考察３（レイヤー高さについて）


* [スライサー（FDM式３Ｄプリンタ向け）の作成　目次](http://qiita.com/isTwt/items/5d40286eec73296ea790)

-----

# １．はじめに
　10mm角の立方体が出力対象だとします。
　このモデルを 0.3[mm] でスライスした場合、結果はどうなるでしょうか？
![キャプチャ1.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/efa07b5f-7d6b-d58c-5fef-fce469ac2176.jpeg)

　理想としては、10[mm]角のものですが、計算上では10[mm]角の四角の層が 33 層積み上がったものになります。
　このため高さは 9.9[mm]となり、0.1[mm]足りません。

# ２．単純にスライスすると
　１層目が 0.3[mm]の中間の 0.15[mm]でスライスします。
　２層目は 0.45[mm]
 　　．．．
３３層目は 9.75[mm]です。
３４層目は 10.05[mm]の高さですので、モデルをスライスできません。（スライス終了）

![キャプチャ2.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/fe92af2d-12df-43eb-a67f-e5675f6bdfad.jpeg)
※スライス面は9.75[mm]ですが、出力時は+0.15[mm]の9.9[mm]となります。

# ３．本スライサでは
　通常は上記のように、指定された積層高さでスライスします。
　しかし上記のことも考え、自動積層高さ調整のオプションを設けました。
 
　例えば、10[mm]の高さを、指定の0.3[mm]でスライスするとして、
　　10[mm]÷0.3[mm]=33[層]
　　10[mm]-33[層]×0.3[mm]=0.1[mm] 不足
と算出します。
　このことから積層数を+1の34とし、
　　10[mm]÷34[層]=0.294[mm]
　　10[mm]-34[層]×0.294[mm]=0.004[mm] 不足
と算出します。
　この不足分を 
　　0.004[mm]÷2[層]=0.002[mm]
を求め、34層中2層を
　　0.294[mm]+0.002[mm]=0.296[mm]
とします。（この例では総積層数が偶数であるため、２で割っていますが、実装では奇数層の場合、３としています。）
　結果は 32[層]×0.294[mm]+2[層]×0.296[mm]=10[mm]
　現状は、上記厚みが異なる２層を全体の中心にくるようにしています。

![キャプチャ3.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/33a98199-96b0-e5bb-ea1d-a9ddd37b110e.jpeg)

![キャプチャ4.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/44607942-24be-8d1a-e774-79773d5ccbd7.jpeg)

# ４．今後
　本機能はまだ、全高に対してのみの調整であるため、まだ不十分と考えています。下図のような場合の中間部分の高さ位置についても再現性を高めたいところですが上記のままでは不十分です。
　今後、改善していきたいと考えています。

![キャプチャ5.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/4e23a1f5-c10b-9d59-5d23-06ce3aea6380.jpeg)
※側面からみた形状です
pythonでweb画面キャプチャ取得


webデザインまとめサイトを作ろうと思い、web画面キャプチャをお手軽に作成する方法を模索中。とりあえずpythonとseleniumで実装してみた。

#前提
- max os sierra
- python 3.5


#準備
## seleniumのインストール
```
pip install selenium
```
## ChromeWebdriverのインストール
[こちら](http://chromedriver.storage.googleapis.com/index.html?path=2.18/)よりファイルをダウンロード。
ダウンロードしたファイルのディレクトリで以下を実行。

```
$ mv chromedriver  
```

```python
import time
import re
from selenium import webdriver

#URLのドメイン抽出パターン作成
pat = r"https?://(www.)?([\w-]+).[\w.]"

# コマンドラインよりURL取得。「,」区切りで複数入力可能
inp = input("URLを入力\n")

# 「,」でリストへ分割。さらに左右の空白消去
URLS = list(map(str.strip,(inp.split(","))))

# プラウザ起動（Chrome）
driver = webdriver.Chrome()

# リストからURLをひとつづつ処理
for url in URLS :
    # ドメインの一部をファイル名として設定
    site_name = re.search(pat,url)
    file_name = "{0}.png".format(site_name.group(2))
    # URLを開く
    driver.get(url)
    # ウィンドウサイズとズームを設定
    driver.set_window_size(1250, 1036)
    driver.execute_script("document.body.style.zoom='90%'")
    # 読み込み待機時間
    time.sleep(2)
    # imagesフォルダにスクリーンショットを保存
    driver.save_screenshot("./images/" + file_name)

# プラウザを閉じる
driver.quit()
```
Docker for Macを使った開発環境構築

年明けからGo言語やるはずだったんですが、異動になってまたPHPに逆戻り・・・
というわけで、新しくやる予定のYii2お勉強環境を作りたいと思います。


# 前提条件

- MacOS ElCapitan 10.11.6
- vim8.0
- homebrew
- iTerm2
- ctags

# 今回の作業

Docker for Macで開発環境を作る(ちなみにDocker使うのは初めてですw）

# 手順
## Docker for Macをダウンロードしてインストールする
[公式ページ](https://docs.docker.com/docker-for-mac/)からダウンロードして、ガンガン進めるだけ。

## DockerHubで公式イメージがあるか確認
[Docker Hub](https://hub.docker.com/)から自分が使いたいものを探し出します。

2017/2/5現在で

- PHP7.1.1
- Nginx1.11.9
- MySQL5.6か5.7

が最新みたいですね。
多分AWSを使うことになるので、AmazonLinux使うんだろう・・・と思う
(でもこの構成で確定とは聞いてないので、また変えるかもしれないけど）
ApacheかNginxか決まってないけど、まぁせっかくだから使ったことないNginxを試してみようということで。

とりあえず、
[PHP](https://hub.docker.com/_/php/)
[Nginx](https://hub.docker.com/_/nginx/)
[MySQL](https://hub.docker.com/_/mysql/)
の公式版を使います

## Dockerfileの作成
```
$ cd ~/
$ mkdir docker
$ mkdir docker/mysql
$ vim docker/mysql/Dockerfile
```

中身はとりあえず

```
FROM mysql:5.6
```

だけ。

続けてNginx

```
$ mkdir docker/nginx
$ vim docker/nginx/Dockerfile
```

これも中身はとりあえず

```
FROM nginx:1.11
```

だけ

次はPHP

```
$ mkdir docker/php
$ vim docker/php/Dockerfile
```

これも中身はとりあえず

```
FROM php:7.1
```

だけにしておきます。

## docker-composeファイルの作成
初めてのdockerなので、どうしたもんか色々検索してみたのですが、docker-composeを使うと便利らしい。

```
$ vim docker/docker-compose.yml
```

基本的な感じでとりあえず作ってみる

```
version: '2'
services:
  # DB
  mysql:
    container_name: "mysql"
    build: ./mysql
    ports:
      - '3306:3306'
    environment:
      MYSQL_ROOT_PASSWORD: root
  # nginx
  nginx:
    container_name: "nginx"
    build: ./nginx
    links:
      - mysql
      - php
  # php
  php:
    container_name: "php"
    build: ./php
    links:
      - mysql
```

## ビルド

```
$ cd docker
$ docker-compose build
```

だけ。
あとは待つのみ・・・（結構待ちました）

## 起動

```
$ docker-compose up
```

ちなみに-dをつけないで起動するとつらつらとログが出ますが、これはこれで分かりやすのかもしれない（実運用じゃないしね）

立ち上がったので、次はYii2を入れるのとコンパイルオプションも何にもなしなのは使えないので付け足していきます
祝日をWebAPIから取得するシェルスクリプトをワンライナーで

最近シェル芸人に憧れてシェルの勉強中なのですが、
なんとなくシェルで祝日を取得できたら面白いかな？と思って検索してみたら下記の記事を発見
[祝日をWebAPIから取得するシェルスクリプト](http://qiita.com/richmikan@github/items/9090407e3ab9cd3e80b2)

awkすごいんだけど読めない...
てことで参考にしてワンライナーで書きなおしてみた。


## コード
```bash:
curl -s https://calendar.google.com/calendar/ical/ja.japanese%23holiday%40group.v.calendar.google.com/public/basic.ics | egrep '^DTSTART|^SUMMARY' | awk -F: '{print $2}' | perl -pe 's/(?<=\d)\r\n/ /m' | sort
```

## 実行結果
出力が長いので最後に ``` |head -10 ``` をつけて実行

```text:
20160101 元日
20160111 成人の日
20160211 建国記念の日
20160320 春分の日
20160321 春分の日 振替休日
20160429 昭和の日
20160503 憲法記念日
20160504 みどりの日
20160505 こどもの日
20160718 海の日
```

いい感じで、できてますね

## 余談
~~perl で書いた部分はxargsで書く予定だったんですが、マルチバイト文字のせいかうまくいかなかったので、だれか詳しい人に解説して欲しいです...~~
@kou029wさんのおかげでできました。
こっちのほうが分かりやすいし、perlに依存しないので良いですね(unix系でperlが実行できない環境は珍しいとは思いますが)

```bash:xargs版
curl -s https://calendar.google.com/calendar/ical/ja.japanese%23holiday%40group.v.calendar.google.com/public/basic.ics | egrep '^DTSTART|^SUMMARY' | cut -d: -f 2 | tr -d \\r | xargs -L 2 | sort
```


```text:結果
20160101 元日
20160111 成人の日
20160211 建国記念の日
20160320 春分の日
20160321 春分の日 振替休日
20160429 昭和の日
20160503 憲法記念日
20160504 みどりの日
20160505 こどもの日
20160718 海の日
20160811 山の日
20160919 敬老の日
20160922 秋分の日
20161010 体育の日
20161103 文化の日
20161123 勤労感謝の日
20161223 天皇誕生日
20170101 元日
20170102 元日 振替休日
20170109 成人の日
20170211 建国記念の日
20170320 春分の日
20170429 昭和の日
20170503 憲法記念日
20170504 みどりの日
20170505 こどもの日
20170717 海の日
20170811 山の日
20170918 敬老の日
20170923 秋分の日
20171009 体育の日
20171103 文化の日
20171123 勤労感謝の日
20171223 天皇誕生日
20180101 元日
20180108 成人の日
20180211 建国記念の日
20180212 建国記念の日 振替休日
20180321 春分の日
20180429 昭和の日
20180430 昭和の日 振替休日
20180503 憲法記念日
20180504 みどりの日
20180505 こどもの日
20180716 海の日
20180811 山の日
20180917 敬老の日
20180923 秋分の日
20180924 秋分の日 振替休日
20181008 体育の日
20181103 文化の日
20181123 勤労感謝の日
20181223 天皇誕生日
20181224 天皇誕生日 振替休日
```

素晴らしい
AWSのELB向けに、SSL証明書を簡単に作成する方法

以下、3つのコマンドを実行するだけ
## 1. 秘密鍵を作成(Private Key)
```$ openssl genrsa -out server.key 2048```
	※ポイント
	上記の通り、ELB向けには、秘密鍵にはパスフレーズを設定しないこと。でないとエラーとなる。
## 2. 証明書署名要求を作成 (CSR: Certificate Signing Request)
```$ openssl req -new -key server.key -out server.csr```
## 3. サーバ証明書を作成(CRT)
```$ openssl x509 -in server.csr -days 365000 -req -signkey server.key > server.crt```

※ポイント
- 「プライベートキー」は「-----BEGIN RSA PRIVATE KEY-----」で始まり、「-----END RSA PRIVATE KEY-----」で終わる
- 「パブリックキー証明書」「証明書チェーン」は「-----BEGIN CERTIFICATE-----」で始まり、「-----END CERTIFICATE-----」で終わる
- 上記の文字列も入力しなければならないこと、無駄な改行などは入れないこと

参考:
オレオレ証明書をopensslで作る（詳細版）
http://d.hatena.ne.jp/ozuma/20130511/1368284304

【初心者向け】ELBにSSL証明書をインストールする
http://dev.classmethod.jp/cloud/aws/aws-beginner-elb-ssl/
意外に面倒だった、Mac環境でラズパイにNOOBS無しでRaspbianをインストールした件(未完)

前提として、将来的にHDD/SSDからのOS起動を目指した話。

昨年末に、おうちサーバ熱とマイコンボード(って今言うの？)熱が高まり、まずは今話題のラズパイ(Raspberry Pi3)でおうちサーバを立ち上げよう、と思い立つ。

#まずはddでOSインストール(?)

最新のファームでは、完全SDレスでHDD/SSD経由での起動が可能なようだが、[色々問題](https://jyn.jp/raspberrypi-usb-only-boot/)があるようなので、一旦完全SDレスは考えずに、RaspbianのイメージをddでSDに焼く。

SDカードをリーダーに挿入すると、自動的にマウントされてしまうので、umoutが必要。ここでLinux脳で、umoutコマンド使おうとするとハマる。Macにおいては

```diskutil list```

でSDカードを確認し、

```sudo diskutil unmountDisk /dev/disk2```

でアンマウントする必要がある。アンマウント出来たら、みんな大好きddコマンドで、

```sudo dd if=~/Downloads/2017-01-11-raspbian-jessie-lite.img of=/dev/disk2 bs=1m```

SDカードにディスクイメージを焼く。結構時間がかかる。

#dd完了後、ラズパイにSDカードを差す前に

dd後、早速ラズパイにSDを差して、起動したい気持ちを抑えて。ヘッドレス(ディスプレイ無し)で電源だけ用意して、お気軽sshでラズパイをしたいので、下準備。

・SSHを有効に
SD(boot)配下に、中身が空のsshというファイルを作る、touchコマンドあたりで。これで、sshでラズパイに入れる。

・IPを固定する
自分は、本当に電源以外はケーブルレスでいきたいので、無線LANを有効にして、固定IP　(192.168.100.100/24)にする。

/etc/dhcpcd.confに以下を追記。

```interface wlan0
static ip_address=192.168.100.100/24
static routers=192.168.100.1
static domain_name_servers=192.168.100.1```

次に、アクセスポイントに接続するための設定。

```$ sudo sh -c 'wpa_passphrase SSID PASSPHRASE >> /etc/wpa_supplicant/wpa_supplicant.conf'```

SSID、PASSPHRASEは各自の環境に合わせて。

有線LANの場合は、/etc/dhcpcd.confに以下を追記。

```interface eth0
static ip_address=192.168.100.100
static routers=192.168.100.1
static domain_name_servers=192.168.100.1```

#さて、外部ストレージだ

USBな2.5インチ外部HDDを繋げる前に、　/(boot)/congfig.txtに以下を追加しUSBからの給電を1200mAに設定、肝心の電源供給側を2.4Aに接続。

`max_usb_current=1`

USB接続していざ起動！…が、HDDはスピンアップしたいようという音を何度か奏でて沈黙。厳しいようだ。外部電源つきのUSBハブかSSDを用意して再トライしようと思う。

#ここまでの所感

CPUは1GHz超えのクワッドコア、RAM1GBとARMとはいえWindowsXPぐらいはサクサク動きそうだが、電源周り、Disk　I/O周りと足回りは快適とは言えない。たかだか5千円程度のワンボードマイコン(死後？)に何言ってんだ、といわれそうだが、apt-get updateにすらストレスを感じるので、常時起動サーバ化にむけていろいろ研究していきたい。
【SQL】相関サブクエリ入門

相関サブクエリとはサブクエリの一種であり、外側のクエリの値をサブクエリ内で使用する。

相関サブクエリを使用したSQLはややこしくて読みにくい場合が多いが、基本形を１つおさえておくとだいぶ理解しやすくなる。

サブクエリが何かわからない場合は、こちらを先に読んで欲しい。
http://qiita.com/mokrai/items/6df0513ccc5aa40a075a

## 動作確認環境とテーブル
PostgreSQL 9.4でクエリの動作を確認した。
また、使用したテーブルの定義は下記。

```sql
CREATE TABLE Employees (
  id         INTEGER PRIMARY KEY,
  name       VARCHAR(10) NOT NULL,
  age        INTEGER NOT NULL,
  department VARCHAR(10) NOT NULL
);

INSERT INTO Employees VALUES(1,'Sato',23,'営業');
INSERT INTO Employees VALUES(2,'Suzuki',35,'営業');
INSERT INTO Employees VALUES(3,'Saito',38,'営業');
INSERT INTO Employees VALUES(4,'Yamada',42,'開発');
INSERT INTO Employees VALUES(5,'Tanaka',41,'開発');
INSERT INTO Employees VALUES(6,'Takahashi',35,'開発');

```

SELECTするとこんな感じ。

```sql
# SELECT * FROM Employees ;
```
```
 id |   name    | age | department 
----+-----------+-----+------------
  1 | Sato      |  23 | 営業
  2 | Suzuki    |  35 | 営業
  3 | Saito     |  38 | 営業
  4 | Yamada    |  42 | 開発
  5 | Tanaka    |  41 | 開発
  6 | Takahashi |  35 | 開発
(6 rows)

```

## 実行例
下記のSQLは、所属部署の平均年齢よりも若い社員を表示する。(ついでに年齢と所属部署も表示する)
ここで「所属部署の」というのがポイントであり、たとえば「営業」の社員であれば営業に所属する社員の平均年齢が基準となる。（つまり、開発社員の年齢は考慮しない）

```sql
SELECT name, age, department
  FROM Employees as e1
 WHERE e1.age < (SELECT AVG(age) as avg_age
                   FROM Employees as e2
                  WHERE e1.department = e2.department);
```
```
   name    | age | department 
-----------+-----+------------
 Sato      |  23 | 営業
 Takahashi |  35 | 開発
(2 rows)
```

このSQLで注目すべきは、`WHERE e1.department = e2.department`の部分だ。
WHERE句で指定されたサブクエリは、外側のクエリの結果の１行ごとに実行され、その外側のクエリの結果のdepartmentの値をサブクエリ内で利用している。


「所属部署の」という制限を外す場合、つまり「社員全体の平均年齢よりも若い社員」を知りたい場合は、相関サブクエリではないサブクエリを用いる。

```sql
SELECT name, age, department
  FROM Employees
 WHERE age < (SELECT AVG(age)
               FROM Employees);
```
```
   name    | age | department 
-----------+-----+------------
 Sato      |  23 | 営業
 Suzuki    |  35 | 営業
 Takahashi |  35 | 開発
(3 rows)

```

## 所属部署の平均年齢もあわせて表示したい場合
SELECTの列の指定で、WHERE句と同じ式を書けば実現できる。
（DRY原則に反しているので、もっとスマートなやり方があれば教えてください。）

```sql
SELECT name,
       age,
       department,
       (SELECT AVG(age) as avg_age
                   FROM Employees as e2
                  WHERE e1.department = e2.department)
  FROM Employees as e1
 WHERE e1.age < (SELECT AVG(age) as avg_age
                   FROM Employees as e2
                  WHERE e1.department = e2.department);
```
```
   name    | age | department |       avg_age       
-----------+-----+------------+---------------------
 Sato      |  23 | 営業       | 32.0000000000000000
 Takahashi |  35 | 開発       | 39.3333333333333333
(2 rows)
```

２つのサブクエリ内で`e2`という同一のテーブルの別名を指定している点が気になったかもしれないが、サブクエリ内でスコープが分かれるため問題ない。
Tiny Core LinuxでHDDの完全消去（dd編）

「[Tiny Core Linux 7をUSBメモリにインストール](42bc90c13e35d0f81467)」で作ったTiny Core Linuxでddを使ったHDDのデータ消去です。

※最初はddを使えば簡単に消去できると思ったのですが、思ったよりも面倒だったのと、いまいち安心感が得られないので、「[shredを使った消去](d1c7ad58009f41e2d252)」や「[Secure Erase](c8cc9418c84d563bee29)」での消去をオススメいたします。

ISOファイルをUSBに書き込んだり吸いだしたりと何かと重宝するddですが、`if=`に/dev/urandomを指定すればランダムな値を書き込むことができますので以下のようにすればデータ消去のようなことが行えます。

```bash
$ dd if=/dev/urandom of=/dev/sda
```

ddは進捗状況が分からなくて不安という場合はpvを使えば進捗状況を表示させることができます。tce-loadを使ってpvをインストールします。

```bash
$ tce-load -wi pv
```

以下のように実行すれば、進捗状況が表示されます。

```console
$ cat /dev/urandom | pv | dd of=/dev/sda
 1.5MB 0:00:03 [5.32MB/s] [  <=>                                               ]
```

しかし実際に実行してみると80GのHDDで7時間…遅すぎです。デフォルトのブロックサイズが512なので増やせば速くなるらしいのですが、試してみても6時間ほどかかります。

```console
$ cat /dev/urandom | pv | dd of=/dev/sda bs=1M
0+19526730 records in
0+19526729 out
80026361856 bytes (74.5GB) copied, 23204.176893 seconds, 3.3 MB/s
74.5GiB 6:26:48 [3.29MiB/s] [<=>                                                 ]

$ cat /dev/urandom | pv | dd of=/dev/sda bs=128M
0+19526903 records in
0+19526902 out
80026361856 bytes (74.5GB) copied, 23202.622147 seconds, 3.3 MB/s
74.5GiB 6:26:46 [3.29MiB/s] [<=>                                                 ]
```

ふと消去中のディスクランプの点滅にムラがあるように感じたので、試しに/dev/zeroと比較してみると/dev/urandomが凄く遅い事が分かりました。/dev/urandomがボトルネックになっている可能性がありそうです。

```console
$ dd if=/dev/zero of=/dev/null bs=128M count=1
1+0 records in
1+0 records out
134217728 bytes (134 MB) copied, 0.101867 s, 1.3 GB/s
$ dd if=/dev/urandom of=/dev/null bs=128M count=1
1+0 records in
1+0 records out
134217728 bytes (134 MB) copied, 15.6794 s, 8.6 MB/s
```

試しに/dev/zeroでゼロクリアしてみると…

```console
$ cat /dev/zero | pv | dd of=/dev/sda
74.5GiB 2:14:57 [9.42MiB/s] [<=>                                                 ]
156301489+0 records in
156301488+0 out
80026361856 bytes (80GB) copied, 8098.61 s, 9.9 MB/s

$ cat /dev/zero | pv | dd of=/dev/sda bs=1M
74.5GiB 0:36:04 [35.3MiB/s] [<=>                                                 ]
2782+585345 records in
2782+585344 out
80026361856 bytes (80GB) copied, 2176.6 s, 36.9 MB/s

$ cat /dev/zero | pv | dd of=/dev/sda bs=16M
74.5GiB 0:36:04 [35.3MiB/s] [<=>                                                 ]
0+535302 records in
0+535301 out
80026361856 bytes (80GB) copied, 2171.42 s, 36.9 MB/s
```

/dev/urandomよりもかなり速い結果となりました。またブロックサイズも1M程度指定してあげると速くなるようです。それで良いんだかという別の問題は残りますが…

- [UbuntuからTiny Core Linux 7をUSBメモリにインストール](42bc90c13e35d0f81467)
- [Tiny Core LinuxでHDDの完全消去（Secure Erase編）](c8cc9418c84d563bee29)
- [Tiny Core LinuxでHDDの完全消去（shred編）](d1c7ad58009f41e2d252)
- [Tiny Core LinuxでHDDにエラーがないかを調べる](bdeb60a8b671113e54d7)
Raspberry Pi > sound > 3.5mm ('headphone') jack / アンプ + 端子台 + スピーカー

```txt:動作環境
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
```

3.5mm ヘッドホンジャックに接続するスピーカーを用意した。
RPiのジャックに接続してみたが、音が出ない。

## sound設定 > 3.5mm headphone jack

以下を参考にした。
https://www.raspberrypi.org/documentation/configuration/audio-config.md

```
$ sudo raspi-config
```

- `8 Advanced Options`を選択
- `A9 Audio`を選択
- `0 Auto` -> `1 Force 3.5mm ('headphone') jack`を選択
- Okを選択
- Finishを選択

以上によりyoutubeの音声が3.5mm ヘッドホンジャック経由で出るようになった。

## 用意したスピーカー

http://qiita.com/aviscaerulea/items/a50c40f0a9e397c1ec2f
を参考にしました。

情報感謝です。

関西での購入に関しては、デジットで以下のものを購入しました (以下すべて税抜き価格)。

- 3W+3WステレオD級オーディオアンプ, 600円
   - DC 3から5V
   - 出力: 3Wx2(5V,4Ω), 1.7Wx2(5V,8Ω)
- スピーカーユニット 8オーム、5W, 250円
- 3.5mmステレオミニプラグ <-> スクリュー端子台, 120円

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/f43a9641-4554-e266-d71e-657a6630a85f.jpeg)

アンプ基板の電池としては使い古しのCR-123A(3V)を使用した。これはRPiの5V出力に変更予定。

音の大きさ設定によっては、音割れがしたり、音が出なくなったりする。この領域(音の扱い)は自分の知らないところで、とりあえず音が出ればいい、という用途。

c270m(カメラ)を購入済で、motionをセットアップして、動体を検知したら言葉を発する、という仕様。Slack通知と組み合わせて防犯としてはいかがだろうか。


## 補足 > スルーホール用テストワイヤー

アンプ基板の接続にはスルーホール用テストワイヤーを使おうとした。基板の穴の径が大きすぎてワイヤーが保持できなかった。

http://qiita.com/hotchpotch/items/074c97c12291bcc59028
http://qiita.com/7of9/items/1a4ceb8d32ddff8a6070

あと、穴の配置がブレッドボードの間隔から多少ずれていて、ストレートピンヘッダを斜めにしたような使い方になっている。
Zabbix 3.2.3でのユーザ管理

# はじめに
ユーザグループ、ユーザなどの設定が意外とややこしいZabbixの設定方法を考えました。検証には最新バージョン3.2.3を使用しました。

# 基礎知識
User
ログインに使用するユーザアカウントのことです。複数人で同じアカウントを使いまわすことも可能ですが、誰がどんな操作をしたか監査をする観点から、今回は個人に紐づけて発行します。

User group
Userのグループ化、Userへの権限の付与のために利用するグループです。1人のユーザ複数のUser groupに所属することが出来、また最低1つのUser groupに所属しないといけません。

Type
Zabbix Super Admin、Zabbix Admin、Zabbix Userの3種類があり、操作できるメニューの数が変わります。大まかな理解では、Zabbix Userはデータの閲覧のみ、Zabbix Adminは閲覧に加えてノードの設定、Zabbix Super Adminではさらにユーザの管理ができると思っておけばよいです。

# 想定した組織図
| アカウント名 | 使用者 | Type | 所属部門 | 役割 |
|:-:|:-:|:-:|:-:|:-:|
| peach | Princess Peach | Zabbix Super Admin | システム管理部 | Zabbix管理者 |
| mario | Mario Mario | Zabbix Admin | システム管理部 | ノード追加・削除 |
| luigi | Mario Luigi | Zabbix User | システム運用部 | 監視データ閲覧、アラート受信 |

このような3人分のユーザアカウントを作成します。Peachがいわゆる管理者、Marioが監視構築を行う作業者、Luigiが監視データの閲覧やアラート受信をする運用者、のイメージです。特定のノードへのアクセス制限は実施せず、アカウント種別によって認められている操作は全ノードに対して実施できるものとします。ある程度の規模のシステムを管理している会社だと、このような分業体制になっていることが多いのではないでしょうか。これに合わせてUser groupとUserを作っていきます。

# User groupの作成
まずは3人が所属するUser groupを作成します。User groupの作り方として、所属する組織（部・グループ・チーム）毎に作る、アクセスするノード毎に作る（Server Admin・Network Admin・DBA）、などの方法もありますが、ずばりオススメは「全ユーザが所属する一つのグループを作る」です。今回はAll usersというグループを作成して全員を所属させます。
さらに追加で2つのグループを作成します。1つはDisabledというユーザグループ、これはデフォルトでありますが、何らかの理由でログインをさせたくないアカウントを所属させます。Zabbixは何故かユーザアカウントごとに有効無効を切り替えることができないため、このような無効にしたいグルーうを予め作成しておき、必要に応じてユーザをこのグループに所属させることでアカウントを無効にします。
もう1つはアラート受信用のグループでです。トリガーに対するメール送信などのアクションはユーザグループ単位で設定されますが、実際の運用場面ではメールを受信したい人は限定されているはずです。そのため、アクション用のユーザグループは全ユーザが所属するグループとは別に作る必要があります。

実際に作ってみたものが、以下となります。まずはUserから。
![image](https://qiita-image-store.s3.amazonaws.com/0/126284/acbd06a1-801c-79e3-a2cd-6589dd5c45da.png)

次にUser groupです。
![image](https://qiita-image-store.s3.amazonaws.com/0/126284/78ff6f05-a536-c05b-d96f-b43712c745da.png)
全員をAll usersに所属させ、ノードへのRead-Write権限をAll usersグループ内で付与しています。All usersグループにだけはPermission設定が必要なことに注意。
![image](https://qiita-image-store.s3.amazonaws.com/0/126284/34f20264-ddec-6cac-9d6f-f89a8fd37c92.png)

Alert mail membersグループはアクションの設定に使い、メール受信をしたい人は追加でこのグループにも所属させます。こちらは権限設定をNoneにしています。

# 終わりに
ZabbixのUser groupの考え方は分かりにくく、どのように設定すればシンプルで運用が楽になるかを考えていましたが、割といい例が作れたのではないかと思っています。
イラストの線画抽出

#イラストから線画抽出
たまに使うのでメモ。

```
import cv2

#read image
img = cv2.imread('image.png',0)

#edge extraction (Laplacian of Gaussian)
img = cv2.GaussianBlur(img,(3,3),0)
lap = cv2.Laplacian(img,cv2.CV_32F)
edge = 255-cv2.convertScaleAbs(lap)

#save
cv2.imwrite('image_edge.png',edge)

```
RailsでGoogleCustomSearchEngine(CSE)を使ってみる

LineMessageAPIを使用して、送信された内容で検索を行うBOTを作成する際に検索するためにGoogleCustomSearchEngineを使用する。
LineBotの設定等は[コチラ](http://www.noraneko.works/activity/49bb2060cef08c481b9d)

RailsでGoogleCustomSearchEngineを使用するためにGemをinstallためGemfileに下記を追加

```
gem 'google_custom_search_api'
```
API_KEYなどの必要な情報の取得についてはGitHubの[google_custom_search_api](https://github.com/wiseleyb/google_custom_search_api)を参照

渡されたパラメータを検索条件として検索を行う
今回はLineMessageAPIを使用した際の返信時に実行する

```rb
def reply(replyToken, text)
  query = text.gsub(","," ")
  results = GoogleCustomSearchApi.search(query)
  columns = []
  results["items"].first(3).each do | item |
    if item["cse_thumbnail"]
      thumbnail = item["cse_thumbnail"]["src"] || "https://example.com/bot/images/item1.jpg"
    else
      thumbnail = "https://example.com/bot/images/item1.jpg"
    end
    columns << {
        "thumbnailImageUrl": thumbnail,
        "title": item["title"],
        "text": item["snippet"][0..30],
        "actions": [
            {
                "type": "uri",
                "label": "ブラウザで表示",
                "uri": item["link"]
            }
        ]
    }
  end
  messages = [
      {
          "type": "template",
          "altText": "this is a carousel template",
          "template": {
              "type": "carousel",
              "columns": columns
          }
      }
  ]
  body = {
    "replyToken" => replyToken ,
    "messages" => messages
  }
  post('/v2/bot/message/reply', body.to_json)
end
```

resultからtitleとlinkの取得は下記でも可能だが、`cse_thumbnail`などは`item["cse_thumbnail"] `としないと取得できず、ちょっとはまった。

```
  results.items.each do |item|
    puts item.title, item.link
  end
```

他は試していないけれど、`title`と`link`以外は`["xxx"]`としないと取得できなさそう。。。  
後はAPIを直接ブラウザから実行しJSONから必要なものを取得してくれば、他にも色々と情報を取得できそうである。
Google Analyticsでリンクからの流入・送客をとるための設定方法

![流入・送客計測.png](https://qiita-image-store.s3.amazonaws.com/0/160563/0fb0ebdf-efe0-b230-1cb6-3cab8acd280a.png)


#流入
リンクを踏んで
、自社サイトへ流入してくる数をこちらが意図した形で、
Google Analytics(以下GA)のレポートに反映させるには、ダミーパラメーターを用いて設定する。


##ダミーパラメーターとは？
ページの表示には影響がないがそれを付与することで、GA側でアクセスを区別し、意味のあるレポートにまとめてくれる機能。
※ダミーパラメーターはURLの末尾に「?xx=xx」のように付与する。&でつなげることで、複数付与も可能。


###ダミーパラメータを利用した設定方法
設定は「リンク先URL」+「ダミーパラメーター」で設定

```html:qiita.rb
<!-- 設定方法 -->
http:examle.com?utm_source=参照元&utm_medium=メディア&utm_campaign=キャンペーン&utm_term=キーワード&utm_content=コンテンツ
<!-- 設定例 -->
http:examle.com?utm_source=google&utm_medium=cpc&utm_campaign=サンプルキャンペーン&utm_term=サンプル商品&utm_content=サンプル化粧品
```

|名称|変数|値(例)|説明|
|:---|:---|:---|:---|
|参照元|utm_source|facebook|流入元のサイト|
|メディア|utm_medium|social|流入元のメディア|
|キャンペーン|utm_campaign|年始セール|商品(サービス)のキャンペーン名|
|キーワード| utm_term|セール|キャンペーンの検索広告キーワード|
|コンテンツ|utm_content|アウター|キャンペーンのコンテンツ名|

※値は各自で任意に設定(参照元のみマスト)


####設定ツール
・[Campaign URL Builder](https://ga-dev-tools.appspot.com/campaign-url-builder/)
・[スプレッドシート(Excel)](https://goo.gl/NujhkU)


###設定した値の確認方法
設定した内容はキャンペーン情報として収集。
・「集客」>「キャンペーン」
![キャンペーン   アナリティクス.png](https://qiita-image-store.s3.amazonaws.com/0/160563/b709553e-3c13-ace5-d5e3-97fc0152335d.png)
設定した軸毎に数値の確認が可能。
※画像はキャンペーンを軸に確認



#送客
自社サイト内のリンクを踏んで外部サイトに送客される際に、
そのリンクをクリックした数やPDFが閲覧した数などを「イベントトラッキング」「仮想ページビュー」を用いて設定する。


##イベントトラッキングとは？
Webサイトでのユーザーの様々なアクション(クリック、フォーム送信etc)を、
計測する仕組み。


###イベントトラッキングの設定方法
設定はユーザーアクションが生じる箇所(テキストリンクetc)に、タグを埋め込む。

```html:qiita.rb
<!-- 設定方法 -->
<a href="example.html" onClick="ga('send','event','カテゴリー','アクション','ラベル'">ここをクリック</a>
<!-- 設定例 -->
<a href="example.html" onClick="ga('send','event','テキストリンク','クリック','ここをクリック'">ここをクリック</a>
```

◆設定箇所(ユーザーアクション)

| イベント発生タイミング | イベントハンドラ |
|:-----------------------|:-----------------|
| クリックした時         | onClick          |
| フォームを送信した時   | onSubmit         |


※その他の[イベントハンドラ](http://phpjavascriptroom.com/?t=js&p=event)はこちらが参考になる

◆設定箇所(イベント情報)

* カテゴリー：任意の値を設定
* アクション：任意の値を設定
* ラベル：任意の値を設定

>__設定時のTips__
>
>固定の値以外にも「クリックしたテキスト」など動的に値を取得することも可能

>| 取得できるもの           | 設定方法        |
>|:-------------------------|:----------------|
>| クリックしたテキスト     | this.innerText  |
>| クリックしたページURL    | location.href   |
>| リンク先URL              | this.href       |

>※設定時は''で囲む必要ななし


###設定した値の確認方法
設定した内容はイベント情報として収集。
・「行動」>「イベント」
![上位のイベント   アナリティクス.png](https://qiita-image-store.s3.amazonaws.com/0/160563/300bb4c0-6cff-b993-baae-3e1b4ec0af84.png)

設定した軸毎に数値の確認が可能。
※画像はイベントカテゴリを軸に確認


##仮想ページビューとは？
実際に計測できないページを仮想ページとして認識してもらい、
計測上で、通常ページのように計測する仕組み。


###仮想ページビューの設定方法
イベント同様、ユーザーのアクションが生じる箇所にタグを埋め込む。

```html:qiita.rb
<!-- 設定方法 -->
<a href="#" onClick="ga('send','pageview',{'page':'仮想で指定したURLを指定','title':'仮想ページタイトル'">サンプルPDFはこちら</a>
<!-- 設定例 -->
<a href="#" onClick="ga('send','pageview',{'page':'example.pdf','title':'サンプルPDF'">サンプルPDFはこちら</a>
```

◆設定箇所(ユーザーアクション)
イベントトラッキングと同じ

◆設定箇所

* page：任意の値を設定
* title：任意の値を設定


###設定した値の確認方法
設定した内容はページ情報として収集されるので、通常のページとして確認することが可能。
・「行動」>「サイトコンテンツ」>「すべてのページ」
![ページ   アナリティクス.png](https://qiita-image-store.s3.amazonaws.com/0/160563/6a95dcd2-c92e-673d-e51d-908f796962b7.png)

プライマリディメンションを変更して、設定した任意の値を検索して確認
フィーチャーフォン(ガラケー)とそれ以外でコンテンツを出しわける方法

![ガラケー振り分け.png](https://qiita-image-store.s3.amazonaws.com/0/160563/1cb95051-47f0-846d-3ab8-af002eef990c.png)

#利用シチュエーション

* フィーチャーフォン(ガラケー)とそれ以外のデバイスでコンテンツを出し分けたいとき

#特定の機種を選択して振り分け

```html:qiita.rb
<div id="text"></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript">
	var ua = navigator.userAgent;
	if( 
		//機種を指定
		ua.indexOf('SH-01J') != -1
		||ua.indexOf('X01') != -1
	)
	{
		//フューチャーフォン(ガラケー)
		$('#text').html('フューチャーフォン');
	} else {
		//それ以外
		$('#text').html('指定以外の機種');
	}
</script>
```

#キャリアを指定して振り分け

```html:qiita.rb
<div id="text"></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript">
	var ua = navigator.userAgent;
	if( 
		//キャリアを指定
		ua.indexOf('DoCoMo') != -1
		||ua.indexOf('KDDI') != -1
		||ua.indexOf('Vodafone') != -1
		||ua.indexOf('SoftBank') != -1
	)
	{
		//日本のキャリア
		$('#text').html('日本のキャリア');
	} else {
		//それ以外
		$('#text').html('日本以外のキャリア');
	}
</script>
```

#参考
[userAgent(ユーザーエージェント一覧)](http://www.openspc2.org/userAgent/)
クラスメソッドとインスタンスメソッド

クラスメソッドとインスタンスメソッドの意味や書き方を整理してみた。

クラスメソッドは、クラスオブジェクトから呼び出せるメソッド。
インスタンスメソッドは、インスタンスオブジェクトから呼び出せるメソッド。

インスタンスメソッドは、クラスの中に、メソッドの定義『　def メソッド名　〜　end　』と表記することで定義できる。
クラスメソッドは、『　class << クラス名　〜　end 』の中にメソッドの定義をすることなので、定義できる。

例えば、Fooクラスのインスタンスメソッドは以下のように書ける。

```
class Foo
  def foo
    puts "instance methood"
  end 
end
Foo.new.foo # instance methood
```

また、Fooクラスのクラスメソッドは以下のように書ける。


```
class Foo
  class << self
    def foo
      puts "class method"
    end
  end
end
Foo.foo # class method

class Boo
  def self.boo
    puts "class method"
  end
end
Boo.boo # class method
```

クラス内でselfはクラス名を意味するので、
上記のクラスメソッドは、『　class << Foo　〜　end 』、『　def Boo.boo　〜　end 』
と同じ意味になる。
MSYS2でpacmanに「エラー: GPGME error: 無効な暗号エンジンです」と怒られた

ナウいWindows環境を構築すべく、MacTypeでフォントをオシャレにしつつ、Unix風環境をMSYS2で整えていたところ、下記のように「エラー: GPGME error: 無効な暗号エンジンです」と怒られた。

```
$ pacman -S zsh
依存関係を解決しています...
衝突するパッケージがないか確認しています...

パッケージ (1) zsh-5.3.1-1

合計ダウンロード容量:  1.83 MiB
合計インストール容量:  5.24 MiB

:: インストールを行いますか？ [Y/n]
:: パッケージを取得します...
 zsh-5.3.1-1-x86_64                           1875.9 KiB   683K/s 00:03 [#######################################] 100%
(1/1) キーリングのキーを確認                                            [#######################################] 100%
(1/1) パッケージの整合性をチェック                                      [#######################################] 100%
エラー: GPGME error: 無効な暗号エンジンです
:: ファイル /var/cache/pacman/pkg/zsh-5.3.1-1-x86_64.pkg.tar.xz は破損しています (無効または破損したパッケージ (PGP 鍵)
)。
ファイルを削除しますか? [Y/n]
エラー: 処理を完了できませんでした (無効または破損したパッケージ (PGP 鍵))
エラーが発生したため、パッケージは更新されませんでした。

$
```

ググったところ、MacTypeが悪さをしているかも、という情報を下記URLにて発見。

- https://github.com/Alexpux/MSYS2-packages/issues/393

実際にMacTypeのiniファイルに下記の記述を追加したところpacmanに怒られなくなった。

```
[UnloadDLL]
gpg.exe
pacman.exe
```

コマンドラインツールとは全く無関係そうなMacTypeが悪さをしているとは完全に予想外でした。オシャレ環境を目指したばかりに、踏まなくていい罠を踏んだ感じですね…
JavaScriptの関連用語の発音を調べてみた

# 発音わかんねー！

「単語を知っているのに、発音が分からなくて会話できねー！」って自分が困った経験があるのでまとめてみました。

全然網羅していないですが、同じ悩みを抱えている人の参考になれば。

# 発音集（アルファベット順）

## Ajax
発音：エイジャックス
概要：Webブラウザに実装されているHTTP通信機能を使い、非同期にデータ処理を行う技術の総称

## AngularJS
発音：アンギュラージェイエス
概要：Googleと個人や企業のコミュニティによって開発されているフロントエンドWebアプリケーションフレームワーク

## DOM
発音：ドム
概要：Document Object Modelの略でHTMLやXML文書を取り扱うためのAPI

## ECMAScript
発音：エクマスクリプト
概要：Ecma Internationalによって標準化されてるJavaScriptの仕様の事

## gulp
発音：ガルプ
概要：Node.jsを使ったタスク自動化ツール

## JSON
発音：ジェイソン
概要：JavaScript Object Notationの略で、テキストベースのデータフォーマットのこと

## Node.js
発音：ノードジェイエス
概要：ChromeのV8 JavaScriptエンジンで動作する、サーバーサイドのJavaScript実行環境

## React.js
発音：リアクトジェイエス
概要：Facebook製のUIを構築するためのライブラリ

## RegExp
発音：不明
概要：Regular Expressionの略。正規表現。
補足：「RegExp」という単語に対しての発音が定まっておらず、英語の「レギュラーエクスプレッション」か日本語で「正規表現」と呼ぶのが無難そう

## Vue.js
発音：ビュージェイエス
概要：ユーザーインターフェイスを構築するためのプログレッシブフレームワーク。「Vue」の発音は「view」と同じ
ActiveAdminでページに生のhtmlタグを挿入する方法

arbreのtext_nodeメソッドにhtml_safeな文字列を渡しましょう。

```ruby
show do
  text_node '<a href="foo">Foo</a>'.html_safe
end
```

何かのタグの内容として挿入する場合は、そのタグのメソッドにhtml_safeな文字列を渡すこともできます。

```ruby
show do
  para '<a href="bar">Bar</a>'.html_safe
end
```

普段は普通にタグのメソッド呼んだほうがいいと思いますが、外部サービスのタグなどを埋め込む場合にはこっちのほうが取り回ししやすいでしょう。
BEMを使った投稿規則

#BEMとは
Block,Element,Modifyの略称です。下記以下の通り属性になります

・Block（ある要素のおおもとになる要素）
・Element（blockに属する子要素）
・Modify（block,elementを特別に修飾する要素）

##命令規則について

・blockとelementをつなぐ場合はアンダーバー２つ（__）書く。
・modifyをつなぐ場合はハイフン２つを(--)書く


このような命令規則を使って以下のように記述します。
例えば、以下のようなhtmlこのように書きます。


```<div class='block'>
    <div class='name__list'>JACK</div>
    <div class='name__list title__list--back-white'>NANCY</div>
</div>```

このように書いたら以下のようにcssで書けます。

```.block {
  list-style: none;
  .block__list {
    background-color: blue;
    font-size: 50px;
    color: red;
    float: left;
    text-align: center;
    width: 50%;
    .block__list--back-white {
      background-color: white;
      color: green;
    }
  }
}```

色々とややこしい部分もあると思うのでここで復習の一環として記述しました。