OmniAICreator/Qiita-1.07M huggingface dataset:
【Git】Windows環境でGitHubにSSH接続してコミットするまでの手順

## 前提条件

 1. WindowsにGitがインストール済みである  
 2. GitHubのアカウントが作成済みである

## GitHubでリポジトリを作成する

GitHubにログインし、RepositoriesのNewボタンから新規リポジトリを作成できます。
本記事では具体的な作業は省略します。

コミット履歴が空の新規リポジトリが作成できてればOKです。

![20190325_0001.jpg](https://qiita-image-store.s3.amazonaws.com/0/87039/863aa196-787a-848a-56f7-654d89bc23cf.jpeg)

## Gitの初期設定をする

### メールアドレス、ユーザ名を設定する
WindowsにGitをインストールしたら最初にメールアドレスやユーザネームの設定をしておくことをおすすめします。
既に設定済みの場合は飛ばしてもらって大丈夫です。

注意：以降の操作はコマンドプロンプトではなくGit Bashです

```bash
git config --global user.name "ユーザー名"
git config --global user.email "メールアドレス"
git config --global core.quotepath false #日本語ファイル名がエスケープされないように
```

### gitconfigファイルが生成されていることを確認する

上記の設定を行うと、ユーザのホームディレクトリに.gitconfigファイルが生成されます。

```bash
cd ~
ls -la | grep .gitconfig
```

##  秘密鍵と公開鍵を作成する

ユーザのホームディレクトリに.sshディレクトリを作成します。
そして、.sshディレクトリの中に秘密鍵と公開鍵を生成します。
鍵に紐づくパスフレーズを設定しますが、あとで必要になるので忘れないようにしてください。

```bash
mkdir ~/.ssh
cd ~/.ssh
ssh-keygen -t rsa -C 'hoge@mail.com'
#keyを作成するか聞かれるのでEnter
#パスフレーズを入力
#パスフレーズを再入力
```

## GitHubに公開鍵を設定する

生成した公開鍵(rsa.pub)をテキストエディタで開き、中身を全てコピーします。
GitHubにアクセスし、下記の手順通りに公開鍵を登録します。

1. GitHubにログインし、右上のメニューから Settings を選択
2. SSH and GPG keys を選択
3. New SSH Keyを押下
4. Title(自由)、Key(コピーした内容をペースト)を入力して Add SSH keyを押下

以上でSSH接続の設定が完了です！

## クローンからプッシュまで

### リポジトリをクローンする  

GitHubに作成したリポジトリのページを開き、下記画像の赤枠内の部分をコピーしてください。
![20190325_0003.jpg](https://qiita-image-store.s3.amazonaws.com/0/87039/7f201a5e-1b2a-e84e-475c-863b31956dd7.jpeg)

下記の通り、コマンドを実行してリポジトリをローカルにクローンします。

```bash
cd d:/develop #クローン先のディレクトリに移動
git clone git@github.com:[UserName]/[Repository].git	#←コピーしたやつ
Are you sure you want to continue connecting (yes/no)?	#yesを入力
Enter passphrase for key '/c/Users/hoge/.ssh/id_rsa':	#key作成時に設定したパスフレーズを入力
```

クローンが完了しているか確認します。
正しく完了していればリポジトリ名のディレクトリが作成されます。

### 開発用ブランチを作成する

通常、直接Masterブランチにコミットをすることは無いため、ローカルで開発用のブランチを作成して、GitHubにプッシュします。

#### 新規ブランチを作成する

リポジトリ名のディレクトリの中に移動して、開発用のブランチを作成します。
ブランチ名は何でもいいのですが、ここでは`develop`とします。

```bash
$ cd Practice

$ git checkout -b develop		#開発用のブランチを作成
Switched to a new branch 'develop'
```

#### 管理対象のファイルを配置する

リポジトリ名のディレクトリの中に、バージョン管理したいファイルを配置します。

```bash
$ ls -l
total 1
-rw-r--r-- 1 user 197121 382 3月  25 22:41 index.html #管理したいファイルを配置
```

### ファイルをステージングする

続いて、配置したファイルをステージングします。

```bash
$ git add index.html	#追加したファイルをステージング
```

### ローカルリポジトリにコミットする

続いて、ローカルリポジトリにコミットします。
コミットメッセージは何でもいいです。

```bash
$ git commit -m "first commit"	#コミット
[develop (root-commit) 81de264] first commit
 1 file changed, 14 insertions(+)
 create mode 100644 index.html
```

### GitHubにプッシュする

下記コマンドでGitHubにプッシュします。

```bash
$ git push -u origin develop

#なんやかんや表示される

 * [new branch]      develop -> develop
Branch 'develop' set up to track remote branch 'develop' from 'origin'.　#プッシュ完了
```

## GitHubにコミットが完了

GitHubにアクセスし、コミットされたことを確認します。

![20190325_0005.jpg](https://qiita-image-store.s3.amazonaws.com/0/87039/5f9beb3c-da2f-2a3a-7c5b-75af092f039d.jpeg)
minicondaによるpython開発環境をubuntuで速攻立ち上げする


しょっちゅうやってるのでメモ代わりにまとめます

#インストール&ダウンロード
Dockerコンテナとかあまり余分なものは入ってない環境の場合以下のものが入ってないことがあるので全部インストール

```
sudo apt install bzip2
sudo apt install wget
sudo apt install git
```
以下でダウンロード＆インストール
.bashrcに環境変数を書き込むのでsourc .bashrcを```source```必要があります

```
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash ./Miniconda3-latest-Linux-x86_64.sh 
source ~/.bashrc
```

root権限なしでもインストールできるのが嬉しいところですね

```
$ conda -V
conda 4.5.12
```

こんな感じで出てくればOKです
AutoLISP リスト操作いろいろ

## リストを調べる
### 指定要素と同じ要素がリスト内に存在するか調べる

```scheme
(defun list:Contains (lst e) (if (member e lst) T))
;; < Example >
;; (list:Contains '("A" "B" "C" "D" "E" "F") "C")
;; -> T
```
### 指定要素と同じ要素がリスト内に存在しないか調べる

```scheme
(defun list:!Contains (lst e) (null (member e lst)))
;; < Example >
;; (list:!Contains '("A" "B" "C" "D" "E" "F") "C")
;; -> nil
```
### リスト内の指定要素の数を数える

```scheme
(defun list:Count (lst e)
	(cond ((null (member e lst)) 0)
		  (T (+ 1 (list:Count (cdr (member e lst)) e)))
	)
)
;; < Example >
;; (list:Count '(0 1 2 3 4 5 6 7 8 9 2) 2)
;; -> 2
```
### リストに含まれる指定要素の位置(インデックス番号)を取得

```scheme
(defun list:IndexOf (lst e)
	(if (member e lst)
		(- (length lst) (length (member e lst)))
	)
)
;; < Example >
;; (list:IndexOf "D" '("A" "B" "C" "D" "A" "E" "F"))
;; -> 3
```

## リストを作成
### 同じ要素のリストを作成

```scheme
(defun list:SameElements (n e / lst) (repeat n (setq lst (cons e lst))))
;; < Example >
;; (list:SameElements 10 0)
;; -> (0 0 0 0 0 0 0 0 0 0)
```

## リストを編集
### リストから重複した要素を除去

```scheme
(defun list:Distinct (lst)
    (if lst (cons (car lst) (list:Distinct (vl-remove (car lst) lst))))
)
;; < Example >
;; (list:Distinct '("A" "B" "C" "D" "A" "E" "F"))
;; -> ("A" "B" "C" "D" "E" "F")
```
### リストから nil を除去

```scheme
(defun list:RemoveNil (lst) (vl-remove-if 'null lst))
```
### リストの最後に要素を追加

```scheme
(defun list:AddLast (lst e) (append lst (list e)))
```
### リストの始めと最後に値を追加

```scheme
(defun list:AddHeadAndLast (lst s e) (append (cons s lst) (list e)))
```
### リストの最後から2番目の値を取得

```scheme
(defun list:GetLast2 (lst) (last (reverse (cdr (reverse lst)))))
;; < Example >
;; (list:GetLast2 '("A" "B" "C" "D" "E"))
;; -> "D"
```
### リストの最後を除去する

```scheme
(defun list:RemoveLast (lst) (reverse (cdr (reverse lst))))
```
### リストの n 番目の要素以外を返す

```scheme
(defun list:!Nth (lst n)
    (if (and lst (< 0 n)) 
        (cons (car lst) (list:!Nth (cdr lst) (1- n))) (cdr lst)
    )
)
;; < Example >
;; (list:!Nth '("A" "B" "C" "D" "E") 2)
;; -> ("A" "B" "D" "E")
```
### リストの先頭から指定要素数を返す

```scheme
(defun list:Take (lst n)
	(if (and lst (< 0 n)) (cons (car lst) (list:Take (cdr lst) (1- n))))
)
;; < Example >
;; (list:Take '("A" "B" "C" "D" "E") 2)
;; -> ("A" "B")
```
### リストの先頭から指定要素数を除去

```scheme
(defun list:Skip (lst n)
	(if (and l (< 0 n)) (list:Skip (cdr lst) (1- n)) lst)
)
;; < Example >
;; (list:Skip '("A" "B" "C" "D" "E") 2)
;; -> ("C" "D" "E")
```
### リストの順番を回転

```scheme
(defun list:Rotation (lst n) ;; n - 回転数
    (cond
	    ;; 正の整数 - 左回転
	    ((< 0 n) 
            (repeat n (setq lst (list:AddLast (cdr lst) (car l)))))
	    ;; 負の整数 - 右回転
	    ((> 0 n) 
             (repeat (abs n) (setq lst (cons (last lst) (list:RemoveLast lst)))))
	    ;; それ以外はそのまま返す
	    (T lst)
    )
)
;; < Example >
;; (list:Rotation '("A" "B" "C" "D" "E") 2)
;; -> ("C" "D" "E" "A" "B")
;; (list:Rotation '("A" "B" "C" "D" "E") -2)
;; -> ("D" "E" "A" "B" "C")
```
Live2DとUnityの連携でつまづいたこと

# Live2DとUnityの連携でつまづいた
初投稿してみます。

Live2DSDKをUnityで使用したプログラムをgitで共有したら、おかしなことになりました。
Prefabの参照が外れて動かない。。。
自分の環境では大丈夫。なんでじゃ。。

とりあえず回避したので、自分用のメモとして。
もし他に同じような現象の方がいたらその助けになればと思います。
また、突貫工事なので、正しいやり方知っている人いたら、教えてください。。

## 使用バージョン
Live2D CubismSDK3 R10　[ダウンロードページ](https://live2d.github.io/#unity)
Unity2018.3.3f1

## 何が起きたか
Live2Dで作ったモデルを、Unityにインポートして、タップすると、タップするところをみるだとか、よくあるようなプログラムを作りました。

で、共有のためにgitにあげたんですが、なんと、Prefabの参照が外れている。。。
PrefabもApplyしたし、Sceneも保存した。。metaファイルもちゃんとあげてる。
どないなっとんねん。
Unity2018.3のPrefabの仕様更新で、動きが変わった。。？？とか、いろいろ調査してみましたが、どうもワークフローは変わらないっぽい。。

## 回避策

**CubismAssetProcessorのOnPostprocessAllAssets内の処理をコメントアウトする** 

ということで、いろいろ調べた結果、
Live2DのCubismAssetProcessorが原因でした。
このクラスで、UnityのAssetインポートが行われるときに、Live2Dのインポートも行われるのですが、ここでPrefabを作り直すらしく、GUIDが変わってしまうようです。

そのため、gitで共有したとしても、プロジェクトの初回起動のアセットインポート時に、Live2Dの処理が走って、

PrefabのIDが更新される -> シーンから参照が外れる

といったことになってしまうようです。

CuvismAssetProcessorのOnPostprocessAllAssetsというメソッドで、インポート処理を行なっているので、そこをコメントアウトして、回避しました。

ただ、Live2Dのインポート処理自体行われないので、Live2D側で更新が入った場合は、一旦コメントアウトを外して、インポートして、もう一度コメントアウト。。。
という面倒なことに。。。。


確実にいい回避策ではない。。。。
でも、回避はできる。。。
そして記事を書くってむずかしいな。。
もっとうまく書きたい。
プログラミング学習記録38〜なんとかCloud9で再現できました〜

##今日やったこと
- Progate Railsのレッスンで作ったアプリをCloud9で再現する（やった終わった）

やっと終わりました。

途中わけのわからないエラーで動かなくなって、環境構築からやり直したり、データベースがおかしくなったり、アプリ内の時間が日本時間になってなかったり、ユーザーのデフォルト画像に設定した画像が読み込まなかったり、、、

とにかく色々ありましたが、なんとかトップページと概要ページの画像以外の部分はCloud9で再現することができました。

とは言っても、まだまだRubyやRailsの理解はまだまだです。

よくわからないまま写経している部分も少しあります。

ただ、環境構築からやってみることで、これから嫌でも戦っていかなければならないエラーに向き合ったことは一つの自信になりました。

ターミナルで`$ rails new アプリ名`のコマンドを打つと色々なファイルが入ったフォルダが作られ、

「こんなにいじるものがあるのか、、、、」

と最初は絶望しましたが、実際はそこまでいじるものは多くないということがわかったのも大きいです。

ルーティング、コントローラ、ビュー、モデル、データベース、stylesheet、Gemfileくらいです。

少なくともProgateでやったものに関しては、以上の部分をいじるだけで作れます。

このことを実際に手を動かしてみて実感できたのは、本当によかったです。

<br>
明日は今日Cloud9で再現したアプリをHerokuでデプロイしてみた後、オリジナルアプリ制作に入りたいと思います。

Progateで作ったアプリにはユーザー削除機能がなかったので、ユーザー削除機能を付けれたらいいなと思います。

ということで、明日からも引き続きプログラミング学習頑張ります。

おわり
renderとredirect_toの違いについて

#はじめに
アプリ開発中に、この違いが理解出来ておらず、はまってしまったのでしっくり来たものを参考にまとめてみた。
##render
コントローラーのアクションを実行した結果、何らかの`view`が決定され、レンダリングされる。
`view`は以下の2通りで決まる。
- アクションで指定しない場合、規約に従ってリソース名やアクション名を元に表示する`view`が決まる。
- `render`で明示的に指定すると、指定した`view`が表示される。


<strong>イメージ図</strong>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/285114/fa70238b-2dee-a2e2-90f1-d08f049fbe77.png)

##redirect_to
`redirect_to`は、`view`の表示には直接は関係なく、新たな`HTTPリクエスト`が発行される。（下図の4番※GETのみ）新たなリクエストが発行された後は下図の5番以降で`render`の図の2番以降と同じ。つまり表示自体はこちらも最終は`render`。

<strong>イメージ図</strong>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/285114/1d785cac-1774-795b-4bba-b7fc10f967a6.png)

##個人的に重要だと思うpoint
- `render`だと`view`にいくので、インスタンス変数を<strong>定義し直せない</strong>点。
- `redirect_to`を使った場合は再度リクエストを送るので、コントローラを経由する。つまりインスタンス変数を再度<strong>定義し直せる</strong>点。

##参考
render と redirect の違い
https://qiita.com/january108/items/54143581ab1f03deefa1
Rails環境でwebpack-dev-serverのHot Module Replacementをdocker-composeで使えるようにする

Hot Module Replacementについて詳しくは[こちら](https://qiita.com/haradakunihiko/items/40486ec2b6b9aea119bb)で。

自分はRails 5.2.1の環境で使いたかったので設定してみました。
まずは、`config/webpacker.yml`の`dev_server`の`hmr`の部分を`true`にします。

```config/webpacker.yml
〜（略）〜
development:
  <<: *default
  compile: true

  # Reference: https://webpack.js.org/configuration/dev-server/
  dev_server:
    https: false
    host: localhost
    port: 3035
    public: localhost:3035
    hmr: true # ここ
    # Inline should be set to true if using HMR
    inline: true
    overlay: true
    compress: true
    disable_host_check: true
    use_local_ip: false
    quiet: false
    headers:
      'Access-Control-Allow-Origin': '*'
    watch_options:
      ignored: /node_modules/
〜（略）〜
```

`docker-compose.yml`での対象のホスト名を環境変数で指定して、ポートが通るようにする。

```docker-compose.yml
version: '3'
services:
  web:
    build: .
    command: foreman start
    volumes:
      - .:/app
    environment:
      - DOCKER_DB_HOST=db
      - WEBPACKER_DEV_SERVER_HOST=web # ここ(servicesで指定している名前を設定する)

    ports:
      - "3000:3000"
      - "3035:3035" # ここ
    depends_on:
      - db
〜(略)〜
```

起動で[Foreman](https://github.com/ddollar/foreman)使っているので`Procfile`に`webpack-dev-server`の分を追加。

```Procfile
web: bin/rails s -p 3000 -b '0.0.0.0'
webpack-dev-server: bin/webpack-dev-server <- 追加
```

あとは起動するだけ。

```
docker-compose up -d
```
[Rails] 我初心者、foreign_keyの定義がわからなかったので自分なりに噛み砕いてみた

# 目標
`has_many`の関連付けを作成するときに、
どちらのモデルに対して`foreign_key`を指定するべきか
わからず調べたものの、その説明すらわかりにくかったので
自分なりの解釈を載せていこうと考えた。。

# 疑問
今、`User has_many cups`という関係を作りたいとする。

[モデルの関係]
<b>User</b>
↓
↓  has_many
↓
<b>Cup</b>

// Cupとはコーヒーカップのことでここでは「コーヒー」という意味
// User has_many cupsってお前一日に何杯飲むねんって感じだけど。。

<br>

この場合、`User`と`Cup`、どっちのマイグレーションファイルに
`foreign_key`を記載すればいいの？

そもそも`foreign_key`ってなんなのかわかってないなあ。調べよ


# foreign_keyとは？（わかりにくい）

```ruby:foreign_key
参照先を参照するための外部キーの名前を指定するもの
```

※以下より引用
http://railsdoc.com/references/belongs_to


わかりづれ〜〜〜（＾ー；）


`参照先を参照する`って、
`has_many`で参照する場合を示すのか、
`belongs_to`で参照する場合を示すのか
どっちよこれ。。




# 改めてforeign_keyとは？（わかりやすい）
ズバリ言うと（結果論）、この文脈においては<b>`belongs_to`で参照する場合を示す。</b>

従って、先ほどの文は

```ruby:foreign_key
（belongs_toによって）参照先を参照するための外部キーの名前を指定するもの
```

という解釈になる。

加えて、`相手（参照先）の外部キーの名前を指定するもの`ってことだから、
それは`belongs_toを行う側に記述しなければいけない`ってことも読み取れる。

よって、この文は

```ruby:foreign_key
belongs_toで参照する相手（参照先）の外部キーを指定するために、
belongs_toを行う側に記述しなければならないもの
```

と解釈できる。


# マイグレでforeign_keyを指定する際の注意点
マイグレーションファイルの作成時に、
`foreign_key`の指定をするコードには、

```ruby:
  def change
    create_table AAAA do |t|
       t.references BBBB, foreign_key: true
    end
  end
```

とか

```ruby:
  def change
    add_reference AAAA, BBBB, foreign_key: true
  end
```

という形をとるものがあり、どちらも

```
テーブルAAAAに、　モデルBBBBのforeign_key(= BBBB_id)　を追加する
```

と解釈される。

しかしこれだと、この`BBBB_id`を追加したものの、
それを`has_many`で参照するのか、
`belongs_to`で参照するのかって話になる。

<br>

先ほどの`foreign_key`の話に戻すと、
`foreign_keyは、belongs_toを行う側に記述しなければならないもの`であった。

上記のコードでは、`create_table AAAA`という記載から
<b>AAAAというテーブルにBBBBへのforeign_keyを指定する</b>
という意味になるので、


```ruby:
AAAA belongs_to BBBB
```

という関係になっていることがわかる。

そしてこれは

```ruby:
BBBB has_many AAAA
```
という関係でもある。（has_manyの場合は）


# 結論
つまり、`BBBB has_many AAAA`という関連付けをしたい場合、
<b>`foreign_key`は`AAAA`に指定しなければいけない</b>ということ。
（正確に言うと、`AAAAのテーブルを編集するマイグレファイルに記述しなければならない`）
<br>
理由は（くどいが）、`foreign_key`は<b>belongs_toで参照を行う側に記述しなければならない</b>ため、
上記関連付けを`AAAA belongs_to BBBB`という形に直したときに、
`belongs_to`を行っているのは`AAAA`なので、`AAAA`側に記述する。

<br>

# ちなみに（追記）
`foreign_key`を記述して`rails db:migrate`をすると、
`foreign_key`を記述した側の`モデル.rb`に自動的に`belongs_to`が記述されます。
（`has_many`に関してはもう片方の`モデル.rb`に手で記述しなければなりません）

このことからも、`foreign_key`は`belongs_toで参照する`という前提が正しいことがわかりますね。


<br>

終わり
Unity超簡単！削除されないオブジェクトの作り方（シングルトンの作り方）

解説動画：https://youtu.be/UHBu7AkCCyE

```csharp:User.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class User : MonoBehaviour {

    static User Instance = null;
    public static User GetInstance(){
        if(Instance == null){
            GameObject obj = new GameObject("User");
            Instance = obj.AddComponent<User>();
            DontDestroyOnLoad(obj);
        }
        return Instance;
    }
    public int clearStage = 0;
}
```

a

```csharp:TitleScript.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TitleScript : MonoBehaviour {

	// Use this for initialization
	void Start () {
		User user = User.GetInstance();	
		Debug.Log(user.clearStage);
		user.clearStage = 234;
	}	
}
```

```csharp:MainScript

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MainScript : MonoBehaviour {

	// Use this for initialization
	void Start () {
		User user = User.GetInstance();
		Debug.Log(user.clearStage);
	}	
}

```

```csharp:GoToMain.cs
using UnityEngine;
using UnityEngine.SceneManagement;

public class GoToMain : MonoBehaviour {
	public void PushThisButton(){
		SceneManager.LoadScene("Main");
	}
}
```

スタジオしまづでゲームの作り方を学びたい人向けのサロン▶︎https://camp-fire.jp/projects/view/149191
Swift4  Notification NotificationCenter の使い方

```swift
//Step1
extension Notification.Name {
    static let notifyName = Notification.Name("notifyName")
}

//Step2 Fire notify
NotificationCenter.default.post(name: .notifyName, object: nil)

//Step3 Add Observer
NotificationCenter.default.addObserver(self, selector: #selector(doSomething(_:)), name: .notifyName, object: nil)

//Step4 Do somthing
@objc func doSomething(_ notification: Notification)
    {
        print("doSomething")
    }

//Step4 Remove Observer
// すべて解除
center.removeObserver(self)
// 特定の通知のみ解除
center.removeObserver(self,
                      name: .UIApplicationDidBecomeActive,
                      object: nil)
```
im2rec.py をローカルで使えるようにする方法

SageMakerで画像認識をさせるのに、`.lst` が必要になり `im2rec.py` というスクリプトで変換をかけると便利なのですが、 `jupyter notebook` でデバッグ効率があまり良くないのでローカルで動かせるようにしました。

# Step1. ソースをダウンロードしてこよう
パスの通ってるとこにソースをダウンロードしてください。
`curl -O https://raw.githubusercontent.com/apache/incubator-mxnet/master/tools/im2rec.py`

# Step2. ライブラリをインストールしよう
`im2rec.py` が、　`mxnet` と `python-opencv` を利用しているので、その二つをpipでいれます。

```sh:dependency.sh
pip install mxnet
pip install opencv-python
```

# 自分の場合
`python3` を利用しているのでこんな感じです。

```sh:dependency.sh
pip3 install mxnet
pip3 install opencv-python
python3 im2rec.py コマンド色々
```

# Tips
## lstファイルを作る
prefix_of_lstとimage_root_pathはご自身の環境に合わせて変更してください。

```
python3 im2rec.py --list --recursive prefix_of_lst image_root_path
```

## RecordIOフォーマットのファイルを作る

```
python3 im2rec.py --resize 256 --num-thread 16 lst_file_path image_root_path
```
学習メモ02（html/servlet/JSPの値受け渡し）

### 【servlet/JSP】リクエストパラメータ/リクエストスコープ/セッションスコープ
色々、値の受け渡し。


# リクエストパラメータで値受け渡し（html→servlet）
### htmlで送信
&lt;form action="/myExample/input" method="GET"&gt;
名前：&lt;input type="text" name="namae"&gt;&lt;br&gt;
&lt;input type="submit" value="登録"&gt;
&lt;/form&gt;

### servletで受信（input.java）
String strNamae = request.getParameter("namae");

－－－－－－－－－－－－－－－－－－－－
POST送信も可
－－－－－－－－－－－－－－－－－－－－

# リクエストスコープで値受け渡し（servlet→JSP）の送信
### servletで送信
//送信するものを作成
int hoge=123;
//リクエストスコープにセット
request.setAttribute("tmp", hoge);

//フォワード
RequestDispatcher rd = request.getRequestDispatcher("/test01.jsp");
rd.forward(request, response);

### JSPで受信
<% int hoge = (int) request.getAttribute("tmp");  %>

－－－－－－－－－－－－－－－－－－－－
JSPで受信後、リクエストスコープの中身は破棄される
－－－－－－－－－－－－－－－－－－－－


# セッションスコープで値受け渡し（servlet→JSP）の送信
### servletで送信
//セッションを使う準備
HttpSession session = request.getSession();

//送信するものを作成
int hoge=456;
//リセッションスコープにセット
session.setAttribute("tmp", hoge);

//セッションを破棄する（ログアウトとか？）
//session.removeAttribute("tmp");

//リダイレクト
response.sendRedirect("test02.jsp");

・JSPで受信
<% int hoge = (int) session.getAttribute("tmp");  %>

－－－－－－－－－－－－－－－－－－－－
javax.servlet.http.HttpSession　をインポートする必要あり
－－－－－－－－－－－－－－－－－－－－
Java 文字列の処理

# 本日学習したこと
- 文字列の処理に使用するメソッド
- 正規表現


## 文字列処理に使用できるメソッドたち

```ruby:java
equals(); #内容が等しいかどうか
equalsIgnoreCase(); #大小の文字を区別しない
length(); #文字数
isEmpty(); #から文字かどうか
contains(); #一部に含むかどうか
startsWith(); #最初にキーワードがあるか
endsWith(); #最後にキーワードがあるか
indexOf(); #前から何文字目にキーワードが登場するか
lastIndexOf(); #後ろから検索し、前から何文字目にキーワードが登場するか
charAt(); #１文字の切り出し
substring(); #複数文字の切り出し
toLowerCase(); #大文字を小文字に変換
toUpperCase(); #小文字を大文字に変換
trim(); #前後の空白を除去
```

- 文字の連結

今までは文字列は「+演算子」で連結すると学習したが、「+演算子」は連結させる際に古いインスタンスを捨て、新しいインスタンスをnewにより生成、格納する。
つまり、たくさんの連結をするということは、たくさんの新しいインスタンスを生成するということなのでJVMに大きな負荷がかかる。

そのため、StringBuilderを使用して処理を高速にできる。
StringBuilerはnewを使うことなくバッファを拡大していく。

```ruby:java
#使い方
StringBuilder sb = new StringBuilder(); #StringBuilderクラスのいんすたんすを変数sbに代入する。
sb.append("こん").append("にち").append("は"); #StringBuilderクラスの変数sbにappendメソッドで追加している。
String s = sb.toString(); #連結した文字列を取り出し、変数sに代入している。
System.out.println(s); #実行結果 => "こんにちは"
```



## 正規表現
matches()メソッドを使用する。

```ruby:java
❶通常の文字: 完全一致でなければならない
String s = "Java";
s.matches("Java");  => true  #完全一致している。
s.matches("JavaScript");  => false  #Scriptが一致していない。
s.matches("java"); => false  #最初の文字(J)が小文字になっている。


❷ピリオド: 任意の一文字であればいい
"Java".matches("J.va"); => true  #ピリオド(.)は任意の文字なのでどの文字に置き換えられてもいい。


❸アスタリスク: 直前の文字の０回以上の繰り返し
"Jaaaaaaaaava".matches("Ja*va"); => true #直前の文字、つまり「a」が何回繰り返してもいいということ。
"あいうxx019".matches(".*"); => true #直前の文字はピリオドで任意の文字でいいことから全ての文字列を許すという指示になる。


❹波括弧: 指定回数の繰り返し
"HELLLO".matches("HEL{3}O"); => true #直前の文字が３回繰り返すという意味なのでtrue。
#繰り返し回数の指定方法
#パターン記述 : 意味
#{n}       : 直前の文字のn回の繰り返し
#{n,}      : 直前の文字のn回以上の繰り返し
#{n,m}     : 直前の文字のn回以上、m回以下の繰り返し
#?         : 直前の文字の０回または１回の繰り返し
#+         :　直前の文字の1回以上の繰り返し


❺角カッコ: いずれかの文字
#角カッコ記号[]で囲まれた部分がある場合、角カッコの中のどれか一文字に当てはまることを要求する意味となる。
"Java".matches("Jav[abc]"); => true #Javから始まり、４文字目がabcどれかに当てはまればOK。


❻角カッコ内のハイフン: 指定範囲のいずれかの文字
"java".matches("[a-z]{4}"); => true #a~zの範囲を指定し、それが4回繰り返される文字列と比較する。
#定義済みの文字クラスの例
#パターン記述 : 意味
#¥d        : いずれかの数字 ([0-9]と同じ)
#¥w        : 英字・数字・アンダーバー([a-zA-Z_0-9]と同じ)
#¥s        : 空白文字 (スペース、タブ文字、改行文字など)


❼ハット(^)とダラー($): 先頭と末尾
#ハットは先頭を、ダラーは末尾を表す。
"Java".matches(^J.*a$); => true #先頭がJから始まり、末尾がaの任意の長さの文字列という意味。
```


- split()メソッド: 文字列の分割

```ruby:java
#一つの文字列をカンマ(,)か、コロン(:)で分割できる。
String s = "abc,def:ghi";
String[] words = s.split("[,:]"); 
# []内に(,)と(:)を指定することで、(,)と(:)の部分をsplitメソッドで区切るという意味になる。
```

- replaceAll()メソッド: 文字列の置換

```ruby:java
#文字列中でパターンに一致した箇所を別の文字列に置換できる。
String s = "abc,def:ghi";
String w = s.replaceAll("[beh]","X"); #[]内に指定した文字があれば、Xに置換される。
System.out.println(w); #実行結果　=> aXc,dXf:gXi
```

- format()メソッド: 整形した文字列を組み立てる

```ruby:java　
String.format("%d月%d日%sした。",3,26,"javaを学習");
# 実行結果=> 3月26日javaを学習した。
# 第一引数に指定するのは、組み立てる文字列の雛形(書式指定文字列という)。
# %記号の部分はプレースホルダーと呼ばれ、第２引数以降で指定した具体的な値が順に流し込まれる場所となる。

#プレースホルダーの書式
#%修飾,桁,型　(わかりやすいようにカンマ(,)で区切っているが実際は区切らなくていい)
#修飾        (カンマ(,) => ３桁ごとにカンマを入れる; 0 => 空き領域を0で埋める; - => 左寄せ(数字); + => 符号を強制表示)
#桁          (表示桁数を指定する。n.m形式で指定した場合、全体n桁、小数点以下m桁での表示となる)
#型          (d => 整数; s => 文字列; f => 少数; b => 真偽値)
```
iowaitの原因processをざっくり特定する

## iostat,vmstat,iotopない、でもsysstatはある

#### iowaitの高いprocessをざっくり特定する自分用メモ

ioを３０秒毎でざっくり目視で...上昇を監視

```sh
sar -p 30
```

state が Dのものをgrep

```sh
ps -eo state,pid,cmd | grep "^D"
```

色々加工して lsofで詳細出す

```sh
 ps -eo state,pid,cmd | grep "^D" |awk '{print $2}'|xargs -I{} sh -c 'lsof -p {}|grep -E "DIR|txt"'
```

ただただio 強めなproccess 調査なら

```sh
find /proc -name io 2>/dev/null| xargs egrep "write|read" | grep -v ": 0" | sort -n -k 2 |tail -n 5|grep -o -E "[0-9]*"|sort|uniq|xargs -I{} lsof -p "{}"|grep -E "DIR|txt|COMMAND"
```

iotop あればそれを使ってください...
参考：

* https://www.agilegroup.co.jp/technote/iotop.html
* https://qiita.com/uturned0/items/159599bf5e1191091f10
* https://qiita.com/kunihirotanaka/items/a536ee35d589027e4a5a
* https://humangas.github.io/knowledge-base/build/686dcc26d9d79a3d976c9b0c8488aedc.html
Angular7 ASP.NET Core2.2 テンプレート

Angular7とASP.NETCoreを組み合わせると
フロントエンド開発とバックエンド開発が
一つのVisualStudio環境で可能なため、Web開発が便利になる。
ただし、それぞれ構成が複雑なので、テンプレートを用意しておく

解説は後ほど。。。

テンプレート
https://github.com/redpeaks33/Angular7Template.git
オブジェクトをconsole.log

`console.log()` 、使っていますか？
最近こんな現象に出くわしました。

```js
$.ajax({
    url: url,
    type: "GET",
    dataType: "json",
    data: params,
    cache: false,
    success: function (response) {
        // responseの中身が知りたい
        // { hoge: {a:1, b:2, c:3}, fuga: {A:1, B:2, C:3} } みたいな形になっている

        console.log(response);
        // => { hoge: {a:1, b:2, c:3}, fuga: {A:1, B:2, C:3} }

        console.log(response.hoge);
        // => { X:1, Y:2, Z:3 } !!!?
        // hogeを出力するので {a:1, b:2, c:3} が表示されてほしいのに:(

        toDoSomething(response);
    },
    error: function (){
    // ...
    }
});

var toDoSomething = function(response) {

  // ...
  // ...
  // to do ...
  var hoge = response.hoge;

  // fuga = { X:1, Y:2, Z:3 }
  response.hoge = fuga;
  
}

```

# 原因
ググればでてくるのですが、例えば👉 `console.log()で出力した値が、変わるのはなぜ？` https://teratail.com/questions/61338

> デベロッパーツールのコンソールでObjectやArrayなどのオブジェクトを表示する場合、その中身は「console.log()が評価された時」の中身では無く、「コンソール上で表示をさせた時」の中身になります

なので、 `toDoSomething` 関数でresponseという変数を書き換えているせいで、console.logを行う際に評価する変数の値はすでに書き換えられているタイミングにあるため、このような事象が発生したと考えるべきでしょう。 ~~引数となるresponseという変数を書き換える、処理をそもそも書くなというのはめちゃくちゃ正しいのですしvarは使うなconstを使え、jQuryやめろはまさにそのとおりなんですが作った人のアレがアレでうわなにをすくぁwせdrftgyふじこlp~~

# 解決策

`Object.assign()` を使うとよいでしょう。Reactしかり、Vueしかり、Angularは知らんけど、JavaScriptのフレームワークは、オブジェクトの変更を検知させるためにこれを使うので、わりと知られているんじゃないかしら。

```js
$.ajax({
    url: url,
    type: "GET",
    dataType: "json",
    data: params,
    cache: false,
    success: function (response) {

        const _response = Object.assign({}, response)
        console.log(_response);
        // => { hoge: {a:1, b:2, c:3}, fuga: {A:1, B:2, C:3} }

        const _response_params = Object.assign({}, response.params)
        console.log(_response_params);
        // => { a:1, b:2, c:3 } , OK!

        toDoSomething(response);
    },
    error: function (){
    // ...
    }
});

var toDoSomething = function(response) {

  // ...
  // ...
  // to do ...
  var hoge = response.hoge;

  // fuga = { X:1, Y:2, Z:3 }
  response.hoge = fuga;
  
}

```

他の解決策としては、JSON.stringify()で文字列化してもよいでしょう。お好きなように。
console.logの挙動にご納得いただけない方は、ぜひGoogleにissueを投げるか（どうやって投げるんやろ...）、patchを送りつけて下さい（どうやって...）。わりとみんな幸せになれるので。
MineCraft Modding チュートリアル その2

- [MineCraft Modding チュートリアル その1](https://qiita.com/ooharabucyou/items/84245bc2f804a82a80b5)

の続きになります。

## MOD名・バージョンの指定

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61997/4f6fa0ca-30dc-1b1b-0740-c18df4d18d72.png)

`src/main/java` を確認すると、予めサンプルのパッケージとクラスが存在するが、思い切って消してしまう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61997/2a461980-bafe-a0cb-f252-cfae46a6dc5f.png)

そして、新たなパッケージを作成する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61997/0935491a-8bc7-7612-2fdf-b05146b22815.png)

パッケージ名はお好きに。

新規作成したパッケージにクラスを作成。名前は `Mod名Mod` とする場合が多いみたいですね。例では `BucyouMod` とします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61997/046733a3-6bd4-8227-987d-ea2ba946a6b0.png)

そして、以下を記述。 `@Mod` の部分はアノテーションという代物で、MineCraft Forge は、クラスに対して `@Mod` がついているものを探して、MODとして登録します。

```java
package net.bucyou.bucyoumod;

import net.minecraftforge.fml.common.Mod;

@Mod(modid = BucyouMod.MODID, name = BucyouMod.NAME, version = BucyouMod.VERSION)
public class BucyouMod {
	public static final String MODID = "bucyoumod";
	public static final String NAME = "Bucyou MOD";
	public static final String VERSION = "1.0";
}
```

実行して確かめます。

以下のようにMOD名が SampleMod でなくなっていれば成功です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61997/ab20808f-7510-18f8-bd9d-68290c82bf26.png)



