OmniAICreator/Qiita-1.07M huggingface dataset:
Tensorflow/KerasでDeep Learningをやってみよう！（その１）

#誤差の最適化と勾配法
機械学習や深層学習では、一般に予測の誤差を最小化・最適化することを学習と言います。
前回までのステップで、データフローグラフの基本を学んだところで、このチュートリアルでは「最適化」という概念について勉強して行きたいと思います。

最適化とは、与えられた関数の出力を「最小化」するパラメータを見つけることです。
Tensorflowでは、「勾配法」という手法により、誤差関数を最小化する便利な機能があります。

# 1.勾配法（最急降下法）
別名、最急降下法と呼ばれる関数の２次元空間を、降下していくメソッドです。
その基本的な段階は、

```
1.パラメータを適当な値で初期化する
2.与えられたパラメータでの関数の傾き（勾配）を計算する
3.最も傾きの大きい（急な）方向に、パラメータを少しずつずらしていく
4.2〜3を繰り返す
```
<最急降下法による2次関数の最小化>

```
import tensorflow as tf

# パラメータは変数として定義
x = tf.Variable(0., name='x')
# パラメータを使って最小化したい関数を定義
func = (x - 1)**2

# learning_rate は一度にずらす大きさを決める
optimizer = tf.train.GradientDescentOptimizer(
    learning_rate=0.1
) 
# train_step が x を少しずらす操作を表す
train_step = optimizer.minimize(func)

# train_step を繰り返し実行する
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(20):
        sess.run(train_step)
    print('x = ', sess.run(x))

x =  0.98847073
```

x = 1の時に、この関数は、０になり最小の値になりますが、20回程度の反復で、
x =  0.98847073
を示していますね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/327825/9412829a-e705-a6b6-1785-7cd6cdd063e6.png)

#2.勾配法の機械学習への適用
さてこの勾配法を機械学習にはどのように適用するのでしょうか？
簡単な例で、みて行きましょう。ここでは、Boston house-prices というデータセットを使って、
住宅価格を判定する機械学習モデルを作ってみましょう。

##2.1 データセットの準備
Tensorflowの上位言語のKerasには、このデータセットを割と簡単に取り込むことができる機能があるので、Kerasを導入してみましょう。

```
pip install keras
```
これを例のAnacondaのaistudio仮想環境のターミナルから実行しましょう。
。。 ターミナルではなくて、jupyter notebookからでも出来ます。が、

```
!pip install keras
```
頭に!（ダッシュ）を付けます。
x_trainだけ、出力してみましょう。なにがしかのデータがロードされたようです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/327825/99308cdf-583b-82ff-aa5e-6656ea861403.png)
でもこれでは分からないので、ヒストグラムにして表示しましょう。

```
# matplotlibのグラフをインラインで表示する
%matplotlib inline

import matplotlib.pyplot as plt

plt.rcParams['font.family'] = ['IPAexGothic']
plt.rcParams['font.size'] = 10*3
plt.rcParams['figure.figsize'] = [18, 12]

plt.hist(y_train, bins=20)
plt.xlabel('住宅価格($1,000単位)')
plt.ylabel('データ数')
plt.show()
plt.plot(x_train[:, 5], y_train, 'o')
plt.xlabel('部屋数')
plt.ylabel('住宅価格($1,000単位)')
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/327825/8267b789-13ce-7288-045a-ee2149bfea4f.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/327825/9ec786b5-11c3-ae1e-66e2-6a6d1178609a.png)

こんな分布をしているみたいですね。
GCP の Cloud Functions で pipenv が使えている


## 概要
パッケージ管理を`pipenv`に移行していた中で、GCPの Cloud Functions にも適用してみたところ 正常に動作したのでメモ
厳密な調査をしているわけではないので間違っていた場合は指摘していただけるとありがたいです。
(根本的に理解が間違っているかもしれません。すみません。)

## 本編
### 前提

`pipenv`やら`gcloud`コマンドやらの環境は整っている前提でメモします。
検証のために適当な外部ライブラリ(今回は`requests`)を用いたファンクションをデプロイして動作を確認する。

### 作業

最終的には以下のようなディレクトリ構造を作る。(`main.py`以外はコマンドで生成される)

```
pipenv_functions_test/
├── Pipfile
├── Pipfile.lock
└── main.py
```

`main.py`は以下のよう

```python:main.py
import requests

# gcloud beta functions deploy test_function --trigger-http --runtime python37
def test_function(request):
    return requests.get('http://google.com')

# 動作確認用
if __name__ == '__main__':
    print(test_function('a'))
```

#### デプロイコマンド

```
$ pipenv install requests
$ gcloud beta functions deploy test_function --trigger-http --runtime python37
```

デプロイ完了時に出力されるURLにアクセスしてみると正常に動作していた。
pipenv でも動作していることが確認できた。
パッケージ管理がだいぶ楽になるので助かる!!

## 補足
`pipenv` なしの環境でも試してみたが、`No module named`エラーだった。
メモ：golangの正規表現で文字列からキャプチャする方法

忘れがちな、golangの正規表現で雑に文字列からキャプチャする例。メモっておきます。

```golang:regex_string_caputure.go
package main

import (
	"fmt"
	"regexp"
)

