OmniAICreator/Qiita-1.07M huggingface dataset:
メトリクスについての学習  （ゾーン分析）

# メトリクスの分析：ゾーン分析

https://qiita.com/bakachou/items/53d7332fd11ad4dc08f9
こちらでメトリクスについて学び始めた。

メトリクスは単に数値なので、これをもとに分析する必要がある。
その分析手法には以下のようなものがある

- 管理図分析（閾値モデル）
- ゾーン分析
- 曲線近似分析
- トレンド分析
- チェックリスト分析

今回はゾーン分析について学習してみた

# ゾーン分析
ゾーン分析とは2つの異なるメトリクスの基準値を用いて視覚化し、達成／未達の評価を行う。表で記載し、9個のゾーンに分けて、算出したメトリクスをプロットする。

レビュー工数密度とレビュー指摘効率、テスト密度とバグ密度のゾーン分析が代表例としてある。

## バグ密度とテスト密度のゾーン分析例
取得したメトリクスを表にプロットし、どこのゾーンに入るかを見てプロジェクト（プロダクト）の状況を確認する

![バグ密度.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/f087ae89-0b53-5c23-1afe-2517d5750986.png)

バグ密度とテスト密度のゾーン分析は以下のような状態となる。


|ゾーン|概要|
|---|---|
|1|テスト数に対して期待通りの数のバグが発見できている|
|2|テスト数に対して、期待するバグの数が少ない|
|3|テスト数が少ないが、それに対してのバグは発見できている。（テスト内容が正しいか見直したほうがよい）|
|4|テスト数に対してバグの発見が少ない（テスト効率が悪い）|
|5|テスト数に対してバグの発見が多い。（品質確保ができてない）|
|6|テスト数は多いが、バグの発見も多い。（テストすればするほどバグが見つかる状態。品質確保ができていない）|
|7|テストが少ないが、バグがある程度でている。（テスト不足でもあり、品質確保もされていない）|
|8|テストが少ないが、バグが多い。（テスト不足でもあり、品質確保もされていない）|
|8|テストが少ない|


## レビュー工数密度とレビュー指摘効率のゾーン分析例

![ゾーン分析.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/4882604c-8cd0-7ac7-502d-70aa90991306.png)


# 考察というか悩みというか
このようなゾーン分析をとるために、いったいどれぐらいの母数が必要なんだろうか。

いずれかのゾーンに入ったからと言っても、ゾーン分析の結果良い悪いとかの判断ができるわけではなく、プロジェクト（プロダクト）の特性などを考えて、なぜそのゾーンに入ったかということを考えることが大事。

ゾーン分析ありきで実施すると、プロジェクトによってはゾーン1に入るようにテストケース数やバグ数を調整するという本末転倒なプロジェクト（プロダクト）になるから、分析するにはちゃんと生のデータが必要と偉い人が言っていた。
AzureCustomVisionServiceで「塩顔、ソース顔を判定」してみた




# つくったモチベーション
マッチングアプリや交遊を目的とした食事会でよくある事として、
「思っている顔と違った、、、」という事である。
そして、顔に関しては絶対的な指標があるわけではなく、人によりストライクゾーンというものがある。
（もちろん一番重要なのは"心"である。ここだけは譲れない）

そこで、ざっくり顔のタイプを「ソース（ハッキリとした顔）」「塩（端正な顔）」で分けてくれる画像認識学習モデルを作成した。


# 「ソース顔、塩顔判定モデル」概要
Azure CustomVisionServiceに、顔写真を登録後、
ソース顔、塩顔のタグ付けをし学習モデルを作成する。
![スクリーンショット 2019-08-29 7.34.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420554/1856c771-ad23-83a0-f6aa-a4890e20b8a9.png)
![スクリーンショット 2019-08-29 7.42.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420554/24b7852c-34cd-5237-1942-2d5d0ea23f72.png)


# 「ソース顔、塩顔判定モデル」判定結果
私は、ものすごい塩顔のようですね〜。
平安時代の女性に生まれたら、もう少しパフォーマンスが発揮できたかもしれません。
（現代にも塩顔が好きな方はたくさんいらっしゃいます）
![スクリーンショット 2019-08-29 7.38.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420554/10fd3ef0-d527-66ba-77e0-b8ac2d00d2fb.png)


## 技術・素材
- Azure CustomVisonService（学習モデル）
- Python（画像の収集）



参考
https://azure.microsoft.com/ja-jp/services/cognitive-services/
https://protoout.studio/posts/custom-vision-project-publish-error

## 今後の課題
ユーザーが使えるようにはなっていないので、Botなどに落とし込みたい。
いろんな場面でBotに顔を判断させたから、対面するようにしたら、もっといい出会いが生まれるかも？しれません。
Kotlinのコマンドライン実行

## install
### 環境
OS:windows10
​kotlinc:1.3.50 (JRE 11.0.2+9-LTS)

