OmniAICreator/Qiita-1.07M huggingface dataset:
ふりかえりであえて「チーム vs. チーム」の対立構図を作った結果

ふりかえりでは「問題 vs. チーム」の構図をつくるのがセオリーです。それをわかったうえで、あえて「チーム vs. チーム」の対立構図を作ってみました。この記事ではそのいきさつと、なぜそうしたかの「心」を書いてみます。

# やったこと

事前にGood/Bad/Ideaの形で意見を書き込んでもらいました。Badに最も多くの意見が集まりました。事務局で多数意見をグルーピングして話題を選定。ふりかえり会への参加は「問題意識のある人」としました。当日は参加したい話題を自ら選んで（ただし一部指名もしました）Zoomのブレークアウトルームで討論してもらいました。

話題を選ぶ際に示したのはこのようなスライドです（〇〇は指名した人です）：

| ルーム# | 話題 | 参加してほしい人 | ファシリテーター |
|:-:|:-:|:-:|:-:|
|  1 | 何の役割がどうあいまいで、何が困るか？  | 分担があいまいで困っている人 vs. 分担をはっきりさせる立場の人（マネジャー〇〇）  | リーダー〇〇  |
|  2 | 割込み処理、どう減らす/さばく/備える？  | 割込みを強いられる人 vs. 割込みを強いる人 (リーダー〇〇)  | リーダー〇〇  |
|  3 |  : | :  | :  |



# なぜ対立構図を作ったか

## 不満を出し切りたかった

特定の人たちに対する現場に不満がくすぶっているのを感じていたので、相互理解のためにそれをあえてぶつけることが効果的と考えました。言われる側からすると反論もあろうし、それを理解するだけで不満の一部は消えると考えました。それを経たうえでなら「問題 vs. チーム」の構図に移行できるだろうと考えました。

## 言ったもの負けを避けたかった

当社では、なにかの行動を提案した人がそのままその行動をとらされるはめになるという、「言ったもの負け」文化があると最近言われます。そのような文化では、提案をしたくなくなります。対立構造をつくることで、そのような「言ったもの負け」が初めからないことが保証され、安心して発言できると考えました。

# 結果

筆者の読み通り、以下の結果が得られました：

* 役割の議論では、マネジャーの大変さが伝わり、リーダーたちが「その範囲なら自分たちが引き取れる」と提案しました。
* 割込みの議論では、すべての割込みを避けたいのではなく、お客からの割込みはしようがないという理解が示され、計画できたはずのタスクが割込みになることを防ごうと提案されました。
* 「言ったもの負けにならずに済んだからこの進め方はよい」という意見も出されました。

と、さも成功談のように書きましたが、セオリーから外れることをするのは勇気が要りましたし、「あれで本当に良かったのか...?」というのが本音です。ご意見でも頂ければうれしいです。
【なぜかは】elispの自作関数が急に動かなくなった。interactiveを入れたら直った【知らない】

elispは１ミリも分からないけど、以下の自作関数をinit.elに入れて使っていた。
F9を押下するとfoo.shというシェルスクリプトが動くというだけのもの。

``` init.el
  (defun bar ()
    (shell-command "/シェルスクリプトが入っているフォルダの絶対パス/foo.sh"))
  (define-key global-map [f9] 'bar)
```

これがある日、急に動かなくなった。
F9を押下すると、以下のメッセージがミニバッファに表示されて、スクリプトは動かない。

```
  Wrong type argument: commandp, bar
```

なぜかは分からないけど、他の人が書いたelispの関数を参考に、省略していたinteractiveを入れてみた。

``` init.el
  (defun bar ()
    (interactive) ;;; ここだけが変更点
    (shell-command "/シェルスクリプトが入っているフォルダの絶対パス/foo.sh"))
  (define-key global-map [f9] 'bar)
```

これだけで、どういうわけか動くようになった。

なぜ以前はinteractiveなしで動いていたのが、今日急に動かなくなったのか、分からない。
いちおう今日の日付は 2022-07-15、M-x emacs-version は

```
  GNU Emacs 26.5 (build 2, x86_64-pc-linux-gnu, GTK+ Version 3.24.14) of 2020-03-26, modified by Debian
```

WSL2でUbuntuを使っていて cat lsb_release の結果は

```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.4 LTS"
```

である。何かご存知の方はコメント欄で教えてください。ひどくてスミマセン。
他の方で同じことで悩んでいる方があれば。

**（この項終わり）**
AccessのVBAでコンボボックスの2列目の値を取得

# 概要

コンボボックスは ↓ こういう設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/4ba9155b-c143-33b5-3e1a-d66acfc4ba8b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ca7ea16e-133f-ee8d-0359-25288d6fa97e.png)


画面に見せる値とシステム内部的に処理する値を変えてる。

選択している値はValueで取ってこれる。
でもそうじゃなくて、画面に見せてる方の値（『』『通常』『その他』）を取得したい時。

# やり方

コンボボックスのColumnのインデックスは **0** からスタートするので、 **2** 列目は **1** 。

```vb
Me.cmb_tester.Column(1)
```

# 参考サイトさん

https://tsware.jp/tips/tips_359.htm

# バージョン

Windows 10 Pro 21H2 OSビルド 19045.2311
Microsoft Access for Microsoft 365 MSO (バージョン 2210 ビルド 16.0.15726.20188) 32 ビット
Excelで、テーブルとして書式設定したくないけど１行おきに色を付けたい場合の条件付き書式

　Excelで、表に１行おきに色を付けて行を横にたどりやすくしたいときに、「テーブルとして書式設定」でそういう色使いの書式を選択すると、例えばこんな風に色が付きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693903/b95347b7-63c0-ec69-d4a5-c7e4d1acc9a7.png)
　フィルタで表示項目を減らしても、ちゃんと１行おきに色が付きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693903/d6c773a7-405e-273a-493f-9a435423c9bd.png)
　でも、「テーブルとして書式設定」をするには、必ず見出しの行が必要だったり、見出しの項目名に同じ名前が使えなかったりと、「テーブル」としての制約がつくので、単純に条件付き書式だけで実現する方法を考えてみました。
　こんな感じの表があったら、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693903/79a36b85-0c61-96e1-7a69-8b7dcb472f69.png)
B2:E7 を選択して[ホーム] > [条件付き書式] > [新しいルール]を開く。規則の種類を「数式」にして、数式を =ISODD(SUBTOTAL(103, \\$B\\$2:\\$B2)) に設定し、書式をカスタム書式で好きな色を塗りつぶしの色で設定すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693903/848f4831-fab3-b1de-4be5-b3cb14df4d7b.png)
こんな感じで交互に色が付きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693903/f91249c8-9f58-3b53-10b7-d719a23573bf.png)
行をいくつか非表示にしてもこの通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693903/c1cfb35a-48df-fb20-674d-64a7bc01eb97.png)
この設定がうまくいくには前提条件があって、SUBTOTALに設定する列(今回の例ではB列)には空白セルがないことが条件です。
SUBTOTAL関数で、各セルが非表示を除いて表の何行目にあるかを算出し、ISODD関数で奇数行のときだけ条件成立する(Trueになる)、という仕組みです。

(参考)SUBTOTAL関数の説明
https://support.microsoft.com/ja-jp/office/subtotal-%E9%96%A2%E6%95%B0-7b027003-f060-4ade-9040-e478765b9939
[AWS] S3の署名付きURL(有効期限7日間)を発行する手順

S3の署名付きURL(S3 Presinged URL)は、S3バケットへのアクセス権限を持たないユーザーに対して一時的なアクセスを許可するために発行するURLです。

コンソールからも作成可能ですが、発行する条件によって有効期限が色々決まっているのが複雑で、意図した有効期限より短くなってしまう場合があります。

- IAMインスタンスプロファイル: 最長 6時間
- AWSコンソールで設定可能な時間: 最長 12時間
- IAMロールの連鎖セッションで発行した場合：最長 12時間（デフォルトは1時間）
- AWS Security Token Service (STS): IAM ユーザーが署名した場合は最長 36時間、ルートユーザーが署名した場合は最長 1時間
- IAM ユーザー: 最長 7 日間有効 (AWS 署名バージョン 4 を使用した場合)

今回は、最長の 7日間有効なURLを発行する手順を確認しました。CloudShellに少し設定を加えるのが簡単なようでしたので、そのやり方をまとめました。

# 1．CloudShellでアクセスキーを設定

CloudShellには認証情報が設定されていますが、そのままだと最長の場合に該当しません。アクセスキーを作成し、aws configureコマンドで追加設定します。

```shell
$ aws configure
AWS Access Key ID [******************FU]: <アクセスキーを入力>
AWS Secret Access Key [******************1q]: <シークレットキーを入力>
Default region name [us-east-1]: <リージョンを入力(この場合は何でもよい)>
Default output format [json]: <出力形式(この場合は何でもよい)>
```

# 2．スクリプトでURLを発行

AWS 署名バージョン 4 を使用するスクリプトを作成します。ここではスクリプト内で 604800 秒を指定していますが、短くすることももちろん可能です。