## 既存のアイテム・ブロックについて新たなレシピを登録する

ここまで、ちょっとだけコードが出てきましたが、レシピ追加についてはコードは不要です。
JSONデータを特定の場所に登録するだけであります。

`src/main/resources` に `assets.modid.recipes` パッケージを追加 (自分の場合は `assets.bucyoumod.recipes` となる。)

その中に新規ファイルとして、 `dirt_to_diamond.json` (適当なJSONファイル) を作成する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61997/7afa4854-056d-563e-9ca7-6689374f7601.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61997/5ec48761-7a2c-acc4-e5af-c6c2e05fc689.png)

JSONファイルは1から作る必要はなく、 https://crafting.thedestruc7i0n.ca/ を使うと楽にできる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61997/af01e3c6-95ee-8bb4-7a00-d20e40c41863.png)

Crafting Options 

- Shapeless: 形を限定しない場合は指定する。

出来上がったJSONデータを新規JSONファイルに貼り付けて、少し加工します。

- type は前に `minecraft:`を追加します。
- ingredients について、 data (通し番号) をつけます。こちらは、1.13 からは廃止されるようです。

```json
{
    "type": "minecraft:crafting_shapeless",
    "ingredients": [
        {
            "item": "minecraft:dirt",
            "data": 0
        }
    ],
    "result": {
        "item": "minecraft:diamond",
        "count": 1
    }
}
```