### dowload for windows
Kotlinのコンパイラは、GitHub Repository [Release 1.3.50 · JetBrains/kotlin · GitHub](https://github.com/JetBrains/kotlin/releases/tag/v1.3.50)からZipをダウンロードする。
​
### 配置
ダウンロードしたkotlin-compiler.zipを任意のディレクトリに配置する。
​
### Path
任意のディレクトリに配置したkotlincのbinフォルダをPathに設定する。
例：C:\Program Files\kotlinc\bin
​
### versionの確認

```
> kotlinc -version
info: kotlinc-jvm 1.3.50 (JRE 11.0.2+9-LTS)
```
​
## Kotlinの実行
### scriptの実行
1. Sample.ktの実装

```
println("Hello world!")
```
​
2. scriptのコンパイル・実行
kotlinc に -script オプションを付けることで、コンパイルの手順を飛ばして、スクリプト言語のように実行する。

```
kotlinc -script sample.kts
error: unable to instantiate class Sample (Sample.kts): java.lang.NoClassDefFoundError: kotlin/script/templates/standard/ScriptTemplateWithArgs
```
  - 現時点では、Kotlin (1.3.50)のバグと思われる
  - [Executing kotlin script from terminal - Kotlin Discussions](https://discuss.kotlinlang.org/t/executing-kotlin-script-from-terminal/14019)
​

### jmvコンパイル・実行
1. Sample.ktの実装

```
/* entry point */
fun main(args: Array<String>) {
    println("Hello, World!")
}
```
​
2. sample,jarの生成

```
>kotlinc sample.kt -include-runtime -d Sample.jar
```
​
3. sample,jarの実行

```
>kotlin sample.jar
Hello, World!
```
or

```
>java -jar sample.jar
Hello, World!
```
​
## ref
- [Working with the Command Line Compiler - Kotlin Programming Language](https://kotlinlang.org/docs/tutorials/command-line.html)
- [Kotlin CLI の使い方: kotlin, kotlinc, kotlinc-js, kotlin-dce-js - Qiita](https://qiita.com/KenjiOtsuka/items/f39318890415d071404c)
オンラインエディタのススメ

phpでのwebアプリ開発を効率的に進めていくために、オンラインエディタを作ったのでその紹介です。

#B-code

![B-code.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415526/cd8c453c-5451-74e2-7d3f-01bdbaa2a05a.png)

B-codeはブラウザを使ってサーバ上のファイルを直接編集するためのツールです。もうFTPは要りません。

##インストール

いきなりインストールです。
B-codeはデータベースを使いません。phpがあれば動きますのでまずはインストールしてみてください。
（php7.0環境で作成しています。）

1 githubからソースコードをダウンロードしてください。
<https://github.com/TakaoNishidaBBT/B-code>

2 解凍したファイルをFTP（ここだけ必要です）でwebサーバにアップしてください。
3 アップしたディレクトリ直下にinstallというディレクトリがありますのでブラウザで開きます。

アップロードしたディレクトリがhttp\://hoge.com/bcode/の場合、http\://hoge.com/bcode/install/となります。

![B-code_intaller.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415526/404df651-49f6-eba0-af8b-3d6792286fa9.png)

インストール画面が開きますのでまずは、一番下の「ディレクトリパーミッションの確認」の赤くなっている行がない状態にしてください。そのあと、Basic認証、管理者アカウントをそれぞれ設定し、「確認」→「インストール」と進んでください。

インストールが完了したら下の画面が表示されます。
![B-code_finished_install2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415526/e26da4b8-400e-3d61-3e30-eca4208e5a6b.png)

「管理画面へ」をクリックしログイン画面を開きます。
![B-code_login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415526/9120665c-e9cc-5dad-70d7-be35076640e5.png)

設定した情報でログインします。

![B-code_project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415526/fa109773-0bac-8031-e7e1-133b5b55a144.png)

##PROJECT

PROJECT管理画面がログイン後、最初に開きます。
「新規登録」ボタンからPROJECTを作成します。

![B-code_project_detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415526/56642bae-3b8c-a1ef-974d-07765732b79e.png)

ドメインとDoc Rootは、B-codeがインストールされているところがデフォルトで表示されています。
B-codeは、マルチドメインにも対応していますので、その場合はここを変更してください。

各項目を設定し、「登録」ボタンをクリックするとPROJECTが作成されます。
![B-code_project2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415526/9ce06276-d64c-4d5c-093d-1f6b3033ecf6.png)

「OPEN」ボタンをクリックしてエディタを起動します。

##EDITOR

![B-code_editor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415526/4012f026-24f8-1006-ac60-e343f2d9090f.png)

空のPROJECTに既存のファイルをまとめてアップロードするにはzipファイルを使います。
![B-code_upload.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415526/398c8a9c-7f73-18d4-30bd-42607d9620c1.gif)

ファイルの全選択はctl+a、削除はdeleteキーでできます。

あとは、ファイルを選択して編集するだけ。

もうFTPは要りません。
CodenvyでLaravelデビューする

# 何するの
CodenvyでLaravelの実行環境を作るよ。
個人用メモ
\## なんか画像が入らないので後で差し込む

# 事前準備
Codenvyのアカウント登録しておく

# ワークスペースを作る
`Create WorkSpace`からワークスペースを作成する。
`NAME`は任意のワークスペース名を指定。
`TEAM`は個人ならpersonalで。
`SELECT STACK`はPHPを選択。
あとは基本的にいじらなくてよし。

# Laravelプロジェクトを作る
`Create Project...`からプロジェクトを作成する。
PHPのComposerを指定。
`Name`は任意のプロジェクト名を指定。
`Description`も任意で記入。
`Next`で次に進む。
`Package Name`に`laravel/laravel`を指定。
`Create`

# Laravelプロジェクトを実行するための準備
## ファイル名を直す
`.env.sample`ファイルを`.env`に修正する。

```
cd [各プロジェクト名]
cp -p .env.example .env
php artisan key:generate
```

## 実行用のコマンドを作る
`Create new command`からコマンド作成ダイアログを表示する。
`Name`は任意のコマンド名を指定。
`Command line`には以下を指定。

```
cd ${current.project.path} && php artisan serve --host=0.0.0.0 --port=3306
```
`Apply to`は当プロジェクトの`Applicable`を`Yes`に設定する。
`Preview URL`は以下を指定。

```
http://${server.port.3306}
```
`Save`

# 実行してみよう
上で登録した実行用のコマンドを実行してみる。
実行は`Create new command`したところから。


OK!
LookMLの日付項目の注意点について


自動生成されたLookMLそのままではエラーになるパターンがありましたので、メモ残しておきます。

## 発生したこと
・テーブルからLookMLを自動生成した場合、**テーブルの日付項目名がDate** だとSQL発行時にエラーが出てしまう。
・利用DB： **bigquery**

```yaml
 1  dimension_group: Date {  ### テーブルの項目名がDateになっている
 2    type: time
 3    timeframes: [
 4      raw,
 5      date,
 6      week,
 7      month,
 8      quarter,
 9      year
10    ]
11    convert_tz: no
12    datatype: date
13    sql: ${TABLE}.[Date] ;;  ### ここの[Date]というところはbigqueryでエラーになる
14  }
```

上記のLookMLの特徴として、
・1行目 : **dimension_group: Date(テーブル項目名がDate)**になっている
・5行目 : **timeframes** にも **date** という同名が存在する
・13行目: sqlのところで **Dateが [Date]に自動変換** されている。 
 　　　　　→bigqueryだと[]を使うことができないようで、以下のようにエラーが発生。
![日付項目の罠1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/7fa1f66f-6936-9a03-4544-fe03e42e8697.png)

## 対策方法

```yaml
 1  dimension_group: Date {  
 2    type: time
 3    timeframes: [
 4      raw,
 5      date,
 6      week,
 7      month,
 8      quarter,
 9      year
10    ]
11    convert_tz: no
12    datatype: date
13    sql: ${TABLE}.Date ;;  ### []を外してlookMLを保存する
14  }
```
![日付項目の罠2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/cbbff386-7258-6f5a-d109-da6da1564698.png)


## まとめ
・bigqueryを利用しており、テーブルの日付項目が **Date** とか **week** 等になっている場合は **LookMLの自動生成コードを修正する必要がある** 
・bigquery以外であればクエリの項目名に[]があっても処理できるパターンもあるかもですので、その場合は対応不要と思われます。
第一回日本最強プログラマー学生選手権-予選- 参戦記

# 第一回日本最強プログラマー学生選手権-予選- 参戦記

## [A - Takahashi Calendar](https://atcoder.jp/contests/jsc2019-qual/tasks/jsc2019_qual_a)

8分で突破. 全組み合わせチェックするだけ. 一応0から始めずにループ量を減らしたけど、減らす必要はなかったと思う.

```python
m, d = map(int, input().split())
result = 0
for i in range(4, m + 1):
  for j in range(22, d + 1):
    d10 = j // 10
    d1 = j % 10
    if d1 >= 2 and d10 >= 2 and d1 * d10 == i:
      result += 1
print(result)
```

## [B - Kleene Inversion](https://atcoder.jp/contests/jsc2019-qual/tasks/jsc2019_qual_b)

30分で突破. 時間かけすぎて、順位ヤバそうと思ったけど、他の人も時間がかかってたようでセーフ. 入力例3を K=2 で手で解いてみてようやく1ループ目とそれ以降で違うことが認識されてスパッと解けた. 最後に一回だけ 10<sup>9</sup> + 7 の mod を取れば良いのは Python でちょっと得した感,

```python
n, k = map(int, input().split())
a = list(map(int, input().split()))
v1 = 0
for i in range(n - 1):
  for j in range(i + 1, n):
    if a[i] > a[j]:
      v1 += 1
v2 = 0
for i in range(n):
  for j in range(n):
    if a[i] > a[j]:
      v2 += 1

t = v1 * k + v2 * k * (k - 1) // 2
print(t % (10 ** 9 + 7))
```
AudioTrackで正弦波の単音を再生させるためのデータ型選択

# はじめに
AudioTrackを使って生成した正弦波をリアルタイムで再生するアプリを作成。再生できるようになったが再生したい周波数と違う周波数の音（雑音）も再生されていたため、修正。

# 正弦波生成
周波数を引数として正弦波を生成し、byte型の値の範囲-128~127で正規化。

```java:getSound
/**
 * 正弦波生成
 * @param frequency 音の周波数
 * @return 音声データ
 */
public byte[] getSound(double frequency) {
    frequency = frequency / 2;
    // byteバッファを作成
    byte[] buffer = new byte[bufferSize];
    double max = 0;
    double[] t = new double[buffer.length];
    double hz = frequency / this.sampleRate;
    for(int i = 0; i < buffer.length; i++) {
        t[i] = Math.sin(i * 2 * Math.PI * hz);
        if(t[i] > max) {
            max = t[i];
        }
    }
    double trans = 127 / max;
    for(int i = 0; i < buffer.length; i++) {
        buffer[i] = (byte)Math.round(t[i]*trans);
    }
    return buffer;
}
```


# 結果
20kHzの音を再生した。これ自体は非可聴音だが、可聴音も再生されてしまっている。この可聴音は雑音なので除去したい。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276354/a60cb3de-dbc6-c736-e739-b73b5b317ddb.jpeg" width=50%/>

# 修正したこと
音声データをbyte型ではなくshort型にしただけ。short型の値の範囲-32768~32767で正規化することで正弦波の分解能が高くなった。

```java:getSoundShort
/**
 * 正弦波生成
 * @param frequency 音の周波数
 * @return 音声データ
 */
public short[] getSoundShort(double frequency) {
    double[] value = new double[sampleRate];
    double max = 0.0;
    for(int i = 0; i < sampleRate; i++) {
        value[i] = Math.sin(2.0 * Math.PI * frequency * i / sampleRate);
        if(value[i] > max) {
            max = value[i];
        }
    }
    short[] buffer = toShort(value, max);

    return buffer;
}

/**
 * double型をshort型に変換（-32768~32767で正規化）
 * @param val double型音声データ
 * @param max 最大値
 * @return short型音声データ
 */
public short[] toShort(double[] val, double max) {
    double trans = 32767 / max;
    short[] buf = new short[sampleRate];
    for(int i = 0; i < sampleRate; i++) {
        buf[i] = (short)Math.round(val[i] * trans);
    }
    return buf;
}
```

# 修正結果
同様に20kHzを再生したところ、可聴域の雑音がなくなり、20kHzの単音になった。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276354/272b14ff-1b67-4522-8c16-4b2cf922b108.jpeg" width=50%/>

# おそらく
詳しいことはわからないが、byte型の-128~127の範囲だと分解能が低く、誤差が生じて雑音が発生したと思われる。

AudioTrackの書込処理(writeメソッド)にはbyte型、short型、float型を用いることができるが、float型は値の範囲等が複雑なため試していない。
Fedra 30に nginxをインストール・設定

#概要
Fedora30にnginxをインストールする
Dockerは使わない

##インストール

```
$ sudo dnf install nginx
```
## バージョン確認

```
$ nginx -v
```
## Fedora起動時にnginxも同時に起動するよう設定
```
$ sudo systemctl enable nginx
```

## 起動
```
$ sudo systemctl start nginx
```

## 起動状態の確認 
```
$ sudo systemctl status nginx
```
##ファイヤーウォールの設定
これをしないとウェブ画面からのアクセスが拒否された。。。

```
$ firewall-cmd --add-service={http,https} --permanent
$ firewall-cmd --reload
```
中身はこれで確認

```
sudo firewall-cmd --list-all-zones
```
## 動作確認
```
$ curl -I http://localhost
```
HTTP SATAS 200 OK　が表示されてれば良い
###ブラウザから確認
```
http://<サーバー のIPアドレス>
```
##### サーバーのIPアドレスの確認

```
$ hostname -I
```
nginxの初期画面が出てれば良い

## ブラウザからサーバーに繋がらない
### nginxのプロセスが起動してるか確認
```
$ ps ax | grep nginx
```
masater process と worker processがあれば良い

## 利用してるポート確認
```
$ ss -natu | grep LISTEN | grep 80
```
httpだったら80があれば良い
##エラーログを確認

```
 [warn] 1915#0: could not build optimal types_hash, you should increase either types_hash_max_size: 2048 or types_hash_bucket_size: 64; ignoring types_hash_bucket_size
```
こんなログが出ていた。
サーバー名が長いから怒られているっぽい。

### 対策
設定ファイルのnginx.confをいじる

```
$ vi /etc/nginx/nginx.conf
```
#####設定ファイルの直し方
```
server_names_hash_bucket_size 64; ← 32から64に直す
又は
types_hash_max_size 4098;← 2048
```
↑が無かったら行を追加する

```
http {
   //省略//
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    server_names_hash_bucket_size 64; ← 追加
   //省略//
```

###リスタートする
```
$ sudo systemctl restart nginx
```
##参考
https://xn--o9j8h1c9hb5756dt0ua226amc1a.com/?p=3332
https://kifarunix.com/install-nginx-web-server-on-fedora-30/
KMS) エンベロープ暗号化でopensslで暗号化してjavaで復号化する

備忘録です

セキュリティあんまり強くないので、こんなやり方もあるよくらいの参考でお願いします

# AWS CLIで KMS DataKeyを生成する

```bash
$ aws kms generate-data-key --key-spec "AES_128" --key-id "arn:aws:kms:REGION_NAME:ACCOUNT_ID:key/HOGEHOGE"

{
  "ciphertextBlob": "foo",
  "Plaintext" : "bar",
  "KeyId" : "KEY-ID"
}
```

返却される ciphertextBlog, PlaintextはBase64-encodedされています

# Opensslで暗号化する

```bash
$ KEY=$(echo "bar" | base64 -d | od -A n -t x1 -v | sed -e 's/ //g')
$ openssl aes-128-ecb -e -in secret.txt -out encrypted.txt -base64  -K ${KEY}
```

KEY = KMSのDataKey を HEX文字列に変えたもの(求:もっとスマートな方法
openssl コマンドで暗号化。このとき初期化ベクトル不要なブロック処理にしています

# Javaで復号化する

```java
String encryptedTxt = "baz";
String plainDataKey = "bar";

byte[] key = DatatypeConverter.parseBase64Binary(plainDataKey);

SecretKeySpec secretKey = new SecretKeySpec(key, "AES");

Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, secretKey);

byte[] encrypted = DatatypeConverter.parseBase64Binary(encryptedTxt);

String decryptedTxt = new String(cipher.doFinal(encrypted));
System.out.println("result: " + decryptedTxt);
```

上記の例では、plainDataKey ベタ書きしてますけど、
正しくは plainDataKeyは、AWSのドキュメントを参考にciphertextBlogをデコードして取得してください。
あと、使い終わったplainDataKeyは早々に削除するようにAWSドキュメントにも記載があります。

# その他

ちゃんとするなら、鍵と初期化ベクトルを生成したほうがいいです。
楽した = セキュリティの低下 と思ってください。
Eclipse+MavenからIntelliJ idea+Gradleに移行して困ったこと

開発環境を渡されたのですが、いろいろ動いなくて:joy: 、そのときに試行錯誤したときのメモです。
Eclipse + Mavenおじさんが、IntelliJ idea + Gradle 大好き:heart_eyes:おじさんに変わっていったときのメモ 

## [Gradle］Gradleって事前にインストールする必要ないの?

必要ない

Windowsの場合は、gradew.bat を用いてインターネットから取得するため不要
つまり、職場の場合は、プロキシを記載しないと、ライブラリが取得されずビルドされない

大人数で開発すると、どうしてもMavenのインストールや環境変数でつまる人が出て、
問い合わせが殺到するが、そういったもの一切がなくなる。ほんとGradle素晴らしい:heart_eyes:

## [Gradle］プロキシの設定はどこにすればよい?

gradlewとgradlew.batファイルを修正する
環境変数(set/export)ではなく、JVM_OPTSを記載する箇所があるので、こちらにプロキシを書く
コミットすればみんなプロキシにはまらない。すぱらい:heart_eyes:

```
# Add default JVM options here. You can also use JAVAこ_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS="-DproxyHost=proxy.co.jp -DproxyPort=8080 -Dhttp.proxyUser=**** -Dhttp.proxyPassword=**** -Dhttps.proxyUser=**** -Dhttps.proxyPassword=***"
```


## [Gradle］pom.xmlに該当するのは何?

build.gradleファイルが該当する
記載方法が複数あり、混乱するが、コレばっかりは学習を積みかねて慣れるしかない:sweat_smile:

## [Gradle］SNAPSHOTの最新が取得されない

SNAPSHOTは常に最新を取得するのがMavenの仕様となっているが、Gradleでビルドしても最新が落ちてこない:frowning2:
protoや、swaggerからModel/Stubを生成して、Nexusにアップロードすることはよくあるが、最新が取得されず発狂してました:rage:
ご丁寧に[Mavenの仕様を無視して24時間キャッシュする仕様](https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.ResolutionStrategy.html)だった

以下の内容をbuild.gradleに記載する。コメントはちゃんと残しましょう。

```build.gradle
// ビルド時に、常に最新のSnapshotリポジトリを取得するようにする
// MavenはSnapshotは常に最新版を取得する仕様だが、Gradleは24時間経過したリポジトリのみ最新を取得する
configurations.all {
    resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}
```

## [IntelliJ］コードに変更を入れても、フォーマッターが走らない、自動でビルドが走らない

SaveActionプラグインを入れましょう
マクロで設定する記事が見つかったりしますが、エディタを破壊する恐れがあるのでやめましょう

まず、お仕事では、IntelliJにプロキシ情報の設定をします
![Proxy.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47987/704feff1-9d5d-cd40-78a0-344a178a7ff4.png)

プラグインを追加します
![SaveAction.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47987/bc07edfe-0561-15d1-ef54-a9778ec28623.png)

プラグインの設定を追加します
![pluginの設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47987/ca71a27e-dff1-1738-910e-ccbbe85f8e9d.png)

##［IntelliJ］ショートカットキーがわからない

ストレスがたまるポイントですが、丁寧に学習&訓練していくしかないです。

| 目的 | IntelliJ | Eclipse |
| ---- | ---- | ---- |
| クイック・フィックス | [Alt] + [Enter] | [Ctrl] + 1 |
| アウトラインの表示 | [Ctrl] + O | [Ctrl] + E |
| 呼び出し階層 | [Ctrl] + [Alt] + h | [Ctrl] + [Alt] + h | 
| 定義へ移動 | [Ctrl] + b | F3 | 
| テストクラスへ移動 | [Ctrl] + [Shift] + t | [Ctrl] + 9 |

### 補足

[InteliJのショートカットキーをEclipse風にすることもできます](https://pleiades.io/help/idea/migrating-from-eclipse-to-intellij-idea.html#46188ba8)

##［IntelliJ］コードを最新化しても、SpringBootに即座に反映されない

SpringBootのDevToolsを入れていても、コードの内容が即座に反映されない:frowning2:

IntelliJに自動ビルドの設定を追加

![自動ビルドの追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47987/e9d0fc83-ede8-0d42-6a49-f66631246e6f.png)

compiler.automake.allow.when.app.runningの設定

Help > Find Action... から、"Registry" を入力します

![Registory.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47987/70a09d8b-b483-2c14-6d6c-84966f69d2d9.png)
Custom Visionでイケメンの顔しか知らない画像認識モデル 

# はじめに

azureのcustom visionを使って簡単に画像認識のモデルを作成できることを知ったので、
試しに一個作ってみた。

# 何を作ろうとしたか

2019年のイケメンランキングTOP10に入っている人の顔だけを学習させたモデルを作ろうと試みた。
もし、美男美女の顔しか知らないAIがあれば誰の顔であっても(顔じゃなくても、もはや人じゃなくてヤカンとかでも)
何かしらのエッセンスを見出して、ぽいねって言ってくれるはず。
人の目では気づけないレベルで、ぽさを発見してくれるはず。

図にするとこんな感じです。<img width="663" alt="スクリーンショット 2019-08-29 0.33.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415401/480cdba9-f323-2100-d3e0-261b47fef4a9.png">


# やってみる

[こちらの記事](https://qiita.com/iizuka2019/items/e3ac6942a0f9138f561e)を参考に、
画像の収集、アップロード、モデルのトレーニングをしていきます。

一回目のトレーニングの結果は以下の数値でした。
めんどくさくて、、スクレイピングされた画像の選定を一切しなかったので
複数人で写ってたりテキストが入ってたり、顔が分からないくらい遠まきだったからか精度がかなり低いです。

<img width="555" alt="スクリーンショット 2019-08-29 0.47.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415401/be5b7c96-3ca3-6608-3194-ddd9162e2f98.png">

そこから、本人だけ写っている画像 ＋ バストアップ以上 + テキストなしを条件に画像を選定した上で画像を追加。以下の結果になりました。
<img width="525" alt="スクリーンショット 2019-08-29 0.49.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415401/f7b13977-c4ae-e7a8-467d-b8f472387a32.png">

そこまで、伸びません、、
顔以外の要素がフォーカスされて違う人として判定されているのか、
以下の菅田将暉だと、髪型とスーツ（田中圭の写真にスーツ姿が多かった）が田中圭ぽいから、田中圭が多めになっているのかも、、
<img width="499" alt="スクリーンショット 2019-08-29 0.55.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415401/93c7ed61-49eb-b8c5-5c9d-0fbb45ab0879.png">

# テスト

とりあえずこれぐらいの精度でテストしてみます。

まずは本人から。<img width="830" alt="スクリーンショット 2019-08-29 1.05.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415401/500b4a60-d57b-080b-f81a-6937c874cd58.png">

次に、自分で
<img width="825" alt="スクリーンショット 2019-08-29 1.18.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415401/cf86a58b-ce7d-6667-dead-784161094335.png">

高橋一生いただきました！嬉しいですね！
田中圭ぽさも62%あるようです！

続いてアンパンの人
<img width="1079" alt="スクリーンショット 2019-08-29 1.26.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415401/e46c9231-514d-42d4-cc27-584e6bcaa611.png">

どちらかというと菅田将暉なんですね。顔の形とかですかね。

最後にじゃがいも
<img width="1083" alt="スクリーンショット 2019-08-29 1.24.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415401/65f6b970-8c09-5801-bdee-98f4fb0f1b55.png">

ほぼ松坂桃李です！


# まとめ

当初は画像を送ると「どちらかというと、〜〜っぽいね！」みたいに返してくれるline botにしたかったのだが、
精度がいまいちなのでストップ。。
じゃがいもを松坂桃李70%って出したりどういった要素で判定しているのかが気になった。
custom vision気軽に機械学習に触れられて嬉しいけど、学習用のデータの選定のしかたとかコツ？みたいなの知らないと精度に限界があるのかなー面白そうだけどかなり奥深そう。。
Laravel 5.7でControllerのファイル名を少し変更（大文字）しただけなのに、Controllerファイルが見つからないエラーが出るようになった

## 問題
すでに作ったControllerファイル名を変更（大文字・小文字）したら、ファイルが見つからないエラーが出てサイトが動かなくなった。表示されたエラーは以下の通り：

```
ErrorException (E_WARNING)
include(/hogehoge/backend/vendor/composer/../../app/Http/Controllers/NameOfController.php): 
failed to open stream: No such file or directory

```
## 環境と経緯
* Laravel 5.7使用。
* "php artisan make:controller nameOfController"でコントローラを追加。
* 自動生成されたファイルの名前（nameOfController.php）を、のちに"NameOfController.php"へ変更。
* ファイル名を変更した後で、routes/web.phpには、"Route::get('/entrance', 'NameOfController@hoge')->name('hoge');"を追加。
* 前述の問題が発生。ErrorException・No such file or directoryエラーが発生し、サイトが動かなくなった。


## 解決策
ターミナルで、"composer dump-autoload"をlaravelプロジェクトのルートディレクトリで実行する。[こちらのブログ](https://qol-kk.com/wp2/blog/2018/11/23/post-943/)が参考になりました。

## 背景
コントローラを作っていくうちに、コントローラファイル名の[ケーススタイル](https://medium.com/better-programming/string-case-styles-camel-pascal-snake-and-kebab-case-981407998841)がバラバラになってきた(camelCase名で作ったコントローラよりPascalCaseの方が多くなってきた)ため、手に負えなくなる前に統一しておこうと思った途端に起きた問題でした。
DjangoアプリをHerokuにデプロイする際にハマった点

# この記事について
DjangoアプリをHerokuにデプロイする際、自分がつまづいたポイントをまとめてみました。
同じポイントでハマった方の助けになれれば幸いです。

# 参考にした記事
Djangoの学習・アプリのデプロイの際に参考にさせていただいた記事を載せておきます。（ありがとうございました！:bow:）

- Django Girls (https://tutorial.djangogirls.org/ja/)
 - 環境構築から一つ一つ丁寧に書いてあります。

- [Django] Heroku デプロイ方法 2018年版 (https://qiita.com/okoppe8/items/76cdb202eb15aab566d1)
 - デプロイ方法についてとても分かりやすくまとめてあります。

# ハマったポイントと対処法
#### ビルドに成功したはずなのにApplication Errorが出る！

##### 自分の場合の結論
gunicornをrequirements.txtに入れていなかった

##### シチュエーション

上述したサイトを参考にしてheroku側でビルドまでできたはずなのにApplication Errorと出てしまいました。

とりあえずこんな時はログを確認して原因をさぐります。
heroku cliを入れるのが面倒だったのでコンソール右上の「View logs」から確認しました。
<img width="177" alt="console_migiue.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307646/548f4e75-6317-000d-6b80-6f7f42f79907.png">

するとこのようなログが

<img width="576" alt="command not found.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307646/d0f454f1-7bba-9c49-e2ff-4a2378fa4458.png">

``` 
bash: gunicorn: command not found
```

Procfileに記述していたgunicornコマンドでエラーが出ているようです。

なぜだろう？と思ったら、**ローカル側のpipでgunicornをインストールしていなかった**ため、```pip freeze > requirements.txt``` で作成した requirements.txt に gunicorn がなかったようです。
結果として **heroku 側の環境に gunicorn がインストールされていなかった**ため、コマンドを実行できなかったようでした。

```python:コマンド
pip install gunicorn
pip freeze > requirements.txt
```

これで解決しました。
ローカルではgunicornをインストールしなくても動作するのでこれで引っかかる人もいるのではないでしょうか？（まあ、記事のほうには**「gunicorn」をインストールしてください**と書いてあるので、確認していれば起こらなかったのですが、、、:frowning2:）

# 最後に
また何かあったら追記します。
Swift ナビゲーションバーにUITextVIewの文字数をリアルタイムにカウント


## 完成形
ナビゲーションバーのタイトル下にTextViewに入力された文字数をリアルタイムにカウント

![count.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487914/3aede811-04bb-e094-a1c3-0f0b69ed9e91.gif)

## 実装の流れ

#### 1. UITextViewDelegateを継承
```
ViewController: UIViewController, UITextViewDelegate {
```

#### 2. 文字数をカウントしたいUITextViewにデリゲート設定

```
MemoTextView.delegate = self
```

#### 3. ナビゲーションバーのタイトル・カウントの作成

イメージは下記のような形
青い四角：全体のUIView
黄色の四角：タイトルラベル
緑の四角：カウントラベル

<img width="384" alt="qiita_material_count1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487914/56f687f6-42da-08d3-1289-aed793feac34.png">

```
        //青い四角　UIView
        let titleView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 40))
        
        //黄色の四角　タイトルラベル
        let titleLabel = UILabel()
        titleLabel.text = "メモ"
        titleLabel.font = UIFont.boldSystemFont(ofSize: 17)
        titleLabel.frame = CGRect(x: 30, y: 0, width: 50, height: 20)
        
        //緑の四角　カウントラベル
        countLabel.text = "0"
        countLabel.font = UIFont.systemFont(ofSize: 14)
        countLabel.frame = CGRect(x: 40, y: 20, width: 50, height: 20)
        
        //UIViewに追加
        titleView.addSubview(countLabel)
        titleView.addSubview(titleLabel)
　　　　　
        //ナビゲーションに青い四角のUIViewを追加
        navigationItem.titleView = titleView

```

#### 4. TextViewの文字数をカウントラベルに挿入

デリゲートメソッドであるtextViewDidChangeを用意し、下記のように文字列にキャストして、カウントラベルに値を入れます。

```
    func textViewDidChange(_ textView: UITextView) {
        let MemoCount = MemoTextView.text.count
        countLabel.text = String(MemoCount)
    }
```
TensorFlow+keras(GPU版)　環境構築

# 概要
　ニューラルネットワーク実装用にTensorFlow+kerasの環境構築の備忘録を記す。Chainerも整えてみたけど、情報量的と開発環境の構築のしやすさからこちらを選択した。

　ここで、kerasとあるが、現在TesorFlowにはデフォルトでkerasが入っているので、最新版のkerasを使用したい場合以外は特に気にする必要はない。

# 導入ソフトウェア

　ここでは、GPU版を利用することを前提とし、以下のソフトウェアを導入する。cudnnはCUDAのバージョンに合わせて導入すること。

- Anaconda
- CUDA（v10.1）
- cudnn

## CUDA・cuDNNのインストール

　CUDAのバージョンは使用するtensorflowのバージョンに合わせて導入する。CUDAはインストーラに従いインストールし、「C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin」をPATHに登録する。

## Anaconda・tensorflow-gpuのインストール

　Anacondaも基本的にはインストーラに従いインストールすればいい。その後、enviromentにてtensorflow-gpuをapplyする。今回対象とするtensorflowには、デフォルトでkerasが入っているため、最新のkerasが必要でない場合はこれで十分である。

## 動作確認

anacondaの環境にて（anaconda plomptやspyderなど）にて、以下のコードを実行する。


```
from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())
```
RaspberryPIにてFlatのテンプレート設定【Cloud9編】

#■Flatのadminログイン
まだRaspberryPiにFlatがインストールされてない方は下記の記事からインストールしてみてください。
https://qiita.com/neomi/items/cd6b204b6b7c8b6313ea

>Flatのログインアドレス

http://[raspberrypi ip address:9000]
例)http://xiger.ipdisk.co.kr:9000
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/22445be7-9f75-a3fe-3401-8c26ec2d4caa.png)

>ログイン後の初期ページ

私の場合は、RaspberrｙPiの公式OSではなくDietPiのOS環境からインストールしましたので、
NameがDietPiと表示されてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/a6f5576f-f3c8-881b-6cc5-2bbd1461b156.png)

>App Templatesメニューの表示

ここで使ってみたいテンプレートを選んで必要な必須情報を設定するとすぐ使えます。
まだ細かく設定することになっていますが、いつか改善されると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/c568be94-debd-2b48-7c8c-230bfe87d989.png)

>Cloud9 ARMv8

今回はこのテンプレートの設定について説明致します。
まず基本設定情報は下記の画面通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/fdf2e89b-a315-3760-9a6b-2d296436474c.png)

※最後にCreateボタンを押下するとコンテナーが生成され、自動的に起動される状態になります。
注意事項：すでに使っているポートの場合はコンテナーが正しく起動されないです。

>Cloud9へアクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/d5517acd-90ce-1cac-d17a-0911f0575f1c.png)

※管理ページで入力したログイン情報を入力します。

>Cloud9のログイン後の初期画面

このツールがあればプログラムの編集やSSHコンソールのコマンド実行などがこの一つの画面で使うことができます。
まだCloud9の細かい機能について皆さんご自身で調べてくださくい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/98f38168-2fbf-e2d4-fc18-0d7a359921a5.png)

>Flatにてコンテナーを起動及び中止したい場合

メイン画面でConatainersメニューより表示される「Start, Stop...」ボタンから各コンテナーの制御が可能です。
今までコマンドでコンテナーを起動、削除より簡単でしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/bb0249f9-72e8-bbc9-4875-eb09bc0f02d8.png)

>該当コンテナーのイメージにコンソールでアクセスしたい場合

前回のContainersメニューより該当コンテナーイメージのNameを選びます。
そうすると下記の画面が表示されます。
この画面でConsoleテキストを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/ba464798-baf1-e9e7-5165-4dba489a1eac.png)

>コンテナーのConsole画面に接続

下記の画面が表示される場合、右側にあるConnectボタンを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/4d903b09-c6c7-e862-6d3a-cbe32425f23c.png)