func main() {
	re := regexp.MustCompile("^iPhone(\\d+),(\\d+)$")
	fmt.Println(re.FindStringSubmatch("iPhone10,6"))
}
```

本当はgistを埋め込みたかったけどqiitaはgist埋め込みには対応していないのよね。。
[忘れがちなgolangでstringから正規表現で雑にキャプチャするcode](https://gist.github.com/roadman/a4c0cb6482bdb498d743f28a1c2beeef)
Laravelで俺が使いそうなAssertメソッドをまとめてみた

[ディップ Advent Calendar](https://qiita.com/advent-calendar/2018/dip-dev) の19日目です。

## はじめに
ディップ株式会社に2018年新卒で入社し、求人系サービスの開発や社内向けツールの開発を行なっている@taku-0728です。
今回は自分用メモとして、Laravelで個人的によく使いそうなAssertメソッドについてまとめてみます。
個人的な主観が入っているので、まとめに入っていないメソッドもあるかもしれませんがご了承ください。
よろしくお願いいたします。

## メソッド一覧
### レスポンス
|メソッド|意味|
|:--:|:--:|
|assertCookie|レスポンスが指定したクッキーを持っている|
|assertCookieMissing|レスポンスが指定したクッキーを持っていない|
|assertDontSee|指定した文字列がレスポンスに含まれていない|
|assertSee|指定した文字列がレスポンスに含まれている|
|assertDontSeeText|指定した文字列がレスポンステキストに含まれていない|
|assertSeeText|指定した文字列がレスポンステキストに含まれている|
|assertForbidden|レスポンスがforbiddenステータスコードを持っている|
|assertHeader|レスポンスに指定したヘッダが存在している|
|assertHeaderMissing|レスポンスに指定したヘッダが存在していない|
|assertJson|レスポンスが指定したJSONデータを持っている|
|assertJsonCount|レスポンスJSONが、指定したキーのアイテムを、期待値分持っている|
|assertJsonFragment|レスポンスが指定したJSONの一部を含んでいる|
|assertJsonMissing|レスポンスが指定したJSONの一部を含んでいない|
|assertLocation|レスポンスのLocationヘッダが、指定したURIを持つ|
|assertNotFound|レスポンスがnot foundのステータスコードを持っている|
|assertOk|レスポンスが200のステータスコードを持っている|
|assertRedirect|クライアントが指定したURIへリダイレクトする|
|assertStatus|クライアントのレスポンスが指定したコードである|
|assertSuccessful|レスポンスが成功のステータスコードである|
|assertViewHas|レスポンスビューが指定したデータを持っている|
|assertViewHasAll|レスポンスビューが指定したリストのデータを持っている|
|assertViewIs|ルートにより、指定したビューが返される|
|assertViewMissing|レスポンスビューが指定したデータを持っていない|

### セッション
|メソッド|意味|
|:--:|:--:|
|assertSessionHas|セッションが指定したデータを持っている|
|assertSessionHasAll|セッションが指定したリストの値を持っている|
|assertSessionHasErrors|セッションが指定したフィールドに対するエラーを含んでいる|
|assertSessionHasErrorsIn|セッションが指定したエラーを持っている|
|assertSessionHasNoErrors|セッションがエラーを持っていない|
|assertSessionMissing|セッションが指定したキーを持っていない|

### 認証
|メソッド|意味|
|:--:|:--:|
|assertAuthenticated|ユーザーが認証されている|
|assertGuest|ユーザーが認証されていない|
|assertAuthenticatedAs|指定したユーザーが認証されている|
|assertCredentials|指定した認証情報が有効である|
|assertInvalidCredentials|指定した認証情報が無効である|

### ブラウザ
|メソッド|意味|
|:--:|:--:|
|assertTitle|ページタイトルが指定した文字列と一致する|
|assertTitleContains|ページタイトルに、指定したテキストが含まれている|
|assertUrlIs|クエリ文字列を除いた、現在のURLが指定した文字列と一致する|
|assertHostIs|現在のURLのホストが、指定したホストと一致する|
|assertHostIsNot|現在のURLのホストが、指定したホストと一致しない|
|assertPortIs|現在のURLポートが、指定したポートと一致する|
|assertPortIsNot|現在のURLポートが、指定したポートと一致しない|
|assertPathBeginsWith|現在のURLパスが指定したパスで始まる|
|assertPathIs|現在のパスが指定したパスである|
|assertPathIsNot|現在のパスが指定したパスではない|
|assertRouteIs|現在のURLが指定した名前付きルートのURLと一致する|
|assertQueryStringHas|指定したクエリ文字列パラメータが存在している|
|assertQueryStringMissing|指定した文字列パラメータが存在しない|
|assertInputValue|指定した入力フィールドが、指定値を持っている|
|assertInputValueIsNot|指定した入力フィールドが、指定値を持っていない|
|assertChecked|指定したチェックボックスが、チェック済みである|
|assertNotChecked|指定したチェックボックスが、チェックされていない|
|assertRadioSelected|指定したラジオフィールドが選択されている|
|assertRadioNotSelected|指定したラジオフィールドが選択されていない|
|assertSelected|指定したドロップダウンで指定値が選択されている|
|assertNotSelected|指定したドロップダウンで指定値が選択されていない|
|assertDialogOpened|指定したメッセージを持つ、JavaScriptダイアログが開かれている|
|assertEnabled|指定したフィールドが、enabledである|
|assertDisabled|指定したフィールドが、disabledである|
|assertFocused|指定したフィールドに、フォーカスがある|
|assertNotFocused|指定したフィールドから、フォーカスが外れている|

### データベース
|メソッド|意味|
|:--:|:--:|
|assertDatabaseHas|指定したデータが、テーブルに存在する|
|assertDatabaseMissing|指定したデータが、テーブルに含まれない|

## 最後に
個人的まとめとして、Laravelで自分が使いそうなAssertメソッドをまとめてみました。
機会があれば更新したいと思います。
最後まで読んでいただきありがとうございました。
Ubuntu 18.04 でUSB接続モニタを使えるようにする

Ubuntu 18.04でMB168B+を使えるようにした手順を書きます．
手元のPC2台で検証を行いました．

以下が手順です．

BIOSの設定
- 
- Windowsとデュアルブートしてる場合はBiosからsecure bootをdisableにする

必要なパッケージのインストール
- 

```bash
$ sudo apt install dkms
$ sudo apt install libdrm-dev
```

Displaylinkdriverのインストール
- 
- [Displaylink](https://www.displaylink.com/downloads/ubuntu)からUbuntu18.04に対応しているものをインストールする．

```bash
$ unzip DisplayLink\ USB\ Graphics\ Software\ for\ Ubuntu\ 4.4.zip
$ chmod 777 displaylink-driver-4.4.24.run
$ sudo ./displaylink-driver-4.4.24.run
```

evdiの設定を必要な箇所に書き加える
- 
```bash
$ echo "evdi" | sudo tee -a /etc/modules-load.d/modules.conf
$ echo "options evdi initial_device_count=2" | sudo tee -a /etc/modprobe.d/dkms.conf
```

以上で設定完了です．
ブロックチェーンを活用したidentitiyの実装とそこから考える展望

「[ランサーズ Advent Calendar 2018](https://qiita.com/advent-calendar/2018/lancers) 」18日目の記事です。

ランサーズにはブロックチェーンのプロジェクトがあり、identitiyまわりのリサーチおよび実装による検証を行ったので、それらでやったことの説明とそこから考える展望について書きます。

# 実装したもの
[ERC725](https://github.com/ethereum/EIPs/issues/725)と[ERC735](https://github.com/ethereum/EIPs/issues/735)を活用して、Ethereumのアドレスにランサーズのアカウントを紐づけ、ランサーズのアカウントを持っているアドレスであれば指定のアクションを行えるというものを実装しました。社内でのみの運用で一般には公開していません。
[コードはこちらです](https://github.com/LancersDevTeam/ethertip) 
[技術的な詳細の記事はこちらです](https://engineer.blog.lancers.jp/2018/11/erc725/)

# 展望
実装したものから考えたこのようなものがつくれるのではないか、というものをいくつかあげてみます。

### 信用情報の蓄積とスコアリング
アドレスに各種Webサービスのアカウント情報を紐付ける
↓
各種サービスのアカウント情報をもとにスクレイピングをして各サービスの実績情報を取得
↓
各種サービスのアカウント情報をランサーズのそのアカウントのプロフィールページに実績情報として表示する（現状でもプロフィールページにリンク等を埋め込むことは可能だが、そのリンクがそのユーザーのものであるかを証明することができているわけではないです。今回実装した技術を活用することによってたしかにそのアカウントを保持しているユーザーであるということが証明できます。）。
↓
各種サービスの実績情報を用いて独自のスコアリングを行い、それらをもとに例えばランサーズ内での[検索表示](https://www.lancers.jp/profile/search)順位のロジックに加味するなどが考えられます。レンディングサービスなどであればそのスコアリングをもとに与信枠を決めるなども可能だと思います。

アドレスに各種サービスのアカウント情報を紐付けること、それらがたしかに本人のものであることを証明することは別にブロックチェーンでなくても可能なことです。しかしながら、非中央集権的で特定の企業や団体に依存しないところにそういったデータを蓄積することによって多数のプレイヤーがよりオープンな形でオープンなコードというルールをもとにした自由競争の中より自由な発想でそのデータを元に新しいサービス、新しい信用情報の活用方法を見言い出すことができるのではないかと思っています。

参考情報
[Keybase](https://qiita.com/yyu/items/b444d7a51c30ee071588)
[scouty](https://scouty.co.jp/)

### 各サービスごとの本人確認を不要にする
アドレスに本人確認がされているという情報を紐付ける
↓
本人確認済みである情報を持つEthereumのアドレスを使ってWebサービスに登録することでWebサービスに登録後、本人確認のステップをスキップできるようにする

本人確認を必要とするWebサービスは多く、ユーザーがそのたびに本人確認を行うのは手間だと思っています。それを一度だけで済ますことができればユーザーとして良いですし、Webサービス提供者としても本人確認を行うコストが削減できて良いと思います。

参考情報
[TRUSTDOCK](https://biz.trustdock.io/)

### 非中央集権なログインID
アドレスを使ってログインする（Googleログインをブロックチェーンで実装するイメージ）

参考情報
[DIF](http://identity.foundation/)
[OpenID](https://www.openid.or.jp/)
[https://github.com/block-base/ethereum-login](https://github.com/block-base/ethereum-login)


# 展望と現実との差分
技術的には展望のところであげさせていただいたことはいま現在で可能であるものもあると思います。しかしながら、それが一般に普及するか、世の中にとって便利なものであるか、というところには隔たりがあると思っています。とくにUIUX部分での課題が大きく、今回実装したコードであれば[METAMASK](https://metamask.io/)等を使った操作が必要になるのですが、広く一般の方に使ってもらうためには敷居が高いように思います。技術的にできるということはもちろんのことより扱いやすいクライアントを普及させていく必要もあるように思います。

# まとめ
ブロックチェーンを活用したidentityまわりはなかなかおもしろいトピックだと思います！
動画文化がもたらした、Web滞在時間の変化

# はじめに

Adventカレンダー「エンジニアのためのWebマーケティング」の14日目です。
サクッと読める記事を目標に。異論・ツッコミ大歓迎。
できるだけ専門用語を使わないように気をつけます。

それでは参りましょう

![watching-tv.jpg](https://qiita-image-store.s3.amazonaws.com/0/72413/ad229e09-6b4d-bdda-37ea-4583d7669392.jpeg)



# Webサイトの滞在時間について

突然なんですが、みなさんはWebサイトの滞在時間はどのように計測するかご存知ですか？

例えば、下図のような来訪があった場合。
滞在時間は何秒でしょうか？

![duration.png](https://qiita-image-store.s3.amazonaws.com/0/72413/39d7e64b-06c0-32ba-bb5e-671d39d03d2f.png)


普通に考えたら、5+12+8+15で40分ですよね。
小学生でもわかる計算式です。

でも、Webの計測ツールを使って滞在時間を求めた場合。
実際の滞在時間はこの通りではありません。

**実際は25分**になります。

## Webの滞在時間は「観測点 to 観測点」で計測する

Webサイトを巡回している時に、実際に**「離脱した」というのを明示的に認識する指標というものは実はありません。**

上図でいうなら、「15分経過したあとに離脱した」というのをどのようにして測るのでしょうか。

離脱というのは例えば以下の場合です

* ブラウザを明示的に終了するとき
* 他のサイトに行く時
* パソコン・スマホの画面を閉じる時
* サイトを開きっぱなしでお風呂に行ってしまった時

そう、問題なのは**厳密に離脱したといえるアクションは無い**のです。
ブラウザを開いているからと言って、目の前に人が座っているとも限りませんしね。

なので、通常Webサイトの滞在時間というのは**「来訪開始時PVから最終PVまでの間」**で求めています。ページを表示したのは「明示的」であり「能動的」なアクションだということは確定しているのですから。

でも、明確な離脱は分かりません。

だから「仮にこうなったら離脱したことにする」という定義を別途定めます。

# 大概の離脱基準は「経過時間何分以上」

その仮の指標というのが
**「何分以上次のページへ遷移しなければもう離脱とみなす」**
というものです。

それはつまり

「流石に30分以上次のページに行ってないってことは、もう離脱しているでしょう」

というように**「決め」を定める**ということです。
この基準によって、Webのマーケターの皆さんは「もっと次のページへ行ってもらえるように工夫しよう！」というような施策を凝らしていきます。

しかし、今現在この滞在時間の基準は大きく変わっています。


# 動画文化の登場で変化した滞在時間

動画広告や、動画コンテンツというようないわゆる「リッチメディアコンテンツ」というものは、その中身を長時間鑑賞することが目的であるため、**そもそも滞在時間が長くなる傾向があります**

1時間の動画を見せるようなサイトの場合、ユーザーは1時間何もせずにブラウザの前に座っているわけです。**でもこれは離脱にはなりませんよね？** ユーザーはまだあなたのWebサイトにいるかもしれないのですから。

# 滞在時間の切れ目を設計するのもサイト運営の仕事

上述したような、メディアコンテンツをおいているサイトの場合。

例えば、最初の`index.html`には長めのムービーが表示されますが、それ以降の階層になると1ページあたり平均3分で回れるようなページで構成されていたとしたら・・・。

サイト全体の滞在時間の設計は難しいものになりますよね。

例えば、動画自体に計測ポイントを定める方法。
「どれぐらい見たか？」というセーブポイント的なものを定めることで、定期的に訪問のデータを飛ばし、継続して計測をするというのも手です→[詳しい方法](
https://qiita.com/ssaita/items/6e831f054b9026e086f8)

## 技術の進化は来訪者の多様性も生み出している

技術が進歩し、Webサイト上で色々なものが表現できるようになったこの時代。

我々の目を楽しませてくれるような素敵なものが増えた代わりに、それを本当に享受してくれているのかを把握するには、少し工夫が必要です。

でも、**それを設計するのもマーケターの醍醐味でもあります**


# どうでもいい話

動画広告といえば、自分はブログやキュレーションサイトに行った時に、勝手に表示される動画広告に嫌悪感を抱きます。通信制限と戦っている時に、パケットを無駄に奪われる。あれは困ります・・・。


# おわりに

次のテーマは、「広告効果計測ツールを知る その1」と銘打って、**Google Analyticsについて解説**をします。
Rubyにおけるストリング型とシンボル型

# 説明
### ストリング型
・文字列を””で囲むとストリング型として値を扱うことができる。
・値であるため、同じ文字列であるからと行って同じオブジェクトであるとは限らない。

### シンボル型
・文字列に:をつけることでシンボル型とすることができる。
・一つしか存在しないオブジェクトであるため、ハッシュにおけるキーとして扱われる。

# 具体例
   :author => "Asai"
   :author => "Asai"
・ハッシュにおけるキーである:authorは、authorというオブジェクトが複数あると不都合が生じる（Aという本の筆者もBという本の筆者も同じくくりで扱わないといけない）ため、シンボル型で表している。
・Asaiという値は、朝井リョウ、朝井まかてと同じ名前で複数の値が存在する可能性があるため、ストリング型の値として表している。
Ubuntu 18.04 LTSでLXDの初期設定～コンテナ作成～実行まで

Ubuntu 18.04 LTSにおけるLXDの初期設定～コンテナ作成～実行までの手順です。

## /etc/sysctl.confへの設定追加
sysctl.confを開き、次の通りカーネルパラメータを追加して保存します。

```
user.max_user_namespaces = 3883
fs.inotify.max_queued_events = 1048576
fs.inotify.max_user_instances = 1048576
fs.inotify.max_user_watches = 1048576
vm.max_map_count = 262144
net.ipv4.ip_forward = 1
```

## /etc/security/limits.conf への設定追加
limits.confを開き、次の通り設定を追加して保存します。

```
*               soft    nofile          1048576
*               hard    nofile          1048576
root            soft    nofile          1048576
root            hard    nofile          1048576
*               soft    memlock         unlimited
*               hard    memlock         unlimited
```

### Ubuntu再起動
ここまでの状態で、一旦Ubuntuを再起動します。

``` 
# reboot
```

## LXDの初期設定
LXDを初期設定します。なお、環境や運用方法等にあわせ、設定は適宜調整します。

```
# lxd init
Do you want to configure a new storage pool? (yes/no) [default=yes]:
Name of the new storage pool [default=default]:
Name of the storage backend to use (btrfs, ceph, dir, lvm) [default=btrfs]: dir
Would you like to connect to a MAAS server? (yes/no) [default=no]:
Would you like to create a new local network bridge? (yes/no) [default=yes]:
What should the new bridge be called? [default=lxdbr0]:
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]:
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: none
Would you like LXD to be available over the network? (yes/no) [default=no]:
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]: 
```
## コンテナの作成と起動
lxcコマンドでコンテナを作成してみます。以下はUbuntu 18.04コンテナをubuntu-testという名前で作成する場合の例です。

```
# lxc launch ubuntu:18.04 ubuntu-test
```

LXDで利用可能なコンテナイメージは、以下のURLより確認いただけます。

- Image server for LXC and LXD
 - https://us.images.linuxcontainers.org/

CentOS7コンテナを作成したい場合は、以下の投稿を参照ください。

- LXD上のCentOS7にhttpdをインストールするには（特権コンテナを利用する）
 - https://qiita.com/tabimoba/items/a054e6e301739814e60a


## コンテナの確認
lxc listを実行すると、作成済みのコンテナを一覧で確認することができます。

```
# lxc list
+-------------+---------+----------------------+------+------------+-----------+
|    NAME     |  STATE  |         IPV4         | IPV6 |    TYPE    | SNAPSHOTS |
+-------------+---------+----------------------+------+------------+-----------+
| ubuntu-test | RUNNING | 10.153.159.19 (eth0) |      | PERSISTENT |           |
+-------------+---------+----------------------+------+------------+-----------+

