OmniAICreator/Qiita-1.07M huggingface dataset:
@dataclassデコレータとfield

素人のメモなのでたぶんあってますくらい。
デコレータについては他記事で補完してください。


### まずは`@dataclass`の話
**`@dataclass`デコレータ：Pythonでクラスを簡単に作ることができる（３つのメソッドを勝手に実行してくれる）。**

#### `@dataclass`を使わない通常のクラスの作り方：
```python
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    #インスタンスを出力した時に何表示するか定義するメソッド
    def __repr__(self):
        return f"Person(name={self.name}, age={self.age})"
    #インスタンス同士の属性が同じか確認するメソッド
    def __eq__(self, other): if isinstance(other, Person): return self.name == other.name and self.age == other.age return
```

#### `@dataclass`を使うと、もっと簡単に書ける（３メソッドが勝手に実行され、initの属性指定だけ書く）：

```python
from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int
```

これだけで、`__init__`や`__repr__`、`__eq__`が自動的に追加される。


### 次に、`field(default_factory=str)`の話
**field：dataclassesモジュール内で定義されている関数フィールドのデフォルト値を設定するために使う。**
例えば、空の文字列や空のリストをデフォルト値にしたいときに使う。

```python
from dataclasses import dataclass, field

@dataclass
class Example:
    name: str = field(default_factory=str)  # デフォルトは空の文字列
    values: list = field(default_factory=list)  # デフォルトは空のリスト
```

このクラスを使うと、`name`はデフォルトで空の文字列、`values`はデフォルトで空のリストになる。

#### インスタンス作成withデフォルト値（空）
```python
example = Example()
print(example.name)   # 出力: ''
print(example.values) # 出力: []
```


#### インスタンス作成with指定した値

```python
example_with_custom_values = Example(name="Alice", values=[1, 2, 3])
print(example_with_custom_values.name)   # 出力: 'Alice'
print(example_with_custom_values.values) # 出力: [1, 2, 3]
```

たぶんfieldはもっと使い方ある、、、、
【惨敗】ABC381備忘録

# はじめに
人生3回目のABC(Atcoder Beginner Contest)に参加したので、その備忘録を書きます。なんと2完でした😢。

正直悔しいという気持ちにすらおこがまじさを感じますね。

とりあえず茶色を目指します。

## 環境
- C++20(gcc 12.2)
- Visual Studio Code


## A - 11/22String
- ドはまりして22分使った。
- 文字の種類と状態を先頭から順に走査して、鬼の条件分岐でごり押し。
- お手本のような悪い例ですね

### 問題
6桁の整数について、条件を満たしているかを判定しYes/Noで出力

条件 : `/`の右側に1、左側に2が同じ数だけある文字列を含んでいるか


###  解答
- 入力値の各桁に0~9の数値がそれぞれいくつ含まれるかのcount配列を作る
- /10で進み、%10で抽出
```c++:A

int main() {
    int N;
    string S;
    int countone=0;
    int counttwo=0;
    bool flag=false;
    cin >> N >> S;
    for(int i=0;i<N;i++){
        if(S[i]=='/'){
            flag=true;
            continue;
        }
        if(flag==false){
            if(S[i]=='1'){
                countone++;
            }else{
                cout << "No" << endl;
                return 0;
            }
        }
        if(flag==true){
            if(S[i]=='2'){
                counttwo++;
            }else{
                cout << "No" << endl;
                return 0;
            }
        }
    }
    if(countone==counttwo){
        cout << "Yes" << endl;
    }else{
        cout << "No" << endl;
    }

}
```

## B - 1122 String
### 問題
偶数文字の文字列について、2文字ずつ分割し、各ペアが同じ数字かつ、ペア間で数字がかぶっていないか否かを判別
### 解答
「各ペアが同じ文字であること」と「ペア間にダブりがないこと」を順番に見ていく。
```c++:B
int main() {
    string S;
    cin >> S;
    vector<int> count(30);
    bool ans=false;
    if(S.size()%2==1){
        cout << "No" << endl;
        return 0;
    }

    for(int i=1;i<S.size();i+=2){
        if(S[i-1]!=S[i]){
            ans=true;            
            break;
        }
        count[S[i]-'a']++;    
    }
    
    for(int i=0;i<30;i++){
        if(!(count[i]==0 || count[i]==1)){
            ans=true;            
            break;
        }
    }

    if(ans){
        cout << "No" << endl;   
    }else{
        cout << "Yes" << endl;
    }

}
    
```
## C - 11/22 Substring
Aで使った最悪手、文字列を先頭から愚直に見ていき、鬼の条件分岐で何とかする手法を引き継いだことで、`WA × 1`を直せず撃沈
### 問題
Aにでてきた11/22文字列について、最長の部分文字列の長さを求める
### 解答
落ち着いてから説きなおしました。
`/`の前後の1と2を順にみていきます。死ぬほどきれいになりますね
```c++:C
int main() {
    int N;
    string S;
    cin >> N >> S;
    int maxnum=0;
    for(int i=0;i<N;i++){
        if(S[i]=='/'){
            for(int j=0;j<=i;j++){
                if(S[i-j-1]=='1'&&S[i+j+1]=='2'){                    
                    continue;                    
                }else{
                    maxnum=max(maxnum,j*2+1);
                    break;
                }
            }
        }
    }
    cout << maxnum << endl;
}
```
## D - 1122 Substring
### 問題
入力される数列について、同じ数字のペアが連続し、かつペア間に被りがない部分数列の最大のものの長さを返す。
### 解答
落ち着いてから問題を見ると尺取り法が使えそうだったので実装してみるが鬼の`WA`。今日は眠たいので明日やります。



## まとめ
ということで、今日の惨敗ABCでした。自分の無力さを痛感しました。

半分で止まっている鉄則本をもう一度0からやり直そうかな。
XAMPPでコマンドから初めてMySQLに接続して、データベースを作るまでの手順

# コマンドラインからmysqlに接続したい

環境構築するたびに、「あれ、どうやるんだっけ」と毎回迷っている気がする
そろそろしっかり覚えたいと思った。
まずはshellを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3851119/428c66eb-49be-4a97-fd4f-ac67cde69e68.png)

ディレクトリが
```
\xampp8.2
```
なのを確認しGO。


```
mysql -u root -p
```
以上！

で終わってはこの先もまた忘れるので理屈をつけておく
まず、xamppの中では既にmysqlクライアントへのパスが通っている。
なので、コマンドの一番最初にやることとしてはmysql

次に誰が？を決める
これは誰でも彼でも接続されるとまずいから、指定する必要がある。
ただ、最初はそんなもの設定してるはずもなくて、Mysql側で決めている値を指定する。それが```root```


最後に
```
-p
```
これはパスワードを入力させてくれ、という依頼。
ユーザにはパスワードがつきものなので、ここで指定する。
これはもはやセットであると言える。

ただ、最初はパスワードは設定されていないので、何も入力しなくていい。

```
MariaDB [(none)]>
```
これで無事接続完了。

ちなみに
![2024-11-22_09h38_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3851119/0b39f8e1-d9db-c8ef-8a11-15481ddd9dde.png)


これでもいける。
画面から色々いじれて便利だけど、
コマンドでイメージしながらやる力をつけたかったので今回はコマンドでやります。

## rootユーザにパスワードを設定
個人開発だけど、念のため設定しておこう。

まずは今のユーザを確認する。
SELECT文
```
SELECT USER(), CURRENT_USER();
```
SELECET文で引っ張ってくるカラムがこの二つ、というイメージ

これはMysqlが準備している関数。
覚えるしかないやつ。

パスワードを変更するにはALTER USER
何かの定義を変更したいときは基本的にALTER文の出番なイメージ
これはもうお約束の書き方なので覚える

```
ALTER USER 'root'@'localhost' IDENTIFIED BY 'your_password';
```




## DB作成
```
CREATE DATABASE DBの名前;

```

操作対象を作ったDBに切り替えます
```
use database名;
```

# 次回
テーブルに実際にデータを入れていきます。
LeetCodeを1日1題解いてみる (day24)

24日目に取り組んだ問題はこちら！

# 112. Path Sum

https://leetcode.com/problems/path-sum/description/

## 問題文
Given the root of a binary tree and an integer targetSum, return true if the tree has a root-to-leaf path such that adding up all the values along the path equals targetSum.

A leaf is a node with no children.

## 僕の回答
```py
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
        if not root:
            return False
        q = deque([(root, root.val)])

        while q:
            node, node_sum = q.popleft()
            if not node.left and not node.right:
                if targetSum == node_sum:
                    return True
                else:
                    continue
            if node.left:
                q.append([node.left, node_sum + node.left.val])
            if node.right:
                q.append([node.right, node_sum + node.right.val])
        
        return False
```

## 他の回答例

```py
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
        
        def dfs(node, currentSum):
            if not node: return False

            if not node.left and not node.right and currentSum == node.val:
                return True
            
            return dfs(node.left, currentSum - node.val) or dfs(node.right, currentSum - node.val) 

        return dfs(root, targetSum)
```

## コメント
昨日学んだ`deque`を使いこなせて嬉しいです。少しは木構造に慣れてきたかなと思います。

## 次の問題はこちら!
https://qiita.com/h_y_s_d/items/0afd6e521786fd02934a
自作 WebApp のセットアップ超簡単にできて Docker すげぇって感じただけの随筆

## 背景

少し前に、Python FastAPI で WebApp を作りました。

https://github.com/aKuad/mozjpeg-webui

これを動作させる `Dockerfile` を作ってみたらめっちゃ良かった、というだけの話です。

