OmniAICreator/Qiita-1.07M huggingface dataset:
[SwiftUI] Pathを描画する

# [Path](https://developer.apple.com/documentation/swiftui/path)で定義した図形を描画する方法

1. [Shape](https://developer.apple.com/documentation/swiftui/shape)を利用して、内側でスケーリングする
1. 回転のエフェクトは外側で行う

![scr1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/457d0986-fca0-313a-6990-e29f43e3c908.png)

1. Shapeを使わずに直接描画することはできますが、そうすると・・・
1. 回転のエフェクトをShapeの内側で行うことはできますが、そうすると・・・

詳しい説明は省略します。


# コード例

```swift:Rect（描画範囲）に合わせてスケーリング
struct ScaledPath: Shape {
    let path: Path
    func path(in rect: CGRect) -> Path {
        let scale = min(rect.width, rect.height)
        let transform = CGAffineTransform(scaleX: scale, y: scale)
        return path.applying(transform)
    }
}
```

```swift:ScaledPath使用例
struct ContentView: View {
    var body: some View {
        VStack {
            ScaledPath(path: .logo)
                .stroke(Color.red, lineWidth: 2)
                .frame(width: 60, height: 60)

            ScaledPath(path: .logo)
                .stroke(Color.orange, lineWidth: 2)
                .frame(width: 100, height: 100)
            
            ScaledPath(path: .logo)
                .stroke(Color.green, lineWidth: 2)
                .frame(width: 200, height: 200)
                .rotationEffect(Angle(degrees: -45))
            
            ScaledPath(path: .logo)
                .stroke(Color.yellow, lineWidth: 2)
                .frame(width: 400, height: 400)
                .rotationEffect(Angle(degrees: 45))
        }
    }
}
```

```swift:Path情報は、0..<1の範囲で定義する
extension Path {
    static var logo: Path {
        var path = Path()
        path.move(to: CGPoint(x: 0.534, y: 0.5816))
        path.addCurve(to: CGPoint(x: 0.1877, y: 0.088), control1: CGPoint(x: 0.534, y: 0.5816), control2: CGPoint(x: 0.2529, y: 0.4205))

            // 省略
            
        return path
    }
}
```

SwiftロゴのPath情報は、以下のサイトから借用しました。

https://www.hackingwithswift.com/quick-start/swiftui/how-to-use-uibezierpath-and-cgpath-in-swiftui
ゼロから作るDeep Learning 学習メモ

# シグモイド関数
シグモイド関数は機械学習やニューラルネットワークに使用される。主な役割としては入力された値を0から1の間に変換すること。

- シグモイド関数の式
$$
\text{sigmoid}(x) = \frac{1}{1 + e^{-x}}
$$

```python

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812927/cc5929af-ca1d-5577-a6eb-63076d657420.png)

非線形であり幅広く使われている。
# シグモイド関数を使う理由
1.出力が確率的な意味を持つ:シグモイド関数は出力を0から1の範囲を取り、その値は確率として解釈することができる。分類問題に使える。
2.勾配が計算しやすい:シグモイド関数の微分は簡単で、勾配降下法などの最適化アルゴリズムにおいて重要。
### まとめ
シグモイド関数の出力は確率的な意味を持ち勾配の計算も容易にできる活性化関数。
Uncaught  Error: Failed to find the root elementが発生するときの解決法

## Uncaught  Error: Failed to find the root elementが発生するときの解決法

# 下の問題のファイルでエラーが発生する原因になっている箇所
```index.tsx
document.getElementById("root");
```
```:index.html
<div id="app"></div>
```
問題になっているファイル
```:index.tsx
import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import { App } from './App';
const rootElement = document.getElementById("root");
if (!rootElement) throw new Error('Failed to find the root element');
const root = createRoot(rootElement);

root.render(
<StrictMode>
 <App />
  </StrictMode>
)
```
```:index.html
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>react_app</title>
    </head>
    <body>
        <div id="app"></div>
    </body>
</html>
```
# 問題の原因
index.htmlのdivのidがappになっているのに対してindex.tsxで取得しようとしているidがrootになっていて
javascriptを差し込む目印となっているindex.htmlファイルとindex.tsxファイルでid名が違うため。

# エラー解決策

* index.tsxのdocument.getElementById();とindex.htmlのdivタグのid名を同じにする
その為getElementById,divタグのid名をそろえて
rootにするとエラーが解消する

```:index.tsx
import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import { App } from './App';
const rootElement = document.getElementById("root");
if (!rootElement) throw new Error('Failed to find the root element');
const root = createRoot(rootElement);

root.render(
<StrictMode>
 <App />
  </StrictMode>
)
```
```:index.html
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>react_app</title>
    </head>
    <body>
        <div id="root"></div>
    </body>
</html>
```
TOEICの勉強をはじめた

# はじめに
今月（2024年6月）からTOEICの勉強を始めました。（受験したことはまだ1度もない）
そこでモチベーションキープや後日振り返りができるように動機をまとめておこうと思います。

# エンジニアにとって絶対的にプラスなると思ったから
私はフロントエンドエンジニアとして普段働いています。
日系企業なので英語を話す場面は皆無なのですが、公式ドキュメントや質問記事、エラーログ、変数名など英語を避けては通れない場面が多々ありました。
英語学習することで日々のエンジニアとして業務に少しでもプラスになればと良いと思いました。
また、将来を見据えた時に外資系企業への就職など、自分のキャリアにも広がったらいいなと思いました。
私はエンジニアですがどの仕事をしていたとしても英語ができて困ることはないのでモチベーションがあれば今すぐ勉強すべきだと個人的には思います。


# 武器になる資格やスキルが欲しかったから
私は文系の四年生大学を卒業してから新卒で就職してそのままエンジニアになりました。そのため、周りの人に比べて技術力はかなり低いと日々感じています。
そこで周りと差別化をつけたい、何か自信になるスキルが欲しいと思い英語を勉強しようと思いました。
本当はもっと技術的な勉強をした方が良いとは思っていましたがモチベーションが大きかった英語を勉強することにしました。

# 勉強をするなら若いうちがいいと思ったから
この記事を書いている時私は27歳です。
モチベーションがあるなら何事も始めるには早いに越したことはないと思いました。
また、若い時の方が脳みそ的にもまだマシだろうと感じ勉強を始めました。
（30、40歳を超えて英語学習を改めてしようと絶対ならないだろうなとも思った）

# 趣味がより楽しくなりそうだったから
私の趣味の中に音楽鑑賞と旅行があります。
音楽鑑賞は洋楽を聴くときに英詩の意味がわかれば楽しくなりそうだなと思いました。
旅行に関しては私自身、言語的な壁から海外旅行にまだいったことがないです。
そのため英語を勉強してアメリカにいくのが目標です。

# おわりに
まだ何も勉強できてないのですが取り急ぎ動機をまとめてみました。
やる気がなくなってきたらこの記事を読み返してモチベーションを取り戻そうと思います。
ちゃちゃっとcosmosDBのコンテナの中を抽出する

# はじめに
アイテム登録した後にちゃんと取れたかを確認する術を忘れてたのでこちらもちゃちゃっとつくる

# 仕上がりはこちら

```
import argparse
import csv
import json
from azure.cosmos import CosmosClient

# パラメータの取得
parser = argparse.ArgumentParser(description="Cosmos DB からアイテムを取得するスクリプト")
parser.add_argument("-u", "--url", type=str, help="Cosmos DB アカウントURL")
parser.add_argument("-k", "--key", type=str, help="Cosmos DB アカウントキー")
parser.add_argument("-q", "--query", type=str, help="Cosmos DB クエリ（省略可）")

args = parser.parse_args()

# Cosmos DB への接続
cosmos_url = args.url
cosmos_key = args.key
cosmos_query = args.query
client = CosmosClient(cosmos_url, cosmos_key)

# デフォルトクエリの設定
if not cosmos_query:
    cosmos_query = "SELECT * FROM c"

# データベースとコンテナの取得
database_name = "mediator"
container_name = "chat_history"
database = client.get_database_client(database_name)
container = database.get_container_client(container_name)

# アイテムの取得と出力
print(cosmos_query)

for item in container.query_items(query=cosmos_query,enable_cross_partition_query=True):
    print(json.dumps(item, indent=4))

print("アイテムの取得が完了しました。")
```

# 実行結果
## コマンド実行
とれましたー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/df16f4cd-7e1a-c074-bf21-a37c36ce21c2.png)
AtCoder ABC 338 C - Leftover Recipesを整数計画問題として解く

https://atcoder.jp/contests/abc338/tasks/abc338_c

整数計画問題であることが自明です。料理Aを$x$人分, 料理Bを$y$人分作る時に$x+y$を最大化したいです。

maximize: $z = x + y$
subject to:$x \cdot a[i] + y \cdot b[i] \leq q[i]$

を解けば良いです。

# ortools

https://atcoder.jp/contests/abc338/submissions/54431553

```Python:ortools
n = int(input())
q = list(map(int, input().split()))
a = list(map(int, input().split()))
b = list(map(int, input().split()))

from ortools.sat.python import cp_model
import sys
model = cp_model.CpModel()

ub = 10**6 + 10
x = model.NewIntVar(0, ub, 'x')
y = model.NewIntVar(0, ub, 'y')

for i in range(n):
    model.Add(a[i] * x + b[i] * y <= q[i])

model.Maximize(x + y)
solver = cp_model.CpSolver()
status = solver.Solve(model)

if status == cp_model.OPTIMAL:
    print(int(solver.ObjectiveValue()))
    print("x, y = ",solver.Value(x),solver.Value(y), file = sys.stderr)
else:
  assert False
```
生成AIパスポートを受験してみた感想

# 概要
生成AI活用普及協会(GUGA)が実施している生成AIパスポートを受験してみました。まだ合否の結果は出ていませんが、記憶が薄れないうちに記事として投稿することにしました。

# 生成AIパスポートとは？
以下、GUGA公式ページからの引用です。

> 生成AIパスポートは、AI初心者のために誕生した、生成AIリスクを予防する資格試験です。AIを活用したコンテンツ生成の具体的な方法や事例に加え、企業のコンプライアンスに関わる個人情報保護、著作権侵害、商用利用可否といった注意点などを学ぶことができます。本資格の提供を通じて生成AIリスキリングを促し、生成AIを安全に活用するためのリテラシーを有する企業・人材の可視化を推進しています。

# 対象者
* ＡＩ、生成ＡＩに興味関心のある方
* 生成ＡＩを正しく活用したい方
* ビジネスでの生成ＡＩ活用に不安のある方

|実施形式|試験時間|問題数|受験料|出題範囲|
|---|---|---|---|---|
|IBT方式|60分|60問|¥11,000.|[シラバス](https://guga.or.jp/assets/syllabus.pdf)より出題|

[シラバス](https://guga.or.jp/assets/syllabus.pdf)や[サンプル問題](https://guga.or.jp/assets/sample.pdf)から分かる様に、AI(特に生成AI)について広く浅く出題されます。「✕✕パスポート」と言えば、「ITパスポート」試験が頭に浮かびますが、ITパスポート試験はITについて広く浅く出題される**国家試験**ですが、生成AIパスポートは**民間資格**です。

# 参考書籍

筆者は以下の書籍を購入しました。試験対策などについては結果が発表されてから改めて記事を投稿しようと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/84cbcfeb-f063-2214-6263-78e99bbdf5df.png)

他にも、以下の書籍やスマホアプリもリリースされている様です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/5e4f1f84-2f95-b55d-06db-b8fa8c6e493c.png)

https://amzn.asia/d/0vx0F1s

https://amzn.asia/d/9jRXsf8

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/dc82a488-130c-2856-8eef-91042d9e2da7.png)

https://guga.or.jp/outline/

# 受験してみての感想
生成AIに業務で関わっている上に、筆者は個人的に生成AIに関心があるので、今回生成AIパスポートを受験してみました。60分で60問なので、時間が足りなくなったり、焦る様なことにならないだろうかと心配でしたが、筆者は余裕を持って解答出来ました。よって、AIや生成AIについて十分な知識が有る方や、十分勉強されている方なら、落ち着いて受験すれば、余裕を持って全問解答出来ると思います。また、今まで色々なIBT形式の試験を受験してきましたが、多くの場合は、指定された特定の日の特定の時間帯のみ受験可能という試験が多い中、この試験は6/1~6/30という1ヶ月もの期間が解答可能期間として設定されています。前回の試験でも(1ヶ月ではないものの)長い期間が設定されていたみたいで、この試験の実施形式の特色なのかもしれません。後日、試験の合否結果が判明しだい、今回触れなかった内容についてまとめて記事として投稿しようと思います。

# Reference

https://guga.or.jp/outline/
Raspberry PiのGPIOピン接続の3.5インチタッチスクリーンのdpiを上げる方法

まず、ラズパイとGPIOピンでスクリーンを接続します。

![スクリーンショット 2024-06-10 21.26.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512897/7442cc67-f78a-d298-5abd-ce01f9b9416b.png)

ドライバのインストールは以上のように

そこから、DPIの設定を行います。
コマンドラインに以下のコードを打ってください

sudo nano /boot/config.txt

すると下の方にスクリーンに関する記述があります。
その下に以下のコードを追加してください

dpi_group=2
dpi_mode=86
framebuffer_width=480
framebuffer_height=320
dpi_output_format=519
hdmi_timings=480 0 10 16 10 320 0 2 1 2 0 0 0 60 0 9600000 3

今回は480*360のスクリーンなのでwidth=480 height=360で設定しましたが、dpiを上げたい場合はこの数字を大きくすると上がります。(1080*720のように)

この後、コントロール+Xで閉じる、yで保存、エンターを押し、その後sudo rebootのコマンドで再起動してください。

追記：上記ドライバをインストールしたなら、以下のtipもご査収ください。
![スクリーンショット 2024-06-10 21.36.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512897/30aa2d00-ce14-c757-99ce-eb2a90b025e9.png)
【Python】フォーマット済み文字列リテラル(f-strings)

f-stringsは、Python 3.6から導入された新しい文字列フォーマット機能です。従来の `%` 演算子や `str.format()` メソッドに比べて、より簡潔で読みやすい表記ができます。
f-stringsを使うには、文字列リテラルの前に `f` または `F` を付けます。そして、`{expression}` の形式で値や式を埋め込むことができます。
```python
name = 'Alice'
age = 25

# f-strings
print(f'My name is {name} and I am {age} years old.')
# 出力: My name is Alice and I am 25 years old.
```
式の評価結果が文字列に展開されるので、数値型や他のオブジェクトも直接埋め込めます。
```python
x = 10
y = 3.14
print(f'The value of x is {x} and y is {y}')
# 出力: The value of x is 10 and y is 3.14
```
さらに、f-strings内で関数を呼び出したり、演算を行うこともできます。
```python
import math

r = 5
print(f'The area of a circle with radius {r} is {math.pi * r**2}')  
# 出力: The area of a circle with radius 5 is 78.53981633974483
```
フォーマット指定子を使うことで、出力形式をきめ細かく制御できます。
```python
x = 123.45678
print(f'Value of x is {x:,.2f}')  
# 出力: Value of x is 123.46
```
f-stringsは複数行にまたがる文字列にも対応しています。`'''` (三重引用符)を使えば改行を含めることができます。
```python
msg = f'''
Hi {name}!
============
Your age is {age}
'''
print(msg)
# 出力:
# Hi Alice!
# ============
# Your age is 25
```
f-stringsは、可読性が高く、柔軟性に富んでいるため、モダンなPythonコードではよく使われる機能です。文字列フォーマットが必要な場面では、積極的にf-stringsを活用するとよいでしょう。
######
参考)　[東京工業大学情報理工学院 Python早見表](https://chokkan.github.io/python/index.html)

https://qiita.com/Akuuuun/items/2fd01ce70adad9bf24e9
プログラミングの問題集を作成・公開しました

表題の通り，プログラミングの問題集を作成・公開しました．
以下のリンクから，問題集に挑戦できます．※MathWorks Accountが必要です．

<a href="https://www.mathworks.com/matlabcentral/cody/groups/89866"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308259/33ed5daf-ac4b-952f-3fd2-a8f04c864804.png"></a>
https://www.mathworks.com/matlabcentral/cody/groups/89866

この記事では，問題集公開までの手順を紹介します．

# Cody
まず，自分が問題集を公開したサイトである [Cody](https://jp.mathworks.com/matlabcentral/cody) について説明します．

Codyは，プログラム言語MATLABの開発元であるMathWorks社が運営しています．
Codyでは，誰でも**無料で**MATLABのプログラミング問題を解くことができます．
掲載されている問題の数は5千以上であり，その問題の多くは一般MATLABユーザーによって作成されています．

個人的には，Codyの魅力は以下の点にあると考えています．
* プログラミング言語がMATLAB
* 時間に追われることなく，じっくり腰を据えて問題に取り組める
* 何時でも，問題に取り組める
* 問題が1問毎に分かれており，複数の問題を無理に完答する必要が無い
* レーティングがない（スコアランキングがある）
* 短いコードが良いコードという基準
* 問題正解後は他人の解答を確認でき，良いコードの投票ができる
* 問題や解答に対してコメント・議論ができる

Codyは，他人との競技的な側面が小さいです．
コミュニティメンバー皆で問題を出しあう，問題に取り組みお互いの回答を確認しあう，良い解答や問題を議論するといった事ができるオープンな場です．
CodyがMATLAB AnswersやFile Excahge，Discussionsと並んで表示されていることからも，その性格がわかるかと思います．
Codyは，他人との過度な競争を意識せずにプログラミングに取り組める利点があります．

# 問題作成
問題作成方法を説明します．MathWorks Accountでログインしている前提で進めます．

[Cody](https://jp.mathworks.com/matlabcentral/cody)のページを開き，上の方に表示されている[Create Problem](https://jp.mathworks.com/matlabcentral/cody/problems/new)を選択します．
問題作成ページが現れるので，以下の項目を埋めます．

* 問題のタイトル
* 問題の説明
* 問題のタグ
* 解答用の関数テンプレート（ユーザーが編集・解答する関数の雛形）
* 解答のテストプログラム
* （テストをチェックするための解答）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308259/cc62f0af-4200-67e6-af0f-0e7aa53aee47.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308259/e5a5c4e4-6709-7c87-993b-1579b2c262dc.png)
問題のタイトルは，255文字までの制限があります．問題の説明は，太字，斜体，アンダーラインなどが使えます．また，コードや画像，数式やリンクも挿入できます．

解答に関する項目では，テストプログラムの記載が最も重要になります．Codyは，すべてのテストをパスするプログラムを正解として受け付けます．意図しない解答を正解としないためには，十分に気を付けてテストを書く必要があります．

テストは，問題を解くためのヒントとして公開されています．出題意図を無視してテストをパスするだけなら，簡単にできてしまいます．すべてを網羅し，意図しない解答を受け付けないようにテストを用意することは困難なので，割り切ってテストを書くことが必要だと思います．



テストをチェックするための解答は，公開されないものであり，無くても構いません．問題のタグと解答用の関数テンプレートは，皆が分かりやすく使いやすいことを考えながら作成すると良いでしょう．

必要な項目を埋めた後，一番下にあるPublishボタンを押と問題が公開されます．

# 問題集の作成・公開
Codyで公開されている問題は，Problem Groupという単位で問題をまとめられます．
問題画面で右上にあるAdd To Groupsを押すと設定ができます．
作成者が誰であるかは関係なく，1つの問題を複数のProblem Groupに所属させられます．
また，ここで作成されるProblem Groupは，必ずPrivate設定になります．

作成したProblem Groupについて，設定をPrivateからPublicにすると問題集が公開されます．
問題集を公開するには，問題集に問題が10問以上含まれている必要があります．
また，Codyでのスコアが700以上必要です．
スコアが700以下の場合，リンクを知っている人のみアクセスできる設定にして，その問題集を10人以上の人に解いて貰うことで，設定をPrivateからPublicに変更できます．

問題集を公開する場合は，画像と簡単な説明もあると良いでしょう．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308259/456d7880-bfdc-aade-8a33-0191e61db93e.png)

# 終わりに
[Cody](https://jp.mathworks.com/matlabcentral/cody)でプログラミングの問題集を作成・公開したので，そのやり方を紹介しました．
せっかく公開した問題集ですので，多くの方に挑戦して頂けたら嬉しいです．

https://www.mathworks.com/matlabcentral/cody/groups/89866
【Python】print関数

`print()` は、Python組み込みの関数で、文字列や値を出力するために使用します。最も基本的な使い方は以下の通りです。
```python
print('Hello, World!')
```
この例では、シンプルに `'Hello, World!'` という文字列が出力されます。

`print()` 関数には、いくつかの引数を渡すことができます。
- `*objects` - 出力したいオブジェクト(値や変数)を指定します。複数の値はカンマ `,` で区切ります
```python
x = 5
y = 10
print(x, y)  # 出力: 5 10
print('X =', x, ', Y =', y)  # 出力: X = 5 , Y = 10
```
- `sep=' '` - 出力する値の間の区切り文字列を指定します。デフォルトは空白文字です
```python
print('A', 'B', 'C', sep='-')  # 出力: A-B-C
```
- `end='\n'` - 出力の最後に付加する文字列を指定します。デフォルトは改行文字 `\n` です
```python
print('Hello', end='')
print('World')  # 出力: HelloWorld
```
- `file` - 出力先のファイルオブジェクトを指定できます。デフォルトは `sys.stdout` です
- `flush=False` - 出力をバッファリングするかどうかを指定します。True を指定すると、すぐに出力が行われます

また、フォーマット指定子を使って、文字列のフォーマットを制御することもできます。
```python
x = 10
y = 5.25
print('X = %d, Y = %.2f' % (x, y))  # 出力: X = 10, Y = 5.25
```
Python 3.6以降では、フォーマット済み文字列リテラル(f-strings)が導入されました。
```python
name = 'Alice'
age = 25
print(f'My name is {name} and I am {age} years old.') # 出力: My name is Alice and I am 25 years old.
```
`print()` は非常に柔軟で便利な関数です。デバッグ時の値の確認、ユーザーへの情報出力、ログ出力など、さまざまな用途に使用されます。
######
参考)　[東京工業大学情報理工学院 Python早見表](https://chokkan.github.io/python/index.html)

https://qiita.com/Akuuuun/items/5e2ea81e75d1eba34d65
大学1年生が初挑戦！Progateハッカソンに参加してみた！

### 大学1年生が初挑戦！Progateハッカソン参加レポート

こんにちは！情報系の大学に通う1年生です。今回、Progate様が開催されたProgateハッカソンに参加したので、その体験をシェアしたいと思います。

#### 準備段階
ハッカソンに参加する前に、私は主に以下のことを勉強していました：

- フロントエンド：React、HTML、CSS、JavaScript
- バージョン管理：Gitの基本操作

使用した学習サイトはUdemy、Progate、ProgatePath、pazia、techtrainなどです。

#### ハッカソン開始！
ハッカソンが始まると、まずはチーム振り分けが行われました。運営の方々が事前にチームを組んでくれており、私のチームは次のメンバーで構成されました

- ハッカソン経験豊富な強者
- 競プロ歴5年のC++使い
- Python歴3か月のメンバー
- そして私

今回のお題は「ドウ」でした。

#### アイデア出しと技術選定
アイデア出しには「MIRO」を使用し、「ドウ」から連想される言葉を出し合いました。その後、アンケートで「ジオゲッサーのリアル版」を作ることに決定。技術選定では、フロントエンドを強いメンバーが担当し、バックエンドはJavaScriptで開発することになりました。

#### 開発開始
まずは環境構築。GitHubのOrganizationを使い、各自でリポジトリをクローンして環境を整えました。これに1日目はほぼ費やしました。2日目からは本格的にコードを書き始めましたが、わからないことだらけ。Googleで調べたり、ChatGPTやメンターに質問したりしてなんとか進めました。

#### 挑戦と学び
今回特に難しかったのはGitの操作です。コミットやマージ、コンフリクトの解消に苦労しましたが、チームメンバーやメンターのおかげで理解を深めることができました。また、デプロイ作業にも初挑戦。Renderというサービスを使い、GitHubからForkしてデプロイを行いました。

さらに、今回はJavaScriptに加えてデータベースを使用することになり、初めてSQLを使いました。最初は戸惑いましたが、どうにか使いこなせるようになりました。

#### プレゼンテーションと結果
最後にtopazというサービスを使ってプレゼンテーションを行いました。残念ながら賞は取れませんでしたが、多くの知識を得ることができました。今回作成したWebアプリはこちらです：[https://topaz.dev/projects/34970a76b97ada151fa6](https://topaz.dev/projects/34970a76b97ada151fa6)

#### まとめ
初めてのハッカソンは挑戦の連続でしたが、非常に充実した経験となりました。後日、参加賞としてProgateさんのステッカーをゲットしました！皆さんもぜひハッカソンに参加してみてください！次はサポーターズのハッカソンに挑戦する予定です！！
【Slack】スレッド内でメンションされ、返信のたびに通知が来るのが嫌な時

# 手順
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523103/3129284f-c6b1-7590-485c-66ad2bf98f6a.png)

1.スレッドの先頭で三点リーダーをクリック
2.一番上の「返信の通知をオフにする」をクリック

メンションは引き続き通知されるので安心してください。
ちゃちゃっとcosmosDBにアイテム追加する

# はじめに
同僚に「もうちょっと工夫がほしい」と言われてかっとなって作った。
かっとなって作ったけどGeminiの世話になったのは内緒だ
10分でできた。AI様様！

# 仕上がりはこちら

```
import argparse
import csv
import json
from azure.cosmos import CosmosClient

# パラメータの取得
parser = argparse.ArgumentParser(description="Cosmos DB にアイテムを追加するスクリプト")
parser.add_argument("-u", "--url", type=str, help="Cosmos DB アカウントURL")
parser.add_argument("-k", "--key", type=str, help="Cosmos DB アカウントキー")
parser.add_argument("-i", "--input", type=str, help="CSV ファイルパス")
args = parser.parse_args()

# Cosmos DB への接続
cosmos_url = args.url
cosmos_key = args.key
client = CosmosClient(cosmos_url, cosmos_key)

# データベースとコンテナの取得
database_name = "nabehiro_db"
container_name = "nabehiro_container"
database = client.get_database_client(database_name)
container = database.get_container_client(container_name)

# CSV ファイルの読み込み
with open(args.input, newline='') as csvfile:
    reader = csv.DictReader(csvfile)

    # アイテムの変換と追加
    for row in reader:
        item = {
            "id": row["id"],
            "AppKey": row["AppKey"],
            "AppName": row["AppName"],
            "AppId": row["AppId"],
            "Division": row["Division"],
        }
        container.create_item(item)

print("アイテムの追加が完了しました。")
```

# 入力に使ったcsvファイル
テストなので適当に作ったやつ

```
id,AppKey,AppName,AppId,Division
id1,appkey1,appname1,appid1,division1
id2,appkey2,appname2,appid2,division2
id3,appkey3,appname3,appid3,division3
```

# 実行結果
## コマンド実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/9014a811-077d-829d-5481-b52e009c06fe.png)

## cosmosDB上で確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/0718da5d-eb7f-4332-14f0-21cee20f044b.png)
社内のSlackにtimesを作ってから半年経った

# timesとは
Slack内の個人用チャンネルのこと。
分報、timelineとも言うらしい。
例：times-xxx



# 作ろうと思ったきっかけ
入社して1年たったのもあり作ってみようと思ったのがきっかけ。
もともと社内にtimesチャンネルを持っている人が何人もいた。


# 筆者の使い方
私はほとんどTwitter感覚で投稿している。
頻度はだいたい週2〜3回くらい。投稿しない週も全然ある。
内容は技術的に困っていること、業務や社内の気づいたこと、個人的なツイート、買ったよかったものなどを載せるようにしている。（要は独り言）
RSSで気になる記事を購読している人もいたと思う。

# 半年経ってみて

### 些細なことが解決できるようになった
人に聞くまでもないが困ったいることや気になることを投稿するとチャンネルにいる人から教えてもらえることがある。
timesは大人数のチャンネルや先輩のDMに投げかけるよりかは、はるかに心理的ハードルが低い。
またDMと違い、投稿が「見える化」がされるため、知見や解決したことをチャンネル参加者全員で共有することができる。
もちろん全てではないがメモ感覚で困っていることを載せるようにしている。



### 他部署の人とも関われるようになった
timesは基本的にパプリックチャンネルで作成されるため、実際に面識がない人のチャンネルでも気軽に参加できる。
そのため、普段業務では関わらない人の仕事内容や趣味、思考、困っていることを知ることが可能だ。
前述のように人が困っていることにリプライしたり、呟き的な投稿にリアクションを送り合ってコミュニケーションを取ることができる。
また、times上で繋がっているおかげでリアルに初めて会った際、スムーズに関係を築く手助けにもなると思う。

### その時何を考えていたか振り返れるようになった
timesに日々困っていることなどを投稿することで、当時自分がどのようなタスクに躓いていたか振り返れるようになった。
もちろん自分のDMやメモ帳などに載せていくのもいいが、前述の通り他の人からもっといい方法などを教えてもらえる可能性があるため私はtimesに載せるのことも多い。（ある程度自分で調べてみるのも大切）


# おわりに
様々なメリットデメリットが考えられるが筆者はメリットの方が現状強く感じている。
疑問を投稿したところで解決するとは限らないが、独りで考えて込んでいるよりかはとりあえず投稿してみる方がいいと思う。
もちろん、業務が優先なのでメリハリを持ってこれからもtimesと付き合っていきたい。
実質8行の再帰でフラクタル図形（シェルピンスキーのカーペット）を描く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288125/a2a69225-1e84-aee2-40fc-d9bbfce245c9.png)

　こういうやつを描きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288125/70016dd0-39d0-a1c6-d1e2-00a5382293a5.png)

　任意の座標・スケールで出来ます。

 # コード

 ```python
import numpy as np
from PIL import Image
import math

def generate_sierpinski_carpet(
    canvas_size, u_start, u_end, v_start, v_end, output_file
):
    eps = 1e-12
    assert abs(u_start + v_end - u_end - v_start) < eps, "must be a square"
    r = u_end - u_start

    canvas = np.ones((canvas_size, canvas_size), dtype=np.uint8) * 255

    def dfs(u, v, L):
        if L * canvas_size < r:
            return 255
        p = math.floor(u)
        q = math.floor(v)
        if p == 1 and q == 1:
            return 0
        else:
            return dfs((u - p) * 3, (v - q) * 3, L / 3)

    for i in range(canvas_size):
        for j in range(canvas_size):
            u = u_start + r * i / canvas_size
            v = v_start + r * j / canvas_size
            canvas[i][j] = dfs(u, v, 3)

    image = Image.fromarray(canvas)
    image.save(output_file)
    
generate_sierpinski_carpet(729,0,1,0,1,'output.png')
```

# ギミック

　重要なのはこの $8$ 行の部分

```python
    def dfs(u, v, L):
        if L * canvas_size < r:
            return 255
        p = math.floor(u)
        q = math.floor(v)
        if p == 1 and q == 1:
            return 0
        else:
            return dfs((u - p) * 3, (v - q) * 3, L / 3)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288125/310b7d03-2fde-20bd-044a-8669d107e995.png)

　長さ $3 \times 3$ の、上のような領域を考えます。
　この中から、実際に描画する領域を赤枠とします。便宜的にこれを UV マップと呼びます。

　まず、この UV マップ上の点が、領域の中のどの部分にあるかを考えます。

　真ん中の領域、つまり、左から $2$ 番目、上から $2$ 番目の領域にある時、ここは空白であることが確定します。ここは黒に塗ってしまって問題ありません。

　問題ははみ出た領域（図で「？」をつけた部分）です。これは現段階では良くわかりません。なので、次の探索に進みます。

　この領域は、更に $3 \times 3$ 分割する必要がありますが、逆に、そこに所属する点が $3$ 倍の座標になったと考えると、全く同じ話ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288125/a8ba4bae-5c4b-44b2-a330-8f5c13f97448.png)

　左上がわかりやすいと思うので図にすると、こんな感じになります。

　なお、このままだと座標によっては無限にループしてしまうので、どこかで探索を打ち切ります。現在見ている領域のサイズ（`L`）をキャンパスサイズの数だけ並べても元の UV マップを越えない場合、これ以上細かく見ても意味がないと判断して打ち切ります。
ScalaでVirtual Threadを雑に試してみる

# TL;DR

内部でスリープするようなFutureのインスタンスを、
Java 21のVirtual ThreadおよびPlatfrom Threadから作成し、
処理にかかった時間を出してみました。

# Platfrom Thread

まずは`scala.concurrent.ExecutionContext.Implicits.global`を使って、
1秒スリープするFutureのインスタンスを50個作ってみました。

結果はコメントに記載の通り7726msかかりました。

```scala
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration
import scala.concurrent.{Await, Future}

object Main extends App {
  val start = System.currentTimeMillis()

  val futures = (1 to 50).map { _ =>
    Future{
      Thread.sleep(1000)
    }
  }

  Await.ready(Future.sequence(futures), Duration.Inf)

  val end = System.currentTimeMillis()
  println(s"${end - start}ms") // 7726ms
}
```

# Virtual Thread

同じ条件でVirtual Threadを使って、
スリープするFutureのインスタンスを50個作った結果、1141msかかりました。

少々荒っぽい試し方ですが、スレッドがスリープ処理によって占有されていないことが示唆されますね。

```scala
import java.util.concurrent.Executors
import scala.concurrent.duration.Duration
import scala.concurrent.{Await, ExecutionContext, Future}

object VirtualThreadTest extends App {
   implicit val ec: ExecutionContext = ExecutionContext.fromExecutor(Executors.newVirtualThreadPerTaskExecutor())

  val start = System.currentTimeMillis()

  val futures = (1 to 50).map { _ =>
    Future{
      Thread.sleep(1000)
    }
  }

  Await.ready(Future.sequence(futures), Duration.Inf)

  val end = System.currentTimeMillis()
  println(s"${end - start}ms") // 1141ms
}
```
AIにチャレンジ！ OpenAI APIを始めるための簡単ガイド

こんにちは、みなさん！
今日はAIアプリ構築に一歩踏み出すため、OpenAI APIの始め方について一緒に学んでみましょう。

# OpenAI APIってなに？
まず、OpenAI APIって何か知っていますか？
簡単に言うと、ChatGPTの機能を自作のアプリやシステムに取り込むことができるるサービスなんです。
例えば、チャットボットを作ったり、自然言語での入力を受け付けて処理を行ったりするのに使えます。

# どうやって始めるの？
まず最初に、[OpenAIの公式サイト](https://platform.openai.com/playground/chat?models=gpt-4o)にアクセスして、sign inからアカウントを作成します。
次に支払方法の登録を行います。
:exclamation:GPT Plusとは別なので注意してください。

その後にAPIキーを取得します。
これがあなたのAIの鍵となるものです。
取得方法はとても簡単で、数分で終わります。

## 支払方法の登録
- メニューからSettingsを選択します。
![002-800x400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809123/7b41d13c-8867-3893-4fa8-7f8aeba1b695.png)
- 組織名を入力します。 分かりやすい名前を入力しましょう。 入力したら画面下部のsaveボタンをクリックしてください。
![003-800x400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809123/7be224a1-8dc3-6c2a-1b44-46a27e703c15.png)
- メニューでBillingを選択し、Add payment detailsをクリックします。
![005-800x400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809123/870c0a16-fa4a-aed7-eaa7-dd8c899a4e6d.png)
- 個人ならIndividual、会社ならCompanyを選択します。
![006-800x400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809123/16b760a5-fbdb-ea6f-fb00-6401b37f175e.png)
- クレジットカード情報を入力します。
![007-800x400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809123/7676376d-88e2-b695-b81f-e23ae3ee6bdf.png)
- 初期クレジットを入力します。
  自動リチャージをオンにした場合はいくらを下回ったら、いくらまでリチャージするかを入力します。
![008-800x400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809123/ebb2be97-fcfe-3cb6-618a-59e14429ce21.png)
- 支払方法の登録はこれで完了です。
![010-800x400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809123/8ea8b12f-19b5-6453-600d-ca793089feeb.png)

:white_check_mark:APIは従量課金です。いくら使ったかはメニューのBillingからいつでも確認できます。

| モデル | 入力 | 出力 |
|---|---|---|
| GPT-4o | $5/1Mトークン | $15/1Mトークン |
| gpt-3.5-turbo-0125 | $0.5/1Mトークン | $1.5/1Mトークン |

1Mトークンは100万トークンのことです。

## プロジェクトの作成
APIキーはプロジェクト単位で管理します。
そのため、APIキーを取得する前にプロジェクトを作成します。
- メニューからCreate Projectを選択します。
![011-800x400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809123/e1da63ce-bf47-371d-09af-351f1f9808e9.png)
- 分かりやすいプロジェクト名を入力します。
![012-800x400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809123/bf9d300e-0f3e-a604-9e68-15d0390eaf9a.png)

## APIキーの取得
- メニューからAPI Keysを選択します。
![013-800x400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809123/b553ef76-fbdc-f45f-5cfc-c5da820354c6.png)
- API Keyのオーナーを決め、名前（任意）、権限を入力します。
![014sample-800x400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809123/e2e87deb-5ef2-22ed-a6a7-4bf6d035b4aa.png)
- 権限についてRestrictedを選択すると細かく設定できます。
![015-800x400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809123/c2fb6dc8-c200-eaf6-ea3c-56ddd891f9e0.png)
- API Keyが生成されます。 :exclamation:このAPI Keyは二度と表示することができません。 無くさないよう厳重に保管しましょう！
![016Inked-800x400.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809123/cdd4bd5b-b775-a59a-898d-d4ff235ae38e.jpeg)


# おわりに
これで、OpenAI APIを使えるようになりました。
次回はAPIの動かし方を紹介します。

何か質問があれば、コメントで教えてくださいね。
それでは、次回の記事もお楽しみに！
useEffectについて知る

## はじめに
useMemoを記事にして、自分の中でhooksについて再確認しようということで今回はuseEffectについて記事を書いていこうと思います。
未熟な身ですが、一生懸命わかりやすい文章を残せるよう努力いたしますので、お暇なとき一瞥していただければ幸いに思います。
また記事内で間違えた記述や誤植があればご指摘いただけると嬉しく思います。

## useEffectとは
React公式ドキュメントによると
「 useEffect is a React Hook that lets you synchronize a component with an external system. 」
と記述されています。
意訳すると「コンポーネントと外部のシステムを同期させるために用いる。」とのことです。

データの取得やDOM操作、タイマー設定などレンダリングに関係しない副作用を実行するために用います。

### 特徴
```js
useEffect(setup, dependencies?)
```
第一引数には実行したい処理、第二引数には依存させたい値を入れておきます。
##### 1.初回レンダリング時にsetupの処理が実行される。
```jsx
import React, { useEffect, useState } from 'react';

export const HelloEffect = () => {
  const [counter, setCounter] = useState(0);

  useEffect(() => {
    console.log('Hello, useEffect')
  },[])

  return (
    <div>
      <div>
        {counter}
      </div>
      <button onClick={() => setCounter(prev => prev + 1)}>カウントアップ！</button>
    </div>
  );
}
```
一度Hello, useEffectを出力した後、ボタンを押してレンダリングさせても2度出力されることはありません。
##### 2.第二引数の依存配列(dependencies?)が変化した場合に、setupが再実行される。
```jsx
import React, { useEffect, useState } from 'react';

export const HelloEffect = () => {
  const [counter, setCounter] = useState(0);

  useEffect(() => {
    console.log('Hello, useEffect')
    },[counter])

  return (
    <div>
      <div>
        {counter}
      </div>
      <button onClick={() => setCounter(prev => prev + 1)}>カウントアップ！</button>
    </div>
  );
}
```
ボタンを押してcounterを更新するたびにHello, useEffectが出力されます。

##### 3.クリーンアップ関数の実行
```jsx
import React, { useEffect, useState } from 'react'

export const HelloEffect = () => {
    const [counter, setCounter] = useState(0)
    useEffect(() => {
        console.log('Hello, useEffect')
// クリーンアップ関数
        return (() => {
            console.log('Bye')
        })
    })
  return (
    <div>
        <div>
            {counter}
        </div>
        <button onClick={() => setCounter(prev => prev + 1)}>カウントアップ！</button>
    </div>
  )
}
```
コンソールを確認しながらボタンを押すと再レンダリングする際にByeと表示されることが確認されると思います。
またクリーンアップ関数は、コンポーネントがアンマウントされる際にも実行されます。
ユースケースとしてはイベントリスナーや外部ライブラリのクリーンアップなどになると思います。

### まとめ
簡単で拙い文章かとは思いますが、ここまで読んでいただいてありがとうございます。今後も少しずつ投稿し知見を深めることができればと思いますので、ご協力および見守っていただければ幸いです。

### 参考文献
[useEffect-React] https://react.dev/reference/react/useEffect
バッチ MSG ファイルをマージするために使用されるソフトウェアは何ですか?

What software is used to merge batch MSG files?
Microsoft Outlook は最も高度なデスクトップ メール クライアントであり、優れたユーザー インターフェイスと高度なデータ セキュリティ レベルを備えているため、企業や個人のユーザーにも使用されていることは周知の事実です。しかし、Outlook にインポートできないトリックが保存されている場合もあります。これらの MSG ファイルには、通常、メールやカレンダー イベントなどが含まれています。

MSG ファイルはメッセージと呼ばれ、1 つのメッセージを個別のファイルに保存します。大量のメッセージを管理するには、ユーザーはすべての MSG ファイルを結合する必要があります。そこで、ここでは Outlook ネイティブの最適な方法を共有し、<a href=”https://www.systoolsgroup.com/msg-to-pst-converter.html”> MSG to PST Converter </a> についても説明しました。
<h2>Benefits of Merge Batch MSG Files</h2>
<ul>
<li>複数のバッチ ファイルを 1 つにまとめると、操作を効率化し、複数のスクリプトの管理の複雑さを軽減できます。</li>
<li>バッチ ファイルをマージすると、冗長なコードとプロセスが排除され、スクリプト全体の効率が向上し、管理しやすくなります。</li>
<li>1 つのバッチ ファイルで複数のタスクを実行するための集中管理ポイントが提供されるため、更新と保守が容易になります。</li>
<li>1 つのバッチ ファイルを使用すると、複数のジョブではなく 1 つのジョブをスケジュールするだけで済むため、タスクのスケジュールが簡単になります。</li>
<li>バッチ ファイルをマージすると、複数のスクリプトの開始と停止のオーバーヘッドが削減され、実行プロセスが最適化されます。</li>
</ul>
<h2>How to Merge Batch MSG Files Manually?</h2>
いくつかのメッセージ ファイルを転送する場合は、以下に示すように手動でアプローチを実行できます。
<ul>
<li>まず、MSG ファイルに移動します。</li>
<li>Outlook を起動し、新しいフォルダーを作成します。</li>
<li>次に、MSG ファイルを選択し、Outlook にドラッグ アンド ドロップします。</li>
<li>これで、MSG ファイルが Microsoft Outlook に転送されました。</li>
</ul>
<h3>Restrictions of Manual Way</h3>
<ul>
<li>ユーザーは Outlook の技術情報を把握している必要があります。</li>
<li>各 MSG ファイルに対してプロセス全体を繰り返す必要があります。</li>
<li>データはエクスポートできますが、一部が失われます。</li>
</ul>
<h3>How to Transfer Batch MSG File Via Expert Recommended Approach?</h3>
大量のメッセージ ファイルをエクスポートしたい場合、最適なオプションがあります。<a href=”https://www.systoolsgroup.com/msg/converter/”>SysTools MSG Converter</a> を使用すると、情報を失うことなく、単一またはバッチの MSG ファイルを 1 回で変換できます。このソフトウェアは、IT 管理者の立ち会いのもとで特別に開発され、専門家によって完全に検証されています。
<ul>
<li>専門的に推奨されたソフトウェアをダウンロードして起動します。</li>
<li>MSG ファイルを参照してウィザードに挿入します。</li>
<li>エクスポート タイプ機能のバッチ番号で PST ファイルを選択します。</li>
,li>最後に、パスを設定してエクスポートを押すと、すぐに出力されます。</li>
</ul>
<h3>Benefits of Expert Verified Solution</h3>
<ul>
<li>保存されたメールボックス データ構造は、ソリューションの前と同じままです. </li>
<li>このアプリケーションには、あらゆるタイプのユーザーが簡単に操作できる非常にユーザー フレンドリーなインターフェイスが付属しています。</li>
<li>また、<a href=”https://www.systoolsgroup.com/converter/msg/pdf/”>Convert MSG to PDF</a> 、PST、TXT など、さまざまな形式にすることができます。</li>
<li>このウィザードを使用すると、アップグレードされたレベルのフィルター オプションを利用して、必要なデータを変換することもできます。</li>
<li>このアプローチを完了するために、Outlook を含む他のアプリケーションに依存する必要はありません。</li>
</ul>
<h4>Conclusion</h4>
ここでは、バッチ MSG ファイルを転送するための最も信頼性の高い方法を共有しました。いくつかの MSG ファイルを転送する場合は、手動のアプローチで進めることができます。一括で実行するには、最後に説明したように、完全なデータ保護を提供し、ソース ファイルへの影響を防ぐため、専門家が推奨するアプローチを使用することをお勧めします。
grep: 行番号などを表示する際、パターンにマッチした行は`:`で区切られるが`-A`,`-B`,`-C`で表示される行は`-`で区切られる

# 環境
* Ubuntu 22.04.4 LTS
* grep 3.7

# 前提
以下のファイルが存在します。

```plain:bar.txt
alice
bob
chris
dave
eve
```


# 内容


`--with-filename`や`--line-number`オプションを指定すると、出力結果の行頭にファイルパスや行番号が表示されます。そのとき、ファイルパスや行番号は`:`で区切られます。

```
# 行頭に行番号を表示する
$ grep --line-number -e chris bar.txt
3:chris

# 行頭にファイルパスと行番号を表示する
$ grep --with-filename --line-number -e chris bar.txt
bar.txt:3:chris
```

`--before-contex`(`-B`)や`--after-contex`(`-A`)、`--context`(`-C`)で行数を指定すると、パターンにマッチした行の前後の行が表示されます。その前後の行の行頭は`:`ではなく`-`で区切られます。

```
$ grep --line-number --before-context 1 -e chris bar.txt
2-bob
3:chris

$ grep --with-filename --line-number --before-context 1 -e chris bar.txt
bar.txt-2-bob
bar.txt:3:chris
```


grepの結果を見て、":"で区切らている行と"-"で区切られている行が混在している理由が分からなかったので、備忘録として記事にしました。
React Nativeでアプリを作成してみた【Twitter  clone】

## プロジェクトを作成する
① プロジェクトを作成する

```
npx create-expo-app@latest twitter_clone --template
Navigation(Typescript)
```

## React Native でユーザー インターフェース (UI) を構築する

①assetsにdata/tweets.tsを作成する

```assets/data/tweets.ts


```

②app/(tabs)/index.tsxを編集する

```app/(tabs)/index.tsx


```

③componentsにTweet.tsxを作成する

```components/Tweet.tsx


```
④app/type/index.tsxを作成する

```app/type/index.tsx


```
## アイコンボタンを作成する

①componentsにIconButton.tsxを作成する

```components/IconButton.tsx


```

②appにtweetフォルダと[id].jsxを作成する

```app/tweet/[id].jsx


```
③app/_layout.tsxを編集する

```app/_layout.tsx


```
④app/new-tweet.tsxを編集する

```app/new-tweet.tsx


```

⑤app/(drawer)/index.tsxを作成する

⑥app/(drawer)/twitter-blue.tsxを作成する

⑦app/(drawer)/bookmarks.tsxを作成する

⑧app/(drawer)/_layout.tsxを作成する

```
npm install @react-navigation/drawer
npx expo install react-native-gesture-handler react-native-reanimated
```
⑨app/(drawer)に(tabs)を移動する

⑩app/(drawer)/(tabs)/feedファイルを作成し、index.tsxを移動する

⑪app/(drawer)/(tabs)/feed/_layout.tsxを作成する


## 参考サイト
[Building a Twitter Clone with React Native from Scratch](https://www.youtube.com/watch?v=sNixa64aG9Y)
【Android/iOS】コードレビューで気を付けるべき点について 


以下にAndroid（Kotlin）/iOS(Swift)それぞれのコードレビューで気を付けるべき点について記載していく。

## Android(Kotlin)

・参考１：翻訳: Kotlinベストプラクティス『Idiomatic Kotlin. Best Practices』
　https://qiita.com/takahirom/items/87d46150088aadccb481

・スコープ関数を適切に使用しているか？（またはスコープ関数を使うことで可読性を高めているか）
　参考２：KotlinのRun, Let, Apply, Alsoを使い分け
　https://qiita.com/JohnSmithWithHaruhi/items/e8f411c379483d4902aa

 ・LiveDataを使用する場合、Observeは意図したタイミングで実行しているか？
 　例えば、onViewCreatedで一度だけObserveするのではなく、
  　ユーザー操作で何度も通るパスで何度もObserveすると、
   　PostValueされて通知が飛んだ時にOvserveされた回数分だけ通知が動くことに。。

## iOS(Swift)

・参考１：【Swift・iOS】コードレビューからコーディングする際の注意点をまとめてみた。
　https://qiita.com/shogunzozo/items/7432a2881e8b37e2f45c
 
・参考２：Swiftのコードレビューの時に確認しているポイント24選
　https://qiita.com/tsuta0856/items/4545bf8c2ffbfb05bb1f

・参考３：循環参照の理解から対策まで
　https://qiita.com/yoshidasss/items/d263823d2786b567df02

 ・layoutSubviews
 　カスタムViewのinit()でself.frameに依存したsubviewのレイアウト処理は書くべきではありません。
  　画面の回転などによって変化していないため。
   　Viewのframeが変化した時に自動的に呼び出されるlayoutSubviews()でself.frameに依存したsubviewのレイアウト処理を書くべき

・適切な位置にMARKが記載されているか？
　ちなみにSwiftで区切り線を引きたいときは、「//MARK:- *****」でOK
 
## i/A共通
・コーディング規約を満たしているか？

・ヘッダーコメント、クラスやメソッドのDocコメントは適切か？

・レイアウトで完結するのに、コードで処理していないか？

・複雑な処理、後から見た人が分からないコードになっていないか？
　こういう場合はメソッド分けを検討する、もしくはコメントを手厚く書く

・テストコード
　修正、または新規に作成したコードは、XCTestやUIテストを通っているか？
 　またはカバレッジ率は問題ないか？（これは案件ごとに異なるかも）

・誤字脱字は無いか？

・デザインパターンに則って修正されているか？
　UI操作、ロジック、APIリクエスト、DBアクセスなど、デザインパターンに則って適切に振り分けられているか？

 ・余計な（不要な）修正は入っていないか？
 　Podを使っている場合はPodの変更が不要にもかかわらず変更してるとか、
  あるファイルの変更点が無駄な改行１行のみの変更点がある、とか
  TODO、FIXMEコメントやデバッグ用のコードが残っていないか？

・ライフサイクルを意識した修正となっているか？

・適切なスコープになっているか？
　変数、メソッドのスコープは適切か？
 不要なアクセスになっていないか？

・関数型プログラミングしているか？
　副作用を避け、純粋関数を使用することで、テストが容易になり、スレッドセーフなコードを書くことができます
 　参考：https://qiita.com/nemo-855/items/92b37ef2e9083c0d6c16

  ※純粋関数は以下２つを満たす関数のこと
 　参照透過性がある
　外部に対する副作用がない

・汎用コードを作成する 
　プロジェクト固有のコードから汎用コードを分離することを考える。 

　これは、プロジェクトの他の部分から分離された、境界線の明確な小さな問題に集中できるからだ。こうした会問題に対する解決策は、より綿密で正確なものになる。それに、あとでコードを再利用できるかもしれない 

・一度に一つのタスクを行う 
　読みにくいコードがあれば、そこで行われているタスクを全て列挙する。そこに別の関数やクラスに分割できるタスクがあるだろう。 

　それ以外は、関数の論理的な段落になる。タスクをどのように分割するかよりも、分割するということが大切なのだ。 

　※タスクを分割する際にうまく言葉で説明できないのあれば、何かを見落としているか、問題点や設計、または仕様に関する詳細が明確になっていないということだ。プログラム、あるいは自分の考えを言語化することで、明確に問題や設計を把握することにつながる。
チーム開発：2回目

## チーム開発：2回目の経験

こんにちは、jjj0331です。今回はチーム開発についての記事を投稿します。
プロジェクトの概要や課題、そしてその感想を共有しますので、ぜひ参考にしてください。

### チーム開発の概要
4人のチームメンバーで「ワクワクするものを開発せよ」というお題に対して、アイディア出しから要件定義、設計、実装、そして最終発表まで行いました。

### アプリ名：JourneyJunction - 旅の地図をみんなでシェア
最終的に「JourneyJunction - 旅の地図をみんなでシェア」というアプリを開発しました。このアプリの目的は、同じ趣味を持つユーザー同士が旅行プランを共有できることです。各ユーザーが趣味の旅行プランを投稿し、他のユーザーがそれを参照することができるアプリを開発しました。

## 開発工程
### アイディア出し
「ワクワクするものを開発せよ」というお題に対して、チームメンバー内で各々が考えるワクワクするものをどんどん出していきました。新しい知識を習得する、海外のことを知る、ゲームなどの様々な要素が集まり、いくつかのアプリのアイディアが出ました。

【課題】
ワクワクするものの案はたくさん出ましたがそれらを組み合わせてアプリにしようとした際に、
次のアイディアが決まらず、時間がかかりました。
また、リモート会議でも沈黙する時間が多くなりました

【解決策】
Miroというアプリを使用して、各メンバーが考えていることをどんどん書いていきました。リモート会議で発言するよりハードルが低くなり、各メンバーがアイディアのどこに魅力を感じているのか分かりました。

### 要件定義
旅行先を共有するアプリということで、以下のような機能を定義しました：
・基本的なログイン機能
・旅行先リストの投稿およびCRUD処理
・旅行先リストの検索機能
・お気に入りの旅行先を登録する機能
・Google APIを用いたおすすめ旅行先の表示

Railsのみで開発することや、アプリの実装時間から必要最低限の機能のみを要件定義で決めました。
【よかったこと】
各メンバーのPCにRailsの環境が整っていたため、Dockerなどを使用せずGitHubでコードだけを共有するような開発手段を取りました。Dockerの勉強にもなるのでDockerを取り入れてもよかったのですが、アイディア出しで予定が遅れていたので、GitHubでコードを共有するだけにしました。結果として、スムーズに開発に入ることができたので良かったです。

### 設計
ER図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715802/c5cf1419-449f-8a28-6eb2-ee8e01885c66.png)

【課題】：ER図の認識を合わせるのに苦労しました
【解決策】：スプレットシートにデータのイメージを入れ説明しました。ER図だけでは伝えづらい各テーブルのデータのイメージを共有できてよかったです。

画面デザイン（画面遷移図）
Figmaを使用して画面のイメージを共有したかったのですが、Figmaを学習する時間もなかったので、画面デザインや画面遷移については詳細は決めませんでした。

### 実装
実装では、バックエンドを担当しました。
Railsで複数テーブルのリレーションを作成する方法や、一度に複数レコードを作成するアクションを作成しました。

【課題1】：テーブルのバリデーションでおかしなデータの登録を防ぐことができなかったです。
「Todolist」テーブルの「緯度」「経度」に関してはバリデーションを実装したかったです。
ダミーで適当なデータを入れていたためGoogleAPIで動作確認する際にエラーが発生しました。
エラー原因は特定できませんでしたが、存在しない「緯度」「経度」のデータが原因だと思います。
※ちなみにこのエラーは、ダミーデータをすべて削除すると解消できました。


【課題2】：RailsでControllerクラスを作成する際に、アプリの画面遷移の詳細を決めていなかったので、実装がストップしてしまいました。
【解決方法2】：とりあえず、自分のイメージでControllerクラスを作成し、フロントエンドチームに何ができるようになったのかを示しました。
最終的には、フロントエンドチームがうまいこと実装してくれました。


## まとめ
チーム開発をすると一人では開発できないようなアプリを開発することができるので楽しかったです。私自身は実装の部分で大きく貢献はできなかったので、今後の行動として、技術力の向上を目的に各メンバーのコードの内容を確認して不明な個所があれば確認していこうと思います。
チーム開発を通して、気軽に質問できる環境は整ったので学習の機会を逃さないようにしたいです。
とこでも好みの環境を整えたいという話

# はじめに

この記事は、Qiita Engineer Festa 2024 1日目の記事です。
以下の記事より、すべての記事をご覧になれます。

https://qiita.com/0_terarin_0/items/b653e3851db100acc931

# 本題

さて、そもそも久しぶりの投稿なのですが、アドカレ2023が終わり次第Qiitaへの投稿欲というものが一気になくなってしまいました。おそらく、僕はこういうイベントが定期的にないと投稿できないんでしょう…。今回はエンジニアフェスタが終わっても投稿を頑張って続けていきたいと思います。

さて、本題の話、最近色々な場所でLinuxの環境に触れます。とある場所で担っているサーバー管理や、GCPやAWSでのクラウドコンピューティングなど。ただ、そこでいつも通りの環境を手に入れるために、僕が絶対にやることがあります。それは、**ZSH**をインストールすることです。ここで、ちょっと筆者の普段使っている環境について触れておきたいと思います。

```zsh:
koki(arm64):~$% neofetch
                    'c.          koki@Kokis-MacBook-Air.local
                 ,xNMM.          ----------------------------
               .OMMMMo           OS: macOS 14.5 23F79 arm64
               OMMM0,            Host: MacBookAir10,1
     .;loddo:' loolloddol;.      Kernel: 23.5.0
   cKMMMMMMMMMMNWMMMMMMMMMM0:    Uptime: 2 days, 13 hours, 47 mins
 .KMMMMMMMMMMMMMMMMMMMMMMMWd.    Packages: 257 (brew)
 XMMMMMMMMMMMMMMMMMMMMMMMX.      Shell: zsh 5.9
;MMMMMMMMMMMMMMMMMMMMMMMM:       Resolution: 1680x1050
:MMMMMMMMMMMMMMMMMMMMMMMM:       DE: Aqua
.MMMMMMMMMMMMMMMMMMMMMMMMX.      WM: Quartz Compositor
 kMMMMMMMMMMMMMMMMMMMMMMMMWd.    WM Theme: Blue (Dark)
 .XMMMMMMMMMMMMMMMMMMMMMMMMMMk   Terminal: /dev/ttys002
  .XMMMMMMMMMMMMMMMMMMMMMMMMK.   CPU: Apple M1
    kMMMMMMMMMMMMMMMMMMMMMMd     GPU: Apple M1
     ;KMMMMMMMWXXWMMMMMMMk.      Memory: 3243MiB / 16384MiB
       .cooc,.    .,coo:.
```

Macbookを使っているということは、容易に想像できると思いますが、デフォルトのZSHを使っています。これを主軸に話していきたいと思います。

## ①ZSHの設定ファイルは全て```~/.zshrc```

ZSH関連の設定ファイルは全て```~/.zshrc```に入れてあります。なんか色々な他のファイルでの管理等々分割できるという話kも聞きましたが、分散していると至って面倒です。したがって、ここですべてのファイルを管理しています。

## ②ZSHの表示方法

ZSHの表示方法は以下のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/8782bf9f-d63f-ff40-b43c-92afd4bd6212.png)

さて、このZSHについては、ZSHRCのファイルに以下のように記述しています。

```zsh
PROMPT="%F{green}%n%f%F{cyan}($(uname -m))%f:%F{blue}%c"$"%# "%f
```

ちなみに、```uname -m```っていうのを入力するのに変えたのには理由があって、最初は```arch```で表示されていたのですが、archだとコマンドが見つからない表記になることもあるのでやめておきました。



# 最後に

本日は久しぶりの記事で、ちょっと量的にも軽めに収まりました。このまま、今後ともエンジニア活動はしばらく続けていきたいと思いますので、皆様方どうぞよろしくお願いします。それでは今後もエンジニアフェスタの記事をお楽しみにしてください。 

https://qiita.com/0_terarin_0/items/b653e3851db100acc931
【TypeScript初心者向け】ユニオン型に共通のプロパティを追加する方法

## はじめに
私は、実務経験9ヶ月のフロントエンドエンジニアです。
React/TypeScriptを使って開発しています👩‍💻

実務で既存の型から新しく型を合成するときに、書き方を迷った事例があったので共有します。
私が勘違いしていたポイントも載せるので、参考にしていただけると嬉しいです。

- 対象読者： TypeScript初心者

## 目的
以下のようにユニオン型で定義された`UnionType型`の各型（`A型`、`B型`、`C型`）に、共通のプロパティ`id: number`を追加した新しい型を作ります。
```typescript
interface A {
  a: string
}
interface B {
  b: string
}
interface C {
  c: string
}

type UnionType = A | B | C
```
例えば`A型`に`id: number`を追加した場合、`{a: 'odendayoko',id: 123}`のような値を代入できます。これを`A型`、`B型`、`C型`すべてに展開させて、共通のプロパティ`id`を追加した新しい型を作りたいです。

## 結論
先に、どのように定義したら目的の型を得られるのか、結論を書きます。

:::note info
- **ユニオン型**と**インターセクション型**を組み合わせることで、**ユニオン型の各要素に共通のプロパティを追加**した新しい型を合成できる
- このとき分配法則が適用されるので、以下のように書くことができる
```typescript
type CombinedType = UnionType & {
  id: number
}
```
:::

## 文法のおさらい
今回使用するユニオン型とインターセクション型を簡単にまとめます。

:::note info
#### ユニオン型
- 複数の型のうち、いずれかを取ることができる型
- 2つ以上の型を`|`で繋げて書く
#### インターセクション型
- 複数の型のすべてを満たす型
- 2つ以上の型を`&`で繋げて書く
:::
詳しくは以下のサイトをご覧ください。

https://typescriptbook.jp/reference/values-types-variables/union

https://typescriptbook.jp/reference/values-types-variables/intersection


## 実装
インターセクション型を使うことで、ユニオン型の各要素に共通のプロパティを追加した新しい型を作ることができます。
このとき、インターセクション型には分配法則が適用されるため、以下のように書けます。

```typescript
type CombinedType = UnionType & {
  id: number
}
```
この`CombinedType型`は、`UnionType型`（`A型`、`B型`、`C型`のいずれか）に共通のプロパティ`id`を追加したものです。

わかりやすくするために追加したい共通プロパティを持つ`D型`を作り、書き換えてみます。

```typescript
// 追加したい共通プロパティを持つ型
interface D {
  id: number
}

type CombinedType = (A | B | C) & D;

// 分配法則で展開
type CombinedType = A & D | B & D | C & D
```
分配法則で()を外すように展開してみると、どのような型が作られるのか、イメージしやすいのではないでしょうか？
どちらも同じ意味ですが、前者の方がすっきりしていて見やすいですね👍

合成した`CombinedType型`を使うと、以下のような値を代入することができます。
```typescript
const example1: CombinedType = { a: "odendayoko", id: 123 }; 
const example2: CombinedType = { b: "odeko", id: 456 }; 
const example3: CombinedType = { c: "odenkamone", id: 789 }; 
```

## 余談
すぐには、このような書き方ができることを理解できませんでした。その理由として、2つ勘違いしていたことがあります。

- インターセクション型はオブジェクト型同士でしか使えないと思っていた
- インターセクション型は型の足し算だと思っていた

### インターセクション型はオブジェクト型同士でしか使えないと思っていた
**型に型を追加するときは、インターセクション型を使う**ことは理解していたし、実務でもかなりの頻度で使っています。

しかし、これまでインターセクション型を使う時は、以下のように`オブジェクト型 & オブジェクト型`の形式で定義することがほとんどでした。
```typescript
interface E {
  name: string
}
interface F {
  id: string
}

type User = E & F
```
このとき、`User型`は**E型とF型のどちらも満たす型**という意味になります。
よって`User型`には`{name: 'おでこ。', id: '@odendayoko'}`のような値を代入できます。

この型合成はオブジェクト型同士でしか使えないと思っていたので、今回のようにユニオン型にオブジェクト型を追加する場合には使えないと勘違いしていました。

**インターセクション型はオブジェクト型だけでなく、他の型とも組み合わせることができる**ことを学びました。

### インターセクション型は型の足し算だと思っていた
私は勝手に、インターセクション型は型の足し算だと思っていました（記号が`&`で足し算ぽいですし…😂）。
上記の例で言うと`User型`を合成するとき、`E型`と`F型`を足していると思い込んでいました。

足し算だと勘違いしていたので、分配法則が適用できることに気がつきませんでした。実際は、インターセクション型は名前の通り、**積集合**なので掛け算のような動作をします。したがって、共通項を括り出すことができます。

この勘違いについては、こちらの記事がとてもわかりやすく解説してくださっていたのでスッキリしました✨

https://qiita.com/ist-ko-su/items/af8224f7571817fbb9bd

## 終わりに
普段から使っている文法でも、少しいつもと違う応用ポイントがあると迷ってしまいますね😭
自分が迷ったところを言葉で説明できると、理解力が深まって良いと思いました✨

Xで日々の業務や日常を発信しています！
よろしければフォローをお願いします🍢

https://twitter.com/odendayoko
Docker を使うなら当然 userns-remap してるよね！

この記事は2023年5月20日から開催された技術書典14にて頒布した「KLabTechBook Vol.11」に掲載したものです。
...

https://makiuchi-d.github.io/2024/06/08/klabtechbook11-docker-userns-remap.ja.html
macの環境変数$PATHの整理、重複削除

## はじめに

こんにちは！[@nyakako13](https://qiita.com/nyakako13 "Qiita ページ") です。

asdfを使う機会があったので、今までmacに入っていたpyenv、rbenv、nodenvを消して、今後はツールのバージョン管理を全部asdfにまとめるぞ！

https://asdf-vm.com/ja-jp/


と思ったのですが・・・

rbenvやnodenvを
brewでアンインストールしても、
関連フォルダを削除しても
.zshrcを見直しても

どうしてもPATHが残ってしまい、気持ち悪かったのでPATHを整理する方法を調べてみました。ついでに重複していたPATHも綺麗にできました。


## 環境
- M1 Mac
- zsh


## 問題

### PATHの確認
```zsh:zsh
echo $PATH | tr ':' '\n'
```

### コマンド実行結果の一部
```
# 重複・・・
/bin
/usr/bin
/usr/local/bin
/usr/local/bin
/usr/bin
/bin

# どうしても消せなかったPATH
/Users/username/.nodenv/bin
/Users/username/.rbenv/shims
/Users/username/.rbenv/bin
/Users/username/.pyenv/shims
/opt/homebrew/opt/postgresql@14/bin
/Users/username/.pyenv/bin
/Users/username/.nodenv/shims
```


## 解決方法
.zshrcに下記を追記、反映することで改善しました。

```zsh:~/.zshrc
# 重複したPATHを自動で削除
typeset -U path

# 存在しないディレクトリ、他のユーザーが書き込み可能なディレクトリのPATHを削除
path=(${^path}(N-/^W))
```

.zshrcの変更を反映
```zsh:zsh
source ~/.zshrc
```


## 結果

重複も不要なPATHもなくなりスッキリしました！

```
/Users/username/.asdf/shims
/opt/homebrew/opt/asdf/libexec/bin
/opt/homebrew/bin
/bin
/usr/bin
/usr/local/bin
/usr/sbin
/sbin
```

## 感想
asdf 良いです。
いろんな言語やDB,ツールを使う人ほど恩恵あるんだろうなー。


## おわりに
よかったら[X(@nyakako13)](https://twitter.com/nyakako13 "Xプロフィール")もフォローしてもらえると嬉しいです。

[Qiita100投稿](https://qiita.com/nyakako13/items/03ad61cfb82a1582b5d1)まで残り83！

未経験や浅経験、厳しいと言われている年代でエンジニアへの転職活動されている方、負けずにがんばりましょう！！

## 参考
https://qiita.com/benzene/items/865506483377ad4128ee
Python 辞書型のリストの扱い

## 辞書型のリストの取り出し
Pythonの辞書型リストの扱いについて説明するよ。
以下のようなリストから値を取り出す操作を書くよ。
```
dict_list = [{"name": "apple", "price": 150, "country": "Japan"},{"name": "orange", "price": 200, "country": "America"}, {"name": "pineapple ", "price": 200, "country": "Philippines"}]
```

## リストから辞書型を取り出す
### 1. リストから辞書型を1つずつ取り出す
for文を使って、1つずつ取り出すよ。
```python
for item in dict_list:
    print(item)

# 出力結果
> {'name': 'apple', 'price': 150, 'country': 'Japan'}
> {'name': 'orange', 'price': 200, 'country': 'America'}
> {'name': 'pineapple ', 'price': 200, 'country': 'Philippines'}
```
### 2.リストから、2番目の要素のみを取り出す
listの要素番号を指定して取り出すよ。リスト名に`[要素番号]`をつければいいけど、要素番号は`0`から始まるのが注意だよ。
```python
dict_orange = dict_list[1]
print(dict_orange)

# 出力結果
> {'name': 'orange', 'price': 200, 'country': 'America'}
```

### 3.リストから、全ての辞書型の`name`の値を取り出す
辞書型のリストから、`name`の値のみを取り出すよ。
リスト内法表記を利用するよ。
```python
name_list = [item['name'] for item in dict_list]
print(name_list)

# 出力結果
> ['apple', 'orange', 'pineapple ']
```
### 4.全ての辞書型のキーを減らす
辞書型のkey`'country'`を減らし、リスト化するよ。
```python
delete_country = list()
for item in dict_list:
    del item['country']
    delete_country.append(item)
print(delete_country)

# 出力結果
>  [{'name': 'apple', 'price': 150}, {'name': 'orange', 'price': 200}, {'name': 'pineapple ', 'price': 200}]
```

### 5.特定の値を取り出して、辞書型のリストを作る
dict_listから、`name`と`price`を抽出するよ。
リスト内法表記で辞書型を作っていくよ。
```python
pic_up_name_price = [{'name': item['name'], 'price': item['price']} for item in dict_list]
print(pic_up_name_price)

# 出力結果
> [{'name': 'apple', 'price': 150}, {'name': 'orange', 'price': 200}, {'name': 'pineapple ', 'price': 200}]
```

## まとめ
辞書型の扱いにもまだまだたくさんあるけれど、使いそうなものをまとめたよ。
慣れると辞書型って便利そう。。。
オンライン対戦を支える独自シリアライズフォーマット

この記事は2022年1月22日から開催された技術書典12にて頒布した「KLabTechBook Vol.9」に掲載したものです。
...

https://makiuchi-d.github.io/2024/06/02/klabtechbook9-wsnet2-serializer.ja.html
累積分布関数とは

# 確率密度関数とは

累積分布関数の前に確率密度関数について説明していきます

確率密度関数とは、ある確率変数に対して確率密度という概念を対応づける関数のことです

**2 つのサイコロを投げた時の和はいくつか**という事象を例に挙げます

<img width="400" alt="image.png (23.1 kB)" src="https://img.esa.io/uploads/production/attachments/13979/2024/06/10/137443/1a84cec3-3841-4a2e-93d0-01cf0950866c.png">

以上の図は先ほどの事象をは 10000 回試行した結果です
これを確率密度関数で表現してみます

<img width="400" alt="スクリーンショット 2024-06-10 19.45.33.png (124.8 kB)" src="https://img.esa.io/uploads/production/attachments/13979/2024/06/10/137443/153b35ba-1bb2-41b1-94c8-5b0df97bb41a.png">

以上の図より 2 つのサイコロの和が 7 となる時の確率は大体 0.17 \* 100 = 17%であるとわかります
理想状態で例に挙げた事象を検証すると 6/ 36 = 0.166.... なので大体あってそうですね

このように**確率密度関数は確率変数一つを入力として渡すことで求めたい確率を求める**ことができます

# 累積分布関数とは

累積分布関数とは、確率変数がある値以下をとる時の確率を示す関数です

## 確率密度関数との違い

累積分布関数は確率密度関数とは異なり、複数の確率変数の和の確率を求めます

確率密度関数と累積分布関数それぞれに 7 を入力するとします


<img width="400" alt="スクリーンショット 2024-06-10 19.51.50.png (126.6 kB)" src="https://img.esa.io/uploads/production/attachments/13979/2024/06/10/137443/981cfd28-f1e7-4dbc-8a34-464f74a0ca58.png">

このとき、先ほどの図の説明すると確率密度関数では、7 が出る時のみの確率を求めるのに対し、累積分布関数では 7 よりも小さい確率変数の値の全ての確率を足した確率を求めます

このように累積分布関数は**確率変数がある値以下をとる時の確率の総和を導出する**ことができます

# 参考記事

https://wakara.co.jp/mathlog/20221228#%E7%A2%BA%E7%8E%87%E5%88%86%E5%B8%83%E3%81%A8%E3%81%AF

https://www.youtube.com/watch?v=edNiwyy1pmk&t=312s&ab_channel=3Blue1BrownJapan