```

## コンテナへ入る（コンテナ上のシェルを利用する）
lxc exec <コンテナ名> /bin/bashを実行すると、指定されたコンテナへ入る（コンテナ上のシェルを利用する）ことができます。

```
# lxc exec ubuntu-test /bin/bash

# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.1 LTS"

# uname -a
Linux ubuntu-test 3.10.0-862.14.4.el7.x86_64 #1 SMP Wed Sep 26 15:12:11 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
```
　　　
## 参考
- lxc/lxd Production setup
    -  https://github.com/lxc/lxd/blob/master/doc/production-setup.md
- LXDを本番導入するときに気をつけるべき事
    - https://kurochan-note.hatenablog.jp/entry/2017/01/31/190200
Vue のトランジションでゲームが作れるのでは？という提案

この記事は [Vue.js #3 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vuejs-3) の19日目の記事です。

## Vue で動くものを作る

要素の動きを扱おうとする場合，CSS のみで記述すると複雑となってしまいます．
Vue には要素の動きを扱う **トランジション** があります．

[Vue のドキュメントのトランジションのページ](https://jp.vuejs.org/v2/guide/transitions.html
)を見ていただくと，いろいろと動くデモが載っています．

この記事では，このトランジションを利用して，ゲームを作るときに利用できそうな動きを例示していきます．

## カードがめくれる動き（transition）

- Vue の `transition` を利用します
- この機能は基本的に **要素が現れる/消える** ときの動きを扱ってくれます

### 作成例

[![Edit transition sample (card)](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/8l24loxmjl?module=%2Fsrc%2FApp.vue)

- カードがひっくり返る動作のデモです
- カードが現れる/消えるときにカードが90度回転するようにしてあげています

#### 実装のポイント
- `<transition>` に `mode="out-in"` を記述する
- `<transition>` 内のタグに個別の `key` を設定するのを忘れないようにする（少しハマった）

## リストが入れ替わる動き（transition-group）

- Vue の `transition-group` を利用します
- この機能はリストの並べ替えの動きを扱ってくれます
- [Vue公式のリスト移動トランジション] (https://jp.vuejs.org/v2/guide/transitions.html#%E3%83%AA%E3%82%B9%E3%83%88%E7%A7%BB%E5%8B%95%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B8%E3%82%B7%E3%83%A7%E3%83%B3) のデモを触ってみると動作の様子がわかると思います

### 作成例

[![Edit transition-group sample (15puzzle)](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/vn6nv81or3?module=%2Fsrc%2FApp.vue)

- 15パズルです
- 必ず解けるようなシャッフルに出来ておらず，完成しても何も起きませんので，動きを見てみるだけにとどめてください（すみません．．．）

## キャラクターなどが動く動き（transition-group）

- transition-group でリスト以外の動きも扱えます．
- CSS の記述がプロパティ１つで済むため，気軽に扱えます．

### 作成例

[![Edit transition-group sample](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/nnp7w1x9rj?module=%2Fsrc%2FApp.vue)

- 画面の十字ボタンで `ε( ε ˙³˙)з` がうごきます

## おわりに

- Vue で動きを制御する方法をまとめてみました
- （ゲームとしてはまだ未完成の部分もありますが）Vue を利用することで動きのある画面を手軽に作れることがお見せすることは出来たと思います
モブワークして失敗した話

この記事は、[モブプログラミング Advent Calendar 2018](https://qiita.com/advent-calendar/2018/mobprogramming) 19日目の記事です。
前日の記事は[こちら](https://takaking22.com/2018/redefinition-of-review/)

敬愛する先輩に~~煽られた~~紹介していただいたため、参加します。
駄記事かつおしゃれなリンク等つけれずすみません

アドベントカレンダー13日目
http://kdnakt.hatenablog.com/entry/2018/12/13/080000
上記記事のアンサーブログです。失敗した後輩とは僕のことです。

モブプロを導入して失敗した話を書きます。
導入方法から、失敗の考察までを少し行ったので、諸先輩方からのアドバイス、お待ちしております。

##状況整理
####行った人数
自分(6年目)と、自分のメンティー2人(配属1年未満と配属2ヶ月)

####行った時間
1日2時間 
1人のやつ1時間ずつ
3週間
####仕事内容
新機能設計資料作成
機能カタログから機能デザイン

モブワーク以外でやったことを発表してもらい、
おかしい部分を修正、更に進めていく。

##結果
3週間で私がギブアップ
→その後私が部署異動し自然消滅

####発生した事象
(1)  海外にいる上司に、決まったことをひっくり返されることが多くあった
弊チームは海外に上司をもっており、その上司のレビューを通過して初めてそのタスク完了となる。
私の指摘と上司の指摘が違っており、メンティーを困惑させる自体が度々発生した
(これは私の能力不足)

(2)  私の進捗に著しい遅れが発生した


(3)  事象(1)の結果私の求心力がなくなり、事象(2)の結果私のモチベと評価が下がった

チーム内に、「あれ、この先輩、言ってること信用できなくね？」という空気が流れた(と思った)そしてちょっと私は自信をなくしたｗ
また、弊社はマネージャー以外に「後輩の教育」という評価観点がない。したがって、私の進捗遅れ=評価下がるとなる。したがって、後輩が良い教育を受けれるかどうかは先輩の力量と性質次第、という状態。

→結果、私の進捗と評価を取り戻すためモブワーク中断して自分のリカバリーをする、という自体に陥った。



##考察など
良い点と悪い点があったのでいくつか考えていく。
####こうすればよかったのでは、、
#####もう少しスモールスタートするべきだった
@radiocat さんの
[ボーナスステージで実践するモブプログラミングのメリットとデメリット](http://tech-blog.rakus.co.jp/entry/20181212/scrum/mob-programming)
のように、ボーナスステージで行うなど、最初は本業から一歩引いたところで行うべきだった気がする。

#####行う仕事を、もっと私にとってコントローラブルな仕事にするべきだった
※ここは先輩諸氏から意見ほしいところ
実際、完全わからん問題にあたって、これ辛いなぁ(ちょっと一人でじっくり考えて答え出したいなぁ)と思うことがあった。ファシリテーター(ここではメンターである僕にあたる)はすでにその答えについて知ってる(またはちょっと考えればわかる)状態であるべきなのかな、とおもった。

#####自分の仕事を減らすべきだった
自分はファシリテートや教育に集中する代わり、持ってる仕事を離すべきだったな、と思った。
または、先に終わらして、個人的ボーナスステージ範囲内でやるべきだったのかな、、？

#####上司の理解を得るべきだった
実際上司はモブプロに対して納得していない状態だったのも問題だったな、と感じた。
上司目線で見れば部下が急に「もぶぷろしたいっす！」とか言ってきて、しかも進捗に遅れを出し始める。
という状態だったのだろう、、、、
上司にも#モブプロはいいぞ  を吹聴し、説得し、納得感もってはじめるべきだったな、、

#####上司をモブプロに参加させるべきだった
これ重要だっただろう気がする。。  @TAKAKING22 さんも[モブプログラミングのよくある誤解](https://takaking22.com/2018/mob-advent/)で「モブプロはチーム全体で常に同期した状態をつくるのが良いこと」とおっしゃっていたので、意思決定者が参加していない時点でなにかおかしいことは確かなのだろう、、、
(TAKAKINGさん、間違ってたらすみません、ご指摘ください)

####良かったこと
良かったこともあげておきます、
#####一応長く働いている私の仕事のやり方、思考順序や、実際の作業風景を後輩たちに見せれたのは彼らにとってプラスだった(よな？そうだよな？頼むぞ)
#####みんなでやるとチーム感あって楽しい

##まとめ

モブプロはいいぞ。
ただ、ボーナスステージにスモールスタートで行うと多分さらにいいぞ。
意思決定者を参加させるといいぞ。
上司が納得してる状態でやるといいぞ。
マイコンならずナノコンをハックした話

のびすけさんに誘っていただいき，IoTLTのアドベントカレンダー19日目を担当しますジョグです！

今年はハッカソンに８本出たのですが（出過ぎ！），そのうちの一つMCPCが主催したナノコンハッカソンについて書きたいと思います！

# What's ナノコン
ナノコンのなのはnanoサイズから起因していて，マイコンよりもさらに小さいという意味合いを込めて命名されたそうです．

東京大学の桜井先生を中心に，正式にはトリリオンノードという名前で開発されています．
[トリリオンノード研究会HP] (https://www.trillion-node.org/)
![scn_jpca2018180511c.jpg](https://qiita-image-store.s3.amazonaws.com/0/193812/9e2d90ec-0771-9775-f257-b1c711f7a3c6.jpeg)

dotstudioの宇宙エンジニア「たくろーどん」くんがtwitterで投稿してめちゃくちゃバズりましたね！

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">今日つかったマイコン、やばやばなほど小さいんだけど、BLEも照度センサ、加速度センサ、温度センサ、スタックしていけばwifiモジュールもつくし、ボタン電池で駆動できて、Arduinoで開発できる。拡張も自由自在。スタックするだけでなく、横につなげてウェアラブルも可能。凄すぎるん😳😳😳 <a href="https://t.co/DGqssgNkCF">pic.twitter.com/DGqssgNkCF</a></p>&mdash; たくろーどん@宇宙エンジニア (@takudooon) <a href="https://twitter.com/takudooon/status/1035474814696222722?ref_src=twsrc%5Etfw">2018年8月31日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 仕組み
Arduinoとは異なり，トリリオンノードはリーフと呼ばれるモジュールを接続することで必要な機能を追加することができます．

さらに，ボタン電池で駆動するのでより簡単にIoTのプロトタイプが作成できます！

## 作ったもの
研究室の同期とチームを組んで出場しました．
トリリオンノードの最大の特徴である，電源がボタン電池で駆動することから簡単に家をスマートハウス化するアプリを作成しました．

![画像](https://ubi-s13.naist.jp/ubistpage/ubiblog/wp-content/uploads/sites/5/2018/11/%E3%83%8A%E3%83%8E%E3%82%B3%E3%83%B33.jpg)

![画像](https://ubi-s13.naist.jp/ubistpage/ubiblog/wp-content/uploads/sites/5/2018/11/%E3%83%8A%E3%83%8E%E3%82%B3%E3%83%B34.png)
家の気温と湿度，二酸化炭素濃度，人感センサの値から自動でエアコンの電源をオンオフします．

僕はハードは全くわからないので，主にグラフの作成とインフラ(heroku)を担当しました（こんなんでIoTブログ書いていいのか！？）

グラフには[chart.js](https://www.chartjs.org/)を使用しました．オプションの設定がやや大変でしたが，グラフを作るにはすごくchart.jsは楽でした！

詳しくは研究室のブログをご覧ください！！
[研究室のブログ](https://ubi-s13.naist.jp/ubistpage/ubiblog/)

# まとめ
今回のハッカソンはハードとソフトの分担がきっちりできたので，研究室メンバーの役割が決まりスムーズに開発が進みました！
市場に回ればよりIoTに関するプロダクトがよりお手軽に作れるようになりそうですね！
それでは良きIoTライフを！！
RailsのDecoraterについて

# Decoratorのもつ役割
MVCモデルにおいて、M（Model）はデータベースにアクセスしてデータを取得、Viewは取得したデータをフロントで表示できるように、Controllではその二者の間の調整を行う。そのModelのもつメソッドは、

①データベースを参照するメソッド
②データベースを参照しないメソッド

の2つに分けることができる。このうち②はViewの役割とも重なり、どちらに入れるのか判断が難しい。さらに、これらを全てModelに入れてしまうと、Modelの中のメソッドが増えてしまう。いわゆる、FatMethod（太ったメソッド）になってしまうのだ。②をModelともViewとも分離してDecoratorとして独立させることでシンプルにすることができる。

# 使用例

`def name
    #{first_name} #{last_name}
 end`
このように、表示のために形を整えるメソッドをDecoratorにまとめ、Modelから分離させる。
React.js 勉強会に参加してきた

## first chapter -概要-
座学式React勉強会に丸一日、勤務時間を利用して参加させて頂いた。
参加した時の知見をメモする。

### この時点での自分のレベル
- 業務ではReact環境でFE業務をしているものの、react-templatesというライブラリを使用しているためほぼHTML感覚でしか書いていない
- 自己勉強で一通り基礎を学んでからすっかり触っていない

##　chapter01 - Reactってどんな時に使うと嬉しいの？ -
webアプリケーションを実装する上で、複雑化していってしまうソースコードをより簡潔に書けるようになる。

ちなみに、javascriptに限らず
良いソースコードとは、「スッキリ、カンタン」なもの。
未来の自分が、他のチームメンバーが、
読んで、理解して、アップデートするまでに掛かる時間が短ければ短いほどNiceCode!

って本に書いてありました。笑
（プリンシパルやリーダブルなど）

##　chapter02 - WebAppとは -
ユーザーが、Webを「問題解決をする場所」とみなす。
WepAppはユーザに寄り添う必要があり、ユーザと対話をしなければいけない

## chapter03 - jQuery vs Reactで todo app -
デザインを得意とするjQueryとReactで同じtodoアプリを作ったらどれくらい違うのかを実際に感じてみる。

===

**01 jQueryのコード**
問題点：
複雑さを感じ、見通しが悪い
どこにどう影響が出るのか、わかりにくく、保守しにくい。

===

**02 MVC設計にしてみる**

```
1. model: アプリケーションデータ、ビジネスルール、ロジック、関数
2. view: グラフや図などの任意の情報表現
3. controller: 入力を受け取りmodelとviewへの命令に変換する

