OmniAICreator/Qiita-1.07M huggingface dataset:
【備忘録】switch文で文字列を条件にする時

皆さんはswitch文よく書きますか？

私は条件分岐が大量になるとき以外はif文で書くのことが多いんですが、どっちの方が良いんでしょうね。

さて、今回はswitch文で文字列を条件にする時の注意点についてまとめていこうと思います。

<h2>注意点</h2>
以下の様に、switch文を書いたとします。

```java
String str = ""; //任意の文字列

switch (str) {
case string1 :
    //ここに処理内容
    break;

default :
    //ここに処理内容
    break;
}
```
こんな感じですね。

ここで注意しないといけないのが、条件にしてる文字列<code>str</code>が<code>null</code>の場合です。

```java
String str = null;

switch (str) {
case string1 :
    //ここに処理内容
    break;

default :
    //ここに処理内容
    break;
}
```
この場合、一見デフォルトの条件に入るように見えるんですが、<code>NullPointerException</code>になります。

そもそもJava7以降からでしか、文字列をswitch文で扱えないそうです。

<h2>対応方法</h2>
nullチェックを行い、空文字を代入し直せばエラーを回避することが出来ます。

```java
String str = null;

if (str == null) {
    str = ""; //ここで空文字を代入しておく。
}

switch (str) {
case string1 :
    //ここに処理内容
    break;

default :
    //ここに処理内容
    break;
}
```
Windowsのプロパティに表示される「ディスク上のサイズ」とはなにか

# 初めに
HDDの作りを学んでいた際、プロパティに表示されるファイルのサイズには2種類あることが分かりました。違いを理解したので備忘のためにまとめます。

# プロパティを開くとサイズが二種類ある
適当なテキストファイルのプロパティを開いてみると、サイズの他に「ディスク上のサイズ」という項目があることが分かります。これは一旦なんでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430841/017d1686-bfd2-19a4-e31e-f61e1a5ccccf.png)




# 二種類の違い
この二つの違いは以下です。
* サイズ：ファイルの実際の大きさ
* ディスク上のサイズ：実際にファイルがHDDを占有している大きさ

実は、ファイルはHDDに保存される際、1バイト単位できっちりと保存されるわけではありません。
ある程度余裕をもって保存されるというわけですね。
これにはHDDの作りが関係しています。

# HDDの作り
それでは、HDDの作りを理解するのに必要な、「セクター」と「クラスター」について説明します。

## セクターとは
セクターとは、HDDのディスクを物理的に区切った部屋の一つのことを指します。
だいたい一つのセクターの大きさは512バイトほどです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430841/671ee48d-5b7d-c777-f31e-fd3ee6ea0f3b.png)
参考：https://wa3.i-3-i.info/word12631.html

## クラスターとは
クラスターとは、HDD上に1つのファイルを格納する際の最小単位のことです。
クラスターはセクターの集合であり、1クラスターに何個のセクターで構成されているかはHDDの大きさなどによりまちまちです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430841/e00143c9-61d7-3cce-5804-6d29db6fdf2a.png)
参考：https://wa3.i-3-i.info/word12631.html

以上より、
ディスク上のサイズが4KBになっているのは、**1クラスターに満たないファイルサイズを保存しているため**ということが分かります。
ファイルがどんなに小さくても、ひとつのファイルを保存する場合は1クラスターの容量を使うことですね。
（大きい家だからといって、他人と暮らすのは嫌ですもんね、そんなイメージです）

## クラスターの大きさの確認方法
クラスターの大きさは以下の方法で確認できます。
* Poweshellを管理者権限で開く
* `fsutil fsinfo ntfsinfo c:`コマンドをうつ
  * 最後のc:はドライブ

自分の場合は1セクターが512バイトで、1クラスターが4096バイトでした。
```sh: クラスターの容量確認
PS C:\Windows\system32> fsutil fsinfo ntfsinfo c:
NTFS ボリューム シリアル番号 :        0x80f6c430f6c427ec
NTFS バージョン      :                3.1
LFS バージョン       :                2.0
総セクター数s     :                995,452,927  (474.7 GB)
総クラスター数    :                124,431,615  (474.7 GB)
空きクラスター数s     :                 83,968,778  (320.3 GB)
予約済み総クラスター数 :            1,068,026  (  4.1 GB)
記憶域予約用に予約済み :       1,036,899  (  4.0 GB)
セクターあたりのバイト数  :                512
物理セクターあたりのバイト数 :        512
クラスターあたりのバイト数 :                4096  (4 KB)
FileRecord セグメントあたりのバイト数    :  1024
FileRecord セグメントあたりのクラスター数 :  0
MFT の有効なデータ長 :            845.50 MB
MFT 開始 LCN  :                   0x00000000000c0000
MFT2 開始 LCN :                   0x0000000000000002
MFT ゾーン開始 :                   0x00000000033335e0
MFT ゾーン終了   :                   0x000000000333fe00
MFT ゾーン サイズ  :                   200.13 MB
デバイスの最大トリム エクステント数 :     256
デバイスの最大トリム バイト数 :       0xffffffff
ボリュームの最大トリム エクステント数 :     62
ボリュームの最大トリム バイト数 :       0x40000000
リソース マネージャー識別子:      1144DEF5-4C4C-11EE-AC61-04AB183C5884
```

# 終わりに
HDDにデータがどのように保存されているのかはあまり意識したことがなかったのですが、分かると面白いですね。
アプリを作るうえでハードの勉強もしたほうが良いなと感じている今日この頃なので、これからも勉強しようと思います。

ここまでご覧いただきありがとうございました！

# 参考
* https://www.amazon.co.jp/dp/4296000195
* https://wa3.i-3-i.info/word12631.html
* https://infinity-i.co.jp/support/1711/
* https://jp.fujitsu.com/family/familyroom/syuppan/family/webs/serial-comp2/index7.html
現役大学生が考える一番最初に覚えたいLinuxコマンド

# はじめに
情報系の大学に通っている。大学生になって最初の方の授業で習い、その後も毎日のように使用し続けているLinuxコマンドをまとめた。
このコマンドも必要だろう！というものがあればコメントいただきたい。

# 重要Linuxコマンド
|コマンド名|略  |説明 |
|---|---|---|
|cd |change directory |ディレクトリを移動する |
|ls  |list (segments)  |フォルダ内のファイルやフォルダを表示|
|pwd| print working directory| 現在のディレクトリを出力する|
|rm|remove|ディレクトリを削除する|
|mv d1 d2|move|d1をd2に移動する|
|cat|concatenate|ファイルを出力する*1|
|mkdir|make directory|空のフォルダを作成する|
|sudo|superuser do|スーパーユーザー権限で処理を実行する|
|chmod|change mode|ファイルの権限を変更する|




# 備考
## *1
catはファイルの内容を表示させるために使用されることが多いが複数の連結して表示したり、連結したファイルを別のファイルとして書き出したりすることもできる。
``` sh
# f1とf2を連結して表示
cat f1 f2 
# f1とf2を連結した内容をf3に書き出す
cat f1 f2 > f3
```

# おわりに
大学入学当初はGUIに慣れていないこともありLinuxコマンドがうまく使えなかった。しかし、書き出してみれば最低限覚える必要があるコマンドは少ない。略語の意味を合わせて覚えることで、このページのコマンドはすぐに使いこなせるようになるだろう。
VisualStudio 拡張機能について

こんにちは。塚田です。

近頃VisualStudioに触れる機会が多いので、
VSで使える拡張機能について調べてみました。
今回はその中でも個人的に注目した機能を3つ紹介します。

# Prettier - Code formatter

まず1つ目はPrettier - Code formatterです。
この機能の最大の特徴は、一貫したコードフォーマットを自動的に適用することで、コードの可読性とメンテナンス性を大幅に向上させる点です。
ファイルを保存するたびに自動でコードを整形してくれるため、チーム全体でコードスタイルを統一するのが簡単になります。
JavaScript,TypeScript,CSS,HTMLなど、多くの言語をサポートしています。<br>
弱点としてはコードフォーマットの柔軟性が制限されることです。
意図的にカスタマイズオプションを少なくしており、細かいスタイル設定ができないことがあります。これは一貫性を保つためではありますが、開発者の好みによっては不満となる場合があります。

# ESLint
2つ目はESLintです。
ESLintはJavaScriptやTypeScriptのコードを静的に解析し、潜在的なバグやスタイルの問題を検出します。コーディング中にエラーや警告を即座に修正できます。
ESLintは、ユーザーが独自のルールを定義したり、既存のルールセットを使用したりなど柔軟性があります。
また、1つ目で紹介したPrettierなどのフォーマッタと併用することができ、コードの一貫したスタイルを保ちながら品質チェックを行うことができます。

# GitLens
3つ目はGitLensです。
GitLensは、ソースコードの各行が誰によって、いつ変更されたかを視覚的に表示します。これにより、コードの責任者や変更履歴を簡単に把握できます。特定のコミット、ブランチ、タグに簡単に移動し、履歴を遡ってコードの進化を追跡することが可能です。
GitLensは多くの機能を提供しているため、設定や使いかたが少し複雑ですが、最適な設定を見つけることができれば非常に強力で便利なツールとなります。


# おわりに
普段コードを書いていると、コードスタイルや警告文の対応などに思ったより時間を割いてしまうことが多くあります。
そんな時に上記の機能を使えば時間短縮やコードミスも減ってストレスなく作業ができる！
そんな魅力だらけの拡張機能の紹介でした。
以上、塚田。
Djangoとは？

こんにちは。塚田です。

今回は私が学生時代に触れていたものの、
その後しばらく離れていたPythonのフレームワーク**Django**について、
改めて調べてみました。
以下にDjangoの主な特徴をまとめます。