```python:generate_presigned_url.py
import sys
import boto3
from botocore.client import Config

args = sys.argv
bucket = args[1]
key = args[2]

# Get the service client with sigv4 configured
s3 = boto3.client('s3', config=Config(signature_version='s3v4'))

# Generate the URL expires in 604800 seconds (seven days)
url = s3.generate_presigned_url(
         ClientMethod='get_object',
         Params={
            'Bucket': bucket,
            'Key': key
         },
         ExpiresIn=604800
)

print(url)
```

あとはファイルを指定してpython3（CloudShellでboto3インストール済）で実行すればURLが生成できます。

```shell
python3 generate_presigned_url.py <バケット名> <オブジェクトキー>
```

実行例：
```shell
$ python3 generate_presigned_url.py dev-test-backet folder/test/public.txt
https://dev-test-backet.s3.amazonaws.com/folder/test/public.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAYSE7XXXXXXXXXXXXXXXX220407%2Fus-east-1%2Fs3%2Faws4_request
&X-Amz-Date=20220407T014221Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXe44d71b78a5
```

あとは時間経過後にアクセスして、意図した有効期間でURLが生成されていることが確認できます。

# 参考資料
- [署名付き URL を使用したオブジェクトの共有](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html)
- [Amazon S3 バケットの署名付き URL が、指定した有効期限より前に失効するのはなぜですか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/presigned-url-s3-bucket-expiration/)
- [IAM ロールの連鎖セッションで有効期間の制限を引き上げることはできますか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/iam-role-chaining-limit/)
- [S3の署名付き URLを利用する際に注意する3つのポイント](https://uchimanajet7.hatenablog.com/entry/2019/03/29/000000)
Amazon Athenaでパラメータ化されたクエリが使えるようになったので試してみた

## はじめに
Amazon Athenaで、パラメータ化されたクエリが使えるようになったとの事。
という事で、早速試してみました。

https://aws.amazon.com/jp/about-aws/whats-new/2022/07/amazon-athena-enhances-console-api-parameterized-queries/?nc1=h_ls

## 早速試してみる
今回は、既に作成済みのVPCフローログのデータベースに対するクエリをパラメータ指定して実行してみます。
VPCフローログのデータをAthenaで解析できるようにする方法は、以下などを参照ください。

https://docs.aws.amazon.com/ja_jp/athena/latest/ug/vpc-flow-logs.html


https://dev.classmethod.jp/articles/vpc-flow-logs-athena/

まずは、パラメータ化せず、starttimeの期間だけを指定した簡単なクエリを実行します。
実行したクエリは以下です。
```
select
 from_unixtime(starttime,9,0) AS "starttime_jst",
 from_unixtime(endtime,9,0) AS "endtime_jst",
 sourceaddress AS "Source IP Address",
 sourceport AS "Source Port",
 destinationaddress AS "Destination IP Address",
 destinationport AS "Destination Port",
 protocol,
 action,
 logstatus
from default.vpc_flow_logs
where date_trunc('month',now())  = date_trunc('month',from_iso8601_timestamp(dt))
and from_unixtime(starttime, 9, 0) >= cast('2022-07-15 09:00:00 +09:00' as timestamp with time zone)
and from_unixtime(starttime, 9, 0) <  cast('2022-07-15 10:00:00 +09:00' as timestamp with time zone)
;
```
#### 実行結果
![aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2554521/547eb9f0-47e3-94a5-bae8-09fc2716d3e9.png)
これまでは、上記のようなクエリで指定する期間を変えたい場合、エディタで直接クエリを編集して実行する必要がありました。

しかし、今回の機能追加で、変更したいクエリの絞り込み条件をパラメータする事で、クエリを都度変更しなくてもよくなりました。

では、このクエリの期間指定している部分をパラメータ化して実行してみます。
パラメータ化するには、パラメータ化したい値の箇所を **「?」** に置き換えます。

先程実行したクエリを以下のように変更し、期間指定部分をパラメータ化します。

※文字列をパラメータ化する場合、シングルクォーテーションで囲う部分も含めて「?」を指定しないと実行時にエラーになります。
````
select
 from_unixtime(starttime,9,0) AS "starttime_jst",
 from_unixtime(endtime,9,0) AS "endtime_jst",
 sourceaddress AS "Source IP Address",
 sourceport AS "Source Port",
 destinationaddress AS "Destination IP Address",
 destinationport AS "Destination Port",
 protocol,
 action,
 logstatus
from default.vpc_flow_logs
where date_trunc('month',now())  = date_trunc('month',from_iso8601_timestamp(dt))
and from_unixtime(starttime, 9, 0) >= cast(? as timestamp with time zone) --日時部分をパラメータ化
and from_unixtime(starttime, 9, 0) <  cast(? as timestamp with time zone) --日時部分をパラメータ化
;
````
クエリを変更後、クエリを実行すると、今度は右側でパラメータの値の入力を求められます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2554521/848d792f-675f-f533-a9e9-5633f8ebf3e9.png)
パラメータに以下の値を入力後、「実行」するとパラメータ化する前のクエリと同じ結果が出力されました。
- パラメータ1：'2022-07-15 09:00:00 +09:00'
- パラメータ2：'2022-07-15 10:00:00 +09:00'

※文字列を条件として指定する場合は、値をシングルクォーテーションで囲う必要があります。

#### 実行結果
![aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2554521/6c2ecc1a-32f8-d96b-3070-fd096a9bf323.png)
問題無く使えそうですね。
## おわりに
Athenaでパラメータ化されたクエリを簡単に試してみました。

検索条件のパターン毎にクエリを保存していると、色々なバリエーションのクエリが大量にでき、運用上分かりにくくなる事もありましたが、パラメータ指定ができるようになった事で、クエリをテンプレート化してより活用できるようになるのではないかと思います。
docker-compose up時にCannot start service xxx: network というエラーが出たとき

# docker-compose upでこける
docker-compose upした時に、以下のようなエラーが出てdockerが立ち上がらない
`Cannot start service xxx: network`

多分、既存のdockerネットワークが何かしらで削除されたりして立ち上がらない。

## 解決策

```
$ docker-compose up --force-recreate <name>
```

これでコンテナすべてを強制的に停止および再生成します。

https://docs.docker.jp/compose/reference/up.html

これで治った
7.7 (標準) 尤度比検定7

## 方針

(3)では4.14で確認したベータ分布の導出を利用する．

## 答案

