OmniAICreator/Qiita-1.07M huggingface dataset:
Googleスプレッドシートで、新型コロナウィルスのオープンデータを集計してみた

## やりたいこと

- コロナ対策情報を集計して、いつでもWebで確認できるようにしておきたい
- すでにサイトがあるけれど、作るには高いプログラミング能力が必要
- もっと簡単にやる方法を調べてみた
- Googleスプレッドシートで、新型コロナウィルスのオープンデータを集計する

「自分たちのデータを集計・共有してみたいけど、プログラミングなんかできないし」という人は、とりあえずGoogleスプレッドシートでやってみてはどうでしょう。Excelが使える人なら、たぶんできますよ。

## デモページ

こんなのができました。次のリンクで、作成したシートを閲覧できます。

- [東京都：コロナウィルス感染者情報](https://docs.google.com/spreadsheets/d/1b_qEPZIW4t0tE_Z0g2nomu-llVtWFoJFVNuOPEtuNCo/edit?usp=sharing)
- https://docs.google.com/spreadsheets/d/1b_qEPZIW4t0tE_Z0g2nomu-llVtWFoJFVNuOPEtuNCo/

![tokyo_2020-03-25b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86880/31b56829-a547-b073-919b-e7bd6e99b9c6.png)

- [千葉県市川市：コロナウィルス感染者情報](https://docs.google.com/spreadsheets/d/1qygCTvwo92M9QVfi5eSwQbWgjkRHanGoY-0Q6j6Ekvo/edit?usp=sharing)

## Update

- ニュースの自動収集を追加
- データが更新されても対応できるように調整

## 東京都のオープンデータを確認する

- 東京都オープンデータカタログサイトホームページ
 - https://portal.data.metro.tokyo.lg.jp/
- 東京都オープンデータカタログサイトホームページ
 - https://portal.data.metro.tokyo.lg.jp/1097/
- 東京都 新型コロナウイルス陽性患者発表詳細 - データセット
 - https://catalog.data.metro.tokyo.lg.jp/dataset/t000010d0000000068
- CSVファイルがおいてある
 - https://stopcovid19.metro.tokyo.lg.jp/data/130001_tokyo_covid19_patients.csv

## Googleスプレッドシートで読み込む

１．IMPORTDATA関数で読み込む
```
=IMPORTDATA("https://stopcovid19.metro.tokyo.lg.jp/data/130001_tokyo_covid19_patients.csv")
```

２．公表_年月日の書式を日付にする

- 列を選択して、[表示形式] > [数字] > [日付]
- データが更新された時のために、日付書式を設定する範囲を列にしておく


## 集計する

1. セルの先頭を選択して、[データ] > [ピボットテーブル]
2. ピボットテーブルのシートに切り替え

### 公表年月日別の患者数
1. 「行」に「公表_年月日」を指定
2. 「値」に「No」を指定。「集計」を「COUNT」 
3. 総計は非表示にする

### 年代別の患者数
1. 「行」に「年代」を指定
2. 「値」に「No」を指定。「集計」を「COUNT」 

## グラフにする
1. ピボットテーブの集計結果の先頭を選択
2. [表示] > [グラフ]
 - 縦棒グラフ
 - データが更新された時のために、グラフの範囲を広めにしておく(例：A1:B100)

## 公開する

1. 右上の[共有]ボタンをクリック
2. シートにタイトルをつける
3. 共有可能なリンクを取得

次のリンクで、作成したシートを閲覧できます。

東京都：コロナウィルス感染者情報
- 公表数の日時推移
 - https://docs.google.com/spreadsheets/d/1b_qEPZIW4t0tE_Z0g2nomu-llVtWFoJFVNuOPEtuNCo/edit?usp=sharing

![tokyo_2020-03-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86880/04f1b389-b79e-e816-c591-316411fd3e32.png)

## ニュース機能を追加する

- Googleニュースの特定ワードを含むRSSを取得する方法 | KOSAERU
 - https://kosaeru.net/memo/google-news-rss/
- それをIMPORTFEED関数で取り込み
- HYPERLINK関数で、見出しとURLをまとめる

## 感想

- 便利ぃ
- オープンデータを直接インポートしているので、自動で更新されるんじゃないかな
- ~~グラフの範囲が固定なので、そこは手動操作が必要かも~~　範囲を調整して解消したはず

## 課題

- ニュースが自動更新しないかも
- スマホだと、手ごろなレイアウトにならない

## 関連情報

- 都内の最新感染動向 | 東京都 新型コロナウイルス感染症対策サイト
 - https://stopcovid19.metro.tokyo.lg.jp/
- tokyo-metropolitan-gov /
covid19から派生したサイト
 - https://github.com/tokyo-metropolitan-gov/covid19/blob/development/FORKED_SITES.md
gitで変更したファイル一覧を出力するコマンド

静的解析ツールのCLIに食わせたかった
動作はmacOS Catalina、bashで確認

# コミットするファイル一覧を出力する

```bash    
git diff --cached --name-only --diff-filter=ACMR
```

- cachedオプションでステージしたファイルを対象にする
    - pre-commitフックで使用できる
- name-onlyオプションでファイル名のみを出力する
- diff-filterオプションは結果に含めたい変更の種類に応じて変更

参考 https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---diff-filterACDMRTUXB82308203

## 動作

```bash
$ git add test.php temp/test2.php
$ git diff --cached --name-only --diff-filter=ACMR
temp/test2.php
test.php
```

## 使用例
- phpstan analyzeコマンドの引数にしたい場合

```bash
$ PATHS=$(git diff --cached --name-only --diff-filter=ACMR | tr '\n' ' ' 2>&1)
$ echo "phpstan analyze $PATHS --level max"
phpstan analyze temp/test2.php test.php  --level max
```

## ブランチで変更したファイル一覧を出力する

```bash
git diff --name-only master...$CURRENT_BRANCH
```

- master…$CURRENT_BRANCH間の.を3つにすることでブランチの変更ファイルのみを対象にしている

参考 https://devconnected.com/how-to-compare-two-git-branches/

## 動作

```bash
# --show-currentオプションはgit v2.22〜
$ CURRENT_BRANCH=$(git branch --show-current 2>&1)
$ git diff --name-only master...$CURRENT_BRANCH
test.php
```

使用例はコミットの場合と同様なので割愛
vimの便利な矩形選択について

最近知って便利だと思ったので備忘録で。
矩形選択ってvscodeとかでしか使えないと思ってたんですが、Linux上でも使えました。

_使用端末_：mac

# 使い方

こんな感じのファイルを用意して、vimで開いてます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321507/829d1200-1e97-5cbe-03fa-5ee0588b5045.png)

`control + v `を入力します。
入力すると、左下に`-- VISUAL BLOCK --`という文字が出てきます。これで矩形選択できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321507/ac04aedf-e1bf-497d-03fc-5fa73278818a.png)

この状態で移動すると薄い色で選択されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321507/69a016bb-f78f-f064-83df-8f004f508c33.png)

`x`を入力すれば、選択した分をまとめて削除出来ます。（実行すると、矩形選択モードは解除されます。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321507/a25a58cc-9e68-8acd-9960-81e55dc8e936.png)

一括で文字を入力する場合は、`control + v `で`VISUAL BLOCK`を出してから対象の箇所を選択して`shift + i`でInsertモードにします。(パッと見は一つしか選択されてないように見えますが大丈夫です)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321507/a6c338e9-5fc8-2f1e-4403-0d0188227d38.png)

文字を入力します。(パッと見は一つしか以下略)
入力が終わったらescapeキーを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321507/bdb5adc9-41c5-f178-426e-7aa2a3b95f2c.png)

Insertモードを解除すると選択した部分に文字が入力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321507/4025684f-0d4b-fe80-c2f2-af8be9840ee4.png)

# 終わりに
何回か教えてもらったんですが、イマイチ覚えてられないのでまとめてみました。
セッション

```値の保存
Request->session()->put('キー', 値);
```

```値の取得
$変数 = Request->session()->get('キー');
```

sessionの格納先は
```storage/framework/sessions```になる。


##データベースでセッションを使う
下記設定に変更する

```config/session.php
'driver' => env('SESSION_DRIVER', 'database')
```

```.env
SESSION_DRIVER=database
```

###コマンド実行
```
php artisan session:table
```

マイグレーションファイルが作成されるので```php artisan migrate```すればDBでセッションを扱えるようになる
プログラムはなぜ動くのか？を読んでみてまとめることで知識の定着を図る投稿#11

