OmniAICreator/Qiita-1.07M huggingface dataset:
[統計学]t-分布、大数の法則、中心極限定理

# はじめに
　統計調査をするとき、全数調査ができないときには母集団から標本を抽出して母集団についての推測を行います。推測統計では、母集団になんらかの確率モデルを想定し、抽出したデータをその確率分布に従う確率変数と捉えます。

　用語が多いので、説明はすべて統計WEBの用語集にとぶようにしています。 
# 母集団が正規分布に従うとき
　見出しの通り母集団が正規分布に従うときには、[統計量](https://bellcurve.jp/statistics/glossary/12797.html)の分布として$t$-分布、$F$-分布、カイ二乗分布があります。ここでは、$t$-分布に触れます。

## t-分布
$ $　
　$t$-分布は、$t$値を$$T=\frac{\overline x -\mu}{\sqrt{\frac{V^2}{n}}}\tag{1}$$と表し、[不偏分散](https://bellcurve.jp/statistics/glossary/1051.html)$V^2$を使って主に[母平均](https://bellcurve.jp/statistics/glossary/776.html)の[区間推定](https://bellcurve.jp/statistics/glossary/930.html)を行う場合に使います。式(1)は、自由度$(n-1)$の$t$-分布に従います。この事実だけでもいいといえばいいのですが、なにか物足りないのでもう少し説明します。
　$t$-分布は、母集団が正規分布に従うとしたときの標本分布ですので正規分布との関係をみてみます。確率変数$$Z=\frac{\overline x -\mu}{\sqrt{\frac{\sigma^2}{n}}}\tag{2}$$は、標準正規分布$\mathcal N(0,1)$に従います。式(1)の不偏分散を母分散に変えたものですね。$E[Z]=0,V(Z)=1$になることは$\Sigma$記号を用いた定義と分散の性質から確認できます。また$$U=\frac{(n-1)V^2}{\sigma^2}$$とすると、$U$は自由度$(n-1)$のカイ二乗分布に従います（証明は省略）。このとき、式(1)は$$T=\frac{\sqrt{n}(\overline X -\mu)}{V}=\frac{Z}{\sqrt{\frac{U}{n-1}}}$$と書けて、$m=n-1$として$$T=\frac{\sqrt{n}(\overline X -\mu)}{V}=\frac{Z}{\sqrt{\frac{U}{m}}}$$と表せます。このときの$T$を自由度$m$のスチューデントの$t$-分布に従うといいます。確率変数$T$の確率密度関数$f_T(t|m)$はガンマ関数を用いて表すことができて、$m=1$でコーシー分布となり、$m\to \infty$の極限で標準正規分布に収束します。ガンマ関数が関わってくるのは、カイ二乗分布$$f_X(x)=\frac{1}{\Gamma(n/2)}\left(\frac{1}{2}\right)^{\frac{n}{2}}x^{\frac{n}{2}-1}\exp\left(-\frac{x}{2}\right)$$があるためです。

# 母集団が正規分布に従わないとき
　母集団が正規分布に従わないときは正確な分布を導くことは難しいため、[サンプルサイズ](https://bellcurve.jp/statistics/glossary/1876.html)$n$が大きいときの近似的な分布を考えます。そのときに役に立つのが大数の法則と中心極限定理です。

## 大数の法則
$ $
　一言でいうと、「サンプルサイズが大きくなるにつれて標本平均$\overline X$は母平均$\mu$に近づく」というものです。これは、任意の$\epsilon>0$に対して$ n \to \infty $とすると$P(|\overline X-\mu|\ge \epsilon)\to 0  $となる、と表すことができます。標本平均と母平均との差が任意の$\epsilon$より大きくなる確率は０に近づく（差がなくなっていく）ということです。なお、$\lim_{n \to \infty} P(|U_n-U|\ge\epsilon)=0$となることを「確率変数$U_1,U_2,...$が確率変数$U$に確率収束する」といいます。大数の法則はチェビシェフの不等式$$P(|X-\mu|\ge k)\le\frac{\sigma^2}{k^2}$$から証明できます。$X$を平均$\overline X$にして、$n$が分母に来るように式変形してみてください。ただし、$\mu=E[X],\sigma^2=V(X)$が存在すると仮定しています。

## 中心極限定理
$ $　
　確率収束とは違い、確率変数$U_1,U_2,...$が確率変数$U$に**分布収束**するとは$\lim_{n \to \infty} P(U_n\leq x)=P(U\le x)=F_U(x)$が、$F_U(x)$という確率分布の連続点で成り立つことを言います。分布収束の代表例が中心極限定理で、一言でいうと「サンプルサイズ$n$が大きくなるにつれて標本平均$\overline X$の分布は正規分布に近づく」ことです。
定理は次のように表せます：$$\lim_{n\to \infty}P(\overline X\le x)=\int_{-\infty}^x\frac{1}{\sqrt{2\pi \sigma^2}} \exp \left(-\frac{(y - \mu)^2}
{2\sigma^2} \right)dy=\Phi(x) \tag{3}$$
$\Phi(x)$は正規分布$N(\mu,\frac{\sigma^2}{n})$の累積分布関数です。$\overline X$を標準化して$\overline Z=\frac{\sqrt{n}(\overline X - \mu)}{\sigma}$とした場合は、標準正規分布$N(0,1)$の累積分布関数に近づきます。標本平均と母平均の誤差が０に近づくと読み取れます。サンプルサイズ$n$の分散は分母に$n$があるので、$n$が大きいほど正規分布の幅が小さくなる（ばらつきが小さくなる）ことが分かります。

#参考文献
「現代数理統計学の基礎」久保川達也氏著
Node-REDとラズパイで温度・湿度・気圧を測定する（BME280）

#はじめに
Node-RED で BME280 を使っている記事が見当たらなかったので、今回つまづいたところを踏まえながらメモをかねて、実装の説明をする。
#BME280
**気温・湿度・気圧** の3つのセンシングをたった1つでできる優れもの。
※秋月電子で販売されているものと、amazonで販売されているもの、そのほかのルートで販売されているものでは、センサーはBME280でも、使っているボードが違うため、データシート（取り扱い説明書）を読んで、配線を行うこと。
#実装（BME280編）
今回、使っているBME280はamazonで購入した（amazonではBMP280が届くことがあるらしいので注意）ものである。
今回のボードは以下のようなもで、
![BME280(amazon).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518214/142c4ff7-0644-70cf-93ad-4d28fd3b33b0.png)
それぞれのピンに配線を行っていく。ピンの配線は以下の通りである。

|BME280|raspberry pi (4)|
|:-:|:-:|
|VCC|+3.3V [1番] |
|GND|GND [9番か6番がおすすめ]|
|SCL|GPIO 2 [5番]|
|SDA|GPIO 3 [3番]|
|CSB| 未接続 |
|SDO| GND か +3.3V|
※SDOに関しては、LOW（GND）でI2Cアドレスが0x76となり、HIGH(+3.3V)でI2Cアドレスが0x77となるので、注意すること。
配線をはんだ付けする場合は、GNDを9番にすることで、横1列５個のメスピンで安定した配線ができるので、おすすめです。

#実装（ラズベリーパイ編）
OSは最新のRaspbianをインストールしてください。
##I2Cの設定
[こちら](https://qiita.com/hawk777/items/2b910a81df480268e07e)を参照してI2Cの有効化を行ってください。詳しく見た方が良いですが、設定をまとめると以下のようになります。（ターミナルで実行）

```
sudo apt update
sudo apt -y upgrade    (必要に応じて)
sudo apt install -y i2c-tools
```
raspi-configからのI2Cの有効化

```
sudo raspi-config
```

【Interfacing Options】→【I2C】→【はい】→【了解】→【Finish】→【再起動】

```
sudo reboot
```
再起動後にI2Cアドレスの確認
以下のコマンドを実行後、 0x76 か 0x77 （設定した方）が確認できればOK

```
sudo i2cdetect -y 1
```
##Node-REDの設定
[Node-Red User Group Japan](https://nodered.jp/docs/getting-started/raspberrypi)を参照してNode-Redをインストールして、ローカルで実行してください。詳しく見た方が良いですが、設定をまとめると以下のようになります。（ターミナルで実行）

```インストール.
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
```

```実行.
node-red-pi --max-old-space-size=256
```
http://＜XXXXX＞:1880というアドレスが表示されるので、そのアドレスをブラウザで開いてください。
フローエディタが表示されたら、以下のように移動
【≡】→【パレット管理】→【ノードを追加】→【検索エリアにbme280と入力】→【以下の画像を参照してノードを追加する】
![bmeノード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518214/53ebe11a-1bb5-86cc-e7e7-05b2d67c8ed5.png)

入力にBme280のノードが追加される
![bme280ノード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518214/92f901df-2b28-bee0-9ab9-4630d7d4450a.png)

以下の画像のようにノードを作成する
![ノード配線.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518214/b10638b4-93d5-a792-ece9-3452ee1b4a7c.png)

デプロイをしてから、True信号を送り、デバッグエリアに以下の画像のような気温・湿度・気圧のセンシングデータが取得できれば、完了です。
![スクリーンショット 2020-05-11 1.14.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518214/7d8f1fe4-bb00-a90b-5185-65da91cb02d0.png)

#最後に
お疲れ様でした。
ミスや、改善点などがあれば、ご指摘いただけるとありがたいです。
プロジェクト管理シミュレータSimulTrainのTry the demoをやってみよう！

# SimulTrainとは
プロジェクト管理者トレーニング用のプロジェクト管理シミュレータ

## 公式ページ
https://www.simultrain.swiss/

## お試し方法
公式ページの`Try the demo`ボタンを押下

----

よかったよかった
Ubuntu 20.04 LTSでサウンドデバイスがうまく切り替わらない時の解決法

#うまくサウンドデバイスが切り替わらない
私のパソコンはイヤホンやヘッドフォンをオンボードのサウンドカードにつなぐとノイズが走ってしまうので**Sound Blaster PLAY! 3**という外付けUSBサウンドカードを使っています。
ですがスピーカーはよく使うのでイヤホンを使うときはSound Blaster PLAY! 3にして、スピーカーを使いたいときはオンボードのサウンドデバイスにしているのですがうまく切り替わらないときがあります。
#直し方
**端末**を起動して
```killall pulseaudio
rm -r ~/.config/pulse/*```
を実行してから再起動（ログアウトでも可）すると治ってるはず
#〆
最近暑くなったり寒くなったりびっくりですね。
半袖はさむいですさむいさむい。
ではおやすみなさい。
#引用
https://linuxfan.info/ubuntu-18-04-no-sound
**Thank you!**
PMP試験に出てくる5C of written communicationsを覚えよう！

# 5C of written communications

## PMBOKのどこにでてくるのか
PMBOKガイドの`363ページ`の`10 Project Communications Management`にでてくるぞ

# 5Cとは
- Correct grammer and spelling.
    - 文法とスペリングが正しいこと。
- Concise expression and elimination of excess words.
    - 表現が簡潔で余計な言葉がないこと。
- Clear purpose and expression directed to the needs of the reader.
    - 目的が明瞭で読者のニーズに訴える表現であること。
- Coherent logical flow of ideas.
    - 一貫して論理的な思考フローがあり、イントロダクション、サマリなどのマーカーを活用していること。
- Controlling flow of words and ideas.
    - サマリなどを活用する

----

よかったよかった
PMP試験に出てくるRACI chartを覚えよう

# RACI chartとは
プロジェクトの責任分担表の種類の１つ

##PMBOKのどこにでてくるのか
PMBOKガイドの`317ページ`の`9.1.2.2　Data Representation`にでてくるぞ

## RACIは何の頭文字か

- Responsible
    - 実行責任者
- Accountable
    - 説明責任者
- Consult
    - 相談先
- Inform
    - 報告先

----

よかったよかった
32bit UEFIなスティックPC(MS-NH1)に最新のUbuntu(20.04)を入れて動かした

ほぼ箇条書き

# やりたかったこと
- Windowsがまともに動かなくなったスティックPCにUbuntu入れてリサイクル
- 手順忘れてたが一応すでに19.10ではUbuntu化成功している
- だがマウスのスティックPC(MS-NH1)では20.04うまくブートしない何で？~~ゲイのサディストだから~~
- なのでいろいろ試したことを書く
- ちなみにほかのメーカーのやつ(DiginosStick)では以下の手順で一発で行けた

【32bit UEFIタブレットPCへのUbuntu20.04LTSインストール方法】
https://blog.goediy.com/?p=559

# せっかちな人のために成功した方法(結論)
端的に言うと
(A)【USB HDDにMBR/EFI両ブート可能なUbuntuイメージを作る方法】
https://bellbind.tumblr.com/post/45757405213/usb-hdd%E3%81%ABmbrefi%E4%B8%A1%E3%83%96%E3%83%BC%E3%83%88%E5%8F%AF%E8%83%BD%E3%81%AAubuntu%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%82%92%E4%BD%9C%E3%82%8B%E6%96%B9%E6%B3%95
と
(B)【32bit UEFIタブレットPCへのUbuntu20.04LTSインストール方法】
https://blog.goediy.com/?p=559
の手順の融合で作った。
やることとしてはBIOSでブートできるドライブをUEFIから呼び出すやつの32bit版を作る

## 細かい手順
必要なもの
・USBメモリなど外部の物理記憶媒体にアクセスできる仮想マシン
・USBメモリ2本ほど(別にUSBHDDなどでもよい)
　・内訳としてはシステムの書き出し用(32GBほど必要)とUbunbtuライブイメージ用(なんならUSB接続のDVDドライブでもいい)が必要

1. 別PCで仮想マシン(使ったのはVMware Player)で仮想マシンを作る
 - 仮想HDDは最終的にインストールするディスク(今回は32GB)より小さく作っておく(今回は20GBで作成)
 - CPUはディアルコア、メモリは仮想マシン上ではなるべく大きめに(作業を快適にしたかった)
 - VMwareの場合は仮想マシン作るときには「後でOSをインストールする」を選択、ディスクイメージをあとで設定から指定する
 - BIOSで起動しインストールを開始する(基本的にはデフォルトはこっち)
2. インストール時にディスクを手動で設定する
 - 先頭に「FAT32」である程度領域を確保(自分は1GBとったが、おそらく300～500MBほどで十分)
 - 残りの領域を「ext4」「マウントポイント"/"」にしてここにUbuntuをインストールする
 - あとはまず普通にインストールし、必要に応じて再起動後に初期設定をする
3. インストール後にすること
 - 2で作ったパーテーションにUEFIブート環境の作成。基本的には(A)のページと同じ手順を「UEFIブート環境の作成」まで行うが、「x86_64-efi」となっているところは「i386-efi」に置き換える
 - (おそらく不要)一応自分が行ったときはx86_64側の手順も「UEFIブート環境の作成」まで一通り行った
 - 一通り終えたらUSBメモリなどの物理記憶媒体を差し込み、仮想マシンに認識できる状態を設定する
4. 実機(スティックPC)へデータを移す(準備編)
 - 起動するOSでgpartedを使用するため、使えるディスクを使用すること
 - 作った仮想マシンを再びブートディスクで起動する(F2でBIOSに入るなどして行う)
 - その際にUSBメモリ(などの物理記憶媒体)を認識させておく
 - 起動したら、まずgpartedで「Ubuntuをインストールした仮想HDD(仮にsdaとする)」を確認する
 - sdaの先頭に作ったFAT32パーテーションにフラグとして「boot,esp」を付け、ext4パーテーションとともにアンマウントした状態にする
 - 物理ドライブをマウントし読み書きできる状態にする
 - コンソール上で物理ディスクに対してddコマンドでsda全体(Fat32,ext4の両方含めたドライブ全体の)のディスクイメージを書き出す
 - ddコマンドが終了したら仮想マシンを終了する
5.  実機(スティックPC)へデータを移す(書き込み編)
 - 実マシンに「ddで書き出したディスクイメージの入ったもの」と「DDコマンドのライブ起動できる(UbuntuのライブUSBなど)」USBメモリを接続する
 - USBのライブイメージで起動する
 - 起動したディスクからddコマンドを使い、書き出したイメージをスティックPCの内臓ドライブに書き出す
 - 書き出しが終わったら必要に応じてOS側の空き容量をGpartedなどで拡張する

#おわり
PMP試験に出てくるTuckman ladderを覚えよう！

# Tuckman ladderとは
チームビルディングの発展段階でタックマンモデルと言われるもの

## PMBOKのどこにでてくるのか
PMBOKガイドの`338ページ`の`9.4 Develop Team`にでてくるぞ


## タックマンモデル

- Forming（形成期）
    - メンバー同士が出会いお互いの役割を知る
- Storming（混乱期）
    - プロジェクト作業に着手開始
    - まだ皆仲良くない
- Norming（統一期）
    - チームっぽくなってくる
- Performing（機能期）
    - チームの生産性が一番高い時期
- Adjourning（散会期）
    - プロジェクト終了

----

よかったよかった
dockerでjenkins構築（2020年05月時点）

##経緯
こちらの本の通りに進めていたところプラグインのインストール時、ならびにjenkinsのmaster-slave間でssh接続でエラーが出てしまいました。
<a target="_blank" href="https://www.amazon.co.jp/gp/product/4297100339/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4297100339&linkCode=as2&tag=cocolonifty00-22&linkId=98c8052eb3b89ceae83b0c47eb4b8745">Docker/Kubernetes 実践コンテナ開発入門</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=cocolonifty00-22&l=am2&o=9&a=4297100339" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
いくつかのQiita記事でも取り上げてありましたが、2020年現在ではどの情報でも動かなかったため備忘録として記述します。

##プラグインのインストールエラー解消
jenkinsはプラグインインストールが失敗していても使うことができますが、
slave01を追加しようとすると認証エラーが出てしまっていました。
こちらの記事で丁寧に解説していただいていますが、私が持っている本では改定が入っており、
すでにこの方の記事の状態のサンプルコードが書かれていました。
参考：https://qiita.com/_ainosh_/items/04992adbab8502e2ed9e

改定後のサンプルコードでも古い状態だったため以下のように修正。
その他の手順は先の記事を参考にしました。
※失敗したjenkinsの情報が残っていたりしてよくわからなくなるので、jenkins_homeのディレクトリ削除、イメージ削除も行なっていました。

```yaml:docker-compose.yml
version: "3"
services:
  master:
    container_name: master
#   2020/05時点でjenkinsci/jenkinsはDEPRECATEDとなっておりいくつかのプラグインがエラー
#   image: jenkinsci/jenkins:2.142-slim
    image: jenkins/jenkins:latest #この時点の最新は2.235でした
    ports:
      - 8080:8080
    volumes:
      - ./jenkins_home:/var/jenkins_home
    links:
      - slave01

  slave01:
    container_name: slave01
#   2020/05時点で上記だけだとうまく行かなかったのでこちらも変更
#   image: jenkinsci/ssh-slave
    image: jenkins/ssh-slave:latest
    environment:
     - JENKINS_SLAVE_SSH_PUBKEY=
```

##jenkinsのssh接続でエラー（javaがない)
プラグインのインストールが全て成功したので改めてslave01を追加しましたがエラーでうまく行かず。
内容からすると最初出ていた認証エラーは解消していましたが今度はjavaがないというエラーが出ていました。

こちらを参考にしました。一部記述のコマンドでは場所がわからなかったのでコマンドを変えています。
参考：https://qiita.com/michi-michi/items/b1835d6e89856643b65a

```bash
##コンテナの中のbashに入ります
docker exec -it slave01 bash

##javaの環境変数を確認
root@xxxxx:xx# echo $JAVA_HOME
/usr/local/openjdk-8
```
あとは先ほどの記事の通りに、slave01の設定にjavaの環境変数を追記。
Herokuでのデプロイ方法【Rails/mysql】

個人アプリをHerokuでデプロイ実施
とても簡単でしたので備忘録を兼ねてまとめていきます。

# HEROKUに会員登録
https://www.heroku.com/

## HEROKUとgitを紐付けましょう
https://www.heroku.com/
↑サイトからDLするか、下記コマンドをターミナルに打ち込みます

```terminal:ターミナル
$ brew tap heroku/brew && brew install heroku
```
ブラウザが立ち上がりログインをします

```terminal
$ heroku login
```

SSHキーの作成

```terminal
$ heroku keys:add ~/.ssh/id_rsa.pub
```
作成したSSHキーの確認

```terminal
$ heroku keys
```

デプロイしたいアプリのディレクトリに移動しHEROKUを作成

```terminal
$ cd ~/myapp　
$ heroku apps:create <アプリの名前> (URL名になります)
```

リモートリポジトリの確認
アプリ名の変更修正

```terminal
$ git remote -v
$ heroku git:remote -a <変更後のアプリの名前>
```

# HEROKUのDB設定
igniteプラン(無料)で作成

```
$ heroku addons:create cleardb:ignite
```
※クレジットカード登録が必要

```
▸    Please verify your account to install this add-on plan (please enter a credit card) For more
▸    information, see https://devcenter.heroku.com/categories/billing Verify now at
▸    https://heroku.com/verify
```

## 環境変数の設定

ClearDBのURL確認

```
$ heroku config
```
```
=== <アプリの名前> Config Vars
CLEARDB_DATABASE_URL: mysql://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true
```
各項目を書き換えて変数を設定

```
$ heroku config:add DB_NAME='<データベース名>'
$ heroku config:add DB_USERNAME='<ユーザー名>'
$ heroku config:add DB_PASSWORD='<パスワード>'
$ heroku config:add DB_HOSTNAME='<ホスト名>'
$ heroku config:add DB_PORT='3306'
$ heroku config:add DATABASE_URL='mysql2://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true'
```

・config/environments/production.rbを修正(追記)

```
config.assets.compile = true
config.assets.initialize_on_precompile=false
```

# HEROKUへデプロイ
ローカルリポジトリをHEROKUへプッシュ

```
$ git push heroku master
```

マイグレーションを実行

```
$ heroku rake db:migrate
```

無事エラーがなければ下記コマンドでURLを開く

```
$ heroku open
```
Flutterのアプリアイコン変更方法 #Flutter #アイコン変更

お疲れ様です。

今回は、アプリのアイコン（アプリを選択するときの、小さくて四角いアイコン）の変更方法を紹介します。

##アプリのアイコン変更

1. アプリのアイコン用に画像を変換
2. 変更したアイコンを「android」と「ios」のアプリアイコンが格納されているフォルダに格納

以上です。意外とシンプルですよね。
目に見える部分なので、
簡単なのに達成感があるかと思います。

####具体例

###### 結果
変更前
<img width="192" alt="スクリーンショット 2020-05-10 22.10.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255919/7a490e95-1ef9-a7ac-15eb-4536af3594c9.png">
`画像1 変更前のアイコン`

変更後
<img width="197" alt="スクリーンショット 2020-05-11 1.00.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255919/c72d2df5-91fd-ece2-2347-64a2043cc231.png">
`画像2 変更後のアイコン`



###### 実手順

**事前準備**

 * アイコンに使う画像

アプリのアイコン用に画像を変換します。
今回は[アプリアイコンジェネレーター](https://appicon.co/)を使用して変換します。
上記URLの画面にて画像を選んで、ジェネレートボタンを押すだけです。
ボタン押下後ファイルが自動でダウンロードされます。
ダウンロードファイルは下記のような構成となります。
<img width="472" alt="スクリーンショット 2020-05-11 0.46.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255919/018418be-cfa4-a52c-a700-59f58b831d7c.png">
`画像3 ダウンロードファイルの構成`

変更したアイコンを「android」と「ios」のアプリアイコンが格納されているフォルダに格納(上書き)します。

* android : mipmap系
* ios : AppIcon.appiconset  
を上書きします。  
<img width="391" alt="スクリーンショット 2020-05-11 0.50.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255919/dc1c2da7-340e-e955-7423-340c5c138007.png">

アプリをビルドするとアイコンが変わっています。

以上　ありがとうございました。


毎週、Flutter関連で情報発信するのでよろしくお願いします。 
**TO「先輩方」**
ご意見ご鞭撻のほど、よろしくお願いいたします。
[@kyota_kobayashi](https://twitter.com/kyota_kobayashi)
JavascriptでCurry化したときの非同期処理

ちょっとハマったのでqiitaに書いて、同じところでハマった人の一助になれれば幸いです。
表題のとおり、関数をcurry化させてそのなかで非同期処理を書いたときの内容です。

下記の通り、curry化の2つ目の関数に非同期処理を書いた場合は、問題なく実装できました。

```javascript
const hoge = (bar) => {
  return async (foo) => {
    const fuga = await new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve(foo)
      }, 1000);
    })
    console.log(fuga)
  }
}
hoge('ichiro')('matsui')
```

この書き方で1つ目の関数で非同期処理がある場合、こう書けばいいと思ったのがエラーになってしまいます。

```javascript
const hoge = async (bar) => {
  const fuga = await new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(bar)
    }, 1000);
  });
  console.log(fuga)
  return (foo) => {
    console.log(foo)
  }
}
hoge('ichiro')('matsui')
```

```javascript:エラー内容
Uncaught TypeError: hoge(...) is not a function 
```


どうしたものかとハマってしまいました。

## こう書こう

```javascript
const player = async () => {
  const hoge = async (bar) => {
    const fuga = await new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve(bar)
      }, 1000);
    });
    console.log(fuga)
    return (foo) => {
      console.log(foo)
    }
  }
  const piyo = await hoge('ichiro')
  piyo('matsui') 
}

player()
```

このように非同期処理した結果を変数で受け取ってから2つ目の関数を書く。
これでエラーなく実装できました。
Enter無し一文字入力しようとすると文字が消えてまう現象

#一文字入力をしてみたい
input()関数はエンターキーを打たないと読み込んでくれないんです。
エンターキーを押すのを省きたいんですね。
ということでエンターキーを打つのを省く手段を検索しました。

```python
import sys
import tty
import termios
def getch():
    fd = sys.stdin.fileno()
    old = termios.tcgetattr(fd)
    try:
        tty.setraw(fd)
        return sys.stdin.read(1)
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old)
```
macの場合これでできるらしい
参考元：https://torina.top/detail/428/

##実行

```python
while True:
    print('入力：',end='')
    key = getch()
    print(key)
# esc で終わり
    if key == chr(27):
        break
```
#文字が消える！
```python
入力：a
入力：f
[ここにカーソル]
```

できた・・けど、、
**`入力:`が消えてるがな！！**

(一文字入力したら急に現れてあたかも最初からあったような感じだけど)


#目標
```python
入力：[ここにカーソル]
```
となってほしい


#結論
```python
while True:
    print('\r入力：',end='')
    key = getch()
    print(key)
    if key == chr(27):
        break
```
`\r`を消したくない文字のところにやれば`入力：`が消えなかった！！
理由はよくわからないけど、試行錯誤の結果です。
どうやら`\r`やら`\n`などの文字を`getch()`の前にある文字列に入れておけば良さそう。

#出力を強制する必要があるらしい(追記)
```python
print('key :', end='', flush=True)
```
とやると表示できました。
なんでも、改行を出力するまで画面に反映されてないだとか、、
別のところで`print('key :', end='')` とやったら改行なしで出力されるから何のこっちゃ状態です。。


#これで色々できそう
```python
s = []
while 1:
    print('\r'+''.join(s), end='')
    char = getch()
# esc で終わり
    if char == chr(27):
        break
# enter 押すと\rが入力される？　カーソルが左端になるので無視
    elif char == chr(13):
        continue
# backspace で一文字削除
    elif char == chr(127):
        if len(s) != 0:
            s.pop()
            print('\b ',end='')
        continue
    s.append(char)
print('')
```
これで一文字ずつ入力してるけどその都度表示することができた！
もう少し処理を加えれば打つと同時に小文字→大文字変換とかできると思う！すごい！
Python関係の「○○100本ノック」のまとめ

# 「○○100本ノックとは」？
　プログラミング関係のエクササイズ集・Tips集的なものです。ちょっとしたテクニックや、基礎がまとまっているので解いてみると練習になります。

　最初にやるのは退屈かもしれませんが、学習の停滞期にやってみると、思わぬ発見があるのではないかなと思います。

　この記事では、Python関係の100本ノックを簡単にまとめてみました。自分が知っているのは、以下くらいですが、他にも良いもの（絶対ある気がします）知っている人はぜひコメントなどで教えてください。

## 画像処理100本ノック
https://github.com/ryoppippi/Gasyori100knock

~~[画像処理100本ノック!!](https://github.com/yoyoyo-yo/Gasyori100knock)~~

追記：本家が惜しくも無くなってしまっていたので、fork（？）されていたものにリンク張り替えました。

　解説・Google Colaboratoryで実行するときは以下記事参考にしてみてください。

https://qiita.com/karaage0703/items/e0b57b63dbebed908b2f


## ディープラーニング ∞本ノック
https://github.com/karaage0703/DeepLearningMugenKnock

注：元サイトが消えてしまったので、私がforkしたものへのリンクです。

　画像処理100本ノックと同じく[imori_imori](https://twitter.com/curry_frog)さん作成のディープラーニングに関する100本（∞本？）ノックです。継続的に更新されていて凄いです。

## 言語処理100本ノック
https://nlp100.github.io/2025/ja/index.html

　解説・Google Colaboratoryで実行するときは以下記事参考にしてみてください。

https://qiita.com/karaage0703/items/e4694d184bc0c6c6684d

回答は以下参照ください。

https://upura.hatenablog.com/entry/2020/04/14/024948

~~https://amaru-ai.com/entry/2022/10/15/204035~~ （リンク繋がらず）


## Numpy100本ノック
https://github.com/rougier/numpy-100/blob/master/100_Numpy_exercises.md

[100 numpy exercises]()

## pandas100本ノック
https://qiita.com/kunishou/items/bd5fad9a334f4f5be51c

[Pandas 100 tricks](https://www.kaggle.com/python10pm/pandas-100-tricks)

　以下ツイートで知りました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Kaggle Notebook上の「Pandas100本ノック」。元ネタはこの記事。<a href="https://t.co/6VtFSeaQSY">https://t.co/6VtFSeaQSY</a> <a href="https://t.co/izYTA1P2Kt">https://t.co/izYTA1P2Kt</a></p>&mdash; u++ (@upura0) <a href="https://twitter.com/upura0/status/1251265219734564864?ref_src=twsrc%5Etfw">April 17, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 音声情報処理n本ノックを目指して
https://github.com/tam17aki/speech_process_exercise

　まだ作成中のようですが、期待を込めてリンクします。

## データサイエンス100本ノック
https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess

　データサイエンス協会作成の100本ノックです。動かし方は以下Qiita記事を参照ください。

https://qiita.com/karaage0703/items/1b18b1f4ab65d35afb5f

## Python言語による実務で使える100+の最適化問題
https://scmopt.github.io/opt100/

　フォロワーさんに教えていただきました。最適化問題の100本ノックです。書籍化もされているようです。こちらは、まだ私は未体験ですので情報のみです。

https://twitter.com/ozro_223/status/1610808383917133824

## Python初学者のためのPolars100本ノック
https://qiita.com/kunishou/items/1386d14a136f585e504e

Polarsという、高速なPandas的ライブラリの100本ノックです。

## Polarsでデータサイエンス100本ノックを解く
https://qiita.com/_jinta/items/28442d25bba067c13bb7

https://qiita.com/_jinta/items/394b1682893e5991d592

同じくPolarsでの100本ノックです。

# まとめ
　Python関係の「○○100本ノック」を簡単にまとめてみました。その他、Python関係の良書が知りたい方は、以下のブログ記事などもよろしければ参考にしてみてください。

https://karaage.hatenadiary.jp/entry/2020/01/04/154338

## 宣伝「からあげ先生のとにかく楽しいAI自作教室」
　Google Colabratoryを使って、初心者でも楽しみながらAIを学べるチュートリアル盛りだくさんの本を執筆しました。Pythonを使ってAIにも手を出したい人はよろしければ是非。書籍の詳細は以下ブログ記事に書いています。

https://karaage.hatenadiary.jp/entry/2020/12/11/073000


# 変更履歴
- 2025/04/07 言語処理100本ノックリンクしゅう
- 2024/05/13 リンク追記
- 2022/01/05 リンク修正、追記
- 2020/09/26 Pandas100本ノックを追加
- 2020/06/16 データサイエンス100本ノックを追加
- 2020/06/10 音声情報処理n本ノックを追加
php:7.3-fpm-alpineで、モジュールのインストール

# phpのモジュールのインストール
composerを実行したときに、socketsがないとのエラーが発生しました。
エラー解決の道のりで学んだことを共有します。
## 筆者の使用している環境
・docker
・php:7.3-fpm-alpine
## error内容
```
composer require linecorp/line-bot-sdk 
```
のコマンド実行時にエラーが発生しました。

```
/work # composer require linecorp/line-bot-sdk
    1/3:        https://packagist.jp/p/provider-2020-04$0debce5054869c0cc3060fd8316edffa3035f0642bf192c9e9cf9724d7429a24.json
    2/3:        https://packagist.jp/p/provider-latest$a6fa0af3f924c039609f8f1f06ac662b10318aa68e1148be6b1bdb31361c8133.json
    3/3:        https://packagist.jp/p/provider-2020-01$6b3554006599af21a07eabf22d05e92f989cac78cda0223195aeebb83d53c317.json
    Finished: success: 3, skipped: 0, failure: 0, total: 3
Using version ^4.3 for linecorp/line-bot-sdk
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Installation request for linecorp/line-bot-sdk ^4.3 -> satisfiable by linecorp/line-bot-sdk[4.3.0].
    - linecorp/line-bot-sdk 4.3.0 requires ext-sockets * -> the requested PHP extension sockets is missing from your system.

  To enable extensions, verify that they are enabled in your .ini files:
    - /usr/local/etc/php/php.ini
    - /usr/local/etc/php/conf.d/docker-php-ext-bcmath.ini
    - /usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini
    - /usr/local/etc/php/conf.d/docker-php-ext-sodium.ini
  You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.

```
結果的にはこのエラー文が原因でした↓
- linecorp/line-bot-sdk 4.3.0 requires ext-sockets * -> the requested PHP extension sockets is missing from your system.

socketsがないですよ。という意味らしいです。

## 解決方法１
https://qiita.com/hamatti/items/d164bd4a88fc51f2a99d
上記の記事のように、多くの記事でphp.iniでのコメントを外せばよいとの意見が多かったです。
ですが、これでは解決しませんでした。

上記のようにコメントを外して解決する場合は、あらかじめsocketsのモジュールがインストールされている場合なのだと思う。

私が使っている環境はalpineの環境なので、あらかじめインストールされていなかったのです。
```
php -m
```
上記のコマンドをターミナル上で打つことで、インストールされているモジュールを確認することができます。
## 解決方法２
```
apk add php7-sockets
```
このコマンドでsocketsをインストールして解決かと思ったが変化なしでした。この辺はよくわかっていません。

githubのdocker-libraryからダウンロードすることで、解決できました。

dockerfileにて、
```
RUN docker-php-ext-install sockets
```
で無事socketsをインストールでき、解決しました。

## phpのモジュールについて
エラー解決で調べていく中で、socketsはphpのモジュールだということを知りました。
モジュールってなんだ？と思い調べました。

モジュールはphpの拡張機能のことです。
dockerの場合、上記のようにdockerfile内でRUN docker-php-ext-install (インストールしたいモジュール)　というコマンドを記述することでインストールすることができます。

モジュールについて、下記に公式のドキュメントを張っておきます。
https://www.php.net/manual/ja/install.pecl.php
java(メソッド)

##メソッドの定義
```java
public static void hello() {           //①
   System.out.println("こんにちは")     //②
```
①重要事項の表明(メソッド名は`hello`)
②処理内容

##引数の利用
```java
public static void main(String[] args) {
     System.out.println("メソッドを呼び出します");
     hello("A");
     hello("B");
     hello("C");
     System.out.println("メソッドを呼び出しが終わりました");
}
public static void hello(String name) {  
     System.out.println(name + "くん、こんにちは");
}
```
①A、B、Cを渡してhelloメソッドを呼び出す
②文字列変数：nameを宣言
③実引数：A.B.C　仮引数：name 
**実際の表示**
Aくん、こんにちは
Bくん、こんにちは
Cくん、こんにちは

##引数の渡し方
 何も渡さな場合　：メソッド名（）
 値を１つ渡す場合：メソッド名（値）
 値を複数渡す場合：メソッド名（値、値、・・・）
（複数の場合`カンマ　、`で区切って使用）
※値には、変数名を指定することもできる

##戻り値の利用
```java
return 戻り値；
```
**return文の注意点**
メソッドの終了も行う。return文の後に処理を書いても実行されない。
PMP試験に出てくるステークホルダーのDirections of influenceを覚えよう

# Directions of influenceとは
ステークホルダーの分類方法の１つのこと

## PMBOKのどこにでてくるのか
PMBOKガイドの`ページ513`の`13.1.2.4 Data Representation`に出てくるぞ

## Directions of influenceにはどのような種類があるのか

- Upward
    - 組織の上位層
- Downward
    - 一時的に協力中のチームまたはスペシャリスト
- Outward
    - プロジェクトチーム外のステークホルダー
- Sideward
    - 共通のリソースを共有する同僚のPMなど


----

よかったよかった
GHCiを起動したときに、定義しておいた関数などを自動ロードする

```~/.ghci:
:load ~/.ghci.hs
```

```haskell:~/.ghci.hs
module Preset where

import Prelude

xs :: [Int]
xs = [1 .. 10]
```

GHCiを起動

```
>>> xs
[1,2,3,4,5,6,7,8,9,10]
```

やったね！

#### NOTICE

（グローバルプロジェクトでない）haskell-stackプロジェクト内で `stack ghci` すると、プロジェクト内のモジュールのみがロードされるので、手動で `>>> import Preset` してあげる必要があるようです。
（もちろん `:module +Preset` でもおっけー！）

なんで……？？ 🤔
VSCode+venv環境構築でつまったところ

##概要
VSCodeとvenvでPython仮想環境を作るとき、Powershellやらpipやらでいろいろつまったところがあったので、整理しました。具体的なトピックは、

* Powershellのアクセス権限関係
* pip installでうまくいかない

です。

##序論
Pythonで開発するにあたって、今までは仮想環境を立てずにやってきました。　　
しかし最近の作業で、pipでインストールするパッケージのバージョンを上げたり下げたりする必要が出てきました。
そこで仮想環境デビューすることに決めました。

##環境
OS：Windows10
Python：3.7.3 (32bit)
テキストエディタ：Visual Studio Code
仮想環境：venv

##作業内容
https://hachian.com/2019/09/19/vscode_venv/
を参考に進めました。

###仮想環境のアクティベートがうまくいかない
理想としては、仮想環境を立てるフォルダをVSCodeで開いたときに、スムーズに仮想環境を起動したいです。
仮想環境のアクティベート（起動）には、Scripts 内の activate.ps1 を実行する必要がありますが、これをPowershellで直接していすると、

```powershell
.\Activate.ps1 : このシステムではスクリプトの実行が無効になっているため、 
 C:~Activate.ps1を読み込むことができません。
```

とエラー文が出ます。
どうやらPowershellでスクリプトを実行するには、Powershell起動時に管理者として実行しなければいけないらしいです。しかし今回はVSCodeに付属したターミナルでPowershellを起動しているので、管理者として実行するのは無理そう。。。

####解決策
このサイトが参考になりました。
https://attakei.net/blog/2019/windows-vscode-venv/index.html
VScodeでフォルダを開いたときには、そのフォルダ内の.vscodeフォルダ内にあるsetting.jsonを読み込んでいろいろ設定することができるらしいです。（無知）
以下をsetting.jsonに追加します。すでにsetting.jsonに何かしら書かれている場合は、既存の文末に,を打って改行した下に書きます(JSONファイルの書き方）。

```Powershell
{
  "terminal.integrated.env.windows": {
    "PSExecutionPolicyPreference": "RemoteSigned"
  }
}
```

これでアクティベートを問題なく行うことができます。

###pip installができない
numpy や pandasはインストールできるのに、tensorflowがインストールできませんでした。以下のエラーが出てきます。

```powershell
ERROR: Could not find a version that satisfies the requirement tensorflow (from versions: none)
ERROR: No matching distribution found for tensorflow
```
調べるとよくあるエラーらしいです。調べると、pipのバージョンが古いとダメなことがあるようです。しかし私の環境のpipは最新。
そこで以下のサイトで説明があるように、whlファイルのURLを直接指定してインストールを試みました。
https://sukota.hatenablog.com/entry/2018/10/24/160521
URLにある数字がPythonやパッケージ自体のバージョンを意味しているんですね。一応PyPIで本当に存在するものか確認後、pipで入れようとしたところ、

```powershell
ERROR: tensorflow_gpu-2.2.0-cp37-cp37m-win_amd64.whl is not a supported wheel on this platform.
```

なるほど。私はここで諦めました。  
後で気が付いたのですが、Pythonが32bitバージョンでした。公式HPからインストールするとデフォルトは64bitのOSでも32bitのPythonが入るらしいです。おそらく64bit版にしたらこれらのパッケージを受け付けてくれるんじゃないでしょうか。（Pytorchも同じエラー文で入れられませんでした）
64bit版にしたあとの状況も、追記しようと思います。

##まとめ
PowershellさんはWindowsのシステム自体がさわるもので、手でコマンドを打つならGit bashがいいです。なんたってgit clone ができる（当然）。
あとPythonは64bit版にします。怖いんで今やってる開発がひと段落したら。
Nuxt+Storybook+Composition APIでコンポーネント開発

# はじめに
コンポーネントを思いつきで作らないように、戒めとして残します
Composition APIを伴った書き方です。

# セットアップ

## Nuxtインストール

```
yarn create nuxt-app <project-name>
```

色々と聞かれるでしょうが、今回はTypeScript前提で作るので、TypeScriptを選択してください。
次にComposition APIインストール

```
yarn add @vue/composition-api
```

pluginディレクトリに`composition-api.ts`を追加し以下のように記述

```typescript:plugins/composition-api.ts
import Vue from 'vue'
import VueCompositionApi from '@vue/composition-api'

Vue.use(VueCompositionApi)
```
nuxt.config.jsに以下を追加


```javascript
plugins: ['@/plugins/composition-api'],
```


## Storybookをインストール
Nuxtと同じルートディレクトリにStorybookをインストール

```
npm install @storybook/vue --save-dev
npm install vue-loader vue-template-compiler @babel/core babel-loader babel-preset-vue --save-dev
```

`.storybook`というディレクトリをルートに作り、`config.js`を入れる
componenetsディレクトリにあるので以下のようにする

```javascript
import Vue from 'vue'
import VueCompositionApi from '@vue/composition-api';

Vue.use(VueCompositionApi);

import { configure } from '@storybook/vue';
function loadStories() {
  const req = require.context('../components', true, /\.stories\.js$/);
  req.keys().forEach(filename => req(filename));
}
configure(loadStories, module);
```



## Scssの準備
自分の場合はscssを使うので以下のようにする。

インストール

```
yarn add -D node-sass sass-loader
```

.storybook以下に`webpack.config.js`を作り、以下を追加

```javascript
const path = require('path');
 
module.exports = ({ config }) => {
  config.resolve.alias['@'] = path.resolve(__dirname, '../')

  config.module.rules.push({
    test: /\.scss$/,
    use: [
      {
        loader: 'style-loader'
      },
      {
        loader: 'css-loader'
      },
      {
        loader: 'sass-loader',
      },
    ],
  });
  return config
}

```




package.jsonを開き、以下の項目を追加

```json

  "scripts": {
    "storybook": "start-storybook -p 9000"
  }
```


後は`yarn storybook`でOK。





# 使ってみる

例として以下のようなvueファイルを作る

```vuejs:components/Example.vue
<template>
  <div class="example">{{ message }}</div>
</template>
<script lang="ts">
import { ref } from '@vue/composition-api'
export default {
  name: 'Example',
  setup() {
    const message  = ref('Hello, Storybook!')
    return {
      message 
    }
  }
}
</script>
<style lang="scss" scoped>
.example {
  color:red;
}

</style>

```

同じディレクトリに`Example.stories.js`を作る

以上、動けばOK。

```javascript
import Vue from 'vue'
import { storiesOf } from '@storybook/vue'
import Example from './Example'
storiesOf('Example', module)
  .add('As a component', () => ({
    components: { Example },
    template: '<Example />'
  }))

```


# 参考
[An (almost) comprehensive guide on using Storybook with Nuxt.js](https://medium.com/js-dojo/a-guide-on-using-storybook-with-nuxt-js-1e0018ec51c9)
[Nuxt.jsでStorybookを使用してみたメモ](https://tenderfeel.xsrv.jp/javascript/4121/)
ROSのビルドシステム catkin_makeとcatkin tools(catkin build)に関して

##### ROSのビルドシステム catkin_makeとcatkin tools(catkin build)に関して
　ROS（ROS1のみ対象です）に対する基礎知識があることが前提の記事です。パッケージのビルドシステム、ROSのデフォルトはcatkin_makeなのですが、私は好みでcatkin toolsというツールを用いてビルドしています。

[catkin tools](https://catkin-tools.readthedocs.io/en/latest/)

　catkin tools(catkin build)は以下コマンドでインストールできます。

```sh
$ sudo apt-get install -y python-catkin-tools
```

　catkin toolsでのワークスペースの作り方は以下になります。

```sh
$ rm -rf ~/catkin_ws
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws
$ catkin init
$ catkin build
```

　catkin tools(catkin build)でワークスペース作っておくと、ビルドしたいパッケージのディレクトリの中で `catkin bt`と実行するとそのバッケージをビルドしてくれたりと便利です（`bt`は`build this`の略らしいです）。

　やっぱりcatkin toolsは嫌だ、catkin_makeを使いたいという場合は、ワークスペースを作り直して下さい。具体的には以下コマンドを実行すればOKです。

```sh
$ rm -rf ~/catkin_ws
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws
$ catkin_make
```

# 参考リンク
[catkin-tools tipcatkin-tools 隠れ便利機能その一](https://opensource-robotics.tokyo.jp/?p=1726)

[ROSの新しいビルドシステムcatkinについて](http://myenigma.hatenablog.com/entry/20131229/1388320084)

# 関連記事
[Raspberry Pi 3にROSをセットアップしてRaspberry Pi純正カメラ(Raspicam)で遊んでみた](https://karaage.hatenadiary.jp/entry/2017/04/13/073000)

[PCL(Point Cloud Library)+ROSで3次元画像処理入門](https://karaage.hatenadiary.jp/entry/2017/09/11/073000)
ABC167 WriteUp

#要約
ABは速攻で解けるのにCが一生解けない.後回しにしていた「DPが解けない」という弱点が如実に出てしまった...

今後緑~青目指していくなら今回のC問題は必ず解けるようにしておきたい.

そのためにも，AOJの組合せ最適化(https://onlinejudge.u-aizu.ac.jp/courses/library/7/DPL/1) をゴリゴリ解くぞ！！

## A 
>高橋君はとあるWebサービスに会員登録しようとしています。まずIDを$S$として登録しようとしました。しかし、このIDは既に他のユーザーによって使用されていました。そこで、高橋君は$S$の末尾に1文字追加した文字列をIDとして登録することを考えました。高橋君は新しくIDを$T$として登録しようとしています。これが前述の条件を満たすか判定してください。

Tの末尾文字を削除した`T[:-1]`がSと一致するかをチェックすればよいです.
一応`S="" T=""`みたいなヤバ入力[^1]を通さないために文字数のチェックもします．

```python 
s = input()
t = input()
if len(s) + 1 == len(t) and s == t[:-1]:
  print("Yes")
else:
  print("No")
```
## B
>1が書かれたカードが$A$枚、0が書かれたカードが$B$枚、−1が書かれたカードが$C$枚あります。これらのカードから、ちょうど$K$枚を選んで取るとき、取ったカードに書かれた数の和として、 ありうる値の最大値はいくつですか。

Kの値によって最大値には3つの場合があります．
1 . K<=Aの場合．
 
- 「1」のカードをK枚とってもおつりがくる,もったいない状態ですね.
- 最大値を取るのは，「1」カードをK枚取る場合で,最大値はKです.
 
2 . A<K<=A+Bの場合 
  
 - この場合，A枚の「1」カードをとっても，K-A枚取る義務があるため，その分は「0」カードか「-1」カードを取らなければいけません．幸い前提条件よりK-A<Bなので，残ったドローの義務についても「0」カードを引くことで最大値を減らすことなく点数繰りができます．
 - 最大値を取るのは,「1」カードをA枚，「0」カードをK-A枚取る場合で,最大値はAです．
 
3 . A+B<Kの場合
 - 「1」カードと「0」カードを取り尽くしてしまったので，とうとう「-1」カードに手を出さなければならなくなりました(秘境生活でギシギシを食べざるを得なくなったエド・スタフォードの気持ちですね)．[^2]この場合，取らなければならない「-1」カードの枚数は`K-(A+B)`枚です.
   - 最大値を取るのは,「1」カードをA枚，「0」カードをB枚，「-1」カードをK-(A+B)枚取る場合で， 最大値はA-(K-(A+B))です.
   
高々3パターンの場合分けなので，愚直に実装していきましょう.
    

```python 
a,b,c,k=[int(i)for i in input().split()]
if k <= a:
  print(k)
elif k<=a + b:
  print(a)
else:
  print(a-(k-a-b))
```

##D 
> 高橋王国には$N$個の町があります。町は$1$から$N$まで番号が振られています。それぞれの町にはテレポーターが1台ずつ設置されています。町$i(1≤i≤N)$のテレポーターの転送先は町$A_i$です。高橋王は正の整数$K$が好きです。わがままな高橋王は、町$1$から出発してテレポーターをちょうど$K$回使うと、どの町に到着するかが知りたいです。高橋王のために、これを求めるプログラムを作成してください。

(WA回答)

街をノード，テレポートを有向エッジと見ると,有向グラフが何となく見えてきますね．
そして，少し考えると，「ある程度テレポートを繰り返すと，最終的にはグラフ内の無限ループをぐ〜るぐるすることになるのでは？」「その部分はシミュレーションしなくていいな」という結論に至ります.
ということは，
 - とりあえず愚直にテレポートを繰り返す. 探索済ノードはリストにappendして記録する.
 - もしテレポート中に探索済ノードにブチ当たった場合，以降のテレポートは無限ループになるので，繰り返し部分はシミュレーションせずとも計算で求めることが出来る.
 - 無限ループする前にK回達成したらそれはそれでよし.終了.
 という実装が考えられる...と思ったのですが，以下の回答だとTLEになるだけでなく，WAになってしまいます．

```python
N,K=[int(i)for i in input().split()]
A = [int(i) for i in input().split()]

#インデックスを1オリジンに
A.insert(0,-1)

accessed_node = set([1])
accessed_node_list=[1]
loop_root = []
loop_madeno_size = 0
loop_size=0
t=1
#ループ検出
for _ in range(1,K+1):
  if not A[t] in accessed_node:
    accessed_node.add(A[t])
    accessed_node_list.append(A[t])
    #次の場所を決める
    t=A[t]
  else:
    #ループ路を確定する
    loop_start_index=accessed_node_list.index(A[t])
    loop_root = accessed_node_list[loop_start_index:]
    loop_madeno_size = loop_start_index
    loop_size=len(loop_root)
    break
#print(accessed_node)
#print(loop_madeno_size)
if loop_madeno_size <= K:
  print(t)
  exit()
K -= loop_madeno_size
print(loop_root[K%loop_size])

```
ウーン...修行してから解き直したい．
あとこれ，PyPyだと若干早いパターンですね.

# まとめ
フル回答はこちら : https://github.com/Nekomo/AtCoder/tree/master/ABC/167
来週までに組合せ最適化,DPいっぱい解くぞ〜！！

[^1]: ヤバい入力．

[^2]: ルーマニア | ザ・秘境生活 https://youtu.be/NSwOF_A0LfM
投稿にカテゴリーを付けよう

#カテゴリーを付けて投稿する
投稿サイトなどを作っていると
・同じカテゴリーの投稿をまとめて表示させたい
・カテゴリーで検索できるようにしたい
と思うことがあると思います、そのためには投稿にカテゴリーを紐付ける必要があります。
今回はそれを書いていきます

##1.gemをインストールしよう
今回は用意するカテゴリーが少なく、さらに書き換えることがほとんどないという時の方法です

```Gemfile.
gem 'active_hash'
```
こちらのgemを使っていきます
このgemを使えばデータベースに保存するほどの量でもないし、変更する予定もない場合に便利です
追加できたら`bundle install`しておきましょう

##2.モデルに追記
インストールできたら紐付けたいモデルに追記しましょう

```tweet.rb
class Tweet < ApplicationRecord
  extend ActiveHash::Associations::ActiveRecordExtensions

  belongs_to_active_hash :category

  validates :category_id, presence: true
end
```

この三行を追記しましょう。
一番上の**extend**は*active_hash*を使用するのに必要です
二番目はカテゴリーと紐付けたいモデルとのアソシエーションです
三番目はバリデーションなので必要な場合は記載しましょう

##3.モデルを作成する
次にモデルを作成していきます
ここで注意して欲しいのが`rails g models`のコマンドで作成せずに**models**フォルダに直接追加してあげます。
理由はマイグレーションファイルなど余計なものまで作られてしまい消す手間などが増えるからです。
そして作成できたら下記のように記載していきます

```category.rb
class Category < ActiveHash::Base
  self.data = [
    {id: 1, name: '風景'}, {id: 2, name: 'ポートレート'}, {id: 3, name: 'スナップ'},
    {id: 4, name: 'ペット・生物'}, {id: 5, name: '花・植物'}, {id: 6, name: '自然'},
    {id: 7, name: '鉄道'}, {id: 8, name: '車・バイク'}, {id: 9, name: '食事・料理'},
    {id: 10, name: '水中写真'}, {id: 11, name: '趣味'}, {id: 12, name: 'フィギュア'},
    {id: 13, name: 'モノクローム'}, {id: 14, name: '旅行'}, {id: 15, name: 'ファッション'},
    {id: 16, name: 'スポーツ'}, {id: 17, name: 'スチルライフ'}, {id: 18, name: '都市風景'},
    {id: 19, name: 'その他'}
  ]
end
```
classの継承はそのまま使っても問題ありません。
今回は**Category < ActiveHash::Base**になっていますが、`category.rb`なのでそう記載しているだけで作ったモデル名で変えてください。
##4.その他諸々
あとは紐付けたいモデルのマイグレーションファイルに`category_id`を追記してあげます。
さらに入力フォームも作ってあげて、`params`の記載を変えてあげればうまくいくと思います。

```new.html.haml
    = form_with(model: @tweet, local: true) do |f|
      %h3
        投稿する
      = render 'shared/error_messages', model: f.object
      = f.text_field :title, placeholder: "タイトル"
      = f.collection_select :category_id, Category.all, :id, :name, { prompt: "選択してください" } 
```
今回はhamlで書いていますが、このようにすればフォームができるはずです

##まとめ
便利なので一度使ってみるのもいいと思います！
本当にあったやらかしDB設計シリーズ一覧

本当にあったやらかしDB設計シリーズをまとめてみました

[SQLアンチパターン](https://www.oreilly.co.jp/books/9784873115894/)で書かれているほど高尚な問題ではなく、もっと初歩的な、でもありがちな問題を取り上げています

初心者を脱出したと思っている人に是非読んでもらい、正しく設計してもらうことを目的としています

もしここに載っていないパターンを経験したことのある方がいたら是非教えてください

[本当にあったやらかしDB設計①【R無しRDB】](https://qiita.com/bouitengineer12/items/ca7beb7ba83c3233d316)
[本当にあったやらかしDB設計②【囚人番号テーブル】](https://qiita.com/bouitengineer12/items/0a6736c5315f20d13344)
[本当にあったやらかしDB設計③【ロジカルクエリー】](https://qiita.com/bouitengineer12/items/e4edbb604c961b7aa993)
[本当にあったやらかしDB設計④【テストチューニング】](https://qiita.com/bouitengineer12/items/bca2317b2282e8ccd1e3)
[本当にあったやらかしDB設計⑤【第三正規化病】](https://qiita.com/bouitengineer12/items/6cf86923bbe8d3815390)
[本当にあったやらかしDB設計⑥【見えない削除フラグ】](https://qiita.com/bouitengineer12/items/d82e5507814d3f914524)
[本当にあったやらかしDB設計⑦【ステートフルDB】](https://qiita.com/bouitengineer12/items/325fec42c1c3bb385c64)
[本当にあったやらかしDB設計⑧【ファンクションDB】](https://qiita.com/bouitengineer12/items/17fc2187d3eea490117e)
[本当にあったやらかしDB設計⑨【文字列日付】](https://qiita.com/bouitengineer12/items/6ef256956c4bbf77a269)

番外編
[T字形ER手法って何？？？](https://qiita.com/bouitengineer12/items/530d04075e68b3f1a6f6)
[賢いデータ移行のやり方](https://qiita.com/bouitengineer12/items/7f8f52c6facf4dcbc9bf)
[インピーダンスミスマッチとどう向き合うか](https://qiita.com/bouitengineer12/items/90ed4fb9efc21a97e4cd)
[どこまでデータを消すのか](https://qiita.com/bouitengineer12/items/5eba8b3ee3dcd407cff9)
[データモデリングガイド](https://satouaaaaa.notion.site/f2eeb56e874c4c7ca887be1500d57b88?pvs=4)
PMP試験に出てくるQuality Managementの５段階の効果を覚えよう

# Quality Managementの５段階の効果とは
組織の品質管理効果状況を効果が低い順に並べたもの

## PMBOKのどこにでてくるか
PMBOKガイドの`275ページ`の`8.3 Control Quality`の中にでてくるぞ

## どんな内容か

- 第１段階 (let the customer find the defects)
    - 顧客に欠陥を見つけさせる
        - 瑕疵対応 (warrenty issues)
        - 評判低下 (loss of reputation)
        - リコール (recalls)
        - 修正コスト (rework costs)
- 第２段階 (quality control)
    - 顧客に成果物を納品する前に品質コントロールプロセスにて欠陥を除去する。
- 第３段階 (quality assurance)
    - 品質保証 (quality assurance)にて品質コントロールプロセスを改善する。
- 第４段階 (incorporate quality into the planning)
    - 計画と設計にて品質をプロダクトに作り込む
- 第５段階 (create a culture that is aware and commited)
    - プロセスやプロダクトの品質に対して意識が高い組織カルチャーを育む

----

よかったよかった
【2020年版】Cloud Firestoreの基本機能とよくある心配点をまとめた

# はじめに
仕事でリアルタイムアプリケーションを作ることになり、それにあたって色々な選択肢を検討した結果、ReactJS + Cloud Firestoreを使うことになりました。

**旧Realtime Database**からクエリやスケーリングが強化された**Cloud Firestore**が正式リリースされて1年、ある程度の情報もまとまってきたことから、今回仕事で採用することにしました。

僕は昔からRealtime Databaseを個人的に使っていて、仕事で使うには心配な点がいくつかあったのですが、改めてCloud Firestoreをみてみたら知らなかった変更点が多くあったため、まとめてみました。

# Firestore (Realtime Database)でよくある技術的な心配点

### 1. 検索（クエリ）の弱さ
Firestoreでは複合クエリに対応しています。また、Realtime Databaseよりも直感的に書くことができます。

```javascript
// 一般的な検索
citiesRef.where("state", "==", "CA")
citiesRef.where("population", "<", 100000)
citiesRef.where("name", ">=", "San Francisco")

// regionsフィールドの配列にwest_coastを含むcitiesを返す
citiesRef.where("regions", "array-contains", "west_coast")
```

**✖️できないこと：**
`OR` -> 2回検索して結果を結合する必要あり
`!=` -> `where("age", "<", "30")`は使えない。`where("age", "<", "30")`と`where("age", "<", "30")`を結合する必要あり。



### 2. データ構造の柔軟性
データが柔軟すぎるため破壊的変更の問題が起きるイメージでしたが、データ構造を検証することで、RDSのようにデータ構造を常に正規化しておくことができます。

**Data Validation**
https://firebase.google.com/docs/rules/data-validation

### 3. 深いネストで全て取得してしまう問題
Firebaseではネストが深くなった時、上位ノードを取得するとそれ以下を全て取得するため通信量やパフォーマンスに問題を与えることがあります。

これを解決するため、Firestoreでは**SubCollection**という機能が登場しました。

SubCollectionはRDBにもないFirestore独自の概念です。**Collectionの中のDocumentが内部に持つCollection**のことをSubCollectionと言います。

さらに、**CollectionGroup**と組み合わせることで横断的なクエリを用意することが可能です。

詳しい使い方は、Firestoreに関して様々情報発信されている1amageekさんの記事で解説されています。
https://qiita.com/1amageek/items/343f262ba3b50e657078

### 4. WEB SDKでのオフラインサポート
Realtime DatabaseではできませんがFirestoreでは標準でサポートしています。

### 5. スケーリング
Firestoreでは自動スケーリング+マルチリージョンに対応しています。

# 参考記事
とても参考にさせていただきました。

### テスト駆動開発
以下の記事で、TypeScript + Jest + セキュリティルールを用いて、テスト駆動開発を行うやり方が紹介されています。
https://qiita.com/ryo2132/items/02b4d341fb01f04ec0be

### データベース設計
よく問題になる1対多、多対多などのDB設計に関しては、1amageekさんの記事でかなり詳しく紹介されています。
https://qiita.com/1amageek/items/d606dcee9fbcf21eeec6
Objective-Cにおけるクラスメソッドとインスタンスメソッド

# -voidと+voidでどう違うんだろう   
-voidは、インスタンスメソッド
+voidは、クラスメソッド
# どう違うのか？
インスタンスメソッドは、クラスをインスタンス化しないと使えない。
クラスメソッドであれば、クラス名を添えればメソッドを実行できる。

インスタンスメソッドなら、まずインスタンス生成。そして、メソッド実行。
TestClass * testClass = [TestClass new];
[TestClass methodAction];

クラスメソッドなら、クラス名とメソッド名で、実行できる。
[TestClass classMethodAction];


# クラスメソッドを使うべきタイミングとは？
インスタンス生成しない。
つまり、インスタンス変数などを必要としないで、メソッドだけを実行したいときに使う。
クラス全体に関わる処理などに適している。

# インスタンスメソッドを使うべきタイミングとは？
インスタンス変数も含めて処理する前提かと思うので、同じクラスでも渡しているインスタンス変数が異なれば処理結果も異なる、という印象。（感覚で書いてる）


とりあえず自分のメモなので投稿する。
認識齟齬があれば、指摘ください。
form_withヘルパーのlabelの勘違い【ズボラな初学者向け】

#はじめに
form_withヘルバーを使った学習中に些細なミスでテストが通らなかったため、自戒のためにもここに記しておきます。

#lavelの部分に注目
記述したform_withヘルパーのコードは次のとおりです。どこが間違っているかわかりますか、、、


```php:
<h1>ユーザー登録</h1>
      <%= form_with model: @user, local: true do |f| %>
        <div class="form-group">
          <%= f.label :last_name %>
          <%= f.text_field :last_name, class: 'form-control' %>
        </div>
        <div class="form-group">
          <%= f.label :first_name %>
          <%= f.text_field :first_name, class: 'form-control' %>
        </div>
        <div class="form-group">
          <%= f.label :email %>
          <%= f.email_field :email, class: 'form-control' %>
        </div>
        <div class="form-group">
          <%= f.label :Password %>
          <%= f.password_field :password, class: 'form-control' %>
        </div>
        <div class="form-group">
          <%= f.label :password_confirmation %>
          <%= f.password_field :password_confirmation, class: 'form-control' %>
        </div>
```

はい、
`<%= f.label :Password %>`
ここです。

なぜか大文字になっています。正しくは小文字です。ウェブ上で、入力欄の名前を表示するのだから、大文字にすべき、とコードを書いた瞬間に思っていたのですね。（じゃあどうして他のは大文字じゃないんだ？）

`f.label`の箇所は`f.text_field :password`に対応するlabel要素を出力するので、同じ文字である必要があります。

#最後に
余談ですが、最初はtext_fieldでemailもpasswordの箇所も記述していました。ズボラです。

読んでくださって、ありがとうございます。
誰かの学習が前進すると、うれしいかぎりです。

#参考文献

・[現場で使えるRuby on Rails5速修実践ガイド](https://amzn.to/3bquu7e ) pp 104
書評：正しいものを正しくつくる

# はじめに
書籍、[正しいものを正しくつくる](https://www.amazon.co.jp/%E6%AD%A3%E3%81%97%E3%81%84%E3%82%82%E3%81%AE%E3%82%92%E6%AD%A3%E3%81%97%E3%81%8F%E3%81%A4%E3%81%8F%E3%82%8B-%E3%83%97%E3%83%AD%E3%83%80%E3%82%AF%E3%83%88%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8B%E3%81%A8%E3%81%AF%E3%81%A9%E3%81%86%E3%81%84%E3%81%86%E3%81%93%E3%81%A8%E3%81%AA%E3%81%AE%E3%81%8B%E3%80%81%E3%81%82%E3%82%8B%E3%81%84%E3%81%AF%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%81%AE%E3%81%9D%E3%81%AE%E5%85%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6-%E5%B8%82%E8%B0%B7%E8%81%A1%E5%95%93/dp/4802511191) を読んだので、感想を残します。
![Amazon](https://images-na.ssl-images-amazon.com/images/I/41txD1eZGrL._SX351_BO1,204,203,200_.jpg)

# 印象に残った部分のメモ

- 不確実性への戦い方、要件定義によって確実性を上げる、合意を重視する、合意形成を遵守する

- ゴールデンサークル、Whyに繋がるアジャイルに作る9つの意義

- プロダクトオーナーと開発チームの間の「ミッションの境界線」を形成してしまう2つの境界には、
「作る」と「作らない」の境界、アウトプットとアウトカムの境界がある。

- 「役割を中心とした調整によるプロダクトづくり」から「問いと向き合い続ける共創によるプロダクトづくり」へ

自分自身がSIerで経験してきた前半部分の体験と直近参画しているプロダクトづくり、
チームづくりでぶつかっている課題やこれから常に向き合い続ける課題について記載されていると思いました。
最後に書かれているのはカイゼン・ジャーニーでも出てきた「越境」という言葉でした。
チーム・ジャーニーを読んでからこちらを読んだのですが、
チーム・ジャーニーに書いてある全てのことがこちらにも書いてあり、
話の細かさからかこちらの方がわかりやすく感じました。

# まとめ
読みやすさは完全に個人に依存しますが、
カイゼン・ジャーニー、チーム・ジャーニー の間を埋めてくれる一番わかりやすい本でした。
はじめ、物語形式のものを読むのに慣れてしまい読むのに苦労するかと思いましたが、
３部作の中で一番読みやすかったです。
（ちなみに、一番感銘を受けたのは一番最初に読んだカイゼン・ジャーニーです..）
0埋めの(0以外でもできる)方法

#背景
社員番号等を扱う際にどんな桁の数字でも最終的な桁数を合わせる方法を調べていた時に少し穴があったのでメモしておきます。
※どちらも5桁にする場合
　12→00012
　2389→02389

#使用したクラス
 String.format("%xyz" , n);
 % = 正規表現
 x = 埋めたい数字
 y = 埋めたい桁数(nも含む)
 z = 10進数やほかの進数の頭文字(今回はd)

 文字列.replace(何を,何に変換);

#やってみた
```
public class strPractice02 {

    public static void main(String[] args) {
        
        //9の前に4桁分のゼロを付け足す
        String str = String.format("%05d", 9);
        System.out.println(str);
        
        //0以外の文字に置き換える
        String str2 = String.format("%15d", 9);
        System.out.println(str2);
        
        //なぜか空白になる場合の代替策
        String str3 = String.format("%5d", 9).replace(" ", "1");
        System.out.println(str3);
        
    }

}
```

実行結果

```
00009
              9
11119
```

#まとめ

調べていると0以外の数字でもx部分に代入すれば数字埋めができると書いてあったですが、1で埋めようとしたstr2では14桁の空白ができてしまっています。そのため空白を置き換えてみました。

※コメントでご指摘いただきました。この空白はクラスの仕様でした。申し訳ありません。
VMware WorkstationのNAT接続で詰まった話

VMware Workstatoin PlayerでNAT接続をしようとしたけど、外部と通信ができなくて困っていた話です。
NATの時に、外部と通信をするためのメモになります。文章は下手です。

# 環境
ホストOS：Windows10
ゲストOS：CentOS 7
仮想マシン：VMware Workstation 15 Player

#### ネットワーク構成
以下がNATを使用した時の、ネットワーク構成図になります。（VMwareのDocumentから）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331675/0402ae2f-f59d-4f62-f480-ef17be0c649b.png)

#### IPアドレス
NATを使用する際、仮想マシン、VMnet8、NATデバイスに割り当てるIPアドレスに制約があります。仮想マシンのIPアドレスは、DHCPを使用する場合とそうでない場合で、割り当てられる範囲が変わります。
第3オクテットは環境によって違うと思うので、Nにしました。
VMnet8：192.168.N.1
NATデバイス：192.168.N.2
仮想マシン
　- 固定IP：192.168.N.3 ~ 127
　- 動的IP：192.168.N.128 ~ 254

ちなみにNATデバイスのアドレスは‪C:\ProgramData\VMware\vmnetdhcp.confに以下のように記載されています。

```
[host]
# NAT gateway address
ip = 192.168.N.2/24
```


# ホスト側の設定
Windows側でVMnet8のIPアドレス設定を行います。
[コントロールパネル] > [ネットワークとインターネット] > [ネットワークと共有センター] > [アダプターの設定の変更] > [VMware Network Adapter VMnet8] 
VMnet8のプロパティからTCP/IPv4のプロパティを開きます。以下のアドレスに設定します。
IPアドレス：192.168.N.1
サブネットマスク：255.255.255.0
ゲートウェイ：192.168.N.2
![ネットワーク接続 2020_05_10 13_24_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331675/be255a1d-5193-5eb1-578f-16284e535926.png)


# ゲスト側
アドレス設定は以下のファイルに追記する。
/etc/sysconfig/network-scripts/ifcfg-{デバイス名}

####動的IPを設定する場合
```
BOOTPROTO=dhcp
GATEWAY=192.168.N.2
BROADCAST=192.168.N.255
```

####固定IPを設定する場合
```
BOOTPROTO=none
IPADDR=192.168.N.3 ~ 127
PREFIX=24
GATEWAY=192.168.N.2
BROADCAST=192.168.N.255
```

####DNSサーバーの設定
DNSサーバーのアドレスはVMnet8のIPアドレスになる。
/etc/resolv.confに以下を追記する。

```
nameserver 192.168.N.1
```

#おわりに
VMware Worktationでネットワーク設定を初めて行ったので、かなりてこずりました。公式ドキュメントを読むのをめんどくさがり、いろんなサイトを参考に試行錯誤したけど、結局、公式ドキュメントが一番参考になりました( ´∀｀ )
Python 最適化ライブラリ　Pulp

# 目的
Python実践データ分析１００本ノックを読んで、最適化ライブラリのPulpに興味が湧いたので、備忘録もかねて

#達成したいこと
整数をとる変数を使った最適化の簡単に行いたい
もちろん、For文を使った総当たりなら簡単にかけるし、一つづつパラメータを振りながら探ることもできるが、時間がかかるし、拘束条件の設定が面倒だったりする

#用いるライブラリ Pulpとortoolpy
Anacondaでコンソールから
`conda install -c conda-forge pulp`
`pip install ortoolpy`
でインストールできる

#サンプル

```sample.py
from pulp import LpVariable,lpSum,value
from ortoolpy import model_max,addvars,addvals

m=model_max()
v1={"x":LpVariable("vx",lowBound=0,cat='Integer'),
 "y":LpVariable("vy",lowBound=0,cat='Integer')}
m+=lpSum(v1["x"]+v1["y"])
m+=lpSum(v1["x"]*2+v1["y"])<=10
m+=lpSum(v1["x"]+v1["y"]*2)<=7
m.solve()

for k,x in v1.items():
    print(k,value(x))
print(value(m.objective))
``` 

``` output
x 4.0
y 1.0
5.0
```
mysqlでrootに接続できない時の対処法

```
$ mysql -u root
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
```
のエラーが出たので、やったことを書いていきます。

##MySQLの停止
既にMySQLが稼働している場合には一旦停止します。

```
$  service mysqld stop
```

##skip-grant-tablesオプション付きで起動
このオプションはMySQLの権限システムを使用しないで起動するためのものです。

```
$ mysqld_safe --skip-grant-tables &
```

再度接続します。

```
$ mysqld -u root
```

これでひとまずmtsqlに接続することはできました。
【RSpec】WARN Selenium [DEPRECATION] Selenium::WebDriver::Chrome#driver_path= is deprecated.の対処策

# 警告内容
こんにちは！
RSpecの学習を進めていく中で、下記の警告文が表示されたので、気になって調べました。
`WARN Selenium [DEPRECATION] Selenium::WebDriver::Chrome#driver_path= is deprecated. Use Selenium::WebDriver::Chrome::Service#driver_path= instead.`

deprecatedは日本語で非推奨という意味なので、
`Selenium::WebDriver::Chrome#driver_path= `
は非推奨であり、
`Selenium::WebDriver::Chrome::Service#driver_path=`
を使用した方がいいですよという内容ですね。

毎回動かす中で警告文が出てしまうのが気に障ったりすると思いますので、下記で対処しちゃいましょう！

# 対処法

```ruby:Gemfile
-  gem 'chromedriver-helper'
+  gem 'webdrivers', '~> 4.0'
```

これで対処できるはずです！
ちなみにwebdriversの3.0は恐らくzipファイルがないためエラー表示がされてしまいます。

一度警告文が出てしまった時はこちらで対応しましょう！
PMP試験に出てくるPESTLE分析を覚えよう！

# PESTLE分析とは
リスク分析に使える戦略フレームワークの１つ
PESTLE以外にも、TECOP、VUCAなどがあるぞ

## PMBOKのどこにでてくるのか
PMBOKガイドの`416ページ`の`11.2.2.5 Prompt Lists`にでてくるぞ

## PESTLE分析の要素
- Political
    - 政治的側面
- Economic
    - 経済的側面
- Sociological
    - 社会的側面
- Technological
    - 技術的側面
- Legal
    - 法的側面
- Environmental
    - 環境的側面

## PESTLEのテンプレート
- PESTLEのテンプレート例
    - https://www.groupmap.com/map-templates/pestle-analysis/

----

よかったよかった