OmniAICreator/Qiita-1.07M huggingface dataset:
プロジェクトマネジメントについて

社内でプロジェクトマネジメントのセミナーが開催されたので、学んだ内容を整理しました。

# プロジェクトとは
独自性のある成果物または、サービスを創出するための有期性のある活動

# PMの能力とは
**未来を予測する力 x 周囲をドライブする力 ＝ PM能力**

未来を予測する力
- リソース見積もり
- コスト計算
- リスク予測
- 分析戦略
- WBS
など

ドライブする力
- 依存関係
- リスク
- モチベーション
- コミュニケーション
など

つまり、未来を予測する力 x 周囲をドライブする力2つの能力を上げていけば、
扱えるプロジェクトの規模が大きくなる。

どんな仕事でもこの2つの能力は必須。普段から意識することで、PM能力は向上できる


# プロジェクト計画
どれだけ頭を使って最初に計画を作るか（プロジェクト計画）、以下にプロジェクトの将来を先読みするか（予測）が大切

# プロジェクト管理のプロセス
プロジェクトは各プロセスに従って管理する。
プロジェクト管理のプロセスは以下のカテゴリに分けられる。
- 戦略決定プロセス　
- 相互依存マネジメントプロセス
- 範囲に関連するプロセス
- 時間に関連するプロセス
- コストに関連するプロセス
- 経営資源に関連するプロセス
- 要員に関連するプロセス
- コミュニケーションに関連するプロセス
- リスクに関連するプロセス
- 購買に関連するプロセス

# 見積もり
- 類推法
方法：似たようなプロジェクトから推測する
フェルミ推定を使う
経験がないと適用が難しい
1日は4.5時間で見積もってみる

- FunctionPoint法
方法：入力、出力、外部I/F、内部外部ストレージなどの機能毎にポイントをつけて見積もる
仕様書などから見積もりやすい

- Earned Value Analysis
方法：プロジェクトをコスト（金額）に変換して評価する
実際のコストと進んでいるコストを比較して、進捗率を考えやすい
これからかかるコストを予測しやすいので細かくコスト管理をしたい場合は有用

# リスクを読む
プロジェクトに対して、チームで共通の認識を持つことでリスクがあるかどうか認知できるようにする
　→プロジェクトのステータス基準（red/yellow/green）などを決めておく

あとから発生するリスクは直しにくいので、できるだけ最初に先に対処する
　→BadNewsFirst　悪い知らせからすぐに報告する

# リスクの対応方法
- 軽減　受容できるレベルに提言する
e.g.契約書の保障に関する条件が曖昧なので細かく保証条件を設定した
- 回避　リスクとなる事柄を回避する
e.g.セキュリティホールが見つかったので修正した
- 転嫁　リスク毎誰かに渡す
e.g.家のローンを組むときに団体生命保険に加入した

# コミュニケーション
問題を共有してから解決策を話し合う
自分にとっての問題を相手に伝える

良くある失敗
- 相手の問題は自分の問題と同じ考えてしまう
- 一度伝えたので相手は理解したと考えてしまう
- 相手の問題を傾聴せず想像で解釈する
- 相手も自分と同じ常識がある
- 何が大事か全員が同じプライオリティを共有できていない

例えば、ビジネスが一番大切だが、ソリューションにフォーカスしてしまう、など

## 知ると伝える
知ることと伝えることには深さがある。自分と相手がどのレベルにいるのか意識する。
深い情報を、知るように、伝えるように心がける。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646706/b390c51e-d60e-9e81-1bc9-101f818a51de.png)

## リーダーシップ
長期的視点で考え短期的な結果のために長期的な価値を犠牲にしない。
自分のチームだけでなく会社全体のために行動する。

## 進め方
WBS:タスクを細分化したもの
Gantt:依存関係をグラフ化したもの

タスクを考えるときは
先行タスク、クリティカルパス、クリティカルチェーンを考えると良い
※タスクが遅れている場合は、リソース追加する、期日を動かす


### 先行タスクと依存関係
タスクはすべて以下の1つの関係になる
（タスクA=先行タスク,　タスクB=後行タスク）
1. タスクAが始まるとタスクBが始まる
2. タスクAが終わるとタスクBが始まる
3. タスクAが終わるとタスクBが終わる
4. タスクAが始まらないとタスクBが終われない
AccessのVBAでバインド変数を使ってINSERT、UPDATE、SELECT

# 参照設定

Microsoft ActiveX Data Objects 2.8 Library
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c4800f48-d105-8098-e3b0-bb2d87c3614a.png)

# テーブル

この記事の例は下記ようなテーブルがある前提です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/3494a0ba-94e1-9c71-8101-9c9df1a8ed44.png)

# INSERT

```vb:サンプル
'コマンド用意。
Dim com_ As New ADODB.Command
com_.ActiveConnection = CurrentProject.Connection

'SQLをセット。
com_.CommandText = "INSERT INTO t_1 (onamae, id) VALUES (@onamae, @id) "

'名前で指定できるバインド変数を使うよって設定。
com_.NamedParameters = True

'1レコード目。
com_.Parameters("@onamae") = "たきな'"
com_.Parameters("@id") = "1"
com_.Execute

'2レコード目。
com_.Parameters("@onamae") = "ち'さと"
com_.Parameters("@id") = "2"
com_.Execute
```

上記の結果は下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/3fda728e-e07a-eb72-48d6-843743e4cb75.png)

# バインド変数名の先頭@について

この@は必須ではありません。
前述のサンプルは『カラム名』か『バインド変数』かが分かりやすいよう、 **自分ルールで先頭に@をつけているだけ** です。
なので下記コードでも動作に支障はありません。

```vb:
'コマンド用意。
Dim com_ As New ADODB.Command
com_.ActiveConnection = CurrentProject.Connection

'SQLをセット。
com_.CommandText = "INSERT INTO t_1 (onamae, id) VALUES (onamae, id) "

'名前で指定できるバインド変数を使うよって設定。
com_.NamedParameters = True

'1レコード目。
com_.Parameters("onamae") = "たきな'"
com_.Parameters("id") = "1"
com_.Execute

'2レコード目。
com_.Parameters("onamae") = "ち'さと"
com_.Parameters("id") = "2"
com_.Execute
```

# UPDATE

INSERTとほぼ同様。

```vb:サンプル
'コマンド用意。
Dim com_ As New ADODB.Command
com_.ActiveConnection = CurrentProject.Connection

'SQLをセット。
com_.CommandText = "UPDATE t_1 SET onamae = @onamae WHERE id = @id "

'名前で指定できるバインド変数を使うよって設定。
com_.NamedParameters = True

'1レコード目。
com_.Parameters("@onamae") = "たきなchang"
com_.Parameters("@id") = "1"
com_.Execute

'2レコード目。
com_.Parameters("@onamae") = "ちさとchang"
com_.Parameters("@id") = "2"
com_.Execute
```

# SELECT

```vb:サンプル
'コマンド用意。
Dim com_ As New ADODB.Command
com_.ActiveConnection = CurrentProject.Connection

'SQLをセット。
com_.CommandText = "SELECT * FROM t_1 WHERE onamae = @onamae "

'名前で指定できるバインド変数を使うよって設定。
com_.NamedParameters = True

'バインド変数に値をセット。
com_.Parameters("@onamae") = "たき'なchang"

'SELECT結果をループ。
Dim rst_ As New ADODB.Recordset
rst_.Open _
    com_, _
    , _
    adOpenForwardOnly, _
    adLockReadOnly
Do Until rst_.EOF
    
    Debug.Print rst_.Fields("onamae").Value

rst_.MoveNext: Loop
rst_.Close
```

# 参考サイトさん

https://www.finalunlucky.com/2020/04/vba-access-ado-.html

# バージョン

Microsoft Windows [Version 10.0.19045.3393]
Microsoft Access for Microsoft 365 MSO (バージョン 2307 ビルド 16.0.16626.20170) 32 ビット
cscの作法 その428

# 概要
cscの作法、調べてみた。
RadioButton使ってみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/4fe4a8eb-c9e7-f818-c327-b5c81a280735.png)

# サンプルコード

```

using System;
using System.Drawing;
using System.Windows.Forms;

namespace App
{
	public class Form1: Form {
		private Label label;
		RadioButton radio1;
		RadioButton radio2;
		public Form1() {
			this.Width = 300;
			this.Height = 200;
			setupControls();
		}
		public void setupControls() {
			label = new Label();
			label.Text = "type text:";
			label.Font = new Font("Geneva", 12, FontStyle.Regular);
			label.Height = 30;
			label.Width = 300;
			this.Controls.Add(label);
			GroupBox group = new GroupBox();
			group.Width = 200;
			group.Height = 100;
			group.Top = 50;
			group.Left = 50;
			group.Text = "radio group";
			this.Controls.Add(group);
			radio1 = new RadioButton();
			radio1.Text = "male";
			radio1.Top = 25;
			radio1.Left = 25;
			radio1.Checked = true;
			radio1.CheckedChanged += check_changed;
			group.Controls.Add(radio1);
			radio2 = new RadioButton(); 
			radio2.Text = "fimale";
			radio2.Top = 50;
			radio2.Left = 25;
			radio2.CheckedChanged += check_changed;
			group.Controls.Add(radio2);
		}
		private void check_changed(object sender, System.EventArgs e) {
			RadioButton btn = (RadioButton) sender;
			label.Text = "selected: " + btn.Text;
		}
		[STAThread]
		static void Main() {
			Application.EnableVisualStyles();
			Application.SetCompatibleTextRenderingDefault(false);
			Application.Run(new Form1());
		}
	}
}





```

