OmniAICreator/Qiita-1.07M huggingface dataset:
vscodeに登録しているgoスニペット

[aptpod Advent Calendar 2018](https://qiita.com/advent-calendar/2018/aptpod) 6日目の記事です。
せっかく5日目まで続いているので書くことにしました。
今日決めたので小ネタで申し訳ないです。

## 対象

- vscodeでgo書いてる人でスニペットの存在をしらない人
- そもそもvscodeのスニペット機能知らない人
- これからvscodeで何かプログラミング言語やりはじめるよーな人


## 本題

vscodeにはユーザスニペットの機能があります

![スクリーンショット 2018-12-05 21.01.44.png](https://qiita-image-store.s3.amazonaws.com/0/47896/46c15591-cfa2-d6d8-a301-1250eb05bd54.png)

例えば、goであればgo.jsonのようなファイルが用意されています

![スクリーンショット 2018-12-05 21.01.54.png](https://qiita-image-store.s3.amazonaws.com/0/47896/1d186f53-fbb4-18e2-e0d2-2f844b0ea388.png)

ここに自分がショートカットで呼び出したいコードとそれに対応するキー入力を書いておけば下記のように
スムーズにコードが書けるようになります。(気持ちいい)

![ctx.gif](https://qiita-image-store.s3.amazonaws.com/0/47896/89429fcb-cceb-a372-3d04-ead15669b6aa.gif)

上記は、go使いなら誰しも一回は書くであろうcontextのスニペットです。
こんな風にgo.jsonに書いてあげます。

```go.json
{
    "context": {
        "prefix": "ctx",
	    "body": [
		"ctx, cancel := context.WithCancel(context.Background())"
	    ]
    }
}
```

## その他便利なショートカット

### デバッグ

一番良く使ってます。。

![fff.gif](https://qiita-image-store.s3.amazonaws.com/0/47896/1a746dbe-cf64-772d-5f89-2c14725b1ee7.gif)

```go.json
{
    "Print to console": {
	"prefix": "fff",
		"body": [
			"fmt.Printf(\"%#v\\n\", $1)"
		],
		"description": "Log output to console"
	},
}
```

### エラー系

主題は別だけど[mattnさんのブログ](https://mattn.kaoriya.net/software/lang/go/20180914000327.htm)で見かけて即登録

![ie.gif](https://qiita-image-store.s3.amazonaws.com/0/47896/e76d9706-222e-ae03-5876-40323064e138.gif)

```go.json
{
    "iferr": {
		"prefix": "ie",
		"body": [
			"if err != nil {",
			"\t$1",
			"}"
		]
	},
}
```

### その他

deferも書くのめんどいのでこう

```go.json
{
    "defer func": {
		"prefix": "df",
		"body": [
			"defer func(){ $1 }()"
		]
	},
}
```

tickerも地味に忘れるのでこう

```go.json
{
    "ticker": {
		"prefix": "tic",
		"body": [
			"ticker := time.NewTicker($1 * time.Second)"
		]
	},
}
```

さらにselect　tickerしたければそれも登録(やりすぎかもしれません)

```go.json
{
    "for select tic": {
		"prefix": "fst",
		"body": [
			"ticker := time.NewTicker($1 * time.Second)",
			"for {",
			"\tselect {",
			"\t\tcase :",
			"\t\tcase <-ticker.C:",
			"\t}",
			"}"
		]
	},
}

```

余談ですが仕事柄、bitも確認したいときもあるのでこんなのも登録してます

```go.json
{
    "1byte_bit": {
		"prefix": "1b",
		"body": [
			"fmt.Printf(\"%08b\\n\", $0)"
		]
	},
	"2byte_bit": {
		"prefix": "2b",
		"body": [
			"fmt.Printf(\"%16b\\n\", $0)"
		]
	},
}
```

sample

```t.go
package main

import (
	"fmt"
)

func main() {
	fmt.Printf("%08b\n", 255)
	// 11111111
}
```

## さいごに

スニペットによく使うものはとりあえず書いておくと、いちいちググらずに済んで楽ですし
自分のメモとして残しとくといいかも知れません。

僕のリポジトリに他に登録しているスニペットは貼ってあります。
https://github.com/smith-30/vscode-go-snippet

こんなのも便利というのあれば、MRなりこの記事のコメントに書いてくださると嬉しいです。
[VLC]MemoryStreamから動画を再生する

WindowsFormで動画再生といえばWMPやDirectShowだが、WMPはURLやパス指定なのでStreamは使えない。
DirectShowはできるけど難しいみたいなのでほかの方法で。UWPはSetSource関数使えばできるがそもそもWin10のみ。
調べたところ、VLCを使えば簡単にできるっぽいのでこれでいく。

# 環境
 - Windows 7
 - VisualStudio 2017
 - WindowsFormアプリケーション
 - C#
 - VLC

# VLC準備
## DLLダウンロード
まずVLCのDLLデータの準備をする。
[公式サイトから](https://www.videolan.org/vlc/download-windows.ja.html)**Ver3**以上のzipを入手。
zipがあるのは32bitだけなので、64bitがほしい方は一度インストールしてください。DLLを別途保存したらアンインストールして大丈夫。
解凍後、以下のものを別フォルダに移動。インストールした方はC:\Program Files\VideoLAN\VLCにあります。

 - libvlc.dll
 - libvlccore.dll
 - pluginsフォルダ

#プロジェクト作成
WindowsFormアプリケーションのプロジェクトを作成します。
NuGetで「vlc.dotnet」と検索すると「Vlc.DotNet.Forms」があると思うので、それをインストール。一緒にCoreとInteropsもインストールされる。
無い方はパッケージソースを「nuget.org」にしたら多分出ます。

次に「プロジェクト」->「プロジェクトのプロパティ」->「ビルド」を選択。
32bitを取った方はプラットフォームターゲットをx86に、64bitを取った方は「x64」に変更する。
## DLL設定
ツールボックスに「VlcControl」があると思うので、それをデザインに貼り付け。無い方は再起動か、右クリック->アイテム選択で追加する。
追加した「VlcControl」のプロパティから「VlcLibDirectoryNeeded」を追加して、以下を追記。
先ほどとったDLLとpluginsフォルダが入っているフォルダパスを指定する。

~~~csharp
private void vlc_VlcLibDirectoryNeeded(object sender, VlcLibDirectoryNeededEventArgs e) {
    e.VlcLibDirectory = new DirectoryInfo("ここにDLLのフォルダパスを指定");
}
~~~

これで準備完了。
## ソースコード
~~~csharp
MemoryStream ms = new MemoryStream();
FileStream fs = new FileStream(@"動画ファイルパス",FileMode.Open,FileAccess.Read);

    //MemoryStreamに格納
    while (true) {
        var buffer = new byte[1024];
        var len = fs.Read(buffer, 0, buffer.Length);

        if (len > 0) {
            ms.Write(buffer, 0, len);
        } else {
            break;
        }
    }
vlcControl1.Play(ms); //再生
~~~

これだけ。

#エラー


**System.InvalidOperationException: 'You need VLC version 3.0 or higher to be able to use CreateNewMediaFromStream'**
VLCのバージョンが3以上じゃないよ。


**System.ComponentModel.Win32Exception: '%1 は有効な Win32 アプリケーションではありません。'**
32bitのDLLを取ったのにプラットフォームターゲットがx64、またはその逆になってるかも。

**System.AccessViolationException: '保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。'**
おそらくpluginsフォルダの中のDLLのどれかがない。

**System.Exception: ''VlcLibDirectory' must be set.'**
「vlc_VlcLibDirectoryNeeded」イベントが設定されてない。
特定のファイルサイズのテストデータの作り方


この記事は、ソフトウェアテストの小ネタ Advent Calendar 2018 の5日目の記事です。
ソフトウェアテストの小ネタ Advent Calendar 2018
https://qiita.com/advent-calendar/2018/software-testing-koneta

# 特定のファイルサイズのデータを作りたい

こんな時ありますよね．

例えば，ファイルのアップロードの機能を持つソフトウェアがあるとします．5MiBがファイルサイズの境界値です．
そんなとき，5MiBのファイルと5MiB+1iBのファイルを作りアップロードしてテストしたくなります．
この境界値を狙ったファイルサイズのファイルを作る方法について説明します．

## ファイルサイズの計算の仕方
まず，ファイルサイズの計算の仕方についてですね．

バイトの計算をしないといけません．

1KiB(KByte)は 1024 Byte 
1MiBは 1024*1024 = 1048576 Byte 
1GiBは 1024*1024*1024 = 1073741824 Byte 
1TiBは 1024*1024*1024*1024 = 109521666048 Byte
です．

今回作りたいファイルサイズの5MiBは，
5MiBは 1024*1024*5 = 5242880 Byte  になります．
5MiB+1iBは，1024*1024*5+1 = 5242881 Byteになります．

## いちいち考えるの面倒

毎回これ考えるの面倒ですね．計算するの面倒くさいですし．

バイトの計算とファイル作成どちらもコマンドでやりましょう．

Widnowsでは，fsuitlコマンドというものがあります．
また，WindowsのPowerShellでは，計算結果を保存できます．
これを利用します．

### 計算結果の保存
例えば，PowerShellでは，以下のように計算結果を保存できます．
まず1MBのファイルサイズを計算します．

``` PowerShell
> $1MB = 1024*1024
```
次に5MBのファイルサイズを計算します．

``` PowerShell
> $5MB = $1MB*5
```
※まあ次のように，いきなりやってもいいんですが

``` PowerShell
> $5MB = 1024*1024*5
```
次に，5MB+1Bのファイルサイズを計算します．

``` PowerShell
> $5MB1 = $5MB+1
```
※ $5MB+1Bという名前はつけられないため，$5MB1にしています．

### ファイルの作成
ファイルを作ります．
fsuitlコマンドを利用します．

``` PowerShell
> fsutil file createnew dummyfile_5MB.txt $5MB
> fsutil file createnew dummyfile_5MB+1B.txt $5MB1
```
これでファイルが作成されました．

ファイルサイズは，dirコマンド で確認できます．

## 注意

一つ注意があります．
このファイルで作ったファイルは，ファイルのデータが単調なので，めちゃくちゃ圧縮できます．
zipファイルにした場合など，かなり小さくなります．

ファイルアップロード時に
ファイルを圧縮してしまうような作りに，ソフトウェアがなっていた場合，注意してください．

## MacなどLinuxでbashが動く場合

``` bash
> mkfile $((1024 * 1024 * 5)) dummyfile_5MB.txt
> mkfile $((1024 * 1024 * 5 + 1)) dummyfile_5MB+1B.txt
```
5MBはこれでもいけます．

``` bash
> mkfile 5m dummyfile_5MB.txt
```

こっちのほうが簡単？？？
mkfileが見つからないというエラーメッセージが出てきたら，apt，yum，brew あたりのパッケージマネージャを使ってインストールしてください．
SpringのDIについて①

##この記事の目的
[DI:Dependency Injection(依存性注入)ってなに?](https://qiita.com/haseesah/items/32ad604c15328e91fb75)
の続き
SpringがどのようにDIを実現しているかの解説
##今回の記事の範囲
Spring内でのDIの概略の説明

##DIの復習

- DIを利用する理由 … クラス間の依存性を減らして再利用性/テストしやすさを上げたい
- どうやって実現する … あるクラスで使用したいクラスをinterfaceの型で渡す → 実際に渡すクラスは別に定義する。

![DI概略.jpg](https://qiita-image-store.s3.amazonaws.com/0/292905/10844fb4-10eb-8dde-692f-c72afaa065ad.jpeg)

##登場人物
- Bean…インジェクションするクラス
- Bean定義…Beanをインジェクションする際にBeanに設定する各種プロパティ
- Bean定義ファイル/Configuration…Bean定義をまとめたもの(Javaのクラス、XMLファイル)
- DIコンテナ…各種Beanをセットしておき、使用する際はここから相手に渡す


##SpringにおけるDI実現の概略
　各クラスの詳しい動きなどは次回
###ApplicationContext
- **JavaにおけるDI実現の中心人物**
- DIコンテナにあたる機能を有しているクラス
- BeanFactoryクラスを拡張して作られたクラス
- 対応するConfigurationなどによってさらに拡張したクラスがある
- 一つのアプリケーションに対して複数のDIコンテナを生成することができる

###Configuration
- Bean定義ファイルにあたるもの
- これをApplicationContextクラスに渡してやり、DIコンテナ内にBeanを生成する
- 【Javaベース】【xmlベース】【アノテーションベース】の3つの方法がある
- 3つ単独で使うこともできるが、アノテーションベースとそれ以外を組み合わせて使うことで設定が楽になる
- この中にBean定義を記述する

###Bean
- 一般的なクラス、基本的には特別な記述はする必要はない
- がアノテーションベースConfigurationの場合は別途アノテーションを記述する
- Bean内部でBeanをインジェクションして入れ子にすることもできる

ex)HogeServiceのbeanをhogeConfigに初期化条件を記載し、ApplicationContextを経由してBeanを取得する(Javaベース)

```java:CreateContext.java
ApplicationContext ctx = new AnnotationConfigApplicationContext(HogeConfig.class);
HogeService service = ctx.getBean(HogeService.class)
```

```java:HogeConfig.java
@Configuration
public class HogeConfig {
	@Bean
	HogeService hogeService() {
		return new HogeService(); 
	}
}
```

概念図で表すと下記のような感じでしょうか
![SpringにおけるDIの概要.jpg](https://qiita-image-store.s3.amazonaws.com/0/292905/7c1acad1-c424-2b92-6d3b-8bf37067bfed.jpeg)

概念さえ飲み込めば割と理解しやすいと思います。

##次回予告
実際に試用する際の仕様などの解説を予定しています。
ポインタとメソッド・関数（備忘）


メソッド

```go
package main
import "fmt"

type Test1 int

func (t Test1) decade() {
    t += 10
}

type Test2 int

func (t *Test2) decade() {
    *t += 10
}

type Test3 struct {
    age int
}

func (t Test3) decade() {
    t.age += 10
}

type Test4 struct {
    age int
}

func (t *Test4) decade() {
    // 構造体の場合には、*を省略できる
    t.age +=10
}

func main(){
    
    // 値渡し
    var tanaka Test1 = 20
    fmt.Println(tanaka) // 20
    tanaka.decade()
    fmt.Println(tanaka) // 20
    fmt.Println()
    
    // ポインタ渡し
    var takahashi Test2 = 20
    fmt.Println(takahashi) // 20
    takahashi.decade()
    fmt.Println(takahashi) // 30
    fmt.Println()
    
    suzuki := Test3{age:20}
    fmt.Println(suzuki.age) // 20
    suzuki.decade()
    fmt.Println(suzuki.age) // 20
    fmt.Println()
    
    satou := Test4{age:20}
    fmt.Println(satou.age) // 20
    satou.decade()
    fmt.Println(satou.age) // 30
    fmt.Println()
    
}
```


関数

```go
package main
import "fmt"

type Test1 int 

func decade1(a Test1) {
    a += 10
}

type Test2 int 

func decade2(a *Test2) {
    *a += 10 // * が必要
}

type Test3 struct {
    age int
}

func decade3(a Test3) {
    a.age += 10
}


type Test4 struct {
    age int
}

func decade4(a *Test4) {
    a.age += 10// * は不要
}

func main(){
    var tanaka Test1 = 20
    decade1(tanaka)
    fmt.Println(tanaka) // 20
    
    var takahashi Test2 = 20
    decade2(&takahashi)
    fmt.Println(takahashi) // 30
    
    suzuki := Test3{age: 20}
    decade3(suzuki)
    fmt.Println(suzuki.age) // 20
    
    satou := Test4{age: 20}
    decade4(&satou)
    fmt.Println(satou.age) // 30
}
```
ドラクエ11の2倍おもしろいRPG作ってみた

こんにちは。

現役女子高生の突撃類人猿と申します。

 

突然ですが皆さん、ドラクエ11ってご存知ですか？

ドラクエ11とは、2017年7月29日にスクエア・エニックスが世に放った**大作王道RPG**です。

これぞJRPGと言うべき作品であり、丁寧に作り込まれたゲームシステム、ドラクエ世界の広がりを存分に体感できるシナリオと音楽、魅力的でついつい感情移入してしまうキャラクタ、**すべてが非常に高いレベルで調和しています**。

かく言う私も軽く200時間ほどプレイしており、あまりに夢中になりすぎたため寝食を忘れ危うく栄養失調になりかけました。

そんな私ですが、天才なのでドラクエ11を凌駕する面白さのRPG、その名も**邪竜王の復活**を作ってしまいました。
それも製作時間２時間ほどで。

以下のリンクにゲームのzipファイルを置いておきましたので、解凍してGame.exeを実行してもらえばプレイできるはずです。

[Project1.zip - Google ドライブ](https://drive.google.com/open?id=1Qdc_Eq3cGCMzr-d1YXeH6jeWc-KLsy4M)

謎のリンクを貼って実行ファイルを実行するよう要求するなんて、我ながら怪しすぎますが、**防災意識ゼロの勇者**は是非ともプレイしてみてください。

デバッグとかテストプレイとかあんまりちゃんとやっていないので、**初代ポケモンみたいに**バグを探して遊ぶのも面白いと思いますよ！

**（2018/12/13追記）**
ネットリテラシーに優れたあなたにオススメ！ブラウザ版もご用意しました。
https://plicy.net/GamePlay/69075

Plicyというゲーム公開サービスを利用させていただきました。

ブラウザで遊べるので、**危険は一切ありません。**（**本当です。**）



## RPGのおもしろさとは？
さてここからが本題です。

RPGのおもしろさとは、**いかに飽きずに最後までプレイできるか？**です。

つまり、`おもしろさ = 1 - 正直飽きていた時間／合計プレイ時間`と定義できるわけです。

## おもしろさの比較
|              | 合計プレイ時間 | 正直飽きていた時間 | おもしろさ |
|--------------|----------------|--------------------|------------|
| ドラクエ11   | 200時間        | 100時間            | 0.5        |
| 邪竜王の復活 | 3分            | 0分                | 1.0       |

実際にプレイ時間を計測して、ドラクエ11と比較してみました。
結果は**ドラゴンボールにおけるヤムチャの噛ませ犬感**くらいに明白ですね。
自分が天才だということは知っていましたが、まさかあのドラクエ11のおもしろさを２時間ほどの製作時間で超えられるとは思っていませんでした。

RPGツクールMVが**いかに素晴らしいツールか**ということが窺い知れますね。

## 最後に

皆さんも、このゲームを同僚に教えてあげて、私のゲームデバッグに貢献してくださいね。
国土地理院の標高タイルをPythonで取得する

# 1. この記事について
以前の記事で地理院タイルをJavaScriptで取得する方法を書いた。
[国土地理院の標高タイルをJavaScriptで適切に取得する - Qiita](https://qiita.com/sw1227/items/a17d424ce8d0cd2302e6)
地理院タイルおよび標高タイルの仕様・タイル座標の調べ方などについては上記の記事を参照のこと。

Pythonでも本質的には変わらないが、Pandasを使えば楽なのでここに記す。
また、複数のタイル座標にわたってタイルを取得・結合する方法も紹介する。

もともとは以下の記事で使うために書いた。
[PFN製の最適化ツール「Optuna」で富士山を登頂する](https://sw1227.hatenablog.com/entry/2018/12/06/071825)

# 2. 標高タイルの取得方法
基本的にはタイル座標を含めた`GET`リクエストを送るだけ。
Pandasの`read_csv`関数を使えば、指定したURLからのデータの取得・CSVのパースを一括で行ってくれるので楽になる。
海などで標高に`e`という値が入っていることがあるが、`.replace`メソッドを呼び出すだけで0mに変換できる。

```python
import pandas as pd

def fetch_tile(z, x, y):
    url = "https://cyberjapandata.gsi.go.jp/xyz/dem/{z}/{x}/{y}.txt".format(z=z, x=x, y=y)
    df =  pd.read_csv(url, header=None).replace("e", 0)
    return df.values
```

返り値の型は`numpy.ndarray`になるようにしている。
これで標高タイルを2次元のNumpy Arrayとして扱うことが可能になる。

# 3. 使い方
上記のように定義した`fetch_tile`関数にタイル座標を与えるだけ。
そのままMatplotlibの`imshow`関数で可視化すると、ちゃんと北が上・東が右になるように表示される(๑˃̵ᴗ˂̵)

```python
nabewari = (13, 7262, 3232) # タイル座標 (z, x, y)
nabewari_tile = fetch_tile(*nabewari)

# 可視化も簡単
import matplotlib.pyplot as plt
plt.imshow(nabewari_tile)
```
![ダウンロード (3).png](https://qiita-image-store.s3.amazonaws.com/0/58850/6e96a5f2-44e1-bc5f-7a91-7538dbf24913.png)

# 4. 複数タイルの結合
複数のタイル座標にまたがって長方形領域を取得したい場合、以下のような関数を使えば良い。前章の`fetch_tile`は定義済とする。

```python
def fetch_all_tiles(north_west, south_east):
    """ 北西端・南東端のタイル座標を指定して、長方形領域の標高タイルを取得 """
    assert north_west[0] == south_east[0], "タイル座標のzが一致していません"
    x_range = range(north_west[1], south_east[1]+1)
    y_range = range(north_west[2], south_east[2]+1)
    return  np.concatenate(
        [
            np.concatenate(
                [fetch_tile(north_west[0], x, y) for y in y_range],
                axis=0
            ) for x in x_range
        ],
        axis=1
    )
```

例えば以下のような領域を取得したい場合
<img width="300" alt="スクリーンショット 2018-12-05 21.08.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/58850/4095c2bf-3913-afe8-59fb-6c89226dbab3.png">

左上と右下のタイル座標を指定すれば良い。
ここではタイル数が2x2だが、長方形領域ならなんでも良い。

```python
tile = fetch_all_tiles((14, 14523, 6464), (14, 14524, 6465))
print(tile.shape) # (512, 512)
```

以上
自家製Google Clipsを作っちゃおう大作戦[第0戦]


皆様、ごきげんよう。

最近、[一緒にペアプロやっているナイスガイ](https://qiita.com/SoarTec-lab)に「やる気があるときと無いときの差が、めっちゃわかりやすいっすね」的なこと指摘されてちょっと 😑 な徳光です。

本記事は Classi Advent Calendar 2018 6 日目の記事です。
…が、Classi とは全く関係ないこと書きます。ごめんなさい。

# ちょっと長いイントロダクション

ある日、ふと我が子が産まれた状況を想像してみたところ...

誕生した我が子の可愛い仕草を一瞬たりとも見逃すまいと、仕事そっちのけで自宅にひきこもってしまった自分が浮かんできました。

このままだと会社に Fire:fire:されて生活の危機が...😨

うーん、どうしたもんかと悩んでいるときに見つけたのが **[Google Clips](https://store.google.com/us/product/google_clips?hl=en-US)！**

なんと、これを設置するだけで、顔を認識して勝手に 7 秒間の動画を撮影してくれるというではありませんか！
これを我が子のベットにセットしておけば、可愛い仕草を余すことなく記録に残せるので集中して仕事も取り組めそう。

これで問題は解決 😍

...かと思いきや、世の中そんなに甘くは無かったのです。
（だいぶお高い（$249 ≒ 約 28,000 円)💸 & 日本では正式には販売しないんだってさ）

またまたうーん、と悩んでいたある日、天啓が！

**Google Clips が手に入らないのなら自分で作っちゃえばいいんだよ 👼🏻**

ということで、Google 先生にお伺いを立てたところ、良い感じのキットを教えてくれました。

その名も **[Google AIY Vision Kit V1.1](https://aiyprojects.withgoogle.com/vision)**
スマートカメラを自作できちゃう優れものです。

いても立ってもいられず、妻に内緒でポチっちゃいました。[^1]
[^1]: 組み立てたら見せびらかしたくなって、自分から報告しちゃいましたけどね！

Vision Kit は未完成の状態で送られてくるので、自分で組み立てないといけないのですが、[懇切丁寧な公式の説明](https://aiyprojects.withgoogle.com/vision/#assembly-guide)の通りに進めていけば 1 時間ほどできあがりました。

さあこれで準備は整った。
あとはやるのみ！

# 作りたいもの

個人的には専用アプリで見れるより、LINE グループに自動で投稿できるようになったほうが良いな...
ということで来春までに実現したい機能はこちらになりました。

- 顔を認識して写真を勝手に撮ってくれる
- 顔を認識して動画を勝手に撮ってくれる
- いい表情をしているときを判別できればベター
- 家族用 LINE グループに自動で投稿できる

# つくってみた

よっしゃー頑張って作るぞ！と意気込んだのですが、それもつかぬ間。
Vision Kit にはサンプルが同梱されており[^2]探したらほぼ欲しかったスクリプトがありました。
さすが Google 様。
[face_camera_trigger.py](https://github.com/google/aiyprojects-raspbian/blob/5c74ce5154fe9ecdab5901e01b567d47fbdc068f/src/examples/vision/face_camera_trigger.py)

[^2]:
    サンプルスクリプトを含むリポジトリは[こちら](https://github.com/google/aiyprojects-raspbian)
    嬉しいような、ちょっと拍子抜けしちゃったような...

ただ、↑ のサンプルでは写真一枚取るごとにスクリプトを実行し直す必要があったので、連続で撮れるようにちょっとだけ改良してみました。（主に ↓ のグリーンでハイライトされているところ）

![_Users_toku345_works_github_aiyprojects-raspbian_src_examples_vision_my_face_detection_trigger_py.png](https://qiita-image-store.s3.amazonaws.com/0/13998/4373f3c8-c23d-008a-a0b7-97fa37bb4d0d.png)

# Let's Try

![show_take2.gif](https://qiita-image-store.s3.amazonaws.com/0/13998/fb83d896-a757-5849-4ec0-53125cbfa7a3.gif)

赤ちゃんの写真が撮れてますね！
![2018-12-05_13.02.18.jpg](https://qiita-image-store.s3.amazonaws.com/0/13998/a1566b14-26a6-f0f2-980b-31c612b08137.jpeg)

ちなみに、おっさんの写真もちゃんと撮れてますね。
![2018-12-05_13.02.09.jpg](https://qiita-image-store.s3.amazonaws.com/0/13998/7a0012d3-d914-8acb-1897-6a2440df6bfd.jpeg)

やったね！

# 第 0 戦のまとめ

- [x] ~~顔を認識して写真を勝手に撮ってくれる~~
- [ ] 顔を認識して動画を勝手に撮ってくれる
- [ ] いい表情をしているときを判別できればベター
- [ ] 家族用 LINE グループに自動で投稿できる

機械学習を深く知らなくてもここまでは簡単にできました。
いや〜、便利な時代になったもんですね。Vision Kit 恐るべし

さあ、次は動画を保存できるようにするぞー 💪🏻

次回も、乞うご期待。

---

明日の担当は[@spin13](https://twitter.com/spinning13)さん！
楽しみですね 😆
IT系専門学校に4年間通ってわかったこと

# はじめに
HALアドベントカレンダー7日目を担当する、HAL大阪IT学部WEB開発学科4年のカズマです。
今回HALを卒業するにあたって4年間通ってわかったことや後悔したことなどを書いていこうと思います！
殴り書きなので読みづらいと思いますがご了承ください。
<font color="Red">※人により様々な意見はあると思いますので、ここに書くことは一個人の見解であることをご了承していただいてお読み下さい。</font>

# 学校の講義だけで満足してはいけない
まず、学校の講義だけで満足してはいけないということです。
僕は1年生当時Qiitaも知りませんでしたしGitHubも知りませんでした。
参考書を読む習慣もなかったですし学びの場といえば学校の講義でしかなかったのです。
今振り返ってみれば基礎中の基礎を教わっていただけに過ぎず井の中の蛙とはこのことかと振り返って思います。
現状に満足せず、学習することを心がけて下さい。

# 資格は無理に取る必要はない
もちろん資格は取るに越したことはないと思いますし、資格を持つというよりは知識の穴埋めができるというのはメリットだと思います。先生は結構就職に関わると脅してきますが実際は資格を持っていれば特別就職に有利ということでもないと実感しています。
取れる方は取ったほうがいいです！でもそんなに気負わなくてもいいよということです。

# できるやつと友達になろう
できるやつと友達になる。これはとても自分のスキルアップに大事なことです。
自分より、より多くのことを知っている人と友達になり切磋琢磨出来る環境ほど成長できる環境はないと思います。
僕は知らないことだらけでしたが自分よりいろんな情報を持つ友達に勉強会のことやインターンのこと逆求人イベントのことなど学校では教えてくれないことをたくさん教わりましたし、技術のこともたくさん教えてもらいスキルアップに繋がりました。

# チーム開発はたくさんコミュニケーションをとろう
僕の学校ではチーム開発が4年間で4,5回あります。そこで毎回ギクシャクしてしまったり、思ったとおりの成果物ができなかったり、何日も徹夜することになったりとトラブルがたくさん起こる行事です。
そこで学んだことはメンバーとたくさんコミュニケーションを取ることです。
チームメンバーが何が得意で何ができて何日までにこの機能が実装できそうかなどコミュニケーションを取らないとわからないことがたくさんあります。
ですが、大抵「これ実装して」、「これ何日までにやって」など簡易な指示で終わっているからトラブルが発生したりするのです。
あとはコミュニケーションを取りやすい環境作りです。
いつでも質問をしやすい雰囲気作りというのも大切だと思います。

# サマーインターンに参加しよう
3年の7〜10月にサマーインターンに参加することをおすすめします。
このインターンに参加するメリットは勉強ができるのはもちろんのこと全国のエンジニアと友達になれますし、社会人経験もできます。しかも本選考の一次面接免除などがある企業もあり就職にも有利といいことずくめです。
最初はインターンについてもよくわからないと思いますし、どこの会社のインターンに行けばいいのかもわからないと思います。
なのでおすすめは逆求人イベントに参加することです。[サポーターズ](https://supporterz.jp/)や[キャリアセレクト](https://careerselect.jp/)などで参加できます。ここでいろんな企業の方と話をすることで自分のあったインターンに参加することが出来ると思います。
ここで後悔したことが「もっと勉強していればよかった」ということです。
インターンとはいえ人気企業では選考があり、課題やテストがあることがほとんどで学校の勉強だけでは到底理解不能な課題や問題が出ます。
今１、2年生の方はこのサマーインターンに参加することを目標に勉強し成果物をいろいろ作るというのがいいかなと思います。企業の方は今まで取り組んできたことを聞いてきますので作ったものを見せれるととても強いです。

# 人前で話せるようになろう
できればサマーインターン選考前までには人前で話せるようになりましょう。
学校でもプレゼンする場や発表をする場があると思いますがその場だけでは不安かと思います。
一番いいのが勉強会に参加することです。勉強会は[connpass](https://connpass.com/)などで探しましょう。勉強会では大抵何人かが登壇して一つの物事に関して発表してくれたりします。
その勉強会で登壇している人はかなり場数を踏んでいる人が多いと思いますのでとても参考になると思います。
ですが、人の発表を見るだけでは自分の力になりません。その次は勉強会に登壇してみたり、学内で勉強会を開いてみたりと次のアクションを起こしていきましょう。もちろん勉強会に参加するメリットは勉強になる、コミュニティが広がるなど他にもあります。
こうすることでサマーインターンの選考の面接でも自分のことをすんなり話せたりすると思いますし就活でも話せるようになると思います。
あと勉強会以外では普段話さない人と話したり先生に質問に行ったりすると少しづつコミュニケーション能力の向上に繋がると思います。

# まとめ
グダグダと殴り書きしてきましたがまだまだ未熟な僕がHALに4年間通って思ったことを書き綴りました。
結局自分が正しいと思ったことをやるのが一番だと思いますし、ここに書いたことがすべてではありませんのでところどころ参考にしてください。
最後まで読んでいただきありがとうございました！！
UnityでXmlを読み込む

#使用環境
・Unity 2017.1.1f1
・VisualStudio2017

---
今回読み込むファイル「sample.xml」

```
<?xml version="1.0" encoding="UTF-8"?>
<リスト>
  <データ>
    <名前 言語="日本語">橋本</商品>
    <売上>120</売上>
  </データ>
  <データ>
   <名前 言語="日本語">山田</商品>
    <売上>10</売上>
  </データ>
  <データ>
    <名前 言語="日本語">田中</商品>
    <売上>1500</売上>
  </データ>
</リスト>
```

# コード
```C#:LoadXML
using UnityEngine;

using System.Xml.Linq  //重要

public class LoadXML : MonoBehaviour
{
        void Start () {
                LoadData();
        }

        private void LoadData{
                //ディレクトリ指定してファイルを読み込み
                XDocument xml = XDocument.Load(@"C:\sample.xml");

                //テーブルを読み込む
                XElement table = xml.Element("リスト");

                //データの中身すべてを取得
                var rows = table.Elements("データ");

                //取り出し
                foreach (XElement row in rows)
                {
                    XElement item = row.Element("名前");
                    Debug.Log(item.Value);
                }
       }

}

```
【メモ】配列を一気に格納→一気に貼り付け

＜FunctionとSubの適当な違い＞
Functionは返り値がある。
Subはない。Callで呼び出す。
Publicが付く・付かないの違いはよく調べてないので今度調べる。
シートを配列に格納する方法について参考にさせて頂いたサイト：https://howto-it.com/excelvbaarray.html
ありがとうございました。

```vb
'シート全体を配列に読み込む関数
Public Function Sheet2Array(BookName As String, SheetName As String) As Variant

    Dim RowNum As Double
    Dim ColNum As Double

    With Workbooks(BookName).Sheets(SheetName)
        RowNum = .Cells(Rows.Count, 1).End(xlUp).Row
        ColNum = .Cells(1, Columns.Count).End(xlToLeft).Column
        Sheet2Array = .Range(.Cells(1, 1), .Cells(RowNum, ColNum))
    End With

End Function
```

↓なぜかcells(column(6),column(18))だと機能しなかった。。。
※追記。Range(columns(6),columns(18))が正しいです。

```vb
'新規シートを作成→シート名変更→配列をそこに貼り付け→不要列削除。
Sub ArryPaste(ByRef BookName As String, ByRef SheetName As String, ByRef Arry As Variant)

Dim ws As Worksheet
Dim wb As Workbook

Set wb = Workbooks(BookName)
Set ws = wb.Sheets.Add(After:=wb.Sheets(wb.Sheets.Count))
ws.Name = SheetName


'新シートに配列を貼り付け　→　不要列（6～18）削除
ws.Cells(1, 1).Resize(UBound(Arry, 1), UBound(Arry, 2)).Value = Arry
ws.Range("F:R").Delete

End Sub
```

宣言した変数を↑のSubプロシージャの引数の型と明示的に統一させないと、次のエラーが出てうまく機能しない。
エラー：「コンパイルエラーbyref引数の型が一致しません」

```vb
Sub 配列転記()

Dim Arry() As Variant
'配列に格納
Arry = Sheet2Array(Workbooks("●●●.xlsm").Name, "2018（H30)")

'宣言と代入を同時にするやり方↓
Dim BookName1 As String: BookName1 = "▲▲▲.xlsx"
Dim SheetName As String: SheetName = "□□□"


Call ArryPaste(BookName1, SheetName, Arry)

End Sub

```
Railsでバッチを書く時によく使うrails runnerとrake taskの違い

アプリケーション開発をしているとアドホックに実行したいスクリプトがある時や大量のデータを処理したいときなど、バッチ処理を書きたくなる時ってありますよね。

Railsでバッチ処理を書く際によく使われている方法として有名なものが下記の3つだと思います。

- rails runner
    - スクリプトとしてバッチを書く
- rake task
    - ビルドタスクとしてバッチを書く
- sidekiq
    - 非同期処理としてバッチを書く

アプリケーションを新規開発する際、バッチ処理のトリガーをrails runnerを使用するかrake taskを使用するかで迷ったのでまとめてみました。
sidekiq使う場合もバッチ処理内で呼ぶ想定なのでsidekiqでのバッチ処理についてはまとめていません。
先に結論言っておくと『バッチ処理を行うという観点ではrails runnerもrake taskもそこまで変わらない』です。

# Rails runner とは
https://railsguides.jp/command_line.html#rails-runner

- Railsのコマンドラインツールの1つ
- RubyのスクリプトをRailsの環境で動かせるもの
- Railsの環境を読み込んだ上で任意のRubyスクリプトが実行することができる
- -e stagingのように-eオプションでRailsの環境を指定することができる
- Rubyのコードを直接実行する方法とスクリプトファイルを指定する方法がある

こんな感じで書くことができます。

```Ruby
class BatchExample
  def initialize
  end

  def exec
    '何かバッチ処理'
  end
end

% rails runner BatchExample.new.exec
```
事前事後に行う共通処理を別途定義してまとめたりすると便利です。

```Ruby
class Batch
  def initialize
    @slack = SlackNotifier.new
    exec
    @slack.send('バッチが終了しました')
  end
end

class BatchExample << Batch
  def exec
    '何かバッチ処理'
  end
end

% rails runner BatchExample.new
```

個人的にメリットデメリットは下記のようになるかなと思います。

- メリット
    - Rubyのスクリプトなので自由度が高い
- デメリット
    - Railsの環境を毎回読み込むので若干遅い
    - バッチの置き場所が決まってない

# Rake taskとは

[https://railsguides.jp/command_line.html#bin-rails](https://railsguides.jp/command_line.html#bin-rails)

- RakeはRubyで記述されたビルドツールでunixでいうMakeと一緒
- rake taskはビルドタスク
- 独自のDSLで書くことができる
- environmentを渡すことでRailsの機能も使える
- rake 'タスク名' もしくは rails 'タスク名'で実行することができる
- taskはlib/tasks以下に置く

```Ruby
namespace 'import' do
  task :csv, ['target_file'] => :environment do |task, args|
    'csvから読み込む処理'
  end

  task :yml, ['target_file'] => :environment do |task, args|
    'ymlから読み込む処理'
  end
end

# csvから読み込みたい時
% rails 'import:csv['target_file']'

# yamlから読み込みたい時
% rails 'import:yml['target_file']'
```

- メリット
    - namespaceメソッドを使ってグループ化ができる
    - taskの置く場所がきまっていて迷わない
- デメリット
    - 処理の行数が長くなるとつらい
    - 引数の渡し方に癖がある
    - 一時的に使用するバッチの置き場所に困る

一長一短ありますが、Railsでバッチを実行するという役割においてはあんまり変わらないですね。
rake taskは、バッチの置き場所など考えることが減り統一感がでていいかもしれません。
rails runnerは、スクリプトに共通処理などを挟めたりできるので自由度が高くてよさそうです。
一時的に実行するスクリプトはrails runner、定期実行するものはrake taskという分け方もあるそうです。
個人的には一時的に実行するスクリプトも定期実行する可能性がでてくることがあるので、最初からrails runnerに寄せるのが好みです。

# 番外編

## バッチの置く場所について

rails runnerを使用する場合、バッチをどこに置くか問題があります。

その時のディレクトリ構成について弊社で使用しているディレクトリ構成を紹介します。

バッチは大きく分けて下記3種類にわけられます。

- 一度きりしか使わないもの
- 運用でたまにしようするもの
- 定期実行されるもの

これらが混ざっているとバッチが増えた際に、どのバッチが不要でどのバッチが使われているかが煩雑にわかりづらくなってしまいます。

そのためそれぞれの用途でディレクトリを切って下記のようなディレクトリ構成にしています。

```
batch/
　├ temp/(一度きりしか使わないもの)
　├ operation/(運用でたまにしようするもの)
　└ cron/(定期実行するもの)
```

運用でたまにしようするものと定期実行するものは分けても分けなくてもいいですが、一時的に使用するものをtempフォルダなどに分けることでこのディレクトリ以下のバッチはいつ消してもよいという共通認識が取れるためバッチの棚卸しをしている時に役立ちます。

みなさんもよきバッチライフを！
Rのパッケージインストール時のプロキシ設定

Rのパッケージダウンロードでプロキシの設定にはまったので覚書。

# 対象環境
+ R-3.5.1 for Windows 64 bit
+ RStudio 1.1.463 - Windows 64bit
+ Windows Server 2008 64bit
+ インターネット接続にはプロキシ認証が必要

# 現象
`install.packages("pkgname")`を実行すると、407 Proxy Authentication Requiredが返る（RStudioの画面は"Cannot open <url>"）。


# 対処法
まずはRStudioで（Rコンソールでもrguiでも可）を以下を試して接続可能か確認する。

```r
proxy_url = "http://user:pass@proxyhost:proxyport"
Sys.setenv("http_proxy" = proxy_url)
Sys.setenv("https_proxy" = proxy_url)

curlGetHeaders("http://www.google.com/") # URLはなんでもいいのでこれで200が返るか試す
```

これで通るなら以下のようにすればパッケージダウンロードができるようになる。

```r
options(download.file.method = "libcurl")
install.packages("pkgname")
```

毎回やるのが面倒なら、以下のようにプロファイルと環境変数ファイルを作成する。

```r
file.edit('~/.Rprofile')
file.edit('~/.Renviron')
```

```text:.Rprofile（既存なら追記）
options(download.file.method = "libcurl")
```

```text:.Renviron（既存なら追記）
http_proxy="http://user:pass@proxyhost:proxyport"
https_proxy="http://user:pass@proxyhost:proxyport"
```

# 確認できたこと
パッケージのダウンロードには、`download.file()`関数を使用しているらしい。そして少なくともWindows版ではデフォルトのhttp通信method（HTTPリクエストメソッドのことではなく使用するAPI）が"wininet"で、Windows OSのWinInet関数を使用する。そしてこの関数とプロキシサーバの相性が悪いときにこれにハマる。おそらく`download.file()`はプロキシの認証情報もOS（資格情報）から取得しているので、グループポリシーで認証情報を保存できない（つまりIEを起動するたびに認証情報を入力しなければならないようになっている）場合、認証情報なしでプロキシにリクエストを投げて407が返る。環境変数から認証情報を取得してくれればよいものを、どうやらそういう実装にはなっていない。
methodを"WinInet"以外にすれば、そのAPIを使用した実装次第で環境変数から認証情報を取ってきてくれるということっぽい。

というわけで今回は、`download.file()`関数のmethodを"libcurl"にしたらプロキシ認証できた。今の所は残念ながらRStudioでは動的にプロキシ認証情報を渡せないらしいので、ファイルに書いておくしかない。

# 参考資料
+ [file.download](https://stat.ethz.ch/R-manual/R-devel/library/utils/html/download.file.html)
+ [curlGetHeaders](https://www.rdocumentation.org/packages/base/versions/3.5.1/topics/curlGetHeaders)
+ [WinInet](https://blogs.technet.microsoft.com/jpieblog/2016/08/05/ie-からみるプロキシの設定について/)
Donkey Carの作り方(Windows側)

# 関連Qiita

- [Donkey Carの作り方(RasPi側)
](https://qiita.com/akira-sasaki/items/c37468e88c9bbd739a65)
- [Donkey Car PS3 Joystick(RasPi側)](https://qiita.com/akira-sasaki/items/987ba17060637cff2c3e)
- [Donkey Carで動きそうなラジコン](https://qiita.com/akira-sasaki/items/753106d6ad9f62a31a40)
- [Donkey Carの作り方(Mac側)
](https://qiita.com/akira-sasaki/items/66f31a969712d8dea758)
- [Donkey Carの作り方(Windows側)](https://qiita.com/akira-sasaki/items/dc06b0ca21821fc8ef48)
- [Donkey Car Emulator(Mac側)](https://qiita.com/akira-sasaki/items/5e838b4f5125e25b4523)
- [Donkey Car学習(Mac側)](https://qiita.com/akira-sasaki/items/e0cc64dae5565b38987d)
- [Donkey Car Commandメモ](https://qiita.com/akira-sasaki/items/4097f9bdea46fb654a04)
- [Donkey Car Officialのドキュメント(リンク)](https://docs.donkeycar.com/)
- [AWS DeepRacerまとめ](https://qiita.com/akira-sasaki/items/c29282c281ca274d2691)

## 必要なソフト

* Anaconda
* git

## 注意事項

PowerShellではうまくいきません。
Anaconda Consoleを実行し、実施してください。

## 作業フォルダの作成

```
$ mkdir ~/Documents/workspace_donkey
$ cd ~/Documents/workspace_donkey
```

## DonkeyをClone

```
$ git clone https://github.com/autorope/donkeycar/
$ cd donkey
$ git checkout master
```

## Condaで環境設定

```
$ conda env create -f install/envs/mac.yml
$ source activate donkey
```

conda入っていない人は、
https://conda.io/miniconda.html
よりインストール

## TensorFlowのインストール

```
$ pip install tensorflow==1.8.0
```

## プロジェクトの作成

```
$ pip install -e .
$ donkey createcar ~/mycar
```

## manage.pyの修正

```
$ cd ~/mycar
```

```
$ vim manager.py
```

188行目

```
#from controller import LocalWebController, JoystickController
```

Keras.pyの修正。場所は、環境に合わせてフォルダの場所を変える

```
$ vim /Users/akira/Documents/workspace_donkey/donkey/donkeycar/parts/keras.py
```
keras.py

```
from keras.layers import Input
from keras.models import Model, load_model
from keras.layers import Convolution2D
from keras.layers import Dropout, Flatten, Dense
from keras.callbacks import ModelCheckpoint, EarlyStopping
```

環境

```
donkeycar              2.5.1
Keras                  2.2.2       
Keras-Applications     1.0.4       
Keras-Preprocessing    1.0.2  
tensorboard            1.8.0       
tensorflow             1.8.0       
tensorflow-tensorboard 0.1.8     
```
Elm の最適化オプション --optimize

Elm 0.19 で新しいオプション `--optimize` が[導入](https://elm-lang.org/blog/small-assets-without-the-headache)されました。
記事を見ただけだと実際に何をしているのかがちょっとわかりにくいので説明します。

## 関数単位のデッドコード除去（`--optimize` 不要）

まずデッドコード除去ですが、実は **`--optimize` フラグをつけなくてもデフォルトで有効です。**

このデッドコード除去は記事に解説がある通り**関数単位**で行われます。つまり、大量の関数を用意しているモジュールの一部だけを利用する場合にも、使った関数だけがアウトプットに含まれます。


## レコードのフィールド名の変更

こちらは `--optimize` の機能です。
コード上でどんなに長いフィールド名 `student.mostRecentGrade` でも `student.m` のような短い変数名に変更します。

JavaScript で同じことをやろうとしても、 `student['mostRecent' + info]` のように動的なフィールド名を使ってしまうのでどうしても難しいです。Google Closure Compiler の ADVANCED なんとかオプションで同じことができますが、そのためには慎重に規約を守る必要があって大変です。それに npm で大量にインストールしたパッケージはそんなことを守っていないので適用できません。

レコード名以外には、カスタム型のコンストラクタ名も短縮されます。それから、次のようにコンストラクタが一つだけの場合は、そもそもそれがなかったことにします。要するに実行時に wrap / unwrap が発生しなくなります。

```elm
type MyType = MyConstructor String
```

## 制約: Debug モジュールの禁止

`--optimize` を使うための条件は「Debug モジュールを一切使わないこと」です。

なぜこんな制約があるのでしょうか？
たとえば `Debug.toString` はデバッグのためにレコードやコンストラクタの名前を文字列に変換します。
ところがこの文字列が `--optimize` によって変わってしまうと、本番のみ不慮のトラブルに遭遇しかねませんからね。

ところで、Elm のパッケージは `--optimize` が効く状態でないと publish できません。つまり、**インストールしたパッケージは全て `--optimize` が効く**ということです！

## さらに最小化する

実は `--optimize` が面倒を見てくれるのは Elm 特有の最適化（＝レコードのフィールド名などの短縮）だけで、 **minify まではしてくれません。**
出力された JavaScript のサイズをさらに最小化するには、 ugulifyjs の手を借りましょう。（ugulifyjs を使っていても、 --optimize を通した後の方が最終的なファイルサイズは小さくなります。）

その方法はここで紹介されています。
https://elm-lang.org/0.19.0/optimize

ざっくりこんな感じです。

```shell
$ elm make src/Main.elm --optimize --output=elm.js
$ uglifyjs elm.js --compress 'pure_funcs="F2,F3,F4,F5,F6,F7,F8,F9,A2,A3,A4,A5,A6,A7,A8,A9",pure_getters,keep_fargs=false,unsafe_comps,unsafe' | uglifyjs --mangle --output=elm.min.js
```

こんなの毎回書いてられるか！という人は [elm-minify](https://www.npmjs.com/package/elm-minify) とかを使いましょう。GZIP 後のサイズも表示してくれるので便利です。（ちなみに[create-elm-app](https://github.com/halfzebra/create-elm-app)も同じ方法で minify しています）

```
$ elm-minify elm.js
┌────────┬────────────────────┬────────────┐
│ source │ rel path           │    kb size │
├────────┼────────────────────┼────────────┤
│  input │ elm.js             │      87.28 │
│ output │ elm.min.js         │      6.667 │
│   gzip │                    │      2.735 │
└────────┴────────────────────┴────────────┘
```

簡単ですね！
scalaでconfig読むときに便利そうなライブラリ

typesafe configを便利に使うためのライブラリを2つ紹介してみます。

## PureConfig

https://pureconfig.github.io/

*A boilerplate-free library for loading configuration files*

amm使います。

```zsh
$ amm
Loading...
Welcome to the Ammonite Repl 1.4.4
(Scala 2.12.7 Java 1.8.0_144)
If you like Ammonite, please support our development at www.patreon.com/lihaoyi
```

pureconfigを読み込みます。

```scala
@ import $ivy.`com.github.pureconfig::pureconfig:0.10.1`
import $ivy.$

@ import pureconfig.generic.auto._
import pureconfig.generic.auto._

@ import com.typesafe.config.ConfigFactory
import com.typesafe.config.ConfigFactory
```

型定義します。

```scala
@ {
  case class RedisConf(host: String, port: Int)
  case class MySQLConf(host: String, port: Int)
  case class Conf(mySQLConf: MySQLConf, redisClusterConf: Set[RedisConf])
  }
```

今回はreplなのでapplication.confを置くのではなく、文字列でconfを定義します。

```scala
@ val conf = ConfigFactory.parseString("""{ my-sql-conf: { host: "my1", port: 3306 }, redis-cluster-conf: [ { host: "re1", port: 7000 } ] }""")
```

loadConfigするとEitherで結果がかえってきます。

```scala
@ pureconfig.loadConfig[Conf](conf)
res5: Either[pureconfig.error.ConfigReaderFailures, Conf] = Right(Conf(MySQLConf("my1", 3306), Set(RedisConf("re1", 7000))))
```

便利ですね!

デフォルトだとキーはkebabCaseですが、hintをcamelCaseにしてあげるとcamelでもかけます。

```scala
@ import pureconfig._
import pureconfig._

@ implicit def hint[T] = ProductHint[T](ConfigFieldMapping(CamelCase, CamelCase))

@ pureconfig.loadConfig[Conf](conf)
res10: Either[error.ConfigReaderFailures, Conf] = Left(ConfigReaderFailures(ConvertFailure(KeyNotFound("mySQLConf", Set("my-sql-conf")), None, ""), List(ConvertFailure(KeyNotFound("redisClusterConf", Set("redis-cluster-conf")), None, ""))))
```

sealed traitも対応していて、その中でもenumも対応してました。

```scala
@ {
  import pureconfig.generic.EnumCoproductHint

  sealed trait Season
  case object Spring extends Season
  case object Summer extends Season
  case object Autumn extends Season
  case object Winter extends Season

  implicit val seasonHint = new EnumCoproductHint[Season]

  case class MyConf(list: List[Season])
  }
```

```scala
@ loadConfig[MyConf](ConfigFactory.parseString("{ list: [spring, summer, autumn, winter] }"))
res12: Either[error.ConfigReaderFailures, MyConf] = Right(MyConf(List(Spring, Summer, Autumn, Winter)))
```

便利ですね!

他にもcase classのデフォルト値を使うことができたりするみたいです。

shapelessで型クラスをderiveしてるみたいです。多機能でcatsとか他のライブラリとの親和性も別モジュールで提供してるよう。


## ficus

https://github.com/iheartradio/ficus

*Scala-friendly companion to Typesafe config*

まずライブラリを読み込みます。

```scala
@ import $ivy.`com.iheart::ficus:1.4.3`

@ import net.ceedubs.ficus.Ficus._
```

さっき同じやつ使います。

```scala
@ {
  case class RedisConf(host: String, port: Int)
  case class MySQLConf(host: String, port: Int)
  case class Conf(mySQLConf: MySQLConf, redisClusterConf: Set[RedisConf])
  }

@ import net.ceedubs.ficus.readers.ArbitraryTypeReader._

@ val conf = ConfigFactory.parseString("""{ mySQLConf: { host: "my1", port: 3306 }, redisClusterConf: [ { host: "re1", port: 7000 } ] }""")

@ conf.as[Conf](".")
res11: Conf = Conf(MySQLConf("my1", 3306), Set(RedisConf("re1", 7000)))
```

こっちのライブラリはmacroで取ってきてるみたいです。
軽量だし実用的にはこっちで十分そう。

おわり
【React Native】SafeAreaViewの色を上と下で違う色にする２つの方法


## 初めに
どうも最近React Nativeでアプリを開発しているニーザです。
今日は、React NativeのSafeAreaViewのちょっとした技を紹介したいと思います。
おそらくiPhoneアプリを開発する上で、このように上の部分だけに色をつけてheaderとして、それ以外は違う色にしたい時がきっとありますよね？
通常何もせずにコンテンツをSafeAreaViewでラップするとこの様になってしまうと思います。

<img width="424" alt="スクリーンショット 2018-12-05 19.01.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/144044/4ddb6554-1966-abec-581a-2e56f33aa26e.png">

```js:App.js
import React, { Component } from 'react';
import { StyleSheet, Text, View, SafeAreaView } from 'react-native';

type Props = {};

export default class App extends Component<Props> {
  render() {
    return (
      <SafeAreaView style={styles.safeAreaView}>
        <View style={styles.container}>
          <Text>ほげほげ</Text>
        </View>
      </SafeAreaView>
    );
  }
}

const styles = StyleSheet.create({
  safeAreaView: {
    flex: 1,
    backgroundColor: '#1e90ff'
  },
  container: {
    flex: 1,
    backgroundColor: '#fff'
  },
});

```

この下の部分だけを白くするには２つ方法があります。

## やり方1
**下の部分にposition: absoluteを指定して隠す。**

### ステップ1. Viewを一つ、SafeAreaviewコンポーネントの子要素として作る。

```js:App.js
export default class App extends Component<Props> {
  render() {
    return (
      <SafeAreaView style={styles.safeAreaView}>
        <View style={styles.container}>
          <Text>ほげほげ</Text>
        </View>
        <View style={styles.fixBottomColor} />
      </SafeAreaView>
    );
  }
}
```

### ステップ2. 次のスタイルを指定する。

```js
fixBottomColor: {
  backgroundColor: '#fff',
  position: 'absolute',
  bottom: 0,
  right: 0,
  left: 0,
  height: 100,
  zIndex: -10,
}
```

backgroundColorはcotainerと同じ色を指定しましょう！
これで完成です👏

これから追加したいコンポーネントと干渉を避けるために、z-indexに100を指定していますが、特には必要なくても隠せます。
簡単に実装できますが、追加したいコンポーネントと干渉するかもしれないところが少し傷ですね。

## やり方2
**SafeAreaViewを２つ作る。**

### ステップ1.外側をwrapするViewコンポーネントを用意する。

```js:App.js
<View style={styles.outWrapper}>
  <SafeAreaView style={styles.safeAreaWrapper}>
    <View style={styles.container}>
      <Text>ほげほげ</Text>
    </View>
  </SafeAreaView>
</View>
```
### ステップ2.SafeAreaViewをもう一つ作る。

```js:App.js
<View style={styles.outWrapper}>
  <SafeAreaView style={styles.topSafeArea} />
  <SafeAreaView style={styles.safeAreaWrapper}>
    <View style={styles.container}>
      <Text>ほげほげ</Text>
    </View>
  </SafeAreaView>
</View>
```

### ステップ3.Styleをそれぞれに当てる。
```js
outWrapper: {
  flex: 1
},
topSafeArea: {
  backgroundColor: '#1e90ff'
},
safeAreaWrapper: {
  flex: 1,
  backgroundColor: '#fff'
},
container: {
  flex: 1,
  backgroundColor: '#fff'
},
```

表示したいコンポーネントをラップしているSafeAreaViewのスタイルに、cotainerと同じ色を指定しましょう！
これで完成です👏
このやり方は１番外側を更にラップしたり、SafeAreaを作ったりと手順が多く大変です。
ただ干渉する心配がないところが**やり方1**と比較して良いですね！


## 完成形

<img width="402" alt="スクリーンショット 2018-12-05 19.40.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/144044/c70866ef-10c9-bec8-f94e-f896df3d2c74.png">

## 終わりに
**SafeAreaViewの色を上と下で違う色にする２つの方法**を紹介しました。
どちらのやり方もメリットもデメリットもあるので甲乙つけがたいですね。
もっといいやり方を知っている場合は是非コメントで教えてください👍
[Catapult] アカウントにトランザクションのフィルタや発信許可設定を与えるAccountPropertiesTransaction

# AccountPropertiesTransaction

最近nem2-docsに記述された新しいトランザクションが面白かったので調べてみました。

* [nem2\-docs/account\-filter\.rst at 3f1a78a35ca34c5c400e6fdcc0d4fd210208f6b2 · nemtech/nem2\-docs](https://github.com/nemtech/nem2-docs/blob/3f1a78a35ca34c5c400e6fdcc0d4fd210208f6b2/source/concepts/account-filter.rst)

＊現時点では`master`ブランチに含まれていない状態なので、内容は変更される可能性があります。

これは**Catapult**に実装されている新しいトランザクションタイプです。

これにより、アカウントにホワイトリスト・ブラックリスト、トランザクション発信の有効・無効を設定することができます。
(実のところ私はまだ動作未検証です。ドキュメント漁ってただけなので)

これらはブロックチェーンレベルで動作する、用途は限定的ですが、ある意味で簡易なスマートコントラクトと言えます。
(nem的にはこうゆうのは**スマートアセット**と呼びます:point_up:)



# フィルタ定義

## アカウントフィルタ

特定のアカウント(アドレス)からの受信トランザクションのホワイトリスト・ブラックリストを定義することができます。

![account-properties-address.png](https://qiita-image-store.s3.amazonaws.com/0/2353/5b1fefe0-9636-99da-257a-99be6e3d5c41.png)
＊リポジトリより画像を引用

特定のアカウント(アドレス)からのトランザクションを拒否したり、逆に特定のアカウントからしか受け付けない、というような状態のアカウントを作ることができます。


## モザイクフィルタ

特定のモザイクを含む受信トランザクションのホワイトリスト・ブラックリストを定義することができます。

![account-properties-spam.png](https://qiita-image-store.s3.amazonaws.com/0/2353/5c71bee5-32fd-b6ed-9dc7-d6cae04c3211.png)
＊リポジトリより画像を引用

特定のモザイクを含んでいるトランザクションを拒否したり、特定のモザイクしか受信しない、というような状態のアカウントを作ることができます。


## トランザクションタイプフィルタ

特定のタイプのトランザクションの有効・無効を定義することができます。

特定のトランザクションタイプ(転送、連署、マルチシグ化とか)を無効化し、実行できない状態のアカウントを作ることができます。

そもそも送信トランザクションを発信させる必要が無い前提で運用するアカウント、誤送信防止や必要な場合だけ許可するために、
もしくは、署名だけするアカウントなので、署名以外のトランザクションをさせないようにする、
というようなアカウントにすることができます。


# まとめ

例示では、アドレスを個別の製品に割り当て、品質チェックに問題が無いことを示すモザイクを送付しています。

ホワイトリストによって、品質チェック作業者やセンサーが持つアカウントからだけ受信できるようにすることで、管理外のアカウントから偽の(何らかの方法で漏れたモザイクや名前が紛らわしいモザイク)を送りつけられないように、トランザクションにメタ情報を持たせる場合は、余計なトランザクションが紐づかないようにしています。

トランザクションタイプを制御することで、誤送信をブロックチェーンレベルで防止したりもしています。
これならアプリケーション側に制御する機能が実装されていたとして、それにバグがあってもすり抜けるようなこともなく、安心できますね。

それぞれ、ドキュメントにもある通り、エンタープライズなモザイクをパブリックチェーンで扱うような場合に役に立ちそうな機能です。

トランザクションタイプフィルタも、例えば大きな量のモザイクを扱うようなお店や企業、取引所などではセキュリティ強化に役立ちます。

様々な実用プロジェクトが立ち上がる中、こう言った個人からさまざまな規模の企業が入り混じるパブリックチェーンで起こりがちな問題(不都合)に対する機能が入っているのは大変頼もしい感じがしますね。

"Catapult is soon..."
連想配列をng-repeatでkeyの逆順に並べる方法

タイトル通り、AngularJSで連想配列のキーを元にng-repeatで逆順に並べる方法についてです。
連想配列のキーを元にソートしたいという需要が少ないみたいで解決策に行き着くまで時間がかかりました。

キーの配列を別途用意してそれについてng-repeatを行えば良いみたいです。

[参考リンク](https://stackoverflow.com/questions/30344985/orderby-in-angular-js-for-key-value-object-in-reverse-based-on-keys)の例をそのまま用いて説明します。




```HTML
## HTML
<div ng-repeat="key in keys">
    {{obj[key]}}
</div>

```
```js

// CONTROLLER

$scope.obj = {
  '1991': [{
    'year': 1991,
    'month': 'Jan'
  }, {
    'year': 1991,
    'month': 'Feb'
  }],
  '1992': [{
    'year': 1992,
    'month': 'March'
  }, {
    'year': 1992,
    'month': 'Dec'
  }],
  '2000': [{
    'year': 2000,
    'month': 'Jan'
  }]
};

//キーを逆順にした配列
$scope.keys = Object.keys($scope.obj).reverse();

```
タッチデバイスでもhoverの見た目を再現する

タッチデバイスではhoverの見た目はあまり実装しない風潮ですが、要望があったので対応しました

# デモ
[https://codepen.io/fujimio/pen/PxLdLB](https://codepen.io/fujimio/pen/PxLdLB)

# HTML
対象に`ontouchstart=""`という属性を追加
`ontouchstart`とは「指先が触れた際に発生する」イベントです

```html
<a href="#" ontouchstart="">ボタン</a>
```

# CSS
いつも通り書くだけ！

```CSS
a:hover{
  background: red;
}
```

# タッチデバイスでの挙動

![ezgif.com-video-to-gif (1).gif](https://qiita-image-store.s3.amazonaws.com/0/125437/219d22f9-6fad-7399-fadf-634f793ee081.gif)


- `hover`
タップして、他の要素をタップするまで、デザインが反映され続ける

- `active`
タップされた瞬間、一瞬だけ、デザインが反映される

PC版でいう`hover`は`active`の方がイメージに近いのかな…と思います
CryptZombiesレッスン3(チャプター11~14)の自分なりのまとめ

# はじめに
この記事は私がCryptZombiesを進めていく上で自分なりにまとめたものです。
書いてあることが１００％あってる保証はないです。
**前回の記事**
https://qiita.com/daichi77/items/2648a7c278eb548016db
**参考にしたサイト**
サイト名: イーサリアム上のDApp開発をゲームを作って学びましょう
URL: 　https://cryptozombies.io/jp/　
**この記事の問題文と答えについては上の参考にしたサイトから引用しています。**
# チャプター１１ Storageのコストは高い
## 要点
Solidityでstorageへの操作は高コスト。
データを書き込んだり、変更すると永久にブロックチェーンに記録されることになるのでコストが高くなる。
コストを抑えるためにできるだけstorageに書き込まないようにしたほうがいい。
そのためにmemory内で配列などを宣言する必要がある。

```
uint[] memory 配列名 = new uint[](3);
```
とするとメモリ上で宣言できる。
またメモリ上に配列を作るときは配列の長さを必ず指定しなければならない。
現状array.pushなどで配列の長さを変えることはできない。
## 今回したこと(テスト)
特定のユーザーが保有している全てのゾンビを、uint[]配列として返すgetZombiesByOwner関数の作成。
関数の中でmemory 配列を使用している。

#チャプター１２ Forループ
## 要点
新しいゾンビを作るたびにオーナーのゾンビ配列に追加していくとコスト的に問題がある。
よってgetZombiesByOwner内でforループを使ってそのオーナーのゾンビ軍団の配列を作ってしまう必要がある。
## 今回やったこと(テスト)
for文を回し、ownerのゾンビだけの配列を作成するgetZombiesByOwner内で関数を作成。
こうすることでstorageに追加する必要がなくなり、gasが安くなる。

# チャプター１３ & チャプター１４
特に何もしないので割愛。

# 次の記事
https://qiita.com/daichi77/items/28a44053a1d915fe03b8
S3にファイルが置かれた時 複数のSQS にエンキューする方法

## はじめに

`yaml` が S3 に置かれた時それをトリガにSQSにエンキューする必要がありました。
一般的には、S3 Event Notificasions によりエンキューをすれば良いのですが、エンキュー先が複数に必要になりました。

用途別で分けるだけなら、S３のプレフィックスで制御することもできますが、時間帯により分ける必要があったので、lambda を使って実装しました。

## エンキュー先

1. 夜間用SQS（process.env.sqsUriNight）
2. 昼の低速処理用SQS（process.env.sqsUriNormal）
3. 昼の高速処理用SQS（process.env.sqsUriFast）


## 使ったコード

低速高速の分岐はコードを見ての通り、 `yaml` 内にある `photos` の数により判断します。
同様のソースを書く場合の参考にしてください。

```js:index.js(node8)
'use strict';

const aws = require('aws-sdk');
const yaml = require('yaml');
require('date-utils');

const s3 = new aws.S3({apiVersion: '2006-03-01'});
const sqs = new aws.SQS({apiVersion: '2012-11-05'});
let sqsUriNormal = process.env.sqsUriNormal;
let sqsUriFast = process.env.sqsUriFast;
let sqsUriNight = process.env.sqsUriNight;
let threshold = process.env.threshold;
let nightStart = process.env.nightStart;
let nightEnd = process.env.nightEnd;

let enqueueSQS = (uri, key) => {
  let params = {
    MessageBody: key,
    QueueUrl: uri,
  };

  return sqs.sendMessage(params).promise();
};

let getYaml = (bucket, key) => {
  let yamlParam = {
    Bucket: bucket,
    Key: key,
  };

  return s3.getObject(yamlParam).promise();
};

let isNight = () => {
  let now = Number(new Date().toFormat('HH24MISS'));
  return nightStart <= now && now < nightEnd;
};

let parseYaml = (data) => yaml.parse(data.Body.toString());

let getPutSqs = (data) => {
  if (isNight()) {
    return sqsUriNight;
  }
  if (data.photos.length > threshold) {
    return sqsUriNormal;
  }
  return sqsUriFast;
};

exports.handler = async (event, context) => {
  let bucket = event.Records[0].s3.bucket.name;
  let key = decodeURIComponent(event.Records[0].s3.object.key);
  try {
  let sqsName = getPutSqs(parseYaml(await getYaml(bucket, key)));
  let ret = await enqueueSQS(sqsName, key);
  console.log(msg);
  return msg;
};

```
【統計基礎　自己学習】ポワソン分布(Python)

# 目的

統計モデリングについて勉強を進めるために基礎的な知識を身につける。
まずはポワソン分布から。

# 参考にしたもの

* https://qiita.com/tackey/items/96171be393912fb333b3
* [東京大学出版会 統計学入門](https://www.amazon.co.jp/%E7%B5%B1%E8%A8%88%E5%AD%A6%E5%85%A5%E9%96%80-%E5%9F%BA%E7%A4%8E%E7%B5%B1%E8%A8%88%E5%AD%A6%E2%85%A0-%E6%9D%B1%E4%BA%AC%E5%A4%A7%E5%AD%A6%E6%95%99%E9%A4%8A%E5%AD%A6%E9%83%A8%E7%B5%B1%E8%A8%88%E5%AD%A6%E6%95%99%E5%AE%A4/dp/4130420658)

# ノート

いろいろと試した結果を以下に置いた。

https://github.com/ken223/statistical_modeling/blob/master/poisson_distribution.ipynb

## 以下、学習結果を一部抜粋

### ポアソン分布の利用方法

* プロシア陸軍において馬に蹴られて死んだ兵士数
* 交通事故件数
* 大量生産の不良品数
* 破産件数
* 火災件数
* 砲弾命中数
* 遺伝子の突然変異数
* 電話の呼び数
* 渋滞していない高速道路の料金ゲートへの車の到着数
(東京大学出版会 統計学入門より)

λのみにより分布が求められる。
λは与えられたデータセットの平均をセットする。
この性質により、データセットの平均値のみからレアケースの確率分布が取得できるというメリットがある。

### 例題

以下の例題を考えてみた。

> 年間50件交通事故が発生している市で、1日あたり交通事故が2件以上発生する確率

以下抜粋

```
from scipy.stats import poisson

accident_per_day = 50 / 365
poisson_arr = np.random.poisson(lam=accident_per_day, size=10000)
max_val = np.max(poisson_arr)

# ポワソン分布に従った確率変数を取得
x_range = np.arange(max_val + 1)
poisson_prob = poisson.pmf(x_range, mu=accident_per_day)

fig, ax1 = plt.subplots()
ax1.hist(x=poisson_arr, align='mid', bins=10)
ax2 = ax1.twinx()
ax2.plot(x_range, poisson_prob, 'ro--')
plt.show()

```

![download.png](https://qiita-image-store.s3.amazonaws.com/0/298078/e4d6cb0f-51d6-3a68-76bc-5e7b12787527.png)

2軸になったことでy軸の原点がずれているが、おおむね傾向は問題なさそう。

2件/1日以上となるところを抽出すると以下の通りとなる。

```
# ランダムで発生したpoisson分布から求めた2件/1日以上の交通事故が発生する可能性
arr_over_2 = np.sum(poisson_arr > 1) / 10000
print('1日2件以上の交通事故発生確率: {}'.format(arr_over_2))
 
# poisson分布に従った確率分布から求めた2件/1日以上の交通事故が発生する可能性
prob_over_2 = np.sum(poisson_prob[2:])
print('1日2件以上の交通事故発生確率: {}'.format(prob_over_2))
```

```
1日2件以上の交通事故発生確率: 0.0086
1日2件以上の交通事故発生確率: 0.008555063881597425
```

どちらのパターンでも同じような確率になっていることが分かった。
jsdoでchip8　その15

#概要

jsdoでchip8やってみた。
開発環境を整備してみた。
romファイルを読み込むエミュ作った。

#使い方

romファイルを選択するか、ドロップすれば、実行する。

#成果物

http://jsdo.it/ohisama1/anMn/

以上。
GitLab小ネタ集

# 2018年のGitLab小ネタ集

GitLab Advent Calendar 2018 - Qiita
https://qiita.com/advent-calendar/2018/gitlab
の6日目です。

ネタがまとめられず、小ネタ集になりました。

## 1. Mattermost を有効化する方法

```file:/etc/gitlab/gitlab.rb
mattermost_external_url 'http://mattermost.example.com'
mattermost_nginx['ssl_certificate'] = "/etc/gitlab/ssl/mattermost-nginx.crt"
mattermost_nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/mattermost-nginx.key"
mattermost_nginx['redirect_http_to_https'] = true
```

```file:bash
$ sudo gitlab-ctl reconfigure
```
で有効になります。

## 2. GitLab Runner を社内環境に構成

GitLab サーバーをAWSに立てていますが、Runnerはそれなりにリソースが必要なので AWS に立てたくなかったので、社内のインターネット側に出ていないサーバーに立ててみました。

GitLab RunnerをAWSインスタンスに立てている人もいらっしゃるので問題ないのですが、それなりにリソースを沢山割り当てて気にせず使えるので快適です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/fd510cad-f4fe-0627-d718-ab5f1b9900eb.png)


## 3. GitLab Mattermost のチャットデータを移行

社内からの要望がありSlackからMattermostへ移行しました。Slackからのデータのインポートは問題なくできたのですが、GitLabのMattermostからチャットデータを抜き出したいという要望があり対応しました。

```shell
$ cd /var/opt/gitlab/
$ sudo -u mattermost /opt/gitlab/embedded/bin/mattermost --config=/var/opt/gitlab/mattermost/config.json export bulk /var/tmp/bulk_data.json
```

/var/tmp/bulk_data.json に保存されます。

## 4. GitLab ゼロダウンタイムアップグレード

ゼロダウンタイムアップグレードの話は、以下に書きました。

GitLab CEで Zeroダウンタイムアップグレードを試す - Qiita
https://qiita.com/ynott/items/77e6f287a44bc1d6e797

## 5. GitLab で Container RegistryだけPublicにする方法

DockerからPush/PullしたいということでPublicにする方法を書きました。

GitLab で Container RegistryだけPublicにする方法 - Qiita
https://qiita.com/ynott/items/0794a3bf6f89bded9b19

# まとめ

来年もGitLabを使い込んで行きたいと思います。
jsdoでchip8　その14

#概要

jsdoでchip8やってみた。
開発環境を整備してみた。
romファイルを読み込むディスアセンブラ作った。

#使い方

romファイルを選択するか、ドロップすれば、ディスアセンブルする。


#成果物

http://jsdo.it/ohisama1/i0fK

以上。