OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】ソートされた二乗配列

# 作るもの
与えられた整数の配列を二乗して、それらの値を昇順でソートした新しい配列を返す関数。

# 実装
```python:sortedSquaredArray.py
# sortedSquaredArray関数の定義。整数の配列を受け取り、二乗して昇順にソートした新しい配列を返す。
def sortedSquaredArray(array):
    # sortedSquaresという名前の新しいリストを作成し、arrayと同じ長さで0で初期化する。
    sortedSquares = [0 for _ in array]

    # arrayの要素を順番に処理するためのforループ
    for idx in range(len(array)):
        # 現在処理中の要素の値をvalue変数に代入する。
        value = array[idx]

        # sortedSquaresリストの対応する位置にvalueの二乗を格納する。
        sortedSquares[idx] = value * value

    # すべての要素の二乗がsortedSquaresリストに格納されたら、リストを昇順でソートする。
    sortedSquares.sort()

    # ソートされたsortedSquaresリストを返す。
    return sortedSquares

# テスト
if __name__ == "__main__":
    array = [-4, -2, 0, 2, 4]
    print(sortedSquaredArray(array))

```

# 参考
https://www.algoexpert.io
MySQL構文（Group By）

## 初めに
Group Byについて構文例を作成しました。

## 環境
| 開発環境   |バージョン    |
|-----------|------------|
| __MySQL__ | ---------- |

## 例
__Booksテーブル__
| Book_ID   | Book_Title | Author_ID |
|-----------|------------|------------| 
| 1 | ノルウェイの森 | 1 | 
| 2 | 1Q84 | 1 | 
| 3 | 舞姫 | 2 | 
| 4 | 重力ピエロ | 3 | 
| 5 | 母の遺産  | 4 | 

__Authorsテーブル__
| Author_ID   | Author_Name |
|-----------|------------|
| 1 | 村上春樹 |
| 2 | 三浦しをん |
| 3 | 伊坂幸太郎 | 
| 4 | 川上弘美 | 

```sql:
SELECT 
    Authors.Author_ID, 
    Authors.Author_Name, 
    COUNT(Books.Book_ID) AS NumberOfBooks
FROM Authors 
LEFT JOIN Books
ON Authors.Author_ID = Books.Author_ID
GROUP BY Authors.Author_ID, Authors.Author_Name;
```

__結果__
| Author_ID   | Author_Name | NumberOfBooks |
|-----------|------------|------------| 
| 1 | 村上春樹 | 2 | 
| 2 | 三浦しをん | 1 | 
| 3 | 伊坂幸太郎 | 1 | 
| 4 | 川上弘美 | 1 |


## 最後に
最後まで閲覧いただきありがとうございました。
ご意見、ご指摘ありましたら、コメントお願いいたします。
MySQL構文（LEFT JOIN）

## 初めに
LEFT JOINについてコピペ用に構文を作成しました。

## 環境
| 開発環境   |バージョン    |
|-----------|------------|
| __MySQL__ | ---------- |

## テンプレート
```sql:LEFT JOIN
SELECT table_A.column_A_1, table_B.column_B_1
FROM table_A
LEFT JOIN table_B 
ON table_B.column_B_1 = table_A.column_A_1
WHERE table_B.column_B_1 = XXX;
```

## 例
__Booksテーブル__
| Book_ID   | Book_Title | Author_ID |
|-----------|------------|------------| 
| 1 | ノルウェイの森 | 1 | 
| 2 | 1Q84 | 1 | 
| 3 | 舞姫 | 2 | 
| 4 | 重力ピエロ | 3 | 

__Authorsテーブル__
| Author_ID   | Author_Name |
|-----------|------------|
| 1 | 村上春樹 |
| 2 | 三浦しをん |
| 3 | 伊坂幸太郎 | 
| 4 | 川上弘美 | 

```sql:
SELECT Authors.Author_ID, Authors.Author_Name, Books.Book_Title
FROM Authors 
LEFT JOIN Books
ON Authors.Author_ID = Books.Author_ID;
```

__結果__
| Author_ID   | Author_Name | Book_Title |
|-----------|------------|------------| 
| 1 | 村上春樹 | ノルウェイの森 | 
| 1 | 村上春樹 | 1Q84 | 
| 2 | 三浦しをん | 舞姫 | 
| 3 | 伊坂幸太郎 | 重力ピエロ | 
| 4 | 川上弘美 | NULL |


## 最後に
最後まで閲覧いただきありがとうございました。
ご意見、ご指摘ありましたら、コメントお願いいたします。
なぜ DDD(ドメイン駆動設計) を採用するのか

# この記事の背景

現職では DDD を採用しており、色々な方と DDD についてお話しする機会があります。

その中で、特に初学者の方はアーキテクチャに対して「なぜこんなに面倒な事をするのか？」という印象を持たれているようでした。

そこで、DDDを採用する目的について言語化してみました。
（個人の見解なので、誤りがあればぜひご指摘をmm）

# 対象読者
- 基本的な用語は覚えた方
- 見よう見まねで、ある程度コードも書いた方
- 初心に立ち返って Why を理解したい方

# DDDで実現したいこと

前提として、以下の要素を分けて考えます。

- ビジネスルール
- ビジネスルール以外の要素（例えばGUIやデータの保存など）

DDDでは ビジネスルールを反映したプログラムを重要なものと位置付けています。
なぜ重要なのでしょうか？
- システムは何らかの課題を解決するために存在しています
- 顧客のニーズの変化など、様々な要因で課題は変わっていきます
- 課題の変化に合わせて、解決手段であるビジネスルールも変わっていきます
- 課題の変更に対して素早く正確に対応できると、ビジネス(商売)としての競争力が高まります
- ビジネスルールを反映したプログラムは、課題解決のための手段を最も直接的に表現している箇所です
- 故に、これらのプログラムの品質を高めることが重要です

DDDで実現したい事を簡潔に言うと「**ビジネスルールを反映したプログラムの品質を上げたい**」となります。品質の上げ方としては、ビジネスルールを過不足なく反映することや、素早く安全に変更できる状態(保守性が高い状態)を維持すること等が挙げられます。

GUI=使い勝手もアプリケーションとしては勿論大事なのですが、相対的に見るとビジネスルールの方が大事という整理です。

DDDでは「ドメインエキスパート」「ユビキタス言語」「境界づけられたコンテキスト」など様々なワードが登場します。また、ソフトウェアアーキテクチャにおけるテクニックも色々と出てきます。これらはいずれも「目的達成のための手段の１つ」でしかないため、個別の手段に囚われて、目的を見失わないようにしましょう。


# 目的達成のための手段

メリットを感じるためには、手段についても理解を深める必要があります。
いくつか軽めに紹介します。

## レイヤードアーキテクチャ

保守性を高めるための手段です。

プログラムの構造として、ビジネスルール以外の要素(=重要でないもの)を変更した際に、ビジネスルール(=重要なもの)への影響が出てしまう状態はよろしくありません。
例えば、ドメインモデル が DBにアクセスしてデータを取得するような構造の場合、テーブルのスキーマ変更を行うと、ドメインモデルまで修正する必要が出てしまいます。

依存性逆転の法則に沿って設計し、ビジネスルールに対してビジネスルール以外の要素が依存する構造にしましょう。

## 境界づけられたコンテキスト(Boundary Context)

保守性を高めるための手段です。

同じ言葉や物であっても、場面が異なる場合は別のものとして扱いましょう。
例えば、同じ「商品」であっても「注文する」時と「在庫管理する」時では、アクターも扱うデータも異なります。注文のアクターは顧客ですが、在庫管理のアクターは社員になります。商品の金額についても、注文する時は売値で在庫管理する時は原価、といった具合に関心事が異なります。これらを１つのモデルにまとめてしまうと、顧客向けの変更が社内業務に影響を与えてしまいます。

領域の区切り方は諸説ありますが、言葉に対する認識が揃う範囲で区切るのがよいかなと思います（アクターやチームなど）。


# まとめ
- DDDを採用する目的は「ビジネスルールを反映したプログラムの品質を上げたい」から
- 手段を学ぶ際も、目的に立ち返ることが大事


# 参考文献
- エリック・エヴァンスのドメイン駆動設計
CodeIQ:フィボナッチ進数の解答

@nabetaniさんのCodeIQの問題です。
->http://nabetani.hatenablog.com/
問題とテストケースはこちらのお世話になりました。解答もあります。
->https://blog.goo.ne.jp/r-de-r/e/2bcfe50cc547fce9a9d1e570d10d548f

再帰とバックトラックを用いますと、桁の小さいほうから調べると時間がかかりますが、
大きいほうから調べてかつ枝狩りをするとメモ化の類を使わなくても一瞬で答えが出ます。

百万以下のフィボナッチ数を求めておきます。　
空のリストを用意します。
入力値の十進数からフィボナッチ数を大きい方から引いていくのですが、
ある桁でのフィボナッチ数がH、残りの十進数がNとします。
N1=N-H<0なら、リストが空ならそのままそうでなければリストに0を加えて、
Nをそのままで一つ下の桁の操作を行います。（calc/5の3番目の節）
N1>=0なら二つの方法を併用して探索を行います。（calc/5の4番目と5番目）
①N1<0の時と同じ操作を行います。
②リストに1を加えてN=N1として一つ下の桁の操作を行います。
最小値を求める場合(4番目)は①を先に、最大値を求める場合(5番目)は②を先に行います。
ただし一つ下の桁までのフィボナッチ数の合計がNより小さい場合は枝刈します。
(V>=N2の時のみ続ける)
十進数が0になれば成功です。

