OmniAICreator/Qiita-1.07M huggingface dataset:
Backpropagation Neural Network Java Code for learning XOR gate pattern

I made neural network to learn XOR gate pattern using backpropagation learning method.

XOR Gate Pattern:

A = 0
B = 0
A XOR B = 0

A = 0
B = 1
A XOR B = 1

A = 1
B = 0
A XOR B = 1

A = 1
B = 1
A XOR B = 0

Java code for this neural network can be found here:
https://github.com/d-3-nny/AI-repo
AWS - Athenaで先週分がJSTで取れるビューを作る

良いやり方を教えていただきました

- https://qiita.com/sakamossan/items/adc8668038226a65436b#comment-bbfef1ec7866ff507f3a

---

`week_of_year` で取りたいならもう少し楽だけど、昨日からの直近7日間が欲しい
たとえば日本時間の8月4日にクエリしたら (2018-07-28 < 2018-08-03) の範囲が欲しい

- テーブルのパーティションが (`year`, `month`, `day`) で切られているのでそれを使いたい
- ミリ秒単位のタイムスタンプが入っているカラム(timestamp)がある

```sql
CREATE VIEW v AS
SELECT
    t.*,
    from_unixtime(t.timestamp / 1000) utc_timestamp
FROM t
WHERE
    (
        (
            year = year(current_date - interval '1' day) AND
            month = month(current_date - interval '1' day) AND
            day = day(current_date - interval '1' day)
        ) OR (
            year = year(current_date - interval '2' day) AND
            month = month(current_date - interval '2' day) AND
            day = day(current_date - interval '2' day)
        ) OR (
            year = year(current_date - interval '3' day) AND
            month = month(current_date - interval '3' day) AND
            day = day(current_date - interval '3' day)
        ) OR (
            year = year(current_date - interval '4' day) AND
            month = month(current_date - interval '4' day) AND
            day = day(current_date - interval '4' day)
        ) OR (
            year = year(current_date - interval '5' day) AND
            month = month(current_date - interval '5' day) AND
            day = day(current_date - interval '5' day)
        ) OR (
            year = year(current_date - interval '6' day) AND
            month = month(current_date - interval '6' day) AND
            day = day(current_date - interval '6' day)
        ) OR (
            year = year(current_date - interval '7' day) AND
            month = month(current_date - interval '7' day) AND
            day = day(current_date - interval '7' day)
        ) OR (
            year = year(current_date - interval '8' day) AND
            month = month(current_date - interval '8' day) AND
            day = day(current_date - interval '8' day)
        )
    )
    AND date_trunc('day', current_timestamp AT TIME ZONE 'Asia/Tokyo')
        > from_unixtime(t.timestamp / 1000) AT TIME ZONE 'Asia/Tokyo'
    AND from_unixtime(t.timestamp / 1000) AT TIME ZONE 'Asia/Tokyo'
        >= date_trunc('day', current_timestamp AT TIME ZONE 'Asia/Tokyo' - interval '7' day)
```

もう少し簡潔に書けるような感じもするけど、パーティション使おうとすると難しい

> テーブルのパーティションが (`year`, `month`, `day`) で切られているのでそれを使いたい

が、良いやり方あれば教えてください 🙏

### ドキュメント