# Djangoとは？

まず初めにDjango(ジャンゴ)とは、Pythonで書かれた高性能なWebフレームワークです。2005年に公開され、迅速な開発とシンプルで実用的なデザインを重視しています。主な特徴には、以下が挙げられます。

# 主な特徴
**1.MVCアーキテクチャ**
Djangoはモデル(Model)、ビュー(View)、コントローラー(Controller)を分けるMVCアーキテクチャを採用しており、コードの整理がしやすくなっています。

**2.迅速な開発**
自動管理インターフェース、認証機能、自由なURL設計。

**3.優れたセキュリティ**
XSS、CSRF保護、SQLインジェクション防止。

**4.高い柔軟性**
テンプレートシステム、ORM、中間ウェアの追加が簡単

# Djangoを使うメリット

- **高速な動作**
分散型のキャッシュシステムであるmemcachedが備えられており、
キャッシュ機能が強力。

- **パスワードを直接保存しない**
パスワードはハッシュ化し、データベースに格納する。
入力されたパスワードは、ハッシュ関数を介した入力値と、保存されたハッシュ値を比較することでチェックされる。

- **プラットフォームが**
Linux、Windows、macOS Xなどのメジャーなプラットフォームで実行できる。

# おわりに
今回はPythonのフレームワークDjangoについて触れてみました。
Djangoを使えば品質の高いWebアプリケーションが簡単に、少ないコードで作成できます。
これからWeb開発を始める方や、既存のプロジェクトを効率化したい方には、ぜひDjangoを試してみることをお勧めします。
以上、塚田でした。
初めてgit pushする方法（自分で1から作ったコードをアップロードする）

# git初心者大学生のためのgitコマンド（初級1）

この記事は、大学生が大学生のために書くgithubの記事です。
研究室の先輩にgithubの登録だけしてもらったけど、何をすればいいのか分からない、githubアカウント使っただけでgitにコードアップロードしたりしてない...という人に読んでほしい記事になっています。
もし間違いがあった場合は指摘していただけたら大変嬉しいです！

### 自分で一から作ったコードをgithubにアップする方法
1. 新しいリポジトリを作る（README作るとよくわからないので作らない）
    自分のアカウントにログインした状態でgithubを開くと、左上に自分のアイコンなどがあるので、その近くにある下の緑ボタンを押して、新しくリポジトリを作ります。
    迷ったら、private、READMEは無しで大丈夫だと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323577/897d92a9-39c7-bdde-27e5-834a49e92284.png)
2. githubにアップロードしたいフォルダの中に移動（移動させるのがdir1ならdir1の中が見れる状態）
3. gitignoreファイルをテンプレートから作成
    
    ```jsx
    wget --output-document=.gitignore https://raw.githubusercontent.com/github/gitignore/main/Python.gitignore
    ```
    
4. ```git init```
5. ```git add .```
6. ```git commit -m “first”　```　# このfirstはただのコメントでなんでも良いです、ただ書かないとダメ.
7. **…or push an existing repository from the command line
    のところをそのままコピペ　※ SSHを選んでいることを確認**
    ```
    git remote add origin [git@github.com]...
    git branch -M main
    git push -u origin main
    ```
これでアップロードできるはずです。
続きはまた書きます！
Pythonで分数を作った備忘録


# 分数クラス
AtCoderで役に立つかなと思い自作してみた。
多分車輪の再開発だと思う。

```py
class fraction:
    def __init__(self,a=int,b=1):
        if b==0:
            raise ValueError("分母が0です")
        self.molecule=a
        self.denominator=b
        if a!=0:
            self.approx()
    def molecule(self):
        return self.molecule
    def denominator(self):
        return self.denominator
    def devide(self):
        f=self.molecule/self.denominator
        if f.is_integer():
            return int(f)
        else:
            return f
    def __add__(self,other):
        return fraction(self.molecule*other.denominator+other.molecule*self.denominator,self.denominator*other.denominator)
    def __sub__(self,other):
        return fraction(self.molecule*other.denominator-other.molecule*self.denominator,self.denominator*other.denominator)
    def __mul__(self,other):
        return fraction(self.molecule*other.molecule,self.denominator*other.denominator)
    def __truediv__(self,other):
        return fraction(self.molecule*other.denominator,self.denominator*other.molecule)
    def __floordiv__(self,other):
        return self/other
        return self.__floordiv__(other)
    def __str__(self):
        return str(self.molecule)+"/"+str(self.denominator)
    def is_irreducible(self):
        return True if self.molecule%self.denominator==0 else False
    def prime_factorize(self,n):
        a = []
        if n==1:
            return [1]
        while n % 2 == 0:
            a.append(2)
            n //= 2
        f = 3
        while f * f <= n:
            if n % f == 0:
                a.append(f)
                n //= f
            else:
                f += 2
        if n != 1:
            a.append(n)
        return a
    def approx(self):
        a,b=[],[]
        ar,br=1,1
        a=self.prime_factorize(self.molecule)
        b=self.prime_factorize(self.denominator)
        while True:
            if len(a)==0 or len(b)==0:
                ar*=math.prod(a)
                br*=math.prod(b)
                break
            if a[-1]==b[-1]:
                a.pop()
                b.pop()
            elif a[-1]>b[-1]:
                ar*=a.pop()
            elif a[-1]<b[-1]:
                br*=b.pop()

        self.molecule=ar
        self.denominator=br
```
【Mysql x Docker】エラー「The table 'xxxx' is full」の原因とDockerの利用率を調べる方法

# 概要
ローカル環境でMysqlのdockerを使っていたら以下のエラーに遭遇。
初めて見たエラーだったので調べてみました。

> (1114, "The table 'xxxx' is full")

# 原因と対応
エラーメッセージから、とあるテーブルがデータをこれ以上格納できない状態になったということがわかります。
このエラーで考えられる一番の原因は、ローカル環境のDockerのディスクスペース不足だとのこと。

そういえば、先日結構重いDUMPファイルをインポートしたなと思い、
テーブルから余計なデータを削除したら、このエラーは表示されないようになりました。

# 調査方法

この際、Dockerの統計情報を調べる方法があるらしいので確認してみる。

コンテナ内でディスク使用量を確認するコマンドは以下の通り。
(`<mysql-container>`のところは該当のコンテナ名かIDにしてください)

```
docker exec -it <mysql-container> df -h
```

すると以下のような結果になります。

```
Filesystem      Size  Used Avail Use% Mounted on
overlay          64G   54G  6.6G  89% /
tmpfs            64M     0   64M   0% /dev
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
shm              64M     0   64M   0% /dev/shm
grpcfuse        461G  443G   18G  97% /etc/atbb.sql
/dev/vda1        64G   54G  6.6G  89% /etc/hosts
tmpfs           3.9G     0  3.9G   0% /sys/firmware
```

`grpcfuse`では97%とあるのでかなり利用率が高いです。`xxx.sql`がマウントされているのが原因でしょう。

また、以下のコマンドでは、稼働中のコンテナのリソース使用状況をリアルタイムで確認できます。

```
docker stats <mysql-container>
```

CPU使用率、メモリ使用量、ネットワークI/O、ブロックI/Oなど、コンテナのリソース使用状況に関する詳細が確認できます。

```
CONTAINER ID   NAME    CPU %     MEM USAGE / LIMIT    MEM %     NET I/O           BLOCK I/O       PIDS
xxxxxxxxxxxx   mysql   0.13%     448.2MiB / 7.75GiB   5.65%     21.3MB / 33.8MB   123MB / 305MB   32
```

メモリ使用率はそこまで高くないですね。他の稼働中コンテナも確認しましたが微々たるものでした。
`BLOCK I/O`は、コンテナがディスクとどれだけ読み込み（インプット）と書き込み（アウトプット）をしているかの量を表しています。ここが高すぎるとディスクへのアクセスが頻繁に行われていることを意味するので、パフォーマンスに影響があるかもしれません。

特にコンテナを指定せず稼働中のものすべて確認したい場合は以下のコマンドで可能です。

```
docker stats -a
```

> CONTAINER ID and Name	the ID and name of the container
CPU % and MEM %	the percentage of the host's CPU and memory the container is using
MEM USAGE / LIMIT	the total memory the container is using, and the total amount of memory it is allowed to use
NET I/O	The amount of data the container has received and sent over its network interface
BLOCK I/O	The amount of data the container has written to and read from block devices on the host
PIDs	the number of processes or threads the container has created
引用元：　https://docs.docker.com/reference/cli/docker/container/stats/
AWSからOCIに接続するハイブリッドクラウド環境を設定する手順

お疲れ様です。

今日は「AWSからOCIに接続するハイブリッドクラウド環境を設定する手順」について説明します。

AWS上にOCI (Oracle Cloud Infrastructure) 環境を構築するためのガイドを提供します。
このガイドは、AWS上にOCIの環境を構築する手順を示します。OCIを直接AWS上に構築することはできませんが、AWSからOCIに接続するハイブリッドクラウド環境を設定する手順を以下に示します。

# ステップ1: OCIとAWSの接続設定

## OCI側の設定

### VCN (Virtual Cloud Network)の作成:

```bash
oci network vcn create --compartment-id <compartment_id> --cidr-block <CIDR_block> --display-name <VCN_name>
```

### サブネットの作成:

```bash
oci network subnet create --compartment-id <compartment_id> --vcn-id <vcn_id> --cidr-block <CIDR_block> --display-name <subnet_name>
```

### DRG (Dynamic Routing Gateway)の作成:

```bash
oci network drg create --compartment-id <compartment_id> --display-name <DRG_name>
```