```Prolog
%:-initialization(start).　　　%ideone
%start.

fib(R):-fib(0,1,[],R).
fib(_,N,L,L):-N>1000000.
fib(R1,R2,L,R):-L1=[R2|L],R3 is R1+R2,fib(R2,R3,L1,R).

calc(_,0,[],L,R):-
     reverse(L,R),!.
calc(C,0,[H|T],R,RF):-
     calc(C,0,T,[0|R],RF).
calc(C,N,[H|T],R,FR):-
	 N1 is N-H,N1<0,(R==[]->R1=[];R1=[0|R]),calc(C,N,T,R1,FR).
calc(s,N,[H|T],R,FR):-
     N1 is N-H,((N2=N,(R==[]->R1=[];R1=[0|R]));
     (N2=N1,R1=[1|R])),sumlist(T,V),V>=N2,calc(s,N2,T,R1,FR).
calc(b,N,[H|T],R,FR):-
     N1 is N-H,((N2=N1,R1=[1|R]);(N2=N,(R==[]->R1=[];
     R1=[0|R]))),sumlist(T,V),V>=N2,calc(b,N2,T,R1,FR).

solve(N,R):-fib(L),calc(s,N,L,[],R1),calc(b,N,L,[],R2),R=[R2,R1],!.

start:-
     f(N,L),((solve(N,R),maplist(concat_atom,R,R1),maplist(atom_number,R1,R2))->
     (R2==L->Str=" pass ";Str=" fail ");write(fail)),write(Str),writeln(R1),fail.
start.

f(1000000,[100010100000000000101000000000,10111110101010101111101010101]).
f(999999,[100010100000000000100101010100,10111110101010101111011111111]).
f(1,[10,1]).
f(2,[100,11]).
f(3,[1000,101]).
f(832040,[100000000000000000000000000000,10101010101010101010101010101]).
f(832039,[10101010101010101010101010100,1111111111111111111111111111]).
f(129177,[10000010001000000010101000,1010111011101010111111101]).
f(636488,[10010000000000101000010000100,1101010101011011101101011011]).
f(325039,[1000000010000010001010100100,101010111010111011111111011]).
f(77037,[1000000010010000100001010,101010111101011010110111]).
f(825561,[10101010100000001000101010010,1111111110101011101111111101]).
```
git server 立てようと思って調べ始めた

g/t server構築に失敗した。

 ＜この記事は書きかけです。順次追記します。＞
 This article is not completed. I will add some words in order.

4.2 Gitサーバー - サーバー用の Git の取得
https://git-scm.com/book/ja/v2/Gitサーバー-サーバー用の-Git-の取得

```ubuntu:bash
$ git clone --bare my_project my_project.git
Cloning into bare repository 'my_project.git'...
done.
```
LinuxサーバーにGitをインストールし、WindowsからGitを使う方法

https://bacchi.me/git/git-install/

【Gitサーバー】サーバーにGitを入れてGitサーバー構築してみた【GitWeb】

https://qiita.com/ykhirao/items/c172d09943e932899c9e

Git Server

https://kb.synology.com/ja-jp/DSM/help/Git/git?version=7

# Gitbucket
https://github.com/gitbucket/gitbucket

# bit bucket

https://bitbucket.org/

$0
free plan has no monthly user cost
$0 per month

Get it now
Standard
$3
per user
$15 monthly total

Start trial
Premium
$6
per user
$30 monthly total




# Gitlab

https://about.gitlab.com/pricing/

Free
Essential features for individual users
$0
per user/month
No credit card required
Get started 
Free features:
5GB storage [1]
10GB transfer per month [2]
400 compute minutes per month [3]

5 users per top-level group [4]
Premium
Enhance team productivity and coordination
$29
Per user/month
Billed annually at $348 USD
Buy GitLab Premium
Everything from Free, plus:
Code Ownership and Protected Branches  
Merge Requests with Approval Rules  
Enterprise Agile Planning  
Advanced CI/CD  


Enterprise User and Incident Management  
Support
50GB storage [1]
100GB transfer per month [2]
10,000 compute minutes per month
Learn more about Premium 
Ultimate
Organization-wide security, compliance, and planning
$
99
per user/month
Billed annually at $1188 USD

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong. 


# 文書履歴(document history)
ver. 0.02 ありがとう追記　　20230805

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
Vite, React, TypeScriptでの環境変数のハンドリング方法！


### 〜ステージングと本番環境をきちんと分けよう〜