https://ja.wikipedia.org/wiki/Model_View_Controller
```

問題点： controllerが肥大する
ユーザとの対話が全てcontrollerに集まる
手動によってデータとUI、stateが更新されるため
=> 自動対応づけが必要になる

Reactで解決しよう！

## chapter04 - Reactで todo app -

Reactは2つの側面からWebapp開発をカンタンにする

1.UIをパーツとして定義・宣言できる
2.パーツの状態から実画面を生成する

UIパーツをコンポーネント（クラス）として作成できる
=> コンポーネントを1つ作れば、何度でも使いまわせる

state => 値の保存場所
props => 親compから子compへstateや関数などを渡せる仕組み

Reactだとカンタンになる理由は
**stateを更新するとUIが自動的に変化する => jQueryで行なっていたc=>vの逐次更新が不要になるから**

## Last chapter
（進捗）
https://codesandbox.io/s/2p2p6l9yj

**その他得た知見**

```.js
// stateの値を直接変更すると怒られる

// NG
this.setState(
  {todos: this.state.todos.push(todo)}
)

// OK
this.setState(
  {todos: [...this.state.todos, todo]}
)

// ・・・とは↓
const a = [1,2,3]

const b = [...a, 4]

// b -> [1,2,3,4]
```

```.js
// submitで遷移させない例
handleSubmit(e){
  e.stopPropagation()
}
```

#感想
Reactは個人でも触っていたけど、改めて認識の齟齬などを正せた良い機会だった。
あとこういう周りの人と足並み揃えて、始めるのって
周りがもう終わったとか聞こえたりすると
自分て遅いのかなって不安になって焦って余計に手がつかなくなったりする感覚懐かしかった。

本当普段から別に書けない方だけど
通常の1/4くらい知能下がってた。
精神の弱さが一層気になった。
慣れるしかないですね。機会を増やしたいです。
[AWS]インスタンスが異常終了した場合の自動復旧

# はじめに
常駐先で「インスタンスが（OSクラッシュなどで）停止した場合に自動復旧するかどうか（VMwareで言うところのvSphereHAみたいな機能があるか）」という話が出て、どうだったかと気になったので少し調べました。

# 自動復旧の設定（Cloudwatch）
結論を言うと、Cloudwatchでできるようです。

インスタンスの復旧
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-recover.html

インスタンスを停止、終了、再起動、または復旧するアラームを作成する
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/UsingAlarmActions.html

>Amazon CloudWatch アラームへの再起動アクションの追加
>
>Amazon EC2 インスタンスをモニタリングし、自動的に再起動する Amazon CloudWatch アラームを作成できます。再起動アラームアクションは、インスタンスのヘルスチェックが失敗した場合に推奨されます（システムのヘルスチェックが失敗した場合には、復旧アラームアクションが推奨されます）。

さすがに金融なのでやってないことはないと思うのですが、常駐先ではAWSを管理しているのが完全に別部署になっていて、そのあたりの設定がどうなっているかを調べるのが難しい（上にドキュメントもあまり整備されていない）のが難点です。
データフレーム 内の文字を特定の文字数で改行してテキストファイルに保存する方法

データフレームをテキストファイルに保存する際に、特定の文字数で改行して保存したい場合についてです。
今回は以下のようにデータフレームを10文字ずつ改行してテキストファイルに保存する方法です。

##データフレーム（df）


|      |      0 |    1    |
|:-----------------|------------------:|:------------------:|
| 0             |              DATA1 |        ldfksjdlkfjowejfoiwfejowaiejoaiwjefoiajweoijwoji        |
| 1           |            DATA2 |       fsdkfjasoiorejoifewiojoiejfoiwfofiwoejiwoiejweoijwijoe       |




##完成形(test1.txt)
DATA1
ldfksjdlkf
jowejfoiwf
ejowaiejoa
iwjefoiajw
eoijwoji
DATA2
fsdkfjasoi
orejoifewi
ojoiejfoiw
fofiwoejiw
oiejweoijw
ijoe

```sort.py
#Pandasをインポート
import pandas as pd

