OmniAICreator/Qiita-1.07M huggingface dataset:
【MySQL版】プログラミング初心者と行うRuby on Rails環境構築講座【Win版】

プログラミング初心者向けのRuby on Rails環境構築をまとめた記事です。
なかなか一つにまとまっている記事が見つからず、時間がかかったので忘備録的な意味も込めてここに記したいと思います。

#注意
本記事では最低限の環境構築しか行わないため、手っ取り早くrailsアプリの開発が行いたい初心者さん向けの記事です。

様々な拡張機能や応用などには対応しきれていない部分もあるので、必要な方は個人で調べてください。

#動作環境
OS:Win10 (64bit)
Ruby2.4.9(x64)
Rails 5.0.7.2
db:MySQL

以上が僕のRailsを動かすにあたる環境です。
まず最初にこれらのものを順にインストールしていきましょう。

※特にバージョンの指定などはありませんが、不安な場合は僕と同じバージョンをインストールしたほうが確実だと思います。


#Rubyのインストール
###インストーラのダウンロード
[こちら](https://rubyinstaller.org/downloads/)のDEVKITの欄からRuby+Devkitをダウンロードしてください。
(64bitの方はx64、32bitの方はx86)
※バージョンはなんでも構いませんが、何もわからない！という方は推奨verの2.6.5-1をダウンロードするといいでしょう。
###インストール
インストーラ(~.exe)がダウンロードされたら、実行してインストールを行いましょう。
何もわからない場合はデフォルトのまま進めちゃってokです。
finishしたら、大きくRubyInstallerと書かれた画面に遷移しますが、指示通りに進めて大丈夫です。
###インストールできたか確認
ターミナルで下記のコマンドを実行して、無事インストールできたか確かめます。

```
$ ruby -v
```
自分がインストールしたrubyのバージョンが表示されればokです。
###バージョン確認できなかった場合
PATHが通ってない可能性があるので、Windowsの設定を開き、検索ボックスで環境変数を検索、環境変数の編集に飛んでいただき、上部のユーザーの環境変数からpathを選択して、編集。
インストールしたrubyフォルダのbinディレクトリを新規として追加しましょう。
※pathが存在しなかった場合、下部のシステム環境変数からpathを新規として追加してください。


#Railsのインストール
railsのインストールは簡単で下記コマンドを実行するだけです。

```
$ gem i rails #最新バージョンがインストールされる

$ gem i -v (バージョン番号) rails
```
上のコマンドだと最新のバージョンがインストールされてしまうので、それでは不都合が生じてしまう方は下のコマンドでバージョンを指定してください。

###インストール確認

```
$ rails -v
```
これはお決まりです

#MySQLのインストール
railsではsqlite3がデフォルトデータベースに設定されていますが、それだと僕は環境構築時に自力で解決できない原因不明の不具合が発生したのでMySQLにしています。
(友人も同じ現象が起こったため、この問題で悩んでる方、多いと思います)

また、現在自分自身データベースの知識が不足しているので、細かいことはよくわかりません。
ここには自分がうまくいった手順を載せています。
###インストーラのダウンロード
[こちら](https://dev.mysql.com/downloads/windows/installer/8.0.html)から下のサイズが大きいものをダウンロードしてください。
oracleアカウントにログインさせようとしてきますが、今回は無視して下部のNo thanks~~をクリックしてダウンロードしましょう。
###インストール
インストーラ(~.msi)を実行しましょう。
これも基本的にデフォルトのまま適宜Executeボタンを押しつつ進めちゃってください。
###Accounts and Rolesの設定
Accounts and Rolesと書かれた画面が出てきたら上部のボックスに希望のパスワードを入力してください。
これがrootアカウントのパスとなるため、メモを控えといてください。

次にMySQLアカウントを追加します。
Add Userボタンを押して希望のユーザー名、パスワードを入力(他はデフォルトのままで)し、ユーザーを追加します。
ここでのパスワードはrootアカウントのものと異なっていてもokです。

この作業が終了したら、あとは前と同じようにデフォルトのまま進めていけばインストールが完了します。

###インストール確認

```
$ mysql --version
```

###バージョン確認できなかった場合
Rubyの場合と同じくPATHが通ってない可能性があるので、設定からPATHにインストールしたMYSQLフォルダのbinディレクトリを新規として追加しましょう。

###ターミナルがGit bashの場合
自分はgit bashをターミナルとして用いているのですが、MySQLコマンドを実行する場合は先頭に必ず```winpty```をつけないと実行できないようです。（原因はわからず、、、）

#Railsアプリの作成、設定
ここまででrailsアプリの作成に必要な最低限のソフトのインストールが終了しました。
ここからは環境に合わせつつ、Railsで作成するアプリの設定を行っていきます。

###Railsアプリの作成
下記コマンドを実行します。

```
$ cd (任意のディレクトリ名) 
#railsアプリを設置したいディレクトリに移動

$ rails new (任意のrailsアプリ名) --database=mysql 
#デフォルトのdbをmysqlに変更してアプリ作成
```

これでrailsアプリが作成されます。

###railsアプリデータベースの作成
#####database.ymlの編集
作成されたrailsアプリフォルダ内のconfig内に存在するdatabase.ymlファイルを編集します。
上のほうにあるデフォルトの```username```と```password```だけ下記のように編集してください。

```
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: (MySQLインストール時に作成した名前)
  password: (MySQLインストール時に作成したパスワード)
  host: localhost
```

#####データベース作成
下記のコマンドをrailsアプリ上で実行し、データベースを作成してください。

```
$ rails db:create
```

#開発環境構築完了！！！
ひとまずRailsアプリを開発する環境はこれで整いました。
自分がこれまで学んできたことや、参考書、サイトなどを活かしてrailsアプリの開発を行いましょう。

※herokuにデプロイして公開する記事も後日執筆予定です。
※何か間違っている点、疑問点等ございましたらコメントお願いします。
Python OpenCVで動画をフレーム毎に画像保存

```python
import cv2
import os
 
def extractFrames(pathIn, pathOut):
    if not os.path.exists(pathOut):
        os.mkdir(pathOut)
 
    cap = cv2.VideoCapture(pathIn)
    count = 0
 
    while (cap.isOpened()):
 
        ret, frame = cap.read()
 
        if ret == True:
            cv2.imwrite(os.path.join(pathOut, "frame_{:06d}.jpg".format(count)), frame)
            count += 1
        else:
            break
 
    cap.release()
    cv2.destroyAllWindows()
 
def main():
    extractFrames('video.mp4', 'outputdir')
 
if __name__=="__main__":
    main()

```
そのjs、cssで代用できませんか？（件数通知バッジ編）

webアプリケーションエンジニアからフロントエンドエンジニアになって約一年やってきた中で、
どうしたらjsを書く量を減らせるか？みたいな状況を解決した時のtips

# why 件数通知バッジ
皆さん通知バッジ作ってますか？僕は作りました。
脳筋コードで書いたら意外とめんどくさいんですよねあいつ。

* 数字が変わるとなると、疑似要素でやるのがめんどくさいので`<span>`とかで作りがち
* 0件になったら消さなきゃいけない

とかやってるとjsがとても汚くなって悲しくなったので、いい感じにcss交えて書くといい感じになったよっていうお話です。

# コード
<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="css,result" data-user="sumtrue" data-slug-hash="eYNxmaW" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="通知バッジ">
  <span>See the Pen <a href="https://codepen.io/sumtrue/pen/eYNxmaW">
  通知バッジ</a> by さむとる (<a href="https://codepen.io/sumtrue">@sumtrue</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

jsはdata-numを++/--するだけで済んでるので、とても綺麗で読みやすいコードになりました

# tips
### attr()
https://developer.mozilla.org/ja/docs/Web/CSS/attr
htmlに付与された属性を取得できる関数。
今回はこれを使うことでjsとhtmlの繋ぎこみをしている。

まだ使ったことはないが型指定とか代替値も指定できる便利屋さん。
要素によって少しだけ変わることがある、みたいなのを実現もできる。
### 属性セレクター
https://developer.mozilla.org/ja/docs/Web/CSS/Attribute_selectors
htmlに付与された属性でcssをあてることのできるセレクター。
今回は0件のときにバッジを非表示にする際に使用。

その他オススメの使い方としてはこれ。
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Tip: highlight images missing alt text with img:not([alt]) <a href="https://t.co/zgjdE5iTU6">pic.twitter.com/zgjdE5iTU6</a></p>&mdash; Addy Osmani (@addyosmani) <a href="https://twitter.com/addyosmani/status/1223872295619330048?ref_src=twsrc%5Etfw">February 2, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
`img:not([alt])`でaltが指定されていない画像を見つけられるというやつ

# この記事を書いた理由的な
「ぶっちゃけjs書けばなんでもできるじゃん」論者だったんですが、CSS組み合わせることでコードの可読性がめっちゃあがります。
「普段あまりcssはほとんど書かないけどjsは時々書く」「jsは基本書かないけどcssは結構書くよ」みたいな人たちに、
それぞれで何ができるかを知ってもらい、世の中のコードが綺麗になったらいいなと思った次第。
Mac SSH 設定

## ssh コマンドとは

```
$ ssh [オプション] ホスト名 [コマンド]
```

SSH(Secure Shell)は、暗号や認証の技術を利用して、安全にリモートコンピュータと通信するためのプロトコルです。

## SSHの設定

### ディレクトリ、ファイルの存在確認

```
$ ls -l ~/.ssh/config
```

`~/.ssh` ディレクトリ、 `~/.ssh/config` ファイルがない場合は作成しましょう。

```
$ mkdir ~/.ssh
$ touch ~/.ssh/config
```

### パーミッション設定

```
$ sudo chown -R $(whoami):staff ~/.ssh
$ sudo chmod 700 ~/.ssh
$ sudo chmod -R 600 ~/.ssh/*
```

### 拡張属性の除去

ダウンロードした鍵ファイルに拡張属性(EA: Extended Attributes)が付いてる場合があります。(`ls -l` パーミッションの右側に `@` マークが付く)

```
$ xattr -cr ~/.ssh
```

### 全ホストに共通設定

私は次の設定を入れてます。
お好みで追加してください。

```
$ vi ~/.ssh/config
Host *
  StrictHostKeyChecking no
  UserKnownHostsFile=/dev/null
  ServerAliveInterval 15
  ServerAliveCountMax 30
  AddKeysToAgent yes
  UseKeychain yes
  IdentitiesOnly yes
```

- `StrictHostKeyChecking no` ホストキーチェック回避
- `UserKnownHostsFile=/dev/null` ホストキーチェック回避
- `ServerAliveInterval 15` タイムアウト対策
- `ServerAliveCountMax 30` タイムアウト対策
- `AddKeysToAgent yes` 毎回パスフレーズを聞かれてくることに対する対策
- `UseKeychain yes` 毎回パスフレーズを聞かれてくることに対する対策
- `LogLevel QUIET` 警告メッセージを非表示にする
  - `Warning: Permanently added 'github.com,192.30.255.113' (RSA) to the list of known hosts.` このメッセージ。

## 関連記事

- [Mac を買ったら必ずやっておきたい初期設定](https://qiita.com/ucan-lab/items/c1a12c20c878d6fb1e21)
- [Mac Git 初期設定](https://qiita.com/ucan-lab/items/aadbedcacbc2ac86a2b3)
- [Mac GitHub SSH接続設定](https://qiita.com/ucan-lab/items/e02f2d3a35f266631f24)
Railsを使った新規アプリ立ち上げの流れ

#Railsを使った新規アプリ立ち上げの流れを簡単におさらい

使用するコマンド一覧
・rails new
・bundle install
・rails db:create
・rails 


## 新規アプリの立ち上げ
```:ターミナル
#以下のコードを順に入力、実行すれば完了です。

     入力するコマンド 　　　　　　　   　　コマンドの説明
-----------------------      -------------------------
$ rails new sample_app　    新規アプリ作成(アプリ名:sample_app)
$ cd sample_app　　　　　　　 　 ディレクトリの移動（※忘れがち）
$ bundle install        　  　　　　gemのインストール
$ rails db:create　　　　    　　　 データベースの作成
$ rails s　　　　　　　　　　  　　  ローカルサーバーの起動
```

プラウザで localhost:3000 と入力。
もしくは　[http://localhost:3000](http://localhost:3000/)　⬅️こちらをクリック

以下のような画面が表示されればアプリの立ち上げ完了です。
<img width="1436" alt="アプリの立ち上げ.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573297/4e2c1cf0-1c73-776c-0863-5292707c55db.jpeg">


## 備考
rails new のコマンドは以下のように、より詳細に設定を加えることができます。

```
$ rails _5.2.3_ new sample_app -d mysql
　　　　　------      ---------  --------
　　　　　  ①            ②　　　　  ③

①railsのバージョン指定（5.2.3）　②アプリ名　③オプション（データベースとしてmysqlを指定）
②は必須項目
①③は任意の設定
```
TypeScriptでLIFFのShare Target Pickerを試すぞ！

# はじめに

本日（といっても昨日になりましたが）[LINEのオンラインハッカソン](https://ldgk.connpass.com/event/171176/)に参加しました。[成果物はこれ](https://github.com/ufoo68/corona-no-kokoro)になります（READMEが雑だなあ。。。）が、あまりLINEの新機能を試せなかったのが悔しかったので、その熱の冷めぬうちに[Share Target Picker](https://developers.line.biz/ja/reference/liff/#share-target-picker)を試してみようと思いました。しかしただ試すのも出遅れた感あるので、**TypeScript**でやろうと思います。

# Share Target Pickerとは

[公式の記事](https://developers.line.biz/ja/news/2020/03/03/add-share-target-picker-and-ready/)よると、任意のユーザーにLINEメッセージを送ることができるWEBアプリをつくることができるライブラリみたいです。この新機能を試してみたという[記事は既にあるので](https://qiita.com/K_M95/items/3d76deaffc2572ddeff0)あまり詳細な説明は省きます。

# TypeScriptで実装する

[TypeScriptでやってみた記事](https://qiita.com/ufoo68/items/3e6ff0613ebd87a8edd9)は既に書いたので、TypeScriptでの導入方法については省きます。いつも使っている[liff-type](https://www.npmjs.com/package/liff-type)がどうやら**Share Target Picker**に対応していたみたいですので、特に問題なくTypeScriptができます！
コードはこんな感じです。

```typescript:target-picker-test/src/App.tsx
import React, { useState } from 'react'
import './App.css'
import { buildReplyText } from 'line-message-builder'

function App() {
  const [message, setMessage] = useState<string>('')
  const pushShareTargetPicker = () =>
    liff.init({ liffId: process.env.REACT_APP_LIFF_ID! }).then(() => {
      if (!liff.isLoggedIn()) {
        liff.login()
      }
      liff.shareTargetPicker([buildReplyText(message)])
        .then(() =>
          console.log('send: ', message)
        ).catch((err: Error) =>
          alert(err)
        )
    })
  return (
    <div className="App">
      <input value={message} onChange={e => setMessage(e.target.value)} />
      <button onClick={pushShareTargetPicker}>送信</button>
    </div>
  )
}

export default App

```

全体は[こちらで公開しています](https://github.com/ufoo68/target-picker-test)。

# さいごに

デモ写真とか見せたいところですが、LINE友達が見えるところとか消す作業とか面倒なので各自動かして試してみてください。[ここのURLより](https://ufoo68.github.io/target-picker-test/)公開しています。
あとは余談です。多分今後はこういったLINEチャット画面以外（つまりは普通のブラウザ）でも動くLIFFのライブラリが増えるんじゃないかなと思ってます。むしろ`sendMessges()`のようなLINEアプリに依存するようなLIFFアプリは非推奨になっていくのでは？？とかも考えたりしてます（実際のところわかりませんが）。
しかも今日のハッカソンで作ったMessagingAPIのチャンネルはもうLIFFが登録できなくなってました。この流れでLINEチャット上でないと動かないLIFFアプリとかは非推奨になっていくんですかね。。。
deno v0.36.0の変更点まとめ

# 概要

https://github.com/denoland/deno/releases/tag/v0.36.0

denoのv0.36.0がリリースされたため、変更点をまとめます。

# 破壊的変更

## `Deno.errors.Other`が削除された

https://github.com/denoland/deno/pull/4249

使用されていなかったため、削除されました。

## `Deno.readDir`が`Deno.readdir`にリネームされた

https://github.com/denoland/deno/pull/4225

Node.js等に合わせて`readDir`が`readdir`にリネームされました

# 新機能

## std/encoding/binaryモジュールが追加された

Goの[encoding/binary](https://golang.org/pkg/encoding/binary/)パッケージと同様の機能が提供されています。

https://github.com/denoland/deno/tree/master/std/encoding#binary

https://github.com/denoland/deno/pull/4274

## (std/node/fs)`appendFile`・`appendFileSync`が実装された

```typescript
import * as fs from "https://deno.land/std@v0.36.0/node/fs.ts"

fs.appendFile("./hello.txt", "world", (err: Error) => {
  if (err) {
    console.error(err);
  }
});
```

https://github.com/denoland/deno/pull/4294

## (std/node/os) `tmpdir`が実装された

```typescript
import * as os from "https://deno.land/std@v0.36.0/node/os.ts";

console.log(os.tmpdir()); // /tmp
```

https://github.com/denoland/deno/pull/4213

## `Deno.umask`が実装された

引数として数値を渡すと、プロセスのumask値を指定した値に変更できます。

引数を渡さずに呼ぶとプロセスのumask値を取得できます。

```typescript
console.log(Deno.umask().toString(8)); // 22
```

https://github.com/denoland/deno/pull/4290

## `--quiet`フラグが実装された

`$ deno run --quiet ./mod.ts`のように実行すると、下記のメッセージ等が表示されなくなります。

```sh
Compile file:///home/uki00a/work/deno/sample/mod.ts
```

https://github.com/denoland/deno/pull/4135

## `seek`がファイルの現在位置を返却するようになった

```typescript
const file = await Deno.open("./hello.txt");
try {
  const position = await Deno.seek(file.rid, 2, Deno.SeekMode.SEEK_START);
  console.log(position); // 2
} finally {
  file.close();
}
```

https://github.com/denoland/deno/pull/4211

# その他

## `window.addEventListener`にasync関数を渡せるようになった

```typescript
window.addEventListener('load', async () => { // v0.35.0の時点ではコンパイルエラーが発生していた
  ...
});
```

https://github.com/denoland/deno/pull/4240

## (std/testing) `assertThrows`のエラーメッセージが改善された

https://github.com/denoland/deno/pull/4305

## Windowsで`deno install`を実行すると、ファイル名に余分な`.`が含まれてしまう問題が修正された

@yuta0801さんにより修正されました

https://github.com/denoland/deno/pull/4243

## dprintが0.8.0にアップデートされた

https://github.com/denoland/deno/pull/4308

## TypeScriptが3.8.3にアップデートされた

https://github.com/denoland/deno/pull/4301
自作NeuralNetworkの精度あげる方法試したこと

#NeurlNetworkでXORを学習させたい！
入力、隠れ層、出力層
この3つを単純に作っただけではXORを実現できるときもあれば、層じゃないときもあったので、なんとか精度を高くしようと、試してみたこと書きです。

ちなみに、うまくいかないときの出力は

```
#入力 [ (0,0)  , (0,1)   , (1,0)   , (1,1)  ]
#出力 [0.01... , 0.63... , 0.62... , 0.66...]
#答え [0       , 1       , 1       , 0      ]
```
っていう感じで、(1,1)を入力したときの値が大きくずれてしまいます。これをなんとかしようっていうもが目標です。

##目次
- 隠れ層のノードを2つから3つに増やす
- 学習するにつれて、学習率を下げる
- 学習させるやつを増やす

###隠れ層のノードを増やす
これは単純な式の追加でできました。
10回程度の試行ですが、あまり変わりませんでした。
もう少し試行回数を増やしたら結果が変わるかもしれません。
ただ、数値の変動の仕方にあまり変化がなかったため、10回程度で打ち切りました。

###学習率をだんだん下げる
これは、最後の精度の問題だと後から気づいたのですが、当然あまり変化はありませんでした。
なぜなら、ずれるときは初めから大きくずれています。
なので、初動がどんなふうに動くかを調整できないと、あまり意味がないのです。

###学習させるやつを増やす
なんと表現したらよいかわからなくて、こんな表現になっているのですが、イメージ的には、スタートが悪いなら、試行回数をepochs少なくして増やして、優秀な奴だけまた学習させていこうっていう感じです。
つまり、優秀な奴の中で、何個か作って学習させて、また、優秀な奴の中で学習させて、っていう風にしてみました。
#####これはめっちゃ変わりました。
これまで1/5くらいの確率で正解に近いって感じでしたが、変えてみて、1/2くらいの確率で正解に近づきました！
試行回数を増やしたときにはもっと差が開きました。

##結論
なんてよんだらいいかわかりませんが、学習させる人を何人か用意して、優秀な奴の中で学習させて...っていうのが一番いい感じでした！
~~やっぱり優秀な奴だけが生き残る世界なのか...怖い...~~
AIも人間も変わらないですね！
【HLSL】 平行光とスペキュラの式 Lambert・HalfLambert【DirectX】

古のノートを見つけたので添付。文字がかなり下手
陰影処理の基本中の基本の計算の式です。

----------------------
光の向きの逆方向のベクトルと対象となるメッシュの法線で内積をして出た値で陰影を付けています
![HLSL縺ｮ繝弱・繝・2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/b3418d0e-8bed-e8a0-cabd-e74cc276b977.jpeg)


![HLSL縺ｮ繝弱・繝・3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/0231d699-672d-9d32-80ea-18c2a06f1c0f.jpeg)

-----------
始めてHLSLを教えてもらって今までデカールのまま表示されていたオブジェクトが平行光を実装して陰影が映った時は感動してたなあ。。と
古い記憶が蘇るノートでした。
SQL

```PHP:カラム
SELECT カラム名
```

```PHP:テーブル
FROM テーブル名;
```

```PHP:条件指定
WHERE カラム名 = 特定条件;
```

ワイルドカード
前方一致
後方一致

```PHP:LINE演算子
WHERE カラム名 LIKE "%文字列%";
```

```PHP:NOT演算子
WHERE  NOT カラム名 = 特定条件;
```

```PHP:NULL
WHERE カラム名 IS NULL;
```


```PHP:IS_NOT_NULL
WHERE カラム名 IS NOT NULL;
```

AND演算子

OR演算子

```PHP:並べ替え
ORDER BY 並べ替えたいカラム名 並べ方;
```

ASC(昇降)

DESC(降順)


```PHP:制限
LIMIT データ件数;
```

```PHP:重複データ除外
SELECT DISTINCT(カラム名)
```

##集計関数

```PHP:合計
SUM(カラム名)
```

```PHP:平均
AVG(カラム名)
```

```PHP:データ数
COUNT(カラム名)
```

```PHP:最大
MAX(カラム名)
```

```PHP:最小
MIN(カラム名)
```

##グループ

```PHP:グループ化
GROUP BY カラム名
```

```PHP:絞り込み
GROUP BY カラム名
HAVING 条件;
```

##サブクエリ
```PHP:サブクエリ
SELECT XXX
FROM XXX
WHERE XXX > ( 
  SELECT XXX
  FROM XXX
  WHERE XXX
)
;
```

##カラム名定義

```PHP:カラム名定義
カラム名 AS "名前"
HAVING 条件;
```

##テーブル

```PHP:結合
SELECT*
FROM テーブルA
JOIN テーブルB
ON テーブル名.カラム名 = テーブル名.カラム名;
```

```PHP:LEFT_JOIN
SELECT*
FROM テーブルA
JOIN テーブルB
ON テーブル名.カラム名 = テーブル名.カラム名;
```
CSScombが8桁のカラーコードを適切に扱ってくれない

VSCodeにCSScombの拡張機能が入っている状態でSCSSを保存するときに、
8桁のアルファ値付きHEX表記カラーコード（ex. #000000fd）が5桁に変換されてしまう

という現象に遭遇したので解決してみます

# 前提

- VSCodeを使っている
- VSCodeに[CSScomb](https://marketplace.visualstudio.com/items?itemName=mrmlnc.vscode-csscomb)の拡張機能が入っている
- 保存時にCSScombによる自動整形がされる
  - settings.jsonに`"csscomb.formatOnSave": true` が入ってればOK

# 結論

ルートディレクトリにある`.csscomb.json`の`color-shorthand`の値を書き換えれば解決です

trueになってるのでfalseに直しましょう

```.csscomb.json
{
  ..
  "color-shorthand": false,
  ..
}
```

# 解説

![csscomb1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174833/bb37e33c-4908-34bd-43d4-06d2f42e0a5c.png)


を保存してみます

（コピペ用）

```hoge.scss
// アルファ値なし
$shortHexColor: #333; // 3桁
$hexColor1: #333333; // 3桁にできる6桁
$hexColor2: #353535; // 3桁にできない6桁

// アルファ値あり
$shortWithAlpha1: #3335; // 4桁
$withAlpha1: #33333355; // 4桁にできる8桁
$withAlpha2: #35353535; // 4桁にできない8桁
```

## `"color-shorthand": true`の場合

![csscomb2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174833/deccf5a4-9076-a393-2547-af4d1a53728c.png)

ご覧の通り`$withAlpha1`に指定したカラーコードが5桁となりエラーとなってしまいます

`#33333355`→`#33355`となっていることから、RGB値までは省略したけどα値はそのままで5桁となっているようです

`6 + 2 = 8` → `3 + 2 = 5`

```hoge.scss
// アルファ値なし
$shortHexColor: #333; // 3桁
$hexColor1: #333; // 3桁にできる6桁
$hexColor2: #353535; // 3桁にできない6桁

// アルファ値あり
$shortWithAlpha1: #3335; // 4桁
$withAlpha1: #33355; // 4桁にできる8桁
$withAlpha2: #35353535; // 4桁にできない8桁
```

## `"color-shorthand": false`の場合

![csscomb3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174833/c5ef989e-b947-9c9b-aaa4-fcf1bcdb2a40.png)

こちらは省略されずに全てのパターンにおいてエラーは出ませんでしたが、
わざわざ省略して書いていた`$shortHexColorをご丁寧にも長くしてくれやがってます

4桁の`#3335`は`#3333335`の7桁にしてエラーにするでもなく、`#33333355`の8桁にするでもなくスルーなのに不思議ですね

```hoge.scss
// アルファ値なし
$shortHexColor: #333333; // 3桁
$hexColor1: #333333; // 3桁にできる6桁
$hexColor2: #353535; // 3桁にできない6桁

// アルファ値あり
$shortWithAlpha1: #3335; // 4桁
$withAlpha1: #33333355; // 4桁にできる8桁
$withAlpha2: #35353535; // 4桁にできない8桁
```

## 感想

`"color-shorthand": false`でアルファ値持ちのカラーコードも無事保存できるようになりましたが、
省略して書いてるものは無視してくれ...
【今日のアブストラクト】Well-Read Students Learn Better: On the Importance of Pre-training Compact Models【論文 DeepL 翻訳】

1 日 1 回 論文の Abstract を DeepL 翻訳の力を借りて読んでいきます.

この記事は自分用のメモみたいなものです.
ほぼ [DeepL](https://www.deepl.com/home) 翻訳でお送りします.
間違いがあれば指摘していだだけると嬉しいです.

翻訳元
[Well-Read Students Learn Better: On the Importance of Pre-training Compact Models](https://arxiv.org/abs/1908.08962)

# Abstract

### 訳文

自然言語表現における最近の開発には、自己教師あり学習の事前訓練を通じて膨大な量の一般領域テキストを活用する大規模で高価なモデルが伴っている. そのようなモデルをダウンストリームタスクに適用するコストのために, 事前訓練された言語表現上のいくつかのモデル圧縮技術が提案されてきた (Sun et al., 2019; Sanh, 2019). しかし, 驚くべきことに, 事前学習してコンパクトなモデルを微調整するだけという単純なベースラインは見落とされてきた. 本論文では, まず, より小さなアーキテクチャの文脈では事前訓練が依然として重要であり, 事前訓練されたコンパクトモデルを微調整することが, 並行作業で提案されているより精巧な方法に対抗できることを示す. 事前学習されたコンパクトモデルから始めて, 標準的な知識の蒸留を介して, 大規模な微調整されたモデルからタスクの知識を転送することを探求する. その結果, シンプルでありながら効果的で一般的なアルゴリズムである事前訓練蒸留は, さらなる改善をもたらす. 広範な実験を通じて, これまであまり研究されていなかった $2$ つの変数, すなわちモデルサイズとラベル付けされていないタスクデータの特性の下で, 事前訓練と蒸留の間の相互作用をより一般的に探る. 一つの驚くべき観察は, 同じデータに逐次適用した場合でも複合的な効果があるということである. 今後の研究を加速させるために, 事前訓練を受けた $24$ 個のミニチュア BERT モデルを公開する.


### 原文

Recent developments in natural language representations have been accompanied by large and expensive models that leverage vast amounts of general-domain text through self-supervised pre-training. Due to the cost of applying such models to down-stream tasks, several model compression techniques on pre-trained language representations have been proposed (Sun et al., 2019; Sanh, 2019). However, surprisingly, the simple baseline of just pre-training and fine-tuning compact models has been overlooked. In this paper, we first show that pre-training remains important in the context of smaller architectures, and fine-tuning pre-trained compact models can be competitive to more elaborate methods proposed in concurrent work. Starting with pre-trained compact models, we then explore transferring task knowledge from large fine-tuned models through standard knowledge distillation. The resulting simple, yet effective and general algorithm, Pre-trained Distillation, brings further improvements. Through extensive experiments, we more generally explore the interaction between pre-training and distillation under two variables that have been under-studied: model size and properties of unlabeled task data. One surprising observation is that they have a compound effect even when sequentially applied on the same data. To accelerate future research, we will make our 24 pre-trained miniature BERT models publicly available.
cargoの使い方

# cargoとは
プロジェクトの作成、ビルド、実行、パッケージ管理、テスト等が可能です。私が知らないだけで他にも機能があるでしょうし、拡張機能を組み込むことも可能なようです。
~~とりあえず以下のコマンドでHello worldが出来ます。~~
嘘です。プロジェクト名のディレクトリが作成されるので、ディレクトリの移動が必要でした。

~~~
cargo new プロジェクト名
cd プロジェクト名（ディレクトリ名）
cargo run
~~~

# コマンド
CUIなのでコマンドを知らないと何もできません。頑張って覚えましょう。

## cargoがインストールされているか確認
そもそもcargo入ってますか？入ってるならバージョンは？という時のためのコマンド。

~~~
cargo --version
~~~

## 新しいプロジェクトを作成する
プロジェクトを作成したいディレクトリに移動し、以下のコマンドを打つと必要なディレクトリとファイル一式が作成されます。`project_name`がプロジェクトの名前です。

~~~
cargo new project_name
~~~

ライブラリを作成したいときは`--lib`を付けます。

~~~
cargo new project_name --lib
~~~

以下のディレクトリとファイルが作成されます。

- project_name 
 - `.git`：gitが使う隠しフォルダ。
 - `src`：ソースコードのルートディレクトリ。main.rsが自動的に作成される。
 - `.gitignore`：gitが使うファイル。
 - `Cargo.toml`：プロジェクトの情報や依存するライブラリを記載するファイル。

## ビルド関連
プロジェクトのディレクトリに移動して使用します。
上からコンパイルのチェック、ビルドのみ、ビルドと実行、です。

~~~
cargo check
cargo build
cargo run
~~~

## テスト実行
ビルドした後にテストコードを実行します。

~~~
cargo test
~~~

[目次](https://qiita.com/tonesuke/items/52e469f18e747c794376)
DockerでWordpressコンテナを立ち上げる

# 概要

本書ではUbuntuにDockerをインストールし、Wordpressコンテナを起動します。

## 0.動作環境

+ OS : Ubuntu 16.04
+ 仮想環境 : Hyper-V (Windows10 Pro)

## 1. Dockerのインストール

1. リポジトリ一覧を更新する

    ```
    > sudo apt-get update
    ```

2. docker-ceに必要なパッケージをインストールする

    ```
    > sudo apt-get install \
      apt-transport-https \
      ca-certificates \
      curl \
      gnupg-agent \
      software-properties-common
    ```

3. docker-ceの暗号鍵を取得する

    ```
    > curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    ```

4. docker-ceのリポジトリを取得する

    ```
    > sudo add-apt-repository \
     "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
     $(lsb_release -cs) \
    ```

5. リポジトリ一覧を更新する

    ```
    > sudo apt-get update
    ```

6. docker-ceをインストールする

    ```
    > sudo apt-get install docker-ce docker-ce-cli containerd.io
    ```

7. `Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock`のエラーが表示された場合、dockerグループにユーザを追加する

    ```
    > sudo gpasswd -a [ユーザー名] docker
    > id [ユーザー名]
      dockerグループに所属していることを確認
    > exit
      再ログイン
    ```

8. dockerを起動する

    ```
    > sudo systemctl start docker
    ```

9. dockerを自動起動するように設定する

    ```
    >  sudo systemctl enable docker
    ```

10. dockerの起動状態を確認する

    ```
    > sudo systemctl status docker
    ```

## 2. Wordpressの起動

1. mysqlのdockerイメージを取得する

    ```
    > docker pull mysql:5
    ```

2. wordpressのdockerイメージを取得する

    ```
    > docker pull wordpress
    ```

3. dockerのネットワークを作成する

    ```
    > docker network create [ネットワーク名]
    ```

4. mysqlのdockerコンテナを作成する

    ```
    > docker run --name [mysqlのdockerコンテナ名] --net [ネットワーク名] -e MYSQL_ROOT_PASSWORD=[mysqlのパスワード] -d mysql:5
    ```

5. mysqlのdockerコンテナが作成されたことを確認する

    ```
    > docker ps
    ```

6. wordpressのdockerコンテナを作成する

    ```
    > docker run --name [wordpressのdockerコンテナ名] --net [ネットワーク名] -e WORDPRESS_DB_HOST=[mysqlのdockerコンテナ名] -e WORDPRESS_DB_PASSWORD=[mysqlのパスワード] -p 8080:80 -d wordpress
    ```

7. wordpressのdockerコンテナが作成されたことを確認する

    ```
    > docker ps
    ```

8. WEBブラウザを開き、`http://[IPアドレス]:8080`に接続する

9. wordpressの初期設定画面が表示されたことを確認する
![docker_037.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/49fded95-7307-f3af-35d3-1efeecd3a573.jpeg)

10. wordpressの初期設定後、管理画面やwordpressで作成したサイトが表示されたことを確認する
![docker_051.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/60eec09e-154a-33b5-efa7-06c6648c82db.jpeg)
![docker_058.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307261/5d1e680c-9a0a-5106-794d-d881b4023310.jpeg)

## 最後に
Dockerを利用することでWordpressをすぐに立ち上げることができます。これによりWordpressの検証環境をすぐに用意することができます。
Custom Vision の Domain の効果を確かめる

## 目的

Azure Cognitive Services の Custom Vision では **Domain** を **General**、**Food**、**Landmarks**、**Retail** の中から選択できます。Domain の選択が精度に影響するのか確かめたいと思います。
![CustomVisionDomains.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25692/65a2dc82-9b26-4dc1-932c-80f3daa776ff.png)

## 方法

スパゲティの分類に挑戦します。アリオ・エ・オリオ、ボロネーゼ、[カルボナーラ](https://twitter.com/NakamuraYoichi/status/1244083112264359937?s=20)の画像を 30 枚ずつ用意しました。**Project Type** は **Classification**、**Classification Type** は **Multiclass**、**Domain** はとりあえず **General** でプロジェクトを作成します。Domain はプロジェクトの設定で変更できるので、変更しては **Train** する、という作業を繰り返していくことにします。結果は **Iteration** として保存されます。**Training Type** は **Quick Training** を選択します。

予想としては、適切な Domain である Food を選ぶと精度が上がり、Landmarks や Retail では下がるでしょう。また、Compact は全体的にやや落ちるでしょう。

## 結果

**Probability Threshold** が _50_ % のときの各 Domain の **Precision**、**Recall**、**A.P.** の値は次のようになりました。

| Domain | Precision (%) | Recall (%) | A.P. (%) |
|---|--:|--:|--:|
| General | 94.4 | 94.4 | 93.0 |
| Food | 100.0 | 100.0 | 100.0 |
| Landmarks | 72.2 | 72.2 | 87.4 |
| Retail | 77.8 | 77.8 | 86.4 |
| General (Compact) | 88.9 | 88.9 | 92.6 |
| Food (Compact) | 83.3 | 83.3 | 92.7 |
| Landmarks (Compact) | 83.3 | 83.3 | 90.6 |
| Retail (Compact) | 77.8 | 77.8 | 87.3 |

概ね期待通りの結果となったのではないでしょうか。

## その他

- Iteration を **Delete** して再度 Train しても結果は同じであるようです。
- 1 つの Azure Cognitive Services Custom Vision リソースに作成可能なプロジェクトの数は、無料の価格レベル _F0_ では _2_ です。
- 1 つのプロジェクトに保存しておける Iteration の数は、価格レベルによらず _10_ です。今回の実験は 1 つのプロジェクトに収まり、無料で済ませることができました。
- 次の公式ドキュメントを参考にしました : 「[クイックスタート: 分類器を構築する](https://docs.microsoft.com/ja-jp/azure/cognitive-services/custom-vision-service/getting-started-build-a-classifier)」
Githubから届いた脆弱性報告を自動で解消するautomated security updates

# はじめに
GithubにソースコードをPushしておくと、そのリポジトリに脆弱性のあるパッケージが含まれているとGithubからAlertメールが届きます。
良くないことではありますが、すでに開発していないリポジトリだとコードを探してパッケージをアップデートして・・というのが面倒になることがあります。
その時に、Githubの `automated security updates` を使って、PR発行までをGithubにやってもらい、Githubの画面でマージするだけで対応することができます。

# automated security updatesとは
「自動または手動のプルリクエストを使って、脆弱性のある依存対象を簡単に更新できます。」

ドキュメントはこちらです。
https://help.github.com/ja/github/managing-security-vulnerabilities/configuring-automated-security-updates
https://help.github.com/en/github/managing-security-vulnerabilities/configuring-automated-security-updates

# 設定方法
1. 「View security alert」ボタンもしくは「Security」タブをクリックします。
<img width="991" alt="スクリーンショット 2020-03-29 23.31.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184103/5ae81f14-2880-4215-026b-e3a167fa5e0f.png">

2. 「Automated security updates」をクリックし、チェックを入れます。
<img width="1009" alt="スクリーンショット 2020-03-29 23.35.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184103/605bf4c1-4999-f6b1-60f6-f521e2abfce3.png">

3. Dependabotが動き出します。アップデートが可能であれば、PRを発行してきます。それをマージすればOKです。

# 対応できないものもある
他のパッケージが脆弱性のあるパッケージに依存しているなど、Dependabotが対応できないものもあります。
その場合は手動でアップデートが必要です。

# 動作確認は自己責任
当然ですが、アップデートに伴う動作確認は行われません。ソースコードを管理しているのであれば、masterブランチが動作することは確認する必要があると思います。
なので結局自分の環境下にリポジトリをcloneする必要がありますが、それでも楽だと思います。

## まとめ
一つのサービスに依存しすぎるのも開発者の判断次第ではありますg、GithubがやってくれることはGithubに任せていくスタイルでやっていきたい。
Rustでcould not find `__rt` in `quote`が出てしまったとき

オープンソースのRustのプロジェクトを動かそうとしたらcould not find "__rt" in "quote" というエラーがRustで出て，けっこうハマってしまったのでその対処法。

# failure_deriveが引き起こしている？
quoteクレートのバージョン1.0.3がリリースされたときにfailure_deriveが壊れてしまったという情報を見ました。（[参考](https://qiita.com/dalance/items/483028816e9ea98fbf97)）

```toml
quote = "=1.0.2"
```

ですが，`Cargo.toml`でこのように指定してもうまく動きませんでした。

# 解決方法
`cargo update`をします。
そうすると，derive_failureのバージョンが上がりエラーが起きなくなりました。

# 参考リンク
> https://users.rust-lang.org/t/failure-derive-compilation-error/39062
> https://qiita.com/dalance/items/483028816e9ea98fbf97
オンライン吞み会を企画したら、もう会えないと思っていた友人グループとその日の内にテスト開催出来て、zoomはスマホでも予想以上に手軽で快適に使えるという知見が得られた

# 会社の友人グループ同士
20年前に働いていた会社でよく一緒にいた友人のグループがありました。その個人個人とは繋がりがあっても、その後住んでいる所もバラバラになったので、たまたま近くに来た時とかに呑みに行ったりはしていますが、グループ全員で会うことはほぼなくなりました。例えば、北海道と九州と関東とかに分かれていると、北海道と九州の友人が同時に上京してきて3人で呑みに行くことは、下手したら一生ないかなーと思います。特に会社の友人という所がミソで、これが学生時代の友達だったらクラス会という名目で会えたりする機会もありますが、会社の友人だと当時のメンバ全員ではもう二度と会えないことはわりとあるかなと思います。

# オンライン吞み会
で、最近オンライン吞み会の話をちょくちょく見ます。まあ見るだけで、特に何か思っていた訳ではありません。そういうのもあるよねーぐらい。でも、ふと思いました。もう一生会えないと思っているグループメンバー同士でもオンライン吞み会したら会えるんじゃね？思いついた瞬間、とりあえず特にこの4人で集まりたい！と思っていたメンバに早速LINEを投げてみました。その友人たちとはもう少し大人数のLINEグループでも繋がっていましたが、ここはあえて一斉送信せず、One on Oneで一人ずつにメッセージを送りました。「〇〇と〇〇と〇〇でオンライン吞み会やってみない？」。3人ともわりと早めの返信が来ました。みんな揃って良い反応です。すぐやろう！的な。

# ビデオチャットの機材用意のハードル
で、僕は絶対に**ビデオチャット**でやりたいと考えていました。そうなってくると機材の用意が最大の障壁になりそうだなとも思いました。話としては面白そうでもビデオカメラもマイクもないので買わねばという話になると多分企画自体が立ち消えになってしまいます。で、今まで[zoom](https://zoom.us/jp-jp/meetings.html)を使ったことなかったですが、手軽らしいという評価はなんとなく知っていました。調べてみると**スマホ**でもアプリを入れたらビデオチャット可能。本当は、パソコンでやるのがベストだけれど、この際スマホでも良いと思ったので、ここで改めて4人のLINEグループを作りました。

# とりあえずzoomを入れてもらう
で、ここからグループのチャットで、早速「ビデオチャット」で吞み会やろうぜという話をしました。僕以外は3人ともビデオチャット自体人生で初めてでした。かなり仲良かった友人同士でもビデオチャットは心理的ハードルはあるようで、「ヘッドセットとかないけど」とか「汚い部屋が見られるのか」とか「設定とか出来るのかな？」みたいな話は出ました。でも、とりあえず、スマホでもパソコンでも良いから[zoomのアカウント](https://zoom.us/signup)作ろうぜという流れになりました。で、そのまま「新規ミーティング」→「ミーティングを開始」するだけで、一人でビデオチャット出来るという事も分かったので、一人ずつに一人でビデオチャットをやってもらっていました。これでzoomが如何に手軽に出来るか、実際にやってみたらどういう感じになるかが、一人一人が分かってきた感じになりました。

# そしてビデオチャット開始
ここまで来たら、最初から来週にでもやろうというノリだったので、一人が言い出しました。「これ、今からテスト的につないでみない？」。1時間後ぐらいには、もう全員では2度と会えないかもと思っていた4人で、zoomによるビデオチャットが始まりました！思いついたその日のうちに！！一人はパソコン、二人はスマホ、僕はスマホとパソコンの両方を使ってみました。みんながつながった瞬間、何故か大爆笑になりました！思っていた以上にスマホのクオリティが高い！4人で話してて、みんな「お、映像綺麗だね」とか「声途切れるとかほぼないな」という話ばっかりで、設定が分からない以外のトラブルは、ほぼなかったです。

# 40分制限
zoomは無料アカウントの場合、40分の時間制限があります。大体体感では4分ぐらいで40分制限に引っかかった感じになりましたｗ。それぐらい話も盛り上がった感じ。その後、部屋を作り直して、もう1回40分やったところで、一人が今日はここで抜けたいと言い出しました。そもそも今日はテストだったので、みんなで、「ＯＫ！じゃあ来週にでも本番やろうか」という話になりました。んーこれめちゃめちゃ良い流れでない？

# 総評
もう会えないと思っていた友人同士でオンライン吞み会をするのに、以下の流れが良かったなと思います。先ずLINEのテキストチャットでOne on Oneでやりとりする。次にそのメンバーでグループを作って、みんなでzoomの環境設定をする。そして実際やってみる。特に重要なのがスマホでzoomが出来たことで、これでハードルがグッと下がりました。シンプルも正義ですが、手軽さも同じぐらい正義です。そして、zoomでのビデオチャットは思っていた以上にクオリティが高かった！来週はさらに人数増やして、関東、関西、中国、四国の友人達とオンライン吞み会本番を画策中ですー。この記事で、古い友人とのつながりが広がったら嬉しいなーと思います。
日付ではなくファイル数でログローテーションする

# 初めに
よく7日前のログファイルを消してローテーションのように日付が条件として使われますが、
今回は個数指定でローテーションする場合のbashサンプルを作ってみました。

# ローテーション対象ファイル
今回ローテーションするファイルは
server.log.YYYY-MM-DDの形式でローテーションすることとします。

     /var/log/server.log # 最新のファイル
     /var/log/server.log.2020-03-25
     /var/log/server.log.2020-03-24
     /var/log/server.log.2020-03-23
     /var/log/server.log.2020-03-22


# 実装
```bash
    #!/bin/bash

    ROTATE_GEN=7             # ローテーション世代（今回は７個残す）
    LOG=/var/log/server.log  # 対象ファイル

    # 日付付きでファイルを退避
    mv ${LOG} ${LOG}.`date +"%Y-%m-%d"` 

    # 現在のファイル数(FILE_CNT) - 世代数(ROTATE_GEN)
    # = 削除するファイル数(RM_CNT)
    FILE_CNT=`ls -1t ${LOG}.* | wc -l`
    RM_CNT=`expr ${FILE_CNT} - ${ROTATE_GEN}`

    # RM_CNTの数だけファイルを削除
    if [[ $RM_CNT -gt 0 ]] ; then
     ls -1t ${LOG}.* | tail -n ${RM_CNT} | xargs rm -f
    fi
```

# 補足

　* lsのオプションは'l(エル)'ではなく'1(イチ)'
新規レコード作成時初期値の設定

## 前書き
spring 20の新機能として新規レコード編集画面に初期値を設定する機能がリリースされています
 [https://releasenotes.docs.salesforce.com/ja-jp/spring20/release-notes/rn_general_lex_navigate_to_record_dfv.htm](https://releasenotes.docs.salesforce.com/ja-jp/spring20/release-notes/rn_general_lex_navigate_to_record_dfv.htm) 

大変実用的な機能なのでうまく使いたいですね

## 設定方法
### 取引先責任者の新規レコードに初期値設定
取引先の画面から取引先責任者レコードを作る際の初期値設定の例

1 取引先責任者を作成するカスタムボタン作成
<img width="841" alt="新規ボタン作成.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270342/40f7fd4f-7858-5d28-7313-d507317fc3f8.png">
![ボタン設定.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270342/d08d7022-be5e-b397-ee4e-953531baf177.png)
URLで設定しているパラメータ部分がspring20での新機能

```
/lightning/o/Contact/new?defaultFieldValues=Title={!URLENCODE('ここに役職の初期値')}
```
これで取引先責任者の新規レコード編集画面を開きながら、「役職」項目(Api参照名がTitle)に文字列で指定した初期値を設定できる


2 作成したカスタムボタンをページレイアウトに配置
<img width="841" alt="レイアウトに配置.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270342/19663869-db33-19e9-4e91-0ac91fe508a3.png">

これで設定完了
取引先の画面の配置したボタンから役職に初期値が入っている取引先責任者新規のレコードが作成できる
![実際に開いた画面.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270342/a634bde8-2a92-7daf-eca1-699c7c86072f.png)


## 設定例
### 複数の項目の初期値設定
```
/lightning/o/Contact/new?defaultFieldValues=Title={!URLENCODE('初期値の役職')},LastName={!URLENCODE('初期値のlastname')},AccountId={!Account.Id}
```
カンマで区切ってつなげる

### 数式日付項目
```
Birthdate={!TEXT(TODAY())}
```
「今日」や「１週間後」を初期値としたいケースは多そう

### レコードタイプ
```
RecordTypeId={!URLENCODE('0190I000a019caZQuQ')}
```
レコードタイプIDを指定する必要がある
ボタンを押したらレコードタイプを選択する画面が出てほしい

### 参照先のデータ
例えば、取引先の「親取引先」(parentId)で紐づく取引先の項目を取引先責任者の初期値としたいケースは、パラメータだけではうまくいかない

```
LastName={!URLENCODE(parent.Name)}
```
この書き方は、ボタン保存のタイミングで「parent.Name」が取引先の項目でないとしてエラーになってしまう
参照先の親のデータをボタン配置したレコードに持たせておく工夫が必要

### 改行・スペース
```
/lightning/o/Contact/new?defaultFieldValues
=Title={!URLENCODE('初期値の役職')}
```
のように改行やスペースを入れると、ボタンの保存はできるが新規画面で正しく初期値が設定されない
うまく動かなかったらコピペのときに余分な半角スペースが入っていないかなど注意
MVVMについて簡単なまとめ

## Model
アプリケーションで使うデータの基本的な振る舞いやそれに関するロジックを保持
### 具体的には、
- データ構造の表現
- Web APIとのやりとり
- ローカルデータベースなどへの保存

## ViewModel
- ModelとView、ViewController層の仲介役
- Modelからデータを受け取り、それらをUIに反映できるような形で出力
- View、ViewControllerからユーザーのアクション情報を受け取り、Modelに伝え、Modelからデータを受け取りUIに反映できるような形で出力

## View、ViewController

### View
- UIの表示
- データを表示するようなUIの場合、Controllerからデータを受け取り、UIに反映
- ユーザーインタラクションの認知し、必要に応じてUIを更新する。
- もしくは、そのユーザーインタラクションをした結果、何かアクションをしたいとき、ユーザーインタラクションの情報をControllerに伝達する。
- View層はデータ構造に関する一切のロジックを保持しない。

### ViewController
- ViewとViewModelの仲介役を行う。
- ViewModelから受け取った出力をViewに反映させてUIを更新
- ユーザーのアクションをViewModelに伝え、ViewModelから新しい出力を受け取り、Viewに反映させてUIを更新
SORACOM LTE-M Button Plus をArduinoなどのGPIOからも操作しやすいようにした

# はじめに
SORACOM LTE-M Button Plusには独自の接点がつけることができます。
ただ、そこはショートさせるだけのため、他のマイコンなどのArduinoなどから直接GPIOをついないでなどは出来そうな気分になっちゃうけど、**絶対にやってはいけません**。
それを便利にするためのツールをつけました。

# 機能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58795/188b46ac-141c-20ee-b990-10b5592abd8b.png)

赤と青のところにはArduinoなどのGPIOを青がGNDになるようにGPIOから差し込みONにすることでボタンを押したのと同様の動きをします。
緑は既存の接点と同じ機能をもたそうかと思ったのですがあまり意味がないので現状は使えなくなっています。

# 構造
- ＴＬＰ６２１-１ http://akizukidenshi.com/catalog/g/gI-07442/
- L型ピンソケット http://akizukidenshi.com/catalog/g/gC-09862/
- プラケースwith基板 https://www.aitendo.com/product/14701 ※商品が無くなったため参考URL
- 抵抗220Ω

作りは至って簡単です。
回路図を書くまでもなく、LTE-M Button側からの接点をフォトカプラのフォトトランジスタ側につなぎ、GPIO側を発光ダイオード側につなぎ抵抗を間にいれているだけです。
ピンソケットは2Pのものがないので、6Pのものをカッターで減らして使っています。

# まとめ
何かちょっと携帯網を使って単純な送信イベントを送りたい！と言う時にArduinoなどから簡単に使えるようになってるため、便利に使うことができます。
Nagiosダウンロードでskipがなくなった件


Nagios coreをダウンロードしようとしたところ、skip downloadがなくなってました。
(skip to downloadだったかも、、）
名前や会社用のメールアドレス入力が必須になったようです。

#ダウンロードしてみようとする
https://www.nagios.org/
からNagiosCoreのダウンロードのところをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541506/e1cd4315-c1c5-74b9-a984-6906b6caff4e.png)

CoreとXIの違いの画面をスクロール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541506/d79c9aad-bf1b-8433-c7ff-c7317837a168.png)
～中略～
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541506/f8b1822a-92dc-6478-d0ae-91637790d66a.png)

Downloadをクリックして確認画面が出るのですが、
いつもあった「skip download」がなくなってました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541506/0f7ec52c-550b-fbc2-5a52-663c479220e4.png)

#直接のURLは生きてました
https://www.nagios.org/downloads/nagios-core/thanks/
には直接アクセスできてダウンロードできました。

ちなみに
https://www.nagios.com/
は商用向けのサイトのため、Core以外にもPluginsやaddon探しても出てきません。

#Nagiosの今後
日本ではZabbix勢力が圧倒的ですし、あまり日本へのマーケット展開は期待薄ですね
スクレイピング(Dockerつかったとき)のcronの注意点

#Cronがうまく使えなかったので備忘録。

環境：dockerを用いて仮想環境を構築した。
使用したイメージ：ubuntu16.04


起こった問題点：cronを利用しようとしても、

`command not found`

と表示された。

原因：どうやらdockerで生成したubuntuにははじめからcronが入っていないらしい。
以下のコードでパッケージをインストールした。

`apt-get install -y cron`

他にも、sudoが使えなかったので、

`apt-get install -y sudo`

でいんすとーるした。

ただ、オプションである-yの意味は依然として不明。
python RequestsをInstall

pythonを勉強している初心者です。
この記事は学習の目的として記録中です。
なので、参考にできる記事とか内容が間違ってたらコメントをよろしくお願いします。

# 開発環境
OS : macOS Catalina
Version : 10.15.3

# そもそもRequestsって何？
HTTP 通信ライブラリ

# RequestsをInstall
```
$ pip install requests
または
$ pip3 install requests
```

# Install確認
```
pip freeze | grep -e request
または
pip3 freeze | grep -e request
```
# 参考記事
[インストール方法](https://requests-docs-ja.readthedocs.io/en/latest/user/install/)
保守性を上げる重要なデザインパターン

#導入
こんにちは。けちょんです。
皆さん、保守性の低いコードを作ってしまっていませんか？
私が以前指摘され、改善したコードを紹介します。

#改善前
##コード

```java
public class Main {
	public static void main(String[] args) throws Exception {
		if (args[0].equals(ExecPattern.A.toString())) {
			exeA(args[1]);
		} else if (args[0].equals(ExecPattern.B.toString())) {
			exeB(args[1]);
		} else {
			throw new Exception("illigal request parameter");
		}
	}

	private static void exeA(String input) {
		// something
	}

	private static void exeB(String input) {
		// something
	}
}
```

```java
public enum ExecPattern {
	A, B
}
```

##内容
実行時に渡した第1引数を用いて、IF文で処理を分岐させています。
実際にはロジッククラスを用意して、ロジック部分は外出ししていました。

##何が悪いか
この場合、新たに実行パターンCが追加される際に新たにIF文を追加する必要があります。
保守性が低いですし、コントローラクラスが頻繁に更新されることはあまり好ましいことではありません。
追加による修正が最小限になることが理想です。

#改善後
##コード
```java
abstract class ExecLogic {
	abstract void execute(String args);
}
```
Logicクラスが継承する抽象クラス。
今回でいうと、AクラスやBクラスが継承します。

```java
public class A extends ExecLogic {
	@Override
	void execute(String args) {
		// something
	}
}
```

```java
public class B extends ExecLogic {
	@Override
	void execute(String args) {
		// something
	}
}
```
A,BクラスにはLogicを記載します。

```java
public class Main {
	public static void main(String[] args) throws Exception {
		ExecLogic logic = (ExecLogic) Class.forName(args[0]).getDeclaredConstructor().newInstance(); //※1
		logic.execute(args[1]);
	}
}
```
Mainクラスでは、実行時引数からA,Bクラスのインスタンスを生成して、処理を実行しています。
※1：実行時引数から、A,Bクラスのインスタンスを生成しています。
余談ですが、```Class.forName("className").newInstance()```はJava9からdeprecatedされています。
```Class.forName("className").getDeclaredConstructor().newInstance()```を使用しましょう。
参考：https://qiita.com/deaf_tadashi/items/3c3118e660861fb43434

##何が改善されたか
実際にCクラスを追加することを考えましょう。
修正内容は、Cクラスを追加して、中にロジックを書くだけです。
コントローラクラスには一切修正が不要になっています。
これで、追加時に修正を最小限にすることを達成しました。

#おまけ
実際には、実行時引数をバリデーションする処理が必要になると思います。
そこで修正箇所が増えるのも避ける必要があります。
以下のような実装にしましょう。

```java
	private static boolean validate(String[] args) {
		boolean res = false;
		for (ExecPattern execPattern : ExecPattern.values()) {
			if (execPattern.toString().equals(args[0])) {
				res = true;
			}
		}
		return res;
	}
```
文章の推敲・校正の個人的なノウハウ

# はじめに

論文や仕様などの文章の推敲・校正のノウハウを整理しておく。
本ノウハウは個人的な経験則から整理した。
参考文献[3]で、「多様な読み方で多様な推敲を行うことが良い方法である」と述べられている。
今回は、次の3つの読み方を示す。

* 形態素解析の活用
* 書き換えの活用
* 音読の活用

## 前提
* MS Wordで文章を書いている
* MS Wordの校正機能などで表記ゆれなどはチェックしている

# 提案する読み方
## 形態素解析の活用
形態素解析は「KH Coder」（「茶筌」）を利用し実行している。
「KH Coder」は、以下のサイトで公開されているフリーソフトウェアである。
https://khcoder.net/

※ここでは、「KH Coder」による形態素解析の手順についてのノウハウは省略する。
※以下の記事に形態素解析結果を活用したリーディング技法のやり方を示した。
https://qiita.com/kazuo_reve/items/6b7205ffb4ce6ad230ba

### 複合語と未知語のチェック
* 複合語と未知語と判断された単語に、誤記がないかをチェックする。
* 複合語と未知語と判断された単語は、参考文献で定義されている用語かをチェックする。
* 複合語と未知語と判断された単語は、チェック対象の文章内で用語定義されているかをチェックする。独自定義しているにも関わらず説明がない用語がないかをチェックする。

### 危ない複合語（「○○的」「○○性」）のチェック
* 複合語として「○○的」「○○性」といった単語が抽出された場合、その単語または単語が使われている文章があいまいである可能性がある。使用する単語またはその単語が使われている文章を見直す。

### 形容詞・副詞のチェック
* 「KH Coder」で以下の品詞として判定された単語について、その単語または単語が使われている文章があいまいである可能性がある。使用する単語またはその単語が使われている文章を見直す。例えば、「“多い”っていっているけど、ほんと？証拠ある？」という自問自答をして、文章を見直すか根拠となる参考文献を探す。
 * 形容詞
 * 形容動詞
 * ナイ形容
 * 副詞
 * 副詞可能

### 同義語のチェック
* 名詞とサ変名詞と複合語と未知語に分類された単語に、同義語がないかをチェックする。

## 書き換えの活用
文章の書き換えをすることで、書き換え元の文章の改善点に気づくことがある。

### スライドへの書き換え
MS PowerPoint等の発表資料（スライド）に書き換える。スライドのシートは、大きさの制限があるため、「文章を要約する」「文章を短くする（無駄を省く）」といったアクションに繋がる。「文章を要約する」「文章を短くする（無駄を省く）」といったアクションをしようとすると、元文章の改善点に気づくことがある。
自ら以下のような制約を設けたうえで、スライドを作成するとよい（デンソー足立久美さんからのアドバイス）。

* シート数の上限を決める（シート構成をあらかじめ設計する）
* フォントサイズを決める
* 箇条書きの項目は3つ以内にする
* 1文は2行以内にする

### 英文への書き換え
日本語の自然言語の文章を、英語の文章に書き換える。英訳しやすいように、元文章を短く・単純にすることに繋がることがある。

### 図表への書き換え
大切な説明は、図表へ書き換える。図表へ書き換え、レビューすることで、抜けている説明や冗長な説明に気づくことが多い。

## 音読の活用
参考文献[3]で、「声に出して読む」ことの効果が示されている。
MS Wordには「読み上げ」機能がある。この機能を使うと、自分で文章を読まなくても、音読によるチェックが可能である。
「読み上げ」機能の使い方は、参考文献[6]に示されている。

# 参考文献
[1] 柏原一雄，長井亘，谷口侑太，「要求仕様の誤解釈を検出する Domain Word Modeling の提案」，ソフトウェア品質管理研究会 第35年度（2019年度）分科会成果報告，2019，https://juse.or.jp/sqip/workshop/report/attachs/2019/5_knt_ronbun.pdf
[2] 結城浩，「数学文章作法 基礎編」，ちくま学芸文庫，2015，https://bookmeter.com/books/6574310
[3] 結城浩，「数学文章作法 推敲編」，ちくま学芸文庫，2015，https://bookmeter.com/books/8653540
[4] 阿部圭一，「情報伝達型の日本語文章に現れるあいまい表現の類型化とその改善例」，情報処理学会 デジタルプラクティス 5(1) 70-79, 2014
[5] 河野哲也，猪塚修，藤森麻紀子，本間周二，茂中義典，「キーワードベースドレビュー－ドキュメントのあいまいさや不備に着目したレビュー手法－」，ソフトウェアテストシンポジウム東京2010，2010，http://www.jasst.jp/archives/jasst10e/pdf/C2-3.pdf
[6] がむ，「Word読み上げ機能使ってますか？　文書のチェックにおすすめ」，2018，https://mos.tokyo/2018/07/18/yomiage/
[7] @kaizen_nagoya，「日本語（10）日本語の文章の推敲と校正」，https://qiita.com/kaizen_nagoya/items/3a5b00081a724c31cff9
[8] @kaizen_nagoya，「英語で考えると厳密になる件」，https://qiita.com/kaizen_nagoya/items/c2b157ad2616ea0978ff
[9] @youwht，「パワポエンジニアの憂鬱を軽減する誤字/表記揺れ検出ツールを作った物語」，https://qiita.com/youwht/items/062c41c88829fcf25107
[10] @kenichiro_ayaki，「特許技術者の憂鬱を軽減する誤字/表記揺れ検出ツールのWord版」，https://qiita.com/kenichiro_ayaki/items/db8a6818fcc9e3b69845
[11] https://qiita.com/kaizen_nagoya/items/bb788e2f4f0fec07af6e#_reference-c6e73d31eade1d2d9b82


# 参考記事・関連記事
https://qiita.com/kaizen_nagoya/items/bb788e2f4f0fec07af6e

https://qiita.com/kazuo_reve/items/a977ee979a8faf15304d
JavaScript勉強の記録その25:fetchでAPI叩いてみた

#やりたいこと
GithubのAPIを叩いて、GithubのIDを画面に出したい。

#実装方法
１：　HTMLの入力欄に自分のIDを入力
２：　ボタンをクリック
３：　APIをGETで叩いて、JSON形式で取得
４：　h１要素として表示させる


#用意したHTML
入力欄とボタンのみ用意

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>JavaScript Basics</title>
</head>
<body>
  <input></input>
  <button>Get My GitHub ID</button>
  <h1></h1>
  <script src="main.js"></script>
</body>
</html>
```

#用意したjavascriptファイル
APIを叩くと色々な値が返ってくるのですが、loginというキーがGitHubのIDになっています（console.logをしてあげるとよくわかる）。Fetchは何となくノリで書いたけど、動いたからOK。

こういったAjaxの実装をする時、普通はリクエストが成功したかどうか判定して、判定ごとに違う処理をしますがここでは割愛（というかpromiseよくわかってない）。

```main.js
'use strict';
{
 const text = document.querySelector('input');
 
 document.querySelector('button').addEventListener('click', () => {
   let url = `https://api.github.com/users/${text.value}`;

   fetch(url).then(function(response) {
     response.json().then(function(json) {
       document.querySelector('h1').textContent = json.login;
     });
   });
 });


}
```

動画：　https://i.gyazo.com/7dd2e09d16fc503b0b8a9b7aa06d0bf9.mp4
新世代Javaプログラミングガイドの紹介（Java 言語拡張 プロジェクト「Amber」編）

この記事は[新世代Javaプログラミングガイドの紹介（Java 12編）](https://qiita.com/kazsharp/items/f5365122204129fedfdd)の続きです。

##Java 言語拡張 プロジェクト「Amber」
書籍の最後はAmberプロジェクトについての解説で締めくくられています。
AmberプロジェクトはJava言語をより良い言語に拡張しようとして進められているプロジェクトですが、原著の出版時にはJavaのどのバージョンで使えるようになるか決まっていないものが多かったようです。
もちろん、翻訳書が発売された今でも決まっていないものがあります。
そんな **未来の機能** を含むAmberプロジェクトですが書籍では以下の5つについて解説させています。

* Amber プロジェクトの拡張 enum 型
* データクラスとその利用方法
* テキストブロック
* ラムダの改善ポイント
* パターンマッチング

###Java14で使える機能
書籍発売時と違い、Java14が既にリリース済みです。
Java14では上記の機能のうち

* データクラス（Records）
* テキストブロック
* パターンマッチング

がPreview 機能として使うことができます。

###テキストブロック
上記の中で個人的に早く正式リリースしてほしいのはテキストブロックです。
テキストブロックの機能はJava 13からPreview 版としてリリースされていますが、Java 14でもまだ正式リリースにはなっておらず、Java 15で正式リリースされると思われます。
Javaで文字列をリテラルで定義する場合、ダブルクォーテーション(")で囲みます。
テキストブロックでは文字列をダブルクォーテーション3つ(""")で囲むことで、改行やダブルクォーテーションなどをエスケープシーケンスを使うことなく定義できます。

たとえば

```
<HTML>
    <BODY>
        <H1>Meaning of life</H1>
    </BODY>
</HTML>
```

といった文字列を定義するのに今までは

```java
String html = "<HTML>" + 
"\n\t" + "<BODY>" + 
"\n\t\t" + "<H1>Meaning of life</H1>" +
"\n\t" + "</BODY>" +
"\n" + "</HTML>";
```

のようにしていたのが

```java
String html = """
              <HTML>
                  <BODY>
                      <H1>Meaning of life</H1>
                  </BODY> 
              </HTML>
              """;
```

とシンプルに書くことができます。
インデントの部分が気になるかもしれませんが、閉じる側のクォーテーション3つ（"""）の前の空白と同じ分の空白が各行の先頭から取り除かれます。
結果、最初に示した文字列を生成することができます。
このように色々と便利な機能について進められているAmberプロジェクトについてわかりやすくまとめられており、さっと読むだけでも将来Java言語がどのように進化するのかが見えてくるようになると思います。

以上、新世代Javaプログラミングガイドの紹介（Java 言語拡張 プロジェクト「Amber」編）でした。
Queryを手軽に試せるMongoDB環境を作成する

MongoDBのQueryを手軽に試したかったので、その環境を構築した際のメモです。

目的から以下の３つを条件にツールを探しましたが、３つ全てを満たすのがなかなか見つからず、結局 Mongo Express とJupyter notebookを組み合わせました。Web UIの

1. 複数人が手軽に利用できるようにWeb UIでアクセスできること
2. サンプルデータを簡単にいれれること
3. Aggregation Queryを実行できること


## ソース


Dockerfile

```dockerfile

FROM jupyter/scipy-notebook
ENV TZ=Asia/Tokyo
USER root
RUN pip install pymongo
USER $NB_UID
```

docker-compose.yml

```yaml
version: '3.1'

services:
  mongo:
    image: mongo:3
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    volumes:
      - ./data/db:/data/db
      - ./data/configdb:/data/configdb

  mongo-express:
    image: mongo-express
    ports:
      - 8081:8081
    restart: on-failure:10
    depends_on:
      - mongo
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example
  
  jupyter-notebook:
    build: .
    volumes:
      - ./data/notebook:/home/jovyan/work
    ports:
      - "8888:8888"
    environment:
      JUPYTER_TOKEN: jupyter
    depends_on:
      - mongo

```

開発時の一時利用なので、 `restart:always` は設定していません。
しかし、 `mongo-express` がMongoDBが立ち上がる前に起動し接続エラーで落ちてしまうので、`restart: on-failure:10` を設定し、再試行するようにしています。

## 起動

```
docker-compose up -d
```

MongoDBが立ち上がるのに少し、時間がかかります。

## 実行

### Mongo Express からサンプルデータ投入

アクセス先: http://localhost:8081
Database、Collection、Documentの作成がサクッとできます。

<details><summary>サンプルデータ投入</summary><div>

1. `Create Database` - `Create Collection` でCollectionを作成。
ここでは、test, inventoryという名前で作成
2. `New Document` で以下を貼り付けて `Save` 

```
[
   { item: "journal", qty: 25, status: "A", size: { h: 14, w: 21, uom: "cm" }, tags: [ "blank", "red" ] },
   { item: "notebook", qty: 50, status: "A", size: { h: 8.5, w: 11, uom: "in" }, tags: [ "red", "blank" ] },
   { item: "paper", qty: 10, status: "D", size: { h: 8.5, w: 11, uom: "in" }, tags: [ "red", "blank", "plain" ] },
   { item: "planner", qty: 0, status: "D", size: { h: 22.85, w: 30, uom: "cm" }, tags: [ "blank", "red" ] },
   { item: "postcard", qty: 45, status: "A", size: { h: 10, w: 15.25, uom: "cm" }, tags: [ "blue" ] }
]
```
</div></details>

### Jupyter notebook から接続

アクセス先: http://localhost:8888/?token=jupyter

上で作成したテストデータにJupyter notebookからアクセスします。
Jupyter notebookのコンテナからは、MongoDBには`mongodb://root:example@mongo:27017/` でアクセスできます。

例えば、statusごとの数を集計する場合は以下の感じです。

```python
import pymongo
client = pymongo.MongoClient('mongodb://root:example@mongo:27017/')
col = client.test.inventory

pipeline = [
    {
        "$group": {"_id": "$status", "count": {"$sum":1}}
    }
]
list(col.aggregate(pipeline)) # ==> [{'_id': 'D', 'count': 2}, {'_id': 'A', 'count': 3}]
```
[メモ] ディープラーニングでの汎化性能検証時のtest_splitと交差検証法の違い

Python / ディープラーニング初心者です。
ニューラルネットワーク実装時に調べた汎化性能の検証法について、
以下の通りメモを残します。

## 疑問に感じたこと
- k分割交差検証法( k-fold cross-validation / kCV)という汎化性能の検証方法がある(参考1)
    - 学習用のデータをk個に分割し、k-1個を学習用、1個を性能評価用に用いるという学習をk回繰り返す方法
- sklearn.modelselection.traintest_split(TTS)を用いて、手元のデータを学習用データとテスト用データに分けて汎化性能を検証することがあるのをもともと知っていた
- a.基本的にTTSを複数回繰り返したものがkCVという認識で良いか？
- b.TTSよりもkCVのほうがモデルの汎化性を正確に評価できるという認識でよいか？


## 回答
- a.そう思われる。加えて、kCV時にはもれなくすべてのk個分割を検証用に用いることができる。
- b.そのように思われる。
    - TTSを1回だけすると、検証用に用いるデータは学習データとして絶対に用いることができなくなるために、検証用データの選択方法次第では学習に不要な偏りが生じてしまう可能性がある。kCVならそれを克服できる(参考2)。
- kCVにも、「k個の各分割内にデータの偏りがあった場合に学習結果にバイアスがかかってしまう(犬のデータしか入っていない分割と、猫のデータデータしか入ってない分割に分けられているなど)」デメリットが指摘されている。これに対する対抗策としては、層化k分割交差検証(Stratified kCV)などが挙げられる(参考1)。


## まとめ
めっさ当たり前のことなんでしょうけどメモとして残します。

## 参考
- 参考1:[交差検証（cross validation／クロスバリデーション）の種類を整理してみた
](https://aizine.ai/cross-validation0910/#toc5)
- 参考2:[KFolds Cross Validation vs train_test_split](https://stackoverflow.com/questions/49134338/kfolds-cross-validation-vs-train-test-split)