- [6.10. Date and Time Functions and Operators — Presto 0.172 Documentation](https://prestodb.io/docs/0.172/functions/datetime.html)
    - [2018 年 1 月 19 日 - Amazon Athena](https://docs.aws.amazon.com/ja_jp/athena/latest/ug/release-note-2018-01-19.html)
Colaboratoryでグーグルドライブをマウントする際の注意点

自分のメモ用に残します。

Colaboratoryでグーグルドライブをマウントした場合は、グーグルドライブの
作業フォルダをいじらないように注意しましょう。

自分の場合は、作業フォルダでGANの生成画像をチマチマ消していたら、途中で
Colaboratoryからエラーが出ました。
rspecでupdateのテストを通せない初心者が疑うべきこと

例えばこんなspecを書いていたとする．
（ちなみに雰囲気で書いたので色々と足りなかったりするがお察しいただけると幸いです）

```Ruby
it '名前が更新される' do
  put path, params: { name: 'new_name!' }
  expect(user.name).not_to eq 'old_name'
end
```

これだといくら実装が正しくてもテストは通らない．
なぜなら，DBの値が更新されてもすでに読み込まれた `user` インスタンスの値は更新されないからだ．

インスタンスの値を更新するには `user.reload` とすればよい．
これを用いると上の例は次のように修正できる．

```Ruby
it '名前が更新される' do
  put path, params: { name: 'new_name!' }
  expect(user.reload.name).not_to eq 'old_name'
end
```
Mac に nodenv を利用して Node.js をインストールする

Mac に [nodenv](https://github.com/nodenv/nodenv) を利用して Go をインストールする手順。

## nodenv のインストール
Homebrew でもインストールできるが、 `git clone` でインストールする。手順は [nodenv](https://github.com/nodenv/nodenv) のドキュメントを参照する。

```shell-session
$ git clone https://github.com/nodenv/nodenv.git ~/.nodenv
$ cd ~/.nodenv && src/configure && make -C src
```

`.bash_profile` に下記を追記する。

```sh
# nodenv
export PATH="$HOME/.nodenv/bin:$PATH"
eval "$(nodenv init -)"
```

`.bash_profile` を読み込む。

```shell-session
$ source .bash_profile
```

`node-build` をインストールする

```shell-session
$ git clone https://github.com/nodenv/node-build.git $(nodenv root)/plugins/node-build
```

## nodenv の使い方

インストール可能なバージョンを確認する。

```shell-session
$ nodenv install -l
```

指定のバージョンをインストールする。

```shell-session
$ nodenv install 8.11.3
$ nodenv rehash
```

指定のバージョンをグローバルで利用する。

```shell-session
$ nodenv global 8.11.3
```

指定のバージョンをローカル（そのディレクトリ）で利用する。

```shell-session
$ nodenv local 8.11.3
```

マシンにインストールされているバージョンを確認する。

```shell-session
$ nodenv versions
```

## nodenv を更新する方法

```shell-session
$ cd $(nodenv root)
$ git pull
```

## node-build を更新する方法

```shell-session
$ cd $(nodenv root)/plugins/node-build
$ git pull
```
厳選5選！便利なZenHubショートカット集

Zenhubを使う上でGUIではなく、コマンドベースでショートカットを利用したほうが作業が捗るのでショートカットを記載していきます。


# 1 : `z + s` Open Shortcuts 
`z + s` でショートカット一覧が出せます。忘れたときはここを見れば逆引きが可能です。※Web app独自の機能です。
<img width="600" alt="スクリーンショット 2018-08-04 15.25.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/122901/6b4276de-e31c-5547-614b-068ceb5089fd.png">


# ２ : `n + i` Create New Issue
`n + i` でissueが作成できます。Zenhub操作の中では必須になってくる作業のため重宝しています．
<img width="600" alt="スクリーンショット 2018-08-04 15.30.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/122901/2d34b364-adcb-0142-de59-96a4d6c83565.png">

# 3 : `b + m` Filter Milestones
`b + m`でMilestoneでのissueの絞り込みが可能です。Milestoneでスプリントを作成しているとデフォルトのZenhubですべてのチケットが表示されているのをスプリント毎に絞り込みを可視化しています。
<img width="600" alt="スクリーンショット_2018-08-04_15_34_39.png" src="https://qiita-image-store.s3.amazonaws.com/0/122901/43190371-921d-1be5-6ac6-1a361f10398d.png">

# 4 : `b + a` Select Assignee
`b + a`でAssigneeを選択できます。
DailyScrumでファシリーテーターで、Assigneeごとのタスクを確認する際にこのショートカットでスムーズに切り替えられるので良いです。
<img width="600" alt="スクリーンショット_2018-08-04_15_44_50.png" src="https://qiita-image-store.s3.amazonaws.com/0/122901/6659b888-c524-6944-20b0-6bd81d78f695.png">


# 5 : `shift + z` Open Repo selector (webapp), open Repo switcher (extension)
`shift + z`で設定している他のリポジトリ一覧がさせて飛べます。
<img width="600" alt="スクリーンショット_2018-08-04_15_38_14.png" src="https://qiita-image-store.s3.amazonaws.com/0/122901/f82eb00a-8f0c-1781-90a2-c336d96f1b3d.png">

以上です。


# まとめ
基本的にZenhubのショートカットは直感的でわかりやすいです。

**Global shortcuts**の場合には、頭文字は`z`ではじまり、**Board**内での操作は`b`、**issue**の中の操作は`i`で始まります。そこから後は機能の頭文字をつけるだけで大丈夫です。

ex. issueの中でAssigneeを設定したい。 `i + a` (issue → Assignee)
<img width="600" alt="スクリーンショット_2018-08-04_15_51_03.png" src="https://qiita-image-store.s3.amazonaws.com/0/122901/022b10d1-f8af-fe19-8b60-6467b7cc8428.png">
Spring Boot + JUnit + Mockitoで単体テストをやる

[Spring Boot + MySQLでシンプルなWeb REST APIサーバを実装する - Qiita](https://qiita.com/YutaKase6/items/007f6b7d12d342c1330c)

# Outline
Spring Bootで作成したREST APIのテストを組む。
モックを利用した単体テストをやる。

今回は例として、Service(UserService.java)のテストを組む。
[Spring BootとJPAでREST APIを実装する(ドメイン層編) - Qiita](https://qiita.com/YutaKase6/items/d0a606c8688c63fd9874#userservicejava)

Repositoryをモック化して、Serviceのコードに集中したテストを組む。

# Mockito
モック化にはMockitoというライブラリを利用する。
spring-boot-starter-testを利用していればすぐに利用可能。
[Mockito framework site](http://site.mockito.org/)
<img width=512 src="https://github.com/mockito/mockito.github.io/raw/master/img/logo%402x.png">

# 準備
これまでの手順でプロジェクトを作成(Spring Initializr)していれば、特に準備は必要ない。
既にMockitoは利用できるようになっている(spring-boot-starter-test)。

# UserServiceTests.java
```UserServiceTests.java
package com.example.springapi.domain;

import com.example.springapi.domain.object.User;
import com.example.springapi.domain.repository.UserRepository;
import com.example.springapi.domain.service.UserService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.springframework.test.context.junit4.SpringRunner;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

@RunWith(SpringRunner.class)
public class UserServiceTests {

    private final static String TEST_ID = "test_id";
    private final static String TEST_VALUE = "test_value";

    private User testUser;

    @Mock
    private UserRepository userRepository;
    @InjectMocks
    private UserService userService;

    @Before
    public void setup() {
        this.testUser = User.builder()
                .id(TEST_ID)
                .value(TEST_VALUE)
                .build();
    }

    @Test
    public void findById() {

        when(this.userRepository.findById(TEST_ID)).thenReturn(this.testUser);

        User actual = this.userService.findById(TEST_ID);

        assertThat(actual).isEqualTo(this.testUser);

        verify(this.userRepository, times(1)).findById(TEST_ID);
    }

    @Test
    public void save() {

        when(this.userRepository.save(this.testUser)).thenReturn(this.testUser);

        User actual = this.userService.save(this.testUser);

        assertThat(actual).isEqualTo(this.testUser);

        verify(this.userRepository, times(1)).save(this.testUser);
    }

    @Test
    public void deleteById() {

        this.userService.deleteById(TEST_ID);

        verify(this.userRepository, times(1)).deleteById(TEST_ID);
    }
}
```

## @Runwith
JUnitのアノテーション。
テストの実行方法を指定するアノテーション。
これから紹介するMockitoのアノテーションを利用するためには、このアノテーションで`MockitoJUnitRunner.class`を指定しなければならない。
Springでは`SpringRunner.class`というものが用意されており、これを利用することでもMockitoを利用することができる。

## @Mock
Mockitoのアノテーション。
付与したフィールドにモックインスタンスを生成する。

## @InjectMocks
Mockitoのアノテーション。
@Mockのついたインスタンスを注入したインスタンスを生成する。

## Mockito.when(), thenReturn()
モック化したインスタンスのメソッドに引数と返り値のペアを定義する。  

##  Mockito.verify()
指定したモックのメソッドが何回呼び出されたかを確認することができる。
最低n回とかいろいろできる。
Ansible—自作モジュール開発の第一歩 ( example モジュールの作成 )

## モジュール実行スクリプトの作成

`some_key="some value"` を返すだけのスクリプト。

```ansible_module/example.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

from ansible.module_utils.basic import AnsibleModule

module = AnsibleModule(
    argument_spec=dict()
)

result = dict(
    some_key="some value",
)

module.exit_json(**result)
```


別にpythonスクリプトでなくても良いが、ここではpythonを使う。


## ansibleコマンドを実行

`example.py` が存在するディレクトリを `--module-path` で指定する。


```
$ ansible localhost -m 'example' --module-path=./ansible_module

localhost | SUCCESS => {
    "changed": false,
    "some_key": "some value"
}
```

実行できた！


## ダウンロード用

`example.py` を git clone する場合はこちら

```
git clone https://gist.github.com/YumaInaura/829b06cbf1c2ad5fa0a823ba24f8afbf/ ansible_module
```

## 環境

- ansible 2.6.1 ( installed by homebrew )
- Mac OSX High Sierra 10.13.4

## 参考

- [Developing Modules — Ansible Documentation](https://docs.ansible.com/ansible/2.5/dev_guide/developing_modules.html)


# Gist

- [Start developing ansible module ( The first step : create example module )](https://gist.github.com/YumaInaura/829b06cbf1c2ad5fa0a823ba24f8afbf)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Dell Powerconnect5424の初期化手順

日本語では初期化に関して信頼できる記事がヒットしなかったので、公式コミュニティのリンク貼っておきます。
https://www.dell.com/community/Networking-General/Factory-Reset-Procedure-for-5424/td-p/3985148

まあ古い機器なんで情報なくても仕方ないかもしれないですね。
接続でも詰まったんですが、ボーレートは9600で大丈夫でした。

環境：
デスクトップ
クロスケーブル（9-pin）
teraterm（ボーレート9600）

※usbのコンバータ挟んでノートPCから接続すると接続できませんでした。原因は不明。おま環かも。
ORA-28040：一致する認証プロトコルの例外はありません　の対処法

ネットで調べるとSQLNET.ALLOWED_LOGON_VERSIONをマシン同士で一致させるなどの対処法が出てきますが、
oracle client が32bit でoracle database が64bitの場合にも
ORA-28040：一致する認証プロトコルの例外はありません というエラーが出ます。

初歩的ですが、意外と見落としがちなので気を付けましょう。
mesonとninjaとWSLを使ってMSVCのclでビルドするためのメモ

WSLからWindows側にインストールしたmesonとninja使ってMSVCのcl.exeでビルドするためのメモです。

# 準備
以下を用意します。バージョン等はこの記事を書いているときの最新版なので適宜読み替えてください。

Visual Studio 2017
https://visualstudio.microsoft.com/

meson (meson-0.47.1-64.msi)
https://github.com/mesonbuild/meson/releases

ninja (ninja-win.zip)
https://github.com/ninja-build/ninja/releases

# 環境変数の設定
Windowsの環境変数にパスを設定していきます。

## Visual Studio
以下の例はデフォルトのままインストールした場合のパスです。

変数`PATH`に以下のパスを設定します。

* `C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\bin\Hostx64\x64`
* `C:\Program Files (x86)\Windows Kits\10\bin\10.0.17134.0\x64`

変数`INCLUDE`に以下のパスを設定します。

* `C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include`
* `C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\shared`
* `C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\ucrt`
* `C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\um`

変数`LIB`に以下のパスを設定します。

* `C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\lib\x64`
* `C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17134.0\ucrt\x64`
* `C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17134.0\um\x64`

## meson
インストーラでパスを通すように設定できます。
(ちなみにデフォルトのパスは`C:\Program Files\Meson`)

## ninja
Windowsバイナリのninjaはexeファイル単独なので、適当なフォルダに置いて変数`PATH`にそのフォルダのパスを設定します。

# WSLで使う
WSLのターミナルで、以下のように`meson`と`ninja`に`.exe`をつければWindowsにインストールされたmesonとninjaを使うことができます。mesonが自動的に`cl.exe`を使うように設定してくれます。

```shell:meson
meson.exe build
```
```shell:ninja
ninja.exe -C build
```
pyenvでPythonバージョン管理

## 前提条件
homebrewインストール済み

## pyenvインストール

```
$ brew install pyenv
```

## PYENV_ROOTを設定

```terminal
$ cat << 'EOS' >> ~/.bash_profile
> export PYENV_ROOT=/usr/local/var/pyenv
> if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi
> EOS
$ source ~/.bash_profile
```

## インストールできるversion一覧表示

```
$ pyenv install --list
```

## Pythonインストール

```
$ pyenv install 3.7.0
```

## バージョン切り替え

切り替え可能なバージョン一覧を表示します。

```
$ pyenv versions
* system (set by /usr/local/var/pyenv/version)
  3.7.0
```

## バージョン切り替え

```
$ pyenv global 3.7.0
```

## バージョン確認

```
$ python --version
Python 3.7.0
```

無事インストールできました。
Spring Boot + JUnitで単体テストをやる

[Spring Boot + MySQLでシンプルなWeb REST APIサーバを実装する - Qiita](https://qiita.com/YutaKase6/items/007f6b7d12d342c1330c)

# Outline
Spring Bootで作成したREST APIの単体テストをつくる。
ここでは、JUnitの機能で組める範囲で。
<img src="https://junit.org/junit4/images/junit-logo.png">

テスト対象のクラスが他のクラスに依存していなければ、JUnitのみでシンプルに組める。
今回は例として、インフラ層で作成したEntityクラスのテストを組む。
[Spring BootとJPAでREST APIを実装する(インフラ層編) - Qiita](https://qiita.com/YutaKase6/items/50661538166900146eeb#userentityjava)

# 準備
これまでの手順でプロジェクトを作成(Spring Initializr)していれば、特に準備は必要ない。
既にJUnitは利用できるようになっている(spring-boot-starter-test)。

# UserEntityTests.java
```UserEntityTests.java
package com.example.springapi.infrastructure;

import com.example.springapi.domain.object.User;
import com.example.springapi.infrastructure.entity.UserEntity;
import org.junit.Before;
import org.junit.Test;

import static org.assertj.core.api.Assertions.assertThat;

public class UserEntityTests {
    private final static String TEST_ID = "test_id";
    private final static String TEST_VALUE = "test_value";

    private User expectedUser;
    private UserEntity expectedUserEntity;

    @Before
    public void setup() {
        this.expectedUser = User.builder()
                .id(TEST_ID)
                .value(TEST_VALUE)
                .build();

        this.expectedUserEntity = UserEntity.builder()
                .id(TEST_ID)
                .value(TEST_VALUE)
                .build();
    }

    @Test
    public void buildTests() {
        UserEntity actual = UserEntity.build(this.expectedUser);

        assertThat(actual.getId()).isEqualTo(this.expectedUser.getId());
        assertThat(actual.getValue()).isEqualTo(this.expectedUser.getValue());
    }

    @Test
    public void toDomainTests() {
        User actual = this.expectedUserEntity.toDomainUser();

        assertThat(actual.getId()).isEqualTo(this.expectedUserEntity.getId());
        assertThat(actual.getValue()).isEqualTo(this.expectedUserEntity.getValue());
    }
}
```

## @Test
テスト実行時に実行されるメソッドになる。
引数exceptedにThrowableクラスを指定することで、Exceptionがthrowされるケースをテストにすることができる。

```java
@Test(expected = IllegalStateException.class)
```

## @Before
@Testの付与されたメソッドの呼び出し前に実行されるメソッドとなる。  

## org.assertj.core.api.Assertions.assertThat
Assertする書き方のひとつ。
[AssertJ](http://joel-costigliola.github.io/assertj/)というライブラリのAPI。(これもJUnit同様、最初から使える。) 
メソッドチェーン的に記述することができる。(IDEの補完が聞くので使いやすい。)
デバック時にiOSアプリのコンテナ情報を取得したり、置き換えて再現する方法

Androidアプリエンジニアを２年くらいしてたんですが、
最近はiOSアプリを業務でやりはじめてます。
学んだことを忘れそうなのでメモ残してきます_φ(･_･

今回はデバックアプリの永続化情報を取得したり、
逆に移植してアプリの内部情報を再現したりする方法をまとめてみました。

## クラッシュ時にデバックアプリから情報をサルベージ
アプリが永続データ由来でクラッシュした時とか、アプリ内の情報をサルベージして調査とかに使えそう

### 1. Xcodeが起動した状態でWindowメニューを選択

![スクリーンショット 2018-08-04 14.33.15.png](https://qiita-image-store.s3.amazonaws.com/0/126555/9e0f15b1-fb2e-b67f-1d06-10001720a1f8.png)

### 2. Devices and Simulatorsを選択
![スクリーンショット 2018-08-04 14.35.33.png](https://qiita-image-store.s3.amazonaws.com/0/126555/012e80b9-076f-20c5-e494-fada7ec54c6d.png)


### 3. 拡張子がxcappdataのファイルをダウンロード
![スクリーンショット 2018-08-04 14.40.05.png](https://qiita-image-store.s3.amazonaws.com/0/126555/677f56ba-7fd9-1dc2-d441-287cfeb86753.png)

### 4. ダウンロードファイルを右クリックして”パッケージの内容を表示”を選択
![スクリーンショット 2018-08-04 15.13.09.png](https://qiita-image-store.s3.amazonaws.com/0/126555/630a9d05-7fc5-da14-880c-c65710d69b91.png)

これで、アプリ内のDBデータなどを見れたりします。
コンテナ情報を置き換えてデバックアプリの永続情報を別端末で再現したりとかもできるので結構便利でした。
ECSでrubyを回す時にCloud Watch Logsにログが出ない対処法

# 背景
litaでslack用のbotを作成していたが、
`lita-slack`ではfileのアップロードに対応できないためlitaを使わずbotを作っていた

# 起こったこと
rubyのbotを動かして見た所`cloud watch logs`にログが出てこなかった
途中で気づいたのだがタスクを終了した途端ログが吐き出されていた

# 原因と対処法
以下のページに書いてあったのだがrubyは出力をバッファに溜めてから出力するようで、
ためている途中はログが出ないことが問題だった
[rubyで出力のバッファリングをやめる](https://kingyo-bachi.blogspot.com/2011/08/ruby.html)

そのため`STDOUT.sync = true`を追加すればリアルタイムで出力されるようになった

# コード
```dockerfile:dockerfile
FROM ruby:2.4.1

ENV APP_ROOT /usr/src/app
WORKDIR /usr/src/app

COPY Gemfile ./
RUN bundle install

COPY . .

CMD ["ruby","/usr/src/app/main.rb"]
```

```ruby:main.rb
require File.dirname(__FILE__) + '/chatops_file'

# ここを追加
STDOUT.sync = true

puts("[INFO] starting chatops-file-bot ...")

if ENV['ENV'] == 'prd'
  slack_token = "xoxb-************-************************"
else
  slack_token = "xoxb-************-************************"
end


puts("[INFO] slack token : #{slack_token}")

ENV.update({'SLACK_TOKEN' => slack_token})


begin
  chatops_file = ChatopsFile.new
  chatops_file.slack_bot
rescue StandardError => e
  puts("#{e.message}\n#{e.backtrace.join("\n")}")
end
```
Rails 5.2 + Webpacker を OpsWorks Chef 11 でデプロイする

## 1. 概要
~~古き良き~~アセットパイプラインを使用するRailsアプリケーションから脱却し、
なんとかかんとか、Rails5.2 + Webpackerでアプリをつくりましたが、
今まで当たり前のように`OpsWorks`でデプロイしてきたので、デプロイでかなりつまりました。。。

`Capistrano`とか`Itamae`を使うことも考えたり、
`OpsWorks Chef 12`を使いカスタムクックブックを作成する道を模索したり、
はたまた、`Elastic Beanstalk`でデプロイする道を模索したりしました。

が、弊社はちょっとしたフロントエンドの更新など、
ノンプログラマがデプロイを行うこともあるので、
なんとか`OpsWorks`それもかわらぬ`Chef 11`でできぬかと模索しました結果...

凄くシンプルな方法で行けることがわかりました。
この問題に囚われっぱなしだった1週間ぐらいを返してほしい・・・

この投稿が少しでも、同じ状況の方のお役に立てれば幸いです。

## 2. 対象者
この記事は以下の条件を全て満たす方が対象です。
1. Rails5.2 + Webpackerで可動するアプリが既に完成している
2. OpsWorks(Chef 11)でのデプロイは行える。


## 3. 手順解説

~~### 3-1. インスタンス立ち上げ直後の初回のみ必要な操作~~
この手順は不要になりました。
以下のdeploy hookの設定ファイルを作成するだけで、
インスタンス追加時も問題なくデプロイできました。

### 3-1. Chefのdeploy hookの設定ファイルを作成
該当のRailsアプリのルートディレクトリに`deploy`ディレクトリを作成し、
その中に`before_migrate.rb`というファイルを作成する。

その中身は以下のように記載してデプロイするだけでOK。
`ご自身のアプリ名`のところは、ご自身のRailsアプリ名をシンボルで入力してください。

たとえば、デプロイするアプリ名が`rails_blog`であれば、`:rails_blog`と入力します。
ハイフンを含むアプリ名はハイフンが自動的に`_`アンダースコアになるそうですので、
確認しておりませんが、該当する場合は注意が必要です。

```
Chef::Log.info("Running deploy/before_migrate.rb")
env = node[:deploy][ご自身のアプリ名][:rails_env]
current_release = release_path

execute "config_nodejs" do
  user 'root'
  cwd current_release
  command "curl --silent --location https://rpm.nodesource.com/setup_8.x | bash - "
end

execute "install_nodejs" do
  user 'root'
  cwd current_release
  command "yum -y install nodejs"
end

execute "config_yarn" do
  user 'root'
  cwd current_release
  command "curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo"
end

execute "install_yarn" do
  user 'root'
  cwd current_release
  command "yum -y install yarn"
end

execute "yarn install" do
  cwd current_release
  command "yarn install"
  environment "RAILS_ENV" => env
end

execute "webpack" do
  cwd current_release
  command "./bin/webpack"
  environment({"RAILS_ENV" => env, "NODE_ENV" =>env})
end
```

#### 3-2. `assets:precompile`じゃだめなのか?

`Webpacker`は`bundle exec rails assets:precompile`にフックして、
`yarn:install`と`webpack:compile`を実行してくれるとWebpackerの公式ドキュメントに有ります。

それに基づいてはじめは、`deploy/before_migration.rb`内では、
`bundle exec rails assets:precompile`を実行するようにしていました。

しかし、それでは何故かうまくいきませんでした。。。
`bundle exec rails webpack:compile`や、
`bundle exec rake assets:precompile`、
`bundle exec rake webpack:compile`も試しましたが、
エラーでうまくデプロイできなかったり、デプロイで来てもRailsアプリが正常に動作しなかったりでした。


### 4. まとめ
本当に今回は手こずりました。
終わってみればシンプルなことなのですが、
そこにストレートに導いてくれる解説や情報がなく時間がかかりました。

この方法を見つける直前は、一回でプロイしてからSSh接続して、
`yarn install`と`NODE_ENV=production ./bin/webpack`実行して、
またOpsWorksからWeb Sever Restartするというめちゃめんどくさい方法でやっていました。

この方法が見つかってよかったです。

ご意見・ご質問遠慮なくコメントください。
またもっといい方法であったらぜひご教授お願いします。
特にインスタンスい追加時の初回の作業もChefで自動化したいです。

## 参考記事
[OpsWorksでNodejsアプリを動かすときにNODE_ENVが指定できないのを何とかする件](http://interu.hatenablog.com/entry/2014/03/12/200447)
Swiftで困っときに見るもの（音の取得と、アニメーションの設定）


##音データを取得して表示させる

```Swift
if SoundPlayServive.shared.isPlaying {
                        let plyersSelect: [Sound] = SoundPlayServive.shared.playingSounds
                        plyersSelect.forEach { selectPlyer in
                            print("\(selectPlyer.title)-\(selectPlyer.id): \(SoundPlayServive.shared.getVolume(with: selectPlyer.id))")
                        }
                    }
```


##アニメーションの設定

```swift
//ボタンを揺らすアニメーション
                UIView.animate(withDuration: 0.2, animations: {
                    self?.bookStatusButton.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)
                }, completion: { _ in
                    UIView.animate(withDuration: 0.2) {
                        self?.bookStatusButton.transform = CGAffineTransform.identity
                    }
                })
```
参考：https://slack-redir.net/link?url=https%3A%2F%2Fqiita.com%2Fhayashi311%2Fitems%2F953d3282c6ffebf308df

```swift
                   UIView.animate(withDuration: 1.0, delay: 0.0, options: .curveEaseOut, animations: {
                        self.soundControlViews.frame = CGRect(x: soudViewsFrame.origin.x, y: soudViewsFrame.origin.y, width: soudViewsBounds.width, height : soudViewsBounds.height + addHights)
                        }, completion: nil)
```
OpenCVの顔認識をAndroidスマホで動作させる

# はじめに
OpenCVの顔認識をAndroidで動作させるには、[AndroidでOpenCV 3.2を使って顔検出をする](https://blogs.osdn.jp/2017/02/10/opencv.html)を真似れば良かった。特に記事にする必要もないように思ったけれど、ここでは、Android Studioのバージョンが上がったためか修正が必要な部分があったので、若干補足を記載。

# 動作確認環境
* OpenCV, version 3.4.2
* Android Studio 3.1.3
* Build #AI-173.4819257, built on June 5, 2018
* JRE: 1.8.0_152-release-1024-b01 x86_64
* JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
* macOS High Sierra, version.10.13.6
* Moto G5 Plus, Android 7.0

# 修正箇所
https://blogs.osdn.jp/2017/02/10/opencv.html
からの修正箇所。

1. Target API Version, Min API Version, Compile API Versionを API 24 (Android 7.0)に揃えた。
2. AndroidManifest.xmlから`android:roundIcon="@mipmap/ic_launcher_round"`を削除。[roundIconはAPI Level 25 (Android 7.1)以降でのみ対応しているらしい。](https://stackoverflow.com/questions/43049734/no-resource-identifier-found-for-attribute-roundicon-in-package-android)
3. /main/res/layout/activity_main.xml に android:id="@+id/activity_main" を追加。
4. CameraView.java のsurfaceCreated()に `params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);`を追加。無限遠でしかピントが合わなかったのでAutoFocusを有効にした。追加しないと無限遠にフォーカスした状態で動作した。

# まとめ
Moto G5 Plus(Android 7.0)でOpenCV3.4.2のhaarcascade_frontalface_alt.xmlを使った顔認識が動作した。
[Git]作業中ブランチに居ながら最新の master を取り込む

## 前提
例えば現在 `proj/hoge` で作業中だとします。

```sh
$ git branch
  master
* proj/hoge
```

で、作業期間中に master ブランチに別の開発者が機能を追加した、バグの修正を行ったコミットがマージされたので、自分の作業ブランチに最新状態の master ブランチをマージしたい、というのはよくある話かと思います。

## 今までの方法

```sh
# master ブランチへ移動
git checkout master

# master を更新
git pull origin master

# 作業中ブランチへ戻る
git checkout proj/hoge

# 作業中ブランチへ master を取り込む
git merge --no-ff master
```

ブランチの移動を伴うのが時として面倒だったため、別の方法を使ってみることにしました。


## 変更した方法
※ @forest1 さんのコメントを受けてさらに内容を修正しています。

```sh
# origin を更新
git fetch origin

# 作業中ブランチへ master を取り込む(--no-ff有無については運用ルール等によります。)
git merge --no-ff origin/master
```

特に難しいことはしていないんですが意外と思いつかなかったのでせっかくなので記事に残してみました。

特に次回へは続きませんｗ
Alexaスキル開発においてNode.jsの現在日時がずれてハマった話

#Node.jsが９時間ズレている！
Alexaのスキル開発をしていた時、ユーザーから「日付がズレているんですけど」と連絡が来た。
調べてみると9時間ズレている。
**テストの時には-9時間しても同じ日付だったので気づかなかった(><;**

#原因はLambdaのタイムゾーン設定にあり
調べてみるとLambdaのタイムゾーン設定に原因がありました。
対応としてはLambdaのコンソールから各関数の画面に行き、環境変数のキーにTZ、値にAsia/Tokyoと与えてやるだけです。

各関数ごとに設定できるのは便利ですね。
知っているか知らないかで差がつく１０のマネジメント

## キックオフ資料に記載したほうが良さそうな項目

【目的】
- システム開発の目的
- ユーザの状況、解決スべき課題についての認識
- 既存システムについての認識
【要件】
- 業務要件概要
- 要件リスト
- 前提事項／制約事項についての認識
- 非機能要件概要
【システム概要】
- システムの概要
- アーキテクチャ構成
【プロジェクト計画】
- 全体計画
- 開発方針、体制
- ユーザとベンダの役割分担
【管理方法】
- コミュニケーション計画（会議、定例、進捗報告）
- 開発標準


## 制約条件の見つけ方
- ユーザーの操作技術、業務時間
- 利用するネット環境、サービス
- 他サービス
- 社内の規則やルール、業界ルール
- プロジェクト関係者
- 開発環境や体制

## 要件のチェックポイント
【要件は必要かつ十分か】
- 要件がプロジェクトの目的に合致しているか
- 派生要件はきちんと精査されているか
- 要件と要件の間に矛盾がないか
- 優先順位や重要度の認識があっているか
【業務や例外を考慮しているか】
- 例外的な業務や処理が考慮されているか
- 異常系の復旧や後処理について考慮されているか
【体裁】
- 文言や用語は統一されているか
- 用語集があるか

## 主な非機能要件
- 機能性　：　合目的／正確性／セキュリティ
- 信頼性　：　障害許容／回復
- 効率性　：　習得／操作／性能（前提条件付きで定義する）
- 機能性　：　処理効率
- 保守性　：　解析変更／安定
- 運用性　：　SLA

## 要件の優先度判断について
（その要件が満たされないと...）
- 法令などを守れないか
- ユーザーの信用／信頼を失うか
- システム導入の目的に沿えなくなるか
- メリット・デメリットがどれほどあるか
【手法】
MoSCow分析　：　Must　Should　Could　Wontの４つにカテゴライズする

## プロジェクト憲章
なぜこのプロジェクトを行うか１枚で理解してもらうためのドキュメント
- 目的
- 目的達成の方針
- ロードマップおよびそれに対するプロジェクトの位置付け
- 主要要件
- 期間とマイルストーン
- コスト　※開発だけではなくランニングコストも
- 行動規範やプロジェクトルール

## プロジェクト反省会におけるポイント
- メンバの健康
- スキル
- 目的の達成
- 顧客満足度
- スケジュールの妥当性
- コストの妥当性
- 体制の妥当性
- 管理の妥当性
- プロセス／ポリシーの妥当性
- ナレッジ知見

## ちょっとしたことでユーザ体験を良くするコツ
- キャラバン期間を作り、各事業所を行脚しシステムについて説明する
- メールマガジンや動画、マニュアルの整備
- 日々の業務改善に役立つTipsのレクチャ

## 開発プロジェクトの原理原則（古からの）
- 顧客やユーザとよく話し合い、巻き込め！
- 斬新的に成長させるように計画せよ！　最初は最低限のものから。
- 新技術を無視するな、しかしリスクも忘れるな
- 要求に優先順位をつけよ
- 文書のない設計は設計とは言わない
- 速くする前に正しいものにせよ
- すぐコーディングを始めるな
- テストを行うよりずっと前にテストを計画せよ
- 保守においては現象ではなく問題を直せ

## 上位１０のリスク項目を知れ
- 人材の不足
- 非現実的な日程
- 要求仕様の理解不足
- 顧客の要望理解の不足
- 遅い応答時間
- 要求仕様の変更をコントロールしていない
Process finished with exit code -1073741819 (0xC0000005) の対処法

pycharmで実装してたら、
ある日急にpythonの処理がProcess finished with exit code -1073741819 (0xC0000005) 
というメッセージとともに中断されるようになりました。

いろいろ調べてみると以下のimport文がアウトでした。

```python
import matplotlib.pyplot as plt
```

なぜ急にmatplotlibのインポートがダメになるのかよくわかりませんが、
以下のようにしたら解決します。

```python
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
```
git push heroku master がエラーを吐く

##Rails Tutorial 1.5.2 Herokuにデプロイする (1)

```
$ git push heroku master
(警告メッセージが若干表示されることがありますが、今は無視してください。詳しくは7.5で解説します)。
```
よく言ってくれたぜ・・若干表示どころかそもそもdeploy出来てないことは考慮されてないのか・・

```
git push heroku master
```

の実行結果

```
remote: !	WARNING:
remote: !	Do not authenticate with username and password using git.
remote: !	Run `heroku login` to update your credentials, then retry the git command.
remote: !	See documentation for details: https://devcenter.heroku.com/articles/git#http-git-authentication
fatal: Authentication failed for 'https://git.heroku.com/アドレス.git/'
```
となりエラーが発生してデプロイ不能。
コマンドを入力した際に出てくる

```
Username for 'https://git.heroku.com': 
Password for 'https://git.heroku.com': 
```
こちらのpasswordはherokuのpasswordではなく

```
heroku auth:token
```
で表示されたパスワードを通せば無事に(Windows環境では）デプロイ出来たのことで実行してみるもののエラーは依然変わらず。

##アイテム二号を使って無事通過

```
git config --global url.ssh://git@heroku.com/.insteadOf https://git.heroku.com/
```

仕組みはさっぱり分かりませんが上記コードを打った後に

```
git push heroku master
```
実行すると警告文が３つほど出てきますが、無事にデプロイ完了。
いまのところ全てにおいてエラーを吐くRails Tutorial・・

参考サイト
[git push heroku master is asking for authentication](http://www.railszilla.com/git-push-heroku-master-authentication/start)
iPadとiPhoneの Size Class リスト。SplitView込み。

## リスト

書き方、意味:

* C ＝ Compact
* R ＝ Regular
* CR　＝ WidthがCompact。HeightがRegular。
* 横(2/3) = SplitViewを使って、横向きにしたときに、2/3の大きさで表示。

| iPhone__ | 縦 | 横  | 
|:--------:|:---|:---|
| 4とか     | CR | CC |
| SEとか    | CR | CC |
| 8とか     | CR | CC |
| X, XSとか     | CR | CC |
| 8Plus, XRとか | CR | _RC_ |

| iPad__   | 縦 | 縦(2/3)| 縦(1/3)| 横 | 横(1/3)| 横(2/3)|横(1/2)|
|:--------:|:---|:------|:-------|:---|:------|:-------|:------|
| 9.7inch  | _RR_ | CR    | CR     | _RR_ | CR    | _RR_   | CR    |
| 10.5inch | _RR_ | CR    | CR     | _RR_ | CR    | _RR_   | CR    |
| 12.9inch | _RR_ | CR    | CR     | _RR_ | CR    | _RR_   | _RR_  |

### 覚え方メモ

* iPhone縦は全てCR。
* iPhone横は基本CC。
* iPhone8PLUSとかの横だけ、RC。
* iPadは縦と横でRR。
* iPadでSplitViewを使ったときは、ほぼCR。
* iPad12.7inchの場合のみ、SplitView使っても1/2の時はRR。

## 終わりに
iPadとiPhone別で、Constraintを貼っているときに、「あれ？SplitViewのときのiPadって全てCRだっけ？？」と疑問に思ってまとまった資料を探したのですが、無かったのでiPhone込みでリストにしました。
ブラウザのページ内検索で、`CR` とかで検索すると、こことココが同じなのか...と分かるので使いやすいと思います。


まとめてみて、iPad12.9inch横状態SplitView(1/2)において、RRのせいで疑問に思っていたことが分かりました。
以上...φ('ᴗ'」)
Pandas.DataFrameのインデックスを振り直す方法 | 備忘録

pandasでDataFrameを加工しているとindexを振り直す必要に出くわします。indexが定義されてないとかで怒られたり、またはテーブルの形がイビツになっていたり。index再設定のための備忘録です。


## ライブラリとデータの準備
numpyの乱数処理で適当な値をDataFrameに入れる。

```python
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(low=0, high=10, size=(5, 5)), columns=['data1', 'data2', 'data3', 'data4', 'data5'])
```
![スクリーンショット 2018-08-04 14.44.18.png](https://qiita-image-store.s3.amazonaws.com/0/84670/e8119e06-a8ed-eafc-3be9-e25839ee42e2.png)


## 別のcolumnをindexに指定する方法

このデータだとあまり違和感はないですが、csvから適当にreadしたデータだとkeycodeとなる値がindexではなく一つのcolumnとして入ってしまいます。そんな列を明示的にindexとして扱いたい場合には、`set_index()`を使います。

```python
df.set_index("data1")
```
![スクリーンショット 2018-08-04 14.44.10.png](https://qiita-image-store.s3.amazonaws.com/0/84670/80eeaf5a-bb9e-233b-3b51-bca769a5396f.png)

すると、`set_index()`で指定したcolumnをindexとして定義し直したDataFrameを作成することが可能になります。
ただし、indexとして指定する列が一意かには注意が必要です。今回指定したdata1はそうではないため、index番号を呼び出してみると、以下のように複数のレコードが呼ばれてしまいます。

```python
df.set_index("data1").loc[7,:]
```
![スクリーンショット 2018-08-04 14.44.24.png](https://qiita-image-store.s3.amazonaws.com/0/84670/0e8a4927-d6a0-7021-c529-73d419b39768.png)


## indexを0から振り直す方法

`reset_index()`を使えば良い。この場合には、これまでのindexが"index"という新しいcolumnとしてDataFrme内に加わることになる。

```python
df.reset_index()
```
![スクリーンショット 2018-08-04 14.44.30.png](https://qiita-image-store.s3.amazonaws.com/0/84670/9d0896ba-34bf-8c3b-2b4c-50c5ff2451fc.png)


## indexを1から振り直す方法

0からではなく1始まりのindexが欲しい時。例えば、DataFrameをキャプチャした結果をパワポに貼りたい時など。
他にも色々方法があるようですが（https://stackoverflow.com/questions/20167930/start-index-at-1-when-writing-pandas-dataframe-to-csv
）、以下の方法が最も簡単で忘れにくそうだなと感じました。

```python
df.index = df.index + 1
```

indexといえども一つのobjectですので、単に1足す作業をするだけす。ただし、indexが数値として定義されている必要があります。`reset_index()`で作ったidnexなら良いですが、`set_index()`である列をindexに設定していた場合などは、その新しいindexが数値であるかをきにする必要があります。
シンボル（:）を薄い知識でなめる

#シンボル（:）とは
シンボルとは文字列に通し番号を割り振るもの

##シンボルの特徴
文字列でありながらも、同じ番号が割り振られる
文字列（string型）より数値型（int型）の方が速く処理できる。
（他にも数値型にする理由があると思うのでコメントで教えていただけたら、嬉しいです）

```ruby:
p(:name).object_id //66666
p(:name).object_id //66666

p name.object_id //66667
p name.object_id //66668
```
##シンボルの具体例
###具体例①hashのキーとして使う
```ruby:
user = { name: "k-sato", email: "k-sato@foo.xx.jp",
         address: "Tokyo"}
p user[:name]       
```
###具体例②attr_accesorのメソッド、変数の名前を指定するため
```ruby:
class Book
  attr_accessor :title, :price

  def initialize(title, price)
    @title = title; @price = price
  end
end

book = Book.new("Programming Ruby", 1980)
puts book.title
book.price = 2000
puts book.price
```

###具体例③before_actionのメソッドを指定するため
```ruby:
class ApplicationController < ActionController::Base
  before_action :index
  def index
  end
```
Web用の画像形式に迷った時の対応例

## 画像の実装までに行う事

### 前提

#### ポジション

- フロントエンエンジニア
- コーダー
- エンジニア
- デザイナー

### モデルケース
- デザイナーからデザインを受け取った時
  - スライスや書き出しの時、画像形式はどうしたら良いのか迷う 


# 各画像形式の概要 振り分けの考え方

## jpg
- 写真
- 圧縮効率が良い

## png
- 透明の表現が可能
- 綺麗
- 小さくないイラスト

## SVG
- アイコン 
- シンプルなイラスト
- SVGはScketchで右クリックで抽出可能(スライス不要)
- Photoshopはうまく書き出せない時があるので、別途IllustratorやScketchで取扱い

## GIf
- アニメーション可能
- 小さなアイコン（基本SVGが良い）

## 素材作成レギュレーション  ＞ Retina対応
- 写真のはめ込まれた素材はpngで2倍
- 純粋な写真はjpgで2倍


----

## SVG実装時 / 選択肢

軽量化：
https://jakearchibald.github.io/svgomg/

- 何回も見る Webアプリなど
  - 画像化`.svg` + キャッシュ 

- 頻繁に見ないLP ブログなど
  - インラインでHTML直書き
  - バックグラウンドはBase64で直書き インライン

### Data URI
- Data URLはキャッシュしないため、初回訪問には高速化が有効
- 画像の文字化
- 画像を読みに行かなくて良いので高速
- キャッシュしないので、重いものは不向き
- 管理運用に注意
WindowsパスをURIパスに変換するPowershellワンライナー

Sambaで作成した共有フォルダとかにファイルを配置した場所を共有したいとき、
Windowsでは`\\server-name\fuga`というパスで表示されるが、
メールやチャットで貼り付ける場合、`file://server-name/fuga`のURIパスにする必要があったので書いた。

```
$URIPath = $WindowsPath -replace "\\\\", "" -split "\\" | % {[uri]::EscapeUriString($_) } | % -Begin {$acc = "file:/"} {$acc += "/$_"} -End {Write-Output "$acc"}
```
なんかもっとかっこいい感じで短く書く方法はある気がするが、まぁ使える。
EscapeUriStringでマルチバイト文字もうまくURLエンコードされるはず。

#実際に使うには
変換は上記のスクリプトでできるが、実際の作業で使う際にはクリップボードにコピーできるようにする必要がある。
PowerShellスクリプトの実行ポリシーは変更されている前提として、以下のようなスクリプトを書く。

```
# toURIPath.ps1

$Args[0] -replace "\\\\", "" -split "\\" | % {[uri]::EscapeUriString($_) } | % -Begin {$acc = "<file:/"} {$acc += "/$_"} -End {Write-Output "$acc>"} | clip
```

これを任意の場所に配置したら、エクスプローラで`shell:sendto`を開き、リンク先に

```
powershell <toURIPath.ps1のパス>
``` 

を指定し、「URIパス生成」など任意の名前をつけて保存する。
こうすれば、共有フォルダ上のファイルを右クリックすると送るのメニューに「URIパス生成」が表示され、選択すると選択したファイルのパスが\$Args[0]として渡り、変換されたのちクリップボードにコピーされる。
あとは通常通り貼付けすれば良い。
BigQueryのフェデレーション機能を試してみる

# フェデレーション
BigQueryでは外部データソース（GCSなど）のデータに対して直接クエリする機能をフェデレーションと呼びます。
以下の例ではGCSに保存したTPC-Hのデータを対象に性能などを見ていきます。

# 使い方
BigQueryに外部テーブルとして外部のデータソースのファイルを指定する必要があります。
```bq mk --external_table_definition=${SCHEMA_DIR}/${SCHEMA_FILE}@${SOURCE_FORMAT}=${CLOUD_STORAGE_URI} ${BQTABLE} ```

`${SCHEMA_FILE}`は以下のようなスキーマ定義を記載しているファイルを指定します。（以下はTPC-Hのlineitem表のスキーマ定義）
```
 [ 
  {"name": "L_ORDERKEY", "type": "INTEGER", "mode": "nullable"}, 
  {"name": "L_PARTKEY", "type": "INTEGER", "mode": "nullable"}, 
  {"name": "L_SUPPKEY", "type": "INTEGER", "mode": "nullable"}, 
  {"name": "L_LINENUMBER", "type": "INTEGER", "mode": "nullable"}, 
  {"name": "L_QUANTITY", "type": "FLOAT", "mode": "nullable"}, 
  {"name": "L_EXTENDEDPRICE", "type": "FLOAT", "mode": "nullable"}, 
  {"name": "L_DISCOUNT", "type": "FLOAT", "mode": "nullable"}, 
  {"name": "L_TAX", "type": "FLOAT", "mode": "nullable"}, 
  {"name": "L_RETURNFLAG", "type": "STRING", "mode": "nullable"}, 
  {"name": "L_LINESTATUS", "type": "STRING", "mode": "nullable"}, 
  {"name": "L_SHIPDATE", "type": "DATE", "mode": "nullable"}, 
  {"name": "L_COMMITDATE", "type": "DATE", "mode": "nullable"}, 
  {"name": "L_RECEIPTDATE", "type": "DATE", "mode": "nullable"}, 
  {"name": "L_SHIPINSTRUCT", "type": "STRING", "mode": "nullable"}, 
  {"name": "L_SHIPMODE", "type": "STRING", "mode": "nullable"}, 
  {"name": "L_COMMENT", "type": "STRING", "mode": "nullable"} 
 ] 
```

`${SOURCE_FORMAT}`には`CSV`または`JSON`を指定可能です。もちろんデータは`${SOURCE_FORMAT}`で指定された形式になっている必要があります。

`${CLOUD_STORAGE_URI}`には外部データソースのファイルを指定します。`${dir}/*`のようにワイルドカード指定をすることで`${dir}`配下の全てのファイルを１つのBQテーブルとして取り扱うことも可能です。

`${BQTABLE}`はBigQueryのテーブル名を指定します。

# 性能
TPC-Hのlineitem表を使用して性能を見てみます。
また、lineitem表を１ファイル、10ファイル、100ファイルに分割した場合のそれぞれの性能を見てみます。

## 条件
- lineitem表のレコード数は600万件
- lineitem表のデータサイズは700MB（解凍後）
- ファイルはgzipで圧縮をしています。GCSの`Content-Encoding`に`gzip`を設定しています。
- クエリは `SELECT COUNT(*) FROM lineitem`

## 結果
|ファイル数 |レイテンシ（秒） |
|--:|--:|
|1        |115          |
|10       | 15          |
|100      |  8          |

- ファイルごとに並列に処理をしてくれるようで、100ファイル程度まで分割すれば、それなりに実用に耐えうる性能が出るようですね

## コスト
- gzipで圧縮したとしても解凍後のサイズでコストがかかってきます
- BigQueryのデータのようにクエリで指定した列だけでなく、行全体のサイズでコストがかかってきます

## まとめ
- ファイルを分割するとそれなりに実用的な性能が出ますが、コスト面を考えるとファイル全体のサイズでコストがかかってきてしまいます。頻繁に実行されるデータであれば、BigQueryに入れておく方が良いですね。adhocにたまに実行されるようなデータであればGCSに置いておいて、フェデレーションする価値もありそうです
Container imageを作る際に気をつけておきたいこと

## はじめまして
どうも、あっきーと申します

ちょっと、ネットワークネタになるのですが、
私の師匠がnakという名称を使っていたので、
お、俺もっ！！みたいな憧れをずっと持っており ~~(パクり)~~ あだ名をもじってを組み合わせましたｗ
~~こ、これでちょっとGeek感でてきた！(すいません)~~

ということで、初投稿なので良しなにしていただけるとorz
また今後も小ネタも含めて書いていけたらと思います。

では早速、OpsなエンジニアがDockerを使ってて、
先人のありがたい技術要素を取り入れつつ、普段私がDockerfileを書く上で思ったところをちょっとまとめてみました。
(技術要素も内容もちょっと薄いですが...w)

## Containerは軽量化...だけどっ！
Alpineを使うのがもうデファクトになっているかと思います。

ただ、BusyBoxベースのおかげか必要なCのライブラリが足りないという場面が多く、Alpine化できねぇ...（泣）なんてときも

そういったときは大人しくubuntuに変えると、一瞬で解決したり
（先日はそれで助けられましたorz）

あと、軽量化といったら、&&などで1ライナー化する...といった感じでしょうか。
Alpineですと、`--no-cache`は、入れておくと軽量化できます
最近はubuntu使ってないですが、`rm -rf /var/lib/apt/lists/*` を入れる感じでしょうか

Sample Dockerfile

```dockerfile:Dockerfile
FROM alpine:latest

RUN apk update \
  && apk --no-cache add python py-pip \
  && pip install flask

COPY hello.py /opt/app/hello.py

WORKDIR /opt/app/
EXPOSE 5000

CMD ["python", "/opt/app/hello.py"]
```

サンプルFlask

```python:hello.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello Container ;)"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
```

```bash:実行コマンド

$ docker build -t hogehoge .
$ docker run -p 5000:5000 -it <Container image ID>
```

ブラウザで `http://localhost:5000` を叩くと、なんか出てきます

## DockerHubのContainerに頼りすぎない
軽量化でかつ欲しいフレームワークが載っているContainerをみつけるとホイホイと、`FROM <Repository/SUGOI_HITO>`と書いてしまいがち...
(slimとかとっても便利でしてｗ)

既にいろんな方が書かれている通り、悪意のあるイメージもあるので、なるべくオフィシャルのイメージスキャン済なやつを使って安全に
Docker for Macに一緒にインストールされているKinematicが割と便利です

## 監視などなど
私は主にクラウド環境でContainerを使うシーンが多いのですが、不正アクセスを検知するには監視もちゃんとやる
過去に、コンテナが突然SIGTERMされて死ぬということが起き、無事に沼へorz

（DataDogのdd-agentや、使ったことがないのですがはてなのMackerelさん辺りができるのかな？）

## Supervisordに頼りすぎない
1Containerだけで色々とやらせすぎないこと
Supervisord使うと割となんでもできちゃうので、便利...

なんですが、せっかくのコンテナ使ってマイクロサービス化したい！
みたいなことを考えるちょっともったいない使い方なのかなと

サイドカー的な感じで別けるなどすると良いかなと、私は心が得ております
あとは、Rootユーザでやらないなど、まだまだありますね

## まとめ
コンテナーといっても、LinuxOSでサーバを構築しているのに非常に近いと思いますので、昔エクセルに書きまくっていた設定調書がDockerfileになるという感じでしょうか

上記以外でも、色々と気をつけなきゃいけない部分はあると思いますので、
実際に運用していく中で新しい発見などあれば展開していきたいと思います:)
UnityEditorWindowでサムネイル付ボタンをタイル状に並べる

#環境
Unity 2018.1.0f2



#はじめに
複数のデザイナーさん向けにUnityEditorのツールを作る機会がありました。
機能の一部にキャラクターのポーズを切り替えるというものがあったのですが、ポーズを文言化しても共通認識しづらいね...となったのでサムネイルで表示することにしました。
また、ポーズの数が多く、今後も追加されることが予想されたので一覧をタイル状に並べて確認できるものが良いと考えました。
実装するにあたって下記が分からなかったので切り出してまとめておきます。
・ボタンにサムネイルを表示するには？
・ボタンをタイル状に並べるには？


#先にまとめ
![タイルボタン.gif](https://qiita-image-store.s3.amazonaws.com/0/44990/09f2a5d5-e055-a8f3-0651-3e07fdaed585.gif)

▽github - unityEditorTileArrangement
https://github.com/panti310/unityEditorTileArrangement
自由にいじっくてください！


#解説
##windowの作成とレイアウトに関して
そもそもeditorWindowの作り方を知らなかったので下記を参考にしました。
▽ケットシーウェア - 【エディタ拡張徹底解説】初級編①：ウィンドウを自作してみよう【Unity】
https://caitsithware.com/wordpress/archives/1377
Window作成からLayout全般まで丁寧に解説されています。

##ボタンにサムネイルを貼る
###サムネイルを読み込む
サムネイル画像は「Assets/Editor Default Resources」に配置し、EditorGUIUtility.Loadで読み込みます。
▽エディター拡張入門 - 第1章　エディター拡張で使用するフォルダー
https://anchan828.github.io/editor-manual/web/part2-beginner.html#h1-2
Editor用のリソースについて参考にしました。

毎フレーム読み込まないように、初期化のタイミングでキャッシュしておくと良いです。

```c#
	void Preload ()
	{
		m_default_tex = EditorGUIUtility.Load (Default_Icon_Path) as Texture2D;
		SetTexCacheDict (Sample_Icon_Root_Path, Sample_Icon_Extension, Button_Num);
	}
```

###ボタンに貼る
GUILayout.Buttonに上記TextureをセットすればOKでした。
▽Unity - GUILayout.Button
https://docs.unity3d.com/ja/current/ScriptReference/GUILayout.Button.html



##タイル状に並べる
###まずは横に並べる

```c#
EditorGUILayout.BeginHorizontal ();
// この間に記載した要素が横に並ぶ
EditorGUILayout.EndHorizontal ();
```
![スクリーンショット 2018-08-04 13.24.47.png](https://qiita-image-store.s3.amazonaws.com/0/44990/695c4e27-3eda-9ec8-9772-89bfc606c526.png)

###次に縦に並べる
```c#
EditorGUILayout.BeginVertical ();
// この間に記載した要素が縦に並ぶ
EditorGUILayout.EndVertical ();
```
![スクリーンショット 2018-08-04 13.25.00.png](https://qiita-image-store.s3.amazonaws.com/0/44990/35350265-6ba7-19d8-ee31-aff8d6a7f9a5.png)

###横の要素数をwindowの幅から計算する
windowの幅を超えない数分のボタンを描画し、それらをEditorGUILayoutのHorizontalで囲むという処理を作りました。
![スクリーンショット 2018-08-04 13.25.13.png](https://qiita-image-store.s3.amazonaws.com/0/44990/bd7468cb-c73b-aa2d-f389-a32e1613a818.png)
以下に処理を抜粋しときます。

```c#
	void DrawThumbnailButtons (int itemNum, System.Action<int> onClick, string rootPath, string extension)
	{
		// 横の要素数求める
		float windowWidth = position.width;
		int horizontalMaxNumber = Mathf.FloorToInt (windowWidth / (m_buttonSize + Button_Margin));

		bool inHorizontalLayout = false;
		for (int i = 0; i < itemNum; i++) {
			if (i % horizontalMaxNumber == 0) {
				// 横レイアウト開始
				EditorGUILayout.BeginHorizontal ();
				inHorizontalLayout = true;
			}

			// ボタン作る処理とか

			if (i % horizontalMaxNumber == horizontalMaxNumber - 1) {
				// 横レイアウト終了
				EditorGUILayout.EndHorizontal ();
				inHorizontalLayout = false;
			}
		}

		if (inHorizontalLayout) {
			// horizontalMaxNumber ちょうどの数以外だと横レイアウト開きっぱなしになる
			// その際はここで横レイアウト終了
			EditorGUILayout.EndHorizontal ();
		}
	}
```

#さいごに
言葉で表現しづらいものを大量にボタン化する際に是非使ってみて下さい。
タイル状レイアウトぐらいデフォルトであれば良いのになぁ...。

▽アイコン素材 - FLAT ICON DESIGN
http://flat-icon-design.com/
サンプルにもってこいなアイコンがたくさんあります。
SpringFoxでSpringSecurityが入っていないのにUnable to infer base urlが出た話

# 概要
タイトルの通り。
SpringBootにSwagger+SpringFoxを導入しようとしたら、以下のようなエラーが出たので解決したメモを残す。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197517/71696100-899c-e291-b775-46154e8418af.png)


# 課題
このエラーで検索をかけても、「認証を突破する必要があるので、SpringSecutiryにSwagger認証をスキップする記述を加えるように」という旨の解決方法しか見つからなかった。
今回のSpringBootにSpringSecurityは入っていない。

参考
https://github.com/springfox/springfox/issues/1996

# 結論（解決方法）
springfox-swagger2とspringfox-swagger-uiのバージョンを、SpringBootのバージョンに合わせた。
今環境は以下
- SpringBoot 1.5.12
- springfox-swagger2 【変更前：2.9.2】→【変更後：2.6.1】
- springfox-swagger-ui 【変更前：2.9.2】→【変更後：2.6.1】

どうやら、SpringFoxの対応SpringBootバージョン<使用するSpringBootのバージョン
にする必要があるらしい

参考
SpringBoot：1.5.10対応と記述がある
https://mvnrepository.com/artifact/io.springfox/springfox-swagger2/2.6.1
githubにアクセスするのが面倒なのでコマンドラインからPullRequestを作る

### はじめに
プログラマは怠惰な生き物です。
手を抜けるところには手を抜いて生きていきたい。
そんな方々に捧げます。

### 準備
`hub` コマンドが必要なため、installします

```bash
go get -u github.com/github/hub
cd $GOPATH/src/github.com/github/hub
go build
```

これで最新版(現在は2.5.0)のバイナリができるので、パスが通っているところにCPしちゃいます。

### hubコマンドを使ったPullRequestの作り方
hub コマンドでは `hub pull-request` というコマンドでPullRequestを作るわけですが長すぎて使ってられないのでaliasを定義します。

```
vim ~/.gitconfig
[alias]
    pr = !hub pull-request
```

これで、PullRequestが作られるようになりましたが、このまま叩くとタイトルやコメントが空のPullRequestが作られてしまいます。


### テンプレートの使い方
リポジトリによっては、PULL_REQUEST_TEMPLATE.md でPullRequestのテンプレを作っているリポジトリもあるので、それを活用します。
`hub pull-request -F .github/PULL_REQUEST_TEMPLATE.md` でテンプレを読み込めるようになりますが、テンプレ内に `#` が書かれている場合、初期設定ではコメントとみなされてしまうため、これを回避します。

`git config --global core.commentchar "/"`

これで、コメント文字を `/` にしておきます。

その後、 `-f .github/PULL_REQUEST_TEMPLATE.md` をgitconfigに足し、エディタを立ち上げたいので `--edit` オプションを付加して完成です。

```
vim ~/.gitconfig
[alias]
    pr = !hub pull-request -f .github/PULL_REQUEST_TEMPLATE.md --edit
```
Python3+OpenCVで静止画から動画を作成する

Python3+OpenCVで複数枚の連続した静止画を作成し、動画にしてみた。

# 実行内容
![imgs.png](https://qiita-image-store.s3.amazonaws.com/0/138429/b3226ff1-a7ff-4d2a-a973-d5f5e74e3531.png)


連続した静止画ファイルを作成し、MP4形式の動画ファイルへ変換

# 環境
|            |       環境        |
|:-----------|:-----------------|
| PC         | Ubuntu 16.04 LTS |
| 言語        | Python 3.6.6     |
| ライブラリ   | opencv-3.4.2.17, numpy-1.15.0 |

# 静止画・動画の作成プログラム

```genImgVideo.py
import os
import cv2
import numpy as np

IMG_SIZE   = 256 # 画像サイズ
BLOCK_SIZE = 64  # 黒ブロックサイズ

img_outdir = './img'
os.makedirs(img_outdir, exist_ok=True)

# 動画用の画像作成
outimg_files = []
img_count = 0
for h in range(0, IMG_SIZE, BLOCK_SIZE):
    for w in range(0, IMG_SIZE, BLOCK_SIZE):
        img_count = img_count + 1
        
        # IMG_SIZE x IMG_SIZEの白塗り画像作成
        img = np.empty((IMG_SIZE, IMG_SIZE))
        img.fill(255)
        
        # 黒ブロックを白塗り画像に書き込み
        img[h:h+BLOCK_SIZE,w:w+BLOCK_SIZE] = np.zeros((BLOCK_SIZE, BLOCK_SIZE))
        
        # 画像出力
        outimg_file = '{}/{:05d}.png'.format(img_outdir, img_count)
        cv2.imwrite(outimg_file, img)
        
        outimg_files.append(outimg_file)
        
# 動画作成
fourcc = cv2.VideoWriter_fourcc('m','p','4', 'v')
video  = cv2.VideoWriter('ImgVideo.mp4', fourcc, 20.0, (IMG_SIZE, IMG_SIZE))

for img_file in outimg_files:
    img = cv2.imread(img_file)
    video.write(img)

video.release()
```

MP4形式で以下のような動画が出力される (ImgVideo.mp4)
![ImgVideo.gif](https://qiita-image-store.s3.amazonaws.com/0/138429/1eb31366-fe42-8398-7e78-1598a4314b0d.gif)
リクエストとレスポンスなど


#Webブラウザ　⇄　Webサーバ

Webブラウザからリクエスト（このページが見たい）を送り、

Webサーバがレスポンス（はいどうぞ）を返す。

要求する側のコンピュータを***クライアントコンピュータ（Webブラウザ）***と呼び、
応答する側のコンピュータを***サーバコンピュータ（Webサーバ）***と呼びます。

#役割はソフトウェアで決まる
コンピュータにクライアントかサーバかの区別はないです。
どちらも同じハードウェアのコンピュータで、
クライアントとして振る舞うか、サーバとして振る舞うかは起動している***ソフトウェア***によって決まります。
コンピュータの振る舞いを決めるのはソフトウェアなのです。

#通信プロトコル（HTTP, HTTPS）
###HTTP（Hypertext Transfer Protocol）
WebブラウザとWebサーバの間で***HTMLなどのコンテンツ***の送受信のために用いられる通信プロトコルです。
HTMLはHypertext Markup Language（ハイパーテキスト・マークアップ・言語）の略称で、***HTML = Webページ***です。

###HTTPS
HTTPでのデータ送受信するとき、***通信データを暗号化***（通信相手にしか見えない）し、安全性を担保するための通信プロトコルです。
個人情報やパスワードを通信する際には、第三者に読み取られないようにHTTPSで暗号化することは必須です。


#IPアドレス
クライアントはURLを使い、リクエストを送ってサーバと通信できます。
逆にサーバがレスポンスを返すときは、IPアドレスでクライアントを特定しています。

IPっては通信プロトコル。
インターネットはIPによって成立してて、
HTTPはIPでインターネットに接続されている前提があってこそのもの。HTTPリクエストメッセージはIPによって運ばれる。


#Webサーバーってどこにあんねん
世界中のどこかにある。
下記サイトで調べたいURLを入れると、対応しているサーバーの場所がわかるっぽい。
https://www.aguse.jp/
Mac に phpenv を利用して PHP をインストールする

Mac に phpenv を利用して PHP をインストールする手順。

## インストール

### phpenv

```shell-session
$ git clone https://github.com/madumlao/phpenv.git ~/.phpenv
```

### php-build

```shell-session
$ git clone https://github.com/php-build/php-build.git ~/.phpenv/plugins/php-build
```

### PHP のビルドに必要なライブラリたち

```shell-session
$ brew install re2c openssl bison libxml2 autoconf automake icu4c libjpeg libpng libmcrypt
```

### `.bash_profile` の編集

```sh
# phpenv
export PHPENV_ROOT="$HOME/.phpenv"
export PATH="$PHPENV_ROOT/bin:$PATH"
eval "$(phpenv init -)"
```

`.bash_profile` を読み込む。

```shell-session
$ source .bash_profile
```

## php の使い方

インストール可能なバージョンを確認する。

```shell-session
$ phpenv install -l
```

指定のバージョンをインストールする。

```shell-session
$ phpenv install 7.2.8
$ phpenv rehash
```

指定のバージョンをグローバルで利用する。

```shell-session
$ phpenv global 7.2.8
```

指定のバージョンをローカル（そのディレクトリ）で利用する。

```shell-session
$ phpenv local 7.2.8
```

マシンにインストールされているバージョンを確認する。

```shell-session
$ phpenv versions
```

## composer のインストール

```shell-session
$ git clone https://github.com/ngyuki/phpenv-composer.git ~/.phpenv/plugins/phpenv-composer
$ phpenv rehash

$ composer --version
```

## phpenv を更新する方法

```shell-session
$ cd $(phpenv root)
$ git pull
```

## php-build を更新する方法

```shell-session
$ cd $(phpenv root)/plugins/php-build
$ git pull
```
cursorに関して

たまにcursorを使ったりするので
使いそうなものをまとめて見ました。

cursor
-
auto　ブラウザが自動的に選択したカーソル
default　矢印型などの標準カーソル
pointer　リンクカーソル
crosshair　十字カーソル
move　移動カーソル
text テキスト編集カーソル
wait 待機処理中カーソル
help ヘルプカーソル
url('../images/sample.cur')
url('ファイルのパス')　オリジナルのカーソル

その他に、IEの独自拡張のカーソルもあるみたいです。
[対処法] 599 Internal Exception, https://fastapi.metacpan.org/v1/release/_search

`plenv install` で表題のエラーが出る場合の対処法。

# perl-buildを入れ直す
perl-buildは brew install していたものを使っていたので、いったんuninstallしてからcloneで入れる。

```
brew uninstall perl-build
git clone git://github.com/tokuhirom/Perl-Build.git ~/.plenv/plugins/perl-build/
```

# perl-build本体をエディタで編集する

`$HOME/.plenv/plugins/perl-build/perl-build` をエディタで開いて、10258行目あたりに下記のようなパッチを適用する

```diff
- if (eval {require LWP::Protocol::https;1} )
+ if (eval {(require LWP::Protocol::https;1) && ( require Mozilla::CA; 1)} )
```

これで動くようになりました。

# 原因は？
Mozilla::CAがmacOS組み込みのPerlには入っていないのが原因のようです。
詳しくは下記Issueに書いてあります。

https://github.com/miyagawa/HTTP-Tinyish/issues/14