OmniAICreator/Qiita-1.07M huggingface dataset:
Xojo で 時間のかかる処理の前にお手軽に表示をする

イベントハンドラ中、

```

Labe1.text= "お待ちください"
～時間のかかる処理～
```

をしようとしても、UIの更新はこのイベント処理が終わらないと更新しない。
「お待ちください」が終わった後に出てきて悲しい気持ちになる。

これを回避するには、タイマーやスレッド処理にする。プログレスバーなどで進捗を表示すればかっこいいが、ここでは簡単に、処理前にラベルに「お待ちください」を表示する方法。

タイマーを簡略に使う。

# デスクトップアプリ

- Timerを追加し、Timer1と名前を付ける。
- Methodを追加し、HeavyWorkと名前をつける
- HeavyWork中に時間のかかる処理を記述
- イベント処理中以下のコードを書く

```

Label1.text="お待ちください"
Timer1.CallLater(1000,AddressOf HeavyWork)
```
こう書くと、イベント処理が終わってUIが更新され、「お待ちください」が表示される。
Heavyworkは1秒後に起動される。

# Webアプリ


残念ながらCallLaterメソッドはWebTimerにはないのでもうちょっとちゃんと設定する必要がある。

- WebTimer を追加し、 Timer1と名前をつける
- Timer1 の BehaviorのModeをOffにする
- WebTimerのAction中に、時間のかかる処理を記述
- イベント処理中以下のコードを書く

```

Label1.text="お待ちください"
Timer1.Mode=1
```

このままだと Timer1 は一度しか動作しないので、処理が終わったら Timer.Mode=0 として Timer1 を再度発火可能にする。
Folding@Home Setup

# はじめに
ASRock Japanさんのツイートにより興味を持ったが日本語文献が少ないため書いた。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/%E6%8B%A1%E6%95%A3%E5%B8%8C%E6%9C%9BRT%E3%81%8A%E9%A1%98%E3%81%84%E3%81%97%E3%81%BE%E3%81%99?src=hash&amp;ref_src=twsrc%5Etfw">#拡散希望RTお願いします</a> <br>ASRockerでもそうでない人も<br>リソース余ってたり、stresstestしたい自作erかもーん！<br><br>新型コロナ解析で分散処理プロジェクト「Folding@home」<a href="https://t.co/4EheevUKsK">https://t.co/4EheevUKsK</a> <a href="https://twitter.com/pc_watch?ref_src=twsrc%5Etfw">@pc_watch</a>さんから <a href="https://t.co/pUtQyuQgPp">pic.twitter.com/pUtQyuQgPp</a></p>&mdash; ASRock Japan (@AsrockJ) <a href="https://twitter.com/AsrockJ/status/1243107649094184960?ref_src=twsrc%5Etfw">March 26, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 目次
* Passkey
* SetUp
* Windows
* Docker
* よくある問題

# Passkey
ユーザー登録みたいなもの。
使用することで個人の識別と結果の集計さらにポイントへのボーナスが付くので使用しておくと良さそう。
以下URLの公式サイトから取得
[https://apps.foldingathome.org/getpasskey](https://apps.foldingathome.org/getpasskey)

Nameに使用したい任意の名前、Emailにメールアドレスを入れて送信。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552014/b7a0c921-1bf6-6d96-9fb1-0ba489d3b0a2.png)

少し待てばメールが送信されPasskeyが取得完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552014/d5314e01-ce08-ece0-4eec-f3a2cde939ae.png)

# SetUp
## Windows
### Install
仮想環境に構築したWindows10 Home 1909を使用している。
公式サイトからダウンロード
[https://foldingathome.org/start-folding/](https://foldingathome.org/start-folding/)

ファイアウォールの設定が求められたらアクセスを許可。
インストールが完了するとブラウザが開くが、一旦無視して右下の通知領域からFolding@homeを右クリックしAdvanced Controlをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552014/ea44bd92-bca2-8e1e-0b54-80051f563286.png)

### Config
左上のConfigureをクリックしIdentity Tabを選択し下記の項目を入力しSave。

Name: Passkeyを登録した名前
Team: 任意のTeam Number(ASRock JapanさんのTeamに入る場合は252872)
Passkey: Emailに送信されたPasskey
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552014/77f9c05c-9943-f6e7-e7df-384a7f317486.png)

### Fold
Folding Powerは環境に合わせて設定　基本はMediumでいいと思う。
Foldをクリックすることで作業が始まる。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552014/1bd7d2f0-4565-66e6-50e7-424a522e7248.png)

## Docker
Dockerが入ってる環境の場合Dockerを使用することもできる。
Client: 19.03.8
Server: 19.03.8
Docker-compose: 1.25.3, build d4d1b42b

```yaml:docker-compose.yml
version: '3.7'
services:
  folding-at-home:
    image: johnktims/folding-at-home
    restart: always
    ports:
      - 7396:7396
    command: >
      -user={Passkeyに登録した名前}
      -team={任意のTeam Number(ASRock JapanさんのTeamに入る場合は252872)}
      -passkey={Emailに送信されたPasskey}
      -gpu=false
      -smp=true
      -power=full
```
# よくある問題
* Foldをクリックしたのに始まらない
 - Work Serverから仕事が来るのを待っています。
 - 少し待ってみましょう。
* 次の仕事が来ない
 - 定期的にWork Serverに仕事の問い合わせをしています。
 - Next Attemptに時間がかかる場合はリスタートするといいかもしれません。
* CPUまたはGPUの温度が高い
 - 長時間かかる仕事も来るため冷却性能、室温などを見直しましょう。
 - ノートパソコンの場合は厳しいかもしれません。
* Web Controlが無限にリロードしている
 - ブラウザのキャッシュをクリアすると直るようです。
 - 面倒ならシークレットウィンドウなどを使うといいかもしれません。
* ファンがうるさい
 - そのうちファンの音が心地よくなってくるかもしれません。
 - 悟りを開きましょう。
[Xcode]AutoLayoutoの罠 -なぜか余白がうまれる-


#作業環境
OS:macOS Catalina ver10.15.3
PC:MacBookPro 13inch 2018
Xcode:Version 11.3.1 
Swift:Version 5.1.3

#AutoLayoutoでなぜか余白ができてしまう
スマホ画面全体に画像を貼り付けたいため、[Add New Constraints]でConstrainsの値を「0」と入力した。だが、自動で「Standard」に変更されて余白が生まれてしまう。
<img width="392" alt="スクリーンショット 2020-03-28 14.42.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595751/674282ab-36b7-8e03-d08c-4675346abe96.png">

#解決策
storybord上の変更したいオブジェクト面をダブルクリック、値を「Standard」から「0」に変更すると解決する！
※この方法だと勝手に0→Standardに変換されない。
<img width="429" alt="スクリーンショット 2020-03-28 14.43.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595751/12f4a835-f6dc-b7d9-806a-00e8d5370b83.png">


#一言
[Add New Constraints]で勝手に0をStandardに変更されないでほしいよ😭


参考サイト：https://impreatesoft.jp/program/autolayout-bug/
バンドサークル管理webアプリ製作日記 - 問題提起

## あらすじ