[プログラムはなぜ動くのか第２版](amazon.co.jp/プログラムはなぜ動くのか-第２版-知っておきたいプログラムの基礎知識-矢沢久雄/dp/4822283151/ref=sr_1_1?adgrpid=53631245656&gclid=Cj0KCQjw0pfzBRCOARIsANi0g0tajATNcn3H7Ogokqrdst5O2JctSzMRb6A0XyW5GegcPbJwaEvZO84aAlK8EALw_wcB&hvadid=338517958683&hvdev=c&hvlocphy=2392&hvnetw=g&hvqmt=e&hvrand=9776556383623440456&hvtargid=kwd-334563073858&hydadcr=27265_11561134&jp-ad-ap=0&keywords=プログラムはなぜ動くのか&qid=1583760691&sr=8-1)

を僕が師匠と読んでいる方に進めていただき、読んでみようと思いました。
そこで、僕的にはかなり難しいこともあり、この本をまとめながら読み進めていくことによって理解度を高めようと思いました。

こちらはあくまでも推奨する記事ではなく、僕がこうした方が定着しやすいかもと思い、記録に残すことにしました。

##論理右シフトと算術右シフトそして符号拡張

[ここのサイトを参考にしました](http://kccn.konan-u.ac.jp/information/cs/cyber03/cy3_shc.htm)

今回は自分の言葉で表現するのが難しいので参考するサイトの画像などを貼り付けながら理解を深めていければと思います

![スクリーンショット 2020-03-25 22.13.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/91292b51-c642-f10b-8df7-2d81569dd1aa.png)


![スクリーンショット 2020-03-25 22.13.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/72a16689-3de4-be12-1ab4-50740916497f.png)

符号拡張
https://www.momoyama-usagi.com/entry/info/calc-sys20

![スクリーンショット 2020-03-25 22.18.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/4546a65a-24a7-0673-5dc4-3cb1b355832f.png)

##コンピュータができる演算は2種類あって

「論理演算」

「算術演算」

の２種類があります。

いまいちピントがあっていないのでよくわからないのですが

四則演算（算術演算）とそれ以外（論理演算）の認識ではいます。

andやor、notやxor

ん？

&& や || や !

は見たことがあるけど

xor ???

ああ、これか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/6b204726-00a6-44a7-abc7-4297148d2866.png)

##まとめ

２進数は数字だけではないという認識を持つ必要がある。
おそらく今後様々なプログラムを開発するに当たってこういった数学の知識が必要になってくるのであると思った。
【AppStore申請】スクリーンショット作成

今回AppStore申請時に、スクリーンショットの生成ツールとして、[APPLAUNCHPAD](https://theapplaunchpad.com/)というツールを使用したので紹介。

## [APPLAUNCHPAD](https://theapplaunchpad.com/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/5cdf9328-f6dc-c1bb-78fd-595a802b7dba.png)

## 作成した様子

iPhone7で撮影したスクリーンショットを基に、自動で各サイズのスクリーンショットを生成してくれ、流行りの感じの広告風の画像が作成できた。

無料だとテンプレートは限られるが、十分に使用できると感じた。

簡単に作成したのはこんな感じです。↓↓↓

![screencapture-theapplaunchpad-dashboard-ios-2020-03-24-07_27_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/8acd3de4-7c7d-a15c-b704-d7023a78e0bf.png)


## 書き出し
各サイズこんな感じで書き出されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/294fbd60-0bc3-3dc1-4140-c3ad934fcb41.png)
JavaScriptに於ける闇の魔術と闇の魔術に対する防衛術

prototypeはね...死人がでるよね。

## 闇の魔術

自分のPCに閉じ込めておく分には、まぁ楽で良いんだけれども。

```js:俗に言う黒魔術
const __BASE_PROTO = {
	$: {
		value (...child) {
			// 略
			return this;
		} 
	}
}
{
	Object.defineProperties(Node.prototype, __BASE_PROTO);
	Object.defineProperties(Element.prototype, __BASE_PROTO);

}
function GOD(v) {
	this.v = v;
	// 略
};
Object.assign(GOD.prototype, Object.prototype, Array.prototype, Number.prototype, String.prototype);
```

ただ、後で面倒になる。

## 闇の魔術に対する防衛術