#データフレーム 
df=pd.DataFrame([['DATA1','ldfksjdlkfjowejfoiwfejowaiejoaiwjefoiajweoijwoji'],
                 ['DATA2','fsdkfjasoiorejoifewiojoiejfoiwfofiwoejiwoiejweoijwijoez']])


#文字数カウンター
count=1
#１０文字ずつ改行してファイル作成する。
f = open('test1.txt','w')
for index in range(len(df)):
    for column in range(len(df.columns)):
        for k in df[column][index]:
            print(k,end='',file=f)
            if(count==10):
                print('',file=f)
                count=1
            else:
                count+=1
        print('',file=f)
        count=1
f.close()
```
ETロボコン EV3way倒立走行の急停止処理について

2018年のコースはL/R共にゴール直後に急カーブがあって苦慮したチームが多かったと思います。
<img width="165" alt="goal.png" src="https://qiita-image-store.s3.amazonaws.com/0/123504/d4325504-2e19-cf81-9c61-b46985e7e35e.png">



競技を見た範囲では以下のパターンが見られました。

1. 最速で通過して減速しつつラインを外れてからコース復帰
2. ゴール手前で減速
3. 最速で通過して倒立とラインとレースを維持

「1.ラインを外れてからコース復帰」はコースに復帰できないリスクが高く、実際に戻れないチームも見られました。
「2.ゴール手前で減速」はタイムを競っているのにとても残念です。

東海地区大会ではLコースのゴール計測を担当していましたが、ゴールゲート寸前で不意に減速するので、
（来たぞ、来たぞ、来たぞ、、おお！おおぉぉぅぅうぉぉい！）となってしまいましたｗ

# 倒立走行を維持した急減速の方法
3.の倒立とライントレースを維持して急減速する方法について解説します。

倒立振子APIは現在位置の維持をフィードバック制御で行っています。
前進・後退処理は、forward値によって現在居るべき位置の更新をすることによって実現しています。
倒立振子APIのモデルやETRC_BalancePostar_masked.pdfの **theta** が含まれている変数の辺りが該当します。

倒立制御の設計思想は、 **走行体がバランスしている近傍のみを考慮** ですので、急加速・急停止はできません。
forward値は強いローパスフィルター(LPF)によって穏やかに走行体位置へ反映されていきます。

ではどうするのか？2018年モデルの見た範囲では見つけられなかったのですが、過去モデルの立体難所攻略にあるようにジャイロオフセットを使用します。

forward値はどうがんばっても強いLPFによって反応してくれないのですが、倒立振子APIの仕事は倒立維持が最優先ですので、ジャイロオフセットには機敏に反応してくれます。
本当は安定倒立しているところに **倒れそうだよ！** とウソの情報を送り込むイメージになります。

2018年プライマリークラスのゴール処理は次のように作りました。
<img width="657" alt="timechart.png" src="https://qiita-image-store.s3.amazonaws.com/0/123504/560e0226-ba2b-c0d6-3947-a15de8e10a58.png">

一定時間ジャイロオフセットを変更する処理はジャイロセンサーのクラスに持たせているので、
オフセット量と時間を指定すれば、指定時間経過後に自動でオフセットを解除してくれます。
<img width="117" alt="cgyro.png" src="https://qiita-image-store.s3.amazonaws.com/0/123504/ab6604a2-65a9-18b6-7ac4-25a8742a32fa.png">

実際に走行確認を行った様子です。
ETロボコン2018 EV3way-ET開発機によるDP-Lコース攻略
[![ETロボコン2018 EV3way-ET開発機によるDP-Lコース攻略](http://img.youtube.com/vi/vuMUGdKKv50/0.jpg)](http://www.youtube.com/watch?v=vuMUGdKKv50)

# 最後に
ジャイロオフセットは倒立を維持するために機敏に反応してくれますが、前進・後退させるのはあくまでもforwardです。このバランスが崩れると結果的に破綻します。現在居るべき位置の変動を考慮して制御してあげてください。
メモ：「３０日でできる！OS自作入門 」3日目

IPL - Initial Program Loader （初期プログラムローダー）

MBRから次のセクタを読む


    MOV AX, 0x820
    MOV ES, AX ; Buffer
    MOV CH, 0 ; Cylinder 0
    MOV DH, 0 ; Head 0
    MOV CL, 2 ; Sector 0
    
    MOV AH, 2 ; Disk Read, 3 write, 4 verify, 0x0c seek
    MOV AL, 1 ; sector count 1
    MOV BX, 0
    MOV DL, 0 ; A drive
    INT 0x13 ; Disk BIOS Call
    JC error

JC = Jump if carry
ES:BX = ES x 16 + BX

Retry 処理追加


    MOV SI, 0
    retry:
      ....
      ADD SI, 1
      CMP SI, 5
      JAE error ; 5回以上はエラー
      MOV AH, 0
      MOV DL, 0
      INT 0x13
      JMP retry

18 セクタ読む


    readloop:
    ...
    JNC next ; 読み取りOKなら、次のセクタ
    ...
    next:
      MOV AX, ES
      ADD AX, 0x200 ; 1セクタ 512 バイト
      MOV ES, AX ; ES += 512
      ADD CL, 1
      CMP CL, 18
      JBE readloop

ヘッド2つ分とシリンダ10個分読む


    CYLS EQU 10
    
    ....
    JBE readloop
    MOV CL, 1
    ADD DH, 1
    CMP DH, 2
    JB readloop
    MOV DH, 0
    ADD CH, 1
    CMP CH, CYLS
    JB readloop

harib00e の ipl.nas と haribote.nas で haribote.imgを作成

- 0x2600 で HARIBOTESYS というファイル名
- 0x4200 で ファイルの中身

harib00f

- ORG 0xc200 を指定して、 IPL から 0xc200 に JMP

harib00g - Video Mode

    MOV AL, 0x13 ; VGA, 320x200x8bit
    MOV AH, 0
    INT 0x10

これで真っ黒な画面を出すことが出来ました

    qemu-system-i386 -drive format=raw,file=haribote.img,index=0,if=floppy

0x13 と 0x6a で qemu の画面サイズが変わることを確認

32bit mode


- 32bit モードでは BIOSは利用できない（初めて知った）


    VMODE EQU 0xff2
    SCRNX EQU 0xff4
    SCRNY EQU 0xff6
    VRAM EQU 0xff8
    
    MOV BYTE [VMODE], 8
    MOV WORD [SCRNX], 320
    MOV WORD [SCRNY], 200
    MOV DWORD [VRAM], 0xa0000

LED の状態を取得

    LEDS EQU 0xff1
    
    MOV AH, 2
    INT 0x16
    MOV [LEDS], AL

C言語導入


- harib00i

cc1 → gocc1plus (c to gas compiler)
gas2nask (gas to nas compiler)
nask で (nas から obj)
obj2bim (obj からbim) 

以下のエラーで遭遇

    Warning : can't link _HariMain

bootpack.nas の __Z8HariMainv を _HariMain に手動で修正ｗ

bim2hrb (bim to hrb)

copy /B asmhead.bin+bootpack.hrb haribote.sys を
cat asmhead.bin bootpack.hrb > haribote.sys に修正

qemuでBootできた！


- harib00j は io_hlt という関数をアセンブリで書いて C から呼び出すだけ

io_hlt も manglingされてたので手動で修正

asmhead.nas にもいろいろ実装されてるがあまりみれていない。
UnityのParticleSystemを使って火の弾みたいなものを発射してみる

#はじめに
この記事は [SLP KBIT Advent Calendar 2018](https://qiita.com/advent-calendar/2018/slp_kbit) の19日目の記事です。

ふとUnityのParticleSystemだけで炎の弾とかって作れるのかなって思い、試しに作ってみたら、わりとそれっぽく作れました。
#今回作ったもの
こんな感じの炎の弾を作りました。
![fireball](http://feniaclicker.starfree.jp/9r1dy-wr4xs.gif)
[ここ](http://feniaclicker.starfree.jp/fireball/)で実際に動かすことができます。
マウスで弾を撃ちたいところをクリックすると、カメラからクリックしたところに向けて、弾が発射されます。
発射された弾が、的か鳥にぶつかると、爆発します。
右上のワイプで、横から見た映像が流れるようにしているので、爆発などの様子を観察できます。

やってることはこんな感じです。
![説明用.png](https://qiita-image-store.s3.amazonaws.com/0/214091/4cfaa974-5c4f-fbb6-4beb-f2c889935630.png)
弾は、透明な球体オブジェクトに、コンポーネントとして、ParticleSystemを持たせています。
弾が指定したオブジェクト(今回は的と鳥)に衝突すると、弾は消滅します。それと同時に、衝突したオブジェクト側で、爆発エフェクト用のパーティクルが生成されます。
#弾のパーティクル
弾本体のParticleSystemの設定で、炎を表現する上で必要そうな項目をいくつか紹介します。
###Shape
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/214091/221d85e1-f33e-77e3-0b24-f1b04611bac3.png)
今回の例では、Coneを選択しました。Coneの他にも、Sphereとか選択してもいい感じになります。
###Size over Lifetime
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/214091/f4300723-15cc-92a0-564f-3618062bf4c4.png)
時間経過での、粒子の大きさを制御するところです。時間が経つにつれ、だんだん小さくなるようにしてます。
###Color over Lifetime
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/214091/c7e9ab97-4524-e521-56a1-584b31dd8940.png)
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/214091/22e42fd2-d3f5-86b5-ce85-bc643eb94648.png)
時間経過での色の変化を制御するところです。炎は、先端になるほど明るい色になるので、それを意識しながら設定してます。終わり際の色は、透明度を高くすると、粒子が綺麗に消えてくれます。なお、色の色相を変えると、青い炎とかが作れちゃいます。
###Renderer
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/214091/9c987567-5902-d37e-da1b-bbd24d2dc6c7.png)
Materialは、StandardAssetに入っているParticleFirecloudを選択しました。これについては、お好みで選択してください。

これらの他にも、**Noise**や**Lights**とかを設定すると、いい感じになります。
#爆発エフェクトのパーティクル
爆発を表現する上で必要そうな項目をいくつか紹介します。基本的には、弾のパーティクルとほぼ同じです。
###Shape
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/214091/021b02aa-4a87-a594-6570-bb17e2c181b9.png)
爆発は、全方位に粒子が飛び出るイメージなので、ShapeはSphereを選択しました。
###Trails
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/214091/6a0a7177-cc19-c418-0e60-ade7814d8ebe.png)
粒子の軌跡を描画します。花火のような効果を出そうと思い、設定しました。なお、Trailsの描画には、**Renders**でTrail Materialを設定する必要があります。
#爆発エフェクトの生成
以下のコードを、的と鳥のコンポーネントに入れてます。

```Target.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Target : MonoBehaviour {
    public GameObject ExploadObj;
	void OnCollisionEnter(Collision other)
	{
	    if (other.gameObject.tag == "Ball")
        {
            Instantiate (ExploadObj, this.gameObject.transform.position, Quaternion.identity);
        }
	}
}
```
爆発のパーティクルシステムを`ExploadObj`に入れて、指定したタグのオブジェクト(ここでは`Ball`)が接触すると、`ExploadObj`が生成されるといった仕組みです。
#最後に
ParticleSystemを活用すれば、割と簡単に、炎の弾を作ることができました。~~これで思いっきり焼き鳥とか作れるな！~~
時間に余裕があれば、氷とか雷とかのエフェクトも作ってみたいです。
#参考
Unityマニュアル - パーティクルシステム（Shuriken）
https://docs.unity3d.com/jp/460/Manual/class-ParticleSystem.html
LemonteaのUnity部屋 - Unity パーティクル(2) 炎のエフェクト　松明風と某悪魔風
https://www.sawalemontea.com/entry/2017/09/14/220000
【超・初心者向け】コマンドでGitを操作する

# はじめに
Gitで管理する際にSource Treeを用いて操作していたのですが、コマンドでの操作を目にする機会も増えてきたので、自分の備忘録としての意味合いを込めて残します。もし、コマンドでのGit操作をしたことのない方への参考になるならば幸いです。

#テスト用のリポジトリを用意する
いきなり大事なデータが入っているリポジトリを使うのは危険なのでテスト用のリポジトリを用意します。
Bitbucketなどでテスト用のリポジトリを用意するといいでしょう。

#コマンドで操作するための準備
１． Bitbucketなどのサイトでテスト用のリポジトリを用意する
２． コマンドでのGitの動きを確認するためSource TreeなどのGUIをインストールする
３． WindowsならGit Bash、MacならデフォルトのターミナルやiTermなどをインストールする

#ターミナルでも使うLinuxコマンド
テスト用のリポジトリを用意したところで、さっそくGitをいじりたいところですが、その前にターミナル等で使うLinuxコマンドについて簡単におさえておきます。
上記のGit Bashやターミナル等を開いて実際に動かしてみます。
※コード内の[ ]はディレクトリ名やファイル名を見やすくするために書いているもので、実際に記述するときは不要です。

```:#新しくディレクトリを作成する
$mkdir [ディレクトリ名]
```
```:#ファイルやディレクトリの情報を表示する
$ls
```
```:#作業ディレクトリを移動する
$cd [ディレクトリ名]
```
```:#ファイルを移動する()
$mv [移動するファイル] [移動先ディレクトリ]
```
```:#ファイルを作成する
$touch [ファイル名]
```
```:#ファイルの中に記述する
$echo '[ファイルの中に記述する内容]' > [書き込む対象のファイル名]
```
```:#ファイルの中身を確認する
$cat [ファイル名]
```
```:#ファイルを削除する
$rm [ファイル名]
```

#リモートリポジトリをクローンする
簡単なコマンドを確認したところで本題に入っていきます。
まずはじめにテストするためのリポジトリを先ほどのBitbucketに用意します。
リポジトリが用意できたら、そのリポジトリをローカル環境にクローンしてきます。
クローンする際に作業ディレクトリを、リポジトリを保存したいディレクトリに移動しておいてください。

```ｇｉｔ:clone
$git clone 'リモートリポジトリのURL'
```
エクスプローラーやｆｉｎｄｅｒで保存したディレクトリを確認してみます。
クローンしてきたフォルダができていればクローン完了です。

#ブランチを作成する
リモートリポジトリをクローンしてきたら、作業用のブランチを作成します。

```git:branch
$git branch [ブランチ名]
```
これでブランチを作成できました。しかし、今はクローンしてきたリポジトリのmasterブランチのままです。
仮にこの状態でpushしてしまうとmasterブランチにそのままpushしてしまうことになります。これではGitの利点を生かすことができません。
ですから、先ほど作成したブランチにチェックアウトして作業用リポジトリに移動します。

```git:checkout
$git checkout [ブランチ名]
```
これで先ほど作成した作業用ブランチに移動することができました。
ちなみに下記のコマンドでブランチの一覧を確認することができます。

```:ブランチ一覧
$git branch
```

何もファイルがないままだと、いろんなＧｉｔのコマンドを試せないので、いくつかテスト用のファイルを作ります。
先ほどのLinuxコマンドを使っていくつかチェックアウトしたブランチにファイルを作成します。

#リモートリポジトリにコミットする
いくつかファイルを作成したら、コミットしていきます。

まずは、Source Treeで言うところのステージに上げる作業です。

```git:add
$git add [ステージに上げる対象のファイル名]
```
ステージに上げることができたら、今度はコミットします。

```git:commit
$git commit
```
この後、コミットコメントを入力する画面に遷移します。
viで入力することになりますので、「viって何？」って方は下のコマンドでコミットする際に併せてコミットコメントも書いてしまいましょう。

```git:commit(コメント付き)
$git commit -m 'コミットコメント内容'
```

#リモートリポジトリにプッシュする
コミットまでできたら、あとはリモートリポジトリにプッシュします。

```:push
$git push　［ローカルリポジトリ名（originであることが多い）］ ［リモートリポジトリ名］
```
#masterブランチにマージする
最後に先ほどの作業用ブランチをmasterブランチにマージします。
まずmasterブランチにチェックアウトします。
その後以下のコマンドで先ほどの作業用ブランチをmergeします。

```:merge
$git merge [マージされる対象のブランチ（作業ブランチなど）]
```
マージまでできたら、Source Treeなどでどうなったか確認してみます。
ちゃんとマージされていることが確認できれば簡単な作業は一通り実践できました。

#最後に
コマンドでGitを操作する手順を書いてきましたが、実際は今回紹介しなかったものがいくつもあります。今回はオプションをなるべく省いて、簡単なコマンドでの作業を中心に書いてきましたので、ベテランの方々からすると手間がかかっていると感じられる部分も多々あったと思います。初心者の方は、いきなりコマンドでのGit操作に抵抗があると思いますので、そういった方々への参考になれば幸いです。
keystroke injection toolと戯れてみた

## 概要
Sansan Advent Calendar 2018 の19日目の記事です。

SansanでCSIRTに所属している、新卒セキュリティエンジニアです。
最近購入した「USB Rubber Ducky」について書かせていただきます。
このUSBデバイスはキーストロークインジェクションツールです。USBをPCに接続すると、通常のキーボードと誤認させ不正な入力を実行することができます。
具体的にはバックドアを仕掛けたり中の情報を盗んだりすることができます。
今回はこれを利用し簡単な文字列の表示を行います。


↓これがUSB Rubber Duckyです
![1545146226158.jpg](https://qiita-image-store.s3.amazonaws.com/0/328443/9d8eb319-0256-9d63-71eb-d58d4dc1bee3.jpeg)

## 手順

1. USBの中からSDを取り出しPCに入れます
![1545146235152.jpg](https://qiita-image-store.s3.amazonaws.com/0/328443/168665d8-a473-2161-648d-b326d704a34e.jpeg)
2. [ducktoolkit](https://ducktoolkit.com/)
を利用しプログラムを書きバイナリファイルにコンパイルします
3. バイナリファイルをSDに書き込み、SDをPCから取り出します
4. USBにSDに入れ組み上げます
5. 攻撃対象PCにUSBを接続します

## 書き込んだプログラム
```
DELAY 3000
GUI r
DELAY 500
STRING notepad
DELAY 500
ENTER
DELAY 750
STRING I Hackd this PC!! Think you watch Sansan advent calendrier 2018 !!
ENTER
```

## 実行結果
以下のような文字列が表示されました！よいクリスマスを！

![スケッチ (4).png](https://qiita-image-store.s3.amazonaws.com/0/328443/560506b7-ed3f-3010-c14d-b87c9c1f7570.png)
Node-REDのフローをチームで共有するときに心がけるべきこと


Node-REDのフローの共有で陥りがちなのが、至る所のノードにURLや固有IDなどの「マジックナンバー」、「マジックストリング」が散らばってしまい、どこを直せばいいのかわからなくなるということがあります:sweat_drops:

Node-REDのフローを業務内で活用すると、プログラミングスキルがまちまちな現場であっても、視覚的にそのフロープログラミング中で何が行われてるか確認できるというメリットがあると思います:sunny:
Node.jsがわからない人、むしろプログラミングがわからない人でも、ノードの中の設定値を少し変えてみるという操作はできるはずです。


## initフローを作成する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132212/0faa749b-c1b1-62bb-076b-1fd22ca47d1a.png)
このフローは数分周期で、http POSTをするフローです。
POSTするbodyを変更したり、中でidを変えたりして、その時々でhttp requestなどの内容が変わります。
複数のフローに変更箇所がまたがってしまうと、変更に抜けが出てしまうことがあります。
なるべく、人がいじるところは少なくするべきですね。

### 起動時にフローを走らせる

「各種設定、初期化フロー」で示しているフローはデプロイやnode-redが起動したタイミングで一度だけ起動するようになっています。
injectノードの設定を下記のように設定しましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132212/2b9b4656-755b-8037-fc3c-5036292e0a2c.png)

### 設定するノードを１つにまとめる

チームで共有するときには、[config]のノードだけ設定を変更するようにアナウンスしておきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132212/7ceb7e2d-058f-9607-2c77-148b9b721b6d.png)


このようにflow変数（またはglobal変数）に設定値を代入しています。

functionノードを用いるときは

```js:functionノード
var hoge = {};
hoge['authorization'] = 'dummyheaders';