>該当コンテナーのConsoleへ接続した画面

このコンソール画面より各アプリケーションパッケージをインストールすることができます。
最初は「apt-get update」コマンドを実行してからパッケージをインストールしてください。
今日はここまでです。＾＾
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/283dcbc1-3848-9ac5-ea8a-605e893a1b5e.png)

>一言

今回はFlatツールにてCloud9をインストールしてみました。
普通のRaspberryPI環境でインストールしようとするとパッケージコマンドを何回か叩いてインストールしないと行けないことが分かると思います。Flatツールではテンプレート（コンテナー）を提供しているので、簡単にできます。
皆さんもインストールしてみてください。

>公式サイト

http://flat.wednus.com/home
EclipseでSVNリポジトリ連携が何故か外れていた

###【事象】
Eclipseで、SVNリモートリポジトリからチェックアウトして、日々編集していた。

ある日Eclipseを立ち上げたら、何故かプロジェクトのSVN連携が外れていた。
当然、コミットやチーム同期化、ヒストリーの表示もできなくなっている。

###【対処】
原因は不明だが、再度連携させるため、以下を行った。
**プロジェクト右クリック
＞チーム
＞プロジェクトの共用
＞SVN
＞URLを入力してOK**

→無事、連携が元通り復活した。
wasmのRustではVec型をreturnできない