実際に動作確認をしてみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61997/9972e871-fc16-d1fd-6676-f2151ab7e136.png)
生まれたてのamazon linux2インスタンス

amazon linux2のデフォルトサービスが色々増えたり変わったりしてて顔面が真っ青になったので再び調べたりして再セットアップ
起動しなくなったりしても恨まないように
その場合クラウドだし投げ捨ててあたらしくつくろう

---

```
$ sudo su -
$ ntsysv
```

#### network
クラウドでネットワークが要らないケースはそんなに無いんじゃなかろうか
というわけで続投

#### acpid.service
電源管理デーモン(主にノーパで活躍しているらしい)
クラウドによっては切ってはいけんらしいが、ec2でやる分には
・コマンドからのreboot
・AWSコンソールからのreboot/stop・start/terminate
両方普通にいけるので切り

#### amazon-ssm-agent.service
aws ssm利用予定は現在のところ無いので切り

#### atd.service
とある時にatコマンド何度か使ったことあるので続投

#### auditd.service
システムコールの監視してくれてる
ログ出力先のデフォルトは `/var/log/audit/audit.log`
amazon linux2だとデフォルトでonになってる(前まで `-a never,task` って入ってたはず)
これパフォーマンス影響があるかもよって言われ続けてたけど、デフォルトで入ってるならAWSはいけると判断したんだろうきっと
selinux使わんでもメリットあると思うんで続投
(ちなみにselinuxはデフォルトオフ)