参考にしたライブラリはある [$(dsand).$()](https://github.com/johnny-shaman/dsand)
で、自分はこの防衛術をつかって SVGをグリグリ書いて、うりうり動かすライブラリを書いている [svg.js](https://github.com/mafumafuultu/svg.js)

```js:俗に言う白魔術
const __BASE_PROTO__ = {
	// '@': elem,
	'@parse' : {
		value (arr) {return arr.filter(v => null != v).map(v => '@' in v ? v['@'] : v)}
	},
	_ : {
		value () {return this['@'];},
	},
	has: {
		value (prop) {return prop in this["@"];}
	},
	$: {
		value(...child) {
			// 略
			return this;
		},
	},
	// 略
}
const _ = function(el, custom = '') {
	return Object.create(
		{ '@': el },
		custom instanceof Object
			? Object.assign({}, __BASE_PROTO__, custom)
			: __BASE_PROTO__);
};
const _tag = tag => document.createElement(tag);
const div = () => _(_tag('div'));
const p = () => _(_tag('p'));
```

```html
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>foo</title>
	<script src="_.js"></script>
	<script>
	const load = () => {
		_(document.body).$(
			div().$(
				p().$('hello')
			),
			div().$(
				p().$('world')
			)
		);
	};
	document.addEventListener("DOMContentLoaded", load);
	</script>
</head>
<body>
</body>
</html>
```

```html:bodyに追加される
<div><p>hello</p></div>
<div><p>world</p></div>
```
エクセルVBAでエクセル各シートをPDF出力する

# 概要
　エクセルの各シートそれぞれをPDFに出力したいということがあった。出力ボタンを押すと、各シートがPDFに出力されるものを作りました。PDFファイル名はシート名です。

![ui.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569955/29135848-aa0d-e638-8307-089b2b4cb94a.png)

# 環境
* Excel 2016

# 準備
* リボンに開発タブを表示する
    * [開発タブを表示する](https://support.office.com/ja-jp/article/-%E9%96%8B%E7%99%BA-%E3%82%BF%E3%83%96%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B-e1192344-5e56-4d45-931b-e5fd9bea2d45)

# コード
```vb:vba
    'デスクトップへのパスを取得
    Dim strDesktopFullPath As String
    Dim varWSShell As Variant
    Set varWSShell = CreateObject("WScript.Shell")
    strDesktopFullPath = varWSShell.SpecialFolders("Desktop") & "\"
    Set varWSShell = Nothing

    '出力フォルダ(=デスクトップ)
    Dim strOutputFolder As String
    strOutputFolder = strDesktopFullPath
    
    'ファイル名の設定およびpdf出力(Sheet2以降)
    Dim strFileName As String
    For n = 2 To Worksheets.Count
        'セル(A2)が空のシートはpdf出力しない
        If Worksheets(n).Cells(2, 1).Value <> "" Then
            
            'ファイル名(=シート名)
            strFileName = Worksheets(n).Name
    
            'PDFに変換する
            Worksheets(n).ExportAsFixedFormat Type:=xlTypePDF, Filename:=strOutputFolder & "\" & strFileName & ".pdf"

        End If
    Next
```

xlsmファイルは下記GitHubへアップしてあります。
https://github.com/i-chiaki/ExcelToPdf.git
個人ページの情報量が激減した

[この記事](https://qiita.com/rana_kualu/items/5f77110f5b5868dfc243)を書いた瞬間[個人ページ](https://qiita.com/rana_kualu?page=0)のLGTMを左側に持っていきやがった。
あえて視認性を悪くする工夫を盛り込む。

さらに、個人ページのレイアウトが格段に劣化した。
・1ページあたり僅か5件しか記事を表示しなくなった。
・コメント数を潰す。
・自分のLGTM履歴やコメント履歴を確認することができなくなっている。
　※プロフィール右上にある小さな『…』を押すとそこから見れる。極めてわかりにくい。

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/b15e2f44-bc73-485d-897f-5f9dfb030625.png)

[Contributionsページ](https://qiita.com/rana_kualu/contributions)に至っては、上部にあった日々のContribution数履歴は消えるし、記事の累計LGTM数もコメント数も一切何も表示されなっている。

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/7f1106ce-bb91-61fb-aad6-a20bb6d9fd16.png)


ほんと情報量を減らす改悪ばっかり実行するよな、ここ。
.Net Core 3.1のコンソールアプリを、単一実行可能ファイルかつRuntimeのインストールなしでUbuntu 18.04で実行する

Publish Single Fileとself-containedを試してみたので、やったことの備忘です。

下記の記事を参考にしながら進めました。
[.NET Core CLI を使用して .NET Core アプリを発行する](https://docs.microsoft.com/ja-jp/dotnet/core/deploying/deploy-with-cli)
[.NET Core 3.0のPublish Single File概要](https://qiita.com/Nuits/items/3136c999721e5e3fae90)

## 前提
#### やりたいこと
- .Net Core 3.1のコンソールアプリをUbuntu 18.04で実行したい
- Ubuntu 18.04に.Net Core 3.1のRuntimeをインストールしたくない
- 管理が面倒なので、単一実行可能ファイルにしたい

#### 環境
開発環境
- Windows 10
- Visual Studio 2019

実行環境
- Ubuntu 18.04



## 実装方法
### 1. コンソールアプリを作る
Visual Studioのテンプレートからコンソールアプリを選び、ソリューションを作成します。
動くことが確認できればいいので、1秒ごとに「Hello World!」と出力するように`Program.cs`を修正しました。

``` Program.cs
using System;
using System.Threading;

namespace SingleFileConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                Console.WriteLine("Hello World!");
                Thread.Sleep(1000);
            }
        }
    }
}
```

### 2. アプリケーションを発行する
1. 開発者用コマンドプロンプトを起動する
    - `ツール(T)` > `コマンドライン(L)` > `開発者用コマンドプロンプト(C)`
2. `dotnet publish -c Release -r linux-x64 /p:PublishSingleFile=true`を実行する
3. 実行ファイルが発行されていることを確認する(画像参照)
![発行先.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308224/62421fec-023e-fb26-6c81-55fa089aaeb6.png)

### 3. アプリケーションを実行する
1. Windows 10で開発したアプリケーションを、Ubuntu 18.04にコピー
2. ターミナルを立ち上げて、アプリケーションを配置したディレクトリまで移動
3. `chmod +x SingleFileConsole`でアプリケーションを実行可能形式にする
4. `./SingleFileConsole`でアプリケーションを実行する

うまくいっていれば、下記の画像のように動作するはずです。
![動作チェック.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308224/98a21392-e552-b6a0-8cc4-866e9b54cfc3.gif)
ArgumentErrorはActive Recordのメソッドが原因のときがあるよ【class_nameオプション】

##ある日こんなエラーが出ました

[![Image from Gyazo](https://i.gyazo.com/2308afaf2aa0d30e2a66401e51065e01.png)](https://gyazo.com/2308afaf2aa0d30e2a66401e51065e01)
？？？

##直訳・・・

『You tried to define an association named transaction on the model Product, but this will conflict with a method transaction already defined by Active Record. Please choose a different association name.』

『モデルProductにtransactionという名前の関連付けを定義しようとしましたが、Active Recordによって既に定義されているメソッドトランザクションと競合します。 別の関連付け名を選択してください。』


はて？
どこでメソッド名が被ったのか一晩考えました・・・


##原因

[こちら](https://railsdoc.com/model)のRailsドキュメントをみてびっくりしました。

元々定義されているActive Recordのメソッドに「transaction」があるんですね。

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

##修正

修正方法としては2つありました。

1. テーブル名を変える
2. class_nameオプションを使ってメソッド名を変える

今回はすでにかなり実装を進めていたのでclass_nameオプションを使用することにしました。

class_nameオプションは普通は同じモデルを参照する外部キーを2つ以上もたせたいときに使用するそうです。


（使用例）

```.rb
    belongs_to :buyer, class_name: 'User', foreign_key: 'buyer_id'
    belongs_to :seller, class_name: 'User', foreign_key: 'seller_id'
```

今回はメソッド名を「トランザクション」を「トレード」に。

``` product.rb
class Product < ApplicationRecord
  belongs_to :user
  has_one :trade, class_name:"Transaction", dependent: :destroy
end
```

``` transaction.rb
class Transaction < ApplicationRecord
  belongs_to :user, optional: true
  belongs_to :product, optional: true
end
```

``` user.rb
class User < ApplicationRecord
  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable
  has_many :products
  has_many :trade, class_name:"Transaction", foreign_key: "transaction_id"
end
```

##無事解決〜！

次回から肝に命じます・・・


##参考

[Railsガイド](https://railsguides.jp/association_basics.html)
[railsアソシエーションオプションのメモ](https://qiita.com/tomoharutt/items/e548186c763079327ed1)
[Railsドキュメント](https://railsdoc.com/model)
iproute2のマニュアルの日本語訳

##[iproute2](https://wiki.linuxfoundation.org/networking/iproute2)のマニュアルの[日本語訳](https://github.com/ysatoautonomous/jm-draft/wiki#iproute2)
### roff 版の入手先
https://github.com/ysatoautonomous/jm-draft.git

### iproute2-5.1.0
#### マニュアルのリンク一覧
[ifcfg(8)](https://ysatoautonomous.github.io/jm-draft/man2html/iproute2/iproute2-5.1.0/draft/man8/ifcfg.8.html)
[ifstat(8)](https://ysatoautonomous.github.io/jm-draft/man2html/iproute2/iproute2-5.1.0/draft/man8/ifstat.8.html)
[ip(8)](https://ysatoautonomous.github.io/jm-draft/man2html/iproute2/iproute2-5.1.0/draft/man8/ip.8.html)
[lnstat(8)](https://ysatoautonomous.github.io/jm-draft/man2html/iproute2/iproute2-5.1.0/draft/man8/lnstat.8.html)
[ss(8)](https://ysatoautonomous.github.io/jm-draft/man2html/iproute2/iproute2-5.1.0/draft/man8/ss.8.html)
[rtacct(8)](https://ysatoautonomous.github.io/jm-draft/man2html/iproute2/iproute2-5.1.0/draft/man8/rtacct.8.html)
HashMap::iter は cloned 出来ない

# つまずいた場所

```rust
let vec: Vec<String> = vec![
    "hoge".to_string(),
    "fuga".to_string(),
    "piyopiyo".to_string(),
];

// 要素がコピーされた Vec が出来る
let filtered_vec: Vec<String> =
    vec.iter().filter(|s| s.len() <= 5).cloned().collect();

let mut map: HashMap<i32, String> = HashMap::new();
map.insert(0, "hoge".to_string());
map.insert(1, "fuga".to_string());
map.insert(2, "piyopiyo".to_string());

// error[E0271]: type mismatch resolving ...
let filtered_map: HashMap<i32, String> =
    map.iter().filter(|(_k, v)| v.len() <= 5).cloned().collect();

```
ナンデ？

# 理由

まず `cloned` は `Iterator<Item=&T>` を `Iterator<Item=T>` に変換するもの。
つまり参照を受けて値に変換する。

しかし `HashMap::iter` は `Iterator<Item=(&Key, &Value)>` を返す。
この時、 **`(&Key, &Value)` は参照を格納した値であって、それ自体は参照ではない。**


# 解決法

前述の理由により、無理やり

```rust
.map(|pair| pair.clone())
```

としてもシャローコピーされるだけで上手くいかない。

```rust
.map(|(k, v)| (k.clone(), v.clone()))
```

とする必要がある。

今回は `i32` が `Copy` なので、

```rust
.map(|(&k, v)| (k, v.clone()))
```
でも可。


短くかける方法があれば教えてください。
PHPでは関数の引数が多くてもエラーにならない

phpでは関数に引数を渡すときに定義されている数より多くてもエラーにはならないようです。

```php
<?php

// 2つ引数で関数を呼び出す。
function twoArgumentFunction($one, $two)
{
    echo $one . ':' . $two;
}

# 引数二つで関数を呼び出す。
twoArgumentFunction('first', 'second'); 
// => first:second


// 3つの引数だと呼び出せる
twoArgumentFunction('first','second','third');
// => first:second
```

引数の数が少ないと「Fatal error」が発生します。

```php
// 1つの引数で呼び出すとエラーになる
twoArgumentFunction('first');
// Fatal error: Uncaught ArgumentCountError: Too few arguments to function twoArgumentFunction(), 1 passed in index.php on line 13 and exactly 2 expected

```
社内利用ツールを2020年らしいプロセスで作ってみる(Vue.js + Electron + SQLite3) Day3

# ここまでの流れ

とあるSIerにおいて、社内システムで案件、要員、収益などの登録、参照は出来るものの、計画立案時にアドホックに変えながら計数を見るような機能がなくて困っているため、休暇中にツールを作ってみる試みです。

1. ~~ツール作成の目的と動作環境を検討する~~ -> Day1
* ~~アーキテクチャをいったん検討する~~ -> Day1
* ~~ユースケースを洗い出す~~ -> Day2
* ~~画面イメージのスケッチを作成する~~ -> Day2
* ドメインモデルを検討する（用語の定義、振る舞いの定義） -> Day3
* ユースケース、画面イメージのワイヤフレーム、ドメインモデルを何周か見直す -> Day3, Day4
* 当初決めた目的が果たせるか利用者目線を検証する(コンセプトの検証)
* 単純なCRUDアプリでアーキテクチャを検証する(実現方式の検証)
* コアになるユースケース1本だけプロトタイプ作成(MVP)
* 本格的に準備して開発を始める(テスト駆動のイテレーション開始)

【Qiita】[社内利用ツールを2020年らしいプロセスで作ってみる(Vue.js + Electron + SQLite3) Day1](https://qiita.com/takeout44/items/be3d2b47c84d8b487a68)
【Qiita】[社内利用ツールを2020年らしいプロセスで作ってみる(Vue.js + Electron + SQLite3) Day2](https://qiita.com/takeout44/items/4135a9bb3d3e7c705cb1)

# 開発日記(Day3)

## ドメインモデルを検討する

draw.ioで、新規ファイルを作成します。
ユースケース図のときと同じように、GitHubでissueを切ってbranchを作って、作成したbranchのuml/を保存先に指定します。

### エンティティと関連の洗い出し

最初は属性などの細かいことを考えずに、エンティティと関連だけを考えていきますが、後で属性や振る舞い（関数）も書き込んでいくので、"Class" 部品を詳細を畳んだ状態で使うことにしました。
集約ルートに該当するルートエンティティは "Interface 2" 部品を使って、Interface->集約ルートとして書きたかったのですが、畳めないので全て "Class" で統一することにします。

書き始めると分からなくなるもので、以下の記事からとにかくいろいろ読みました。
【はてなブログ】[日本語のドメイン駆動設計 (Domain-Driven Design - DDD) 関連記事まとめ](http://create-something.hatenadiary.jp/entry/2018/04/24/213840)

特に参考にしたのが、やはりというべきか増田さんの資料です。
【SlideShare】[3週連続DDDその1 ドメイン駆動設計の基本を理解する](https://www.slideshare.net/masuda220/ddd-52339527)

インクリメンタルに育てるというところで、44Pからのモデル成長過程が資料に落ちているのが見つかったのはこれだけです。これが初版の心理的なハードルをとても下げてくれました。

![domainModel_v01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215924/586a865f-326d-ac47-0beb-ff860a805874.png)

プルリク作ってmasterにマージをして、3点セットが以下の状態になりました。

* ユースケース図: draw.ioで書いたsvgファイルがGitHubのmasterにマージ済
* 画面スケッチ: 紙とペンで書いたスケッチがノートにある
* ドメインモデル図: draw.ioで書いた概念レベルのsvgファイルがGitHubのmasterにマージ済

## ユースケース、画面イメージのワイヤフレーム、ドメインモデルの見直し

### コンセプト検証の目線で要素の過不足を確認

3つを並べてみると、登場する要素が異なっているのに気付きました。
要素が多い、詳細化が進んでいる順で、画面イメージ＞ユースケース＞ドメインモデルの順でした。

Day2 では画面を作ることでユースケースの不足が出てきて喜んでいましたが、あれは完全に逆でした。
当初の機能としては作らなくてもいい機能（コンセプト検証には不要なはずの機能）が盛り込まれていました。

皮肉なことですが、最初に作ったユースケースが一番コンセプトを正確に表しているように感じたので、まずは画面とモデルをこれに合わせるように見直していくことにします。

### スケッチのワイヤフレーム化

とうとうFigmaを使います。
Sketchなどのデザインツールを使ったことがある人からすると操作感などはハードルがかなり低いという評判のようですが、デザインすること自体がはじめての私には3日目のこれが最大の山場だった可能性が高いです。。

このあたりのページが大変参考になりました。先人の知恵には感謝感謝です。

【Webメディア/ferret】[デザインツールFigma（フィグマ）の使い方とは？デザイナー以外の方でも有効活用できる](https://ferret-plus.com/13195)

【個人ブログnote】[Figmaの使い方、全力でまとめました。](https://note.com/99997373/n/n77573dfb8797)

この途中でネットが激混みで遅くなって休憩入りましたがどうやら戻りそうにないので、予定よりも進んでいませんが今日は終わることにします。

### 用語の定義

### 振る舞いの検討

## Day4にむけて

とても中途半端に終わってしまっているので、画面のワイヤーフレーム化からいきます。
JavaScriptで西暦と平年orうるう年を出力する

初投稿です。最近、JavaScriptなどの学習を始めました。優しくしてください。
先日JavaScriptを使ったうるう年のプログラムを学習したところですが、最近覚えたfor文と組み合わせて、
西暦と一緒にうるう年かどうかをhtml上で` 西暦○○年：平年ですorうるう年です `とブラウザに出力するプログラムを書いてみようと考えました。
0年から2020年までずらーっと並べます。

コード内の下記の配列は[連番の数字の配列を作成（es2015 ver)](https://qiita.com/sakymark/items/710f0b9a632c375fbc31)
を参考にさせていただきました。
0から2020までの数値を変数に入れるつもりでした。

```js
const arr = [...Array((2020) + 1).keys()]
```

#コード
- htmlの`<script>`タグ内に記述し、
`document.write();`で出力しています。
- `uruu(year)`がうるう年を判定する関数です。引数に応じてうるう年か平年かを判定して`result`に渡します。


```html
<!DOCTYPE html>
<html lang="ja" dir="ltr">
<head>
    <meta charset="UTF-8">
    <title>うるう年出力</title>
</head>
<body>
    <script>
        function uruu(year) {
            if (year % 4 == 0) {
                if (year % 100 != 0 || year % 400 == 0) {
                    result = 'うるう年です';
                }
            } else {
                result = '平年です';
            }
        }

        const arr = [...Array((2020) + 1).keys()]
        let result = "";

        for (let i = 0; i < arr.length; i++) {
            uruu(arr[i])
            document.write('西暦' + arr[i] + '年:' + result);
            document.write('<br>');
        }
    </script>
</body>
</html>
```
#結果
西暦0年から2020年までをブラウザに出力出来ました。（0年は本来無いらしいですが…）
長いので最初と最後を。
![FireShot Capture 006 - うるう年出力 - .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602423/81c99a44-51ff-1014-2243-c9044114459c.png)
![FireShot Capture 005 - うるう年出力 - .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602423/b33f8977-7a9c-c91a-ea10-d4406c443913.png)
これだけです。



#所感

- 全体的にもっと短くきれいに書けるはず。あまりにも無知。

- 下記の箇所はfor文をどうにかして、配列の箇所を`...Array(2020)`と簡潔に出来そうな気がするのですが、西暦2020の所が西暦undefinedとなってしまうので現状の記述にしています。

```js
const arr = [...Array((2020) + 1).keys()]
```
```js
for (let i = 0; i < arr.length; i++) {
```

#最後に
今後はもっと難しいのを書けるようになりたい。
Roomのリレーションで悩んでいたら、リレーション実現しなくても実装出来た

## Roomで１対１対応のリレーションを実現したい

Roomを使ったアプリケーションで、別々のテーブルの情報が両方必要なので、昔Railsを触った自分としては、

「ついにAndroidのRoomでもリレーションを実現しなければならない時が来た」

と思いました。
そこでドキュメントなど、色々見ていたのですがRoomで１対１対応のリレーションは、ズバリこう実装すれば良いというのがイマイチ分からないでいました。
ActiveRecordでいうhas_oneのような物は無いのでしょうか。

ところが「参照するだけなら、そもそもRoomでリレーション組まなくても実装できる」という話を聞いて、自分は最初よく理解出来ませんでした。

## DBでリレーション使わず、実現した方法

今回はサンプルとして、仮にゲームのQuestionテーブルとScoreテーブルとします。

```kotlin
// データモデルQuestion
id: Int
level: Int
number: Int
question: String
created_at: String
```

```kotlin
// データモデルScore
id: Int
level: Int
number: Int
time: Int
score: Int
clear_date: String
```

この２つを関連づけたいとします。このQuestionテーブルに対応したScoreを結び付けたい。必要な情報を抽出して、

```kotlin
// QuestionとScoreをまとめて扱う、QuestionAndScoreクラス

class QuestionAndScore {
    companion object {
        fun createQuestionAndScore(level: Int, number: Int, question: String): QuestionAndScore {
            return QuestionAndScore().apply {
                this.level = level
                this.number = number
                this.question = question
            }
        }
    }
    var level: Int = 0
    var number: Int = 0
    var question: String = ""
    var time: String = ""
}

```

２つのテーブルの情報を同時に扱うQuestionAndScoreクラスを作成しました。

- 今回はQuestion情報に対する最高スコアを組み合わせた問題リストを作成することにします。

```kotlin

val allQuestions = getAllQuestions() //全ての問題データを取得する
val allScores = getAllScores()  //全てのスコアデータ取得

// 問題データとスコアデータを組み合わせたリスト
val allQuestionsAndScores = mutableListOf<QuestionAndScore>().apply {
    allQuestions.forEach { questionData ->
        val level = questionData.level
        val number = questionData.number
        val question = questionData.question
        val questionAndScore = createQuestionAndScore(level, number, questoin)
        // 関連するスコアだけを取り出す
        val scoreList = allScores.filter { scoreData ->
            scoreData.level == level && scoreData.number == number
        }
        // 最高スコアを取得
        val maxScore = scoreList.maxby {
            it.score
        }!!.score
        questionAndScore.score = maxTime
        add(questionAndScore)
    }
}

```


これで問題情報と各問題の最高スコアを組み合わせた問題リストが作成出来ました。

値を参照するだけなら、このように実現することが出来ました。
【スタジオしまづ】>Udemy >セ5:C#基礎>配列基礎

#教材番号19　配列の基礎と応用
あの配列と親しくなりたいシリーズ

・変数をいっぱい作るのが大変な時、配列を使います。
　int、int、int、int、int、int、な人とか変われる。

・宣言、取得、更新を大事に！

###
      （宣言）まずはここから

```csharp 

//パターン1）
        int[] xList = new int[3]; 
        xList[0] = 0;
        xList[1] = 2;
        xList[2] = -3;

//パターン2）
        int[] yList = new int[3]{0,2,-3};
```

###
     （取得） できるかも
```csharp 
// 値の取得
        Debug.Log(xList[0]);
        Debug.Log(xList[1]);
        Debug.Log(xList[2]);    

// ながさ取得(要素の数)
        Debug.Log(xList.Length);
```

###
      （for文との連携de出力）ついに？
```csharp 
        for(int i=0; i<xList.Length; i++)
        {
            Debug.Log(xList[i]);
        }
```




素人なのでfor文の「i=0」って言われても「i」が分からなかったりしました。
別に「i」じゃなくてもいいんですよ。多分「coi」でも。。




###演習　0から30までの数を要素とする配列を作成せよ

■わたし

```csharp
void Start()
    {
        int[] yList = new int[31];
        yList[0] = 0;
        yList[1] = 1;
        yList[2] = 2;
        yList[3] = 3;
        yList[4] = 4;
        yList[5] = 5;
        yList[6] = 6;
        yList[7] = 7;
        yList[8] = 8;
        yList[9] = 9;
        yList[10] = 10;
        yList[11] = 11;
        yList[12] = 12;
        yList[13] = 13;
        yList[14] = 14;
        yList[15] = 15;
        yList[16] = 16;
        yList[17] = 17;
        yList[18] = 18;
        yList[19] = 19;
        yList[20] = 20;
        yList[21] = 21;
        yList[22] = 22;
        yList[23] = 23;
        yList[24] = 24;
        yList[25] = 25;
        yList[26] = 26;
        yList[27] = 27;
        yList[28] = 28;
        yList[29] = 29;
        yList[30] = 30;
        for(int i=0; i< yList.Length; i++)
        {
            Debug.Log(yList[i]);
        }
    }
```

■先生

```csharp
        // 0から30までの数を要素とする配列を作成せよ
        int[] yList = new int[31];
        for(int i=0; i<yList.Length; i++)
        {
            yList[i] = i;
        }
        for(int i=0; i<yList.Length; i++)
        {
            Debug.Log(yList[i]);
        }

```

■まとめ
①壮大に間違えている様ですが、
　よくみると「わたし」も2個目のDebug.Logは正解ですね。間違えてますけどね。

②forを2回使うなんて、
　1回目のforで配列の要素に1足す、2回目のforでDebug.Logに1個表示、、、
　をアップデート関数でやってる。

③あとは1回目のforが分れば、理解できそう。。

 >for(int i=0; i<yList.Length; i++)
  最初は0スタート、yListの長さより長くなるまでやる、1ずつ増やす

ここまでは割とわかるかも。つまづいたのがこの先

 >yList[i] = i;

むむむ、何を更新しているのか。
####そこでばらして考えると、、、

yList[i] = i;

↓
yList[i]　 = 　i
👆要素の数  👆for文で宣言されたi

↓
yListの要素の数にはfor文で宣言されたiを代入する
ってなると思うよ。



##学習教材
[Unityゲーム開発入門：インディーゲームクリエイターが教えるマリオのような2Dゲームを作成する方法【スタジオしまづ】]（https://www.udemy.com/course/studio_shimazu_sideview_action/）
【初心者向け】git feature branch作成からpushするまで（備忘録）

会社の研修で先輩のコードレビューを受けるために、gitのリモートリポジトリにプッシュすることがありました。

# featureブランチの作成

略してfeatと書くこともある。

```
$ git branch #現在自分がいるブランチの確認
$ git branch feature #featureブランチ作成
$ git checkout feature #featureブランチへ移動

（変更後、、、）

$ git add . #ファイルをインデックスに丸ごと移動
$ git commit -m "message" # ローカルリポジトリへコミット
$ git push origin feature # featureブランチの内容をoriginへアップロード
```

これで行けました。

追記するかもしれません。
ログを監視してSlackに通知を送るシェルスクリプト

ログを監視してSlackに通知を送るシェルスクリプトを良く書いたり、誰かに設定してもらうことが多いので健忘録。

### 1. SlackからIncomming Webhookを作成
https://slack.com/intl/ja-jp/help/articles/115005265063-Slack-%E3%81%A7%E3%81%AE-Incoming-Webhook-%E3%81%AE%E5%88%A9%E7%94%A8

`https://hooks.slack.com/services/XXXXXXXXX/YYYYYYYYY/ZZZZZZZZZ`
のようなURLを作成する。

### 2. サーバー上でエラーを検知し、送付するスクリプトを作成

ファイル名を、`report.sh`として作成。ここでは対象ログを、 `cron_daily.log` とし、検知する文字列を大文字小文字を無視して `err` とした。自分用に随時編集のこと。curlで送る内容は、チャンネル名と最後のWebhook URLを変更のこと。

スクリプトの内容としては、エラーログファイルをgrepして対象文字列を含む行がある場合には、Slackに通知するスクリプトとなっている。

```sh
#!/bin/bash

ERROR_CONTENT=`cat cron_daily.log | grep -i err`
ERROR_BYTE=`echo $ERROR_CONTENT | wc -c`

echo $ERROR_BYTE

if [ $ERROR_BYTE -gt 1 ]; then
  echo "エラーがありました。"
  curl -X POST --data-urlencode "payload={\"channel\": \"#チャンネル名\", \"username\": \"エラーログ報告\", \"text\": \"$ERROR_CONTENT\", \"icon_emoji\": \":bar_chart:\"}" https://hooks.slack.com/services/XXXXXXXXX/YYYYYYYYY/ZZZZZZZZZ
else
  echo "エラーはありませんでした。"
fi
```

### 3. Cronでエラーログの送信タイミングを設定
```sh
chmod a+x report.sh
crontab -e
```
実行権限をつけてCronを編集するコマンドにて、vim等で編集し、

```
0 * * * * /home/username/report.sh
```

のように実行するスクリプトのパスを設定して完了。このCronの設定だと毎時0分にエラーが発生していたらSlackに通知が飛ぶ。

以上。
一対多によるリレーション

自分用の備忘録も兼ねて実装にあたり苦労したので投稿します。

#概要
* レストラン(親)は複数のメニュー(子)を持つ関係
* Java、SpringBootにて一対多によるリレーションを関係するエンティティに記述
* 親テーブル（@OneToMany）、子テーブル（@ManyToOne）使用

#親テーブル

```RestaurantsEntity.java
@Entity
@Table(name="restaurants")
public class RestaurantsEntity {

  //各フィールド変数記述 略……

  @OneToMany(mappedBy="restaurantId")
  private List<RestaurantMenuEntity> restaurantMenuEntityList;

  //下記setter/getter 略……	 
	 
}
```
「一対多」の一側のフィールドには、多側のエンティティのコレクションを保持させてます（private List＜RestaurantMenuEntity＞ restaurantMenuEntityList;）。

@OneToManyアノテーションを付与し、mappedByで関連させる多側エンティティのフィールドを指定してます（mappedBy="restaurantId"）。

#子テーブル
```RestaurantMenuEntity.java
@Table(name="restaurantMenu")
public class RestaurantMenuEntity {

  //各フィールド変数記述 略……

     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "restaurantId")
     private RestaurantMenuEntity restaurantId;
     
  //下記setter/getter 略……	 
	 
}
```
「多対一」の多側のフィールドには、一側のエンティティを保持させてます（private RestaurantMenuEntity restaurantId;）。

@ManyToOneアノテーションを付与することで、リレーションシップを定義しています。

nameで関連テーブルを結合させるために使用するカラム名を指定してます（name = "restaurantId"）。


#あとがき
まだまだ全てを理解できているわけではありませんが、ひとまず実装できました。
ベイズの定理

# 条件付き確率
事象Aが起こった条件の元、事象Bが起こる確率を**条件付き確率**と呼び
$P(B \ |\ A)$ や $P_A(B)$ と表す

$$P(B | A)=P_A(B) = \frac{n(A \cap B)}{n(A)}$$

今、全事象を $S$ とし、その根元事象の数を $n(S)$ とすると
$ P(A) = \frac{n(A)}{n(S)} \quad $ $ P(B) = \frac{n(B)}{n(S)} \quad $ $ P({A \cap B}) = \frac{n(A \cap B)}{n(S)} \quad$ なので

$$
P_A(B) = \frac{n(A \cap B)}{n(A)} =  \frac {\frac{n(A \cap B)}{n(S)} } {\frac{n(A)}{n(S)}} 
= \frac {P(A \cap B)}{P(A)} 
$$

故に

$$
 P(A \cap B)={P(A)} \cdot P_A(B)
$$

## 例　もう１人は男の子？
ある家庭に子供が２人いる。
その内、１人が「男の子」である場合、もう１人も「男の子」である確率は？

**<font color="red">1/2ではない事に注意</font>**（1人目が男の子である事が考慮されていない）

|事象|確率|
|---|---|
|A：少なくとも１人は男の子|$\large{\frac{3}{4}}$|
|A $\cap$ B：２人とも男の子|$\large{\frac{1}{4}}$|
|B\|A：もう１人も男の子|$\large{\frac{1}{3}}$|

数学的に言えば、求める確率は $P_A(B)$ なので

$$ P_A(B) = \frac{P(A \cap B)}{P(A)} = \frac{1/4}{3/4} = \frac{1}{3} $$

が答え

|1人目|2人目|片方が男の子|2人とも男の子|
|---|---|---|---|
|<font color="red">男</font>|<font color="red">男</font>|〇|〇|
|<font color="red">男</font>|女|〇|×|
|女|<font color="red">男</font>|〇|×|
|女|女|×|×|

**<font color="red">１人が「男の子」であると確定している状態で、もう1人も「男の子」である</font>** 確率は上の表から見ても1/3



# ベイズの定理
条件付き確率の $A$ と $B$ を入れ替える


$$
P_A(B) = \frac {P(A \cap B)}{P(A)} \quad \Longrightarrow \quad P(A \cap B) = {P(A)} \cdot P_A(B) \quad \cdots \quad(1)
$$
から

$$
P_B(A) = \frac {P(A \cap B)}{P(B)} \Longrightarrow \quad P(A \cap B) = {P(B)} \cdot P_B(A) \quad \cdots \quad(2)
$$

（１）と（２）を 左辺 $P(A \cap B)$ で紐づけると

$$
{P(A)} \cdot P_A(B) = {P(B)} \cdot P_B(A) \quad \cdots \quad(3)
$$

(３）を変形すると

```math
\begin{align}
P_B(A) &=& \frac{P(A) \cdot P_A(B)}{P(B)} \quad \cdots \quad(4) 
\end{align}
```

$P_A(B)$ は事象Aが起こった条件の元、事象Bが起こる確率なので
事象Aという**原因**の元、事象Bという**結果**を得る確率とも考えられる
すると、（４）に対して不思議な解釈ができる

$P(A|B)=P_B(A) \Longrightarrow$ <font color="red"> **事象Bという結果が起こった時に、事象Aという原因が発生する確率**</font>を求めている事になる

原因 $\Longrightarrow$ 結果 ではなく　結果 $\Longrightarrow$ 原因 が発した確率を求めている

## 例　本当に病気？
Cさんが、罹患率は 0.01% の病気であると診断された
診断の正しさが以下の確率である場合、Cさんが本当に罹患していた確率は？

||陽性|陰性|
|---|---|---|
|罹患|98%|2%|
|非罹患|20%|80%|

**<font color="red">98% ではない事に注意</font>**（非罹患の人も陽性だと判断してしまう場合が考慮されていない）

罹患・非罹患（原因）$\Longrightarrow $ 陽性（結果）？
に対し、問いは
陽性（結果）$\Longrightarrow $ 罹患・非罹患（原因）？
という流れになっている事に注目

```math
\begin{eqnarray}
P(罹|陽) &=& \frac{P(陽 \cap 罹)}{P(陽）} \\\\[1pt]
&=& \frac{P(罹) \cdot P(陽|罹)}{P(陽）} \\\\[1pt]

&=& \frac{P(罹) \cdot P(陽|罹)}{P(陽|罹）+ P(陽|罹^c）} \\\\[1pt]

&=& \frac{0.0001 \times 0.98 }{0.0001 \times 0.98 + (1- 0.0001) \times 0.20 } \\\\[1pt]

&=& \frac{0.0001 \times 0.98 }{0.0001 \times 0.98 + 0.9999
 \times 0.20 } \\\\[1pt]

&=& 0.0004898089745 \\\\[1pt]

&≒& 0.0005

\end{eqnarray}
```

0.05% が答え

罹患率0.01％（事前確率）が診断結果を加える事で、0.05%（事後確率）に上がっている事に注目

# 参照
[統計WEB ベイズの定理の使い方](https://bellcurve.jp/statistics/course/6448.html)
[予備校のノリで学ぶ「大学の数学・物理」](https://www.youtube.com/watch?v=oUN_GhB00fU&list=PLDJfzGjtVLHmx7qMP410-9gx0weC9d90X&index=13)
[【ベイズの定理】ベン図でわかる条件付き確率](https://www.mynote-jp.com/entry/conditional-probability-and-Bayes)
slickで画像にリンクをつける方法

こんにちは！
今日はjQueryで簡単に画像スライダーが実装できるプラグインslickについて、「npmインストールでつまづいた所」と「画像にリンクをつける方法」をお伝えしたいと思います！
#npmでslickをインストールしたい
まずnpmでインストールするとき、つい公式ページを確認せず`npm i slick`と打ちがちですが、これだとjQueryプラグインのslickは使えません！`npm i slick-carousel`でインストールしましょう！

#画像にリンクをつける方法
画像リンクは`<ul>`の外に付けても意味ありませんでした。通常の画像リンクを実装するように`<img>`を囲うように付けましょう。

```index.html
<ul class="slider">
  <li><a href="hogehoge"><img src="img.jpg" alt="" class="slider-img"></a></li>
  <li><a href="hogehoge"><img src="img.jpg" alt="" class="slider-img"></a></li>
</ul>
```
# リンク
https://www.npmjs.com/package/slick-carousel
whereメソッドと正規表現で別テーブルの存在確認

##概要
模擬フリマアプリ作成時、
別テーブルに該当のIDをもつレコードが存在するか確認し、存在すればテキストを表示させるところでかなり詰まったので備忘録としてまとめます。

具体的には商品（Product）がPay.jpを通して決済がおきた時に、取り引き（Transaction）テーブルにproduct_idが保存される形となっています。

トップページでは商品をancestryを使ってカテゴリー別に一覧表示させており、商品が既に取り引き済だった場合に、「SOLD OUT」の文字を表示させます。

##完成イメージ

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

##各テーブル

``` .rb
class CreateProducts < ActiveRecord::Migration[5.2]
  def change
    create_table :products do |t|
      t.string :name, null: false
      t.integer :price, null: false
      t.references :user, null: false, foreign_key: true
      t.timestamps
    end
  end
end
```

``` .rb
class CreateTransactions < ActiveRecord::Migration[5.2]
  def change
    create_table :transactions do |t|
      t.references :product, null: false, foreign_key: true
      t.references :user, null: false, foreign_key: true
      t.timestamps
    end
  end
end
```

##コントローラー

``` .rb
class ProductsController < ApplicationController
  def index
    # カテゴリー別 一覧表示
    # アンセストリーのID毎に10件ずつ商品を取得
    @ladies_products = Product.where(category_id: 20..85).limit(10)
    @mens_products = Product.where(category_id: 91..144).limit(10)
    @appliances_products = Product.where(category_id: 408..434).limit(10)

    # カテゴリー別 Sold Out Check
    # idsと複数形になるところを気付くのにも時間がかかりました
    @ladies_transaction = Transaction.where(product_id: @ladies_products.ids)
    @mens_transaction = Transaction.where(product_id: @mens_products.ids)
    @appliances_transaction = Transaction.where(product_id: @appliances_products.ids)
  end
end
```

##ビュー

``` .rb
    .top__genre-items
      - @ladies_products.each do |product|
        .top__genre-item
          = link_to product_path(product.id), class:"top__genre-item-link" do
            .top__genre-item-pict
              = image_tag product.images.first.image.url, alt:"商品画像", class: "top__genre-item-img"
            .top__genre-body
              .top__genre-body-price
                .top__genre-body-price--yen
                  ¥
                .top__genre-body-price--value
                  = product.price
              .top__genre-body-name
                = product.name
              -# Sold Out Check
              -# @*****_transactionに値が入っているか確認
              - if @ladies_transaction.present?
              -# @*****_transactionの配列に入っている一番最初の要素のproduct_idとeachで表示させているProductのIDが適合すればSOLD OUTを表示
                - if @ladies_transaction.first.product_id == product.id
                  .top__transaction-check
                    .top__transaction-check--btn
                      SOLD OUT
```

firstが肝でしたね・・・！
精進します・・・！

##以上となります
もっといい方法があればご教示くださいm(__)m
Elastic BeanstalkでのLaravelにてstorageへのシンボリックリンクを張る方法

# はじめに
Elastic BeanstalkでのLaravelにてstorageへのシンボリックリンクを張る方法で手こずったので備忘録です

# TL;DR
container_commandsにて「ln」を使用して、相対パスでシンボリックリンクを貼りました

# コード
```.ebextensions/commands.config
container_commands:
   0x_storage_link:
      command: "ln -s ../storage/app/public storage"
      cwd: "/var/app/ondeck/public"
```

# 最後に
他に良い方法がありそうですが。。。

# 補足
「php artisan storage:link」でシンボリックリンクを貼ると絶対パスになりました。（参考サイトと同事象）

# 参考
[php artisan storage:link linking wrong directory](https://stackoverflow.com/questions/52288807/php-artisan-storagelink-linking-wrong-directory)
Blynkを使ってRaspberryPiとスマートフォンを接続する

#はじめに
RaspberryPiを使ってIoT機器を作りたく、またスマートフォンで操作ができないかと模索してみたらBlynkというアプリを使えば簡単に接続と操作ができるとわかったので試してみました。

#Blynkとは
Blynkサーバー経由でRaspberryPiとスマートフォンを接続でき、Blynkのアプリを使ってRaspberryPiにあるスクリプトの操作ができるようになるものです。

全体像はこのような感じです。
![blynk.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572384/d7fb502b-97e6-1788-5984-b6fe1b11b8e3.jpeg)
（引用元：http://docs.blynk.cc/)

#使用したもの
- Androidスマートフォン
- Raspberry Pi3 B+

#接続するために準備すること
スマートフォン側とRaspberryPi側でそれぞれで準備が必要です。

### スマートフォン側の準備
1. Blynkのアプリをダウンロードする
2. Blynkのアプリでプロジェクトを作成する
3. 指定したメールアドレスにBlynkよりRaspberryPiと接続するための**Token（接続キー）**が届くので控えておく

### RaspberryPi側の準備
1．BlynkのライブラリをGithubから取得する

```
pi@raspberrypi:~ $ git clone https://github.com/blynkkk/blynk-library.git
```

2．ビルドし、Blynkの実行ファイルを作成

```
pi@raspberrypi:~ $ cd blynk-library/linux
pi@raspberrypi:~/blynk-library/linux $ make clean all target=raspberry
```
3．Blynkを起動し、Blynkサーバーと接続する

```
pi@raspberrypi:~/blynk-library/linux $ sudo ./blynk --token="メールに届いたToken"

[0] 
    ___  __          __
   / _ )/ /_ _____  / /__
  / _  / / // / _ \/  '_/
 /____/_/\_, /_//_/_/\_\
        /___/ v0.6.1 on Linux

[1] Connecting to blynk-cloud.com:80
[583] Ready (ping: 192ms).
---
```

これでBlynkが起動し、サーバー経由でスマートフォンとRaspberryPiの接続が完了しました。

#まとめ
Blynkを使えば短時間でスマートフォンとRaspberryPiの接続が可能でした。
あとはやりたいことをプロジェクト内で作り、それに相対する実行プログラムを作成すればBlynkサーバー経由で実行可能です。

#参考サイト
- Makers Love
    - https://makerslove.com/10051.html
- Raspberry Piブログ
    - http://blog.livedoor.jp/victory7com/archives/48316461.html 
- IoT PLUS
    - https://iot-plus.net/make/raspi/rpi3-blynk-shutdown/
【Rails】FactoryBotの作り方(アソシエーション、Faker、画像の紐付け)

# はじめに
今回はFactoryBotという存在は知っているけど、自分で作れって言われたら、ちょっと・・・と思う人に向けて、FactoryBotの作り方を記事にしました。
FactoryBotについての説明は割愛します。

# FactoryBotの作り方
基本的な構文はこれです。

```ruby
FactoryBot.define do
  factory :user do
    first_name { "John" }
    last_name  { "Doe" }
    admin { false }
  end
end
```

### 例えば、itemテーブル(商品)を作成するとしたら

- まず、FactoryBotの決まり文句を書きます。

```ruby:factories/items.rb
FactoryBot.define do
  factory :item do
  end
end
```

- 次に、カラムを列挙します。

```ruby:factories/items.rb
FactoryBot.define do
  factory :item do
    name {"レモン"}  # {}で囲っているとfactoryが生成された時に評価される
    price {3000}
  end
end
```

# 使い方、属性の上書きの仕方
create(:item)
create(:item, name: "リンゴ")
# アソシエーションの仕方
例えば、itemとuserが紐づいている場合、以下のように書く。
(userのfactoryBotも作成している必要がある)

```ruby:factories/items.rb
FactoryBot.define do
  factory :item do
    name {"レモン"} 
    price {3000}
    association :user, factory: :user # アソシエーション
  end
end
```

`association :user, factory: :user`の部分は単に`user`と省略できる

```ruby:factories/items.rb
FactoryBot.define do
  factory :item do
    name {"レモン"} 
    price {3000}
    user # アソシエーション
  end
end
```

# 画像の紐付けの仕方
itemにimageが紐づいている時を想定します。
itemは必ずimageが紐づいており、imageは必ず紐づいたitemがあります。

先ほどの通り、実装すると、以下のようになりますが、imageを作るときに、itemが必要で、itemはまだ作成されていないので、結論うまくいきません。

```ruby:factories/items.rb
# これはうまくいかない
FactoryBot.define do
  factory :item do
    name {"レモン"} 
    price {3000}
    user
    image
  end
end
```

after(:build)を使用する必要があります。
これで、imageを一枚紐づけることができます。

```ruby:factories/items.rb
FactoryBot.define do
  factory :item do
    name {"レモン"} 
    price {3000}
    user
    after(:build) do |item|
      # carrierwaveの場合
      item.images << build(:image)
      # ActiveStorageの場合
      item.images.attach(io: File.open('spec/fixtures/test_image.jpg'), filename: 'test_image.jpg', content_type: 'image/jpg')
    end
  end
end
```

```ruby:factories/images.rb
# carrierwaveの場合のみ必要
FactoryBot.define do
  factory :image do
    image { File.open("#{Rails.root}/public/images/test_image.jpg") }
  end
end
```

after(:build)で保存される直前に処理を実行でき、複数のfactoryを同時に生成することができる

# Fakerの使い方
FactoryBotと良く一緒に使われるのがFaker。
Fakerを使うメリットは、ランダムな文字列を生成してくれるところにある。
例えば、deviseを用いたユーザログインでは、emailがすでに登録されていたらそのemailを使うことができない。

以下のようなFactoryを作成してしまうと

```ruby:factories/users.rb
# これはうまくいかない
FactoryBot.define do
  factory :user do
    name {"テストユーザー"}
    email {"test@hello.com"} 
  end
end
```

生成する際に、エラーが起こる

```ruby
john = create(:user, name: "John")
kevin = create(:user, name: "kevin") # emailが重複して作成できない！！
```

Fakerを使用すると、ランダムに生成してくれて、エラーが起きない。

```ruby:factories/users.rb
FactoryBot.define do
  factory :user do
    name {"テストユーザー"}
    email { Faker::Internet.free_email } 
  end
end
```
[PlayFab] データをクラウドセーブしたい時のAPIの選び方

####前置き
- クラウドにファイルをセーブする機能を実装するために関連するPlayFabの仕様を調べました
- 2019/Dec時点の仕様です。調べてから時間が空いてますが書く時間が取れたので記事にしたということで。
- 実装自体は大きくつまづく箇所もなく、リリース済みアプリ内で利用中です。

##2系統のAPI
クラウドセーブを実装する場合に使うことになるPlayFab提供APIは、大きく分けると2つの系統があります。クラシックとエンティティEntityです。

### クラシックAPIの特徴
- 「ユーザー1人あたり」がサイズ制限になっていることが多い
- ファイルを扱う場合はstringに変換する必要がある
- 2018年以前はこの系統のAPIのみが提供されていたので系統名がなかった。Entityが登場したのでクラシックと呼ばれることに。本命登場で幼なじみと呼ばれるようになった感ある。

### Entity APIの特徴
- 2018年に導入されたAPI
- JSONファイルやオブジェクトを直接扱える
- 「アプリ全体が利用している量」がサイズ制限になっていることが多い
- PlayFabは、同じことができる場合こちらを使うことを推奨している

## 2つのAPIをTier毎に比較

||ESSENTIAL Tier|PRO/Indie Tier|
|---|---|---|
|クラシック API|10000Byte/ユーザー※|(運営に相談/ユーザー)|
|Entity API|1GB/プロジェクト|50TB/プロジェクト|

- プロジェクトに必要なスペック＆財布に応じて選ぶといいと思います
- ※だいたい10000byteでなく、本当にきっちり10000byteです1byteでも超えていると、超えているのではじきましたというメールまで届きます。ちょっとくらい超えても大丈夫かなと淡く期待していましたがそんなことなかったです。

#### Tier
PlayFabの料金プランはTierで分かれている

|ESSENTIAL|無料|
|---|---|
|Indie/PRO|有料　月99＄/299＄|
|ENTERPRIZE|有料、法人向け|
※IndieはMAU10万超えでPROに自動移行、受けられるサービスは同じ
詳しい記事 => [PlayFab 各プランのAPI制限値とか比較してみた](https://qiita.com/naichilab/items/57fe8ad11cde0d4094e5)


## どちらを選んだか
- 自分は、Essential Tierで利用中で、ユーザー数がどこまで増えるのか予測が難しかったので、10000byteと極小容量ですがユーザー数が増えても同容量使えるクラシックAPIを選びました。実際にどんなコードを組んでいるのかも時間がある時に記事にします。
sidekiqを使って非同期にメール送信処理をする方法

# 詰まったところ
sidekiqで非同期にメール送信処理を実行する様に実装していたら、メール送信のジョブが**待機状態**のまま実行されない不具合に遭いました。

# 結論・解決方法
公式にある通り、以下のコードを実行。
https://github.com/mperham/sidekiq/wiki/Active+Job#action-mailer

``` bash:bash
$ bundle exec sidekiq -q default -q mailers
```
次に、`deliver`や`deliver_now`を`deliver_later`に変更。
`deliver_later`とは、非同期にメール送信処理を行ってくれるメソッドである。
逆に、`deliver`と`deliver_now`は同期的にメール送信するメソッドである。

```rb:〇〇_mailer.rb
〇〇Mailer.deliver
〇〇Mailer.deliver_now
```
**↓**

```rb:〇〇_mailer.rb
〇〇Mailer.deliver_later
```

これで治るはず（知らんけど）。


# もしDockerを使っていたら

sidekiqコンテナをビルドする際に以下コマンドを実行させる。

``` yaml:docker-compose.yml
sidekiq:
    command: bundle exec sidekiq -q default -q mailers
```


# 非同期処理を実装する前に

## sidekiqで`perform_async`を使って非同期処理をする前に、まずは`〇〇Mailer.new.perform`で同期処理ができるか確認しよう

そもそもとしてそのコードに不備がないかを確認しましょう（僕は不備がありました）。。。。
`perform_async`は**非同期処理なので、binding.pryなどブレイクポイントを使うデバッグはできません。**
なので、

``` ruby:〇〇_mailer.rb
〇〇Mailer.new.perform(args)
```

を実行して同期処理で正しく動作しているかを確認しましょう。

## sidekiqのログを確認しよう
https://github.com/mperham/sidekiq/wiki/Monitoring#web-ui
**sidekiqには、sidekiqで処理するジョブを閲覧できるダッシュボードを用意してくれています。**
`/sidekiq`へアクセスすることで、ダッシュボードからエラーログの確認ができます。
エラーログを見ると、どの様なエラーが吐かれているかを確認できます。
![スクリーンショット 2020-03-25 19.54.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241219/3806d075-dbc2-7fb6-17b4-00ca6229c497.png)



## sidekiqの処理に渡す引数のデータの型に気をつけよう
https://github.com/mperham/sidekiq/wiki/Best-Practices#1-make-your-job-parameters-small-and-simple
**sidekiqに渡す引数のデータ型には制限があります。**
**シンボル、名前付きパラメーター、複雑なRubyオブジェクト（Date型やTime型など)は使用できません。**
**使用できる引数のデータの型は、JSONのデータ型のみです。**
JSONのデータ型は以下です。

- 文字列 ("...")
- 数値 (123, 12.3, 1.23e4 など)
- ヌル値 (null)
- 真偽値 (true, false)
- オブジェクト ({ ... })
- 配列 ([...])

僕は引数に`Date型`を渡していましたが、勝手にString型にされ他ので上記の様なエラーが起きました。
なので、**Date型の引数を`to_s`で渡して、Worker内で`to_date`することで解決しました。**
みなさんの問題解決に繋がったら幸いです。
MySQLでインポートしたデータが文字化けしたときに試したこと

# はじめに
MySQL（厳密にはMariaDB）で、日本語を含むCSVファイルをインポートしたが、
select文でそれを表示させたところ、日本語部分が文字化けしてしまった。
不具合の詳細と、解決に向けて試したこと、解決策について備忘録も兼ねて記す。

# 環境
- XAMPP
- MariaDB
- コマンドプロンプト

（バージョンなどは後述のように再インストールしたため不明。）


# 発生した不具合

```tb2.csv
A106,中村,26
A107,田中,24
A108,鈴木,23
A109,村井,25
A110,吉田,27
```

というファイルをMariaDBで読み込んだ。

```
load data infile "db1\\tb2.csv" into table tb2 fields terminated by ",";
```

因みに、書き込むテーブルのカラムは以下。

```
bang varchar(10)
nama varchar(10)
tosi int
```

出力結果とエラー文

```
+------+--------+------+
| bang | nama   | tosi |
+------+--------+------+
| A106 | 荳ｭ譚・|   26 |
| A107 | 逕ｰ荳ｭ |   24 |
| A108 | 驤ｴ譛ｨ |   23 |
| A109 | 譚台ｺ・|   25 |
| A110 | 蜷臥伐 |   27 |
+------+--------+------+
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549712/a252ae61-3a50-5301-824d-945cea2226cc.png)



# 試したこと

### 再起動
XAMPP Control Panelの対応する箇所を再起動した。
具体的にはMySQLの行のStopボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549712/15d1484a-83c1-cfbb-fdd9-135e48683317.png)


### CSVファイルの文字コードを確認・書き換え
サクラエディタを使ってShift-JISやUTF-8に変更して保存し直し、インポートし直した。

### データベースの設定を確認・書き換え
 ```
show variables like "chara%";
```
このコマンドを用いて、データベースに設定されているコマンドを確認した。
ここではVariable_nameがcharacter_set_databaseである項目のValueについて確認。


その後、

```
SET character_set_database=utf8
```

を使ってcharacter_set_databaseをUTF-8に書き換えた。
また"utf8"部分をcp932（=Shift JISに対応）にも書き換え、
それぞれに合わせてCSVファイルの文字コードもUTF-8やShift-JISに変更してみた。

### my.iniファイルの書き換え

MariaDB上の、初期の文字コードを設定するものであるようだ。

[ここ](https://www.dbonline.jp/mysql/myini/index3.html)などを参照。

### XAMPPを再インストール

ファイルが壊れた、バージョンが古いなどの原因かどうかを確かめる意図。
再インストール前のバージョンなどはメモし忘れた。

# 解決につながった方法
~~色々と試しすぎて、この方法のみによって解決したかと言われると確約はできないのだが~~
**結論からいうと、不具合の原因はMySQL側ではなく、コンソール側に存在していたようだ。**

MariaDBでファイルをインポートしたはいいものの、その文字コードをコマンドプロンプト上で取り扱うにあたって、
それがコマンドプロンプトで設定されている文字コードとは異なっていたため、文字化けが発生していた、という可能性がある。

解決に当たってCSVファイルの文字コードを散々変更して試しているので、
コマンドプロンプト上の設定文字コードとCSVファイルの文字コードが一致するパターンがあっても不思議ではない。
それならばもっと早い段階で問題が解決していてもおかしくはないはず。
従って、これだけが原因だったのかと言われると疑問が残る。


とはいえ、以下の方法で解決した。


コンソール（コマンドプロンプト）の文字出力に使用されている文字コードを変更する。
コンソール上で以下のコードを打ち込んだ。(数字65001はUTF-8に対応している）

```
chcp 65001
```
rails c でのwebpacker インストールエラーについて


```terminal:実行コマンド
rails c
```

```terminal:エラー
Webpacker configuration file not found[ディレクトリ]
```
とりあえずwebpacker がないということなのでインストールしてみることにした。




```terminal:実行コマンド
rails webpacker:install
```
ノードのバージョンが古いということなので、ノードをインストールし直すこととした。

```terminal:エラー
Webpacker requires Node.js >= 8.16.0 and you are using 8.11.3
Please upgrade Node.js https://nodejs.org/en/download/
```

#ノードをnodebrewを使って管理
せっかくなので、nodebrewを使ってnodeバージョン管理するように変更することとした。


```terminal:
curl -L git.io/nodebrew | perl - setup
```

```terminal:
export PATH=$HOME/.nodebrew/current/bin:$PATH
```
zshのため.zshrcの変更を適応させるようにした。


```terminal:
source ~/.zshrc
```

```terminal:
nodebrew help
```

#webpackerのインストール
今度は問題なく実行された。

```terminal:実行コマンド
rails webpacker:install
```

#参考記事
ありがとうございました。

[nodebrewでNode.jsをアップデートする](https://qiita.com/Sr_Bangs/items/bda855068576905a441f)