# 詰まったこと

現在個人開発しているサービスで,文字列を処理するスクリプトをwasmで書こうとしていた。

```rust
extern crate wasm_bindgen;
use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub fn text_parser(text: &str) -> Vec<String>{
    let mut formatted_text = vec![];

    // textをパースしてformatted_textに格納していく
    
    return formatted_text;
}
```

これをコンパイルしようとしたところ以下のエラーが発生

```bash
error[E0277]: the trait bound `std::boxed::Box<[std::string::String]>: wasm_bindgen::convert::IntoWasmAbi` is not satisfied
 --> src/lib.rs:4:1
  |
4 | #[wasm_bindgen]
  | ^^^^^^^^^^^^^^^ the trait `wasm_bindgen::convert::IntoWasmAbi` is not implemented for `std::boxed::Box<[std::string::String]>`
  |
  = help: the following implementations were found:
            <std::boxed::Box<[f32]> as wasm_bindgen::convert::IntoWasmAbi>
            <std::boxed::Box<[f64]> as wasm_bindgen::convert::IntoWasmAbi>
            <std::boxed::Box<[i16]> as wasm_bindgen::convert::IntoWasmAbi>
            <std::boxed::Box<[i32]> as wasm_bindgen::convert::IntoWasmAbi>
          and 9 others
  = note: required because of the requirements on the impl of `wasm_bindgen::convert::IntoWasmAbi` for `std::vec::Vec<std::string::String>`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0277`.