以上。
TextFieldをonBlurしたタイミングで更新したいんだけどスペースキー押した時にも発火するの困る


の、解決策。以下のような感じでいけた。

```typescript

const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {
  if (event.key === " ") {
    event.stopPropagation();
  }
};

const MyComponent {
  return (
    <TextField
      onKeyDown={handleKeyDown}

      //...onBlurで発火したりonChangeで何かしたり
    />
  );
}

export default MyComponent;

```

ここに辿り着くまでに色々こねくりまわしてしまったけど最終的には `event.stopPropagation();` を使うだけでよかった。

chatGPTに聞くと、冗長すぎる（もしくは意図と異なる伝わり方をしてる) 回答が返ってくるので、安易に参考にしすぎないことも大事だなー。
中途半端に動いちゃうのも厄介だったりする。
Recoilとreact-native-mmkvでデータを効率的に永続化する方法

目次
1. [はじめに](#はじめに)
2. [必要なパッケージのインストール](#必要なパッケージのインストール)
3. [Recoilの永続化ヘルパーの作成](#Recoilの永続化ヘルパーの作成)
4. [永続化アトムの使用](#永続化アトムの使用)
5. [アプリケーションでの使用](#アプリケーションでの使用)
6. [まとめ](#まとめ)

---

## はじめに
RecoilはReactの状態管理ライブラリとして人気がありますが、その状態を永続化する方法はいくつかあります。この記事では、`react-native-mmkv`という高速なキーバリューストレージを使用して、Recoilの状態を効率的に永続化する方法を紹介します。

## 必要なパッケージのインストール

まず、必要なパッケージをインストールします。

```bash
yarn add recoil react-native-mmkv
```

そして、`react-native-mmkv`のネイティブ部分をリンクします。

```bash
expo install react-native-mmkv
```

## Recoilの永続化ヘルパーの作成

次に、Recoilのアトムやセレクタの状態を`react-native-mmkv`で永続化するためのヘルパー関数を作成します。

```typescript
import MMKV from 'react-native-mmkv';
import { atom, DefaultValue } from 'recoil';

export const persistentAtom = <T>(key: string, defaultVal: T) => {
  return atom<T>({
    key,
    default: defaultVal,
    effects_UNSTABLE: [
      ({ setSelf, onSet }) => {
        const savedValue = MMKV.getString(key);

        if (savedValue != null) {
          setSelf(JSON.parse(savedValue));
        }

        onSet((newValue) => {
          if (newValue instanceof DefaultValue) {
            MMKV.delete(key);
          } else {
            MMKV.set(key, JSON.stringify(newValue));
          }
        });
      },
    ],
  });
};
```

## 永続化アトムの使用

上記のヘルパー関数を使用して永続化されたアトムを作成します。

```typescript
import { persistentAtom } from './path-to-your-helper';

export const userState = persistentAtom('userState', {
  name: '',
  age: 0,
});
```

## アプリケーションでの使用

通常のRecoilアトムと同じように、アプリケーションでこの永続化アトムを使用できます。

```typescript
import { useRecoilState } from 'recoil';
import { userState } from './path-to-your-atom';

const UserInfo = () => {
  const [user, setUser] = useRecoilState(userState);

  return (
    <View>
      <Text>Name: {user.name}</Text>
      <Text>Age: {user.age}</Text>
    </View>
  );
};
```

## まとめ

Recoilとreact-native-mmkvを組み合わせることで、React Nativeアプリケーションの状態を効率的に永続化することができます。この組み合わせは、アプリケーションのパフォーマンスを維持しながら、ユーザーデータを安全に保存するのに適しています。

---

いいねやコメントがあれば、大変助かります！質問やフィードバックもお気軽にどうぞ！🚀

---
【ふりかえり】インスタンスプロファイル

# はじめに
* 以前実施した、こちらのハンズオンの振り返りを目的とした記事です。
[JAWS-UG CLI専門支部 #315 IAM基礎(インスタンスプロファイル) (入門者向け)](https://jawsug-cli.connpass.com/event/280668/)

* インスタンスプロファイルの要素の作成・更新・削除をCLIで実行します。
* 気づいたこと、まとめておきたいポイントに絞って記事にしています。

# インスタンスプロファイル
* IAMロールを格納するコンテナのこと
* EC2だけに使われるもの
* マネジメントコンソールを使用してEC2のロールを作成する場合、**自動的に作成**されて紐づけされる

# ハンズオンで実施したコマンド
実行したコマンドたちを一度整理します。
## IAMロールの作成
`aws iam create-role`を実行します。
```
aws iam create-role \
  --role-name ${IAM_ROLE_NAME} \
  --path ${IAM_ROLE_PATH} \
  --assume-role-policy-document file://${FILE_IAM_ROLE_DOC}
```
ここで出てきた**assume-role**については、こちらの記事がとても分かりやすく解説されています。
[IAM ロールの PassRole と AssumeRole をもう二度と忘れないために絵を描いてみた](https://dev.classmethod.jp/articles/iam-role-passrole-assumerole/)
`aws iam list-roles`で作成したIAMロールを確認します。
```
aws iam list-roles \
  --query "Roles[?RoleName == \`${IAM_ROLE_NAME}\`].RoleName" \
  --output text
```

## IAMインスタンスプロファイルの作成
`aws iam create-instance-profile`を実行します。
```
aws iam create-instance-profile \
  --instance-profile-name ${IAM_INSTANCE_PROFILE_NAME} \
  --path "${IAM_INSTANCE_PROFILE_PATH}"
```
作成したインスタンスプロファイルを確認します。
`aws iam list-instance-profile`を実行します。
```
aws iam list-instance-profiles \
  --query "InstanceProfiles[?InstanceProfileName == \`${IAM_INSTANCE_PROFILE_NAME}\`].InstanceProfileName" \
  --output text
```

## インスタンスプロファイルにIAMロールをアタッチする
`aws iam add-role-to-instance-profile`を実行します。
```
aws iam add-role-to-instance-profile \
  --instance-profile-name ${IAM_INSTANCE_PROFILE_NAME} \
  --role-name ${IAM_ROLE_NAME}
```
アタッチできていることを確認します。
`aws iam get-instance-profile`を実行します。
```
aws iam get-instance-profile \
  --instance-profile-name ${IAM_INSTANCE_PROFILE_NAME} \
  --query 'InstanceProfile.Roles[].RoleName' \
  --output text
```
## IAMポリシーのアタッチ
`aws iam attach-role-policy`を実行します。
```
aws iam attach-role-policy \
  --role-name ${iam_role_name} \
  --policy-arn ${iam_policy_arn}
```
ポリシーがアタッチされていることを確認します。
`aws iam list-attached-role-policies`を実行します。
```
aws iam list-attached-role-policies \
  --role-name ${iam_role_name} \
  --query "AttachedPolicies[?PolicyName == \`${IAM_POLICY_NAME}\`].PolicyName" \
  --output text
```
## インスタンスイメージIDを取得して、変数に指定する
実行したコマンドはこちらです。
```
ec2_instance_image_id=$( \
  aws ec2 describe-images \
    --filters Name=name,Values="${EC2_INSTANCE_IMAGE_NAME}" \
    --query 'Images[].ImageId' \
    --output text \
) \
  && echo ${ec2_instance_image_id}
```
* `ec2_instance_image_id=$( \`を入力します。
* 続くコマンドに`aws ec2 describe-images \`として`--filters`や`--query`で対象を絞ります。
* 最後に`&& echo`で出力させます。

同様に、VPC IDやサブネットIDも子のハンズオンの中で出力させています。

# まとめ
* これまでのCLI支部の資料をもとにハンズオンを試していたが、Qiitaには投稿してこなかったので改めて知識を整理できた
* AWS CLIを触ることで、コンソール画面ではあまり意識しないものを深く知ることができる
* CLI支部の資料はクオリティが高く、度々勉強会も開催されているので時間を見つけて今後も参加していきたい

# 参考
[【参考】Amazon EC2 の IAM ロール](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)
[【参考】インスタンスプロファイルの使用](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html)
[【参考】特定のサブネットにある AWS リソースの一覧と IP アドレスを CSV で出力してみた
](https://dev.classmethod.jp/articles/subnet-resource-describe-awscli/)
Rustでローカルのクレートをdependencyとして使う方法

ハイサイ！オースティンやいびーん。

# 概要

ローカルで開発しているクレートを、別のダイレクトりにあるクレートで使いたい時に、どのように設定すれば使えるか紹介します。

# 方法

## [dependencies.crate_name]と分ける方法

`Cargo.toml`に以下のように`[dependencies.crate_name]`を追加して、パスを指定します。

```toml:Cargo.toml
[dependencies.wp_query_rs]
path = "../wp_query_rs"
```

パスは相対パスを使っていますが、もしかしたら絶対パスも使えるのかもしれません。お試しあれ！

`lib.rs`もしくは`main.rs`では通常のcrates.ioから追加したクレートと同様に使えます。

```rust:lib.rs
use wp_query_rs::{query::params::Params, WP_Post, WP_Query};
```

## [dependencies]の中に入れる方法

ブラケットを分けなくてもできます！

```toml
[dependencies]
wp_query_rs = { path = "../wp_query_rs" }
```

この場合だと、ローカルから参照しているものとダウンロードしているものが混在するので、もしかしてもっとも明示的な書き方じゃないのかもしれません。

# まとめ

なんと簡単でした。`npm link`で半日潰されるような煩雑さ、`yalc`のように第三者のツールに手を伸ばすことなくあっさり解決できてしまうRust/Cargoの設計の良さですが、筆者はNodeで長いこと苦戦に慣らされたせいか、まだ半信半疑です:joy:

Rustがチヤホヤされている理由がよーくわかりました。

もう二度とJavaScriptを触りたくないの。なんて言えないのですが:joy:

おそらくRustのWorkspaceを使ったらもっとわかりやすいでしょうね。
「プロになるためのweb技術入門」を読んでわかったことと各用語の意味

# webブラウザでwebページを表示する仕組み
**・ブラウザ（クライアントが）にURLを打つとHTTPという形式でリクエストをwebサーバーに送る
・webサーバーがリクエストをもとにHTMLファイルをブラウザに返す
・webページが表示される**


# 各用語の説明
### プロトコル
**リクエストを送る際の通信のやり方の取り決め。
データを送る際に、どういう情報を記述してやりとりするかなどのルール**

現実世界でいうと郵便物を出す時の
郵便番号、自分の住所、名前、相手の郵便番号、住所、名前
みたいな一連の形式を決めているみたいなイメージ。


### HTTP

**webサーバーにリクエストを送るときの形式の取り決め、数あるプロトコルの一つ**



### IPアドレス

**Webサーバーのインターネット上の住所**

郵便ハガキでいう住所（そのまんま笑）
もしくは
緯度経度

### TCP/IP

**HTTPなどのリクエストをIPアドレスをもとに実際に送受信する役割**

先ほどでいう郵便配達人
パケットという単位でデータを分割して送る。


### DNSサーバー
**IPアドレス（123.123.123.123）とドメイン名（google.com）の対応を管理しているサーバー**

緯度経度→　東京都新宿区西新宿○丁目◯-○　みたいなイメージ（違うかも）


### ポート番号

**プロトコルごとに場所を決めて、TCP/IPにデータの扱いを伝えるためのもの**

いざクライアントからTCP/IPによってリクエストが送られても、TCP/IPではそのリクエストがどのような取り決め（プロトコル）で扱うデータなのかがわからないので、プロトコルごとにポートを決めて、データの受信場所を指定する。
ちなみに、「URL:ポート番号」という形でリクエストを送る。
普段ポート番号が省略されているのは、よく使われるプロトコルのポート番号は標準で指定されているので、省略しても決まったポート番号にデータを送られるため。

<table>
  <caption>標準のポート番号</caption>
  <thead>
    <tr>
      <th>ポート番号</th> <th>プロトコル</th>
    </tr>
  </thead>
  <tr>
    <td>20, 21</td> <td>FTP（ファイル転送）</td>
  </tr>
  <tr>
    <td>22</td> <td>SSH(リモート操作)</td>
  </tr>
　　　　<tr>
    <td>53</td> <td>DNS</td>
  </tr>
　　　　　<tr>
    <td>80</td> <td>HTTP</td>
  </tr>
　　　　<tr>
    <td>110</td> <td>POP3</td>
  </tr>
　　　　<tr>
    <td>443</td> <td>HTTPS（暗号化されたHTTP）</td>
  </tr>
</table>

### GETメソッド

**ブラウザで入力された値をwebサーバーに送るときに使う方法
ブラウザで入力された値をURLに載せてリクエストとして送る。**
#### 問題点
- [URL&パラメータ名:値]というリクエストになるため、外部から見られる可能性が高く,パスワードなどの重要な情報を扱うには安全性が低い
- URLの文字数限度が255文字なので情報量が少ない。


郵便物の住所部分に内容を書くようなイメージ。


### POSTメソッド
**ブラウザで入力された値をwebサーバーに送るときに使う方法
ブラウザで入力された値をメッセージボディに格納して送る。**

#### 良い点

- メッセージボディ部はログに残らないことが多いので、安全性がGETより高い
- パラメーターの長さに制限がない

#### 問題点

- URL部分に書き加えないのでURLの共有など、パラメーターの保存がしにくい。




**一長一短ではあるが、特に漏洩のない部分はGETを使ったほうが利便性が高く、ログイン情報などを扱うような部分ではPOSTを使った方が安全性が高いのかなと思った。**


### リダイレクト

**最初に要求したURLとは異なるURLへ誘導すること**

### ステートフルなプロトコル
**リクエストに伴って状態が変わっていく、前回のリクエストの情報が反映、保持されている**
**主なプロトコル FTP,SSHなど**

個人居酒屋のようなイメージ
常連「いつもの〜」
大将「はいよ〜」

### ステートレスなプロトコル
**一回のリクエストごとに完結している、状態を保持していかない**
**主なプロトコル　HTTP、DNSなど**

チェーンの居酒屋
お客「いつもの〜」
バイトくん「はいよ〜（！？まあハイボールでええか）」

### Cookie
**HTTPの仕様を拡張してwebアプリケーションとwebブラウザの間で情報を交換できるようにしたもの。
webサーバー側がリクエストの状態を保持しておくのではなく、クライアント側に値を渡しておいて、リクエストのたびにその値を一緒に送ってもらうことでリクエストごとに状態を変化させていく。**

なのでクッキーの値はwebサーバーではなく、クライアント側のPCにテキストファイルで保存されている。
#### cookieの弱点
クライアントからのHTTPのリクエストヘッダやwebサーバーからのレスポンスヘッダを利用して行われているので、
ツールを利用すれば覗くことができるため、個人情報などの値を扱うには安全性が低い。

名前とパスワードを書いた紙を渡すので毎回出してください。的な

### セッション

**cookieに直接値を入れるより安全に情報を保持していく方法として考え出された。
webサーバー側でクライアント側の情報を保持しておき、それに紐づいたセッションIDのみをクライアント側に渡して、リクエストのたびにそのIDを照らし合わせる。**

これによって安全性を維持しながら、状態の保持を可能にしている。



## 感想

インターネットは生活する上で欠かせないので、web技術の知識はプログラミングのみならず実生活でも役に立つ知識だと感じた。
今まで「cookieを許可しますか？」などと表示されるたびになんとなく怖いので「許可しない」を選んでいたのだが、どういう意味かわかったのでよかった。

前半の章は自身の現在の学習内容とも重なる部分があり、記憶と照らし合わせながらの理解ができたのだが、後半の章では、まだ取り組んだことのないアプリ開発などの領域だったので、学習のステップが進んだ後に改めて読み直す必要を感じた。
React Nativeで魅力的なボトムシートを実装！`react-native-bottom-sheet`入門




目次
1. [ボトムシートとは？](#ボトムシートとは)
2. [React Native Bottom Sheetの特徴](#React-Native-Bottom-Sheetの特徴)
3. [インストール方法](#インストール方法)
4. [基本的な使用方法](#基本的な使用方法)
5. [まとめ](#まとめ)

---

## ボトムシートとは？
ボトムシートは、モバイルアプリケーションのUIデザインパターンの1つで、画面の下部からスライドアップして表示されるコンテンツのレイヤーを指します。これは、ユーザーに追加の情報やアクションを提供するための方法として使用されます。ボトムシートは、メニューオプション、ナビゲーション、または情報の詳細など、さまざまな目的で使用されます。

## React Native Bottom Sheetの特徴
`react-native-bottom-sheet`は、以下のような特徴を持っています：

- モーダル表示ビュー、Bottom Sheet Modal
- スムーズなジェスチャーインタラクションとスナッピングアニメーション
- iOSとAndroidのシームレスなキーボード処理
- FlatList、SectionList、ScrollView、Viewのスクロールインタラクションをサポート
- Expoと互換性があります
- TypeScriptで書かれています

## インストール方法
```bash
yarn add @gorhom/bottom-sheet@^4
```
依存関係:
```bash
yarn add react-native-reanimated react-native-gesture-handler
```
Expoを使用している場合:
```bash
expo install react-native-reanimated react-native-gesture-handler
```

## 基本的な使用方法
以下は、基本的なボトムシートの実装例です：

```javascript
import React from 'react';
import { View, Text, Button } from 'react-native';
import BottomSheet from '@gorhom/bottom-sheet';

const App = () => {
  const bottomSheetRef = useRef(null);

  const handleOpenSheet = () => {
    bottomSheetRef.current.snapTo(1);
  };

  return (
    <View style={{ flex: 1 }}>
      <Button title="Open Bottom Sheet" onPress={handleOpenSheet} />
      <BottomSheet
        ref={bottomSheetRef}
        index={0}
        snapPoints={['25%', '50%', '75%']}
      >
        <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
          <Text>This is the content of the Bottom Sheet</Text>
        </View>
      </BottomSheet>
    </View>
  );
};

export default App;
```

## まとめ
`react-native-bottom-sheet`を使用すると、React Nativeアプリケーションに魅力的なボトムシートを簡単に追加することができます。このライブラリの多彩な特徴と簡単な実装方法を活用して、ユーザーエクスペリエンスを向上させましょう！

---

いいねやコメントがあれば、大変助かります！質問やフィードバックもお気軽にどうぞ！🚀
サーバレス環境構築 （CloudFront + S3）

# はじめに
Cloudfront + S3 + APIGateway + Lambda を使い、初めてサーバレス環境を構築しました。
自身の備忘録として記述しますが、どなたかのお役に立てたら光栄です。
（不足が多々あるかと思いますがご容赦ください！）

## 構成について
* CloudFront Functions を利用し、特定のIPアドレスのみアクセスを許可
* 静的コンテンツは S3 Bucket へ保存
* 動的コンテンツは API Gateway を利用
* Lambdaはデフォルトの"Hello Lambda" を利用
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/e9a9c9fd-e76d-2a29-4536-1cb22371f9de.jpeg" width=100%>

最終的に上記構成を目指します。
本記事ではまずCloudFrontとS3Bucketを構築します。
（CloudFront Functionsは別記事とします）

## 環境構築

### ①静的コンテンツ保存用 S3 Bucketの構築
* AWSログイン後にS3へ遷移したあとにバケットを作成する。
以下の項目へ値を入力し、バケット作成をクリックする。
・バケット名　※グローバルに一意なバケット名を指定してください。
・AWSリージョン：ap-northeast-1

バケット作成後の設定は後述にておこなうので以上で作成は完了となります。

### ②CloudFrontの構築
* CloudFrontへ遷移後、ディストリビューションを作成する。
以下の各項目を設定していきます。（記載の無い項目はデフォルト設定ままです）
    * オリジンドメイン：作成したS3ドメインを指定します。
    * オリジンアクセス：Origin access control settings(recommended)
        * Origin access control：※初めて作成する場合は「コントロール設定を作成」から設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/d6f1356a-e852-ac71-ca4c-4dd673af9ecb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/740e37dc-df53-8e13-f922-84341aca0a52.png)
            * 名前：デフォルト設定のまま
            * 説明：任意入力
            * 署名動作：署名リクエスト（推奨）
                * 認証ヘッダーを上書きしないにはチェックしない
            * オリジンタイプ：S3
    * ウェブアプリケーションファイアウォール（WAF）
        * 「セキュリティ保護を有効にしないでください」へチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/39326ec4-e042-e6ff-bf46-e8f7d4af8836.png)
上記の入力できたら「ディストリビューションを作成」をクリック。
ディストリビューションが正常にされたことを確認します。
「S3バケットポリシーを更新する必要があります」と表示されポリシーがコピーできるようになっているので、ポリシーをコピーし、メモ帳などに貼り付けておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/4befbf93-5cc5-839c-eee2-1a8ce7b34f9e.png)
### ③ S3 Bucket ポリシーの修正
* バケットポリシーの修正
①にて作成したバケットをクリックし、アクセス許可タブをクリックし、バケットポリシーの編集をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/5a4cdb1c-5f4c-bc1d-a74b-a7a2a4f32548.png)
バケットポリシーの編集画面になるので、CloudFront作成後にコピーしメモ帳に保存していた内容を貼り付け、変更の保存をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/940c6735-aee6-3072-1c97-b6fa5a9ad362.png)


### ④動作確認
* 確認用の index.html ファイルをS3へ保存します。
（index.html の指定はないので、任意のテストファイルをご利用ください。）

* 作成したCloudFrontをクリックし、一般タブのディストリビューション名をコピーし、Chrome等のブラウザで参照できるかを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/ae33ac16-39e5-b8c6-6933-6054670e1a89.png)
アクセスすると「AccessDenied」のエラー画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/b3113274-0256-0fc1-de00-b670bcb8038d.png)
URLの末尾に /index.html をつけてみると表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493488/68daeb5b-54f0-6bc5-a4d9-56c41cd257af.png)
CloudFrontにはURLにindex.htmlを省略できたりしますが、現時点では設定していないのでURLの末尾に /index.html をつける必要があります。

次回以降で設定＋APIGateway構築を進めていこうと考えております。
記事は以下となります。
・[サーバレス環境構築（APIGateway+Lambda）](https://qiita.com/tsune_m/items/70f7df97cfcd6b01d43e)
[イベントデリゲーション] 遅延読み込み(Ajax)修正後に色々な箇所が動かなくなった

# はじめに
リストデータを読み込む際に、時間がかかるということでUX改善のためリストデータの読み込みを遅延読み込み(Ajax)に修正したらJavaScriptで制御しているいろいろな箇所が動かなくなった。

### 改善前のソースコード
```
$(function() {
    $('任意のセレクター').click(function(e) {
        // 処理
    });
});
```
この**任意のセレクター**に修正した遅延読み込みのタグが指定されているのが原因だった。
画面読み込み後に確定する`$('任意のセレクター')`の、**任意のセレクター**がまだ存在していないからだ。順序的にはこんな感じ?
1. ドキュメントの読み込みが完了→$(function()
2. セレクタ―確定→$('任意のセレクタ―')
3. Ajaxリクエスト
4. 「任意のセレクタ―」を含むHTMLの描画

# 解決策
```
$(function() {
    $(document).on('click', '任意のセレクター', function(e) {
        // 処理
    });
});
```
セレクターそのものは一番の親要素である`document`に設定しその子要素の中で何をクリックするかを定義する。
これを**イベントデリゲーション**というらしい。
【Rails】Railsチュートリアルの追加機能～フォロワー通知 Vol.2～

前回の記事では、フォロワー通知機能を実装しました。
##### 前回の記事

https://qiita.com/nakaizumi_slj/items/998018418f4a7bcdfe02

今回は、この通知機能をON/OFFに切り替える方法について説明します。
ユーザーが自分にフォローされた際に通知を受け取るかどうかを設定できるようにします。
# 目次
- [データベースのカラムを追加する](#データベースのカラムを追加する)
- [ユーザー設定フォームを更新する](#ユーザー設定フォームを更新する)
- [チェックボックスのスタイルを調整する](#チェックボックスのスタイルを調整する)
- [フォロー通知の送信条件を変更する](#フォロー通知の送信条件を変更する)
- [テストデータの設定を変更する](#テストデータの設定を変更する)
- [テストケースを追加する](#テストケースを追加する)

# データベースのカラムを追加する
まず、ユーザーテーブルに通知設定のON/OFFを管理するためのカラムを追加します。
これにより、各ユーザーが通知を受け取るかどうかを記録できます。

以下のコマンドを実行して、マイグレーションファイルを生成します。
`rails generate migration add_follow_notification_to_users follow_notification:boolean`

生成されたマイグレーションファイル（db/migrate/＜日付＞_add_follow_notification_to_user.rb）を開き、add_column の行を以下のように変更します：

```ruby:db/migrate/＜日付＞_add_follow_notification_to_user.rb
add_column :users, :follow_notification, :boolean, default: false
```
これにより、通知をデフォルトでオフに設定します。

次に、データベースのスキーマを更新するために以下のコマンドを実行します。
`rails db:migrate`
# ユーザー設定フォームを更新する
ユーザーが通知を受け取るかどうかを選択できるように、
ユーザー設定フォームにチェックボックスを追加します。

app/views/users/_form.html.erb ファイルを開き、submitボタンの上に以下のコードを追加します。

```ruby:app/views/users/_form.html.erb
<%= f.label :follow_notification, class: "checkbox inline" do %>
    <%= f.check_box :follow_notification %>
    <span>フォローされた際にメール通知を受け取る</span>
<% end %>
```
これにより、ユーザーはプロフィールの編集画面・新規登録画面で
通知設定を変更できるようになります。

# チェックボックスのスタイルを調整する
チェックボックスのスタイルを整えるために、
app/assets/stylesheets/custom.scss ファイルに以下のコードを追加します。

```scss:app/assets/stylesheets/custom.scss
#user_follow_notification {
  width: auto;
  margin-left: 0;
}
```
これにより、フォームの見た目が整えられます。

# フォロー通知の送信条件を変更する
app/models/user.rb ファイルを開き、follow メソッドを以下のように変更します。

```ruby:app/models/user.rb 
def follow(other_user)
  active_relationships.create(followed_id: other_user.id)
  if other_user.follow_notification && self != other_user
    UserMailer.follow_notification(other_user, self).deliver_now
  end
end
```
通知がオンの場合かつ自分自身ではない場合にのみメールを送信するようになります。

# テストデータの設定を変更する
テスト用のデータを設定するために、test/fixtures/users.yml ファイルを開き、
フォロワー通知をONとOFFに設定したユーザーを追加します。

例：

```yml:test/fixtures/users.yml
michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>
  follow_notification: true

inactive:
  name: Inactive User
  email: inactive@example.com
  password_digest: <%= User.digest('password') %>
  follow_notification: false
```
# テストケースを追加する
通知のON/OFF切り替えが正しく機能していることを確認するために、テストケースを追加します。

test/integration/following_test.rb ファイルに以下のコードを追加します。

```ruby:test/integration/following_test.rb
test "should send follow notification email" do
  post relationships_path, params: { followed_id: @user.id }
  assert_equal 1, ActionMailer::Base.deliveries.size
end

test "should not send unfollow notification email" do
  not_notify = @other
  post relationships_path, params: { followed_id: not_notify.id }
  assert_equal 0, ActionMailer::Base.deliveries.size
end
```
1つ目のテストでは通知がONの場合、
2つ目のテストでは通知がOFFの場合をテストしています。
これにより、通知のON/OFF切り替えが正しく機能することをテストで確認できます。

これで、ユーザーが通知設定を変更し、通知を受け取るかどうかを管理できるようになりました。


##### 参考

https://railstutorial.jp/

https://qiita.com/sconeman/items/6187670f7412d387f632
職業訓練校のグループワークで作成した模擬ECSiteの紹介

はじめに
---
僕は、'23/1～'23/７の半年間、WEBアプリ技術者育成科の職業訓練校に通っていました。
その際にグループワークとして、五名一組でグループを組み、企画、設計、開発、テスト、発表と一通り開発経験を積みました。
その際に作った提出物の担当した機能の紹介をしていこうと思います。

本題
---
git
https://github.com/TowaMurata/ECSite

ECSiteを作るにあったってどんな機能が必要話し合い、付ける大まかな機能は、
会員登録、ログイン、ログアウト、商品絞り込み、カート、購入、マイページ、レビューなどの機能を付けようという話で落ち着き、
<h6>僕はマイページ機能と、レビュー機能の担当になりました。</h6>

ホーム画面のデザインなどは、みんなで話し合いこんな感じになりました。
![ホーム画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3248215/2a6fb846-4b59-2d01-f380-c63ff11b8d73.png)

マイページ機能
---
マイページ機能では、購入履歴の表示がメインで、それと、購入履歴からレビューをかけるという仕組みにしました。
ログイン認証を行いログインしていなければ、マイページ画面は表示されずに、ログイン画面に飛ばされるようにフィルターをかけました。
![マイページに表示されるまでの流れ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3248215/ec6d297c-eb76-2a50-0892-bcfe95db1c7c.gif)

購入機能で、DBの購入履歴テーブルに書き込まれ、マイページを開くたびに、購入履歴テーブルからログインしているアカウントIDと購入履歴のアカウントIDが同じものがヒットすれば表示するという流れです。![購入し、DBに書き込まれ、マイページに表示されるまでの流れ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3248215/4ae16bfe-7fb9-aefe-b18c-38b69649347d.gif)

レビュー機能
---
マイページの購入履歴から、レビュー機能を追加しました。
![レビュー登録.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3248215/3c924b73-c89b-14d6-3aa2-9ce1c0d3c47a.gif)

なので、購入したアイテムしかレビューをかけないようになっています。

DBでレビューテーブルを作り、そのテーブルに書き込んでいます。
![レビューDBの流れ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3248215/97e553a5-54d0-8dcd-c5eb-084509a5b32c.gif)

こだわった箇所
---
グループワークをする前に、リーダブルコードという書籍を読み、マジックナンバーを使わないや、一つのメソッドで二つ以上のタスクをしないなどを意識しながら開発作業を進めていきました。

<a href="https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655">リーダブルコード</a>

<img width="200" alt="picture_large978-4-87311-565-8.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3248215/75e7b80e-913c-32b2-4e5f-bc4f4ed88e7a.jpeg">

セキュリティ面は、
アカウント登録する際に、パスワードをAPIでSHA256でハッシュ化して、DBに保存する。
DBの書き込みをする際は、APIのpreparedstatementメソッドを使い、SQLインジェクション対策などをしました。

大変だったこと
---
今回のグループワークで自分はリーダーを務めさせてもらいました。
そのなかで、同じグループ内に勉強をしていく中で、プログラマーとは別の職を目指す仲間がいてして、その人にどんな機能を任せるかなどの、それぞれのできる範囲での役割分担などを考えていくのが大変でした。

最後に
---
決められた時間の中だったので、追加したい機能などを削りながら作成しました。
次作るポートフォリオではもっと、時間をかけてかんりゃ画面の作成や、Googleログイン機能、お問い合わせの内容をメール受信できるようになどの機能をつけながら作成したいです。
結果的にとても楽しいグループワークでした : )
Javascript で早歩きとランニングの時間をpointで測定していき山歩きガチャをしていくPGM

<h2>
Javascript で早歩きとランニングの時間をpointで測定していき山歩きガチャをしていくPGM
</h2>
<hr>
Javascript で早歩きとランニングの時間をpointで測定していき山歩きガチャをしていくPGMを
作りました。30pt(30分の早歩きまたはランニング)毎に一回ガチャを引き、花図鑑の花を埋めていく
PGMです。

<hr>
githubURL: https://github.com/NanjoMiyako2/Runer-Mountain
<br>

サンプルページURL: https://nanjomiyako2.github.io/Runer-Mountain/

<hr>
参考素材のサイト<br>
<a href="https://minhana.net/zukan/">花図鑑・植物図鑑を見る - みんなの花図鑑（掲載数：3,406件）</a><br>
参考にしたサイト<br>
<a href="https://qiita.com/masuda-sankosc/items/cff6131efd6e1b5138e6">Local Storageを使ってみる - Qiita</a><br>
<a href="https://qiita.com/w-tdon/items/81034bd3006806f7d7c3">[javscript]ローカルストレージにjson形式でデータを保存し、取得する - Qiita</a><br>
<a href="https://www.sejuku.net/blog/28217">【JavaScript入門】confirmで「はい」「いいえ」のダイアログを出す | 侍エンジニアブログ</a><br>
Salesforce Classicメールテンプレート CASE式

間違いなどありましたらご指摘いただけると幸いです。

Salesforce の Classic メールテンプレートでは IF 式に不具合があって、CASE 式を使うことが推奨されています。（c.f. [Conditional logic in Salesforce Text Email Template](https://salesforce.stackexchange.com/questions/187716/conditional-logic-in-salesforce-text-email-template/187723)）
一方で CASE 式を使う場合、内部でバインドする値が空になる可能性がある場合は、特殊な書き方が必要になります。

以下、カスタムオブジェクト Object__c と Product__c が存在し、前者は Type__c 、後者は AmountA__c
 と AmountB__c をカスタム項目として持つこととします。
また、Type__cは以下のような選択リスト値を持ちます。
| 項目名 | 表示ラベル | API名 |
| ---- | ---- | ---- |
| Type__c | タイプA | A |
| Type__c | タイプB | B |

直感的に思いついたコードはこちらです。
~~~
{!CASE( // 本来は1行ですが、判別しやすくするため改行しています
    Object__c.Type__c, 
    "A", Product__c.AmountA__c,
    "B", Product__c.AmountB__c,
    "タイプAでもBでもありません。"
)}
~~~
こちらのコードでは、AmountA__c または AmountB__c が空であるとき、CASE 式は null を返します。
そのため、なんらかの都合でどちらかが空になる場合、以下の記述としました。
~~~
{!CASE( // 本来は3つの CASE 式まとめて1行ですが、判別しやすくするため改行しています
    Object__c.Type__c, 
    "A", Product__c.AmountA__c,
    ""
)}
{!CASE(
    Object__c.Type__c, 
    "B", Product__c.AmountB__c,
    ""
)}
{!CASE(
    Object__c.Type__c, 
    "A", "",
    "B", "",
    "タイプAでもBでもありません。"
)}
~~~
こちらの記述では、AmountA__c と AmountB__c 、どちらの値が空でも指定した値を返します。ただし、 CASE 式を繰り返す微妙な記述だと思います。

もっと良い方法ないかしら('ω')

//追記
参照関係ならば項目側で判定しておけばよいのでは
Apex側で処理していいなら、動的にすればよろしい
MimeKitを利用したSmtp送信

https://chawatoyo.blog.fc2.com/blog-entry-91.html
を参考にMimeKitを利用してSmtpでメールを送る処理
BodyBuilderクラスを使用
メール送信の処理は上記参考ブログになかったので記載

~~~ :C# 
using MimeKit;
using System.Security.Authentication;

///mailModelはメールの情報を詰め込んだモデルクラス
private void CreateMailContent(mailModel mailModel)
{
    var msg = new MimeKit.MimeMessage();
    msg.From.Add(new MailboxAddress(mailModel.from, mailModel.from));//表示名と実際のメールアドレス
    msg.To.Add(new MailboxAddress(mailModel.to, mailModel.to));
    msg.Subject = mailModel.title;

    //メール本文
    var builder = new BodyBuilder { TextBody = mailModel.content };

    //ファイル追加
    builder.Attachments.Add("ファイル1");
    builder.Attachments.Add("ファイル2");
    msg.Body = builder.ToMessageBody();
    //メール送信
    SendBySmtp(mailModel, msg);
}

private void SendBySmtp(MailModel mailModel, MimeMessage msg)
{
    using (var client = new MailKit.Net.Smtp.SmtpClient())
    {
        //次の2つはおまじない的なもの
        //Ssl3は旧形式ですの警告がでているものの、これを削るとエラーになる
        client.ServerCertificateValidationCallback = (s, c, h, e) => true;
        client.SslProtocols = SslProtocols.Ssl3 | SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13;

        client.Connect(mailModel.host, mailModel.port, true);
        client.Authenticate(mailModel.user, mailModel.userPw);
        client.Send(msg);
        client.Disconnect(true);
    }
}
~~~
ハイブリットクラウド、マルチクラウドとは？


ここ数年に起きた、ITにおけるクラウド化。
サービスにおいてもAWSやAzure、GCPといったシェアも確実に拡大してますよね。
仮想化におけるサービス展開が多くあり、セキュリティー対策やコスト削減など、メリットもたくさんある中で、そんなクラウドサービスは、全ての企業・個人に対し解放されているパブリッククラウドと、安全性や保守性を高めた特定企業向けのプライベートクラウドに部類ができます。

例えば、
パブリッククラウドを提供するITベンダーはグローバル展開する大手外資系であり、規模に劣る日本企業は主にパブリッククラウドの提供で対抗しています。

近年、こうした様々なクラウドサービスを組み合わせるケースが増えています。

パブリッククラウドと、プライベートクラウドやオンプレミスを組み合わせることは、
「ハイブリットクラウド」と呼ばれます。
一方で、複数異なるパブリッククラウドを組み合わせることは、
「マルチクラウド」と呼ばれます。

ハイブリットクラウドの良さでは、
モバイル連携や負荷分散、ピーク対応や業務にうおる使い分けなどを目的として利用することです。

マルチクラウドの良さでは、
コスト削減やPaas連携、パフォーマンスの最大化やベンダーロックイン回避などを目的として使用することが多くあります。
例えば、それぞれ異なるベンダーが提供するパブリッククラウドを使いながら、本番環境とバックアップ／リカバリー環境を構築することでコストを抑えるというアプローチが挙げられます。また例えば最近人気のAIやIoT活用のプロジェクトにおいては、IoTデータの「収集」、収集したデータの「学習と分析」、そこから得られた結果の「提供」、という3つのステップのそれぞれに異なるパブリッククラウドサービスを利用するといった利用方法もあります

いずれも扱うようになるには、プラットフォームが増えるため、業務手順が複雑になり、運用管理に手間がかかることも多々あります。

# パブリッククラウドとプライベートクラウド
パブリッククラウド＝共有クラウド環境、プライベートクラウド＝専用クラウド環境
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3530029/4ef2c738-daae-d955-6902-76736a828eb2.png)


パブリッククラウド・・・外部ベンダーが提供する共有クラウドを利用
プライベートクラウド・・・自社内に専用クラウドを構築して利用する


# ハイブリットクラウド
ハイブリットクラウドとプライベートクラウド・オンプレミスを組み合わせる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3530029/b780d063-6a48-040a-802f-b704f9e78400.png)

パブリッククラウド+プライベートクラウド・・・システムや用途などに応じて、使い分けることが可能
パブリッククラウド+オンプレミス・・・こちらも上記と同様にパブリックとオンプレミスで使い分けが可能

目的
・モバイル連携、セキュリティー対策、負荷分散、SaaS連携、ピーク対応など

# マルチクラウド
複数のパブリッククラウドを組み合わせる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3530029/c67f0a71-ef6b-9e6a-3fe6-6cdbc7a42914.png)

パブリッククラウド+パブリッククラウド・・・システムや用途によってパブリッククラウドを使い分ける
Iaas+PaaS+SaaS・・・上記同様

目的
・コスト削減、セキュリティー対策、災害対策、SaaS連携など


# まとめ
今やハイブリットクラウドやマルチクラウドはIT基盤の一大潮流ともなっていて、オンプレミスかクラウドかを問わず、適材適所にIT基盤を選ぶ時代へと突入したと言えるでしょう。企業はマルチクラウド戦略を採用することで、自社のニーズとそれぞれのクラウドサービスの特徴を踏まえた柔軟かつタイムリーな選択が可能となります。また、単一ベンダーへの依存度を下げることにもつながるため、いわゆる「ベンダーロックイン」の回避にも極めて有効です。

このように、ハイブリットクラウド、マルチクラウドの選択肢や組み合わせには、さまざまな可能性があると言えます。代表的な活用形態としては、さまざまなワークロードに対応する複数のIaaSプロバイダーの利用や、新しいクラウド アプリケーションをテストするためのパブリックPaaSの組み合わせが考えられるでしょう。もちろん、企業のマルチクラウドインフラは、各企業のニーズや制約などによって無限とも言えるでしょう。




■カジュアル面談受付中
下記からスケジュール設定可能となります。
https://t.co/TfUrQzPhQr


↓↓↓こちらのセミナーもご検討ください↓↓↓

▼「エンジニアとして目指すキャリアプランを実現する」
　キャリアアドバイザー×エンジニア　オンライン座談会
《8/30（水）20:00～21:00 ウェビナー》
https://akkodis-co-jp.zoom.us/webinar/register/WN_ZCARrPJVRK-GgzMIQodvxw#/registration


▼【Engineer Meetup #１】エンジニア交流会★
　《9/13（水）18:00～21:00 場所:AKKODiS本社オフィス》
https://job.axol.jp/jn/c/akkodis_career/entry_cxJl3n0N64LU04LVg/input



★Twitterもやってますので、フォローお願いします★
https://twitter.com/A831SS336O
プロビジョニングパッケージ後に「セットアップは正常に完了しました」が表示される場合

プロビジョニングパッケージを勉強してやっといろいろできた！と思ったら


![こんな感じの.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537922/2a6ea353-bd83-cb6f-8549-db660596d6da.png)

まぁ再起動したら消えるやろと思って再起動したけど…

![まじむかつく.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537922/f0ad346e-e0a3-d1ff-77f2-dac485030a98.png)

<h4>消えね～～～～～～～～!!!!!!</h4>

多分レジストリになんか書き込まれてるなと推測していろいろ調べてみると


![いた.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537922/0cd416c9-f514-1203-f164-aaf84239a41f.png)

<h4>お前かぁぁぁ～～～～～～～！！</h4>

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon\LostMode]
ってとこの

"LostModeMessage"="セットアップは正常に完了しました"



消したら普通に消えた

ちなみにここの文字、適当に入力していたら

![貴様.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537922/51d5d219-b2a9-2615-7f1b-65d850036eb4.png)


こんな感じに遊べた

ログイン時にその入力してる文字が表示させることもできるっぽいね

ログアウトしたら消えるようにしといてほしいね(´・ω・｀)
開発中のFlutterアプリをAndroid端末でデバッグする方法

Android端末でUSBデバッグを有効にすることで、開発中のアプリをデバイス上でテストやデバッグが行えます。USBデバッグを有効にする手順と、Macでの接続方法のメモです。

# Androidデバイスでの設定:
1. 設定 アプリを開きます。
2. システム（または端末情報、About Phone）に移動します。
3. ビルド番号またはビルドバージョンを探して、それを7回タップします。これで開発者オプションが有効になります。
4. 開発者オプション（Developer Options）に移動し、USBデバッグを有効にします。
# MacとAndroidデバイスの接続:
1. AndroidデバイスをMacにUSBケーブルで接続します。
2. デバイス上でポップアップが表示された場合、「このコンピュータでUSBデバッグを許可する」を選択します。
3. ターミナルを開き、adb devices コマンドを実行して接続されているデバイスが表示されることを確認します。
もしadbがインストールされていない場合、Android StudioのSDK Managerからインストールできます。

Android SDK Platform-Tools（通常、adb（Android Debug Bridge）を含む）は、Android StudioのSDK Managerから簡単にインストールできます。以下はその手順です。

## Android Studioでadbをインストールする方法：
1. Android Studioを開く: 既にインストールしている場合は、Android Studioを開いてください。

2. SDK Managerを開く: メニューバーからPreferences（またはSettings）を開くか、ツールバーにあるギアアイコンをクリックしてSDK Managerを選びます。

3. SDK Toolsタブを選択: SDK Managerウィンドウが表示されたら、SDK Toolsタブを選択します。

4. Android SDK Platform-Toolsを選択: 一覧からAndroid SDK Platform-Tools（または類似の名前）のチェックボックスをオンにします。

5. ApplyまたはOKをクリック: 変更を保存してダウンロードとインストールを開始するために、ApplyまたはOKをクリックします。

6. インストールの確認: インストールが終わったら、FinishまたはOKをクリックします。
通常、adbは以下のようなディレクトリにインストールされます。
```bash
/Users/[Your-Username]/Library/Android/sdk/platform-tools/
```
ディレクトリへのパスを.zshrcや.bashrcに追加することで、どのディレクトリからでもadbコマンドを実行できるようにします。
```bash
export PATH="$PATH:/Users/[Your-Username]/Library/Android/sdk/platform-tools/"
```
以下のコマンドを実行して変更を反映させます。
```bash
source ~/.zshrc  # zsh の場合
```
# Flutterでのデバッグ:
1. ターミナルでFlutterプロジェクトのディレクトリに移動します。
2. flutter devices コマンドを実行して、接続されているデバイスを確認します。
3. flutter run を実行します。接続されているデバイスが1台だけの場合、自動的4. にそのデバイスでアプリが起動します。複数のデバイスが接続されている場合は、タ5. ーゲットデバイスを選択するプロンプトが表示されます。
6. 以上の手順で、Mac上で開発しているDart/Flutterアプリを、Androidデバイス上でUSBデバッグできるようになります。

# 接続の解除：
USBケーブルを抜く: 単純にAndroidデバイスとMacを繋いでいるUSBケーブルを抜くことで、デバッグのセッションは終了します。

# 後で再度デバッグ：
1. USBケーブルで接続: Androidデバイスを再度MacにUSBケーブルで接続します。
2. USBデバッグ許可: Androidデバイス上で「このコンピュータでUSBデバッグを許可しますか？」というポップアップが表示される場合は、再度「許可」を選択します。
3. adbサーバーを起動（オプション）: ターミナルで以下のコマンドを使用してadbサーバーを手動で起動できます。ただし、必要な場合のみです。
```bash
adb start-server
```
4. デバイスの確認: ターミナルでadb devicesを実行し、接続されているAndroidデバイスがリストに表示されることを確認します。

5. デバッグ実行: 開発環境からflutter runコマンドを使用します。

以上の手順で、Androidデバイスでのデバッグを一旦停止して後で再開することができます。特に煩雑な手続きは不要で、USBケーブルでの接続と許可が主なステップです。
グーグルカレンダーの今月・翌月分2個並べ表示を簡単なコードでほしい

# phpはstrtotimeが便利なので簡単に作りたい
これくらいのものはfunction.phpに書かずにさらっと済ませたいので。
パラメータ末尾にdates=～～で先頭日と末日を指定してやるだけでいけそう。

```php
<?php
$_func_getgcal_date = function($str_ymd) {
    $tmp01d = date("Ym01",strtotime($str_ymd));
    return $tmp01d."/".date("Ymd",strtotime('last day of '.$tmp01d));
};
$ymd_now = date("Ym01",strtotime($date("Ymd")));
$ymd_next = date("Ym01",strtotime($ymd_now." +1 month"));
$ymd_prev = date("Ym01",strtotime($ymd_now." -1 month"));
?>
<div class="_col">
    <iframe src="https://calendar.google.com/calendar/embed?～～～～～～～&ctz=Asia/Tokyo&dates=<?php echo $_func_getgcal_date($ymd_now); ?>"></iframe>
</div>
<div class="_col">
    <iframe src="https://calendar.google.com/calendar/embed?～～～～～～～&ctz=Asia/Tokyo&dates=<?php echo $_func_getgcal_date($ymd_next); ?>"></iframe>
</div>
<div class="_col">
    <iframe src="https://calendar.google.com/calendar/embed?～～～～～～～&ctz=Asia/Tokyo&dates=<?php echo $_func_getgcal_date($ymd_prev); ?>"></iframe>
</div>
```

※注意
~~あくまで簡易的なものなので、ずれが発生する日付があります。
8月31日9月30日と大の月小の月が続くときの31日等々。~~
→1日をとって基準とすることで修正済み。
対策していくと関数が膨らみますので、ベースの簡易例としてお受け取りください。
トラックボールマウスの勧め

# 対象読者
- マウスの購入を検討している方
- PCを日頃使用しているすべての方へ
- PC作業で体への負担を軽減したい方
# マウス選びの結論
最初に結論から述べるとマウスは**Logicool ERGO M575Sワイヤレス トラックボール**が最強だと思います。
![M575S](https://resource.logitech.com/w_692,c_lpad,ar_4:3,q_auto,f_auto,dpr_2.0/d_transparent.gif/content/dam/logitech/en/products/mice/ergo-m575s/gallery/ergo-m575s-gallery-black-1-new.png?v=1)

# 最強の理由3選
## 1, 身体への負担
まず最強の理由のひとつとして、腕への負担がとにかく他のマウスやトラックパッドより少ないです。
私は現在学生でMacを普段使用しています。以前はMac標準のトラックパッドを愛用していました。正直なところトラックパッドをずっと使用できるならそれが一番いいと思います。操作性に関してはMacはトラックパッドが最も相性がいいでしょう。しかし、エンジニアとしてインターンを始めた際に一日中PCで作業していたときに異変を感じました。
**「指が痛い。。。」と。**
1日トラックパッドに指を擦り付けている状態なので、当然ちゃ当然なのかもしれないですが。皆さんもそんな経験ありませんか？？
そこでググって新しいポインティングデバイスを探すことにしました。するとどうやらトラックボールマウスという単語をよく目にしました。トラックボールマウスはどうやら親指だけで操作するため腕を動かさずに操作できるため腱鞘炎になりずらいんだとか！！でも結局親指が今度は痛くなるんじゃないか？と思いながら半信半疑で買ってみることに。しばらく使っていくと「トラックパッドで痛くなっていた指も全く痛くない！」。それだけじゃなく腕をほとんど動かさないので楽！
このようにトラックボールはストレスフリーで長時間のPC作業をしても疲れにくいです！
## 2, 耐久性

現在、使用してから1年以上経っていてほぼ毎日使用していますが全く壊れる素振りもなく、不具合もないです。また、このトラックボールマウスは充電式ではなく電池式となっています。某高級キーボードであるHHKBも電池式です。
この時代にあえて電池式にするのは、次の理由があるみたいです。
- バッテリー式だとバッテリーが劣化してしまう。
- バッテリーが劣化してしまうとバッテリーのみを交換できないので商品ごと書い直す必要がある。
- 電池式だと電池が切れたら電池のみを交換すればよい
以上のことから電池式の方が1つの商品を長持ちさせることができるようです。

## 3, 値段
Amazon価格では7370円。また、現在(2023年8月24日)セール価格で6360円になっているそうです！通常のマウスより少しお高めかもしれません。ですが、耐久性と体への負担を考えた時に長く使う分には何度もマウスを買い替えるよりも長期的に安く済むと思います。[こちら](https://www.amazon.co.jp/%E3%83%AD%E3%82%B8%E3%82%AF%E3%83%BC%E3%83%AB-M575S-Bluetooth-%E3%83%88%E3%83%A9%E3%83%83%E3%82%AF%E3%83%9C%E3%83%BC%E3%83%AB%E3%83%9E%E3%82%A6%E3%82%B9-%E9%9B%BB%E6%B1%A0%E5%AF%BF%E5%91%BD%E6%9C%80%E5%A4%A724%E3%82%B1%E6%9C%88/dp/B08L4ZR79Q/ref=sr_1_5?keywords=logicool%2B%E3%83%9E%E3%82%A6%E3%82%B9&qid=1692848468&sprefix=lo%2Caps%2C224&sr=8-5&th=1 "ロジクール ワイヤレスマウス トラックボール 無線 M575S Bluetooth")からこの商品のAmazonページへ遷移できますのでこの機会にぜひ！

# おすすめできない人
また、おすすめできない人としては素早い操作を必要とするゲーマーの方です。逆にそれ以外のPC作業をする方であれば全ての方におすすめできると思います！エンジニアの方やデザイナーの方でカーソルを合わすのが大変という意見を時々拝見しますがそれはこのマウスの設定でカーソルポインタの速度を遅めに設定しておけば問題ないです！私もカーソルポインタの速度を遅めに設定していますが正確なカーソル移動や画面の端から端までの操作をストレスなく操作できています。

# まとめ
このようにLogicool ERGO M575Sは最強のトラックボールマウスだと思いますので皆さんぜひ使用してみてください！私はAmazonのセールの時に買いました。現在(2023年8月24日)セール中なので以下のAmazonリンクから購入してみてください！
[Logicool ERGO M575S Amazonページリンク](https://www.amazon.co.jp/%E3%83%AD%E3%82%B8%E3%82%AF%E3%83%BC%E3%83%AB-M575S-Bluetooth-%E3%83%88%E3%83%A9%E3%83%83%E3%82%AF%E3%83%9C%E3%83%BC%E3%83%AB%E3%83%9E%E3%82%A6%E3%82%B9-%E9%9B%BB%E6%B1%A0%E5%AF%BF%E5%91%BD%E6%9C%80%E5%A4%A724%E3%82%B1%E6%9C%88/dp/B08L4ZR79Q/ref=sr_1_5?keywords=logicool%2B%E3%83%9E%E3%82%A6%E3%82%B9&qid=1692848468&sprefix=lo%2Caps%2C224&sr=8-5&th=1 "ロジクール ワイヤレスマウス トラックボール 無線 M575S Bluetooth")
プログラム開発関連の仕事に訳立ちそうなフリーツールのまとめ

プログラム開発の仕事を行っていく中で、ずっと使い続けたいと思った
基本的に無償の便利なツールを纏めています。
※Windows10で利用できるツールを纏めています。
※新しい便利ツールを見つけたら随時更新の予定です。

## 目次
##### デスクトップアプリ
- [CatMemoNote](#catmemonote)
- [Emeditor](#emeditor)
- [WinMerge](#winmerge)
- [VSCode](#vscode)
- [XMLEDITOR.NET](#xmleditornet)
- [snoop](#snoop)

##### Webアプリ
- [DeepL](#deepl)
- [JsonLint](#jsonlint)
- [正規表現チェッカー](#正規表現チェッカー)
- [Phind](#phind)
- [internet speed test](#internet-speed-test)

# デスクトップアプリ
### CatMemoNote
https://www.cc9.ne.jp/~pappara/catmemonote.html
- 複数のメモをフォルダ管理できる、高機能なメモ作成、管理ソフトです
- メモを階層構造で管理できます

:::note
CatMemoNote起動時に、今まで記載したメモが消えてしまい初期表示状態で開いてしまうという現象があるようです。(実際にはメモは消えておらずローカルフォルダにしっかり残っています)
以下のサイト様でそのような現象を予防するツールを作成されておりました。
[「CatMemoNote」の初期化予防](https://e-prospec.com/catmemonote/)
:::

***

### Emeditor
https://jp.emeditor.com/
- テキストエディタです
- 多くの機能をもちますが、起動速度が速いため使用したいときにすぐに使用できます
- 無料版(Emeditor free)と、有料版(Emeditor professional)があります
***
### WinMerge
https://winmerge.org/?lang=ja
- 差分比較ツールです
- ExcelやWord、PowerPointファイルの比較もできます

***
### VSCode
https://code.visualstudio.com/
- microsoftが提供しているテキストエディタです
- テキストエディタですが、プログラム開発やWeb制作までできます
- 多機能ですが、基本的に無料で使用できます (一部の拡張機能、アドオンを除く)
***
### XMLEDITOR.NET
http://www.xmleditor.jp/
- 高機能なXMLエディタです
- XMLの内容を階層構造で視覚的に分かりやすく表示してくれます
***
### snoop
https://github.com/snoopwpf/snoopwpf/releases
- WPFアプリケーション開発の際に役立つツールです
- WPFアプリケーションのビジュアルツリーを表示してくれます
# Webアプリ
### DeepL
https://www.deepl.com/translator
- 高性能の機械翻訳エンジンです
- 翻訳の精度がかなり高いことで有名です
***
### JsonLint
https://jsonlint.com/
- Jsonのフォーマットをチェックするツールです
- ペーストしたJsonデータがきちんとJsonの形式になっているか、チェックしてくれます
***
### 正規表現チェッカー
https://weblabo.oscasierra.net/tools/regex/

https://www-creators.com/tool/regex-checker
- 記載の正規表現とマッチする箇所が分かりやすく確認できるツールです 
***

### Phind
https://www.phind.com/search?home=true
- 「フィンド」と読みます
- 生成AIを用いた、開発者向けの検索エンジンです
- コーディング等の開発者向けの回答に優れています
- 質問の回答と同時に、回答結果を参考にしたWebページを教えてくれます
***

### internet speed test
- 利用しているインターネットの速度を計測してくれます
- Googleの検索欄に「internet speed test」と入力すると、検索結果の一番上に表示されます
neovimで現在開いているファイルを表示する(bufferline)

# 概要
neovimでbufferline.nvimを使用しています。
キーマップの設定を備忘録として残します。

https://github.com/akinsho/bufferline.nvim

# やったこと
プラグインを読み込む->keymapを設定する

```:ファイル構造
plugin/file-header-view.lua
      |
      -custom-keys.lua
init.lua
```

```init.lua
require('custom-keys')
require('file-header-view')
```

```file-header-view.lua
require('bufferline').setup{}
```

リーダーキーをスペースにしています

```custom-keys.lua
--fetch keymap
local map = vim.api.nvim_set_keymap

-- update leader key to space
vim.g.mapleader = " "

-- use keymap in file-header-view(bufferline-plugin)
-- bufferline close setting
vim.keymap.set('n', '<leader>wl', '<CMD>BufferLineCloseRight<CR>')
vim.keymap.set('n', '<leader>wh', '<CMD>BufferLineCloseLeft<CR>')
vim.keymap.set('n', '<leader>wall', '<CMD>BufferLineCloseOthers<CR>')
vim.keymap.set('n', '<leader>we', '<CMD>BufferLinePickClose<CR>')

-- (reference)https://github.com/kazhala/dotfiles/blob/master/.config/nvim/lua/kaz/plugins/bufferline.lua
vim.keymap.set('n', 'gb', '<CMD>BufferLinePick<CR>')
vim.keymap.set('n', '<leader>ts', '<CMD>BufferLinePickClose<CR>')
vim.keymap.set('n', '<S-l>', '<CMD>BufferLineCycleNext<CR>')
vim.keymap.set('n', '<S-h>', '<CMD>BufferLineCyclePrev<CR>')
vim.keymap.set('n', ']b', '<CMD>BufferLineMoveNext<CR>')
vim.keymap.set('n', '[b', '<CMD>BufferLineMovePrev<CR>')
vim.keymap.set('n', 'gs', '<CMD>BufferLineSortByDirectory<CR>')

```

## 各キーの解説

### ファイル削除系
左右のファイルを削除
```vim.keymap.set('n', '<leader>wl', '<CMD>BufferLineCloseRight<CR>')```
```vim.keymap.set('n', '<leader>wh', '<CMD>BufferLineCloseLeft<CR>')```

編集中のファイル以外を削除
```vim.keymap.set('n', '<leader>wall', '<CMD>BufferLineCloseOthers<CR>')```

削除するファイルの選択モードに入る
```vim.keymap.set('n', '<leader>we', '<CMD>BufferLinePickClose<CR>')```

### ファイル選択・移動系
[こちら](https://github.com/kazhala/dotfiles/blob/master/.config/nvim/lua/kaz/plugins/bufferline.lua)をそのまま使わせていただきました。

ファイル選択モード
```vim.keymap.set('n', 'gb', '<CMD>BufferLinePick<CR>')```
```vim.keymap.set('n', '<leader>ts', '<CMD>BufferLinePickClose<CR>')```

左右のファイルに移動
```vim.keymap.set('n', '<S-l>', '<CMD>BufferLineCycleNext<CR>')```
```vim.keymap.set('n', '<S-h>', '<CMD>BufferLineCyclePrev<CR>')```

現在のファイルを移動
```vim.keymap.set('n', ']b', '<CMD>BufferLineMoveNext<CR>')```
```vim.keymap.set('n', '[b', '<CMD>BufferLineMovePrev<CR>')```

ファイルのソート
```vim.keymap.set('n', 'gs', '<CMD>BufferLineSortByDirectory<CR>')```


```:luafile %```で各ファイルを読み込んで有効化したら設定できているはずです。

# 参考
https://github.com/kazhala/dotfiles/blob/master/.config/nvim/lua/kaz/plugins/bufferline.lua
pipenvの初期化時に発生するAttributeError: module 'virtualenv.create.via_global_ref.builtin.cpython.mac_os' has no attribute 'CPython2macOsFramework'

pipenvを初期化した際に下記のエラーが発生したので、原因と対処方法をまとめる。

```bash
akis@ipf:/mnt/c/Users/saki0/dev/fastApituto$ pipenv --python 3.11.4
Creating a virtualenv for this project...
Pipfile: /mnt/c/Users/saki0/dev/fastApituto/Pipfile
Using /home/akis/.pyenv/versions/3.11.4/bin/python3 (3.11.4) to create virtualenv...
⠸ Creating virtual environment...AttributeError: module 'virtualenv.create.via_global_ref.builtin.cpython.mac_os' has no attribute 'CPython2macOsFramework'
```

## 原因

下記ページに書いてあった。

https://techoverflow.net/2022/02/03/how-to-fix-tox-attributeerror-module-virtualenv-create-via_global_ref-builtin-cpython-mac_os-has-no-attribute-cpython2macosarmframework/

> This error occurs because two different and incompatible version of virtualenv are installed.

異なる非互換バージョンのvirtualenvがインストールされていることが原因。

## 解決方法

以下のすべてのvirtualenvをアンインストールした後、システムにvirtualenvをインストールし直す。

- 仮想環境にインストールされたvirtualenv
- システムにインストールされたvirtualenv
- パッケージマネージャー経由でインストールされたvirtualenv



仮想環境にインストールされたvirtualenvをアンインストール。
```bash
pip3 uninstall virtualenv
```
システムにインストールされたvirtualenvをアンインストール。
```bash
sudo pip3 uninstall virtualenv
```
パッケージマネージャー経由でインストールされたvirtualenv
```bash
sudo apt purge python3-virtualenv
```
システムにvirtualenvを再インストール。
```bash
sudo pip3 install virtualenv
```

再度pipenvの初期化を行うと、無事Pipfileを作成できた。
```bash
akis@ipf:/mnt/c/Users/saki0/dev/fastApituto$ pipenv --python 3.11.4
Creating a virtualenv for this project...
Pipfile: /mnt/c/Users/saki0/dev/fastApituto/Pipfile
Using /home/akis/.pyenv/versions/3.11.4/bin/python3 (3.11.4) to create virtualenv...
⠸ Creating virtual environment...created virtual environment CPython3.11.4.final.0-64 in 868ms
  creator CPython3Posix(dest=/home/akis/.local/share/virtualenvs/fastApituto-1ZShz-5O, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/akis/.local/share/virtualenv)
    added seed packages: pip==23.2.1, setuptools==68.0.0, wheel==0.41.1
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator

✔ Successfully created virtual environment!
Virtualenv location: /home/akis/.local/share/virtualenvs/fastApituto-1ZShz-5O
Creating a Pipfile for this project...
```

## 参考資料

https://techoverflow.net/2022/02/03/how-to-fix-tox-attributeerror-module-virtualenv-create-via_global_ref-builtin-cpython-mac_os-has-no-attribute-cpython2macosarmframework/