### DRGアタッチメントの作成:

```bash
oci network drg-attachment create --drg-id <drg_id> --vcn-id <vcn_id> --display-name <attachment_name>
```

### ルートテーブルの設定:

```bash
oci network route-table update --rt-id <route_table_id> --route-rules '[{"cidrBlock":"<AWS_CIDR_block>","networkEntityId":"<drg_id>"}]'
```

## AWS側の設定

### VPC (Virtual Private Cloud)の作成:

```bash
aws ec2 create-vpc --cidr-block <CIDR_block>

```

### サブネットの作成:

```bash
aws ec2 create-subnet --vpc-id <vpc_id> --cidr-block <CIDR_block>

```

### VGW (Virtual Private Gateway)の作成:

```bash
aws ec2 create-vpn-gateway --type ipsec.1

```

### VGWのアタッチメント:

```bash
aws ec2 attach-vpn-gateway --vpn-gateway-id <vgw_id> --vpc-id <vpc_id>

```

### ルートテーブルの設定:

```bash
aws ec2 create-route --route-table-id <route_table_id> --destination-cidr-block <OCI_CIDR_block> --gateway-id <vgw_id>

```

# ステップ2: VPN接続の設定

## OCI側のVPN設定

### IPSec接続の作成:

```bash
oci network ipsec-connection create --compartment-id <compartment_id> --cpe-id <cpe_id> --drg-id <drg_id> --static-routes '["<AWS_CIDR_block>"]' --display-name <connection_name>
```

## AWS側のVPN設定

### VPN接続の作成:

```bash
aws ec2 create-vpn-connection --type ipsec.1 --customer-gateway-id <customer_gateway_id> --vpn-gateway-id <vgw_id> --static-routes-only

```

### VPN接続の設定:

OCIから提供されたVPN接続の詳細情報（IPアドレス、プレシェアードキーなど）をAWSのVPN接続に設定します。

# ステップ3: セキュリティ設定

- OCI側のセキュリティリスト設定
必要なインバウンドおよびアウトバウンドルールを追加します。
- AWS側のセキュリティグループ設定
必要なインバウンドおよびアウトバウンドルールを追加します。

# ステップ4: 接続テスト

各クラウド間で相互に接続が確立されていることを確認します。例えば、OCI上のインスタンスからAWS上のインスタンスに対してpingを実行するなどのテストを行います。

これで、AWSからOCIに接続するための基本的なハイブリッドクラウド環境が構築されました。この手順を実行する際には、各クラウドのドキュメントを参照し、最新のコマンドやオプションを確認することをお勧めします。

今日は以上です。

ありがとうございました。
よろしくお願いいたします。
Flaskアプリケーションに初期データを突っ込んでおく裏ワザ

個人開発をしていて、データベース設計を行なっていたときに、都道府県や市区町村データを予めDBに突っ込んでおきたいなあという場面があった。

Railsだと、初期データを予め突っ込んでおくseedという機能がデフォルトで用意されている。

https://qiita.com/takehanKosuke/items/79a66751fe95010ea5ee

しかし、Flaskにはいろいろ調べたのですがなかなか良さげなものが見つからず。なんでや！

ということで、すでに作成したDBに対して初期データを突っ込んでおくシェルスクリプトを書きました。

```import_data.sh
db_file="instance/sharejog.sqlite"

pref_csv_file="flask_app/data/prefectures.csv"
pref_table_name="data_models_prefectures"

city_csv_file="flask_app/data/cities.csv"
city_table_name="data_models_cities"

facility_csv_file="flask_app/data/facilities.csv"
facility_table_name="data_models_facilities"

sqlite3 $db_file <<EOF
.mode csv
.import $pref_csv_file $pref_table_name
.import $city_csv_file $city_table_name
.import $facility_csv_file $facility_table_name
.quit
EOF
```

気をつけなくてはならないこととして、当然ではありますが、csvの構成とDBのスキーマ構成との間にきちんと整合性をとる必要がある。（そうしないときちんと格納できないよね）

テーブル作成まで完了したら、Flaskアプリケーションを起動する前にこれを実行すれば良い。具体的には、
```bash
flask db init && flask db migrate && flask db upgrade && chmod +x import_data.sh && ./import_data.sh && gunicorn -b 0.0.0.0:$PORT flask_app.app:app
```
をRender.comのStart Commandに設定すればOK。
コミュニケーションスキルについて

こんにちは。水野です。

### はじめに
現在はIT企業に所属しているのですが、以前はカウンセラーを志していました。
そんな自分から、人の話を聞く能力を向上するために実際にやらされていた
練習についてお伝えします。
### 聴くこと

人の話を積極的に聞くということは、
同僚、上司と部下間の会話や、ミーティングなど
IT業界といえど使えるタイミングはあるかと思います。

また、聞き上手の利点としては、相手との信頼関係が築けたり、
話し手側の自己理解を促すことができるなどいくつか利点があり
身に着けておいて損はないスキルかと思います。


### 実際にやってみましょう

時間：5分間
2人一組になり、「聞き手」と「話し手」に分かれます。
話すテーマを事前に決めておきます。

ルール：
聞き手は自分から話を振ってはいけません。
はい・いいえで答えられる質問もしてはいけません。
相槌・オウム返し・話のキーワードになる単語をくり返す
などで5分間相手の話を聞き続けてください。

### まとめ
実際にやってみると、5分間相手の話を聞き続けることは地味に難しいのではないでしょうか？
相手の話をさえぎらないようにオウム返しをすることや、
相槌のトーンを相手の話にあわせる、目を合わせる頻度、聞く姿勢など
「聴く」という行為を円滑に遂行するためのポイントはいくつもあります。

業務を円滑に進めるためにも”伝え方”だけに注意を向けるのではなく、
自分が普段どんな”聞き方”をしているかにも気にかけてみていただけたらと思います。

以上、水野でした。
【ProxmoxVE SDN】EVPNを用いて物理マシン間で仮想ネットワークを共有する

# はじめに
私は先月に気付いたのですが、ProxmoxVE 8.1から、今まで試験的な機能とされていたSDNが正式に実装されたようで、どうやらソフトウェア上だけでネットワークをよしなにできるらしいです。
ちょうどLinux Bridgeをなんとかしなければならないと思っていたので検証がてら触ってみます。

# なにをするの？
[この記事](https://qiita.com/mai_llj/items/841faea33f156c7264ef)で接続したHomeNOCから頂いているIP資源を払い出すために使っているLinux Bridge InterfaceをEVPNゾーンに置き換え、物理マシン間を跨いでの通信を可能にします。

現状の構成はこんな感じ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/593e0e63-56b0-82a6-3388-9862274b79c1.png)

ONUをNode #1の物理NICを介してVyOSのVMへ接続し、VyOSに接続されているLinux Bridge Interface上でいくつかのVMにIPの配布を行っています。

この構成だと、Node #2では資源を利用することができないため、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/e587447f-cffe-5b28-8379-f5b71c700a34.png)

EVPN Zoneを用いたこのような構成に変更し、物理筐体を超えての疎通を実現します。

# 準備
EVPNの構築には、FRRoutingを用いますが、現状ではテクニカルプレビュー扱いとのことで、初期状態では導入されていないため、下記のコマンドでインストールを行います。
```bash
apt install frr-pythontools
```
# EVPN Zoneを構成する
EVPN Zoneでは、異なるノード間の通信を制御するためにEVPN Controllerが必要となります。

## EVPN Controllerの追加
`Datacenter > SDN > Options`より、`Controllers > Add > evpn`を押下し、以下のように設定します。
|項目|設定値|
|--|--|
|ID|任意のID|
|ASN #|一意のプライベートAS番号|
|Peers|対象ノードのIP|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/8c9bc54d-6f05-8f55-bed6-ecfed7ee2c5d.png)

## Zoneの追加
`Datacenter > SDN > Zones`より、`Add > EVPN`を押下し、以下のように設定します。
|項目|設定値|
|--|--|
|ID|任意のID|
|Controller|上記手順で追加したController|
|VRF-VXLAN Tag|任意のTag|
|Exit Node|外向き通信に使う終端ノード|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/553f0b7d-dfed-4ff5-7ce1-7dc498c3ed80.png)

:::note warn
ここでVRF-VXLAN Tagとして指定した値は、VNetsでは使えません。
:::

## VNet, Subnetの追加
`Datacenter > SDN > VNets`より、`Vnets > Create`を押下し、VNetを追加します。
|項目|設定値|
|--|--|
|Name|任意の名称|
|Controller|上記手順で追加したZone|
|Tag|任意のTag|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/bcfca8e0-f601-28dd-9c1d-870503f0338b.png)

Vnetの作成が完了したら、続けてSubnetの定義をします。

現状では、DCHPはSimple Networkに限った機能らしく、EVPN Zone上では機能しないため、ここではsubnetの定義のみでDCHPに関する設定は行いません。

先程追加したVnetを選択した状態で、`Subnets > Create`を押下し、Subnetを追加します。
|項目|設定値|
|--|--|
|Subnet|割当を受けた資源/prefix|
|Gateway|VyOSに割り振ったIP|
|SNAT|True|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/b37fc209-73b8-3c85-917f-0cbedb9d3d2f.png)

# 動作確認
おつかれさまです。これまでの手順でEVPN Zoneの構築が完了しました。
適当なVMを建てて疎通を確認します。

Network Deviceに先程作成した`evpnnet1`のVNetを指定します。

また、前述の通り、DCHPが使えませんのでIPを手動で割り当てる必要があります。
私はCloud initの機能でぱぱぱーっとやりましたが、必要があれば起動後に割り当ての作業を行ってください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/e1c1bdec-0c56-edd7-e618-f396bbcc533f.png)

