OmniAICreator/Qiita-1.07M huggingface dataset:
Serializableな Object を byte[] に変換する


```java

	public static byte[] toBytes(Serializable obj) {
		try {
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			ObjectOutputStream oos = new ObjectOutputStream(baos);
			oos.writeObject(obj);
			byte[] data = baos.toByteArray();
			return data;
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}

```
便利なGitコマン

##便利なGitコマンを共有いたします
目標は仕事のスピードが早くになるため、
じゃ、始めましょう。
###最初、サーバーからソースコードを取得するために以下のコマンを実行する：
```
$ git clone [URL of repository]
```
###他のブランチを移動するため：
```
$ git checkout dev
```
実行した後、devに移動します。
注意：checkout前に全部変わる部分をコミットしてください
また、devというブランチが存在しなかったら。devブランチを作成したい場合、以下のコマンを参照してください
###新しいブランチを作成：
```
$ git checkout -b dev
```
仕事をやったあとでどうすればいいでしょうか。
以下のコマンを実行します。
（masterブランチからdevブランチを作成しました。devブランチでソースコードを修正しました）
###プッシュするため：
```
$ git add -A 
$ git commit -m "Issue number name of task"
$ git pull origin master
```
###最後、サーバーにプッシュします
```
$ git push origin dev
```
ここまで仕事が終わった。確認待ってくさだい。
##まとめ
実際は仕事をやっている時色々な問題があります。ですが、やってみください。色々なことを学びます
（投稿の内容は問題があれば投稿の以下にコメントしてください、幸いです）
【備忘録】I don't understand 'm' flag!