## Docker 無しのセットアップ手順

mozjpeg-webui を動かすには、mozjpeg の実行ファイルを `/opt/mozjpeg/bin/` に置いておく必要があります。(正確には `jpegtran` さえあればいい。)

```sh
sudo apt install cmake nasm

# リポジトリ外の、どこか適当なディレクトリで
wget -O - https://github.com/mozilla/mozjpeg/archive/refs/tags/v4.1.1.tar.gz | tar -xzv -C ./
cd mozjpeg-4.1.1

mkdir build && cd build
cmake -G"Unix Makefiles" -DPNG_SUPPORTED=0 ../
sudo make -j5 install
```

それと、Python のパッケージを `pip` で入れる必要もあります。

```sh
# ここからリポジトリルートで
pip install -r assets/requirements.txt
```

これで起動および動作できます。

```sh
cd src
python3 main.py
```

バイナリのビルドもあって、セットアップは少々手間。

## Docker を用いたら

Docker をめっちゃ雑に一言で言うと、「素早く仮想環境用意して、色々動かせるヤツ」です。「こういうのが用意されたこんな環境 (= Dockerfile 及び Docker イメージ)」を事前に用意しておけば、それを呼び出すだけでサッと専用マシン (= Docker コンテナ) 起動。

Docker の詳しい解説は山ほど出回っているので、ここではカット。

先のような手順を、すべて `Dockerfile` に示すことができます。

```dockerfile
# mozjpeg building stage
FROM python:3.13-slim AS build

WORKDIR /home/build
RUN apt update
RUN apt install -y wget cmake nasm
RUN wget -O - https://github.com/mozilla/mozjpeg/archive/refs/tags/v4.1.1.tar.gz | tar -xz -C ./

WORKDIR /home/build/mozjpeg-4.1.1
RUN cmake -G"Unix Makefiles" -DPNG_SUPPORTED=0 ./
RUN make -j5 jpegtran-static
# Only jpegtran is necessary, then static linked executable is easy to setup


# Production deployment stage
FROM python:3.13-slim

WORKDIR /home/mozjpeg-webui
COPY --from=build /home/build/mozjpeg-4.1.1/jpegtran-static /opt/mozjpeg/bin/jpegtran
COPY assets/requirements.txt /home/mozjpeg-webui/requirements.txt
COPY src /home/mozjpeg-webui/src
RUN pip install -r requirements.txt

WORKDIR /home/mozjpeg-webui/src
CMD ["python3", "main.py"]
```

上のファイルさえあれば、ビルドして起動するのみ。打つコマンドはたったこれだけ。

```sh
docker build -t mozjpeg-webui .
docker run --rm -it -p 8000:8000 mozjpeg-webui
```

これら全てがコンテナ (仮想環境) 上で動作するので、実環境が汚れる心配も全くなし。何なら、apt 使える環境限定 (つまり Debian 系 Linux) だったところが、Docker さえあれば使用 OS 問わず使えるように！

## おわり

多分、知ってる人からしたら「逆に何でやってなかったの？」と言われる。
分散システムの基礎：データレプリケーションとCAP定理のトレードオフ

# はじめに  
こんにちは、もんすんです。
今回は分散システムについて触れていきます。

現代のインターネットやアプリケーションは、複数のサーバやシステムが連携する「分散システム」で動いています。

この分散システムが効率性・信頼性を保って動作させるためには、「データレプリケーション」や「CAP定理」などの基本概念を理解することが重要です。

本記事では、それぞれの基礎について具体例を交えて説明します。

# 本題  

## データレプリケーションとは
データレプリケーションとは、同じデータを複数の場所にコピーし、維持する技術です。

例えば、あるサービスのデータが1つのサーバにしか保存されていないと、そのサーバが故障した場合、データが失われてしまいます。
しかし、データレプリケーションを行えば、別のサーバにもコピーが保存されているため、データを復旧できます。

### レプリケーションの種類
- **同期レプリケーション**: すべてのコピーが同時に更新されます。一貫性は高いですが、遅延が発生することもあります
- **非同期レプリケーション**: 最初に1つのコピーが更新され、その後他のコピーに反映されます。パフォーマンスは良いですが、データの一貫性が一時的に損なわれることがあります

### レプリケーション戦略  
- **マスター・スレーブモデル**: 一つのマスターノードが更新を管理し、スレーブノードに変更を伝播します
- **マルチマスターモデル**: 複数のノードが同時にデータを更新できます
- **ピア・ツー・ピアモデル**: すべてのノードが対等で、どのノードもデータを更新可能です

データレプリケーションは信頼性や可用性を向上させますが、運用には課題も伴います。

この課題の1つに「CAP定理」があります。  

## CAP定理  
CAP定理（Brewerの定理）は、分散システムで以下の3つの特性を同時に満たすことが不可能であると示しています。  
1. **一貫性 (Consistency, C)**: すべてのノードが同じデータを持つ状態。 
2. **可用性 (Availability, A)**: すべてのリクエストに対して応答を返せる状態
3. **分割耐性 (Partition Tolerance, P)**: ネットワーク障害が起きてもシステムが動作を継続できる状態

この3つのうち2つは保証できますが、残りの1つは妥協する必要があります。

### トレードオフの具体例  

3つのうち2つしか保証できないとは、どういうことでしょうか？
例を紹介しながら説明していきます。

#### 分割耐性（P）が保証されないパターン

2つのノード、`ノードA`と`ノードB`からなる分散データベースがあります。

これらのノードは、データを複製し、一貫性を保つために連携しています。
つまり、Cが保証されている状態です。
通常、`ノードA`と`ノードB`は、同じデータを保持し、ユーザーからのリクエストに対して即座に応答します。この状態では、両方のノードが最新のデータを持っているため、可用性（A）も保証されています。

##### 【課題】
さて、`ノードA`と`ノードB`の間のネットワーク接続が切断された場合を考えます。
2つのノードは互いに通信できなくなります。

もし、この状態で、引き続きシステムが稼働していると、`ノードA`でのデータ更新があった場合、`ノードB`はその情報を得られず、最新の情報を保持できなくなります。
その結果、`ノードB`は最新データを保証できなくなり、`ノードA`と`ノードB`のデータの一貫性も失われてしまいます。

つまり、一貫性(C)と可用性(A)が重視できなくなります。

これでは矛盾が生じるので、それを防ぐ(一貫性と可用性を重視する)には、システムを停止するしかありません。

これが、分割耐性が保証されていない(= ネットワーク切断によるノードの分割に対する耐性が低い状態)ということになります。

#### 一貫性(C)が保証されないパターン

2つのノード、`ノードA`と`ノードB`からなる分散データベースがあります。

これらのノードは、可用性(A)が保証され、ユーザーからのリクエストに対して即座に応答します。
ネットワーク障害があってもシステムを動作させるようにしています。
つまり、Pが保証されている状態になります。

##### 【課題】
`ノードA`と`ノードB`の間のネットワーク接続が切断されると、2つのノードは互いに通信できなくなります。

分割耐性(P)維持のため、システムは動作し続けるようになっており、可用性(A)維持のため、それぞれのノードは最新の情報を返却します。

しかし、`ノードA`と`ノードB`は通信できていないため、それぞれが自分の最新情報を正しい情報として返却してしまい、一貫性(C)が失われてしまいます。

### 可用性(A)が保証されないパターン

2つのノード、`ノードA`と`ノードB`からなる分散データベースがあります。

これらのノードは、データを複製し、一貫性を保つために連携しています。
Cが保証されています。
ネットワーク障害があってもシステムを動作させるようにしています。
Pも保証されています。

#### 【課題】
`ノードA`と`ノードB`の間のネットワーク接続が切断されると、2つのノードは互いに通信できなくなります。

分割耐性(P)維持のため、システムは動作させなければいけません。
このままシステムが動作し続けると、ノード間でデータが同期されず、一貫性(C)が失われてしまうため、ユーザからのリクエストに対してエラーを返却します。
エラー返却ということは、正確な情報をレスポンスできていないということ、つまり可用性(A)が失われることになります。

# 終わりに  

今回は、分散システムにおけるデータレプリケーションとCAP定理について触れました。

分散システムの設計において、データの信頼性や可用性を高めるデータレプリケーションと、CAP定理によるトレードオフの理解は不可欠です。

分散システムは複雑に感じるかもしれませんが、まずは基本的な原則を押さえて、その仕組みや設計の意図をきちんと理解しましょう！
Python実践データ分析100本ノックをやってみた For Kaggle