pingを打って疎通すれば成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/eb213497-8488-f64d-e520-fedf0a6f2acb.png)

補足として、Subnetで設定していないアドレス宛に通信を行いたい場合は、SNATを有効にすることで可能です。

# さいごに
ここまで読んでいただきありがとうございました。

Proxmox VEのSDNを利用することで手軽にEVPNを導入できたかと思います。
従来の手法のように外部の機器を通さずとも色々できるのは遊び甲斐がありますよね～。
IPAMと連携していい感じにアドレス資源の管理もできるみたいなので近々試してみたいです。
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（20/100）

【20日目】
トピック 3：SAPS/4HANAのマスタデータ（9/22）

≪問題20≫
各品目に割り当てられるローレベルコードの用途は何ですか。
（２つ選択）
□設計BOMの副明細を特定するために設計デザインで使用される。
□品目が計画される順序を決定するためにMRPで使用される。
□原価を求める方法を決定するために原価積上で使用される。
□代替構成品目の優先度を決定するためにATP（Available-to-Promise）で使用される。

≪解答≫
□設計BOMの副明細を特定するために設計デザインで使用される。
■品目が計画される順序を決定するためにMRPで使用される。
■原価を求める方法を決定するために原価積上で使用される。
□代替構成品目の優先度を決定するためにATP（Available-to-Promise）で使用される。

≪解説≫
◆BOMを登録する際に、システムによってMRPおよび原価計算で使用される各品目にローレベルコードが自動的に割り当てられます。
◆ローレベルコードの主な機能と用途は以下の通りです。
（1）MRPにおいて、品目の計画順序を決定するために使用されます。
（2）原価のロールアップ方法を決定するために原価積上に使用されます。
（3）品目が複数の製品や、1つの製品の複数の生産レベルで使用される場合が考慮されます。
（4）品目が使用される最下位の展開レベルであり、品目の合計所要量が収集されます。
ハッシュタグの標準仕様

# はじめに
SNS でよく見かける**ハッシュタグ**に標準的な仕様があるのか興味があったので調べてみました。

本記事では、 Unicode Standard で規定されているハッシュタグの仕様を紹介します。

# ハッシュタグとは

ハッシュタグとは、`#emoji` のように**ハッシュ記号** (`#`) からはじまるメタデータです。SNS やブログ記事などで、投稿やコンテンツを分類・整理するために使用されます。

ハッシュタグを投稿に含めることで、その投稿がどの話題に関連しているかを明確にし、同じ話題に関心を持つユーザに発見されやすくすることができます。


:::note
**メタデータ**とは、データに関する情報を記述するデータです。例えば、作成者や作成日時などです。ハッシュタグも、コンテンツがどの話題に関連するかを表すメタデータのひとつです。
:::

# 仕様
ハッシュタグの仕様は明確に定義されているわけではありません。絵文字の利用可否や文字数制限など、実装ごとに違いがあります。

