OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity(C#)】猿でもわかるが猿すらもう飽きてる今更AR名刺

##本当に簡単でした
猿並みの知能の私ですが、本当に簡単にできました。

どれくらい簡単かというと
**完全なるAR初心者の私(猿)でも、もろもろ2時間足らず**で完成しました。

ですので、**この記事を見た方は1時間以内には完成する**と思います。

※本記事はAndorid端末での実装方法のお話となります。

~~(UnityにおけるAndorid関連の環境構築だけは自力で頑張ってください...)~~

そういえばUnity2019.1からAndorid関連の環境構築に必要なものも勝手に
引っ張ってこれるようになっているようです。これで開発環境構築も安心ですね。


Androidの環境構築がまだの方はこちら→[まとめ記事](http://bibinbaleo.hatenablog.com/entry/2019/04/17/064702)

##Vuforia
**Vuforiaを強くお勧め**します。

理由は**とてつもなく簡単**だからです。
知能が猿なのでARCoreでの名刺作りは難航しました。
~~ARKitはMac持ってないので試してません。(ください)~~

しかし、Vuforiaを使うと**画像を認識して3Dオブジェクトの表示まで30分足らず**でできました。

あと、**画像認識の精度が非常に高い**です。
さほど特徴的でなくても高い精度で認識してくれます。
ARCoreは登録できる画像が厳しめで、特徴の無い白黒の名刺ではなかなか認識してくれませんでした。

##セットアップ
セットアップ~表示までの手順はみんな大好きおもちゃラボさんにまとめられています。
こちら→[おもちゃラボ](http://nn-hokuson.hatenablog.com/entry/2018/08/28/192028)


手順通りに進めるとわかると思うのですが、
**Scriptを一切書かずに完成**します。

もし、名刺を認識して3Dオブジェクトを表示したいだけならもう終了です。

それでは私の書くことがなくなってしまうので、
今回は名刺にARとして3Dオブジェクトを表示し、
**・設定したアイコンをタッチしたら指定したURLに飛ぶ**
**・顔写真に触れると爆発する**(意味不明)
などをやってみようと思います。

私の名刺は白黒で特徴があまりなく、それでも十分認識してくれるのですが、
デモとして紹介するからにはより精度を高めておきたいので、
[unityroom](https://unityroom.com/)の名刺(?)をお借りしました。
![IMG_20190424_005700~2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/aedfa418-0d3d-306a-cdfb-93a86de562b2.jpeg)


##AR空間のオブジェクトをタッチする

**普通の3Dと全く同じ仕組み**で大丈夫です。
①触れた位置からRayを出して衝突判定を取る。
②Rayがオブジェクトに当たっていたら指定したイベントを呼び出す

これだけです。

ただし、一つだけルールがあって、
**表示したいオブジェクトは登録したImageTargetの子に設定**してください。
もう自分で追加したオブジェクトは全部つっこんどいたらいいと思います。

```C#:オブジェクト自身にアタッチします
using UnityEngine;
using UnityEngine.Events;

public class TouchedObj : MonoBehaviour
{
    [SerializeField]
    UnityEvent touchEvent;

    void Update()
    {
        //タッチされたらイベント呼び出し
        if (OnTouch())
        {
            touchEvent.Invoke();
        }
    }

    //タッチされたらtrueを返す
    bool OnTouch()
    {
        if (0 < Input.touchCount)
        {
                Touch touch= Input.GetTouch(0);

                if (touch.phase == TouchPhase.Began)
                {
                    //タッチした位置からRayを飛ばす
                    Ray ray = Camera.main.ScreenPointToRay(touch.position);
                    RaycastHit hit = new RaycastHit();
                    if (Physics.Raycast(ray, out hit))
                    {
                        if (hit.collider.gameObject == this.gameObject)
                        {
                            return true;
                        }
                    }
                } 
        }
        return false; 
    }
}
```

今回はTwitterとQiitaのURLを指定します。

[MagicaVoxel](https://ephtracy.github.io/)で自前でアイコンを用意しましたが、
画像を拾ってきてキャンバスに貼り付けるとかでも十分だと思います。
![magicaVoxel_Icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/234c1570-c9d8-2ec1-25c7-2339fd668b74.png)

あとは、Inspector上でUnityEventに対して
`行いたい処理が書いてあるメソッド`を登録してあげればOKです。

```C#
    //URLを開く
    public void OpenURL(string url)
    {
        Application.OpenURL(url);
    }
    
    //爆発
    public void Explosion(GameObject obj)
    {
        obj.SetActive(true);
    }
```


##デモ
アイコンをタッチすると私のTwitter、Qiitaに飛んで、
私の写真をタッチすると爆発します。
ありがとうございました。

![imihumei.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/bc0a8ac5-fcc8-3502-d709-adc6867a160a.gif)
VBからWindowsキー＋Shift＋Sを送信し、範囲指定スクリーンショットを行う

今回の環境
Windows10（2017年4月以降のアップデートが適用済）
Microsoft Visujal Studio Community 2017

VB SendKeys Windowsキーなどで検索すると
VBからWindowsキーを操作する方法としてSendKyesを使用する方法が紹介されていますが

	SendKeys.Send("^{ENTER}")	'Ctrl + Escキー

これはWindowsキーが一般的なキーボードに搭載されてい無かった時代にWindowsキーの代替する方法としてCtrl＋EscでWindowsキーと同じ動作が割り当てている名残であり、実際のWindowsキーが押されている状態と同じではありません。

その為、昨今のWindowsキー＋「何かのキー」（Windowsキー+E でエクスプローラ起動）といったショートカットには対応していません。

Windows10の2017年4月以降のアップデートで新たに搭載された「Windows＋Shift＋S」をエミュレートしてみたいと思います。
（「Windows+Shift+S」は画面のスクリーンショットを範囲指定で取得する機能です。）

よく同様の機能を実装する為にWin32APIを使用する方法で ByVal dwFlags As Long, ByVal dwExtraInfo As Long　と宣言されている例がありますが、
2019年4月現在では正常に動作せずLongで宣言している部分をIntegerで宣言する必要があります。
 ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer

また、キーを押す操作の後にキーをあげる操作を忘れるとフォームを終了するまでキーが押されたままの状態になりWindows自体の動作がおかしくなりますので必ずキーをあげる操作を忘れないでください。

	Public Class Form1
		Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)


		Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click	'今回はボタンクリックイベントですが他のイベントでも可能です。

			Call keybd_event(&H5B, 0, 0, 0) 'Windowsキーを押す
			Call keybd_event(&H10, 0, 0, 0) 'Shiftキーを押す
			Call keybd_event(83, 0, 0, 0) 'sキーを押す

			Call keybd_event(&H5B, 0, 2, 0) 'Windowsキーをあげる	『キーをあげる操作を忘れないようにしてください』
			Call keybd_event(&H10, 0, 2, 0) 'Shiftキーをあげる	『忘れるとプログラムを終了するまでWindowsの動作がおかしくなります』
			Call keybd_event(83, 0, 2, 0) 'sキーをあげる

		End Sub
	End Class


Windowsキーと組み合わせるキーとしてShiftキーやSキーの代わりに別のキーにすることにより、別のショートカットキーを実現することもできます（Windowsキー+Rで「ファイル名を指定して実行」を起動するなど）

参考にしたサイト
https://www.petitmonte.com/visualbasic/vbapi_keybdevents.html
LINE Clova スキルでobniz IDを一発で全部取得する

# はじめに
[GW Advent Calendar の LINE Developer Community](https://gw-advent.9wick.com/calendars/18) 1日目を担当しますnorippyです。
GW、旅行も行かずこんな記事を書いています。なんだかんだ、開発は楽しいですよね。

私は普段はハードウェアエンジニアでソフトの知識は大してありません。ただ、好きでAlexaスキルの開発をしているのですが、少しClovaスキルの開発もしてきました。
その中で、見つけたobniz IDを一発で全部取得する方法について書きます。(コードの話はないです)
ただこの内容は他にも応用ができて、この記事の内容を生かして設計をすれば、obnizに限らず音声認識率自体が向上すると考えています。

# obnizって何？
obnizはESP32というWi-FiとBluetooth Low Energyが使えるマイコンが実装された開発ボードです。
ただこの開発ボードはとても便利で、普通のマイコンと違い、web上でコードを書くことで、ESP32の信号線の動作（電圧をHIGHにしたりLOWにする）ことができます。
つまり、ソフトウェアエンジニアがIoTを始めるには一番取っ掛かりが良いマイコンではないかと思います。

このobniz、もう一つの特徴は、**8桁の数字から構成されるデバイスID** で管理されており、このデバイスIDを使うことで、自分が所有しているマイコンを動かすことができるようになります。またobniz cloudサービスを利用することで、自分の作ったコードを自分だけで楽しむのではなく、みんなに使ってもらうこともできます。
ということは・・・

**数字で管理　+ 他の人のマイコンも動かせる環境が作れる　= スマートスピーカーで利用できる！**

わけです。
実際にclovaではobnizを使ったClovaスキルが作られ、公開されていますし、昨年のLINE BOOT AWARDS 2018では[エンジニア部門賞はobnizを使った作品](http://www.rino-make-fun.com/2018/11/13/clova-friends-%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E5%8C%96%E3%83%8F%E3%83%BC%E3%83%89-%E3%83%AD%E3%83%9C%E3%82%B9%E3%83%BC%E3%83%84/)でした。ありがたいことに、これ私なのですが、開発ではClova CEKでobnizのデバイスIDを認識するのに苦労しました。

# Clova CEKでobnizのデバイスIDを認識してみる
ということで、早速CEKの話です。
最初にobnizのID 8桁のスロットを認識できるように、カスタムスロットを作ります。
カスタムスロットを作った理由ですが、
**ビルドインスロットよりも決められた数字しか出ないのであれば限定してあげたほうが、その項目から判断しようとするので認識率が上がります**

<img width="738" alt="スクリーンショット 2019-04-27 11.52.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/e4e790a2-c75c-f2d5-0b20-e52e7799e213.png">

次に、インテントを作ります。
**このインテントの作り方が重要です！(マジです！)**
開発の段階で色々トライしたのですが、インテントの作り方を間違えると、全く認識できなくなります。

動けフレンズロボットというobnizを使ったスキルのインテント一覧は以下になります
<img width="320" alt="スクリーンショット 2019-04-27 12.08.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/c46e8a8a-ae3a-fbfc-050f-1c40273dbd2f.png">

inputNumIntentというのがありますね。
これの中身はこのようになっています

<img width="850" alt="スクリーンショット 2019-04-27 11.51.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/039cca79-c33c-4233-7557-7352962f0b2e.png">

このインテントの特徴は、これ以外のサンプル発話がありません。
例えばここに
「こんにちは」
「もう一度教えて」
など入れると、認識ができなくなります。
**数字だけなら数字をとるためのインテントを作ります。これが大事です**

この様に設計しないと認識ができないというのは、実際にLINEのエンジニアの方に教わりました。
どうも機械学習のアルゴリズムの話と絡んでいるようで、全く違う複数の認識結果の可能性を与えると、結果として認識ができないということになるようです。


# まとめ
Alexaスキルと違い、細かくインテントを分けることでClovaスキルの認識率は向上します。
なんかうまくいかないなぁと思ったら、ぜひインテントをわけてみてください。
Dockerで「No images to push」というエラーが出た【結論：Dockerfile-railsという命名が原因】

こんにちは、けんぞうです。
[既存のWebアプリにDocker環境を構築している](https://qiita.com/kenzoukenzou104809/items/b9e716204e0cd0cea447)のですが、それらをHerokuへデプロイする際、以下のエラーが出ました。

```
$ heroku container:push web

▶︎No images to push

```

##結論：`Dockerfile-rails`という命名が原因でした。

`Dockerfile-rails`で操作していて、開発環境で動かしている時点では問題なく動作確認ができていたのですが、**Herokuにデプロイするためには、`Dockerfile`がアプリディレクトリ直下にないといけならしいです。**

>image をビルドし、registry.heroku.com へプッシュするには、アプリケーションのディレクトリに Dockerfile が存在することが必要です. 以下を実行します
引用元：[Heroku Container Registry & Runtime とは（Heroku Dev Center の私家訳）](https://qiita.com/ysaito8015@github/items/0d2d32a553d0414a700e)

という訳で、`Dockerfile-rails`を`Dockerfile`にリネームしたら問題は解消されました。

短いですが以上です。
Leetcode: #150 Evaluate Reverse Polish Notation

Thought: evaluate from left to right
if the token is a number, store it in the stack
if the token is an operator, pop the last two elements in the stack and do the operation. 

```swift
func evalRPN(_ tokens: [String]) -> Int {
    var nums = [Int]()
    for token in tokens {
        if let num = Int(token) {
            nums.append(num)
        } else {
            let second = nums.popLast()!
            let first = nums.popLast()!
            var tmp = 0
            if token == "+" {
                tmp = first + second
            } else if token == "-" {
                tmp = first - second
            } else if token == "*" {
                tmp = first * second
            } else {
                tmp = first / second
            }
            nums.append(tmp)
        }
    }
    return nums.first!
}
```
mac で android sdk を使う

# Java SE Development Kit (JDK) のインストール
[Android SDK](https://developer.android.com/studio/index.html#downloads) の動作には Java SE Development Kit (JDK) が必要です。ただし、 Java8 では動作するようですが、最新の Java12 では動作しませんでした。
今回は OpenJDK の一種の Zulu8 で代用しました。

```bash
brew cask install caskroom/versions/zulu8
```

他のバージョンの Java がインストール済みの場合、次の手順で使用するバージョンを Zulu8 に切り替えます。

```bash
export JAVA_HOME=$(/System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java_home -v "1.8")
PATH=${JAVA_HOME}/bin:${PATH}
```

なお、現在インストール済みの JDK 一覧は `/usr/libexec/java_home -V` で確認できます。

# Android SDK のインストール
[ここ](https://developer.android.com/studio/index.html#downloads) からダウンロードしてパスを通せばそのまま使えますが、 brew cask を使ってもインストールできます。

```bash
brew cask install android-sdk
brew cask install android-platform-tools
```
Python3 初心者　リスト

#リストについて
リストとはミュータブルで要素の挿入や削除などの編集をすることができる。リストはオブジェクトの種類で話したオフセットなどで要素を取り出したりすることができます。リストは追加された通りに要素を並んでいる。
## リストの作成
### []による作成

```py
week = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
```

### list()による作成

```py
week1 = ('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday')
```
```py
list(week1)

['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
```

このlist()関数はタプルをはじめとする色々なデータ構造をリスとぬ変換することが出来ます。
### リストに要素を追加する
append()関数を使えばできる。先頭に自分がどのリストに入れたいかを設定してそのあとにappend(入れたいもの)でできる。

```py
week.append('Saturday')
```
```py
week

['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
```
### []（オフセット）による要素の置き換え
リストから値を取り出したい時も同様にオフセットを特定して出力すればできる。オフセットもできるんだからスライスも出来ます！！

```py
week[1]='Today'
week
['Sunday', 'Today', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
```

###　extend()または＋＝によるリストの結合

```py
day=['1 day', '2 day']
week.extend(day)
['Sunday', 'Today', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', '1 day', '2day']
```

### insert()による特定の場所に要素を入れる方法

```py
day.insert(1, '1.5 day')
day
['1 day', '1.5 day', '2 day']
```

### delによる特定の場所の削除
```py
day.del[1]
day
['1 day', '2 day']
```

ここで注意して欲しいのが一行目の[1]である。insertでは()だがdelでは[]になっている。気をつけよう。
remove()関数はオフセット指定ではなく要素を指定して取り出すのでもし曜日なのに８個も要素を入れちゃっていたのならremove(削除したい要素)で実行できる。

###pop()による一回出してその値を削除する
例えば「おいおいこんな要素たくさん引用するつもりだったけど一回しか使わないじゃん！しかもずっと入れていたら無駄じゃん！」って思ったら削除しよう。

```py
week.pop(1)
'Today'
week
['Sunday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', '1 day', '2day']
```

という風にできる。一番最後の要素を削除したいのならpop()で中に何も入れずに
削除することが可能です。

### 要素を知りたいな！
#### index()による値はどのオフセットか
```py
week.index('1 day')
6
```

####inを使った要素が入っているかの確認
```py
week in 'Sunday'
True
week in 'Me'
False
```

### sort(),sorted()による要素の並び替え
僕は今高校生なんですがいつも整列するときは出席番号順で並んでいます。要素にもそうしてもらいたいですよね？？？

```py
name=['John', 'Ace', 'Bob', 'Pogba']
name.sort()
name
['Ace', 'Bob', 'John', 'Pogba']
```

この処理は一回しか使いたくないときに使う。出席番号順をいちいち定義してやるのはめんどくさいですよね？そーゆうときには代入を使うんです！！！

```py
name_sort=sorted(name)
name_sort
['Ace', 'Bob', 'John', 'Pogba']
```
 このようにすれば何回でも要素を取り出すことが出来ます。
>間違っているところもしくはこの表現ハラタツな！などの意見がありましたらコメント欄で教えてくださると幸いです。
AWS Redhat/Amazon Linux IaaSに最短でmecab環境整えるメモ

AWS AMI ID :RHEL-7.6_HVM_GA-20181017-x86_64-0-Hourly2-GP2 (ami-0b500ef59d8335eee)
AWS AMI ID :amzn-ami-hvm-2018.03.0.20181129-x86_64-gp2 (ami-0cd3dfa4e37921605)


## ちなみに
```
$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.6 (Maipo)
```
※RHELのみ


## まずコンパイラから
```
$ sudo yum install gcc
$ sudo yum install gcc-c++
$ which gcc
/usr/bin/gcc
$ which c++
/usr/bin/c++
```

## mecab本体。文字コード指定に注意(デフォルトだとEUCになる)
```
$ tar zxvf mecab-0.996.tar.gz
$ cd mecab-0.996
$ ./configure --with-charset=utf8
$ make
$ sudo make install
$ which mecab
/usr/local/bin/mecab
```
単体で動確すると

```
$ mecab
param.cpp(69) [ifs] no such file or directory: /usr/local/lib/mecab/dic/ipadic/dicrc
```
辞書がないエラー


## IPA辞書。これも文字コードに注意。

```
$ tar zxvf mecab-ipadic-2.7.0-20070801.tar.gz
$ cd mecab-ipadic-2.7.0-20070801
$ ./configure --with-charset=utf8
$ make
$ sudo make install
```

## ここまでが目標

```
$ mecab
すもももももももものうち
すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS
```


## mecab ＆ IPA辞書のダウンロード
http://taku910.github.io/mecab/#download
証明書の作り方〜導入〜

[link-intro]:https://qiita.com/gazami/items/efda6bbfba632441e125
[link-root]:https://qiita.com/gazami/items/2c54a0958c307f479961
[link-int]:https://
[link-server]:https://
[link-nginx]:https://
[link-browser]:https://
[link-client]:https://

# はじめに
Web検索で見つけた証明書の作り方では，みんなやり方がまちまちで分からない！

でしょ？

あのサイトもどのサイトも，やりたいのは自己署名じゃない！！

## やりたいこと
自己署名じゃないサーバ証明書を作りたい．ルート認証局と中間認証局の2段構えのフル実装をやってみたい．ただし，ルート認証局だけは自己署名で作る．さすがに本気で信頼できるルート認証局を作るなんてことまではしない．

それで，nginxでTLSを動かす．あとクライアント認証もやりたい．やりたいこといっぱい．

## ここではやらないこと
用語の細かな説明とか．
ツールのインストール方法とか．

ここを参考にしようとする人はパソコン初心者じゃないので特に問題無かろう．

## 環境
実行環境はこんな感じ．特殊なことは特にやってないつもり．

```shell-session
[~]$ cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 
[~]$ openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017
```

# これから作りたいもの
大体こんな感じ．

```
ルート認証局              # 自己署名
├── 中間認証局1           # ルート認証局で署名
|   └── サーバ証明証      # 中間認証局1で署名
└── 中間認証局2           # ルート認証局で署名
    └── クライアント証明証 # 中間認証局2で署名
```

ルート認証局も中間認証局もある，信頼できる認証局で証明書を作ってもらったときと同じような構成にしたい．

# 作業
こんだけそろえようとすると，やることはかなり多い．

1. ルート認証局を作る
1. 中間認証局を作る
1. サーバ証明書を作る
1. nginxでTLSを設定する
1. Webブラウザにルート証明書をインポートする
1. クライアント証明書を作る

信頼できる認証局を使うまっとうなやり方だと，それぞれ別々の人が作業するので良いのだが，これを1人で1台のPCで全部やるとすると，今やってる作業がどの立場の人の作業だとか，どのファイルを使うだとか，だんだんわけが分からなくなってくる．

今回はルート認証局，中間認証局，サーバの管理者用の3つのディレクトリを用意し，それぞれの立場の作業はなるべくそれぞれのディレクトリへ移動して行うことにする．めんどうだけど，今からやる作業がどの立場の人の作業か，意識できるようにしている．

```shell-session
/etc/pki/
├── tls       # コンフィグファイルは全部ここ
├── RootCA    # ルート認証局
├── Int1CA    # 中間認証局
└── FourierSV # サーバ証明書
```

## 実行するアカウント

実行は基本的に管理者権限で行う．これは単に`/etc/pki/`の権限がそうなっているため．ここでは`sudo`をいちいち書くのがめんどうなので，`su -`でrootアカウントに移行して作業している．

## 補足
途中に出てくる`echo`のリダイレクションは，単に`sudo`を頭に付けただけでは実行できない．

```shell-session
$ sudo sh -c 'echo 01 > serial'
```

とすれば良い．

# これからやること
1個の記事で全部書くのは大変なので，それぞれの作業で記事を分けた．

* [ルート認証局を作る][link-root]
* 中間認証局を作る（未投稿）
* サーバ証明書を作る（未投稿）
* nginxでTLSを設定する（未投稿）
* Webブラウザにルート証明書をインポートする（未投稿）
* クライアント認証（未投稿）

<!--
* [中間認証局を作る][link-int]
* [サーバ証明書を作る][link-server]
* [nginxでTLSを設定する][link-nginx]
* [Webブラウザにルート証明書をインポートする][link-browser]
* [クライアント認証][link-client]
-->
Docker for Windows + kubernetesでサンプルアプリを動かす(まんがではじめるKubernetes)

# 概要 
- Docker for Windows + kubernetesで、サンプルアプリを動かす

# 参考書籍
- [まんがではじめるKubernetes](https://booth.pm/ja/items/1317512) あおい 著
    - NodeやPodの説明がマンガ形式で説明されているので、さらっと見る。

# Docker for Windows に kubernetesを入れる
- Dockerのアイコンを右クリック－「settings」－「Kubernetes」で、「Enable Kubernetes」にチェックを入れて、Kubernetesをインストール

# サンプルアプリをclone
- ```mkdir aoi1```
- ```cd aoi1```
- ```git clone https://github.com/aoi1/k8s-sample-app```
    - 本に記載のアドレスは「k8s-sampleapp」と2つ目の「-」が抜けているので注意
- ```cd k8s-sample-app```

# Deploymentの登録
- Deployment
    - ```kubectl apply -f ap-deployment.yaml```
- 確認
    - ```kubectl get deployment```
    - ```kubectl get pods```
 
# Serviceの登録
- Service
    - ```kubectl apply -f ap-service.yaml```
- 確認
    - ```kubectl get service```
    - ポート番号を確認する
        - 下記では、ブラウザで見るためのポートは31663(80ではないので注意)

```
NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes        ClusterIP   10.96.0.1       <none>        443/TCP        3m
tofu-sample-app   NodePort    10.105.84.183   <none>        80:31663/TCP   6s
```

# ブラウザで動作確認
- http://localhost:31663/ を開く(ポート番号は上記を参照)
    - 猫の絵が表示されればOK。
お試しクエリにも便利なVALUES構築子

VALUES構築子はINSERT文以外でも使えます(SQL-99から)。

```SQL
SELECT
    *
FROM
    (VALUES
        (1, 'Alice')
      , (2, 'Bob')
      , (3, 'Carol')
    ) AS users
        (id, name)
```

|id|name|
|---|---|
|1|Alice|
|2|Bob|
|3|Carol|

もちろん、JOINすることもできます。

```SQL
SELECT
    users.id
  , users.name
  , comments.comment
FROM
    (VALUES
        (1, 'Alice')
      , (2, 'Bob')
      , (3, 'Carol')
	) AS users
        (id, name)
LEFT OUTER JOIN
    (VALUES
        (1, 'Hello')
      , (3, 'World')
	) AS comments
        (user_id, comment)
    ON users.id = comments.user_id
```
|id|name|comment|
|---|---|---|
|1|Alice|Hello|
|2|Bob|NULL|
|3|Carol|World|

UPDATEやDELETEはできないものの、一時テーブルを作らずに済むので楽です。

## データ型はどうなるの？

SQL Serverで値の情報を調べるには、[SQL_VARIANT_PROPERTY](https://docs.microsoft.com/ja-jp/sql/t-sql/functions/sql-variant-property-transact-sql?view=sql-server-2017)関数を使います。

```SQL
SELECT
    *
  , SQL_VARIANT_PROPERTY(id, 'BaseType') id_type
  , SQL_VARIANT_PROPERTY(name, 'BaseType') name_type
FROM
    (VALUES
        (1, 'Alice')
      , (2, 'Bob')
      , (3, 'Carol')
    ) AS users
        (id, name)
```

|id|name|id_type|name_type|
|---|---|---|---|
|1|Alice|int|varchar|
|2|Bob|int|varchar|
|3|Carol|int|varchar|

値に応じて、適当なデータ型が与えられるようです。
gitbookを触ってみる（触ってみただけ）

date 2019/4/27 

---
# gitbookを始めよう

目的。会社の仕様書作成にwordとか使うのもうヤダ！
差分管理できるように何かいいツールないか探したら、gitbookってのがあるじゃありませんかー！

これだああああ

# ubuntu 19.04 インストール
作業環境は、ubuntuがいいよね、ってことでインストール。
メモリは8GB, CPU 8個にしたよ！めんどかったから！

# 環境構築

```
sudo -s 
apt remove libreoffice*
apt remove firefox*
apt remove thunderbird*
apt remove rhythmbox*
apt install openssh-server*
apt update -y
apt upgrade -y
apt install git
apt install nodejs
apt install npm
apt install ifconfig
exit
```

# gitbookを導入してみよう
https://github.com/GitbookIO/gitbook/blob/master/docs/setup.md
このあたりをベースに作業をしてみる。

```
sudo npm install gitbook-cli -g
sudo npm install gitbook-plugin-toc -g
```

# プロジェクトを作ってみよう
```
gitbook init testproject
```

ちょい待たされたが、完成！

# localで表示させよう
```
cd testproject
gitbook serve
```

localhost:4000 にアクセスすると、読めますね！
しかもファイルを更新すると勝手にアップデートもしてくれる！
いいぞ、これはいいぞ！！

# シェアボタンを外す
http://kuttsun.blogspot.com/2018/06/gitbook.html

``` book.json
{
  "plugins":["-sharing"]
}
```

# 良い点
gitで差分管理できるのは悪くない。

# 悪い点
フォーマッティングめんどくさい…

大体満足したし、今日はこれくらいにしてやる！！（負け惜しみ
Vagrant halt できない

#vagrant haltができない
##エラー
vagrant haltするとできない。
コマンドが失敗したみたいだけど何が悪いのかよくわからない。
` vagrant suspend `はできた。そのあとに` vagrant halt `するとpower offになる。

```
PS C:\Users\Yudai\MyVagrant\MyCentOS> vagrant halt
==> default: Attempting graceful shutdown of VM...
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

shutdown -h now

Stdout from the command:



Stderr from the command:
```

`vagrant halt` 後、` vagrant up `で起動はするけどエラーになる。

```
PS C:\Users\Yudai\MyVagrant\MyCentOS> vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'bento/centos-6.8' version '2.3.4' is up to date...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection reset. Retrying...
    default: Warning: Connection aborted. Retrying...
    default: Warning: Connection aborted. Retrying...
    default: Warning: Connection reset. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    default: Warning: Connection aborted. Retrying...
    default: Warning: Connection reset. Retrying...
    default: Warning: Connection aborted. Retrying...
    default: Warning: Connection reset. Retrying...
    default: Warning: Connection aborted. Retrying...
    default: Warning: Connection reset. Retrying...
    default: Warning: Connection aborted. Retrying...
    default: Warning: Connection reset. Retrying...
    default: Warning: Connection aborted. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
==> default: Machine booted and ready!
[default] GuestAdditions seems to be installed (6.0.4) correctly, but not running.
==> default: Checking for guest additions in VM...
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

 setup

Stdout from the command:



Stderr from the command:
```

なお、ssh接続はできる。

このエラーより、GuestAdditionsが入っているけど起動しないようだ。

```
[default] GuestAdditions seems to be installed (6.0.4) correctly, but not running.
```

こちらを参考にしてkarnelをアップデート。時間かかります。
[vagrant up時にGuestAdditionsがnot runningになる場合、ゲストマシンのkernelをupdateすることで解決できる可能性がある]
(https://qiita.com/k-shimoji/items/eb3efeff2356a7318cf9)

```
$ sudo yum update
```

実行前と変わらず。

どうしたらいいんだ。
DBUnitのテーブル定義。yamlじゃ読みにくい！！！

# 概要
タイトルの通り。
DBUnitのデータ定義には以下のようなyamlファイルを作成するが

```
TABLE_NAME: 
- COLUMN1: VALUE1
  COLUMN2: VALUE2
  COLUMN3: VALUE3
  …
```
これが大量に書かれていると読み気にならない！！！

よし、見慣れたテーブル形式に変換しよう！

# 作った
https://rhirabay.github.io/dbunityml-to-table/

<img width="1431" alt="スクリーンショット 2019-04-27 11.28.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361020/669c360f-ea85-8a27-f79b-daca47038c20.png">

上部のtextboxにyamlをコピペするとテーブル形式で表示されます！
`@DatabaseSetup`と`@ExpectedDatabase`で２つのyamlを作成することが多いので
左右で見比べられるように同じ動きをするものを横に並べています！
ミュータブルとイミュータブル

# ミュータブル
要素を変更できる

- リスト(list)
- 辞書(dict)
- 集合(set)

# イミュータブル
要素を変更できない

- 文字列(str)
- タプル(tupple)

数値や真偽値もイミュータブル。
【備忘】PCでperlを動かせるようにする方法

###背景
同僚からperlで書かれたコードをプレゼントされたものの、自宅PCには動かせる環境が整っていなかった...

#1.perlをダウンロードする
どこからダウンロードしたものかな...と迷いググる。

余談だが、どこからダウンロードするものか、みんなはいったいどうやって決めているのだろうか...？？？

結論としてはActiveState社のものを使用することに。
pythonとかも扱ってくれてるとこらしい。
https://www.activestate.com/products/activeperl/downloads/

環境に合わせてWindows(64-bit, x64)のVersion5.26.3.2603をダウンロード。
自身のPCに「ActivePerl-5.26.3.2603-MSWin32-x64-a95bce075.exe」がダウンロードされていることを確認。

#2.perlをインストールする
ActivePerl-5.26.3.2603-MSWin32-x64-a95bce075.exeをダブルクリック
 → インストール開始
exe系は(私的には)いきなり処理が開始するので、いつもビビってしまう

<img width="371" alt="2019-04-27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276107/08f80951-2375-316f-a9bf-5a6c81726cab.png">
始まったね。[Next >]

<img width="371" alt="2019-04-27 (1).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276107/7600dd13-c2ab-1341-1dd9-850d1406b71e.png">
いきなりドキドキ。
Typicalは最も一般的なプログラムをインストールするもので、多くの人におすすめ。
Customはどのプログラムをどこにインストールするか選べる。すごい人向け。
Completeはすべてのプログラムをインストールするからめっちゃ容量必要。
素人丸出しなのでTypicalを選択。

<img width="371" alt="2019-04-27 (2).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276107/b2dab4cd-adc1-2fee-0bfe-ae84f4aad943.png">
セットアップのオプション決めれるとのこと。むむむ

- [x] Add Perl to the PATH environment variable
     自動でperlのPATHを設定してくれるとのこと。これはチェックでしょ

- [x] Create Perl file extension association
      Perlファイル拡張子(.pl)を見つけるとperlと認識してくれるのかな？
　　　とりあえずデフォルト通りチェック入れたままにする

- [ ] Install Komodo IDE 21-day Trial
　　　Komodo IDE という名の有料開発環境があって、それを21日間試せるよう。
　　　試す予定はないのでチェックなしで。

[Next>]

<img width="371" alt="2019-04-27 (3).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276107/11f39a76-636f-c76a-ac42-94fa76777208.png">
Installボタンを押せばインストール開始するし、Backボタンを押せばこれまでの設定を変えられ、Cancelでこれまでの作業を水の泡にできるそう。
[Install]


<img width="371" alt="2019-04-27 (4).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276107/d06d4144-80e9-afbb-8008-1f1d7f669766.png">
インストール中

<img width="371" alt="2019-04-27 (5).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276107/9da6c04e-3a83-0411-2010-73dcefa755ff.png">
結構早々とインストール完了。
そのまま[Finish］を押したらreadmeが開かれました。
開きたくないときは「View readme file」のチェックを外してね

#3.問題なく動くか確認する
コマンドプロンプロ開きましょう。
よくわからない人は[Windowsボタン]を押してcmdと入力+[Enter]

コマンドプロンプトが開いたらperl -vを入力。情報が表示されたら問題ないです。
urllibでメッセージbodyにパラメータを埋め込んだGETリクエストを送信する方法

# TL;DR
API の仕様上、GET method リクエストを利用するがパラメータはリクエストリングではなく、メッセージ body にパラメータを埋め込みたい場合に urllib を利用してそれを実現する方法。

- urllib は引数として `data` が与えられているとデフォルトで POST method を利用するため、明示的に `method` を引数で与える必要がある

# 利用シーン
情報を取得する API endpoint 等は GET リクエストを利用するのが主だと思いますが、リクエストリングに指定するパラメータの情報をアクセスログに出力したくない、等の理由で HTTP のメッセージ body にパラメータを埋め込む必要がある場合を想定しております。

# urllib の仕様
[urllib のソースコード](https://github.com/python/cpython/tree/master/Lib/urllib)を確認すると、`urllib.request.Request` クラスを利用して HTTP リクエストを生成する際、引数として `data` 引数にデータを与えると POST method のリクエストが生成されます。

そのため、インスタンス生成時に明示的に `method` 引数で GET を指定する必要があります。

# サンプルコード
例はパラメータを json とする例となります。

- POST method としてインスタンスが生成されるパターン
    - 明示的に `method` 引数を指定していないため

```python:sample.py
api_url = "https://hoge/fuga/"
data = {"param" : "test"} 
data = json.dumps(data).encode("utf-8")
headers = {"Content-Type" : "application/json"}

request = urllib.request.Request(api_url, data = data,  headers = headers)
```

- GET method としてインスタンスが生成されるパターン
    - 明示的に `method` 引数を指定しているため

```python:sample.py
api_url = "https://hoge/fuga/"
method = "GET"
data = {"param" : "test"} 
data = json.dumps(data).encode("utf-8")
headers = {"Content-Type" : "application/json"}

request = urllib.request.Request(api_url, method = method, data = data,  headers = headers)
```

# おわりに
基本的な内容でしたが、備忘録として残しておきます。
jQuery 直上の親オブジェクト検索

#ゆるい
```Javascript
parent().parent().parent().parent().parent()...
```
せっかちなんで最初はこうしていた。
機能追加で構造が変わると、エラー！
いくら個人プロジェクトであろうとも、コードレビューで動けばよいと思うやつは最低だ！と偉そうに指摘する自分が恥ずかしい。
恥ずかしいのか。ならまだ大丈夫。正義は恥を知ることから始まるんだ。

#改善

```Javascript
var classes = $(this).parent().closest('div').attr('class').split(' ');

parent().closest('div')
```
closest()の生みの親方、ありがとうございます。


#参考
https://stackoverflow.com/questions/7089229/how-to-select-first-parent-div-using-jque
AWS CLI 〜CloudFormation編③〜

# はじめに
備忘録として、自分がよく使う＆使ったaws-cliコマンドを書きます。
今回はCloudFormation編その３で、[その１](https://qiita.com/middle/items/06f4658b4467195cb53f)、[その２](https://qiita.com/middle/items/603a609a46b8f1f3f6fa)の補完verというか、まあ蛇足です。


## 注意
- [公式ドキュメントがちゃんとあります](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/index.html)
- 前述の通り自分がよく使う＆使ったものしか書いてないので、すべては網羅しておりません


## ドリフト作成

```
aws cloudformation detect-stack-drift --stack-name スタック名
```

なんとなくですが、ドリフト作成はcliの方が早い気がします。
しかしドリフトは、当時は（今も？）新機能だかベータ版ということで、私はあんまり信用してなかったです。
旧コンソールだとちゃんと表示されないこともあるとか、そういう話もサポートからうかがいました。


## スタック削除保護変更
### 有効化

```
aws cloudformation update-termination-protection --stack-name スタック名 --enable-termination-protection
```

### 無効化

```
aws cloudformation update-termination-protection --stack-name スタック名 --no-enable-termination-protection
```

有効状態で有効化コマンド、無効状態無効化でコマンドを叩いたとしても、エラーにはならないです。
しかし何故「--disable-termination-protection」ではないのでしょうね〜。


## スタック削除

```
aws cloudformation delete-stack --stack-name スタック名
```

スタック削除しても、どんなスタックだったかは確認できるのが便利ですね！


# おわりに

ゼロベースでCloudFormationの検証を始め、どうなることかと思いましたが、無事運用に載せるまでできました ^^
またCloudFormation担当のAWSサポートの方は、特に的確な回答をいただけると実感していた日々でございました。
ということで、当時使っていたCloudFormationのコマンドはこんな感じでした！
golangでtemplateの読み込みパスを複数定義する

## HTMLのテンプレートでパスの配下を複数指定したい場合の書き方

```golang
	templateList, err := template.New("t").ParseGlob("template/*.tpl")
	templateList.ParseGlob("template/parts/*.tpl")
```

ファイルのリストはポインタで管理されているので、追記していくだけで利用可能になる

## 参考

https://golang.org/pkg/text/template/
https://github.com/golang/go/blob/master/src/html/template/template.go
NanoPi NEO2 でDHCPサーバーを構築する

# 概要
この記事は、[ラズパイ(RaspberryPi3)をDHCPサーバーにしてみた](https://qiita.com/homines22/items/cccd711c9a77680d1e2c)の手順を参考に、[NanoPi NEO2](https://www.friendlyarm.com/index.php?route=product/product&path=69&product_id=180)上の[Armbian Stretch](https://www.armbian.com/nanopi-neo-2/)でDHCPサーバの構築したところ、一部はまったための覚書です。なお、参考にさせていただいた手順の問題ではなく、環境固有の不具合の可能性が高いと考えています。

orange pi + armbian でも同様でした。

# 手順

参考手順に従い、isc-dhcp-server をインストールして起動を試みたところ、`Job for isc-dhcp-server.service failed. See ‘systemctl status isc-dhcp-server.service’ and ‘journalctl -xn’ for details.
`
とエラーメッセージが表示され、起動しない。

/var/run/dhcpd.pid を削除

```
sudo rm /var/run/dhcpd.pid
```

/run/dhcpd.pid が存在すれば削除

```
sudo rm /run/dhcpd.pid
```
ファイル`/etc/default/isc-dhcp-server`を編集し、以下の3行をコメントアウトする。また、`"eth0"`を追記する。

```
DHCPDv4_CONF=/etc/dhcp/dhcpd.conf
DHCPDv4_PID=/var/run/dhcpd.pid
INTERFACESv4="eth0"
```

改めてDHCPサーバを起動する。

```
sudo systemctl start isc-dhcp-server
```
無事起動した。

念のために

```
sudo systemctl enable isc-dhcp-server
```
しておく。

# 追記
syslogを設定した。
[こちら] (https://github.com/kobasemi/man4ictsc6/blob/master/server/dhcpd.md)を参考にさせていただいた。
golangのtemplateで「no such template "xxx"」

## テンプレートの定義がない

{{define "xxx"}}の定義がない場合が多いので、宣言されているかタイポしていないか確認する

## 関数の呼び出しミス

関数の呼び出しの部分を間違っていても、発生する(関数は自分でfunctionAと定義をした関数)

```(正しい定義).go
{{functionA .Name}}
```

```(間違った定義).go
{{FuncionA .Name}}
```

呼び出している定義に関わらず読み込みを行なっているディレクトリに影響がでるため注意が必要。

エラーのあるファイル以降のテンプレートが読み込めない現象になる。
シンボリックリンクとハードリンクについて

#概要
2種あるリンクの違いや、リンクのメリットなどを記載する

#リンクとは
たとえば。。。
よく見る例だと
あるファイルを参照したいけど

```linux:ファイルの参照
cat /hoge/hogege/...../test
```
という感じで、めちゃくちゃ階層が深くて参照するのがめんどくさい事があるが頻繁に利用する。
~~そんな時は自分のよく利用するディレクトリにWindows だとショートカットを作成する。~~
Windowsのショートカットとは異なるものなので削除させていただきました。m( )m

そんな時に利用すると便利なのがこのリンクコマンド

#シンボリックリンク
```
ln -s 参照先 リンク名 
```
`ln`コマンドに-sをつけた形となる

#ハードリンク

```
ln 参照先 リンク名
```
こちらは先ほどのシンボリックリンクとは違いオプションをつけずに実行するとハードリンクとなる
※基本-s をつけなければハードリンクになる
#シンボリックリンクとハードリンクの違い
作成の仕方は分かったが何が違うのか。

シンボリックリンク : 参照先のパスを見に行く
ハードリンク:iノードを直接参照する

```
ファイルは、「iノード」と呼ばれるモノで管理されています
iノードはファイルの中身の情報(i_block)が格納されています。

ディレクトリエントリには、ファイルの実体であるiノードと、 ファイル名が格納されています。
引用元 : http://www.usupi.org/sysad/242.html

```
このiノードに直接紐づけするのがハードリンクであり、
シンボリックリンクはディレクトリエントリにあるファイルを参照しにいくものとなっている。

#注意点 
シンボリックリンクとハードリンクを利用していく中で注意すべき点が一点
・シンボリックリンクは参照先のファイルが移動/削除されると参照できなくなってしまう

上記に気を付けて利用していきたい
AWS CLI 〜CloudFormation編②〜

# はじめに
備忘録として、自分がよく使う＆使ったaws-cliコマンドを書きます。
今回はCloudFormation編その２で、スタック更新関係です。


## 注意
- [公式ドキュメントがちゃんとあります](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/index.html)
- 前述の通り自分がよく使う＆使ったものしか書いてないので、すべては網羅しておりません


## スタック更新その１　update-stack
### ①テンプレートがローカルにある時
```
aws cloudformation update-stack --stack-name スタック名 --template-body file://テンプレートのパス
```

### ②テンプレートがS3バケットにある時
```
aws cloudformation update-stack --stack-name スタック名 --template-url テンプレートのURL
```

[create-stack](https://qiita.com/middle/items/06f4658b4467195cb53f)と考え方は一緒ですね。
上記①、②に各種オプションを指定していきます。


## スタック更新その２　change set作成→execute
### ①テンプレートがローカルにある時
```
aws cloudformation create-change-set --stack-name スタック名 --template-body file://テンプレートのパス --change-set-name change setの名前
```

### ②テンプレートがS3バケットにある時
```
aws cloudformation create-change-set --stack-name スタック名 --template-url テンプレートのURL --change-set-name change setの名前
```

こちらに関しても、create-stack、update-stackと同様です。

いきなりupdate-stackではなく、change setで「**意図している変更以外の変更が加わらないこと**」の確認のため、利用しました。
change setは細かい変更内容まで出してくれないので、結局テンプレート自体＆コマンド実行内容が大事ということで、まあ保険でしょうか。

1ケースとして何かの参考になればですが、↓の使い方をしました。

- change setをcliで作成
- マネコンでchange set確認
 - 問題なかったらマネコンでchange set実行
 - あったらテンプレート見直し→修正して、初めからやり直し

ということで使ったことないのですが、change set確認＆実行コマンドは↓のようです。

### change set確認（list）

```
aws cloudformation list-change-sets --stack-name スタック名
```


### change set確認（個々のchange set詳細）

```
aws cloudformation describe-change-set --stack-name スタック名 --change-set-name change set名
```

失念しましたが、運用担当の方にはマネコンの方がわかりやすいから、とかの理由でマネコンで確認、になった気がします。
cliでやるとjsonが返ってきます。


### change set実行

```
aws cloudformation execute-change-set --stack-name スタック名 --change-set-name change set名
```

change setは、実行すると消えるので、わざわざ削除しなくてよいです。
いらない時は↓で消します。


### change set削除

```
aws cloudformation delete-change-set --stack-name スタック名 --change-set-name change set名
```


## スタックのステータス確認

```
aws cloudformation describe-stacks --stack-name スタック名 --query "Stacks[0].StackStatus" 
```

describe-stackで各種情報がjsonで返ってくるので、そこからstatus部分をとってきます。
IAMロールのIDなんかも、jsonに--queryしてます。（IAMロールIDはマネコンではわからない……）

ステータス確認までがスタック更新ということで ^^
なんでかわからないですが、スタックで構築したリソースはなめるように確認＆ステータスは確認しない、という方が結構いらっしゃいました。

前者についてはやるやらないはケースバイケースだと思いますが、個人的には、まあ最初の1回くらいやればよいと考えております。（awsの機能だし）
後者については、やりましょう。


# おわりに
ステータス確認についてですが、代表サーバからprofile指定して100個強のアカウントでコマンド打ちまくっていたので、

- マネコンはアカウント変えるのが面倒
- jsonでstatus部分を見ればいいものの、目が滑る

ということでcliで確認してました。
運用時にはどうしてもGUIの方が可読性高い、となることは多いかもしれませんが、検証時にはぜひdescribe-stackをおすすめしたい次第です。
html tableで検索したレコードを表示

#メモ
急ぎで検索付けたいとき愛用している
参照先忘れた。先人さんありがとうございます。

```Javascript

$(function () {
    $('#filter').change(function () {
        var keyword = $(this).val();
        $.each($("#vms tbody tr"), function (index, element) {
            if (keyword == "") {
                $(element).css("display", "table-row");
                return true;
            }
            var rowText = $(element).text();   // 1行をテキストとして取り出し、セレクトボックスで選択した値があるかをチェック
            if (rowText.indexOf(keyword) != -1) {
                $(element).css("display", "table-row");
            } else {
                $(element).css("display", "none");
            }
        });
    });
    $('#filter').keydown(function (e) {
        if (e.which === 13) {
            $(this).change();
            return false;
        }
    });
});

```
AnyPointSystem (powered by Qiitadon) > 2019-04-27 システム設計

```txt:動作環境
Ubuntu 18.04 LTs
Jupyter Notebook v5.7.8 
(Python 3.6.7 (default, Oct 22 2018, 11:32:17) )
```

### 関連

- [Qiitadon (Mastodon) > create_app()のto_fileで保存されるclient_id.txtの中身 | AnyPointSystem始めました](https://qiita.com/7of9/items/f8deafc9c301d9e01e2b)

### システム設計

- 目的
    - 良き行動を促すための自身の行動記録集計
        - 参考：劇団ひとりさんのP.M.S. (パーソナルマイレージシステム)
            - 2009.02.17 雑誌 Associe
            - > 仕事にかけた時間や、目標達成のために費やした時間を、１時間１ポイントという具合に換算し、実践した分だけ貯めていきます
        - AnyPointSystem:
            - 一行動一Toot
            - 短時間でもよしとする
                - 参考: みらい工業
                    - 日本一社員がしあわせな会社のへんなきまり by 山田昭夫さん > 活動内容は、犯罪以外なら何でもいい。 2012-06-24
                    - > p19 提案制度
                    - > 「提案書を出したら封を切る前に５００円を支給する」ことにした。
            - 目的: 行動を続けやすくするためのきっかけづくり
- Qiitadonをデータベースとするポイントシステム
- Tootをポイント加算に使う
- AnyPointDataタグ
    - AnyPointDataタグ付きのTootをデータ対象とする
- 項目タグ
    - 項目タグをポイント集計に使う
    - 項目タグ例
        - 英語学習
        - 英語復習
        - 中国語学習
        - ツール開発
        - animalByAurora
        - ...
- UI(予定)
    - 累積度数グラフ
    - バレットジャーナル形式
    - (追記 2019-05-05) タグ付け間違いの機能
        - 一日一回の通知(カウント一つだけのタグ)、など
WindowsでPostgresのWALの更新をディスクへ強制する

# 事象
次の環境で停電発生。停電発生1分前程度からのDB更新データが残っていない事象が発生
・Postgres14.1
・Windows10
※OSクラッシュ時なども同様

# 原因
walバッファに溜め込まれたデータがディスクにフラッシュされていなかった


# 解決方法
wal_sync_methodが不適切な設定値になっていました。

pg_test_fsyncで診断します。
PostgreSQLの最も高速なwal_sync_methodを決定する。
診断結果ではopen_datasyncが最速でした。
※pg_test_fsyncはPostgres9.1で追加されています。

```
pg_test_fsync  -f test.txt
テスト1件あたり5秒
このプラットフォームではopen_datasyncとopen_syncについてO_DIRECTが
サポートされています。

8kBの書込みを1回行ってファイル同期方法を比較します:
(Linuxのデフォルトであるfdatasyncを除きwal_sync_methodの優先順)
        open_datasync                     11517.116 操作/秒      87 μ秒/操作
        fdatasync                                  利用不可
        fsync                               538.828 操作/秒    1856 μ秒/操作
        fsync_writethrough                  539.794 操作/秒    1853 μ秒/操作
        open_sync                                  利用不可

8kBの書込みを2回行ってファイル同期方法を比較します:
(Linuxのデフォルトであるfdatasyncを除きwal_sync_methodの優先順)
        open_datasync                      5950.502 操作/秒     168 μ秒/操作
        fdatasync                                  利用不可
        fsync                               316.530 操作/秒    3159 μ秒/操作
        fsync_writethrough                  315.669 操作/秒    3168 μ秒/操作
        open_sync                                  利用不可

open_sync を異なった書込みサイズで比較します:
(これはopen_syncの書込みサイズを変えながら、16kBの書込みのコストを比較する
よう指定されています。)
         1 * 16kB open_sync書込み                  利用不可
         2 *  8kB open_sync書込み                  利用不可
         4 *  4kB open_sync書込み                  利用不可
         8 *  2kB open_sync書込み                  利用不可
        16 *  1kB open_sync書込み                  利用不可

書き込みのないのファイルディスクリプタ上のfsyncが無視されないかをテストします:
（もし実行時間が同等であれば、fsync()は異なったファイルディスクリプタ上で
データをsyncできることになります。）
        write, fsync, close                 107.541 操作/秒    9299 μ秒/操作
        write, close, fsync                 114.217 操作/秒    8755 μ秒/操作

8kBの同期なし書込み:
        write                            217051.499 操作/秒       5 μ秒/操作
```
初めてのハッカソンで感じたこと・学んだこと

4月の20,21日で[スパジャム道場](https://spajamdojo.jp/)という、初心者向けのハッカソンに行きました。

初めてのハッカソンというものもあり、至らない点が大量にありましたが、その分多くの学びがあったと思います。

加えてスパジャム道場は初心者向けなので、「メンター」なる方がチームに配属されます。(私のチームには、ハッカソンに**50回も出場されている方**がついてくださりました)

色々と学びの多い初ハッカソンだったので、受けたレクチャー内容と感じたことをざっと簡単にまとめてみます。

「ハッカソンに出たことがない人」にとっては、多くの学びが得られるかもしれません。

※開始前から作るものを決めているハッカソンは想定していません。


# レクチャー内容

## 作品・コンセプト編

### 「この作品は何?」に答えられる状態にする

ハッカソンで完成したものに対し、一言で説明できることが重要です。

説明できないということは、「作りたいものが明確でなかった」ということであり、審査員には刺さらない作品となってしまいます。

以降に記述する内容も、ほぼコレに関連するものなので、「**一言で説明できること**」はかなり重要なファクターです。

### 全ての機能がコンセプトに則っているか

作る作品の大枠が定まってくると

- 「あれも実装しよう」
- 「これも実装しよう」

と考えがちです。

しかし、追加要件を考えていくうちに、徐々に当初のコンセプトからずれていきます。

ずれていくと先述した通り、「この作品は何?」に答えづらくなっていきます。

なので、「実装する機能はコンセプトに則っているか？」は常に自問しておきましょう。


### チーム全員のイメージを統一すること

僕の初ハッカソンはこれができていませんでした。

イメージの統一は意外と難しいです。

チームとディスカッションをしていくうちに、「あれ、僕の考えていたことと違う...」、「あれ、そんなこと言ってたっけ...?」といったことを思ってしまう場面が多かったです。

特にデザイナーとの意思統一は難関でした。。職業柄なのですかね。。

イメージがずれると、コンセプトもずれてしまうので、注意が必要です。

### 主要機能を明確にし、「あったらいいね」は後回しに

特に初心者の場合、主要機能すらロクに作れません。

僕のチームも、主軸となる機能を作りきれずに終わってしまいました。

故に、主要機能を作っていない状態で、「あったらいいね」程度の機能を実装することは危険です。

この、「絶対必要な機能」と「あったらいいと思う機能」の切り分けをしっかり行うべきです。

そして、「絶対必要な機能」の実装が終わり次第、「あったらいいと思う機能」に手をつけましょう。

### 完璧ではなく、サプライズ性があること

実装の完成度よりも、審査員のウケを重視しましょう。

ハッカソンにおいて、エンジニアが思うほど「実装」に関しての評価は大きくないです。

要するに、「**アイデアは実装に勝る**」のです。

どれだけ小難しい実装をしても、アイデアが普遍的だと「で、だからなんなの?」となってしまいます。

なので重視すべきは「サプライズ性」です。


## 役割分担・タイムマネジメント編

### アイデア出しで妥協しない

エンジニアにとっては「手っ取り早く実装に取り掛かりたい」と思ってしまいますが、「アイデア出し」には多くの時間をペイしても良いです。

この段階で妥協することのデメリットが計り知れません。

もし妥協してしまった場合の、

- 「やっぱこれ面白くないよね」
- 「これ実装できなくね」

という状況は相当苦しい展開となります。

また、コンセプトのズレによる「わかりにくい作品」が出来上がってしまう危険性もあるので、
アイデア出しは妥協せずに行いましょう。

### アイデア出しの時間と作る時間をはっきり分ける

ここも重要です。

実装途中で、

- 「やっぱこれもいいアイデアじゃない？」
- 「やっぱこのアイデアじゃウケないよ」

などという話をしてしまうと、実装そのものに集中できません。

また、限られた時間ではもっとも避けたい「**手戻り**」が発生する可能性があります。

なので、「アイデア出し」と「実装」はきっちりと分けましょう。

### 30分かけても進まない場合、別のことをやる

レクチャーにはこう書いてありましたが、重要なのは「**できる・できないの判断基準を明確にすること**」です。

できないことに何時間も費やすのは、時間の少ないハッカソンにおいてよろしくないことです。

とはいえ、できる・できないの判断は時間をかけない限りわからないことですよね。

なのでこの「判断のタイムリミット」が30分ということなのでしょう。

# 感じたこと

## 自分の専門領域で戦うこと

自分の専門はWebのバックエンドです。

今回出場したハッカソンの条件が「iOSまたはAndroidで動作すること」でした。

Webの領域でも動作するので問題はないですが、「リッチなUIを実現する」という面においては、SwiftやUnityといった技術分野を利用すべきと判断しました。

自分の慣れない領域で実装することは非常に難しかったです。

本来の力が発揮されませんし、それ自体がストレスで、バックレようか本気で考えたほどです。(笑)

なので次回は、極力自分の専門に近い分野で勝負したいです。

## 新しい技術に対するチャレンジに関して

「ハッカソンはサプライズ性が重要」と記述しましたが、実装面で評価が全くないわけではありません。

「利用技術がトレンド」である場合、審査員のウケが良いそうです。

またせっかくの機会なので、「新しい分野に触れてみたい」と思う人も多いでしょう。(僕もそうでした)

ただ「扱うもの全てが新しい分野」の状態でハッカソンに挑むのは、現実的に厳しいです。

ここら辺のちょうどいい塩梅を攻めたいところですね。

メンター曰く**「8:2」で、新しい分野を取り入れる**とちょうどいいそうです。

次回のハッカソンでは、そのような配分で取り組んでみたいと思います。(今回は0:10で新しいものだらけでした...)
Apacheのチルダをリダイレクト

#問題
古いApache環境でチルダを使っている。
もうチルダは時代を感じるので新URLはチルダなしにして、
チルダを含む旧URLは新URLにリダイレクトしたい。

#ソリューション

```bash:(httpd.conf)

Alias /~user /var/www/user
```

#メモ
古いサーバのトラブルで相談が来ると、つい相識の闇を掘り出してしまう。
非エンジニアにとってシステムというのは単なる道具だ。批判できない。でも批判する。
Azure Container Registry(ACR) にコンテナイメージを登録する

# 概要
- Azure Container Registry(ACR)を使う
- プライベートのレジストリを作り、参考書籍にあるサンプルコードからコンテナイメージをビルドし、レジストリに登録する
    - 「レジストリ」は入れ物全体、「リポジトリ」は、個別のプロジェクトの入れ物。

# 課金が発生する
- ACRにコンテナイメージを置いている間は課金が発生する。必要に応じて作成/削除すること。


# 参考書籍
- [しくみがわかるKubernetes Azureで動かしながら学ぶコンセプトと実践知識
](https://www.shoeisha.co.jp/book/detail/9784798157849) 阿佐志保 著
    - 2.3 コンテナーイメージのビルドと公開
- [まんがではじめるKubernetes](https://booth.pm/ja/items/1317512) あおい 著
    - 大まかな概要をつかむ時に、サクッと読めるので良いです。

# 環境
- Azure
- Ubuntu 18.04.2 LTS (Windows Subsystem for Linux)


# コンテナイメージのビルド

## Azure Container Registry(ACR)にレジストリを作成する

- レジストリ名を決める。
    - ```sample123456ACRRegistry```とか、5-50文字でつける。
    - ```az acr check-name -n sample123456ACRRegistry``` で、既に使われていないか確認。NameAvailableでTrueが返ってくればOK。
    - ```.bashrc```に```export ACR_NAME="sample123456ACRRegistry"```
- リソースグループ名を設定する
    - ```.bashrc```に```export ACR_RES_GROUP=$ACR_NAME```

- リソースグループの作成
    - ```az group create --resource-group $ACR_RES_GROUP --location japaneast```
        - (japaneast は東日本リージョン)

- ACRのレジストリの作成
    - ```az acr create --resource-group $ACR_RES_GROUP --name $ACR_NAME --sku Standard --location japaneast```
    - 結果の「LOGIN SERVER」の値を控えておく。
 
- Azure ポータルにログインして、コンテナーレジストリが作成されているのを確認


## サンプルコードのダウンロード

参考書籍のサンプルコードがGitHubで公開されているので、ダウンロードして使用する。
Windows上のファイルは、WSL(Ubuntu)では、、```/mnt/c/```にマウントされている。

- ```cd /mnt/c/```
- ```mkdir k8ssample```
- ```cd k8ssample```
- ```git clone https://github.com/ToruMakabe/Understanding-K8s```
- ```cd Understanding-K8s/chap02/```

## コンテナイメージのビルド
- ```az acr build --registry $ACR_NAME --image photo-view:v1.0 v1.0/```
    - 内部でdocker buildが動いてコンテナイメージがビルドされ、指定のレジストリに登録される。
    - Azureのポータルから「ダッシュボード」－「(作成したコンテナレジストリ」－「リポジトリ」で見ると、「photo-view」というリポジトリが作成されている。

- version 2.0もビルドしておく
    - ```az acr build --registry $ACR_NAME --image photo-view:v2.0 v2.0/```

- イメージの確認
    - ```az acr repository show-tags -n $ACR_NAME --repository photo-view```

- イメージの削除(課金が気になる場合は、毎回作成・削除する)
    - Azureのポータルから削除
AnyPointSystem (powered by Qiitadon) > 2019-04-27 tagの取得 (Python + Mastodon.py)

```txt:動作環境
Ubuntu 18.04 LTs
Jupyter Notebook v5.7.8 
(Python 3.6.7 (default, Oct 22 2018, 11:32:17) )
```

### 関連

- [Qiitadon (Mastodon) > create_app()のto_fileで保存されるclient_id.txtの中身 | AnyPointSystem始めました](https://qiita.com/7of9/items/f8deafc9c301d9e01e2b)
- [AnyPointSystem (powered by Qiitadon) > 2019-04-27 システム設計](https://qiita.com/7of9/items/45aba268f6358541080c)

## tagの取得

以下の実装では、最近30件のTootからTagを取得する。

### 前準備

0. Mastodon.pyのセットアップ
1. アプリの登録 (Qiitadonの開発にて登録「AnyPointSystem」）
2. client_id.txtの生成 (client_idとclient_secret: 手順2の登録情報から)
3. access_token.txtの生成 (手順2の登録情報から)

### 実装

```py:Qiitadon_API_190425.jynb
import sys
from mastodon import Mastodon

# 2019-04-27 09:17

url = "https://qiitadon.com"
cid_file = 'client_id.txt'
token_file = 'access_token.txt'

mastodon = Mastodon(
    client_id=cid_file,
    access_token=token_file,
    api_base_url=url
)

# 自分の最新トゥート複数件を取得する
user_dict = mastodon.account_verify_credentials()
user_toots = mastodon.account_statuses(user_dict['id'], limit=30)

# トゥートを全て表示する
#print(user_toots[0])

for idx in range(len(user_toots)):
    atoot = user_toots[idx]['tags']
    if len(atoot) == 0:
        continue
    for elem in atoot:
        print(elem['name'])

```

### 結果

```
anypointsystem
test
tool
json
json
music
ツール開発
anypointdata
music
cg
youtube
music
英語資料整理
anypointdata
英語リスニング
anypointdata
animalbyaurora
anypointdata
```

最近30件のうちのtagsを取得できた。

[Toot例](https://qiitadon.com/@7of9/101995146174206870)

### 出荷

未定
GWだ技術祭り in 平成終了から令和開始まで

順次更新予定ですが、要するに「アドベンドカレンダーっぽいものを、平成終了から令和開始までやってみよう」企画になります。

（ようするに、「やり損ねていたいろんなことをやっておこう」ですね）

#2019/4/27
[gitbookを試してみよう！環境構築からアウトプットまで](https://qiita.com/hon_no_mushi/items/2d2e1e5318534e9279a8)

#2019/4/28
[TRIMをもうちょいちゃんと勉強する](https://qiita.com/hon_no_mushi/items/e24e8a299392ee9af664)

#2019/4/29
[zstandardを軽く調べておく](https://qiita.com/hon_no_mushi/items/bbfaed8190ee7c8436a2)

#2019/4/30
["OOM Killerの発動を検知したい"をもう少し調べる](https://qiita.com/hon_no_mushi/items/31964c0745bd8849fccb)

#2019/5/1
[エントロピー符号化](https://qiita.com/hon_no_mushi/items/bb15ec5dbd09d55266f5)

#2019/5/2
[Asynmmetric numeral system(ANS)の紹介](https://qiita.com/hon_no_mushi/items/ec3da2662fe83ab7207d)

#2019/5/3
[Uniform binary variant (uABS)の紹介](https://qiita.com/hon_no_mushi/items/e1a0931abf013269add3)

#2019/5/4
[Range variants (rANS) and streamingの紹介]
(https://qiita.com/hon_no_mushi/items/ee8c583a83e1621d2671)

#2019/5/5
[Tabled variant (tANS)　Remark]
(https://qiita.com/hon_no_mushi/items/ee64fb78df96b9dd5c78)

#2019/5/6
なぜか、便利なdatepickerが使えない

<img src="https://lh5.googleusercontent.com/proxy/ee-LShMvfIOWnD77vJIqds97cEt_NVhgeDnMO_7E4cIOhuZxMDtkgKZmvcRtrIcpu4Q1jVvxkmcdAQewTAFYHVprawNhti0AQmMpWx2kmzPyUNSqva2EAHcZ3OvUCZE=s0-d">

#問題
bootstrapにもdatepickerがあり、まったく同じ名前なのでjQuery-uiかbootstrapにしないといけない。
なんでと思いながら悩むだけで、原因調査から逃げていた。
仕事でjQuery-uiを標準としていて複数は使いたくない。

ある日、問題のサイトでどうしても日付を入力ではなく選択にしたい欲望が出てきた。
他のサイトのソースを眺めても違いが見当たらない。なにが違うのかな。

ぐぐって・・・jQueryが複数指定されると、メッソードを認識しないときがあると。
レンダリング結果を見る、え？jqueryが重複してレンダリングされていた。

headerで指定したのはOK。
bodyのすぐ下にもう一個ある。これはASP.NETの仕業だな。
ScriptManagerのところが怪しくて調査すると犯人はこいつー

- AspNet.ScriptManager.jQuery

テンプレートの基本構成はカスタムしない方針だが、jQuery指定は自分がコントロールしたい。

#ソリューション
- パッケージマネージャーから「AspNet.ScriptManager.jQuery」を外す。
- web.configに下記を指定

```
<appSettings>
<add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
</appSettings>
```
http://zero-config.com/dotnet/aspnet_0001.html

再表示すると見れた！カレンダーが見れた！

#メモ
MVCが大勢だけど、自動化が進化していくと、結局WebFormに戻るんじゃないかなと思っていたけど・・・
.Net Framework自体が役目を終えようとしている。
悩まずに.Net Coreへ行きましょう。
Python3 初心者　オブジェクトの種類

#オブジェクト
###　ブール値
　　TrueまたはFasleの値をもつ。Noneはちなみにブール値ではないがFalseとの違いを理解しておくことが大切
Noneとは存在しない値のことをさす。しかしFalseは空のリストや０や0.0もFalseに当たる。ここで気をつけて欲しいのがNoneは存在しない値と空の値を区別できるということを理解しとけばいい。一つ例を示しておく。

```py
a = None
if a:
    print("It is something")
else:
    print("It is nothing")
```

```
It is nothing
```

と出力される。
### 文字列
pythonの文字列はイミュータブル（変更できない）である。
### 数値
数値には整数と浮動小数点数がある。それらをかけたり割ったりする方法がある。（算術演算子という）
#### 整数
整数は小数点がないものを指す。
#### 浮動小数点数
小数点があるものを浮動小数点数という。整数やブール値を浮動小数点数にかえるにはfloat（）を使う。

```py
float(True)
1.0
float(1)
1.0
```

と出力される。
### 文字列を整数に整数を文字列に変換する。
文字列を数値に変換するにはint()関数を使用する。
数値を文字列に変換するにはstr()関数を使用する。
#### なぜ変換するの？
例えば

```py
print('I am '+16+' years old')
```

のような文字列と数値を足すような時は

```py
Type Error: can only concatenate str (not "int") to str
```

とエラーが出てしまう。
だから

```py
print('I am '+str(16)+' years old')
```

とすれば

```
I am 16 years old
```

と出力される。

```py
age=16
print(f"I am {age} years old")
```
という風に文字列の前にfをつけることによって
I am 16 years oldという文字列が出力されます。これはver3.6以降からできるものなので注意です！！
## 文字列色々
#### +による連結
＋演算子を使えば文字列を足すことができる
#### *による繰り返し
*を使えば同じ文字列を何回も繰り返し使うことができる。
#### オフセットをしようした文字列の抽出

```py
number='1234567890'
number[0]
1
number[-1]
9
```

####文字列のスライス
[](オフセット）を使った部分的に文字列をとる。
[:]は全ての文字を抽出する
[start:]はstartから最後までのものを返す
[:end]は先頭からendから一つ進んだところからスタートする(先ほどのnumberで表すと０のオフセットは一つ進んで１と抽出される。それと似ている)
[start:end]は[start:][:end]の複合型。
Vueのミックスイン（Mixin）を早く知りたかったという話

# 前書き
フロントを全く触ってこなかった私は、なぜか現在Vueでフロントを作っています。
コーディングに慣れていない私でも比較的スムーズに導入できたのですが、
最近知ったミックスインという機能をもっと早く知っておけばよかったと思ったので共有します。

# Vueについて
> Vue (発音は / v j u ː / 、 view と同様）はユーザーインターフェイスを構築するためのプログレッシブフレームワークです。他の一枚板(モノリシック: monolithic)なフレームワークとは異なり、Vue は少しずつ適用していけるように設計されています。中核となるライブラリは view 層だけに焦点を当てています。そのため、使い始めるのも、他のライブラリや既存のプロジェクトに統合するのも、とても簡単です。また、モダンなツールやサポートライブラリと併用することで、洗練されたシングルページアプリケーションの開発も可能です。
>
はじめに — Vue.js
https://jp.vuejs.org/v2/guide/

Vue.jsとは、フロントエンドのフレームワークのことです。
基本的な使い方はVueインスタンスを用意して、そこで定義した値や関数等を利用して、HTMLを書くといった感じです。
もちろん、for文やif文のようなものも存在します。

## 単一ファイルコンポーネント
上記が基本的な使い方のようですが、私はVue CLI2で生成したwebpackテンプレートやVue CLI3で生成したプロジェクトで作業をしています。
これらによって生成されたVueのプロジェクトは単一ファイルコンポーネントと呼ばれる構成となっています。
下記のように一つのファイルで、template, script, styleを記述して、一つのコンポーネント化することで、
疎結合で再利用可能なモジュール化することができます。

```vue:Hello.vue
<template>
  <p>{{ greeting }} World!</p>
</template>

<script>
module.exports = {
  data: function () {
    return {
      greeting: 'Hello'
    }
  }
}
</script>

<style scoped>
p {
  font-size: 2em;
  text-align: center;
}
</style>
```

> [単一ファイルコンポーネント](https://jp.vuejs.org/v2/guide/single-file-components.html)より

# Mixin
ミックスインとは、Vueコンポーネント外で定義した、オプションをコンポーネントに組み込むことができる機能です。
例えば、上記のHello.vueにはdataしかなく、computedやmethodsなどが定義されていませんが、
下記のように、mixin.jsを用意してオプションを定義し、それを取り込むことでコンポーネント内で定義した時と同様に、
mixin.js内でcomputedやmethodsなどを利用することができます。

```js:mixin.js
export default {
  data () {
    return {
      greeting: '',
      world: 'World'
    }
  },
  computed: {
    hello: function () {
      return this.greeting + ' ' + this.world + '!'
    }
  }
}

```

```vue:Hello.vue
<template>
  <p>{{hello}}</p>
</template>

<script>
import Mixin from './mixins/mixin'

export default {
  data: function () {
    return {
      greeting: 'Hello'
    }
  },
  mixins: [Mixin]
}
</script>

<style scoped>
p {
  font-size: 2em;
  text-align: center;
}
</style>

```

出力（既存プロジェクト内で作ったので、そのスタイルが適応されてしまってます。）
<img width="378" alt="スクリーンショット 2019-04-27 7.54.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305206/96162c8d-2944-6ca6-f045-1f89eb1f523a.png">

# あとがき
このように、ミックスインを使うことで、複数のコンポーネントで共通のオプションを使用することができます。
私はこの機能を最近知ったため、複数のコンポーネントに書いていた同じ処理を削除して、一つのミックスインにまとめる羽目になりました。
皆さんも、色々な機能を把握して、このようなことがないように気をつけましょう。