error: Could not compile `text_formatter`.

To learn more, run the command again with --verbose.
```

[公式のIssue](https://github.com/rustwasm/wasm-bindgen/issues/111)を見たところ、どうもwasmを使う場合返り値にVec型を指定できないらしい

# 対策

```rust
extern crate wasm_bindgen;
use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub fn text_parser(text: &str) -> String{
    let mut formatted_text = vec![];

    // textをパースしてformatted_textに格納していく
    
    return formatted_text.iter().cloned().collect::<String>();
}
```

今回は単純にStringにまとめてもJS側でどうにかできたのでStringにまとめて返り値にした。
そうは行かない場合、JSON形式にまとめてStringにしてから返り値にするなどの対策がある。

しかしなかなか面倒な処理が必要となるので、できれば早く公式の方で対応してほしいところである。
特定ディレクトリ以下のファイルを全てgit update-index --assume-unchangedするシェルスクリプト

# 概要

かなり特殊ケースだが、自分は遭遇した。

- ローカルの開発環境で本番の再現をしたい
- DB はダンプを取って FTP で持ってきた
- アップロードされている現状の画像は欲しいが FTP だと面倒なので `git clone` 時に持って行きたい
- 今後アップロードされる画像は git 管理対象にしたくない

`git update-index --assume-unchanged` については下記の記事が参考になる。

[既に git 管理しているファイルをあえて無視したい - Qiita](https://qiita.com/usamik26/items/56d0d3ba7a1300625f92)

# コード

`assume-unchanged.sh` みたいな名前で作る。

```sh
#!/bin/sh
array=(`ls -ald $(find "$1") | awk '$1 !~ /d/ {print $9 }'`)
for var in ${array[@]}
do
    var=`printf ${var}`
    echo $var
    git update-index --assume-unchanged $var