# はじめに
kaggleに挑戦しようと思い立ちました。
しかし、データ分析自体初心者なのでとりあえず手を動かすことにしました。
Python実践データ分析100本ノックをやって基本的なpandasやmatplotlibの動かし方を学びながらデータに向き合っていこうと思います。
[Python実践データ分析100本ノック](https://www.amazon.co.jp/Python-%E5%AE%9F%E8%B7%B5%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90-100%E6%9C%AC%E3%83%8E%E3%83%83%E3%82%AF-%E7%AC%AC2%E7%89%88-%E4%B8%8B%E5%B1%B1/dp/479806727X/ref=sr_1_1?adgrpid=117243755913&dib=eyJ2IjoiMSJ9.c3Nw_6-Rhs9HVY4Xnitt_B5EqPBxtVwGI6sleryKlhzJ1vIIQ8m6NUPSI0Ehu-B9-9rXmF0gj04MOXtkKsg95S1GTph8EIO3KtypV_7yyD8UXdrJV3JG6J8OJYEPhFLb2EsbDxdTHNnmxmGEp6F1u25c4pxmgUwmf1CAmD8odp4oj52zdvFpNBHLPMEocYjHrdMSher-mCtvalHSScIxCU_2DHTaaabvEZC64_t3dDTFhgmXH3NExuPMm_BjCrGexPU0hT6fhJKKqzLHuON2F7au3sHHp-R6J8SRuQXJxaw.tzN_me5NUf4ZoCZulg0YF81aDArG_tf_ZdpTwJKewG0&dib_tag=se&hvadid=678980112153&hvdev=c&hvqmt=e&hvtargid=kwd-1019371351102&hydadcr=27294_14738241&jp-ad-ap=0&keywords=python+%E5%AE%9F%E8%B7%B5%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90100%E6%9C%AC%E3%83%8E%E3%83%83%E3%82%AF&qid=1730126493&sr=8-1)
あくまでkaggleへの挑戦録をつけることがメインなので本書に関する詳しい解説ではなく、学んだことを備忘録的にざっくりまとめる程度にとどめます。

# 本書で学べる事をざっくり
## pandas
### データ読み込み
```python
import pandas as pd
csv_df = pd.read_csv("CSVファイル名")
excel_df = pd.read_excel("EXCELファイル名")
```
引数もいろいろあるので使いながら慣れていく必要がありそうです。
調べてみるとこちらはURLから読み込むことも可能なようです。
便利だなあ:open_mouth:
### データの結合
```python
merge_df = pd.merge(csv_df, excel_df, on="id", how="left")
```
上記はSQLでいうところのLeft Inner Joinができます。
onで結合条件, howで結合方法を指定できます。
### データの連結
```python
concat_df = pd.concat([csv_df, excel_df], axis=1)
```
axisは連結方向を指定できます。(1は縦方向の連結)
データ同士が同じカラム構造を持っている場合や、カラムをそのまま横につなげたい場合などに使用するとよさそうですね。
### 欠損値(null値)の確認
```python
csv_df.isnull().sum()
```
## 最適化問題
第７章では数理最適化問題も扱っていました。
Graphの可視化、およびロジスティクスネットワークの最適化あたりを学べます。
以下のライブラリを使用しました。
- pulp
- ortoolpy  
使用方法については割愛させていただきますが、線形最適化に定式化できるものは、短時間で解を求められるよう
使用方法については割愛です。
実務では選択肢に入る気がしてます。
kaggleで使用機会があるかは謎ですが...

## やってみた感想
細かなデータを整理していくのが大事なのだと痛感した。  
予測器も万能なものではなく、データクレンジングなどで結構精度変わるんだなあってのが実感できただけでも大きな収穫となった。
とりあえずpandasやscikit-learnに触れてどのように使用していくかイメージがつかめた。
## 最後に
次にQiita更新するのはkaggleコンペに挑戦してみたって内容で書こうかなと思ってます。
初心者が実際コンペに触れてみてどのように感じたか、わからないことの共有などしたいなと考えています。
今回のQiitaなかなか時間とれなくてすごい適当に書いてしまったので読む価値なかったかもです。すみません。:sweat:
JavaScriptのおさらい 1 

# Chromeで学習する
右クリック「検証」から「コンソール」で実行できる。
表示しているWebページにも反映される。

# 変数の種類
- var
最近使われない。<br>

- let
再代入（値を変えること）ができる。<br>

- const
再代入ができない。<br>

# データ型
- 数値(Number)
整数や少数を扱います。<br>

- 文字列(String)
テキストデータを扱います。<br>

- 真偽値(Boolean)
`true`または`false`の２つの値だけを持ちます。<br>

- オブジェクト(Object)
複数のデータをまとめて扱うためのもの。<br>

- 配列(Array)
順序付けられたデータの集まりです。<br>

- 未定義(Undefined)
値が設定されていないことを示す。<br>

- Null
意図的に空であることを示す。<br>

# 演算子

- 算術演算子

``` javascript
let a = 5;
let b = 2;
console.log(a + b); // 足し算: 7
console.log(a - b); // 引き算: 3
console.log(a * b); // 掛け算: 10
console.log(a / b); // 割り算: 2.5
console.log(a % b); // 剰余: 1（割った後の余り）
console.log(a ** b); // 累乗: 25（5の2乗）
```

- 比較演算子

``` javascript
let x = 10;
let y = 20;
console.log(x == y); // 等しいか: false
console.log(x === y); // 厳密に等しいか: false
console.log(x != y); // 等しくないか: true
console.log(x !== y); // 厳密に等しくないか: true
console.log(x < y); // より小さいか: true
console.log(x > y); // より大きいか: false
console.log(x <= y); // 以下か: true
console.log(x >= y); // 以上か: false
```

- 論理演算子

``` javascript
let isTrue = true;
let isFalse = false;
console.log(isTrue && isFalse); // AND: 両方がtrueの場合のみtrue。結果はfalse
console.log(isTrue || isFalse); // OR: どちらかがtrueならtrue。結果はtrue
console.log(!isTrue); // NOT: trueをfalseに、falseをtrueに反転。結果はfalse
```

# 制御構文

- if

``` javascript
let age = 18;
if (age >= 18) {
    console.log("You are an adult."); // ageが18以上なら、このコードが実行されます。
} else {
    console.log("You are a minor."); // ageが18未満なら、このコードが実行されます。
}
```

- switch

``` javascript
let color = "red";
switch (color) {
    case "red":
        console.log("Color is red."); // colorが"red"なら、このコードが実行されます。
        break;
    case "blue":
        console.log("Color is blue."); // colorが"blue"なら、このコードが実行されます。
        break;
    default:
        console.log("Color is not red or blue."); // どの条件にも当てはまらない場合、このコードが実行されます。
        break;
}
```

- for

``` javascript
for (let i = 0; i < 5; i++) {
    console.log(i); // 0から4までの数値を順に出力します。
}
```

- while

``` javascript
let count = 0;
while (count < 5) {
    console.log(count); // 0から4までの数値を順に出力します。
    count++; // countを1ずつ増やします。
}
```

# 感想
markdownトレーニングも兼ねて記事を書きました。
forループで変数の種類を宣言するのが特徴的だと感じました。
Chromeで簡単にJavaScriptで色々な実験ができるので面白そう。
エラー（未解決）GoogleMapsAPIの検索ボックスがMapの後ろに隠れてる

## はじめに
検索ボックスがMapの後ろに隠れておりz-indexの数値を調整すれば治るとの事だったが何度やってもうまくいかない。

```
<div id="map" style="height: 600px; position: relative;">
  <div id="map-" style="position: absolute; top: 10px; left: 50%; transform: translateX(-50%); background-color: white; padding: 10px; border-radius: 5px; border: 1px solid #ccc;">
    <input id="map-search-container" type="text" placeholder="場所を検索" style="width: 300px; padding: 5px; border: none; outline: none; z-index; 9999" />
  </div>
</div>

<script>
  function initMap() {
    const mapOptions = {
      center: { lat: 35.6803997, lng: 139.7690174 }, // 初期位置（例として東京）
      zoom: 10 
    };

    const map = new google.maps.Map(document.getElementById("map"), mapOptions);

    if (navigator.geolocation) {
      navigator.geolocation.getCurrentPosition(
        function (position) {
          const userLocation = {
            lat: position.coords.latitude,
            lng: position.coords.longitude,
          };

          map.setCenter(userLocation);

          new google.maps.Marker({
            position: userLocation,
            map: map,
            title: "あなたの今いる場所",
          });
        },
        function (error) {
          alert("現在地の取得に失敗しました: " + error.message);
        }
      );
    } else {
      alert("Geolocationはこのブラウザでサポートされていません");
    }

    const input = document.getElementById("search-box");
    const searchBox = new google.maps.places.SearchBox(input);
    searchBox.addListener("places_changed", function () {
      const places = searchBox.getPlaces();

      if (places.length === 0) {
        return;
      }

      const bounds = new google.maps.LatLngBounds();

      places.forEach(function (place) {
        if (!place.geometry || !place.geometry.location) {
          console.log("Returned place contains no geometry");
          return;
        }

        new google.maps.Marker({
          map: map,
          position: place.geometry.location,
          title: place.name,
        });

        if (place.geometry.viewport) {
          bounds.union(place.geometry.viewport);
        } else {
          bounds.extend(place.geometry.location);
        }
      });

      map.fitBounds(bounds);
    });
  }
</script>
```
##おわりに
最近エラー未解決ばかり載せてしまっている。
もっと備忘録でもいいので、ためになるのを載せたい。
AWS認定試験に合格する確率を上げる学習方法

## 概要
2024年Qiitaアドベントカレンダーの1回目の投稿になりますので、よろしくお願いします。
今年はAWS認定試験の勉強を頑張って結構合格できましたので、タイトルのような記事を書いて、皆さんに共有できてたらなぁと思っています。
AWS全冠ではないですが、Professionalレベルの試験を合格できた勉強方法になります。

## 受験歴
| 試験名 | 受験日 | 得点 | 結果 |
| ---- | ---- | ---- | ---- |
| Cloud Practitioner | 2023年7月17日 | 850点 | 合格 |
| Solutions Architect Associate | 2024年3月9日 | 777点 | 合格 |
| Developer Associate | 2024年4月13日 | 889点 | 合格 |
| SysOps Administrator Associate | 2024年5月19日 | 799点 | 合格 |
| Security Specialty | 2024年6月22日 | 844点 | 合格 |
| DevOps Engineer Professional | 2024年7月27日 | 818点 | 合格 |
| Solutions Architect Professional | 2024年9月1日 | 752点 | ギリ合格 |

こうして見ると全冠まであと少しですね〜頑張ってみようかな。

## 学習方法の解説
AWS SAPに合格するまで色々な学習を試してきました。試してきた中で必要だったことを共有します。
どの試験にも当てはまることですが、AWS試験のコツは、、、

記憶力です。

とりあえず、サービスの内容と組み合わせを覚えましょう。
ただ、全部をがむしゃらに覚えるのは大変なので、出題範囲を把握して覚えていきましょう。

### 試験問題サンプル
AWSが10問の試験問題サンプルのPDFを用意していますので、正答と誤答の理由を説明できるくらい覚えましょう。

これはサーバーワークスのミヤザワさんがYouTubeで試験問題サンプルの解き方をしっかりと解説していますので、内容を同じように話せるまで覚えます。

https://www.youtube.com/@ServerworksJp/playlists

公式の試験問題サンプルですので、同じような問題が本番でも出てきます。

### 無料の公式問題集
AWS Skill Builderにある20問の無料公式問題集です。とりあえず、こちらも正答と誤答の理由を説明できるくらい覚えましょう。
本番試験と同等のレベル感で、こちらも同じような問題が本番でも出題されます。
ですので、必ず覚えましょう。

### 公式模擬試験
こちらもAWS Skill Builderにある公式模擬試験で、問題数は本番試験と同様です。ただ、1ヶ月29ドルと有料になっていますが、「1ヶ月で合格する」気持ちで購入しておきましょう。合格できるメリットに比べれば、かなり格安です。
こちらも上記と同様に正答と誤答の理由を説明できるくらい覚えましょう。本番試験の出題傾向も同様です。

ここまで公式の問題の答えと詳細を100問近く覚えることができます〜合法的なカンニングですね:relaxed:

### Udemyの動画学習
UdemyのAWS学習教材の定番講師Stephane Maarek氏の動画を観て、試験範囲のサービスの概要を把握しましょう。
1講座20時間を超えますので、倍速で流し見をしましょう。
公式の模試を解いていくと、なんとなく試験範囲のサービスが分かってくるので、そこを重点的に観て、後はさっと内容を確認するくらいにとどめましょう。

https://www.udemy.com/user/stephane-maarek/

### Udemyの模擬試験
Cloud Study JP社をやっていましたが、現在は公開停止されていますね、、、何かやらかしたのかな？
本番試験よりレベルが高いのですが、問題の詳細な解説がついているので、なぜ正解か間違いかを確認できる良い模試でした。
他にも模試はたくさんありますが、大体、詳細な解説はなく、正解不正解の判断ができないので、オススメはできないですね。

### 書籍
書籍は試験範囲をざっくりと把握するくらいですので、動画派はUdemyのStephane Maarek氏の教材で良いかなと思います。書籍で勉強するか動画かは好みかと。
購入時はバージョンに気をつけて、複数冊も買わずに1冊だけ眺めるくらいで大丈夫です。

## 試験の取り組み方
### 心構え
採点除外問題が10~15問あり、合格点が700点〜750点ですので、割と間違えられます。試験中に分からない問題があっても固執したり落ち込まず、次の問題に進みましょう。
あと、採点除外問題は、なんとなく分かります。明らかかに難しかったり、AWSと関係なかったりしますので、できなかったらあきらめましょう。

### 解き方
テストのレベルが上がってくると、選択肢から正解を探すより、不正解を除外して正解を見つける問題が多くなってきます。ですので、問題をよく読んで選択肢を絞っていきましょう。

## 最後に
AWS試験の学習方法を書いてみましたが、あまり記事としてまとまりがなく、つらつらと文章を書いたようになりした、、、こういう記事は難しいですね。
とりあえず、AWS試験は「記憶力」で覚えたもの勝ちです。ひたすら試験範囲のAWSサービスを覚えていってください（脳筋思考）:grinning:
でも、エンジニア的には調べれば分かることを記憶するって生産的ではないんですよね〜なので、やはりエンジニアの基礎力を伸ばせる時間を試験勉強に注ぎ込むのは、諸刃の刃で、メリットとデメリットを考えて取り組んでください。
私の場合は、AWS試験合格の錯覚資産と報奨金というメリットが大きいと判断したので、頑張れた感はありまりた。その分、エンジニアとしての勉強時間は削っていましたね〜

その辺りも考えて、ぜひAWS試験を受ける方は頑張ってください:thumbsup_tone1:
Storyboardを少しずつSwiftUIに置き換えていく

# はじめに

昨今SwiftUIブームがきており、**StoryboardをSwiftUIに置き換える** という動きが多いです。
また、SwiftUIの学習に伴って個人開発のアプリに部分的にSwiftUIを取り入れていく、という人も多いのではないでしょうか。

そこで、**見た目をSwiftUIで、処理をUIKitで** 記述する方法を考えます。

# SwiftUIの画面を作ろう

今回は押されたら小さくなるボタンを作ります。SwiftUIでの作り方はこのようになります。

```swift:CameraButton
struct CameraButton: View {
    var onButtonPressed: () -> Void

    @State private var pressing = false

    var body: some View {
        Circle()
            .fill(Color.white)
            .frame(width: pressing ? 60 : 80, height: pressing ? 60 : 80)
            .shadow(radius: 10)
            .onLongPressGesture(minimumDuration: 0, pressing: { pressing in
                self.pressing = pressing
                if !pressing {
                    onButtonPressed()
                }
            }, perform: {})
    }
}
```

![Simulator Screenshot - iPhone 16 Pro - 2024-12-21 at 23.05.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/1bc80cd0-dca9-14b0-a070-03502906b599.png)

ここで`onButtonPressed`は、ボタンが押された時の処理をUIKit側で記述するためのパーツです。

このように処理だけを引き渡すことで、Storyboard側のアーキテクチャを大きく変えることなくSwiftUIに移行していけます。

# HostingControllerを使おう

次はUIKit側の画面を作ります。

```swift:ViewController
import UIKit
import SwiftUI

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let cameraButton = CameraButton(onButtonPressed: {
            self.cameraButtonTapped()
        })
        
        let hostingController = UIHostingController(rootView: cameraButton)
        addChild(hostingController)
        hostingController.view.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(hostingController.view)
        hostingController.didMove(toParent: self)
        
        NSLayoutConstraint.activate([
            hostingController.view.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            hostingController.view.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            hostingController.view.widthAnchor.constraint(equalToConstant: 100),
            hostingController.view.heightAnchor.constraint(equalToConstant: 100)
        ])
    }
    
    private func cameraButtonTapped() {
        print("Camera button tapped")
    }
}
```

この`cameraButtonTapped`に押された時の処理を記入することで、処理を呼び出すことができます！

# おまけ
SwiftUIの強みの一つはアニメーションの充実なので、以下のようにアニメーションをつけてもいいでしょう。

```swift:CameraButton
struct CameraButton: View {
    var onButtonPressed: () -> Void

    @State private var pressing = false

    var body: some View {
        Circle()
            .fill(Color.white)
            .frame(width: pressing ? 60 : 80, height: pressing ? 60 : 80)
            .shadow(radius: 10)
            .scaleEffect(pressing ? 0.9 : 1.0)
            .animation(.spring(), value: pressing)
            .onLongPressGesture(minimumDuration: 0, pressing: { pressing in
                self.pressing = pressing
                if !pressing {
                    onButtonPressed()
                }
            }, perform: {})
    }
}
```

# まとめ
SwiftUIとStoryboardの長所を両方組み合わせて良い開発をしていきましょう！
【CSS】marginを計算せずに幅を親要素いっぱいにする方法

## `width: stretch;`を使用する

`width: stretch;`を使用すると`width: calc(100% - <margin>;`の場合と同様にはみ出さなくなります。

```html
<div class="container">
  <div class="box1">width: stretch;</div>
  <div class="box2">width: 100%;</div>
  <div class="box3">width: calc(100% - 60px);</div>
</div>

```

```css
.container {
  border: 1px solid;
  width: 65%;
  background-color: lightgray;
  text-align: center;
}

.box1 {
  width: -webkit-fill-available;
  width: -moz-available;
  width: stretch;
  background-color: coral;
  margin: 30px;
}

.box2 {
  width: 100%;
  background-color: coral;
  margin: 30px;
}

.box3 {
  width: calc(100% - 60px);
  background-color: coral;
  margin: 30px;
}

```

![スクリーンショット 2024-11-22 23.12.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/efb842de-2472-231f-5846-4355b048d05b.png)

## `width: stretch;`の対応状況

https://caniuse.com/mdn-css_properties_width_stretch
40歳からエンジニアと呼ばれるようになった男が「いっちょやったるか」と思うようになるまで

## プロフィール
- 福井県出身、40歳
- 福祉系の事業をしている企業で「エンジニア」という肩書きでコーダーや所属部署の本業のサポートをしている名ばかりエンジニア
- 数学始め理系科目が苦手なド文系
- 今までろくに勉強せずに試験も通ってきたので、そもそも勉強の仕方を知らない
- HTML/CSSは前職で経験があったのでできる
- Javaも構文くらいならわかる。一応Java SE Bronzeは取った

## 今までとこれから
### エンジニアと呼ばれるまで
- 大学中退後、非正規雇用を転々とする
- 30代に入り、このままではいけないと船員の道へ（正社員の身分が保障されており、給料も良かったため）
- 3年後病気で一旦リタイア、5年間の療養生活へ（今まで貯めた貯金もこのとき消えた）
- 船員へ復帰するも、ブランクもあり心身がついていかず断念する
- 気付けば40代に
- 前職は「こいつPC得意だから」という理由で色々無茶振りされ、HTML/CSSを独学で習得できるまでになった。ITの道ならこの先もやっていけるのでは？と考えてJavaを独学で勉強し、現在の会社に就職する

### エンジニアと呼ばれてから
- あれ？プログラミングだけやってもアプリとか作れなくない？とこのときようやく気付く
- そもそも一からコードが書けない、ググったのを写経して継ぎ接ぎするだけ
- 自分の能力を棚に上げて、開発の機会が少ない環境に不満を持ち、他社のヘッドハンティングを受けるもレベルが高すぎてインターンで挫折
- 現状は自分にも会社にも良くないのでは？今の会社は自分にコーダー以上のものを期待し始めている
- 自分にはエンジニアとしての基礎体力が足りない！このままでは一生「名ばかりエンジニア」だ！となったところにQiitaでJISOUの記事を見かける
- 年齢的にもラストチャンス、失敗を繰り返しながらも本気で勉強するには今しかない！との思いでJISOUの門を叩く

## 目標
- 短期（3ヶ月）
	- TypeScriptやReactの基礎を身に付ける
- 中期（6ヶ月）
	- エンジニアとしての思考・勉強法・アウトプットの基礎を習得する
- 長期（1年）
	- 1からアプリの開発ができるようになる、できれば収益化できるもの

# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてくださ！
▼▼▼

https://projisou.jp
【背景透過】remove.bgを使う

こんにちは、りょうです。
今回は背景透過サイトのremove.bgを使ってみます

## remove.bg
画像の背景透過をするサイトです。速いし精度もいいし重宝してます。
APIもあるのがありがたいですね〜

https://remove.bg

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/20ceb141-3c09-cdb1-dd74-16f523f52937.png)

