OmniAICreator/Qiita-1.07M huggingface dataset:
JJUG CCC 2019 fallに参加してきました

2019年11月23日(土)に開催されたJJUG CCC 2019 fallに初めて参加してきましたので、感想をまとめてみました。

#はじめに
会社の先輩社員に教えていただいたことをきっかけに、JJUGの存在を知りました。
実際に記事にもされているので、ぜひご覧ください。
こちらの記事にJJUGの概要がありますので、JJUGについての説明は省略します。
記事：[JJUG CCC 2019 Spring に参加してみた](https://qiita.com/evid/items/4bcd43454aaff62dd676)

#自己紹介
簡単に自己紹介をさせていただきます。
このICT業界に入ってまだ1年目の新人です。
プログラミングを学び始めたのは、入社してからです。
Javaに触れたのは新入社員研修の時のみで、最近は主にC#の勉強をしていました。

#なぜ参加したか
上記で述べたとおり、Javaにはほとんど触れたことがありませんが、エンジニアのコミュニティに興味があったので参加してみました。コミュニティに参加して、ゼロに等しいモチベーションをアップさせなければ…！という思いもありました。
そして、一番の参加理由は気になるセッションがあったことです。これについてはまた後述します。

#ステップアップセッション
今回のJJUG CCC 2019 fallからステップアップセッションが追加されました。:clap:
ステップアップセッションとは、Javaを学び始めて数年以内の初級者を対象としているようです。
私が受けたセッションもステップアップセッションです。

####ステップアップセッションの感想
- ステップアップセッションがあることで初参加者、技術的に不安がある人でも安心
- スピーカーの方が初級者向けを意識して、嚙み砕いて説明してくださる
- 扱う内容によっては、難しいものもある
- Javaを学び始めて数年以内を対象としているので、それなりの基礎知識は必要

以上が受けてみての感想です。
ステップアップセッションという名のとおり、自分の学んだ知識を固めたい方、Java初級者から抜け出したい方にはオススメなセッションだと思いました！

#Javaで学ぶオブジェクト指向プログラミングの基礎知識　増田亨さん
私がこのJJUGに参加を決めた一番の理由は、このセッションです。

オブジェクト指向…。正直、私は全く理解ができていません。
オブジェクト指向を調べる度に頭を抱えていました。

こちらのセッションでは、オブジェクト指向の基礎について、分かりやすくお話してくださいました。

####セッション内容
- オブジェクト指向はモジュール性とシームレス性の要素がある
- 型とカプセル化が分かれば、オブジェクト指向が理解しやすくなる
- 型は値の範囲と操作を制限
- 型は概念、型をコード化したものがクラス
- 型をクラスで実体化することをカプセル化
…etc

「型ってあれでしょう…intとかstringとか…」としか思っていなかった私ですが、お話を聞いて型の見方が変わりました！
ずっと謎な存在だったオブジェクト指向について、このセッションのおかげで理解できそうな気がします。
本当に受けて良かったです。

増田さんのtwitterはこちらです : https://twitter.com/masuda220
セッションの資料はこちらにまとまっています : https://github.com/jjug-ccc/slides-articles-2019Fall

#最後に
他にもまだまだ魅力的なセッションがありますので、私のような新人の方でもぜひ参加してほしいと思います。

この業界に入った以上は勉強は不可欠になると思うので、1人で勉強するのが難しい方はこのようなイベントはオススメです。
私もそのタイプです。1人だと勉強が続きません…。

最初は参加することに不安はありましたが、とても刺激になりました。
次回もまた参加したいと思います。
なぜWebに開示した情報を消してしまうのか。あるいはなぜwebに掲載しないか。

いくつかの公的な組織が ウェブに開示した情報を消してしまうことがある。

あるいは、紙で配布している（た）情報をWebに掲載しないことがある。

いろいろなデータが機械学習にとって重要である。

一覧以外の場所にあるかもしれず、順次調査する。
順に調べながら、補充する方法を検討予定。


# 電気・電子・情報関係学会東海支部連合大会
https://www.ipsj-tokai.jp/event/rengo.html

2010年から2019年までの一覧がある。

リンク切れは
http://www2.iee.or.jp/~tokai/rengo2016/
http://www2.iee.or.jp/~tokai/rengo2013/
http://www2.iee.or.jp/~tokai/rengo2010/


#　名古屋市工業研究所業務年報

平成２２年から平成３０年まで。それ以前の未掲載理由は未記載。

https://www.nmiri.city.nagoya.jp/techinfo_8.html

# 愛知県警　交通死亡事故

## 交通死亡事故発生マップ

平成３０年、令和元年だけ掲載。それ以前の未掲載理由は未記載。
https://www.pref.aichi.jp/police/koutsu/map/

## 交通死亡事故分析
過去5年。それ以前の未掲載理由は未記載。
https://www.pref.aichi.jp/police/koutsu/jiko/koutsu-s/jikoboushinopoint.html

# 文書履歴(document history)
ver. 0.01 初稿 20191027
ver. 0.04 URL追記　20230302

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
Amazon Web Services (AWS)サービスの正式名称・略称・読み方まとめ #17 (サテライト)

Amazon Web Services (AWS)のサービスで正式名称や略称はともかく、読み方がわからずに困ることがよくあるのでまとめてみました。

Amazon Web Services (AWS) - Cloud Computing Services
https://aws.amazon.com/


まとめルールについては下記を参考ください。

Amazon Web Services (AWS)サービスの正式名称・略称・読み方まとめ #1 (コンピューティング) - Qiita
https://qiita.com/kai_kou/items/a6795dbab7e707b0d1a6

全サービスを並べたチートシートもあるよ！

Amazon Web Services (AWS)サービスの正式名称・略称・読み方チートシート - Qiita
https://qiita.com/kai_kou/items/cb29d261c8acc49fd22a


間違いや、こんな呼び方あるよーなどありましたらコメントお願いします！


## Satellite - サテライト

### AWS Ground Station

- 正式名称: AWS Ground Station
- https://docs.aws.amazon.com/ground-station/?id=docs_gateway
- 読み方: グラウンド ステーション
- 略称: なし
- 俗称: なし


## 他のまとめ

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#1 \(コンピューティング\) \- Qiita](https://qiita.com/kai_kou/items/a6795dbab7e707b0d1a6)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#2 \(ストレージ\) \- Qiita](https://qiita.com/kai_kou/items/a8ba7a17dd88e9763fbf)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#3 \(データベース\) \- Qiita](https://qiita.com/kai_kou/items/26dcbd7846205efbe48f)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#4 \(開発者用ツール\) \- Qiita](https://qiita.com/kai_kou/items/e459647883dd00cda939)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#5 \(セキュリティ、アイデンティティ、コンプライアンス\) \- Qiita](https://qiita.com/kai_kou/items/5c5d4d9c543fc19a88c4)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#6 \(暗号化と PKI\) \- Qiita](https://qiita.com/kai_kou/items/e81c55a33f4e3ee7b4c7)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#7 \(機械学習\) \- Qiita](https://qiita.com/kai_kou/items/80c9759b6849ad7898f4)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#8 \(マネジメントとガバナンス\) \- Qiita](https://qiita.com/kai_kou/items/145fa47d56bb9aa57134)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#9 \(移行と転送\) \- Qiita](https://qiita.com/kai_kou/items/965cf87628fb12e23164)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#10 \(モバイル\) \- Qiita](https://qiita.com/kai_kou/items/36cc134277e3e3e6cac4)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#11 \(ネットワーキングとコンテンツ配信\) \- Qiita](https://qiita.com/kai_kou/items/1e1855248bd2ebe90f26)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#12 \(メディアサービス\) \- Qiita](https://qiita.com/kai_kou/items/7653a09c8418ff46c2e2)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#13 \(エンドユーザーコンピューティング\) \- Qiita](https://qiita.com/kai_kou/items/ae0aaad7f5019841df40)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#14 \(分析\) \- Qiita](https://qiita.com/kai_kou/items/3f31ce445cbf597d1e7f)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#15 \(アプリケーション統合\) \- Qiita](https://qiita.com/kai_kou/items/97af297a11fa16a1df3c)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#16 \(ビジネスアプリケーション\) \- Qiita](https://qiita.com/kai_kou/items/da941eec64dba4f50d12)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#17 \(サテライト\) \- Qiita](https://qiita.com/kai_kou/items/58434ec361f85cfc2c02)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#18 \(ロボット工学\) \- Qiita](https://qiita.com/kai_kou/items/af28c78d10ad4eb42cce)
【Rails on Docker】Modelの全件取得（all）ができなくなって困った

# Problem
`rails console`でとあるモデルを`all`で全件取得しようとしたところ以下のエラーに遭遇。

```
[1] pry(main)> User.all
  Member Load (9.3ms)  SELECT "users".* FROM "users" ORDER BY "users"."created_at" ASC
less: unrecognized option: X
BusyBox v1.30.1 (2019-10-26 11:23:07 UTC) multi-call binary.

Usage: less [-EFIMmNSRh~] [FILE]...
  1 FROM ruby:2.6.5-alpine3.10

View FILE (or stdin) one screenful at a time

	-E	Quit once the end of a file is reached
	-F	Quit if entire file fits on first screen
	-I	Ignore case in all searches
	-M,-m	Display status line with line numbers
		and percentage through the file
	-N	Prefix line number to each line
	-S	Truncate long lines
	-R	Remove color escape codes in input
	-~	Suppress ~s displayed past EOF
```

なんかできるモデルとできないモデルがあって困った。
なんとなく件数が少ないモデルは見えるけど多いモデルはエラーになる。

# Trouble Shooting
結論からいえば、Alpine LinuxをベースとしてDocker上でRailsを動かしていたのですが、Alpine Linuxには`less`が標準装備されていないためこうなるらしい。
`hirb`とか使っているからpager機能がついているのかな...その時less使ってるのかな...
まぁとりあえず復旧だ。

```dockerfile:Dockerfile
RUN apk add --update --no-cache less
```

```
docker-compose build
```

エラー出なくなった。

# Reference
[docker alpineでpryデバッグ中に less -Rが立ち上がらない - Qiita](https://qiita.com/youkyll/items/0f5914e13a85265e8119)
N+1問題を解決ゾロリ ❏Rails❏

#【結論】includesを使う
####データベースにアクセスする回数を減らそう

データを取ってくる際にSQLというものが発行されます。

アソシエーションを組んでいる場合、子要素のデータを取ってくる時もあるでしょう。
例えばこんな時

```ruby:index.html.haml
- @tweets.each do |tweet|
  = tweet.text
  = tweet.user.nickname
```
tweetsテーブルとusersテーブルからデータを取ってきてます
この時SQLは通常(tweetsテーブル)＋１回(usersテーブル)発行されてしまいます。

SQLが多いと処理が重くなるので、１回で関連するデータを一気に持ってきちゃおうぜ！って話です。

UserモデルとTweetモデルが以下のアソシエーションを組んでいるとします。

```ruby:user.rb
has_many :tweets
```

```ruby:tweet.rb
belongs_to :user
```

<br>
###【tweetsコントローラーを編集】
`includes (:モデル名)`
これで一気に関連データまで取ってくることができます。

```ruby:tweets_controller.rb
def index
  @tweets = Tweet.includes(:user)  #allは省略可
end
```

####これでN+1問題はバッチリ解決です！

<br>
ではまた！
Active Storageで画像アップロード機能を実装や！ ❏Rails❏

#【その1】インストール
※Rails 5.2から搭載されています。

```:ターミナル
rails active_storage:install
rails db:migrate
```

#【その2】モデルに設定を追記
1つのファイルなら`has_one_attached :カラム名`
複数ファイルなら`has_many_attached :カラム名`

```ruby:モデル
has_one_attached :avatar
has_many_attached :images
```

実際にテーブルにカラムを追加する必要はありません。

#【その3】表示する
```ruby:ビューファイル
user.avatar
```
これを好きなところへ書いてください。
もちろんimage_tagなどを添えて。


<br>
超参考
>https://railsguides.jp/active_storage_overview.html

<br>
ではまた！
before_action ❏Rails❏

#いつ使うの
before_actionを使えば、すべてのアクションのが実行される前に指定したメソッドを呼び、共通の処理を実行することができます。

#使い方
```ruby
before_action :メソッド名
```

これをコントローラーの一番上の書きます。

<br>
オプションとしてonlyとexceptがあります。

only: [:アクションA]
→アクションAのときのみ

except: [:アクションB]
→アクションB以外のとき

#例

```ruby:tweets_controller.rb
class TweetsController < ApplicationController

  before_action :move_to_index, except: [:index]

  def index
    @tweets = Tweet.all
  end

  def new
  end

  中略

  def move_to_index
    redirect_to action: :index unless user_signed_in?
  end
end
```

indexアクション以外のとき、まず初めにmove_to_indexを実行します。

move_to_indexはログインしていない場合に、indexアクションへ遷移させるというものです。
これで、ログインしていないと新規投稿などができなくなります。

<br>
<br>
ちなみにdeviseがインストールされている場合は、
authenticate_user!というヘルパーメソッドを使って省略できます。

```ruby:tweets_controller.rb
class TweetsController < ApplicationController
  before_action :authenticate_user!, except: [:index]

  def index
  end

  def new
  end

  中略

end
```
<br>
deviseのヘルパーメソッドはこちらへ
>https://qiita.com/drafts/5c3c4abd35af82b3e7c3

<br>
ではまた！
ローカルマシンでSonarQubeサーバを起動してソースコード解析を実行する（Docker）

件名の通りです。環境はLinuxを想定してます。

まずは、以下の内容で、Makefileを用意します。

```Makefile
run-sonar: ### start sonarqube server.
	docker rm -f sonarqube || true
	docker run -d --name sonarqube \
		-p 9000:9000 \
		-v sonar-conf:/opt/sonarqube/conf \
		-v sonar-data:/opt/sonarqube/data \
		-v sonar-logs:/opt/sonarqube/logs \
		-v sonar-extensions:/opt/sonarqube/extensions \
		sonarqube
	# access to http://localhost:9000 after started(a few minitus)

scan: ### analysis with sonar-scanner, send result to sonarqube server.
	docker run --rm \
		--volume `pwd`:/workspace \
		--link sonarqube \
		satotka/sonar-scanner \
			-Dsonar.sources=. \
			-Dsonar.host.url=http://sonarqube:9000 \
			-Dsonar.projectKey=app-dev \
			-Dsonar.exclusions=static/**/bootstrap.css
```

Localマシン上で、SonarQubeのサーバをDockerで起動。

```bash
make run-sonar
```

サーバが起動した事を確認し、ソースコードを解析します。

```bash
make scan
```

以上。
年末まで毎日webサイトを作り続ける大学生 〜40日目 スクロールに合わせて背景が動くパララックスサイトを作る〜

##はじめに
こんにちは！@70days_jsです。

昨日に引き続きパララックスです。
スクロールに合わせて背景が動くパララックスのサイトを作りました。
（ついでに以前作ったナビバーとフッターもつけてみました）


今日は40日目。(2019/11/27)
よろしくお願いします。

##サイトURL
https://sin2cos21.github.io/day40.html

##やったこと
スクロールに合わせて背景が動くパララックスのサイトを作りました。↓
![test2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516248/ed63f9dc-bd52-c318-ec9f-2979f2019371.gif)

スクロールして下に移動するたびに背景が微妙に動いていますね。
htmlはheader, main, footerの三部構成で作りました。
headerとfooterは以前の成果物なので省略します。

ではmainを見ていきましょう。

```html
    <main>
        <!-- background用のdiv -->
        <div id="test">
        </div>

        <div class="contents-wrapper">
            <h2>Obama's Speech</h2>
            <div id="main-contents">
　　　　　　　　　　　　<!--　オバマ大統領の演説文 長いので省略 -->
            </div>
        </div>
    </main>
```

mainの中にはdivが2つあり、最初のdivは背景画像を表示する役割をしています。
次のdivはオバマ大統領の演説文を表示するためのdivです。

背景（id="test")のcss↓

```css
#test {
    width: 150vw;
    height: 100vh;
    position: fixed;
    top: 0;
    background-image: url('画像のURL');
    z-index: -100;
}
```

背景画像に見せるためにfixedで固定しています。
スクロールしたら背景を横にスライドさせていくので、widthを大きめにとっています。
背景になるようにz-indexで低い数字をつけています。

次はJavaScript↓

```javascript
//bodyの長さを取得
let pageHeight = document.body.scrollHeight;
//viewportの長さ
let viewportHeight = window.innerHeight;
// スクロールできる量を取得
let scrollHeigt = pageHeight - viewportHeight;

window.addEventListener('scroll', function () {
    // 現在のスクロール量を取得
    let scroll = window.pageYOffset;
    test.style.left = -(scroll / 18) + 'px';
}, false);
```

JavaScriptはこれで全てです。
基本的にコメントに書いてある通りですが、一点だけ。

> test.style.left = -(scroll / 18) + 'px';

ここの計算式の「18」という数字は感覚で書きました。
ついでに言うと、画像を囲むdivのサイズを「150vw」にしたのも、感覚です。

> \#test {
  width: 150vw;
  ...

実は今回、スクロール時の横移動の割合と画像サイズの調整がうまくできませんでした。
上のgifはデスクトップバージョンでうまく動いているように見えますが、スマホサイズにすると画像の幅がが足りず途中から背景画像がなくなってしまっています。↓

![test2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516248/3e426812-6df2-9392-b9d7-f0ef112be0b6.gif)

pcとスマホではどうしてもスマホが縦長になってしまうので、画像の幅的に、どうやっても画像を最後まで表示することができませんでした。
 
##今日のメモ

- bodyの長さ（pageの長さ）・・・document.body.scrollHeight
- viewportの長さ・・・window.innerHeight
- bodyの長さ - viewportの長さ ＝ 総スクロール量

ついでに衝撃の事実。↓（[ CSSについて誰も私に教えてくれなかった大切なこと -プロパティやセレクタがパフォーマンスに与える影響 | コリス](https://coliss.com/articles/build-websites/operation/css/things-nobody-ever-taught-me-about-css.html) さんから引用）
> ブラウザはCSSを解析するとき、CSSのセレクタを右から左に解決します
> 右にあるセレクタがより特定的であるほど、ブラウザはCSSのプロパティを見つけるときに効率的になる

- 逆にいうと、子孫セレクタとかはかなりの負荷がかかるらしい・・・


##感想
スマホ版の表示で、うまく実装する方法を見つけられなかったのが悔しいです。
最初はpc版だけを見ていて、今日はうまくいったって喜んだのにな・・・
また一つ課題ができてしまった。頑張ろう。

最後までお読みいただきありがとうございます。明日も投稿しますのでよろしくお願い致します。



##参考

1. [ CSSについて誰も私に教えてくれなかった大切なこと -プロパティやセレクタがパフォーマンスに与える影響 | コリス](https://coliss.com/articles/build-websites/operation/css/things-nobody-ever-taught-me-about-css.html) 
2. [オバマ氏広島訪問での演説の全文（英語）　　:日本経済新聞](https://www.nikkei.com/article/DGXMZO02903620X20C16A5FF1000/)
3. [宇宙 粒子 振動 - Pixabayの無料画像](https://pixabay.com/ja/illustrations/%E5%AE%87%E5%AE%99-%E7%B2%92%E5%AD%90-%E6%8C%AF%E5%8B%95-%E3%83%A9%E3%82%A4%E3%83%B3-%E6%B3%A2-1566161/)


勉強になりました。ありがとうございます！
Node.js で無限ループしつつ、一定周期で処理をしたい

メモ。
Node.js で無限ループしつつ、一定周期で処理をしたいという要件があった。
（具体的には SIGTERM シグナルを受けてから1秒毎に標準出力に文字列を出力したい）
上記について Node.js のサイトにずばり書いてあった。

["Infinite Loop" Execution ~ setInterval()](https://nodejs.org/de/docs/guides/timers-in-node/#infinite-loop-execution-setinterval)


```node.js
function intervalFunc() {
  console.log('Cant stop me now!');
}

setInterval(intervalFunc, 1500);
```

この場合、1.5秒毎に `intervalFunc()` が実行される。
必要に応じて時間や処理内容を変えれば良い。

Node.js v10.17.0 で動作確認済み。
VBS 西暦を和暦に変換する関数 令和レジストリ設定済み版


ただし機種によってはあらたにインストールが必要になります。
https://blogs.technet.microsoft.com/jperablog/2018/06/25/netframework/
https://support.microsoft.com/ja-jp/help/4477957/new-japanese-era-updates-for-net-framework
.Net FrameWork 3.5のアップデートが必要になる。これは自動ではインストールされない。
しかし、これがVBSで使えるとは思っていなかったのでサボっていたのが原因らしい。

```vb
Function fnAcToJCalender(Dt)
Dim jc
Dim lngJapaneseEraNumber, r, strGengou
Dim lngstrJapaneseEraYear '元年は01年ではなく元年にする場合、文字列型でも長整数型でもない
If IsDate(Dt) = False Then
Err.Raise vbObjectError + 513 ," fnAcToJCalender値を見直してください","日付時刻データ型と判断できません"
Exit Function
End if
Set jc = CreateObject("System.Globalization.JapaneseCalendar")
lngJapaneseEraNumber = jc.GetEra(Dt)
Select Case lngJapaneseEraNumber
Case 1: strGengou = "明治"
Case 2: strGengou = "大正"
Case 3: strGengou = "昭和"
Case 4: strGengou = "平成"
Case Else: strGengou = "令和"
End Select
lngstrJapaneseEraYear = jc.GetYear(Dt)
If lngstrJapaneseEraYear = 1 Then lngstrJapaneseEraYear = "元"
fnAcToJCalender = strGengou & lngstrJapaneseEraYear & "年" & jc.GetMonth(Dt) & "月" _
& jc.GetDayOfMonth(Dt) & "日"
End Function
```

System.Globalization.JapaneseCalenderがVBSでも使えるとは・・・
またレジストリに令和が設定されていると、Case Elseが令和になります。
以前はCase３昭和、Case Else 平成でした。

あとでリンク先を紹介しますが、これが2011年の記事だったので、もしや・・・と思い試したところ、令和になっていると令和が返ってきます。
VBSでも和暦で、令和が取得できるのです。
[C#] Publishされた単一EXEが展開する先の一時フォルダのパス取得

地味に困ったので投稿。

```
Assembly.GetExecutingAssembly().Location
```
以上のコードを、展開された先で実行されるdll上で実行すれば取得できる。

```
Environment.GetCommandLineArgs()[0]
```
因みに、展開元のパスは基本的に上のコードで取得している。

```
<PublishSingleFile>true</PublishSingleFile>
```
現状、上のタグを追加してPublishされた単一EXEファイルを実行する際の展開先には、dllのみが展開されるだけで、pbdファイルが含まれていない。
それだとエラー時の詳細情報が取得できないので、それらを取得するためのpbdファイルを移動するために展開先のパスが必要だった。
何故、pdbファイルが展開されないのかは不明。。。

知っている方がいれば、教えていただけると幸いです。
swift UTF8からSJISに変換するときに、数値文字参照も使用する

# 問題 文字コード変換だけでは望ましい結果にならない
具体的にはしたらば掲示板(EUC-JP)や旧2ちゃんねる互換掲示板(ShiftJIS)を想定しています。

ShiftJISのウェブサーバにPOSTしたいのですが、変換できない文字があると
String.data(using: .shiftJIS)だと失敗します。

String.data(using: .shiftJIS, allowLossyConversion: true)
を使うと失敗はしませんが変換できなかった部分が**?**になって「何これ?」ってなります。


# 解決方法
1. 1文字ごとにShiftJIS(EUC-JP)に変換できるか確認する
2. 変換できない場合にはhtmlの文字参照に起きかえる
3. ShiftJIS(EUC-JP)変換を行なう
というステップを取ります。



```
var postStr: String = "(´･ω･｀)"
let postStrChaRef: String = postStr.characterReferenceSJIS() // 文字参照変換
let postData:Data? = postStrChaRef.data(using: .shiftJIS)  // SJIS変換

import Foundation
extension String {
    func characterReferenceSJIS() -> String {
        var buf = ""
        for c in self.map({ String($0) }) {
            if c.canBeConverted(to: String.Encoding.shiftJIS) {
                buf.append(c)
            } else {
                let buf1 = NSMutableString(string: c)
                CFStringTransform(buf1, nil, kCFStringTransformToXMLHex, false)
                buf.append(buf1 as String)
            }
        }
        return buf
    }
}
```
Address already in use でPHPのビルトインサーバーが立ち上がらない時の対処方法

phpのビルトインサーバーを立ち上げようとした際に、

```terminal
php -S 192.168.33.10:8000
```

のコマンドを実行すると、

```terminal
Failed to listen on 192.168.33.10:8000 (reason: Address already in use)
```

等とエラーが出てしまう時の対処方法のメモ。

##解決手順

1.使用しているPID番号（プロセスID）を確認

```terminal
ps ax | grep php
```

ターミナルで上記のように入力すると、現在しているポートが表示される。

```terminal
[vagrant@localhost My_php]$ ps ax | grep php
 9375 pts/0    S+     0:00 php -S 192.168.33.10:8000 -t public_html/
```

※一番左の数字が「PID番号」なので、上記の例だと「9375」


2.既に解放しているプロセスを終了する

```terminal
kill PID番号
```

3.再度、php -S 192.168.33.10:8000 を実行

```terminal
php -S 192.168.33.10:8000
PHP 7.1.33 Development Server started at Mon Nov 25 03:37:42 2019
Listening on http://192.168.33.10:8000
Document root is /home/vagrant/My_php
Press Ctrl-C to quit.
```

これでビルトインサーバーが立ち上がるはずです。
やねうら王を AWS Lambda で動かす

[やねうら王](https://github.com/yaneurao/YaneuraOu) は 2019 年現在最も強い将棋 AI の一つです。AWS Lambda 上で実行できれば、API Gateway と連携したりして夢が広がります。
やねうら王 V4.88 を AWS Lambda 向けにビルドしてみよう。

# 実行環境

AWS Lambda の実行環境 OS は Amazon Linux 2 なので、Amazon Linux 2 上でビルドすれば十分です。
SIMD 拡張命令は 2017 年時点で SSE 4.2 が動くらしい。

- [AWS Lambda ランタイム](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html)
- [AWS LambdaのCPUを見てみる](https://qiita.com/kurimoto/items/eca091cccc54d7c07634)

# ビルド

[Amazon Linux の Docker イメージ](https://hub.docker.com/_/amazonlinux/) を使うと楽です。
ビルドに必要なパッケージは下記の通り。

```Dockerfile
FROM amazonlinux:2.0.20191016.0

RUN yum install -y gcc gcc-c++ make build-essential git
```

[Makefile](https://github.com/yaneurao/YaneuraOu/blob/V4.88/source/Makefile) で `TARGET_CPU = SSE42`, `COMPILER = g++` の 2 箇所を変更した後、

```
$ make normal
```

コマンドですんなりビルドが通ります。
`Dockerfile` と `Makefile` の全体像は下記の通り。

https://github.com/na-o-ys/shogi-api/tree/549418f0e8f3ee1dd686bf537dda9198b51cba3a/builder/YO488

# 実行

評価関数とあわせて何らかの方法で Lambda にバイナリ配置して、お好きなように呼べば良いです。
[Serverless Framework](https://serverless.com/) を利用して API Gateway から呼び出す場合のサンプルコードはこちら。

https://github.com/na-o-ys/shogi-api/blob/549418f0e8f3ee1dd686bf537dda9198b51cba3a/serverless/src/handler.ts

# (おまけ) dolphin 1.0.1

めきっと氏 (https://twitter.com/_illqha) の dolphin1 もほとんど同じ流れで AWS Lambda 向けにビルドできます。

https://github.com/na-o-ys/shogi-api/tree/549418f0e8f3ee1dd686bf537dda9198b51cba3a/builder/dolphin101
クソアプリを作った件

# クソアプリ Advent Calendar 2019 に参加したので

ウンコさんのデスクトップアクセサリを作りました！

**Windows 10**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/7cda30e9-3a9b-758e-d942-8fc59dbfd207.png)

**macOS Catalina**
![スクリーンショット 2019-11-27 2.24.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/4a73b7d0-3be8-8c1f-d4a6-3439c4d470ac.png)

# 機能

このデスクトップアクセサリでは以下の機能があります。
特に、ダブルクリックで[アンサイクロペディア](https://ansaikuropedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8)の記事をランダムで見れるのって超便利だよね～！

* Windows / macOS に対応
* ダブルクリックでアンサイクロペディアをブラウザに表示
* ウンコさんに７色の後光
* アバウト画面ではリップルエフェクト
* ちゃんと前回の起動位置を覚えて次に起動するときはそこで起動
* タスクトレイ/ステータスバーに常駐
* 終了時、水洗で流される！

### 実行時の動画
Qiita にアップできるように色数を相当落としたので大分汚いですが…

![unko.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/bfcb8036-3565-335c-a235-49e3c8bb8c24.gif)

# ソース
**リポジトリ**
https://bitbucket.org/freeonterminate/kusoapp/src/master/

**実行ファイル**
https://bitbucket.org/freeonterminate/kusoapp/downloads/

このアプリは [Delphi](https://www.embarcadero.com/jp/products/delphi) で作成しました！
ビルドする場合は [Delphi 10.3 Rio Release 3 Community Edition (無料版)](https://www.embarcadero.com/jp/products/delphi/starter)でどうぞ！

# 解説
ほとんど解説するようなことも無く今までの総集編です。

**ウンコ大回転**
https://qiita.com/pik/items/a0dc426b2089dbce8bc3

**FireMonkey で Window Drag**
https://qiita.com/pik/items/907641319e4de4d74805

**タスクトレイ常駐コンポーネント**
https://qiita.com/pik/items/bd3448e2cf0c4c528027

## アンサイクロペディア API

アンサイクロペディアも [Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8
) と同じで [MediaWiki](https://www.mediawiki.org/wiki/Template:Main_page/ja) で作成されているため MediaWiki API を使って情報を取得できます。

**MediaWiki API**
https://www.mediawiki.org/wiki/API:Main_page/ja

MeidaWiki API については解説記事が多くあるのでここでは詳しくは書きません。
今回は以下のように記事をランダムで取得しています。

https://ja.uncyclopedia.info/api.php?format=json&action=query&rnnamespace=0&list=random

## Json Serializer
MediaWiki API は Json と XML で値を返せるのですが今回は Json を採用しました。
何故かというと、Delphi にも Json Serializer があり、これを使うと定型の JSON を非常に簡単に扱えるからです。

例えば上記のアンサイクロペディアの API を叩くと下記の様な JSON が返ってきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/70816407-b7c9-3bc8-2dc1-9143f494c39a.png)

その構造をクラスに落とし込みます。

```pascal
// Json の continue を定義したクラス
TContinue = class
private var
  RnContinue: String;
  Continue: String;
end;

// Json の random 内の要素を定義したクラス
TPage = class
private var
  Id: UInt64;
  NS: UInt64;
  Title: String;
end;

// Json の query を定義したクラス
TQuery = class
private var
  Random: TArray<TPage>;
end;

// 全体を表すクラス
TRandomResult = class
private var
  BatchComplete: String;
  Continue: TContinue;
  Query: TQuery;
end;
```

ここで取得した Json を TJsonSerializer.Deserialize メソッドに渡すと、クラスが生成され Json の値がセットされます。

```pascal
var S := TJsonSerializer.Create;
try
  var R := S.Deserialize<TRandomResult>(JSON);
  Writeln(R.Query.Random[0].Title); // 値の取得
finally
  S.DisposeOf;
end;
```

上記のように簡単にアクセスできます。

# まとめ

クソアプリ作るのが一番楽しい！！
【初心者向け】ラムダ式とStreamAPIについて

Java8から導入されたラムダ式の記述について備忘録と共に初心者向けに解説していきます。

# ラムダ式とは
ラムダ式とは、Java8から導入された、メソッドを変数のように扱うことのできる記述様式のことです。
ラムダ式を使用することで、記述が簡略化でき、より読みやすいコードを書けるようになります。

また、StreamAPIなどの関数型インターフェースを使用する際にラムダ式を使用すると、非常に簡単に記述ができます！！

#ラムダ式の記述方法
まずは早速ですが、ラムダ式の実際の記述方法について説明します。

```RunnableLamda.java
public static void main(String[] args) {
  Runnable runner = () -> System.out.println("Hello");
  runner.run(); //Hello
}
```

上記はrunnableインターフェースをラムダ式を用いて記述したものです。
匿名クラスから、さらに「new Runnabl(){}」と「public void run」を省略した形になります。

また、ラムダ式で使用できるのは抽象メソッドが一つのインターフェースのみとなるので注意が必要です。

引数の型はコンパイラーによって自動的に推定されるので記述する必要はありません。ただ、いつも通りに型を記述してもコンパイルエラーになることはありません。
※引数が複数あり、片方だけ省略するとコンパイルエラーになります。

#StreamAPI
ラムダ式と同じくJava 8で追加された機能「Stream API」は、ListやCollectionなどの要素の集合に対して処理を行う場合に便利なAPIです。

StreamAPIはラムダ式を前提として作られているので非常に相性が良いです。

例えば、1~6の中で偶数だけを表示する処理は以下のように書くことができます。

```StreamLamda.java
List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5, 6);
integerList.stream() 
        .filter(i -> i % 2 == 0) 
        .forEach(i -> System.out.println(i)); 
```

他のStreamAPIも紹介していきます。
#forEach
Listの中身をループさせます。非常に簡単に記述できます。

```ForEachSample.java
Arrays.asList(new Integer[] { 1, 2, 3, 4, 5, 6 }).forEach(System.out::println);
```

#filter
フィルタリングをするための中間操作で、if文の役目を果たします。
引数には T -> boolean となるラムダ式を渡してあげます。
式がtrueの要素だけを集めます。

```FilterSample.java
Arrays.asList(new Integer[] { 1, 2, 3, 4, 5, 6 }).stream().filter(x -> x > 3).forEach(System.out::println);
```

#map
要素を変換できる中間操作で、要素に対して四則演算をしたり、型の変換まで行えます。

```MapSample.java
List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5, 6);
integerList.stream() 
        .map(i -> "要素は" + i + "です") 
        .forEach(i -> System.out.println(i)); 
```

#最後に
今回紹介したラムダ式やStreamAPIは、従来の書き方で書くこともできます。
しかし、開発現場では自分でコーディングをするだけでなく、他の人が書いたコードを読む機会も多くあります。
他人のプログラムにはラムダ式やStreamAPIが含まれている可能性があるので、慣れておきましょう！
RubyとPythonとmap

一方の言語でのイメージが邪魔して、もう一方の言語での書き方が思い出せない時がたまにあるんです。

```python:Python
map(lambda n: str(n).rjust(3,"0"), [1,2,3])
>> ["001", "002", "003"]
```

```ruby:Ruby
[1,2,3].map{|n| n.to_s.rjust(3,"0")}
>> ["001", "002", "003"]
```
【Rails】統合テストによるリンクのテスト【Rails Tutorial 5章まとめ】

link_toと名前付きルートで作ったリンクが正常に表示され、機能しているかどうかを統合テストで確認する。
統合テストはアプリケーションの動作をシミュレートするために使用される。

```
$ rails generate integration_test site_layout
```

##テストの手順
①ルートURL (Homeページ) にGETリクエストを送る
②正しいページテンプレートが描画されているかどうか確かめる
③Home、Help、About、Contactの各ページへのリンクが正しく動くか確かめる

```test/integration/site_layout_test.rb
  test "layout links" do
    get root_path
    assert_template 'static_pages/home'
    assert_select "a[href=?]", root_path, count: 2
    assert_select "a[href=?]", help_path
    assert_select "a[href=?]", about_path
    assert_select "a[href=?]", contact_path
  end
```

```
assert_select "a[href=?]", about_path
```

はlink_toによって生成されたaタグを調べている。
？の部分に第二引数のパスが代入される。
countオプションによってリンクの個数も調べることができる。

assert_selectについては別記事にまとめたいと思っているが、分かりやすいサイトを見つけたのでここにメモしておく。
assert_selectの使い方
https://zariganitosh.hatenablog.jp/entry/20080405/1207455670

これ以降、レイアウトに新規のアクションとそのリンクを作成した場合は、このテストに書いていくことになる。
Poetryのすすめ

Pythonのパッケージ機構
------

- wheel: Pythonのパッケージ形式
    - Pythonのコードや共有ライブラリが入ったファイル (`*.whl`)
    - 他のパッケージに依存しているときはそれがメタデータに書いてある
- PyPI: The Python Package Index
    - 誰でもログインするとアップロードできる
    - 会社内用など、独自にIndex自体を立てることも出来る
- pip: パッケージインストーラ
    - パッケージをPyPIから探して来てインストールしてくれる
    - パッケージが依存しているパッケージも一緒にインストールくれる
    - 基本的にシステム(`/usr/lib/python3.x/site-package`)にインストールする

```
pip install numpy
```

---

Semantic Versioning
-------------------
https://semver.org/lang/ja/

`X.Y.Z` 形式のバージョン付けを採用している

1. APIの変更に互換性のない場合はメジャーバージョン(`X`)を、
2. 後方互換性があり機能性を追加した場合はマイナーバージョン(`Y`)を、
3. 後方互換性を伴うバグ修正をした場合はパッチバージョン(`Z`)を上げます。

```
pip install "numpy==1.15"
```

- `requirements.txt`というファイルに依存しているパッケージを列挙しておいてまとめてインストールする

```
pip install -r requirements.txt
```

---

複数のプロジェクトを開発する
--------------------------
- Project A
    - `tensorflow == 1.15`
    - 2.0系では動かない
- Project B
    - `tensorflow == 2.0`
    - 1.0系では動かない

システムに複数のバージョンのパッケージを同時にインストールする事は出来ない！

---

venv (virtualenv)
-----------
- プロジェクト毎にパッケージをインストールしたい
- Python3.3から標準に入った
    - Python2.x向けにvirtualenvというパッケージがあった

```shell
python3 -m venv path/to/new/venv  # venvの作成
source path/to/new/venv/bin/activate  # 有効化
```

- venv自体の管理は手動でやることになる
    - 典型的にはプロジェクト直下に `venv` ディレクトリを作る

---

pyproject.toml
--------------
- Pythonのプロジェクト管理の為の公式ファイルフォーマット
    - [PEP(Python Enhancement Proposals) 518](https://www.python.org/dev/peps/pep-0518)
    - パッケージ化の設定 `setup.py`, `setup.cfg` や 依存パッケージのリスト `requirements.txt` などを統合
    - pip 19.2からサポート
        - `setup.py`が無くても`pypoetry.toml`から`pip install`できる
- ツールごとに名前空間 `tool.${toolname}` を作って独自設定を記述することが出来る
    - ツール毎に別設定ファイルを作らなくてもよくなった

----

poetry
-------
- pyproject.tomlベースでプロジェクト管理をしてくれるツール
    - `poetry init` でpyproject.tomlを生成してくれる
- venvを勝手に作って管理してくれる
    - `poetry run [shell script]` で venv下でスクリプトを実行してくれる
- PyPIへのアップロード機能もある

```
[tool.poetry]
name = "hello"
version = "0.1.0"
description = "Hello Poetry!"

[tool.poetry.dependencies]
python = "^3.7"   # Python自体のバージョンも書ける（満たしてるかチェックしてくれるだけ）
numpy = "1.14"    # ここに依存しているパッケージを書いていく

[tool.poetry.dev-dependencies]

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"
```
「Babel 8 Release Plan」を眺める

次のBabelのメジャーバージョンである8の計画がここで見られる。数が多いので一部を取り上げる。

https://github.com/babel/babel/issues/10746

### 概要

- リリース予定は2020年初め
- 過去2回のメジャーバージョンに比べ移行は簡単になる
- バージョン8.0.0は破壊的変更**のみ**
- 同じ日にマイナーバージョンで破壊的で**ない**変更がリリースされる


### 初期化されてないクラスのフィールドを消さない (TypeScript/Flow)

https://github.com/babel/babel/issues/10039

```ts
class Foo { x: string }
```

といった型のみが宣言されたフィールドが今までは

```js
class Foo {}
```

と消されていたのが

```js
class Foo { x }
```

となり、実行時に`undefined`で初期化されるようになる。VueやMobxなどで、オブジェクトのキーをすべて初期化しなきゃいけないケースで楽になりそう。

> `console.log`すると違いがわかる
> <img width="254" alt="Screen Shot 2019-11-27 at 00.17.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206860/8fae0ef8-2d4d-9de2-c0de-1fedd1f82541.png">

Flow, TypeScriptそれぞれの言語の機能としてフィールドを消すように明示すると今までの動作を維持できる。

```ts
// Flow
class A {
  foo: string; // 消えない
  /*:: bar: number */ // 消える
}

// TypeScript (3.7)
class A {
  foo: string; // 消えない
  declare bar: number; // 消える
}
```

### `import()`からSystemJSへの変換で`@babel/plugin-proposal-dynamic-import`を必須にする

SystemJSに変換していない場合関係ない

### JSXでの不正なカンマ演算子をエラーにする

https://github.com/babel/babel/issues/8604

以下のようなコードが今まで許されていたのがパースエラーになる

```jsx
[<div>{3, 1}</div>, <div foo={hoge, fuga} />]
```

既に以下のようなコードに修正できる

```jsx
[<div>{(3, 1)}</div>, <div foo={{hoge, fuga}} />]
```

TypeScriptで変換した場合既にエラーになる (https://stackoverflow.com/questions/52139174/comma-operator-in-typescript-jsx-expressions)

そもそもカンマ演算子を使うことがまれだが、`<div foo={hoge, fuga}/>`のような書き方は間違えてやってしまいそう

### JSXのSpread PropertyをObject Spreadに変換する

https://github.com/babel/babel/issues/9652

```jsx
[<div {...props} />]
```

といった書き方が`Object.assign`などになっていたのが、Object Spread (`{foo: 1, ...props}`) の構文に変換されるようになる。

7.7.0で追加された`useSpread`オプションで同じ動作になるが、8からデフォルトになる。

### Nodeの必須バージョンが10.9以上に

Nodeの8.xが2019年末で終了するため。10.xのLTSは10.13から。

### `@babel/core`へのPeer Dependencyが`^8.0.0`になる

すべての`@babel/*`パッケージを8に上げれば影響はない
機械学習とミニバッチ学習の意義

# はじめに
これは機械学習におけるミニバッチ学習についてのメモです。機械学習の直観的な説明も兼ねています。

# 機械学習とは
機械学習はある与えたれたデータに内在すると仮定される規則を自動的に抽出する演算装置です。つまり、ある入力の組$ \boldsymbol{x}$に対して出力$\boldsymbol{t}$が既に得られているとき、そこに存在する規則を抽出することで、新たな入力の組$\boldsymbol{x}^{\prime}$に対応する$\boldsymbol{t}^{\prime}$を予想します。
この**規則**なるもの(重みと呼びます)を一般に行列$W$とすると、上の話は機械学習の出力$\boldsymbol{y}$(理想的には$\boldsymbol{t}$と一致するべき)を$$ \boldsymbol{y} = W \boldsymbol{x}\tag{1}$$としたとき$\boldsymbol{y}$と$\boldsymbol{t}$から求まる損失関数$$ L = \frac{1}{2}\|\|\boldsymbol{y}(\boldsymbol{x},W)-\boldsymbol{t}\|\|^{2}\tag{2}$$を可能な限り小さくするような$W$を求めるということに置き換えられます。

# ビッグデータとミニバッチ学習
さて、改めてビッグデータ$(\boldsymbol{x}\_{n},\boldsymbol{t}\_{n})$が得られたとします($n=1,2,\cdots,N$で$N$は十分大きい)。ここから重み$W$を抽出して出力が未知の入力$\boldsymbol{x}\^{\prime}$に対して相応しい出力$\boldsymbol{t}^{\prime}$を予測します。そのために$\boldsymbol{x}\_{n}$すべてに対する2乗和誤差
$$\frac{1}{N} \sum_{n=1}^{N}\|\|\boldsymbol{y}\_{n}(\boldsymbol{x}\_{n},W)-\boldsymbol{t}_{n} \|\|^{2} \tag{3}$$を最小とするような$W$を求めます。例えば、勾配降下法などの手法があります。

今、扱っているビッグデータのスケールは$N(\gg 1)$なので、たとえコンピュータといえど$W$を求めるために$n=1$から$N$まで愚直に微分計算をしていたのでは、計算量が膨大となり賢い方法とは言えません。そこで$N$のうち$M (\ll N)$個だけランダムにデータを取り出してこれに対して$$ \frac{1}{M} \sum_{m=1}^{M}\|\|\boldsymbol{y}\_{m}(\boldsymbol{x}\_{m},W)-\boldsymbol{t}_{m} \|\|^{2} \tag{4}$$を最小化することで、(3)のやり方に対して圧倒的に効率よく$W$を決定することができます。こうして得られた$W$は、与えられた全てのデータから求まったわけではありませんが、もとのデータのもつ規則の良い近似となっていることが多いです。このような学習手法をミニバッチ学習と呼びます。
※学習とはすなわち$W$を決定すること。具体的な実装はまた次に。
WSL2のGUI設定でつまずいたところ

# 簡単に言うと
たくさんのサイトで紹介されている方法を試してもエラーが発生する。

```
$ export DISPLAY=:0
$ GUI apps command
Error: Can't open display: :0
```

以下の方法でIPアドレスを指定することで解決した。

```
$ export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0
```

# WSL2の設定
多くの記事ではDISPLAY環境変数を以下のように紹介しています。

```
$ export DISPLAY=localhost:0.0
$ export DISPLAY=127.0.0.1:0.0
$ export DISPLAY=:0.0
$ export DISPLAY=:0
```

上記4つは全て同じ意味合いで、Xサーバの場所を指定しています。[1]
これらを、`.bashrc`等に記述することで、設定が反映されます。

しかし、これらの設定を行ったのにも関わらず、以下のエラーに遭遇しました。
GUIの表示ができない...

```
$ export DISPLAY=:0
$ GUI apps command
Error: Can't open display: :0
```

# 解決策
WSL2のIssue[2]を参考に、以下のコマンドを実行したところGUIを表示をすることができました。

```
$ export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0
```

詳しくコマンドを見ていきます。

## DISPLAY=$(色々):0
色々の処理から得られた結果を設定しています。例えば`aaa.b.c.d`という結果を得たのあれば、`DISPLAY=aaa.b.c.d:0.0`と言った具合にセットされます。

## cat /etc/resolv.conf

`resolv.conf`の内容を取得します。後述しますが、ここで得られたnameserverのIPアドレスを設定することにより、問題を解決することができました。

```
$ cat /etc/resolv.conf 
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver xxx.xx.xxx.x
```

## grep nameserver
`resolv.conf`から、nameserverという文字列が含まれる行を抽出します。

```
$ cat /etc/resolv.conf | grep nameserver
nameserver xxx.xx.xxx.x
```

## awk '{print $2}'
空白区切りで2番めの文字(IPアドレス)を取得します。

```
$ cat /etc/resolv.conf | grep nameserver | awk '{print $2}'
xxx.xx.xxx.x
$ cat /etc/resolv.conf | grep nameserver | awk '{print $1}'
nameserver
```

## 最終的に得られるもの
`resolv.conf`で記述されたnameserverのアドレスが設定され、`export DISPLAY=xxx.xx.xxx.x:0.0`となります。

# 解決した理由
問題が発生した理由として、`$ export DISPLAY=:0.0`をした際に、IPアドレスが意図したものに設定されていなかったことが考えられます。知識が乏しいのでこの程度の考察しかできませんが、IPアドレスが変わっても対応できるので、とりあえずの対策でした。

# おまけ
## VcXsrvの設定
1. Select display settings: どれでもいい
2. Select how to start clients: Start no client
3. Extra settings: 全てにチェック（デフォルトだと、Disable access controlはチェックされていない）

一応ファイアウォールの設定もしました。

# Ref.
1. WSL上にXサーバをインストールしてGUIを実現する（VcXsrv編） https://www.atmarkit.co.jp/ait/articles/1812/06/news040.html ↩
2. Can't use X-Server in WSL 2 https://github.com/microsoft/WSL/issues/4106 
3. WSL2におけるVcXsrvの設 https://qiita.com/ryoi084/items/0dff11134592d0bb895c
propsで親コンポーネントから子コンポーネントへデータを伝播するときに、静的な値を渡せばいいだけなのにv-bindを使ってしまい変数として認識されて、エラーになってしまった

propsで親コンポーネントから子コンポーネントへデータを伝播するときに、v-bindの使い方をよくわかっていないことに気が付いたのでメモ  :pencil: 

### 修正前

- v-bindでプロパティを指定すると、JavaScriptと認識されて（変数と認識されて）、動的にプロパティを受け渡すことができるが、なぜか勘違いしていて以下のようなコードを書いてしまっていた（動的に受け渡す必要がなくて、静的に受け渡しかった）
- これでundefined errorが発生してた :rolling_eyes:  


```html

<blog-post :blog-name="{{ $user->getBlogName() }}"></blog-post>
```


### 修正後

- プロパティで静的な値を渡しかったので以下がのようなコードを書けばよかった（`:` を取り除いた）

```html

<blog-post blog-name="{{ $user->getBlogName() }}"></blog-post>
```

### 参考

もっとちゃんとドキュメントを読まないと :pray: 

- [プロパティ — Vue\.js](https://jp.vuejs.org/v2/guide/components-props.html)

- [API — Vue\.js](https://jp.vuejs.org/v2/api/#v-bind) v-bind
【Rails】ルーティングと名前付きルート【Rails Tutorial 5章まとめ】

##ルートURL
rootを使い、ルートURLを指定する。

```config/routes.rb
root 'static_pages#home'
```
ルートURLは、root_pathまたはroot_urlで呼び出せる(名前付きルート)。

```
root_path -> '/'
root_url  -> 'http://www.example.com/'
```

前者はルートURL以下の文字を、後者はURLの全文を表示する。
基本的には前者を使い、後者はリダイレクトの場合に使用する。

##そのほかのルーティング

```config/routes.rb
get 'static_pages/help'

get  '/help', to: 'static_pages#help'
```

前者の場合static_pagesコントローラのhelpアクションに自動で繋がる。
名前付きルートはstatic_pages_help_pathのようになる。

とはいえ長いしURLの自由度が無いので基本的には後者のようにして、任意のURLに対してコントローラとアクションを指定する。
名前付きルートはhelp_pathやhelp_urlのようになる。

コントローラのテストも修正しておく。

```test/controllers/static_pages_controller_test.rb
 test "should get home" do
    get root_path
    assert_response :success
    assert_select "title", "Ruby on Rails Tutorial Sample App"
  end

  test "should get help" do
    get help_path
    assert_response :success
    assert_select "title", "Help | Ruby on Rails Tutorial Sample App"
  end
```

##名前付きルートを任意の名前にする
as:オプションを使うと名前付きルートの名前を変えられる。

```config/routes.rb
get  '/help', to: 'static_pages#help', as: 'helf'
```
macOS Catalina で Python 3.5.3 未満をインストールする

# 依存関係

* Homebrew
* pyenv(anyenv, asdf)

# いそがしいぞ

```sh
cd $(brew --prefix)/Library/Taps/homebrew/homebrew-core/Formula/
wget https://github.com/Homebrew/homebrew-core/raw/8b9d6d688f483a0f33fcfc93d433de501b9c3513/Formula/openssl.rb
HOMEBREW_NO_AUTO_UPDATE=1 brew install openssl
pyenv install 3.5.2
```

# なにこれ

* Python 3.5.3 から OpenSSL 1.1.0 を使用しているらしい。(Python 3.5.3 未満は OpenSSL 1.1.0 でインストールできない？)
* Homebrew では、現在 OpenSSL 1.1.0 しかインストールできない。
* 無理やり Homebrew で OpenSSL 1.0.2 をインストールしている。
2019年7月7日からほぼ毎日投稿している話 ~200投稿目の振り返り~

# 目的

- 200投稿目のため、今までのやって正解だったところなどをまとめ、なんで毎日投稿することができたのかを棚卸する。

# やって正解だったところ

- 記事をgit管理した。
- 体調不良や外出などを見越して投稿内容の下書きを常に10件弱ストックしておいた。
- しょーもない内容でもいいから記事にした。
- 自分の記事なんて誰も見ていないと思いとにかく書いた。
- 自分の書きたい内容に素直に書いた。
- 記事内容の優先度をつけた。
- モバイル端末からの投稿を積極的に行なった。
- 話し相手もいないので会社の昼休みにモバイル端末から記事を書いた。
- 会社で実施している内容もコンプライアンスを守り発信した。

# なんで毎日投稿できたのか

- 「いいね」や「ストック」や「コメント」などのアクションがつくようになった。
- 勉強会やmeetupに参加した内容をまとめると参加者や登壇者、主催者からアクションがもらえた。
- 自分が経験したエラー解決法が思いの外必要とされている気がした。
- 意外と探してみると自分ほど簡単な場所で詰まっている人はおらず、一定のニーズがあった。
- 単純に自分の知識や経験を文字にすることで自分の中での棚卸にも繋がった。
- 初期の記事から遡ると本当に微量ではあるが、ちょっとずつ自分が投稿している内容がレベルアップしていることがわかった。
- Googleアナリティクスを登録することによりどのくらいの人が閲覧してくれているのかを数値でリアルに知ることができた。
- コードを書く技術に乏しい自分でも日本語なら書くことができた。結果として仕事でのドキュメント作成の練習になった。
- 人生で趣味以外でここまで継続して何かを実施できたのは初めてだったので、どこまで継続して実施できるのかを試して見たくなった。
- 単純に毎日投稿について褒めてくれる人がたくさんいた。めっちゃうれしい。

# これからどうすべきか

- はてなブログを開設したのでハード系の知識はそちらに投稿しようかと思う。
- 現在の仕事でないと得られない知見をどんどん投稿してゆく。
- 自分が嫌にならない程度にちょっとだけ見てくれる人たちの心を掴むような投稿をする。
- 楽しく記事を書く。
- Qiitaに投稿することの楽しさをもっと広げる。
【機械学習】ランダムフォレストを勉強してみる

# ランダムフォレストとは？
ランダムフォレスト(Random Forest)は機械学習でよく使われるアンサンブルアルゴリズムです。教師あり学習モデルである[**決定木**](https://qiita.com/fumita/items/2b6fd012d32845eb6826)を結合させ精度を向上させたアンサンブル学習法です。
下の図にあるように、複数の木の結果を組み合わせた、森のような構造をしているためランダムフォレストと呼ばれています。
決定木の特徴として、**過学習をしやすい**という問題があります。ランダムフォレストでは、その決定木の過学習の影響を減少させることができます。

<img width="600" alt="Screenshot 2019-11-25 at 14.23.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407366/68a43a10-c026-3187-881e-952c0af18351.png">



## ランダムフォレストのアルゴリズム
1. m 個の特徴量を持つサンプルデータセットからk個の特徴量をランダムに選択。
2. k 個の特徴量を使って決定木を作る。
3. １〜２を特徴量の組み合わせを変えながら(もしくは、使用するサブセットをランダムに変えながら **boostrap ample**)、n回繰り返し、n個の決定木を作ります。
4. 分類問題では全ての決定木の結果の最頻値、回帰問題では全ての決定木の結果の平均値を最終結果として出力します。
 

## ランダムフォレストの長所と短所
### 長所
- 回帰と分類両方に利用できる。
- 過学習の影響を減少させられる。
- インプットデータの多少の変動ではモデルは影響されずらい。


### 短所
- ノイズが多すぎるデータでは過学習してしまう。
- 決定木よりも、計算が複雑。
- 計算時間が長い。


## scikit-learn ランダムフォレスト
```python
import sklearn.ensemble
rf = sklearn.ensemble.RandomForestClassifier()
rf.fit(train_X, train_y)
```
## RandomForestのパラメター
|パラメタ-|概要| オプション | デフォルト|
|---|---|---|-------|
|criterion|分割基準| "gini", "entropy"| "gini"|
|splitter| 分割選択の戦略|"best", "random"|"best"|
|max_depth|木の最深深さ|int|None|
|min_samples_split|分割後ノードの最小サンプルサイズ(小さいと過学習傾向になる)|int(サンプル数)/float(全サンプルに対する割合)|2|
|min_samples_leaf|葉(最終ノード)に必要な最小サンプルサイズ(小さいと過学習傾向になる)|int/float|2|
|max_features|分割する上で使う特徴量の数(大きいほど過学習の傾向)|int/float, auto, log2|None|
|class_weight|クラスの重み|"balanced", none|none|
|presort|データの事前の並べ替え(データサイズによって計算速度が変わる)|bool|False|
|min_impurity_decrease|不純度にリミットをかけノードの伸びを制御する|float|0.|
|boostrap|決定木の構築の際にサンプルのサブセットを使うか|bool|1|
|oob_score|boostrapで使われないサンプルを精度評価に使うかどうか|bool|False|
|n_jobs|predictとfitでプロセッサーを並列化するか(-1)の時は全て使う|0,1,-1|0|
|random_state|乱数を発生させる時に使うSeed|int|none|
|verbose|結果の言語化|1/0|0|
resourcesメソッドについて

# resourcesメソッド
[わかりやすいと思ったサイト](https://www.pikawaka.com/rails/resources#%E3%83%8D%E3%82%B9%E3%83%88%E3%81%AE%E5%AE%9A%E7%BE%A9%E3%81%AE%E4%BB%95%E6%96%B9)
【Rails】レイアウトの作成とパーシャル【Rails Tutorial 5章まとめ】

アプリケーションのレイアウトを作成する。

```app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title><%= full_title(yield(:title)) %></title>
    <%= csrf_meta_tags %>
    <%= stylesheet_link_tag    'application', media: 'all',
                               'data-turbolinks-track': 'reload' %>
    <%= javascript_include_tag 'application',
                               'data-turbolinks-track': 'reload' %>
    <!--[if lt IE 9]>
      <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/r29/html5.min.js">
      </script>
    <![endif]-->
  </head>
  <body>
    <header class="navbar navbar-fixed-top navbar-inverse">
      <div class="container">
        <%= link_to "sample app", '#', id: "logo" %>
        <nav>
          <ul class="nav navbar-nav navbar-right">
            <li><%= link_to "Home",   '#' %></li>
            <li><%= link_to "Help",   '#' %></li>
            <li><%= link_to "Log in", '#' %></li>
          </ul>
        </nav>
      </div>
    </header>
    <div class="container">
      <%= yield %>
    </div>
  </body>
</html>
```

<!--[if lt IE 9]>はIE9未満のブラウザ用(いまだにIEを使う人間がいるのかどうかは定かではない)。
navタグはリンクの一覧などの「主要なナビゲーション」に使うらしい。

link_toはRailsヘルパーであり、aタグを生成する。
第一引数にリンクテキスト、第二引数にURLを指定する。
URLには名前付きルートが使える。
classを指定する場合は、第三引数にclass:をキーにしたハッシュの形で指定する（idも同じ）。

link_toのリンクテキストには、image_tagを使用することで画像を指定できる。

```app/views/static_pages/home.html.erb
<%= link_to image_tag("rails.png", alt: "Rails logo"), 'http://rubyonrails.org/' %>
```

画像(rails.png)はapp/assets/images/に置く。
altは画像が表示されない場合に代わりに表示される文字列である。

##パーシャル
パーシャルによって、レイアウトのコードをそのまとまり毎に別のファイルに分割する。

```app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  <%= render 'layouts/head' %>
  <body>
    <%= render 'layouts/header' %>
    <div class="container">
      <%= yield %>
      <%= render 'layouts/footer' %>
    </div>
  </body>
</html>
```

\<header>...\</header>の部分を<%= render 'layouts/header' %>に置換している。
\<header>とその中身は、パーシャル(app/views/layouts/_header.html.erb)を作成してそこに移す。
パーシャルのファイル名にはアンダーバーをつける。
renderで呼び出す場合は、アンダーバーはつけない。
PowerShellでpecoを使う（導入して最低限のコマンドを使うまで）

# TL;DR

- これはWindows環境にpecoを入れたばっかりの人の超導入エントリーです。
- PowerShell ISEではうんともすんとも言わない
- WindowsPowerShellをそのまま使うと、pecoでのリスト選択後に画面がぐちゃぐちゃになる
- `ls`した結果をそのままpecoにパイプで流すと、リスト選択はできるが、それを使ってどうこうはできない
- `ls`した結果から`cd`をするなら`ls -Name`を使う

# pecoはここからゲットできます

[https://github.com/peco/peco](https://github.com/peco/peco)

Releasesから最新のAMD64のWindows版を自分はダウンロードした。
Windowsの検索から「システム環境変数を編集する」に飛んで`$Path`にpecoのパスを登録。

あとはPowerShellでpecoのバージョンが確認できたら問題無し。

# 導入してとりあえずこのコマンドを動かすまではできた

## `ls`から`cd`

```powershell
cd (ls -Name | peco)
```

最初は、

```powershell
cd (ls | peco)
```

と打ち込んで実行していたがこれでは`ls`から取得できるオブジェクトがすべてpecoに流れてしまうため上手くいかない。



## `history`から過去のコマンド実行

```powershell
Invoke-Expression (history | select CommandLine | peco)
```

# ぐぐってて気づいたこと

PowerShellとpecoの組み合わせの記事を見てると、よく`$`を丸括弧の前に入れてるけど、これは入れなくても動く。
`$`を入れると、複数の式を書けるみたい。


# 表示がぐちゃぐちゃになる

Windows TerminalからWindows PowerShellを動かすと綺麗に表示できた。

直接PowerShellを使わず、ターミナルエミュレータを利用するのが良いのかもしれない。

# PowerShell ISEからは動作できることを確認できなかった

何度やっても実行中から変わらず、あきらめた。。。

# 自環境

- Windows PowerShell 5.1
devise で認証キーを email から username に変更する

# はじめに
手元に同志が作った Rails アプリがありましたとさ。
これを流用・シュリンクして別の目的のアプリに改変することにしましたとさ。
認証には devise が利用されていましたとさ。定期。

なんか手元で試したら、ネットで見かける改変手順より全然少なかったので、ちょっと整理しておこうかと思った次第です。


# 結論
核としては、モデルにフィールドを追加して `config/initializers/devise.rb` の `config.authentication_keys` を変更するだけでした。

```diff
diff --git a/db/migrate/20190123123456_add_username_to_users.rb b/db/migrate/20190123123456_add_username_to_users.rb
new file mode 100644
index 0000000..803173d
--- /dev/null
+++ b/db/migrate/20190123123456_add_username_to_users.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddUsernameToUsers < ActiveRecord::Migration[5.2]
+  def change
+    add_column :users, :username, :string, default: '', null: false
+  end
+end
diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb
index 4b5dfa4..7d993f6 100644
--- a/config/initializers/devise.rb
+++ b/config/initializers/devise.rb
@@ -44,7 +44,7 @@ Devise.setup do |config|
   # session. If you need permissions, you should implement that in a before filter.
   # You can also supply a hash where the value is a boolean determining whether
   # or not authentication should be aborted when the value is not present.
-  # config.authentication_keys = [:email]
+  config.authentication_keys = [:username]
 
   # Configure parameters from the request object used for authentication. Each entry
   # given should be a request method and it will automatically be passed to the
@@ -56,12 +56,12 @@ Devise.setup do |config|
   # Configure which authentication keys should be case-insensitive.
   # These keys will be downcased upon creating or modifying a user and when used
   # to authenticate or find a user. Default is :email.
-  config.case_insensitive_keys = [:email]
+  # config.case_insensitive_keys = [:email]
 
   # Configure which authentication keys should have whitespace stripped.
   # These keys will have whitespace before and after removed upon creating or
   # modifying a user and when used to authenticate or find a user. Default is :email.
-  config.strip_whitespace_keys = [:email]
+  # config.strip_whitespace_keys = [:email]
 
   # Tell if authentication through request.params is enabled. True by default.
   # It can be set to an array that will enable params authentication only for the
```


# devise には Strong Parameters のデフォルトがある

[ここ](https://github.com/plataformatec/devise/blob/098345aace53d4ddf88e04f1eb2680e2676e8c28/lib/devise/parameter_sanitizer.rb#L38)を見ると幾つかの予約語が定義されています。`password` とか `remember_me` とか。
そして[ここ](https://github.com/plataformatec/devise/blob/098345aace53d4ddf88e04f1eb2680e2676e8c28/lib/devise/parameter_sanitizer.rb#L158)で `authentication_keys` を参照しています。

これらはユーザーが能動的に指定しなくても Strong Parameters として処理されます。


# ところで

この変更をする前に作ったユーザーは、変更後、仮に username を追加できたとしても認証できないです。ご注意を。


# おわりに

devise も黒魔術ですね。すごいなぁ。
【react-native】pod instal 時の glog(0.3.5) でのエラー

## 最初に 
新しい MacBook に react-native の環境を構築しようとしたところ謎のエラーが出て...丸１日ハマりました。
![20191126-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486398/5de978c5-e854-1dce-8714-2cd8e24551e8.png)
### 発生したエラー内容

```shell
Installing glog (0.3.5)
/bin/bash: ./configure: /bin/sh^M: bad interpreter: No such file or directory
```
pod install 時に glog(※) の **ios-configure-glog.sh** にて Windows でも馴染みの **改行コード CRLF で保存されたスクリプトが実行される** ことで解析エラーとなっています。

　　 ※Google のログ出力用のライブラリ

### 試したこと
他の MacBook 環境では発生しなかったので完全に原因が不明でした。
この問題を解決させるために、

 - ruby の各バージョンのインストール
 - node.js の各バージョンのインストール
 - cocoapod の各バージョンのインストール
 - XCode 10.1, 10.2, 11.1 を再インストール
   - xcode-select で SDK ツールの切り替え  

とやったのですが、全く効果が見られませんでした...(´；ω；｀)

最終的には[こちらの記事](https://forums.expo.io/t/pod-install-errors-on-newly-detached-app-on-macos-installing-glog-bin-bash-configure-bin-sh-m-bad-interpreter-no-such-file-or-directory/10054)を参考に、試行することで解決できたので謝辞とともに手順を記載していきます。
素晴らしい調査ありがとうございます。

対応策としては 「CRLF になってしまうなら LF に直せば良いよね」という発想です。

#### まずは変換ツールを入れよう

```shell
# Homebrew で CRLF=>LF に変換するツールをインストールします
brew install dos2unix
```
これが無いと始まらないです。

#### ツールを入れたら...

対象プロジェクトで yarn install は予め行っておき **node_module が存在する** 状態にしておきます。
その後「テキストエディタ」で下記ファイルを開き、


###**node_modules/react-native/scripts/ios-configure-glog.sh**

31 行目の ./configure と記載されてる一つ前の行に

```
dos2unix -f *
```

上記コードをコピーし挿入します。編集後は、下記のようになります。
<img width="467" alt="20191126-02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486398/137d91c2-84a8-aa7f-2ece-b1c3264fb4e1.png">



その後、ターミナルで  iOS ディレクトリに移動し **pod install** を行うと....
![20191126-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486398/0a0086ac-cda4-640a-048d-20dd5de4bfd9.png)

無事、成功しました。

ただこの後 XCode でビルドエラーが起きてしまうことがあるので、その場合は node_module 内の glog/config.h を Pods に手動コピーする必要があります。

```shell
# プロジェクトの TOP ディレクトリに移動して実行する
cp node_modules/react-native/ReactAndroid/src/main/jni/third-party/glog/config.h ios/Pods/glog/src
```

  ※名前が ReactAndroid となっていますが正しいです。


#### 終わりに

問題は解決したのですが、PC によってこの事象が発生したりしなかったりで根本的な原因がわからなかった。
glog が CRLF で保存されているなら、すべての MacBook で本事象が起きてもおかしくないハズ...

なぜこうなってしまうのか原因がわかる方がいましたら教えていただけますと幸いです。



参考記事：
・[pod install errors on newly detached app on MacOS installing GLog - : /bin/bash: ./configure: /bin/sh^M: bad interpreter: No such file or directory](https://forums.expo.io/t/pod-install-errors-on-newly-detached-app-on-macos-installing-glog-bin-bash-configure-bin-sh-m-bad-interpreter-no-such-file-or-directory/10054)
Salesforce開発の三種の神器

####Salesforce開発の三種の神器（Chrome拡張機能）####
１．**Force.com LOGINS Options：**
　　複数のユーザ・パスワードを保存できる
　　[tab・window] 両方登録できる
　　同じなもの：**Salesforce Logins by Synebo　無料**

２．**Salesforce DevTools**
　　オブジェクト項目・データを導出する
　　ログ分類表示する

３．**Salesforce inspector**
　　データ検索・導入・導出・更新
　　オブジェクト関連関係確認

※１は無料のバージョンは10個のみ保存できる
※２と３はLightningの場合、多少問題がある

**４．Salesforce API Fieldnames**
Spring のBean Validaiton 〜びーん ばりでーしょん〜

# Bean Validation

Spring Frameworkを使用し、REST通信を基本としたサンプルを記載する。

## びーん ばりでーしょんって？
クライアントから送信されたRequestBodyの値をチェックする。
チェック内容は何種類かある。

- Null
- 空文字
- 文字数
- パターン(正規表現)
- 最大サイズ
- 最小サイズ

などなど...

## とりあえずサンプル

コントローラでただバリデーションを実行するだけのサンプル。

```java:SampleContorller.java
@RestController
@RequestMapping("validation")
public class SampleController {

  // バリデーションするだけ
  @PostMapping
  public SampleResource validation(
        @RequestBody @Validated SampleResource resource) {
    return resource;
  }
}
```
```
@Getter
@Setter
public class SampleResource {
  @NotNull
  @Size(min = 5, max = 30)
  @Pattern(regexp = "[a-zA-Z0-9]*")
  private String message;
}
```

|アノテーション|説明|
|---|---|
|@NotNull|Nullを禁止|
|@Size|{min}以上{max}以下であることを確認する|
|@Pattern|指定パターンであることを確認する|

## more びーん ばりでーしょん
### ネストしたクラスのバリデーション
フィールドに`@Valid`を指定する。

```java:SampleContorller.java
上のサンプルコントローラ一緒
```

```
@Getter
@Setter
public class SampleResource {
  @Valid
  @NotNull
  private SampleNestResource nestResource;
}
```

@Validでネストしたクラスのバリデーションを実行している。`nestResource`が送信されてこない場合はフィールドにNullがバインドされてしまい、`SampleNestResource`に指定したバリデーションが実行されないため、@NotNullで必須にしている。

```
@Getter
@Setter
public class SampleNestResource {
  @NotNull
  @Size(min = 5, max = 30)
  @Pattern(regexp = "[a-zA-Z0-9]*")
  private String message;
}
```

### Collection内のチェック
`List`などの`Collection`をフィールドに指定した場合、`Collection`ないのクラスのバリデーション指定とフィールドに対するバリデーションの指定が異なる。

```java:SampleContorller.java
上のサンプルコントローラ一緒
```

```
@Getter
@Setter
public class SampleResource {
  
  @Size(min = 2)
  private List<@NotNull String> strList;
}
```

@Sizeでフィールドの`List`要素が2以上かを確認
@NotNullで`List`内の`String`がNullではないことを確認

### バリデーションエラーのハンドリング

ハンドリングを行わない場合は`MethodArgumentNotValidException `が発生する。
`RestController`ではBindingResultにエラーが入らないため、Errorsでエラー内容を取得する。

```java:SampleContorller.java
@RestController
@RequestMapping("validation")
public class SampleController {

  // バリデーションするだけ
  @PostMapping
  public SampleResource validation(
        @RequestBody @Validated SampleResource resource,
        Errors errors) {
    if (errors.hasErrors()){
      throw new RuntimeException();
    }

    return resource;
  }
}
```