#### chronyd.service
時刻同期のアレ 続投

#### cloud-*
ec2が起動するときってcloud-initとかそういう連中が動いてるはずで、そいつらに関与すんのかね
ちゃんと調べればいらないやつもいるのかもしれないけどとりあえず続投で
各サービスの役割を知ってる人がいたらそっと教えてください

#### crond.service
大体使うので続投

#### dm-event.socket
うーん。device mapperイベントを監視してるんかなこいつは。
lvm/dockerを利用しないんであれば要らないと思うんだけど、要る場合でもこいつが起きている必要があるのかがなんともわからん
とりあえずはlvmやdockerを利用する予定のないインスタンスでは切ろうかと思う

#### dmraid-activation.service
RAID関連
まあ要らないよね


#### hibinit-agent.service
インスタンスの「休止」をサポートするためのagentっぽい
停止と休止はRAMに乗っかってるものを、停止は単に揮発するけど休止の場合はルートボリュームにファイルとして保持するのが違いなようだ
インメモリデータストアとかをEC2にのっけて使ってる場合は使えそう？
基本使う予定ないので切り

#### irqbalance.service
通常linuxカーネルは割り込み処理をcpu0でのみ処理するが、こいつが有効になってれば各cpuに負荷を分散してくれるらしい
そのためコア1のインスタンスでは意味を成さない
繊細な設定が要件として必要でないなら続投のままでよさそう

