OmniAICreator/Qiita-1.07M huggingface dataset:
RealSense入門: カラーとデプス映像の取得方法

Intel RealSenseは、デブスカメラの1つです。カラーカメラの映像とデプスカメラの映像を取得でき、これにより、3Dスキャンや物体検出などのタスクを実行できます。本記事は、Pythonを使用してRealSenseからカラーカメラとデプスカメラの映像を取得していきます。

必要な物
RealSense: Intel RealSenseカメラ（例：D415、D435）を用意してください。
RealSense SDK 2.0:動作確認用に [Intelの公式サイト](https://www.intelrealsense.com/sdk-2/)からRealSense SDK 2.0をインストールしてください。(なくてもOK)
Python: Pythonがインストールされていることを確認してください。
pyrealsense2: Python用RealSenseライブラリをインストールしてください。
```
pip install pyrealsense2
```
## 1: ライブラリのインポート
```pyhon
import pyrealsense2 as rs
import numpy as np
import cv2
```
## 2: ストリーミングの設定
RealSenseデバイスのストリーミングを設定します。カラーとデプスの両方のストリームを有効にします。
```pyhon
# ストリームの設定
pipeline = rs.pipeline()
config = rs.config()

# カラーストリームを設定
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)

# デプスストリームを設定
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)

# ストリーミング開始
pipeline.start(config)
```
## 3: フレームの取得と表示
カラーとデプスのデータを取得して、OpenCVを使用して表示します。
```pyhon
try:
    while True:
        # フレームセットを待機
        frames = pipeline.wait_for_frames()

        # カラーフレームとデプスフレームを取得
        color_frame = frames.get_color_frame()
        depth_frame = frames.get_depth_frame()

        # フレームがない場合はスキップ
        if not color_frame or not depth_frame:
            continue

        # Numpy配列に変換
        color_image = np.asanyarray(color_frame.get_data())
        depth_image = np.asanyarray(depth_frame.get_data())

        # デプス画像をカラーマップに変換
        depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET)

        # カラーとデプス画像を並べて表示
        images = np.hstack((color_image, depth_colormap))
        cv2.imshow('RealSense', images)

        # 'q'を押してウィンドウを閉じる
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

finally:
    # ストリーミング停止
    pipeline.stop()
    cv2.destroyAllWindows()
```
上記のコードは、RealSenseカメラからカラーカメラとデプスカメラの両方のデータをリアルタイムで取得し、それらを画面に表示します。'q'キーを押すと、コードの実行は終了します。

## コード全文
```pyhon
import pyrealsense2 as rs
import numpy as np
import cv2

# ストリームの設定
pipeline = rs.pipeline()
config = rs.config()

# カラーストリームを設定
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)

# デプスストリームを設定
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)

# ストリーミング開始
pipeline.start(config)

try:
    while True:
        # フレームセットを待機
        frames = pipeline.wait_for_frames()

        # カラーフレームとデプスフレームを取得
        color_frame = frames.get_color_frame()
        depth_frame = frames.get_depth_frame()

        # フレームがない場合はスキップ
        if not color_frame or not depth_frame:
            continue

        # Numpy配列に変換
        color_image = np.asanyarray(color_frame.get_data())
        depth_image = np.asanyarray(depth_frame.get_data())

        # デプス画像をカラーマップに変換
        depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET)

        # カラーとデプス画像を並べて表示
        images = np.hstack((color_image, depth_colormap))
        cv2.imshow('RealSense', images)

        # 'q'を押してウィンドウを閉じる
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

finally:
    # ストリーミング停止
    pipeline.stop()
    cv2.destroyAllWindows()
```
自宅NW環境の変遷

## はじめに
はじめに私は通信キャリア内にてSI業務に従事しています。主に省庁・金融・医療系のNW・サーバの詳細設計工程を担当しています。

実家に帰省して暇すぎたので自宅NW環境の変遷となぜその構成にしたか、構成図と共に理由を含め書いていこうと思います。費用感も記載するので、これから自宅NWをやってみたいという方向けに参考になれば幸いです。

### フェーズ①自宅NWを整える前(2023/03)
最初はごく一般的な構成で市販のBuffaloルータを使用していました。

![無題のプレゼンテーション (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196093/2b4b18aa-2a76-d0eb-b3d1-ed0316319716.png)

### フェーズ②エンプラ用WiFi導入(2023/04)
構成①で運用していく中で以下の2つの問題が発生しました。
・WiFiが不安定に時がある
・自宅のWiFi環境を可視化したい

上記の問題を解決するために、**CleanAir**機能があり、クライアント接続状況の可視化ができる”Aironet2802i”をメルカリにて12000円で購入し、30Wの給電をする必要があったのでPoE+を利用できるTP-LinkのSWHUBをamazonにて5000円ほどで購入しました。

![無題のプレゼンテーション (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196093/e4a07936-7c3d-e090-1f6f-995883d1a30c.png)

:::note info
**CleanAirとは**
スペクトラムインテリジェンスソリューションです。具体的には、外部干渉波を検出し、手動で排除したり、自動的にチャネル変更をするソリューションになります。
:::

### フェーズ③RTX1210導入(2023/07)
ルータに関しては法人向けルータを導入したい！というロマンを叶えるために購入しました。
機器はRTX1210でメルカリにて19000円で購入できました。
![無題のプレゼンテーション (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196093/c2b51a87-5ca9-bc58-3e9d-170faa85b228.png)

### フェーズ③L3SW導入(2023/08)
Aironetを導入したことでSSIDごとにVLANを作成し、用途ごとのNWを作りたくなりました。そこでPoE+を扱えるC3560 CG-8PC-Sを同僚社員づてに15000円で購入、この時点で今後の拡張性を鑑みて以下のVLANを予め作成しました。
また、不要なピアツーピア通信を抑止するためにL3SWで折り返し通信をさせ、ACLにてパケットフィルタリングを実施しました。
RTX1210でも実現はできたかと思いますが、NW環境における役割を明確化させたく、L3SWをCoreSWとして運用しました。
|  VLAN  |  IPアドレス  |  用途  |
| ---- | ---- | ---- |
|  1  |  192.168.11.0/24  |  管理用NW  |
|  110  |  192.168.110.0/24  |  汎用NW  |
|  111  |  192.168.111.0/24  |  ゲスト用NW  |
|  120  |  192.168.120.0/24  |  ファイルサーバ  |
|  130  |  192.168.130.0/24  |  IoTNW  |
|  140  |  192.168.140.0/29  |  サーバファーム  |
|  150  |  192.168.150.0/29  |  検証用NW  |

![無題のプレゼンテーション (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196093/91035835-ea67-65fc-d6f0-97f27e954ee9.png)

### フェーズ④FortiGate導入(2023/10)
様々な機器を導入してあと何が必要か考えたところ、侵入検知やWEBフィルタリングをしてセキュリティを強化したいと思いました。（WAN側がDHCPで貰っていてグローバルIP持っていませんが。。。）
また、将来的にはFortiGateで折り返し通信をさせて、パケットフィルタリングをよりグラフィカルに、管理しやすくしたい狙いがあります。通信効率は悪いですが、管理のしやすさに重点を置きました。
機器はヤフーオークションにてライセンス2年付きのFG-50Eを6000円で購入できました。

![無題のプレゼンテーション (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196093/9f97b585-8d2e-aa0b-2995-ce67d7716694.png)

### 【おまけ】フェーズ⑤サーバ導入(2023/12)
運用していく中で、課題とやりたいことができました
#### 課題：トラブルが起きた時にどの機器で発生しているか、監視＆管理をしたい
機器も4台まで増え、管理が煩雑になる可能性があると感じていました。syslogもそれぞれの機器単独で管理していますし、まとめてログ管理＋機器を監視する必要性を感じました。
#### やりたい事：自由に検証できるラボを作りたい
勤務先での異動に伴って、未経験のサーバに触れる必要が出てきました。なので自学習の意味も込めて自宅ラボが欲しいなと思っていました。

上記をもって自宅にサーバを導入することに決めました。
複数台必要になりますのでESXiを利用します。
・syslogサーバ(ログ管理)
・Zabbixサーバ(機器監視)
・検証用VM4台程度(vCPU1)
上記を仮想ホストとして建てられるよう、同時に稼働できる程度のスペックで購入する製品を選定しました。

購入したのは以下の製品です。
HPE ProLiant Thin Micro TM200/Intel Xeon D-1518 2.20GHz/Mem-64GB/SSD-128G/2TB×2
ヤフーオークションにて55000円で購入しました。

サーバ追加後の構成は以下の通りです。


![無題のプレゼンテーション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196093/0b6b3038-7afa-8102-25fd-e4265ccc62fc.png)

## おわりに
今年は自宅環境を大幅に強化した年になりました。気づいたら一般家庭のNW環境からちょっとした中小企業並みのNWになってました(笑)。これから自宅NW環境を整えたい方の参考になっていたら幸いです。来年はNW環境に大きな変化はないと思いますが、気になる製品があったら購入して組み込もうかなと思います。ご覧いただきありがとうございました。
Beanstalkでeb cliが機能しなくなった時の対応記録

# 状況
Beanstalkでeb cliから以下のコマンドを実行して環境を終了しました。（一時的に停止するつもりで）

```shell
eb terminate --profile myprofile
```

※オプションのprofileはAWSアカウントを指定しています。
詳細は以下のページを参照ください。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-files.html

その後再度環境を再起動させようとしました。

```shell
eb restore --profile myprofile
ERROR: NotFoundError - No terminated environments found.
Environments are available for six weeks after termination.
eb list --profile myprofile
```

通常であればrestoreコマンドで再起動する。listコマンドでは環境の一覧が表示されるという動きになるはずなのですがlistでも何も表示されない状況でした。

### コンソールを確認
beanstalkのコンソールを確認すると環境は表示されていましたがエラーも表示されていました。

```

Stack deletion failed: The following resource(s) failed to delete: [AWSEBSecurityGroup].
xx 月 xx, 2023 xx:xx:xx (UTC+9)  
ERROR Deleting security group named: sg-xxxxxxxxxxxxxx failed Reason: resource sg-xxxxxxxxxxxxxx has a dependent object (Service: AmazonEC2; 
Status Code: 400; Error Code: DependencyViolation; Request ID: xxxxxxxxx; Proxy: null)

```

そしてヘルスの部分はNo Dataとなっていました。

# 原因
前述のエラーを見てもおそらく環境を終了する際に正常に終了できなかったのだと予想します。

エラーメッセージで出ていたセキュリティグループはRDSから参照されている状態でした。RDSはBeanstalk管理外なため削除で失敗してしまったのだと思います。

# 対応概要
まずBeanstalkが正常に終了できていないので終了させる必要があります。
終了させるためにはエラーの原因になっている使われているセキュリティグループを削除する必要があります。
では以下具体的に進めてみます。

# セキュリティグループを削除
### RDS側の設定
まずRDS側の参照設定を外します。
1.RDSコンソールからデータベースを選択し、接続とセキュリティタブのセキュリティグループのリンクからセキュリティグループの設定画面に移動します。
2.該当のセキュリティグループを選択、他で使われていないかを確認してインバウンドタブを選択して「インバウンドのルールを編集」をクリックします。
3.EC2のセキュリティグループを参照しているルールを削除します。

### Beanstalk(EC2)側の設定
1.前述のエラーで表示されていたセキュリティグループのIDをコピーします。
2.EC2コンソール左メニューから「セキュリティグループ」をクリックします。
3.該当のセキュリティグループが他で使われていないことを確認し削除します。

# Beanstalkコンソールから終了をやり直す
念の為コマンドでeb listもeb restoreも試しましたが同じ結果になったのでコンソールから終了を再度試します。

1.Beanstalkコンソールから該当の環境を選択します。
2.コンソールを開いたらアクションボタンのプルダウンから「環境を終了」を選択します。
3.今度は正常に終了できました。

ただここでコマンド（eb listとeb restore）を再度実行してみましたが結果は同じで認識されなかったので引き続きコンソールから進めます。

4.アクションボタンのプルダウンから「環境を復元」を選択します。確認をOKすると復元がスタートします。これで環境は正常に復元できました。

# ebコマンド復活
ここまで進めたら以下のコマンドが機能するようになりました。

```shell
eb list --profile myprofile
```

# その他確認すべきこと
### eb cliの設定ファイルは最後にデプロイした状態と同じかどうか
eb cliの設定ファイル（projectroot/.elasticbeanstalk/config.yml）が書き換わっていると当然ながら反映されません。具体的には以下のような項目がコンソールの環境と一致しているかを確認しましょう。

environment:
environment-defaults:
application_name

# eb cliの注意点
Beanstalkは良くも悪くもCLIツールとコンソールがあります。また今回のようにコンソールから操作するとCLIが認識しなくなったりということもあるのでそこは注意が必要です。ただ最悪の場合は新しくアプリケーションを素早く作ってしまうこともできるのでその辺りはメリットでもありますね。ログファイルなどをS3など外部に出しておけばアプリケーション部分はサーバから丸っと素早く作り直すことができます。
OSI参照モデルを整理する

## 動機
基本情報技術者試験の受験勉強も兼ねてOSI参照モデルについて学習したので、整理するために書きました。

## OSI参照モデルとは
コンピュータネットワークにおける通信プロトコルを役割によって7階層に分けたものです。

ただし分割されたそれぞれのネットワーク機能の説明に使用されますが、あくまで概念に過ぎず、実際に使用されているのはTCP/IPです。

### OSI参照モデル
| 階層 | 階層名 |
|:-:|:-:|
|  第7層 | アプリケーション層  |
| 第6層  |  プレゼンテーション層 |
| 第5層  |   セッション層 |
| 第4層  |  トランスポート層 |
| 第3層 |  ネットワーク層 |
| 第2層  | データリンク層  |
| 第1層  | 物理層  |

下の階層から整理します。

### 物理層
上位層から送られたデータのビットを物理的な信号に変換して転送する層です。0と1だけで構成されたデジタルデータを電気信号や電波に変換して転送し、受け取った側が複合することで元の形式に戻ります。
代表的なものでイーサネット（有線LANを含む）、無線LANなどが該当します。

### データリンク層
物理層で受け取ったデータ、ネットワーク層から要求を受けたデータの転送を行う層です。正しいデータを正しい送り先に届ける役割を持ちます。
正しいデータを送るために、データの衝突を回避するための制御や、データの破損、エラーを検出する機能を備えています。また、正しい送り先（端末）を特定するために、我々の端末が持つMACアドレスという一意な値を使用します。

### ネットワーク層
データリンク層までの層では、LANの外へ通信することができません。つまりはインターネットにアクセスできません。LANの外にある任意の端末とのやり取りを実現するのがネットワーク層です。
ネットワーク層はデータを目的の端末までの経路を選択して転送します。転送を中継するのがルータです。転送先を特定するために使用するのがIPアドレスで、これはIPというプロトコルに基づいています。

### トランスポート層
トランスポート層は通信品質を管理するための層です。代表的なプロトコルにTCPとUDPがあります。
TCPは機器間の通信開始、終了を管理しつつ、欠損したデータの再送要求を行うなどデータの確実性の高さを重視しています。ウェブサーバとの通信のような、確実性が重要な通信で選ばれます。
UDPはTCPと異なり高速性を重視しています。TCPのように通信の確実性を高めることをしないことによって、データの伝送速度を向上させることができます。ストリーミング配信のような、リアルタイム性が重要な通信で選ばれます。

### セッション層
セッションとは、開始から終了までの一連の通信のまとまりです。これを維持するためのレイヤーがセッション層です。
（現在ほとんどのネットワークで採用されるTCP/IPをレイヤーに分けたTCP/IP階層モデルには、OSI参照モデルのセッション層に該当する層は存在しません。アプリケーション層がセッション管理の役割を巻き取っていることが多いです。）

### プレゼンテーション層
画像の形式や文字コードなど、データの表現形式を定義する層です。データの形式が送信側、受信側で異なると人間が理解できる形式に戻すことができません。例えば「文字化け」は文字コードが不適切な場合に起きる不具合です。

### アプリケーション層
我々が普段使用しているアプリケーション、ウェブブラウザなどのソフトウェアが提供する機能についてのプロトコルが属します。ウェブブラウザでウェブサイトを閲覧するときはHTTP、サーバにファイルを転送するときはSMTPなど、処理に応じて適切なプロトコルが存在します。

## 実際には使われていない
OSI参照モデルは実際には使われていません。現在の世界標準はTCP/IPであり、これを階層化したTCP/IP階層モデルは、OSI参照モデルより3層も少ない、4層で構成されています。基本情報技術者試験に限らずこの2つのモデルを比較している場合がありますが、2つは別物です。OSI参照モデルはあくまで、ネットワークの基本的な原則や概念を理解するための説明用のような立ち位置であることに注意する必要があります。

## 参考
[OSI参照モデルとは？TCP/IPとの違いを図解で解説](https://www.itmanage.co.jp/column/osi-reference-model/)
TCP/IP階層モデルを整理する

## 動機
基本情報技術者試験の受験勉強も兼ねてTCP/IPについて学習したので、整理するために書きました。

## TCP/IPとは
インターネットなどで世界標準的に使われる通信プロトコルのことです。

#### 通信プロトコルとは
データをやり取りするための規則です。
IT分野においては「通信」が省略され、単にプロトコルと呼ばれることもあります。

### 何のためにあるのか
データをやり取りするための規則を統一するためです。規則が定まっていないと、同一の規則でやり取りしている端末以外と通信が行えません。

## TCP/IPモデルとは
TCP/IPのプロトコル群の役割を階層構造に分けたものです。インターネットにアクセスするためには、すべての層が欠けることなく役割を果たす必要があります。

| 階層名 | プロトコル例 |
|:-:|:-:|
|  アプリケーション層 | HTTP |
| トランスポート層  | TCP、UDP  |
| インターネット層  |  IP |
| ネットワークインターフェイス層  |  Ethernet、無線LAN |

### アプリケーション層とは
アプリケーションで扱うデータの形式や処理の手順を定めるプロトコルが属するレイヤー（層）です。

#### 例：HTTP
HTTPはWEBクライアントとWEBサーバが通信するためのプロトコルです。
クライアントとは顧客、依頼人という意味です。
サーバとはserve（仕える、奉仕する）行為をする者、つまり仕える者、奉仕する者という意味です。
我々がウェブサイトを見たいと思ったとき、ブラウザを開いて見たいサイトのリンクを開きます。このとき、ブラウザはWEBクライアントとしてWEBサーバに対してリクエストを送り、WEBサーバはレスポンスを返します。

### トランスポート層とは
データのやりとりを制御するプロトコルが属するレイヤーです。通信品質を管理するほか、ポート番号によりデータを振り分ける役割を持ちます。

#### TCP
TCPは信頼性の高い通信を行うためのプロトコルです。TCPは機器間の通信開始、終了を管理しつつ、欠損したデータの再送要求を行うなどデータの確実性の高さを重視しています。アプリケーション層で例に挙げたHTTPはTCPを使用しています。

#### UDP
UDPは高速な通信を行うためのプロトコルです。TCPのように接続やデータをチェックし続けることをしない代わりに、高速でデータを伝送することができます。生放送（ライブストリーミング）のようにリアルタイム性が重視される場合などに選ばれます。

#### ポート番号
TCPやUDPにはヘッダと呼ばれる情報が付与されており、ここにソースポートという情報が含まれます。これは送信元ポート番号を示すものです。クライアント側のソースポートがサーバ側の宛先ポートとなることで、要求したデータが自分宛のものであることを確認できます。
良く知られている番号として、HTTPは80、HTTPSは443、SMTPは25などがあります。

### インターネット層
異なるネットワーク間のデータ転送を行うためのプロトコルである「IP」が属するレイヤーです。

#### IP、IPアドレス
IP（インターネット プロトコル）は特定の宛先までデータを転送するためのプロトコルです。IPアドレスはネットワーク上の機器に一意に割り当てられた識別番号です。これは現実世界でいうところの住所のようなもので、荷物を正しい宛先に送るために住所が必要であるように、IPアドレスはインターネットにおいて必要不可欠なものです。

### ネットワークインターフェイス層
同一ネットワーク内でデータ転送を行うためのプロトコルが属するレイヤーです0と1だけで構成されたデジタルデータを電気信号や電波に変換して転送し、受け取った側が複合することで元の形式に戻ります。このデータは同一のローカルなネットワーク（LAN）内でやり取りすることができます。

#### Ethernet（イーサネット）
世間一般的に知られる有線LANはイーサネットの一種です。データを電気信号などに変換して送ります。

#### 無線LAN
俗にwifiと呼ばれるものです。データを電波に変換して送ります。

## OSI参照モデルとの関係
OSI参照モデルとの比較に使われることがありますが、似て非なるものです。現在の世界標準であるTCP/IPはOSI参照モデルに則ってつくられたわけではないようで、それぞれの階層を完璧に対比させて関連付けるには無理があります。OSI参照モデルはインターネットの基本的な原則や概念を学ぶ用であり、TCP/IP階層モデルはより現実的なインターネットの実情に近いものです。

## 参考
[TCP/IPとは？通信プロトコルの階層モデルを図解で解説](https://www.itmanage.co.jp/column/tcp-ip-protocol/)
同時に処理を実行して高速プログラムを書こう！

速度改善で悩まれている方は多いと思います。
今回は速度改善の手法として並列処理と並行処理を紹介します。

※今回紹介する並列処理と並行処理を組み込むには特別なライブラリのインストールは必要とせず、
Pythonの標準ライブラリで対応することができます。

https://docs.python.org/ja/3/library/concurrent.futures.html

通常の処理と並列処理と並行処理を比較するにあたり、以下を理解する必要があります。
※前提条件として処理Aと処理Bが存在する。
|処理名  |詳細  |
|---|---|
|通常の処理  |順番に処理を行う。処理Aが終了次第、処理Bが実行される。  |
|並列処理  |処理Aと処理Bの同時に処理を実行し、結果が出たもの順に出力する。  |
|並行処理  |処理Aと処理Bを細かく分割し、AとBを効率よく切り替えて処理する。  |


利用PCの処理性能が高いことに加え、簡易なプログラムのため、
並列処理と並行処理の差分があまりないですが、実行速度を比較していきます。

|処理方法  |実行速度  |
|---|---|
|通常の処理  |11.012077569961548  |
|並列処理  |6.057596921920776  |
|平行処理  |6.009162187576294  |

## 通常の処理
### プログラム
```python
import time

def fun1():
  time.sleep(1)
  print("a")
  time.sleep(5)
  print("c")

def fun2():
  time.sleep(2)
  print("b")
  time.sleep(3)
  print("d")

def main():
  start = time.time()
  fun1()
  fun2()
  end = time.time()
  time_diff = end - start
  print(time_diff)

main()
```
### 実行結果
```
a
c
b
d
11.012077569961548
```

## 並行処理
### プログラム
```python
import time
import concurrent.futures 

def fun1():
  time.sleep(1)
  print("a")
  time.sleep(5)
  print("c")

def fun2():
  time.sleep(2)
  print("b")
  time.sleep(3)
  print("d")

def main():
  start = time.time()
  with concurrent.futures.ProcessPoolExecutor(max_workers=2) as executor:
    executor.submit(fun1)
    executor.submit(fun2)
  end = time.time()
  time_diff = end - start
  print(time_diff)

main()
```
### 結果
```
a
b
d
c
6.057596921920776
```

## 並列処理
### プログラム
```python
import time
import concurrent.futures

def fun1():
  time.sleep(1)
  print("a")
  time.sleep(5)
  print("c")

def fun2():
  time.sleep(2)
  print("b")
  time.sleep(3)
  print("d")

def main():
  start = time.time()
  with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor:
    executor.submit(fun1)
    executor.submit(fun2)
  end = time.time()
  time_diff = end - start
  print(time_diff)

main()
```
### 結果
```
a
b
d
c
6.009162187576294
```
【Terraform】 Organizationにリポジトリを作成しようとしたら個人アカウントの方に作成されてしまった件

# はじめに

Terraformの[GitHubプロバイダ](https://registry.terraform.io/providers/integrations/github/latest)で個人アカウントと組織に対してリポジトリを作成しようとしました。

認証にはGitHub CLIを採用し、個人アカウントの方には無事にリポジトリを作成することができました。しかしいざOrganizationにリポジトリを作成しようとした所、個人アカウントの方にリポジトリが作成されてしまいました。

今回はそんな不具合（？）の解消法を記事にまとめたいと思います。

# 解消方法

先に解消方法からまとめますと、`required_providers`というブロックをリソース（モジュール）側にも、それを呼び出す`main.tf`側にも記述する必要がありました。

以下はモジュール側のコードです。

```terraform:modules/repository/main.tf
terraform {
  required_providers {
    github = {
      source  = "integrations/github"
      version = "~> 5.0"
    }
  }
}

resource "github_repository" "this" {
# 省略
```

そして、それを呼び出している側のコードが以下になります。こちらにも`required_providers`を記述します。

```terraform:environments/xxx/main.tf
terraform {
  required_providers {
    github = {
      source  = "integrations/github"
      version = "~> 5.0"
    }
  }
}

provider "github" {
# 省略
```

コードを修正後、`terraform apply`を実行することでOrganization側にリポジトリが作成されるようになりました。

# バグの発生状況

以下のファイルがある場所で`terraform`コマンドを実行しました。

```terraform:environments/my-org/main.tf
terraform {
  required_providers {
    github = {
      source  = "integrations/github"
      version = "~> 5.0"
    }
  }
}

provider "github" {
  # Authenticating with the GitHub provider using GitHub CLI.
  owner = "my-org"
}

module "repositories" {
  source = "../../modules/repository"
  for_each = local.repositories
  name = each.key
  description = each.value.description
  visibility = each.value.visibility
}

locals {
  repositories = {
    "example-repo": {
      "description": "An example GitHub repository",
      "visibility": "public",
    }
  }
}
```

モジュールの内容は以下の通りです。設定内容に関しては[GitHubの権限管理をTerraform化して幸せになろう #GitHub - Qiita](https://qiita.com/moajo/items/a840ecf88607ff583c02)を参考にしました。

```terraform:modules/repository/main.tf
resource "github_repository" "this" {
  name        = var.name
  description = var.description
  visibility  = var.visibility

  ## Features
  has_issues = true

  ## Pull Requests
  allow_rebase_merge = false
  allow_update_branch = true
  delete_branch_on_merge = true
}

# 省略
```

これらのコードを元に`terraform apply`コマンドを実行した所、`provider`ブロックの`owner`に記述したOrganizationではなく、個人アカウントの方にリポジトリが作成されてしまいました。

# 原因

解消方法の章にもある通り、`required_providers`が悪さをしていました。

こちらに関して、[GitHubプロバイダのドキュメント](https://registry.terraform.io/providers/integrations/github/latest/docs#example-usage)に以下のような記述があります。

> You must add a required_providers block to every module that will create resources with this provider. If you do not explicitly require integrations/github in a submodule, your terraform run may break in hard-to-troubleshoot ways.

すべてのモジュールに`required_providers`ブロックを追加しなければならない。という記述を見落とし、呼び出し側のみに記述していました。
その結果、terraformの実行が壊れてしまっていたようです。

# まとめ

今回はTerraformのGithubプロバイダを使っている際に遭遇した不具合（？）についてまとめた。

不具合というより、ドキュメントの読み落としが原因でしたが、これによりかなりの時間を費やしました。

今回使用したのがGitHubだったためまだマシですが、AWSなど影響が大きいサービスのプロバイダを使う際にはドキュメントをよく読み込むべきだなと感じました。

# 参考

https://qiita.com/moajo/items/a840ecf88607ff583c02
MLPとCNNを組み合わせるモデル【CgMLP】




**原論文**
Convolutional Gated MLP: Combining Convolutions & gMLP
https://arxiv.org/pdf/2111.03940.pdf



# 結論
MLPとCNNを組み合わせたら良くなった．

# 概要
画像認識モデルとしてCNNやViTがあるが，それとは別にMLPのみを使用したMLP系の画像認識モデルが提案されている．MLP系モデルにゲートを組み込んだ「gMLP」がある．これは，MLPのみで構成されているがCNNやViTと同程度の性能を持つ．
また，CNNとViTを組み合わせることによる性能向上するモデル「CvT」は，CNNとViTの異なる認識特性で互いの弱点を補うように機能している．この論文では，CvTにならってMLPと畳み込みを組み合わせる手法「CgMLP」を提案している．下図の最下段がCgMLPである．

![スクリーンショット 2023-12-31 13.26.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/df3d17e4-c3b3-a96e-8e6c-c65a87d0ed92.png)




# モデル構造
最初の処理に2層の畳み込み層を使用する．これにより，特徴マップのダウンサンプリングによる計算量削減，その後のMLPに有効な認識を補助する役割がある．下図では，畳み込み後の特徴マップでは，車の輪郭や形状の特徴を強めており，認識対象の重要な特徴の理解を補助する．畳み込み後は，特徴マップをパッチ分割し，gMLP層の計算をする．また，gMLPはSA同様に位置の保存が不可能であり，位置埋め込みを使用しないため，CNNは位置の保存のような役割もある．


![スクリーンショット 2023-12-31 13.52.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/20f68533-a12c-57a6-7551-cdc0e47e062d.png)



## ゲートの役割
このゲートを組み込んだ手法は様々あり，ConViTは，ViTにゲートを組み込み，畳み込みで認識させる?かSelf-Attention（SA）で認識させる?かの並列計算をゲートで制御することによって変化させて精度向上を目指している．これは，畳み込みの認識とSAの認識がお互いに異なる認識特性を持ち，それぞれの弱点を補完しあうように機能している．

![スクリーンショット 2023-12-31 13.22.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/defa1e19-94be-099a-a017-cca936ebf785.png)

この論文が提案する手法では，下図の右のような構造をしている．CNNとMLPが分かりやすく並列になっているのではなく，CNN→gMLPの直列であるが，ConViTのような並列効果がある．
下図の黄色の枠で示す部分を説明する．特徴マップを半分に分割する．右片方にMLPの処理，左片方は何もしない．これは，右にCNN→MLPの処理をした特徴マップ，左にCNNの処理した特徴マップでそれぞれの特徴マップをゲート◉で連結させる．連結する際にどちらのルートの特徴マップを優先させるかを調整する．これは，上図のconvとTranの並列計算が，CNN→MLPとCNNの並列計算に置き換わっているとほぼ同義である．

![スクリーンショット 2023-12-31 13.51.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/ee04db5d-78b6-a181-8ade-5704cdc38386.png)




# おわりに
今回は，MLPとCNNを組み合わせるモデル【CgMLP】について解説した．従来のCNN+ViTのようにCNN+MLPでやってもよくなった．ゲートを使用して並列計算を実現して，CNN→MLPとCNNのどちらのルートを優先させるかを学習して導く．今後の画像認識モデルにMLPが有効になるかもしれない．
Safariでkeyframeアニメーションが動かなくなった

# 事象

keyframeアニメーションが、いつの間にかSafariで動かなくなっていた。
元々は要素にホバーすると要素が上に消えて下から出てくるアニメーションだったが、
0%の時点で、要素が消え、100%の時点で再度表示される点滅になってしまっていた。

```css
@keyframes textRollUp {
  0%   { transform: translateY(0); }
  30%  { transform: translateY(-100%); opacity: 0; }
  30.1%{ transform: translateY(50%); opacity: 0; }
  100% { transform: translateY(0); }
}

.wrapper:hover .txt {
  animation: textRollUp 0.5s linear;
}
```

# 対策

極小のdelayを追加すると問題が解消された。

```css
.wrapper:hover .txt {
  animation: textRollUp 0.5s linear 0.001s;
}
```

Apple製品は作り込みが甘くてこういう厄介な問題を起こしがちなのが嫌なんだよなー。
[Win11]Parallels Desktopで英数/かなを使用する方法

こんにちは。
今回は、Parallels Desktop上のWindows 11で英数・かなキーを使用できるように設定する方法を紹介します。

:::note
**環境**
Mac mini M2 Pro 32GBメモリ
macOS 14
Parallels Desktop 18
:::

# Microsoft IMEのバージョンを戻す
新しいMicrosoft IMEでは変更できないようなので、古いIMEに戻します。

## 設定から言語設定へ
![Lang.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518709/07527362-6fdd-a625-f11f-7f631b4ec69f.png)
設定アプリで時刻と言語設定に行きます。
「言語と地域」を押して言語と地域の画面に行きます。

## 日本語のオプションへ
![Lang2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518709/6d23b952-2d2b-2636-6ae3-d11ee4e6b073.png)
日本語のオプションボタンを押して、言語のオプションを選択します。

## Microsoft IMEのオプションへ
![Lang3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518709/d82e2351-a970-f053-96fe-8a68700b4447.png)
Microsoft IMEのオプションボタンを押してキーボードオプションを選択します。

## 全般のオプションへ
![Lang4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518709/153b823d-e685-cd02-b0e8-02170cd4bf50.png)
全般を選択します。

## 以前のバージョンのIMEに変更
![Lang5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518709/8175eecb-8c6b-b1a7-553f-b282da3c577c.png)
「以前のバージョンのIMEを使う」をオンにします。

# キー配置を変更
英数/かなキーに対応させます。

## プロパティを開く

![スクリーンショット 2023-12-31 13.59.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518709/babb7095-a43b-d71a-cde1-7ebf5bd58522.png)
タスクバーにあるIMEのボタンからプロパティを選択

## 詳細設定を開く

![IME1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518709/e92ca8f8-4105-7887-c7b8-98e75c5d1408.png)

詳細設定を選択します。

## アクションの設定を開く

![IME2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518709/288908a3-19f2-df26-a65f-34122366d879.png)

IMEのキーの設定で、アクションを設定します。
キー設定の変更を選択します。

## 英数キーを設定

![IME3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518709/ca9c4c8a-b449-0194-c173-e4d21e87fc90.png)
「無変換」という行の「入力/変換済み文字なし」の列を「IME-オフ」に変更します。

## かなキーを設定

![IME4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518709/563d89e2-98f0-b5f2-ecc9-b36351553327.png)

「ひらがな」という行の「入力/変換済み文字なし」の列を「IME-オン」に変更します。

## 保存してテスト
適用ボタンを押して適用し、入力欄などをクリックしてから、切り替えられるかチェックします。

# おわりに
この手順を試してみるとできると思います。
画面中央の表示を消したい場合は、

設定＞時刻と言語＞言語と地域＞日本語＞言語のオプション＞Microsoft IME＞キーボードオプション＞デザイン＞画面中央に入力モードを表示する

をオフにすると出なくなります。

それではまた他の記事で！
SELINUXの無効化方法

### SELINUXの無効化方法

1. **一時的な無効化**
   - コマンド: `sudo setenforce 0`
   - 注意: この方法は一時的なもので、システムを再起動すると再度有効になります。

2. **永久的な無効化**
   - 第一ステップ: 設定ファイルを編集する。
     - コマンド: `vim /etc/sysconfig/selinux`
   - 第二ステップ: ファイル内の`SELINUX=enforcing`の行を見つけて、`SELINUX=disable`に変更して保存し、ファイルを閉じる。
   - 注意: この変更はシステムを再起動した後に適用されます。
【Ruby】Ruby silver合格までの流れをまとめてみた【2023】

## はじめに
同じような記事がたくさんありますが、自身の成長記録として書き残そうと思います。
(また、現時点では最新なので誰かのお役に立てば幸いです)

## 受験者スペック
・プログラミング歴:約1年
・Ruby歴:同上
・Ruby使用頻度:業務で毎日

## 所要時間
・約３週間
　(内訳)
　▫️参考書1週間(平均30分/日)
　▫️模擬問題2週間(模擬問題1周/日ペース)
・集中して時間を取ればRubyやってる人なら2週間ぐらいで合格できるかと思います。

## 実際にやった勉強法
#### 参考書
・試験用の[参考書](https://www.amazon.co.jp/%E6%94%B9%E8%A8%822%E7%89%88-Ruby%E6%8A%80%E8%A1%93%E8%80%85%E8%AA%8D%E5%AE%9A%E8%A9%A6%E9%A8%93%E5%90%88%E6%A0%BC%E6%95%99%E6%9C%AC-Silver-Gold%E5%AF%BE%E5%BF%9C-Ruby%E5%85%AC%E5%BC%8F%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8/dp/4774191949)があるので購入(5,600円ぐらいするので結構高い)。
・試験範囲把握のため一周読み通す(頑張れば2-3日で読める)。
・SilverとGoldの試験範囲両方を網羅しているが、それぞれの範囲が明記されている。
・巻末に模擬問題が付録されている(練習問題含めて80問)。

#### [REx](https://rex.libertyfish.co.jp/)
・一番利用した。10回以上は解いたと思う。終盤はコンスタントに9割取れていた。
・Githubアカウントとの連携が必要だが、さまざまな模擬問題が提供されている。
・スマホでも解けるので移動中も解けて便利。
・基本的に同じような問題が出題されるので、問題の暗記にならないように理由も説明できるレベルを目指す。
・正当以外の選択肢も挙動がわからないものはpryやirbで出力結果を確認する。

#### [Githubの模擬問題](https://gist.github.com/sean2121/945035ef2341f0c39bf40762cd8531e0)
・90点以上取れるまでやる。

## 合格できるであろうベースライン
・勉強法は人それぞれと思いますが、Rexほか模擬問題で9割以上の点数が取れて、なおかつ理由を説明できれば落ちることはまずないと思います。
・メソッドが破壊的かどうか、論理演算子の評価の仕組みなどが出題内容としては多いので重点的に。
・IO,File,Dirクラス、正規表現の問題もそこそこ出るので押さえておく。

## 受験方法
・[PROMETRIC](https://www.prometric-jp.com/examinee/test_list/archives/10)でIDを作成
・受験会場と日時を選択して予約
・平日は割と幅広い時間と場所を選べるが、土日はやってないようなので注意(東京で土日の日程を調べたらなかった)。
・当日必要なものは免許証などの本人確認書類(詳細は予約後の確認書で)

## 受験会場
・テストセンターみたいな感じで他の試験の受験者と一緒に間仕切りのあるパソコン室のような部屋で受験。
・画面の指示に従って正当をクリックしていくだけなので特に難しいことはない(不安な人は[体験版](https://www.prometric-jp.com/examinee/procedure/)があるらしいので事前チェックもできる)

## 結果と感想
・結果:84点
・解き終わった時の体感は90点は硬いと思っていたので残念。。
・当たり前だがRExや問題集とは違った問題が多数ある。
・RExは問題がパターン化されているので、それで90点以上取れても本番でどうなのかと不安はあったが仕組みを理解していれば特に焦ることはなかった。
・全然わからない！と思った問題は1-2問程度。
・小手先で理解していたrubyに対する解像度が上がったので受けて良かったと思う(pryなどで実際に動かすの大事)。
【これを読めば誰でも出来るSlackアプリの作り方】SlackAPIを使うための準備

# はじめに
赤ちゃんエンジニア用の技術メモです。
Slack APIを使って色々やってみたいことが出てきたので、その準備としてSlackアプリを作ってみる。


# よし、Slackアプリを作るぞ

### まずslackapiを開こう。[こちら！](https://api.slack.com/)

### 手順に沿ってやっていこう
### ①右上のハンバーガーメニューをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/e63281d3-2ae7-4ebe-8aee-64ec62792208.png)

### ②Slack appps `Getting started` をクリック
![slackapi_scope_手順2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/093892fd-70d0-b747-db13-2e80aadbe910.png)

### ③`Go to Your Apps`をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/f27f94cb-c7b0-cce3-2de9-ade8c42b5119.png)

### ④**Create an app**>`From scratch`を選択
アプリの名前を決めて、アプリを追加するワークスペースを選択する

### 権限追加ページまで行くよ
### ⑤**Add features and functionality**>`Permissions`を選択>**Scopes**>**User Token Scopes**の`Add an OAuth Scope`をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/e3af3934-f310-5a43-fa9c-edf2a8da721b.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/032c1563-e0ce-6c37-bd68-0eb6ae655765.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/a49367b3-99c0-1b61-8a00-c6e978d1a639.png)

### ⑥権限追加
呼び出したいAPIによって必要な権限が決まっている。
過去の投稿を取得したい場合は`channels:history`などなど。
お好きなようにカスタムしてください～
（[2023年1番リアクションをもらった投稿、知りたくない？](https://qiita.com/Himeka_Kawaguchi/items/dfed601108f7caa62009)を参考）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/ea7b3855-e3d9-db9c-83fa-b4b01c7da8eb.png)

### あともう少し
### ⑦Workspaceにインストール！（ほぼ完成）
`Install to Workspace`をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/e6f5a4fc-bdc9-32cb-abef-b6ed88975d62.png)

### ⑧トークンを取得
やっと、やっと完成！手順に書き起こすと長い！
Slack APIを扱うためにはトークンが必須。

## おわり
こんなに長々と書く内容なのか分かりませんが、参考になれば幸いです。
記事を書くことで一連の流れを復習でき、次からスムーズにアプリ作れるわーという自信で溢れ出てます。
これがアウトプットする意味なのかも！
おしまい
次世代プロジェクト管理ツールの構想を練る（６）

https://qiita.com/EasyCording/items/2e1537e67c453e5e9087

この1年、たいして構想も進んでいないが、来年には我が家で使えるＰＪＴ管理ツールなるものをリリースしたいと考えている。

# 仕様

　以下は数々のＰＪＴマネジメントツールのソフトを触りまくって、自分が痒い所と感じる部分を切り崩しまくって、最終的な結論めいた部分に触れていく。
 　以降は、自分が痒いと感じた所に、★マークを付けていく。

# 調査したソフト

これらはGPT先生との会話から掘り下げて入手したソフトの一覧である。

## OrangeScrum: An open-source project management tool that can be customized with AI functionalities.

https://github.com/Orangescrum/orangescrum

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/e5dca8bc-9048-4359-0cb9-7507163a4196.png)

Orangeといえば、AIをノーコードで出来たりする https://orangedatamining.com/
と関係あるかと思いきや、無関係だった。

* 既存のRedmineデータを、CSVで流せるかどうかが肝。
→　どうやら画面の右端に、ヘルプが出せるので、すぐに機能の確認には入れたのは嬉しかった　★★★★★

* CSPインポートはデータ変換のような痒い機能はなかった　→　この時点でサヨウナラ

## ScrumDo: Offers AI-driven insights and recommendations for improving team performance and meeting deadlines.

https://www.scrumdo.com/

見た目は少しフォントが硬いイメージ
インテグレーションで外のツールと連携は充実しているが、肝心のＣＳＶインポートは見当たらない
→　カードのストラクチャー設定が出来るので、おそらくデータ連携はし易そうな気がする　★★★

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/56825eb1-9933-5e07-0d59-e63e6ab0aaad.png)

面白いのはタスクにタイマーが付いていて、クリックするとカチカチ動き出した。
カレンダーが時間単位で連動していて、タスクの工数管理が可視化出来ていて面白い。
→　こういうのがあると、子供は勉強をゲーム感覚でトライできるのではないだろうか　★★★★★

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/a1906bf6-4770-93d2-2cf3-f04bbbf3ecf1.png)


## Toggl Track: Known for its time tracking capabilities, it can be enhanced with AI for deeper productivity analysis.

https://toggl.com/track/

さらに工数管理のみに特化したソフト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/2b96abc7-9f55-6997-a964-49f1370de290.png)

ダッシュボードで進捗が可視化できるので、やる気が出ますねえ～　★★★


## PLANVIEW AgilePlace : Focus on the investments that matter. Empower your teams to do their best work.

https://www.planview.com/products-solutions/products/agileplace/


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/ea4b9191-3e42-d641-0a04-1fd0c4684c52.png)

アジャイルな看板メニューです。右端に最近の活動というのが書かれていて、こういうのも進捗を振り返るのに良いＧＵＩですね～　★★★


# AI総括

検討されたツールに関する記事の内容を踏まえると、次世代のプロジェクト管理ツールに求められる機能は以下のようにまとめられます：

* データ互換性とインポート機能： Redmineなど他のプロジェクト管理ツールからのデータをスムーズにインポートできる機能は重要です。特に、CSV形式でのデータ移行をサポートすることで、ユーザーが既存のデータを容易に新しいシステムに移行できるようにすることが望まれます。

* 柔軟なタスク管理： タスクの親子関係を柔軟に管理できる機能。これには、タスクの粒度や構造を簡単に変更できるGUIの提供が含まれます。ユーザーが直感的にタスクを整理し、プロジェクトの構造を簡単に調整できるようにすることが重要です。

* 進捗の可視化： プロジェクトの進捗状況をリアルタイムで視覚的に表示する機能。ダッシュボードや看板メニューを通じて、タスクの進行状況やチームのパフォーマンスを一目で確認できるようにすることが重要です。

* タイムトラッキングと工数管理： タスクにタイマーを設定し、実際にかかった時間を追跡する機能。これにより、工数管理が容易になり、プロジェクトの時間管理が効率的に行えるようになります。

* アジャイル開発サポート： アジャイル開発方法論に対応した機能。スクラムやカンバンなどのアジャイル手法をサポートし、柔軟かつ迅速なプロジェクト管理を実現することが求められます。

* ユーザーフレンドリーなインターフェース： 直感的で使いやすいユーザーインターフェース。ユーザーが迷わずに機能を利用できるようなデザインと操作性が重要です。

これらの機能は、プロジェクト管理ツールのユーザビリティを高め、プロジェクトの効率的な管理をサポートするために重要です。また、これらの機能を組み合わせることで、より包括的で強力なプロジェクト管理ツールを開発することが可能になります。
標準ユーザ、PowerShellでパスワード変更、実行ポリシーBypass、RemoteSigned編～ps1ファイルで実行の巻～

以下実行
```
PS C:\Users\（管理者ユーザ名）> Set-Location C:\Users\x\Desktop
PS C:\Users\（標準ユーザ、現在のユーザ）\Desktop> New-Item password.ps1

    Directory: C:\Users\（現在のユーザ）\Desktop

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---          2023/12/31    13:14              0 password.ps1
PS C:\Users\（現在のユーザ）\Desktop> notepad password.ps1
PS C:\Users\（現在のユーザ）\Desktop> Set-ExecutionPolicy -Scope CurrentUser BypassかRemoteSigned
PS C:\Users\（現在のユーザ）\Desktop> .\password.ps1

```

```password.ps1
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Administrators")) { Start-Process powershell.exe "-File "$PSCommandPath"" -Verb RunAs; exit }

$PASSWORD = ConvertTo-SecureString -AsPlainText -Force -String "パスワード"
Set-LocalUser -Name "現在のユーザ名" -Password $PASSWORD
```
パスワードの変更完了
エンジニア2年目ふりかえり

# はじめに
今年の12月でWebエンジニアへ転職して2年経過したので、ふりかえってみます。


# 仕事
上司の一言で、運よく大きい規模の案件のPLを経験してみたり、いろんな案件のタスクを任されたり、外部サービスからいろんなAWSのサービス利用して機能を追加したり、Gitでやらかしたり・・・💦
1年目と比較するといろんなことを任せていただけるようになったのかなっと感じてます。色々経験する中で、技術面が低すぎるところが課題なのでしっかり課題をクリアしていきたいと思います。
また、PLを経験したことで他メンバーとの信頼関係がグッとアップしたような気がして、1年目よりも積極的にコミュニケーションをとろうと意識した年でもありました。

# 勉強会・交流会
2023年1月のエンジニアの輪で、LTチャレンジしようと申し込むもコロナになってしまって直前でキャンセルしてしまって、申し訳ない気持ちの年明けになりました。
また、PHPカンファレンス福岡2023参加して、勉強になり楽しいなぁ〜と思いつつ参加者の方々に話しかけきれなかったなぁ・・と心残りもありつつ、2023年12月のエンジニアの輪で、LT再チャレンジで、「入社2年目、未経験エンジニア：PL体験記」を声震えつつも発表、その後の交流も参加していい感じに最後締めれたと思います。

https://circle-of-engineer.connpass.com/event/303600/


# プライベート
今年は運動を習慣化できたのが大きかったので、今後も筋トレとウォーキングを継続しつつ、健康管理もしっかりしていこうと思います。
元々インドア派ですが、来年はもっと交流を広げたい目標があるので、今年の11~12月から積極的に友人と会ったり、親を旅行に連れて行ったり、勉強会に参加したりなど、人と会って話をして、自分の視野・考え方をもっとアップデートできるように、機会を増やしていきたいと思っています。


# 来年の目標
エンジニアへ転職して2年経過しますが、アウトプットが上手くできていなかったので、来年は月1本記事を投稿・AWSのSAAの資格取得・交流の輪を広げることを意識して、だらだらYouTubeみたり、もったいない時間の使い方をしていたところは反省してよくない習慣を減らして、良い習慣を増やせるように3年目もエンジニアとして頑張っていきたいと思います！
MAUI Gridレイアウトの行列定義

Gridレイアウトで最初に行列を定義するとき
以下のように＊で簡潔に定義が可能、以下だと6行4列のGridが出来る
```
  <Grid Padding="10" RowSpacing="10" ColumnSpacing="10"
        RowDefinitions="*,*,*,*,*,*"
        ColumnDefinitions="*,*,*,*">
```
各行の割合を変えたいときは、以下のように数値をつける。
最初の行だけ他の2倍の大きさとする場合
```
  <Grid Padding="16" RowSpacing="2" ColumnSpacing="2"
        RowDefinitions="2*,*,*,*,*,*"
        ColumnDefinitions="*,*,*,*">
```
未経験からフリーランスエンジニアになって案件を取るまでの流れと訪れる試練

# 結論

**いきなりフリーランスデビューするのは無謀です。ほとんどの場合なれません。**

# Q.泣き寝いりするしかないのか?

A.そんなことはありません。
未経験からフリーランスになりたい人はに与えられた以下の試練を乗り越えればいいだけです。


1. フロントエンドからバックエンド・インフラ・データベースまで幅広く深い知識を身につける
1. 地方の企業に非正規でも正規でもとりあえず雇っていただき、使う人がいるシステム/アプリの開発を行う
1. 手取り10万円台を2~3年ほど我慢する
1. 休日も個人開発等でアプリ開発をやめない
1. 勉強時間は1日４時間でも少ないという価値観を身につける(生活費のためにバイトしてても時間的には少ない)

# Q.なぜこのような試練が与えられるのか
**業務委託をする側はプロが欲しいから**
**プロにしかお金を払いたくないから**

つまり、「スクール卒業しました!まだ現場のこと何もわからないけど仕事ください！！」って人に高い給料払うわけがないってことなんですよね。当たり前ですけど...

# Q.案件を取るために必要なもの（体験談）
- 実務経験
- コミュニケーションスキル
- スキルマッチ度
全てバランスよく取れないとクライアントもエージェントも相手にしてくれません。

# Q.具体的なロードマップ(Web系の場合)
### 以下のスキルを習得し**実務経験を1~3年ほど**積む

- バックエンド(1つもしくは全部)
    - Python/Django
    - Ruby on Rails
    - PHP/Laravel


- フロントエンド(全部いると思う...)
    - Typescript
    - Javascript
    - React
    - Next.js

- インフラ(全て)
    - AWS
    - Nginx
    - Ubuntu
    - Docker
    - Terraform
    - CircleCI


### 比較的に入りやすい条件で低収入で我慢しながら実務をこなす
バイトだろうが正社員だろうが掛け持ちだろうが関係なく実務に携わる経験を積んでいく

### アウトプット重視で勉強しながら個人開発をしていく
個人開発しながら技術ブログ・X(旧Twitter)をして発信を続ける

### 3年ほどの実務経験ができたら案件の獲得を行う
主に2種類ある
- 決裁権を持った友達や個人経営をしている友達に仕事を頼んでみる
- エージェントを使う

個人的には後者がおすすめ
python自身で再起動する方法

## Python自身で再起動とは
Pythonを使用していて、エラーなどの理由からPythonのコードを再起動させた方が早い場合など、ありますよね。
そういった場合は次の手段が有効となります。
（ただし基本的にこれは強行手段なので褒められるやり方ではありませんし、推奨できるものではないことを念頭に次へお進みください。）

使う場面を上げれば死活チェックのシステムで使えそうですね。
自分では予期していない、ライブラリ内でメモリリークが発生し止まってしまう場合などは中々対策ができないので使えるかもしれません。

## 手法

pythonファイルと同階層に以下のbatファイルを作成します。
```bat:restart.bat
python main.py
```


``` python: main.py
import subprocess
import sys
import os
import time

print("hello")
# 3秒後に再起される
time.sleep(3)

# batファイルを実行させる
subprocess.Popen([fr"{os.getcwd()}\\restart.bat"])
# このPythonのプロセスを閉じる
sys.exit()
```


このようにbatファイルを用いて、外部から新たなPythonファイルの実行を促すことで間接的に再起動を行うことが可能となります。

![bandicam-2023-12-31-13-10-12-941.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553823/49aad859-44d4-fb5a-d7ad-5250f3be8bdc.gif)


## 注意
処理の途中に**time.sleep**を入れ、待機させていますがこれがないと高速でループしてしまいPCに高負荷をかけてしまうので注意してください。
標準ユーザ、PowerShellでパスワード変更、実行ポリシーRemoteSigned編

PowerShellは管理者権限で行う
```
PS> Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
PS>$PASSWORD = ConvertTo-SecureString -AsPlainText -Force -String "変更したいパスワード"
PS>Set-LocalUser -Name "パスワード変更するユーザ名" -Password $PASSWORD
```
Xcode　エミュレータで画面録画する方法

iOSのエミュレータに画面録画する機能を最近まで知らなかったので、紹介してみようと思います。


![スクリーンショット 2023-12-31 12.58.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/a000418c-dbef-5673-24c2-43bae0072042.png)

こちらエミュレータの上の部分です。
optionキーを押したままにすることで、真ん中のカメラアイコンが録画ボタンに変わりクリックすることで録画することができます。

ちょっとした動作の共有などで便利だと思います。
標準ユーザ、PowerShellでパスワード変更、実行ポリシーBypass編

Powershellは管理者権限で行う
```
PS> Get-ExecutionPolicy -list

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine    RemoteSigned

PS> Set-ExecutionPolicy -Scope CurrentUser Bypass
PS>$PASSWORD = ConvertTo-SecureString -AsPlainText -Force -String "変更したいパスワード"
PS>Set-LocalUser -Name "パスワード変更するユーザ名" -Password $PASSWORD
```
flutterのandoirdアプリを内部テストしようとしたら起動できなくて泣いちゃった。。。

## 事の背景
昔、公務員として土木業界で働いていたのですが、当時の現場作業を簡略化できるアプリを作りたい、、、
そう思い経験０のFlutterに手を出してみた。
いざ、リリースに向けて内部テストでabbファイルをアップロードするも、スマホにインストール後「開く」ボタンが出てこず起動できない。。。
私が愛してやまないflutter cleanコマンドと とビルドを繰り返すも全く解決せず、ということで本当に泣きかけていた。

## 結論
AndroidManifext.xmlファイルの <intent-filter>は、初期から追加する際は別タグを用意する必要がある。
助けてくださったサイトはこちらです、、、本当にありがとうございました!!!!
https://note.com/chute/n/n75cde5f1712a

## 症状の詳細

こちらではgoogle play consoleの詳細は省く。
内部テストでリリースしたアプリのURLをスマホで開き、アプリをインストール。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821194/1ce08400-6b85-cdfe-2b01-a91f5c0d2beb.png)

インストール後、「アプリを開く」ボタンがどこにもない、、、、
ここで雲行きが怪しくなり、cleanコマンドを繰り返すだけのマシンとなってしまった。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821194/bc7af68d-c7c3-9b72-277c-ff5f009b6e54.png)



## 対応策
intent-filterタグにて、プロジェクト開始から入っている

```
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
```
だけを一つのタグで囲み、後で追加するものについては、別タグを作成して囲んでやる必要があるようだ。下記のような対応。


```xml:AndroidManifext.xml 修正前
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
                <action android:name="android.intent.action.SENDTO" />
                <data android:scheme="mailto" />
            </intent-filter>
```

```diff:AndroidManifext.xml 修正後
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+            <intent-filter>
                <action android:name="android.intent.action.SENDTO" />
                <data android:scheme="mailto" />
            </intent-filter>
```

「これだけで動かないだろ～」と思っていたら、本当に解消してしまった。。。
タグの概念が覆った瞬間だった。。。
そしてこれを見つけてくださった方本当に感謝でいっぱいです。

きちんと「開く」ボタンが表示されてアプリの起動ができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821194/a96fa688-b93e-dad2-88c7-9a584e1b2d7c.png)

## 思ったこと

正直、これはわからなかった。
きちんとした公式ドキュメントには記載されているのだろうか？自分が公式ドキュメントを一切読めないエンジニアなので、これからは公式ドキュメントをきちんと読むこととしたい。
今回は、先駆者の方のサイトに助けられてよかったが、あのサイトがなければまだこの記事すらかけず、
アプリのリリースをあきらめていただろう。
New Relic試す

# この記事は？

アドベントカレンダーに投稿しようと思っていたら、できなくなってしまったいたので、
別で一旦書こうと思いました。

# 料金体系

https://newrelic.com/jp/pricing

個人開発なら、無料で始められる。

# やりたいこと

- ログの監視
- メトリクスの監視

# 個人開発で使えるのか

使える。

# まとめ

個人でもサクッと始められそうでよさそう。
【VSCode】ターミナルの文字の色を変更する方法（備忘録） 

# 前提
- OS：Windowesを想定
- 環境：vscode 1.85.1

:::note info
補足：vscodeのバージョン確認方法
Help > Aboutをクリックすると、ポップアップが表示
:::

# 1.setting.jsonを開く
VSCodeを開き`Ctrl+Shift+P`を同時に押し、
コマンドパレットを開き、`settings`と入力。
Setting（JSON）を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/d684813f-6560-fce4-d308-d2884b53b021.png)

# 2.文字色の変更
settings.json内に次の文言を追記します。
`色を指定`の部分に任意の色を指定します。

```json:settins.json
"workbench.colorCustomizations": {
  "terminal.foreground": "色を指定",
}
```

### 例：文字色を水色に変更
```json:settins.json
"workbench.colorCustomizations": {
  "terminal.foreground": "#50C1FF",
}
```

### 実行結果
水色に変更されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/f3e2e34c-e23b-5faa-d392-a727eabd8585.png)
【初学者】C言語の三重ポインタを利用して、二重ポインタのアドレスを表示してみた

普段はAWS等のクラウドを触っているのですが、
サーバーサイドのエンジニアと話す中でメモリがよく分からなくなり、
C言語がメモリの勉強になりそうなのでやってみました。

お約束通りポインタで躓いたので、
勉強のためにポインタのアドレスを表示するためのコードを書いてみました。

```c++:sample.c
#include <stdio.h>

int main(void)
{
  int a = 70;
  printf("「a」にはint「%d」が格納されている\n\n", a);
  int *addrA = &a;
  printf("「addrA(&a)」にはaのアドレス「%p」が格納されており\n「*addrA(a)」にはint「%d」が格納されている\n\n", addrA, *addrA);
  int **addrAddrA = &addrA;
  printf("「addrAddrA(&addrA)」にはaddrAのアドレス「%p」が格納されており\n「*addrAddrA(addrA)(&a)」にはaのアドレス「%p」が格納されており\n「**addrAddrA(*addrA)(a)」にはintの「%d」が格納されている\n\n", addrAddrA, *addrAddrA, **addrAddrA);
  int ***addrAddrAddrA = &addrAddrA;
  printf("「addrAddrAddrA(&addrAddrA)」にはaddrAddrAのアドレス「%p」が格納されており\n「*addrAddrAddrA(addrAddrA)(&addrA)」にはaddrAのアドレス「%p」が格納されており\n「**addrAddrAddrA(*addrAddrA)(addrA)(&a)」にはaのアドレス「%p」が格納されており\n「***addrAddrAddrA(**addrAddrA)(*addrA)(a)」にはintの「%d」が格納されている\n\n", addrAddrAddrA, *addrAddrAddrA, **addrAddrAddrA, ***addrAddrAddrA);

  return 0;
}
```

- 出力結果
```
「a」にはint「70」が格納されている

「addrA(&a)」にはaのアドレス「0x16f4ef104」が格納されており
「*addrA(a)」にはint「70」が格納されている

「addrAddrA(&addrA)」にはaddrAのアドレス「0x16f4ef0f8」が格納されており
「*addrAddrA(addrA)(&a)」にはaのアドレス「0x16f4ef104」が格納されており
「**addrAddrA(*addrA)(a)」にはintの「70」が格納されている

「addrAddrAddrA(&addrAddrA)」にはaddrAddrAのアドレス「0x16f4ef0f0」が格納されており
「*addrAddrAddrA(addrAddrA)(&addrA)」にはaddrAのアドレス「0x16f4ef0f8」が格納されており
「**addrAddrAddrA(*addrAddrA)(addrA)(&a)」にはaのアドレス「0x16f4ef104」が格納されており
「***addrAddrAddrA(**addrAddrA)(*addrA)(a)」にはintの「70」が格納されている
```

上記の出力結果にある通り、三重ポインタであっても、アドレスを追っていけば、最終的には変数の値にたどり着くことがわかりました。
他言語だと参照渡し、値渡し等がよしなに実施されている感覚でしたが、ポインタの概念を知り、少しだけ深淵を覗けた気がします。また、メモリを効率的に使用していくイメージが少し湧きました。
どこまで深入りしていくべきか。。時間が足りないですね。。。

ラジオが好きなのですが、ハライチの「カルビ専用ごはん」を思い出しました笑

https://www.youtube.com/watch?v=a-xzmu1fBHQ

どなたかのお役に立てば幸いです。
Ansibleメモ


## はじめに
Ansibleでのインフラの自動化についてさわりの確認を行いました。


## コード例
インフラコード化の例として、AWSにEC2インスタンスを作成例を挙げます。
以下に、Ansible Playbookの基本的な例を示します。
この例では、AWSにEC2インスタンスを作成し、セキュリティグループを設定するためのタスクが含まれています。このPlaybookを使用する前に、AnsibleがAWSの認証情報にアクセスできるように設定する必要があります（通常は環境変数やAWSの認証情報ファイルを介して行います）。

```yaml
- name: AWS EC2インスタンスのプロビジョニング
  hosts: localhost
  gather_facts: false
  tasks:
    - name: セキュリティグループの作成
      ec2_group:
        name: my_security_group
        description: "セキュリティグループの説明"
        region: ap-northeast-1 # 例: 東京リージョン
        rules:
          - proto: tcp
            ports:
              - 22
            cidr_ip: 0.0.0.0/0
        rules_egress:
          - proto: all
            cidr_ip: 0.0.0.0/0
      register: security_group

    - name: EC2インスタンスの作成
      ec2:
        key_name: my_key_pair
        instance_type: t2.micro
        image: ami-0abcdef1234567890 # 使用するAMIのID
        wait: yes
        group: "{{ security_group.group_id }}"
        region: ap-northeast-1 # 例: 東京リージョン
        count: 1
        vpc_subnet_id: subnet-12345678 # 使用するサブネットID
        assign_public_ip: yes
      register: ec2

  vars:
    ansible_python_interpreter: /usr/bin/python3
```

このPlaybookは次のように機能します：

1. **セキュリティグループの作成**:
   - `my_security_group` という名前のセキュリティグループを作成。
   - ポート22（SSH）へのインバウンドアクセスを許可。
   - すべてのアウトバウンドトラフィックを許可。

2. **EC2インスタンスの作成**:
   - `t2.micro` インスタンスタイプを使用。
   - 指定されたAMIを基にインスタンスを作成。
   - 作成したセキュリティグループを割り当て。
   - 指定されたサブネット内でパブリックIPを割り当て。

このPlaybookを実行する前に、以下を確認してください：

- 適切なAWSの認証情報を設定していること。
- `my_key_pair`、`ami-0abcdef1234567890`、`subnet-12345678` などの値を、実際の環境に合わせて適切なものに置き換えること。

このPlaybookを実行するには、Ansibleがインストールされた環境で `ansible-playbook [Playbookのファイル名].yml` コマンドを実行します。

## Ansible用語
Ansibleにおける「Playbook」、「インベントリー」、「モジュール」、「ロール」という要素について、先ほどのコード例を参照しながら説明します。

### 1. Playbook
PlaybookはAnsibleの構成管理とマルチノードオーケストレーションシステムの中心です。YAML形式で記述され、Ansibleが実行する一連の「プレイ」を定義します。各「プレイ」は特定のホスト群に対して実行されるタスクのセットです。

- **上記のコード例**: これはPlaybookの一例で、AWS上にEC2インスタンスとセキュリティグループを設定するタスクを含んでいます。

### 2. インベントリー
インベントリーはAnsibleが管理するホスト（サーバー、デバイスなど）のリストです。これは通常、テキストファイルで管理され、グループやホスト変数を定義することができます。

- **関連性**: このコード例では、`hosts: localhost` と記載されており、これはローカルホスト（実行中のマシン）をターゲットにしています。実際のインベントリーでは、複数のリモートホストやグループが指定されることが多いです。

### 3. モジュール
モジュールは、Ansibleのタスクを実行するための特定のコマンドやスクリプトです。Ansibleは何百ものモジュールを備えており、各モジュールは特定のタスクを実行します。

- **上記のコード例**:
  - `ec2_group` モジュールはセキュリティグループを作成します。
  - `ec2` モジュールはEC2インスタンスをプロビジョニングします。

### 4. ロール
ロールはプレイブックの再利用可能なコンポーネントで、特定の機能や設定セットをカプセル化します。ロールはタスク、変数、ファイル、テンプレートなどを含むことができ、大規模なプレイブックをより管理しやすく、再利用しやすくします。

- **関連性**: 上記のコード例にはロールは含まれていませんが、AWSリソースのプロビジョニングに関連するロールを作成し、それを再利用することができます（例えば、特定のタイプのEC2インスタンスをセットアップするロール）。

これらの要素を組み合わせることで、Ansibleを使った複雑な自動化と構成管理のタスクを効率的に管理することができます。


## 参考記事
https://qiita.com/ArimaRyunosuke/items/1f9d840311584d8160bc

https://proengineer.internous.co.jp/content/columnfeature/19215
android端末で開いてるWebのデバッグ方法

# はじめに
今回はAndroid端末で検証している時にWebViewで表示しているサイトの情報やコードを見れる方法を紹介していきます
### 本文
androidStudioを開いているPCのChromeで下記のサイトを開くだけです
```
chrome://inspect/#devices
```
そうすると画像のような表示が出てきますRemoteTargetに接続している端末が表示されるのでそれを選択することでWebViewの情報などを見ることができます
![スクリーンショット 2023-12-31 12.04.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638092/4c3b61b1-eac4-7863-bc11-95983ced7ee5.png)
### 最後に
今回は自分の備忘録としての役割が強いですが、WebView内の通信や情報を監視する方法を紹介してみました
どなたかのお役に立てれば幸いです
徳丸本p40の環境構築でZAP's read time outが出た

## はじめに
2023年12月31日時点で、[徳丸本](https://wasbook.org/)p40のOWASP ZAPの動作確認を行おうとすると、下記画像のように`ZAP's read time out in te Connection options panel.`というエラーが出てしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2525646/5ab094e4-101b-a730-ef51-d7e4ec0b28cc.png)

OWASP ZAPの画面を見ると、下記画像のように`504 Gateway Timeout`のエラーが出ています。また、一度のexample.jpへのアクセスで何千、何万というIDが表示されてしまいます。
![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2525646/937bc747-5f10-fdbb-3be8-47d435c95df3.png)

## 発生環境
上の事象が発生した環境は以下になります。

- OS:Windows 11(Home)
- 仮想マシン: Virtual Box（使用イメージは本に掲載されているもの）
- Foxy Proxy Standard(ver 8.8)
- OWASP ZAP Zed Attack Proxy(ver 2.14.0)
- ブラウザ（Firefox ver 121.0)

## 対応方法
`ZAP's read time out in te Connection options panel.`というエラーが出てしまう原因として、OWASP ZAPのバージョンが本に掲載されているバージョンと異なっていたことが考えられます。

そのため、JAVA ver8の64ビットを[ホームページ](https://www.java.com/ja/download/manual.jsp)からインストールしたあと、OWASP ZAPのver 2.7を[githubのページ](https://github.com/zaproxy/zaproxy/releases/tag/2.7.0)からインストールすればこの問題は解決すると思います

## Foxy Proxy Standardの設定について
本で使用されているFozy Proxy Standardのバージョンは6.x系だと思われるのですが、現在の最新バージョンは8.x系となっています。また、最新バージョンのFirefoxでは6.x系のFoxy Proxy Standardが上手く動作しませんでした。

本に掲載されている、`foxyproxy.json`の形式がver 8.x系に対応していないのか、インポートを実行しても上手く反映されません。

そのため、下画像のように手動で設定していく必要があるように思えます。

![image-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2525646/30924b8a-d1a2-1414-13bc-531a24f8eba4.png)
プロジェクトごとのPython仮想環境を構築する（Windows, Mac）

プロジェクトごとのバージョンとパッケージの切り替えはvenvを使います。

## Windows
1.　インストーラーを使って希望のバージョンをインストールする
https://pythonlinks.python.jp/ja/index.html
何が入っているかわからない場合は、「プログラムの追加と削除」を見たらわかります。
Windowsストアからもインストールできますが、ややこしいのであったら消しましょう。

パスが通っている場合は `where python` で確認ができます。
※PowerShellの場合は `where.exe python`

2.　Windowsはpythonランチャーでバージョン切替可能
```bash
#デフォルト
py -V 
#バージョン指定
py -3.10 -V 
#pyのpip
py -m pip -V 
```

3.　venvで仮想環境を作る

プロジェクトフォルダを作りその中で仮想環境作成
```bash
# バージョン指定なし
py -m venv .venv
# バージョン指定する場合
py -3.10 -m venv .venv
# 仮想環境開始
.venv\Scripts\activate
# 指定のバージョン、パッケージになっているか動作確認
python -V
pip -V
# 終了
deactivate
```

## Mac
1.　homebrewを使って希望のバージョンをインストールする
バージョン指定して複数入れられる
※インストーラーもあります

```bash
# バージョン指定なし（最新が入る）
brew install python
# バージョン指定
brew install python@3.10
```

`which python` でインストール先の確認ができます。

2. 入ってるバージョンの確認

```
python -V
python3 -V
python3.10 -V
```

3.　venvで仮想環境を作る

プロジェクトフォルダを作りその中で仮想環境作成
```bash
# バージョン指定なし
python -m venv .venv
# バージョン指定する場合
python3.10 -m venv .venv
# 仮想環境開始
. .venv\bin\activate
# 指定のバージョン、パッケージになっているか動作確認
python -V
pip -V
# 終了
deactivate
```
【ChatGPT無&有】の大掃除！


　どうも、カーブミラーです。

　今回は、今年最後なので、ChatGPTの大掃除！

:::note info
本記事は、ChatGPTの無料版も有
料版も使えます。あしからず。
:::

　さて、
　　2023年も
　　　今日でおしまいですね。

　どんな
　　一年だったでしょう？

　私は、
　　ChatGPTを使い出したのが、
　　　2月11日。

　それまで、
　　ウワサを聞いてはいましたが、
　　　やってみるか、と一念発起。

　まぁ、
　　そんなたいそうなことでも
　　　ありませんでしたけどねw

　そこからは
　　ChatGPTをどう使えばいいか、と
　　　本屋に行っても、まだなくて。
　　　　ネットで調べ、You Tubeを
　　　　　探して、勉強する日々が
　　　　　　はじまりました。

　ずっと
　　ひとりでの格闘でした。

　5月25日から
　　Qiitaに記事投稿を
　　　はじめました。

　ちなみに、
　　現在、投稿数220を
　　　超えました。
　　　　ご覧いただき、
　　　　　ありがとうございます。
　　　　　　m(_ _)m

　それから
　　下記の記事が
　　　YouTuberかわごんさんの
　　　　目に留まりました。
[【ChatGPT無】をCustom instructionsで緊縛する！](https://qiita.com/kabumira/items/f70cd7a6256b8db4ab82)
　　　　　9月1日でした。

　それで、
　　かわごんさんの
　　　コミュニティに参加。

　LINEは、
　　仕事で使っていましたけど、
　　　Discordは初めて。
　　　　ちなみにLINEは
　　　　　もう使ってないですねw

　それでも
　　さらに情報を求めて、
　　　X-Twitterにも手を出しました。

　そう考えると、
　　ChatGPTに振り回された
　　　一年だったようです(=^･^=)
***
　さて、
　　本題に入ります。

　みなさん、
　　もう大掃除は
　　　終わっていることと思います。

　でも
　　ChatGPTの履歴は
　　　どうですか？

　私なんかも
　　ほぼ毎日、なにかしら
　　　ChatGPTを使っていますので
　　　　履歴がとても大変なことに
　　　　　なっています。

　以前作ったプロンプトが
　　欲しいときもありますが、
　　　探すのに掛かる手間が必要。

　どうしています？

　ChatGPTのアプリに
　　履歴の検索機能が
　　　ありますけれど、
　　　　Web版には
　　　　　ありません。

　どうします？
***
　まずは、
　　履歴の保存を
　　　しましょう。

　以前に、アップした
[【ChatGPT】履歴を保存する方法です。](https://qiita.com/kabumira/items/b7b30eb98c7fa6befc37)
　　この記事を
　　　参照して保存してください。

　保存したら
　　それで大掃除は終わりですw

　お疲れ様でした＼(^o^)／
***
　そこで
　　終わっちゃダメですよw

　いつでも
　　検索できるように
　　　圧縮ファイルを
　　　　解凍しておきます。

　念のために
　　ブラウザで
　　　表示してみましょう。

　エディタだと
　　量が多くて、
　　　読み込めない可能性が
　　　　あります。

　どのファイルを
　　見ればいいのか、ですが。

　chat.htmlという
　　ファイルを
　　　開いてください。

　そこに
　　やり取りの履歴があります。

　ブラウザのメニューで、
　　“ページ内検索”とか“検索”とかが
　　　あるので、それで検索します。

　試してみましょう。

　やっておけば、
　　イザというときに
　　　使い方を思い出せます。
***
　あと、
　　履歴の
　　　それぞれのタイトルですが、
　　　　変更できるのは
　　　　　ご存知かと思います。

　タイトルは、
　　ChatGPTが
　　　ユーザーの最初の入力を
　　　　受けて決めています。

　日本語と英語の
　　どちらかで決まります。

　だから
　　日本語にしとこう、と
　　　名称変更します。

　でも、変更すると、
　　履歴の一番上に
　　　移動してしまいますよね。

　それに
　　やり取りを出さなければ
　　　変更できません。

　大変な作業に
　　なります。

　そんなときは、
　　アプリ版を
　　　使いましょう。

　やり取りを
　　出す必要もありません。

　変更しても
　　移動しません。

　私は、
　　ほぼそのためだけに
　　　アプリ版を使っていますw
　　　　いや、マジで。
***
　あっ、Web版利用の方で
　　アプリ版を
　　　ダウンロードしていない方は
　　　　ダウンロードしても
　　　　　料金請求はありません
　　　　　　から安心してください。

　Web版でアクセスしている
　　アカウントで使えます。

　有料版を使っていれば
　　そのアカウントで
　　　アクセスできます。
　　　　もちろん有料版特有の
　　　　　機能も使えます。

　使い方は、
　　以下の記事を
　　　参照してください。
[【ChatGPT】Androidアプリ、到着。報告です。](https://qiita.com/kabumira/items/75b5ffac050478bf3313)
[【ChatGPT】Androidアプリの報告（その２）](https://qiita.com/kabumira/items/11389c1a363e227298f6)

　8月10日のものなので、
　　若干、変わっているかと
　　　思いますが、
　　　　たぶん大丈夫でしょう。
　　　　　適当なヤツw
***
　というわけで、
　　今回は、ここまで。

　良いお年をお過ごしください。

　では、来年、
　　お会いいたしましょう。
　　　m(_ _)m