flow.set("hoge",headers);
```

このようにすると、`flow.headers`に値を代入できます。（flowをglobalにすればglobal contextに保存できます。）
なるべく頻繁にいじるノードは少なくしたいので、一か所にまとめるように心がけましょう。

## 設定値の使い方

changeノードで、flow contextの値をmsgオブジェクトに代入したり、functionノードで取得しましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132212/273d1135-ceb8-d7f7-afd0-4a5472d32311.png)

2番目の例のように`$flowContext(string)`のJsonata関数も用意されているので、もっと凝った書き方もできると思います。

functionで取得するときは`flow.get("device")`のように指定してflow contextを取得できます。


## まとめ
チームで開発ではなく、Node-REDフローを活用する際に気を付けることを書きました。
いろんなノードを適宜いじるようにすると絶対ヒューマンエラーが出るので、なるべく手を入れる箇所は少なくなるようにしましょう。
Ninjaの速さを体感するともはやMakeには戻れない

# はじめに

[Ninja](https://ninja-build.org/)というビルドシステムがあるのは知っていたのですが今まで使っていませんでした。
先日、研究で使用しているライブラリを最新版にアップデートする時、試しにMakeの代わりにNinjaを使ってみたら爆速で、現在はデフォルトでNinjaを使用するようになりました。[VTKライブラリ](https://www.vtk.org/)をビルドするとき、__Makeだと少なくとも10分以上掛かっていたのがNinjaでは1分強だった__ので、これだけスピードが違うともうMakeを使う理由がないですね。特に大きなライブラリをビルドするとき顕著に差が出ると感じています。

# 使い方

[バイナリ](https://ninja-build.org/)をダウンロードしローカルディレクトリに置いてパスを通すか、[パッケージマネージャを通してインストール](https://github.com/ninja-build/ninja/wiki/Pre-built-Ninja-packages)します。

CMakeを使っていれば、簡単にMakeとNinjaを切り替えられます。
以下のように`-GNinja`を追加してconfigureしてください。

```terminal:Makeの場合
mkdir build
cd build
cmake ..
make && make install
```

```terminal:Ninjaの場合
mkdir build
cd build
cmake -GNinja ..
ninja && ninja install
```
AngularDartで簡単なポケモン図鑑を作ってみた

この記事は[全部俺 Advent Calendar 2018](https://adventar.org/calendars/3702)の18日目の記事です。

# 作ったもの
捕まえたポケモンのチェックリストを作成しました。
[pokeapi](https://pokeapi.co/)を使用して、REST API経由でデータを取得しています。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="in" dir="ltr">AngularDart Pokemon <a href="https://t.co/U8PuJGtgHL">pic.twitter.com/U8PuJGtgHL</a></p>&mdash; tez (@te22eret) <a href="https://twitter.com/te22eret/status/1075043324048932864?ref_src=twsrc%5Etfw">2018年12月18日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


**実際のサイトは[こちら](https://angulardart-pokemon.netlify.com/)からどうぞ**

ソースコードは[ここ](https://github.com/taishi-h/angulardart-pokemon)に置いてあります。
この記事では、ソースコードについて詳細を記載したりはしません。
Flutterを結構触っている人間として、AngularDartを触ってみた感想と相違点を記載します。
同じような方で、AngularDartに触ろうかな？と考えている方の参考になれば幸いです。

## AngularDartとはなにか？
打倒JavaScriptを謳っていた時代からの流れをくむDartのWeb Application Framework。
ただし、途中で方向転換したため、今のAngularDartは最終的にJavaScriptを出力します。AltJSの一種という言い方もできますね。
マーケットを奪いそうな一番身近な存在はFlutterのHummingbird（Flutterのコンパイル対象にWebを含めようとするプロジェクト。Flutter Live2018で発表されました。）と言えそうですが、まだHummingbirdは一般利用可能ではなく、ソースコードも公開されていないため世界観の近そうなAngularDartに触ってみることにしました。

## 学んだこと/要素技術
- AngularDartにおけるDI
- AngularDartの独自HTMLタグと独自HTML記法（`*ngIf="xxxlist.isNotEmpty"`など）
- Component/Service/プレーンDartクラスの責任分割とその設計

## 実際に使ってみてどうだったか
正直なところ、Flutterに慣れていても学習コストはかなり高めだと思います。。
（おそらくAngularJSに慣れている方はむしろ書きやすいのだと思いますが、）Flutterとは全然違う書き方をしなければならないところが多くて辛かったです。
（REST APIを使用するために、サービスのエンドポイントとなる`main.dart`に`BrowserClient`を`@GenerateInjector`として注入してあげないといけなかったり、`await/async`の使い方に癖があったり、`material-checkbox`などの独自のHTMLタグがあったり。。）
結局のところ、Flutterとは違ってhtmlやcssも（一部独自タグを使いつつ）普通に書く必要があり、JavaScriptを使うのと何が違うの？何が嬉しいの？と言われるとかなり困ってしまいます。JavaScriptやTypeScriptよりは固い印象を受けるとはいえ、Dartも結局は動的型付けなので型によるメリットも薄いですしね。。
BLoCパターンを使ってすでにFlutterアプリを作成している場合は、ビジネスロジックレイヤーを共通化できるのが一番大きな利点かもしれません。

ただし、FlutterのHummingbirdが一般利用可能になった場合、Flutterに慣れている方はそちらを使用した方が良いと思います。
[この記事](https://medium.com/flutter-io/hummingbird-building-flutter-for-the-web-e687c2a023a8)によると、HummingbirdではCSSを直接書くことを極力避けるように設計されているようなので、ネイティブアプリを書くのと同じように記載できるのでは？と期待しています。

総じて、Hummingbirdへの移行期間中にAngularDartを併用することもあるかもしれない、くらいの感覚だと思いました。
(Flutter + AngularDartでBLoCパターンで作成 → Flutterだけで運用に徐々に切り替えていくイメージ。)
個人的にはもう少し触ってみたいものの、今後どうなっていくかは未知数と言えると思います。
ただし、さすがGoogleというべきか、公式ドキュメントの充実っぷりはすごいので、AngularDartに慣れるとまた違った感想を抱くかもしれません。

同意していただける方・違った意見をお持ちの方のご意見・ご指摘は大歓迎です！お気軽にコメント下さいm(_ _)m

## 参考
[pokeapi](https://pokeapi.co/)
[Dart公式サンプル](https://webdev.dartlang.org/angular/guide/server-communication#search-wikipedia)
構造化束縛before-afrer

#構造化束縛における適用前、適用後
C++17において、構造化束縛が追加されました。
とても便利な機能なので是非利用したい。
私としては、忘備録として、この記事を書く。

#before
```
auto human_bind(){
    struct human{std::string name_; int years_; bool ok_;}
    return human{"elen",21,true};
}