この仕様の曖昧さを補うために、Unicode Standard の付録（Annex）である [UAX #31: Unicode Identifiers and Syntax](https://unicode.org/reports/tr31/#hashtag_identifiers) では、ハッシュタグの構文に関する推奨事項が示されています。この推奨事項はハッシュタグの共通的な処理を促進する一方で、実装の自由度も一定程度確保しています。

以下では、この仕様について紹介します。

## UAX31-D2
**UAX31-D2** はハッシュタグのデフォルトの構文です。
```:ハッシュタグの構文（BNF 記法の拡張）

<Hashtag-Identifier> := <Start> <Continue>* (<Medial> <Continue>+)*

`:=` : 右辺が左辺の構文を定義
`<>` : 定義された構文
`*`  : 直前の構文が 0 回以上繰り返されることを示す
`+`  : 直前の構文が 1 回以上繰り返されることを示す
`()` : グループ化を表す
```
ハッシュタグは以下の文字で構成されています。
- **Start**: ハッシュタグの開始文字
- **Continue**: 続く文字
- **Medial**: オプションで使用できる文字


ハッシュタグを解析する際には、`Start` 文字の前に `Continue` 文字がない場合にのみハッシュタグとして認識することが推奨されます。例えば、`foo#bar` ではハッシュタグは認識されませんが、`foo #bar` や `foo.#bar` ではハッシュタグとして認識されます。

ハッシュタグは上記要件を満たし、かつ、**UAX31-R8-1** または **UAX31-R8-2** のいずれかの要件も満たす必要があります。
1. **UAX31-R8-1**
    `Start` や `Continue`、`Medial` に使用できる文字の範囲を規定
    - **Start**
      以下のいずれかを選択
      - `U+0023`: NUMBER SIGN (`#`)
      - `U+FE5F`: SMALL NUMBER SIGN (`﹟`)
      - `U+FF03`: FULLWIDTH NUMBER SIGN (`＃`)
    - **Continue**
        - `XID_Continue` に `Extended_Pictographic`, `Emoji_Component`, `_`, `-`, `+` を加えたものから `Start` 文字を除いたもの
    - **Medial**
      ここでは空。カスタマイズに使用できる。
2. **UAX31-R8-2**
  **UAX31-R8-1** をベースにカスタマイズしたプロファイル（部分集合）。


:::note
**Unicode 文字プロパティ**（または、プロパティ）とは Unicode 規格で定義されている、個々の文字に付与された属性のことです。
例: Numeric（数値）, Emoji（絵文字）

`XID_Continue` や `Extended_Pictographic`、`Emoji_Component`もプロパティのひとつです。

それぞれのプロパティに含まれる文字のリストは Unicode のバージョンによって異なります。詳細は [UNICODE CHARACTER DATABASE](https://www.unicode.org/reports/tr44/)を参照してください。

プロパティに含まれる文字のリストはバージョンごとに増えることがあるので後方互換性を意識する必要があります。
:::

比較やマッチングは、**NFKC_CF 形式**へ変換した後に行う必要があります。例えば、`#MötleyCrüe` は `#MÖTLEYCRÜE` およびその他のバリエーションと一致する必要があります。

実装では、表 3a「 Optional Characters for Medial」の文字を `Medial` に、また、表 3b「Optional Characters for Continue」の文字を `Continue` に追加することもできます。


**表 3a: Optional Characters for Medial**
| Code Point | Character |Name |
|---|---|---|
| U+0027 |'| APOSTROPHE |
| U+002D |-| HYPHEN-MINUS |
| U+002E |.| FULL STOP |
| U+003A |:| COLON |
| U+00B7 |·| MIDDLE DOT |
| U+058A |֊| ARMENIAN HYPHEN |
| U+05F4 |״| HEBREW PUNCTUATION GERSHAYIM |
| U+0F0B |་| TIBETAN MARK INTERSYLLABIC TSHEG |
| U+2010 |‐| HYPHEN |
| U+2019 |’| RIGHT SINGLE QUOTATION MARK |
| U+2027 |‧| HYPHENATION POINT |
| U+30A0 |゠| KATAKANA-HIRAGANA DOUBLE HYPHEN |

**表 3b: Optional Characters for Continue**
| Code Point | Character | Name |
|---|---|---|
| U+05F3 |׳| HEBREW PUNCTUATION GERESH |



# おわりに
本記事では Unicode Standard に規定されているハッシュタグの仕様について紹介しました。この仕様に従い実装することで、相互運用性を高めることできます。
panderaなどから仕様の自動生成

# panderaなどから仕様の自動生成

panderaなどのクラスから仕様を表示する方法を紹介します。

## panderaの例

まずはpanderaを使ってみましょう。
次のようにPersonを定義すると、以下のようにバリデーションできます。

```python
import pandas as pd
import pandera as pa
import pandera.typing as pat


class Person(pa.DataFrameModel):
    """個人"""

    name: pat.Series[str] = pa.Field(description="名前")
    age: pat.Series[int] = pa.Field(description="年齢")
    email: pat.Series[str] | None = pa.Field(description="メール")


df = pd.DataFrame([["Alice", 30]], columns=["name", "age"])
Person.validate(df)
```

次にこのPersonクラスから、仕様を出力してみましょう。

```python
def show_class(cls):
    print(f"{cls.__name__}クラス：{cls.__doc__}")
    show_dataframe(cls)


def show_dataframe(cls):
    schema = cls.to_schema()
    for column in schema.columns.values():
        s = "" if column.required else "（Optional）"
        print(f"* {column.name}：{column.description}{s}")


show_class(Person)
```

**出力**

```
Personクラス：個人
* name：名前
* age：年齢
* email：メール（Optional）
```

emailは存在しなくてもよい列なので、Optionalと表示しています。

## dataclassの例

続いて、dataclassも仕様を出力できるようにしてみましょう。
まずは、クラスを定義します。

```python
from dataclasses import dataclass, field, fields


def description(s, **kwargs):
    return field(metadata={"description": s}, **kwargs)


@dataclass
class Building:
    """建物"""

    name: str = description("名称")
    address: str = description("住所")
```

次のように仕様を出力できます。関数`show_class()`は置き換えてください。

```python
def show_class(cls):
    print(f"{cls.__name__}クラス：{cls.__doc__}")
    if issubclass(cls, pa.DataFrameModel):
        show_dataframe(cls)
    else:
        show_dataclass(cls)


def show_dataclass(cls):
    for field_ in fields(cls):
        print(f'* {field_.name}：{field_.metadata.get("description")}')


show_class(Building)
```

**出力**

```
Buildingクラス：建物
* name：名称
* address：住所
```

Swagger UIのように、いつでも最新の仕様が確認できると便利になるでしょう。

以上
C_TS4FI_2021 SAP Certified Associate - SAP S/4HANA 2021 for Financial Accounting対策（7/100）

【7日目】
トピック 1：組織割当およびプロセス統合（7/15）

≪問題7≫
元帳０Lで、会社コードに通貨タイプ40を割り当てます。選択できる元通貨タイプは次のどれですか。
正しい答えを2つ選択してください。
□グループ通貨
□管理領域通貨
□伝票通貨
□会社コード通貨

≪解答≫
□グループ通貨
□管理領域通貨
■伝票通貨
■会社コード通貨

≪解説≫
◆元帳0Lで会社コードに通貨タイプ40を割り当てる際には、「伝票通貨」と「会社コード通貨」が選択されます。これにより、取引ごとの通貨および主要通貨で取引が記録されます。他の選択肢（グループ通貨、管理領域通貨）は、会社コードごとの取引には直接関連しません。
ABC340Eを解いた


筆者はAtCoderのレート600弱の茶色コーダ

ADTで解けなかった問題を復習する。

https://atcoder.jp/contests/abc340/tasks/abc340_e

ADTのページ

https://atcoder.jp/contests/adt_all_20240627_3/tasks/abc340_e

# 実装コード

遅延セグ木をつかえばいけるらしい

遅延セグ木の実装は以下のものを使用した
- [shakayami/ACL-for-python](https://github.com/shakayami/ACL-for-python)

```python
import sys
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)
class lazy_segtree():
    # --- 中略 ---

def op(ele1, ele2):
    return ele1 + ele2
def mapping(func, ele):
    return func + ele
def composition(func_upper, func_lower):
    return func_upper + func_lower

e = 0
id_ = 0

def main():
    N, M = rLI()
    A = rLI()
    B = rLI()
    
    G=lazy_segtree(A,op, e,mapping,composition,id_)
    
    for b in B:
        x = G.get(b)
        G.set(b,0)
        k,y = divmod(x,N)
        G.apply(0,N,k)
        if b+y >= N:
            G.apply(b+1, N, 1)
            G.apply(0, b+y-N+1, 1)
        else:
            G.apply(b+1, b+y+1, 1)
    print(" ".join([str(G.get(p)) for p in range(G.n)]))
    
    
if __name__ == '__main__':
    main()

```

# まとめ

遅延セグ木を使ってABC340Eを解いた

# 余談

この問題解いたら寝よー
とか思っていたらドはまりして2時間ぐらい消費した😢

諦めて一回寝たら解けたので、
行き詰ったら一回寝ましょう。
たった一行のマイクロコピーで、ユーザーの行動は大きく変わる

# はじめに

[ザ・ダークパターン　ユーザーの心や行動をあざむくデザイン](https://www.amazon.co.jp/%E3%82%B6%E3%83%BB%E3%83%80%E3%83%BC%E3%82%AF%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E5%BF%83%E3%82%84%E8%A1%8C%E5%8B%95%E3%82%92%E3%81%82%E3%81%96%E3%82%80%E3%81%8F%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3-%E4%BB%B2%E9%87%8E-%E4%BD%91%E5%B8%8C/dp/4798172464)という本で、「意思決定の科学」という章が面白かったので自分なりに解釈して共有です。

![スクリーンショット 2024-06-28 21.34.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369683/da6a1383-ae1f-e3ac-f6b2-a769cce8b485.png)

# **たった一行のマイクロコピーで、ユーザーの行動は大きく変わる**

マイクロコピーとは、ボタンの文言やエラーメッセージ、完了メッセージなど、入力フォーム周りに置かれる細かい文言のことです。

たった一言の文言がユーザーの意思決定に重大な影響を与えた事例を紹介しています。

### 空いている宿泊施設を検索するフォーム

***「Book a room」（部屋を予約する)*** という文言とともに日付を入力し、検索、としていたものを　 ***「Check Availability」（空いている部屋を確認する)*** 　という文言に変更したところ、予約率は 17% 上がった

⇒　空き部屋を検索しよう、という時点では、ユーザーの心はまだ「予約モード」になっていないので前者だと検索するのに躊躇してしまいます。

よりユーザーに寄り添った文言に変えたのが成功した事例です。

### クレジットカードの入力フォーム

住所入力欄に「必ず請求先住所と紐づく住所を入力してください」という文言を足したところ、決済ミスが 10% 減少した

⇒　入力フォームすべてに文言を足すのは難しいですが、特にミスが多そうな・実際多いところに配置するだけでユーザー体験は向上しそうです。

### NetFlix の登録ボタン A/B テスト

NetFlix では、上記テストを随時行っており、新規会員登録ボタンの文言を「今すぐ登録する」「会員になる」など 10 種類にわたって変え、どの文言だとユーザーの登録率が一番上がるか？という調査をしているようです。

# **ユーザーに行動させたい、と思わせるマイクロコピー**

面白いのは、コンピューターや、私たちが設計したインターフェースに対して、ユーザーは **「人間社会と同じような振る舞い」** を求めることにあることです。

つまり、インターフェースに沿えるマイクロコピーも **ユーザーに寄り添った、誠実な文章** でなければユーザーは不快に思ってしまいます。

（命令文や体言止めのようなマイクロコピーはあまりよくないということですね）

# **最後に**

本書は、アンチパターン（よくないデザイン）ではなく、嫌な広告に使われるダークパターン（ユーザーを騙すようなデザイン）を紹介しているので、広告ビジネス向けかもしれませんが、、、

興味があったら読んでみてください！
【HTML / CSS】ブロック要素とインライン要素

## はじめに
学習したことを自分用の参考書のようにまとめていきます。

## ブロック要素とは
ブロック要素とは、 "**全幅になる**" ものです。

幅や高さを指定できて、エリアを自由にコントロールすることができます。

下の画像は、h１タグ（ブロック要素）に背景を指定したものです。

![スクリーンショット 2024-06-28 6.45.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459296/42d90d75-8aba-c99c-962b-fc5d93675ca9.png)


## インライン要素とは
インライン要素とは、 "**全幅にならない**" ものです。

基本的には幅や高さを指定することができません。

ですが、幅や高さを指定したいときは、" display: inline-block; "を指定してあげることで、インライン要素にブロック要素の特徴を追加することで可能になります。

下の画像は、aタグ（インライン要素）に背景を指定したものです。

![スクリーンショット 2024-06-28 6.50.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459296/8d93dd4c-7658-8e1b-310d-e167f7be0b94.png)


## 使い分け

- **レイアウトの構造**を作るときにはブロック要素を使用します。例えば、ページ全体のセクションやコンテナを定義するときです。

- **テキストやコンテンツの一部分を装飾**するためにはインライン要素を使用します。例えば、特定の単語を強調したり、リンクを作成したりする場合です。


## さいごに
いかがだったでしょうか。

他にもいろいろな記事を書いているのでぜひ読んでいただけたら嬉しいです。
Rational() の代替関数

rationalize() を使うのが良さそうですね。車輪の再発明は避けたいもの。

```Julia
julia> x = 169/9
18.77777777777778

julia> rationalize(x)
169//9

julia> rationalize(18.77777777777777)
211418982507223//11258999068432

julia> rationalize(18.77777777777777, tol=0.00001)
169//9
```

Rational() はあまりにも精度が高いので，ときには不適切な結果を与える。
そんなときのために，関数を書いた。只，場合によっては精度不足になるので，max_denominator 大きくしたり，結果を確認することは必要。


```julia
function Rational2(x, max_denominator=10000)
    (a, b, c, d) = (0, 1, 1, 0)
    while true
        mediant = (a + c)/(b + d)
        if x == mediant
            b + d <= max_denominator && return (a + c)//(b + d)
            d > b && return c//d
            return a//b
        elseif x > mediant
            (a, b) = (a + c, b + d)
        else
            (c, d) = (a + c, b + d)
        end
        b + d > max_denominator && break
    end
    return b > max_denominator ? c//d : a//b
end;
```


```julia
x = 1/3
println((Rational(x), float(Rational(x))))
println((Rational2(x), float(Rational2(x))))
```

    (6004799503160661//18014398509481984, 0.3333333333333333)
    (1//3, 0.3333333333333333)



```julia
x = 12.345555555555555
println((Rational(x), float(Rational(x))))
println((Rational2(x), float(Rational2(x))))
```

    (6949929924960219//562949953421312, 12.345555555555555)
    (113468//9191, 12.345555434664346)
『時間』は作るもの。

## はじめに
最近周りで、「〇〇したいけど、時間がないんだよね〜」と言っている人をよく見かける。
〇〇とは、副業だったり、転職だったり、結婚準備だったり人それぞれ。
「時間がない」と言っている人ほど、休日に何をしているか聞けば、Youtubeを永遠に見ていたり、SNSをチェックし続けていたりしている。
それなのに、大きな夢ばかり語っている人を見て、自分はこうなってはいけないと密かに感じたため、自分を律するためにも、今回は **『時間』は作るもの**というテーマで書いていこうと思う。

:::note warn
**※今回記載している『時間がないと言っている人』=『時間が作れるのに言い訳をしている人』のことを指しています。**
 育児・介護等本当に忙しい人のことではありませんので、ご了承ください。
 また、睡眠時間や食事の時間等、生命維持に必要な時間を削ってまで時間を作れという意味でもありません。
:::


## 「〇〇したいけど、時間がない」と言い訳している人の特徴
**【特徴】**
・そもそもやりたいはずの〇〇への熱量と動機が少ない。
・周りに頑張っている人がいない。
・計画を立てない。
・他責思考
など、、

　正直、そんなに時間がないと思うのだったら言わなければいいのに、、と思う反面、**その逆をやれば自分にいい影響があるのでは**ないかという結論に至りました。
 
:::note info
**【特徴の逆】**
・やりたい〇〇の動機を考えて、モチベーションをあげる。
・頑張っている人を探したり、頑張っている人が多いコミュニティに所属する。
・優先順位を考えて、計画を立てる。
・自責思考
:::

## 「時間がない」と感じるのはなぜ？
**自分の時間の使い方を整理できていないから**ではないだろうか。

もしかしたら、時間の使い方を整理できていない人の方が多いかもしれないし、そもそも時間の使い方を整理する必要があると感じていない人の方が多いかもしれない。

もちろん、はじめに例に挙げたYoutubeを見ること、SNSをチェックすることが必ずしも悪いとは思わないし、リフレッシュのために必要な時もある。

ただ、デジタルコンテンツが普及している世の中では、エンドレスで見続ける工夫がデジタルコンテンツ内でされており、それについハマってしまう人も多いと思う。(私もハマりかける。)

:::note info
自分が使っている時間の配分を書き出し、それが**本当に必要なことなのか、整理すること**が大事。
:::


## 時間がないからできない=優先順位が低い
仕事で上司から、「これやっといて」と緊急で言われた時、「時間がないのでできません」という部下は最悪だ・・
恋愛においても、「ここに一緒に行きたい」というパートナーからの誘いに、「時間がないから無理」という相手は別れた方がいい。

時間がないならないなりに、代案を立てたり、調整だってできるはず。

それさえできないのであれば、時間がないからできないということは、**『優先順位が低い』と自ら言っているようなものだと思う。**


:::note info
**時間は優先順位に沿って調整すれば、いくらでも作れる。**
:::


## 時間は作るもの
大きな結果を残している人は、
**・優先順位の付け方が上手
・時間の使い方が上手
・自分はこうなりたいという軸がある**
という共通点があるように思う。

:::note info
本当に結果を残したければ、**なりたい自分の軸を持ち、『時間は作るもの』という意識を持つことが大事**だと思う。
:::
Unity学習記録 #006 繰り返し（foreach文）

# 繰り返しに使用される制御構文
繰り返しに使用される構文は4つです。
・for文（繰り返す回数が事前に分かっているとき）
・foreach文（配列やリストの要素を順番に処理していくとき）
・while文（繰り返す回数が分からないので、条件がtrueの間は繰り返す）
・do while（条件の判定がループ処理の最後なので、falseでもその回の処理は実行される）

繰り返し処理の中で、よく使われる予約語２つ
・continue（特定の条件を満たした時のループ処理をスキップ）
・break（特定の条件を満たした時にループ処理を終了）

今回はforeach文を学習していきます。

## foreach文
foreachの基本的な書き方です
```csharp
foreach (変数名 in コレクション）)
{
    //処理したい内容をここに記述
}
```
※コレクション：配列やリストを総称した呼び方
実際の数値を使ってサンプルコードを書いてみます。
```csharp
string[] weeks = new string[]{ "月", "火", "水", "木", "金" };

foreach (string week in weeks)
{
    Debug.Log(week);
}
```
上記のコードを実行すると、weeksという配列に格納されている要素の数だけ繰り返し処理が実行されます。ループ毎に前から順に要素が取り出されて変数 "week" に代入され、この値をコンソールに出力しています。
<br>

上記のサンプルコードをfor文で記述してみます。
```csharp
//for文で同じ処理をしてみる
string[] weeks = new string[]{ "月", "火", "水", "木", "金" };

for (int i = 0; i < 5; i++)
{
    Debug.Log(weeks[i]);
}
```
for文でも同じように宣言された変数から同じ結果を出力できました。コードをもう少し詳しくみてみると、上記のfor文で書いたコードの場合、配列データの要素数が固定さていればいいですが、要素数が変わった場合に全ての要素に同じ処理をすることができません。

<strong>配列データの全ての要素に繰り返し処理を行いたい場合</strong>はforeach文が便利です。
要素数が変わったとしても後からforeach文を修正する必要はなく、全ての要素に同じ処理ができるのが特徴です。

しかし、要素数が変化する場合でもfor文で対応できます。

```csharp
string[] weeks = new string[] { "月", "火", "水", "木", "金" };

for (int i = 0; i < weeks.Length; i++)
{
    Debug.Log(weeks[i]);
}
```
上記のコードでは配列の要素数を調べてfor文で使用しています。
このように記述することで要素数に合わせて繰り返す回数も決まるので汎用性が高くなります。
このようにシステムを拡張していくことで、ほとんどの繰り返し処理はfor文で組み立てることができる印象です。
しかし拡張していくほどコードが複雑になってしまいますので注意が必要です。

ここからはforeach文を使ったサンプルコードいくつかを書いてみます。
```csharp
// 配列要素の合計値を計算
int[] numbers = new int[] { 1, 2, 3, 4, 5 };
int sum = 0;

foreach (int number in numbers)
{
    sum += number;
}
Debug.Log(sum);
```

```csharp
// 配列から"都"を含む要素を抽出
string[] names = new string[] { "大阪府", "京都府", "東京都", "神奈川県", "千葉県"};
string str = "都";
foreach (string name in names)
{
    if (name.Contains(str))
    {
        Debug.Log(name);
    }
}
```

```csharp
// リスト要素を別のリストに追加
List<int> numbers1 = new List<int>() { 1, 2, 3, 4, 5 };
List<int> numbers2 = new List<int>() { -3, -2, -1, 0};

foreach (int number in numbers1)
{
    numbers2.Add(number); //リストの最後に要素を追加
}

foreach (int n in numbers2) Debug.Log(n); //更新された要素の確認
```
for文の汎用性が高いので、どのサンプルコードもfor文で書き換えできそうではありますが、配列やリストのデータに含まれる全ての要素に対して繰り返し処理を行う場合はforeach文で記述した方がシンプルに記述できます。

今回は使用しましませんでしたが、foreach文でもループのスキップ（continue）やループの終了（break）を使うことができます。
開発生産性Conference 2024 1日目イベントレポート

## この記事は何？
開発生産性Conference 2024 1日目のイベントレポートです。

途中からの参加になったこともあり、イベント全体というよりも私の体験を中心に書きます。

## イベント概要

◆日時
2024年6月28日(金)、29日(土)

※本記事は1日目について取り上げます

◆場所
虎ノ門ヒルズフォーラム（東京都）

◆公式サイト

https://dev-productivity-con.findy-code.io/2024

## 私が体験したこと

福岡から東京への移動のため、午後からの参加となりました。限られた時間でしたが、充実した体験ができました。

- 聴講したセッション
    - 「開発とQAのタッグで実現するこれからの開発生産性向上」
    - 「開発組織の生産性を加速させる: 継続的価値提供を実現する文化と仕組み」
    - 「開発トップのマネジメント：採用からオンボーディングで始まる一貫した生産性向上戦略」
- 回った協賛企業のブース
    - 全ての企業のブースを回ることができました

## 特筆すべき体験

Qiitaさんのブースでご挨拶できたのがとても嬉しかったです。

このQiita投稿マラソンに参加させてもらっていること、アウトプットの場を提供いただいていることについてお話できました。

運営に関わっている方々に直接お礼を言えたのがとてもよかったです。

## データサイエンティストとしての所感

開発生産性に関するカンファレンスでしたが、あらゆるところでAIについて当たり前のように話されていました。

例えば、「生産性×AI」「テスト×AI」「品質×AI」など、AIが開発プロセスの各段階に統合されている現状を目の当たりにしました。

データサイエンティストとして、AIの広い活用とその結果に驚きを感じました。

## おわりに

この記事では、開発生産性Conference 2024の1日目についてレポートしました。

明日6/29には2日目があります。
興味を持たれた方は参加してみてください。

それでは。
SAP S/4 HANA 販売管理（SD）基本知識３：組織とマスタ（得意先マスタ・条件マスタ）

## 得意先マスタ
- 得意先マスタは一から登録することも、既存のコードを参照コピーして登録することも可能です。
- 得意先マスタは4種類のデータとタブで構成されます。

![得意先マスタ１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/6134dba7-68c1-aec6-cfc8-0f6db0ebebba.png)

【一般データ】
- 名称や住所等、得意先に関する基本的な情報を登録・管理します。
- 得意先につき１つだけ登録し、全ての組織構造で共通で使用されます。

【会社コードデータ】
- 売掛金の勘定科目、支払条件等、会計業務に関する情報を登録・管理します。
- 会社コードごとに登録し、該当の会社コードにおいてのみ使用されます。テンプレートでは会社コードは１つだけです。

【販売エリアデータ】
- 品目の販売・出荷・請求に関わる情報を登録・管理します。例えば、回収条件や、課税/非課税といった税の情報、出荷先の情報などが挙げられます。
- 販売エリア（販売組織＋流通チャネル＋製品部門）ごとに登録し、該当の組織構造においてのみ使用されます。

【締め請求データ】
- SAPでは日本独自機能として、締め請求の機能が用意されています。この機能を使用するための情報を登録・管理します。
- 締め請求の対象でない得意先については、このデータを登録する必要はありません。
得意先につき1つだけ登録します。

 ※以下に得意先マスタの主要なデータと項目について説明します。

### 一般データ 住所タブ
- ここでは、一般データ　住所タブの主要な項目について説明します。

![得意先マスタ２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/6cb15a1f-3213-2801-e716-69a73a509ffb.png)

### 会社コードデータ　勘定コード管理タブ
- ここでは、会社コードデータ　勘定コード管理タブの主要な項目について説明します。
- 会社コードデータの設定内容は、経理部門側の要件によって決まります。ここのデータは、経理部門が登録するケースもあります。

![会社コードデータ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/83a322d0-af31-7cd9-abf4-94b5d4f976ff.png)

### 販売エリアデータ　受注タブ
- ここでは、販売エリアデータ　受注タブの主要な項目について説明します。

![販売エリア１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/15183dc8-8449-8de4-dd19-7fa57f09d47c.png)

### 販売エリアデータ　出荷タブ
- ここでは、販売エリアデータ　出荷タブの主要な項目について説明します。

![販売エリア２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/c2f65632-5715-92a4-da84-bd74f22329c0.png)

### 販売エリアデータ　取引先機能タブ
- ここでは、販売エリアデータ　取引先機能タブの主要な項目について説明します。

![販売エリア３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/9d4e3649-fb2c-9a43-23a8-16c14a144a81.png)

## 条件マスタ（価格）
- ここでは条件マスタ（価格）の説明を行います。
- 下図の例では、品目ごとの価格よりも得意先＋品目の価格が優先されて、伝票上に自動提案されます。

![条件マスタ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/e55cf44c-c5db-a99b-b217-1079e632dbfb.png)
Scala 3でケースクラスの詰め替えを簡易的に行う

# 概要

Scala 3では、ケースクラス間のデータの詰め替えを非常に簡単に行うことができます。
これは、ケースクラスが`Product`を継承していることと、Scala 3の`Mirror`を使用することにより実現できます。

# 詰め替えの実装

以下のコード例では、ケースクラス`Hoge`のインスタンスをケースクラス`Fuga`のインスタンスに変換する方法を示します。

## ケースクラスの定義

まず、変換元と変換先のケースクラスを定義します。

```scala
case class Hoge(v1: Int, v2: String)
case class Fuga(v3: Int, v4: String)
```

## 変換ロジックの実装

次に、`CaseClassTransformer`オブジェクトを定義し、変換を行う`transform`メソッドを実装します。

```scala
import scala.deriving.Mirror

object CaseClassTransformer:
  def transform[From <: Product, To](from: From)(using mirrorTo: Mirror.ProductOf[To]): To =
    mirrorTo.fromProduct(from)
```

この`transform`メソッドは、以下のように動作します。

- 引数`from`は`Product`を継承する型（今回の事例ですとケースクラス）です。
- `using mirrorTo: Mirror.ProductOf[To]`により、変換先の型`To`に対応する`Mirror`をコンパイル時に取得します。
- `mirrorTo.fromProduct(from)`を呼び出すことで、`from`の要素を用いて`To`のインスタンスを生成します。

## 実行例

最後に、`main`メソッドで変換を実行し、その結果を確認します。

```scala
@main def main(): Unit =
  val hoge = Hoge(42, "hoge")
  val fuga: Fuga = CaseClassTransformer.transform[Hoge, Fuga](hoge)
  println(fuga) // Fuga(42, hoge)
```

このコードを実行すると、`Hoge(42, "hoge")`が`Fuga(42, "hoge")`に変換されることが確認できます。

# まとめ

`Mirror`を使用することで、ケースクラス間のデータの詰め替えを簡単に行うことができました。
Excel VBA 条件に一致する日付のみを転記する

## なんかリクエストあったので

木曜日の日付、金曜日の日付、祝日の前日の日付のみを手動で入力しているのを自動化したいというリクエストがありました。

## 事前準備
シートに祝日リストと、一時的に日付を格納する場所を作ります。
曜日はT列に TEXT 関数で自動取得します。
S列はマクロ実行時に日付が自動で入るので、空白で大丈夫です。
L列、M列の欄はマクロ実行前に開始日と終了日を手入力します。
スヌーピーはマクロボタンです。

![日付1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/148a8b73-3f78-7a69-05b5-2c530d2073ba.png)

U列に、祝日なら"祝"が入る式を入れます。
![日付3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/806d57fc-94bb-2f37-89f7-ce32e7d84320.png)


## 印刷シート（マクロ実行前）

B列とG列の7から37行目までに日付を入れる帳票になっています。

![日付2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/e1011f6f-bc13-cec8-fefa-d996a3b9bccb.png)

## プロシージャと実行結果

"なんかシート名"は実際のシート名に書き換えてください。
```vb
Sub 図1_Click()

  Dim ws As Worksheet
  Dim StartDay As Range
  Dim LastDay As Range
  Dim Period As Date
  Dim SpecificDay As Date
  Dim i As Long, j As Long, k As Long, LastRowS As Long
  
  Set ws = Sheets("なんかシート名")
  Set StartDay = ws.Range("L6")
  Set LastDay = ws.Range("M6")

  LastRowS = ws.Cells(Rows.Count, 19).End(xlUp).Row 'S列の最終行取得

  'B列からG列、S列を初期化
  ws.Range("B5").CurrentRegion.Offset(2, 0).ClearContents
  
  For i = 7 To LastRowS
    ws.Cells(i, 19).ClearContents
  Next i
  
  i = 7      '開始日から終了日まですべての日付をS列に書き出す
  For Period = StartDay To LastDay
    ws.Cells(i, 19) = Period
    i = i + 1
  Next Period
  
  LastRowS = ws.Cells(Rows.Count, 19).End(xlUp).Row
  
  j = 7
  For k = 7 To LastRowS 'S列に書き出した日付を特定の条件のみB列に突っ込む
    If ws.Cells(k, 20) = "木" Or ws.Cells(k, 20) = "金" Or ws.Cells(k + 1, 21) = "祝" Then
        ws.Cells(j, 2) = ws.Cells(k, 19)
        ws.Cells(j, 7) = ws.Cells(k, 19)
        j = j + 1
    End If
  Next k
  
  ws.Range("B38").ClearContents
  ws.Range("G38").ClearContents
  
End Sub
```

実行結果
![日付4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/63aac014-aaa7-72c0-da22-f8950d53c184.png)
![日付5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/e7925c69-d049-2f2a-4e84-5cf0979d7b27.png)
![日付6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/296f3102-4613-9e85-f53d-cb4980076c2f.png)
【便利】サイトのサーバのIPやドメインなどを分析できるツール

最近はかなり便利なサイトの分析ツールが普及していますねー
Wappalyzerなんかもすごく便利でいつも使っています。
と、やはりこの業界にいると気になる、どんな技術が使われているのか。
### 今回は単に紹介なので自分が作ったものではありません。

# 今回はこのDNSlyticsを見ていきましょう
![一部の例 引用 DNSLytics](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819700/353033de-0845-0bae-a791-70069d39bc90.png)
※画像はイメージです
## これは何ぞやということですけど、
簡単にご説明すると、
### サイトのホスティングされているサーバやリバースプロキシのドメインやIPの情報がわかる
ツールです。

### 何がすごいのか
これ、な、な、ななんと！
# この拡張機能のポップアップの中ですぐにWhoisまで調べることができるのです！
...

だいたいの拡張機能が、Whoisの検索サイトにパラメータ渡して表示するだけのものもある一方で、個人的には使いやすいと感じました！

その他にも機能としては
```
・ホスティングされているIPアドレス
    IPv4/IPv6
・ホスティングされているサーバのインターネットプロバイダー
    プロバイダ名
    おおよその場所のマップ
    プロバイダの持つIPアドレス番号帯(AS)のWhois
・ホスティングされているドメイン
    DNSのレコード
    Whois ←便利
・自分のIPアドレス
    DNSBL(おそらくスパムのブラックリストに載っているか確認できそう)
    Whois
```

と、めちゃめちゃ機能があります！

ちなみにインストールはChromeウェブストアよりできるようです
おそらく「IP Address and Domain Information」で検索すれば出てきます

# 他の人のソフトを紹介するときには書きますが、
利用はもちろんそのサービスの規約を確認いただき、自己責任でお願いします！
【OpenCV】画像のy軸の方向は逆

お疲れ様です。秋並です。

「一般的な2次元座標系[^1]」と違い、「画像の座標系」はy軸の方向が逆向きになっています。

また、その関係で、原点位置が左上になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/910ac74b-87e5-c486-62bc-a65af2b633ff.png)

OpenCVとかで初めて画像処理を扱ったときにありがちなミスなのでご注意ください。

[^1]: ここでいう「一般的な2次元座標系」とは、図の左側に示すような座標系を指します
最尤推定法を理解する

# はじめに
備忘録として最尤推定法をまとめる。

# 推定とは
母集団のある情報を標本から求めること。日本人男性の平均身長を求めたい時に、ランダムに30人選んでその平均身長を求めるなど、ある集合の一部分を見て元の集合の情報を予想すること。このとき、母集団と標本は次のようになる。
母集団：日本人の男性全員
標本：ランダムに選ばれた日本人男性30人
推定には複数のアプローチがあり、今回紹介する最尤推定法（最尤法）もその一つである。
また、母集団の平均や分散をそれぞれ母平均、母分散とよび、標本の平均や分散をそれぞれ標本平均、標本分散と呼ぶ。

# 最尤推定法の気持ち
母集団のあるデータ$x$（母平均や母分散）はそのデータの得られる確率$L(x)$が最大値になる時の$x$であるはずだという考えが最尤推定法の気持ちである。つまり、確率が高い=尤$^{もっと}$もらしいという考えである。この時、$L(x)$を尤度関数といい、$L(x)$の値を尤度と呼ぶ。

# 実際に最尤推定してみる
実際に正規分布に独立して従うデータの平均値$\mu$と分散$v$を最尤推定法を用いて推定してみる。
$\mu,v$が得られる確率を$L(\mu,v)$、正規分布の確率密度関数を$f(x)$とすると$L(\mu,v)$は$f(x)$を用いて次のようになる。
``` math
L(\mu,v) = \prod_{i=1}^n f(x_i)
```
方針は$L(\mu,v)$を最大にする$\mu$と$v$を求めることだが、これは$L(\mu,v)$の対数をとった$\log L(\mu,v)$が最大になる$\mu$と$v$を求めることと同じである。対数を取ることで総積記号$\Pi$を総和記号$\sum$に置き換えることができ、後の微分が簡単になる。$l(\mu,v)=\log L(\mu,v)$とし、$l(\mu,v)$を対数尤度関数と呼ぶ。
``` math
\mathrm{argmax}\,L(\mu,v) = \prod_{i=1}^n f(x_i)
```
``` math
\begin{align}
&=\mathrm{argmax}\, l(\mu,v) \\
&= \mathrm{argmax}\, \sum_{i=1}^{n} \mathrm{log}\,f(x_i)\\
\end{align}
```
正規分布の密度関数$f(x)$に次式を代入し、整理すると最大化する$l(\mu,v)$は以下のようになる。
``` math
f(x) = \frac{1}{\sqrt{2\pi v}} \exp \Bigr\{-\frac{(x_i - \mu)^2}{2v}\Bigr\}
```
``` math
l(\mu, v) = -\frac{n}{2}\,\mathrm{log}(2\pi v)-\frac{1}{2v}\sum_{i=1}^{n}(x_i-\mu)^2
```
ここで、$\mu$に依存するのは2項目のみである。
``` math
\begin{align}
\sum_{i=1}^{n} (x_i-\mu)^2&=\sum_{i=1}^{n}\,(x_i-\bar{x}+\bar{x}+\mu)^2\\
&= \sum_{i=1}^{n}\,(x_i-\bar{x})^2 - 2(\,\sum_{i=1}^{n}x_i-n\bar{x}\,)+n(\bar{x}-\mu)^2
\end{align}
```
よって、$v$を固定して考えた時に対数尤度関数$l(\mu,v)$を最大化する$\mu$は$\mu = \bar{x}$である。$l(\mu,v)$に$\mu = \bar{x}$を代入して、$v$で微分してその増減を調べると、$v = \frac{1}{n} \sum_{i=1}^{n}(x_i-\bar{x})^2$で最大値を得られることがわかる。
以上より、正規分布に独立して従うとき、母集団の平均・分散は標本平均・標本分散と一致する。
ちなみに、この結果はよく利用するので覚えておいた方が良い。
プロジェクトにおけるサービス要求

### サービス要求について

サービス要求とは、ITサービスに関する情報や支援、あるいは標準的な変更やアクセス権限の付与などを求める利用者からのリクエストを指します。

### サービス要求の例と対応

サービス要求の内容では「インシデント」が上がります。
サービス要求とインシデントとの違いは事業に影響を与えるような内容はインシデントになります。
不正アクセスや業務アプリケーションの不具合はインシデントにあたります。

サービス要求の具体的な例には以下のようなものがあります。

* パスワードの再発行やリセット
* サービスの操作説明やヘルプ
* ソフトウェアのインストール

「サービスの操作説明やヘルプ」がサービス要求として上がった場合、
なぜその問題（原因）がでたのか特定します。
例えば、「ユーザーがサービスに慣れていない」という原因と、「アクセス権限が与えられていない」という原因とでは、対処法は全く異なります。
操作マニュアルを送る対応以外にもソフトウェアの講習会を開くといった対策も考えられます。

### サービス要求管理の重要性

サービス要求を適切に管理することは、以下の点において重要です。

利用者満足度の向上: サービス要求を迅速かつ丁寧に処理することで、利用者満足度を向上させることができます。

生産性の向上: 利用者が必要なサービスをすぐに利用できることで、生産性を向上させることができます。
【入門】Reactってなに？

## インデックス

1. [Reactってなに？](#reactってなに)
2. [なぜReactを使うの？](#なぜreactを使うの)
3. [Reactを始める準備](#reactを始める準備)
4. [基本のReactコンポーネント](#基本のreactコンポーネント)
5. [Reactでの状態管理](#reactでの状態管理)
6. [イベントの処理](#イベントの処理)
7. [まとめ](#まとめ)

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806587/00bd9b74-1321-dc90-e5f6-fbeca72cc27c.png)

## 1. Reactってなに？
Reactは、ウェブサイトやアプリを作るためのツールです。Reactを使うと、コンポーネントという小さな部品を組み合わせて画面を作れます。これにより、いろんな人が作ったコンポーネントを簡単に使えるようになります。ReactのコンポーネントはJavaScriptという言語で書かれていて、JSXという特別な書き方を使って作ります。

[▲インデックスに戻る](#インデックス)

## 2. なぜReactを使うの？
Reactを使う理由はいくつかあります：

- **再利用できる**：一度作った部品を何度も使えるので、時間が節約できます。
- **速い**：画面全体ではなく、変わった部分だけを更新するので、速く動きます。
- **人気がある**：たくさんの人が使っているので、困ったときに情報を見つけやすいです。
- **いろんな場所で使える**：ウェブサイトやスマホのアプリを作れます。

[▲インデックスに戻る](#インデックス)

## 3. Reactを始める準備
Reactを始めるためには、以下のことを準備します：

1. **Node.jsとnpmのインストール**
公式サイトからインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806587/df2b8be6-8c38-e498-be7c-f76104c89edf.png)

[Node.js公式サイト](https://nodejs.jp/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806587/7e3e36d2-5469-4d08-4e2b-3f440c8c5f1d.png)

2. **Reactプロジェクトの作成**
以下のコマンドを使って新しいReactプロジェクトを作ります。

 ```bash
   npx create-react-app my-app
   cd my-app
   npm start
 ```

3. **エディタのセットアップ**
Visual Studio Codeなどのコードを書くソフトをインストールし、Reactの開発に便利なプラグインを追加します。

[▲インデックスに戻る](#インデックス)

## 4. 基本のReactコンポーネント
Reactでは、コンポーネントという小さな部品を組み合わせてウェブサイトを作ります。
以下は最も基本的なコンポーネントの例です。

```jsx
import React from 'react';

function Hello() {
  return <h1>Hello, World!</h1>;
}

export default Hello;
```

このコードは、「Hello, World!」と表示するシンプルなコンポーネントです。

[▲インデックスに戻る](#インデックス)

## 5. Reactでの状態管理
Reactでは、コンポーネントが持つデータ（状態）を管理できます。
以下は、状態を持つコンポーネントの例です。

```jsx
import React, { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

export default Counter;
```

このコンポーネントでは、ボタンをクリックするたびにカウントが増えます。

[▲インデックスに戻る](#インデックス)

## 6. イベントの処理
Reactでは、ユーザーが何か操作をしたときのイベントを簡単に処理できます。例えば、ボタンがクリックされたときの処理を以下のように書けます。

```jsx
import React from 'react';

function ClickButton() {
  function handleClick() {
    alert('Button was clicked!');
  }

  return (
    <button onClick={handleClick}>
      Click me
    </button>
  );
}

export default ClickButton;
```

このコードでは、ボタンがクリックされたときにアラートが表示されます。

[▲インデックスに戻る](#インデックス)

## 7. まとめ
Reactは、ウェブサイトやアプリを作るための便利なツールです。コンポーネントを使って再利用できる部品を作ったり、効率的に画面を更新したりできます。多くの人が使っているので、たくさんの情報とサポートがあります。

[▲インデックスに戻る](#インデックス)
解説放送 雑談部分の時間まとめ

随時更新していきます
# 一覧
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3701202/b10a3786-d73c-ca8b-792f-731ffdcd3294.png)
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3701202/b6163a16-67f9-bf0e-9992-6a0408272b70.png)


- ABC159(多項式の話) https://www.youtube.com/live/lTjWiIRyIdg?si=t2b7NtNB384hlggb&t=9038
- ABC161 https://www.youtube.com/live/q-mrqE2Q7JQ?si=ys5awXQipR1ajE63&t=7678
- ABC173(Tシャツ) https://www.youtube.com/live/IMwigbYzLbI?si=hWuF--_rrylvRsKd&t=7710
- ABC174(相撲) https://www.youtube.com/live/h0MGG8rxrYc?si=dylQguwZ5gi12Bfe&t=9813
- ABC196(地震が落ち着くまで麦茶を飲む) https://www.youtube.com/live/3W_dK_pNOc4?si=B_ciJE-Rfr8jJtqm&t=3380
- ABC204(GCJ) https://www.youtube.com/live/ZqFtoX-W1Bk?feature=shared&t=10350
- ABC234(マクロの話) https://www.youtube.com/live/xEQwyKJIfuE?si=nLzRxPCwhdZMqjlr&t=10372
- ABC343(四国旅行) https://www.youtube.com/live/8W_eI0tTbfU?si=hnIbJpwdDgvOJsM6&t=9683
- ABC358(淡路島に家族旅行) https://www.youtube.com/live/Uxd2qSY6KDo?si=Cy4NUibqOJ7azWv9&t=9193
- ABC359(AtCoder社作問合宿) https://www.youtube.com/live/MTcB05vkav8?si=9jt24op2Uw_3Fgol&t=8984
- ABC362(JOI) https://www.youtube.com/live/AsTnBXWeqsE?si=zVXd313iXabIUapl&t=13153
- ABC365(ディズニーに社員旅行) https://www.youtube.com/live/aD0oPDIhSGc?si=UqpNKT_oJSxWHRH1&t=13204


## おもしろいやつ
- めぐる式二分探索ちゃんが脳裏によぎる https://t.co/cLkPWmQL9K
- 回転 https://www.youtube.com/live/y7LtMbF4lzQ?feature=shared&t=8796