OmniAICreator/Qiita-1.07M huggingface dataset:
Windowsで誰でも好きなキャラの声になれるyukarinライブラリを動かしてみた。

#はじめに
ヒホさんの開発されたyukarinライブラリ(第一段変換のyukarin　第二段変換のbecome-yukarin　リアルタイム変換のrealtime-yukarinの総称)を使って、誰でも好きなキャラの声になれるという声質変換ができるのですが、推奨環境がLinuxですので、Windowsでは動かなかったところ、8月24日にヒホさんが直してくれて、動くようになりましたので、動かしてみましたので、ご報告です。
#環境構築
[『Yukarinライブラリ』ためのLinux環境構築(RTX対応)【Ubuntu 19.04】](https://qiita.com/atticatticattic/items/8826a81badeea21a7175)を参考に環境構築していきます。
##実行環境
プロセッサ : Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz
メモリ　　 : 16GB
GPU　　　  : GTX 1070Ti (GPUメモリ 8GB)
ストレージ : SSD 480GB
OS 　　　　: Microsoft Windows 10 Pro
##Windows環境の整備
隠しファイルと拡張子を表示するようにしておきます。[Windows 10のエクスプローラーで隠れている拡張子やシステムファイルを表示したい](https://weekly.ascii.jp/elem/000/000/404/404236/)
シェル及びターミナルは[GitBash](https://gitforwindows.org/)を使用しました。
##エディタ系のインストール
基本[サクラエディタ](https://sakura-editor.github.io/)を使用しました。
また、Pythonには[Pycharm](https://www.jetbrains.com/pycharm/)を使用しました。
pycharmは[Windows10 Pycharmの日本語化](https://qiita.com/tetsu0831/items/46873120e64d819f26ec)のやり方で、日本語化できます。
##ディープラーニング環境の構築
[Windows 10にNVIDIA GPUを使用したDeep Learning環境をインストール。（CUDA10、VS2017、Chainerのインストール)](https://qiita.com/kekekekenta/items/a46a899956b1c756ddce)を参考にしました。
###開発系のインストール
VisualStudio(以下VS)2015のC++コマンドライン開発環境が必要なので、入れます。VS2017でもVS2019でもVSのインストーラーからチェックを入れればよいです。私はVS2019Communityが入ってましたので、インストーラーからいれましたが、新規に入れる場合、Tools for Visual Studio 2019でよいです。(入ってないとcudaのインストールが失敗します。)
##Pythonのインストール
anacondaではなく、Python3.7.4を入れました。
インストール方法は[こちら](https://www.python.jp/install/windows/index.html)です。
##CUDAのインストール
なかなか入らなくて苦労しました。基本nvidiaのページからダウンロードして、インストールするだけなのですが、インストーラーがインストールに失敗しました。と出ます。グラフィックドライバのクリーンイントールからやりましたが、結果はダメ。結局VS2015のc++コマンドラインビルド環境がないとインストーラーがこけるようです。
##CuDnnのインストール
nvidiaのサイトに登録して、ダウンロードしたものを解凍して、CUDAのフォルダにマージします。
##yukarinライブラリの環境整備と実行
ここからは[『Yukarinライブラリ』become-yukarin, yukarin コマンド解説](https://qiita.com/atticatticattic/items/37441f3be6916cd1e73a)を参考に実行していきます。作業ディレクトリ等はこれに準拠しました。
##become-yukarinの環境整備
pip install -r requiremets.txt を実行する。cupyがなかなか入りません。入れるためには、環境変数を多数設定するなどのコツがあるようです。[windows10環境でChainer2.0を動かすまでにハマった罠](https://qiita.com/unoemon/items/c3289f72eae7f10422a1)が参考になるかと思います。
##PYTHONPATHの設定
コントロールパネル→システム→システムの詳細設定で、システム環境変数に、PYTHONPATHを設定します。become-yukarinディレクトリ、yukarinディレクトリを指定します。複数指定するときは、;(セミコロン)で区切ります。
##音素バランス文の収録
まず音素バランス文を収録します。私は声優統計コーパスのものを50文使いました。100文やATR503のものをつかえば、もっとクオリティが上がるのかもしれません。あと好きなキャラの声を用意します。私はCeVIOのさとうささらを使用しました。第二段用には青空文庫の夏目漱石の『吾輩は猫である』を整形したものを約3000文使いました。
##yukarinでの第一段学習
コマンドを実行するだけです。
##become-yukarinでの第二段学習
pickleのエラーに悩まされました。
回避方法を教えていただきました。
C:\Usersユーザ名\Anaconda3\pkgs\python-3.6.5-h0c2934d_0\Lib\multiprocessing\http://reduction.py/
の15行目にある　import pickleを
import dill as pickleに変更
dillはpipなどからインストールしてください
だそうです。Python本体のマルチスレッド部分のpickleを互換ライブラリのdillで置き換える方法になります。
これで学習ができます。
##おわりに
Ubuntu使わなくてもできるようになったのは大きいですが、いろいろコツがいりますね。それでもわからないことがあったら、ユーザーコミュニティの[yukarinライブラリディスコード](https://discord.gg/Xupt2Hk)で聞いてみてください。最後に、ヒホさんをはじめ、atticさん、AIきりたんさん他の皆さんに助けていただきました。感謝申し上げます。
マインドマップ作成ツール調査

長らくマインドマップ作成に[FreeMind](https://ja.osdn.net/projects/freemind/)を利用してきたが、最近は開発が停滞しているようなので、代替となるソフトウェアがないか調査した。選定条件は、Webアプリではなくローカルで動作するソフトウェアであり、無償で利用できること（できればOSS）としている。

結論としては、[FreeMind](https://ja.osdn.net/projects/freemind/)から派生した[Freeplain](https://www.freeplane.org/)が継続的に開発がされており、機能もFreeMindを踏襲しているため、乗り換え先として良さそうである。

#### 無償利用可能なマインドマップ作成ツール一覧

| ツール                                                       | プラットフォーム | OSS  | 備考                                                         |
| ------------------------------------------------------------ | ---------------- | ---- | ------------------------------------------------------------ |
| [FreeMind](https://ja.osdn.net/projects/freemind/)           | Java             | ○    | 2016年以降は開発が停滞している。                             |
| [Freeplain](https://www.freeplane.org/)                      | Java             | ○    | FreeMindの派生ソフトウェア。2019年現在も開発が継続している。 |
| [Frieve Editor](http://www.frieve.com/feditor/)              | Win              | ○    | 2013年に開発が停止している。                                 |
| [Xmind](http://jp.xmind.net/)                                | Java             | ×    | 無料版ではテーマのカスタマイズやPDF/SVGエクスポート機能が利用できない。3.7.6以降はソースコードの公開が停止された。 |
| [Coggle](https://coggle.it/)                                 | Chrome           | ×    | 無料プランでは3つまでしか図を作成できない。                  |
| [MindMaple Lite](https://twitter.com/mindmaple/status/245286940927197185) | Win              | ×    | Lite（無料版）の提供は現在は終了している。                   |

#### 有償ツール

* [Novamind](https://www.novamind.com/)
* [iMindMap](https://www.ayoa.com/imindmap/ja/software/)

#### 参考

- http://www.nijiiro-kobuta.com/free-mindmap/
- https://boxil.jp/mag/a3027/
- https://www.lifehacker.jp/2015/12/151228_freemind_maptools.html
[学習確認用] Ruby 配列の中からランダムな値を一つ抜き取る

配列の中からランダムな値を一つ抜き出す。

```
number = [1, 3, 4, 5, 11, 12]
nunber_count = number.count
puts number_count

1.times do
     puts number[rand(number_count)]
end

```
number_count　の所は数字でもいけるが配列の数より大きい値を入れると空の値を抜き出してしまうから今回は配列の数をランダムの数に入れている。
#Ruby で 処理速度を平均化したい。sleep で必ず一定時間以上かかる処理を作る。

処理にかかった時間を得て、最低時間に満たなかったら足りない分を sleep させる

# 例

```rb
def some_action
  # some action
end

start_time = Time.now.to_f

some_action

done_time = Time.now.to_f

under_time = 0.1

diff_time = under_time - (done_time - start_time)

sleep diff_time if diff_time.positive? }
```

# ベンチマークの例

```rb
require 'benchmark'

[*1..10].map { Benchmark.realtime { start_time = Time.now.to_f; sleep rand(0.01..0.10); done_time = Time.now.to_f; under_time = 0.1; diff_time = under_time - (done_time - start_time); sleep diff_time if diff_time.positive?; } }

# => [0.10333599988371134,
 0.10502699995413423,
 0.10417600022628903,
 0.10169599996879697,
 0.1034500002861023,
 0.10172299994155765,
 0.10186100006103516,
 0.10312700038775802,
 0.10354600008577108,
 0.10065300017595291]
```



# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2439








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
WSLでdocker-ceを動作させる手順


設定済みWSL上にDockerをインストールして、hello-worldするところまで行います。  
docker-compose(複数コンテナの連携)は、WSL上で、iptablesが完全にサポートされていないとのことなので、動作しません。

Dockerは、17.09.1以上だと動作しないため、17.09.0-ceをインストールして動作させています。

WSLを使用可能にする設定と、Ubuntuの導入は[こちら](https://qiita.com/tamata78/items/8d50533d775956426a3a)に書きました。

# 動作環境
- Microsoft Windows 10 Enterprise Evaluation ver:1809 build:17763.737
- Ubuntu 18.04.3
- Docker 17.09.0-ce

# Ubuntuバージョン確認
ubuntuはWindows管理者権限で実行します。 
 
```shell
$ head -n 2 /etc/os-release
NAME="Ubuntu"
VERSION="18.04.3 LTS (Bionic Beaver)"
```

# Dockerインストール
```shell
# 古いバージョンのdockerは、トラブルの原因になるので、アンインストール
$ sudo apt-get remove docker docker-engine docker.io containerd runc
$ sudo apt-get autoremove
$ sudo rm -rf /var/lib/docker # イメージファイル等の格納先、uninstallでは消えないので直接削除

# Docker 17.09.1からWSL未サポートな機能があるため、Docker17.09.0をダウンロード＆インストール
$ curl -O https://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/docker-ce_17.09.0~ce-0~debian_amd64.deb
$ sudo apt install libltdl7 -y # 依存pkgもインストール、ないとエラーになります。
$ sudo dpkg -i docker-ce_17.09.0\~ce-0\~debian_amd64.deb
```

# Docker動作確認
```shell
# バージョン確認
$ docker -v
Docker version 17.09.0-ce, build afdb6d4

# Doker起動
$ sudo service docker start
$ sudo service docker status
[sudo] password for user:
 * Docker is running

# コンテナ起動
$ docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.
・
・
```

docker.ioのdockerでは動作しなかったり、古いバージョンのUbuntuで試してみたりと、いろいろ回り道しましたが、無事に起動できました。これからいろいろ遊んでみます。

## 参考URL
[WSL上でDockerが動くという噂](http://itengine.seesaa.net/article/464790564.html)
[どうしても Docker on Ubuntu 18.04 on WSL したかった](https://qiita.com/guchio/items/3eb0818df44fdbab3d14)
S3に保存した画像を表示する（Rails）

##概要

例えば、あるサービスで画像をアップロードする際にS3を使うことはよくあるだろう。
そのS３にアップロードした画像を表示させたいということは結構あるのでは？（私がそれをやりたい）
私がやりたいのは以下の条件である。

- S3はパブリックアクセスをオフ
- 通常S3にアクセスできるのは特定のプログラムからのみ

この条件で、サービスからのみ画像を表示するようにする方法を書きます。

##実行環境

Ruby 2.6.3
AWS S3

##手順

### S3について

前述した通り、パブリックアクセスはオフにしておきます。

ポリシーはこれぐらいしか書いてません。

```:S3policy
{
    "Version": "2012-10-17",
    "Id": "Policyxxxxxxxxxxx",
    "Statement": [
        {
            "Sid": "Stmtxxxxxxxxxxx",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::xxxxxxxxxxxx:user/your_name"
            },
            "Action": [
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::your_bucket_name/*"
        }
    ]
}
```

S3の特定のオブジェクトにアクセスしようとすると以下の画面のようにAccessDeniedになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265708/0d3a96f1-1de0-c29d-891e-51e93ad8df83.png)


これを回避するために一時的に閲覧可能となる期限付きURLというものがあります。

### 期限付きURLについて

期限付きURLとは、文字通り一時的に閲覧可能となるURLで、指定した時間を経過すると閲覧できなくなるものです。
これを利用して、サービス利用者のみS3に保存された画像を閲覧できるようにします。

ここではRubyでのやり方を示しますが、他の言語でもAWSのSDKがあればできるはずです。

### AWS S3 SDKのインストール

Gemfileを使った方法を書きますが、使わない方はgemでインストールしてください。
Gemfileに以下を書いてインストールします。

```rb:Gemfile
gem 'aws-sdk-s3'
```

### 期限付きURLの発行

以下の例ではプログラムからのみアクセスできるようにS3を設定しているのでCredentialを指定しています。
表示時間は60秒として設定しました。

```rb
s3 = Aws::S3::Resource.new(
      region: REGION_NAME, # 1. 利用しているリージョン
      credentials: Aws::Credentials.new(
        AWS_ACCESS_KEY, # 2. プログラムからアクセスできるユーザのアクセスキー
        AWS_SECRET_ACCESS_KEY # 3. プログラムからアクセスできるユーザのシークレットキー
      )
    )
signer = Aws::S3::Presigner.new(client: s3.client)
presigned_url = signer.presigned_url(:get_object,
        bucket: bucket_name, key: key, expires_in: 60)
```

Presigner.presigned_urlで期限付きURLを発行しています。
生成されたURLにアクセスすると閲覧できるはずです。

HTMLで画面に表示する場合には通常通りimgタグのsrcにこの期限付きURLを入れれば良いだけです。


以上　:slight_smile:
ReactNativeでグラフを書く


いろいろあるようですが、expoで動いてくれるものじゃないとダメ（expoありきなので）。
とりあえず、[react-native-chart-kit](https://github.com/indiespirit/react-native-chart-kit)というのをいじってみる。

## 準備

```bash
npm install --save react-native-chart-kit
```

react-native-svgがないぞ！と怒られる。

```bash
npm install --save react-native-svg
```

バージョン指定がおかしいぞ！と怒られる。package.jsonの記述を^から~へ変更。

## 実装

とりあえず本家のサンプルを参考に。

>今ひとつパラメータの意味がわからないが、一旦描画ができればOK。

```js:App.js
import React from 'react';
import { StyleSheet, Text, View, Dimensions } from 'react-native';
import {
    LineChart,
    BarChart,
    PieChart,
    ProgressChart,
    ContributionGraph,
    StackedBarChart
} from 'react-native-chart-kit'

export default class App extends React.Component {
    render() {
        return (
            <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
                <Text>Charts</Text>
                <LineChart
                    data={{
                        labels: ['1月', '2月', '3月', '4月', '5月', '6月'],
                        datasets: [{
                            data: [
                                Math.random() * 100,
                                Math.random() * 100,
                                Math.random() * 100,
                                Math.random() * 100,
                                Math.random() * 100,
                                Math.random() * 100
                            ]
                        }]
                    }}
                    width={300} // from react-native
                    height={220}
                    yAxisLabel={'円'}
                    chartConfig={{
                        backgroundColor: '#fff',
                        backgroundGradientFrom: '#fff',
                        backgroundGradientTo: '#fff',
                        color: (opacity = 0.5) => `rgba(0, 0, 0,0.5)`,
                    }}
                    // bezier
                />
            </View>
        );
    }
}

```

とりあえず一旦描画確認まで。暇なときに探求してみます。

![スクリーンショット 2019-09-15 10.17.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/af4f29a4-f2c1-eb63-a749-30b2c7275fcb.png "スクリーンショット 2019-09-15 10.17.50.png")
OracleXE 11gの SJIS化

# この記事について
* OracleDatabase Express Edition(XE) 11g のDockerコンテナで文字コードを変更するためにやったことを書く（N番煎じ）
* 11gでは文字コードはデフォルトでUTF8となっており、変更するためにはDBを再構築する必要がある
* 単体テストとかで使いたいので、起動したときに既に文字コードが変更されている状態にしたい
* 「え、今の時代に11g…？」
    * 仰るとおりだと思いますが、古いシステムだし皆さんのところにもそういうのありますよね？ね？

# 前提
* oracleが公開しているDockerfileを使って作成したイメージをベースイメージとする
    * 記事作成時点での最新コミットは `0972d17`

# 手順
* 他の記事でたくさん紹介されているのでそちらを参照
    * https://qiita.com/jsaito/items/33c7b2b5dd80a7447a14

# 追加で修正する箇所
* `CMD`コマンドで実行されている`$ORACLE_BASE/$RUN_FILE`を実行しないようにする必要がある
    * 起動時に`/etc/init.d/oracle-xe configure`が実行されないようにするため
* 以下のことを自前で行う
    * `tnsnames.ora`の書き換え
    * `listener.ora`の書き換え
    * `/etc/init.d/oracle-xe configure`に渡すrspファイルの書き換え
        * SYSとSYSTEM向けのパスワードの部分

# 上記もろもろに対応したDockerfile
* https://github.com/nkiri/oracle-11g-sjis

# 確認
* コンテナを起動

```
$ docker run --name oracle --shm-size 1g --rm nkiri/oracle/database:11.2.0.2-sjis
```

* 別ターミナルで`docker exec`でコンテナに入る

```
$ docker exec -it oracle
```

* 以下のコマンドを実行

```sh
su -p oracle -c "sqlplus -s / as sysdba" <<EOS
> select * from nls_database_parameters where parameter = 'NLS_CHARACTERSET';
> EOS
```

* 結果

```
PARAMETER
------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_CHARACTERSET
JA16SJISTILDE
```

# まとめ
* まぁできるんだけど、ビルドに１時間くらいかかる…
* SYSとSYSTEMのパスワードをビルド時に確定することになるので、公式のやつより若干自由度が下がる
Gatsby のサイトを GitHub Actions で GitHub Pages にデプロイ

[Gatsby.js] で構築しているブログ・サイトの GitHub Pages へのデプロイを GitHub Actions を利用して自動化する話です。

[Gatsby.js]: https://github.com/gatsbyjs/gatsby


## Gatsby のプロジェクトを用意

この記事では [gatsbyjs/gatsby-starter-blog: Gatsby starter for creating a blog](https://github.com/gatsbyjs/gatsby-starter-blog) を例として用います。



## GitHub Actions の設定

最新の情報は Action のリポジトリにて確認してください。

- [peaceiris/actions-gh-pages: GitHub Actions for deploying to GitHub Pages with Static Site Generators](https://github.com/peaceiris/actions-gh-pages)
- [GitHub Actions による GitHub Pages への自動デプロイ - Qiita](https://qiita.com/peaceiris/items/d401f2e5724fdcb0759d)

### Workflow の追加

以下のワークフローを作って main ブランチへ Push すると自動的にサイトのビルドとデプロイが始まります。

```yaml:.github/workflows/gh-pages.yml
name: GitHub Pages

on:
  push:
    branches:
      - main
  pull_request:

jobs:
  deploy:
    runs-on: ubuntu-20.04
    concurrency:
      group: ${{ github.workflow }}-${{ github.ref }}
    steps:
      - uses: actions/checkout@v2

      - name: Setup Node
        uses: actions/setup-node@v2
        with:
          node-version: '14'

      - name: Cache dependencies
        uses: actions/cache@v2
        with:
          path: ~/.npm
          key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-node-

      - run: npm ci
      - run: npm run format
      - run: npm run test
      - run: npm run build

      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3
        if: ${{ github.ref == 'refs/heads/main' }}
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: ./public
```



## Project pages

User and Organization リポジトリ (`username/username.github.io`) の場合は GitHub Actions の workflow を追加するだけで十分です。一方で Project pages (`username/project_name` 形式のリポジトリ) の場合はいくつかの修正が必要です。

サイトは `https://username.github.io/project_name/` 形式の URL で公開されます。

- [How Gatsby Works with GitHub Pages | GatsbyJS](https://www.gatsbyjs.org/docs/how-gatsby-works-with-github-pages/)

```json:gatsby-config.js
module.exports = {
  pathPrefix: `/project_name`
}
```

```json:package.json
"scripts": {
    "build": "gatsby build --prefix-paths"
}
```
機械学習の学習が終わったらその結果を自動的にメールで送ってくれるモジュールを作ってみた

#とりあえずpythonのモジュールを作ってみたかった
Python初心者です。
###今回は自作モジュールを作ってみたい！
それだけの気持ちでやりました。

というわけで今回製作したのは、
#####機械学習の学習が終わったらそのロス等のログをメールで送ってくれるモジュール
です。特にfine tuneなどやってるときはロスがきちんと減っているかをすぐ知りたかったり、メールがくることで学習が終わっていることをメールで知ることができます。(2回言った)

#1 gitから取ってきてメールアドレスを設定する

gitからcloneします。

```
git clone git@github.com:daikiclimate/modules.git
```

次にメールアドレスだけ先に登録しておくと楽です。

```
vi Datorch/mailog.py
```

そして以下の部分を編集します。

```mailog.py
   #settings
    to_email = "aaaa@gmail.com"
    from_email = "bbbb@gmail.com"

    gmail_account = "aaaa@gmail.com"
    gmail_password = "cccc"
```

"aaaa@gmail.com"は送信側のメールアドレス
"bbbb@gmail.com"は受信側のメールアドレス
"cccc"はaaaaのパスワードです。

(経験上)gmailでログ送信・受信専用のアカウントを作り、送信も受信も同じアカウントでやってしまうのが簡単でいいと思います。
#####そして送信にしようするアカウントで「安全性の低いアプリのアクセス」を許可する必要があります。
以下のURLから変更してください。(セキュリティ含め新アカウント推奨)
<https://myaccount.google.com/security>

以上で準備は終了です。

次に以上のものをpipのライブラリに登録します。
pipでインストールしたみたいに使うためには、こうするといいようです。

```
python setup.py develop
```

#2 使い方
mail送信用のモジュールをインポートします

```training.py
import Datorch.mailog as mailog
```

引数１がメールタイトル、引数2が本文のあるテキストファイルの名前です。
今回で言えば、"log.txt"というテキストファイルにログを記述してあります。

```training.py
mailog.sendmail("Sending Log!","log.txt")
```

これでメールが送信できます。
簡単のためにテキストを作成するLogfuncクラスを作成してあります。

```training.py
from Datorch.printlog import Logfunc
Logf = Logfunc()

for epoch in range(10):
    ...
    ...
    Logf.update(epoch, train_loss, test_loss)
    Logf.print_log()
    Logf.write_log()
```

updateはクラス変数に数値を更新する作業になります。引数はとりあえず以下のようになってます。
update(self, epoch, train_loss, test_loss = None, correct = None, total = None )

print_log()は標準出力でlossなどをプリントします。

write_log()は"log.txt"という形でロスを記録する(追記する)テキストファイルを更新います。


#自分では使ってます。
いいんです。僕は「pythonのモジュール作ったことあります」って言いたかっただけなんです

#正直な感想
メールアドレスの設定とかあんまりクールではないですが、時間があれば更新していきたいと思います。

#リンク
https://github.com/daikiclimate/modules
AWSでセキュア(HTTPS)な独自ドメインサイトを構築する手順

# 概要
AWSでセキュア(HTTPS)な独自ドメインサイトを構築する下記2つの手順をまとめる。

- CloudFront + EC2インスタンス
- CloudFront + S3

# Certificate Managerの設定
  ドメインの登録 "zzzz.net" (有料)
  ドメイン(example.net)登録料金=11$
  証明書作成リージョン = US東部 バージニア北部

# Route53の設定
  レコードセットの登録

- EC2インスタンス向け
  **xxxx.zzzz.net CNAME yyyy.cloudfront.net** `手動登録`
  **xxxx.zzzz.netの証明書に関するCNAME** `CloudFrontから[Request or Import a Certificate with ACM]を押下し自動登録`

- S3向け
  **XXXX.zzzz.net CNAME YYYY.cloudfront.net** `手動登録`
  **XXXX.zzzz.netの証明書に関するCNAME** `CloudFrontから[Request or Import a Certificate with ACM]を押下し自動登録`

# CloudFrontの設定
  **EC2インスタンス向け**

  - General:<br/>
    Alternate Domain Names (CNAMEs) = xxxx.zzzz.net<br/>
    [Request or Import a Certificate with ACM]で証明書を要求<br/>
    Custom SSL Certificate (example.com) = 証明書を指定<br/>
  - Behaviors:<br/>
    Viewer Protocol Policy = HTTP and HTTPS<br/>
    Allowed HTTP Methods = GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE<br/>
    CloudFrontキャッシュ無効化 (Minimum/Maximum/Default TTL=0)<br/>
    Cache Based on Selected Request Headers = All<br/>
    Forward Cookies = All<br/>
    Query String Forwarding and Caching = cache based on all<br/>
  - Origins:<br/>
    Origin Protocol Policy = HTTP Only<br/>
    Origin Domain Name = EC2の外部公開ドメイン名 (xxxx.zzzz.netではない)<br/>
    Origin Response Timeout = 60<br/>
    HTTP Port = EC2の外部公開ポート番号<br/>

  **S3インスタンス向け**

  - General:<br/>
    Alternate Domain Names (CNAMEs) = XXXX.zzzz.net<br/>
    [Request or Import a Certificate with ACM]で証明書を要求<br/>
    Custom SSL Certificate (example.com) = 証明書を指定<br/>
  - Behaviors:<br/>
    Viewer Protocol Policy = HTTP and HTTPS<br/>
    Allowed HTTP Methods = GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE<br/>
    CloudFrontキャッシュ無効化 (Minimum/Maximum/Default TTL=0)<br/>
    Cache Based on Selected Request Headers = None(Improves Caching)<br/>
    Forward Cookies = All<br/>
    Query String Forwarding and Caching = cache based on all<br/>
  - Origins:<br/>
    Restrict Bucket Access = YES<br/>
    Origin Access Identity = Use an Existing Identity<br/>
    Grant Read Permissions on Bucket = No, I Will Update Permissions<br/>
    Origin Domain Name = S3の外部公開ドメイン名 (XXXX.zzzz.netではない)<br/>

# ブラウザからの接続

- EC2インスタンス向け
  ｈttp://xxxx.zzzz.net
  ｈttps://xxxx.zzzz.net

- S3向け
  ｈttp://XXXX.zzzz.net
  ｈttps://XXXX.zzzz.net
PHP は組み込み関数と同名の関数・メソッドを定義できるのか

結論から言うと、関数の場合はエラーで定義できず、メソッドの場合は定義できます。

組み込み関数の `htmlspecialchars` を再定義して確かめます。

# 関数

```php
<?php

function htmlspecialchars($args) {
    return $args;
}

$a = '<a href="https://www.yahoo.co.jp/">zozo</a>';

echo htmlspecialchars($a);
```

```php:結果
Fatal error: Cannot redeclare htmlspecialchars() in /in/r0jYu on line 3

Process exited with code 255.
```

再宣言できないとエラーが表示されます。

実行結果：[Online PHP editor](https://3v4l.org/r0jYu)


# インスタンスメソッド

```php
<?php

class A
{
    public function htmlspecialchars($args)
    {
        return 'instance method :' . $args;
    }
}

$a = '<a href="https://www.yahoo.co.jp/">zozo</a>';
$b = new A;
echo $b->htmlspecialchars($a);
```

```php:結果
instance method :<a href="https://www.yahoo.co.jp/">zozo</a>
```

エラーは表示されません。

実行結果：[Online PHP editor](https://3v4l.org/89NlX)

# 静的メソッド

```php
<?php

class A
{
    public static function htmlspecialchars($args)
    {
        return 'static method  :' . $args;
    }
}

$a = '<a href="https://www.yahoo.co.jp/">zozo</a>';
$b = new A;
echo $b->htmlspecialchars($a);
```

```php:結果
static method  :<a href="https://www.yahoo.co.jp/">zozo</a>
```

エラーは表示されません。

実行結果：[Online PHP editor](https://3v4l.org/YlquIs)

# インスタンスメソッド・静的メソッドの再定義

```php
<?php

class A
{
    public function htmlspecialchars($args)
    {
        return 'instance method  :' . $args;
    }
    public static function htmlspecialchars($args)
    {
        return 'static method  :' . $args;
    }
}

$a = '<a href="https://www.yahoo.co.jp/">zozo</a>';
$b = new A;
echo $b->htmlspecialchars($a);
echo $b::htmlspecialchars($a);
```
```php:結果
Fatal error: Cannot redeclare A::htmlspecialchars() in /in/QGdT4 on line 9

Process exited with code 255.
```

インスタンスメソッド・静的メソッド関係なく、一度定義したインスタンスメソッド・静的メソッドと同名のメソッドを再定義するとエラーが表示されます。

実行結果：[Online PHP editor](https://3v4l.org/QGdT4https://3v4l.org/QGdT4)
window.mediaMatchで3デバイス判定

- mediaMatchで3デバイス判定と切替時のイベントをまとめる
- メディアクエリはサイトによって書き換え

サンプルコード
-
```javascript

// メディアチェック
let medias = {
    winobj:[],
    query:[
        'screen and (max-width: 559px)', //SP
        'screen and (max-width: 959px) and (min-width: 560px)', //TABLET
        'screen and (min-width: 960px)', //PC
    ],
    removeSpace: function(s) {
        // スペースを除去するやつ
        return s.replace(/\s/g,'');
    }
};

// 切り替えイベント
function checkBreak(query){
    if(medias.removeSpace(query.media) === medias.removeSpace(medias.query[0]) && query.matches === true){
        // spの処理
        console.log( 'sp' );
    }
    if(medias.removeSpace(query.media) === medias.removeSpace(medias.query[1]) && query.matches === true){
        // tabの処理
        console.log( 'tab' );
    }
    if(medias.removeSpace(query.media) === medias.removeSpace(medias.query[2]) && query.matches === true){
        // pcの処理
        console.log( 'pc' );
    }
}

// ロード時実行
document.addEventListener('DOMContentLoaded',function(){
    for(let i=0;i<medias.query.length;i++){
        medias.winobj[i] = window.matchMedia(medias.query[i]);
        medias.winobj[i].addListener(checkBreak);
    }    
});
```

ちょっと課題点
-
スペースを含む以下のif部分。
もっと簡易なmatchを生成してよりメディアクエリ部分に特化したifのがブラウザの変更とかにはつよそーだなーと思ったり。

```javascript
medias.removeSpace(query.media) === medias.removeSpace(medias.query[0]) && ~
```

ブラウザ確認
-
Chrome 76.0
Firefox 69.0
Safari 12.1

偉大なる参考
-
[window.matchMedia をそろそろ活用してもいい頃](https://qiita.com/amamamaou/items/a29b29f5267196a5e4ea)
[【続々】window.matchMedia を用いたブレイクポイントイベント](https://qiita.com/axcelwork@github/items/2d47b2a49fdec87e7cac)
[Matching multiple CSS media queries using window.matchMedia()](http://www.javascriptkit.com/javatutors/matchmediamultiple.shtml)
ReactNavigationのTabにバッヂをつける


## やりたいこと

バッヂを出したい。

![スクリーンショット 2019-09-15 7.23.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/0e5527b5-fe96-cd63-0abf-cbe7fbc28bf6.png "スクリーンショット 2019-09-15 7.23.31.png")



## 準備

バッチの制御（表示）には[react-native-icon-badge](https://github.com/yanqiw/react-native-icon-badge)を利用することにしました（いろいろなものにバッヂつけられるみたいなので）。

* react-navigationを諸々インストール（現状、癖があります）
* react-native-vector-iconsのインストール
* eact-native-icon-badgeのインストール

## 実装

いろいろ書いていますが、概念的に難しいところはないです。
TabのnavigationOptionで、Tabアイコン(tabBarIcon)を設定するところにIconBadgeを指定してやり、

* MainElement
* BadgeElement
* IconBadgeStyle

を設定してやればいい感じ。表示、非表示はHiddenプロパティで制御すればいいみたい。

```js:App.js
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
import { RotationGestureHandler } from 'react-native-gesture-handler';

import { createAppContainer } from 'react-navigation';
import { createStackNavigator } from 'react-navigation-stack';
import { createBottomTabNavigator } from 'react-navigation-tabs';
import { createDrawerNavigator } from 'react-navigation-drawer';

import Icon from 'react-native-vector-icons/FontAwesome';
import IconBadge from 'react-native-icon-badge';

import HomeScreen from './screens/Home';
import InfoScreen from './screens/Info';

const tab = createBottomTabNavigator(
    {
        Home: {
            screen: HomeScreen,
            navigationOptions: {
                tabBarIcon: ({ tintColor }) => (<Icon size={24} name="home" color={tintColor} />)
            }
        },
        Info: {
            screen: InfoScreen,
            navigationOptions: {
                tabBarIcon: ({ tintColor }) => (
                    // <View style={{ flexDirection: 'row', justifyContent: 'center', alignItems: 'center' }}>
                        <IconBadge
                            MainElement={
                                <Icon size={24} name="info-circle" color={tintColor} />
                            }
                            BadgeElement={
                                <Text style={{ color: "#fff" }}>{1}</Text>
                            }
                            IconBadgeStyle={{
                                width: 15,
                                height: 15,
                                backgroundColor: 'red',
                                position:'absolute',
                                left: 10
                            }}
                            Hidden={false}
                        />
                    // </View>
                )
            }
        }
    }
);

const AppContainer = createAppContainer(tab);

export default class App extends React.Component {
    render() {
        return (
            <AppContainer />
        );
    }
}
```

Hiddenは

```
Hidden={this.state.BadgeCount==0}
```

みたいに使うことで、0じゃないときに出すことができる。なるほど。

## 参考

* https://github.com/react-navigation/react-navigation/issues/3692
* https://github.com/yanqiw/react-native-icon-badge
Drone で CI をおこなう

- Drone CI Server がセットアップ済であること。

## 準備

### CLI をインストール

ローカルでの実行確認や Drone サーバーの API を叩くためのコマンド [Drone CLI](https://docs.drone.io/cli/) をインストールしておく。

macOS の場合)

    $ brew tap drone/drone
    $ brew install drone

サーバーの API を実行する場合、サーバーの URL と API トークンを環境変数に設定しておく。

    $ export DRONE_SERVER=https://drone.example.jp
    $ export DRONE_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

設定するトークンは Drone Server の画面にログインして画面右上の User settings から確認することができる。

## リポジトリに対し、CI を有効にする

1. Drone Server にログインする。
1. リポジトリ一覧から対象を選択し、"ACTIVATE REPOSITORY"
    これにより、GitHub のリポジトリに Drone への Webhook 設定が追加される。この設定は GitHub リポジトリの Settings > Hooks から確認できる。
1. "Project settings" の "Trusted" をチェックして "SAVE"  ★この設定は Drone 管理者のみ設定可  
    (これを有効にしないと一部の機能が使用できない。)

## CI の設定

リポジトリのルートディレクトリに .drone.yml を作成してコミットする。

設定方法は [Drone CI 基本設定 (.drone.yml)](https://qiita.com/yh1224/items/3d9611310530c95133ad) を参照。

## ローカルでの実行確認

.drone.yml のあるディレクトリで以下のコマンドを実行する。(要 Docker Engine)

    $ drone exec --trusted

Secrets を使っている場合、サーバーでないと復号できないため、ローカルに secret を `(name)=(value)` 形式で記述したテキストファイルを用意して指定する。

    $ drone exec --trusted --secret-file=secrets.txt
初心者用Github環境構築

# 初心者用Github環境構築

##１．砂場（リモート）にため池（リポジトリ）を作ろう！
※リポジトリ（リモートの保存場所）を作成しない場合はスキップする。
※実際の砂場にため池を作る行為は器物破損に問われる場合があります。

####１ー１．https://github.com にアクセスする。
####１ー２．右上の『＋』、『New repository』
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203986/49e378c4-7d7a-9983-f75b-7ce714bb68e9.png" width="800px"/>
####１ー３．リポジトリ情報を入力し、『Create Repository』
Owner ... リポジトリの所有者
Repository Name ... リポジトリ名
Discription ... 説明
Public/Private ...  公開(Plublic)か、非公開(Private)か。公開にする場合も招待を受けた人しか編集できない。
Add .ignore ... ファイル管理除外設定ファイルの言語。その言語で管理しないファイルの既定を定義する。（Swift言語にしました）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203986/b6e6a707-1f90-58c4-83eb-9645a539a184.png" width="800px"/>
####１ー４．ため池（リポジトリ）完成
砂場（リモート）にため池（リポジトリ）ができました！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203986/ea939e39-861a-655d-2a30-851a7a98ed06.png" width="800px"/>

##２．砂場（リモート）のため池（リポジトリ）に編集者を招待しよう！
※リポジトリ（リモートの保存場所）を管理しない場合はスキップする。

####２ー１．『Collaborators』、『Settings』
####２ー２．招待するGitアカウント名を入力し、『Add collaborator』
（所有者は招待不要）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203986/b8aec528-e2d2-f647-cd37-45835ca90b95.png" width="800px"/>

##３．所有者と編集者の身元を保証しよう！
※これによりパスワード入力を回避できる。
####３ー１．身元保証するアカウントでGithubにログインする。
####３ー２．右上の『＋』、『Settings』、『SSH and GPG keys』
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203986/e5dde652-c186-8a02-752b-73b809821391.png" width="800px"/>

####３ー３．『New SSH Key』
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203986/42618eba-346f-49da-fcf9-83189cb8e6e6.png" width="800px"/>
####３ー４．SSH秘密鍵と公開鍵を作成する。

```bash:ssh-keygen
mkdir ~/.ssh
cd ~/.ssh
ssh-keygen
#[Enter]
#[Enter]
#[Enter]
cat id_rsa.pub
```

####３ー３．SSH公開キー（id_rsa.pub）を設定する。『Add SSH Key』
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203986/cd9f8faa-f33c-b7bb-33ec-1237140c2588.png" width="800px"/>

##４．リポジトリのURLを確認する。
####４ー１．『Use SSH』、コピーアイコン
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203986/bd59ca35-76de-8302-b649-65ddc9aaeedb.png" width="800px"/>
Geth始め方めも

##インストール
```
$ brew tap ethereum/ethereum
$ brew install ethereum
```

##Genesisfile作成
```myGenesis.json
{
  "config": {
    "chainId": 15
  },
  "nonce": "0x0000000000000042",
  "timestamp": "0x0",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "",
  "gasLimit": "0x8000000",
  "difficulty": "0x4000",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x3333333333333333333333333333333333333333",
  "alloc": {}
}
```

##ブロックチェーン初期化
```
$ geth --datadir /home/ubuntu/eth_private_net init /home/ubuntu/eth_private_net/myGenesis.json
```

##Geth起動

```
$ geth --networkid "15" --nodiscover --datadir "/home/ubuntu/eth_private_net" console 2>> /home/ubuntu/eth_private_net/geth_err.log
```


##Contractの生成

```
$ solc --abi --bin SingleNumRegister.sol　//ソースコードをコンパイル

======= SingleNumRegister.sol:SingleNumRegister =======
Binary:
6060604052341561000f57600080fd5b60d38061001d6000396000f3006060604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c14606e575b600080fd5b3415605857600080fd5b606c60048080359060200190919050506094565b005b3415607857600080fd5b607e609e565b6040518082815260200191505060405180910390f35b8060008190555050565b600080549050905600a165627a7a72305820bdd0549ef41e9c70cc944a6c19e54da47ecda63a1c5edfc7024125b5c49b4acb0029
Contract JSON ABI
[{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"retVal","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]
```


```
> var bin = "0x6060604052341561000f57600080fd5b60d38061001d6000396000f3006060604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c14606e575b600080fd5b3415605857600080fd5b606c60048080359060200190919050506094565b005b3415607857600080fd5b607e609e565b6040518082815260200191505060405180910390f35b8060008190555050565b600080549050905600a165627a7a72305820bdd0549ef41e9c70cc944a6c19e54da47ecda63a1c5edfc7024125b5c49b4acb0029"
> var abi = [{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"retVal","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]
> var contract = eth.contract(abi)
> var myContract = contract.new({ from: eth.accounts[0], data: bin})
```

##Remix-ide
IDE
loading...のspinnerを表示する（他のコンポーネントに触らせない）



react-native-loading-spinner-overlayを使うのがいいらしい。

## やりたいこ

こんな感じ。

![スクリーンショット 2019-09-15 6.21.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/776c23e3-14ed-7ea4-712e-d3195c9fc889.png "スクリーンショット 2019-09-15 6.21.03.png")


## インストール

```bash
npm install --save react-native-loading-spinner-overlay
```

## 実装

使い方は簡単。

```js:App.js
import React from 'react';
import { StyleSheet, Text, View, Button } from 'react-native';
import Spinner from 'react-native-loading-spinner-overlay';

export default class App extends React.Component {

    //初期値true
    state = {
        spinner: true
    }

    //3秒たったら消す
    componentDidMount(){
        setInterval(()=>{
            this.setState({
                spinner: false
            })
        }, 3000);
    }

    render() {
        return (
            <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
                <Text>App</Text>
                <Spinner
                    visible={this.state.spinner}
                    textContent="読込中..."
                    textStyle={{ color: "#fff" }}
                    overlayColor="rgba(0,0,0,0.5)"
                />
            </View>
        );
    }
}
```
webpackのexportsをarrayのままwebpack mergeしたらbuildコケたのを修正した話

# そもそもどういう問題が起きたのか？

Electronアプリにwebpack使うときは、`module.exports`を`main`と`renderer`で分けたほうがいいよ
という[記事](https://qiita.com/necomeshi/items/1861ff80e689a377899a)を見つけ↓のように設定していた。

```js:webpack.config.js
const main = {
  target: "electron-main",
  //省略
};

const renderer = {
  target: "electron-renderer",
  //省略
};

module.exports = [main, renderer];
```

そんなある日、webpack configを`develop`と`production `で分けるならベストプラクティスあるよ
という[記事](https://qiita.com/teinen_qiita/items/4e828ac30221efb624e1)も見つけた。  
[公式](https://webpack.js.org/guides/production/)でも書かれていたので、速攻試してみることに

```js:webpack.dev.js
const merge = require("webpack-merge");
const common = require("./webpack.common.js");

module.exports = merge(common, {
  mode: "development",
});
```

すると、↓のようなエラーが

```bash
Invalid configuration object. Webpack has been initialised using a configuration object that does not match the API schema.
 - configuration has an unknown property '1'. These properties are valid:
   object { amd?, bail?, cache?, context?, dependencies?, devServer?, devtool?, entry?, externals?, infrastructureLogging?, loader?, mode?, module?, name?, node?, optimization?, ou
tput?, parallelism?, performance?, plugins?, profile?, recordsInputPath?, recordsOutputPath?, recordsPath?, resolve?, resolveLoader?, serve?, stats?, target?, watch?, watchOptions?
 }
```

不明なpropertyがあるからBuild失敗したらしいが、`unknown property '1'`ってどゆこと？
書いた覚えないんですけど...

# 原因
`webpack.common.js`の`module.exports`が`array`だから`webpack-merge`が上手くmergeできなかったらしい

# 対策
`main`と`renderer`のconfigに`develop`用configをmergeしてから`module.exports`するようにした。  

```js:webpack.dev.js
const merge = require("webpack-merge");
const common = require("./webpack.common.js");

const mainIndex = common.findIndex(config => config.target === "electron-main");
const rendererIndex = common.findIndex(config => config.target === "electron-renderer");

const devConfig = {
  mode: "development"
};

const main = merge(common[mainIndex], devConfig);
const renderer = merge(common[rendererIndex], devConfig);

module.exports = [main, renderer];
```

これでbuild通りました。


# 参考文献
[TypeScriptとElectron](https://qiita.com/necomeshi/items/1861ff80e689a377899a)
[webpackで開発用/本番用の設定を分ける](https://qiita.com/teinen_qiita/items/4e828ac30221efb624e1)
[Production | webpack](https://webpack.js.org/guides/production/)
JavaScript の Array を特定の数に分割する関数（chunk）を生やしてみる

## TL;DR
```javascript
Array.prototype.chunk = function(size) {
  const new_array = [];
  for(let i = 0; i < this.length; i += size) {
    new_array.push(this.slice(i, i + size));
  };
  return new_array;
}
```
JavaScript の Array に zip 関数を生やしてみる

## TL;DR
```javascript
Array.prototype.zip = function(...args) {
  const new_array = [];
  for(let i = 0; i < this.length; i ++) {
    new_array.push([this[i], ...args.map(arg => arg[i])]);
  }
  return new_array;
}
```

## 詳細
やっていることは単純で同じインデックスの値同士の組み合わせを作って新しい配列に push しているだけですね。もともとは Ruby の [Array#zip](https://docs.ruby-lang.org/ja/latest/class/Array.html#I_ZIP) のようなことを JavaScript でもできないかなと思って探していたんですが、どうやらネイティブでは実装されていないようなので今回作ってみた次第です。

実際に使ってみるとこんな感じになります。

```javascript
const array0 = [0, 1, 2];
const array1 = [3, 4, 5];
const array2 = [6, 7, 8];

array0.zip(array1, array2) // => [[ 0, 3, 6 ], [ 1, 4, 7 ], [ 2, 5, 8 ]]
```

## 参考文献
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters
[devise_token_auth]ヘルパーメソッドが使えない(undefined)ときの対処法

公式のドキュメントをちゃんと読めばわかる内容ですが、地味にはまったので書きます…:weary:

# 発生したエラー
ログインしたユーザーのみアクセス可能にしたpostsコントローラにリクエストを送ったところ以下のようなエラーが出ました。

```
NoMethodError (undefined method `authenticate_user!' for #<Api::V1::PostsController:0x00007f0a5806dee8>):
```

# 解決策
どうやらdevise_token_authのヘルパーメソッドを記述するときはroute.rbの内容次第で変更しなければならないようです。
僕のルートは

```ruby:routes.js
Rails.application.routes.draw do
  devise_for :users

  namespace :api do
    namespace :v1 do
      mount_devise_token_auth_for 'User', at: 'auth', controllers: {
        registrations: 'api/v1/auth/registrations'
      }
      resources :posts
    end
  end
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
```

という感じになっています。
`namespace`が使われているので`/api/v1/auth`とのようになります。
この時、ヘルパーメソッドを以下の様に変更しなくてはなりません

|before|after|
|:----:|:---:|
|before_action :authenticate_user!|before_action :authenticate_api_v1_user!|
|current_user|current_api_v1_user|

# まとめ
英語のドキュメントばかりで大変でしたが、この記事が日本の駆け出しエンジニアの助けになれば幸いです！
Inputを分岐させる機構を作った

#はじめに
以前[キー入力、マウス入力をIObservable<T>に変換して使う](https://qiita.com/Euglenach/items/29833548294a8b822b79)という記事を書きました。
このライブラリはInputを流すストリームを作るものでしたが、いまいち使い道が思い浮かばなかったのですが、
Inputを分岐してくれる機構があれば便利かなと思いました。
と思っていたら[UnityでInputの分岐器を作った話](https://qiita.com/domasyake/items/eb0b9b9c1355966cb53a)という記事を見つけました。そうです、やりたいことはこれです。
ということで前回の[InputAsObservable](https://github.com/euglenach/InputAsObservable)を使って楽に作れるんじゃないかということで作ってみました。

更新
・2020/02/09
Brancherという単語がおかしいってことで名前を「InputSwitcher」として新しいリポジトリを作りました。
クラス名も長かったのが何となく嫌だったので「InputSw」としました。
名前空間とクラス名が変わっただけで機能は同じですが、更新は今後こっちでします
[InputSwitcher](https://github.com/euglenach/InputSwitcher)

#用意するもの
[UniRx](https://github.com/euglenach/InputAsObservable)
[InputAsObservable](https://github.com/euglenach/InputAsObservable)
[InputBrancher](https://github.com/euglenach/InputBrancher)

#使い方
##①Interfaceの実装
Inputの流す先のクラスにIInputReceiverインターフェースを実装します(空のインターフェースです)

```C#:Hoge.cs
using InputBranch;
using UnityEngine;
using UniRx;

public class Hoge : MonoBehaviour,IInputReceiver{
    void Start(){
        InputBrancher.GetKey(this, KeyCode.C)
               .Subscribe(_ => {Debug.Log("Hoge");}); //Cをおすとほげええええ
    }
}
```

```C#:Foo.cs
using InputBranch;
using UniRx;
using UnityEngine;

public class Foo : MonoBehaviour,IInputReceiver{
    void Start(){
        InputBrancher.GetKey(this, KeyCode.C)
               .Subscribe(_ => {Debug.Log("Foo");}); //Cを押すとふううううう
    }
}

```

##②分岐方法を決定
InputBrancher.Switch(IInputReceiver)メソッドでどのインスタンスのインプットを受け取るかを決めます。
例ではHを押したときとFを押したときで分岐させています。

```C#:SampleInputController.cs
using InputBranch;
using UniRx.Triggers;
using UnityEngine;
using UniRx;

public class SampleInputController : MonoBehaviour{
    [SerializeField] private Hoge hoge;
    [SerializeField] private Foo foo;
    private void Start(){
        this.OnKeyDownAsObservable(KeyCode.H)
            .Subscribe(_ => {
                Debug.Log("switch hoge");
                InputBrancher.Switch(hoge); //Hを押したらhogeのインプットしか受け取らない
            });
        
        this.OnKeyDownAsObservable(KeyCode.F)
            .Subscribe(_ => {
                Debug.Log("switch foo");
                InputBrancher.Switch(foo); //Fを押したらfooのインプットしか受け取らない
            });
    }
}

```

##結果
![screenshot.1559356854.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/521ab80d-7e8d-c6dd-1b0d-a23919030996.png)

インプットを分岐することができ、同じCキーを押したときでもインスタンスによって結果が変わりました。

#利点
InputBrancherを介することでインプットを分岐することができ、結果をイベントで受け取るのでUpdateにif文で判定を書くことを撲滅できます。
#欠点
単にboolやflootで値が欲しいときに対応できない。(それ用のメソッドをまた作らないと…)

#余談
![2019-09-15 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/9caaf4f5-b249-7306-ecc2-6cb3e851ab5c.png)
見逃してましたがRiderに怒られてました。Brancherって単語はないようですね！！
Maixduinoのカメラモジュール延長

Maixduinoに付属しているカメラはとても短く、本体に近いので延長しようと考えた
本体はラジオデーパート三階にあるShigezoneさんで購入した
https://twitter.com/shigezoneakiba


延長に使うのは延長分のフレキシブルケーブル(フレキケーブル)と、連結基板だ。
今回は秋葉原にあるaitendoさんで購入した。秋葉原駅で降りるよりも末広町駅の方が近い。
http://aitendo.cc/?page_id=2


amazonページより、8bit MCU LCD 24P 0.5mm FPCコネクタという種類が使われていることがわかった。

連結板はFFB-FFC(0.5)24Pを購入
![IMG_6519 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/4ae15306-61f8-ab5d-9224-85ced0ae067c.jpeg)

フレキケーブルは店員さんにコネクタの種類を見せて、長さと本数を伝えると取りに行ってくれた。
私は20cmのものを購入した

取り付ける場合、PCから外した状態で取り付ける事をお勧めする。
また、ケーブルと連結基板の裏表に注意である。
![IMG_6518.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/37bb0929-74a4-e16d-f55a-403af78bef4b.jpeg)


カメラが接続されていない場合はMaixPy IED上にOSErrorと出る。
セットアップにはこちらのサイトを参考にさせてもらった
https://kokensha.xyz/deeplearning/macos-sipeed-maixduino-face-detection/




もし、他に延長する方法があったり、連結基板が安く購入できる場所があれば教えてもらえると嬉しいです！
ターミナルでMySQLをすぐ開くメモ(MAMP)

MAMPを起動しておく。

まず下記コマンドでディレクトリを移動

```terminal:~$
$ cd /Applications/MAMP/Library/bin/
```

そのあと、SQLにログイン

```terminal:~$
$ ./mysql -u root -p
```

パスワード入力が求められるので、自分のパソコンのパスワードを打ち込む

```
Enter password: 〇〇(パスワード)
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 〇〇〇
Server version: 5.〇.〇 MySQL Community Server (GPL)


Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
```

そして

```
mysql> 
```
となり、
ここでいきなりSQL文を書くと

```
ERROR 1046 (3D000): No database selected
```

使用テーブルを指定していないのでエラーが出る。
そこで、

```
mysql> USE 〇〇(テーブル名);
```

と打つ。すると、

```
Database changed
```
となり、
好きなSQL文を打つことができる。
Windowsでhelmを使う

# 環境
- Windows10 Pro
- minikube

# helmとは

- k8s用のパッケージマネージャー Linuxでyumとかにあたるもの
- kubectlコマンドでymalファイルを使う場合、そのyamlファイルを作ってあげないといけない。それらの置き場所がインターネット上のリポジトリにあり、そこを参照してダウンロード、デプロイまでしてくれる

# 手順

## 準備

```
mkdir C:\tools\helm\
Invoke-WebRequest -Uri https://storage.googleapis.com/kubernetes-helm/helm-v2.13.0-windows-amd64.zip -OutFile C:\tools\helm\helm-v2.13.0-windows-amd64.zip
cd C:\tools\helm\
Expand-Archive -Path C:\tools\helm\helm-v2.13.0-windows-amd64.zip
move .\helm-v2.13.0-windows-amd64\windows-amd64\helm.exe .
```

## 環境変数設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/53d42d8c-9290-338c-1c98-9190d251da98.png)

## 初期設定

```
helm init
```

## インストール確認

```
helm version
```

# サンプルアプリケーションをデプロイする
[こちらを参考](https://qiita.com/reoring/items/e50877f543bed72d93ee)

## クラスタロールを作成する
Tillerを使うために必要で、helmコマンド実行時に動作するPod。
helmでデプロイされるPodたちを管理するPod的なイメージだと思う

```clusterrole.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
  name: cluster-admin
rules:
- apiGroups:
  - '*'
  resources:
  - '*'
  verbs:
  - '*'
- nonResourceURLs:
  - '*'
  verbs:
  - '*'
```

## クラスタロールをデプロイ

```
kubectl create -f .\cluserrole.yaml
```

```
.\kubectl.exe create serviceaccount -n kube-system tiller
.\kubectl.exe create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
```

```
helm init --service-account tiller
```

## デプロイされているか確認

```
.\kubectl.exe --namespace kube-system get pods
```

## Redisをインストール

```
helm install stable/redis --set serviceType=NodePort
```

## デプロイされているか確認
```
PS C:\Users\yuta> .\kubectl.exe get pod
NAME                             READY   STATUS    RESTARTS   AGE
linting-sparrow-redis-master-0   1/1     Running   0          88s
linting-sparrow-redis-slave-0    1/1     Running   0          88s
linting-sparrow-redis-slave-1    1/1     Running   0          32s
PS C:\Users\yuta>
```
読書メモ　パソコンの仕組みの絵本

[パソコンの仕組みの絵本](https://www.amazon.co.jp/%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%AE%E7%B5%B5%E6%9C%AC-%E3%82%A2%E3%83%B3%E3%82%AF/dp/4798122521)の読書メモです。

# パソコンの仕組みの絵本

_著者_ 株式会社アンク

## 本書の目次

- パソコンのしくみの勉強をはじめる前に
- CPU とチップセット
- メモリ
- ハードディスク
- いろいろな記憶装置
- ネットワークインタフェース
- 映像とサウンド
- 入力と出力
- プリンタ

であり、目次毎に要約していく。

## 解説

### 1. パソコンのしくみの勉強を始める前に

この章では、コンピュータ(電子機器計算器のこと）の歴史から入り、コンピュータの５大要素,形態,筺体とマザーボードの説明が主であった。また、パソコン(個人での使用を目的としたパーソナルコンピュータ)が動くには**ハードウェア**と**ソフトウェア**が必要であるなど、パソコンの基本的な知識を身に付ける為の章であった。

### 2. CPU とチップセット

この章では、**CPU**(_Central Processing_)の説明であった。CPU とは入力装置、記憶装置、からデータを受け取って演算を行なったり、ほかの装置の動きを制御したりする役目を持っている。人間でいえば、脳や中枢神経のイメージだ。また、CPU と各装置でやりとりされるデータの流れはチップセットと呼ばれる部品が管理してる。

### 3. メモリ

メモリとは、情報を記憶する部品で、プログラムやデータを記憶をする役割を持っている。情報の書き込みと読み出しのできる**RAM**と、読み出しだけができる**ROM**がある。RAM は**主記憶装置**と呼ばれ、**揮発性メモリ**である。また、ROM は**補助記憶装置**で**不揮発性メモリ**と呼ばれる。

### 4. ハードディスク

ハードディスクは、ソフトウェアやデータを保存しておく為の、大容量の記憶装置である。ハードディスクには**プラッタ**と呼ばれる磁気ディスクが数枚内蔵されていて、データはこのプラッタに保存される。この章では、細かくハードディスクの構造が記載されている。

### 5. いろいろな記憶装置

この章では、前章のハードディスクに加えて、コンパクトディスク(CD),DVD,ブルーレイディスクなど身近にある記憶装置などの説明がなされている。

### 6. ネットワークインタフェース

この章では、ネットワークの説明がされており、比較的狭い範囲にある機器どうしを繋いだネットワークを**LAN**(_Local Area Network_)という。身近に使っているネットワークに繋げる為のインターフェースの説明がなされている。

### 7. 映像とサウンド

画面表示を決める**ビデオカード**、音を出すため**サウンドカード**などの説明がされていた。

### 8. 入力と出力

これまでの章では、パソコンを構成する主な部品を見てきた。この章では、パソコン本体と接続してデータの入出力を行うための装置や仕組みについて記載されていた。USB,キーボード,マウスなど詳しく説明されていた。

### 9. プリンタ

プリンタとは、パソコンで作成したり、外部からパソコン内に取り込んだりしたデータを印刷する機器である。プリンタには、**インパクト**式プリンタと**ノンインパクト**式プリンタがある。

---

上記に要約したように、現代のパソコンはとても便利で、使い易くなったため特別な知識が必要としない。それらの知識を知らないままでも問題はない。ですが本書は、そんな方々にお勧めでパソコンの基本的な仕組みをイラストを用いて分かりやすく解説しています。
Windows10でminikubeを使う

# 環境
- Windows10 Pro（Homeでもいけるはず）
- VirtualBox

Virtulal BoxとHyper-Vは排他で一方が有効だともう一方は使えなくなるような動きをするので注意

# 手順

## 環境変数を通す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/32d70a45-d307-a222-6b38-f6b97093b9b0.png)

## kubectlコマンドダウンロード

```
mkdir C:\tools\kubectl
Invoke-WebRequest -Uri  https://storage.googleapis.com/kubernetes-release/release/v1.15.0/bin/windows/amd64/kubectl.exe -OutFile kubectl.exe
```

## minikubeコマンドダウンロード

```
mkdir C:\tools\minikube
Invoke-WebRequest -Uri https://storage.googleapis.com/minikube/releases/latest/minikube-windows-amd64.exe -OutFile C:\tools\minikube\minikube.exe
```

## 起動

```
minikube start
```

## クラスタ情報

```
kubectl cluster-info
```

# サンプルアプリケーションのデプロイ

## サンプルのDockerイメージをデプロイ

```
kubectl run hello-minikube --image=gcr.io/google_containers/echoserver:1.4 --port=8080
```

## Dokcerイメージと接続するためのサービスをデプロイ

```
kubectl expose deployment hello-minikube --type=NodePort
```

## Podがデプロイされているか確認

```
kubectl get pod
```

## 接続確認

```
minikube service hello-minikube
```

ブラウザでこのような画面が開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/b8cee1ff-f015-e9cc-d31c-f759a322ffc1.png)