auto a = human();
   std::cout<<a.name_<<","<<a.years_<<","<<a.ok_<<std::endl;
```

#after
```
#include<iostream>
#include <tuple>

int main(){
   auto human = {
       std::make_tuple("elen",21,true),
       std::make_tuple("eva",1,false)
   };
    
   for(auto&& [name,years,ok]:human){
      std::cout<<name<<","<<years<<","<<ok<<std::endl;
   }
}
```

<font color="Red">elen,21,1</font>
<font color="Red">eva,1,0</font>

#以上
C++20待ち遠しい・・・。。
IPv6とlinuxでネットを快適にしてみた 

この記事は[琉大情報工学科（知能情報コース) Advent Calendar 2018](https://adventar.org/calendars/3436)の18日目の記事です。
## はじめに

事の発端は5月の中旬...
ISP（So-net）のIPv6接続先が変わったことにより、今まで受けていたIPv6の恩恵を受けることが出来なくなりました。[^1]

IPv6アドレスは降ってきてるものの接続が出来ないので、IPv4でネットにアクセスしている模様でした。
そのため、回線速度がひどい時に数百Kbpsまで落ち込むことがありました。
光電話を使っていない自分が再びIPv6の恩恵を受けるには月額400円ほど払って機器をレンタルをしなければいけないようでした。

調べてみるとそれまで使っていたDual-Stack Lite方式(DS-Lite、RFC6333)をlinuxのトンネル機能を使って疑似的に再現している人がいたので試してみました。
[さくらのVPS で IPv4 over IPv6ルータの構築](https://www.slideshare.net/tomocha/vps-80212721)

## 必要なもの
- IPv4とIPv6のグローバルアドレスを持ったlinuxサーバ
- IPv6アドレスが降ってくる回線
- Yamaha製ルータ

linuxサーバのOSは参考スライドではCentOSを使っていましたが、ubuntu(16.04 LTS)でも出来たので、お好みのモノでいいかなと思います。
(恐らくiptablesが使えるディストリビューションなら大丈夫だと思います)
ルータは参考スライドではYamaha製のRTX1200を使っていましたが、自分は自宅で使っているYamaha製のRTX810を使用しました。
(cisco製ルータとlinuxをルータにしている場合は試してないので出来るかどうかはわかりません。)

## 実際に設定
#### linuxサーバにトンネルを設定
まず最初に`modprobe ip6_tunnel`でIPv6においてのトンネル機能を有効にする。

以下のコマンドを実行してトンネルを設定。

```
ip -6 tunnel add tun0 mode ip4ip6 remote [ルータのIPv6アドレス] local [サーバのIPv6アドレス]
```
コマンド中の[ルータのIPv6アドレス]と[サーバのIPv6アドレス]は実際の値に置き換えてください。

以下のコマンドを実行して設定したトンネルを有効にする。

```
ip link set tun0 up
ip addr add 192.0.0.1/30 dev tun0
```

以下のコマンドを実行して、フォワーディングに必要なカーネルパラメータを変更。

```
sysctl -w net.ipv4.conf.all.forwarding=1
sysctl -w net.ipv4.conf.ens3.rp_filter=0
sysctl -w net.ipv4.conf.tun0.rp_filter=0
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv6.conf.default.forwarding=1
sysctl -w net.ipv6.conf.all.forwarding=1
sysctl -w net.nf_conntrack_max=65635
```
ens3は実際のNICのデバイス名に変えてください。

以下のコマンドを実行してiptablesを設定。

```
iptables -t nat -F
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -A FORWARD -i tan0 -j ACCEPT
```

以下のコマンドを実行して、ルーティングの設定をする。

```
route add -net 10.0.0.0/8 dev tun0
route add -net 192.168.0.0/16 dev tun0
route add -net 172.16.0.0/12 dev tun0
```

#### ルータの設定
Yamahaルータにtelnetやsshでアクセスして、`administrator`コマンドで管理者モードになる。
IPv6の設定をした後、`tunnel select`コマンドで設定したいトンネルを選択し、以下のコマンドを実行する。

```
tunnel encapsulation ipip
 tunnel endpoint address [linuxサーバのIPv6アドレス]
 ip tunnel address 192.0.0.2
 ip tunnel remote address 192.0.0.1
 ip tunnel tcp mss limit auto