gccは動くのにgcc-8はタイトルのようなエラーが出てしまい動かない、、、
[ここに書いてある通り](https://github.com/dmlc/xgboost/issues/1945)に
`export PATH=/usr/bin:/opt/local/bin:/opt/local/sbin:$PATH`
をすると動くようになりました。参照しに行っているasフォルダが間違っているらしいのだけれどとりあえず動いているのでまた賢くなった時に上のgithubを読み返してみようと思います。


追記
普段Homebrewを使用しているのですがMacPorts関連のPATHを.zshrcに書いていたのが原因らしくそこを消したら普通に動きました。`echo $PATH`して/opt/local/binが先に来ていたのでそれが問題みたいです。
CRC-16/Modbus計算の実装

# はじめに
ステッピングモーターをリモートで動作させる際のマスタ側のクエリのメッセージ構成が、

- スレーブアドレス(8ビット)
- ファンクションコード(8ビット)
- データ（N * 8ビット）
- エラーチェック(16ビット)

となっていた。
このエラーチェックにCRC-16方式が採用されていたため、その実装を行なった。

### 詳細
実際に使用したものは、オリエンタルモーターのAZD-KDドライバ。
[モーター構成：オリエンタルモーター](https://www.orientalmotor.co.jp/products/detail.action?hinmei=AZ66AKD-TS30)

これをリモートでコントロールするために、RS-485通信によるModbus RTU制御を行なった。
このときのクエリのメッセージを作成する際に、エラーチェックのメッセージを作成する必要があった。

## 環境
Python 3.7.1

# アルゴリズム
CRC-16の計算方法を以下に示す。

1. 初期値をFFFFhとし、FFFFhと最初のアドレス(8ビット)の排他的論理和(XOR)を計算
2. 1.の結果を1bit右シフト。これを桁あふれが1になるまで繰り返す
3. 2.の結果とA001hのXORを計算
4. シフトが8回になるまで2.と3.を繰り返す
5. 4.の結果と次のアドレス(8ビット)のXORを計算。すべてのバイトに対して2.から4.を繰り返す。最後の計算結果がCRC-16の計算結果となる。

### 排他的論理和(XOR)
|入力A|入力B|出力|
|:-:|:-:|:-:|
|偽|偽|偽|
|偽|真|真|
|真|偽|真|
|真|真|偽|
異なる入力だと真、同じ入力なら偽。

複数桁は桁ごとに各々で計算する。

```
   0101 0101 0101
^) 0010 0101 1010
------------------
   0111 0000 1111
```

# 実装
Pythonで実装。CRC-16の計算のみ示す。

## フローチャート
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251763/de696564-cd16-96b9-3e65-d10187043d73.png" width=50%>

data_byteを更新に対してYES/NOなのは目をつむってください（更新できる→YES、更新できない→NO）。

### クエリ
メッセージは、リモートI/Oへのアクセスのため以下のようになった。

|構成|値|内容|
|:--|:-:|:--|
|スレーブアドレス               |01h|スレーブアドレス1（設定）|
|ファンクションコード            |03h|保持レジスタからの読み出し|
|データ（レジスタアドレス（上位））|00h|読み出す起点となるレジスタアドレス（上位）|
|データ（レジスタアドレス（下位））|7Fh|読み出す起点となるレジスタアドレス（下位）|
|データ（レジスタ数（上位）     ）|00h|起点のレジスタアドレスから読み出すレジスタの数（上位）|
|データ（レジスタ数（下位）     ）|01h|起点のレジスタアドレスから読み出すレジスタの数（下位）|
|エラーチェック（下位）          |-  |ここを求める。|
|エラーチェック（上位）          |-  |ここを求める。|

## コード

```python:crc16.py
# -*- coding: utf-8 -*-

# エラーチェック以外のクエリ
command = b"\x01\x03\x00\x7f\x00\x01"

# 最初のCRCレジスタ値をFFFFhに設定
crc_register = 0xFFFF
for data_byte in command:
    # CRCレジスタとデータバイトのXOR
    tmp = crc_register ^ data_byte
    # シフト回数を記憶
    shift_num = 0
    # シフトが 8回になるまで繰り返す
    while(shift_num < 8):
        if(tmp&1 == 1): # 桁あふれが1なら
            tmp = tmp >> 1
            shift_num += 1
            tmp = 0xA001 ^ tmp
        else:
            tmp = tmp >> 1
            shift_num += 1
    # 計算結果をcrc_registerにセット
    crc_register = tmp
# 計算結果をbytes型へ変換
crc = crc_register.to_bytes(2, 'big')

# 結果を表示
print(crc)
```

実際は、右シフトする前に```tmp```の1桁めの値を確認するために、~~```tmp%2```~~ ```tmp&1```で0か1かを確認した後に右シフト処理を行なっています。
もっと良いやり方があればご教授願います。

## 結果

実行

```
$ python crc16.py
```

結果

```
$ b'\xd2\xb5'
```

これから、以下のような結果を得ることができました（順番に注意：下位→上位の順）。

|構成|値|内容|
|:--|:-:|:--|
|エラーチェック（下位）          |B5h|CRC-16の計算結果（下位）|
|エラーチェック（上位）          |D2h|CRC-16の計算結果（上位）|

よって```b'\x01\x03\x00\x7f\x00\x01\xb5\xd2'```というクエリを送信し、スレーブからのレスポンスを読むことでステッピングモーターのリモートI/Oを読むことができました。
TypeScript＋Reduxで全ステートの型を解決するには

# 概要
React（Redux）のコードをTypeScriptで書いています。TypeScriptは静的型チェックができるので、とても重宝しています。

さて、ReactとReduxを結びつけるReact-Reduxのconnect関数  
<a href="https://github.com/reduxjs/react-redux/blob/master/docs/api.md#connectmapstatetoprops-mapdispatchtoprops-mergeprops-options" target="_blank">connect(\[mapStateToProps\], \[mapDispatchToProps\], \[mergeProps\], \[options\]) - reduxjs/react-redux</a>  
の引数  
```mapStateToProps(state, [ownProps]): stateProps```  
ですが、このステート（state）の型は何を指定していますか？
ここにはReduxのストアで管理される全ステートが格納されたオブジェクトが渡されますが、この型をTypeScript（2.8以降）でサクッと解決する方法を紹介したいと思います。

# 使用するストア
例として、書籍のランキングと購入書籍ジャンルのステートをストアで管理しているとします。
書籍ジャンルを選ぶと、そのジャンルに属する書籍の人気ランキングが表示されるようなデータをイメージしています。

```TypeScript:states.ts
export interface IBook {
    isbn: string;
    name: string;
    author: string;
    publisher: string;
    categoryId: string;
}

export interface ICategory {
    id: string;
    name: string;
}

export interface IRankingState {
    category: ICategory;
    ranking: IBook[];
}

export interface ICategoryState {
    categories: ICategory[];
}
```

```TypeScript:reducers.ts
import { IRankingState, INavState } from './states';

export const ranking = (state = initialStateRanking, action: RankingActions): IRankingState => {
    ～略～
}

export const shopping = (state = initialStateNav, action: NavActions): INavState => {
    ～略～
}
```

```TypeScript:store.ts
import { createStore, combineReducers } from 'redux';
import * as reducers from './reducers';

const reducer = combineReducers({ ...reducers });
export const store = createStore(reducer);
```

ストアが管理するステートは以下のようになります。  
この例では2つしかステートがありませんが、実際のアプリケーションではこの数倍（数十倍）の数になると思います。

```
{
    ranking: IRankingState;
    shopping: INavState;
}
```

# stateの型の記述方法
## 1. anyで回避（ダメな例1）
```
const mapStateToProps = (state: any) => ({
    ...state.ranking
});
```
anyを指定するとコンパイルエラーは回避できますが、TypeScriptの利点である静的型チェックが使えなくなってしまいますね。

## 2. 全ステートをマージしたAllState型を準備する（ダメな例2）
```
type RankingState = {
    ranking: IRankingState;
}

type NavState = {
    shopping: INavState;
}

type AllState = RankingState & NavState;

const mapStateToProps = (state: AllState) => ({
    ...state.ranking
});
```
ステートが2～3個程度ならまだ我慢できますが、ステートが増えるたびにメンテするのは面倒ですね。
これだったらanyで逃げる方がよいのではないかと思えてきます。

## 3. ReturnTypeで型解決
```
import { store } from './store';

type AllState = ReturnType<typeof store.getState>;

const mapStateToProps = (state: AllState) => ({
    ...state.ranking
});
```
ストア（store）のgetState関数の戻り型を、TypeScript2.8以降で実装されたReturnTypeで取得しています。
これがまさにストアが管理する全ステートを内包した型になります。
ストア管理のステートが増えたとしても、この方法であれば特別な対処は不要になります。
matplotlib 2軸グラフ　①データ生成編

# はじめに
二軸グラフをpandasで奇麗に描画する方法がわからず、無限に時間を溶かしました
奇麗な二軸グラフの描画に悩む方がこの記事を参考にしていただければ幸いです

# 概要
時間軸のフォーマットが異なる二つのCSVデータを合成し、同じ描画エリアに二軸グラフのプロットを行ないます

# 構成
実在するセンサデータを使用すると怒られそうなのでデータを作るところから行います
全部で3部構成です

* [matplotlib 2軸グラフ　①データ生成編](https://qiita.com/ozikot/items/604c96c6714f50b55f26)
* [matplotlib 2軸グラフ　②データ合成編](https://qiita.com/ozikot/items/f7e5c346e631de067efb)
* [matplotlib 2軸グラフ　③プロット編](https://qiita.com/ozikot/items/a742487147fbdd666d88)

今回は「①データ生成編」です
使用するコードは以下に載せてあります
https://github.com/ozikot/BiaxialPlot/tree/master/ep1_generate

# データ生成
二つのCSV形式のデータを作成します
異なるセンサから取得したセンサデータ、という設定です
以下にそれぞれのセンサデータの内容を示します

※あくまで模擬データです　実在するセンサ、センサデータとは関係ありません

* 心拍
    * Time('YYYY/MM/DD hh \:mm \: ss')
        * 例) 2018年11月12日13時31分20秒 -> 2018/11/12 13:31:20
    * BPM
        * 例) 100 -> 100 (そのまま)
* 体表温度
    * Time(センサ取得日の0時0分を0とした経過時間) [μs]
        * 例) 13時31分20秒 -> 48680000000
    * Temperature [10<sup>-1</sup> °C]
        * 例) 25.4度 -> 254

## 心拍データの生成
まず最初に心拍データを生成します
初期値100で幾何ランダムウォークを用いました
以下の記事を参考にさせて頂きました

> [Pythonでランダムウォーク](https://qiita.com/toyolab/items/6535420f5ef637a4d2e8)  

```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 生成するデータの行数
ds = 30000

# 幾何ランダムウォークで疑似的な心拍データの生成
dn = np.random.choice([-1, 1], size=ds)
p0 = 100   # 初期値は100
gwalk = np.cumprod(np.exp(dn * 0.001)) * p0
pd.Series(gwalk).plot()

# データフレームを生成
df = pd.DataFrame({
    'Time' : pd.date_range('2018/09/01 00:00:00', periods=ds, freq='1S'),
    'BPM' : pd.Series(gwalk)
})

# データフレームをCSVファイル形式で保存
df.to_csv('..//csv_file//heartbeat.csv')
```


グラフを描画してみます
![heartbeat.png](https://qiita-image-store.s3.amazonaws.com/0/314579/0967259a-43f2-050c-b406-ed5c92fd841a.png)


いい感じですね
同じ要領で体表温度のデータを生成します

## 体表温度データの生成
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 生成するデータの行数
ds = 30000

# 幾何ランダムウォークで疑似的な体表温度データの生成
dn = np.random.choice([-1, 1], size=ds)
p0 = 20   # 初期値は20度
gwalk = np.cumprod(np.exp(dn * 0.001)) * p0
pd.Series(gwalk).plot()

# データフレームを生成
df = pd.DataFrame({
    'Time' : pd.Series([i * 1000000 for i in range(0, ds)]),
    'Temperature' : pd.Series(gwalk)
})

# データフレームをCSVファイル形式で保存
df.to_csv('..//csv_file//temp_bs.csv', index=None)
```

グラフを描画してみます
![temp_bs.png](https://qiita-image-store.s3.amazonaws.com/0/314579/296c78d6-5c45-f5ad-a7c7-434bd1c0555b.png)

適当なところを拡大してみると、数値の遷移量がランダムになっており模擬データとしては十分だという事がわかります
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/314579/132863c4-a55c-4c0e-63b2-1cd565e258b4.jpeg)

# おわりに
いかがでしたでしょうか
何かありましたらコメントかTwitter(https://twitter.com/ozikot) にて教えてください！
次回は今回作成した二つのデータを一つのデータに合成します

* 次回
   * [matplotlib 2軸グラフ　②データ合成編](https://qiita.com/ozikot/items/f7e5c346e631de067efb)
C++ > ::ZeroMemory()の「::」 > スコープ解決演算子 > ::ZeroMemory()とは > グローバルスコープの明示

```txt:動作環境
C++ Builder XE4
```

### 関連

- [Link > C++ Builder XE4 > MACアドレスを取得する](https://qiita.com/7of9/items/c3e3e8fb9b8cb1095c26)

`ZeroMemory()`の実装を`::ZeroMemory()`に変更した。

この理由については、過去の自分の実装で行ったことであるが、その理由の情報へ到達できてない。
`::`というのが検索キーワードできちんと対処されないことによる。

### ::ZeroMemoryの「::」

`::`自体は「スコープ解決演算子」と呼ばれる。
https://msdn.microsoft.com/ja-jp/library/b451xz31.aspx

`::ZeroMemory()`のような使い方は、グローバルスコープの関数使用を意味する。

https://stackoverflow.com/questions/75213/scope-resolution-operator-without-a-scope

> answered Sep 16 '08 at 18:10
> Mark
It means global scope.

### 参考文献

@ C++プログラミング入門 by Gregory Satirら (3回目) 2012-09-23
> p36 グローバルスコープ演算子
> グローバルスコープはグローバルスコープ演算子で指定されます。これは標準スコープ演算子で、その左側にはクラスを指定できません。

### まとめ

`ZeroMemory()`
を
`::ZeroMemory()`
としているのはグローバルスコープであることをソースで明示することを目的として自分で決めたように思う。
（その情報に到達できないので「思う」とここではしめくくる）
Vimで単語移動するときの空白扱いについて

Vimで単語移動をするとき、空白や単語の扱いがどうなっているのか曖昧な人が多いですよね。
今回は分かりやすく実際のカーソルの動きを示しながら説明してみました。

## wを使ったときの挙動

`w`は**単語の先頭**に移動します。
もし以下のような文字列があったとします。

```
aaa bbb ccc ddd eee

  aaa bbb ccc ddd eee
```

これを`w`を使って移動すると以下のようになります。
初期位置が`★`、`|`の位置がカーソルの位置です。

```
★aaa |bbb |ccc |ddd |eee
|
  |aaa |bbb |ccc |ddd |eee
```

`w`は常に**単語の先頭**を捉えるように移動します。
そして空行にも停止します。

## eを使ったときの挙動

`e`は**単語の末尾**に移動します。
もう一度以下の文字列を使って試してみましょう。

```
aaa bbb ccc ddd eee

  aaa bbb ccc ddd eee
```

`e`を使って移動すると以下のようになります。
初期位置が`★`、`|`の位置がカーソルの位置です。

```
★aa|a bb|b cc|c dd|d ee|e

  aa|a bb|b cc|c dd|d ee|e
```

`w`は常に**単語の末尾**を捉えるように移動します。
そして**空行には停止しません**。
失効したアカウントのOneDriveの同期を解除したい場合

#はじめに
Office 365 Business Premiumを職場で試用していて、1ヶ月ほどの試用期間を経て結局購入しないことになりました。
そのときにテストということでその試用版のOneDriveをローカルPCと同期していたのですが、それを試用期間が過ぎたあともそのままにしていました。
更に数週間が経過すると完全にアカウントが停止されてデスクトップ版のOneDriveアプリが起動時に「サインインするときに問題が発生しました」とエラーダイアログを出してそのアカウントのOneDriveアプリは終了してしまいます。他のアカウントのOneDriveは起動して、右下にアイコンが表示されます。
ではそのアカウントだけOneDriveから解除しようとするとタスクトレイにアイコンがないので、その設定を行うこともできません。困りました。
毎回、起動時にこのダイアログが表示されるので、これをどうにか解消したいのです。


#解決策
OneDriveが起動時に自動ログインして自動で失敗しているので、じゃあそのアカウントのOneDriveの認証情報を削除してやれば訊いてくるんじゃないのかな。
ということで、以下のように`コントロール パネル`→`すべてのコントロール パネル項目`→`資格情報マネージャー`と開きます。
そして、`Windows資格情報`を選択します。

![](https://qiita-image-store.s3.amazonaws.com/0/245438/1bbd69d5-b014-6e91-a087-476915bde471.png)


すると下にこのPCに記録されている様々なサービスの認証情報のリストが表示されるので、この中からOneDriveに関するアイテムを探します。
おそらく以下のようなアイテムが見つかるのではないでしょうか。
このように複数のアカウントを使用している場合は、その中から問題のアカウントを選択し、「削除」を選んでください。

![sdlkfjsadlkfjasd.png](https://qiita-image-store.s3.amazonaws.com/0/245438/c0219483-45cd-7c2a-57ea-d199ee25573e.png)

そのあと、OneDriveを起動すると、以下のようなウィンドウが表示されます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/245438/40ac24aa-eee9-0216-a8d6-adcf238b0060.png" title="" alt="image.png" width="60%" height="" >

このウィンドウが表示されている間、右下のタスクトレイにはそのアカウントのOneDriveのアイコンが表示されているので、以下のように設定からアカウントのリンクの解除を行います。

<img src="https://qiita-image-store.s3.amazonaws.com/0/245438/f739e2eb-9c84-4da0-35d9-768abac8a896.png" title="" alt="lskadjflkasdjfasl.png" width="60%" height="" >


これでエラーダイアログが表示されなくなります。
全ての React コンポーネントを Styled Component として export すべきでは？というお話

## 対象

React アプリケーションを styled-components でスタイリングしている方に限ります。

## 前書き

React と styled-components を利用した開発を行ってきて、
自分の中で納得のいくコンポーネント定義方法を紹介します。
styled-components でスタイリングしている方達にとっては当たり前？のことかもしれませんがご了承ください。

## React コンポーネントをセレクターとして指定する

[こちら](https://qiita.com/kotarella1110/items/a243c7bde41fad23343f) に詳細は記載しておりますが、component selector パターンを利用する事で、Styled Component をセレクターとして指定する事ができます。

_A.jsx_

```jsx
const A = styled.div``;

export default A;
```

_B.jsx_

```jsx
import A from './A';

const B = styled.div`
  ${A} {
  }
`

export default B;
```

React コンポーネントをセレクターとして指定したい場合は、 `styled()` ファクトリー関数でラップします。

_A.jsx_

```jsx
class A extends React.Component {
  render() {
    return <div />
  }
}

export default A;
```

_B.jsx_

```jsx
import A from './A';

const StyledA = styled(A)``;

const B = styled.div`
  ${StyledA} {
  }
`

export default B;
```

この記述を見てモヤッとしませんか？:sweat_smile:
筆者はモヤッとしました。
このモヤッとする理由は、

* **セレクターとして指定したいコンポーネントを import 元で毎度ラップする必要がある**
* **セレクターとして指定したいコンポーネントが React コンポーネントなのか Styled Component なのか確認して、ラップすべきかを判断する必要がある**

からではないでしょうか？
手間ですし冗長な感じがします。

## React コンポーネントを Styled Component として export する

モヤッとを解消するには、**import 先の全ての React コンポーネントを Styled Component として export する**事です。
以下のように記述する事で、

* **import したコンポーネントをそのままセレクターとして指定可能**
* **Wrapper コンポーネントなどを定義せずとも、styled(MyComponent)`` でスタイリング可能**

となります。

注意点として、**`className` props を渡し忘れないようにしましょう**。
渡し忘れた場合、 styled(A)`` のテンプレートリテラルで記述したスタイルが適用されません。

_A.jsx_

```jsx
class A extends React.Component {
  render() {
    return <div className={this.props.className} />
  }
}

export default styled(A)``;
```

_B.jsx_

```jsx
import A from './A';

const B = styled.div`
  ${A} {
  }
`

export default B;
```

## 最後に

[Gist にも](https://gist.github.com/kotarella1110/72fd49fa1809e6e0404f5e2ef1f06a62)同じような内容を投稿してます。
他にいい書き方があればコメント等で共有していただけると非常にありがたいです:innocent:
VirtualBox 利用、Winで開発、共有フォルダで仮想環境へソースファイル同期

VirtualBox
デバイス⇒共有フォルダ⇒共有フォルダ設定
⇒sample、アクセス権、完全
フォルダのパス:C:\work\sample
フォルダ名:keiba

C:\work\sample\src
にsvnをcheck outする

vi /etc/rc.local
mount -t vboxsf sample /var/www/html -o rw,uid=500,gid=0,fmode=0644,dmode=777
Ubuntuにおけるリポジトリ(components)について

# components一覧

・main
Canonicalが完全にサポートしているフリーソフトウェア。

・restricted
Canonicalがサポートしているが、バイナリが含まれていたり、企業秘密に直結した機能が含まれていたりなどの理由でCanonicalがソースコードに手を入れることができない非フリーソフトウェアが含まれていることを意味する。
例えば、NVIDIAやAMD（ATI）のGPUのドライバ、一部の無線LAN関連のドライバなど。

・universe
オープンソース宇宙(？)。
Canonicalは全くサポートしておらず、開発者がボランティアでサポートしているフリーソフトウェア。

・multiverse
ライセンスが必要な非フリーソフトウェアが含まれていることを意味する。

# 注意

UbuntuとDebianでは、componentsの意味は異なる。

# 参考URL

・[Ubuntuのパッケージ管理のメモ - 蒼の王座・裏口](https://sqlazure.jp/r/ubuntu/857/)
・[ASCII.jp：～師範！　Ubuntuインストールしようと思います！～ (3/5)｜行っとけ！　Ubuntu道場！](http://ascii.jp/elem/000/000/441/441502/index-3.html)
Virtualboxでは共有フォルダでシンボリックリンクが使えない

Virtualboxはセキュリティ上の理由から、共有フォルダにシンボリックリンクを許可していない  

## 問題点
1. WindowsのPath長制限(260文字)に引っかかっている
2. Virtualboxではセキュリティの関係、共有フォルダにsymlinkを張れない
3. Windowsがsymlinkをサポートしていない

## 解決策
### 単純な解決
**共有フォルダ以外で作業をする！**


### 共通の解決策
symlinkを張らないようにオプションを設定する  
例えば`npm install`なら`--no-bin-links`フラグを指定することによって、symlinkを生成しないという解決策がある

```
$ npm install --no-bin-links
```

### ホストがWindows以外の解決策
シンボリックリンクを有効にするには、`Vagrantfile`の**config.vm.provider**ブロックに次の行を追加する必要がある  

```
config.vm.provider "virtualbox" do |v|
    v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"]
end
```

### ホストがWindowsの場合
ホストOSがWindowsの場合、共有フォルダにsymlinkを張ることはできない  
何故ならWindowsがsymlinkをサポートしていないためである
そしてpath長が260文字以内であるため、それを超えるpathはエラーになる  
この場合の解決策としては共有フォルダ以外で作業をすること以外に解決策はないものと考える  

---
[参考][]

[参考]: https://github.com/npm/npm/issues/7308
Rspec　letとcreateが表すもの。


##はじめに

```product_controller.rspec.rb
let(:product) { create(:product) }
```
というコードを見て、「何を表しているんだ・・・？」と疑問に思い

今回はletとcreateの関してまとめていきたいと思います！

##結論

まず、先程のコードは省略形になります。

このコードを省略する前のコードに直してみると・・・

```product_controller.rspec.rb
@product =  FactoryBot.create(:product) 
```

というコードになります。

つまり、let(:product)はインスタンス変数である@productの代わりだと言えます。



対して、createはFactoryBotが省略されています。

確かに一回一回、FactoryBot.createと打つのは面倒くさいですよね。

ただ残念ながらデフォルトの状態では、FactoryBotを省略することは出来なく、

以下のコードを追加する必要があります。


```rails_helper.rb
RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods
end
```
##Solidusを利用しているケース

ちなみにSolidusを利用している場合では、以下のコードを追加することで省略が可能になるだけでなく、

ダミーデーターを自分で作らなくてもいいんです。

```rails_helper.rb
require 'spree/testing_support/factories'
```

というのも、Solidusにはデフォルトの状態でFactoryBotのダミーデータが自動生成されているからです。

こちらのコードをrails_helperに追加することで簡単にダミーデータを呼び出すことができるようになるので、良かったら試してみて下さい！


【追記】
こちらでSolidus内にデフォルトで作成されているファクトリを確認することが出来ます。

```
solidus/core/lib/spree/testing_support/factories
```

【参考記事】
https://qiita.com/yuskamiya/items/32f383cb8d18ceb751d7#%E3%83%86%E3%82%B9%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6
https://qiita.com/Ushinji/items/522ed01c9c14b680222c
Delegate Protocolを理解できていなかった自分が感覚を掴んだ具体例


#はじめに#

※ここではDelegateとProtocolについて詳細に説明はしていません。


私が今回この記事を書こうとしたきっかけは、Delegate,
Protocolにつまずいており、色々なDelegateとProtocolの説明を見た上で
#####これ使わなくてもベタ書きでいけるよな（良くない）#####
と考えており、十分に理解できておらず、自分の中であまり納得ができていませんでした。

その後、アプリを開発しているときにつまずいた部分でDelegate,Protocolを使う機会があり、自分でも納得ができる使い方だったので、こちらに復習の意味も込めて記載させて頂きます。（どうか温かい目で見守ってください)
間違っている点がありましたら是非ご指摘を頂きたいです！


#出くわした問題点#

<img width="442" alt="スクリーンショット 2018-11-12 13.35.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/282860/60d0e773-19d9-23ec-dd2d-91457fc5d384.png">
カスタムセルの中にあるボタンを押すことで画面遷移する機能をつけようとした時(セルのタップではなく)

TableViewCellクラスにボタンアクションを紐づけて中にperformSegue(withIdentifier: "○○○", sender: nil)と書こうとしたところ…
####下の欄に出てこない

<img width="438" alt="スクリーンショット 2018-11-12 13.43.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/282860/d834c68a-b05b-9498-bce2-1a9909715a40.png">
そこで急いで調べると…UIViewControllerを継承していないと書けないとのこと。
####それは困った####
どうしてもセルの中にあるボタンで遷移させたい…
それを実現させるために使用するのが
####Delegate, Protocol !!!!####

#使用例#
上記で説明した通り、セルの中にあるボタンを押して画面遷移させます。
<img width="387" alt="スクリーンショット 2018-11-12 14.00.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/282860/ed3120a0-a840-0333-956b-ac067592cf06.png">
はじめにカスタムセルのクラスにプロトコルを設定していきます。
ここでは
######goEdit()
というメソッドを用意します。次にdelegateを設定します。ここでは　
######weak var delegate: MypageTableViewDelgate? 
と宣言しています。

<img width="406" alt="スクリーンショット 2018-11-12 14.01.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/282860/d981eb2d-3bdb-208c-c8e5-42c02b8f6668.png">
上で行ったprotocolとdelegateの設定をした後に、カスタムセルのクラスから紐付けたボタンアクションの中に
#####delegate?.goEdit()
という先ほど用意したメソッドを書きます。

<img width="648" alt="スクリーンショット 2018-11-12 14.09.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/282860/a855a886-1f2b-fa9c-00e6-66fde54dbc7c.png">
ここからは先ほど用意したgoEdit()の中身を書いていきます。
まずViewControllerのクラスに上で作ったprotocol(ここではMypageTableViewDelegate)を継承します。

そうするとgoEdit()を書いてくださいと出るはずです。
###これでカスタムセルのクラスでは書くことができなかったperformSegueが書けるようになります！（ViewControllerのクラスのため）








<img width="819" alt="スクリーンショット 2018-11-12 14.57.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/282860/ffde414d-c509-d727-bfd1-966791ea5ed3.png">
最後にカスタムセルのクラスで設定したdelegateをViewControllerのクラスが処理できるように設定します。
####ここでは　cell.delegate = self 
の部分！

これでカスタムセルの中にあるボタンから画面遷移をすることができます！！

#最後に
自分もまだDelegate,Protocolを使いこなせておらず苦戦している日々です…。これからも頑張っていきたいです^^
拙い文章ではありますが少しでも参考になると幸いです。
TypeScriptで写真からQRを読む


qrcode-readerを使用した。
写真から読む場合、jsqrより認識率が高い印象。

https://www.npmjs.com/package/qrcode-reader
https://github.com/edi9999/jsqrcode

install

```
npm install -d qrcode-reader
yarn add -D qrcode-reader
```

execute

```hoge.ts

  // import 
  var QrCode = require('qrcode-reader');

  // urlからdecodeを行う
  async decodeQrReader(url:string){
    var promise = new Promise<string>((resolve, reject) =>{
      const qr = new QrCode.default();
      qr.callback = (error:any,result:any)=>{
        if(error) reject(error);
        else resolve(result.result)
      }
      qr.decode(url);
    });
    const decoded = await promise;
    return decoded;
  }
  
  const decoded = await decodeQrReader('http://hoge/hoge.jpeg');
  console.log(decoded);

```
定期的にローカル環境のDockerリソースを掃除する

[DMM.com Advent Calendar 2018](https://qiita.com/advent-calendar/2018/dmm) 4日目の記事です。

# はじめに
複数のプロジェクトや自身のテスト用docker環境をローカルで構築しているとコンフリクトが起こったり、Dockerの調子が悪くて一回まっさらにしたいなーと思うことがままありました

今までは下のようなaliasを用意してポチポチ削除していましたが正直めんどい...

```bash
drma='docker rm -f $(docker ps -aq)'
drmia='docker rmi $(docker images -q)'

etc...
```

なので定期的に掃除するようにしましたのでその共有
(よくわからずにDocker環境を構築して、停止時に削除しきれていない、削除できない人が社内に結構いたのでそういう人にもおすすめ)


# 定期的にローカル環境のDockerリソースを掃除する
## docker-cleanをインストールする

Docker環境の削除を上記のようなaliasを用意してもいいのですが、ちょいめんどいので [docker-clean](https://github.com/ZZROTDesign/docker-clean)という便利ツールがあったのでそちらを使います

```bash
$ brew update
$ brew install docker-clean
```

`docker-clean all`でcontainer、image、network、volumeすべてを削除できるので素敵です

## 定期実行設定
Macではcrontabではなくてlaunchdというツールを使うのが定番らしいのでこちらを利用します

```bash
# 下記docker-clean.plistを参照ください
$ vim ~/Library/LaunchAgents/docker-clean.plist
# 下の方に `docker-clean.plist`があるのでコピペ

$ plutil -lint ~/Library/LaunchAgents/docker-clean.plist # 静的解析
$ launchctl load ~/Library/LaunchAgents/docker-clean.plist # launchd適用
$ launchctl list | grep docker-clean # 確認
-       0       docker-clean
```

日曜日の0時0分に`docker-clean all`コマンドを走らせるように定義しました

```xml:docker-clean.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>

  <key>Label</key>
  <string>docker-clean</string>

  <key>EnvironmentVariables</key>
  <dict>
    <key>PATH</key>
    <string>/usr/bin:/usr/local/bin</string>
  </dict>

  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/bin/docker-clean</string>
    <string>all</string>
  </array>

  <key>StartCalendarInterval</key>
  <array>
  	<dict>
  		<key>Weekday</key>
  		<integer>0</integer>
  		<key>Hour</key>
        <integer>0</integer>
        <key>Minute</key>
        <integer>0</integer>
  	</dict>
  </array>

  <key>StandardOutPath</key>
  <string>/dev/null</string>
  <key>StandardErrorPath</key>
  <string>/dev/null</string>

</dict>
</plist>
```

## 注意点/補足
* `EnvironmentVariables` こちらはdocker-clean内で使っているdockerやawkコマンドなどのパス解決のために追加してます
* `ProgramArguments`では相対パスは使えないので、絶対パスを使います
* `launchctl unload ~/Library/LaunchAgents/docker-clean.plist`をおこなうと適用済みの設定を外すことができる
* `docker-clean all`じゃなくて`docker-clean run`でもいいかも(お好みで
* 

自分はdotfilesで管理することにしてる
https://github.com/mafuyuk/dotfiles/blob/master/dotfilesLink.sh#L26

# まとめ
* Dockerリソースの一括削除ができるようになりました
* しかも定期実行で!
* これで月曜日はスッキリした気分で出社できるようになりました

絶対に起動しておきたいコンテナがあるのなら月曜の早朝に`docker-compose up -d`を定期実行してもいいかもですねー(自分はしない

# 参考リンク
* [launchdの時刻指定を複数時刻にしたい](http://d.hatena.ne.jp/riocampos+tech/20130623/p1)
* [[MacOSX]Launchdとりあえず使ってみるまとめ](http://komaken.me/blog/2016/02/29/macosxlaunchd%E3%81%A8%E3%82%8A%E3%81%82%E3%81%88%E3%81%9A%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B%E3%81%BE%E3%81%A8%E3%82%81/)
機械学習におけるGPU memory error の呪いを解く方法 with Chainer 


※初投稿なのでご了承ください

---
「よーし完璧なプログラムが完成した！！」
「実行するぞーー！！！」

---

![スクリーンショット 2018-07-09 16.18.11.png](https://qiita-image-store.s3.amazonaws.com/0/278884/50b9d93a-faa6-daab-143e-1864d9db56d8.png)

**OutOfMemoryError**

---
「うぎゃっぱー！」(憤死)

#はじめに
あなたが、画像や音楽を対象にしたデータを元に機械学習をしているならば、
時に大量のデータを使うこともあるでしょう。

使うのがCPUであれば、多少ビックなデータを使っていたって問題はありませんが、
それでは学習時間も非常に長くなってしまうことでしょう。

今回は、Chainerを用いて、莫大なデータを用いていてもGPUメモリーエラーになり難くなる秘策について説明いたします。

※私はそこまで強くないので、強い人たちの役には立ちません。

---

#使用している環境
Chainer 5.0.0
Cupy 5.0.0

#考え方
どの様にすれば、メモリーエラーにならないのでしょうか。

例えば、以下の様に、大量のデータを全て一度Cupyに変換すると、
メモリーエラーになりやすいのは自明です。

```python
#dataをどっかから取ってき、説明変数Xと目的変数yに分ける。

#numpyの配列に変換する。
X_np = np.array(X,dtype='float32').reshape(-1,1,28,28)
y_np = np.array(y,dtype='int32').reshape(-1,1)

#cupyの配列に変換する
X_cp = cp.array(X,dtype='float32').reshape(-1,1,28,28)
y_cp = cp.array(y,dtype='int32').reshape(-1,1)

dataset=datasets.TupleDataset(X_cp, y_cp)
iterater = iterators.SerialIterator(dataset, batchsize)
classifier = L.Classifier(model)
# 最適化手法の選択
optimizer = optimizers.SGD(lr=0.01).setup(classifier)

# UpdaterにIteratorとOptimizerを渡す
updater = training.StandardUpdater(iterater, optimizer, device=-1)
max_epoch = 10
# TrainerにUpdaterを渡す
trainer = training.Trainer(
    updater, (max_epoch, 'epoch'), out='mnist_result')
trainer.run()
```
解決の糸口としては、**一度に全てcupyに変換してから用いず、**
**処理中に部分的にcupyに変換させることです。**

しかし、trainerを用いながらそれを行う方法はあるのでしょうか？

#Updaterの力を使う方法
Updaterの引数を調節すれば、バッチサイズごとにnumpyをcupyに変換するのはとても簡単にできます。

Updaterの内部では、
**chainer.dataset.concat_example(batch, device=None, padding=None)**

が呼ばれますが,ここで、**device >= 0**とすればnumpyがGPUに送られ、自動的にcupyへ変換されます。
Updaterの引数の device とUpdater内で呼ばれる device には同じ値が入るので、

**numpyでデータセットを作り**
**Updaterで device によりGPUを指定する**

これをすればバッチサイズごとにcupyへ変換することができます。

```python
#dataをどっかから取ってき、説明変数Xと目的変数yに分ける。

#numpyの配列に変換する。
X_np = np.array(X,dtype='float32').reshape(-1,1,28,28)
y_np = np.array(y,dtype='int32').reshape(-1,1)

'''#cupyの配列に変換しない'''
dataset=datasets.TupleDataset(X_np, y_np)
iterater = iterators.SerialIterator(dataset, batchsize)
classifier = L.Classifier(model)
# 最適化手法の選択
optimizer = optimizers.SGD(lr=0.01).setup(classifier)

# UpdaterにIteratorとOptimizerを渡す
''' diviceに使用するGPUを入れる。                                   ↓  ( ≠ -1)　　　'''
updater = training.StandardUpdater(iterater, optimizer, device = 1)
max_epoch = 10
# TrainerにUpdaterを渡す
trainer = training.Trainer(
    updater, (max_epoch, 'epoch'), out='mnist_result')
trainer.run()
```
スカゼミ週末発表会 2018/11/10

これは2018/11/10にスカゼミというスカイプで行われた発表会のレポートです。

スカゼミとはネット上の勉強会です。主にプログラミング、英語、数学、機械学習の勉強会をやってきました。 その分野に詳しい人に支えられながら皆で共に勉強し、学ぶ者もまた勉強しながらも教え教わる、半学半教型の勉強会です。

現在は主にIT技術に関する雑談と自習によるもくもく会が多いです。


# 峯岸さんの発表

## AWS Dev day で優勝したときに作った「がやがや動画」について

### 概要
AWSのイベント「AWS Dev day」のハッカソンのようなもので、「がやがや動画」というものを作って優勝しました。
動画をアップロードすると、リアルタイムに動画閲覧ページの一覧に加えられます。

・メインページ
・スマートフォンから動画ファイルを追加するとガヤガヤ動画にうつる

### AWS紹介
AWSはAPIを叩いて色々使えて便利。
堅牢性も担保してくれるので便利。
AWSのサービスはGUIが充実していて便利。
EC2はサーバーで便利。
elastic load balancerはロードバランサー

s3はストレージサービス。99.999999999%落ちないサービス
(前に落ちたけどね)

AWS Lambdaというサービスがある。検知機能。例としてはs3にアップロードしたらラムダが検知してプログラムを実行することができる。
Amazon Elastic Transcoderは動画ファイルを他のフォーマットに変換をかけてくれる。ガヤガヤ動画でやったことは動画をgif動画にすること。


### がやがや動画でのAWS利用
s3->Lambdaが検知->トランスコーダーで変換->s3に設置

### Pub/Sub
Pub/sub とっても簡単にメッセージのやり取りができるサービス。
チャンネルという概念がある。

チャンネルを通してpublish-Subscribeを行える

チャンネルに送信(publish)すると、チャンネルを購読(subscribe)している人に届く

Pub/SubはIoT coreを使っている

MQTTの説明
https://qiita.com/mamatumo/items/e99428775c20064f41ee

Pub/Sub参考
https://dev.classmethod.jp/cloud/aws/pub-sub-with-aws-iot-over-mqtt/


AWS IoT CoreとPUB/SUBする為のツールを試しました
https://confrage.jp/aws-iot-core%E3%81%A8pub-sub%E3%81%99%E3%82%8B%E7%82%BA%E3%81%AE%E3%83%84%E3%83%BC%E3%83%AB%E3%82%92%E8%A9%A6%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/

IoT coaは、すごい時接続数に対応している？
自動拡張してくれる。Expander!!.

### AWSの資格を取った
ソリューションアーキテクトアソシエイトを取った
https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/

高給取りになれる
https://itjinzai-lab.jp/article/detail/447

### ソリューションアーキテクトアソシエイトの勉強方法を知りたい。

まずはAWSをやる。

公式で無料デモの模擬問題(10問)があるのでそれを受ける

AWSソリューションアーキテクトアソシエイトの本がある。2016年の本だけど役に立つ

試験のお値段：1万5千円

模擬問題：2,000円～3,000円
どこが間違えたかも分からない。酷い
分野ごとには％で教えてくれる。優しい

何度も復習。

実際は模擬問題より文章が多く難しい。
問われている内容は同じ
1000点満点 720点が合格ライン
860点取った
60問で一時間半

朝トレのあとに1時間本を読む。模擬問題を解く。
日本語が変
実際のテストは物語調の問題になる

サンプル問題のPDF
https://d1.awsstatic.com/training-and-certification/docs-sa-assoc/AWS%20Certified%20Solutions%20Architect%20-%20Associate_Exam%20Sample_v1.5_FINALJP.pdf


合格対策 AWS認定ソリューションアーキテクト －アソシエイトkindle版
https://www.amazon.co.jp/dp/B01LZ2CBKB

AWSのAPIのQ&Aも参考になる

#### どのくらいの期間勉強したの？
元々AWS詳しい。それを踏まえて３週間くらい


#### Double Peace
以前に作ったサービス
https://v-peace-v.com/

#### AWS IoT Coreがわからない
Pub/Subを簡単に使う魔法

知らない人にとってはAWSのサービスは呪文


#### 試験の範囲まとめ
s3
Dynamo DB
Cloud Search
ec2
RDS
ELB
Amazon ElastiCache
IAM
Route53
Cloud Front
Amazon Redshift(レッドシフト)
VPC
CloudWatch
CloudFormation
Elastic Beanstalk
OpsWorks
cognito
リザーブドインスタンス、スポットインスタンスのEC2の料金体系

#### がやがや動画まとめ
s3
lambda
Amazon Elastic Transcoder
Iot Core
cognito



# スカゼミの入り方
ツイッターでDMかメンション下さい。
https://twitter.com/sky_semi
AmplifyとReactを使用して爆速でユーザー認証画面を実装する

 
##下準備
以下の内容に沿って準備する。
<a href="https://qiita.com/oliverSI_/items/efc1a1e90584baac9e61">AmplifyとReactを使用して爆速でWEBアプリを作成する</a>

##ユーザー認証の設定
```
amplify add auth
amplify push
```

##App.jsの修正
App.jsを以下のようにする。

```
import { withAuthenticator } from 'aws-amplify-react';
import Amplify, { Auth } from 'aws-amplify';
import aws_exports from './aws-exports';
Amplify.configure(aws_exports);
...
export default withAuthenticator(App);
```
この時点で登録、ログイン、パスワードのリセット等が利用可能に。

##ログアウト機能追加
以下を参考にログアウトボタンを追加。
https://github.com/aws-amplify/amplify-js/issues/1529

```
  signOut() {
    const { onStateChange } = this.props;
      Auth.signOut().then(() => {
        onStateChange('signedOut');
      });
  }
```

```
<button onClick={()=>this.signOut()}>ログアウト</button>
```

##公開
```
amplify publish
```
wsl上でbashコマンドでUSBドライブをマウントしアクセスする方法

**wsl**(Windows subsystem for Linux)上でCドライブ以外へアクセスするコマンドは、以下の通り。

bash　shellコマンドでUSBをマウントするよ

<pre>
sudo mkdir /mnt/d
sudo mount -t drvfs D: /mnt/d
</pre>

 ※初期状態では/mntの中にはｃドライブのディレクトリしか見当たらない！！
##### 一連の流れ
- /mnt配下にｄディレクトリを作成するよ。
- マウントコマンドでファイルシステムのタイプを指定するよ。drvfs
- マウントしたいドライブを指定するよ。 D:
- あらかじめ作成したディレクトの場所を指定するよ。　/mnt/d


usbが(E:)なら　eディレクトを作成し、E:をマウントするようにするよ。

以上。
NginxでHTTP/2を有効にしたのにHTTP/1.1が使われている場合

NginxでHTTP/2を有効にするのは設定一発で本当に簡単だ。一方でNginxを有効にしているのにHTTP/1.1がログに出ることがある。ググった所触れられているサイトがなかったので記録として残す。

#NginxでHTTP/2を有効にする方法
なぜHTTP/2にするかはここでは触れない。Googleのサイト監査ツールLighthouseでHTTP/2を使えと推奨されたりする。Nginx1.9.5以降では設定するだけでHTTP/2を使えるようになる。

https://developers.google.com/web/tools/lighthouse/audits/http2


#Nginx設定
https://dassur.ma/things/h2setup/ にある通り。listen 443の行にhttp2を足して再起動するだけ。

```
server {
    listen 443 ssl http2 default_server;
    ssl_certificate    /path/to/server.cert;
    ssl_certificate_key /path/to/server.key;
    # ...
    # Copy from the HTTP server
    # ...
}
```

#HTTP/1.1が残る現象
Lighthouseで再検証する...と例えばこんなログが出てHTTP/1.1が残ってるじゃねーか！と指摘される。

<img width="520" alt="Lighthouse_Report-3.png" src="https://qiita-image-store.s3.amazonaws.com/0/31886/17fa7138-1c79-ec82-56fb-047c69279488.png">

#何が起きているか
Chromeのdeveloper modeでログを眺めると304Not Modified http/1.1となっている。304Not Modifiedは例えばjpgにキャッシュ期間を設定している場合に「更新なし」だよというレスポンスでブラウザはローカルキャッシュを使用する。このstatusが定義されているRFCがHTTP/1.1なのでHTTP/2ではないログが出てしまう（が問題ない）。


304 Not Modified - HTTP | MDN https://developer.mozilla.org/ja/docs/Web/HTTP/Status/304

<img width="740" alt="imglog.png" src="https://qiita-image-store.s3.amazonaws.com/0/31886/c4d5311f-0181-2cd3-74cf-8fcefcaf5f56.png">
[jsoup]ドキュメントの全量を取得する方法

# 全量取得できていない！？

とあるページをjsoupにて取得しselectorで要素を取得した際、本来ある数より少ない結果となりました。
ドキュメントのtext()を見ても取得要素が足りていない・・・（困）

# maxBodySize(0)の利用

これだけでした。

```java
Document doc = Jsoup
          .connect("https://xxx.xxx.xxx/")
          .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36")
          .timeout(1000 * 60)
          .maxBodySize(0)
          .get();
```

# 参考
・リファレンス
　　https://jsoup.org/apidocs/org/jsoup/Connection.html#maxBodySize-int-
　　「The default maximum is 1MB」とありました。意外と小さい？ですね。

・参考にさせて頂きましたサイト様
　　https://jmchung.github.io/blog/2013/10/25/how-to-solve-jsoup-does-not-get-complete-html-document/
PHPでxmlファイルの読み込み

simplexml_load_file('リンク先URL');
リンク先よりファイルを読み込む記述。

<?php
$xml = simplexml_load_file('http://_______');
foreach($xml->xmlのタグ名 as 変数名を定義):
?>

<a href='<?php print(定義した変数名->抜き出したいタグ名＿リンク先URL); ?>
<?php print(定義した変数名->抜き出したいタグ名＿タイトル); ?>
</a>

<?php endforeach ?>
小ネタ: Qiitaの記事を削除したら、記事に付いていた「いいね!」はどうなるか？



(記事執筆時点 2018/11/12) 以下、どなたかの記事をかぶっていたり、常識でしたらすいません。:sweat:

こんにちわ！石田です。昨日の朝、Watsonのサービスが30分止まったのですが、大きな混乱はなかったようです。ヨカッタ、ヨカッタ。。

で、そのことは下記のようにQiitaの記事でも告知してたのですが、もう記事自体が不要になったので記事を消すことにしました。ここで、ふと**「いいね！」の情報は記事と筆者のどちらに紐ついているのかなあ？**と思ったので、記事を削除する操作の前後で「いいね！」数を記録してみました。結果として、**記事を削除すると、その記事に付いていた「いいね！」も消失し、合計が減る**ことがわかりました。表示されるContribution数は、都度、各記事の「いいね！」数を集計してるようですね。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/9f27588f-46d0-fa96-d604-c0e94af5545a.png)

(以上です。だからどうだ、ってのは特にありません。)
Intellij IDEAでRailsプロジェクトを始める手順

# 環境
- IntelliJ IDEA 2018.2.5 (Ultimate Edition)

# 手順
- git cloneしてくる
- File -> New -> ProjectでRuby on Railsを選択し、SDKを選ぶ

# ~~問題~~これは間違ってJRubyのプロジェクトと認識されていたからだった
- Bundlerが認識されない
- Run Rake Taskで `Ruby SDK isn't set` と出る。
    - ここで報告した https://intellij-support.jetbrains.com/hc/en-us/community/posts/360001514040-In-Rails-project-with-the-Intellij-IDEA-when-I-did-Run-Rake-Task-I-got-Ruby-SDK-isn-t-set-error-
- File -> Project Structure -> Modules -> JRubyのところので `No ruby interpreter configured for the module` というエラーが出る
チラ裏: 小学校の授業のプログラミング教育 ってなんぞや

* 一言で言うと、子供には [スクラッチ](https://scratch.mit.edu/) 勉強させとけ。
* ロボコンみたいなのを体験させるのも良いかも。


## 参考

* [プログラミング教育：文部科学省](http://www.mext.go.jp/a_menu/shotou/zyouhou/detail/1375607.htm)
    * [小学校プログラミング教育の手引](http://www.mext.go.jp/a_menu/shotou/zyouhou/detail/1375607.htm)

![1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/3f720136-b757-c4ef-f10d-591f01ae2bb4.png)
![2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/2b8591d6-5ee4-ca9d-e6dd-e98a5d090f44.png)

## 学習活動の分類

* A, B, C, D

という4種類に分類される。

* A : 各科目の授業の時に行ってね。
    * 内容は例示してるから。
* B : 各科目の授業の時に行ってね。
    * 内容は例示しないけど任せるよ。
* C : 教科書には含まれないもので実施
    * 例えばどこかの会社が実施する催し物に参加。
    * 以前あった、マインクラフトでの授業もこれに含まれるのでは。
* D : 部活動


### 予想

* (A)社会: 都道府県の名称と位置
    * (これは難しそう) Google Map APIを使った座標？？
    * 日本地図の画像(各県ごとに画像パーツ化されている)を表示して、
	名称を入力したら、その県だけ色がつく とかかな。

* (A)算数: 正多角形の作図
    * 360 / 角数 で角度を出して、線を引っ張る？

* (B)音楽: 音楽づくり
    * これが多分いちばん簡単。音を並べるだけかな。

* (B)家庭: 炊飯
    * 炊飯器の各ボタンごとの動作について考えるとか。

* (A)総合学習: 探求的な学習
    * 今後どういうものが出来るとか夢を語る授業かな。

* (B)総合学習: プレゼンテーション
    * 前で発表する練習

* (D)クラブ活動
    * 部活。補講みたいな感じ？？

* (C)楽しさ、面白さ、達成感など
    * スクラッチやマインクラフトを利用した授業かな。
    * 学校外でやられているラジコンカーなど動作させたり。



## 思ったこと

夏休みの自由研究や工作などについて、
Webページの作成、技術書的なもの、IoTの工作での提出が可能になりそう。

## 使われる言語

* [Scratch](https://scratch.mit.edu/)
    * アカウントの作成が必要。
    * (要メールアドレス)
* iPadで利用する
    * [ScratchJr](https://itunes.apple.com/jp/app/scratchjr/id895485086?mt=8&ign-mpt=uo%3D4) 5〜7歳向け
    * [Pyonkee](https://itunes.apple.com/jp/app/pyonki/id905012686)
* Androidで利用する
    * [ScratchJr](https://play.google.com/store/apps/details?id=org.scratchjr.android)
エンドポイントを叩くという表現の違和感はスイッチを付けるという表現の違和感と似ている

今日ふとエンドポイントを叩くという表現をしてしまい、その表現に違和感を感じたのでその違和感は何か突き止めてみた。

もやもやしている頭の中はこんな感じ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/287824/3897a0cc-6fb0-8225-19ae-3f466be5d54f.png)


#そもそも叩くとは
まず自分が使っている叩くという表現はあっているのか疑ってみた。

自分の中では

**〜を叩く　= 〜へ指示を出す(〜へリクエストを送る)**という理解。

下記はエンジニア語録？のリンク。ここを参考にしてみる。
https://qiita.com/t_nakayama0714/items/478a8ed3a9ae143ad854
これはKintoneを通してAPIを叩くニュアンスを伝える記事。
https://kintone-blog.cybozu.co.jp/developer/000270.html

どうやら、現在**「叩く」とは「実行する」という意味らしい。**

実行する手順の中に指示を出すことは含まれているので、**自分が思っていた「叩く」よりも一般的なエンジニアの「叩く」は横に広い。**

**指示を出す・リクエストを送る**だけじゃなくて
![image.png](https://qiita-image-store.s3.amazonaws.com/0/287824/a87b0a2e-c4de-a446-e322-3bd73788867d.png)

**指示を出して・リクエストを送って一連の動作が完了する**。
ここまで全部のことを言う。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/287824/825e5b17-a1fc-21b9-4e7a-b08a70b897ee.png)

#なぜエンドポイントを叩くという表現はなぜ違和感があるのか。

この「叩く」のニュアンスだと

**エンドポイントを叩く ＝ エンドポイントを実行する**　ということになる。

実行するという表現は「実際の動作を行う」というニュアンスである。(下記は辞典)
https://dictionary.goo.ne.jp/jn/98344/meaning/m0u/

つまり、実行するという表現は、「一連の動作」に対してかかっている必要がある。予定を実行するとか、計画を実行するとか。

**エンドポイントはただのURLである。エンドポイントそれ自体は動作ではない。**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/287824/f8036779-b824-7669-d7e1-4426d46c2321.png)

**エンドポイントを叩く　→　エンドポイントを実行する**

**この表現では、エンドポイントそれ単体では動作ではないので表現に誤りがある。**

これが違和感の正体である。

しかしエンドポイントは動作の一部である。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/287824/72c8e624-12d1-d5df-e3e3-97bbb761bc29.png)

**エンドポイントから叩く・エンドポイントを通じて叩く**

という表現なら正しい。

この表現だと

**URLから(始まる一連の動作を)実行する・URLを通じて(一連の動作を)実行する**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/287824/82f0c896-1d4c-e59a-f0d2-01ff0fdd780f.png)


となり意味が通る。

#結論
エンドポイントはあくまで入り口なので、それ自体が動作する、しないもない。そこにあるだけで役割を果たしている単体だ。

ただ、一連の流れの一部としてエンドポイントをみると、それは動作なのである。

#スイッチの話
今回の違和感の話は結局**スイッチを付ける**という表現と似ている。

スイッチそれ自体がつくわけではなく、スイッチから始まる一連の動作が電気をつける。スイッチそれ自体では一つの単体なので、スイッチそれ自体はそこにあるだけで役割を果たしている。

けどスイッチから始まる電気を付けるための一連の動作はある。

スイッチを付けるのではなく、スイッチから始まる一連の動作が電気を付けるのである。

**スイッチから電気を付ける。**
この表現だと違和感はない。
正規表現



```ruby

#クラス

a = /abcdefg/i
puts a.class

→　Regexp

- i
　大文字小文字を区別しない
```

##  Regexpインスタンス生成

```ruby
a = Regexp.new("abc")
→　/abc/

puts a.match("abcdefg")

→ abc

```

## 用語

- エスケープ

```ruby
puts Regexp.escape("array.push(hash[key])")

→
array\.push\(hash\[key\]\)

```

https://www.javadrive.jp/ruby/string/index2.html
IBM Cloud Object Storageのバケットをgoofysでマウントする

# 目的

IBM Cloud Object Storage (ICOS)はS3 APIに対応していますので、AWSのS3と同様の操作が可能です、つまり巷の様々なツールからも利用が可能です。今回はS3をローカルにマウントするツールとして有名なgoofysを使ってICOSをマウントしてみます。

## 検証環境

* IBM Cloud Infrastructure
* Red Hat Enterprise Linux Server release 7.5 (Maipo)

# 手順

巷のガイドではgoofysをビルドするマシンと実行するマシンの区別をつけていないものが多いので、それに従うと無駄にgoのコンパイラを実行マシンに導入してしまう可能性があります。ここではビルドするマシンと実行するマシンを区別して扱います。

## goofysのビルド

ビルドマシンで行います。

### Goのインストール

```
$ sudo yum install -y golang
```

### ソースの取得とビルド

```
# デフォルトで~/goが使われるので必要に応じて変更
$ mkdir ~/go
$ export GOPATH=~/go

# ビルド
$ go get github.com/kahing/goofys
$ go install github.com/kahing/goofys
```

問題なければ ${GOPATH}/bin/goofys が生成されています。

```
$ ls ${GOPATH}/bin
goofys
```

## goofysのインストール

実行マシンで行います。

### goofysコマンドの配布

先ほど生成したgoofysファイルをコピーします。/usr/local/binなどパスが通っているところがいいでしょう。

### fuseのインストール

マウント時にfuseを使用しますので、インストールします。

```
$ sudo yum -y install fuse
```

### クレデンシャルファイルの作成

一般的にはawscliを使ってクレデンシャルファイルを作成しますが、今回はIBM Cloudということもあり、変な気持ちになるので、手動で作成します。

アクセスキーとシークレットはIBM Cloudのポータルから確認してください。

```
$ sudo su - 
# mkdir ~/.aws
# cat <<EOF >~/.aws/credentials
[default]
aws_access_key_id = xxxxx
aws_secret_access_key = yyyyy
EOF
# chmod -R o-rwx ~/.aws
```

## マウント

マウントします。エンドポイント名はIBM Cloudのポータルから確認してください。バケット名はあらかじめ作成したものを指定してください。

```
# goofys --endpoint https://エンドポイント名 バケット名  /マウントポイント
```

以上です。
mac book pro java開発環境(openjdk) setup with homebrew+jenv+idea

# mac book pro java開発環境(openjdk) setup with homebrew+jenv+idea

## この文書について

### ユーザー

* 私

### 目的

* java 開発環境のセットアップ手順を明らかにする。
* 開発環境の基本線を統一する。
* もう一回セットアップする日が来るかもしれないので備忘録とする。

> ansible化したいけど、しても何回使うか・・・

### 要約

* brewコマンドでjava(openjdk)をインストール
* anyenvでjenvをいれてjdk管理
* Intellij IDEA

## 手順

### OpenJDK

1. brew caskのバージョン管理追加

    ```bash
    brew tap caskroom/versions
    ```
1. homebrewプラグイン[AdoptOpenJDK](https://github.com/AdoptOpenJDK/homebrew-openjdk)有効化

    AdoptOpenJDKの最新版以外をインストールする場合に必要。

    ```bash
    brew tap AdoptOpenJDK/openjdk
    ```

1. brew caskでインストール
    * Java 8
        ```bash
        brew cask install adoptopenjdk8
        ```

1. jenvのインストール（anyenv利用)

    ```bash
    anyenv install jenv
    exec $SHELL -l
    ```

1. jenvにjdkを追加する

* brew-cask経由だからか/system/Libraryじゃなく/Librayにあった

    ```bash
    jenv add /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
    ```

    > 参考資料：[MacのBrewでJava8 + Java10 + Java11を利用する](https://qiita.com/seijikohara/items/56cc4ac83ef9d686fab2)

1. 必要なバージョンに切り替える

    ```bash
    # 1.8に切り替える場合の例
    jenv global 1.8
    jenv rehash
    ```

### IntelliJ IDEA

* Toolbox Appから選択してインストールする。
* settingsとプラグインはアカウントと同期する。

![Jetbrains Toolbox](https://qiita-image-store.s3.amazonaws.com/0/166036/6349a7a3-0ce1-754a-be10-5f66c5d854e6.png)
Qiitaに投稿された、不適切だと感じた記事への対処方法

Qiitaの機能の紹介記事です。

# 概要
不適切と感じる記事を報告できる機能があります。
コメントで意見するより、Qiitaが用意している機能を使いましょう。

# 問題がある投稿の報告
## 1. 記事右上からメニュー表示
他人の記事の右上にある「…」マークから「問題がある投稿を報告する」をクリックします。
（なお、自分の記事は報告できません）
<img width="244" alt="スクリーンショット 2018-11-12 午後1.56.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/46299/5061f668-264e-332d-3cb8-6bce327a14ea.png">

## どのような問題があったかを選択
該当するものを選択して「送信」ボタンを押します。以上で完了です。

<img width="594" alt="スクリーンショット 2018-11-12 午後1.58.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/46299/b9aa44eb-6125-9d5a-acc2-53a5acc6778b.png">
KerasでSlackにエポックごとに学習ログを通知するcallbacks

## 背景
Kerasで1エポックが非常に長い学習を行う時、途中経過が気になって、
毎回確認してしまっていた

そこで__エポック終了時にログをSlsackに通知したい__

## 解決方法
kerasにはLambdaCallbackという便利なカスタムコールバックを作成するツールがあった。
Slackのチャンネル名とWebhookURLを取得して以下のように書けば良い

```
import json
import requests

from keras.callbacks import LambdaCallback


def slack_logging():
    url = YOUR_WEBHOOK_URL

    slack_logging_callback = LambdaCallback(
        on_epoch_end=lambda epoch, logs: requests.post(
            url=url,
            data=json.dumps(
                dict(
                    channel='#deep_callbacks',
                    attachments=[
                        dict(
                            fields=[
                                dict(value=json.dumps(dict(logs)))
                            ]
                        )
                    ]
                )
            )
        )
    )
    return slack_logging_callback
```

あとは、modelを学習する時に callbacksの引数にslack_logging()を追加すれば完了です！

```
model.fit(x_train, 
          y_train, 
          ..., 
          callbacks=[slack_logging()])
```

もっといい方法があれば教えて下さい。
学習経過のプロットを更新して画像をpostしてみたい...
macOSアップデート後の『xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools)...』の対処法

macOS High SierraからMojaveにアップデート後、gitコマンドを利用しようとしたら以下のエラーが出ました。

```
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

以下のコマンドを実行し、xcodeをインストールすれば解決できます。

```
xcode-select --install
```
Homebrewをアンインストールし、端末をクリーンな状態に戻し、インストールしたパッケージ群をRestoreする。

Homebrewを利用していて、MySQLが起動しなくなったので、homebrewをuninstallして、クリーンな状態に戻す。
その前に現在インストールしているpackagesのバックアップを取る。

# package群のバックアップ

```shell
$ brew bundle dump
```

を打つとBrewfileというファイルが出力される。これはbrew経由でinstallしたpackage群を出力しているもの。

```shell
# eg
brew "automake"
brew "avrdude"
brew "openssl"
brew "readline"
```

Brewfileを元にバックアップを復元する場合は下記のコマンドで出来る。

```shell
$ brew bundle
```

# Homebrewをuninstall

手順はFAQに載っている。

* https://docs.brew.sh/FAQ

#### How do I uninstall Homebrew?

> To uninstall Homebrew, paste the command below in a terminal prompt.

```
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"
```

ということで、上記のコマンドをterminalで打てば良い。実行後、homebrewに依存している諸々がuninstallされる。

# バックアップからRestore(もとに戻す)

上記の通り、下記のコマンドを打てば戻る(reinstrallされる

```shell
$ brew bundle
```
MacOSX で Fortran を使った備忘録

職務の関係上、MacOSX で Fortran を使わなければならなくなったのですが、設定に少し苦労したので備忘録を以下に残します。

### Conda

     conda create -n fortran -c gfortran_osx-64 gfortran_osx-64

### 起こった問題

* xcode-select がないと言われたのでインストールした。
* gfortran hello.f -o hello.exe したあと ./hello.exe したら以下のようなエラーが吐かれた。

      dyld: Library not loaded: @rpath/libgfortran.3.dylib


### 解決手段

理屈は分かってないけど、 https://github.com/ContinuumIO/anaconda-issues/issues/739 を参考に

    gfortran hello.f -Wl,-rpath,${CONDA_PREFIX}/lib -o hello.exe

したら動いた。
nginx+php-fpmでSCRIPT_URxを使う

nginx+php-fpm環境で、\$_SERVER['SCRIPT_URI']や\$_SERVER['SCRIPT_URL']が参照できずエラーになる場合の対処法です。
実はこれらのパラメータはPHP標準のものではなくて、[RewriteEngine](https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriteengine)が動いてないと使えないらしいです。

## どうするのか
nginxでSCRIPT_URxは使えませんが、似た働きをする変数はあります。
以下の変数を駆使してSCRIPT_URxの値を作り、php-fpmに渡してあげます。

- $scheme （httpとかhttps）
- $http_host （ホスト名）
- $request_uri （/root/foo.php?bar=1みたいなのが入ってる）

値の加工には、ngx_http_map_moduleを使います。（nginxの標準モジュールです。）

```Nginx
map $request_uri $script_url {
    "マッチングルール" "値";
}
```
上記の例だと、\$request_uriの文字列が "マッチングルール" にマッチした場合、 \$script_urlに"値"が入ります。
複数行書くと、上から順に評価して最初にマッチした行で抜けます。

## やってみる
たとえば https://localhost/root/foo.php?bar=1 のようなリクエストに対して、こんな感じのを返したい。

- SCRIPT_URI = http://localhost/root/foo.php
- SCRIPT_URL = /foo.php

http{}ブロック

```Nginx:/etc/nginx/conf.d/default.conf
map $request_uri $script_url {
    default $request_uri;
    ~^(?<script_filename>.+\.(php))(.*)?$ $script_filename;
    ~^(?<script_filename>.*)(\?.*)$ $script_filename;
    ~^(?<script_filename>.*)(\?.*)?$ $script_filename;
}
```
\$request_uriの"?"以降の文字列を取り除いて、\$script_urlに入れます。
default valueを指定しているので、何もマッチしなかった場合は$request_uriの値がそのまま入ります。

server{}ブロック

```Nginx:/etc/nginx/conf.d/default.conf
location ~ \.php$ {
    fastcgi_param SCRIPT_URL $script_url;
    fastcgi_param SCRIPT_URI $scheme://$http_host$script_url;
    include fastcgi_params;
}
```
mapで作った\$script_url, nginx変数の\$scheme, \$http_hostを組合せてSCRIPT_URxを作り、fastcgi_paramにセットします。

## 元ネタ
[Need Apache's SCRIPT_URL equivalent in nginx + php-fpm](https://serverfault.com/questions/487872/need-apaches-script-url-equivalent-in-nginx-php-fpm)
Thunderbird 60 でConfirm-Addressを動作させる

// ***** 2018/11/16追記 ***** //
Confirm-Adressが本投稿に記載してたプルリクエストを取り込んでThunderbird 60に対応したようです。(随分前からプルリクエストはされてたようですが、だいぶ時間かかりましたね。謎...)
https://addons.thunderbird.net/ja/thunderbird/addon/confirm-address-5582/
// ***** 2018/11/16追記 end ***** //


プログラミングの投稿を全くしていませんが、今回もそんなネタです。
メーラーは相変わらずThunderbirdを使用しているのですが、毎回のことながらメジャーアップデートがあるとアドオンが動作しなくなります。
その筆頭がConfirm-Addressなのですが、Thunderbird 60で動くようにする方法です。(何か不具合が発生しても自己責任でお願いします)

Confirm-AddressのソースコードはGithubにあります。
https://github.com/Meatian/confirm-address/

こちらのPull requestsを覗くと現時点(2018/11/12)ではまだ取り込まれていない「support Thunderbird 60.0」があります。
![スクリーンショット 2018-11-12 13.18.29.png](https://qiita-image-store.s3.amazonaws.com/0/16070/0c22c787-dba4-4a76-9daa-849d28b4f035.png)
そちらのプルリクエスト作成者さんのフォークしているGithubのリポジトリへ移動しローカルにクローンします。
https://github.com/marsf/confirm-address

ローカルにクローンしたら「marsf-1.3.0」ブランチをチェックアウト(リポジトリからプル)します。
その状態でローカルのクローンした場所に移動し以下のフォルダ内まで移動します。
/[クローンしたフォルダ]/confirm-address/
以下のようなファイル構成になっている場所まで移動します。
![スクリーンショット 2018-11-12 12.59.20.png](https://qiita-image-store.s3.amazonaws.com/0/16070/86c9cce1-6c9d-4627-17f6-c15b805cc026.png)
上記のファルをすべて選択しzipに圧縮します。出来上がった「[xxxxx].zip」というzipファイルの名前を「confirm-address_1.3.0.xpi」に変更します。
![スクリーンショット 2018-11-12 13.02.43.png](https://qiita-image-store.s3.amazonaws.com/0/16070/98dc0611-e776-d47a-8c97-5fc1617de164.png)
作成したxpiファイルを直接Thunderbirdのアドオン画面にドラッグ&ドロップしてエラーが出ずにアドオンが有効化していれば成功です。
![スクリーンショット 2018-11-12 13.11.14.png](https://qiita-image-store.s3.amazonaws.com/0/16070/97f52762-7d86-0d37-bc85-94488dd3dcaf.png)
一応バージョンが1.3.0になっているか確認して、アドオンも機能しメールも正しく送信されるか確認してください。
![スクリーンショット 2018-11-12 13.11.56.png](https://qiita-image-store.s3.amazonaws.com/0/16070/4f976aaf-534f-dfa1-02f6-ba946f6bbb29.png)
微妙にレイアウトがおかしいですね^^;
![スクリーンショット 2018-11-12 13.21.47.png](https://qiita-image-store.s3.amazonaws.com/0/16070/5637e118-dfc1-d880-ebeb-84b1ffdf6f8b.png)


以上です。
Nuxt.jsで作った静的サイトをNetlifyにホスティング

# この記事のターゲット
- Nuxt.js気になる
- Netlify気になる
- 静的サイト作りたい

# 事前準備

## Nuxt.jsとは
https://ja.nuxtjs.org/

>Nuxt.js は Vue アプリケーションを作成するフレームワークです。ユニバーサルアプリケーション、静的に生成されるアプリケーション、シングルページアプリケーションの中から作成するアプリケーションを選ぶことができます。

はい。
Vue.jsのエコシステムであるVuexやVue Routerを簡単に利用できるようにしてくれているフレームワーク、という理解です。
今回はこのNuxt.jsを利用してHTML,CSS,JavaScriptを吐き出して静的サイトを作ります。


## Netlifyとは
https://www.netlify.com/

静的サイトをホスティングできるWebサービス。
GitHubと連携して自動デプロイも簡単です。
特にデプロイ時に実行するコマンドを指定することができるため、GitHub上にビルド後のファイルを置かなくて済むのがポイントです。


# 作業開始

大まかな手順は以下の通り。
1. GitHub repositoryの用意
2. Nuxt.jsの用意
3. Netlifyアカウントの用意
4. デプロイ設定

それでは行きましょう。

## 1. GitHub repositoryの用意

普通に用意してください。
特記事項なし。

## 2. Nuxt.jsの用意

```
npx create-nuxt-app <project-name>
```

質問はよしなに答えます。
処理が終わったら動作確認。

```
cd <project-name>
npm run dev
```

これで https://localhost:3000 に開発環境が立ち上がっているはず。
確認できたら一旦ctrl+cで落として、静的ファイルを出力してみます。

```
npm run generate
```

無事成功するとdistディレクトリが生成されているはず。
ここまで確認できたらGithubリポジトリにpushしてしまいましょう。

## 3. Netlifyアカウントの用意
公式サイトからアカウントを取得します。（[https://www.netlify.com/](https://www.netlify.com/)）


## 4. デプロイ設定
アカウントが取得できたら公開サイトの用意を始めます。
Sitesタブを開くと、「New site from Git」ボタンがあるのでクリック。
サービスの候補が出るので今回はGitHubを選択。
リポジトリの候補が出るので先ほど用意したリポジトリを選択します。

Production Branch、Build command、Publish directoryを入力するページが出るので以下の通りに設定します。

| パラメータ | 入力 |
|---|---|
| Production Branch | master |
| Build command | nuxt generate |
| Publish directory | dist |

これで準備完了です。

すでにmasterブランチは最新の状態なので初回はマニュアルデプロイしましょう。


# 所感
ちょーかんたん。
Nuxt.jsの簡単さもさることながら、Netlifyでのデプロイも簡単でとてもDX（developer experience）が良いです。

私がNuxt.jsとNetlifyで作成したものをおいていきます。
Netlifyでは独自ドメインの設定まで楽々ですのでぜひ試して見てください。

https://www.ririli.net/