## 使用方法
画像をアップロードボタンを押して背景を透過したい画像を選択します

![Screenshot 2024-11-22 22.49.43.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/2e84b88f-1648-d9ea-d2c8-b8938f96ac80.jpeg)

アップロードが完了したら自動で背景が透過されます！
完了後にダウンロードボタンを押して保存してください

:::note warn
対応している画像の形式は **JPG, JPEG, PNG** です。
**WebP**は対応していなくてエラーがでます
:::

### 手動で修正もできる！
**削除/復元**の部分を押したら自分で自由に透過、復元が可能です

![名称未設定のデザイン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/7966204b-3cfb-24f9-9c39-ebcbee59295e.png)

## APIキーの取得、使い方
[ここ](https://www.remove.bg/api)にアクセスしてAPIキーを取得します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/023b46b2-393b-73a5-c8c8-9657f26c70e3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/7391d368-905f-62f6-0b7f-0700e5a20f25.png)

次に[ここ](https://www.remove.bg/api#sample-code)の**Sample code**の部分に各言語用のサンプルがあるので、自分が使っている言語に合わせて使うようにしてください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/7e1952f1-c3ad-2fcb-a514-cdbdeaffc0e8.png)


## まとめ
今回は背景を簡単に透過できるremove.bgの使い方でした
便利すぎてしょっちゅう使ってます笑

わからないことあったら書いてくれれば答えていきます。

**Discordにいる荒らしの情報や対策方法の共有をしている自鯖です**
ぜひ参加お願いします↓↓↓↓

https://discord.com/invite/ESRGwGQhxc
tensorflow v1.0をインストールする

# tensorflow 1.0をインストールする

この記事は、tensorflow 1.0をインストールしたいときに、見て頂ければ幸いです。

1.pythonのversion変更。
2.仮想環境の作成
3.tensorflow v1.0のインストール
上の順番で行います。なるべく説明は少なく私の用いたコードを乗っけます。

# pythonのversion変更。
私はpython 3.5をinstallしました。(pyenvはインストールされている前提とします。）installされていない場合は参考文献の記事を参考に。

```
pyenv install -l
```
```
(省略)
 3.2.2
  3.2.3
  3.2.4
  3.2.5
  3.2.6
  3.3.0
  3.3.1
  3.3.2
  3.3.3
  3.3.4
  3.3.5
  3.3.6
  3.3.7
  3.4.0
  3.4-dev
  3.4.1
  3.4.2
  3.4.3
  3.4.4
  3.4.5
  3.4.6
  3.4.7
  3.4.8
  3.4.9
  3.4.10
  3.5.0
  3.5-dev
  3.5.1
  3.5.2
  3.5.3
  3.5.4
  3.5.5
  （省略）
```
上のようになります。今回はpython 3.5なので
```
pyenv install 3.5.10
```
```
pyenv versions 
```
下のような実行結果になっていることを確認してください。
```
  system
  3.5.10
```
その後、virtualenvを作成します。ここで、tensorflow1.0は任意の名前にしてください。これでは少し長いと思います。
```
pyenv virtualenv 3.5.10 tensorflow1.0
```
ここで
```
pyenv versions
```
以下の実行結果になるか確認してください。
```
system
3.5.10
3.5.10/envs/tensorflowv1 
```
環境を切り替えます。
ここでtensorflowv1は任意の名前にしてください。（先ほど決めた仮想環境の名前）
```
pyenv local 3.5.10/envs/tensorflowv1
```
そのようにするとそのディレクトリの時だけ、今作成した仮想環境になります。


## tensorflowのインストール
tensorflowv1.0をインストールするために
1.numpy
2.six
3.wheel
4.protoub
をインストールします。私の環境では、SSLのエラーがあるため、証明書なしでのインストールで行いました。

### numpy
```
pip install numpy==1.11.0 --trusted-host pypi.org --trusted-host files.pythonhosted.org --trusted-host pypi.python.org

```

### six
```
pip install six --trusted-host pypi.org --trusted-host files.pythonhosted.org --trusted-host pypi.python.org

```

### wheel
```
pip install wheel --trusted-host pypi.org --trusted-host files.pythonhosted.org --trusted-host pypi.python.org

```

### protobu
```
 pip install protobuf==3.1.0 --trusted-host pypi.org
 --trusted-host files.pythonhosted.org --trusted-host pypi.python.org --disable-pip-version-check
```

上の４つがインストールできたら、tensorflowをインストールします。
### tensorflow
```
pip install tensorflow-1.0.0-cp35-cp35m-linux_x86_64.whl
```
その後、pip listで確認してみてください。
```
pip list
```
以下のようになっていれば成功です。
```
tensorflow (1.0.0)
```



--------------------------------------------------------------------------------------------------------------------------
# 番外編
参考までに必要そうなmoduleをダウングレードでインストールするコマンドも記載しておきます。
## scipy
```
pip install scipy==0.17.0 --trusted-host pypi.org --trusted-host files.pythonhosted.org --trusted-host pypi.python.org
```

## pollow
```
pip install pillow==3.3.0 --trusted-host pypi.org --trusted-host files.pythonhosted.org --trusted-host pypi.python.org
```

# 参考文献
https://qiita.com/ysdyt/items/5008e607343b940b3480
【備忘録】astroとPartytownを使用してgoogle tag managerを設定する

## astroとは
軽量なフロントエンドフレームワークです。
本記事ではすでにインストール済みという前提で記載します。

https://astro.build/

## Partytownとは
リソースを大量に消費するスクリプトをメインスレッドからwebワーカーに移すことで、メインスレッドの処理を高速化させる目的のライブラリです。

今回の用途はgoogle tag managerに関する処理をメインスレッドから移行させることで、ページ全体の処理速度及び、SEOスコアの向上を目的として使用します。

## webワーカーとは
ウェブアプリケーションにおける処理をメインスレッドから別のスレッドに移すことで、バックグランド処理を実行し、ページのレンダリングなどのメインスレッドの実行完了を早くすることができます。

参考資料：MDN

https://developer.mozilla.org/ja/docs/Web/API/Web_Workers_API

## Party townのインストール方法
npm,pnpm,yarnなどさまざまなインストール方がありますが、今回はnpmで入れます
```terminal
npm install @astrojs/partytown
```

## astroでのPartytown設定方法
astro.config.*に公式ドキュメント通りに記載します。

```typescript
import { defineConfig } from 'astro/config';
import partytown from '@astrojs/partytown';

export default defineConfig({
  // ...
  integrations: [partytown()],
});
```

## Partytown(webワーカー)の注意点：特定のObjectは使用できない
webワーカーは前述したようにメインスレッドとは別のバックグランドのスレッドで処理を実行します。
そのため、windowといった一部のobjectが使用できません。
google tag managerをparty townで利用するには上記に気をつけなければなりませんでした。

## Partytownでのgoogle tag managerの設定方法
設定箇所は二箇所あります。

### astro.config.*での設定
```typescript
import { defineConfig } from 'astro/config';
import partytown from '@astrojs/partytown';

export default defineConfig({
  // ...
  integrations: [
      partytown({
      config: {
        forward: [["dataLayer.push"],"gtm.push"],
      },
    }),
  ],
});
```

### フロント部分に記述する内容
今回はlayout.astroに以下を記述します。
```typescript:layout.astro
<head>
    // ・・・・・
    <script type="text/partytown">
      (function (w, d, s, l, i) {
        w[l] = w[l] || [];
        w[l].push({ "gtm.start": new Date().getTime(), event: "gtm.js" });
        var f = d.getElementsByTagName(s)[0],
          j = d.createElement(s),
          dl = l != "dataLayer" ? "&l=" + l : "";
        j.async = true;
        j.src = "https://www.googletagmanager.com/gtm.js?id=" + i + dl;
        f.parentNode.insertBefore(j, f);
      })(window, document, "script", "dataLayer", "GTMのID");
    </script>
    // ・・・・・
</head>
<body>
    <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=********" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
    // ・・・・・
</body>
```
上記で設定は完了です！

あとはgoogle chromeのプラグイン(Tag Assistant、DataLayer Checker)やgoogle analytics、検証モードなどを使用してデータが送信されているか確認してみてください。


## 参考：webワーカーで使用できないObject
1. windowオブジェクト
1. documentオブジェクト
1. parentオブジェクト
※生成AIに聞いたため、もっと調べる必要あるかと思いますが、それはまた別の機会に


## 参考URL

https://partytown.builder.io/

https://partytown.builder.io/forwarding-events

https://docs.astro.build/ja/guides/integrations-guide/partytown/

https://partytown.builder.io/google-tag-manager#forward-events
Javaにおけるインタフェースと抽象クラスの違いと使い分け

# 導入

こんにちは、もんすんです。

皆さんは、インターフェースと抽象クラスをうまく使い分けできていますか？

Javaでは、インタフェースと抽象クラスの2つの仕組みを使って、複数の型(クラス)の共通の振る舞いを定義することができます。

今回は、これらの違いや使いどころを初学者にもわかりやすく解説していこうと思います。


# インタフェースと抽象クラスの基本的な違い

まず、インターフェースと抽象クラスの概要について解説します。

## インタフェース

- 実装するクラスに共通する「仕様」を定義します
- クラスは複数のインタフェースを実装できます
    - 多重実装が可能と言ったりします
- デフォルトメソッドを使うことで、メソッドの具体的な実装も提供できます(Java8以降)

## 抽象クラス

- クラスに共通の「基本的な実装」を提供します
- こちらはクラスのため、継承になりますが、継承するクラスが継承できるのは1つのクラスに限定されます
    - 多重継承不可と言ったりします
- フィールド（変数）やコンストラクタを定義できます

## それぞれが適する場面

### インタフェースが適している場面

#### 多重継承が必要な場合

Javaではクラスの多重継承はできませんが、インタフェースなら複数の型を実装できます。例えば、次のように「開発者」と「デザイナー」のような複数の属性を持つクラスを定義できます。

```java
public interface Developer {
    void develop();
}

public interface Designer {
    void design();
}

public interface DevDesigner extends Developer, Designer {
    void create();
}
```

#### 既存のクラスを拡張せずに新しい振る舞いを追加する場合

既存のクラスにインタフェースを実装させるのは簡単です。
たった以下の2つのステップのみで済みます。

- 必要なメソッドの追加
- implementsキーワードの追加

これだけで新しい仕様を持つクラスにできます。

一方、抽象クラスを新たに追加する場合、**既存のクラスの継承階層を変更**する必要があり、難易度が上がります。

#### ミックスインの実現

インタフェースは「ミックスイン」の定義に最適です。ミックスインとは、クラスが主な役割に該当する本来の型に加えて、**別の振る舞いを提供**できる仕組みです。

たとえば、`Comparable`インタフェースは、オブジェクトの比較方法を定義するミックスインの一例です。

### 抽象クラスが適している場面

#### 部分的な実装を共有したい場合

抽象クラスは、メソッドやフィールドを共有できます。
たとえば、動物クラスを継承する猫や犬のクラスに共通する振る舞いを定義できます。

```java
public abstract class Animal {
    protected String name;

    public Animal(String name) {
        this.name = name;
    }
    
    // 抽象メソッド
    public abstract void makeSound(); 

    public void eat() {
        System.out.println(name + " eats anything.");
    }
}
```

#### デフォルトメソッドでは不十分な場合

インタフェースには、デフォルトメソッドという機能があります。
これによりインターフェースに共通メソッドを定義することができます。

しかし、デフォルトメソッドでは、`equals`や`hashCode`など、Objectクラスのメソッドをオーバーライドすることはできません。
一方、抽象クラスであれば、これらを**オーバーライドして共通化**できます。

# インタフェースと抽象クラスを組み合わせる方法

## 骨格実装クラス（Skeletal Implementation）

Javaのコレクションフレームワークのように、インタフェースと抽象クラスを組み合わせる設計も可能です。

具体例として、`AbstractList`はListインタフェースの骨格実装を提供し、開発者は最低限のコードでカスタムリストクラスを作成できます。

以下は、簡単な骨格実装の例です。

```java
import java.util.AbstractList;

public class IntArrayAsList extends AbstractList<Integer> {
    private final int[] array;

    public IntArrayAsList(int[] array) {
        this.array = array;
    }

    @Override
    public Integer get(int index) {
        return array[index];
    }

    @Override
    public int size() {
        return array.length;
    }
}
```

このように骨格実装はインタフェースの基本メソッドを提供し、開発者が細かい実装に集中できる環境を整えます。


# まとめ: インタフェースと抽象クラスの選び方

共通の仕様だけを提供したい場合: インタフェース
共通の実装も提供したい場合: 抽象クラス
既存のクラスを柔軟に拡張したい場合: インタフェース
一部のメソッドだけを具体的に実装したい場合: 骨格実装

# 最後に

今回はインターフェースと抽象クラスについて簡単に解説しました。

インタフェースと抽象クラスは、状況によって使い分けることで、コードの再利用性や保守性を高めることができます。それぞれの特徴を活かして、効率的な開発を目指しましょう！
CSSで使える単位と使い分け     

# はじめに
学んだことを忘れないように備忘録として残しています。

間違っている箇所がありましたら、是非ご指摘いただきたいです。
よろしくお願いいたします。

今回はpx, %, vh, vw, em などの単位の意味と使いどころを解説していきます。

## 絶対的な単位と相対的な単位
今回ご紹介する単位は大きく２種類に分類できます。

### 絶対的な単位（px)
名前の通り、絶対的に値を指定する


### 相対的な単位(%, vh, vw, em, rem)
**他の要素との比較**によって数値が決まる（変動する）


## 単位一覧と使いどころ
### 1. px（ピクセル）
画面上の1ピクセル単位。絶対値。
pxの多用はNG。相対的な単位が使えないかを考える。

多用しすぎている例）
```css
.box_wrapper {
    width: 1000px;
}

.box {
    width: 500px;
}

.box02 {
    width: 500px;
}
```


- 使いどころ
ボタンやアイコンなど、**サイズが固定された方がよい部分。**
例: アイコンの幅や高さ 

### 2. %（パーセント）
**親要素のサイズに対する割合で指定する単位。**

- 使いどころ
レイアウトや余白の指定に便利。
例: コンテンツ幅を画面全体の80%にする場合 width: 80%;

### 3. vw / vh （ビューポートウィズ、ビューポートハイト）
**Webブラウザの画面サイズを基準にした相対的な大きさの単位。**
画面のサイズを100と考える。
（100vhは、画面の高さ全体を指します。）


- 使いどころ
キービジュアルの全画面背景の高さ調整。
例: height: 100vh;


### 4. em（エム）
**親要素のフォントサイズを基準にした相対単位。**
例: 親要素が font-size: 16px; の場合、1em = 16px。

- 使いどころ
1.文字サイズや余白を親要素基準で調整するとき
例: ボタン内の文字サイズ font-size: 1.2em;

  2.文字の間隔を決めるとき（letter-spacing）
font-sizeと一緒に使われることが多い。


```css
.box {
font-size: 16px;
letter-spacing: 0.1em;
 }
```



### 5. rem(レム）
htmlタグに指定されたフォントサイズを基準とした相対的な単位
例: 通常ブラウザの初期値は16pxのため、1rem=16px。

- 使いどころ

一貫したデザインに便利。グローバルなフォントサイズや余白に適用。
例: ベースフォントサイズ font-size: 1rem;

## まとめ
今回の記事では、Web制作における主要な単位の特徴や使いどころについて解説しました。
異なるパケット・サイズの取り扱い

# パケットの制限がある
>各ネットワークやリンクはパケットの最大長の制限を設けている。

# ホスト側は大きなパケットを送りたいが問題が生じる
>ホスト側は大きなパケットでデータを送信する方が好ましい。そうすることでヘッダーによる帯域の消費といったオーバーヘッドを軽減できるためである。長いパケットがそれより最大パケット長の短いネットワークを通過しようとすると、明らかに問題が生じる

# 最適なパケットの大きさ（経路MTU)にする
>パケットがネットワーク上をどのような経路で宛先へ向かうのかを送信元が知っているとは限らないため、宛先へ辿り着くためにどの程度パケットを小さくすれば良いのかはわからない。このパケット・サイズは経路MTUと呼ばれる。
### 経路MTUがわかっていても経路が変化し経路MTUも変わってしまう
>例え送信元が経路MTUを知っていたとしても、インターネットのようなコネクションレス型ネットワークではそれぞれのパケットが独立にルーティングされるため、経路が突然変化し、経路MTUが不意に変わってしまう可能性がある。

# パケットをフラグメントに分ける
>ルーターがフラグメントとよばれる断片に分割し、各フレグメントを別々にインターネット・パケットとして送信する方法がある。

### フラグメントの欠点
>パケット交換型ネットワークもまたフラグメントをもとに戻すという厄介な問題を解決する必要がある。

# 透過なパケットにしてフラグメントにしたことをなかったことにする
>小さなパケットしか通さないネットワークでのパケット転送は他に影響を与えない透過なものになる。以降のネットワークは分割が行われたことにまったく気がつかない。

### 透過の欠点
>出口のゲートウェイがいつすべてのフラグメントが届いたかを知る必要があることである。そのために、各パケットにはカウンタ・フィールドかあるいは、「パケットの終わり」と表すビットが含まれなければならない。

>最終的な宛先は向かう過程で、あるパケットが一つの経路を通ったとすると、他のフラグメントを別の経路で転送することはできないため、性能があると程度低下してしまう可能性がある。

>ルーターはフラグメントが到着するごとにバッファに格納し、到着しなかったフラグメントがあれば、いつそれらを捨てるのかを決定する必要がある。また小さなパケットしか通れないネットワークをいくつも通過する場合には、その度にフラグメント化とくみたてが繰り返されるため、無駄が多い。

# 宛先まで組み立てを行わない方法
>一旦パケットが分割されたら、各フラグメントはそれぞれ独立したパケットのように扱われる。ルーターはフラグメントを図5−40（b）のように渡していき、組み立ては宛先ホストでのみ行われる。

### 利点
>ルーターに要求される作業量が少ないことである。IPはこの方法で動作する。

>宛先のバッファにおいて、組み立てを行う際の正しい位置にそれぞれのフラグメントを配置することができる。

>パケット番号、正しい位置にデータを配置するためのフラグメント・オフセット、いつ完全なパケットとなるかを決定するための終端パケット・フラグを利用して、パケットの組み立てを行う。

### 欠点
>オーバーヘッドは透過なフラグメント化の場合よりも大きくなる。しかし真の問題は、そもそもフラグメントが存在することにある。

>一部のフラグメントが失われただけでもパケット全体がロスすることになる。また、フラグメント化によって、ホストへの負担は送信前の想定よりも大きくなってしまう

# 大き過ぎたら返されそれを繰り返してる経路MTU探索
>各IPパケットは、ヘッダーに特定のビット列をセットしてパケットを送信することで、フラグメント化を禁止されていることを表す。ルーターが大きすぎるパケットを受信した場合には、誤りパケットを生成して送信元へ返送し、受信したパケットを捨てる。この様子を5-42に示す。送信元が誤りパケットを受信するとその中に含まれる情報をもとに、誤りを返したルーターが扱えるサイズまでパケットを再分割してから送信する。もし下流のルーターがさらに小さなMTUを持っている場合には、このプロセスが繰り返される。

### 利点
>送信元で、送信すべきパケットの長さがわかることである。

>より上位の層が経路MTUを把握し、正しい量のデータをIPへ渡さない限りは、送信元と宛先の間でフラグメント化が必要となる。TCPとIPは通常TCP／IPとして実装され、こうした情報をやり取りできるようになっている。仮に他のプロトコルで同様のことが行われないとしても、フラグメントかはネットワーク上からホストに移される。

### 欠点
>送信までに多くの遅延時間がかかることである。

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/
SSL/TSL通信を理解を深めるための技術書3選

SSL/TLS通信の理解を深めるための技術書籍を以下にご紹介します。

[**マスタリングTCP/IP SSL/TLS編**](https://amzn.to/3Zj0yG6 "‌")
著者: [Eric Rescorla](https://www.amazon.co.jp/Eric-Rescorla/e/B001KD9HP0/ref=dp_byline_cont_book_1 "‌")
概要: 暗号化と認証機能を備えた通信プロトコル「SSL（Secure　Sockets　Layer）」と，そのIETFでの標準化版である「TLS（Transport　Layer　Security）」について解説しています。

![image.png](https://m.media-amazon.com/images/I/41lZVuuXGrL.jpg)

[**SSL/TLS実践入門 ──Webの安全性を支える暗号化技術の設計思想**](https://amzn.to/3YZWSHW "‌")
著者: 市原創、板倉広明
概要: 最新バージョンであるTLS 1.3の仕組みとその使い方を解説し、暗号化技術の理論と実践をつなぐ内容となっています。

‌

![SSL/TLS実践入門 ──Webの安全性を支える暗号化技術の設計思想：書籍案内｜技術評論社](https://tse1.mm.bing.net/th?id=OIP.-Pd5T6-qjixWDYANb64iKAHaKg&w=200&h=284&c=7)

[**SSL/TLS徹底入門: わかりやすい図解解説 インターネット技術**](https://amzn.to/4g1OWN5 "‌")
著者: 松田達也
概要: SSL/TLSの基本的な概念を図解を用いてわかりやすく解説し、初学者でも無理なく読み進められる内容です。

‌

![SSL/TLS徹底入門: わかりやすい図解解説 インターネット技術 | 松田達也 | 工学 | Kindleストア | Amazon](https://tse4.mm.bing.net/th?id=OIP.scamyQZkwyOik1E9JZ9AYAHaL1&w=200&h=319&c=7)

これらの書籍は、SSL/TLSの基礎から応用まで幅広くカバーしており、理解を深めるのに役立つでしょう。
SSL/TLS通信と証明書の関係

SSL（Secure Sockets Layer）およびその後継である TLS（Transport Layer Security）は、HTTPを暗号化してHTTPS通信を可能にするプロトコルです。この仕組みは、ウェブサイトとクライアント（例えばブラウザ）の間の通信を安全にするために使用されます。以下に、SSL/TLS通信の仕組みと証明書の関係を詳しく説明します。

---

## **1. SSL/TLS通信の主な目的**

1. **暗号化**:
   - 通信内容を第三者に盗聴されないように暗号化します。
2. **認証**:
   - サーバー（場合によってはクライアント）の正当性を証明します。
3. **データの完全性**:
   - 通信中にデータが改ざんされていないことを保証します。

---

## **2. SSL/TLS通信の仕組み**

SSL/TLS通信は、以下の手順で行われます。

### **(1) ハンドシェイク (Handshake)**

ハンドシェイクは、通信を始めるための準備段階で、以下のステップを含みます。

1. **クライアントからのリクエスト**:
   - クライアント（例: ブラウザ）がサーバーに接続を要求し、対応可能なSSL/TLSのバージョンや暗号スイートを送信します。
2. **サーバー証明書の送信**:
   - サーバーは自分の公開鍵と一緒にSSL/TLS証明書をクライアントに送ります。
   - この証明書には、ドメイン名、発行者（CA: Certificate Authority）、有効期限、公開鍵などが含まれます。
3. **証明書の検証**:
   - クライアントは、証明書が信頼できる認証局（CA）によって署名されているかを確認します。
   - 証明書の内容（例: ドメイン名や有効期限）が正しいかを検証します。
4. **セッション鍵の生成**:
   - クライアントは、セッションで使用する共通鍵（対称鍵）を生成します。
   - この鍵をサーバーの公開鍵で暗号化し、サーバーに送信します。
5. **サーバーによる鍵の復号**:
   - サーバーは自分の秘密鍵を使って共通鍵を復号します。
6. **セッションの開始**:
   - 共通鍵を使った暗号化通信が開始されます（対称暗号方式を使用）。

---

### **(2) 本通信（データ転送）**

- ハンドシェイク後、クライアントとサーバーは共通鍵を使用して通信を行います。
- 対称暗号方式により、通信が高速かつ安全に行われます。
- データが改ざんされていないことを確認するためにメッセージ認証コード（MAC）が使用されます。

---

## **3. SSL/TLS証明書の役割**

SSL/TLS通信において証明書は、サーバーの正当性を証明し、安全な通信を確立するために重要な役割を果たします。

1. **認証**:
   - 証明書に記載された情報（例: ドメイン名や組織名）を通じて、サーバーが信頼できる存在であることを保証します。
2. **公開鍵の提供**:
   - 証明書にはサーバーの公開鍵が含まれており、この鍵を使ってクライアントはデータを暗号化します。
3. **信頼のチェーン（Certificate Chain）**:
   - SSL/TLS証明書は、信頼された認証局（CA）によって署名されています。
   - クライアントは、証明書が信頼できるかどうかを検証するために、この署名のチェーン（ルート証明書→中間証明書→サーバー証明書）を確認します。

---

## **4. HTTPS通信の動作例**

1. **ブラウザが「**[https://example.com](https://example.com "smartCard-inline") **」にアクセス**:
   - HTTPS通信を開始します。
2. **サーバーから証明書を受け取る**:
   - サーバーは自分のSSL/TLS証明書を送信。
3. **証明書を検証**:
   - ブラウザは、証明書が信頼できるCAによって発行されたかを検証。
   - 問題がない場合、通信が続行されます。
4. **データの暗号化と転送**:
   - ハンドシェイク後、暗号化されたデータ通信が行われます。

---

## **5. 証明書の種類**

- **ドメイン認証（DV: Domain Validation）**:
  - ドメインの所有権のみを確認。
  - 個人ブログや小規模サイトに適している。
- **組織認証（OV: Organization Validation）**:
  - ドメイン所有者の組織情報を確認。
  - 企業向け。
- **拡張認証（EV: Extended Validation）**:
  - 詳細な組織審査が行われる。
  - 銀行や大企業向け。

---

SSL/TLS証明書は、HTTPS通信を可能にする基盤であり、安全なインターネットの普及に不可欠な技術です。
let's encrypt の特徴と仕組み

Let's Encrypt は、無料で利用できるオープンな認証局（CA: Certificate Authority）で、ウェブサイトに SSL/TLS 証明書を提供し、安全な通信を可能にするサービスです。以下にその特徴と仕組みを詳しく説明します。

---

## **特徴**

1. **無料で利用可能**
   - サービス利用に料金が発生しないため、小規模なウェブサイトや非営利団体にとって特に魅力的です。
2. **自動化**
   - サーバー管理者は証明書の取得、インストール、更新を自動化できるため、手動の作業負担が大幅に軽減されます。
   - 自動化には「Certbot」などのクライアントツールを使用します。
3. **オープンなプラットフォーム**
   - Let’s Encrypt は、非営利団体「Internet Security Research Group (ISRG)」によって運営されており、オープンスタンダードを重視しています。
4. **セキュリティの向上**
   - HTTPS を普及させることでインターネット全体のセキュリティ向上を目的としています。
5. **短期間の証明書（90日）**
   - 証明書の有効期限が90日と短いため、セキュリティリスクが軽減されます（短期間で証明書を更新する仕組みが推奨されています）。

---

## **仕組み**

Let’s Encrypt の仕組みは ACME（Automatic Certificate Management Environment）プロトコルに基づいて動作しています。以下は主な手順です。

1. **ドメイン所有権の確認**
   - サーバー管理者はドメイン名の所有権を証明する必要があります。
   - 所有権確認には次の方法が使われます：
     - **HTTP-01 チャレンジ**: ドメインに特定のファイルを配置し、Let's Encrypt がそれを確認。
     - **DNS-01 チャレンジ**: DNS レコードに特定の値を追加し、確認を行う。
     - **TLS-ALPN-01 チャレンジ**: 特定の TLS 接続で応答することで証明。
2. **証明書の発行**
   - ドメイン所有権が確認されると、Let's Encrypt はウェブサーバー用の SSL/TLS 証明書を発行します。
3. **証明書のインストールと更新**
   - 証明書を取得した後、サーバーにインストールします。
   - 証明書は90日間有効で、自動更新プロセス（通常は Certbot による）を設定して定期的に更新します。
4. **鍵ペアの生成**
   - サーバーは公開鍵と秘密鍵を生成し、Let's Encrypt から公開鍵を使った証明書が提供されます。
   - 秘密鍵はサーバーが管理し、セキュリティを確保します。

---

## **主な利点**

- **簡単導入**: 初心者でも比較的簡単に設定可能。
- **安全性**: 無料でセキュアな通信を提供。
- **普及性**: 主要ブラウザやデバイスで広く信頼されている。

---

Let’s Encrypt の普及によって、以前は一部のウェブサイトに限られていた HTTPS が標準化しつつあります。その結果、ユーザーがより安全にウェブを利用できるようになっています。
Githubの「rulesets」の特徴を使用例

GitHubの「rulesets」（ルールセット）は、リポジトリや組織全体のセキュリティと開発プロセスの管理を簡素化するための機能です。この機能を利用することで、さまざまなアクションやアクセス権に対する条件やポリシーを設定できます。

以下では、rulesetsの特徴と使用例を解説します。

---

## **特徴**

1. **ポリシー管理の一元化**
   - ルールセットを1つ作成すると、それを複数のリポジトリやブランチに適用できる。
   - 組織全体で一貫性のあるセキュリティとワークフロー管理を実現。
2. **柔軟な条件設定**
   - ブランチやタグのパターンに基づいて特定の条件を設定可能。
   - 例: `main`ブランチには厳しいルールを適用、他のブランチには適用しない。
3. **さまざまなイベントに対応可能**
   - プルリクエスト、マージ、コードプッシュなど、特定のアクションに対する制限や承認ルールを設定可能。
4. **インターフェースとAPIサポート**
   - Web UIを使った簡単な設定とGitHub APIを使った自動化が可能。
5. **組み合わせ可能なチェック**
   - コードオーナーの承認、サードパーティのCI/CD統合などを組み合わせて柔軟なルールを作成可能。

---

## **使用例**

### 1. **コードレビューの強制**

**目的:** `main`ブランチに直接プッシュすることを防ぎ、コードレビューを強制。
**設定例:**

- `main`ブランチのプッシュを禁止。
- 少なくとも2人のレビューアによる承認が必要。

**効果:**
チーム全体のコード品質を向上させ、バグの早期検出を促進。

---

### 2. **CI/CDパイプラインの統合**

**目的:** プルリクエストがCIテストに成功しない限り、ブランチをマージできないようにする。
**設定例:**

- `develop`ブランチに対して、GitHub Actionsや外部CIツールでのテスト成功を必須にする。

**効果:**
ビルドエラーやテストの失敗を防止し、リリースの安定性を確保。

---

### 3. **セキュリティルールの適用**

**目的:** 機密情報を含むブランチやリポジトリへのアクセスを厳密に制限。
**設定例:**

- センシティブなタグやブランチ（例: `release/*`）へのアクセスは特定のメンバーのみに制限。
- マージ時に署名付きコミットを必須化。

**効果:**
機密情報やリリースコードのセキュリティを向上。

---

### 4. **自動化されたポリシー適用**

**目的:** 組織全体のポリシーを新しいリポジトリにも一貫して適用。
**設定例:**

- 新規作成されたすべてのリポジトリに対し、デフォルトのルールセットを適用。
- デフォルトブランチに対して自動でルールを適用。

**効果:**
新しいプロジェクトでポリシーの漏れを防ぎ、セットアップの手間を削減。

---

### 5. **コミュニケーションの透明性の向上**

**目的:** コードオーナーやレビュアーに通知を送るルールを追加。
**設定例:**

- 特定のフォルダやファイル（例: `/config/`）の変更を含むプルリクエストでは、コードオーナーに通知。
- 特定のタグが付いたプルリクエストに自動コメントを追加。

**効果:**
レビュープロセスをスムーズにし、責任分担を明確化。

---

## **まとめ**

GitHubのrulesetsは、特に大規模なチームや組織での一貫性のあるプロセス管理に役立ちます。
柔軟性が高いため、セキュリティ、品質管理、開発効率の向上に幅広く応用できます。
Rを学びたい Step10(仮想データで実験)

## はじめに
Rを学びたいのStep10です。
仮想データを準備し、分析の練習をしていきます

## データの準備

```csv:data.csv
Date,DayOfWeek,Sales,Weather,Promotion
2024-01-01,Monday,434,Rainy,None
2024-01-02,Tuesday,411,Rainy,Special Menu
2024-01-03,Wednesday,461,Rainy,Special Menu
2024-01-04,Thursday,748,Sunny,Discount
2024-01-05,Friday,627,Sunny,Special Menu
2024-01-06,Saturday,441,Rainy,Special Menu
2024-01-07,Sunday,659,Cloudy,Special Menu
2024-01-08,Monday,633,Sunny,Special Menu
2024-01-09,Tuesday,538,Rainy,Discount
2024-01-10,Wednesday,568,Cloudy,Special Menu
2024-01-11,Thursday,501,Rainy,Discount
2024-01-12,Friday,568,Rainy,None
2024-01-13,Saturday,425,Rainy,Discount
2024-01-14,Sunday,737,Sunny,Special Menu
2024-01-15,Monday,696,Sunny,None
2024-01-16,Tuesday,636,Sunny,Special Menu
2024-01-17,Wednesday,761,Sunny,Special Menu
2024-01-18,Thursday,786,Sunny,Discount
2024-01-19,Friday,454,Rainy,None
2024-01-20,Saturday,496,Rainy,Discount
2024-01-21,Sunday,641,Cloudy,Special Menu
2024-01-22,Monday,794,Sunny,Discount
2024-01-23,Tuesday,549,Rainy,Discount
2024-01-24,Wednesday,639,Sunny,Discount
2024-01-25,Thursday,466,Rainy,None
2024-01-26,Friday,690,Sunny,None
2024-01-27,Saturday,411,Rainy,Special Menu
2024-01-28,Sunday,638,Sunny,Discount
2024-01-29,Monday,615,Sunny,Special Menu
2024-01-30,Tuesday,632,Cloudy,Special Menu
```

## 分析
まずは箱ひげ図を作って行こうと思います。
```r:
# 必要なライブラリを読み込み
library(tidyverse)

# データの読み込み
data <- read.csv("cafe_sales_data.csv")

# 箱ひげ図の作成
ggplot(data, aes(x = Weather, y = Sales, fill = Weather)) +
  geom_boxplot() +
  labs(title = "Sales by Weather Condition", x = "Weather", y = "Sales") +
  theme_minimal()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/59e412c6-0343-6c5e-d7b8-2766c161f8f3.png)

・曇りの日
　・中央値は640ドル。
　・四分位範囲（IQR）: 約 625ドル〜645ドル
  ・外れ値が570ドル

・雨の日
　・中央値は460ドル。
　・四分位範囲（IQR）: 約 430ドル〜500ドル
　
・晴れの日
　・中央値は680ドル
  ・四分位範囲（IQR）: 約 640ドル〜750ドル

## 棒グラフ

```R:
# 必要なライブラリを読み込み
library(tidyverse)

# データの読み込み
data <- read.csv("cafe_sales_data.csv")

# 平均売上を計算
avg_sales <- data %>%
  group_by(Weather) %>%
  summarize(AverageSales = mean(Sales))

# 棒グラフを作成
ggplot(avg_sales, aes(x = Weather, y = AverageSales, fill = Weather)) +
  geom_bar(stat = "identity") +
  labs(title = "Average Sales by Weather Condition", x = "Weather", y = "Average Sales") +
  theme_minimal()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/169b1390-84e3-8545-c798-8411603b5bd2.png)
【JetpackCompose】Colorに対してCSSのbrightnessみたいなことをやる方法

# コード

### Colorにメソッド追加する
```kotlin
import androidx.compose.ui.graphics.Color

fun Color.brightness(value: Float): Color {
    return Color(
        red = maxOf(0f, this.red - value),
        green = maxOf(0f, this.green - value),
        blue = maxOf(0f, this.blue - value),
        alpha = this.alpha
    )
}
```

### 使い方

```kotlin
val brightnessColor = Color.Red.brightness(0.2f)
```