![7.-22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/6dfa845e-982c-63d0-dc00-6c5cafa745e9.jpeg)
![7.-23.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/1953894b-a580-00d5-74e6-4781d352e912.jpeg)
![7.-24.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/30729033-455f-58d9-71c7-bae2d4e8971b.jpeg)
![7.-25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/72ab8627-23f2-4268-b5c1-b46f7b6417e3.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
基本情報（入出力インタフェース）

コンピュータと様々な周辺機器をつなぐために定められている規格。それが入出力インタフェースです。

コンピュータの入出力インタフェースには様々なものがあります。周辺機器との接続で現在最もポピュラーなのは「USB」の規格です。コンピュータに周辺機器をつなぐと自動的に設定が行われる**プラグ・アンド・プレイ**(差し込めば使えるという意味）という仕組みが利用できます。

## パラレル（並列）とシリアル（直列）
入出力インタフェースは、データを転送する方式によってパラレルインタフェースとシリアルインタフェースに分かれます。
パラレルは並列という意味で、複数の信号を同時に送受信します。一方シリアルは直列という意味で、信号をひとつずつ連続して送受信します。

最初は複数の信号を１回で送れるパラレルインタフェースが高速とされていました。
しかし高速化を突き進めていくにつれ信号間のタイミングをとることが難しくなり、現在はシリアルインタフェースで高速化を図るのが主流となっています。

## パラレルインタフェース
パラレルインタフェースの規格としてはIDE(Integrated Drive Electronics)やSCSI(Small Computer System Interface)などが挙げられます。
いずれも主流がシリアルインタフェース方式へと移っていったことで、その役割を終えつつあります。

### IDE(Integrated Drive Electronics)
内蔵用ハードディスクを接続するための規格として使われていたインタフェースです。
当初は「最大２台までのハードディスクを接続できる」という規格でしたが、後にCD-ROMドライブなどの接続にも対応したEIDE(Enhanced IDE)として拡張され、広く普及しました。
今はシリアル版の企画である**シリアルATA**が主流
![200px-Serial_ATA_hard_disk_connected.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/30eb8419-88a7-c9a3-234f-86cfd6ef70ad.jpeg)
### SCSI(Small Computer System Interface)スカジー
ハードディスクやCD-ROM、MOドライブ、イメージスキャナなど、様々な周辺機器の接続に使われていたインタフェースです。
「デイジーチェーン」という、数珠つなぎに機器を連結していく接続方法を取ります。終端にはターミネータ（終端対向）が必要です。
接続できるのはコンピュータ本体を含めて８台までで、各機器には識別のために個別のID番号を割り当てます。

## シリアルインタフェース
シリアルインタフェース方式の規格として、代表的なものが**USB**と**IEEE1394**です。周辺機器をつなぐためのインタフェースに広く採用されており、どちらも「電源を入れたまま機器を抜き差しできる**ホットフラグ**」と「周辺機器をつなぐと自動的に設定が開始される**プラグ・アンド・プレイ**」に対応しています。

#### USB(Universal Serial Bus)
パソコンと周辺機器とをつなぐ際の、標準的なインタフェースです。
Universal(広く行われる；万能の；)とあるように広く使える高い汎用性に主眼が置かれた規格で、キーボードやマウス、スキャナなどの入力装置、プリンタなどの出力装置、外付けハードディスクなどの補助記憶装置と、機器を選ばず利用できるようになっています。
こちらは馴染み深いですね。

#### IEEE1394
i.LinkやFireWireという名前で呼ばれる、主にハードディスクレコーダなどの情報家電やデジタルビデオカメラなどの機器に使われているインタフェースです。
![ダウンロード (6).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/e8fbbbe3-f79f-d502-fb21-ce17d12950db.jpeg)
数珠つなぎに機器を連結する、デイジーチェーン方式も使えるようです。
![220px-Hexbus.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/ae78a4e6-7ad0-8574-39d7-f07b6e460810.jpeg)
PCの接続ポートから別のデバイスに接続して、また別のデバイスに接続するみたいなイメージですかね。

### 無線インタフェース
入出力インタフェースには、周辺機器との接続にケーブルを使用しない、無線で通信するタイプのものがあります。代表的なものに**lrDA**と**Bluetooth**があります。

#### IrDa(Infrared Data Association)
赤外線を使って無線通信を行う規格です。携帯電話やノートパソコン、携帯情報端末などによく使われています。赤外線で通信を行うといえばテレビのリモコンなどを思い浮かべますが、赤外線という点が共通しているだけで、IrDAとの互換性はありません。
携帯電話同士で赤外線通信していたことがありますが、そこで使われていたらしいです（今はあまりなさそう）

#### Bluetooth
2.4GHzの電波を使って無線通信を行う規格です。携帯電話やノートパソコン、携帯情報端末のほか、キーボードやマウス、プリンタなど様々な周辺機器をワイヤレス接続することができます。主流ですね。最近。

## まとめ
パラレルの方が良いかと思ったら入出力インタフェースはシリアルインタフェースの方が主流なんですね。
用途によって有力な処理方法が全く違うので勉強になります。
初心者　MySQL8に挑戦する 3

# まずは公式チュートリアル

https://dev.mysql.com/doc/refman/8.0/ja/tutorial.html

　立ち上げて、データベース作って、テーブル作る。
　terminalって、入力しにくい。１行のコマンドならともかく、テーブル作るのはまじめんどう。修正とかしにくいし。って、いきなり25項目もあるテーブルを作る私が悪いのか。テキストエディタにまず入力してから、terminalにコピペ。
　そして、テーブルを確認。

　いったん閉じて、立ち上げ直して、データベースを選んで、テーブルを選んで、確認。また閉じて、立ち上げ直して、選んで、選んで、確認。マニュアル見ず、コマンドを覚えて。

　もういいかな、で、今度はテーブルをしげしげと見る。チュートリアルどおりに設定したのだけれど、すべての項目がnull許容になってる。いや、それは困る。必須項目があるのよ。いや、まあいいか、まだ練習、まだチュートリアル。

　dataを入れてみよう。テキストファイルをロードできるというから、せっせと入力したのに権限がないとかなんとか、エラーが出る。

ステートメントが失敗する場合、使用している MySQL インストールではローカルファイル機能がデフォルトで有効になっていない可能性があります。 これを変更する方法については、セクション6.1.6「LOAD DATA LOCAL のセキュリティー上の考慮事項」を参照してください。

 ところがこの６章がまるで理解できないため、仕方ない、１行１行入力していく方式に変更。それもけっこう面倒なので、またテキストエディタに下書きをして、貼り付ける。

 残念。またエラー。どうも地図情報を扱うgeometryと型指定した項目の扱いが合ってないらしい。どうしよう。

- geometryについて勉強する。
- その行だけ削除して続行する。
- どうせ練習だから、テーブルごと作り直す。

　うーむ。どっちみち、今日は時間切れ。また明日。

https://qiita.com/dongri727/items/86c37ef4053d7ef9c62f

https://qiita.com/dongri727/items/7bbe07e7eaa81134af79
Salesforceのロングテキストエリア項目のデフォルトの見え方を広くする方法

Salesforceにはロングテキストエリアという項目型の項目があります。


この項目には「表示行数」という設定がございます
![表示行数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/40f093e5-c364-9d39-38be-b6f2ef98b051.png)



この「表示行数」の数字を大きく設定すれば、Classic環境の場合、デフォルトの項目の見え方が縦長に表示させることが可能です


例えば以下の画像では
「testlong」項目は表示行数が10。「testlong2」項目は表示行数が3なので、
「testlong」項目のデフォルトの表示幅は「testlong2」項目より大きいことが分かります。

![Classicその２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f123904d-9d9e-e40b-12dc-4786845bae6f.png)


しかし、Lightning環境だと「testlong」項目（表示行数10）も「testlong2」項目（表示行数3）も同じ表示幅だということが分かります。
つまりLightning環境だと「表示行数」の設定は意味がないようです
![lightning環境.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/95ab36e8-9c54-8391-fe9b-386537cd6fe5.png)

もちろん、右下を引っ張れば表示を広くすることは可能です。
![ひっぱる.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/6d51beed-5666-1e26-5ba5-9651e835b448.png)

では、右下を引っ張らないでLightning環境でデフォルトの表示を広く見せる方法はあるのでしょうか。

これは、ロングテキストエリア項目の「デフォルトの値」を設定することで可能といえば可能です。

「デフォルトの値」を設定を下記のような数式で設定します

"・"
& BR() &
BR() &
"・ "
& BR() &
BR() &
"・ "
& BR() &
BR() &
"・ "
![long2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/b118de77-1e11-c61f-c344-23d3deea4f3f.png)


すると、この設定をした後にレコードを作成し保存すると、下記のようにデフォルトの状態でロングテキストエリア項目の表示幅が広がります。
![ロングテキスト３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f149c43b-37cc-1091-b7a1-53255a329c6a.png)





### 補足
（本当は何も・などない空欄がいいと思うのでが、ためしに
""
& BR() &
BR() &
" "
のようなデフォルト値も試したのですがうまくいかなかったです
）


Lightninng環境のロングテキストエリア項目のデフォルトの表示幅は狭いので、ぜひこの小技？をお役立てください！
dockerの容量不足解消〜errcode 28 - no space left on device docker〜

# Dockerの容量が足りなくて、docker-compose up できないとき

ある日いつものように `docker-compose up`をしたら以下のようなエラーが出て立ち上がらなくなった。

`errcode 28 - no space left on device docker`

dockerの容量不足のため、pruneコマンドを利用して使用していないDockerオブジェクトを削除することで解消していく
dockerの公式のドキュメントもある

https://docs.docker.jp/config/pruning.html

## 対応１　使っていないdockerイメージを削除する

```
docker image prune
```

## 対応2 使っていないdocker volumeを削除する

```
$ docker volume prune
```

## 対応3 使っていないdockerコンテナを削除する

```
$ docker container prune
```

## 終わりに
以上のコマンドでDockerの容量を確保してから再度、`docker-compose up`をしたら解消された
Nuxt3環境上Vuetify3でサイドバーメニューを作成する

#Nuxt3環境上Vuetify3でサイドバーメニューを作成してみました

以下のファイルを作成します。
```app.vue
<template>
  <NuxtLayout>
    <NuxtPage />
  </NuxtLayout>
</template>
```

以下のファイルを作成します。
```layouts/default.vue
<template>
    <div>
        <TheHeader />
        <slot></slot>
        <TheFooter />
    </div>
</template>
```

以下のファイルを作成します。
```components/TheHeader.vue
<template>
    <v-app>
        <v-app-bar app flat border class="px-md-6">
            <v-app-bar-nav-icon @click="drawer = !drawer" class="mr-md-4" />
            <v-app-bar-title class="font-weight-bold">
                Nuxt3上で Vuetify3サイドバーを作成
            </v-app-bar-title>
            <v-spacer />
            <v-icon icon="mdi-account" class="mr-1" />
        </v-app-bar>

        <v-navigation-drawer v-model="drawer" app floating class="px-6 py-4">
            <v-list>
                <v-list-item v-for="item in items" active-color="primary" :to="item.path" class="py-3">
                    <v-icon :icon="item.icon" class="mr-6" />
                    <v-list-item-title class="font-weight-bold" v-text="item.title" />
                </v-list-item>
            </v-list>
        </v-navigation-drawer>
    </v-app>
</template>

<script setup lang="ts">
const items = [
    {
        title: 'item1',
        path: '/item1',
        icon: 'mdi-numeric-1'
    },
    {
        title: 'item2',
        path: '/item2',
        icon: 'mdi-numeric-2'
    }]
// ナビゲーションの表示・非表示を制御
const drawer = useState('drawer', () => false)
</script>
```
作成したサイドバーメニューはこんな感じです。
サイドバーメニュー非表示：
![menu1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229009/71ef073b-00a2-d563-1c93-af6a16986566.png)
サイドバーメニュー表示：
![menu2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229009/519de56b-7d40-4c1c-c43e-a22a2359a9af.png)
[Ruby] 複数行テキストのセル・空白行が含まれるCSVから正確な件数を取得する

# 背景
以下のようなシステムの作成中に、登録件数が正確に通知されないことがあった。
* CSVファイルからデータベースにデータを登録したい
* １行につき１件として、複数行のCSVファイルを読み込む
* データがCSVからデータベースに登録されたら、登録件数を取得してSlackで管理者に通知する

# 問題
以下を参考に、`.count`で`"\n"`の数で改行をカウントして行数を取得していたが、
登録件数が倍になって通知されることがあった。
https://rubytips86.hatenablog.com/entry/2014/03/23/091949

# 原因
* 複数行のセルがあると、セル内の`\n`もカウントされてしまう
* 空白行があると件数としてカウントされてしまう

# 解決法
csvfile: 件数を取得したいCSVファイル
header_length: CSVファイルの列数-2
```ruby
column_length = File.read(csvfile).gsub(/,{#{header_length},}\r\n/,'').scan("\r\n").length
```


countは一文字しか検索できないため、scanを使用した。

# 参考
https://qiita.com/Kouch/items/87e6352ef2b8bed73c7b

# 追記
* 列数を使わずに実装する方法をコメント欄にいただきました。
https://qiita.com/YSU250/items/217f2af5741aff3a3924#comment-91ffdc4566adf615be91
https://qiita.com/YSU250/items/217f2af5741aff3a3924#comment-3141155df93c50665241


* 本記事で扱うCSVは以下のフォーマットであると仮定する。
    * レコード区切りは `CRLF` で，セル内改行は `LF`
    * 最終レコードに `CRLF` が付いている
    * 空のセルは `""` で囲まれていない
PythonからMermaidの図表を取得する


## メモ
- 実際にはPythonで画像を生成するのではなく、WEBサービスを利用する
- Pythonはただリクエストパラメータを生成するだけ
- 取得すると書いたが、下記PythonコードではURLの生成まで
- ファイル形式はSVGかJPEG
- リクエストデータ量を減らしたい場合は圧縮のURLを利用する

https://mermaid.ink/

---

## ソースコード
```
code = """
gantt
  title A Gantt Diagram
  dateFormat  YYYY-MM-DD
  section Section
  A task           :a1, 2014-01-01, 30d
  Another task     :after a1  , 20d
  section Another
  Task in sec      :2014-01-12  , 12d
  another task      : 24d
""".strip()

state = {
    'code': code,
}
ascii_bytes = json.dumps(state).encode("ascii")

# base64
base64_string = base64.b64encode(ascii_bytes).decode("ascii") 
print(f"https://mermaid.ink/svg/base64:{base64_string}")
print(f"https://mermaid.ink/img/base64:{base64_string}")

# pako（圧縮）
compressed = zlib.compress(ascii_bytes)
base64_string = base64.urlsafe_b64encode(compressed).decode('ascii')
print(f'https://mermaid.ink/svg/pako:{base64_string}')
print(f'https://mermaid.ink/img/pako:{base64_string}')
```
新規・既存・全ユーザーを一つのテーブルに集計

# 条件違いを一つのテーブルにJOINしたい

### 全UU・月内新規UU・前月既存UUを一つのテーブルに
下記のようなテーブルを作成したいときに使います

| event_date | all_uu | new_uu | repeat_uu |
|:-:|:-:|:-:|:-:|
| 2022-04-01 | 50  | 20  | 30 |
| 2022-04-02 | 30  | 10  | 20 |

#### 方法①新規ユーザーと既存ユーザーそれぞれテーブルを新しく作る

```sql
WITH tmp AS(--テンプレートテーブルを作成
  SELECT DISTINCT
    DATE(timestamp_micros(event_timestamp),"Asia/Tokyo") AS event_date		
    ,user_pseudo_id		
    ,(SELECT value.int_value FROM UNNEST(event_params) WHERE key = "ga_session_number") AS ga_session_number		
  FROM テーブル名	
  WHERE _TABLE_SUFFIX BETWEEN "20220401" AND "20220402"			
    AND
    (SELECT value.int_value FROM UNNEST(event_params) WHERE key = "ga_session_number") IS NOT NULL

),new_uu AS(--新規ユーザーテーブルを作成
  SELECT		
    event_date,		
    user_pseudo_id		
  FROM tmp		
  WHERE	ga_session_number=1	

  
		
),repeat_uu AS(--既存ユーザーテーブルを作成（セッションナンバーが1以外）		
  SELECT		
    event_date,		
    user_pseudo_id		
  FROM tmp		
  WHERE	ga_session_number <> 1	

)
SELECT		
  tmp.event_date,		
  COUNT(DISTINCT tmp.user_pseudo_id) AS all_uu,		
  COUNT(DISTINCT new_uu.user_pseudo_id) AS new_uu,		
  COUNT(DISTINCT repeat_uu.user_pseudo_id) AS repeat_uu,		
FROM tmp  
LEFT JOIN new_uu		
  ON	new_uu.event_date=tmp.event_date
LEFT JOIN repeat_uu	
  ON	repeat_uu.event_date=tmp.event_date
GROUP BY 1		
```

:::note warn
問題点
指定期間内の新規ユーザー、かつ再訪したユーザーが新規と既存どちらにも集計され重複する
:::


#### 方法②全ユーザーから新規ユーザーを差し引いたテーブルを作る
```sql
WITH tmp AS(--テンプレートテーブル（全ユーザー）を作成
  SELECT DISTINCT
    DATE(timestamp_micros(event_timestamp),"Asia/Tokyo") AS event_date		
    ,user_pseudo_id		
    ,(SELECT value.int_value FROM UNNEST(event_params) WHERE key = "ga_session_number") AS ga_session_number		
  FROM テーブル名		
  WHERE _TABLE_SUFFIX BETWEEN "20220401" AND "20220402"			
    AND
    (SELECT value.int_value FROM UNNEST(event_params) WHERE key = "ga_session_number") IS NOT NULL

),new_uu AS(--新規ユーザーテーブルを作成
  SELECT		
    event_date,		
    user_pseudo_id		
  FROM tmp		
  WHERE	ga_session_number=1	

  
		
),repeat_uu AS(--全ユーザーテーブルから新規ユーザーテーブルを引く（全ユーザー - 新規ユーザー）
    SELECT event_date,		
    user_pseudo_id
    FROM tmp　--テンプレートテーブル（全ユーザー）

    EXCEPT DISTINCT

    SELECT event_date,		
    user_pseudo_id
    FROM new_uu --新規ユーザーテーブル

)
SELECT		
  tmp.event_date,		
  COUNT(DISTINCT tmp.user_pseudo_id) AS all_uu,		
  COUNT(DISTINCT new_uu.user_pseudo_id) AS new_uu,		
  COUNT(DISTINCT repeat_uu.user_pseudo_id) AS repeat_uu,		
FROM tmp  
LEFT JOIN new_uu		
  ON	new_uu.event_date=tmp.event_date
LEFT JOIN repeat_uu	
  ON	repeat_uu.event_date=tmp.event_date
GROUP BY 1
```

:::note info
問題点解決
指定期間内の新規ユーザー、かつ再訪したユーザーが重複されずに済む（新規のみに集計される）
:::
Ruby3.1を触ってみる(debug)

# 0. はじめに

[Ruby 3.1](https://www.ruby-lang.org/ja/news/2021/12/25/ruby-3-1-0-released/) がリリースされ半年が経ちましたが、なかなか深くまで触れていないので手を動かしながらリリース内容を要所で見て所感を綴ろうかなと思います。

今回は 新規のデバッガー debug gemです。
既存でもデバッガー自体はありましたがそれと比較してみようかと思います

# 1. リリースノートを見てみる

> デバッグ時の速度低下を極力生じないよう改善
リモートデバッグのサポート
リッチなデバッガフロントエンドに対応（現在 VSCode と Chrome ブラウザに対応）
マルチプロセス、マルチスレッドプログラムのデバッグに対応
カラフルな REPL
そのほか、Record & Replay 機能やトレース機能など、様々な便利機能
...
Rubyにはこれまでも lib/debug.rb が同梱されていましたが、あまりメンテナンスされておらず、性能や機能に問題がありました。debug.gem はこれを完全に置き換えます。

引用: https://www.ruby-lang.org/ja/news/2021/12/25/ruby-3-1-0-released/

書かれていることはなんとなくわかりますが、実際にはどんなものだろうって言う感じでした。。。

# 2. 触ってみる

使い方を [README](https://github.com/ruby/debug) を拝見しながら触ってみます

```sample_1.rb
a = 1
b = 2
binding.break
c = 3
d = 4
binding.break
p [a, b, c, d]
```
```
$ ruby -r debug sample_1.rb
```

コマンド実行すると以下のようにブレイクポイントで止まりました
![スクリーンショット 2022-07-14 22.27.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226348/6f259243-dded-41d6-d4c9-9284a1ce47f8.png)

ちなみに比較として２系のrubyのデバッガーモードで実行すると以下のような感じでした(個人的には2系の標準デバッガーはお世辞にも使いづらく感じていて外部gemである [pry](https://github.com/deivid-rodriguez/pry-byebug) を使っていたりしました)

![スクリーンショット 2022-07-14 22.37.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226348/13552afa-413a-0ef8-c35a-01895731cf8b.png)

こちらを動作確認した限りでの所感は以下の通りでした

### 1. カラフル
- デバック実行時のREPLがカラフルですね！中には黒白onlyが好みの人もいるかもしれませんが、私はこんな感じでカラフルなのは好きです

### 2. コマンドの内容を入力しながら確認できる
- 画像見ていただけるとわかると思いますが、コマンドを入力しているとエイリアス→実際のコマンドの内容がコマンド横に横で教えてくれます
  - もちろん help(h) でコマンド一覧を見ることはできますが、ぼんやりこれで合っていたっけ？　っていうものをコマンドを打ちながら確認できるのはありがたかったです (特にrubyでも色々なデバッガーのgemがあったり言語によっては微妙にコマンドに差異があったりするので助かります)

### 3. rdbg コマンドでコードを変更せずにデバッグ可能
- ブレイクポイントである　`binding.break(binding.b)` を入れなくても rdgbコマンドでコード先頭でデバッガーが起動できます。短いコードやコードを汚したくない時などは便利かもしれないですね！

```sample_2.rb
a = 1
b = 2
c = 3
d = 4
p [a, b, c, d]
```
```
$ rdbg sample_2.rb
```

![スクリーンショット 2022-07-14 23.09.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226348/0ee88a53-bc5f-904c-bf92-30ffef238d68.png)

- 他にも `rdbg` コマンドは rake etc... のコマンドオプション `rdbg -c -- ...`  とすることで ruby コマンド以外も実行時に使用できるらしいです。汎用性が高いのは良いですね！

### その他

- こちらでは紹介しておりませんがリモートデバッグ機能があったりと面白い使い方ができるのは良いですね。

参考: [Rubyの新しいデバッガを試してみる](https://qiita.com/suketa/items/52c60d79332c9a24f973)

# 3. 最後に

今回は3.1で追加されたdebug機能を紹介しました。
新しいデバッガーは標準のものをそのまま使用しても良さそうと思えるものでした。
機会があればその他の機能も触ってみたいと思いました。

今回の動作確認する上で使用したコードは以下で公開しておきます！

[ruby_3_1_sandbox/1_debug](https://github.com/saku888/ruby_3_1_sandbox/tree/main/1_debug)
mysqlやAWSの本番環境に接続しようとした時、Permission denied (publickey)

## 原因
githubの公開鍵を過去に誤って変更してしまっていたから。

## 解決までの流れ
### ①公開鍵を保存してる場所を確認
github公開鍵は/Users/****_****/.ssh/id_rsaのパスを合わせる。

以下のコマンドを打って、pwdで.sshのパスを確認する。

```
ls ~/.ssh
cd ~/.ssh
pwd

pwd => /Users/****_****/.ssh
```

実際にパスを設定する。
以下のコマンドで中身を見る。
```
vim ~/.ssh/config
```
IdentifyFillの表記が確認できる。
先ほど確認したパスをそれにつづけて書き保存する。
```
IdentifyFill /Users/****_****/.ssh/id_rsa
```

ここまでで設定はOK

### ②公開鍵がしっかり設定されているか確認した
以下のコマンドで公開鍵が見れる。
```
vim ~/.ssh/id_rsa.pub
```

ここで公開鍵を確認したところ、過去に誤って、公開鍵を変えていたことが判明。


新しく公開鍵を設定し直し、設定も変えて、再びmysqlに繋いでみると、接続できた。
UE5がアセット移行時に自動的にMigratedフォルダを作ることがある話

# はじめに
Unreal Engine5も正式バージョンを迎えてしばらく経ちます。
アセットの移行で、UE5.0EA以降から新しい変更があったので紹介させていただきます。

# Migrateとは
日本語版では `移行`です。プロジェクトからプロジェクトにアセットを送り込むUE5の標準機能です。

# 何が起こるか？
UEがメッセージを表示します。このメッセージは「違う場所に置くぞ」という意味の警告を書いています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75653/258fd694-bfb9-9e44-b64e-0f56b0de9b92.png)

# なぜ起こるか？
直接の原因はプロジェクト間のPluginが不一致である時に起こります。
ただ、この条件も一定にはならず、Pluginによっては移行をUE5から拒否され、エラーが表示されることもあります。

該当のエンジンコード部分です。ここを見るためにはEpic GamesのOrganizationに参加する必要があります。
https://github.com/EpicGames/UnrealEngine/blob/release/Engine/Source/Developer/AssetTools/Private/AssetTools.cpp#L3065-L3089

# 対策
このメッセージが出力される時はPlugin状況を見直すか、アセット参照をやり直すなどする必要が出てきます。
移行のためにきれいにするのが煩わしいのであればMigratedフォルダに入るように移行してしまってから、移行先プロジェクトで再配置する必要があります。
ガチャのひみつ（重み付き乱択アルゴリズム）

# 確率ってなんだっけ？
　確率とは何なのだろう。学校で習った確率は、起こりうるすべてのパターンの中から、ある一つの出来事が起こる可能性の高さ（あるいは低さ）を計算で求めたり、それをパーセントで表したりするものであった。
![サイコロの無料素材4.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362900/6ff2533d-eb5d-6826-be57-77c5d5e331b0.jpeg)
　例えばサイコロを振って、１の目が出る確率、２の目が出る確率、３の目がでる確率、４の目がでる確率、５の目が出る確率、６の目が出る確率。これらがすべて６分の１の確率なのは、起こりうる出来事のパターンが６パターンあるが、実際にサイコロを振ったときにでる目は６パターンのうちの１パターンだからというわけだ。


```php
<?php
$dice = array(
    "1の目"    => 1,
    "2の目"    => 2,
    "3の目"    => 3,
    "4の目"    => 4,
    "5の目"    => 5,
    "6の目"    => 6
);

$result = rand(1, 6);
echo array_search($result, $dice);
```
　プログラムで表すと、このような感じである。乱数を生成する関数がどのような言語にもあるから、それを使って1～6の範囲で乱数を生成すればよい。サイコロの目を出すプログラムであれば、これでいい。なぜならどの目も同じ確率で出るからである。
# ガチャやくじ引きはサイコロとどう違うか

　今度はガチャやくじ引きについて考えてみよう。これはサイコロとは異なり、１個しかない１等や、膨大な数の６等といったものまで出る確率が様々に異なるものの中から１つの結果が抽選される。
![gachagacha_atari_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362900/459c158a-daa2-0ab9-640d-d00a9c0acf3f.png)

　物事の確率というのは、0%～100%の間に納まっている必要がある。非常に珍しいものは0.0000000000001%で出るとか、そういう希少性を持つものもあるだろう。一方99.999997%で出るようなハズレみたいなものもあったりするだろう。そして、商品は後から新しいものが足されたり、誰かが獲得したことによってなくなってしまったりする。そのたびにすべての商品の抽選確率は変化していなければならないように思えてくる。そんな複雑なことを一体どうやって実装できるのだろうか？
# 重み付き乱択アルゴリズム

　そこで登場するのが重み付き乱択アルゴリズムである。仰々しい名前なので、自分にはとても理解できそうもないと身構えてしまいそうになるのをこらえて、読んでみてほしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362900/eae9d9f1-64b6-c9b7-4bb5-9369d4403782.png)
　こんな感じの図を考えてみよう。Aに1、Bに2～4、Cには5～10、Dは11～20、Eに21～130と書いてある。なんだこれはと思うだろう。これは商品Aは1、商品Bは2～4、商品Cは5～10・・・というような意味だ。で、下にはそれぞれの商品の数字の幅を合計した計算が書いてある。数字の幅はその商品の出やすさ、出にくさで狭くとったり広くとったりする。商品Aはめったに出ない。商品Eはかなり出やすい。この図の状態で、合計値である130までの乱数を一つ出すと、その値はこの図の中のどれかの範囲に収まる。驚くほどわかりやすい。それぞれの商品の確率を計算したければ計算することもできる。たとえばこうなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362900/8c6b3ec2-a401-cd89-28b7-f8c8c70e326a.png)
　重み付き乱択の基本的な理屈は、たったこれだけのことだ。しかし、実装上ちょっと困った事がある。2～4とか、5～10などといった範囲を持った値を扱うのが面倒だという事である。だから大抵はこういう風に逆に考える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362900/155d80d3-7a12-797f-81bb-99622870be67.png)
　各商品の持つ値（重み）を合計した値までの乱数を出す。その値がどの商品の値の範囲にハマっているかで抽選することには変わりない。この図を帯状のダーツのマトだと考えてみて、どこが当たりやすくどこが当たりにくいか想像するとイメージがわくと思う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362900/d9dc2149-0a88-b82a-9aaf-0c87944b52e1.png)
　例えば、商品Dが出るのは、乱数が120～111の間だった場合だ。商品Aは乱数が130を出した時しか当たらないという事になる。
　プログラムで書き表すと、このような感じである。
```php
<?php

$dice = array(
    "商品A"    => 1,
    "商品B"    => 3,
    "商品C"    => 6,
    "商品D"    => 10,
    "商品E"    => 110
);

$sum  = array_sum($dice);
$rand = rand(1, $sum);

foreach($dice as $key => $probability)
{
    if (($sum -= $probability) < $rand)
    {
        echo $key . "がでました。";
        break;
    }
}
```
　こんな風に動作する。（商品Cが出てラッキー）
![lottery.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362900/d53ff24f-1401-2da9-9b48-5979acfc0e13.gif)
# まとめ
　いかがだったろうか。原理自体は、とてもシンプルなものだということがお伝えできていれば幸いである。もし、興味を持たれるなら、乱数を生成する関数自体の実装がどうなっているのかということについても調べてみると面白いかもしれない。いずれにしても、確率というものは不思議なものである。
python 初心者向けオブジェクト指向のコード

<H1>コンストラクタの定義</H1>

```python
class Vehicle:
    def __init__(self,m,c): #コンストラクタの定義
        self.model = m
        self.color = c
        self.speed = 0
car = Vehicle("コンパクトカー","赤") #carとゆうオブジェクトを作る
print(car.model)
print(car.color)
print(car.speed)

```
![スクリーンショット 2022-07-15 17.44.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614609/c1bc1d1e-62a9-23e4-5de7-45417592e532.png)

<H1>オブジェクトに機能を持たせる</H1>

```python
class Vehicle:
    def __init__(self,m,c):
        self.model = m
        self.color = c
        self.speed = 0
    def info(self): #infoとゆうメソッドを作成
        print("車種 " + self.model)
        print("色 " + self.color)
        print("速度 {}km/h".format(self.speed))
        
car = Vehicle("コンパクトカー","赤")
car.info()
```
![スクリーンショット 2022-07-15 17.53.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614609/99bbfe01-7b0e-f934-1edd-38175ed26562.png)

<H1>継承とオーバーライド</H1>

```python
import time

class Vehicle:
    def __init__(self,m,c):
        self.model = m
        self.color = c
        self.speed = 0
        self.meter = 0

    def info(self): #infoとゆうメソッドを作成
        print("車種 " + self.model)
        print("色 " + self.color)
        print("速度 {}km/h".format(self.speed))

    def set_speed(self, s):
        self.speed = s

    def move(self):
        self.meter += int(self.speed*1000/60/60) #m/毎秒に直す
        print("{}は{}m進みました".format(self.model, self.meter))

class AirVehicle(Vehicle): #Vehicleを継承
    def __init__(self,m,c,t): #スーパークラスの__init__をオーバーライド
        super().__init__(m,c)
        self.takeoff = t

    def move(self):
        self.meter += int(self.speed*1000/60/60)
        if self.speed >= self.takeoff:
            print("{}は空を{}m飛びました".format(self.model, self.meter))
        else:
            print("{}は地上を{}m進みました".format(self.model, self.meter))
            
car = Vehicle("コンパクトカー","red")
car.set_speed(100)
car.info()
aircar = AirVehicle("エアカー","blue",200)
aircar.set_speed(240)
aircar.info()

def main():
    for i in range(10):
        car.move()
        aircar.move()
        time.sleep(1)
main()
```
![スクリーンショット 2022-07-18 5.08.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614609/7b3f0b00-e324-040d-6967-cbca99ad93c5.png)
Unreal Engine 5 初心者向け資料まとめ

# はじめに
今回はUnrealEngine初心者向けの、チュートリアルを紹介します。

紹介するもの全てを実践したわけではありません。予めご了承ください。


# 対象者
- UnrealEngineをこれから学びたい方

- ゲームを作ってみたい方


# Game meets
2022年6月30日に行われた「Game meets」#16 のアーカイブ動画と資料です。

学習の王道ルートを紹介しており、実践のためのチェックリストも公開されているので活用してみてください。

まずはこの資料に目を通してから学ぶのが良いかと思います。

https://historia.co.jp/archives/28846/


# ゲームメーカーズ
1時間でできる内容になっているのでお手軽に挑戦できます。

また、プログラミングの知識を一切必要としないので、未経験の方でも安心して挑戦できます。

https://gamemakers.jp/howto/


# Unreal Online Learning
公式のチュートリアルにはUE5の情報が充実しています。

ゲーム制作だけではなく、マンガ・イラストでの活用方法や背景アーティストのためのチュートリアルもあります。

https://dev.epicgames.com/community/learning?application=unreal_engine


# UNREAL FEST
各講演のスライド・アーカイブ動画が確認できます。

YouTubeチャンネルでは日本語の講座や大型勉強会などが配信されています。

https://unrealengine.jp/unrealfest


# YouTube
日本語字幕付きのUE5初心者向けのチュートリアルで、ボリュームがあり内容も濃いのでお勧めです。

英語の動画が多いですが、多くの動画には字幕がついており情報もたくさんあるので是非調べてみてください。

https://www.youtube.com/watch?v=k-zMkzmduqI

https://www.youtube.com/watch?v=ptCN4cysDig&list=PLncmXJdh4q88DFCEVuGpOY3AGQwBvoQnh


# イベント
### Unreal Engineによるものづくり分野のコンテンツ開発
8月22日(月)、23日(火)13:00～15:00 にオンラインイベントが開催されます。

開発環境構築ガイドもあるので、UEを使ったことがなくても興味のある方は是非チェックしてみてください。

http://www.hro.or.jp/list/industrial/research/iri/news/22/work/223ddk.pdf


### Automotive Summit Japan 2022
自動車業界向けのオンライン イベントです。

参加費無料の事前登録制となります。ぜひご登録ください！

https://www.unrealengine.com/ja/events/automotive-summit-japan-2022?lang=ja


### Unityゆるもく勉強会 in 島根 #24
名前はUnityゆるもく勉強会ですが、Unity, UEチュートリアルサポート欲しい枠があります。

先着順で2名までなので、興味のある方はお早めにお申し込みください。

また、わからない所はすぐに質問できるのでおすすめです。

https://chiikiokoshi-vr.connpass.com/event/254360/


# 最後に
どうでしたか。

今回は無料で始められるものを集めてみました。

解説が丁寧で内容も濃いので、初心者だけでなく中級者でも勉強になる内容だと思います。

ゲーム開発者向けの情報サイトがあり、資料も豊富で勉強になると思うのでぜひ利用してみてください。

https://gamemakers.jp/
map(&: ~ )の(&:)とはなんなのか

# map(&: ~ )の(&:)とはなんなのか
こんにちは。
今日は、AtCoderを解いていて、よく見かけたmap(&:~)とはなんなのか調べたので、備忘録くらいの感覚で書いていきたいと思います。

## mapメソッドとは
まず初めにmapメソッドとは。

[公式リファレンスマニュアル](https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/collect.html)より
>各要素に対してブロックを評価した結果を全て含む配列を返します。
>
> すべて 3 倍にした配列を返す
　p (1..3).map {|n| n * 3 }  # => [3, 6, 9]

とのことで、この例題を見るとわかりやすいですよね。
mapのあとにあるブロックを１、２、３に適応していく。
このような使い方だと自分でも使えそうです。

しかし、AtCoderでよく見るのは、入力に対してmapメソッドを使う場面です。
よくある問題の入力値の獲得方法として、
`入力
"12 3"`
`結果 a= 12 b = 3`
のように複数の値の獲得をスペースを含めた一回で値を獲得します。

この時に必要になるのが、`map(&: ~ )`なんですねぇ

## (&: ~ )について
:::note warn
米 スペースを含めた入力についてはsplitメソッドを使いスペースごとに一つの値として区切り配列にしまうようになっています。
:::

では、本題の(&: ~ )について。
先ほどもあった通り、mapメソッドはブロック適応し結果を返します。
でも`map(&: ~ )`って公式に書いてあった{|n|}。これないじゃん。`(&: ~ )`これなにしてんねん。
なりますよねぇ。

肝心なのは、`&`！
この`&`はそのメソッドをブロックとして展開する役割があるとのこと！
つまり
`map(&  )`は`map{}`というふうに展開される！

そして、入力された値は数値として獲得したいので、`map(& to_i)`として値を獲得できそうです。
しかし、現場の`a.map(& to_i)`では、`"to_i"`という文字列を適応してしまいます。
なので`(&:to_i)`のようにシンボルとして渡すことでメソッドとして渡すことができる。ということでした！！


```ruby
#式にて捕捉。

(1..3).map(& to_i) 
# これでは、
# => 1."to_i", 2."to_i", 3."to_i" になってしまう。
 
(1..3).map(&:to_i) 
#:をつけることで
# => 1.to_i, 2.to_i,3.to_i　となりメソッドとなる。
# また、上記は下記と同じこととなる。
(1..3).map{|x| x.to_i}

```
クソお世話になった記事

https://teratail.com/questions/1410

では。
TypeORM テーブル全件削除（TRUNCATE、レコードのみ）削除する方法

TypeORMでテーブルのレコード削除をする際、大量のレコードを全て削除したい場合があると思います。
その際、以下のコードで実現可能です。

削除したいテーブル(Entity)のクラス名を仮に`"TestEntity"`とします

他のテーブル(Entity)と外部参照がないテーブルにおいては以下の`clear()`が使えます
これがSQLの`TRUNCATE TABLE`にあたります。

```
connection.createQueryRunner()
.manager.clear(TestEntity)
```

外部参照キーが設定されている場合は、TRUNCATEできないため、代わりに`delete().from()`を使います。

```
connection.createQueryBuilder()
  .delete()
  .from(TestEntity)
  .execute()
```

これで全件削除完了です。`delete().from()`を使って削除する場合は、DBのスペックに処理時間が依存しますので、その点だけご注意ください。

-参考記事-
[Delete using Query Builder](https://typeorm.io/delete-query-builder)
SourceGeneratorを利用する.NET6のWPFプロジェクトでCS0102エラーが発生するのは.NET SDK 6.0.302のバグのせい

急に`CS0102`が出てビルドが通らなくなった！という人で、以下の条件に当てはまる場合はNET SDKのバグを踏み抜いた可能性があります。~~おめでとうございます。~~

* WPFプロジェクト
* ターゲットフレームワークが.NET 6.0
* SourceGeneratorの生成コードでエラーになる
    * CS0101: 名前空間 '名前空間名' は既に '型名' の定義を含んでいます
    * CS0102: 型 '型名' は既に '~~' の要素を含んでいます
    * CS0111: 型 '型名' は、'~~' と呼ばれるメンバーを同じパラメーターの型で既に定義しています
    * CS0579: 'AttributeUsage' 属性が重複しています
        * ジェネレータで属性を生成している場合
    * CS0757: 部分メソッドでは、複数の実装宣言を含むことができない場合があります
        * ジェネレータで`partial`メソッドを定義/実装している場合
* 開発者用コマンドプロンプト(`Ctrl+@`)で`dotnet --info`を実行したとき、.NET SDK 6.0.302がインストールされている

**原因は  .NET6 SDK 6.0.302 のせい**だそうです。

https://github.com/dotnet/wpf/issues/6792?_sm_byp=iVVDJnws2rqVnrMR

https://github.com/thomasclaudiushuber/mvvmgen/issues/43?_sm_byp=iVVDJnws2rqVnrMR

https://github.com/dotnet/sdk/issues/26542?_sm_byp=iVVDJnws2rqVnrMR

いや～困りますね！

# 対応策

ビルドに使用するSDKを古いバージョン、つまり.NET SDK 6.0.301にすればよいようです。

https://github.com/dotnet/wpf/issues/6792#issuecomment-1183471011

1. 6.0.301をインストールしていない場合はインストールする
    * https://dotnet.microsoft.com/ja-jp/download/dotnet/6.0
    * ↑の 6.0.6 にあります
1. .slnファイルと同じ場所に`global.json`ファイルを作成します。
1. 以下を記述して保存し、ビルドします。

```json
{
    "sdk": {
        "version": "6.0.301",
        "rollForward": "disable"
    }
}
```
pythonのselenium使ってweb操作自動化やってみた

こんにちは、初めての投稿です。

・自己紹介
私は、自動車メーカーで生技、製造の仕事をしています。
会社で受けたAIに関する教育で、AI技術に感動し、
Pythonの勉強を１年半前からしています。
業務では、AIを使用した外観検査の自動化や工場DXに関する仕事もしています。

・今回は最近勉強したことの紹介をしてみたいと思います。
youtubeで、「いまにゅ」さんがやっていたwebスクレイピング入門でweb操作の自動化を紹介していて面白そうだと思い、やってみました。
今回はSBI証券へのログインを自動化してみました。

参考動画は下記です。
https://www.youtube.com/watch?v=VRFfAeW30qE&t=856s

①まずはwebドライバーをインストールします。
　今回はMicrosoftEdgeのドライバーを下記のサイトからインストール。
　https://developer.microsoft.com/ja-jp/microsoft-edge/tools/webdriver/
　
②seleniumとtimeをpipでインストールし、インポート
```ruby:qiita.rb
from selenium import webdriver
import time
```

③webドライバーを使用して、ブラウザの起動、SBI証券のログインページまで飛ぶ
　コードは下記です。
```ruby:qiita.rb
browser = webdriver.Edge(executable_path="msedgedriver.exe")
url='https://www.sbisec.co.jp/ETGate/ #SBI証券のURL
_ControlID=WPLETmgR001Control&_DataStoreID=DSWPLETmgR001Control&burl=search_home&cat1=home&cat2=shop&dir=%2Fshop&file=home_shop.html&getFlg=on'
browser.get(url)
time.sleep(1)
```
③デベロッパーツールを使用して、ログインのユーザーネームとパスワードの要素情報を取得（右クリック→開発者ツール）
![デベロッパーツール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735190/3e6b2320-be4d-7495-01a3-3e196b460af1.png)

④要素情報をもとに、ユーザーネームとパスワード自動入力
```ruby:qiita.rb
elem_username1.send_keys('********')#自分のユーザーID
elem_password1.send_keys('*******')#自分のパスワード
time.sleep(1)　#待機時間
elem_login_btn1.click()
time.sleep(1)
```

・所感
　web操作の自動化は初めてだったので。勝手に画面が動き出したとき感動しました。。。すごい。。。笑
【初心者】労災減らしたい！LINEでヒヤリハット報告をしてもらい、スプレッドシートに入力できるようにした！

# はじめに
人事部ではないけど、労務管理しています。
最近の悩みは、労災が減らないこと。。。
どうしたら、安心安全に働いていただけるのか、考えてみました。

「ヒヤリハット」って言葉、聞いたことありませんか？
簡単に言うと、危なかった～:scream:って思った事です。

それぞれ場所は違っても、危険な場所や事案を共有できれば、
注意して労災が減るかも！
これが、今回の初挑戦になりました。


# 準備
[LINE Developers](https://developers.line.biz/ja/)　の登録
[make](https://www.make.com/)　の登録

# 作り方
はじめてなので、単純に作ってみました。
ポイントは、報告していただいたら、お返事をすること。
![記事投稿①ー１.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727502/750a331e-8b0d-c0cd-1065-d9f244124818.jpeg)

# 実装
できるかな～？:pray_tone1:

https://twitter.com/natsupariri/status/1547828839614939136

おぉ～動いた！
スプレッドシートはどうかな？

![記事投稿①ー4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727502/43133657-974c-527f-32c4-bf8e6f5d88fa.jpeg)

ちゃんと入力できてる！！！
初心者でもできるなんて、感動～😢

お返事は、時期によってかえるのもありかと。
例えば・・・
夏の暑い時期は、「水分をこまめにとって、熱中症に気をつけましょう」
冬の寒い時期は、「ぎっくり腰防止！体をほぐすために、軽く準備運動を
しましょう」
こんな感じで、報告をいただきつつ、注意喚起して、労災を減らせれば
いいなと思っています。


# 最後に
今回はじめての挑戦をしました。
はじめからつまづいて、途中でもう無理かも！と何度も思いました。
こんな簡単なのに、何言ってるの！と、後で思うことでしょう。。。

実際、この記事を書いていて、最後まで書いたのに半分消えました(笑)
初心者の方、右下の下書き保存をすることをおススメします！
私は、消えてからこの機能を使いました:relaxed:もうネタです。
これもきっと良い想い出になることを信じてます。

今回の「ヒヤリハット報告」を基にして、報告するものに関しては、
応用していけたらと考えています。

最後まで、お読みいただき、ありがとうございました！
ヘッダー、フッターを作っていく

# ハッダーを作っていく
```html
<li>...<li>
```
を使うと点（・）がつくからこれを外す。
つまりこの要素にプロパティをつける。
```css
li {
  list-style: none;
}
```
これで点が外れる
# 実際使ってみる
```application.css
li {
  background-color: #808000;
  list-style: none;
}
```
# 気づき
点が消えた。成功！

# ヘッダーのメニューを横並びにする。

```  application.css
.title {
  background-color: #00ffff;
  font-size: 36px;
  float: left;
}

li {
  background-color: #808000;
  list-style: none;
  float: left;
```

## 気づき
なんかそれっぽくなっていきた。

# ```padding``` 要素の余白をつける
padding-top（上）,padding-right（右）,padding-bottom（下）,padding-left（左）
それぞれの余白を作ることができる。
上下右左を書くことがめんどくさいので省略形がある。

```css
padding: 10px, 20px, 30px, 40px;
```

# フッター
```html
    <div class="footer">
      <!-- <div>要素を追加し、「footer-logo」というclassをつけてください -->
      <div class="footer-logo">Progate</div>
      
      <!-- <div>要素を追加し、「footer-list」というclassをつけてください -->
      <div class="footer-list">
        <li>*****</li>
        <li>***</li>
        <li>********</li>
      </div>
      
    </div>
```
# 入れ子のセレクタ
特定のクラスのセレクタにプロパティで指定する
## 例
```css
.header_list li {}
```
上のようにクラスとセレクタをスペースを入れて書く。
PowerShellでファイルのレコード長を調べるワンライナーコマンド

元ネタは、google先生でたくさん転がってるけど自分用に
編集したので備忘録的にまとめた。

ファイルの種類により、　-Encoding を気を付けましょう。

```Powershell
Get-ChildItem -Filter "*.csv" -Recurse | ForEach-Object { $filename = $_.Name; Get-Content $_.FullName -Encoding Ascii | ForEach-Object { $i = 0 } { $i++; [PSCustomObject] @{ filename = $filename; length = $_.Length} } } | Sort-Object filename -Unique | Format-Table -AutoSize
```
ステージしたものをないことにする

# ステージの内容をHEADに合わせる。
直前のコミット以降の修正を全て捨てる方法だ。
作業ツリーの内容が前の状態に上書きされる。

## ```git reset```　
* HEADを履歴の中で移動させるコマンド
* ステージや作業ツリーの内容をHEADに合わせる。

## ```git reset --ファイル```
オプション引数のファイル名を指定するとそのファイルだけHEADの状態に戻す。

## ``` git reset --hard ```
作業ツリーの内容もHEADの状態に戻す。

# 演習
hello.txtを修正してステージし、その後で、```git reset --hard```すると、ステージと作業ツリーが元の状態に戻ることを確認しよう。
```git diff```を使うといい。

## 気づき
この操作をすると、コミット前の修正を全て捨てることになるのでステージされる。
### ```git diff```
* ファイルの間の差を表示する。
* 作業ツリーとステージの差を出力する。

## 演習を解く
```hello.txt
Hello!
I am a student.
hogehogehogehoge!!
hogehoge!!
```
```
**********@mbp training % git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   hello.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	.gitignore

no changes added to commit (use "git add" and/or "git commit -a")
```
```
**********@mbp training % git diff
diff --git a/hello.txt b/hello.txt
index ****************
--- a/hello.txt
+++ b/hello.txt
@@ -1,4 +1,5 @@
 Hello!
 I am a student.
 hogehogehogehoge!!
+hogehoge!!
```
```
************@mbp training % git reset --hard
HEAD is now at a2f6d35 演習2.13.2のためにコミットする
```
```
***************@mbp training % git diff
***************@mbp training %
```
```
*************@mbp training % git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	.gitignore

nothing added to commit but untracked files present (use "git add" to track)
```
```hello.txt
Hello!
I am a student.
hogehogehogehoge!!
```
ステージの内容が消えた。
request spec 以外でも `get` や `response` を使うには

結論から言うと以下のように呼び出すことが出来ます。
バージョンは rspec (3.11.0) です。

```ruby
RSpec.describe MyClass do
  let(:integration_test) { ActionDispatch::IntegrationTest.new(nil) }
  context do
    it do
      integration_test.get('/path/to')
      expect(integration_test.response.status).to be 200
    end
  end
end
```

---

Request spec 以外のクラスのテストでどうしても API を呼び出した結果のレスポンスが欲しい場合、どうやって呼び出すか調べてみました（そもそもそういうテストは書くべきでないという話は置いといて）。

Request spec 内で `binding.pry` して止めてみます。

```ruby
RSpec.describe MyController, type: :request do
  it do
    binding.pry
  end
end
```

`get` がどこで定義されているか調べてみます。

```ruby
> method(:get).source_location
=> ["/Users/kurashita/TestApp/vendor/bundle/ruby/3.0.0/gems/actionpack-6.1.6/lib/action_dispatch/testing/integration.rb", 369]
```

以下に定義されていることがわかりました。

```ruby:TestApp/vendor/bundle/ruby/3.0.0/gems/actionpack-6.1.6/lib/action_dispatch/testing/integration.rb
%w(get post patch put head delete cookies assigns follow_redirect!).each do |method|
  # reset the html_document variable, except for cookies/assigns calls
  unless method == "cookies" || method == "assigns"
    reset_html_document = "@html_document = nil"
  end

  definition = RUBY_VERSION >= "2.7" ? "..." : "*args"

  module_eval <<~RUBY, __FILE__, __LINE__ + 1
    def #{method}(#{definition})
      #{reset_html_document}

      result = integration_session.#{method}(#{definition})
      copy_session_variables!
      result
    end
  RUBY
end
```

`ActionDispatch::Integration::Runner` モジュールに動的に定義されているようです。
このモジュールは `ActionDispatch::IntegrationTest` でインクルードされているのでこれをインスタンス化すれば使えそう、というところであとは継承してるクラスをたどって行くだけなので割愛します。

ちなみに以下のコードで、
```ruby:actionpack-6.1.6/lib/action_dispatch/testing/integration.rb#L368
module_eval <<~RUBY, __FILE__, __LINE__ + 1
  def #{method}(#{definition})
    #{reset_html_document}

    result = integration_session.#{method}(#{definition})
    copy_session_variables!
    result
  end
RUBY
```
`integration_session` の同名のメソッドを呼んでおり、この中身は `ActionDispatch::Integration::Session` クラスのインスタンスなのでこれを呼ぶことでも使用可能です。

```ruby
let(:session) { ActionDispatch::Integration::Session.new(Rails.application) }
it do
  session.get('/path/to')
end
```
VSCodeショートカット一覧

自分が愛用しているatomが終了してしまう悲しさから、仕方なくvisual studio codeを使ってみることにしたのだけれど、なかなか拡張機能が豊富なので、本格的にエディタ利用するためのショートカット一覧メモ。
使い始めたばかりなので、適宜更新します。

mac基準。

# ショートカットキー一覧
|キー|説明|備考|
|--|--|--|
|cmd + b|サイドバーの表示/非表示||
|cmd + shift + e|エクスプローラーに移動||
|cmd + shift +f|複数ファイルからの検索(grep)||
|ctrl + shift + g|ソースコード管理||
|cmd + shit + d|起動及びデバッグ||
|cmd + shift + x|拡張機能の管理||
|cmd + shift + p|コマンドパレット||
|cmd + shift + k|カーソル行削除||
|cmd + shift + \ |次の対応する{に移動する移動できない||
|cmd + shift + h|置換||
|cmd + shift + alt + 矢印|矩形選択||
|cmd + ]|インデント下げる||
|tab|インデント下げる||
|shift + tab|インデント上げる||
|ctrl + alt + f|フォーマット（プログラムとかを整形）|インストールしている拡張機能がサポートする言語に依存する|

## Gitカテゴリ
|キー|説明|備考|
|--|--|--|
|cmd + enter|commitコメント後にショートカットを打つとそのままcommit||
|cmd + shift + p|push|コマンドパレットにてpushを検索すると、最近pushしたリポジトリが出てくるのでそのままpushできる|

## 実行系
|キー|説明|備考|
|--|--|--|
|F5|デバッグ実行||
PHP8で統計関数を使用する

# 背景
どうしてもPHPのstatsモジュールを利用しなければならない機会があり、PHP8の環境下で動作させるまでの過程を記録しておく。

# peclではインストールができない
https://pecl.php.net/package/stats

statsはpeclからインストールすることが可能で、公式を見ると2.0.3のバージョンが存在することがわかった。
``` shell
$ pecl install stats-2.0.3
```
しかし、上記を実行してもphp8.1の環境下ではエラーが発生してインストールに失敗してしまった。
どうやら構文エラーが発生しており、このバージョンではインストールするのが難しそう。

# git
https://github.com/php/pecl-math-stats

情報を辿るとstatsのgit repositoryを発見した。
最新のコミットがPHP8に対応している。
コミットを見るとバージョンが2.1.0になっていたため、このrepositoryをcloneしてコンパイルすることにしてみた。

``` shell
$ git clone https://github.com/php/pecl-math-stats.git
$ phpize
$ ./configure
$ make
$ make install
```
peclの拡張モジュールをコンパイルする方法。上から順に実行すると所定の箇所に stats.so ファイルが作成される。
php.ini を確認し、作成された stats.so ファイルを extensions を読み込む先のディレクトリに移動させ、php.ini に stats.so を読み込むように修正を加える。
``` ini
[extensions]
extension=stats.so
```
``` shell
$ php -m
...(省略)
sqlite3
standard
stats
```
上記コマンドを実行し、statsが読み込まれていることを確認する。
``` shell
$ php -r "echo stats_rand_gen_beta(1, 100);"
0.020464261993766% 
```
php8の環境下でstats関数を実行できることが確認できた。
4GB以上のデータをUSBで取り扱いたい時の対処法


## MO☆KU☆JI☆
1.使用機種
2.背景
3.やりかた
番外編：グレーアウトしててできねええ！って人向け

## 1. 使用機種：
MacBook Pro macOS Monterey 12.4
Amazonでみっけた安い32GBのUSB (FAT32)

## 2. 背景：
先日母に「スマホの容量いっぱいだからUSBに写真移して！」と言われやってみたところ、" The file is too large for the volume’s format."とかなんたらかんたら言われたので、マークダウンの練習も兼ねてその対処法をまとめてみました。

## 3. やりかた：

まず、すべての外付けメモリは基本FAT32でフォーマットされているのですが、FAT32だと4GB以上のデータは取り扱えないそう。ということで簡単に言うとフォーマット変えろという話です。

問題が起きているUSBをパソコンに挿し、Spotlight検索(cmd+space)から"Disk Utility"（ディスクユーティリティ）を検索し起動。該当するUSB(この場合PHOTOS)を選択し、右上の"Partition"（パーティション）をクリック。

::: note warn
※ここでPartitionがグレーアウトしててクリックできない場合の対処法は後述。
:::

![Screen Shot 2022-07-15 at 15.52.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905621/7b0c385b-ca70-233f-7127-0d2940aaba07.png)


Format: Mac OS Extended (Journaled)　を選択し、適用。
![Screen Shot 2022-07-15 at 15.26.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905621/10333cb0-b4aa-4c10-9eba-3f45a1e13b1d.png)



## 番外編：　なんだこいつ！？ 「Partition」がグレーアウトしてやがるっ！？！？
こうなった人へ。

僕も最初こうなりました。こうなった場合はTerminalを開き、以下のコマンドをコピペしてエンター！
```
diskutil erasedisk hfs+ External GPT /dev/disk2
```
:::note
余計なことは考えず、脳死でこれをTerminalにぶち込みましょう。
:::

#### Terminalの開き方：
Spotlight検索(cmd+space)で"Terminal"と入力すると出てきます。

## 参考文献：

https://discussions.apple.com/thread/7338380