OmniAICreator/Qiita-1.07M huggingface dataset:
BatchNormalizationをモデルに組み込む

色々な話を聞くと効果絶大なBatchNormalizationを使ってみました

とりあえず、[お魚の本](https://www.oreilly.co.jp/books/9784873117584/)　p.187を参考に
「Affine->BatchNormalization->Relu」
の形でモデルを作りたいと思い

```python:
Dense(64, activation='relu')(x)
```

Denseの中からactivationをどうやって出すんだ？
と10分ほど悩んだので掲載します。
わかってみると、こう書くしかないですね・・・


#import

```python:
from keras.layers import Dense, BatchNormalization, Activation
```
#functionalの場合

```python:
x = Dense(64, activation='relu')(x)
```
↓

```python:
x = Dense(64)(x)
x = BatchNormalization()(x)
x = Activation('relu')(x)
```


#Sequentialの場合
```python:
model.add(64, activation='relu')
```
↓

```python:
model.add(Dense(64)
model.add(BatchNormalization())
model.add(Activation('relu'))
```
TypeScript　メモ　3　便利グッズ

色々　メモ

```js

input HTMLInputElement = <HTMLInputElement>
inputに

const samplae: NodeListOf<Element> = app!.querySelectorAll("");
listに

interface HTMLElementEvent<T extends HTMLElement> extends Event {
    path: T;//ジェネリック
}
addEventListener('click', (e: HTMLElementEvent<HTMLInputElement>) => {});
addEventListener時にも

const target = items_arr.filter((item) => { return item; });
便利 mapでも利用はもちろんできる
```
Linuxコマンドを覚える

Linuxコマンドで遊んでみたい
(macOS環使用)

#####cal
- 当月カレンダーがみれる。
- 年月指定可能。

#####ls
- ファイル一覧表示。
- -aで隠しファイル、-lで詳細表示できる

#####pwd
- カレントディレクトリを確認できる。
- print working directory の略だったはず

#####cd
- ディレクトリ移動

#####mkdir
- ディレクトリ作成

#####su
- スーパーユーザー(root)へ変更
- スーパーユーザーのパスワードを要求される
- exit or ユーザ変更するまで有効なので、作業は要注意

#####sudo <コマンド>
- ユーザ変更せずに、スーパユーザとしてコマンド実行
- ログイン中ユーザのパスワードを要求される

#####rm
- ファイル・ディレクトリの削除
- -rでディレクトリ内のファイルも全削除
- 戻せないので作業は要注意

#####cat
- ファイルの中身を表示

#####less
- ファイルの中身を表示
- 画面スクロールできるのがcatとの差異

#####cp
- ファイルコピー

#####chmod
- パーミッション変更

#####chown
- 所有者変更

#####コマンド > ファイル
- リダイレクト
- コマンドの実行結果をファイルへ保存する。
- 例えばログをあとで見たい時などに使える
- エラーメッセージが出た場合は保存されない（標準出力と標準エラー出力が別れているため）。

#####コマンド 2> ファイル
- エラーメッセージだけをリダイレクト

#####１つ目のコマンド | ２つ目のコマンド
- |(パイプライン)でコマンド連結
- １つ目のコマンド実行結果を元に２つ目のコマンドを実行

#####head　ファイル名
- ファイルの先頭部分を表示
- default:10行
- -n 行数　をファイル名の前で指定して変更可

#####tail 
- headの逆。ファイルの末尾部分を表示。他headと同じ

#####
２つのモデルを接続する（keras2.0_functional 編）

VGG16をFine-tuningする際に初めて作られる方も多いと思いますが
出力層の書き方が2種類あったりして分かりづらかったので
対で書きてみました

※Sequentialで出力層を書いたのは[**こちら**](https://qiita.com/tom_speed_ltd/items/bbbcfd2beb5a74dd7b15)から

参考のスクリプトは
VGG16をFine-tuningして5クラス分類するモデルを想定しています

#動作概略
1)出力層なしのVGG16のモデルを読込
2)新しい出力層を作成
3)上記2個のモデルを接続

#動作確認環境
python3.6.6
Tensorflow:1.10.0
Keras：2.2.2

#参考スクリプト
```python:
#import
from keras.models import Model, Sequential
from keras.layers import Activation, Dense, Flatten
from keras.applications.vgg16 import VGG16

#1)出力層なしのVGG16を読込
vgg16_model = VGG16(weights='imagenet',include_top=False, input_tensor=Input(shape=(224,224,3)))

#2)追加する出力層を作成
inputs = vgg16_model.output
x = Flatten()(inputs)
x = Dense(1024,activation='relu')(x)

prediction = Dense(5,activation='softmax')(x)

#3) VGG16と出力層を接続
model=Model(inputs=vgg16_model.input,outputs=prediction)

# モデル表示
model.summary()
```

#★解説

#import

```python:
from keras.models import Model, Sequential
from keras.layers import Activation, Dense, Flatten
from keras.applications.vgg16 import VGG16
```