#### libstoragemgmt.service
外部ストレージアレイを管理してくれるらしい
クラウドでこいつが生きてないと困る状態ってすんごい特殊というか、あるんだろうか
まあ切り

#### lvm2-*
libstoragemgmtとは違ってこいつらは論理ボリュームをホニャララする連中
lvmを利用する想定がないなら要らないはず
dm-eventと同じく、切ったときにdockerに何か影響があるのかはまるでわからん
よって同じ理由により切り

#### mdmonitor.service
RAIDの監視ツールなようだ
dmraid切ってんだしこいつも要らんだろう

#### postfix.service
自前メールサーバ環境構築とかもうやりたくないです
切り

#### rngd.service
乱数ジェネレータ
何をするインスタンスなのかにも寄るけど切るメリットもそんな無さそうなので続投

#### rpcbind.service/socket
RPCプログラム番号をポートにマッピングする機能
gRPCとかやるときは必要になる気がするけど今回は必要ないので切り
NFSv3以前はこいつが必須だったようだけどv4でもういらなくなったそうなのでnfs使う場合でも要らないっぽい

#### rsyslog.service
ログ管理
これだけで記事になるくらい濃い
minimalｲﾝｽｺでも入るようなナイスガイを切る勇気はないので続投

#### sshd.service
切っちゃあかんやろ