done
```

# 実行と確認

本番で画像アップロードの変更があったら下記スクリプトを実行する。
`git ls-files -v` の先頭が小文字になっていれば成功。

```shell
$ chmod 700 assume-unchanged.sh
$ ./assume-unchanged.sh ディレクトリパス
$ git ls-files -v
```
Homeateadで立ち上げたLaravel環境にsequel ProでDB接続

なんだかんだ毎月記事を投稿していて8月は何もアウトプット出来ていなかったので急ぎ足で記事を書く。。。
最近Laravelを使った開発をしていて自宅のMacにもLaravel環境を構築してDB接続にsequel proを使ったので記事に残します。

**環境構築を終えホスト設定を済ませブラウザからLaravelのトップページが表示が出来ているという前提です。**

データベースに接続するために**[Sequel pro](https://www.sequelpro.com/)**を使用します。

作成したプロジェクトディレクトリ内にある**.envファイル**を開くとDBの情報が記載されています。
[![Image from Gyazo](https://i.gyazo.com/6c5c8b884e10d39c3eb6b48925bd918c.png)](https://gyazo.com/6c5c8b884e10d39c3eb6b48925bd918c)
[![Image from Gyazo](https://i.gyazo.com/d0be3e134f96c9e573857dce0778a099.png)](https://gyazo.com/d0be3e134f96c9e573857dce0778a099)

記載されいる情報を確認しながらsequel proに必要な情報を入力すれば立ち上げている仮想環境内のDBに接続できます。

[![Image from Gyazo](https://i.gyazo.com/31183a779bba0fe5433f567f6506f535.png)](https://gyazo.com/31183a779bba0fe5433f567f6506f535)

- 名前
 - localhostやtest-laravelなど、任意に指定できます。
- ホスト
 - これはhomestead.ymlに記述してあるIPを参照すればOKです。

```homestead.yml
ip: "192.168.xxx.xxx"
```
- ユーザ名/パスワード/ポート
 - 自身の.envファイルを参照すればOKです。

```.env
DB_USERNAME=homestead
DB_PASSWORD=xxxxxx
DB_PORT=3306
```

これだけでDBへ接続できると思います。
コマンドラインからもDB情報は見れますがクライアントツールを上手く使えば見やすくなります。
git の色々

## git clone
最初の一回目でremote-repo からlocal-repoに引っ張ってくることが `git clone`　できる
`git clone` をするとoriginが自動的に作られる。
originはremote-repoの名前。git clone はコミッターが権限を持たないとcloneできない。

## fork
他人のremoteリポジトリを自分のremoteリポジトリとしてコピーする。
forkはオープンソースで使われている。例えとして、atomなどがいっぱいforkされて、pullリクエストがとばされている。

## git cloneとforkの違いについて
git cloneはgithubなどのリモートリポジトリからURLを引数としてディレクトリをとってくる。こちらはコミッター（URLを発行した人）が権限を渡さなければpushできない。少数のチーム開発に向いている。
対象的にforkはリモートリポジトリが公開されている場合、いろんな人がこのサービスいいなと思ったとする（例えばatomなど）、forkをした人はリモートリポジトリをコピーできる。そこで、新機能などを追加して元のサービスにプルリクエストをおこなう。みんなで新機能を使って盛り上げよう的な！
<img width="1235" alt="スクリーンショット 2019-08-30 15.07.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417196/2b3859f0-9837-4978-1e77-341745b8c644.png">



## git pull
git pull はfetchとmergeを実行している。
fetchとはremoteリポジトリからlocalリポジトリの間に存在する追跡リポジトリに引っ張ってこれる。

## git push 
local-repoからremote-repoにpushしている。
> git　push　[リモートリポジトリの名前]　[branchname]:[branch]

リモートリポジトリのbranchに、ローカルブランチのbranchnameをプッシュします。


```
git push origin develop:master
```
developがローカルブランチ（branchname）、masterがリモートブランチの名前。



## git marge
現在のブランチに他のブランチのコミットを吸収すること。

## git config --list
git に登録した情報一覧を表示できる。

## git rebase 
git mergeとの違いがよくわかってません。
【多項式回帰】わかるけど、多項式回帰をコードで書いてみる

# はじめに
前回に引き続き、多項式回帰なんてExcel使えば一発ですよ。という声があるかもしれませんが、Pythonで書いてみます。
使うデータは前にも使ったアボカドデータです。
https://qiita.com/iwasaki_kenichi/items/ea580fd9498ad6950a75

#変数の決定
どの変数の組合せが多項式っぽいのか探す必要があるので、seabornのpairplotで探してみます。
![１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284911/54f8487f-6047-7128-3b65-5ec201841439.png)

Xlarge BagsとTotal Bagsの組合せがなんとなく多項式っぽいので、これらの変数を利用します。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284911/9391de5f-76aa-e7af-812c-038d94c3b3b4.png)


# コード
```python:main1.py

#ライブラリインポート
%matplotlib inline
import numpy as np
from pylab import *
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats

#データ読み込み
df = pd.read_csv("hogehoge.csv")

#4次の多項式オブジェクトを生成
p4 = np.poly1d(np.polyfit(df["Total Bags"],df["XLarge Bags"],4))
#p4の中身を見てみると、
#poly1d([-1.88308599e-23,  5.57313956e-16, -4.10110799e-09,  1.79638774e-02,-3.58288426e+02])
#とあります。

#linspaceでX軸の範囲を決めています。
xp = np.linspace(0,20000000,50)

#散布図を表示させ、
plt.scatter(df["Total Bags"],df["XLarge Bags"])

#xpと、作成した多項式オブジェクトにxpを入れて多項式の回帰線を描画しています。
plt.plot(xp,p4(xp),c='r')
plt.show()

#決定係数を計算しています。
r2 = r2_score(df["XLarge Bags"],p4(df["Total Bags"]))

print(r2)
#最後は0.67でした。

```

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284911/ba353579-807a-c051-a983-d0e82dbbe5c8.png)


#　おわりに
これぐらいもササッと書けるようになりたい。
Vuetifyのv-checkboxのバグについて

# 概要
- ハマったポイントなので、メモ書きも兼ねて
- 他にもハマっている人がいれば

## 前提として
- SPAで構成しているサイト
- nuxtで実装
- vuetifyを使用

## バグの内容
- 以下のように`v-checkbox`を実装している場合
    - 別ページに遷移後、また戻ると`v-checkbox`の値が変わる

```vue
<template>
  <div>
    <v-checkbox
      v-for="option in options"
      v-model="selected"
      :value="option"
    >
      <div>{{ option.name }}</div>
    </v-checkbox>
  </div>
</template>

<script>
export default {
  props: {
    options: {
      // optionは、 { name, value } のObject
      type: Array, 
      required: true
    }
  },
  data() {
    return {
      selected: []
    }
  }
}
</script>
```

## バグの原因(未検証)
- 仮設だが、v-checkboxにバインドしている`v-model`と`value`が競合している
- 再読み込み時には、`value`が優先的に評価され、必ず`true`になる
  - 時間がある時に、コードを検証しておきます...

## 対応策
- 以下のように実装を修正
- 正直、苦肉の策
    - もっと、いい解決策があれば、教えてください

```vue
<template>
  <div >
    <!-- v-ifにより、vueの再マウントが完了するまで、非表示にする -->
    <v-checkbox
      v-for="option in checkbox_options"
      v-if="true"
      v-model="selected"
      :value="option"
    >
      <div>{{ option.name }}</div>
    </v-checkbox>
  </div>
</template>

<script>
export default {
  props: {
    options: {
      // optionは、 { name, value } のObject
      type: Array, 
      required: true
    }
  },
  data() {
    return {
      selected: [],
      checkbox_options: null
    }
  },
  updated() {
     // 更新のたびに、checkbox_optionsを再評価することで、
     // v-modelが優先して、評価される
     this.checkbox_options = this.options
  }
}
</script>
```
vagrantにMySQL5.6をインストールする方法

MySQL5.6がインストールされている開発環境を用意する必要があったのですが、
以前メモしていたMySQLのÝumレポジトリが利用できなくなっていたので対応内容を残しておきます。

``` shell
$ sudo yum install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
Loaded plugins: fastestmirror
Setting up Install Process
Cannot open: http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm. Skipping.
Error: Nothing to do
```

## 環境
vagrant OS：CentOS6.7

## 対応内容

### 公式からMySQL Yum レポジトリをダウンロードする

![MySQL Yum Repository.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157083/4f72bcbb-d3f7-c68c-3b49-7b929093e58c.png)

[こちら](https://dev.mysql.com/downloads/repo/yum/)からOSに合ったレポジトリをダウンロードします。
「Download」ボタンを押すとログインやサインインを促されますが、
下の方にある「No thanks, just start my download.」をクリックすればダウンロードできます。

```
$ sudo rpm -Uvh mysql80-community-release-el6-3.noarch.rpm
warning: mysql80-community-release-el6-3.noarch.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
Preparing...                ########################################### [100%]
   1:mysql80-community-relea########################################### [100%]