前回は[旧アプリ](https://qiita.com/RINYU_DRVO/items/6607a0aa7ca3294f8e47)を開発した時の反省点を踏まえ、リプレイスする際にどのような流れで開発したらいいか、方針を出しました。

[バンドサークル管理webアプリ製作日記 - Introduction](https://qiita.com/RINYU_DRVO/items/d6f1e27749d01e2fdf75)

## この記事では

前回出した方針に沿い、開発の１サイクル目を進めていきます。
まずは`1.問題提起`を実施します

## 問題提起

ここで言う`問題`は、

```
①現状のサークルの問題
②現状のアプリケーションの問題
```
の2つが言えるが、最初のサイクルなので
①をメインに考えていきたいと思う。

現状言えるサークルの問題点を下記の通り出してみた。

```
1.誰がどのバンドに所属しているのか分からない。共有しにくい。
2.ライブにバンドを登録するのがめんどくさい。
　（ホワイトボードにまとめてから入力していた）
3.ライブテーブルが見にくい。公開に手間がかかる。
　みんなが参照しにくい。変更しにくい。
3.掛け持ちがちょくちょく問題に上がっている
  （上級者が掛け持ちしてしんどい＋初心者の登場機会が奪われる）
4.バンド募集はLINE上だと流れる。
  ノートもたぶん見る人があんまいない（検索しにくいからだと思う）
5.セッション・ライブ・飲み会の集金がめんどくさい
```

今後リリースしてレビューもらうサイクルで問題点はもっと出てくるし、
②の部分でも改善点は必ず出てくるので、
上記の問題点は逐次更新していくこととする。

ただし、
開発の1サイクルを小さく回し、レビューを細かく取りながら進めてたいので、
今回は**上記の問題点を一度に要件に入れない**事にした。
具体的には、

```
1.誰がどのバンドに所属しているのか分からない。共有しにくい。
2.ライブにバンドを登録するのがめんどくさい。
```

上記2項目を解決するための要件定義をする事にした。

## なぜ解決しないといけないか
バンドサークルはみんなで音楽を楽しみ、
時には演奏技術を切磋琢磨する場所。

なのに運営に手間がかかっては
音楽に集中できないし、
運営を進んでやりたいという人が
出てこないとサークルとしての活動は
成り立たない。

メンバー側においても、
バンドの募集やライブのスケジュール、
メンバープロフィールの拡散など、
必要だが手間がかかり、かつ共有しにくい作業により
練習時間や音楽について考える時間が削がれている。

本来の目的である、より音楽を楽しむ為、
音楽にかける**かけがえの無い時間**を１分でも増やす為に
`運営の手間を減らし`、`情報共有を円滑`にする
必要がある。


## 問題の原因は何か

それは管理の専用ツールが無い為。

みんなが使える・一番情報共有がしやすいという理由で
LINEを使用しているが、
データの管理としては機能不足。

足りない部分をアナログに頼っている。

## 解決策
その為、バンドサークルの運営や管理をシステム化する。
誰でも見やすく編集しやすいWebアプリケーションにし、
運営側の業務は管理権限とすることで
セキュリティを守りつつスムーズな管理を実現する。

## どんな効果が見込めるか
運営の手間が減り、情報共有が円滑になることで
サークル活動がより発展する。

サークルが大規模になっても、
運営はサークルのことを
いつどこでも把握することができる。

運営や管理に余裕が持てるようになり、
手が回っていなかったプロジェクトや
メンバーへの気配り等ができるようになる。

それによりメンバーも
サークルでの音楽活動をよりいっそう楽しむことができる。

## これをするとなぜ原因が解消されるのか
バンドサークル運営にフィットしたシステムを使用することにより、
サークル情報やライブ情報の入力、情報共有が容易になる。

メンバーはシステムに登録し、システム内でバンドを組むことにより
サークルやライブへの参加申請が容易になる。

システム内で参加申請ができると、運営側は把握しやすく、
そのままライブのタイムテーブル振り分けなどにデータを流用できる。

総じて運営・管理の手間が減る。

## これを採用した場合の弊害

#### メンバー側使用コスト

今まで口約束でバンドを組んで
LINEグループを作って連絡共有をしていたメンバーは
`システムに登録する`という一手間がかかってしまう。

バンドメンバー募集や他メンバー検索、
ライブのタイムテーブル共有等で
手間以上のバリューを出さないと
メンバー側に使うメリットが無い。

#### 利用コスト

現状確定はしていないが、規模が大きくなった場合
サーバ代収集の為に月額課金制となり、利益目的では無いサークルの
財政負担となる可能性がある。
（言うて行っても1000円/月程度だと思うが）

#### 導入コスト

使い始めは使う人・使ってない人に分かれてしまうと
ツールが違うことにより情報・管理がチグハグになる可能性がある。
1つのシステムで全員のデータを管理することによって
意味をなす為、使用してもらうことへの
理解がないと導入する時間が無駄になり本末転倒。

#### システムトラブルによる運営支障

システムが使えなくなった際に
ライブやイベントが行われていた場合、
用意していた情報が見れなくなり
進行が滞る可能性がある。
トラブルが無いようシステムやインフラ等の
内部要件を固めていくつもりだが
トラブルは起こり得るものと考える。

トラブルが起きた際はシステム制作側が
どのように迅速にリカバリするかが
重要となってくる。

## まとめ

プロダクトを進める上で把握しておかなければならない
全体の目的と、メリットデメリットを定義することができた。

次は`ユースケース`について考察する。

[バンドサークル管理webアプリ製作日記 - ユースケース](https://qiita.com/RINYU_DRVO/items/52d4e9458b49ffd959f5)

## バックログ

[バンドサークル管理webアプリ製作日記 - Introduction](https://qiita.com/RINYU_DRVO/items/d6f1e27749d01e2fdf75)
[バンドサークル管理webアプリ製作日記 - 問題提起](https://qiita.com/RINYU_DRVO/items/d73c8c9c8732fbbd1a3f)
[バンドサークル管理webアプリ製作日記 - 競合比較](https://qiita.com/RINYU_DRVO/items/849cf034095977b5f57e)
[バンドサークル管理webアプリ製作日記 - ユースケース](https://qiita.com/RINYU_DRVO/items/52d4e9458b49ffd959f5)
[バンドサークル管理webアプリ製作日記 - 要件定義](https://qiita.com/RINYU_DRVO/items/66ec54bee76a68cc0e09)
Vue routerについて調べたこと

# vue routerについて

- ルーター対応アプリで、ユーザーナビゲーションを有効にするためのコンポーネント
- ターゲットの場所は、`to`プロップで指定する

```vue
<router-link to="/foo">Go to Foo</router-link>
```

# 使用するコンポーネント
Vue Routerでは、二つのコンポーネントを使う
1. `router-link`・・・リンクを作成するためのもの
2. `router-view`・・・それぞれのリンク先に基づいた内容を表示するためのもの
3. `router-view`が、`/`だったら、routervieの中身がHome.vueになり、`/Users`であれば、Users.vueになる
4. URLの内容によって、`router-view`の中身が変わる、動的コンポーネントのようなもの a


# 使用するに当たって設定すべき事項

- Vue.use()とすることでプラグイン(router)を使用できるようにする
(Vue.jsが公式で提供してるプラグインを使うためのもの)

```router.js
 import Router from "vue-router";
Vue.use(Router)
```


- 表示させたいページを作る(HomeとUsersの2ページ作ってみます)

```Home.vue
<template>
 <div>
   <h3>Home</h3>
 </div>
</template>
```

```Users.vue
<template>
 <div>
   <h3>Users</h3>
 </div>
</template>
```

- 表示させたいページへのルートをかく
 - このURLの場合は、このコンポーネントを表示する、というもの
 - URLとコンポーネントをマッピングする作業
 - routesは配列になっててその中はオブジェクトでかける

```router.js
 new Router({
    routes:[{path: '/', component: 'Home'}, {path: '/users.vue', component: 'Users'}]
  })
```

- 最初のページをHomeにするが、作成したHome.vueをインポートさせる必要がある

```router.js
import Home from './Home.vue';
```

- new Routerをexport させる


```router.js
export default new Router({
    routes:[{path: '/', component: 'Home'}, {path: '/users.vue', component: 'Users'}]
  })

```
- routerの中身をvue.jsに適用させる
- main.jsの中で、ルーターの中身をVue.jsに適用させる
 - routerの中身は、router.jsの中で、`export default`してる部分
- new Vue　のなかでrouterを登録する
 - (`router.js`で書いた)`Vue.use`とかくことで、使用できるようになる

```main.js
//⬇︎ここ
import router from './router.js';

new Vue ({
//⬇︎ここ
 router: router,
 render:h =>(App)
}).$mount('#app');
 ```

ここまで書いても、そのままURLにHomeやUsersと書いても、App.vueが表示されてしまう
ので、どうするかというと、、

```App.vue
<template>
 <div>
<!-- 動的コンポーネント的な動きをする -->
  <router-view></router-view>
 </div>
</template>
```
その上で、urlにUsersなどと入力すると、Usersページを表示することができる
つまり、**URLの内容によって、`<router-view>`の表示するものが変わってくる！**ということです


## ちなみに。。　
- そのままでは、URLに#がついて、それ以降にUserと入力すると、
<router-view>の部分にUsersのコンポーネントが表示されるが、この#を表示したくない場合は、
router.jsの部分に、`mode:'history'`と書くことで、#が消えた状態でURLを表示することができる
- しかし、毎回index.htmlを返す、という処理を書いておかないとerrorがでる

```router.js
Vue.use(Router);
export default new Router({
//⬇︎こんな感じ
 mode:'history',
 routes:[{path: '/', component: 'Home'}, {path: '/users.vue', component: 'Users'}]
  })
```
【Rails】検索キーワードを空白で2つに分ける

# はじめに
Itemモデルを検索する想定で中身は下記とする。

|id|name|
|------|----|
|1|test|
|2|sample|
|3|test sample|


# やりたい事
検索フォームにて空白（スペース）を含むキーワードが入力された場合、
空白を境に文字を分けそれぞれのキーワードで検索を行い結果を返したい。

```ruby:items_controller.rb
    # 例えば下のキーワードで検索された場合
    @keyword = "test sample"
    # そのまま検索しようとすると
    @items = Item.where("name LIKE ?", "%#{@keyword}%")
    # 結果は"test sample"という文字列を含んだid:3のItemのみが返ってくる
    @items.ids => [3]
```
今回は「test sample」のキーワードで検索された際に、
Itemモデルのデータ全てを返せる事をゴールとする。

# 1.検索キーワードを空白で分ける
まずはキーワードの内の空白を検知して分割する為に`split`メソッドを使う。

```ruby:splitの使い方
    "対象の文字列".split("区切りにする文字","分割する回数")
    # 分割する回数は省略可、省略した場合は区切りにする文字全ての箇所で分割する。
    # またsplitは配列の形でデータを返すので注意
```
実際に使用して書き換える。

```ruby:items_controller.rb
    @keyword = "test sample"
    @keywords = @keyword.split(/[[:blank:]]+/)
```
ここで区切りにする文字として指定した正規表現の内容は、
`[[:blank:]]` → 空白演算子、半角・全角両方の空白を対象にする為。
`+` → 空白が連続して入力された場合でも対応できるようにする為。
# 2.分割したキーワード毎に検索を行う
```ruby:items_controller.rb
    # 分割したキーワード毎に検索を行いインスタンスにセット
    @keywords.each do |keyword|
      @items = Item.where("name LIKE ?", "%#{keyword}%")
    end
```
`split`は配列でデータを返すので`each`メソッドで中身全てを取り出す。
# 3.結果
```ruby:items_controller.rb
    @keyword = "test sample"
    @keywords = @keyword.split(/[[:blank:]]+/)
    @keywords.each do |keyword|
      @items = Item.where("name LIKE ?", "%#{keyword}%")
    end
    @items = @items.order("id ASC")
    @items.ids => [1, 2, 3]
```
# 4.最後に
検索の機能でまず実装しようと思ったのがこれだったので備忘録として。
他にも色々必要な機能があると思うので考えていきたいと思います。
Firebase メールとパスワードによる認証

下記書籍を参考に実施
[サーバーレス開発プラットフォーム Firebase入門 ](https://www.shuwasystem.co.jp/book/9784798057750.html)

【結果】下記2ケースを実施し両者とも実現できることを確認
①自分でUIを作成する(P70～P75)
②Firebase UIを利用する(P90～P95)

【補足】カスタマイズのしやすさを考え①で作成を考えている
PDOの静的プレースホルダで整数をバインドするとけったいな結果になるケース

PHPの提供するデータベースアクセスライブラリPDOの挙動について調べていて、動的プレースホルダ（Prepared Statementのエミュレーション）の場合については以下の記事にまとめました。

[PHP 7.2以降におけるPDO::PARAM_INTの仕様変更]
(https://blog.tokumaru.org/2020/03/php-72-pdo-param-int.html)

では静的プレースホルダ（Prepared Statement）の場合はどうかというと、中々にカオスな状況になっておりまして、まだまとめられていませんが、特徴的なトピックスについてこちらに書いてみます。

PoCを以下に示します。

```PHP
<?php
  $db = new PDO("mysql:host=HOST;dbname=DBNAME;charset=utf8", USER, PASSWORD);
  $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);  // 静的プレースホルダ
  $ps = $db->prepare("SELECT :num");
  $ps->bindValue(':num', 2147483648, PDO::PARAM_INT);
  $ps->execute();
  $row = $ps->fetch(PDO::FETCH_NUM);
  echo "result = ${row[0]}\n";
```

単にプレースホルダに2147483648をバインドして、それをSELECTして表示しているだけです。
これをCentOS6, CentOS7, CentOS8のそれぞれ（32ビットが版が存在するCentOS6は、32ビットと64ビットの両方）で動かしてみた結果は以下のとおりです。なお、PHPはCentOSの標準パッケージのものです。

CentOS6 (32ビット)、CentOS8:  2147483648
CentOS6 (64ビット)、CentOS7: -2147483648

なぜそうなるかは調べてあるのですが、まずはクイズとして出題してみます。分かる人、いますか?
正規表現についてjQuery

アプリ開発の中でuser登録の際バリデーションに合わせviewで使用したjQueryの正規表現をメモします。
今回、　!　.match　を使い正規表現で無い場合は使いerrorを返し、
errorの場合ブロックを表示したり非表示したり枠の色変えたりというものです。


#例）メールアドレス

```.js
$(function(){
  $('.email').on('blur',function(){
    let error;
    let value = $('.email').val();
   //valueがhoge@hoge.hogeの型でない場合error
    if(!value.match(/.+@.+\..+/g)){
      error = true;}
   //もしerrorなら下記ブロックを表示もしくは非表示したり枠の色変えたり
    if(error){
      $('.email-error').show();
      $('.email').css({'border':'1px solid #ea352d'});
    }
    else{
      $('.email-error').hide();
      $('.email').css({'border':'1px solid #ccc'});
    }
  });
});
```
#今回使用した正規表現たち
メールアドレス　hoge@hoge.hogeの型
`value.match(/.+@.+\..+/g))`
パスワード　７文字以上半角英数含む
`value.match(/^(?=.*?[a-z])(?=.*?\d)[a-z\d]{7,}$/i)`
名前　全角ひらがな漢字
`value.match(/^[あ-けー-龥　]+$/)`
名前　全角カタカナ
`value.match(/^[ァ-ンヴー]*$/)`
#使用頻度の多そうな正規表現たち
半角数字が含まれる
`value.match(/\d/);`
半角数字のみ
`value.match(/^\d+$/);`
英字が含まれる
`value.match(/[a-zA-Z]/);`
英字のみ
`value.match(/^[a-zA-Z]+$/);`
ひらがなのみ
`value.match(/^[\u3040-\u309f]+$/);`
カタカナのみ
`value.match(/^[\u30a0-\u30ff]+$/);`
半角カタカナのみ
`value.match(/^[\uff65-\uff9f]+$/);`
全角のみ
`value.match(/^[\u3040-\u30ff]+$/);`
URLかどうか(半角英数字)
`value.match(/^(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)$/)`

他にも調べる色々あると思いますし、言語によって？正規表現が違ったりすると思いますので、
ちらっと参考程度にお手柔らかに見て頂ければと思います。
Webサーバー　nginx Apache

プログラマーとして働きはじめて、半年が経過し、従事した案件で学んだことをメモとして残していく。

今回、環境構築で色々なことを学びました。その中でもWebサーバーについて、メモを残します。
大まかな理解で書いているので、間違いがあれば、ご指摘頂けると嬉しいです。



まず、Webサーバーとは何か。

・クライアントとサーバーの間では、「リクエスト」と「レスポンス」が行ったりきたりすることになっていて、
　プラウザーが見に行っているサーバーが「webサーバー」である。

その「Webサーバー」には有名なものとして、以下の３種類がある。
・Apache
・Nginx
・IIS

半年の間に、二つのWebサーバーを使用しました。

注意点として、作成中のアプリに設定したWebサーバーを起動させる必要があると学びました。

設定しているWebサーバーがnginxであるのに、Apacheが起動しているとうまく起動してもらえないということが
よくありました。

そのため、windowsであれば、タスクマネージャーを起動し、どのWebサーバーが起動しているのか確認する必要があります。
（設定しているWebサーバーでないものが起動してる場合は、起動停止させる。）

以下、、Nginxについて

nginxの設定ファイルに不備がある場合は起動しません。

コマンドに、nginx -t と入力すると設定ファイルを検証できます。
syntax is ok や　test is successful が出ていればokです。

failed が出ている場合は、nginx.confなどの設定ファイルを確認する必要がある。
C++における構造体のコンストラクターを用いた初期化

# はじめに
この題についてネット上で容易に情報を見つけることができなかったので、ここに記述します。
参考文献：C++によるプログラミングの原則と実践 page 299
# 本題

次のような構造体を定義したとする。

```c++
struct Account { // 銀行口座
    std::string name; // 名義
    int balance; // 残高

    Account(std::string n, int b) {} //コンストラクター
};
```

次のような初期化は動作する。

```c++
Account stroustrup {"Bjane", 19501230};
Account ezoe = {"Ryo", 44290};
Account takahasi = Account{"Naohiro", 4205000};
Account yokoyama("Kouki", 60); //C++98の古いスタイル
```

次のような初期化は失敗する。

```c++
Account Kazimierz;
```

コード全体を次に記述する。

```c++
#include <string>

struct Account { 
    std::string name; 
    int balance;

    Account(std::string n, int b) {} 
};

int main() {
    Account stroustrup {"Bjane", 19501230}; //ok
    Account ezoe = {"Ryo", 44290}; //ok
    Account takahasi = Account{"Naohiro", 4205000}; //ok
    Account yokoyama("Kouki", 60); //ok

    Account Kazimierz; //エラー
}
```
Railsの既存AppをDockerに切り替える際に役立つ記事

#既存のAppをDockerに切り替える
過去に制作したRailsアプリをDockerで構築したいと思います。


## 参考になる記事
基本的にこの記事を使って、進めていきました。
[Ruby on Rails 「途中まで作ったアプリにDockerを導入したい」に挑戦してみる（MySQL / Sequel Pro)](https://qiita.com/majorboy/items/9fbfc78fc7bbc1f35e77#comment-60a244ed29cedf06555d)


build時のエラーが出たら、下記の資料が役立ちます。
[Docker docker-compose up時、You must use Bundler 2 or greater with this lockfile.　という地獄のエラー](https://qiita.com/avicii2314/items/769aacd3b5b949dcbcb8)

1. Gemfile.lockの記述を削除して、空状態にする。（Dockerに切り替える際に阻害してしまう）
2. Dockerfileのbundlerのバージョンを指定（RUN gem install bundler -v 1.3.0）
3. $ docker-compose run web bundle install
4. 改めてbuildする

これで進めました

```docker:docker
FROM ruby:2.5.1

RUN apt-get update -qq && \
    apt-get install -y build-essential \ 
                       libpq-dev \        
                       nodejs      

RUN mkdir /app_name 

ENV APP_ROOT /app_name 
WORKDIR $APP_ROOT

ADD ./Gemfile $APP_ROOT/Gemfile
ADD ./Gemfile.lock $APP_ROOT/Gemfile.lock

RUN gem install bundler -v 1.3.0
RUN bundle install
ADD . $APP_ROOT
```

[Ruby | bundler を特定のバージョンに切り替えて実行する](https://qiita.com/YumaInaura/items/64e5721549e4927ce85f)

起動する際にエラーが出た場合
[docker-compose up したらdriver failed programming external connectivity on endpointが出てきた](https://qiita.com/MitsuguSueyoshi/items/50f8465680aa462a4191)
JavaScriptの主要な組み込みオブジェクトまとめ

#組み込みオブジェクトとは
Javascriptに標準で組み込まれているクラスを、組み込みオブジェクトと言います。

#オブジェクトの種類
###Number
数値を扱うラッパーオブジェクト

###String
文字列を扱うラッパーオブジェクト

###Boolean
審議値を扱うラッパーオブジェクト

###Array
配列を扱うオブジェクト

###Function
関数を扱うオブジェクト

###Object
全てのオブジェクトのベースとなるオブジェクト

###Date
日付や時刻を扱うオブジェクト

###RegExp
正規表現を扱うオブジェクト

###Error
例外情報を扱うオブジェクト

###Math
数学的な定数と関数を提供するオブジェクト

###JSON
JSON形式のデータを操作する機能を提供するオブジェクト

#チュートリアル 
https://developer.mozilla.org/ja/
FlutterでColorをFirestoreに保存して、Colorとして取り出す


Firestoreではもちろん、Colorという型は保存できません。ですが、FirestoreにColorを保存したい場合どうしたらいいかを考えました。


## 保存するときはStringで保存する

まずは保存するときは、Stringで保存しました。
FlutterのColorクラスはtoString()にしたときに、いい感じにカラーコードに変換してくれます。

Flutter内部で下記のような実装になっています。

```dart
@override
  String toString() => 'Color(0x${value.toRadixString(16).padLeft(8, '0')})';
```

そこでFirestoreにはこのまま保存しました。

こんな感じ

```
MaterialColor(primary value: Color(0xff2196f3))
```


## 取り出すときはIntで取り出す。

取り出すときはIntで取り出しました。

```dart
int get color {
    String valueString = _color.split('(0x')[1].split(')')[0];
    return int.parse(valueString, radix: 16);
  }
```

そして取り出したら、ColorクラスにこのIntを渡せば、表示されます。

```
Color(widget.model.color)
```

以上です。
Visual Studio ソリューションテンプレート

# 1.環境
Visual Studio 2019 Community 2019 Version 16.4.3
Windows10 64bit 1809

# 2.テンプレートの作成

## 2-1.プロジェクトの作成
[C#]-[Windows]-[機能拡張]を選択し、"C# Project Template"を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187121/bc1c8fa7-4a02-be6b-c680-bcfd1dab29aa.png)

＃2-2.参考情報

https://docs.microsoft.com/ja-jp/visualstudio/ide/how-to-create-multi-project-templates?view=vs-2019

https://www.ecanarys.com/Blogs/ArticleID/180/Create-custom-project-templates-in-Visual-Studio

# 3. ソリューションテンプレートの作り方

# 3-1. ソリューションテンプレートファイルの修正

.vstemplateファイルのTypeを"Project"から"ProjectGroup"にする。

ProjectCollectionタグにProjectTemplateLinkを追加する。

```xml

    <ProjectCollection>

      <ProjectTemplateLink ProjectName="$projectname$.Domain" CopyParameters="true">

        DDDSample.Domain\MyTemplate.vstemplate

      </ProjectTemplateLink>

      <ProjectTemplateLink ProjectName="$projectname$.Infrastructure" CopyParameters="true">

        DDDSample.Infrastructure\MyTemplate.vstemplate

      </ProjectTemplateLink>


    </ProjectCollection>

```

## 3-2.各プロジェクトファイルのテンプレート作成

ソリューションに含まれているプロジェクトの数だけ、テンプレートのエクスポートを実行する。

・テンプレートの種類の選択では「プロジェクトのテンプレート」を選択
・テンプレートのオプションの選択では「テンプレートを自動的にVisual Studioにインポート」のチェックを外す

作成されたzipは展開する。

## 3-3.各プロジェクトの依存関係の設定
プロジェクト内の*.csprojファイルを編集する必要がある。

例として「MyApp」というソリューションに「MyApp.Domain」と「MyApp.Infrastructure」というプロジェクトが存在するとする。
InfrastructureはDomainを参照する場合について説明する。なお
「MyApp」はテンプレートなので可変で、Domain、Infrastructureは固定となる。

Infrastructureのcsprojファイルを開き、以下のように設定する。

```xml

  <ItemGroup>
    <ProjectReference Include="..\$ext_safeprojectname$.Domain\$ext_safeprojectname$.Domain.csproj">
      <Project>{97b2ddcf-cb5a-4e25-aa31-671f23f18f1f}</Project>
      <Name>$ext_safeprojectname$.Domain</Name>
    </ProjectReference>
  </ItemGroup>
```

## 3-4.Testプロジェクトの参照エラー

Nugetパッケージの復元しても参照エラーが解決されなかった。
Nugetパッケージの参照パスの階層を修正する必要があった。

```text
修正前：<HintPath>..\packages\～
修正後：<HintPath>..\..\packages\～
```

ソリューションを右クリックして、Nugetパッケージの復元を行った後に
パッケージマネージャコンソールで「Update-Package -Reinstall」
を行うと、参照エラーは解決する。
Tableau：意外と奥が深い「網掛けの書式設定」について整理する

Tableauでは「網掛けの書式設定」の設定機能で、行・列ごとに色付けができます。
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548159/ad6f98c6-a15f-3486-4b51-8f260f55b0e8.jpeg)
どちらかというと陰が薄い機能ですが、意外と奥が深いので整理してみます。

「網掛け」は二つのことを理解すると簡単に使いこなすことができます。

それは、<b>「バンドサイズ」と「レベル」です。</b>

<h1>バンドサイズとは

「バンドサイズ」とは簡潔にいうと、<b>「網掛けで色付けする厚さ」</b>です。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548159/c9a35dd3-cb95-b444-6643-db5c465d6577.png)
上のやつだと、2行ごとで色付けがされているのでバンドサイズは2になりますね。

そしてこのバンドサイズは、サイズ(厚さ)を調整することが可能です。

やり方は簡単です。

操作したいディメンションを右クリック→左メニューから「網掛けの書式設定」選択しましょう。

なんだか変なスライダーがありますが、こちらも仕組みはシンプルです。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548159/3407d7c6-1000-6a0b-32ab-954d8ea4c14e.png)
このスライダーで網がけの行数を変更することができます。
左から、0・1・2・3・4・5と変化します。一番左は1行ではないので気をつけましょう。

↓こんな感じで変化していきます
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548159/7bcb317d-eb90-14cb-8822-f420f814abcc.png)

<h1>レベルとは

「レベル」とは簡潔にいうと、<b>「網掛けをどれくらいの細かさで行うか」</b>です。
実際の画面でみた方が実感が湧きやすいのでそちらで見ていきましょう。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548159/afa8236a-79dc-524e-dda7-e7616754bb4b.png)
上のシートですが、行に「年」「四半期」「月」の三つが配置されています。

なので網掛けとしては年別で色分け・四半期で色分け・月で色分け、の3つのタイプがあり得ます。

それをこの「レベル」で調節するというわけです。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548159/4dabcabe-09a1-63e5-ccc3-799a581a7ec9.png)
バンドサイズと似たような仕様ですが、スライダーでどのレベルで網掛けするかを変更することができます。

左が大きい枠組み(粒度)で、右に行くほど細かい枠組みになります。

今回では、年・四半期・月がディメンションなので、

- 一番左：年で網掛け

- 真ん中：四半期で網掛け

- 一番右：月で網掛け

となります。

↓こんな感じで変化します
![7.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548159/4c478195-56c4-0686-fc5e-6804d7a016d6.gif)

<h1>網掛けを応用してハイライトする

最後に網掛けを応用した使い方をご紹介します。

仮に自分が「家電事業部の部長」だったします。
以下の画像のように、家電カテゴリのみをハイライトで強調したいというケースを考えて見ましょう。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548159/242a59ec-cdc1-f488-1542-10cf4410434b.png)
仕組みとしては、

- バンドサイズ：家具1行のみを網掛けしたいので、スライダーは左から2番目。

- レベル：家具とそれ以外とで分けるので、一番大きい枠組みで分ける。スライダーは1番左。

という方向性で出来るはずです。早速作ってみましょう。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548159/ce1cbd1d-b5a2-3436-cbea-598fb4d542a1.png)
上のような構成にしました。
ポイントは、

- カテゴリ="家電"　の計算フィールドを作成し、「家具」かそれ以外を判定する計算フィールドを作成

- バンドサイズを左から2番目、レベルを1番左にする

です。

これで概ねできたように見えますが、強調したい家具が白、それ以外が灰色となっています。

出来れば、強調したい部分を灰色としたいところです。

策としては次の2つです。

- 一旦全ての行を書式設定の「シート」、「ペイン」で灰色にする
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548159/57489dd1-ff09-bffe-7026-4c35245ba1d4.png)

- バンドサイズと、レベルを調整して家電以外のものを白にする
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548159/7f7a80d7-b205-31ba-8db6-0cd552d90552.png)

すると、無事上塗りされて強調したい家電のみが灰色になりました。(もしかしたらもっとスマートなやり方があるかもしれません)

意外と網掛けって奥が深い機能ですよね。
一見難しそうに見えますが、「バンドサイズ」と「レベル」を押さえていれば簡単に使いこなすことが可能です。
GPUからHello World!

先行研究
--------

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ガチ勢しかいないが、私は今日Hello Worldだけでここに来た。<br> <a href="https://twitter.com/hashtag/rust_jp?src=hash&amp;ref_src=twsrc%5Etfw">#rust_jp</a></p>&mdash; 錆びありはぐれベアメタル (@LDScell) <a href="https://twitter.com/LDScell/status/1067013050509619200?ref_src=twsrc%5Etfw">November 26, 2018</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

----

Accel: GPGPU Framework for Rust
--------------------------------
- [RustでCUDAカーネルを書く](https://qiita.com/termoshtt/items/b98d5c46ab9c1ab1f7b6)
- [Accel: GPGPU framework for Rust](https://qiita.com/termoshtt/items/41b4e23c4ce5e822319c)
- 2017末に開始~2,3ヶ月で停止
    - `nvptx64-nvidia-cuda` ターゲットを追加するためにrustcにパッチ当てたりしないといけなくてつらかった
    - proc-macroさえ安定化してなかった...
- rust-cuda WGが2019/1くらいに発足
    - libcoreまで公式のrustupで配布されてる
    - stdsimdの成果として [core::arch::nvptx] にLLVMバックエンドのintrinsicsがある
- 2020/1~再開
    - GitLabに移行 https://gitlab.com/termoshtt/accel
    - 0.3.0開発中...

[core::arch::nvptx]: https://doc.rust-lang.org/core/arch/nvptx/index.html

-----

CUDAのprintf / PTX system call
-------------

```c
#include <stdio.h>

__global__ void test() {
    printf("Hello world from %d of %d\n", threadIdx.x, blockDim.x);
}
```

この `printf` はCPUの方に命令を投げないといけないので、CUDAのコンパイル時には[PTX system call](https://docs.nvidia.com/cuda/ptx-writers-guide-to-interoperability/index.html#system-calls)にある `vprintf` の呼び出しに変換されて、実行時にはドライバによって管理されます。システムコールには以下の４つがあり、それぞれ [core::arch::nvptx] に対応する命令がある

- `vprintf`
- `malloc`
- `free`
- `__assert_fail`

-----

`print!` macro
-------

- Rustの`print!`などは内部でメモリ確保を行うのでlibcoreにはない 
- 最近stdからメモリ確保だけを必要とする部分を分離したalloc crateというのがある
    - Global Allocatorさえあれば動く
        - malloc/freeがPTX system callにあるので動く
    - `format!`マクロはあるので文字列には出来る
    - しかし標準出力はstdにしか無い
        - なので vprintf system callに文字列を上げる

```rust
#[macro_export]
macro_rules! print {
    ($($arg:tt)*) => {
        let msg = ::alloc::format!($($arg)*);
        unsafe {
            ::core::arch::nvptx::vprintf(msg.as_ptr(), ::core::ptr::null_mut());
        }
    }
}
```

-----

Hello World!
-------------

```rust
use accel::*;
use accel_derive::kernel;

#[kernel]
pub fn print() {
    let i = accel_core::index();
    accel_core::println!("Hello from {}", i);
}

fn main() -> anyhow::Result<()> {
    let grid = Grid::x(1);
    let block = Block::x(4);
    let device = driver::Device::nth(0)?;
    let _ctx = device.create_context_auto()?;
    print(grid, block)?;
    Ok(())
}
```
【初心者向け】PHPマスター講座 vol.1（文字列を学ぼう）

みなさんこんにちは！けいです

今日から復習の意味も込めて
Qiitaでの投稿を始めていきます。

今後のQiitaでの投稿は可能な限り

**【プログラミング初心者でも迷わずに理解できる構成】**でまとめていきます。

もし記事内容に誤り及び不明点があれば都度コメントでいただければと思います！

それでは早速、本題にいきましょう。

#【PHPマスター講座】文字列とは

====================================

###▶︎Print構文を一言で表すと🐼？

print(プリント)は印刷するという意味の英語で

ようは

**【文字列をサイト上で表示（印刷）するよ！】**

という（直感でわかりやすい）意味です。

Print構文の書き方はコチラ↓↓

`print 文字列`

print自体は関数ではないので
引数の文字列を括弧()で囲む必要はありません。

====================================

###▶︎Print構文って、どうやって使うの🐼？

####💡ポイント💡
・文字列の中で「'」を使いたい場合
▶︎**文字列全体を「"」で囲む**

・文字列の中で「'」「"」の両方を使いたい場合
▶︎**「"」の前に【\】を必ず記載する**

・「.(ドット) '追記したい文字'」を使うことで
▶︎**「文字列連結（つなげて文字をかける）」が可能**
▶︎**ドットの前後は「半角スペースで空欄」を作ると確認しやすい**

・printの中の最後に「"\n」を記載することで
▶︎**「改行」した状態で表示することが可能**

まずは説明をする前に
実際に例文を一つ見ていきましょう。

たとえばあなたが

「わたしはPHPを勉強しています」と英語が書く場合は

`print("I'm studying \"PHP\".");`

上記のように書くと

【表示結果】
I'm studying "PHP".

このようにサイト上で
文字列を表示（印刷）することができます♪

たとえば

`print("I'm studying \"PHP\".");`
`print("I'm studying \"Python\".");`

上記のような形で
2つ連続した文字列を書く場合

サイト上でどのように表示されるのかと言うと・・・

【表示結果】
I'm studying "PHP".I'm studying "Python".

上記のように**「改行されないまま文字列が連続で表示されてしまう」ので、対策として「\n（エスケープシーケンス）」を足します。**

`print("I'm studying \"PHP\". " . "\n");`
`print("I'm studying \"Python\". " . "\n");`

【表示結果】
I'm studying "PHP".
I'm studying "Python".

さっきの改行なしと比べると
かなりスッキリしますよね！

####💡ポイント💡
・文字列の中で「'」を使いたい場合
▶︎**文字列全体を「"」で囲む**

・文字列の中で「'」「"」の両方を使いたい場合
▶︎**「"」の前に【\】を必ず記載する**

・「.(ドット) '追記したい文字'」を使うことで
▶︎**「文字列連結（つなげて文字をかける）」が可能**
▶︎**ドットの前後は「半角スペースで空欄」を作ると確認しやすい**

・printの中の最後に「"\n」を記載することで
▶︎**「改行」した状態で表示することが可能**

こんな感じですね😌


====================================

###▶︎echoとprintとの「違い」は🐼？

echoでもprintでも

「文字列」を出力することができますが… 

先に結論からお伝えすると

主な違いは「下記の3つ」です。

-------------------------------

**①echoは戻り値を持たない**
（printの戻り値は常に1）

**②echoは複数の文字列を出力できる**
（printは1つしかできない）

**③echoは引数を複数セット可能**
（printで指定できる引数は1つだけ）

-------------------------------

一つずつ順番に解説していきます。

###①echoは戻り値を持たない（printの戻り値は常に「1」）

-------------------------------

・echo は文（statement）なので
【他の式や文の一部として使うことができない。】
＋（戻り値を持たない）

・print は式（expression）なので
【他の式や文の一部として使うことができる。】
＋（戻り値を常に1）

-------------------------------

上記のようになります。

具体例としては下記です。

・一つ目（echo）
`$greeting = echo "Hi Nice to meet you!"; `

・二つ目（print）
`$greeting = print "Hi Nice to meet you!"; `

一つ目（echo）は戻り値がないので
▶︎「エラーが出力」されます。

二つ目（print）は、戻り値があるので
▶︎「正常に出力」されます。

###②echoは複数の文字列を出力できる（printは1つしか不可）

こちらはタイトル通りの意味ですが
ざっくりとした構文イメージも載せておきますね。

・構文イメージ（echoの場合）
`echo(string 文字列1 [, string 文字列n ... ] )`

・構文イメージ（printの場合）
`print(string 文字列 )`

ようは

・【echo】文字列を複数セットできるか
・【print】文字列を一つしかセットできない

この違いしかないので、想像よりもだいぶシンプルです！！

###③echoは引数を複数セット可能（printで指定できる引数は1つだけ）

・一つ目（echo）
`echo "Hello", "My name is ○○";`

・二つ目(print)
`print "Hello", "My name is ○○";`

一つ目（echo）は、引数を複数セットできるので
▶︎「正常に出力」されます。

二つ目(print)は、引数を一つしかセットできないので
▶︎「エラーが出力」されます。

上記のとおりです。

ただし、echoではカンマ「,」区切りで複数の文字列を指定できるのに対し、printではそれができません。

※echoで括弧「()」をつけた場合、カンマ「,」区切りでの複数指定はできず、かつ括弧「()」で括って複数指定する場合、エラーが出るので注意して下さい。

====================================

さて、今回のPHPマスター講座 vol1（文字列を学ぼう）はここまでとなります！

少しでもあなたのPHP学習のお役に立てれば幸いです😌
【ECCUBE4】異なる管理メンバーが登録した商品を同じカートに入れられないようする。【マーケットプレイス化】

# 目的
マーケットプレイス型ECのように、管理メンバーごとの商品管理・受注管理をできるようにカスタマイズしていきます。
主にカスタマイズする場所は下記です。
・商品管理
・受注管理

---

# 方針
メンバーに割り当てられているcreator_idを活用します。

---

# 今回すること
・メンバーが登録した商品しか管理画面商品一覧表示されるようにします。
・異なる管理メンバーが登録した商品を同じカートに入れられないようにします。

---

## メンバーが登録した商品しか管理画面商品一覧表示されるようにします
こちらをそのまま記載します。
https://a-zumi.net/eccube4-admin-product-list-by-menber-customizer/

---

## 異なるメンバーが登録した商品は同じカートに入れられないようにする

---

受注を管理するため、同じメンバーの商品しかカートに入れられないようにします。

```app/Customize/Service/Cart/ProductCreatorCartAllocator.php
<?php
namespace Customize\Service\Cart;

use Eccube\Entity\CartItem;

/**
 * 販売種別とcreator_idごとにカートを振り分ける CartItemAllocator
 */
class ProductCreatorCartAllocator implements \Eccube\Service\Cart\CartItemAllocator
{
    /**
     * 商品の振り分け先となるカートの識別子を決定します。
     *
     * @param CartItem $Item カート商品
     * @return string
     */
    public function allocate(CartItem $Item)
    {
        $ProductClass = $Item->getProductClass();
        if ($ProductClass && $ProductClass->getSaleType()) {
            $salesTypeId = (string) $ProductClass->getSaleType()->getId();
            return $salesTypeId . ':' . $ProductClass->getProduct()->getCreator()->getId();
        }
        throw new \InvalidArgumentException('ProductClass/SaleType not found');
    }
}
```

```app/config/eccube/packages/cart.yaml
services:
    Eccube\Service\Cart\CartItemAllocator:
        class: Customize\Service\Cart\ProductCreatorCartAllocator
```

```src/Eccube/Resource/locale/messages.ja.yaml
-front.cart.divide_cart: 同時購入できない商品がカートに含まれています。
+front.cart.divide_cart: 作者ごとにお買い上げが必要です。
```

---

# 宣伝
ハンドメイド猫グッズ専門ショップを運営しています。
ネコ好きの方、親しい間柄にネコ好きがいらっしゃる方、ぜひご覧ください。
■キャットギフト
https://cat-gift.net/
java 標準関数型インターフェース

関数型インターフェースとは、抽象メソッドを１つだけもつインターフェースで、ラムダ式やメソッド参照の代入先として使われるやつです
標準関数型インターフェースについてまとめてみました

参考：https://hosochin.com/2021/05/26/post-793/


## 標準関数型インターフェース
標準関数型インターフェースとして、典型的なメソッドの型が`java.util.function`パッケージで定義されている

### 基本的な標準関数型インターフェース

|インターフェース|メソッド|説明|
| ---- | ---- | ---- |
|Function \<T, R>|R apply (T t)|T型の引数を受け取って、R型の結果を返す|
|Consumer \<T>|void accept (T t)|T型の引数を受け取って、結果は返さない|
|Predicate \<T>|boolean test(T t)|T型の引数を受け取って、boolean値の結果を返す|
|Supplier \<T>|T get()|引数無し、T型の結果を返す|

#### サンプルコード

```Sample.java
        // Function<T, R>
        // 例：引数の文字列長を返す
        Function<String, Integer> function = String::length;
        System.out.println(function.apply("12345")); // 5

        // Consumer<T>
        // 例：引数の文字列長を出力
        Consumer<String> consumer = str -> System.out.println(str.length());
        consumer.accept("12345"); // 5

        // Predicate<T>
        // 例：引数の文字列に"foo"が含まれているか判定
        Predicate<String> predicate = str -> Objects.nonNull(str) && str.contains("foo");
        System.out.println(predicate.test("foo bar")); // true

        // Supplier<T>
        // 例："Sample"を返す
        Supplier<String> supplier = () -> "Sample";
        System.out.println(supplier.get()); // Sample
```

### 関数の合成
標準関数型インターフェースを合成して新しい関数型インターフェースを作成できる
`compose`、`andThen`を使って合成する(`compose`と`andThen`の違いは合成の順序)
Predicate系は`and`、`or`、`negate`を使って合成できる
#### サンプルコード
```Sample.java
        // Functionの関数合成
        Function<String, Integer> function1 = String::length;
        Function<Integer, Integer> function2 = i -> i * 100;
        // composeを使う場合
        Function<String, Integer> newFunction1 = function2.compose(function1);
        // andThenを使う場合
        Function<String, Integer> newFunction2 = function1.andThen(function2);
        System.out.println(newFunction1.apply("12345")); // 500
        System.out.println(newFunction2.apply("12345")); // 500

        // Predicateの関数合成
        Predicate<Integer> predicate1 = i -> i % 2 == 0; // 偶数かどうか判定
        Predicate<Integer> predicate2 = i -> i >= 100; // 100以上どうか判定
        // 偶数かつ100以上かを判定
        Predicate<Integer> newPredicate1 = predicate1.and(predicate2);
        // 奇数かつ100未満かを判定(negate()は論理否定)
        Predicate<Integer> newPredicate2 = predicate1.negate().and(predicate2.negate());
        System.out.println(newPredicate1.test(100)); // true
        System.out.println(newPredicate2.test(99)); // true
```
JSTQB AL（TA）の勉強方法

#1．概要

2月に受けたJSTQBのテストアナリスト試験に見事合格していました！！
合格記念に今回はどのように勉強して合格したのか、結果をまとめたいと思います。

※また過去問は以下に記事を作成しておりますので、ご参考までに。
【[2020年 JSTQB AL（TA）の問題まとめ](https://qiita.com/momotar47279337/items/b6ec61abf944a9ed8803)】

#2．試験の概要

JSTQBのテストアナリストは1年に1回しか試験がなく、勉強材料もシラバスしかないのが特徴です。そのため、**基本はこのシラバスをどこまで理解するか**、にかかっています。

実際の試験は3時間と長く、計算問題が多いのが特徴です（だいたい2時間後に脳が死滅します…）
そのため、わからい問題があれば飛ばして、次の問題にとりかかった方がいいです。

また、JSTQBのテストマネージャーの試験と比べると、こちらの方が比較的簡単だと思います。何故なら同値境界値など、テストを実施していれば実際に聞いたこと・実践したことのある技法が多く、すんなりと内容が入ってきやすいからです。
（テストマネージャーのシラバスは、よくわからない人とよくわからない人が何かをしているときに、テストマネージャーが何かをする！といった状況が全く理解できない内容が多いです…）

#3．勉強方法

##3.1　全体の把握

まずはどんな内容なのかシラバスの目次を読み、全体を把握することを行いました。また、全体像の把握に「JSTQB AL TA(テストアナリスト)のビジネス成果」と言うnoteの記事も参考にいたしました。無料でもざっくりと読めるので、何がシラバスに書いてあるのか、全体を把握します。
※noteで「JSTQB AL TA」と検索すると見つかります。

ここでは細かいことを理解するより全体を把握することで、その後の勉強を進めやすくします。（2週間ほど実施）

##3.2　優先順位決め

ちょうど資格勉強を実施する辺りで案件が忙しくなり、勉強時間がほとんど取れないことが確定していました。そのため、勉強する際は優先順位を決めて、優先度の高いものから順に勉強を行いました。

また、優先度については、シラバスに記載されている「K」の部分を参考にいたしました。

- 【K2】シラバスの内容を理解できる
- 【K3】技法を適用できるか
- 【K4】状況によって適切な方法を選択できる

上記の【K4】【K3】が最も出題されると考え、シラバスを読み進めるのは【K4】【K3】が多い以下の順序で学習を行いました。

3章　⇒　1章　⇒　4章　⇒　6章　⇒（2章、5章、7章）
**※各章内でも【K4】⇒【K3】⇒【K2】の順に勉強しました。**

また、以下にJSTQBテストアナリストの解説が掲示されています。ここの例題は、**問題文が変わるだけで毎年出題される！**と聞いていたので、ここだけは外さないように勉強いたしました。
【[JSTQB「Advanced Level試験」過去問解説セミナーの動画と資料が無料公開―公式サイトにて](https://itjinzai-lab.jp/article/detail/550)】

- シラバス1.3.1　テスト計画作業　に記載されているテストアナリストの役割
- シラバス3.2.6　組み合わせテスト技法　のクラシフィケーションツリーの作成方法
- シラバス3.2.10　技法の組み合わせ　3章のテスト技法はすべて理解する　



##3.3　シラバスの要約

上記の優先順位をもとにシラバスをまずサクッと読みます。その後、わからない文章を1つ1つ丁寧に要約していきました。

例えば1章の1.5.2にある以下文章は、

	テストケースの詳細度合いは、開発コストおよび実行時の再現性の度合いに影響を及ぼすので、
	テストケースを実際に作成する前に定義する必要がある。テストケースの詳細度を低くすると、
	テストアナリストはテストケースを実行する際に自由度を高めることができ、潜在的に関心のある
	領域を調査する機会を得ることができる。ただし、再現性が低下する可能性もある。

以下のように要約しました。

	テストケースをどこまで詳細に作成するかは、開発コストとテスト実施者のレベルから定義しておくこと
	テストケースを抽象的に作成すると、テストアナリストが問題だと思うところをテストしやすくなるが、
	再現できなくなる（どうテストしたのか具体的なものが残らないので）

要約のポイントとして、以下を実施していました。

- **自分がわかるように要約する（割愛しても意味が分かるのであれば、割愛する）**
- 横文字などは具体的な用語に変える
- 文章はできるだけ短くする


上記要約作業を内容が理解できるまで続けました。とはいえこの要約作業がとても時間がかかるので、最終的に（2章、5章、7章）は要約できずに、ただシラバスを読んだだけとなりました。（約2か月ほど実施）

しかし、実際の試験は3章を中心に出題されていたため、上記の優先順位が結構効果があったと感じました。

#4．まとめ

シラバスは結構量があるので、上記のように優先順をつけて勉強した方がいいと思います。特に3章の問題だけで全体の1/3以上はあったと思いますので、3章だけはきちんと勉強しておいた方がいいと思います。
Kubernetesで和牛を給付する

# Motivation
コンテナ管理基盤であるKubernetesには、Kubernetes Operatorという概念があり
任意のオブジェクトをKubernetes上で管理することができる。
このKubernetes Operatorを用いると和牛も管理することができるので給付してみる。

ここで、Kubernetes Operatorを開発するツールは、下記の通りいくつか存在しているが
エコシステムが充実しているOperator SDKを採用した。

[Operator SDK](https://github.com/operator-framework/operator-sdk)
[Kubebuilder](https://book.kubebuilder.io/)
[Metacontroller](https://metacontroller.app/)


# QuickStart 
## 環境
- [kind](https://github.com/kubernetes-sigs/kind)
- Docker
- Mac

## 和牛の配り方
### [Quay.ioのアカウント登録](https://quay.io/repository/)
![quay.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94861/13f025f9-c1ac-e331-8f0f-05d952f4f2d1.png)


https://github.com/operator-framework/operator-sdk#quick-start

### operator-sdkを用いて和牛Operatorの雛形を作成

```
TMPDIR=`mktemp -d` && cd $TMPDIR
mkdir $TMPDIR  && cd $TMPDIR
operator-sdk new wagyu-operator --repo github.com/delicious/wagyu
cd wagyu-operator

operator-sdk add api --api-version=app.example.com/v1alpha1 --kind=Wagyu

operator-sdk add controller --api-version=app.example.com/v1alpha1 --kind=Wagyu

```



### 和牛コントローラの処理を一部書き換え
実際にはデプロイされるPodのImageを差し替えている

```
sed 's|Image:   "busybox"|Image:   "quay.io/iaoiui727/wagyu:latest"|g' -i pkg/controller/wagyu/wagyu_controller.go
```

### 和牛OperatorのDockerイメージ作成

```
export USER=<quay.ioで作成したユーザ名>
operator-sdk build quay.io/$USER/wagyu-operator
docker login quay.io
```

DockerイメージのPush

```
docker push quay.io/$USER/wagyu-operator
```


Quay.ioでリポジトリをpublicにする

![make_repository_public.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94861/6a9ec56d-04fb-dadc-f6ce-cba7e837bd90.png)



### Kubernetesクラスタの構築

```
kind create cluster
```



### 和牛Operatorのマニフェスト内で、先ほどquayにアップロードしたDockerイメージを使うよう変更

```
sed -i "/Command/d" pkg/controller/wagyu/wagyu_controller.go 
sed -i "s|REPLACE_IMAGE|quay.io/$USER/wagyu-operator|g" deploy/operator.yaml
```



### Operator用のサービスアカウント、ロールを用意

```
kubectl create -f deploy/service_account.yaml
kubectl create -f deploy/role.yaml
kubectl create -f deploy/role_binding.yaml
```



### 和牛のCRD(Custom Resource Definition)を生成
和牛というCRDリソースがKubernetesに登録される

```
kubectl create -f deploy/crds/app.example.com_wagyus_crd.yaml 
```

和牛というCRDリソースの定義を確認できるようになる

```
 k get wagyu
NAME            AGE
example-wagyu   1m
```


### 和牛Operatorを起動

```
kubectl create -f deploy/operator.yaml
```



和牛Operatorの起動を確認

```
kubectl get po
NAME                              READY   STATUS    RESTARTS   AGE
wagyu-operator-7d87f94966-c7rbt   1/1     Running   0          18s
```



### 和牛インスタンスを起動

```
kubectl create -f deploy/crds/app.example.com_v1alpha1_wagyu_cr.yaml 
```



正常に起動していることを確認

```
kubectl get pod -l app=example-wagyu
kubectl describe appservice example-appservice
```

## 給付された和牛を確認

```
kubectl logs example-wagyu-pod 
🐄 
```





## Clean up

```
kind delete cluster
```


# まとめ
Operator SDKを用いてKubernetes上で和牛を給付できた
今回はGo言語で検証したが、Operator SDKではAnsible, Helmも対応しているので利用してみたい。
Haskell Aeson - Fast JSON parsing and encoding


Haskell の JSONライブラリーである、**Aeson** のちょっとした紹介記事です。備忘録を兼ねてます。




## 1. プロジェクト構築

[The Haskell Tool Stack](https://docs.haskellstack.org/en/stable/README/)

```
stack new my-project
cd my-project
stack setup
stack build
stack exec my-project-exe
```




# 2. ソースコード

まず最初の使用するパッケージを宣言しておきます。

```haskell:package.yaml
dependencies:
- base >= 4.7 && < 5
- text
- aeson
- bytestring
```

ソースコードは以下のドキュメントのサンプルコードを使います。
[aeson: Fast JSON parsing and encoding](https://hackage.haskell.org/package/aeson)


```haskell:src/AesonTest.hs
{-# LANGUAGE DeriveGeneric #-}

module AesonTest
    (
    ) where

import Data.Text
import Data.ByteString.Lazy
import Data.Aeson
import GHC.Generics

data Person = Person {
      name :: Text
    , age  :: Int
    } deriving (Generic, Show)


instance ToJSON Person
instance FromJSON Person
```

このソースコードのポイントは以下のinstance宣言です。

```
instance ToJSON Person
instance FromJSON Person
```

Person は**ToJSON** と **FromJSON** のinstanceであると宣言していますが、メソッド関数等の実装はありません。これは GHC の **Generic**拡張の恩恵で、以下のように Person が Generic を deriving しているからメソッド関数の省略が可能となっています。


```haskell:Person
data Person = Person {
      name :: Text
    , age  :: Int
    } deriving (Generic, Show)
```



# 3. 実行

それではAesonを使って「JSON文字列 <=> Person型データ」のエンコード、デコードを確認してみましょう。

ghciを起動します。

```
stack ghci
```

AesonTest.hsをロードします。

```
*Main AesonTest Lib> :l AesonTest
```

encodeを実行します。

```
*AesonTest>  encode (Person {name = "Joe", age = 12})

<interactive>:2:25: error:
    ? Couldn't match expected type ‘Text’ with actual type ‘[Char]’
    ? In the ‘name’ field of a record
      In the first argument of ‘encode’, namely
        ‘(Person {name = "Joe", age = 12})’
      In the expression: encode (Person {name = "Joe", age = 12})
```

エラーとなりました。PersonのnameがTextなのに、入力が[Char]なのでunmatchとなったのです。GHCのOverloadedStrings拡張でこの辺の違いを吸収してもらいます。

```haskell:OverloadedStrings
:set -XOverloadedStrings
```

再度、**encode** を実行します。OKですね。

```
*AesonTest>  encode (Person {name = "Joe", age = 12})
"{\"age\":12,\"name\":\"Joe\"}"
```

次の **decode** を実行します。これもOKです。

```
*AesonTest> decode "{\"name\":\"Joe\",\"age\":12}" :: Maybe Person
Just (Person {name = "Joe", age = 12})
```


最後に encode と decode の型を示しておきます。

```haskell:
import qualified Data.ByteString.Lazy as L
encode :: (ToJSON a) => a -> L.ByteString
decode :: (FromJSON a) => L.ByteString -> Maybe a
```


今回は以上です。
HTML5とcss3の組み合わせによる、ウェブページの作成基礎

まず、HTML5は、カッコで括られたタグというマークアップの方式による、ブラウザでのテキスト表示を、カスケイディング・スタイルシートに、数値データやアトリビュート（属性）を置いて、ポジション取りや、色、大きさの指定などを行う。スタイルシートという、属性を置くシートにより、HTMLファイル自体は、すっきりと、テキストをマークするのに最低限の表記だけにとどまる仕組みとなっている。
![スクリーンショット 2020-03-28 12.44.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606144/9dda6f31-8683-c6fb-d747-78f61b570ac4.png)

まず、HTMLファイルの作成。divにあたる、header, section, footer部に分けた、ブロック構造で、sectionの中に二つのdivが存在する。

#cssの書き方の見本
![スクリーンショット 2020-03-28 12.33.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606144/43723e13-3869-8fe0-aef8-689b4b0cba6a.png)
このように、タグの中身をcssに置くのが基本となっている。また、これを、〜.cssという名前で保存し、
![スクリーンショット 2020-03-28 12.37.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606144/609f4ef4-973e-cb11-c0ec-c4f83f27fc0c.png)
でで呼び出すことができる。
Windowsイベントログ-備忘録

# 目的：ファイルサーバのアクセスログ取得
### 目的達成にあたって、以下の準備が必要でした。
- イベントビューアの設定変更
- ローカルセキュリティポリシーの設定変更
- アクセスを監視したいフォルダの設定変更

# 参考リンク
### WindowsServerの[共有フォルダ]アクセスログを記録する
> https://www.netassist.ne.jp/blog/?p=10733

# ついでに見ておきたいと思ったところ
### 注意したいイベントIDについてとか
> http://mkt-eva.hateblo.jp/entry/2018/06/22/130524#

### バッチでイベントログをファイル出力してみるとか
> https://selifelog.com/blog-entry-245.html
> http://quatrefromage.hatenablog.jp/entry/2016/08/06/164436
> http://rtaki.sakura.ne.jp/infra/?p=1980

### WMIでコマンド実行する時に把握しておきたいところとか
https://www.manageengine.jp/support/kb/EventLog_Analyzer/?p=3669

### イベントログを自作したりとか
> http://piyopiyocs.blog115.fc2.com/blog-entry-1088.html
深層学習／クロスエントロピー

#1.はじめに
　今回は、クロスエントロピー(交差エントロピー)について勉強したことをまとめます。

#2.最尤推定からの導出
　シグモイド関数を $\sigma とし、$y = $\sigma$(W・x + b)とすると、ニューロンが発火(１を出力)する確率は以下の様に表せます。
　　P(C = 1|x) = $\sigma$(W・x + b)

逆に発火しない確率は以下の様に表せます。
　　P(C = 0|x) = 1 - $\sigma$(W・x + b)

この2つを1つの式で表すと、1つのニューロンの発火確率は以下の様に表せます(但し、t=0 or t=1)。
　　P(C = t|x) = $y^t(1 -y)^{1-t}$

ネットワーク全体の尤度Lは、全てのニューロンの発火確率の掛け算になるので、
　　$L = \prod_{n=1}^N y_n^{t_n}(1-y_n)^{1-t_n}$　

　最尤度は、この式を最大化することで求まりますが、最小化する方が最適化しやすいのでマイナスを掛けます。確率の掛け算は、値がどんどん小さくなり扱い難いので、対数(log)を取ります。そして、Nが変化しても比較できる様に、Nで割ると、
　　$L = -\frac{1}{N}\sum_{n=1}^N t_nlogy_n+(1-t_n)log(1-y_n)$

　これが、クロスエントロピー（交差エントロピー）の式です。

#3.具体的な誤差計算
　今、正解ラベル$t_1$〜$t_3$と予測確率$y_1$〜$y_3$が以下の様だとします。
![スクリーンショット 2020-03-28 11.29.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/4e395173-4180-2678-f4fe-01a4c4650d6a.png)
　先程のクロスエントロピーの式に値を代入すると
![スクリーンショット 2020-03-28 11.54.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/827c4451-d810-8137-fc96-804321c06f59.png)

#4.コード
　クロスエントロピーを求めるコードをpythonで書くと、

```python
import numpy as np

def calc_cross_entropy(y_true, y_pred):
    loss = np.mean( -1 * (y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred)), axis=0)
    return loss

y_true =np.array([[1], [0], [0]])
y_pred = np.array([[0.8], [0.1], [0.1]])

answer = calc_cross_entropy(y_true,  y_pred)
print(answer)

# 出力
# [0.14462153]
```
LaravelでのSession操作まとめ

##はじめに
ユーザーの識別やユーザー毎のデータの保存を行うことが必要になるかと思います。
そのような時のために、LaravelフレームワークはSessionという仕組みを提供しており、データ（キーと値のペア）を保存できます。
今回はそのSessionについてまとめたいと思います。

##Session操作の種類
Laravelでセッションを操作するには、主に2つの方法があります。
1つはアクションに渡されるRequestインスタンスを経由する方法です。
Illuminate\Session\Storeインスタンスが使われます。

```php:
// セッション中の全データを取得する
// Illuminate\Http\Requestをuseする
$data = $request->session()->all();
```

もう1つはグローバルなヘルパ関数session( )を使用する方法です。
Illuminate\Session\SessionManagerインスタンスが使われます。

```php:
// セッション中の全データを取得する
$data = session()->all();
```
後者の方がコンパクトにかけて便利なので今回は後者についてまとめていきたいと思います。

##Session操作の方法
```php:
// セッション中の全データを取得する
session()->all();

// 指定したデータがセッションに存在するかを調べる
if (session()->exists('key')) {
    // 存在する
}
if (session()->has('key')) {
    // 存在しnullではない
}

// セッションへデータを保存する
session()->put('key', $value);

// 指定したデータをセッションから削除する
session()->forget('key');

// セッションから全データを削除する
session()->flush();
```


##おわりに
Session使いこなすことでユーザーの識別やユーザー毎のデータの保存ができるようになるのでためしてみてください。

参照：[Laravelでsession（セッション）を扱う方法【初心者向け】](https://techacademy.jp/magazine/18789)
　　　[ヘルパ 7.x Laravel](https://readouble.com/laravel/7.x/ja/helpers.html#method-session)
【Scala】sbt+JavaFX+VSCodeでハマった点

# 目的
IntelliJなどのIDEでJavaFXを使う記事はたくさんヒットしましたが、IDEを使わずに行うものがなかったので、ハマった点を書いておきます。

使い慣れている方から見れば当たり前かもしれませんが、勉強中の私がハマった点です。

# 二度目の実行でエラーが出る
```
$ sbt
```
でsbtを起動し

```bash
> run
```
で実行します。一度目の`run`では正常にJavaが起動するのですが、再度`run`を実行すると以下のようなエラーが発生します。

```
java.lang.UnsatisfiedLinkError: Native Library xxx already loaded in another classloader
```

これはどうやら、最初の`run` でクラスローダーがライブラリを呼び出したにも関わらず、再度呼び出そうとしたために発生するエラーのようです。

# 解決策
build.sbtに以下のような、モジュールに関する記述を加えます。

```build.sbt
  javaOptions ++= Seq("--module-path", "/Library/Java/JavaVirtualMachines/javafx-sdk-11.0.2/lib")
  javaOptions ++= Seq("--add-modules", "javafx.controls,javafx.fxml,javafx.media")
```

`/Library/Java/JavaVirtualMachines/javafx-sdk-11.0.2/lib`の部分はJavaFX SDKがインストールされている場所に変えてください。

# ハマった点
```build.sbt
javaOptions += "--module-path \"/Library/Java/JavaVirtualMachines/javafx-sdk-11.0.2/lib\" --add-modules javafx.controls,javafx.fxml,javafx.media"
```

最初は上記のように記述しており、

```
Unrecognized option: --module-source-path
```
というエラーが出て詰まっていました。
E資格の確率・統計について（E資格対策）

本日は確率統計について

目次
[ベルヌーイ分布](## ベルヌーイ分布)
[二項分布](## 二項分布)
[ガウス分布(正規分布)](#ガウス分布(正規分布))
[最尤推定](# 最尤推定)




## ベルヌーイ分布
ベルヌーイ分布とは2値を取る変数(例；コイントス)が生成する確率分布を示します。

$f(k)=p^k(1-p)^{1-k}$

$p$は確率、$k$はパラメータを示します。
例えばコイントスの表が出る確率はベルヌーイ分布に従います($p=0.5$, $k=0:$裏, $k=1:$表 )。
$k$の値は1の時が成功、0が失敗と割り当てられています。


## 二項分布

ベルヌーイ試行を$n$回行い、$x$回成功する回数が従う確率分布を示します。

$B(n,p)=_nC_xp^x(1-p)^{n-x}$

$n$は試行回数、$p$は成功確率を示します。
コイントスで言うなら$n$回投げて表が$x$回出る回数（$=x$回成功する）が従う確率分布とお考え下さい。


## マルチヌーイ分布
マルチヌーイ分布（カテゴリカル分布）とはベルヌーイ分布をn次元に拡張した確率分布です。
名前の通りベルヌーイの複数版（マルチ）とお考え下さい。

$f(x_i)=\frac{n!}{x_1! … x_k!}p_1^{x_1}…p_k^{x_k}$
$ (p_{1} + p_{2} + ... + p_{k} = 1)$

$x_j$は試行回数、$p_j$はラベルjの事象の確率です。

例えばサイコロの確率が従います。
$n$回投げて$p_i$の確率で出現する面$i$が$x$回出る回数が従う分布と考えられます。
サイコロなら$i$はラベル($i=1$:なら$1$の目)、確率$p_i$は
$ p_{1} = p_{2} = ... = p_{6} = \frac{1}{6}$
です。


## ガウス分布(正規分布)
あの磁石で有名なガウスさんが考え付いた確率分布です。
エンジンの駆動データ、インターネットのアクセスに関するデータなど様々なデータがこの分布に従うことが知られています。

$N(\mu,\sigma^2)=\frac{1}{\sqrt{2\pi \sigma ^2}} \exp \left( -\frac{(x-\mu)^2}{2\sigma ^2} \right)$
期待値$E(x)=\mu$
分散$V(x)=\sigma ^2$


<img width="594" alt="normal_dist.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/c8f61e7d-93cd-767d-823d-4a93008e5297.png">

引用：https://www.python.ambitious-engineer.com/archives/2174

グラフにするとこう。
また$N=0,\sigma^2=1$のとき、標準正規分布と呼ばれます。





# 最尤推定

（シラバスには書いてなかったものの、どうやら出題されるみたいなので書きます。）

最尤推定とは尤度関数$L(\theta)$を最大にする$\theta$を求めることをさします。
とりあえず例題を見て確認しましょう。

例題
さいころを10回投げた時、1の目が3回出た。1の目が出る確率を最尤推定せよ。

例題は二項定理の確率分布に従います。
解く問題は「**$B(10,p)$を最大化する$p$を求める**」です。例題は


$B(10,p)=_{10}C_3p^3(1-p)^{10-3}$

と書けます。
$B(10,p)=L(\theta)~~(p=\theta)$
とおき、微分します。
このまま微分してもいいのですが、対数をとってから微分すると計算が楽になります。
まず対数をとると


```math
logL(\theta)=log(_{10}C_3\theta^3(1-\theta)^{7})
=log(_{10}C_3)+log\theta^3+log(1-\theta)^{7}
```

次に微分し、極値を求めます。

```math
\begin{eqnarray}
\frac{d~logL(\theta)}{d\theta} = \frac{3}{\theta} - \frac{7}{1-\theta} \\

\frac{dL(\theta)}{d\theta} =L(\theta)( \frac{3}{\theta} - \frac{7}{1-\theta})=0 \\

10\theta=3

\end{eqnarray}

```

よって求める確率$\theta$は

$\theta=0.3$


です。

以上になります。


参考文献
https://to-kei.net/distribution/bernoulli-distribution/