## 目次
1. [はじめに](#intro)
2. [環境変数の設定](#setting-env-vars)
3. [npm scriptsの更新](#update-npm-scripts)
4. [Viteで環境変数を使用する方法](#using-env-vars-in-vite)
5. [Gitで.envファイルを無視する方法](#ignoring-env-files-in-git)
6. [まとめ](#conclusion)

<a id="intro"></a>
## はじめに
Vite, React, TypeScriptでのプロジェクトを管理しているとき、開発、ステージング、本番といった環境ごとに異なる設定をする必要があります。今回の記事では、これらの環境ごとに異なる環境変数を設定する方法を解説します。

<a id="setting-env-vars"></a>
## 環境変数の設定
まず、プロジェクトルートに環境ごとの`.env`ファイルを作成します：

- `.env.development.local`：開発環境用の環境変数をここに設定します。
- `.env.staging.local`：ステージング環境用の環境変数をここに設定します。
- `.env.production.local`：本番環境用の環境変数をここに設定します。

各ファイルには、`VITE_`というプレフィクスをつけた環境変数を設定します。例えば、以下のように設定します：

```dotenv
VITE_APP_TITLE="My Cool App"
```

<a id="update-npm-scripts"></a>
## npm scriptsの更新
次に、`package.json`の`scripts`セクションを更新します：

```json
"scripts": {
    "dev": "vite --mode development & npm run sv",
    "build:staging": "vite build --mode staging",
    "build:prod": "vite build --mode production",
    "vite": "vite",
    "sv": "php -S localhost:8080",
    "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
    "preview": "vite preview",
    "api:build": "aspida"
}
```

これで、`npm run dev`を実行すると `.env.development.local` ファイルがロードされ、`npm run build:staging`を実行すると `.env.staging.local` ファイルがロードされ、`npm run build:prod`を実行すると `.env.production.local` ファイルがロードされます。

<a id="using-env-vars-in-vite"></a>
## Viteで環境変数を使用する方法
Viteでは、環境変数をアプリケーションの中で `import.meta.env.VITE_APP_TITLE` のように参照することができます。以下にそのサンプルコードを示します：

```jsx
import React from "react";

const AppTitle = () => (
    <h1>{import.meta.env.VITE_APP_TITLE}</h1>
);

export default AppTitle;
```

<a id="ignoring-env-files-in-git"></a>
## Gitで.envファイルを無視する方法
最後に、これらの `.env` ファイルを Git のバージョン管理から除外します。これにより、セキュリティ上の問題を防ぐことができます。`.gitignore` ファイルに以下の行を追加します：

```
.env*.local
```

これで、`.env`で始まり、`.local`で終わるすべてのファイルがバージョン管理から除外されます。

<a id="conclusion"></a>
## まとめ
この記事では、Vite, React, TypeScriptプロジェクトで開発、ステージング、本番環境ごとに異なる環境変数を設定する方法を解説しました。この方法を使えば、環境ごとに異なる設定を簡単に管理することができます。

---

以上、ご覧いただきありがとうございました！質問やコメントがあれば、お気軽にコメント欄にお書きください。
あなたの恋愛のお悩み気軽にAIで解決してみませんか？「AI恋愛コンサルタント」のご紹介


![PR用画像 (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475516/92153e35-0b08-94dc-a342-d3cefd52d65f.png)


https://lin.ee/EcQhb5g

上記のQRコードorリンクをクリックして、LINE公式アカウントとして追加していただくことで、無料ですぐにサービスがご利用いただけます。

## サービス紹介

「AI恋愛コンサルタント」は、AIを活用した恋愛相談サービスです。

### <font color="HotPink">音声メッセージで親身にアドバイス。他にはないモテ分析で理想の恋愛へ。</font>

#### 独自にモテに関する回帰分析の結果を使ったアドバイス機能で、あなたのお悩みを解決します！

## サービスの特徴
- **ライトな恋活・婚活アドバイスサービスを「AIを使って実現」**
- **3分160円というコストパフォーマンス、恋愛コンサルタントよりもお安くお得！**
    - 恋愛コンサルタントの料金相場は、１時間当たり約1万円～２万円！総額で約30万円から50万円の費用が必要となります（出典：日本恋愛結婚コンサルテーション協会）
    - **AI恋愛コンサルタントなら3分 たったの160円！でサービスが受けれちゃいます！**
    - ※課金の計測対象は返答音声メッセージの長さ（秒数）のみとなりますので、相談内容を考える余裕を持ってしっかりとした相談ができます。
- **音声メッセージと共に恋愛相談コンサルタントが親身になって相談に乗ってくれます**
- 今後としては、実際のプロの恋愛コンサルタントの監修頂く予定です。

![PR用画像 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475516/ee107c93-5445-123d-6406-ddf38d1ad8cb.png)

（一部実名だっので、ぼかしました!w）

## 開発の背景

似たようなサービスはすでにいくつか存在しますが、以下のような課題があると思っています。

類似サービスの課題
- 悩みを聞いてくれない、そっけない対応をされる
- アドバイスが具体的で無くよく分からない

現実でこんな対応されたらキレますよねw
（類似サービスの例を貼っておきますが、サービス名は控えさせていただきます）

![IMG_1021.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475516/c35b677d-7e6c-540c-aa9e-637d11e09b79.jpeg)

## 開発のポイント

ポイントとしては、ChatGPTを使ったサービスでは強いて言ってしまえば「誰でも作れる」ものとなりがちです。そこで、どれだけ顧客に寄り添ったUXにこだわれるかが重要だと感じています。


## 終わりに

生成AI（Generative AI）でAIを活用した恋愛相談サービス「AI恋愛コンサルタント」開発してみました。

弊社では、「ジェネレーティブAI」×「マーケティング（プロダクト）」をかけあわせた、
ジェネレーティブAIで実用的なサービスを生み出す事業を行っており、仲間を募集です！
ご興味ある方は、ぜひご連絡ください！→ https://twitter.com/AQUA_july
【Python x Chrome ｘ Selnium】ブラウザ自動化からドライバー自動更新まで


> Python 3の仮想環境（venv）でSelenium 4を使うための環境構築方法を説明します。SeleniumはWebブラウジングの自動化やテストに使用される人気のあるライブラリです。

以下は、LinuxやmacOSの場合の手順です。Windowsの場合もほぼ同様の手順で進めることができます。

# 1. **Python 仮想環境のセットアップ**

まず、プロジェクト用のディレクトリを作成し、そのディレクトリ内で仮想環境を作成します。

```bash
mkdir my_selenium_project
cd my_selenium_project
python3 -m venv venv
```

# 2. **仮想環境をアクティベート*

Linux/macOSの場合:

```bash
source venv/bin/activate
```

Windowsの場合:

```bash
venv\Scripts\activate
```

仮想環境がアクティベートされると、プロンプトの先頭に `(venv)` が表示されます。

# 3. **Selenium 4のインストール**

アクティブな仮想環境内で、Seleniumをインストールします。

```bash
pip install selenium
```

# 4. **WebDriverのダウンロード**

Seleniumはブラウザを制御するためにWebDriverと呼ばれるドライバーを使用します。各ブラウザごとに異なるWebDriverが必要です。例えば、Google Chromeを使用する場合は、Chrome WebDriverをダウンロードします。

Chrome WebDriverのダウンロードは、以下のURLから行えます: https://sites.google.com/chromium.org/driver/

適切なバージョンのWebDriverをダウンロードし、プロジェクトディレクトリ内に配置します。

# 5. **Seleniumを使ったスクリプトの作成**

プロジェクトディレクトリ内に、例えば `main.py` という名前のPythonスクリプトファイルを作成し、以下のような内容を記述します。

```python
from selenium import webdriver

# Chrome WebDriverのパスを指定
driver = webdriver.Chrome()
#ウェブページを開く
driver.get('https://www.example.com')

# ブラウザを閉じる
driver.quit()
```

# 6. **スクリプトの実行**

仮想環境がアクティベートされた状態で、スクリプトを実行します。

```bash
python main.py
```

これで、Selenium 4を使用したプロジェクトがセットアップされ、実行されます。

注意: この手順はあくまで基本的なセットアップ方法です。特定のプロジェクトや環境によっては、さらに設定や調整が必要な場合があります。また、WebDriverのバージョンやブラウザのバージョンにも注意してください。

# 7.　ドライバの自動アップデート導入前に

SeleniumのWebDriverや関連するツールを自動的にアップデートする環境を構築するには、以下の手順に従ってセットアップを行うことができます。ただし、自動アップデートにはセキュリティと安定性の観点から注意が必要です。それらを踏まえて。８番へ

# 8. **WebDriver Managerを使用する**:
WebDriver Managerは、WebDriverを管理し、自動的に最新バージョンをダウンロードして管理するためのツールです。Pythonの場合、`webdriver_manager`パッケージを使用することでWebDriver Managerを導入できます。

こちら　

インストール:

```bash
pip install webdriver_manager
```

例えば、Chrome WebDriverを自動的にダウンロードして使う場合、以下のようにWebDriver Managerを使用することができます。

```python
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())
```

# 9. **Dockerを使用する**
Dockerはコンテナ化された環境を提供し、異なる環境を隔離して実行することができます。Dockerコンテナを使用することで、WebDriverやその他の必要なコンポーネントをコンテナ内で自動的にアップデートすることができます。

Dockerを導入し、専用のコンテナイメージをビルドすることで、環境を隔離しアップデートを管理することができます。

# 10. **定期的なアップデートスクリプトの実行**
自動アップデートを実現するために、定期的にアップデートスクリプトを実行する方法もあります。これには以下の手順が含まれます。

- WebDriverをダウンロードしている場所から最新バージョンをチェック
- 最新バージョンがある場合は、ダウンロードして既存のバージョンを置き換える
- スクリプト内で新しいWebDriverを使用する

※これにはセキュリティと安定性のリスクがあるため、慎重に管理する必要があります。

# 最後に
以上の方法のいずれかを選択する際には、環境の安定性やセキュリティに十分な注意を払い、アップデートが予期せぬ影響を及ぼすことのないようにすることが重要です。

便利ですが著作権やクローリングやスクレイプ禁止のページが存在するので注意して運用してくださいね。
それでは良いコーディングライフを。


# 参考文献


Seleniumブラウザー自動化プロジェクト

https://www.selenium.dev
【Python環境構築】VSCodeとvenvを使った実践的な環境構築



# はじめに
>学生の方、個人学習でいざ現場に行くとコスト面でAnacondaが使用できない事があります。環境構築に迷う事が多いと思います。例としてVSCodeとVenvの環境を構築していきます。みなさんと成長できたらなと笑　私の記事が参考になれば嬉しいです。


> さて、本題へ行きましょう。
>Python 3の環境構築について、Venv（仮想環境）とVS Codeを使って説明いたします。
pyenvなどは説明しません。

# Pythonの環境構築手順

まず、Pythonの環境構築手順です。
1. Pythonのインストール
2. 仮想環境（Venv）の作成
3. 仮想環境のアクティベート
4. VS Codeのセットアップ

## 1. Pythonのインストール
まずはPython 3をインストールしましょう。
公式のPythonウェブサイト（https://www.python.org/downloads/）

https://www.python.org/downloads/
 
からインストーラーをダウンロードし、実行します。
インストーラーの指示に従ってPythonをインストールしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1333535/7e360830-5a06-4413-99d3-ea200784d05f.png)


注意！add python.exe to PATH　にチェックを入れましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1333535/473cf4e7-5d10-44e3-9161-d5a7849bc32f.png)

インストール完了後は、２番目の作業へ！

## 2. 仮想環境（Venv）の作成
Pythonプロジェクトごとに独立した環境を作ることで、依存ライブラリの管理を効率的に行うことができます。以下はVenvを使って仮想環境を作成する手順です。コマンドラインを開いて、プロジェクトフォルダに移動します。

```Windows:ComanndLine
# Windowsの場合
python -m venv venv
```

```
# macOS/Linuxの場合
python3 -m venv venv
```
ここで、venvは仮想環境の名前です。このコマンドを実行すると、プロジェクトフォルダ内に仮想環境が作成されます。　３番の作業へ！

詳しく知りたい方はこちら

 https://code.visualstudio.com/docs/python/python-tutorial



# 3. 仮想環境のアクティベート:
仮想環境をアクティベートすることで、その環境にインストールしたパッケージが有効になります。
Windowsの場合
```shell Windows

venv\Scripts\activate
```
Unix系の場合（MacOSやLinux)
```terminal macOS/Linux
bash

source venv/bin/activate
```
やること
☑　利用するライブラリを調査
    PYPI: https://pypi.org/
    Git:
    
☑　ライブラリをインストールする。
        
通常のインストール方法
```　terminal
pip　install <ライブラリ名>
```
Gitからインストール方法
```
 pip install git+https://github.com/<ユーザーネーム>/<リポジトリ>.git
```    

プロキシ環境でのインストール方法
    
```　terminal
pip　install <ライブラリ名>　--proxy http://<ユーザー名>:<パスワード>@<職場>.com :8080
```

完了後、４へ進みましょう！


# 4. VS Codeのセットアップ
VS Codeをインストールしていない場合は
公式サイト　（https://code.visualstudio.com/Download ）

https://code.visualstudio.com/Download 
 
からダウンロードし、インストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1333535/b6cf9716-36e9-4281-b3b1-3c8fd0136e4b.png)

VS Codeを起動し、Extensions（拡張機能）アイコンをクリックし、「Python」を検索してインストールします。これにより、Pythonプロジェクトの開発に必要な拡張機能がインストールされます。

次は５へ進みます。

# 5. 仮想環境の選択
VS CodeでPythonプロジェクトを開く際に、作成した仮想環境を使用するよう設定します。VS Codeの左下に表示される「Python X.X.X 64-bit ('venv': venv)」という部分をクリックし、使用する仮想環境を選択します。

#  完成！

>これで、Pythonの環境構築とVS Codeでのプロジェクト開発ができるようになりました。仮想環境を活用して、プロジェクトごとに独立した環境を作成し、依存ライブラリの管理を行いましょう。


# 参考文献　引用元
https://www.python.org/downloads/


https://code.visualstudio.com/

https://code.visualstudio.com/docs/python/python-tutorial

公式のチュートリアル

https://docs.python.org/3.13/tutorial/index.html
Home AssistantのID,PW忘れて途方にくれた人へ

Home Assistant Operating System用

1. モニタにつなぐ

2. 下記でIDを思い出す。
    ```
    ha > login
    # grep username /mnt/data/supervisor/homeassistant/.storage/auth
    ```

    結果
    ```
    "username": "あなたのID"
    ```

3. あなたのIDへ新しいPWを付与
    ```
    # exit
    ha > auth reset --username あなたのID --password 新しいPW
    ```

4. うまくいったら落ち着いてココアでも飲みましょう。よかったね！



私にこれを教えてくれた神様
https://www.youtube.com/watch?v=ebZNSyHtmcE

箸にも棒にもな公式ヘルプ
https://www.home-assistant.io/docs/locked_out/
プロジェクト工程の各フェーズの役割

![picture_pc_713febd69ea445f40922900998dd5a80.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355632/7b1db903-2bde-aa62-579d-e61682260690.jpeg)

# 要件定義
**やること/やらないことを明確にする**

- **業務要件**
    - システムの概要
    - ユースケース
        - →管理者やユーザーの出来る事を図等で記載
   
- **機能要件**
    - アプリの種類
        - →PCのみか？スマホはやるのか？
    - 外部システム連携
        - →どのAPIを引っ張ってくるか？
    - 機能一覧

(例)
| カテゴリー | 機能 | 実装方法 | 必須 | 備考 |
|:-:|:-:|:-:|:-:|:-:|
|フロント機能|会員登録フォーム|会員登録   |   |   |
|   |   | クレカ登録 |   |   |
   
- **非機能要件**
    - インフラ構成
    - キャパシティプランニング
        - →ユーザー数、コンテンツ数等の規模は？7
    - 性能要件
        - →画面表示はx秒を目標etc.機能目標を記載
    - 可用性
        - →システムが動く時間は？（99.9％等）
        - →可用性を満たす為の対処は？
    - 死活監視
        - →システムは正常に作動しているか？
        - →何を用いて監視するか？
        - →作動してない場合どう対処するか？

補足：図を挟む場合はUMLを用いる


> 要件定義における成果物一覧と書き方
https://pm-rasinban.com/rd-write

## 設計
|  | 誰に対して？ | 何を行う？ |
|:-:|:-:|:-:|
|  基本設計(外部設計) | 顧客(システム開発の依頼者 ) | 	<font color="Red">顧客が理解できる範囲</font>で可能な限り使用を決めるフェーズ  |
| | |・画面デザイン、インフラ構成、バッチの挙動 |
| 詳細設計(内部設計) |PG |  どうやって実装すべきかを設計する |
| | |・クラス図、シーケンス図 |

## 基本設計

**要件定義書を元に顧客と詳細な仕様を決める**
**顧客に向けての成果物なので、IT用語は極力避ける**
**決定事項は「基本設計書」に記載する**


1. **表紙**
1. **改訂履歴**
1. **目次**
1. **機能一覧**
→要件定義書でおおまかに固めて、基本設計書で細かい部分を決める
1. **システム構成**
→インフラ・サーバー側の構成図
→draw.io等で作成
1. **画面設計**
→画面遷移図
→ドキュメントよりもモックアップツールで作成がおすすめ
1. **帳票設計**
→帳票=PDF・CVSのファイルや印刷物の事
→帳票がなければ必要はない
1. **バッチ設計**
→バッチ=自動で動くプログラムの事
→バッチ一覧：クレジットカードの月額課金バッチetc.
→バッチ詳細：目的・トリガー・処理フローで構成
1. **データ移行設計**
→旧システムのDBから新システムのDBにリプレイスする事
→新規開発であれば必要はない


> 基本設計書のサンプル
https://www.dennogo.jp/assets/templat...
https://www.cc.nitech.ac.jp/public/de...

## 詳細設計

**「基本設計の内容の反映」と「PGに最低限の材料を渡す」**
**クラス図などのUMLを「詳細設計書」に記載するのが一般的**
**詳細設計書を基に単体テストを行う**
**運用保守時の調査資料になる**

### 最低限作成するべきモノ
- **テーブル定義書**
    - 少しずつより、一気に作るのが良い
- **データ転送表・更新表**
    - 基本設計で決めた内容をベースに作成
    - OP処理はデータの取得元を
    - IP処理はデータの更新先を記載
- **画面・帳票レイアウト**
    - 基本設計で決めた内容をベースに作成
    - 桁数、入力順、日本語の使用可否等、細かい所は補足する
- **エラーチェック**

> 参考URL:
「詳細設計書」を作ってみる
https://qiita.com/minimumskills/items/556e963c54e95c0a540a


## テスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355632/3463d0bb-194f-ae61-e1a5-8f69999d40c2.png)


## 単体テスト
- 機能単位のテスト
- 関数単位・画面のパーツ単位など、出来るだけ小さな単位でテストを行う

### 単体テスト仕様書
（一例）
| テスト対象 | テスト内容 | 期待結果 | テスト結果 | ステータス | 担当 | バグ内容 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| ログインフォーム  | 正しいemailとパスを入力してログインボタンをクリック | ログイン成功→マイページへ遷移  |〇 |   |   |　田中   |

## 結合テスト
**機能同士を組み合わせたテスト**

（例1）
管理者：動画を公開
ユーザー：動画を見る
↓　
管理者が**投稿した動画**を、ユーザーは**動画を見る**事が出来るか？


（例2）
ユーザー：カード情報を登録
↓
カード決済外部システム：正しいカード番号か？
↓　
正しければ月額課金がスタートされる


## 総合テスト
- **機能テスト**
    - 本番環境+本番データで行う
    - 全体をシナリオでテスト
        - 管理者が投稿→ユーザーが入会→ログイン→投稿閲覧　のように正しい順序で機能を順番に使用できるか？
- **非機能テスト**
    - 性能試験
        - 要件定義書で定めた機能以外の要件を満たしているか？
        - x秒で画面は返されるか？
        - サーバーに負荷をかけても稼働するか？
    - 監視試験など
        - システムが止まった場合の対処は稼働しているか？
EventBridge Schedulerを使用して毎日定時にECSを起動・停止する

# はじめに

AWSコスト削減のために、使用していない時間帯はECSを停止したい。
毎回手動で起動したり停止したりするのは面倒なので、EventBridge Schedulerを使用して毎日定時にコンテナを起動/停止する。


# EventBridge Scheduler について

EventBridge Rulesとの主な違い:
[Amazon EventBridge スケジューラの紹介](https://aws.amazon.com/jp/blogs/compute/introducing-amazon-eventbridge-scheduler/)


# 1. IAMロール作成

スケジュール実行用のIAMロールを作成する。

AWSマネジメントコンソール ＞ IAM ＞  ロール ＞ ロールの作成

信頼ポリシーは以下の通り
Principalには`scheduler.amazonaws.com`を指定する

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "scheduler.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

今回は許可ポリシーを新しく作成する。
ポリシードキュメントは以下。

```json
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"ecs:UpdateService"
			],
			"Resource": "*"
		}
	]
}
```

許可されるアクションには`ecs:UpdateService`を指定する。
起動も停止もこのアクションで実行可能。


# 2. ECS起動用のスケジュール作成

AWSマネジメントコンソール ＞ EventBridge ＞ スケジュール ＞ スケジュールの作成

**ステップ1**
- スケジュール名を入力
- スケジュールパターンで「定期的なスケジュール」を選択
- スケジュールの種類を「cron ベースのスケジュール」にする
- 平日毎日9時に起動したいので、cron式には以下のように設定する

```
00 9 ? * 2-6 *
```

その他の項目はデフォルで次へ

**ステップ2**
- ターゲットAPI：すべてのAPI
- 検索ボックスでECSを検索し、AmazonECS > UpdateService を選択。
- APIに渡すJSONオブジェクトに以下を記述。

```json
{ 
    "Service": "<ECSサービス名>", 
    "Cluster": "<ECSクラスター名>",
    "DesiredCount": 1
}
```

`DesiredCount`がECSサービスの必要タスク数なので、起動したいタスク数を指定することでECSを起動することができる。

**ステップ3**
- スケジュールを有効化: オン
- スケジュール完了後のアクション：NONE
- 実行ロール: 作成したIAMロールを指定

その他の項目はデフォルで次へ。
確認と保存で問題なければスケジュールを保存。

これで指定した時間になったら`DesiredCount`で指定した数のコンテナが起動する。

# 3. ECS停止用のスケジュール作成

起動用のスケジュールと同じ手順で作成し、cron式と`DesiredCount`のみ変更する

cron式

```
00 19 ? * 2-6 *
```

入力に渡すJSONオブジェクトを記述する。

```json
{ 
    "Service": "<ECSサービス名>", 
    "Cluster": "<ECSクラスター名>",
    "DesiredCount": 0
}
```

上記の設定で、平日毎日19時に必要タスク数を0にすることでECSを停止することができる。
Vue3のウォッチャーを見てみる

# Vue.js 3 の watch と watchEffect について
Vue.js 3には、リアクティブなデータを監視して何らかの処理を実行するための2つの主な機能があります。それらはwatchとwatchEffectです。以下でそれぞれの特徴と使い方について解説します。

## watch の基本
watchは、指定したリアクティブなプロパティまたは計算プロパティの変更を監視し、その変更に応じて処理を実行します。

 ## 特徴
・監視するプロパティを明示的に指定します。
・以前の値と新しい値の両方を取得することができます。

### 例
```js
import { watch } from 'vue';

watch(someRef, (newValue, oldValue) => {
  console.log('新しい値:', newValue, '以前の値:', oldValue);
});
```

## watchEffect の基本
watchEffectは、実行中にアクセスしたすべてのリアクティブなプロパティの変更を自動的に監視します。

## 特徴

・明示的な指定が不要で、自動的に依存するプロパティを追跡します。
・watchとは異なり、以前の値にアクセスする機能は提供されていません。つまり、変更前の値を知ることができないため、新旧の値を比較するような処理は行えません。


### 例
```js
import { watchEffect } from 'vue';

watchEffect(() => {
  console.log('変更された値:', someRef.value);
});
```

## 使用例とソースコード
以下の例では、ユーザーが選択した商品の価格を監視し、合計価格を計算します。

```js
import { ref, watch, watchEffect } from 'vue';

export default {
  setup() {
    // 商品の価格
    const productPrice = ref(100);

    // 合計価格
    const totalPrice = ref(0);

    // watchを使用して価格の変更を監視
    watch(productPrice, (newValue, oldValue) => {
      console.log('価格が更新されました:', newValue);
      totalPrice.value = newValue * 10; // 10個購入する例
    });

    // watchEffectを使用して価格の変更を自動的に監視
    watchEffect(() => {
      console.log('合計価格:', totalPrice.value);
    });

    return {
      productPrice,
      totalPrice
    };
  },
};

```

以上で、Vue.js 3のwatchとwatchEffectについての解説を終了します。この2つの機能を使うことで、データの変更に素早く反応し、動的なアプリケーションを構築することが可能になります。最初は少し複雑に感じるかもしれませんが、実際に手を動かして試してみると理解が深まるでしょう。

## 注意
watchとwatchEffectはComposition APIの一部であり、Vue.js 3以降で利用できます。
どちらの機能も監視の対象となるプロパティが変更されたときにのみ処理が実行されるため、コードの効率を高めることができます。
TypeScriptで特定の型プロパティを使う方法 - `Pick`ユーティリティを使いこなす



## 目次
1. [はじめに](#introduction)
2. [問題の説明](#problem)
3. [解決策: Pick ユーティリティ](#solution)
4. [Pick ユーティリティの使い方](#usage)
5. [まとめ](#conclusion)

<a id="introduction"></a>
## はじめに

TypeScriptはJavaScriptに静的型付けとクラスベースのオブジェクト指向を追加したスーパーセットです。これにより、大規模な開発プロジェクトでも安全性と生産性が向上します。この記事では、TypeScriptの強力な型システムの一部である`Pick`ユーティリティ型を紹介します。

<a id="problem"></a>
## 問題の説明

TypeScriptでオブジェクトを扱うとき、オブジェクトが持つ特定のプロパティだけを利用したいケースがあります。例えば、次のような型があるとします。

```typescript
export type SomeType = {
    propA: string;
    propB: number;
    propC: () => void;
};
```

ある関数で `propC` プロパティだけを使用したい場合、どのようにすれば良いでしょうか？

<a id="solution"></a>
## 解決策: Pick ユーティリティ

TypeScriptには`Pick`というユーティリティ型があります。これは、既存の型から一部のプロパティだけを取り出すために使用します。以下にその使い方を示します。

<a id="usage"></a>
## Pick ユーティリティの使い方

まず、`SomeType` をインポートします。

```typescript
import { SomeType } from "./path_to_file";
```
このステートメントは、 `SomeType` を現在のスクリプトにインポートします。`"./path_to_file"` は `SomeType` が定義されているファイルのパスに置き換えてください。

次に、`Pick` ユーティリティを使用して、`SomeType` の一部として `propC` を使用します。

```typescript
function usePropC(props: Pick<SomeType, 'propC'>) {
  // ここで 'propC' を使用できます。
  // 例えば:
  props.propC();
}
```
ここでは `Pick` ユーティリティタイプを使用しています。これは、既存の型から特定のプロパティを選択的に取り出すことができます。この例では、`SomeType` から `propC` プロパティだけを取り出しています。

<a id="conclusion"></a>
## まとめ

このように、TypeScriptの`Pick`ユーティリティは、既存の型から一部のプロパティだけを選択的に使用するときに非常に便利です。型安全性を保ちつつ、必要な部分だけを取り出して使用することができます。

TypeScriptはこのように強力で柔軟な型システムを持っているため、大規模なプロジェクトでも高い生産性と安全性を維持することができます。`Pick`ユーティリティはその一例です。ぜひ活用してみてください。
AWSから届くメール、Instance scheduled for rebootについて

# ■概要
AWSより予告されるEC2インスタンスのメンテナンスについて。
対応手順からメンテナンス完了の確認方法まで記載します。

# ■AWSから届くメール
件名は以下のような件名です。
Amazon EC2 Maintenance: Instance scheduled for reboot [AWS Account ID: xxxxxxxxxxxx]

また内容については、インスタンスのメンテナンスがx月x日のx時からx時までの間に行われます。
またその間インスタンスは利用できない状態となり、再起動される。といった内容です。



> Hello,
> One or more of your Amazon EC2 instances associated with your AWS account (AWS Account ID: xxxxxxxxxxxx) are scheduled for 
> maintenance between 2023-08-07 00:00:00 UTC and 2023-08-07 02:00:00 UTC. During this time, the following instances in the 
> ap-northeast-1 region will be unavailable and rebooted.
> 
> The affected instances are listed below:
> i-xxxxxxxx
> 
> 、、、、



# ■スケジュールされたメンテナンスの回避

予定されたメンテナンスは2時間ほどとなりますが、事前に対応する事でインスタンスの停止時間を短縮できます。
インスタンスの状態により多少前後しますが、おおよそ10分ほどで事前対応は可能です。

# メンテナンスの回避対応手順

対応内容はとてもシンプルです。
対象となるインスタンスを 停止 → 起動 する事で対応完了となります。
（再起動ではない点にご注意ください）


1.インスタンスを停止

![停止_20230805002838.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/85d3976e-3a75-d740-07a5-5a71b5b8a737.png)

2.「停止済み」となったら起動

![停止2_20230805003106.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/6421faff-3a7b-7e79-9181-66257ce69faa.png)

以上です。


# ■メンテナンスの完了確認

メンテナンスが実際に完了されたか、Health Dashboardで確認する事が可能です。

画面上部のベルマークから移動する事もでき、こちらでも確認が可能です。
この場合「スケジュールされている変更」がこれにあたります。

![ヘルス0_20230805001433.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/45d7601d-cf26-9bf6-510b-a2c92b3fec63.png)

メンテナンスが控えている状態だと以下のように表示されており、
メールでも通知されたようなメンテナンススケジュールやメンテナンスのステータスなどを確認できます。

![ヘルス1_20230805000449.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/c67ae379-1b49-7894-dd54-8eb6f741de73.png)

また、「Affected resources」では対象リソースを確認する事ができます。

![ヘルス2_20230805001852.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/ff5bfb22-a478-2911-2200-cf1f976d5837.png)


インスタンスの停止起動後、改めてヘルスダッシュボードを確認するとイベントが消えている事を確認できます。
イベントが消えていればメンテナンスの対応は完了となります。

![ヘルス3_20230805003804.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/de82b11f-ff5d-ada0-15de-f9da67cdd94d.png)

# ■メンテナンスがキャンセルされる場合もある

稀なケースですが、予告されたメンテナンスがキャンセルとなるケースもあります。
その場合は以下のようなメールが届きます。

> 件名:
> Amazon EC2 Maintenance Cancelled [AWS Account ID: xxxxxxxxxxxx]
> 
> 本文:
> Hello,
> Previously, you received a maintenance notification for your Amazon EC2 instance that was scheduled for maintenance on 2023-08-07 00:00:00 UTC. We have cancelled the scheduled maintenance for the following instances in the ap-northeast-1 region. No further action is required from you.
> 
> i-xxxxxxxx
> 
> 、、、、

# ■最後に
AWSの運用されている方であれば今更な内容となりましたが、普段運用されない方からのご質問をいただいたので改めて文章化してみました…！
Zodで条件に応じてバリデーションスキーマを動的に変更する：TypeScriptとReact-Hook-Formの例



# 目次
1. [はじめに](#introduction)
2. [Zodとは？](#what-is-zod)
3. [動的なスキーマの作成：ユーザー登録とユーザー情報編集](#creating-dynamic-schema)
4. [結論](#conclusion)

## はじめに <a name="introduction"></a>

Reactアプリケーションでフォームのバリデーションを扱う際、ZodとReact Hook Formを組み合わせることはよくあります。しかし、同じフォームが異なるシーンで使用され、一部のフィールドが条件により必須になったり、オプションになったりする場合、どうすれば良いでしょうか？この記事では、Zodで動的なバリデーションスキーマを作成する方法をご紹介します。

## Zodとは？ <a name="what-is-zod"></a>

Zodは、TypeScript用のランタイムバリデーションライブラリです。Zodは、あらゆる種類のデータをバリデーションするための強力なスキーマ定義機能を提供します。また、それらのスキーマはTypeScriptの型としても使用できるため、型安全なコードを書くことができます。

## 動的なスキーマの作成：ユーザー登録とユーザー情報編集 <a name="creating-dynamic-schema"></a>

では具体的なシチュエーションを考えてみましょう。ユーザー登録画面とユーザー情報編集画面があり、それぞれにフォームが存在します。この2つの画面では、ほぼ同じフォームが使用されていますが、一つ違いがあります。それは、ユーザー登録画面では"利用規約に同意する"というチェックボックスが必須項目となっていますが、ユーザー情報編集画面ではこの項目が存在しないという点です。

このような場合、`isEdit`というパラメータを基にスキーマを動的に生成する関数を作成します。以下に該当のコードを示します：

```typescript
import * as z from 'zod';

export const createProfileSchema = (isEdit: boolean) => {
    let isAgreeTermsSchema = isEdit ? z.boolean().optional() : z.boolean();

    return z
        .object({
            // Other fields go here...
            isAgreeTerms: isAgreeTermsSchema,
        });
};
```

この関数を使用してスキーマを生成します：

```typescript
const {
    params: { isEdit }
} = useRoute<ProfileEntryRouteProp>();

const profileSchema = createProfileSchema(isEdit);
```

これにより、`isEdit`が`false`（ユーザー登録画面）の場合、`isAgreeTerms`は必須項目となり、`isEdit`が`true`（ユーザー情報編集画面）の場合、`isAgreeTerms`は存在しない（オプション）となります。

## 結論 <a name="conclusion"></a>

この記事では、Zodを使用して動的なバリデーションスキーマを作成する方法を紹介しました。この方法を使用すれば、特定の条件に基づいてフィールドが必須になるかオプションになるかを動的に変更することが可能です。これにより、ZodとReact Hook Formの組み合わせがさらに強力なツールになります。

---

以上です。記事がお役に立てれば幸いです。何かご質問がありましたら、コメントでお知らせください。また、「いいね」もお願いします！
[UE]テクスチャをWEBから読み込む

1.ベースとなるマテリアルを作成し、Param2Dに名前を付けておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/fa8d02fa-6785-9ede-38ae-66b4470a4162.png)

2.ブループリントを作成。SetTextureParameterValueに1の名前を入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/a5b7ca40-165c-795e-d82f-48b1eb8fed22.png)

3.1で作成したマテリアルを貼り付けたStaticMeshと2で作成したBPをマップ上に置く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/b2e908f7-fa81-15c7-fd5b-ffef29ca2557.png)

4.BPのTargetActorにStaticMeshをセット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/287e7899-5252-faab-fc27-4afcf15797ce.png)

4.実行する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/ea8fe716-6151-9c94-7ea8-972cb6dc98ed.png)
ネットワーク

### ネットワークの種類
PAN：室内規模の私的コンピューターネットワーク　（个人区域网络，PC、スキャンナ、プリンタ）
LAN：同じ建物内の複数のコンピューターを接続（局域网（网吧），コンピューター）
WAN：離れた場所にあるLAN同士を接続（广域网）

#### PAN（Personal Area Network）
パソコンやプリンタ、スキャンナといった周辺機器を接続した室内規模の私的コンピューターネットワーク。
一般にUSEやIEEE1394を使う。最近では近距離のデータ通信を赤外線のirDA、Bluetoothによる無線接続も増えた。

#### LAN（Local Area Network）（構内情報通信網）
企業や学校、ネットカフェなどの同じ建物内、また同じ敷地内にあるコンピューターや周辺機器を接続したPCワークのこと。
一般に同軸ケーブル、ツイストペアケーブル、光ファイバーケーブルといった伝送媒体（LANケーブル）、無線LANもあり。
#### 銅線（メタルケーブル）
上文の同軸ケーブル、ツイストペアケーブルは、銅線を使ったLANケーブルです。
銅線は、高い電気伝導性を持つ銅でできた伝送媒体です。銅線の中で0、1の電気信号を伝送して相手に届く。長い距離の場合、減衰した信号を元に戻す中継器（リピータ）が必要。
##### 同軸ケーブル（地上波TVで使うケーブル）
　一本の銅線を絶縁体で覆い、さらにメッシュ銅線で包んだ構造になっているケーブルのこと。メッシュ銅線が外部からの電磁波を遮断するため、ツイストペアケーブルよりノイズに強く、従来のLANに多く使われていましたが、硬くて曲げにくく配線困難の為、現在はあまり使用されていない。（JCOMまだ使っている）
##### ツイストペアケーブル（网线）
細い二本の銅線をそれぞれ絶縁体で覆い、ねじり合わせた構造になっているケーブルのこと。
構造が簡単で容易に製造でき、折り曲げが可能で配線の自由度が高いことから、現在に最も使われている。
電磁遮蔽シールドの処理がSTPケーブルとUTPケーブルがある。
##### 光ファイバーケーブル（光配線口からONUに接続ケーブル）
光ファイバ、データの光信号に変えて伝送するケーブル。上記のケーブルより信号の減衰がなく、超長距離伝送可能、電磁波に影響されない。
##### 無線LAN伝送媒体（無線ルーター）
現在無線LANの主流は2.4GHzと5GHz帯の電波。
ケーブルを使うことなく便利な反面、電波の盗聴される危険があり、セキュリティ対策、電波が混信するというデメリットがある。
無線ラインアクセスポイント⇒　ルーターみたいなもの
無線ライン子機⇒　XBOXコントローラの無線アダプター
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/dc68a5a0-02fb-a89d-0351-d039f15e4c6b.png)

#### 離れたLAN同士接続　WAN（Wide Area Network）
本社⇒支社間、大学の違うキャンパスなどLAN同士を接続した広域ネットワークをWAN。広域通信網。
#### インターネット（全世界のネットワークを相互接続したネットワーク）
電気通信事業者を通じてインターネットへ接続できる。インターネットサービスプロバイダ（ISP）という。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/a546ce3a-2f5c-1f7c-6a4f-5595049286a1.png)
東京　VR体験（2023/06/25）

研究の一環として2023年6月25日に東京でVR体験をしてきました．


行ったVR体験は以下の4個です．
・VRバンジー（東京タワー）
[VRバンジーのページ](https://www.tokyotower.co.jp/event/attraction-event/tokyotower-bungeeVR/)
・KATWALK mini S（ZEXAVERSE TOKYO）
[ZEXAVERSE TOKYOのページ](https://www.marronniergate.com/zexaversetokyo/)
・コリドール（ティフォニウム）
[ティフォニウムのページ](https://www.tyffonium.com/)
・XR BASE
[XR BASEのページ](https://www.nttqonoq.com/xrbase/)


#VRバンジー
VRバンジーは東京タワーのメインデッキで行われており，東京タワーのてっぺんからのバンジージャンプ体験をすることができます．
以下のような装置にうつ伏せになって体験をします．
![iOS の画像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526599/df80df23-00ba-2a67-c0f3-425cf2753284.jpeg)

VRバンジーを体験した感想としては
バンジージャンプに必要不可欠な落下への恐怖＋落下感を強く感じることができました．
このような感覚が発生した理由として以下の要因によるものだと考察しました．
・足をガッチリと固定された状態で180度宙吊りにされた際の，体の不安定さが落下感や恐怖へ繋がった．
・扇風機からの風によって更に臨場感が向上していた．

これは誇張抜きで一度乗ってみる価値があると思いました．



#KATWALK mini S
KATWALK mini Sはマロニエゲート銀座3FのZEXAVERSE TOKYOに設置してあり，その場でVR空間内を360度自由に歩く体験をすることができます．
以下のような装置に立った状態で体験します．
![iOS の画像 (4).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526599/58c68f9f-ec1a-4eb2-183e-cc2252d9bd89.jpeg)

KATWALK mini Sを体験した感想としては
現実空間の装置の上という限られた範囲で，広大なVR空間を360度歩行体験することができました.

しかし，体験をした上での欠点？不満もありました．
搭乗者がVR空間内で歩行する為には，装置の下部にある円盤の上を'''すり足'''で進まなければいけないという点です．
![iOS の画像 (5).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526599/71d84008-ffea-9b00-3e07-edb945b8ec37.jpeg)

搭乗者がすり足で移動しなければならないので，やはり違和感が発生してしまいます．
ですが，こういった装置において'''使用スペースと体験の良さ'''はトレードオフの関係にあると思っています．
そのような点を考慮すればKATWALK mini Sは，その場で体験することができるVR装置としてはとても良い体験でした．



#コリドール
コリドールはダイバーシティ東京プラザ5Fのティフォニウムという施設で体験することができます．
![iOS の画像 (6).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526599/5bbd611b-4839-6277-3362-a95b3c9d1dbe.jpeg)


コリドールは先ほどのKATWALK mini Sとは異なり，何も物が置いていない部屋（広さの例として一般的なコンビニ程度）に通され，その部屋をVRゴーグルを被りぐるぐる回るといったものです．

体験中の撮影ができなかったので，待合室に設置してあるコリドールの体験映像の写真を添付します．
![iOS の画像 (7).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526599/825d7480-a51c-32d3-eea0-e3a2225b7e0e.jpeg)

コリドールを体験した感想としては
その場で体験するKATWALK mini Sとは異なり，部屋の中を体をフルに動かして探索することができるコリドールの方が移動感（歩行感覚）が高かったです．
更にコリドールでは，実際のランタンを手に持ってVR体験を行うのですが，手に持っているランタンをVR空間内の紙やロウソクに近づけると実際に燃え上がり，進むためのギミックが発生するようになっていました．
ただ道に沿って歩くだけでなく，実際に体験者の動作によって次に進めるといったワンクッションが置かれることで没入感が向上していると感じました．



#XR BASE
XR BASEは秋葉原駅のラジオ会館側にある施設でXR（クロスリアリティ）の体験をすることができます．
![iOS の画像 (8).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526599/8b923f9b-f611-65cb-db9e-c9bca6b4e4ed.jpeg)

今回は私自身がMR（複合現実）ゴーグル初体験でしたので，日曜日限定の「MRどうぶつ」というバーチャル猫と遊ぶことができる体験を行いました．

以下のようなMRゴーグルを装着し，現実世界でVR世界の猫を撫でたり，持ち上げたり，自身の手でジェスチャーをすることで餌やりができる体験となっています．
![iOS の画像 (9).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526599/fc948e51-9a9f-6295-fca7-fe4f3967a3f0.jpeg)

今回初めて複合現実を体験した感想としては
勿論現実で猫とじゃれあう体験と比較してしまうと劣ってしまう部分はあるかもしれませんが，どんな場所でも癒しを求めて猫と遊ぶことができるのは良いと思いました．

ここからは私の考えになってしまいますが
複合現実は，名前の通り現実世界と仮想世界を織り交ぜることができるのが魅力だと感じています．
これを更に有効活用できる点としては
例えば現場作業の支援です．
遠隔の作業者が現場の作業者に指示を出す時，現在は言葉で伝えて何かをしてもらうといったケースが一般的だと思います．
しかし，複合現実を用いることで遠隔の作業者が現場の作業者の視界に直接指示を出すことができ，より指示がわかりやすくなると思いました．
Git for Windows アップデート

# はじめに
業務や個別の作業のため、Windows環境でGitを使っていますが、Gitをインストールはしたけど、アップデートした記憶がなかったので、今回、「Git for Windows」をアップデートしました。

# Git for Windows アップデート手順
① Git Bash、コマンドプロンプト、PowerShellのいずれかを実行します。
② 以下のコマンドを入力して実行して、アップデートを開始します。
```console
$ git update-git-for-windows
```

③ 最新版のGit for Windowsをインストールするか聞かれます。
「y」を入れて、最新バージョンのダウンロード・インストールを開始します。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1184971/701b8659-d028-d702-d9ce-f11dc193f959.png)
![2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1184971/91703fe3-1548-6f36-308a-fabb4324092c.png)
④ アップデートが完了されたら、Gitのバージョンを確認します。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1184971/435b7302-c89c-1ae9-d240-a066f96b7341.png)

# その他
## アンチウィルスソフトによるアップデート失敗
「git update-git-for-windows」コマンドを実行すると、
```console
curl: (60) SSL certificate problem: unable to get local issuer certificate
```
または
```console
curl: (35) schannel: next InitializeSecurityContext failed: CRYPT_E_NO_REVOCATION_CHECK (0x80092012) 
```
などのエラーが発生したことがありました。
これは、アンチウィルスソフトウェアのため、アップデート処理がブロックされたことが原因でした。
アンチウィルスソフトの保護を一時停止し、「git update-git-for-windows」コマンドを実行すると、正常にアップデートできました。

https://stackoverflow.com/questions/60420446/command-failed-git-update-git-for-windows

## 2.45.2バージョンのバグによるアップデート失敗
`2.45.2`バージョンからアップデートする時、以下のようなエラーが発生したことがありました。
```console
curl: (43) A libcurl function was given a bad argument
```
調べてみたら、アップデートのコードのバグのせいでアップデート失敗が発生するようでした。
`2.46.0`バージョンで、このバグは修正されたが、手動で最新バージョンをダウンロードし、インストールしてGitをアップデートするしかないようです。

https://github.com/git-for-windows/git/issues/5083
ファイル操作,ディレクトリ操作の練習

| コマンド | 説明 |
| - | - |
| pwd | ディレクトリへ移動 |
| cd | ディレクトリへ移動 |
| cd .. | 一つ上　cd - ひとつ前 |
| ls | 今のフォルダの中身を一覧表示 |
| cat | ファイルの中身を表示 |
| touch | 空ファイル作成、時間変更 |
| echo | 文字列を表示、>でファイルへ書き込み |
| pushd | ディレクトリを記憶  |
| popd | 記憶したディレクトリへ |
| mkdir | ディレクトリ作成 |
| mv | ファイル/ディレクトリを移動、名称変更 |
| rm | ファイル削除 |

例1)
```sh
rm aaa.txt
rm testfolder /  
↓↓↓↓↓↓↓ あなたの記事の内容
mkdir testfolder　
→テストフォルダーという名前のディレクトリを作る 
touch aaa.txt　空ファイル作成（名前は適当）
cat aaa.txt　ファイルの中身表示
例）echo "hello"
───────
mkdir testfolder # →テストフォルダーという名前のディレクトリを作る 
touch aaa.txt # 空ファイル作成（名前は適当）
cat aaa.txt # ファイルの中身表示
```
例2)
```sh
echo "hello"
↑↑↑↑↑↑↑ 編集リクエストの内容
hello
echo "hello" > aaa.txt
cat aaa.txt
hello
```

## ファイルの中で文字を打つ時
```sh
cat aaa.txt
hello
test
inu
ls # (今のフォルダの中身を一覧表示)
   # 表示してみると,aaa.txtが入ってることが分かる
cp aaa.txt bbb.txt # (ファイルのコピー)
cat bbb.txt
hello
test
inu
mv bbb.txt ccc.txt # （名称変更）
                   # lsで確認
                   # ccc.txtに変化してるのが分かる
```

テンプレート,ドキュメント,ピクチャ,公開,ダウンロード,デスクトップ,ビデオ,ミュージックは日本語表記になっているため、コマンドを入れる時に `cd デスクトップ/` などと表記しなければならない

例1)
```sh
cd ../ダウンロード/
cd ..
ls
cd ダウンロード/
```

例2)
```sh
~/ダウンロード$ ls # (ダウンロードされているものが出てくる)
pushd .
~/ダウンロード$ ~/ダウンロード ~
cd ..
cd -
/home/tamago/ダウンロード
cd
```

名前の後にアスタリスク(*)がある場合はそのコマンドが無効になっている事を意味する。

- historyコマンド
  - (今まで打ったコマンドを一覧してくれるコマンド)
- helpコマンド
  - (自分が知りたいコマンドのより詳しい説明が得られる)

ちなみに、ハイフンから始まるコマンドはないので、
オプションは--helpでは出てこない。
`'info bash'`を使用するとシェル全般のより詳しい説明が得られる。


## 参考
- https://youtu.be/YGfQ-4J-Khk
- https://wa3.i-3-i.info/index.html
Adobe IllustratorをAmazonで購入した引き換えコード（オンラインコード版）で有効にする

# 1. はじめに
* システムデザインを勉強したく購入したIllustratorで、オンラインコード版のサブスクリプションがなかなか有効にならず困ってしまった
* 今後同じように手間取らないようにCreateve Cloud サブスクリプションのコード引き換え手順をメモしておきたい
* 実際私のPCだとコード引き換えからCreate CloudでIllustratorでプランに反映されるまで約30分から1時間程度かかった

# 2. 開発環境
* Adobe Illustorator
* Mac Os Big Sur

# 3. Createve Cloud サブスクリプションのコード引き換え手順
## 3.1. Amazonの注文履歴からライブラリへ移動するをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/8f68702f-7df5-48d2-2219-52e79dc92cc2.png)

## 3.2. 引き換えコードをメモする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/5f238c1b-b2d4-04bb-021b-0ba46d99e9b5.png)

## 3.3. Creative Cloud サブスクリプションのコード引き換えをする
* 下記サイトへアクセスして、Adobe IDでログインする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/d7bc6437-e2b7-ff2a-7c32-95fbf03322d6.png)
https://creative.adobe.com/ja/redeem 

## 3.4. 引き換えコードを入力する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/fa99385f-b9f5-6623-1927-84d6159c262b.png)

## 3.5. お支払い方法の登録は後で知らせるをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/b8f4a155-be73-ace4-5f35-bca9be6dd001.png)

## 3.6. 今すぐ開始ボタンをクリックする
* 私のPCだとこのボタンを押しても残念ながら開始にならず、プランは無料のままだった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/6699f457-da67-56f6-bf25-9095cfadea15.png)

## 3.7. Adobe Creative Cloudを起動してしばらく待つ
* 約30分から1時間程度待つと自動的に更新がかかり、Illustratorがインストールできる状態になった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/4c263bf5-4be4-69ec-d8fe-48306899cfe5.png)

## 3.8. Adobeアカウントのプランに引き換えコードが有効になっていることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/560440b0-b85d-df39-9366-215844379029.png)

# 4. 参考文献

https://www.amazon.co.jp/Adobe%E8%B3%BC%E5%85%A5%E6%89%8B%E9%A0%86%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89%E7%B7%A8/b?ie=UTF8&node=3429077051

https://yuzuyu3.com/ai-activation/
【動作レポート】RasPi＋Ubuntu＋MT7601U

# 背景・課題
Raspberry Pi 4にUbuntu22.04を入れた状態でMT7601Uのチップが載ったWifiアダプターを接続しても利用できなかった．

チップの種類の確認はアダプタをつなげた状態で`lsusb`を実行すれば判定できる．

```bash
$ lsusb
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 148f:7601 Ralink Technology, Corp. MT7601U Wireless Adapter
```

問題の状態では`lsusb`で認識できていても`ip a`では，それらしきものなし．

# 解決
カーネルのバージョンを確認し，そのバージョンにあった *linux-module-extra-$(version)* を入れて再起動．

```bash
$ uname -r
5.15.0-1034-raspi
$ sudo apt install linux-modules-extra-5.15.0-1034-raspi
$ sudo reboot
```

注意として **バージョンは適宜変える** こと．

# 参考
https://askubuntu.com/questions/1445115/mt7601u-not-working-even-after-installing-linux-modules-extra-in-ubuntu-server-2

ここで「前に *linux-modules-extra* を入れたら治ったけど，再インスト後なんかまた認識しなくなった．．．」という内容だが，試しにと *linux-module-extra* を入れたら認識できたので投稿．

自分は見つけるのに苦労したので，同じように苦労してる同士が報われることを祈る．
初めてのチーム開発：ハッカソンでの経験と成果

# 初めてのチーム開発：ハッカソンでの経験と成果

本記事は、私が大学で初めて参加したチーム開発と、その過程で制作したウェブアプリについて紹介します。特に、私たちが作り上げたプロジェクトの中核となる部分や、その中で使用したツールや技術について解説していきます。

## ハッカソンと私たちのプロジェクト

大学の有志によって主催されるハッカソンで、参加者はUnityを使って1からゲームを製作します。私が参加したのは、2022年の冬で、それが私の人生で初めてのチーム開発の経験となりました。

私たちのチームは、「迷路ゲーム」を作成しました。私は「プレイヤーの移動」・「エリアのワープ処理」・「迷路のステージ」の実装をしました。完成した成果物は[こちら](https://object-storage.tyo1.conoha.io/v1/nc_df3bdbc45bc04950b558834f5728517a/unityroom_production/game/26719/webgl/play.html)からアクセス可能です。

![TV-2dS8ffvr7MOoHsT5-P5OjmpM6X5a0A6e7-qWeZAQBNzkhDHsRAJaNpDpOX4ejaCce5t08jYZfIgbzR4OjQZgdopwtVjsRgPleqJbYD3fThWff_d4cfHKCU-9chdO_ozsPUifva9PZ0hbTzSsFCw=s2048.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2573573/45c03549-1139-6480-8180-35d0293cd2c6.png)
※開発しているときの様子


## 使用したツールと技術

私たちは、言語はC#、実行環境はUnityを使用してゲームを開発しました。C#は、一般的なプログラミング言語で、Unityとの親和性が高いです。Unityは、3Dゲームを開発するための強力なフレームワークで、豊富な機能と環境を提供しています。


## 経験と学び

人生初めてのチーム開発は、多くの経験と学びを提供しました。チーム内のコミュニケーションは、個々のプログラミングスキルだけでは得ることができない貴重な学びとなりました。

以上が、私が大学で初めて経験したチーム開発とハッカソンでのゲーム制作についての紹介です。これらの経験は、私の技術的スキルを向上させるだけでなく、チームで働くという経験を深める機会となりました。
せんせー、 フュエルセル技術ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/7f59d21b-0564-377b-a326-47169950dc66.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/319ddbbb-e9dd-5833-688d-5808a705af9b.png)

せんせー、フュエルセル技術ってなに？

# フュエルセル技術とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/754ad1db-cf66-be94-8f33-137d3e28f1cc.png)

フュエルセル技術とは、ちょっと難しいけど、とても素敵な技術のことです。

君が風船を膨らますとき、息を吹き込むと風船が膨らみますよね。
これは息（空気）が風船に力を与えているからです。
フュエルセルも似たようなことをするんだけど、風船の代わりに電気を作ります。

フュエルセルは、特別な箱（セル）の中で、水素と酸素という2つのガスを使って電気を作ります。
水素と酸素が箱の中で出会うと、その力で電気が作られます。
これが、ライトをつけたり、車を走らせたりするために使われるんです。

でも、一番すごいのは、フュエルセルが使い終わった後に出るものです。それは水です。
だから、フュエルセルは電気を作り出すだけでなく、きれいな水も作り出すことができるんです。
これが、フュエルセル技術のすごいところなんです。

でも、この技術はまだまだ学びたいことがいっぱいあるから、君が大きくなったら、
もっとすごい技術が生まれているかもしれないですね。

# まとめ

フュエルセル技術とは、風船の代わりに電気を作る技術のこと
【Linux】乱数の生成方法

## 生成方法

`RANDOM`変数を使用することで乱数を生成できます。  
`RANDOM`変数は`0`から`32767`の間の数値を返却します。  

```terminal
$ echo $RANDOM
18739
```

数値の範囲を`0`から`9`までにしたい場合には以下のように実行します。  

```terminal
$ echo $(($RANDOM % 10))
4
$ echo $(($RANDOM % 10))
6
$ echo $(($RANDOM % 10))
0
$ echo $(($RANDOM % 10))
5
$ echo $(($RANDOM % 10))
7
$ echo $(($RANDOM % 10))
8
```

数値の範囲を`1`から`10`までにしたい場合には以下のように実行します。  

```terminal
$ echo $(($RANDOM % 10 + 1))
2
$ echo $(($RANDOM % 10 + 1))
4
$ echo $(($RANDOM % 10 + 1))
10
$ echo $(($RANDOM % 10 + 1))
9
$ echo $(($RANDOM % 10 + 1))
7
```

数値の範囲を`101`から`200`にしたい場合には以下のように実行します。  

```terminal
$ echo $(($RANDOM % 100 + 101))
195
$ echo $(($RANDOM % 100 + 101))
139
$ echo $(($RANDOM % 100 + 101))
101
$ echo $(($RANDOM % 100 + 101))
148
$ echo $(($RANDOM % 100 + 101))
142
```
ラズパイ　2つのプログラムを同時に動かす方法

#### いつもThonnyで動かしてるけど2つ動かす場合はできないので備忘録として。


1つ目のプログラムを<font color="Red">test1.py</font>
2つ目のプログラムを<font color="Blue">test2.py</font>

LXTerminalを起動して、以下のようにする。
Python3 test1.py <font color="Magenta">|</font> Python3 test2.py


###### 補足
プログラムを止めるときは、<font color="Orchid">［Ctrl］＋［Z］キー</font>
pandasにそっと左手を添えるだけで処理速度が爆速に

# 内容について
pythonを使用している皆様
データ処理をする際、pandasを使用していますか？
ちょっとしたデータを弄るときはそれほど気にはしませんが、ビッグデータを扱うときに
「早く処理終わってくんねーかなー」
「無限ループ入ったわ」
みたいなことありませんか？
私はあります。実際に40分くらいかけて読み込んだこともあります。
そんな皆様にpandasを使用したコードに一言追加するだけで爆速になる方法を紹介します（多分知ってると思いますが……）。

それは
**swifterを追加しよう！！！**
です。
では、具体的にどのくらい読み込み速度が違うのか見ていきましょう。

# 検証
pandasよりもデータ処理速度が優れているpolarsというライブラリがありますが、pandasに慣れている人からすると手を付けづらい部分もあるのではないかと思います。

https://pola-rs.github.io/polars-book/user-guide/

しかし、swifterはpandasのコードに、そっと左手を添えるかのように追加するだけです。
では見ていきましょう。

まずはswifterをインストールしましょう。
```
$ pip install swifter
```
こちらでインストールの方法等書いていますが、私は上記のコマンドしか実行していませんが問題ありませんでした。

https://github.com/jmcarpenter2/swifter

次に必要なライブラリをインポートしましょう。
```python
import pandas as pd
import numpy as np
import swifter
import time
```
今回はpandasとswifterの比較を行いますが、ここで1つ注意点
**swifterを使用する際は、pandasもインポートすること**
先ほども言いましたが、そっと左手を添えるのです。
ボール（データ）があっても、シュートを打つための右手（pandas）がないと処理は実行できません。
忘れずにインポートしましょう。

また、処理速度を比較するためにtimeもインポートしておきます。

では、比較するためのデータを作成しましょう。
```python
# インデックスとカラムの数を決める
rows = 10**7
cols = 5

# ランダムな整数型でデータ作成
data = np.random.randint(
    low=np.iinfo(np.int32).min,
    high=np.iinfo(np.int32).max,
    size=(rows,cols)
)
df = pd.DataFrame(data,columns=[f'col{i+1}'.format(i) for i in range(cols)])

df.to_csv('time_data.csv')
```
上記コードを実行することで、1000万行×5列のcsvファイルを作成します。
このcsvファイル、なんと623MBもあります。
ではこのファイルを読み込んでいきましょう。

```python
pandas_df = pd.read_csv('time_data.csv',encoding='utf-8')
```
(。´・ω・)ん?
swifter使わねーの？と思ったそこのあなた。
残念なことに
**swifterはデータの読み込みはできない。**
というデメリットがございます。
あくまで、データはpandasで読み込む必要があるみたいです。
バージョンが更新されて読み込めるようになるといいですね！


では、データを処理して比較していきます。
今回は2通りの処理を行い、それぞれでどの程度処理速度に違いがあるかを見ていきます。

1. データフレームのすべての要素に対して1を足す。
1. データフレームのすべての要素の平方根を取る。

特定のカラムに対して処理を行うのではなく、すべての要素に対して処理を行うことで負担をかけてやろうと思います。

```python
# すべての要素に対して1を足す
# pandas
pd_start_time = time.time()
pd_1 = pandas_df.applymap(lambda s : s+1)
pd_end_time = time.time() 
# swifter
swift_start_time = time.time()
swi_1 = pandas_df.swifter.applymap(lambda s : s+1)
swift_end_time = time.time() 

# すべての要素に対して平方根を取る
# pandas
pd_start_time = time.time()
pd_sqrt = pandas_df.applymap(np.sqrt)
pd_end_time = time.time() 
# swifter
swift_start_time = time.time()
swi_sqrt = pandas_df.swifter.applymap(np.sqrt)
swift_end_time = time.time() 

print(f'pandas:{pd_end_time-pd_start_time}')
print(f'swifter:{swift_end_time-swift_start_time}')
```
すべての要素に対して1を足す
pandas:16.809720754623413
swifter:0.09489941596984863

すべての要素に対して平方根を取る
pandas:88.26044082641602
swifter:25.88457489013672

圧勝ですね。
めちゃくちゃ早いです。
僕の上司が誰も見ていない間に大量にお菓子を取っていき引き出しにしまう速さ並みに早いです。
しかも、追加したコードは「.swifter」のみ。
pandasしか使ったことない人でも、余裕で使えますね！
polarsに慣れないなぁ。けど、処理速度早くしたいなぁ。という人は是非使ってみてください！

# 終わりに
今回はpandasに左手を添えました。
私自身も最近発見して練習しているところですので、もしかしたら対応していない処理もあるかもしれません。
また、他の処理では書き方が違うかもしれません。
そのようなことがありましたら、教えていただけると助かります。
また、勉強して有益な情報があれば共有します。
それでは！！！
せんせー、再生可能エネルギーってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/7f59d21b-0564-377b-a326-47169950dc66.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/319ddbbb-e9dd-5833-688d-5808a705af9b.png)

せんせー、再生可能エネルギーってなに？

# 再生可能エネルギーとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/754ad1db-cf66-be94-8f33-137d3e28f1cc.png)

再生可能エネルギーというのは、なくなることのない自然の力を使って、電気をつくる方法のことです。

君が公園で風船を飛ばすと、風に乗ってずっと飛んでいきますよね。
また、夏になると太陽の光がじんわりと暖かいよね。これらの風や太陽の光は、
自然からもらえる力で、これがなくなることはないんです。

再生可能エネルギーは、この風や太陽の光を利用して電気をつくるんだ。
例えば、大きな羽を回して風を受ける風車を使って、風の力を電気に変えたり、
太陽の光を受けて電気に変える太陽電池を使ったりするんです。

他にも、川の流れを利用した水力発電や、地下の温度を使った地熱発電など、
自然の力を使って電気をつくる方法があるんです。

これらのエネルギーはなくなることがないから、「再生可能」なエネルギーと呼ばれているんです。
これらをうまく使うことで、地球を汚さずに、必要な電気を作ることができます。

# まとめ

再生可能エネルギーというのは、なくなることのない自然の力を使って、電気をつくる方法のこと