#1)出力層なしのVGG16を読込
本題ではないので詳細は省略
引数の詳細は[公式](https://keras.io/ja/applications/#_1)を確認してください
モデル名は「**VGG16_model**」（任意設定）とします

```python:
vgg16_model = VGG16(weights='imagenet',include_top=False, input_tensor=Input(shape=(224,224,3)))
```

#2)追加する出力層を作成
vgg16_modelの出力を「**inputs**」（任意設定）に入力します

```python:
inputs = vgg16_model.output
```

全結合層に入れるために平準化します
「**inputs**」に 「**Flatten**」を接続し「**x**」（任意設定）に入れます


```python:
x = Flatten()(inputs)
```

先ほどの「**x**」に1024次元の全結合レイヤーを接続し（活性化関数は'Relu'）
再び「**x**」に入れます

```python:
x = Dense(1024,activation='relu')(x)
```
上記の「**x**」に、5クラス分類の全結合レイヤーを接続し「**prediction**」（任意設定）に入れます

```python:
prediction = Dense(10,activation='softmax')(x)
```
なんとなくこちらの書き方の方がさっぱりしています

#3) VGG16と出力層を接続

これもfunctionalの方がさっぱりとしています

```python:
model=Model(inputs=vgg16_model.input,outputs=prediction)
```

#全部「ｘ」ではいけないのか？
「inputs」とか「prediction」とか使わないとダメなの？と疑問に思ったため
全部「x」で出来るかトライ・・・
結果としては何も問題ありません
（最初と最後をわかりやすくするため？）


```python:
vgg16_model = VGG16(weights='imagenet',include_top=False, input_tensor=Input(shape=(224,224,3)))

x = vgg16_model.output
x = Flatten()(x)
x = Dense(1024,activation='relu')(x)
x = Dense(10,activation='softmax')(x)

model=Model(inputs=vgg16_model.input,outputs=x)
```
gcloudコマンドのアカウントやプロジェクトを切り替える方法

複数のGCPプロジェクトで並行作業していると、うっかり別のプロジェクトに `gcloud app deploy` などしてしまうことがありませんか？私はあります。

事故そのものも悲しいんですが、事故のたびにアカウントとプロジェクトを切り替える方法を毎回ググっていて悲しいので自分用にまとめてみます。

## 状態確認

gcloudコマンドにはデフォルトのアカウントやプロジェクトが設定できます。何か作業する前に現在のデフォルト値を確認しましょう。

```
$ gcloud config list
（略）
[core]
account = ***@***.jp
disable_usage_reporting = True
project = ****
```

`account`と`project`が期待通りの値か確認して、期待と違ったら設定し直す必要があります。

ちなみにデフォルト設定の実体は`$HOME/.config/gcloud/configurations/config_default`以下にあります。[^1]

[^1]: MacとLinuxの場合。

## アカウント切り替え

下記コマンドを打つとブラウザが立ち上がり、アカウント選択画面に遷移します。適宜アカウントを切り替えましょう。

```
$ gcloud auth login
```

## プロジェクトの切り替え

下記コマンドを打つとプロジェクトが切り替わります。

```
$ gcloud config set project [PROJECT_ID]
Updated property [core/project].
```

## 別解：全コマンドでプロジェクトを明示的に指定する

私の知る限り、GCPで使うコマンドはいずれもプロジェクトを指定するオプションがあります。

 - `gcloud` は `--project` オプション
 - `bq` は `--project_id` オプション
 - `gsutil mb` なら `-p` オプション

特にお仕事で使うような場合はオペミス防止のために全コマンドについてプロジェクトを明示的に指定するのが良いでしょう。

## まとめ

これで安心して`gcloud app deploy`できますね。

慣れてくると`gcloud app deploy`のあとエンター2連打して確認をスキップしたくなるんですが、確認は大事ですぞ（確認を怠って消してはいけないものを上書きした人の意見）。

ちなみに上書きしてもWebコンソールからポチポチ操作すると旧バージョンに戻せます。さすがGAE。
Laravel備忘録00－vagrant + VirtualboxでLaravelの環境構築－

# はじめに

自分がLaravelを使いたいと思い、環境構築をしました。
かなりつまづいて時間を浪費したので、わからなかったところも含めて備忘録として残しておきます。

## vagrant,Virtualboxの導入
以下のサイトからインストーラーを入手できるので、手順に従って導入してください。
ググれば参考サイトはたくさん転がってると思います。
[vagrant](https://www.vagrantup.com/)
[Virtualbox](https://www.virtualbox.org/)

## Homesteadの作成~初期設定まで

### vagrantコマンド一覧

|　　コマンド |　　機能　 | 備考　 |
|:-----------------|:------------------|:-------------------|
| vagrant box add \<name, url, or path\> | Box追加 | |
| vagrant box remove <name> | Box削除 | |	
| vagrant box list | Box一覧 ||
| vagrant init [name [url]] | Vagrantの初期化 | Vagrantfileが作成される |
| vagrant ssh | sshログイン | |
| vagrant up | 仮想マシン起動 | |
| vagrant halt | 仮想マシン停止 | |
| vagrant reload | 仮想マシン再起動 | |	
| vagrant destroy | 仮想マシン削除	| |
| vagrant package | パッケージ作成 | 仮想マシンをパッケージングする(Box形式で出力) |
| vagrant plugin install <name> | プラグイン追加 | |
| vagrant plugin list | プラグイン一覧 | |

### vagantのBox一覧確認

```terminal
~$ vagrant box list
==> vagrant: A new version of Vagrant is available: 2.2.2 (installed version: 2.1.4)!
==> vagrant: To upgrade visit: https://www.vagrantup.com/downloads.html

bento/centos-6.8  (virtualbox, 2.3.4)
centos7           (virtualbox, 0)
laravel/homestead (virtualbox, 6.3.0)
```

### Homesteadフォルダへ移動
```terminal
~$ cd Homestead
```

### vagrantを起動
```terminal
Homestead user$ vagrant up
```

### 仮想マシンにログイン

```terminal
Homestead user$ vagrant ssh
Welcome to Ubuntu 18.04.1 LTS (GNU/Linux 4.15.0-32-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

 System information disabled due to load higher than 1.0

 * MicroK8s is Kubernetes in a snap. Made by devs for devs.
   One quick install on a workstation, VM, or appliance.

   - https://bit.ly/microk8s

 * Full K8s GPU support is now available!

   - https://blog.ubuntu.com/2018/12/10/using-gpgpus-with-kubernetes


 * Canonical Livepatch is available for installation.
   - Reduce system reboots and improve kernel security. Activate at:
     https://ubuntu.com/livepatch

0 packages can be updated.
0 updates are security updates.


Last login: Wed Feb  6 08:52:46 2019 from 10.0.2.2
vagrant@homestead:~$ 　-- 仮想環境へログイン完了
```


## Laravelアプリケーションの作成
```terminal:terminal
vagrant@homestead:~code$ composer create-project --prefer-dist laravel/laravel 任意のアプリケーション名
```

## 仮想マシンの起動時エラーTips

ほとんどの場合、Homestead.yamlファイルの書き方が間違っている場合が多い。
記述に間違いがないのに仮想マシンが起動しない場合は以下をチェックします。

### /etc/hostsファイルの変更が反映されていないことを疑う
(実際これは関係ないと思われますが、実行したので一応書いておきます。)

とりあえずここの変更が認識されていないのではないか？と思ったので、以下を実行しました。

#### DNSキャッシュのクリア
ターミナルで

```terminal
$ sudo killall -HUP mDNSResponder
```
を実行してDNSキャッシュをクリアにしてみます。

これでもダメな場合、さらに以下を実行します。

#### Apacheの再起動

ターミナルで

```terminal
$ sudo apachectl restart
```

を実行する。これでApacheが再起動されるはずです。

### Homestead.yamlの変更を反映させる

おそらくこれで問題は解消されました。
まずvagrantを以下のコマンドで終了し、

```terminal
$ vagrant halt
```

以下でHomestead.yamlの変更を反映させます。

```terminal
$ vagrant provision
```

これで```vagrant up```すれば、おそらく仮想マシンを起動できるはずです。
subredditのURLをターミナルから開く

# 刺激を受けました

* [ソフトウェアエンジニアが英語に慣れ親しむためのコンテンツ – It’s okay to be weird – Medium](https://medium.com/its-okay-to-be-weird/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%8C%E8%8B%B1%E8%AA%9E%E3%81%AB%E6%85%A3%E3%82%8C%E8%A6%AA%E3%81%97%E3%82%80%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84-276278dcb5a6)

# でも以下の登録がめんどくさい……

```
賑わっていない、またはそこまで重要でないsubredditは
https://www.reddit.com/r/[subreddit名]/top/?sort=top&t=weekを
ブックマークに追加して毎週チェック。それらのブックマークをまとめたフォルダを作って、一気に全部開けるようにしておくと良い。
```

# とりあえずTerminalから開けるようした

```zsh:~/.zshenv
function reddit()
{
  local subreddit=${1}
  echo -e "https://www.reddit.com/r/${subreddit}/top/?sort=top&t=week\n"
}
```

```zsh:Terminal
# デフォルトブラウザに r/linux の直近1週間ソートを表示
open $(reddit linux)

# 大文字小文字の区別はreddit側でリダイレクトされるっぽい
open $(reddit cloud) #=> r/Cloud へ
```

あとは各自のやりよう次第。
[API](https://www.reddit.com/dev/api)をきちんと使えばもっとうまくできそうではありますが、取り急ぎ。
dinput8.dllに対するエラーの対処　～備忘録～

初めまして！原因不明のdinput8.dllのシステムエラーに陥った者です！
今回は同じエラーに陥った人向けに最速で簡単に修復する方法をご教授します。

OS　Windows10 64bit
User Administrator
（記載する情報はこれで十分かと思います）

#　そもそもdinput8.dllとは？
まず初めに、今回の元凶であるdinput8.dllとは何かをご説明します。

このファイルは拡張子を見ての通り「システムファイル」です。
さらに格納されている場所がc/windows/System32/dinput8.dllという普段は目にしないところにあるため、言うまでもなく**絶対に削除**してはいけないファイルです。

このファイルはDirectX 8で動作し、マルチメディア入力デバイスの機能を提供しています。
（ジョイスティックなど）
さらに、PCが正常に動作するためにも**停止してはいけません。**

このファイルが悪影響を及ぼす可能性はかなり低く、可能性として考えられるのは「トロイの木馬」になることです。

#　今回発生したエラーの内容
今回、発生したエラーはsteamで「R6S」というゲームをプレイしようとした際に、このファイルが原因でプレイできなくなってしまった。
（厳密にはBattle Eyeの監視に引っかかった）

ゲームを何度再インストールしても状況は変化なし。

# 　解決策
万が一dinput8.dllがエラーを起こしてしまっても、**システムファイル**なので**絶対に削除**してはいけない。
さらに、ゲーム自体を再インストールしても状況は変わらなかった。

そこでいろいろと調べてみても全くと言っていいほど何もヒットしなかった。
ここでシステムファイルを勝手に変更すると**「リカバリー」すら出来なくなってしまう**可能性もあります。
※リカバリーディスクや領域がある端末では、内部情報に依存せずリカバリーが可能です。

詳しい知識の無い方なら以下の方法を実行してみてください。
１　「設定画面」をクリック
２　「更新とセキュリティー」をクリック
３　「回復」をクリック
４　「このPCを初期状態に戻す」をクリック
この時、個人ファイルを残すかは各自で決めてもらって大丈夫です。

#　「個人ファイルを残す」を選んで失敗した場合
私はリカバリーする時に個人ファイルを残していました。
しかし、初期化される前に謎のエラーで失敗しました。
万が一、個人ファイルを残す状態で失敗をした場合は**「個人ファイルを削除」**してください。

#　最後に
私の場合はこの作業でwindowsにログインすることができました。
しかし、windowsのアカウントやCドライブに格納されているファイルはすべて削除されてしまいましたが、**ゲームはsteamアカウントで管理されているので削除されることはありません。**

また、今回のようなエラーに直面していない方もできる限り**オンラインストレージ**にデータをバックアップしておくことを推奨します。
もし、エラーに直面した時でも**安全**にリカバリーを実行することができると思います！

以上が誰でもできる、dinput8.dll問題を解決する方法の紹介でした！
（ただのリカバリーで申し訳ありません！）

引用・参考先　http://www.processlibrary.com/en/directory/files/dinput8/21771/
GKE(google kubernetes engine)の スペック変更方法

- gcloud インストール 
- gcloud コマンド環境設定
- kubernetes スペック変更
  - クラスタ数 変更
  - CPU,メモリ変更

### gcloud インストール

```bash
$ curl https://sdk.cloud.google.com | bash
```

インストール中の質問は全てエンターキーで問題ありません。


### gcloudコマンド環境設定

- アカウントログイン

```bash
$ gcloud auth login
$ gcloud auth application-default login
```

- 現状のgcloud 設定確認

```bash
$ gcloud config list
```

- 基本プロジェクトの設定

```bash
$ gcloud config set project (自分のプロジェクトID)
$ gcloud 
```

- リージョンとゾーンの設定  
  (日本はasia-east1を選択がいいと思います。)

``` bash
$ gcloud config set compute/zone asia-east1
```

- 再度のgcloud 設定確認

```bash
$ gcloud config list
```

【アカウント設定の参考URL】
https://cloud.google.com/kubernetes-engine/docs/tutorials/migrating-node-pool?hl=ja

### Kubernetes スペック変更
#### クラスタ数 変更

```bash
$ gcloud container clusters resize (クラスタ名) --size (半角数字)
```

例：(この例だった場合のコマンド)
クラスタ名 : test-cluster
クラスタサイズ :  5

```bash
$ gcloud container clusters resize test-cluster --size 5
```

【kubernetesのクラスタ変更参考URL】
https://cloud.google.com/kubernetes-engine/docs/resize-cluster?hl=ja

#### CPU,メモリの増減（インスタンスの変更）

CPU設定

- 2.6 GHz Intel Xeon E5（Sandy Bridge）
- 2.5 GHz Intel Xeon E5 v2（Ivy Bridge）
- 2.3 GHz Intel Xeon E5 v3（Haswell）
- 2.2 GHz Intel Xeon E5 v4（Broadwell）
- 2.0 GHz Intel Xeon（Skylake）


```bash
gcloud container node-pools create n1s8-pool --cluster $CLUSTER_NAME --machine-type=n1-standard-8 --num-nodes=2 --enable-autoscaling --min-nodes=2 --max-nodes=10
```



最小VMの設定

```bash
gcloud compute instances create example-instance --zone europe-west1-b --min-cpu-platform "Intel Haswell"
```
ESXi上のArchLinuxにUSBでRTL8812AUのドングルを接続してhostapdで5GHzなAP

ESXiでminiPCIe接続のAtherosチップのWiFiモジュールをパススルーしてAPを立てようとしていたのだが、どうも電波を出してくれなくてお手上げなのでUSBに変更。

USBで5GHzなAPの稼働実績をネットで探して、RTL8812AUチップのUSBドングルを購入。下記の手順でセットアップを行った。

# 環境

<pre>
$ uname -a
Linux ap 4.18.6-arch1-1-ARCH #1 SMP PREEMPT Wed Sep 5 11:54:09 UTC 2018 x86_64 GNU/Linux
</pre>

# RTL8812AUドライバのインストール

いろいろフォークとかあってどれがいいのかわからない...

とりあえずうまくいったのは下記
[GitHub - aircrack-ng/rtl8812au: RTL8812AU/21AU and RTL8814AU driver with monitor mode and frame injection](https://github.com/aircrack-ng/rtl8812au)

<pre>
# git clone https://github.com/aircrack-ng/rtl8812au.git
# cd rtl8812au
# make
# make install
# reboot
</pre>

# NICをUPして動作確認

<pre>
# ip link set wls33u1 up
# iw list
  (ここでチップのスペックが列挙されればOK)
</pre>

# hostapd のインストール

<pre>
# pacman -S hostapd
</pre>

# hostapd の設定

<pre>
# nano /etc/hostapd/hostapd.conf
</pre>

<pre>
interface=wls33u1
bridge=br0
driver=nl80211
ssid=AP
auth_algs=1
wpa=2
wpa_passphrase=******
wpa_key_mgmt=WPA-PSK
rsn_pairwise=TKIP CCMP
hw_mode=a
channel=36

logger_syslog=-1
logger_syslog_level=3

# DFS
country_code=JP
ieee80211d=1
ieee80211h=1

# 802.11n
ieee80211n=1
ht_capab=[HT20][HT40+][SHORT-GI-20][SHORT-GI-40][GF][DSSS_CCK-40]

# 802.11ac
ieee80211ac=1
vht_oper_chwidth=1
vht_capab=[MAX-MPDU-11454][SHORT-GI-80][TX-STBC-2BY1][RX-STBC-1][SU-BEAMFORMEE][MU-BEAMFORMEE][HTC-VHT][MAX-A-MPDU-LEN-EXP7]
vht_oper_centr_freq_seg0_idx=42

# WMM
wmm_enabled=1
uapsd_advertisement_enabled=1
wmm_ac_bk_cwmin=4
wmm_ac_bk_cwmax=10
wmm_ac_bk_aifs=7
wmm_ac_bk_txop_limit=0
wmm_ac_bk_acm=0
wmm_ac_be_aifs=3
wmm_ac_be_cwmin=4
wmm_ac_be_cwmax=10
wmm_ac_be_txop_limit=0
wmm_ac_be_acm=0
wmm_ac_vi_aifs=2
wmm_ac_vi_cwmin=3
wmm_ac_vi_cwmax=4
wmm_ac_vi_txop_limit=94
wmm_ac_vi_acm=0
wmm_ac_vi_aifs=2
wmm_ac_vi_cwmin=3
wmm_ac_vi_cwmax=4
wmm_ac_vi_txop_limit=94
wmm_ac_vi_acm=0
wmm_ac_vo_aifs=2
wmm_ac_vo_cwmin=2
wmm_ac_vo_cwmax=3
wmm_ac_vo_txop_limit=47
wmm_ac_vo_acm=0

# TX queue parameters
tx_queue_data3_aifs=7
tx_queue_data3_cwmin=15
tx_queue_data3_cwmax=1023
tx_queue_data3_burst=0
tx_queue_data2_aifs=3
tx_queue_data2_cwmin=15
tx_queue_data2_cwmax=63
tx_queue_data2_burst=0
tx_queue_data1_aifs=1
tx_queue_data1_cwmin=7
tx_queue_data1_cwmax=15
tx_queue_data1_burst=3.0
tx_queue_data0_aifs=1
tx_queue_data0_cwmin=3
tx_queue_data0_cwmax=7
tx_queue_data0_burst=1.5
</pre>

Bridgeの設定は適当に

# hostapd の起動

<pre>
# hostapd /etc/hostapd/hostapd.conf
</pre>

これで80MHzの帯域でAPができた!
R MarkdownからPowerPoint プレゼンを直接作成する

R Notebooksで分析し作成した図表をプレゼンするのは頭痛の種でした。Rから画像を出力しPowerPointにコピペするか、ioslides_presentationなどにするかしかありませんでした。前者はデータや計算手法が変わるたびにコピペしなおす必要があります。一方、ioslides_presentationは機能が不十分ですし、ルックがPowerPointと異なるので悪目立ちします。

なんと、RStudioでは次期バージョン1.2からPowerPointをknitできる機能が付きます。現行の1.1でもひと工夫すればその機能を先取りできるので紹介します。

## Pandoc 最新版をインストール
https://pandoc.org/

## R Markdown文書のYAMLに下記を記述

```
title: "hoge"
output: powerpoint_presentation
```

## コンソールかR scriptで下記を実行

```
setwd("C:/Users/your/working/directory")
rmarkdown::render("yourRMD.Rmd", output_format = "powerpoint_presentation")
```

これだけです。
R presentationでは面倒だった2列レイアウトのスライドも簡単にできそうです。詳しくはR Markdown: The Definitive Guideの[ここ](https://bookdown.org/yihui/rmarkdown/powerpoint-presentation.html)に載っています。

1. PowerPoint固有の機能（SmartArtなど）を使ったスライドをPowerPointで作成
2. プログラマティックに作った図表のスライドやテキスト主体のスライドはR Markdownからpptxをknit
3. 1と2をPowerPoint上で結合し手直し

というワークフローでプレゼン準備が効率的になります。ぜひお試しください。
Jetson TX1をキャリアボードに乗せてみた

# 環境
- Jetson TX1
- Orbitty Carrier for NVIDIA® JetsonTM TX2/TX2i/TX1
- JetPack 3.3
- CTI-L4T-V020.tgz

# 参考文献
- [kdb350: CTI-L4T NVIDIA® Jetson™ TX2/TX1 Board Support Package Release Notes](http://connecttech.com/resource-center/cti-l4t-nvidia-jetson-board-support-package-release-notes/)

# 購入
下記サイトから購入しました。他にもいくつか候補がありましたが、インタフェース、価格、実施例等からconnecttech.comの製品を選択しました。本体\$174、送料(手数料込み)\$136.84(高い‼︎)でした。
2、3日で届きます。

[Orbitty Carrier for NVIDIA® Jetson™ TX2/TX2i/TX1](http://connecttech.com/product/orbitty-carrier-for-nvidia-jetson-tx2-tx1/)

![carrier_board.jpg](https://qiita-image-store.s3.amazonaws.com/0/109483/bb8372d0-3820-4681-022c-93298f6f922c.jpeg)

# セットアップ
## Jetson TX1の取り外し
6角形のトルクスドライバーが必要です。ネジを４ヶ所外せば簡単にボードを抜けます。

![setup.jpg](https://qiita-image-store.s3.amazonaws.com/0/109483/38bfd3bb-b0ba-c717-c34d-099fa40a643a.jpeg)

## 接続
以降はユーザーズガイドを見て進めます。

[Users Guide](http://www.connecttech.com/pdf/CTIM-ASG003_Manual.pdf)

## 電源

9V-12Vの電源が必要になります。モバイル化を想定しているため、下記の昇圧ケーブルと、3A出力可能なUSB電源を使用しています。

- iNepo-USBブースターモジュールUSBケーブル
- Raspberry Pi用電源セット(5V 3.0A)

# BSPのインストール
予めJetPack 3.3 と CTIのBSP(CTI-L4T-V020.tgz)をホストPCにダウンロードしておきます。

- [Jetson Download Center](https://developer.nvidia.com/embedded/downloads#?search=jetpack%203.3)
- [Board Support Packages](http://connecttech.com/support/resource-center/nvidia-jetson-tx2-tx1-product-support/)

下記のコマンドで起動後、[JetsonTX2初期セットアップ(Jetpack)からサンプルのコンパイルまでの手順](https://qiita.com/akrian/items/54c321bfa95d8eaef17d)等を参考に、Host PCへのインストールを進めます。

```
$ ./JetPack-L4T-3.3-linux-x64_b39.run
```
Network Layout まで終わったら一度インストーラーを終了してCTIのパッチをあて、Jetson TXのFlash (OS Image)を更新します。

```
$ cp CTI-L4T-V020.tgz <install_dir>/64_TX1/Linux_for_Tegra/
$ cd <install_dir>/64_TX1/Linux_for_Tegra/
$ tar zxf CTI-L4T-V020.tgz
$ cd CTI-L4T
$ sudo ./install.sh
$ cd ..
$ sudo ./cti-flash.sh
...
1. Astro
2. Elroy
3. Orbitty
4. Spacely
5. Sprocket
6. Rudi
7. Cogswell
x. Exit
Enter choice:  3 (Enter)
```
その後、再起動してログインする。次のステップのために、ifconfig等でIPアドレスを調べておきます。

### Components (CUDA/cuDNN等)のインストール
再び、下記のコマンドでJetPackのインストーラーを起動します。

```
$ ./JetPack-L4T-3.3-linux-x64_b39.run
```
先ほどと同じ手順で進み、
1. JetPack 3.3 Components Managerで Flash OS Image to Targetを"no action"に変更してNext。
2. Device Informationで、以下の情報を入力してNext。

```
Device IP Address: 先ほど確認したIPアドレス
User Name: nvidia
Password: nvidia
```

後は、一般的な手順に従えば完了します。
OAuth2認証のアクセストークンとかリフレッシュトークンが何なのかを書いておこうぜ☆（＾～＾）

# 適当にだらだら書く。

クライアントマシン　と　サーバーマシン　があるとする。

クライアントマシンとして　やることは、

- ログイン
- APIの利用
- 認証の期限の延長

の３つがある。

# ユーザー認証しよう

OAuth2 の仕組みでは、だいたい２つの URL を教えられていると思う。

1. ```/authentication```
2. ```/token```

とか。つづりは違うかもしれない。この２つは何なのか。それは

1. ログイン
2. トークンの発行

の違いだぜ。

# ログインとは

- ユーザー名
- パスワード

を入力する画面のことだぜ。これが ```/authentication``` ページの仕事だぜ。
ログインに成功すると、 ```/token``` ページに飛ばされると思う。

# /token ページって何なのか？

サーバーが、

- アクセストークン
- リフレッシュトークン

の２つをクライアントマシンに送るページだぜ。トークンとは、単なる長い文字列なので、クライアントマシンのファイルに２つとも保存しておけだぜ。

クライアントマシンから　サーバーマシンに　アクセスして APIを叩こうとするたびに、アクセストークンが必要になる。
クライアントマシンに保存してあるファイルから　アクセストークンを読み込んで使えばいいだろう。
このアクセストークンには有効期限があって、例えば　１時間で　有効期限が切れてしまったりする。

じゃあ、有効期限を延ばすにはどうすればいいのか。それは　サーバーから

- 新しいアクセストークン
- 新しいリフレッシュトークン

のペアを再送してもらうことだぜ。どうやったらできるのか？

```/token``` ページに向けて、アクセストークンと リフレッシュトークン を送信しろだぜ。
どっちも　クライアントマシンのファイルに保存してあるだろ。読み込めだぜ。
すると、
```/token``` ページは　新しいアクセストークンと　新しいリフレッシュトークンを送り返してくる。
クライアントマシンのファイルに　両方とも保存しろだぜ。
つまり、
ログインしなおしたのと　同じ流れ　に乗れるので、プログラムの追加は無いはずだぜ。

１回使ったリフレッシュトークンや、新しいアクセストークンを発行したあとの古いアクセストークンは使えなくなるので、
捨ててしまえだぜ。
だから

- アクセストークン
- リフレッシュトークン

を保存するファイルも１個でいい。上書き保存で行ける。

理屈としては、アクセストークンは毎回必要だから　盗聴されやすい。だから１時間で有効期限を切る。
リフレッシュトークンは　ログイン時と、トークンの更新時の２回しか　通信上で流れないので　盗聴されるリスクが軽減、
というだけだぜ。

で、リフレッシュトークンを送信するタイミングだが、アクセストークンの有効期限が切れたあとでもいいし、
切れる５分前に送ってもいいし、さっさと　送ってもいい。
ただし　１分毎に送っているようでは　通信上に余り流れないというメリットがなくなるので　そんなことはしない。
初心者でもできる!!!pythonで覚える!!!!!!アルゴリズム!!!!!!!!part3!!!!!!!!!(最大値)

#最大値を求めるアルゴリズム

#1: 配列にデータを格納する

##(配列のイメージは箱の中にいくつもにデータが入っていて、指定したデータを取り出すことができる)

##2:最大値の変数を定義し、配列の最初の値を仮の最大値として格納

#(変数も同じく箱をイメージ。しかし、データは1つしか入らない。配列の最初の値は 配列名[0]で記述)

##3:配列の2つ目から最後まで繰り返す。


##4:if文を使い、もし最大値よりも値が大きければとういう条件式を定義
(if文はもし~ならば~を行う条件式を定義し、その条件を満たせば次の処理が実行される。)
#5: 最大値を上書き
##最大値を定義している変数に上書きする
#6:最大値が得られる

今回の場合:9

サンプルコード

```python:mx.py
a = [1,3,6,9,1,3]
#配列にデータを格納する

max = a[0]
#最大値の変数を定義し、配列の最初の値を仮の最大値として格納

for i in range(1,len(a)):
#配列の2つ目から最後まで繰り返す。

    if max < a[i]:
    #if文を使い、もし最大値よりも値が大きければとういう条件式を定義
        max = a[i]
        #最大値を上書き

print(max)
    #最大値が得られる

```

実行結果:

<img width="547" alt="スクリーンショット 2018-09-09 21.07.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/286808/59777ebd-2b8c-e270-c29e-6676360d8426.png">
flutterでTextFieldのカーソル位置がおかしくなる問題の対処法


* 問題がおこったFlutterのバージョン v0.5.1

![flutter.gif](https://qiita-image-store.s3.amazonaws.com/0/94929/98367ebd-4c06-2936-c37a-347c365dacf7.gif)

Flutterでアプリを作っていると何かおかしいことに気づいた。
上記の画像のとおり`TextField`で改行させたとき、カーソルが次の行に移動しない。

Githubにissueが上がっていて問題は認識されているみたいです。

https://github.com/flutter/flutter/issues/15572

flutterSDKのバージョンを上げれば直るようです。
新しいバージョンを受け取るにはflutterのチャンネルを切り替える必要があります。

```sh
$ flutter channel dev
```

これでバージョンが上がります。
2018/09/09現在では`0.7.2`になりました。

実行してみると改行しても正しくカーソルが移動するようになりました。
よかった。
Vagrant Ubuntu18.04(ubuntu/bionic64)  へ docker-ce、docker-compose をインストール

# これは何？
- Vagrant の Ubuntu18.04(ubuntu/bionic64) へ、docker、docker-compose をインストールした際のメモです。

# 参考URL

Get Docker CE for Ubuntu | Docker Documentation
https://docs.docker.com/install/linux/docker-ce/ubuntu/

Install Docker Compose | Docker Documentation
https://docs.docker.com/compose/install/

# インストール実行

- `vagrant ssh` でログインし、以下をコピー＆ペーストで実行

```sh
(
  set -x
  set -e

  sudo apt -y install curl

  # *** docker install ***
  
  # 公式の開発環境用の簡単インストールスクリプトを使用
  # see https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-using-the-convenience-script
  curl -fsSL https://get.docker.com -o get-docker.sh
  sudo sh get-docker.sh

  # カレントユーザをdockerグループの所属とする（sudoつけなくてもdockerコマンドが動くようにする）
  sudo usermod -aG docker $USER
  
  # バージョン確認
  docker --version
  sudo docker version
  
  # *** docker-compose install ***
  sudo curl -L \
    https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) \
    -o /usr/local/bin/docker-compose
  sudo chmod +x /usr/local/bin/docker-compose
  
  # バージョン確認
  docker-compose --version
  
) 2>&1 | tee $(date '+%Y%m%d-%H%M%S')_docker_install.log
```

# 動作確認

- (先に設定したグループを有効にする為) 一旦ログアウトして、`vagrant ssh` で再ログインして、以下実行


```sh
# Docker バージョン確認
vagrant@ubuntu-bionic:~$ docker --version
Docker version 18.06.1-ce, build e68fc7a
vagrant@ubuntu-bionic:~$

# 試しに公式の hello-world コンテナ実行
vagrant@ubuntu-bionic:~$ docker container run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
d1725b59e92d: Pull complete
Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Status: Downloaded newer image for hello-world:latest

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

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

vagrant@ubuntu-bionic:~$
```

# メモ

- Ubuntu(linux kernel 4 以上)は、ストレージドライバのデフォルトは、overlay2
Raspberry Piの初期設定

## はじめに
Raspberry Piの初期設定で特によくおこなうものをメモする。なお、OSはRaspbian Stretch Liteを、バージョンは現時点で最新のものを使用する:

```bash
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 9.4 (stretch)
Release:	9.4
Codename:	stretch
$ uname -a
Linux raspberrypi 4.14.68-v7+ #1140 SMP Wed Sep 5 17:17:58 BST 2018 armv7l GNU/Linux
```

## パッケージリストとパッケージの更新
```bash
$ sudo apt-get update
$ sudo apt-get upgrade
```
## OSの更新
```bash
$ sudo apt-get dist-upgrade
```

## ファームウェアの更新
```bash
$ sudo apt-get install rpi-update
$ sudo rpi-update
$ sudo reboot
```

## raspi-configの更新
```bash
$ sudo raspi-config
```
"8 Update" を選択する。

## パスワードの更新
```bash
$ sudo raspi-config
```
"1 Change User Password" からおこなう。

## ファイアウォールの設定
```bash
$ sudo apt-get install ufw  # ufwのインストール
$ sudo ufw allow 22  # ポートの開放
$ sudo ufw default deny  # 許可されたポート以外を閉じる
$ sudo ufw enable  # ufwの有効化
$ sudo ufw status  # ファイアウォールの設定を確認
Status: active

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere
22 (v6)                    ALLOW       Anywhere (v6)
```

## sshの設定
```bash
$ sudo raspi-config
```

"5 Interfacing Options" -> "P2 SSH" -> "Would you like the SSH server to be enabled?" -> "Yes" によりsshが有効化される。

sshの設定ファイルは`/etc/ssh/sshd_config`にある。

```
Port 22  # ポートの設定
PermitRootLogin no  # rootログインの禁止
PasswordAuthentication no  # パスワード認証の禁止
```
などを適宜設定する。

## ロケールの変更
```bash
$ sudo raspi-config
```
"4 Localisation Options" -> "I1 Change Locale" からおこなう。

## タイムゾーンの変更
```bash
$ sudo raspi-config
```
"4 Localisation Options" -> "I2 Change Timezone" からおこなう。

## ファイルシステムの拡張
```bash
$ sudo raspi-config
```
"7 Advanced Options" -> "A1 Expand Filesystem" からおこなう。

## IPアドレスの固定
```bash
$ ifconfig  # 現在のIPアドレスを確認する
$ sudo vim /etc/dhcpcd.conf  # 上で確認したIPアドレスに固定する
$ tail -n 4 /etc/dhcpcd.conf  # たとえば、下の4行のように末尾に記入する
interface eth0
static ip_address=192.168.1.19/24  固定したいIPアドレス
static routers=192.168.1.1  # デフォルトゲートウェイ
static domain_name_servers=192.168.1.1  # DNSサーバ
```
Nimの入力いろいろ 競技プログラミング用

主にAtCoderでよく使う入力をまとめてみました。
'18/9現在AtCoderでサポートされているのはNim0.13.0なので、文法はそれを前提にします。
(見にくくてすまない)


注意事項 :
・紹介しているものはstring,int,float,seq型の入力を受け付けるコードのみです。
・動作確認はテキトーにしかやってません。
・float型の場合、数値の誤差は勝手に丸めています。そのため実際の値と異なる場合があります。

例 :

```Nim
# 型
### 入力
var X = 本文
# X = 値
```
___

### 空白なし - 1行
```Nim
# string
##  Tlllune
var X = readline(stdin)
# X = "Tlllune"

# int
##  1192296
import strutils
var X = parseInt(readline(stdin))
# X = 1192296

# float
##  81
import strutils
var X = parseFloat(readline(stdin))
# X = 81.0

```
___
### 空白でsplit - 1行
```Nim
# seq[string]
##  Julia Python ....
import strutils
var X = split(readline(stdin))
# X = @["Julia","Python",...]

# seq[int]
## 11 23 ...
import sequtils, strutils
var X = map(split(readline(stdin)),parseInt)
# X = @[11,23,...]

# seq[float]
## 11.4 51.4 ...
import sequtils,strutils
var X = map(split(readline(stdin)),parseFloat)
# X = @[11.4,51.4,...]
```
___
### 空白なし - 複数行
行数は 3 とします。
行数を変える場合は、`mapIt(0..<(number),---)`の`(number)`に整数で行数を入れてください。

```Nim
# seq[string]
## Nim
## AtCoder
## Chokudai
import sequtils
var X = mapIt(0..<3,readline(stdin))
# X = @["Nim","AtCoder","Chokudai"]

# seq[int]
## 49106
## 889
## 724106
import sequtils,strutils
var X = mapIt(0..<3,parseInt(readline(stdin)))
# X = @[49106,889,724106]

# seq[float]
## 3.1415
## 2.7183
## 23.141
import sequtils,strutils
var X = mapIt(0..<3,parseFloat(readline(stdin)))
# X = @[3.1415,2.7183,23.141]
```
___
そろそろパターンが見えてきたと思います。最後に
### 空白でsplit - 複数行
空白なし複数行と同じ3行です。

```Nim
# seq[seq[string]]
## Microsoft Windows ...
## BellLab Unix ...
## Apple Orange ...
import sequtils,strutils
var X = mapIt(0..<3,split(readline(stdin)))
# X = @[ @["Microsoft","Windows",...], @["BellLab","Unix",...], @["Apple","Orange",...]]

# seq[seq[int]]
## 1998 11 27 ...
## 2000 3 4 ...
## 2001 1 31 ...
import sequtils,strutils
var X = mapIt(0..<3,map(split(readline(stdin)),parseInt))
# X = @[ @[1998,11,27...], @[2000,3,4...], @[2001,1,31...]]

# seq[seq[float]]
## 1.008 4.003 ...
## 6.941 9.012 ...
## 10.81 12.01 ...
import sequtils,strutils
var X = mapIt(0..<3,map(split(readline(stdin)),parseFloat))
# X = @[ @[1.008,4.003,...], @[6.941,9.102,...], @[10.81,12.01,...]]
```
___

以上。
とりあえず、いかなる状況においても

```Nim
import sequtils,strutils
```

を忘れないようにしましょう。
___

最後にまとめておきます。
コピペして準備用( 補完、メモなど )にご利用ください。

```Nim
#[
STRING
readline(stdin)
split(readline(stdin))
mapIt(0..<3,readline(stdin))
mapIt(0..<3,split(readline(stdin)))

INT
parseInt(readline(stdin))
map(split(readline(stdin)),parseInt)
mapIt(0..<3,parseInt(readline(stdin)))
mapIt(0..<3,map(split(readline(stdin)),parseInt))

FLOAT
parseFloat(readline(stdin))
map(split(readline(stdin)),parseFloat)
mapIt(0..<3,parseFloat(readline(stdin)))
mapIt(0..<3,map(split(readline(stdin)),parseFloat))
]#

```
TypeScript　メモ　2

tsconfig.json

```js
{
  "compileOnSave": false,
  "compilerOptions": {
    "target": "es5",
    "module": "es2015",
    "jsx": "react",
    "moduleResolution": "node",
    "allowSyntheticDefaultImports": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "removeComments": false,
    "preserveConstEnums": true,
    "sourceMap": true,
    "skipLibCheck": true,
    "baseUrl": ".",
    "lib": ["dom", "es2018"]
  }
}

{
  "compilerOptions": {
    "module": "commonjs",
    "moduleResolution": "node",
    "outDir": "dist/js",
    "rootDir": "src/ts",
    "target": "es5",
    "sourceMap": true,
    "types" : ["node"]
  },
  "exclude": [
    "dist",
    "node_modules"
  ]
}

```
どっちがいいのかなWWW

webpack.config.js

```js
const path = require("path");

module.exports = {
  context: path.resolve(__dirname, "./"),
  entry: {
    app: "./src/react/app.tsx" //ここを増やす
  },
  target: "node",
  output: {
    path: path.resolve(__dirname, "./"),
    filename: "./dist/public/react/app.js"
  },
  devtool: "source-map",

  resolve: {
    extensions: [".ts", ".tsx", ".js", ".json"]
  },

  module: {
    rules: [
      { test: /\.tsx?$/, loader: "ts-loader" },
      { enforce: "pre", test: /\.js$/, loader: "source-map-loader" }
    ]
  }
};

```

とりあえずはこの感じで治ったとゆう感じです。

まだまだいい方法がありそうな気がしますので、模索します。
Ruby split メソッド

初投稿です。

最初はメモ書き程度に載せていきます、プログラミング学校で勉強をしながら、yukicoderで問題を解いてます、本当に分からない事だらけで、星１の問題を解くのにも２日間ぐらいかかったりします、僕と一緒の様に勉強をしていて一緒の様な事でいきずまっている方達の少しでも力になればなって思いメモ書き程度に投稿させてもらいます！まだまだ自分も間違っている事とかもあるかもしれませんが、その時はなにとぞご教授の程お願い致します。

それでは、
```
gets.chomp
```
で入力する時に
```
1 40
```
とスペースを空けて入力がしたかった、
そんな時に**splitメソッド**を使ったら良いよって教えて貰い試行錯誤の末にこの書き方ができました！
splitメソッドは、文字列を分割して配列する為のメソッド、1 40と入力をした時には、
```
["1","40"]
```
となる。(" ")の""はスペースを空ける、そして文字列になってしまうから、mapメソッドを使い数値に変換、
1 40は配列なんで、取り出す時はインデックス番号で取り出す。


初めての投稿なもんで、とても分かりにくいと思いますけど、すいません:persevere:
文にして書くと難しいな。。。
文章能力も上達したい！



```ruby
a = gets.chomp.split(" ").map{|x| x .to_i}
(a[0]..a[1]).each do |k|
```
TypeScript　メモ

普段使いをし始めて半年。
かなりわかりやすいと思っていまいます。
reactを使用しますので、Typescript　Reactな開発に使います。
それ以外にも、基本はTypeScriptを使用します。

React

```js
import * as React from 'react';
import { View } from './view';

// Propsの型定義
interface IProps {
    name: string;
}

interface IState {
    count: number;
}

export class Profile extends React.Component<IProps, IState> {
    constructor(props) {
        super(props);
        this.state = {
            count: 0,
        };
    }

    handleClick() {
        const text_element = document.getElementsByClassName("modal")[0];
        if (text_element.className === "modal on") {
            text_element.classList.remove("on");
        } else {
            text_element.classList.add("on");
        }
    }

    render() {

        return (
            <div>
                <h2>{this.props.name}</h2>
                <div className="text">
                    <p onClick={this.handleClick.bind(this)}>texttexttexttext</p>
                </div>
                <div className="textsub"></div>
                <View />
            </div>
        );
    }
}
```

書き方に差があまりないので、実践で使いやすいかと思います。
AIのクリエイティブ事例

「AIが〇〇を作れるようになりました」等のニュースを目にするたび、とてもワクワクする。

AIは、今どのようなクリエイティブができ、
今後どのようなクリエイティブを生み出していくのか。

取り急ぎ、現状までに見聞きした「AIのクリエイティブ事例」を、ザックリまとめておきたい。

#▼ グラフィック分野

##[ロゴ作成｜Brandmark](https://brandmark.io/)

数ステップでロゴを作ってくれる。

今までにもロゴ作成サービスはあったが、「ジャンルは何？」「好きなアイコンはどんなの？」「好きなテイストは？」など、選ばなくてはならないこと、入力しなくてはならないものが多く、結局かなり面倒だった。

このサービスのポイントは「選ばなくてはならない項目」の少なさ（手軽さ）に対し、提案されるデザインが的確、かつクオリティが高いということ。

##[自動着色｜PaintsChainer](https://paintschainer.preferred.tech/)

アップしたイラストが自動着色される。
不思議な、味のある塗り方をしてくれる。

##[キャラクター生成｜MakeGirlsMoe](https://make.girls.moe/)

二次元キャラクターが生成される。
たまに崩れた仕上がりのものが出てきてビビる。

ちゃんと動作しない時は、WebGLをOFFにすると、うまくいくかも。

##[アイドル生成｜データグリッド](https://datagrid.co.jp/creative-ai.html)

架空のアイドルを生成。
デモなどを体験することはできない。


##[自動ドローイング｜AutoDraw](https://www.autodraw.com/)

イラストの自動ドロー、というよりは、何を手書きしているのか予測して、予測結果に予め用意してあるイラストを当てはめている、という感じ。

##[画像生成｜Ostagram](https://www.ostagram.me/)

2枚の画像を融合させる。

たまにグロテスクなものもあるが、個人的にはかなり好きな仕上がりの作品が多い。
アートとして普通に需要がありそう。

##[画像生成｜Deep Dream （閲覧注意）](https://deepdreamgenerator.com)
「Googleの悪夢」と言われた、画像処理エンジン。
生み出す画像の多くは、**かなりグロテスク。**

集合体恐怖症の方などは、**絶対に見ない方が良い。**

#▼ Webデザイン分野

##[Webページ生成｜Sketch2Code](https://sketch2code.azurewebsites.net/)

手書きラフから、Webページがデザインされ、HTMLが生成される。

##[バナー生成｜ADVANCED CREATIVE CENTER](http://advancedcreativecenter.com/)

ただ自動でバナーを作るのではなく、マーケティング分析から「効果の高いバナー」を生成する。

#▼ サウンド分野

##[作曲｜deepjazz](https://deepjazz.io/)

AIが作曲したJazz
普通に良い曲が多い。
しかし、確かにトリッキーで不規則性がある。

##[作曲｜AmperMusic](https://www.ampermusic.com/)

体験するにはアカウント登録をしないとならない。
「Break Free」というアルバムまでリリースしている。

##[歌声生成｜りんな](https://www.rinna.jp/)

「自動で生成された歌声」を公開した。
作詞作曲をしたわけではなく、「歌声の生成」に成功したとのこと。

#▼ ムービー分野

##[自動動画生成｜VIDEO BRAIN](https://open8.com/news/1177/)

素材入稿から3分ほどで動画を自動制作。
デモなどを体験することはできない。

企業がWebサイトに載せる、サービス紹介動画などにおいて需要がありそう。
text/templateを用いた際の文字列の色付け

https://github.com/x-color/tdl を作成時に`text/template`を用いてターミナル上に出力する際に、色付けしようとして詰まったので、その解決策のメモを残す。

# 何がしたかったのか

`text/template`を用いた際に、文字列に色を付けてターミナル上に出力したい。

![colored text image](https://qiita-image-store.s3.amazonaws.com/0/279498/cc4ca0cd-c5e9-8393-0863-a0911e59a4eb.png)


# 改善前

色付けするカラーコードを追加し`text/template`を用いてターミナル上に出力するコード。

```go:template.go
package main

import (
	"os"
	"text/template"
)

func main() {
    temp := `\x1b[1m\x1b[32mColored\x1b[0m`
	t := template.Must(template.New("colored text").Parse(temp))
	t.Execute(os.Stdout, nil)
}
```

このコードは実行すると

![non colored text image](https://qiita-image-store.s3.amazonaws.com/0/279498/fa7aa80a-9ed5-e33b-c3df-a392b2847741.png)

のようになり色付けされない。

# 改善後

変更点は、色付けしたい文字列とカラーコードをまとめて`{{""}}`で囲って出力した点。

```go:template.go
package main

import (
	"os"
	"text/template"
)

func main() {
	temp := `{{"\x1b[1m\x1b[32mColored\x1b[0m"}}` // ここを修正した
	t := template.Must(template.New("colored text").Parse(temp))
	t.Execute(os.Stdout, nil)
}
```

このコードは実行すると

![colored text image](https://qiita-image-store.s3.amazonaws.com/0/279498/cc4ca0cd-c5e9-8393-0863-a0911e59a4eb.png)

のようになりしっかりと色付けされる。

# おまけ

`text/template`を用いて`{{`, `}}`を出力したい場合も`{{""}}`で囲うことで出力することができる。

参考 https://stackoverflow.com/questions/17641887/how-do-i-escape-and-delimiters-in-go-templates
２つのモデルを接続する（keras2.0_Sequential編）

VGG16をFine-tuningする際に初めて作られる方も多いと思いますが
出力層の書き方が2種類あったりして分かりづらかったので
対で書きてみました

※functionalで出力層を書いたのは[**こちら**](https://qiita.com/tom_speed_ltd/items/a6f1d8d34b2a32fdf7d4)から

参考のスクリプトは
VGG16をFine-tuningして5クラス分類するモデルを想定しています

#動作概略
1)出力層なしのVGG16のモデルを読込
2)新しい出力層を作成
3)上記2個のモデルを接続

#動作確認環境
python3.6.6
Tensorflow:1.10.0
Keras：2.2.2

#参考スクリプト
```python:
#import
from keras.models import Model, Sequential
from keras.layers import Activation, Dense, Flatten
from keras.applications.vgg16 import VGG16

#1)出力層なしのVGG16を読込
vgg16_model = VGG16(weights='imagenet',include_top=False, input_tensor=Input(shape=(224,224,3)))

#2)追加する出力層を作成
fc_model = Sequential()
fc_model.add(Flatten(input_shape=vgg16_model.output_shape[1:]))
fc_model.add(Dense(1024,activation='relu'))
fc_model.add(Dense(5,activation='softmax'))

#3) VGG16と出力層を接続
model = Model(inputs=vgg16_model.input, outputs=fc_model(vgg16_model.output))

# モデル表示
model.summary()
```

#★解説

#import

```python:
from keras.models import Model, Sequential
from keras.layers import Activation, Dense, Flatten
from keras.applications.vgg16 import VGG16
```

#1)出力層なしのVGG16を読込
本題ではないので詳細は省略
引数の詳細は[公式](https://keras.io/ja/applications/#_1)を確認してください
モデル名は「**VGG16_model**」（任意設定）とします

```python:
vgg16_model = VGG16(weights='imagenet',include_top=False, input_tensor=Input(shape=(224,224,3)))
```

#2)追加する出力層を作成
「**fc_model**」（任意設定）という空のモデルを作成

```python:
fc_model = Sequential()
```

全結合層に入れるために平準化（）します
下記の例では接続する「VGG16_model」の出口のshapeを取得するようにしています

自分で指示もできますが、接続元（vgg16_model）のshapeと違っていると
モデルを接続することができませんので、接続元からshapeを取得するほうがオススメです

```python:
fc_model.add(Flatten(input_shape=vgg16_model.output_shape[1:]))
```

1024次元の全結合レイヤーを作成（活性化関数は'Relu'）

```python:
fc_model.add(Dense(1024,activation='relu'))
```

5クラス分類の全結合レイヤーを作成

```python:
fc_model.add(Dense(5,activation='softmax'))
```
#3) VGG16と出力層を接続

kerasの1.0と2.0で書式が違うようで、書き方によっては警告が出ます
とりあえずこれは出ないので問題はなさそうです・・・

```python:
model = Model(inputs=vgg16_model.input, outputs=fc_model(vgg16_model.output))
```
Tensorflowで転移学習させたモデルを保存する際の注意点

# はじめに 
Tensorflowで転移学習させたモデルを保存し、再度それを読み込んで処理した時に諸々問題が発生した。

半日ほどハマったので、備忘録を兼ねてメモ。

# 問題の状況 
１　tensorflow.train.saver.restore()を使って学習済みモデルを読み込んだ。この際に再学習させるモデルは若干変えたため、以下のように一部のパラメータだけを読み込んだ。

```python
sess = tf.Session()
......
all_vars = tf.all_variables()
......
sess.run(tf.global_variables_initializer())
......
var_to_restore = []
for num, var1 in enumerate(all_vars):
    _, deter, _ = var1.name.split('/', 2)
    if deter != 'REMOVE_NAME':
        var_to_restore.append(var1)
saver = tf.train.Saver(var_to_restore)
saver.restore(sess, RESTORED_MODEL_NAME)
```

２　これを学習させ、適当なタイミングでパラメータを保存した。

```python
_ = saver.save(sess, FILE_NAME_OF_CKPT)
```

３　これを再び読み込んで、再々学習させたり、推論させる際にErrorが出たり、結果がおかしくなったりした。


# 問題の所在

```python
saver = tf.train.Saver(var_to_restore)
```

としているので、var_to_restoreに該当するパラメータだけでsaverインスタンスが初期化されている。

つまり全てのパラメータのリストが入っていない。

ちなみにtensorflowの公式サイトの記述ではSaverクラスの初期化は以下のようになっている。

```python
__init__(
    var_list=None,
    reshape=False,
    sharded=False,
    max_to_keep=5,
    keep_checkpoint_every_n_hours=10000.0,
    name=None,
    restore_sequentially=False,
    saver_def=None,
    builder=None,
    defer_build=False,
    allow_empty=False,
    write_version=tf.train.SaverDef.V2,
    pad_step_number=False,
    save_relative_paths=False,
    filename=None
)
```

つまり第１引数のvar_listにvar_to_restoreだけ入っている。

この状態で

```python
_ = saver.save(sess, FILE_NAME_OF_CKPT)
```

と保存すると、その一部のパラメータだけで保存されてしまう。

# 解決法 

そこで以下のように直後にsaverインスタンスを初期化しなおして解決した。


```python
......
saver = tf.train.Saver(var_to_restore)
saver.restore(sess, RESTORED_MODEL_NAME)
saver = tf.train.Saver()
```

ちなみにTensorflowの公式ドキュメントに

var_list: A list of Variable/SaveableObject, or a dictionary mapping names to SaveableObjects. If None, defaults to the list of all saveable objects.

とあるように、初期化で引数を指定しなければデフォルトでvar_listには全てのパラメータが入る。
rbenvでRubyのversion を変更する方法

作成するアプリ単位でrubyのバージョンを変更することに最初はなれずにErrorが出ていたので、自分用のメモとして記録しておきます。

### 現状のversion確認
```
$ rbenv version
2.5.0 (set by /Users/name/.rbenv/version)
```

### installできるバージョンの確認
```
$ rbenv install -l
Available versions:
(略)
 2.4.0-dev
  2.4.0-preview1
  2.4.0-preview
  2.4.0-preview3
  2.4.0-rc1
  2.4.0
  2.4.1
  2.4.2
  2.4.3
  2.4.4
  2.5.0-dev
  2.5.0-preview1
  2.5.0-rc1
  2.5.0
  2.5.1
  2.6.0-dev
  2.6.0-preview1
  2.6.0-preview2
```

### バージョン変更
```
$ rbenv install 2.x.x
```

### installしたバージョンの適用
#### 指定したディレクトリで適用する場合
```
$ cd
$ mkdir hoge 
$ rbenv local 2.x.x
$ rbenv version
2.x.x (set by /home/user/hoge/.ruby-version)
```
#### 環境全体で適用する場合
```
$ rbenv global 2.x.x
$ rbenv version
2.x.x (set by /home/user/hoge/.ruby-version)
```

### 参考サイト
- [rbenv を利用した Ruby 環境の構築]
(https://dev.classmethod.jp/server-side/language/build-ruby-environment-by-rbenv/)
- [github.com/rbenv/rbenv](https://github.com/rbenv/rbenv)
CassandraでINDEXをつける際の備忘録(using materialized view)

# 1. CassandraでIndexをつける際の備忘録

materialized viewを利用することを前提に、Cassandraのテーブルをどう作るかを検討する
実質検討中な為、内容は変更されることが前提です

## materialized viewを利用する為に最低限のindexを振る

### パーティションキーとしてカテゴリ、INDEXとしてUNIQになる最小の設定を入れる

```kotlin:baseとなるtable

CREATE TABLE IF NOT EXISTS example.basetable (
partition_id int,
item_code text,
seq_id bigint,
PRIMARY KEY((partition_genre_id), item_code)
);

```

### order by させたいキーをprimary keyとして設定することで order by できるようにする

```kotlin:order_byさせる為のview

create materialized view if not exists example.basetable_mv
as select * from basetable 
where item_code is not null
and seq_id is not null
and partition_genre_id is not null
primary key ((partition_genre_id), seq_id, item_code);

```

### primary keyとして設定されていないので、エラーになる

```kotlin:検証用Query--結果NG
SELECT 
item_code,
seq_id 
FROM example.basetable
where partition_genre_id = 211553 and seq_id > 0
order by seq_id limit 1000 ALLOW FILTERING;


cqlsh:mykeyspace> SELECT  item_code, seq_id  FROM example.basetable where partition_genre_id = 211553 and seq_id > 0 order by seq_id limit 3 ALLOW FILTERING;
InvalidRequest: Error from server: code=2200 [Invalid query] message="Order by is currently only supported on the clustered columns of the PRIMARY KEY, got seq_id"

```

### primary keyとして再設定することでorder by が可能となる

```kotlin:検証用Query--結果OK

SELECT 
item_code,
seq_id 
FROM example.basetable_mv
where partition_genre_id = 211553 and seq_id > 0
order by seq_id limit 1000 ALLOW FILTERING;


cqlsh:mykeyspace> SELECT  item_code, seq_id  FROM example.basetable_mv where partition_genre_id = 211553 and seq_id > 0 order by seq_id limit 3 ALLOW FILTERING;

 item_code        | seq_id
------------------+----------------
     XXX:11234299 | 15358979170100
     XX1:11789006 | 15358979170101
     XX2:11771190 | 15358979170103

(3 rows)


```
LINE Developersアカウントでプロバイダーやチャネルが作れないときの対策法

# 概要
LINE Developersアカウントでプロバイダーやチャネルが作れないときの対策法
<img width="504" alt="Screen Shot 2018-12-02 at 11.45.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/68213/116c2014-9d14-a4b1-f2cb-be196b1dd9e3.png">

```
An incorrect parameter or value may have been specified.

Please check that the parameters and values are correct and try again.
```

```
指定されたパラメータ、もしくは入力された値が正しくない可能性があります。

入力内容をご確認の上、再度お試しください。
```

# 対策
プロバイダ名とチャネル名に「LINE」の文字列を使わないようにする。
どうも、lineから始まらなければ大丈夫そう。
あと、lineがダッシュやアンダースコアで囲まれているのもだめらしい。
ダメ: linebot-hogehoge
ダメ: test-line-hoge
ダメ: test_line_hoge
良い: hogehoge-linebot

# 対策2
Google Chromeの場合、URLの左のSecureのところをクリックして、サイト設定を選択。
<img width="360" alt="Screen Shot 2018-09-09 at 19.53.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/68213/c36a3a5d-7722-b9b1-bfce-53432e635911.png">

そして、Flash、広告、ポップアップを許可にする。

# その他
チャネル基本設定のWebhook送信が、利用するに設定していてもなぜか利用しないに戻ってしまうことがあるので、再読み込みしてみて確認してください。

# 今後
これで作れることもありますが、ダメなこともありました。これで出来たなどありましたらコメントください！
guard-shellで複数ファイルが更新されたとき何回もコマンド実行されないようにする

# やりたいこと

- Rubyの`guard` gemと`guard-shell`プラグインを使っている
- プロジェクト内のファイルを監視し、更新されたときプロジェクト全体をビルドしたい
- 通常、Guardでは1ファイルの更新につきそのファイルを処理するコマンドが1回走るので、`touch hoge.c moge.c` のように同時に複数のファイルが更新された場合、プロジェクト全体をビルドするコマンドが2回走ってしまう
- これを1回だけにしたい

# 解決法

こんな感じで`Guardfile`を書いておく：

```Guardfile
$last_exec_time = Time.now
guard :shell do
  watch(/.*\.(c|h)$/) do |m|
    puts "Changed: #{m[0]}"
    # 前回実行から1秒以内なら実行しない
    if Time.now - $last_exec_time < 1
      puts "Skip"
      next
    end
    ret = `sleep 2; date`  # 実験用のコマンド
    $last_exec_time = Time.now
    ret
  end
end
```

グローバル変数`$last_exec_time`を使い、前回実行から1秒以内ならスキップするようにしている。
ビルドコマンドに1秒以上かかってもちゃんとスキップされている。

やりたいことは非常によくあることな割に、ダーティなやり方である。
もっといい方法があったら教えてください。

[追記]
`guard-process`や`guard-rake`を使えば今回のような問題は生じない。
`guard-process`なら`Guardfile`内にコマンドを書けるので手軽に`guard-shell`の代用にできる。

そもそも`guard-shell`は作りがguardの思想から少し外れているような気がする。
`watch`のブロックは

>When you add a block to the watch expression, you can modify the file name that has been detected before sending it to the plugin for processing:
>（中略）
>NOTE: Normally, most plugins expect the block to return a path or array of paths
>https://github.com/guard/guard/wiki/Guardfile-DSL---Configuring-Guard#watch

と書いてある通り、変更されたファイル名から処理すべきファイル名に変換するのが本来の目的であり、その中でシェル呼び出しすればそりゃ複数回呼ばれるよな。
Railsでhonoka4.1.3を追加する(手動)



# 公式サイトからhonokaをDL
http://honokak.osaka
<img width="493" alt="スクリーンショット 2018-09-09 18.33.37.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/200666/e209cdc3-7746-c6e6-1e8a-66745eb0deb9.jpeg">

<img width="493" alt="スクリーンショット 2018-09-09 18.38.02.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/200666/66ee173e-1bfb-316e-afc3-de423ffce316.jpeg">


**中はこんな感じ**

```
honoka/
 ├bootstrap.html
 ├css/─bootstrap.css
 │    └bootstrap.min.css
 │
 ├ js/─bootstrap.build.js
 │    ├bootstrap.build.min.js
 │    ├bootstrap.js
 │    └bootstrap.min.js
 ├LICENSE
 └ README.md
```



##bootstrap.min.cssとbootstrap.min.jsを使う

```
rails_app/
 ├app/
 │   └assets/
 │        ├javascripts/ <- bootstrap.min.jsを追加する
 │        └stylesheets/ <- bootstrap.min.cssを追加する
 ├bin/
 ├config/
 ├db/
 ...
```
###bootstrap.min.jsを追加
<img width="477" alt="スクリーンショット 2018-09-09 18.57.00.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/200666/fd86ba49-0495-d2f7-3ed8-b8f9512294a4.jpeg">

###application.jsでbootstrap.min.jsを使えるようにする
```
rails_app/app/assets/javascripts/application.js
// This is a manifest file that'll be compiled into application.js, which will include all the files
// ...
// about supported directives.
//
//= require bootstrap.min <- 追記
//= require ...
//= require ...
...
//= require_tree .
```

###bootstrap.min.cssを追加
<img width="472" alt="スクリーンショット 2018-09-09 18.57.17.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/200666/e26e16c9-b664-d4d8-4e94-18490f3770b6.jpeg">

###application.cssでbootstrap.min.cssを使えるようにする
```
rails_app/app/assets/stylesheets/application.css
/*
 * This is a manifest file that'll be compiled into application.css, which will include all the files
...
 *
 *= require bootstrap.min <- 追加
 *= require_tree .
 *= require_self
 */
```

###デモページを試す
```
rails g controller honoka demo
```

rails_app/app/views/honoka/demo.erb.html
の中身を honoka/bootstrap.html で上書きする

```
rails s
```
<a href="localhost:3000/honoka/demo">localhost:3000/honoka/demo</a>をひらく

確認が済んだら消去する

```
rails g destroy controller honoka
```


参考文献
<a href="https://ticklecode.com/honoka-install/">Rails5に日本語を美しく表示できるBootstrapテーマ「Honoka」を導入！</a>