#### sysstat.service
リソースの状態を保存したり整形したり見られるようになったりするサービス
sa1とかsa2とかそういうやつ(sa1・sa2は/etc/cron.d/sysstatにバリバリ書いてある、デフォルトは10分に1回で23:53にレポート作る)
ec2のリソース監視をどんな形でやっていくかっていう監視設計の話になってくるので要るなら生かして要らないなら切ろう

#### systemd-readahead-collect/drop/replay
collectで起動時の情報を記録
replayで次回起動時にその記録された情報を再生(前回記録から、どうせ読むことが分かっているデータを先に読んじゃって起動時間を早めるんだとか)
dropはシステムに更新が入ったときに集めた情報を吹っ飛ばすらしい。
切るメリットもそんなに無いけどサーバ用途ならそんなしょっちゅう落としたりなんだりしないだろうからなんとも微妙な…
とりあえずこれがonの状態で困ってはいないので残しておくか…

#### update-motd.service
ログインしたときに出るアレの内容をupdateしてるおじさん
個人的に生きてる方がありがたいので(5.1:4.9くらいだけど)続投

---

設定終わったらrebootコマンド叩く。
で、`systemctl list-unit-files --type=service | grep enabled` あたりで確認。
enabledでgrepかけないときに出てくるstaticってなってるやつはおいそれと手を出すと不幸になりそう

autovt@とgetty@ってやつがおる場合、まあ止めないでおきましょう。
autovt@は確かGUIが死んじゃってどうもならんときにプロンプト呼ぶやつで、getty@はユーザログイン(認証)とか制御してるおじさんって認識なので両方切ったところでec2だし問題ないんでは…？と思いもするんだけど…
これも詳しい人いたらそっと教えてください

あとは従来通り違うユーザ作ったりsyslog設定したりec2-user消したりして遊ぼう
ami化して使いまわす場合は、デフォルトだと `/etc/cloud/cloud.cfg` の効果でec2-userが起動時に作り直されてしまうので
`users-groups` をコメントアウトしておこうな

## 追記
#### microcode.service
CPUに対するパッチをOS起動時にあててくれるナイスガイなようなので止める理由なし
B問題「高層タワー」テストコード

