OmniAICreator/Qiita-1.07M huggingface dataset:
Zynq UltraScale+ MPSoCでpetalinuxを起動した際にSDカードが消える話

#はじめに
前回の[記事](https://qiita.com/Hamucha/items/e01652fef2c3863aac82)が予想以上に多くの方に読まれていたことに驚いています。ありがとうございます。自分の文章力の無さに驚きつつも少しでも問題共有ができればいいなと思い書き始めた経緯です。

今回はその続編ということで、開発中のMPSoCにPetalinuxを導入しようとしたときに発生した問題について記述したいと思います。
この原因の根本的解決が未だに見つかっていないので、どなたかわかる方がいたらご教授いただければ幸いです。

#SDブートしているのにマウントされない…？
今まではstandaloneの状態（いわゆるベアメタル）でデバッグをしていましたが、あれからソフトウェア的に開発するに至って、Petalinuxを導入することになりました。

自分はソフトウェア開発はしないので、ソフト屋さんに一任するのですがPetalinuxが正常起動するかどうかだけ気になったので自分でLinuxイメージを作成することに。

導入に関してはPetalinuxツール資料([UG1144](https://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx2019_1/ug1144-petalinux-tools-reference-guide.pdf))を参考に作成。

ハードウェア情報が記載されているBOOT.binとlinuxファイルであるimage.ubが作成され無事にlinuxは起動したのですが…

```
PetaLinux 2018.3 hogehoge /dev/ttyPS0

hogehoge login: root
Password:

Login incorrect
hogehoge login: root
Password:
root@hogehoge:~# df
Filesystem           1K-blocks      Used Available Use% Mounted on
devtmpfs               1889616         4   1889612   0% /dev
tmpfs                  2024092        68   2024024   0% /run
tmpfs                  2024092        68   2024024   0% /var/volatile
```

**SDカードが見えてない！！！！**
そこでdmesgコマンドでmmcの状態を確認して見た結果

```
root@hogehoge:~# dmesg | grep mmc
[    2.611962] mmc0: SDHCI controller on ff160000.mmc [ff160000.mmc] using ADMA 64-bit
[    2.808930] mmc0: error -110 whilst initialising SD card
root@hogehoge:~#
```

やはりmmc0の部分でerrorのメッセージが出ていました…

SDのCLKの周波数が原因かなと思い、IP designでSDIO0の周波数を50[MHz]に落としてやってみましたがこの現象は治らず（てかそもそもデフォルト値が200[MHz]っていう時点で相当早い気がするんですが…）

#容量を変えて挑戦してみよう！
筆者が使用していたSDカードが原因じゃない？という話になり、その辺に転がっていた4GBのSDカードを使用したところ…

```
PetaLinux 2018.3 hogehoge /dev/ttyPS0

hogehoge login: root
Password:
root@hogehoge:~# df
Filesystem           1K-blocks      Used Available Use% Mounted on
devtmpfs               1889616         4   1889612   0% /dev
tmpfs                  2024092        72   2024020   0% /run
tmpfs                  2024092        68   2024024   0% /var/volatile
/dev/mmcblk0           3850240     21856   3828384   1% /run/media/mmcblk0
root@hogehoge:~# dmesg | grep mmc
[    2.619732] mmc0: SDHCI controller on ff160000.mmc [ff160000.mmc] using ADMA 64-bit
[    2.749315] mmc0: new high speed SDHC card at address 0007
[    2.749542] mmcblk0: mmc0:0007 SD04G 3.68 GiB (ro)
[    2.752745]  mmcblk0:
root@hogehoge:~#
```

**あーなるほどね 完全に理解したわ（わかってない）**

なんと普通に動いてしまいました。一応この現象は8GB,32GBでは起動せずに4GBの時に正常起動しています。不思議ですね…

#まとめ
フォーマットの問題かなと思いいろいろ試しましたが結果原因はわからず…
FAT32の問題なのかなと勝手に予想していますがわかりません…

とりあえず動いたから**ヨシ！**になってますが根本的解決がまだわかっていないのでわかる方がいましたら教えて下さい…
Terraform Provider で `no suitable version installed` エラーが出る場合の対処法

# 環境

* macOS Mojave 10.14.6
* Terraform 0.12.18

# 背景

Terraform を学習するために、テスト用の `resource.tf` を作成。

```:resource.tf
provider "aws" {
}

variable "AWS_REGION" {
  type = string
}

resource "aws_instance" "example" {
  ami = var.AMIS[var.AWS_REGION]
  instance_type = "t2.micro"
}
```

`terraform init` は正常に完了しました。

```
terraform init
```

# エラー内容

`terraform console` を打つと次のエラーが発生。

```
terraform console

Error: Could not satisfy plugin requirements

Plugin reinitialization required. Please run "terraform init".
 
Plugins are external binaries that Terraform uses to access and manipulate
resources. The configuration provided requires plugins which can't be located,
don't satisfy the version constraints, or are otherwise incompatible.
 
Terraform automatically discovers provider requirements from your
configuration, including providers used in child modules. To see the
requirements and constraints from each module, run "terraform providers".
 
Error: provider.aws: no suitable version installed
  version requirements: "(any version)"
  versions installed: none
```

前述の通り、`terraform init` は実行済みですが、`Error: provider.aws: no suitable version installed` とあるので、terraform-provider-aws がちゃんとインストールされていないようです。

（ググってみると、同じ問題で困ってる人が多そうでした。）

# 対処法

`terraform init` では上手くいかないので、手動でプラグインをインストールします。

## 手動インストール

まずは [terraform-provider-aws](https://releases.hashicorp.com/terraform-provider-aws/) で zip ファイルをダウンロード。（macOS の場合は `darwin_amd64` を選択）

ダウンロードしたファイルを `~/.terraform.d/plugins/darwin_amd64` 配下に展開します。

```
cd ~/.terraform.d/
mkdir plugins
cd plugins
mkdir darwin_amd64
cd darwin_amd64
unzip ../../../Downloads/terraform-provider-aws_2.43.0_darwin_amd64.zip
```

これで手動インストールは完了。

```
pwd
/Users/[username]/.terraform.d/plugins/darwin_amd64
ls
terraform-provider-aws_v2.43.0_x4
```

## terraform init で `-plugin-dir` を指定

### 続・エラー内容

上記、手動インストール後 `terraform console` すると、なおも同じエラーが発生します。

```
terraform console

Error: Could not satisfy plugin requirements

Plugin reinitialization required. Please run "terraform init".
 
Plugins are external binaries that Terraform uses to access and manipulate
resources. The configuration provided requires plugins which can't be located,
don't satisfy the version constraints, or are otherwise incompatible.
 
Terraform automatically discovers provider requirements from your
configuration, including providers used in child modules. To see the
requirements and constraints from each module, run "terraform providers".
 
Error: provider.aws: no suitable version installed
  version requirements: "(any version)"
  versions installed: none
```

### 続・対処法

`terraform init` の `-plugin-dir` でプライグインのパスを指定するとエラーが解消されました。

```
terraform init -plugin-dir="/Users/[username]/.terraform.d/plugins/darwin_amd64"
terraform console
> 
```

# References

* [Terraform Provider がないエラー対処 - infraya.work](https://infraya.work/posts/terraform_init_error/)
* [Terraform plan for a custom provider giving "no suitable version installed" #16127](https://github.com/hashicorp/terraform/issues/16127)
Verilatorを WSL で動かしたい

Verilatorについてはこちら
https://www.veripool.org/projects/verilator/wiki/Intro

# WSLのインストール
Microsoft storeからイントール。Ubuntuを選んでみる
VScodeから使えるように設定する
1. vscodeでCntl+Shift+X
2. Remote - WSLを検索してIntallボタンをクリック
3. vscodeを再起動
4. Remote Explorer(左の赤ライン)にすでにUbuntuが登録させているので、接続する(右の赤ライン)
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564039/60734f73-4d79-5536-2f40-80f4f156c88d.png)
4.接続できていると左下にWSL:Ubuntuと表示される 
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564039/c2443ee4-c758-2612-5fd7-9d32052deee3.png)

# Verilatorのインストール

## WSLのターミナルを開く
vscodeのメニューバー→Terminal→New Terminalとしてターミナルを開く

## Verilatorのサイトの通りに実行
インストールの手順はこちら
https://www.veripool.org/projects/verilator/wiki/Installing

```shell
$ sudo apt-get install git make autoconf g++ flex bison libfl2 libfl-dev
$ git clone https://git.veripool.org/git/verilator
$ cd verilator 
$ autoconf 
$ ./configure
$ make![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564039/ef809440-b007-fffd-bea2-e52b84e6accd.png)

$ sudo make install 
```
AWS CodeBuildでBitBucketの特定ブランチからソースを読み込む方法

# CodeBuildでプロジェクトのビルド時に、特定のブランチ（自分の開発用とか）から読み込みたい

パブリックリポジトリのURLを指定するだけでは、masterブランチが読み込まれますので、プロジェクト作成時（後で編集も可）にブランチを明記する必要があります。

設定方法は意外と簡単でした。
・ソースバージョン - オプショナル
の項目にブランチ名（例："testBranch"）を追加で記述するだけで大丈夫です。

![codebuild bitbucket branch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531595/c871287c-e83b-54e3-b7ed-d02861b3fa2c.png)

他にもコミットID(ハッシュ）だけ記述しておけば、その時点でのソースを読み込むことができます。

プロジェクト作成後に読み込みソース元（送信元）を変更したい場合は
画面左側のページ一覧から
[ビルド・Build]→[ビルドプロジェクト]→(作成済みのプロジェクト) の順でクリックすると下図のように表示されるので、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531595/c74b968f-7299-6e1e-4be9-36679229f11a.png)

[編集]→[送信元]の順でクリックすれば、編集画面が表示されます。


以上です。
【ふくだ学習録】データベースエンジニア養成読本を読んで part1【1日目】

# ふくだ学習録とは？
ふくだが学習したことの備忘録。
目に見える形で残すことによってやる気を出す個人的な作戦です。
他人に見せるように書いているわけではないので、すごく読みにくいです。

# データベースエンジニア養成読本を読んで

### データベースアドミニストレーターとは？ 

データベースの保守や運用等を行う管理者のことである。「データベース管理者」や「DBA」などとも呼ばれる。
データベースアドミニストレーターの業務は、データベースの物理的な設計や構築から、実際の運用や保守を行うというものである。

### どういう時に、データベースソフトウェアが必要になるのか？
トランザクション処理が必要な時。

### トランザクション処理とは？ 
トランザクション処理を簡単に説明すると、複数の処理を１セットとして捉えて、全ての処理の順序と実行を保証するもの。
例えば、A,B,Cという3つの処理をトランザクション処理したとすると、Aだけ実行されてB,Cは実行されないなどは発生しない（発生させない）。もしそうなった場合は、Aが発生する前の状態に戻る。

他にも
- Atomicity（原子性） 
- Consistency（一貫性） 
- Isolation（独立性） 
- Durability（永続性） 
といった特徴があるため、ACIDと呼ばれることもある。

### データベースは絶対にトランザクション処理をするものなのか？
そんなことはない。最近のNoSQLやオープンソースのデータベースなどではACIDを実装していないこともある。
理由はパフォーマンスを向上させるため。

### 機能要件、非機能要件とは
めっちゃ簡単にいうと、
- 機能要件 
クライアントから提示される要件。サービスに必要な機能。（must）
- 非機能要件
クライアントから提示されているわけではないがエンジニアが実装しないといけない要件。セキュリティやパフォーマンスに関わることで、「まぁやってて当たり前だよね？」って感じの技術的な部分のことを指すことも。どこまでやるか曖昧になりがち(better)

非機能要件はRASISとも呼ばれる。
詳しくは[30秒で読める要件定義の機能要件＆非機能要件まとめ](https://qiita.com/S-T/items/793de0f6c75d60288cdb)を読めばOK。

### RAID10とは？
RAID10とは、障害対策の１方法。RAID1「ミラーリング」＋RAID0「ストライピング」を掛け合わせたもの。
データベースをミラーリング（複製）した上で、ストライピング（分散化）すること。
利点は、RAID1が全滅しない限りデータが破壊されなくなる。
欠点は、利用可能容量が総ハードディスク容量の半分になってしまう。（厳密に言えば、RAID10の欠点ではなくRAID１の欠点）

このサイトがわかりやすかった。
[WEB便利ノート](https://note.cman.jp/server/raid/raid10/)

### レプリケーションとは？
レプリケーションとは、サーバーを、同じネットワーク内、もしくは別の（例えば日本と中国などの）遠隔地に設置して、データをリアルタイムにコピーする技術。
イメージは、全くおんなじデータベースを2つ作って、一回読み書きするときに、2つとものデータベースを読み書きする感じ？

ちなみにアーカイブ、バックアップ、レプリケーションはそれぞれ意味が違うらしい。（知らんかったし、そもそも意識してなかった）このサイトがわかりやすかった。
[レプリケーションとバックアップとアーカイブの違い](https://www.wareportal.co.jp/products/cluster/backup_cluster.html)

# 今日の一言
今日から備忘録付けだしたけど、思ってたより学習スピード遅くなる！
でも備忘録として手を動かした方が、明らかに理解力上がる！
このスタイルのまま学習スピード上げていけるように頑張る！
あとコメダ珈琲の小倉トースト美味い！豆乳カフェラテも！
Nuxt.js（Vue.js）でFont AwesomeとGoogle FontsをCDNで読み込む方法

##Nuxt.js（Vue.js）でFont AwesomeとGoogle FontsをCDNで読み込む方法

Nuxt.jsでは、デフォルトの\<head>ヘッド情報はnuxt.config.jsファイルで設定することができます。
![nuxt_config.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/62273f99-0ab0-c500-9b13-60b4e67a4300.png)

Font AwesomeやGoogle FontsをCDNで読み込み際はnuxt.config.jsで読み込みます。
htmlファイルでの読み込み方とは違うので修正します。

```html:index.html
<link href="https://fonts.googleapis.com/css?family=Noto+Sans+JP&display=swap" rel="stylesheet">
<link href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" rel="stylesheet">
```
↓変更後

```javascript:nuxt.config.js
    link: [
      { rel: 'stylesheet', href: 'https://fonts.googleapis.com/css?family=Noto+Sans+JP&display=swap' },
      { rel: 'stylesheet', href: 'https://use.fontawesome.com/releases/v5.6.1/css/all.css'}
    ]
```
他にもmetaタグの設定などもnuxt.config.jsですることができます。

```javascript:nuxt.config.js
 head: {
    title: 'タイトル',
    meta: [
      { charset: 'utf-8' },
      { name: 'viewport', content: 'width=device-width, initial-scale=1' },
      { hid: 'description', name: 'description', content: 'descriptionを記述' },
    ],
    link: [
      { rel: 'stylesheet', href: 'https://fonts.googleapis.com/css?family=Noto+Sans+JP:300,400,500,700&display=swap' },
      { rel: 'stylesheet', href: 'https://use.fontawesome.com/releases/v5.6.1/css/all.css'}
    ]
  },
```
【Jupyter Notebookメモ】matplotlibで漢字表示を行う

# はじめに
Jypyter Notenook上のmatplotlibで漢字表示をするための方法メモ。  
以前は、もっとややこしい方法を使っていたが、こちらの方がシンプル。
Google Colaboratory とWatson Studioで動作確認済みです。

# コード

## ライブラリのロード
```py3
# 必要ライブラリの導入
!pip install japanize-matplotlib | tail -n 1

# 必要ライブラリのimport
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 日本語化対応
import japanize_matplotlib #日本語化matplotlib
import seaborn as sns
sns.set(font="IPAexGothic") #日本語フォント設定

# データフレーム表示用関数
from IPython.display import display
```

## サンプル表示のためボストンデータセットのロード

```py3
# ボストンデータセットのロード

from sklearn.datasets import load_boston
boston = load_boston()
df = pd.DataFrame(boston.data, columns=boston.feature_names)
df.insert(0, 'PRICE', boston.target)

# 結果確認
display(df.head())
```

## 画面表示用コードサンプル

```py3
# グラフ表示
plt.figure(figsize=(6,6))
plt.scatter(df.RM, df.PRICE)
plt.xlabel('部屋数')
plt.ylabel('価格')
plt.title('ボストンデータセットの散布図表示')
plt.show()
```

## 結果サンプル (Google Colaboratoryのもの)

![スクリーンショット 2020-01-09 8.54.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/bb6013ad-5309-8a55-a035-8191cf7b542d.png)
【初心者向け】Rubyで超簡単な本紹介アプリを作ってみる（each.with_index編）

#each.with_indexを使って、配列の要素と要素番号を取り出し、表示させる

今まで作ったアプリケーション（1~3）の続きとなります。
1.Rubyで超簡単な本紹介アプリ
https://qiita.com/pontarou194/items/79d581955757e2589b00

2.Rubyで超簡単な本紹介アプリ（カテゴリ指定ver）
https://qiita.com/pontarou194/items/37a9c63fe617e3244e19

3.Rubyで超簡単な本紹介アプリ（日時指定自動表示）
https://qiita.com/pontarou194/items/4a7db6c7d9036cd0c53e

#each.with_indexを使って表示させたい番号を指定できます。

例えば以下のような例です。

```
categorys = ["小説","ノンフィクション","ビジネス書"]
categorys.each.with_index(1) do |category, number|
```
このように指定すると、
1：小説
2：ノンフィクション
3：ビジネス書

っといったように表示。仮に、数字を2と指定すると、、、

```
categorys.each.with_index(2) do |category, number|
  puts "#{number}：#{category}"
```
下記のように2から始まります。

```
2：小説
3：ノンフィクション
4：ビジネス書
```

といった感じで、簡単なeach.with_indexの紹介でした。
要素に番号つけたいとき、便利ですよね。

これを今まで作成してきた、本紹介アプリに当て込みます。
するとこうなります。

#実際にeach.with_indexをコーディングしてみる
```
puts "本の名前を登録"
    title= gets.chomp
puts "著者を登録"
    author = gets.chomp
puts "本のカテゴリを入力してください"
categorys = ["小説","ノンフィクション","ビジネス書"]

categorys.each.with_index(1) do |category, number|
  puts "#{number}：#{category}"
  number += 1
end
  category = gets.chomp

if category == "1" then
  category = "小説"
elsif 
  category == "2" then
  category = "ノンフィクション"
elsif
  category == "3" then
  category = "ビジネス書"
else
  category = "その他"
end

require "date"
time = DateTime.now
print(time.hour,"時",time.min,"分",time.sec,"秒\n")
puts "以下の通り登録しました"
puts "本の名前は「#{title}」"
puts "著者の名前は「#{author}」"
puts "カテゴリは「#{category}」"

```

今までと少し変わった点は、

categorys.each.with_index(1) do |category, number|
の上につけていた、
number = 1
という宣言が不要になったという点くらいですね。

each.with_indexで開始したい要素番号を記載すれば、わざわざ宣言する必要もなくなりました。

最後に動作確認だけしておきます。

#動作確認

```
本の名前を登録
7つの習慣
著者を登録
コビー
本のカテゴリを入力してください
1：小説
2：ノンフィクション
3：ビジネス書
3
13時10分9秒
以下の通り登録しました
本の名前は「7つの習慣」
著者の名前は「コビー」
カテゴリは「ビジネス書」
```
上記の通りになるかと思います。

以上となります。
間違いや、こういうやり方もあるよねとか、こういうやり方のほうがセンスいいよねとかありましたら、ご指摘いただけますと幸いです。

最後までみてくれてありがとうございます。
[Rails] lambdaを使う

アクション内にサクッと追加するファンクションを定義したい時に使うっぽい。
可読性を考えると後者の方かな。

```ruby
def aaa
  a = ->(num) {
    puts num * 100
  }
  a.call(1)
end
```
or

```ruby
def aaa
  a = lambda{|num|
    puts num * 100
  }
  a.call(1)
end
```
Chromeで使えるTips（マウスパッド使用は肩が凝る原因になる）

業務効率化を図るなら、基本キーボードから手を離したくない。全部Macを想定。
キーボードの定位置から手が離れると、若干肩に負担がかかって肩こりの原因になるので、健康的にもショートカットや拡張機能の導入をした方がいい気がした。

# タブ移動系

1. 現在いるタブから隣接したタブへ移動
`option + command + [→ or ←] `

2. 一番左にあるタブにいきたいなら、command + 1でいける
`command + [1 ~ 9]`

3. タブの位置をキーボードだけで移動させる
[Rearrange Tabs](https://chrome.google.com/webstore/detail/rearrange-tabs/ccnnhhnmpoffieppjjkhdakcoejcpbga)
=> これ強い

4. 直近いたタブに戻る
[Recent Tabs](https://chrome.google.com/webstore/detail/recent-tabs/ocllfmhjhfmogablefmibmjcodggknml)
=> これも強い

# アプリケーション切り替え

1. 開いているアプリケーションをまたいで移動
`command + tab(->|)` shiftを挟むと左に進めるので、いきすぎた時に便利

2. Alfredを使用する
`oprion + space` でインプットができるバーが出てきてそこに「line」とか打つと、起動 or 移動できる。コマンド自体もカスタマイズできる
[Alfred](https://www.alfredapp.com/)

# 間違えて消したタブを復活させる
`command + shift + t`

何回もやると、かなり前のタブも復元ができる。優秀

# タブで開いているタイトルを件名にしてGmailのエディタを開く
`command + shift + i`

ウルトラ稀に使う

まだまだあるので、時間がある時に追記します。
一様分布、正規分布、指数分布、ポアソン分布の乱数を生成する方法 (Scala)

乱数を生成するサンプルコードです。一様分布の乱数から特定の分布に従う乱数を生成する方法のメモです。

サンプルコードの言語はScalaです。

# 一様分布

一様分布の乱数を生成する`Random`クラスをそのまま使います。

```scala
import scala.util.Random;

// 0からwidthまでの一様な分布の乱数
def randomUniform(width: Double, size: Int): IndexedSeq[Double] = (0 until size).map { _ =>
  width * Random.nextDouble();
}
```

# 正規分布

正規分布の乱数を一様分布の乱数から生成します。2個ずつ生成できるので、ループの回数を半分にしています。

```scala
import scala.util.Random;

// 平均mu、標準偏差sigmaの正規分布に従う乱数
def randomNormal(mu: Double, sigma: Double, size: Int): IndexedSeq[Double] = {
  val pi2 = 2 * Math.PI;
  (0 until (size + 1) / 2).flatMap { _ =>
    val rnd_a = Random.nextDouble();
    val rnd_b = Random.nextDouble();
    val rnd_a2 = Math.sqrt(-2 * Math.log(rnd_a));
    val rnd_b2 = pi2 * rnd_b;
    val random_1 = mu + sigma * rnd_a2 * Math.sin(rnd_b2);
    val random_2 = mu + sigma * rnd_a2 * Math.cos(rnd_b2);
    List(random_1, random_2);
  }.take(size);
}
```

2つの0～1の乱数から2つの正規分布の乱数を生成する式です。

```math
\begin{align}
r_1 =& \sqrt{-2\log{a}} \sin{2\pi b} \\
r_2 =& \sqrt{-2\log{a}} \cos{2\pi b} \\
\end{align}
```

1000個作ったときのヒストグラム。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/7e89ea21-8028-de21-4f59-bbe966b2e3bb.png)

※Scalaであれば、`Random.nextGaussian()`というメソッドを使えます。この記事は一様分布から他の分布を生成する方法です。

# 指数分布

指数分布の乱数を一様分布の乱数から生成します。パラメータとして`lambda`が必要です。

```scala
import scala.util.Random;

// 平均1.0/lambdaの指数分布に従う乱数
def randomExponential(lambda: Double, size: Int): IndexedSeq[Double] = {
  val lambda1 = -1.0 / lambda;
  (0 until size).map { _ =>
    val x = Random.nextDouble();
    lambda1 * Math.log(x);
  }
}
```

`lambda=1.0`で1000個作ったときのヒストグラム。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/e861bda0-5d59-9408-c9af-5b50068ace3b.png)

# ポアソン分布

ポアソン分布の乱数を一様分布の乱数から生成します。パラメータとして`lambda`が必要です。ポアソン分布の乱数は0以上の整数です。

```scala
import scala.util.Random;

// 平均lambdaのポアソン分布に従う乱数
def randomPoisson(lambda: Double, size: Int): IndexedSeq[Int] = {
  val exp_lambda1 = Math.exp(-lambda);
  (0 until size).map { _ =>
    var r: Int = 0;
    var d: Double = Random.nextDouble();
    while (d >= exp_lambda1) {
      val x = Random.nextDouble();
      d = d * x;
      r = r + 1;
    }
    r;
  }
}
```

以上。
Windows 10にQtをインストール

Windows10上でC++からQtを使えるようにする。

# ■環境
　- PC : Windows 10, 64bit, Visual Studio 2017

# ■前提条件
　以下がインストールされていること
　- Git
　- Python2.7
　- Perl
　　　参考：Windows 10にPerlを導入
　　　　　https://qiita.com/tomtum/items/ce10b30c82f0ae67d984
　- make
　　　参考：GnuWin32でインストールできます
　　　　　http://gnuwin32.sourceforge.net/packages/make.htm

# ■手順
## １．Qtのソースコードをダウンロード

```Bash:cmd
$ git clone git://code.qt.io/qt/qt5.git
```
## ２．最新のLTSのリリースバージョンでcheckout（2020/01/06時点）

```Bash:cmd
$ cd qt5
$ git checkout v5.12.6
```
※追記※ご指摘頂いたのですが、現在のソースコードの最新バージョンはv5.14.0だったようです。LTSはv5.12.6ですが、各自お求めのversionでcheckoutして下さい。version情報は下記リンクに記載されています。
【Branches - Qt Wiki】
https://wiki.qt.io/Branches
## ３．必要なサブモジュールを入手
　公式の手順通りにサブモジュールを全部取得してしまうと物凄い量になり、ビルド時にかなりのリソースを必要とする。なので今回はQt QuickとQt Multimediaのみ入手する。

```Source:cmd
$ perl init-repository --module-subset=qtbase,qtdeclarative,qtmultimedia
```
## ４．Visual Studio 2017のx64用コマンドプロンプトを起動
　スタートメニューにある「**VS 2017 用 x64 Native Tools コマンド プロンプト**」を実行する。
<img width="290" alt="menu.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226926/bb3be9cd-d7ed-34af-f00c-ac406f5193ba.png">
※本体は```C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat```です。
## ５．ビルド用ディレクトリを作成
　公式によると```qt5```ディレクトリと同じ階層に、ビルド用のディレクトリを作成した方が良いらしい。例えば、マイドキュメント直下にqt5をダウンロードした場合、ビルド用ディレクトリ```qt5_build```もマイドキュメント直下に作成する。

```Source:VS2017用x64NativeToolsコマンドプロンプト
$ cd c:\Users\<ユーザー名>\Documents
$ mkdir qt5_build
$ cd qt5_build
```
## ６．ビルドの設定
　Windowsのコマンドプロンプトだと```../```を認識しないので、```qt5\configure```までのパスを絶対パスで表記する。

```Source:VS2017用x64NativeToolsコマンドプロンプト
$ c:\Users\<ユーザー名>\Documents\qt5\configure -developer-build -opensource -nomake examples -nomake tests
```
## ７．ビルド

```Source:VS2017用x64NativeToolsコマンドプロンプト
$ nmake
```

## ８．動作チェック
**Visual Studio2017を起動し、空のC++プロジェクトを作成**
<img width="704" alt="pro.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226926/f982153d-21f3-ce5e-79b2-a907c80b146e.png">
**プロジェクトのプロパティにQtのライブラリパスを追加**
・「C/C++ > 全般 > 追加のインクルードディレクトリ」に```C:\Users\<ユーザー名>\Documents\qt5_build\qtbase\include```を追加
・「リンカー > 全般 > 追加のライブラリディレクトリ」に```C:\Users\<ユーザー名>\Documents\qt5_build\qtbase\lib```を追加
・「リンカー > 入力 > 追加の依存ファイル」に、```C:\Users\<ユーザー名>\Documents\qt5_build\qtbase\lib```にある必要なライブラリ名を追加
※末尾が```*d.lib```になっているのはDebug用のライブラリです

**dllファイルを実行ファイルと同じディレクトリに配置**
　自分の場合は```C:\Users\<ユーザー名>\Documents\Visual Studio 2017\Projects\Project1\x64\Release```に配置

**サンプルプログラムの作成**

```cpp:main.cpp
#include "QtWidgets/QApplication"
#include "QtWidgets/QPushButton"

int main(int argc, char**argv) {

	QApplication app(argc, argv);

	QPushButton button("Hello world!");
	button.show();

	return app.exec();
}
```
**実行**
以下のウィンドウが表示されればOK
<img width="97" alt="hello.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226926/d045e980-fd2c-2fa8-1da5-91f7f9c561d0.png">

# ■参考リンク
１．Building Qt 5 from Git - Getting_the_source_code
https://wiki.qt.io/Building_Qt_5_from_Git#Getting_the_source_code


２．Qt のソースコードを取得してビルドをする方法について
https://qiita.com/task_jp/items/f0753c52c86a26928465
.Net 6: C# で JSON の Read

こちらで作成した　JSON　を読みます。
[.Net Core で JSON の Create](https://qiita.com/ekzemplaro/items/5b736b3faee690c109c4)

```json:/var/tmp/json/tochigi.json
{
  "t0921": {
    "name": "宇都宮",
    "population": "74125",
    "date_mod": "2009-1-7"
  },
  "t0922": {
    "name": "小山",
    "population": "17982",
    "date_mod": "2009-5-19"
  },
  "t0923": {
    "name": "佐野",
    "population": "46819",
    "date_mod": "2009-3-28"
  },
  "t0924": {
    "name": "足利",
    "population": "65297",
    "date_mod": "2009-12-21"
  },
  "t0925": {
    "name": "日光",
    "population": "14926",
    "date_mod": "2009-11-25"
  },
  "t0926": {
    "name": "下野",
    "population": "28145",
    "date_mod": "2009-1-26"
  },
  "t0927": {
    "name": "さくら",
    "population": "56784",
    "date_mod": "2009-1-21"
  }
}
```

プログラムの作成

```bash
mkdir Read01
cd Read01
dotnet new console
```

フォルダー構造

```text
$ tree -L 1
.
├── Program.cs
├── Read01.csproj
├── file_io.cs
└── obj
```

```cs:Program.cs
﻿// --------------------------------------------------------------------
//	Program.cs
//
//							Aug/08/2022
// --------------------------------------------------------------------
using System;  
using System.IO;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;

// --------------------------------------------------------------------
namespace Read01
{
    class Program
    {
	static void Main(string[] args)
	{
	    Console.Error.WriteLine("*** start ***");

	    string file_json = args[0];
	    string str_json = file_io.file_to_str_proc (file_json);

	    Dictionary <string,Object> dict_aa = JsonSerializer.Deserialize
				      <Dictionary <string,Object>> (str_json)!;

	    foreach (KeyValuePair<string, Object> kv in dict_aa)
		{
		string json_unit = JsonSerializer.Serialize(kv.Value);
		Dictionary <string,Object> unit_aa = JsonSerializer.Deserialize
				<Dictionary <string,Object>> (json_unit)!;

		string str_out = kv.Key + "\t";
		str_out += unit_aa["name"] + "\t" + unit_aa["population"];
		str_out += "\t" + unit_aa["date_mod"];

		Console.WriteLine(str_out);
		}

	Console.Error.WriteLine("*** end ***");
	}
    }
}

// --------------------------------------------------------------------
```

file_io.cs はこちら
[.Net Core で JSON の Update](https://qiita.com/ekzemplaro/items/69a27f453900f849da6d)

コンパイル

```text
$ dotnet build
.NET 向け Microsoft (R) Build Engine バージョン 17.0.0+c9eb9dd64
Copyright (C) Microsoft Corporation.All rights reserved.

  Determining projects to restore...
  All projects are up-to-date for restore.
  Read01 -> /home/uchida/tmp/aug06/Read01/bin/Debug/net6.0/Read01.dll

ビルドに成功しました。
    0 個の警告
    0 エラー

経過時間 00:00:01.56
```

実行

```text
bin/Debug/net6.0/Read01 /var/tmp/json/tochigi.json
```

次のバージョンで確認しました。

```bash
$ dotnet --version
6.0.106
```
iPhoneをiOS13.3にアップデートしたらdyld_shared_cache_extract_dylibs failureとエラーが出て実機にアプリをインストールできなくなった

タイトルの通り、ios13.3にアップデートしてxcodeでアプリをビルドしようとしたところ、dyld_shared_cache_extract_dylibs failureというエラーが出て困った話。
![ab15a03148368c673af9c4f15ae6c8f1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296645/b5cc17e7-c408-a467-2547-17f4611ab9ae.png)

#環境
iOS 13.3
Xcode 11.3

#解決法
1.　[https://github.com/filsv/iPhoneOSDeviceSupport](https://github.com/filsv/iPhoneOSDeviceSupport) にアクセスする。

2.　ページ下部の13.3.zipをダウンロード&解凍。

<img width="1438" alt="スクリーンショット 2020-01-09 4.02.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296645/b4474df7-0b2d-1b78-00a7-03428df72667.png"
<img width="1374" alt="スクリーンショット 2020-01-09 4.03.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296645/7a49100f-1b6d-ff06-ad60-146f319eadb7.png">

3.　Xcodeを終了してから、解凍したファイルを /Users/ユーザー名/Library/Developer/Xcode/iOS DeviceSupportにコピぺ。

![2020-01-09 4.05のイメージ 2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296645/bd27bfb8-97f0-12fd-afc5-ae15f2cbaac0.jpeg)


4.　再びXcodeを起動してビルドすれば実機にアプリがインストールされた！

※使っている実機がiOS13.3では無い場合、該当のバージョンのiOS Device Supportをインストールすればうまくいくと思います。

#原因の考察
iOSをアップデートした実機をビルドする時にXcode上で自動生成されるiOS Device Supportがうまく生成されていなかったのでは？Githubから直接ダウンロードすることでうまくいった。

iOS13.3に限らず、今後iOSアップデート等でうまくいかない場合はGithubからダウンロードしてみよう。
オープンソースのオンラインTeXエディタOverleafがすごく良い。



とりあえず試してみたけど、
https://github.com/overleaf/overleaf/wiki/Quick-Start-Guide

### 感想

すごく出来が良い。
メインの環境にしたい。
俺が知らなかっただけで有名だったのかコレ

### 今の所の不満

日本語使えるようにしたり、platexを使えるようにしたり、packageを使えるようにしたりしたら完璧になりそう。

EmacsのキーバインドのCtrl-pだけ使えないのが謎。(Ctrl-b, Ctrl-n, Ctrl-fは使える。もしかしたら俺の環境が悪いのかも)

マルチウィンドウ環境では使いにくいかもしれない。[参考](https://www.overleaf.com/learn/how-to/Can_I_view_the_preview_in_a_different_browser_tab_or_window)

Gitが出来ない。(サーバーが死んだらデータも死ぬ。)

### 疑問

TeXのマルチスレッドコンパイルの設定ってどうやるの？ってか出来るの？
多コアのサーバー持ってるからそれでTeXを高速にコンパイルしたいんだけど...
だれか教えてください。

### 色々試した結果

Overleafを2日ぐらい試しました。感想を書きます。

- EmacsやVimキーバインドが使えるのでかなり良いとは思うが、自分には絶対に必要な機能が無料では使えないためにメインにするのは諦めた。
- [overleafの無料プラン](https://ja.overleaf.com/)は、複数ユーザーで編集や履歴も使えません。せめて履歴が[overleafの無料プラン](https://ja.overleaf.com/)で使えるならメインにもなったんだけど...
- Overleafは自前で立てると複数ユーザーで編集出来るし履歴で前に戻れるが、Git管理機能が使えないためにサーバーぶっ壊れたときにデータが死んでしまうのがツライ。
- また、大量のコアがある高スペックなサーバーにoverleafをインストールすれば高速コンパイル出来ると思ったんだけど、TeXのmultithreadコンパイルのやり方がわからない(もしくはできない)ので結局、VSCodeでやったほうがいいと思った。
UIViewのisHiddenをアニメーション化する


業務で少しハマったのでメモ。



## 問題点

API通信成功時のみ、View(仮に`mainView`とする)内のコンテンツを表示させたかった。
→ `mainView`の上に`emptyView`という別のViewを載せ、API通信成功後、Bをフェードアウトさせるようにしたい。


```swift
emptyView.isHidden = true
```


`isHidden`プロパティはアニメーションしないため、API通信成功後などに`emptyView`を消そうとすると、見た目上、突然`emptyView`が消滅したかのように見えてしまう。

## 解決方法

`UIView.animate`を使った実装にして、alpha値でフェードアウトするように見せた。

```swift
UIView.animate(withDuration: 0.3, animations: {
     self.emptyView.alpha = 0
}, completion:  { _ in
       self.emptyView.isHidden = true
})
```

## 参考URL

https://stackoverflow.com/questions/44198487/animating-uiview-ishidden-subviews
イメージファイルをターミナル用の色付アスキーアートに変換するWebAPIを公開しました。

*こちらのエントリは、自分のブログサイトの１エントリのコピーです。*

* [イメージファイルをターミナル用の色付アスキーアートに変換するWebAPIを公開しました。 - ゲンゾウ用ポストイット](https://genzouw.com/entry/2019/09/27/131222 )

---

<h2>はじめに</h2>

<strong>ANSI エスケープシーケンス</strong> といって、Unix系のターミナル上に色付きの文字列を出力することができます。

例えば、 <code>echo</code> コマンドでは出力したい文字列の前に <code>\e[35m</code> （数値部分は任意。）といった制御文字を出力させることでターミナルに出力される文字列に色を付けることができます。

<pre><code class="language-bash">$ echo '\e[35mHello\e[0m! \e[31mWorld\e[0m!'
Hello! World!
</code></pre>

<img src="https://docs.google.com/uc?id=1K2JPHpDOLFKHlG0c4_PsZ31vBBgIpko9" alt="" />

イメージファイルを指定して、色付アスキーアート文字列を出力できたらと思いWebAPIを作成してみました。

<h2>img2txt</h2>

### サイト

<ul>
<li><a href="https://img2txt.genzouw.com/">img2txt</a></li>
</ul>

<h3>機能</h3>

イメージファイルのURLを指定すると、Unixターミナル用の色付アスキーアートを取得できます。

<h3>WebAPIのエンドポイントURL</h3>

<ul>
<li><code>https://img2txt.genzouw.com</code></li>
</ul>

<h3>使い方</h3>

<h4>基本</h4>

<code>curl</code> コマンドを利用するのが簡単です。
<code>curl</code> コマンドでWebAPIを呼び出します。

<ul>
<li><strong>urlパラメータ</strong> ： イメージファイルのURLを指定します。</li>
</ul>

<pre><code class="language-bash"># 右記のイメージファイルURLをWebAPIに渡します → https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png 
$ curl -sS 'https://img2txt.genzouw.com?url=https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png'
</code></pre>

ターミナルに以下のようなアスキーアートが表示されるはずです。

<img src="https://docs.google.com/uc?id=1Misiy7lJKYOvnFI4i6GG4x6vmvtlpgBy" alt="" />

<h4>応用</h4>

出力内容をトリミングすることもできます。

<ul>
<li><strong>tlパラメータ</strong> ： <em>数値を指定します。</em> 左からN列を除去します。</li>
<li><strong>trパラメータ</strong> ： <em>数値を指定します。</em> 右からN列を除去します。</li>
<li><strong>ttパラメータ</strong> ： <em>数値を指定します。</em> 上からN行を除去します。</li>
<li><strong>tbパラメータ</strong> ： <em>数値を指定します。</em> 下からN行を除去します。</li>
</ul>

<pre><code class="language-bash"># 左から10列を削除
$ curl -sS 'https://img2txt.genzouw.com?url=https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png&amp;tl=10'
</code></pre>

<img src="https://docs.google.com/uc?id=1oFwCTTGZ9gOotgKsa2G7Zaw66marw4x7" alt="" />

<pre><code class="language-bash"># 上下左右10行、10列を削除
$ curl -sS 'https://img2txt.genzouw.com?url=https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png&amp;tl=10&amp;tr=10&amp;tt=10&amp;tb=10'
</code></pre>

<img src="https://docs.google.com/uc?id=1ellnvstcGR1xQ6TT-bICVi9KCQXFx4JN" alt="" />

<h2>ひとこと</h2>

感想をお待ちしております。

<strong>2020-01-09 追記</strong>

ソースコードを <a href="https://github.com/genzouw/img2txt">Github</a> で公開しました。
requestAnimationFrame  を使って一定速度で移動する物体を canvas に描画する

# やること

setInterval のかわりに requestAnimationFrame を使う場合に、物体を一定速度で動かすンプルです。特に難しいことはしてませんが、やろうとするたびに忘れるので、最小限のコードをメモっときます。

# 覚えておくべき

- 開始時刻を覚えておいて、現在時刻との差分をとって、差分から位置を計算する。
- 時刻は window.performance.now() で取得するのがよいらしい
  - そこまでシビアでなければ Date.now() でも問題なさそう。
  - new date().gettime() はブラウザによって遅いらしい? (要調査)
- requestAnimationFrame は記述の方法がいくつかある。

```sample.js
function update(){
    ...
}

(function loop(){
    update();
    window.requestAnimationFrame(loop);
}());
```

これで update() の中にループ処理を書く方法と

```sample2.js
function update()
{
    ...
    window.requestAnimationFrame(update);
}

window.requestAnimationFrame(update);
```

setInterval() のようにループ処理の最後に再度 requestAnimationFrame を呼ぶ方法がある。ループの処理が固定であれば、前者のほうが若干スマートか。

# サンプルコード

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset=utf-8>
<title>Constant Fall</title>
</head>
<body>
    <canvas id="canvas" width="640" height="480"></canvas>
    <br/>
    royalcrab@超Lチカ団 (c) 2020.

<script>
var canvas;
var ctx;
var startTime = Date.now();

var ball = {
    "x": 0,
    "y": 0
};

function init()
{
    canvas = document.getElementById("canvas");
    if ( ! canvas || ! canvas.getContext ) { return false; }
    ctx = canvas.getContext('2d');
}

function update()
{
    if ( ! canvas || ! canvas.getContext ) { return false; }
    ctx.fillStyle = "gray";
    ctx.fillRect( 0, 0, canvas.clientWidth, canvas.clientHeight );

    var currentTime = Date.now();
    var diff = currentTime - startTime;

    ctx.fillStyle = "rgb(255, 0, 0)";
    ctx.fillRect( 100, (diff % 960) / 2, 40, 20 );
}

(function loop(){
    update();
    window.requestAnimationFrame(loop);
}());

init();
</script>
</body>
</html>

```

# おためし

下記URLにコードを置きました。ブラウザで直接ためせます。
- https://royalcrab.github.io/animation_sample1.html

# 参考

- https://lealog.hateblo.jp/entry/2013/10/01/235736
- https://qiita.com/haguhoms/items/4c6f93f2aefda055ce1b
- https://liginc.co.jp/web/js/130758
【N予備校日記】Javascriptによる時間表示ゲームでハマった【2日目】

新年新しいことを初めようということで、話題のN予備校プログラミングコース頑張っていこうと思います。
ハマったポイントなど忘備録として。
#今回の要件
Javascriptを使って、以下の機能を実装する
・画面表示時、ダイアログを表示する
・ダイアログで「はい」を選択した後、時間を測り始める
・キーボードを押した時点で、「はい」を押してからの時間を画面に表示する

#困った点
ダイアログで「はい」を選択した後、キーボードを押す前に「０秒」と表示されてしまう。


```Javascript
//HTMLで表示する部分を指定
const displayArea = document.getElementById('display-area');
//関数定義部分
const startTimer = () => {
    return Date.now();
}
const stopTimer = (startTime) => {
    const currentTime = Date.now();
    const seconds = (currentTime - startTime) / 1000;
    displayArea.innerText = seconds + '秒でした。';
}
//実行部分
if(confirm('何かキーを押して下さい')){
    const startTime = startTimer();
//原因部分
    document.addEventListener('keydown',stopTimer(startTime),false);
}

```
#原因
イベントを定義する関数に「()」をつけていた。

```javascript
//原因部分
document.addEventListener('keydown',stopTimer(startTime),false);
```
関数名（）とすると「イベント時に呼ぶ関数を設定する」ではなく「その関数を実行する」と判断されてしまうことから、キーボードを押してすぐ「0秒」と表示されていた。
したがって、以下のようにするとstopTimer関数がイベント時に呼ばれるようになる。

```javascript
document.addEventListener('keydown',stopTimer,false);
```
しかし、今回はstopTimer関数に引数を渡したい。

#解決方法
「引数を取らない関数」を設定し、その中でstopTimer関数を呼び出す。

```javascript
document.addEventListener('keydown', ()=>{stopTimer(startTime)},false);
```

以下でも動くはず。

```javascript
document.addEventListener('keydown', function(){stopTimer(startTime)},false);
```

#感想
イベントに関数を設定する際、設定する関数に引数を渡そうとして同じことで悩む未来が見えます。
頭の片隅に置いておこうと思いました。
さくっとLaravel+Nginx+MySQL環境をDockerに構築するテンプレート

# TL;DR
コードだけ欲しい方は[こちら](https://github.com/sskmy1024y/Dockerfile-Template-for-Laravel)を参照。テンプレート化してあるので、そのままお使いいただけます。


# はじめに
今回の記事は、[こちらの記事](https://qiita.com/A-Kira/items/1c55ef689c0f91420e81)を参考にさせていただいた際にちょっと気になった点を修正したものを載せただけです。
仕組みとか詳しく説明いただいています。ｱﾘｶﾞﾀﾔ :pray: 

# 何が気になったのか
__インストーラがアップデートしてハッシュ値が変わると使えなくなる__という問題。
https://getcomposer.org/download/ に書かれているクイックインストールスクリプトをそのままDockerfileに記述してあるためですね。

ダウンロードページの方にも

>WARNING: Please do not redistribute the install code. It will change with every version of the installer. Instead, please link to this page or check how to install Composer programmatically.

とあるので、まあ流石によろしくはない。

# 対応策

公式が用意してくれています。
https://getcomposer.org/doc/faqs/how-to-install-composer-programmatically.md

これをdocker build時に実行するだけ。

```text:ディレクトリ構造
\project
├ app/<Laravel Project>
├ php
│　├ Dockerfile
│　├ composer-init.sh
│　└ php.ini
├ nginx
│  └ default.conf
└ docker-compose.yml
```


```dockerfile:Dokcerfile
FROM php:7.2-fpm

RUN apt-get update \
  && apt-get install -y wget zlib1g-dev mariadb-client \
  && docker-php-ext-install zip pdo_mysql

COPY php.ini /usr/local/etc/php/
COPY composer-init.sh ./

#Composer install
RUN chmod -R 755 ./composer-init.sh
RUN ./composer-init.sh
RUN mv composer.phar /usr/local/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1

ENV COMPOSER_HOME /composer

ENV PATH $PATH:/composer/vendor/bin

WORKDIR /var/www

RUN composer global require "laravel/installer"
```

シェルスクリプト内でwgetしているので、apt-getでインストールしています。

あとはmysqlのパスワードやらなんやらを`.env`に切り出した程度で、ほとんど元の記事を参考にさせていただいています :pray: 

# 課題(?)
本来Dockerはいつでもどこでも同じ環境を構築するべきなので、composer自体のバージョン管理とかも必要だと思いますが、一旦そこは目を瞑りました;;
正確にバージョン指定したい方は、下のような感じでハッシュを指定して直接持ってきてインストールしましょう。

```sh
wget https://raw.githubusercontent.com/composer/getcomposer.org/76a7060ccb93902cd7576b67264ad91c8a2700e2/web/installer -O - -q | php -- --quiet
```

# おわり
本題と関係ないんですけど、githubの`template`って便利ですよね。
新しいプロダクト作ろうとしたときのイニシャルコストを最小限に抑えられるので、普段使いしそうなフレームワークは大体テンプレート化しています。

（といっても、自分の周りで使っている方を見かけない……）
エンジニア転職についてまとめてみた【厳選９記事】

前置き

※当方、転職活動中です。※
自分の中で今後の対策を練る意味も込めてアウトプットしてみることにしました。
主に未経験からのエンジニア転職向けの内容ですが、それ以外の内容も込みです。

#面接の準備系
以下の記事が大変参考になりました。感謝！

面接で聞かれたこと(未経験からエンジニアを目指す方へ)
https://qiita.com/tomokichi_ruby/items/a2ddd60a9eaec433749f
転職活動の際に使える質問チートシート
https://qiita.com/yu-croco/items/6eea633d0874628133b9
エンジニアを面接するときに面接官が本当に知りたいこと
https://qiita.com/newta/items/63a06516521998ddd9f0
技術者の一次面接で聞いていること
https://qiita.com/tetsunosukeito/items/f890b74ed3b24230db44

**これらの記事の超個人的な感想**
採用担当者の知りたいことはだいたい以下の５パターンに大きく分けられそう。

①熱意や情熱
②企業への理解度
③キャリアビジョン
④自走力
⑤性格

上から順に掘り下げていく
**①熱意や情熱**
他人の役に立ちたいとか世の中を変えたいとか青臭いことかもしれないけど、そう思うんならそう言った方がいい。
自分がエンジニアに憧れた原体験があるはずだから、それを直截に自分の言葉で語れればおk。
逆に無理に大人ぶって業界の将来性とかITの進化とか語りだすと、「いやおまえ自身の気持ちが知りたいんだよ俺は」ってなるので採用担当者とのキャッチボールが上手くいかない。

**②企業への理解度**
業界に対する熱意が伝えられてはじめて、「じゃあそれをウチでどう実現していくの？」という話になってくる。順番、間違えないように注意。
先に述べた熱意と事業内容がどうマッチングしているかというのを示しつつ、受ける企業の事業内容について30秒以内で簡潔にまとられるようにしておくのがベスト。

**③キャリアビジョン**
ぼんやりとしたイメージだけでエンジニアを目指しているんじゃなくて、ちゃんとそれに伴う困難やハードルの高さも見越して、それでもこうなりたいっていう確固たるビジョンがあるかどうか。
最初の項目とも被るが、大事なのは具体的な「計画」、それを実行に移す「覚悟」。
逆に「こいつ雰囲気だけでエンジニア目指してんなー」とか「こいつエンジニア舐めてんなー」と思わせたら完全にあかんやーつになる。

**④自走力**
これについては、ポートフォリオ作る過程で困難だった点などポートフォリオの深堀りを通じて問われることが多い。また、【実際に目の前でコーディングをする試験を課す形】、【「普段どうやって学習しているか？」という質問で来る形】もある。
あくまで知りたいのは「成果」そのものではなく、その過程であり、自分で問題を解決する力があるかどうかな気がする。これ用の対策というものは特になくて、プログラミングを頑張っていれば自然に身についてくものかと思う。

**⑤性格**
いわゆる「ウチに馴染むかどうか」。
多様性という言葉もあるがしかし、性格的に合わなくて早々に辞めてもらっては困るという方が勝る。
ここで落とされるなら仕方ないかそれもまた運命というやつか。。。


#採用担当者の視点系
以下は採用側からの視点で書かれた良記事です。

「採用手伝って！来週から！」と言われたエンジニアのやるべき準備を総まとめ
https://qiita.com/virtual_techX/items/94290ca8ff48fa8ebdc2
年間300名ぐらい選考をしている面接官が思うエンジニアが転職して給料を上げる秘訣、5選
https://qiita.com/ryoutaku/items/3749b957f2f41545ad09

**これらの記事の超個人的な感想**
1つ目の記事の
・なぜ自社に入社したのか
・なぜ自社で働き続けているのか
という項目についてはぜひ逆質問してみたい。企業の文化が見えそう。
2つ目の記事については、
「企業ホームページのエントリーフォームから申し込む」という部分で、採用は糞ほどお金がかかるということを認識しておきたい。
ちなみに直接採用には関わらなかったが前職で人事部に所属しており、採用担当部門の方がヒーヒー言っているのを日々見ていた。
採用は華やかに映るかもしれないが、「採用コスト下げろ、だが良い人材をもっととれ」という無理難題をこなさなくちゃならないお仕事なのだ。
つまり、受ける側も本気なら採る側もまた本気だということ。

#転職ブログ系
化学系研究者が完全未経験からWeb系自社開発企業に転職するまで
https://qiita.com/fuku_tech/items/b8db09720c6d38eb27b9
未経験からエンジニアとして働くようになるまでにやったこと、思ったこと
https://qiita.com/suy0n9/items/d1bfbd823d8b6dc562be
【未経験から転職】「28歳+空白期間1年+高卒+プログラミング経験なし」が、自社開発の企業からスカウト頂いてエンジニア転職する４ヶ月間の体験談
https://qiita.com/nbfujiwara/items/08063c37aaee1da337d6

**これらの記事の超個人的な感想**
時々読み返すとモチベーションになります。


2020/02/02　追記
もくもく会で得た情報
エンジニア採用担当者の声
2017頃からプログラミングスクールの喧伝等により、未経験者の応募はかなり増加中。
「他の志望者とどう差別化を図るか？」という戦略が問われる。
ポートフォリオがあるのはもちろんのこと、
Qiitaへの定期投稿や、競プロ(paiza,AtCoder)などをやっていくのも1つの作戦かと思う。

ーーーーーーーーー
以上です！
同じように転職目指している方のご参考になれば幸いです。
データサイエンティスト育成講座　Chapter3　3日目

なかなか時間が取れないけれど、少しずつでも進めていく。

昨日までで、相関近くまで行った。そう、ピアソンだ

### Pearsonr

> sp.stats.pearsonr(student_data_math.G1,student_data_math.G3)
> (0.8014679320174141, 9.001430312276602e-90)

結果として、出てくる0.801という値が１に近づけば近づくほど、２変数間の相関が強いということになる。

まて、２番目の9.001はどうしたんだ...というわけでリファレンスをチェックだ

> Returns
> r : float
>    Pearson's correlation coefficient
> p-value : float
>     2-tailed p-value
>
The p-value roughly indicates the probability of an uncorrelated system producing datasets that have a Pearson correlation at least as extreme as the one computed from these datasets.

> [scipy.stats.pearsonr](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.pearsonr.html)

うーん、よくわからんので、日本語に頼ってみる

> [Python: SciPy で特徴量の相関を調べる](https://blog.amedama.jp/entry/2015/09/28/213745)

こちらを参照させていただくと、p値は優位確率というらしいので、さらに調べる

> [優位確率](https://www.dynacom.co.jp/product_service/packages/snpalyze/sa_t2_p-value.html)
統計的仮説検定において、帰無仮説を棄却し 対立仮説を採択する時の基準です。
有意水準とも言います。一般的に5%、1%が使用されます。

うん。本当に日本語か？と思うくらい意味不明だが、ようするに優位確率が5%に満たない場合は、得られた相関係数は偶然の産物であって信用ならんということなんだろう。
理解が正しい自信は全くないのだが。

ただし、pearsonrが有効なのはあくまで線形の相関があるときに限るので、相関が非線形の場合には役に立たないのが注意点。
必ずしもpearsonrでやれば良いというわけではないのだ。
おそらく、それに関しては今後のChapterでも出てくるんだろう。

### PairPlot

構文としては下記の通り

> seaborn.pairplot( DataFrame )
![JupyterLab.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/903a1bcc-d44e-dc9a-ef4b-8abce984a39c.jpeg)

これで、DataFrame中の数値要素間の相関をグラフィカルな形で表示してくれる
上記の例では、DataFrame中の４要素に関して表示している

軸が交わる箇所にはヒストグラフが表示され、それ以外は２変数間の散布図が表示され相関をみることができる。

試しに例題にあったDataFrameを加工せずにpairPlotしてみるとこうなった

![JupyterLab-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/aa2ebddb-503d-4d3d-2e2b-da6b9509e10a.jpeg)

大きすぎてキャプチャがまともにできなかった。
ちなみに、表示された図をファイルに保存するのはこれでいけた

> plot = sns.pairplot( DataFrame )
> plot.savefig("output.png")

やり方を調べると、 `get_figure()`を呼び出してから`savefig`というのも引っかかったが、バージョンが古い頃の手法のようで、現在はエラーになった。

### 単回帰分析
詳しくは以降のChapterでやるそうなので、言葉の意味をしっかりと理解したいところ。

目的変数：求めたい数値、変数
説明変数：目的変数を得るための変数。説明するために用いる変数

単回帰分析は、この目的変数／説明変数の関係性が１変数のみで成り立つ式を仮定して解くというものらしい。

これらを進めていくには、sklearnを使っていくことになる。

ざっくりと見通したが、総合問題はまた、明日にしよう。
うーん、進みが遅いけれどしょうがない。
本日の学習

<h1>eachメソッドについて</h1>
eachメソッドを使用することで
{}で作成した文章を分けて表示出来るようになります。

例えば、、、
{}
{}

上記のように２つの{}を作成した場合には
二つの文に分けて表示されることがわかった。

今回の説明はざっくりとしすぎており、
わかりにくので後日改めて復習をしていきたい。✏️
Docker × Angular環境簡単構築

# Docker × Angular環境簡単構築

## 概要
Dockerを利用して、Angularの実行環境を簡単に作成していきます。

## 環境
- macOS Catalina 10.15.1
- Docker version 19.03.5
- docker-compose version 1.24.1

## 構成
今回は以下のような構成になります。

```bash
.
├── docker
│   └── node
│       └── Dockerfile
├── docker-compose.yml
└── server
    └── angular-app
```

## 構築
### 1. docker-compose.yml作成
今回はシンプルにangularの実行環境を用意することが目的なため、コンテナはnodeのみでOK!

```docker-compose.yml
version: '3'

services:
  node:
    build: ./docker/node
    ports:
      - "4200:4200"
    volumes:
      - "./server:/projects"
    tty: true
```

### 2. Dockerfile作成
nodeイメージの最新を取得し、npmを利用してangularをインストールします。

```Dockerfile
FROM node

WORKDIR /projects

RUN npm install @angular-devkit/build-angular
RUN npm install -g @angular/cli

EXPOSE 4200
```

### 3. dockerの起動&ビルド
```bash
// ビルド&バックグラウンドで起動
$ docker-compose up -d

// 確認
$ docker-compose ps
# 以下のようになっていればOK!
     Name                 Command            State           Ports         
---------------------------------------------------------------------------
angular_node_1   docker-entrypoint.sh node   Up      0.0.0.0:4200->4200/tcp

```

### 4. Angularアプリの作成 or 引き継ぐ場合
`ng new {プロジェクト名}`をコンテナ内で実行！

```bash
// コンテナにインスペクション
$ docker-compose exec node bash

// コンテナ内でAngularアプリ作成
root@8dfd8ec7933f:/projects# ng new angular-app

// 引き継ぐ場合(gitで共有された場合など)
root@8dfd8ec7933f:/projects# npm install
```

### 5. Angularアプリを起動
コンテナ内でAngularアプリを起動します。

```
// 作成したAngularアプリ直下に移動
root@8dfd8ec7933f:/projects# cd /projects/angular-app

// Angularアプリの起動
root@8dfd8ec7933f:/projects/angular-app# ng serve --host 0.0.0.0
```

※ package.jsonがないディレクトリでアプリ起動コマンドを実行すると以下のエラーが出ます。
`The serve command requires to be run in an Angular project, but a project definition could not be found.
`

## 確認
下記のURLにアクセスしてみましょう！
http://localhost:4200/
以下の画像のような画面が表示されたら成功です。


<img width="1347" alt="スクリーンショット 2020-01-08 10.29.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290840/f74a8875-4c66-ad80-f7f5-bd5e5367e45b.png">

## 参考
- [Docker for MacでAngular8の実行環境を構築](https://dev.classmethod.jp/ria/angular-js/docker-angular8/)
- [The serve command requires to be run in an Angular project, but a project definition could not be found.](https://confrage.jp/the-serve-command-requires-to-be-run-in-an-angular-project-but-a-project-definition-could-not-be-found/)
PHPでCSVダウンロード

# PHPでCSVダウンロード
PHPでCSVダウンロードする際のモジュール

## UTF-8で出力する場合
```php
function export($file_name, $data)
{
    $fp = fopen('php://output', 'w');
    
    foreach ($data as $row) {
        fputcsv($fp, $row, ',', '"');
    }
    fclose($fp);
    header('Content-Type: application/octet-stream');
    header("Content-Disposition: attachment; filename={$file_name}");
    header('Content-Transfer-Encoding: binary');
    exit;
}
```

## SJIS-winで出力する場合
```php
function export($file_name, $data)
{
    $fp = fopen('php://output', 'w');
    
    // UTF-8からSJIS-winへ変換するフィルター
    stream_filter_append($fp, 'convert.iconv.UTF-8/CP932//TRANSLIT', STREAM_FILTER_WRITE);
    
    foreach ($data as $row) {
        fputcsv($fp, $row, ',', '"');
    }
    fclose($fp);
    header('Content-Type: application/octet-stream');
    header("Content-Disposition: attachment; filename={$file_name}");
    header('Content-Transfer-Encoding: binary');
    exit;
}
```
Xcode11で導入された$(MARKETING_VERSION)をXcodeGenで設定する

# 起きた現象

Xcode11からInfo.plistの`Bundle versions string, short`という項目がバージョン直書きではなく`$(MARKETING_VERSION)`という項目を参照するようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56178/22282879-73a9-e9eb-2f30-b911edffb781.png)

この値はプロジェクトファイル(.xcodeproj)に保存されているらしく、何も設定せずにXcodeGenを実行すると消えてしまっていた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56178/ae07b1d7-bf65-ce07-c4bc-85a55a26de57.png)


## 結論

変数としてproject.ymlに設定する。

```yml
settings:
  MARKETING_VERSION: 1.2.0 # 追加する
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56178/37658ac5-6e33-7ab8-a463-8e68a231c660.png)

## 詳細

https://github.com/TakkuMattsu/XcodeGenExample にサンプルを作成しました。

現状のmasterの状態で`mint run yonaskolb/xcodegen@2.11.0`を実行するとVersionの部分が空になるかと思います。

[プルリク](https://github.com/TakkuMattsu/XcodeGenExample/pull/1/files)にあるように修正するとVersionが設定されるようになります。
初心者がソフトウェアテストについて学んだこと（ホワイトボックス、ブラックボックス等）

プログラミングを学習し始めて間もない初学者がソフトウェアテストについて学んだことをいかに記述しています。

以下の書籍で学習した内容のまとめです。(１〜３章まで)
高橋寿一『知識ゼロから学ぶソフトウェアテスト』翔泳社
 https://www.amazon.co.jp/dp/B00HQ7S5CA/ref=cm_sw_em_r_mt_dp_U_LgFfEbBB2SVR7


テストケースは膨大なので、完全なテストは存在しない
テストは限られた時間内でもすべての機能をテストしなくては行けないので、どの手法を用いるべきか常に考えるべき



#ホワイトボックステスト
  全てのソフトウェアテストの基礎となる手法。
  プログラムの論理構造が正しいかテストする。ソフトウェアの使用が間違っていて発生するバグは発見できない。

###制御パステスト法
　制御パスは命令と条件分岐の組み合わせのこと。
　制御パスの総数はとても多いので、以下の手法を用いて、網羅する基準にしたがって実施する。

####■ステートメントカバレッジ手法
　　カバレッジ(カバー(網羅)してる範囲、テストが終わった範囲)
　　ステートメント(命令文)
　　命令文をテストする手法で、条件分岐でのバグは発見できない、非常に弱いテスト手法

####■ブランチカバレッジ手法
　　分岐コードに対して、判定がTRUE、FALSEの結果を少なくとも１回ずつ持つようにテストケースを書く手法
　　網羅するという点では優れているが、テストケースの数が増えるのが難点

####■カバレッジ基準
　　一般の商用ソフトウェアなら60%〜90%で十分だが、人命に関わるソフトウェアなら100%、つまりソフトウェアによる。

####■テスト駆動開発（TDD/Test-Driven Development）
　　①赤：小さい動作しないテストを書く
　　②緑：そのテストを通すコードを書く
　　③リファクタリング：コードをきれいにする

　　TDDで開発するとテストを書く時間がないとか言うことにならない。


#ブラックボックステスト
　プログラムを1種のブラックボックスに見立てて、ソースコードを見ずに様々な入力を行ってテストする手法
　・ソフトウェアの4つの振る舞い
　　●入力を処理する
　　●出力を処理する
　　●計算を行う
　　●データを保存する
　　この4つの動きしかしないので、この4つの振る舞いをテストすれば良い。

###★同値分割法・境界分析法(ブラックボックステストの基本)
　4つの振る舞いのうち、入力処理と出力処理をソフトウェアが正しく処理しているかテストする。
　ユーザーからの入力だけでなく、ネットワーク経由のデータの受信など様々な入力も含む

####■同値分割法
　入力領域を同値クラスと言う部分集合に分割して、その部分集合に含まれる値を等価とみなす作業
　例：
　　　入力A：1〜5まで入力可
　　　入力B：1〜5まで入力可
　　　出力C：A　✕　B


　　６ ＿＿ ＿＿ ＿＿ ＿＿ ＿＿　　　　    　
　　５|　　　　　    　　　　　|
　　４|　　　　　    　　　　　|
　　３|　　   　有効同値 　　　|　  無効同値
　　２|　　　　　    　　　　　|　　　　
　　１|＿＿ ＿＿ ＿＿ ＿＿ ＿＿| 　　　　    　
　　０ 　１ 　２ 　３　 ４ 　５ 　６  　　 　　  

|【有効同値のテストケース】<br>A＝３、B＝４|
|:-:|
|**【無効同値のテストケース】<br>A＝ 6、B＝ 6<br>A＝ 6、B＝ 6<br>A＝-1、B＝-1<br>A＝ 0、B＝ 0**|

`⭐０は特別な数値でバグになりやすいので必ずテストする`


　
####■境界値分析法
　　「境界」(無効同値と有効同値の間、有効同値と有効同値の間)
　　プログラム上、境界には必ず条件分が必要で、その条件分の間違いを境界分析法でチェックする。

　　●包括関係バグ
　　　>　と　>=　の間違い
　
　　●On-Offポイント法
　　　境界値のバグを見つけるために、境界のどの値をチェックするか考える手法

||有効同値|無効同値|境界値|
|:-:|:-:|:-:|:-:|
|入力A|１から５|０以下６以上|0,1,5,6|
|入力B|１から５|０以下６以上|0,1,5,6|

　　　【テストケース】
　　　　●０　`０は特別な数値でバグになりやすいので必ずテストする`
　　　　●１　有効な値の下限
　　　　●３　有効な値の真ん中
　　　　●５　有効な値の上限
　　　　●６　無効な値の下限

####■ディシジョンテーブルテスト
　　すべての入力の組み合わせを表にして、その入力に対する動作、出力を明記する。
　　多数の入力処理に対して、多数の出力処理をテストするというような手法。

####■状態遷移テスト
　　状態(state)、遷移(transition)
　　状態遷移マトリックスという表をさくせいして、ソフトウェアがその項目道理動作しているかチェックする手法
　　期待していない状態に遷移するバグ、ある状態からある状態に遷移できないバグが発見できる。
　　※状態の数が多いと、モデルが複雑すぎて、モデリングに時間がかかるしテスト項目も多すぎるという問題点がある
　　　
####■ランダムテスト
　　何ら考えもなしに入力や操作を行う手法。
　　（アドホックテスト、アドリブテスト、モンキーテストなどとも呼ばれる）
　　
###★ブラックボックステストまとめ
　　●入力ダイアログボクスがあれば「境界値テスト」を行う※まず行う
　　●復数の入力ダイアログボクスがあれば「デシジョンテーブルテスト」を行う
　　●ダイアログボックスの遷移があれば「状態遷移テスト」を行う
Vuetifyで画面サイズに応じて要素を非表示にする

Vuetifyを使用していて、画面サイズに応じて要素の表示を切り替える場合は、
`hidden-{breakpoint}-{condition}`というclassを記述します。

`breakpoint`は、以下のように画面サイズを定義します。

|記述|画面サイズ|
|:---|:---|
|xs|600px以下|
|sm|600以上 960px以下|
|md|960px以上 1264px以下|
|lg|1264以上 1904px以下|
|xl|1904以上|

`condition`は、以下のように条件を定義します。

|記述|条件|
|:---|:---|
|only|指定した画面サイズでのみ非表示|
|and-down|指定した画面サイズ以下で非表示|
|and-up|指定した画面サイズ以上で非表示|


例えば、md以下のサイズで非表示としたい場合は、以下のように記述します。

```html
<div class="hidden-md-and-down">
  hogehoge
</div>
```


以下の公式のドキュメントに詳しく載っています。
[CSS Display helpers — Vuetify.js](https://vuetifyjs.com/ja/styles/display)
GitHubにpushしてしまったコミットメッセージを変更する方法

私事ですが、個人開発をしていたところコミットメッセージをミスってpushしてしまったので何か解決方法はないかと思い調べてみました。

下記の記事のようにpushを取り消して、コミットメッセージを修正して再度pushすると言う手もあるかと思います。
[【Git】間違ってpushした場合の取り消し方](https://qiita.com/kazu56/items/ce6eafa67a09463e6064)

しかし今回は、ミスってpushしたものを上書いてpushしようかと思います。

つまり、流れは「コミットメッセージを変更」→「GitHubへpush」と言う感じです。
めっちゃシンプルですね。
## 流れ
### 1. コミットメッセージを変更する

```shell
$ git commit --amend　-m "コミットメッセージを修正"
```
（$は不要です。）

###2.保存したらコミットメッセージが変更できたことを```git log```で確認

```shell
$ git log
# commit 1d5e7462e4d23dbe62e4eaac483012a97dd829e0
# Author: taro <taro@mail.com>
# Date:   Wed Jan 8 18:43:10 2020 +0900
#
#    コミットメッセージを修正
```
ちなみに`git log -1`で直前１件のログが確認できます。
(詳しくは「git log オプション」などで検索してみてください。)

###3.GitHubへpushを行う

```shell
$ git push --force-with-lease リポジトリ名 ブランチ名
# 例) git push --force-with-lease origin master
```
[git push -f をやめて --force-with-lease を使おう](https://qiita.com/wMETAw/items/5f47dcc7cf57af8e449f)
フォースプッシュはリポジトリの履歴に上書きされる為、共同開発する際は問題が起きる可能性があるので注意が必要かと思われます。

###4.Githubで確認
最後にGithubで変更されたことを確認してみてください。
ミスってpushした部分のコミットメッセージが変わっていれば成功です！

以上、何かご指摘があればよろしくお願いします！
[Ruby]パッケージ管理について

# Rubyのパッケージ管理について
## gemとは
決まったフォーマットのRubyライブラリのこと。
「gem install ○○」でいうところの、○○の部分がgem。

## Rubygemsとは
gem専用のパッケージ管理システム。
ライブラリであるgemを管理するものだが、パッケージ管理システムと呼んでいる。
ライブラリ≒パッケージらしい。
gem installのコマンドでライブラリをインストールしてくれるのはこいつ。
こいつのことをgemと言ったりする人がいるのでややこしい。

## Bundlerとは
プロジェクトごとにgemを管理したりするやつ。
「Gemfile」と「Gemfile.lock」と呼ばれるファイルを利用する。
各gemのバージョンなどによる依存関係をまるっと管理してくれる。
Bundler自身もgemの一つ。

## 参考
[ライブラリ? gem? bundler? -- Rubyのgem管理に関するあれこれまとめ](https://qiita.com/3no3_tw/items/8c1e3e95c75edae1036d)
[Ruby ライブラリ](https://www.ruby-lang.org/ja/libraries/)
Pandasを用いたクロス集計

Pandasを用いて実行したいこと。
・GROUPBY KEYを複数キーで実行。
・SELECT対象のカラムを限定する。

```
import pandas as pd
df = pd.DataFrame({
    'city': ['osaka', 'osaka', 'osaka', 'osaka', 'tokyo', 'tokyo', 'tokyo'],
    'food': ['apple', 'orange', 'banana', 'banana', 'apple', 'apple', 'banana'],
    'price': [100, 200, 250, 300, 150, 200, 400],
    'quantity': [1, 2, 3, 4, 5, 6, 7]
})
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/6537b457-872c-8697-11e8-95e6a8e7e4d4.png)

```
df[["price","city","food"]].groupby(["city","food"]).sum()
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/2c9d6705-8fb2-16a9-eb49-e575688795cc.png)