```

### レポジトリを指定してMySQLをインストールする

このままMySQLをインストールしようとするとMySQL8.0がインストールされてしまいます。
今回はMySQL5.6が必要なので、レポジトリを指定してMySQLをインストールします

``` shell
sudo yum install --disablerepo=mysql80-community --enablerepo=mysql56-community mysql mysql-devel mysql-server mysql-utilities
```

### バージョンを確認する

```
$ mysqld --version
mysqld  Ver 5.6.45 for Linux on x86_64 (MySQL Community Server (GPL))
```
無事にMySQL5.6がインストールできました。

## 参考サイト
[A Quick Guide to Using the MySQL Yum Repository](https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/)
[CentOS6 or 7にMySQL5.6 or 5.7のインストール](https://qiita.com/Esfahan/items/83200c64de8d826677b5)
【Tips】Hamlでマークダウン記法のフィルターを使用するときのエラーへの対処

# 問題
Hamlでは[マークダウン記法が使用可能](https://qiita.com/yukimura1227/items/a1cbf65ac9abd4d138e1#%E3%83%9E%E3%83%BC%E3%82%AF%E3%83%80%E3%82%A6%E3%83%B3%E8%A8%98%E6%B3%95%E3%82%92%E4%BD%BF%E3%81%84%E3%81%9F%E3%81%84%E3%81%AA%E3%82%93%E3%81%A6%E3%82%8F%E3%81%8C%E3%81%BE%E3%81%BE%E3%81%AAmarkdown%E3%81%A7%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99)であるがエラーにより変換できない場合がある。
## 入力
```haml:markdown.haml
!!!
%html
    %body
        :markdown
            - ぺ
            - ぽ
```
```sh:shell
haml markdown.haml markdown.html
```

## 出力
```sh:shell
Haml error on line 324: "markdown" filter's pandoc-ruby dependency missing: try installing it or adding it to your Gemfile
  Use --trace for backtrace.

```

#環境
- Lubuntu 18.04LTS
    * anyenv
        * rbenv 1.1.1-39-g59785f6
          + ruby 2.4.5p335 (2018-10-18 revision 65137) [x86_64-linux]
              - gem 2.6.14.3
                  * Haml 5.0.4

# 原因
Haml系ライブラリ（gem）の他に別途マークダウンを使うためのライブラリをインストールする必要がある。

# 解決方法
マークダウンを扱うライブラリのインストール。
エラーメッセージではpandoc-rubyを推奨されるが、今回は[このQ&A](https://stackoverflow.com/questions/43484053/no-such-file-or-directory-pandoc-when-trying-to-use-markdown-filter-in-haml)に習いkramdownをインストールした。

## 入力
```sh:shell
gem install kramdown
haml markdown.haml markdown.html
```

## 出力
```html:makdown.html
<!DOCTYPE html>
<html>
<body>
<ul>
  <li>ぺ</li>
  <li>ぽ</li>
</ul>
</body>
</html>