もっとスマートなのもあるだろうが今はこれが精一杯
[エンジニアが死滅した世界「高層タワー」](https://paiza.jp/botchi/area/2)

# 問題文
>単語を組み合わせて新単語を作ります。 
新単語は N 個の文字列を、前から順に結合して作ります。
この時、冗長さをなくすため、 前から結合した単語の末尾 と 後ろの単語の先端 が一番長く一致するように結合します。
例えば、 入力例 1 の "paiza", "apple", "letter" の場合、 
先頭から "paiza", "apple" を条件どおり重ねると "paizapple" となります。 
この単語を更に次の単語と重ねると "paizappletter" となります。

```高層タワー_spec.rb
require 'spec_helper'

RSpec.describe High_rise_tower do
  it '入力例１' do
    # やりやすいように引数の文字列を「/」で区切りました
    result = High_rise_tower.new.combine(word: 'paiza/apple/letter')
    expect(result).to eq 'paizappletter'
  end
  it '入力例２' do
    result = High_rise_tower.new.combine(word: 'poh/p/oh')
    expect(result).to eq 'pohpoh'
  end
end
```

```高層タワー.rb
class High_rise_tower

    def initialize
      # その都度新単語がこの変数に入っていく
      @new_word = ''
    end

    def combine(word:)
      word.split('/').each do |w|
        w.to_s
        if @new_word == '' # 1回目は必ず、ただの単語が入るように条件分岐
          @new_word = w
        else
          num = w.length # 比較する単語が、前の単語と重なる部分があるかを調べるために、比較する単語の長さを調べてその長さ分、後ろから確かめる
          cut_word = w
          while num >= 1
            break if @new_word.index(cut_word, -num) != nil
            # 一回ずつ文字列の末尾を削って、合致するかをみる
            cut_word = cut_word.chop
            num -= 1
          end
          # つまりは、chopしていった結果合致するものがなく、からの文字列が帰ってきたのではなければ、切った文字列の長さ分を、比較された単語から削って新しい単語にくっつける
          if cut_word == ''
            @new_word += w
          else
            int = cut_word.length
            if int == 1
              w.slice!(0)
              @new_word += w
            else
              w.slice!(0..int -1)
              @new_word += w
            end
          end
        end
    end
    # 最後にブロック引数として新しい単語を返す
    @new_word
  end
end
```

thank youにゃー
また更新したいけど、需要のなさそうなこれらの、どこをどう直しましょうか？
AngularJS で $window.location.reload(); のタイミングが変わった？？

## Chrome 73 でAngularJSで書いたコードの動作が変わってしまった

```javascript
$location.path('/foo');
$window.location.reload();
```
みたいなコードがあって、 Chrome 72 まではちゃんと `/foo` を表示していたのが、 Chrome 73 になると表示中の画面の URL でリロードするようになってしまった。

調べてみるとパスの置き換えよりも前にリロードされている感じ。

## Chrome 73 での変更点

:link: [Chrome 73 ：コンストラクタブル スタイルシート、新しい正規表現関数、Passive mouse イベント](https://developers-jp.googleblog.com/2019/03/chrome-73-passive-mouse.html)

関連性があるか？と言われると、… :thinking: :question: 

## とりあえず動作させる
```javascript
$location.path('/foo');
$timeout(function() { $window.location.reload(); });
```
タイム・アウトさせると動く。

```javascript
$window.location.href = '/foo';
```
リロードじゃないけど、これでもまあ動く。

## 同じ事象に悩んでる人いないかもしれないけど、まとめ
割とタイムリーなタイミングだったのでまとめました。
でも Chrome のバージョンアップで動作変わるとかやめてほしいよ… Go○gle 先輩 :innocent:
Gradleで生成したKotlinプロジェクトをIntelliJで開く

Gradleの`gradle init --type=kotlin-application`で生成したプロジェクトをIntelliJにインポートする方法を紹介する。

前回: [GradleでKotlinプロジェクトを一撃生成する - Qiita](https://qiita.com/suin/items/96799c9f50a31ae54969)

1. IntelliJ IDEAを起動したら「Import Project」を選択する。
<img width="777" alt="Welcome_to_IntelliJ_IDEA.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/6a96ad6b-bc94-947a-eb61-0fa7fe6a819b.png">
2. 「Import project from external model」にチェックを入れ、「Gradle」を選択する。
<img width="413" alt="Import_Project.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/4adb78fc-2c8d-19da-12c2-3d1e31e1e0a0.png">
3. インポート時のオプションを設定し、「Finish」を押す。<img width="1070" alt="Import_Project.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/94a2d4f4-56bc-b5c1-4d2e-9530c7e81804.png">
    * Use auto-import: チェックを入れる。Gradleの設定がIntelliJに自動同期されるようになる。
    * Create separate module per source set: チェックを入れる。[IntelliJの「Create separate module per source set」とは？ - Qiita](https://qiita.com/suin/items/4cbd165a7e2b76eef7db)
    * Use default gradle wapper: チェックを入れる。


以上。
rails/fixtureでstringのカラムにarray.to_jsonの状態で登録する

# やりたいこと
 - fixtureを利用して、stringのカラムにarray.to_jsonの状態で登録する

# 参考
 - [Embedding JSON Data into YAML file](https://stackoverflow.com/questions/9532840/embedding-json-data-into-yaml-file/17093553)
 - [Fixtures and serialized attributes in Ruby on Rails](https://thinkingeek.com/2011/06/16/fixtures-and-serialized-attributes-in-ruby-on-rails/)


# 解法
 - `to_json.inspect` が大事

## schema
```rb:schema.rb
ActiveRecord::Schema.define(version: XXX) do
  create_table 'test_tables' do |t|
    t.string 'string_column' # array.to_json("[\"hoge\",\"foo\"]") の状態で入れるカラム
  end
end
```
## yaml
```yaml:test/fixture/test_tables.yml
test_data:
 string_column: <%= array.to_json.inspect %>
```

# ダメだった書き方
## to_json
```yaml
test_data:
 string_column: <%= array.to_json %>
```

## to_s
```yaml
test_data:
 string_column: <%= array.to_s %>
```

## yamlの配列記法
```yaml
test_data:
 string_column: 
   <% array.each do |item| %>
   - <%= item %>
   <% end %>
```
mysqldumpした時にテーブルロックが起こる

#mysqldumpしようとしたら、うまくできない

スキーマだけのダンプファイルを作成しようとして、下記のコマンドを打つと、

```
$ mysqldump -u root -p -d db_name > db_name.sql
```

```
database 'dbname' when using LOCK TABLES
```

こんなエラーが出ている訳ですね。 

## 解決自体はすぐできました。
下記のようなオプションを付与するとうまくいきます。

```
$ mysqldump -u root -p -d db_name --lock-tables=false > db_name.sql
```

## このオプションはなんぞや
テーブルロックを無効にさせているんだろうなーと言うのはオプションから見てもわかるんで、テーブルロックとはを調べました。

### 所謂１つの排他制御
mysqlはシングルプロセスマルチスレッドモデルで処理を行なっていて、トランザクションを行う時は、スレッドを使って処理が行われる訳だが、テーブルに対しての更新処理を行う時に他のスレッドにいじられたらまずいので、ロックをかける必要がある。これをテーブルロックという。

####ロックの仕方には二種類ある。
#####READ
ロックを取ったスレッドが、READのみ可能WRITEするとエラーを起こし、その他のスレッドもREADのみ可能でWRITEするとブロックされる

#####WRITE
ロックを取ったスレッドがREAD/WRITE可能になり、その他のスレッドが、READ/WRITE不可になり、ブロックされる

権限が付与された時に、このlock tablesが利用できる権限が与えられます。
[権限の種類](https://www.dbonline.jp/mysql/user/index5.html)
結構付与されるものの種類がたくさんある。おそらくこれから先お世話になったり遭遇するんだろうな。

dumpを仕掛ける時にマルチスレッドでしかけようとしちゃうんだろうな。だから、falseにしておく必要があるんだということ。
xcode アプリ　ローテーション制限　縦表示だけするように設定

<img width="538" alt="スクリーンショット 2019-03-26 18.32.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/125746/e53d3caa-ec37-f731-2acb-d62dcedeb67f.png">

Device Orientation ✓Portrait　だけ
Alexaスキルの公開申請が却下された話

最近はLambdaやAlexaスキルについて学習しています。

先日Alexaスキルを公開しようとしたところ、申請が却下されてしまいました。
なぜ却下されてしまったのか、今回私がAmazon様からいただいた指摘についてご紹介したいと思います。

公開しようとしたAlexaスキルの仕様

- 呼び出し名：「〇〇キャンペーン」
- とあるキャンペーンサイトのAPIを使用して現在応募可能なキャンペーン情報を取得  
- 現在応募可能なキャンペーンの件数を喋る
- 現在応募可能なキャンペーンのリストを読み上げる

※〇〇はとあるキャンペーンの名称です。

上記のスキルを公開しようとしたところ、以下５点の指摘がありました。

1. 第三者の商標
2. スキル内の広告
3. スキル起動の一貫性
4. スキルアイコン
5. サンプルフレーズ




## 1. 第三者の商標
**申請したスキルに関して、第三者の商標またはブランドが含まれていたため却下されました。**   
考えてみれば当然ですね。  
認定を通過させるには商標所有者から許諾を受けていることを認定チームがわかるようにする必要があります。
個人でAlexaスキルを作成する場合、第三者の権利を侵害するような単語の使用は控えましょう。

##2.    スキル内の広告
**スキル内の広告でAlexaの音声を使用する事は認められません。**また、第三者の広告を目的としたスキルは公開することはできません。  
広告を目的としたスキルを作成する場合、Alexaにそれを喋らせてはいけないそうです。  
また広告に関するスキルは公式アカウントでないと公開できません。

##3. スキル起動の一貫性
**サポートされている複数の起動フレーズを使用した際、スキルが起動できない可能性があることを指摘されました。**

>ユーザー：アレクサ、〇〇キャンペーンを起動して   
アレクサ：すみません、よくわかりません。 

正常に起動できる呼び出し名を設定するためのドキュメントも紹介してくれました。 
 
- [一貫してスキルを起動できるスキルの呼び出し名を作成する方法](https://developer.amazon.com/ja/docs/custom-skills/choose-the-invocation-name-for-a-custom-skill.html#cert-invocation-name-req) 
- [最適なユーザーエクスペリエンスを作成するための音声インターフェース](https://developer.amazon.com/ja/docs/custom-skills/voice-interface-and-user-experience-testing-for-a-custom-skill.html)

スキルの仕様についてまで指摘してくださって、非常に親切ですね。

##4. スキルアイコン
スキルアイコンに設定された画像の見た目について指摘されました。  
**スキルアイコンは空白、もしくはトリミング（もしくはトリミングされたりして解像度が低く、鮮明ではない状態）されていない状態でなければなりません。**
また**アイコンに記載の文字が切れてしまっているため修正する必要があります。**

自分の好きな画像でいいのでは？とも思いがちですが、適当な画像ではいけないようです。   
アイコンがとっさに思いつかない方は、[Alexaアイコンビルダー](https://developer.amazon.com/ja/docs/tools/icon-builder.html)を利用する方法もあります。


##5.    サンプルフレーズ

**公開設定で設定するサンプルフレーズに提示した発話例（ワンショットまたは起動フレーズ）の先頭に、ウェイクワード（アレクサを呼び出すための音声コマンド）の記載が必要です。**

>該当のサンプルフレーズ： 
〇〇キャンペーン 
〇〇キャンペーンを開いて 
〇〇キャンペーンを起動して  

>修正例： 
アレクサ、[呼び出し名] 
アレクサ、[呼び出し名]を開いて 
アレクサ、[呼び出し名]を起動して

省略しがちですが、ウェイクワードは必ず記載しましょう。

# まとめ
Alexaスキルは、法的なものから実装に関わる部分まで、幅広く審査されているということがわかりました。
自由に開発できるといっても、Alexaの1つの機能として、一定レベルの品質が求められるということですね。
今回のスキルは非常にシンプルな機能なため、より複雑なスキルになれば他の指摘も出てくるとは思いますが、
Alexaスキル公開のために、上記の指摘は押さえておくと良いと思います。
スクロールに合わせてToolbarにタイトルを表示する

レイアウト

``` xml
        <androidx.coordinatorlayout.widget.CoordinatorLayout
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:fitsSystemWindows="false"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            >

            <com.google.android.material.appbar.AppBarLayout
                android:id="@+id/app_bar"
                android:layout_width="match_parent"
                android:layout_height="240dp"
                android:fitsSystemWindows="false"
                >

                <com.google.android.material.appbar.CollapsingToolbarLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:fitsSystemWindows="false"
                    app:contentScrim="?attr/colorPrimary"
                    android:minHeight="?attr/actionBarSize"
                    app:layout_scrollFlags="scroll|exitUntilCollapsed"
                    >

                    <ImageView
                        android:id="@+id/imageView"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:transitionName="title_image"
                        android:contentDescription="@null"
                        app:layout_collapseMode="parallax"
                        app:srcCompat="@android:color/darker_gray"
                        />

                    <androidx.appcompat.widget.Toolbar
                        android:id="@+id/toolbar"
                        android:layout_width="match_parent"
                        android:layout_height="?attr/actionBarSize"
                        app:layout_collapseMode="pin"
                        >
                        <TextView
                            android:id="@+id/title"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:textSize="18sp"
                            android:textStyle="bold"
                            android:textColor="@color/white"
                            android:text="@string/title"
                            />
                    </androidx.appcompat.widget.Toolbar>
                </com.google.android.material.appbar.CollapsingToolbarLayout>

            </com.google.android.material.appbar.AppBarLayout>

            <include android:id="@+id/content"
                     layout="@layout/content"
                />

        </androidx.coordinatorlayout.widget.CoordinatorLayout>

```

あとはこんな感じにスクロールに合わせてアルファを調整する

```kotlin
        // スクロールに合わせてタイトルを表示する
        binding.appBar.addOnOffsetChangedListener(
            AppBarLayout.OnOffsetChangedListener { appBar, i ->
                binding.title.alpha = Math.abs(i / appBar.totalScrollRange.toFloat())
            }
        )
```

スクロールするとふわっと出てくる
ブラウザからGCSからファイルをダウンロードしようとして、CORSエラーが出た場合の対応

## 解決方法

ブラウザからGCSのファイルをDLする場合には、対象バケットにCORS設定を追加する必要がある。


## やりかた

URLをorigin指定したjsonを記載した設定ファイルを作る。

```json:cors-config.json
[
    {
      "origin": ["http://example.appspot.com"],
      "responseHeader": ["Content-Type"],
      "method": ["GET", "HEAD", "DELETE"],
      "maxAgeSeconds": 3600
    }
]
```

対象バケットに向けてgsutilコマンドを実行

```
gsutil cors set cors-config.json gs://example-bucket
```

以下コマンドでcors設定が確認できる

```
gsutil cors get gs://example-bucket
```


参考: https://cloud.google.com/storage/docs/configuring-cors
【Xcode】Appストアにアップしたアプリのデフォルト言語を日本語に設定する方法

【Xcode】Appストアにアップしたアプリのデフォルト言語を日本語に設定する方法

```
info.plist を開き

Localization native development region　----> Japan 
Localizations(追加必要) -> Item 0 ----> Japanese 
```

<img width="704" alt="スクリーンショット 2019-03-26 18.24.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/125746/a3b3678c-dbf7-2ee5-004f-51e850e0ddce.png">
jmeterのtimestampを人が見てわかる形式にする

## 答えだけを知りたい方へ
```
=TEXT(A1/(86400*1000), "yyyy/MM/dd hh:mm:ss") + "1970/1/1" + "09:00"
```


## ググったらすぐに数式は見つかるけど

Defautだとこんな感じで出力されます。
色々データ取ったあとに測定結果を出力フォーマットを変え忘れたことに気づいて非常にげんなりします。

```
httpSample t="32" lt="32" ts="1552176269063" s="true" lb="...
```

さてこのひと目でわ分からないtimestampをExcelで変換すればよいのですが、Googleで検索すると不思議な数式がみつかります。この `A1` に上記の `1552176269063` を入れると `2019/3/10 9:04:29` と計算されます。たしかに合ってるっぽい。なんだこれ？

```
=( A1/86400000)+25569+0.375
```

この数式だと自信を持って合ってるとも言い切れないのでもう少し human readable な数式 をここに記録することにしました。


## Excelのための変換数式を考える

まずjmeterのタイムスタンプの意味ですが、1970/01/01(UTC) からのミリ秒です。

>the default saved data includes a time stamp (the number of milliseconds since midnight, January 1, 1970 UTC)
引用元： [Apache JMeter - User's Manual: Listeners](https://jmeter.apache.org/usermanual/listeners.html)

次にExcelですが、Excelは `1` を `1日` として扱います（面倒くさい￣^￣）

ですので素直に計算するなら
　１．ミリ秒を `yyyy/mm/dd hh:mm:ss` の形式に変換する
　２．`1970/01/01` に足す
　３．`JST` にする場合、更に `09:00` 足す
というステップを踏めば良いです。

なお、Excelには秒をExcel形式のシリアル値に変換する関数がないので１は普通に計算します。
`A1` にjmeterのタイムスタンプが入力されている場合は以下のように書けます。

```
TEXT(A1/(846000*1000), "yyyy/MM/dd hh:mm:ss") 
```

あとは２，３も計算すると

```
=TEXT(A1/(86400*1000), "yyyy/MM/dd hh:mm:ss") + "1970/1/1" + "09:00"
```

## 出力フォーマットを変更する方法
jmeterの起動パラメータで以下を設定すれば良いようです。

```
-Djmeter.save.saveservice.timestamp_format="yyyy/MM/dd hh:mm:ss"
```
引用元：http://labs.timedia.co.jp/2012/04/jmeter-log-dateformat.html
IntelliJの「Create separate module per source set」とは？

GradleプロジェクトをIntelliJにインポートするときに選べる「Create separate module per source set」の設定とは何か？

<img width="1075" alt="Import_Project_from_Gradle.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/45825f13-06ca-fd73-d23b-ad3dc783f389.png">

デフォルトは「Create separate module per source set」にチェックが入った状態。

この設定がどういうふうに働くか確認してみた。

## インポートするプロジェクトの構成

```
.
├── build.gradle.kts
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle.kts
└── src
    ├── main
    │   ├── kotlin
    │   │   └── io
    │   │       └── suin
    │   │           └── hellogradle
    │   │               └── App.kt
    │   └── resources
    └── test
        ├── kotlin
        │   └── io
        │       └── suin
        │           └── hellogradle
        │               └── AppTest.kt
        └── resources
```


## チェックを入れたままインポートしたとき

srcとtestが別モジュールになる。

<img width="331" alt="hellogradle___Volumes_dev_hellogradle__-_____src_main_kotlin_io_suin_hellogradle_App_kt__hello-gradle_main_.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/9451c85a-a192-1ba8-bdc7-1064ea9a92bb.png">

srcとtestで依存するライブラリは別になる。

<img width="1024" alt="Project_Structure.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/8daad4cc-042f-bc24-6776-f1020f951c72.png">


## チェックを外してインポートしたとき

srcとtestが同じモジュールになる。

<img width="330" alt="hellogradle___Volumes_dev_hellogradle__-_____src_main_kotlin_io_suin_hellogradle_App_kt__hello-gradle_.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/5a62b9c1-c211-07b1-c245-277b93a0f419.png">

依存するライブラリも共通になる。


<img width="1024" alt="Project_Structure.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/928bff9b-06c3-fce2-2dfd-b57243926982.png">

## どのようなメリット・デメリットがあるか？

調べたけど正直わからない。だれか教えて。
Rspec3.8.0以降のGetリクエストはrender_viewsが必須にっている件

#はじめに
rails6にアップグレードして早速Controllerでrspecを走らせていたのですが謎のエラーが発生し、いくら検索してもひっかからなかったため同じエラーが出てきた方のために残しておきます。
5時間くらい一人でハマってましたが、最終的に師匠に助けていただきました。

##実行環境
Rails 6.0.0.beta3: https://github.com/rails/rails/releases/tag/v6.0.0.beta1
Rspec 3.8.0: https://github.com/rspec/rspec/releases


##謎のActionView::Template::Error

単純に`controller`で`Get`リクエストをしたときの挙動です。

```controller_spec.rb
equire 'rails_helper' 

RSpec.describe AdminsController, type: :controller do
  describe "#index" do
    it "test" do
      get :index
      expect(response).to render_template :index
    end
  end
end
```
これでspecを実行すると。。


```
ActionView::Template::Error:
   wrong number of arguments (given 2, expected 1)
   # /usr/local/bundle/gems/meta-tags-2.11.1/lib/meta_tags/controller_helper.rb:22:in `render'
     # /usr/local/bundle/gems/rails-controller-testing-1.0.4/lib/rails/controller/testing/template_assertions.rb:61:in `process'
     # /usr/local/bundle/gems/devise-4.6.1/lib/devise/test/controller_helpers.rb:35:in `block in process'
     # /usr/local/bundle/gems/devise-4.6.1/lib/devise/test/controller_helpers.rb:102:in `catch'
     # /usr/local/bundle/gems/devise-4.6.1/lib/devise/test/controller_helpers.rb:102:in `_catch_warden'
     # /usr/local/bundle/gems/devise-4.6.1/lib/devise/test/controller_helpers.rb:35:in `process'
     # /usr/local/bundle/gems/rails-controller-testing-1.0.4/lib/rails/controller/testing/integration.rb:13:in `block (2 levels) in <module:Integration>'
     # ./spec/controllers/admins/accounts_controller_spec.rb:19:in `block (3 levels) in <top (required)>'
     # ------------------
     # --- Caused by: ---
     # ArgumentError:
     #   wrong number of arguments (given 2, expected 1)
     #   /usr/local/bundle/gems/meta-tags-2.11.1/lib/meta_tags/controller_helper.rb:22:in `render'
```

!!!!
ArgumentError?引数が多い？一つしか渡してないはずなのになぜだろう。。
この後`matcher`を変えても同じエラーがでてしまい、どうやら`get :index`の行でエラーが出てるっぽい。

エラー文をよく見てみると`meta_tags`というGemの`render`でひっかかってるみたいなのでコードを読みに行きました。
https://github.com/kpumuk/meta-tags/blob/master/lib/meta_tags/controller_helper.rb#L22

が、superばっかでなんて書いてあるのか正直よくわからず。。


ちなみにpostリクエストは普通に通りました。

```controller_spec.rb
describe "#create" do
  let(:admin) { create(:admin) }
  it "create_admin" do
    post :create, params: { admin: attributes_for(:admin) }
    expect { subject }.to change { Admin.count }.by(1)
  end
end
```

[meta-tag](https://rubygems.org/gems/meta-tags/versions/2.11.1)のversionが関連してる？とか思いつつもそれっぽい記事がヒットしません。

なぜGETだけ通らないんだろうと困ってた矢先、師匠に助けていただきました。

##解決策

**`render_view`を設定しましょう**

```spec/rails_helper.rb
RSpec.configure do |config|
  config.render_views 
end
```


```
1 examples, 0 failures
```
なぜかこれで通るようになりました。
直接`controller`に書いてもいいですが、今後同じエラーが出ないように`rails_helper`に記述しておくのが親切かと。

今まで**`render_views`って必須じゃなかった気がしますが。。^^;**


render_view: https://relishapp.com/rspec/rspec-rails/docs/controller-specs/render-views

##おわりに
`Rails6`による影響かな？とは思いつつも、現在の最新版では`render_view`が必須とも書いてないですし、今のところ原因はよくわかっておりません。
もしわかる方がいたら指摘いただけると大変嬉しいです(m_ _m)

#追記

`Rspec4.0`以上を使えば無事解決します。
指摘してくださった＠takeyuwebさんありがとうございました！

```rb

gem 'rspec-rails', '~> 4.0.0.beta2'
```