```
`ip tunnel address 192.0.0.2`を実行するとlinuxサーバーから自宅内にアクセスすることが出来る。

`ip route default gateway [設定をしたトンネル]`を実行して、デフォルトゲートウェイを設定をしたトンネルにする。

#### 変更の確認
tracebackしてみたり、IPアドレスが確認出来るサイトにアクセスしてIPv4アドレスがlinuxサーバのIPv4アドレスに変わっていること確認する。

## 設定してみて
数百Kbpsしか出ていなかった時間帯に安定して2〜3Mbps程度の速度が出るようになりました。

機器レンタル代に月額400円払うなら、ほぼ同じ額のVPSにお金を使った方がいいのではと個人的には思いました。(色々できますし)
ubuntu 18.04LTSで上手く出来なかったので、時間を見つけて挑戦してみようかなと思っています。
予期しなかったメリットとデメリットが見つかったので、書いておこうと思います。

- 予期しなかったメリット
    - radikoの位置判定が東京になった。(文化放送の声優ラジオ好きなので、文化放送が聞ける様になるだけで感無量)
- 予期しなかったデメリット
    - 一部サイトに弾かれる(ビッ○カメラやarch○inuxなど) 

## 最後に
明日(というか今日)の担当は@akio_rさんです!!

AWSのEC2でも同じ環境を構築しようと挑戦しているのですが、上手くいかないので誰か助けて...(安く済ませたい...)
[^1]: https://villas-windmill.blog.so-net.ne.jp/2018-03-17
riot.jsについて

新たに知り合ったフレームワーク「riot.js」について!
#Riot.jsとは
Riot.jsはJavascriptの軽量UIライブラリです。
カスタムタグにHTML、JS、CSSなどを記述して、それらを組み合わせてページを作成する事が出来ます。
通常のjavascriptと同じように、```<script>```タグで読み出します。

Riot.jsを使うためにはnode.jsなど前準備が必要です。

#基本形
```
<html>
<head>
<meta charset="utf-8">
<script src='https://cdnjs.cloudflare.com/ajax/libs/riot/2.3.18/riot+compiler.js'></script>
<title>riot.js test</title>
</head>
<body>
	<!-- タグを展開する場所 -->
	<item name='Intro' content='おはよう' ></item>
	
	<!-- タグの定義 -->
	<script type="riot/tag">
	<item>
		<h1>{name}</h1>
		<p>{content}</p>

		this.name = opts.name;
        this.content = opts.content;
    </item>
	</script>

	<script>
      	// マウント
      	riot.mount('*');
    </script>

</body>
</html>
```
アクセスすると、下記のように表示されます。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/321029/ac8d5542-1da6-d66b-441f-cb55b1784377.png)
html bodyでタグが追加されるを確認できました。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/321029/a6da1224-c6d6-eb22-c8d2-4a267c0689cd.png)

#Each
```
<body>
    <test></test>
    <script type="riot/tag">
    <test>
    	<div each='{item_list}'>
            <h3>{name}</h1>
            <p>{content}</p>
    	</div>
        
    	this.item_list = [
            {name: '日本語', content: 'おはよう'},
            {name: 'English', content: 'Hello'},
    	]
    </test>
    </script>
    <script>
    	riot.mount('*');
    </script>
</body>
</html>
```
アクセスすると、下記のように表示されます。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/321029/58143366-dd9d-2fac-9e69-e982557f146e.png)
html bodyでタグが追加されるを確認できました。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/321029/882ddd56-2e9c-6f73-00ad-fb2b206e4d44.png)

#イベント
ボタンがクリックされたときに何らかの処理を行いたい場合は、onclickに実行したい関数を設定します!

```
<body>
    <test></test>
    <script type="riot/tag">
        <test>
    	    <button onclick='{clickEvent}'>click</button>
    	</test>
        this.clickEvent= function() {
            alert("CLICK!!!!");
        }
    </script>
    <script>
        riot.mount('*');
    </script>
</body>
```

#まとめ
初めて使う前に必要な準備が面倒ですが,使ってみると手軽で個人的に気に入りますー！

今日の記事はここまでにします！
AzureSQLDatabase　動的データマスクのルールはどうなってる？(メールアドレス編)

##動的データマスクはどの画面から使用できる？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/161516/6c8458e5-39b3-2986-7098-01918ffd217e.png)

##ドキュメントの確認：動的データマスクとは？
引用：[SQL Database の動的データ マスク - Microsoft](https://docs.microsoft.com/ja-jp/azure/sql-database/sql-database-dynamic-data-masking-get-started)

| 電子メール  　　　　　　　　　　     |電子メール アドレスの形式でプレフィックスとして定数文字列を使用して、最初の文字を公開し、ドメインを XXX.com に置き換えるマスク方法。<br><br>aXX@XXXX.com|
|:----------------------------|:-----------------|


##実際に試してみる

```sql:データ取得用SQL.sql
SELECT
  *
FROM
  [****].[****] 
WHERE
  [Id] IN ('4','5')
ORDER BY
  [Id]
```

[マスクなしユーザで閲覧した場合(元々のメールアドレス)]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/161516/a725081f-4867-152c-1b7f-98dc255ad525.png)

[マスクありユーザで閲覧した場合(ルール通りマスクされる)]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/161516/253f0e5b-442f-9174-834a-eee789a7902e.png)

###疑問：データが壊れているのでは？

マスクされていても、元のデータは保持されます。
マスクされているユーザも、検索により元のデータを類推することは可能です。

```sql:マスキング確認.sql
SELECT
  *
FROM
  [****].[****] 
WHERE
  [Text] LIKE ('Koaya.Junya%')
ORDER BY
  [Id]
```
[マスクありユーザ(ルール通りマスクされるが、クエリは通る)]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/161516/2636de53-dfa2-f504-7837-71e6566fbd14.png)