```

# 参考文献
- [決定版!!Haml小技まとめ！！](https://qiita.com/yukimura1227/items/a1cbf65ac9abd4d138e1)
- [‘No such file or directory - pandoc’ when trying to use :markdown filter in haml-rails](https://stackoverflow.com/questions/43484053/no-such-file-or-directory-pandoc-when-trying-to-use-markdown-filter-in-haml)
【俺得】Apache基本コマンド①

#apache の基本
##ディレクトリ構成
/etc/httpd/・・・サーバルート
/etc/httpd/conf・・・各種configディレクトリ
/etc/httpd/conf.d/・・・外部configディレクトリ
/etc/httpd/logs/・・・ログディレクトリ
/var/www/html/・・・ドキュメントルート(静的コンテンツディレクトリ)

##初期設定ファイル
###httpd.conf
■場所
/etc/httpd/conf/

■内容(抜粋)

```
Listen 80
```
⇒リッスンポートの指定

```
IncludeOptional conf.d/*.conf
```
⇒外部configの読み込み

###welcome.conf
■場所
/etc/httpd/conf.d/

■内容

```
<LocationMatch "^/+$">
    Options -Indexes
    ErrorDocument 403 /.noindex.html
</LocationMatch>
```

⇒http://xxx/ or http://xxx// or http://xxx///の場合
　ディレクトリインデックス画面を無効果(ブラウザへディレクトリ構成表示しない)　
　httpステータス　403になる為、/.noindex.htmlを表示する

```
<Directory /usr/share/httpd/noindex>
    AllowOverride None
    Require all granted
</Directory>
```
⇒/usr/share/httpd/noindexに対して
　noindex以下で個別の設定変更することはできません。
　/usr/share/httpd/noindexに対して全アクセス拒否
　
※参考URL
http://www.hizlab.net/app/apache.html

https://7me.oji.0j0.jp/2016/apache24-require-order.html

```
Alias /.noindex.html /usr/share/httpd/noindex/index.html
```
⇒/.noindex.htmlを/usr/share/httpd/noindex/index.htmlへと読み替える。
【Mac】ファイルリストになっているものを階層をそのままにダウンロードする方法

# 使い所
Mac の Terminal で curl を使ってダウンロードします。
ダウンロードしたい画像がたくさんある時に重宝します。
Windows 使ってた時は [Irvine](https://forest.watch.impress.co.jp/library/software/irvine/) でダウンロードしてきてたんですけど、macになかったのでこの方法で行なっています。

- 開発環境にファイル一式ないけど、勝手に取ってきて...！とか言われた時に。
- 本番にはあるけど、開発環境で画像のリンク切れとかで、chromeのconsoleとか見ると、404がリストででるので、それを一気にダウンロードしたりしたいとき


# まずは取得したいファイルのURLリストが必要です
例えばこのようなファイルリストがあるとします

```
https://www.hoge.jp/img/movie/a.png
https://www.hoge.jp/img/music/b.jpg
https://www.hoge.jp/img/technology/c.jpg
・
・
・
```

コレらをまとめてダウンロードをするという用途です。

# curlコマンドとは？
さまざまなプロトコルに対応したデータを転送するためのコマンド。アップロードやダウンロードができるコマンド。

# 手順
## Terminal でファイルを集めたいフォルダに `cd` します

ex.)

```
cd /Users/ユーザー名/ダウンロードして集めたいフォルダ
```
## リストを curl でコマンドを作り Terminal で実行

以下のようなコマンドです。

```
curl --create-dirs -o img/movie/a.png https://www.hoge.jp/img/movie/a.png
curl --create-dirs -o img/music/b.jpg https://www.hoge.jp/img/music/b.jpg
curl --create-dirs -o img/technology/c.jpg https://www.hoge.jp/img/technology/c.jpg
・
・
・
```

実行すると以下のような構造でダウンロードができます。

```
/Users/ユーザー名/ダウンロードして集めたいフォルダ/img/movie/a.png
/Users/ユーザー名/ダウンロードして集めたいフォルダ/img/music/b.jpg
/Users/ユーザー名/ダウンロードして集めたいフォルダ/img/technology/c.jpg
```


### curl コマンドのオプションについて補足
さまざまなオプションがありますが上記で使っているものだけ補足

- `-o ファイル名` 保存するファイル名
- `--create-dirs -o ディレクトリ名/ファイル名` 「-o」でディレクトリを指定した際、そのディレクトリがない場合は作成する

## Tips

私の場合はエクセルでこのようなリストを作って、

<img width="1110" alt="Book1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94035/02b75112-da09-d267-fb4a-5d63854ad734.png">


範囲コピってエディタに貼り付けて、 `¥t` (`\t` だったり) 正規表現置換でタブスペースを取り除いてリストを作成します。
このリストを作るのが多少面倒っちゃ面倒なんですが、100ファイルくらい持ってくる必要がある時はリストを作る方が早いので。
【備忘録】仮想マシンの立ち上げ方

## 仮想マシンの構築

### 用意するもの
- [VirtualBox(公式サイト)](https://www.virtualbox.org/wiki/Downloads)
- [Vagrant(公式サイト)](https://www.vagrantup.com/)
- [PuTTY(公式サイト)](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)

それぞれOSにあったものをインストールする。
今回はWindows10で構築。

### 手順
1. 上記でダウンロードしたものをそれぞれインストール
2. 今後仮想マシンの管理がし易いようにC:\に"Vagrant"フォルダを作成
3. 中に練習用に"MyCentOS"を作成
4. 作ったディレクトリに移動
5. 仮想マシン設定用のVagrantfileを作る
6. Vagrantfileを編集してローカルのIPアドレスを指定
      
    >  # Create a private network, which allows host-only >> access to the machine
    >  # using a specific IP.
    >  config.vm.network "private_network", ip:"192.168.33.10" ← *ここのコメントアウトをはずす*

7. 仮想マシンを起動(めっちゃ時間かかる。30分くらいかかった)
8. 仮想マシンのステータスを確認(running(virtualbox)と出ていればOK) 
9. PuTTYを起動。最初の画面でVagrantfileに記載されているipを入力してあげる。
10. 接続を信頼しますか？的な英語のメッセージボックスが出てくるのでYesを押す。
11. User/Passともに"vagrant"と入力*(passwordは入力中表示されないので注意)*

以下使ったコマンド

```
mkdir Vagrant

# MyVagrantに移動する
cd Vagrant

# 仮想マシンを作るフォルダを作る（MyCentOS）
mkdir MyCentOS

# MyCentOSに移動する
cd MyCentOS

# 仮想マシン設定用のVagrantfileを作る
vagrant init bento/centos-6.8

# Vagrantfileを編集して仮想マシンのIPアドレスを192.168.33.10にする

# 仮想マシンを起動する（少し時間かかります）
vagrant up

# 仮想マシンの状態を確認する
vagrant status

```

### 参照
[ドットインストール](https://dotinstall.com/lessons)
　→ ローカル環境の構築
文字列(N個)を表示させる

# input関数を使って、文字列をN個表示させてみる

python3で、input関数を使用し、入力した数字分だけ文字列"ABC"を出力したいと思います。

## コード例

```py
x = input()
y = int(x)
print("ABC" * y)
```

##コードの解釈

`x = input()`
変数xに、input関数により入力された文字を代入

`y = int(x)`
input関数で得られた文字は、str型なので、int型に変換し、変数yに代入

`print("ABC" * y)`
文字列"ABC"を、input関数により入力された数だけ表示させる



## 最後に

pythonを触り始めたばかりなので、記載内容に間違いがある場合は、ご指摘ください。
Slack のユーザー名は unique ではない

（この記事は私の blog の http://umezawa.dyndns.info/wordpress/?p=7354 の転載です）


今 Slack API と格闘している間に気が付いて驚いたのでせっかくだから投稿するんですが、 Slack のユーザー名（ @ の後ろの文字列）は同一ワークスペース内ですら unique ではない（重複が許される）んですね。（昔は unique だったぽい）

![slack-nonunique-username.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395443/959e9902-c13d-8bce-c736-39f97b0e91dc.png)

上は自分用ワークスペースでユーザーは自分しかいないので bot と重複させてます。別のパブリックなワークスペースで他人と重複させてみましたが、これまた何も言われません。（どうかと思ったのでスクショはやめておきます）

ユーザー名を渡すとユーザーID（こちらはホントに unique な文字列）を返す API がなくて、それをやりたかったら[全ユーザーのリストを取って自分で検索しろ](https://api.slack.com/changelog/2017-09-the-one-about-usernames#mapping)と書いてあるのが不思議だったのですが、そういうことなんですね（ていうかこのページに unique ではないって書いてあった）。せめて該当するユーザーをリストで返してくれるAPIでもあればレスポンスが短くていいんですが。
Vuforia Model Targetを試してみた

Vuforia で Model Targetが使用可能になっていたので試してみました。
（というだけの記事です）



## 手順
（１）Unity の Asset store　から Vuforia Core Sample のアセットをインポートする。![スクリーンショット (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200421/4a76f40e-f638-e224-a585-5cfadded1dd6.png)


(2)インポートしたらUnity の
Assets/SampleResources/Scenesを開くいて3-ModelTargetsTrainedを選択。
![スクリーンショット (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200421/3fbeebe0-feb1-9895-8581-4f9b3d8d043f.png)


(3)あとはBuild Settings　-> Player Settingsの設定をする。
Company Name と　Product Name を入力.
Other Setting の Package Name も適宜変更。

あとは　XR Settings -> Vuforia Augmented Reality のチェックボックスにチェックを入れる。

だけです。

![スクリーンショット (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200421/a27083f5-cc1e-c1f2-ae52-0dc1581945da.png)


これで再生を押して、皆さんの手元にある Marse Lander の画像(本当はプラモ的なもの)を認識するとモデルが表示されます（動画のような認識ができる。）
3Dモデルがあれば学習してそれを認識できるようになるらしいのでそれも時間があれば試してみます。

参考ページ:
[Vuforia Model Target](https://library.vuforia.com/features/objects/model-targets.html)
AWS SageMakerからathenaにクエリを出し、pandas DataFrameにデータを格納する

# 3行で
・SageMakerのノートブックインスタンスからathenaにあるDBにアクセスし、データを作りたい
・pyathenaという便利なモジュールがある
https://pypi.org/project/PyAthena/

# モチベーション
SageMakerのノートブックは環境構築の手間が軽く済んでとても便利。AWS内だから他のサービスとも連携しやすい。
通常、大きいデータはS3なりRedshiftにあると思われるので、SageMakerで学習を行うなら、SageMakerからそれらにアクセスする必要がある。
S3にあるデータを使って特徴量エンジニアリングをするには、特にメモリに乗るかどうかぐらいの大きなデータの場合、一旦athenaに取り込んでSQLベースでデータを作る方法も選択肢になる。
SageMakerのノートブックからathenaにクエリを出し、クエリ結果をpandasのDFとして受け取るにはどうしたらいいだろうか。

# 結論
まず、ノートブックインスタンスのIAM ロールにathenaへのアクセス権をあげましょう。
アクセス権をあげた上で、SageMakerのノートブックに書くべきサンプルコードは以下

```python:
from pyathena import connect
import pandas as pd
import boto3

#set parameter
session = boto3.Session(profile_name=None)
REGION = session.region_name
ATHENA_STAGING = 'your_bucket'

#make connection
conn = connect(s3_staging_dir=ATHENA_STAGING,
               region_name=REGION)
query = """
SELECT * 
FROM YourDatabase.YourTable 
LIMIT 8;
"""

#query
df = pd.read_sql(query, conn)
```

set parameterのブロックは、connectに渡すパラメータを設定するパート
別にこのやり方でなくても、`REGION`なんてハードコーディングでもいいと思います。
your_bucketにはathenaのQuery result locationが入ります。
athenaのコンソールのsettings -> Query result locationにs3://~~~　のURIが入ってますんでそれです。


queryにはクエリするSQL文が入ります。
こんな感じで一度文字列変数に代入すると、コードが見やすくなります。
athenaのクエリエディタで文法レベルの書き間違いがないか確認してからSageMakerで使うとデバッグが速く進むでしょう。


# 用例
ここまでやると、SageMakerのノートブックから好き放題クエリ投げられます。
前の記事で紹介したhash値を使ったtrain/test splitもよし
特徴量選択のために、カテゴリカルな特徴量に集計関数を使って各カテゴリーごとの推論対象との相関をみるもよし。
それは例えばこんな感じのquery生成用関数を作るととても捗る。

```python:
def get_distinct_query(column_name):
  sql = """
SELECT
  {0},
  COUNT(1) AS count,
  AVG(target) AS avg
FROM
  YourDatabase.YourTable
WHERE
  MOD(ABS(FROM_BIG_ENDIAN_64(XXHASH64(TO_UTF8(<your_key>)))),10) < 1
GROUP BY
  {0}
ORDER BY {0} ASC
  """.format(column_name)
  return sql
```

ま、pandasだけでできる場合もあるけどね！
ビッグなデータにご用心。

# 参考文献
pyathena
https://pypi.org/project/PyAthena/

GCPを使った機械学習のcourseraの講義資料
https://github.com/GoogleCloudPlatform/training-data-analyst/blob/master/courses/machine_learning/deepdive/06_structured/1_explore.ipynb
form_withの備忘録

form_withはform_tag,form_forに取って変わられる存在。

form_withの基本は

```ruby:html
<% form_with model: @model url: items_path,method: :post do |form| %>
  <% form.text_field :name,id="hoge" %>
  <% form.submit type: "hidden" %>
<% end %>
```
多分こんな感じ
`formの部分のidとclassは自動付与。しかし、text_fieldの部分は手動で付与しなければならない`

`defaultでajax通信を行う使用。(remote: true)
なので、ajaxを使用しない時にはlocal: trueにしとく`

`別にmodelがいらない通信ならmodel optionを抜いてもいいし、model: modelの書き方でもok`

paramsはこんな感じ

```ruby:controller
<ActionController::Parameters {"utf8"=>"✓", "model"=>{"name"=>"22"}}>
```

modelインスタンスの中に入っている入れ子構造になる。paramsに直で入れるならインスタンス指定なして飛ばすといいかと。