OmniAICreator/Qiita-1.07M huggingface dataset:
【データサイエンス】データの解釈を学んでみた part1

Twitterで学力と運動のグラフのツイートがあり、正の相関が見られるので、運動をするとテストの点が高いと多く人が思い込んでいました。相関関係と因果関係を間違えて捉えているようなことがありました。
最悪なのは、子持ちの親が先述のことから子供に運動をさせているというツイート(リプ)をしていました。
親がアレなら子もアレなのかなと思った次第です。

学力と運動のようにインプットとアウトプットから、それぞれの要因に因果関係があるかを判定する因果推論という手法があります。調べてみるとアメリカの大学では、この因果推論のようなデータ分析について学ぶ機会が多いようですが、日本では特定の学部を除いてあまり見られません。このことが関係しているのか日本では相関関係なのか因果関係なのかを正しく見分ける人が少ないようです。テレビのニュース番組を見ればよく分かると思います。

ということで日頃Pythonを扱っていることもあり、データの解釈を勉強した結果をまとめました。

# 因果推論について
## 因果関係を判定するポイント
1.偶然お互いが疑似関係にあるか
2.他の変数はあるか
3.逆の因果関係はあるか

ここでは例として、子供の学力と運動の関係を例に3つポイントを説明します
https://twitter.com/kabutotomoni/status/1651177106259447808

1.偶然お互いが疑似関係にあるか
上記にTwitterの学力と年収のグラフのように、年収が横軸、テストの正答率が縦軸のグラフがある場合、綺麗に右肩上がりになっている場合は、たまたまそうなっているだけなのか判別する必要がある

2.他の変数はあるか
今回は学力と運動だけの変数を挙げたが、他に親の教育の熱心度合いがあった場合に、教育熱心な親は子供を塾に通わせたり、サッカー教室に通わせたりしているかもしれません。また、家では勉強するように仕向けていることもあるかもしれません。
因果関係があるかを判定する時には、原因と結果の両方に与える交絡因子があるかを調べてみる必要があります。

3.逆の因果関係はあるか
「運動をしている子供は学力が高い」
これとは逆に、運動をしていない子供にフォーカスしてみると
「運動をしていない子供は学力が低い」
これを考えてみます。
運動をしていないので、スマホやゲームをしたり機会が少なく勉強する時間が比較的少ないため学力が低い可能性も考えられます。また、運動をあまりしない子供の親は教育に熱心ではない可能性もあります。
むしろ運動神経の良い子供だと、親が教育(子育て)に熱心になってしまう可能性もあるかもしれません。
1つの事象で原因と思っていたことが実は結果で、結果だと思っていたことが原因であったこともあるかもしれません。
因果関係があるかを判定する時には原因と結果の方向が逆ではないかと考えてみる必要があります。

## 反事実がないか
例えば、塾に通って勉強をしていたので、テストの点数が良かったという事実があった場合に
反事実とは、塾に通っていなかったらどうなっていたか、という実際には起こらなかった「たら・れば」のことです。

因果関係があるかを証明するためには、原因が起こったという事実における結果と
原因が起こらなかった反事実における結果を比較しなければなりません。
先述の「塾に通っていた」ことにより「テストで高得点をとった」という事実を見ると、塾に通う方が良いかもしれません。
しかし、一旦冷静に考えてみると「塾に通っていた」ことと「テストで高得点をとった」ことに因果関係はあるのでしょうか？
「塾に通った"から"テストの点数が良かった」（因果関係）ではなく
「塾に通っていなかったとしてもテストの点数が良かった」（相関関係）かもしれないです。
塾とテストに因果関係があるのかを調べるには調査対象を同じにするために同じ生徒さんを対象にする必要があります。そのためドラえもんのタイムマシンが無いと確認しようがありません。もし仮にタイムマシンで過去に戻り、子供を塾に通わせずにテストを受けさせ、点数が低かった場合には因果関係があるかもしれません。因果推論の根本問題にはこのように因果関係を明らかにするにはどうしても反事実が必要となります。
仮に他の生徒と比較する場合には比較可能であることが望まれます。比較対象の2人が同じ高校に通っていて、1人は特進コース、もう1人は普通コースだと比較対象としては適切ではなさそうです。同じコース、過去のテストの点が同じだったり、様々な要素を考慮する必要があります。様々な要素が似通っていて、唯一の違いが「塾に通った」かどうかであれば比較可能であると言えそうです。
繰り返しになりますが、「塾に通った」か「通っていない」かの結果がないと、塾に通ったからテストの点数が良かったことの因果関係は言えないです。事実と反事実の結果を比較しなければなりません。

以上です
続きはpart2です
SAP PP(生産計画・管理）モジュールについて

### SAP PP（生産計画・管理）モジュールとは？

SAPの生産計画・管理（PP）モジュールは、企業が製品の生産計画と管理を実行するための重要なツールです。具体的には、需給バランスの確保、生産ラインの能力計画、生産工程のスケジューリング、そして製品の製造と出庫を含む多くのプロセスを管理します。

### 生産計画と計画独立所要量登録または受注登録

生産計画は企業が製品を製造し、市場のニーズに応えるためのスケジュールを作成するプロセスです。計画独立所要量とは、計画期間中に必要な製品量を予測する手段です。これは市場予測や販売計画から派生します。一方、受注登録は具体的な顧客の注文を反映します。

### 見込生産と受注生産

見込生産は市場の需要予測に基づいて行われる生産方式で、受注が入る前に製品を製造します。一方、受注生産は特定の顧客の注文に応じて製品を製造します。受注生産はさらにMTO（Make to Order）、ATO（Assemble to Order）、ETO（Engineer to Order）の3つの方式に分けられます。

- MTO：特定の顧客注文に基づいて製造される製品。受注がなければ製造を行いません。
- ATO：標準的な部品を事前に製造し、顧客の要求に応じて最終的な製品を組み立てる方式です。
- ETO：特定の顧客の要件に基づいて設計と製造を行う方式。一般的には複雑な製品やプロジェクトに用いられます。

### MRP・MPS（所要量計画）と能力計画

所要量計画は、製造に必要な材料と部品の量とタイミングを計算するプロセスで、材料要件計画（MRP）と主生産スケジュール（MPS）に分けられます。MRPは具体的な部品や材料の需給バランスを計算し、MPSは最終製品の生産スケジュールを計画します。

### 能力計画

能力計画は、製造プロセスが計画された生産スケジュールを達成できるかどうかを評価するプロセスです。これは、製造ラインの労働力、機械、およびその他の資源の可用性と能力を考慮に入れます。

### 計画手配から製造指図・購買依頼への変換

このプロセスでは、計画された生産スケジュールが具体的な製造指示と購買依頼に変換されます。製造指示は、製造ラインに対して特定の製品を指定された数量で製造するように指示します。購買依頼は、必要な材料や部品を調達するために供給業者に発行されます。

### 製造実績、構成品出庫、生産品入庫、作業時間

製造実績は、製造プロセスの実際の結果を記録したものです。これには、製造された製品の数量、使用された材料、消費された労働時間などが含まれます。構成品出庫は製造に使用する部品や材料の倉庫からの出庫を、生産品入庫は製造が完了した製品の倉庫への入庫を表します。作業時間は、製造プロセスに必要な時間を追跡します。

### 製造実績を計上するメリット

製造実績を計上することで、企業は製造プロセスのパフォーマンスを把握し、必要な場合に改善措置を講じることができます。また、これにより在庫管理が正確に行え、製品のコスト計算も可能となります。

### PP（生産計画・管理）モジュールで使う組織：プラントと保管場所

プラントはSAP PPモジュールで使用される主要な組織単位で、一つの製造、製品製造、または販売場所を示します。保管場所はプラント内の特定の領域を指し、材料や製品の物理的な保管場所を表します。

### PP（生産計画・管理）モジュールで使うマスタ

- 品目マスタ：製品や部品の詳細情報を保持します。これには、製品の仕様、生産方法、および製造に必要な材料や部品が含まれます。

- BOMマスタ：製品を製造するために必要な部品や材料のリスト（Bill of Materials）を保持します。これには、各部品の数量も含まれます。

- 作業区マスタ：製造プロセスの特定のステージを実行する工場内の場所（作業区）の情報を保持します。

- 作業手順マスタ：製品を製造するための手順やプロセスを定義します。これには、必要な機器、労働力、時間、およびその他のリソースが含まれます。

- 製造バージョン：特定の製品を製造するための特定の組み合わせを表します。これは、特定の作業手順とBOMを連携させるために使用されます。

### 周辺システム：MES（製造実行システム）とは？

MES（製造実行システム）は、製造プロセスの実行を管理し、工場の運用を最適化するシステムです。これは、製造工程のスケジューリング、生産ラインの稼働状況の監視、材料の追跡、および生産データの収集と分析を含みます。

### MESとSAPの関係性と違い

MESとSAPは互いに補完的な関係にあります。SAPは主に企業全体の計画と管理を行うのに対して、MESは工場レベルでの製造プロセスの実行を管理します。つまり、SAPは「何を」と「いつ」製造するかを決定し、MESは「どのように」製造するかを実行します。

### MESを導入するメリット

MESを導入すると、生産効率の向上、品質管理の強化、在庫管理の最適化など、多くのメリットがあります。具体的には、リアルタイムでの生産データの可視化、生産プロセスのトラブルシューティング、改善活動の推進、精度の高い生産スケジューリングなどが可能になります。

### 周辺システム：生産計画スケジューラーとは？

生産計画スケジューラーは、企業の生産計画とスケジューリングを自動化するシステムです。これには、MRP（Material Requirements Planning）とMPS（Master Production Schedule）の実行、生産能力の評価、および生産スケジュールの最適化が含まれます。

生産計画スケジューラーは、製造プロセスの全体的な効率を向上させ、製品の納期遵守率を高め、在庫レベルを最適化することができます。また、生産計画スケジューラーは、予想外の問題（例えば、材料の遅延や機械の故障など）に対応するための代替スケジュールを素早く作成することも可能です。

SAP PPモジュールと生産計画スケジューラーは、企業が生産計画を効率的に管理し、競争力を維持・強化するための重要なツールです。これらを適切に使用することで、企業は製造プロセスをスムーズに進め、顧客の期待に応えることができます。
SQLで中央値をとる

<p>alphavantage APIとか使って、以下のような株アプリを作ってる</p>

https://stonehills.tokyo/financer/
<!-- /wp:heading -->

## SQL Chat 活用

SQL Chat・ChatGPT を活用し、Median(中央値)を求める方法を説明します。

## テスト用テーブルの作成

SQL Chat を使い、テーブルを作るSQL文を生成してもらいました。
（ChatGPTに聞いているのと同じ）

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3378503/aa9f0026-071c-fe8e-80b4-f8de4c003eb8.png)


```
CREATE TABLE salary_info 
( id INT NOT NULL AUTO_INCREMENT,
 employee_id INT NOT NULL, 
salary INT NOT NULL, 
bonus INT NOT NULL, 
allowance INT NOT NULL, 
tax INT NOT NULL, 
total_salary INT NOT NULL, 
payment_date DATE NOT NULL, PRIMARY KEY (id) );
```

## データの登録

insert文も SQL Chatにお願いしてみた。正解にいたるまで、いろいろエラーになる回答を出してきましたね。

![キャプチャ-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3378503/ea39cba3-0dfc-a79e-8f48-ecc94e59417a.png)

```
DELIMITER //

CREATE PROCEDURE insert_salary_info()
BEGIN
  DECLARE i INT DEFAULT 1;
  WHILE i <= 100000 DO
    INSERT INTO salary_info (employee_id, salary, bonus, allowance, tax, total_salary, payment_date)
    VALUES (
      FLOOR(RAND() * 1000) + 1,
      FLOOR(RAND() * 500000) + 100000,
      FLOOR(RAND() * 100000),
      FLOOR(RAND() * 50000),
      FLOOR(RAND() * 100000),
      (salary + bonus + allowance) - tax,
      DATE_ADD('2021-01-01', INTERVAL FLOOR(RAND() * 365) DAY)
    );
    SET i = i + 1;
  END WHILE;
END //

DELIMITER ;
CALL insert_salary_info();
```

## 本当のMedian 関数の使い方

中央値はMedian関数を使います。
distinctしないと行数文出力されるから、注意しましょう。
over()に何も指定しないと全行に対する中央値となります。

```
MariaDB [sqlchat]>  select distinct median(salary) over() from salary_info;
+-----------------------+
| median(salary) over() |
+-----------------------+
|     349909.0000000000 |
+-----------------------+
1 row in set (0.105 sec)
```

## SQL Chatが回答したMedian関数
SQL Chatは、Median関数ではなく、ずいぶん複雑なSQLを出してきました。このあたり、まだまだですね。

![キャプチャ-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3378503/aa1f4fb9-2f6e-0c55-54ad-9f75b87f37b8.png)

しかも間違い

![キャプチャ-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3378503/684d18ac-5756-2236-78bc-422e144c24de.png)

https://stonehills.tokyo/oracletaro/index.php/category/chatgpt/
RedmineのタスクからCHATGPTでチケットを選んでみる

# 内容
　REDMINEを使っているときに、どうしてもメモ書き優先で書き留めたい時がある。
たいてい後でチケットと紐付けするが、それが面倒である。

# CHATGPTの出番

　とりあえずプロンプトは実例から紹介する

# ユースケース

　今日は子供の誕生日なので、くら寿司に行く

# プロンプト

> REDMINEの作業時間記録の中に、［ＸＸＸＸＸＸ］　の記載があります。どのチケットに紐付ければよいでしょうか？　一番で妥当なものを１つ選んで下さい。無い場合は提案してください。理由も書いて下さい→
【	188	タスク	計画	☆☆☆	新システムPJTに参加		2023/05/15 21:10	操作
	187	タスク	計画	☆☆☆	進学		2023/05/12 00:19	操作
　　166 タスク 計画 ☆☆☆ ルーチンワーク見直し 2023/01/07 02:43 操作 
　　165 タスク 計画 ☆☆☆ PC整備 2023/01/24 23:09 操作
>中略
>】

　【】内容はredmineのチケット一覧をコピペする（100件ぐらい）

# 実験

　以下はお題　→　使ったAI　→　その印象　→　実際の回答と言う順で書いている。

# 比較①  くら寿司で誕生祝い

* Bard　→　勝手にカテゴリを決めるなと言うのに・・・
> 提供されたリストから、誕生日祝いのタスクに最も適したカテゴリは「イベント」です。このカテゴリには、誕生日パーティー、結婚式、その他の特別なイベントに関連するタスクが含まれます。

* Bing　→　質問返しは要りません
> こんにちは、これはBingです。😊 あなたのメッセージは、くら寿司で誕生日を祝う予定があることと、いくつかのタスクのリストを含んでいますね。 どのカテゴリで妥当なものを選ぶ必要があるのですか？それは何のためですか？

* GPT(playground)　→　ナイスな選択！　そういえばご褒美だと嫁さんが言っていた
> 143	タスク	計画	☆☆☆	入試支援		2023/05/12 00:19	操作　


# 比較②　GPT3によるプログラミング開発手法
少しお題を変えて、追加で質問してみた

* Bard　→　少し強引に提案してくる感じがする・・・
> 「GPT3によるプログラミング開発手法」のタスクには、既存のチケットに紐付けるのではなく、新しいチケットを作成することをお勧めします。これは、このタスクが既存のプロジェクトやタスクに直接関連していないためです。新しいチケットには、タスクの詳細、開始日、終了日、担当者、優先度など、タスクに関するすべての重要な情報を含めてください。

* Bing　→　何回かやり取りすると、こいつが妥当な気がする
> REDMINEの作業時間記録の中に、［GPT3によるプログラミング開発手法］ の記載があるのですね。それは、どのようなプロジェクトや目的で行ったのでしょうか？ カテゴリリストの中で一番妥当なものを選ぶとしたら、私は［185 タスク 計画 ☆☆☆ AI CHATGPT］ か［180 タスク 計画 ☆☆☆ コーディング短縮化］ のどちらかだと思います。これらは、GPT3を使ったプログラミングに関係する可能性が高いからです。 もし、これらのカテゴリに当てはまらないと思うなら、新しいカテゴリを提案してみてください。例えば、［191 タスク 計画 ☆☆☆ GPT3プログラミング］ などです。 理由も書いてください。例えば、［185 タスク 計画 ☆☆☆ AI CHATGPT］ に紐付ける理由は、このチケットはAIを使ったチャットシステムの開発を目的としているからです。［GPT3によるプログラミング開発手法］ は、その一部として試したことだからです。などです。

* GPT(playground)　→　Bardと同じ回答だった
> GPT3によるプログラミング開発手法に関するタスクは無いので、新しく「タスク168：GPT3によるプログラミング開発手法を検討する」というタスクを作成するのが一番妥当です。プログラミング開発を検討するために必要になる知識習得や情報収集を行うことを目的とするためです。

# 比較③　耳が痛いので休憩

* Bard　→　そりゃそうだ。ありがたく採用する。
> 休憩を記録するチケットとしては、「休憩」または「リラクゼーション」というカテゴリが適していると思います。

* Bing　→　なかなか秀逸な回答です。ありがとうございます。
> REDMINEの作業時間記録の中に、［耳が痛いので休息］　の記載があるのですね。それは、どのような状況で起こったのでしょうか？ カテゴリリストの中で一番妥当なものを選ぶとしたら、私は［158 タスク 計画 ☆☆☆ 部門安全衛生］ か［155 タスク 計画 ☆☆☆ 禁止事項］ のどちらかだと思います。これらは、耳の健康に関係する可能性が高いからです。 もし、これらのカテゴリに当てはまらないと思うなら、新しいカテゴリを提案してみてください。例えば、［192 タスク 計画 ☆☆☆ 耳の休息］ などです。 理由も書いてください。例えば、［158 タスク 計画 ☆☆☆ 部門安全衛生］ に紐付ける理由は、このチケットは部門内の安全や衛生に関する問題や対策を目的としているからです。［耳が痛いので休息］ は、その問題の一つとして発生したことだからです。などです。

* GPT(playground)　→　正論だなあ。職場環境についての、お気遣いまでいただく
> 『作業時間記録』に［耳が痛いので休息］を記載するのはおかしいため、該当するチケットがないと判断します。そのような記載すべきでないことを規定する別のチケットとして、『出勤・退勤管理』を新しく作成するのが妥当だと考えます。ライフスタイル管理とも関係してくるので、そのような内容でチケットを作成し、作業時間記録などを人事部と協議しながら管理できるようテンプレートを作成し順次改善していくことで、効果的な管理が行えるようになるでしょう。

# 結果
　どのＡＩもそれなりに面白い回答をしてくれる。もしも仮に部下が居たら、部下の生活指導なんかも考えてくれたりして、これからのプロジェクト管理ソフトとしては、次世代な気がする。子供の教育日記などに転用すると、先生も安心して一人づつに気を配ることが出来るかもね・・・

# 今後の予定
　RedmineにAPIコールボタンを作って、CHATGPTを呼び出すようなトリックを追加できないだろうか？
用途としては、チケットの要約や、粒度の分割など、Redmineのデータから色々、支援ツール的なものを埋め込むと利便性が上がる気がする。
外部API呼び出し時にaxiosでCORSエラー

外部APIを利用しようとしたところCORSエラーが起きた。

エラーが起きる悪いパターン
```error_pattern.vue
<script>
export default {
  async asyncData(context){
    const response = await context.$axios.$get('外部APIのURL')
    console.log(response.data)
    return { getData: response.data }
  }
}
</script>
```
良いパターン
```ok_pattern.vue
<script>
import axios from 'axios'
export default {
  async asyncData(){
    const response = await axios.get('外部APIのURL')
    console.log(response.data)
    return { getData: response.data }
  }
}
</script>
```
Docker版ローカルプロキシ(Squid)でWEBアクセスを制御する

## この記事は

~~イカです~~

Dockerコンテナを使って、Win11マシンにローカルプロキシをつくる
プロキシは**Squid**（イカ）を採用する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/cc6d4a10-49c6-49eb-4442-55bbb3216c7f.png)

キャプチャ元: [Dockerハブ`ubuntu/squid`](https://hub.docker.com/r/ubuntu/squid)

### 検証内容

ローカルプロキシのアクセス制御の機能を使って、ウェブサイトへのアクセス制限をかける
「サイトＡにはアクセスできるが、サイトＢにはアクセスできない」といった制御をする

:::note info
（例）Google検索はできるが、Yahooポータルにはアクセスできないような制御
:::

## Dockerコンテナの用意

`ubuntu`のイメージをプルしておく

```powershell
docker pull ubuntu
```

https://hub.docker.com/_/ubuntu

### Dockerコンテナを起動する

コンテナを起動する際、ポートは`localhost:63128`を割り当てる
Winマシンからこのポートにアクセスすると、コンテナのSquidを経由してインターネットに出ていく

```powershell
docker container run -itd --privileged --hostname SquidContainer --name squid-container -p 63128:3128 ubuntu:latest
```

コンテナの中に入る

```powershell
docker exec -it squid-container /bin/bash
```

### 必要なパッケージをインストールする

主役の`squid`をインストールする
ついでに`.config`ファイルを変更するためのエディタ`vim`もインストールしておく


```powershell
apt update
apt install -y squid vim
```

## Squidの設定

`/etc/squid/squid.conf`ファイルに2行追記する

```diff_powershell:vim /etc/squid/squid.conf
+ acl google dstdomain .google.co.jp
+ http_access allow google
http_access allow localhost

# And finally deny all other access to this proxy
http_access deny all
```

Googleのドメインにはアクセスできるが、他はすべて拒否`deny`される設定とした

設定を反映するために、サービスを再起動する

```powershell
service squid restart
```

最後に OK が表示されれば正常完了
リスタートまで数秒はかかる

```
root@SquidContainer:/# service squid restart
 * Restarting Squid HTTP Proxy squid
 * ...
 * ...
 * ...
 * ...
 * ...
 * ...                                                                                                           [ OK ]
2023/05/20 06:02:51| WARNING: BCP 177 violation. Detected non-functional IPv6 loopback.
                                                                                                                 [ OK ]
```

OKではなく**fail**が表示されたらコンフィグの中身を再点検する

## ホストマシンのプロキシを変更する

Win11のプロキシを変更する

「Windows ロゴ」を押して「プロキシの設定」で検索する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/d7be0703-f5af-48c2-e668-c8c4b5041237.png)

`http://localhost:63128`をプロキシに設定する
イントラネットはプロキシを介さないようにする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/8e5e9ab1-4ed7-0b26-338b-9cb803eb5f64.png)

「保存」を押してダイアログを閉じる　※再起動する必要はない

## ローカルプロキシの動作確認

まずはGoogle検索のページにアクセスする
ブラウザの余計な機能を無視するためにプライベートブラウジングする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/ac316ed6-4960-4324-65e7-fcc4cbbd669f.png)

Google検索結果は表示される

次にQiitaへアクセスする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/cb79e941-8797-822c-3171-bc912caa614a.png)

QiitaドメインはSquidで許可していないため、アクセスできない
これは意図した結果なので、動作確認はOK

## まとめ

Squidを使ってローカルプロキシをつくった
プロキシが持つ機能により、アクセス制御をすることができた

## 参考

https://nwengblog.com/squidfilter/

↓特定のクライアントのみアクセスを許可する方法

https://engineer-ninaritai.com/squid-http-access/

## 糸冬了！！
Djangoのstaticファイルの設定について

## 概要

Djangoのstaticファイルの設定についてまとめます。staticファイルとは、cssファイル,jsファイル,画像などの動的ではないファイルのことです。

公式ドキュメントは以下になります。(ver4.2)

https://docs.djangoproject.com/en/4.2/howto/static-files/

各種STATICの変数の公式ドキュメントは以下になります。

https://docs.djangoproject.com/en/4.2/ref/settings/#static-root

## staticファイルの設定値について

他にも`STATICFILES_STORAGE`や`STATICFILES_FINDERS`もあるようですが、今回は扱いません。

| 設定 | 詳細 |
|:-----------|------------:|
| STATIC_URL | staticファイルの配信用のURL |
| STATICFILES_DIRS | staticファイルのプロジェクト内の保存先 |
| STATIC_ROOT | 本番配信用のstaticファイルの保存先 |

## STATIC_URL

`STATIC_URL`は配信用のURLで、`STATIC_ROOT`に配置されているstaticファイルを参照するためのURLです。
もし`STATIC_URL = '/static/'`と指定した場合以下のようなurlでstaticファイルにアクセスできるようになります。

```
http://static.example.com/static/...
```

## STATICFILES_DIRS

Djangoプロジェクト内のstaticファイルの保存先を指定する変数です。この変数には、複数設定することができます。
(例)
```
STATICFILES_DIRS = [
    "/home/special.polls.com/polls/static",
    "/home/polls.com/polls/static",
    "/opt/webfiles/common",
]
```
このときもし同様のファイルが存在したときは、下に書いた設定のものが優先されるようです。

staticファイルをtemplateファイルで使用するときは、以下のように記載します。
```html
<!DOCTYPE html>
<!-- staticファイルの読み込み,ここでSTATICFILES_DIRSに指定したディレクトリが読み込まれる -->
{% load static %}
<html>
  <head>
    <meta charset="utf-8">
      <title>テストtemplate</title>
      <!-- STATIC_DIR/css/style.cssを読み込む -->
      <link rel="stylesheet" href={% static "css/style.css" %}>
  </head>
  <body>
    ....
  </body>
</html>
```

## STATIC_ROOT

先ほど、`STATICFILES_DIRS`に指定したディレクトリに静的ファイルを読み込むと言いましたが、本番環境では、staticファイルはWebサーバがレスポンスするような動作になるのが基本だと思います。
そこで、`STATIC_ROOT`です。
もし、`STATIC_ROOT = '/var/www/html/static'`と指定した場合以下のコマンドを実行することで、`/var/www/html/static/`にstaticファイルがまとめられます。
```
$ python manage.py collectstatic
```

上記のようにすることで、アプリケーションが存在するディレクトリと違う場所にstaticファイルをまとめられるので、セキュリティ上も良いと思います。
Poetryでプロジェクトを作成してみる

# 初めに
emonです。
普段はnodejsを利用することが多くpythonを触っていないので、pythonには`yarn`のようなパッケージマネージャって何があるのかと気になりました。調べてみるとあまりpythonでは絶対的なパッケージマネージャがなさそうでした。pipを利用している方が多そうですが、pipではパッケージの依存解決が苦手とのこと。そこで`yarn`に比較的近い`Poetry`なるものを発見したので、セットアップ方法についてまとめました。

目標：Poetryを用いて基本的なプロジェクトのパッケージ管理ができる
[公式サイト](https://python-poetry.org/)


# poetryをインストールしてみる
```
curl -sSL https://install.python-poetry.org | python3 -
```

### peotryのPATHを通す
```
echo '$HOME/.poetry/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
```
（ダウンロードした詳細のパスはインストールの最後に記載されています）

### poertryの設定
初期設定では、プロジェクト配下にパッケージがインストールされないので設定を行います。
```
poetry config virtualenvs.in-project true
```

### 新規プロジェクトを作成する
```
poetry new <project-name>
```
自動生成する`pyproject.toml`に、プロジェクト情報を記入、追加されます。

### パッケージの追加
今回は例で`django`を追加してみます。
```
poetry add django
```
追加したパッケージが以下のように自動で`pyproject.toml`に追加されます。
```
[tool.poetry.dependencies]
python = "^3.9"
django = "^4.2.1"
```

### 追加したパッケージをインストールする
```
poetry install
```
`./.venv`ファイルが作成されてその配下にパッケージがインストールされます

今回は、poetryのセットアップからプロジェクトの作成まで行いました。
次回は今回作成した環境をもとにdjango環境を作成してみようと思います。
最後まで見て頂きありがとうございました！
【Flutter】pubspec.yaml の dependencies と dev_dependencies の違い

# dependencies と dev_dependencies の違い

結論から書くと、
アプリを動かすのに必要なパッケージは `dependencies`
リンターだったりテスト用だったり開発時にのみ必要なパッケージは `dev_dependencies`
に書けば良さそう。

アプリの実行速度にも影響するそうなので、
開発時のみにしか使用しないパッケージは積極的に `dev_dependencies` を使った方が良さそう。

# 参照したところ

公式 (https://dart.dev/tools/pub/pubspec#dependencies) に、

> Dependencies
> Dependencies are the pubspec’s raison d’être. In this section you list each package that your package needs in order to work.
> 
> Dependencies fall into one of two types. Regular dependencies are listed under dependencies:—these are packages that anyone using your package will also need. Dependencies that are only needed in the development phase of the package itself are listed under dev_dependencies.

とある。

DeepLで訳すと

> ディペンデンシー（依存関係
> 依存関係はpubspecの存在意義です。このセクションでは、あなたのパッケージが動作するために必要とする各パッケージをリストアップします。
> 
> 依存関係は2つのタイプに分類されます。通常の依存関係は、dependencies:の下にリストアップされています。パッケージの開発段階でのみ必要とされる依存関係は、dev_dependencies に記載されています。

となる。

こちら(https://dart.dev/tools/pub/dependencies#dev-dependencies) にも

> The rule for deciding between a regular or dev dependency is simple: If the dependency is imported from something in your lib or bin directories, it needs to be a regular dependency. If it’s only imported from test, example, etc. it can and should be a dev dependency.
> 
> Using dev dependencies makes dependency graphs smaller. That makes pub run faster, and makes it easier to find a set of package versions that satisfies all constraints.

> 通常の依存関係かdev依存関係かを決定するルールは簡単です： 依存関係が lib または bin ディレクトリの何かからインポートされる場合、それは通常の依存関係である必要があります。もし、testやexampleなどからしかインポートされないのであれば、dev依存にすることができますし、そうすべきです。
> 
> dev依存関係を使用すると、依存関係のグラフが小さくなります。そのため、Pubの実行が速くなり、すべての制約を満たすパッケージバージョンのセットを見つけることが容易になります。

とある。
Tableauを3か月触ってよく分からないことを深堀する　②グループとセット

## はじめに
23年2月からTableau案件に参画し、5月で丸3か月経過しました。
頭と手を動かして、Vizを作る中で、よく分かってないことをそのままにしてきたので、この場を用いて、深堀り→理解をしたいと思います。

第2回目は、「グループとセット」についてです。
※第1回目は[「権限」について](https://qiita.com/freestyleaerial/items/f0742dbe8043a2980f96)、取り上げましたのでよろしければご覧ください。

## グループとセットとは？
Tableauでは、グループ化する機能として、「グループ」と「セット」の2つがあります。
それぞれの違いをざっくりと言うと、
- 「グループ」は、どんな時点であっても、同じ組み合わせで見たいときに使う。
- 「セット」は、その時々で、あらかじめ決めた定義に当てはまるグループで見たいときに使う。

となりますが、1行でまとめるのは難しいので、それぞれ深掘りしていきます。

### グループ
> 「グループ」は、どんな時点であっても、同じ組み合わせで見たいときに使う。

一例を挙げると、都道府県のうち「東京都と大阪府」の組み合わせについて、分析を行いたいときに「グループ」を使います。

つまり、日次や月次で新しいトランザクションデータが追加されたとしても、常に「東京都と大阪府」という組み合わせの結果が表示されるということです。

ちなみに、「グループ」の作り方は、次の通りです。
まず、「グループ」を作りたいディメンジョンを右クリック→[作成]→[グループ]の順に押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/356473f8-ae46-254f-c85d-79cf30168ebc.png)

[グループの作衛]ダイアログから、グループ化したい組み合わせを選択し、[OK]を押すと「グループ」が作られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/b813209e-be17-2ddf-6dcf-19b8d2489533.png)

### セット
> 「セット」は、その時々で、あらかじめ決めた定義に当てはまるグループで見たいときに使う。

こちらも一例を挙げると、都道府県別の売上TOP10の組み合わせについて、分析を行いたいときに「セット」を使います。

つまり、日次や月次で新しいトランザクションデータが追加されると、分析時点で「TOP10の組み合わせ」は変動します。

ちなみに、「セット」の作り方は、次の通りです。
まず、「グループ」と同様に、「セット」を作りたいディメンジョンを右クリック→[作成]→[セット]の順に押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/4bdacd24-b058-f52f-9f86-50d4eb87db37.png)

[セットの編集]ダイアログの[上位]タブで、"売上上位10x"を選択し、[OK]を押すと「セット」が作られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/bef95f1d-8320-e3cf-92a8-26aca1ec7418.png)

## まとめ
簡単ではありますが、「グループ」と「セット」の違いについてまとめました。

分析する時点によって、「常に固定で見たい（グループ）」のか、「変動で見たい（セット）」のかで、使い分けると理解しました。

今後、使える場面があったら、活用していきたいです。
HerokuでWebアプリを公開してみようとするも途中で中断した話

# Herokuとは

Heroku　はクラウドサービスの名前で自作のWEBアプリをネットで公開するための場所を提供しています。レンタルサーバーに似ていますが、Herokuは`PaaS（Platform-as-a-Service）`というサービスの一種でレンタルサーバーと違って、開発に必要な環境が全て揃った状態で場所を提供しているため、必要な言語のインストールやデータベースの設定などは自動で実行されるため手動での操作が短縮されます


## 結論（なぜ諦めたのか）

まず今回の目的は作成したToDoアプリをポートフォリオとして公開することでした。

会員登録を実施して、Herokuにデプロイするためコマンドを実行するところまで進みましたが、デプロイするためにはクレジットカード情報の登録が必要だというところに気がつき中断という残念な結果になりました



## なぜHerokuだったのか

Herokuは永続的に無料で使用できる枠を提供しています。GoogleやGitHubも類似サービスを提供していますが、無料で使用できる枠はいずれも期間限定のためHerokuを採用しましたが、無料枠でも使用するためにはクレジットカード情報の登録が必要なようなので、一時中断しました

### アカウント登録

アカウント登録したら規約に同意（Accept）してHerokuにデプロイできる状態になります

![スクリーンショット 2023-05-16 10.27.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/c93e36f5-b88c-43c8-91cf-3b54541662c3.png)

### チュートリアルに進む

Looking for help getting started with your language?
どの言語のサポートを希望なのか選択するようアイコンが並んでいるので、今回はPHPを選択しました

![スクリーンショット 2023-05-16 10.33.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/37668c4f-a346-2afb-e71f-83dea58b83bc.png)


### 日本語に切り替える

ここから日本語の案内を受けられるので、右上の切替リンクで切り替えてチュートリアルを開始します
![スクリーンショット 2023-05-16 10.34.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/621f6ba7-6d6b-df75-94ce-a67696e89510.png)

### macOSでコマンドを実行する

著者の環境はMac OSなのでコマンドで必要なアプリケーションをインストールしました

![スクリーンショット 2023-05-20 8.16.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/0818ea8b-b999-0282-a30b-560ad85f61ff.png)

もしもMacOSでコマンドが失敗した場合は、​`Homebrew`というアプリがインストールされていない可能性があるのでインストールされていない場合はインストールをご検討する必要があると思います

### コマンドでHerokuにログインする

heroku へログインするコマンドを実行すると
英文のメッセージで
「ログインする場合は何かキーを押す」
「終了したい場合はqキーを押す」
という指示が出ました。
適当に矢印キーを押すとブラウザ画面でHerokuのログインボタンが表示され
ボタンを押すことにより、ターミナル側でもログインが成功したメッセージが表示されました



![スクリーンショット 2023-05-20 8.23.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/ca419c32-3252-ffe1-a101-c2c918720037.png)

### 動作確認

php,composer,git これらが正常にインストールされているか確認のコマンドをするようチュートリアルに含まれていたので実行しました


![スクリーンショット 2023-05-20 8.28.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/5b5feff6-ea4a-8cc8-8449-4bb4001d2b18.png)

### アプリをデプロイする

実際に作成したアプリケーションをWEB上に公開するためにデプロイ作業に移ります
チュートリアルではサンプルアプリが用意されており、練習することもできますが
すでにアプリを用意しているので実際にデプロイしてみました。


#### 実際の手順はこちら
![スクリーンショット 2023-05-20 8.56.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/b0f08d65-beba-add6-b0d2-71e0a73f7e84.png)


1. Gitのインストールと初期設定はすでに実行しているので飛ばします
1. Heroku Gitリモートへの追加はherokuにコマンドでログインした状態で
   デプロイしたいプロジェクトのディレクトリにカレントディレクトリを移動します
1. 次のコマンドを実行して、Herokuにアプリを置くディレクトリを作成します
   ```
    heroku create -a Herokuアプリ名
    ```
    『Herokuアプリ名』は他のユーザーと重複しない
     一意の名称が必要とのこと

この段階まで進みましたが、クレジットカード情報を登録していないため先に進めることができませんでした。

##GitHubなどではできなかったのか？

GitHubでも静的なサイトを公開することができるようでしたが、今回作成したアプリはデータベースと連携するToDoアプリだったので、無料でDBを提供していないGitHubでは今回の目的にあいませんでした。

## 次回の目標

次回はAWSを用いてWEBアプリの開発と公開までを最後まで実行できればと思います。
[Git] 動作を試す 実行例39：shortlogで以降のすべてのコミットの概要を得る

Gitの動作を理解するために、Gitのコマンドを実際に試して、結果を見てみました。

1つの記事内で一連のGitコマンドが完結しているので、これら一連のコマンドを順に実行させて結果を見ることで、一連のGitの動作を実際に体感でき、一通り独習することが可能です。

※前回記事のリポジトリ状態からの続きになっています。
| [前回記事へ](https://qiita.com/dl_from_scratch/items/3cab5cec1c8d6b33cdac) | [目次へ：Git関連記事のまとめページ](https://qiita.com/dl_from_scratch/items/597bc28a4787a7901d21) | [次回記事へ](https://qiita.com/dl_from_scratch/items/b9b46150f08e7ad2f7e2) |
|:-:|:-:|:-:|

# 実行例

```
(※始めにコミット履歴状況を確認)
git log --oneline --graph --all
↓
結果: 
* 8133746 (master, branch3) message15
* 51006a6 message14
| *   2b19eaa (branch1) Merge branch 'master' into branch1
| |\
| |/
|/|
* | a4d1247 message13 (fixed test10.txt)
* |   4791df6 Merge branch 'branch2'
|\ \
| * | f3ef64d (HEAD -> branch2) message12
| * | 7fdeb04 message10
| * | b838160 message9
| * | c68ef01 message8
| | *   135f847 Merge branch 'master' into branch1
| | |\
| |_|/
|/| |
* | | 60b0341 message12
* | | 045a734 message11
* | | d10f934 message10
|/ /
| * 2495cae message7
|/
* 94996a0 message4
* 20bbab7 message3
* 00cad71 message2
* 4ace194 message1

※指定の位置以降のすべてのコミットの概要を得る
git shortlog master --no-merges --not 94996a0
↓
結果: 
person1 (10):
      message8
      message9
      message10
      message11
      message12
      message10
      message12
      message13 (fixed test10.txt)
      message14
      message15

(※時系列の順番に表示される模様、マージ記録は表示されず、cherry-pickの分は表示される模様)

-----

git shortlog master --not branch2
↓
結果: 
person1 (7):
      message10
      message11
      message12
      Merge branch 'branch2'
      message13 (fixed test10.txt)
      message14
      message15

(※branch2から分岐元の地点まで戻った所からのコミット記録が表示される模様)
```

# 環境

Windows 10、PortableGit-2.40.0-64-bitを使用、全てローカルPC上で実施、GitHub等は不使用。
langchain忘備録

  初めての投稿です。
　　　　　　　　　　　　　　　　　　　　宮本　賢
　langchainのサンプルプログラムを実行した。
前提条件のOpenAIのAPI Keyも登録した。
　　
   　現象：from langchain.llms import OpenAIを使った時	
	　　　　「ValueError "'not' is not a valid parameter name」エラーが出る。	
		
	原因:	Pydantic のバージョンが古かった。
		Langchain の要件には Pydantic も含まれており、^1 を指定しているため、問題は 1.10.0a1 で修正
	対策:	
		pydanctic を最新バージョン 1.10.7 に更新
		
	参考：	
		https://stackoverflow.com/questions/76237219/langchain-valueerror-not-is-not-a-valid-parameter-name
pyenvを用いたpythonバージョン管理

## 初めに
emonです。
今回は、pyenvを用いたpythonのバージョン管理方法についてまとめてみました。

目標：本記事に沿ってコマンドを実行するとpythonのバージョンをpyenvで管理できる

## pyenvとは
[github](https://github.com/pyenv/pyenv)
pythonのバージョンを切り替えることができるツールです。
どのようなシーンで使用するかというと、業務では安定版を使っているが最新版の機能調査をしたい時などです。パッチバージョンが変わってもあまり影響はないですが、マイナーバージョンメジャーバージョンが変わると影響が出てくるので自在に切り替えることができ、開発環境も壊れないのでかなり便利です。

## pyenvのセットアップ
では、実際にインストールしてみましょう〜
### pyenvをインストールする
```
brew install pyenv
```
### パスを通す
以下コマンドを実行しbash_profileファイルを編集していきます。
```
vi ~/.bash_profile
```
以下を追加してください。
```
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```
追加後、`esc`押下し、`:wq`でファイルを保存してください。

### bash_profileの記載を反映させる
```
source ~/.bash_profile
```


## 実際にpyenvを用いてpythonをインストールする

今回は、pythonのversionを`3.9.7`で実際に設定してみます。
※その他バージョンの際は、そちらに変更してください。

### インストール可能なバージョンを表示
```
pyenv install --list
```
### 指定のバージョンをインストール
```
pyenv install 3.9.7
```
### デフォルトバージョンを指定する
```
pyenv global 3.9.7
```
### インストールできたかを確認する
```
pyenv versions 
```
以下のようになっているとインストール完了です！
```
* 3.9.7 (set by /Users/[ユーザ名]/.pyenv/version)
```

## 次に別バージョンをインストールし切り替えができることを確認する
以下で別バージョンをインストールし、切り替えます。
```
pyenv install 3.10.0
pyenv global 3.10.0
```
以下のようにバージョンを確認し切り替わっていると成功です！
```
pyenv versions 

-----------
* 3.10.0 (set by /Users/[ユーザ名]/.pyenv/version)
```

## 不要になった環境を消す
```
pyenv uninstall 3.9.7
```
`pyenv versions`でインストールされているバージョンを確認し存在していなかったら削除完了です。

以上、で基本的な設定は完了です。

最後まで見て頂きありがとうございました
[Git] 動作を試す 実行例36：branchコマンドでチェックアウトせずにブランチを自由に移動させる

Gitの動作を理解するために、Gitのコマンドを実際に試して、結果を見てみました。

1つの記事内で一連のGitコマンドが完結しているので、これら一連のコマンドを順に実行させて結果を見ることで、一連のGitの動作を実際に体感でき、一通り独習することが可能です。

※前回記事のリポジトリ状態からの続きになっています。
| [前回記事へ](https://qiita.com/dl_from_scratch/items/a579d8ae7edf01b4d047) | [目次へ：Git関連記事のまとめページ](https://qiita.com/dl_from_scratch/items/597bc28a4787a7901d21) | [次回記事へ](https://qiita.com/dl_from_scratch/items/d72b61d192f9bc355a1e) |
|:-:|:-:|:-:|

# 実行例

```
(※現在のブランチ状況を確認)
git branch -v
↓
結果: 
* branch1 2b19eaa Merge branch 'master' into branch1
  branch2 f3ef64d message12
  master  a4d1247 message13 (fixed test10.txt)

※現在のブランチ構造の模式図(+Mはマージ、10C,12Cはチェリーピック)
message1-2-3-4-10-11-12-+M-13 ←master
             |       ↓ ↑ ↓
             +-7-----+M-↑-+M ←branch1
             |          ↑
             +-8-9-10C--12C ←branch2

-----

(※チェックアウトせずに(内容物のファイルを作業フォルダ内に毎回生成させずに)、ブランチを自由に移動させる(自由に任意のコミット位置へ付け替える))

※branch1をチェックアウトの状態で、masterブランチをbranch2の所へ移動させる
git branch -f master branch2

git branch -v
↓
結果: 
* branch1 2b19eaa Merge branch 'master' into branch1
  branch2 f3ef64d message12
  master  f3ef64d message12

※branch1をチェックアウトの状態で、masterブランチをmessage1の所へ移動させる
git branch -f master 4ace194

git branch -v
↓
結果: 
* branch1 2b19eaa Merge branch 'master' into branch1
  branch2 f3ef64d message12
  master  4ace194 message1

git branch -f branch2 00cad71

git branch -v
↓
結果: 
* branch1 2b19eaa Merge branch 'master' into branch1
  branch2 00cad71 message2
  master  4ace194 message1

-----

(※branch1をチェックアウトの状態では、branchコマンドでbranch1を移動できない)

git branch -f branch1 20bbab7
↓
結果: 
fatal: cannot force update the branch 'branch1' checked out at 'D:/test-space/local-repo1'

※代わりに、resetコマンドで移動させる
git reset --hard 20bbab7
↓
結果: 
HEAD is now at 20bbab7 message3

git branch -v
↓
結果: 
* branch1 20bbab7 message3
  branch2 00cad71 message2
  master  4ace194 message1

git log --oneline --graph --all
↓
結果: 
* 20bbab7 (HEAD -> branch1) message3
* 00cad71 (branch2) message2
* 4ace194 (master) message1

-----

(※ブランチ位置をそれぞれ元に戻す)

git branch -f master a4d1247
git reset --hard 2b19eaa
git branch -f branch2 f3ef64d

git branch -v
↓
結果: 
* branch1 2b19eaa Merge branch 'master' into branch1
  branch2 f3ef64d message12
  master  a4d1247 message13 (fixed test10.txt)

git log --oneline --graph --all
↓
結果: 
*   2b19eaa (HEAD -> branch1) Merge branch 'master' into branch1
|\
| * a4d1247 (master) message13 (fixed test10.txt)
| *   4791df6 Merge branch 'branch2'
| |\
| | * f3ef64d (branch2) message12
| | * 7fdeb04 message10
| | * b838160 message9
| | * c68ef01 message8
* | | 135f847 Merge branch 'master' into branch1
|\| |
| * | 60b0341 message12
| * | 045a734 message11
| * | d10f934 message10
| |/
* / 2495cae message7
|/
* 94996a0 message4
* 20bbab7 message3
* 00cad71 message2
* 4ace194 message1
```

# 環境

Windows 10、PortableGit-2.40.0-64-bitを使用、全てローカルPC上で実施、GitHub等は不使用。
[Git] 動作を試す 実行例35：任意のブランチをコミット履歴の中で自由に移動させる

Gitの動作を理解するために、Gitのコマンドを実際に試して、結果を見てみました。

1つの記事内で一連のGitコマンドが完結しているので、これら一連のコマンドを順に実行させて結果を見ることで、一連のGitの動作を実際に体感でき、一通り独習することが可能です。

※前回記事のリポジトリ状態からの続きになっています。
| [前回記事へ](https://qiita.com/dl_from_scratch/items/8f04abf9bed828cbdb6f) | [目次へ：Git関連記事のまとめページ](https://qiita.com/dl_from_scratch/items/597bc28a4787a7901d21) | [次回記事へ](https://qiita.com/dl_from_scratch/items/a6addaeb6dc3ef826a74) |
|:-:|:-:|:-:|

# 実行例

```
※現在、全ブランチが、どのコミット位置にいるか、を表示する ⇒これが現在の状態全てを表すもの
git branch -v
↓
結果: 
* branch1 2b19eaa Merge branch 'master' into branch1
  branch2 f3ef64d message12
  master  a4d1247 message13 (fixed test10.txt)

※ブランチ・コミットの中を自由に移動した後で、この表示が同じであれば(全ブランチのコミット位置が同じもの)、同じ状態に戻ったことが確認できる

-----

※現在のブランチ上の、どのコミット位置にいるか、を表示する
git log --oneline -1
↓
結果: 
2b19eaa (HEAD -> branch1) Merge branch 'master' into branch1

-----

※任意の位置に移るには、以下の2つのコマンドで移動(まず移したいブランチに移り、次にコミットへ移す)
git checkout <branch名>
git reset --hard <コミットのSHA値>

※移動例
git checkout master
git reset --hard 2495cae
git log --oneline -1
↓
結果: 
2495cae (HEAD -> master) message7

※移動例
git checkout branch2
git reset --hard 045a734
git log --oneline -1
↓
結果: 
045a734 (HEAD -> branch2) message11

git branch -v
↓
結果: 
  branch1 2b19eaa Merge branch 'master' into branch1
* branch2 045a734 message11
  master  2495cae message7

(※元に戻す)
git checkout master
git reset --hard a4d1247
git checkout branch2
git reset --hard f3ef64d
git checkout branch1
git branch -v
↓
結果: 
* branch1 2b19eaa Merge branch 'master' into branch1
  branch2 f3ef64d message12
  master  a4d1247 message13 (fixed test10.txt)

-----

※移動用の新規ブランチを作成して、コミットの中を自由に移動後、一時的な移動用ブランチを削除
git checkout -b <branch_temp名>
git reset --hard <コミットのSHA値>
git branch -D <branch_temp名>

※移動例
git checkout -b branch_temp
git reset --hard 2495cae

git branch -v
↓
結果: 
  branch1     2b19eaa Merge branch 'master' into branch1
  branch2     f3ef64d message12
* branch_temp 2495cae message7
  master      a4d1247 message13 (fixed test10.txt)

type test1.txt
↓
結果: 
Sample-Added-11
Sample-Added-12
Sample-Added-13
Sample-Added-14
Sample-Added-17

dir /b
↓
結果: 
test1.txt
test2.txt
test4.txt

(※別ブランチに移ってから、一時的な移動用ブランチを削除)
git checkout branch1
git branch -D branch_temp

(※移動前の状態に戻ったことを確認)
git branch -v
↓
結果: 
* branch1 2b19eaa Merge branch 'master' into branch1
  branch2 f3ef64d message12
  master  a4d1247 message13 (fixed test10.txt)

(※移動前の状態に戻ったことを確認)
git log --oneline --graph --all
↓
結果: 
*   2b19eaa (HEAD -> branch1) Merge branch 'master' into branch1
|\
| * a4d1247 (master) message13 (fixed test10.txt)
| *   4791df6 Merge branch 'branch2'
| |\
| | * f3ef64d (branch2) message12
| | * 7fdeb04 message10
| | * b838160 message9
| | * c68ef01 message8
* | | 135f847 Merge branch 'master' into branch1
|\| |
| * | 60b0341 message12
| * | 045a734 message11
| * | d10f934 message10
| |/
* / 2495cae message7
|/
* 94996a0 message4
* 20bbab7 message3
* 00cad71 message2
* 4ace194 message1
```

# 環境

Windows 10、PortableGit-2.40.0-64-bitを使用、全てローカルPC上で実施、GitHub等は不使用。
paiza.ioでelixir その223

# 概要
paiza.ioでelixirやってみた。
ハノイの塔、やってみた。

# サンプルコード

```
defmodule H do
    def hanoi(0, _, _) do
    end
    def hanoi(n, a, b) do
        hanoi n - 1, a, 6 - a - b
        IO.puts "円盤#{n}を #{a} -> #{b}"
        hanoi n - 1, 6 - a - b, b
    end
end

H.hanoi 3, 1, 2
```

# 実行結果

```
円盤1を 1 -> 2
円盤2を 1 -> 3
円盤1を 2 -> 3
円盤3を 1 -> 2
円盤1を 3 -> 1
円盤2を 3 -> 2
円盤1を 1 -> 2

```

# 成果物

https://paiza.io/projects/qaOMl65R_TtcvLLSuvjGkg


以上。
大学の研究室内のコンピュータを自宅のネットワークに所属させる

# 研究室内のコンピュータを自宅のネットワークに所属させる


## 概要
　別のネットワークに所属しているコンピュータを自宅のネットワークに所属させる方法として、SoftEtherのVPNがあります。これによって、別のネットワークに所属しているコンピュータと安全に通信が可能になります。例えば、研究室内のMac miniをVNCなどのRemote Desktopソフトウェアで安全に通信、制御することができます。
　この方法は無料であり、構築するネットワークや使用するコンピュータが高性能であれば、そこらへんの無料VPNよりも安全で高速なVPN環境を構築することができます。  
　今回は、私が所属している大学の研究室内のコンピュータを対象に自宅のネットワークに所属させる方法について紹介したいと思います。詳しい環境構築についてはインターネットにたくさんの記事があるため省略します。


## 前提
　今回はSoftEtherのサーバを自宅に設置する上で、デフォルトルートであるルータにグローバルIPアドレスが割り当てられている必要があります。マンションやアパートなどルータにグローバルIPアドレスが割り当てられていないネットワークでは基本的にはSoftEtherのVPN環境の構築は困難です。（VPSを使用することで回避は可能らしいです。）


## 環境
　SoftEtherを使用したVPN環境については以下に示します。

  - SoftEtherサーバ  
    - 自宅に設置したRaspi 400
  - SoftEtherクライアント  
    - 研究室内のMac mini
    - 研究室内のJetson nano

　以下にネットワーク環境図を示します。
![softether_network.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3365424/7e85ef45-eaa7-f86e-a863-a3fd5df42775.jpeg)


## 注意事項
　上記のようなVPNネットワークを構築する上で注意するべき点が２つあります。
　１つ目は、ポート開放で
- 500/UDP
- 4500/UDP
- 1701/UDP
を設定する必要があります。ここを間違えると外部からVPNクライアントがアクセスできなくなるので、注意が必要です。（私はここでハマりました。）

　２つ目は、研究室内のコンピュータが起動した際に、自動で自宅VPNに参加させる設定をしておく必要があります。MacであればScript Editerなどを使用することで実現可能です。
　

## 感想
　今回、このような記事を書いた理由として、自宅から研究室内のコンピュータで作業することで研究室に行かなくても自宅で研究ができるためです。私の研究室では研究室用VPNが構築されているため、自分のコンピュータがそのVPNにアクセスすれば良いのですが、研究室内でVPNの使用が禁止されている場合は、上記のような仕組みを利用すれば自宅で研究の続きができます。
　ただ、この仕組みは自宅のネットワークからコンピュータウイルスなどの良くないものが研究室内にも入り込んでしまう可能性もあるため、使用するには注意が必要です。
　コンピュータ一台で研究ができてしまう学生であれば、VPNを使用して自宅で研究してしまうのもありだとは思いました。
[自分用]Next.jsのuse〜の初期値

## 文字列の場合
※早速注意点だが、関数を記述する場所には注意（別の投稿に詳しく書いてあるよ）。
```jsx
export function Home(){
  const [text , setText] = useState("");

  return (
    <input type="text" value={text} onChange={e => {
      setText(e.target.value);
    }}/>
  );
}
```
valueのpropsを使うときは

`onChange`
inputに何かしらのテキストを打ったときにテキストが変更されるが、その時のイベントを取得することができる。
もしonChangeがない場合は、setTextで{text}を変えていないので、inputの中身が初期値のままになる。
**※「set〜関数」を使って変数を変更しないと再レンダリングされないので気をつけよう！**
↓
**逆にいうと、onChangeを使うと文字を入力したり、消したりするたびに再レンダリングされているのだ。**

### 少しアレンジ
下記は５文字を超えたらアラートを出して、returnで処理を終了させている。
```jsx
if(e.target.value.length > 5){
  alert('５文字以内にしてください');
  return;
}
setText(e.target.value);
```
下記のように`trim()`を追加すると、文字列の前後の空白を取り除いてくれる。
```jsx
setText(e.target.value.trim());
```

## 真偽値
下記のコードは真偽値によって処理を与えるコード。
```jsx
export default function Home() {
  const [foo, setFoo] = useState(1);
  const [isShow, setIsShow] = useState(true);

  const handleClick = () => {
    setFoo(foo => foo + 1);
  };

  return (
    <>
      {/* ここの三項演算子に注目 */}
      {true ? <h1>{foo}</h1> : null}
      <button
        onClick={handleClick}
      >
        ボタン
      </button>
      <button
        onClick={() => {
          setIsShow(false);
        }}
      >
        非表示
      </button>
    </>
  )
}
```
`{true ? <h1>{foo}</h1> : null}`
条件がtrueだったら「左 : 右」の左側が実行される。falseなら右側が実行される。
※jsxではreturnの中にif文を書くことができない。だから三項演算子を使うのだ。

`<button onClick={() => { setIsShow(false); }} >　非表示　</buton>`
そしてこのコードの解説。
まずsetIsShowの初期値には「true」が付与されている。そのため`{true ? <h1>{foo}</h1> : null}`の記述に基づき現在のカウントが表示されている。
「非表示」ボタンを押すとsetIsShowの中身が「false」に変わるためカウントが非表示になる。

**これを「表示されているなら非表示に、非表示なら表示」という処理に変えたい！！！！**
```jsx
<button
  onClick={() => {
    setIsShow(false);
  }}
>
  非表示
</button>

{/* このコードを下記のように修正 */}

<button
  onClick={() => {
    setIsShow((isShow)=> !isShow);
  }}
>
  {isShow ? "非表示" : "表示"}
</button>
```
まずsetIsShowの中身を関数にすることで、**前回の値を参照すること**ができる。

また、`!isShow`は、tureならfalseを返し、falseならtrueを返す。
`return isShow ? false : true;`と同じ意味。

※そして毎度毎度のことだが、関数は外に出して使用しよう。上記は例なので中に書いている。
(**useCallbackは忘れないようにね**)
```jsx
  const handleDisplay = useCallback(() => {
    setIsShow((isShow)=> !isShow);
  },[]);

  return (
    <>
      {isShow ? <h1>{foo}</h1> : null}
      <button
        onClick={handleClick}>
        ボタン
      </button>
      <button
        {/* ここがスッキリしました */}
        onClick={handleDisplay}
      >
        {isShow ? "非表示" : "表示"}
      </button>
    </>
  )
```
スタックチャンのインストール　M1Mac(ARM)編

スタックチャンのドキュメントを見たが、よくわからなかったのでここにまとめます。
とりあえず公開します。後ほど詳細を加筆する予定です。


# 公式ページ：
https://protopedia.net/prototype/2345

# 以下の順に追って作業していく。
# ①MAC環境作成方法：
https://zenn.dev/yh1224/articles/34f8383gea793f1gf

# ②moddableインストールの仕方
https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/devices/esp32.md#win-instructions

# ③modの書き込み方
https://github.com/meganetaaan/stack-chan/blob/dev/v1.0/firmware/docs/flashing-firmware_ja.md

# シリアルの書き込み方
## pyserialインストール
https://magazine.techacademy.jp/magazine/24674#ta-toc-3

## 問題１：mcrunでシリアルポートに書き込めない
https://github.com/Moddable-OpenSource/moddable/discussions/715
makeファイルが間違っているらしく、make.esp32.mkの"?="を"="に変更した。

## 問題２：mcrunのパラメータ
https://twitter.com/stc1988/status/1490714187429212161
こちらを参考に、"mcrun -m -p esp32/${npm_config_device}"とした。
実際にはn${npm_config_device}には"ls /dev/tty.*"で表示されたデバイスファイル名を記入して実行している。

## 問題３：m1macに対応していない
https://twitter.com/hiroloquy/status/1472072932184948738
tsc(type script)のインストールが必要なことがわかった。

## 問題４：pipが使えない
pythonのバージョン切り替えにpipを使いたいが、できないのでeasy_install pipを実行する。
https://teratail.com/questions/238908

## 問題５：pipのインストールエラー
python3.11だとpipのインストールでエラーが出るのでpyenvをインストールし、Python 3.11->3.10にバージョンを切り替える。
エラー内容　fatal error: 'longintrepr.h' file not found
https://stackoverflow.com/questions/74979674/gensim-install-in-python-3-11-fails-because-of-missing-longintrepr-h-file

## pyenvインストール方法
https://original-game.com/python_course/install/mac-homebrew-pyenv/#m_heading-1

## pyenvでのpythonバージョン切り替え
https://original-game.com/python_course/install/mac-homebrew-pyenv/#m_heading-1


# 参考：
## git TOP
https://github.com/meganetaaan/stack-chan

## stackchan gettingstarted
https://github.com/meganetaaan/stack-chan/blob/dev/v1.0/firmware/docs/getting-started_ja.md

## Moddable SDK getting started
https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/Moddable%20SDK%20-%20Getting%20Started.md

## ESP-IDF
https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/devices/esp32.md#win-instructions
クロージャに引数名を明記する方法とメリット(Swift)

## はじめに

クロージャに引数ラベルを付けることはできませんが、実は引数ラベルを省略して引数名のみを付けることはできます。

```swift
// ✅
let onSaveButtonClicked: (String) -> Void
let onSaveButtonClicked: (_ movieTitle: String) -> Void

// ❌
let onSaveButtonClicked: (movieTitle: String) -> Void // ビルドエラー
```

## 環境

- OS：macOS Ventura 13.3.1 (a)
- Xcode：14.3 (14E222b)
- Swift：5.8

## クロージャに引数名を明記するメリット

クロージャに引数名を明記するメリットを紹介します。

### 何が渡ってくるか明確にできる

クロージャ名や型名から推測できることもありますが、先ほどの例（ `onSaveButtonClicked: (String) -> Void` ）のように何が渡ってくるか推測しづらいこともあります。

`onSaveButtonClicked: (_ movieTitle: String) -> Void` のように引数名を付けることで、何が渡ってくるか明確にできます。

### Xcodeで補完が効く

構造体の生成時にEnterキーを押すと、自動的に引数名が補完されます。

```swift
struct Foo {
    let onSaveButtonClicked: (_ movieTitle: String) -> Void
}
```

![スクリーンショット 2023-05-20 13.58.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/f0f300d8-e4f0-6bbc-8e92-2a29ab47e11e.png)
↓ Enterキーを押す
![スクリーンショット 2023-05-20 13.57.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/d98700ec-21d8-8179-61ea-cd5f10ec3c6e.png)

Twitterで教えていただきました。

https://twitter.com/treastrain/status/1659057219294601218

余談ですが、Swift Playgroundsでは補完されませんでした。

## おわりに

記述量が増えるくらいしかデメリットはなく、メリットが多いので積極的に引数名を明記しようと思いました。

逆に言えば記述量が増えるデメリットがあるので、クロージャ名や型名から推測できる場合は今まで通り省略するのもありかもしれません。

私は基本的にはすべてのクロージャに明記するつもりです。

## 参考リンク

- https://twitter.com/the_uhooi/status/1659022026294837248
- [Refactor closures by uhooi · Pull Request #157 · uhooi/Loki](https://github.com/uhooi/Loki/pull/157)
RubyでAtCoder ABC257(A, B, C)を解いてみた

# はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC257のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。

# A - A to Z String 2
https://atcoder.jp/contests/abc257/tasks/abc257_a
```ruby:a-257.rb
n, x = gets.split.map(&:to_i)
puts (65 + ((x - 1) / n)).chr
```
## 解説
N個ずつ並べるので、Aから見て(x - 1)をnで割った位置にある文字が答えとなります。

# B - 1D Pawn
https://atcoder.jp/contests/abc257/tasks/abc257_b
```ruby:b-257.rb
n, k, q = gets.split.map(&:to_i)
a = gets.split.map(&:to_i)
l = gets.split.map(&:to_i)

q.times do |i|
  index = l[i] - 1
  next if a[index] == n
  if l[i] == k
    a[index] += 1
  elsif a[index] + 1 < a[l[i]]
    a[index] += 1
  end
end
puts a.join(" ")
```
## 解説
（公式解説を参考にしました）

以下の場合分けをすることにより実装することができます。
1．`Li=K`ならば（`K=N`の場合は除く）、`K<N`より`A[L[i]-1]`の値をインクリメントします。
2．上記以外でかつ、次のマスにコマがなければ`A[L[i]-1]`の値をインクリメントします。

# C - Robot Takahashi
https://atcoder.jp/contests/abc257/tasks/abc257_c
```ruby:c-257.rb
# 修正前
n = gets.to_i
s = gets.chomp
w = gets.split.map(&:to_i)

array = []
w.each_with_index do |factor, index|
  array << [factor, s[index]]
end
array.sort!

ans = count = s.count("1")
array.each_with_index do |factor, index|
  if factor[1] == "1"
    count -= 1
  else
    count += 1
  end
  
  if index != n - 1
    ans = [ans, count].max if factor[0] != array[index + 1][0]
  else
    ans = [ans, count].max
  end
end
puts ans
```
```diff_ruby:c-257.rb
# 修正後
n = gets.to_i
s = gets.chomp
w = gets.split.map(&:to_i)

array = w.zip(s.chars).sort

ans = count = s.count("1")
array.each_with_index do |(weight, child_or_adult), index|
  count += (child_or_adult == "1") ? -1 : 1
- ans = [ans, count].max if array.dig(index + 1) && weight != array[index + 1][0]
+ ans = [ans, count].max if array.dig(index + 1, 0) != weight 
end
puts [ans, count].max
```
## 解説
（[公式解説](https://atcoder.jp/contests/abc257/editorial/4181)を参考にしました）

与えられた体重を昇順にソートし、1番左から線を引き右にずらしていくことで判定していきます（線の左が子ども、右が大人）。`count`の初期値については、最初すべての人が大人と判定してるため大人の数が正しく判定できる人数になります。

https://qiita.com/shoya15/items/50fd17e37d7c64f2b166
Vagrantを使用したときに困った体験一覧

# <font color="OrangeRed">前提</font>
- Windows環境

# <font color="OrangeRed">Which interface should the network bridge to?</font>
- コマンドラインをEnter押してもうんともすんともしない

### なんだこれ
```
config.vm.network "public_network", ip: "192.168.0.1", hostname: true
config.vm.network "forwarded_port", guest: 80, host: 8080, protocol: "tcp", auto_correct: true

```
たぶん、この辺の設定を行うと出るっぽい

### 結論
- 「1」を入力すると進んだ。


# <font color="OrangeRed">please check the process listing for any "ruby" or "vagrant" processes and kill them. Then try again.</font>
- プロビジョニング中に強制終了したら、rubyなんちゃらと警告が出た。

### 結論
```shell
# ルビーに関係するプロセス検索
tasklist | grep ruby*

# 該当プロセスをKILL
wmic process where "name='プロセス名'" delete
```


# <font color="OrangeRed">VagrantのPort開放関係(localhost:????)の部分ってどうやって指定するんだ</font>
### 結論
- アプリケーション側のportを:7000に指定する
    - golangなら`http.ListenAndServe(":7000", nil)`
- Vagrantfileの設定
    - `config.vm.network "forwarded_port", guest: 7000, host: 7001`


# <font color="OrangeRed">Goの拡張機能がSSH接続でVsCode環境で使用できない</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3081664/50c0466a-961e-a076-b5ce-cba47eec5676.png)


症状
- 放置しても、画像の状態でフリーズ
- 補完が効かない

## 結論
- まず、Goの開発環境サポート用のツールをインストールする必要がある
- Vagrantfileにて、以下の通りにSSH接続後(VsCode)、Vagrant環境内で実行する①
- VsCodeを開き、Go拡張機能をインストールする

①↓↓↓↓↓↓↓↓↓
```sh
# Go1.20のインストール
GOFILE=go1.20.4.linux-amd64.tar.gz
wget https://go.dev/dl/$GOFILE
sudo tar -C /usr/local -xzf $GOFILE
rm -rf $GOFILE

# Goのパスを通す
echo "export PATH=$PATH:/usr/local/go/bin" >> /home/vagrant/.bashrc
source /home/vagrant/.bashrc

GO_PLS_VERSION=golang.org/x/tools/gopls@v0.11.0
GO_OUTLINE_VERSION=github.com/ramya-rao-a/go-outline@latest
GO_CODE_VERSION=github.com/stamblerre/gocode@v1.0.0
/usr/local/go/bin/go install -v $GO_PLS_VERSION
/usr/local/go/bin/go install -v $GO_OUTLINE_VERSION
/usr/local/go/bin/go install -v $GO_CODE_VERSION

```



# <font color="OrangeRed">fatal error: out of memory allocating heap arena map</font>

症状
- go run main.goで実行したときにエラーが出る

## 結論
- Vagrant環境内で割り当てているメモリが影響しているっぽい(確証は無い)
- Goの拡張機能が割と重めの印象なのでDisableにしてみてVsCodeリロードで解決
- `free -h`コマンドでメモリ使用量を確認し、メモリ不足ならVagrantのメモリ設定を多めに確保するか、拡張機能落とすとか整理する
- `sudo sync && sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'`でキャッシュ削除出来る(応急)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3081664/4871167c-d3ff-e78e-c41d-00f056714ec4.png)


# これから
- とりあえず詰まったらここに書き足していく
BardにChatGPTについて聞いてみた

# 概要
BardにChatGPTとの違いなどを聞いてみました。利点と欠点も聞いてみました。
Qiitaの記事も書かせてみたのでそちらも見ていただければと思います。

https://qiita.com/nori-channel/items/c94235e11996aed0c4c7

https://qiita.com/nori-channel/items/01d4d5ce67479523256c

# 質問その１
以下の質問をBardに投げかけてみました。
```
ChatGPTの利点と欠点を述べてみてください。
```
以下の回答が来ました。
```
ChatGPTは、OpenAIが開発したチャットボットです。インターネット上のテキストとコードのデータセットでトレーニングされており、幅広いプロンプトや質問に応じて人間のようなテキストを生成できます。

ChatGPTの利点のいくつかを次に示します。

幅広いプロンプトや質問に応じて人間のようなテキストを生成できます。
オープンエンド、やりがいのある、または奇妙な場合でも、有益な方法で質問に答えることができます。
詩、コード、スクリプト、楽曲、メール、手紙など、さまざまなクリエイティブなテキスト形式のテキストコンテンツを生成できます。
まだ開発中ですが、次のような多くの種類のタスクを実行することを学びました。
あなたの指示に従い、あなたの要求を慎重に完了します。
オープンエンド、やりがいのある、または奇妙な場合でも、その知識を使用して包括的かつ有益な方法で質問に答えます。
詩、コード、スクリプト、楽曲、メール、手紙など、さまざまなクリエイティブなテキスト形式のテキストコンテンツを生成します。
ChatGPTの欠点のいくつかを次に示します。

まだ開発中であり、時々誤った情報を生成することがあります。
専門家や医学的アドバイスを提供することはできません。
すべての質問に答えることができるわけではありません。
常に応答できるとは限りません。
全体として、ChatGPTは、幅広いプロンプトや質問に応じて人間のようなテキストを生成できる強力なツールです。ただし、まだ開発中であり、完璧ではないことに注意することが重要です。
```

# 質問その２
以下の質問をBardに投げかけてみました。
```
BardとChatGPTとの違いについて述べてみてください。
```
以下の回答が来ました。
```
BardとChatGPTはどちらも、テキストとコードの大規模なデータセットでトレーニングされた大規模な言語モデルです。どちらも、幅広いプロンプトや質問に応じて人間のようなテキストを生成でき、有益な方法で質問に答えることができます。ただし、2つのモデルにはいくつかの重要な違いがあります。

Bardは、Google AIの大規模な言語モデルであるLaMDAに基づいています。ChatGPTは、OpenAIの大規模な言語モデルであるGPT-3に基づいています。LaMDAはGPT-3よりも大規模で強力なモデルであり、より幅広いプロンプトや質問に応じて人間のようなテキストを生成できます。

Bardはまた、ChatGPTよりも包括的なトレーニングを受けています。Bardは、テキストとコードの大規模なデータセットでトレーニングされていますが、ChatGPTは主にテキストのデータセットでトレーニングされています。これにより、Bardはテキストの生成、言語の翻訳、さまざまな種類のクリエイティブコンテンツの作成、質問への有益な回答など、幅広いタスクを実行できるようになります。

全体として、BardはChatGPTよりも高度で包括的な大規模な言語モデルです。幅広いプロンプトや質問に応じて人間のようなテキストを生成でき、有益な方法で質問に答えることができます。
```

# 質問その３

以下の質問をBardに投げかけてみました。
```
Bardの利点と欠点を教えてください。
```
以下の回答が来ました。
```
はい、Bardの利点と欠点をいくつか挙げてみましょう。

Bardの利点のいくつかを次に示します。

Bardは、テキストとコードの大規模なデータセットでトレーニングされているため、幅広いプロンプトや質問に応じて人間のようなテキストを生成できます。
Bardは、オープンエンド、やりがいのある、または奇妙な場合でも、有益な方法で質問に答えることができます。
Bardは、詩、コード、スクリプト、楽曲、メール、手紙など、さまざまなクリエイティブなテキスト形式のテキストコンテンツを生成できます。
Bardはまだ開発中ですが、次のような多くの種類のタスクを実行することを学びました。
あなたの指示に従い、あなたの要求を慎重に完了します。
オープンエンド、やりがいのある、または奇妙な場合でも、その知識を使用して包括的かつ有益な方法で質問に答えます。
詩、コード、スクリプト、楽曲、メール、手紙など、さまざまなクリエイティブなテキスト形式のテキストコンテンツを生成します。
Bardの欠点のいくつかを次に示します。

Bardはまだ開発中であり、時々誤った情報を生成することがあります。
Bardは専門家や医学的アドバイスを提供することはできません。
Bardはすべての質問に答えることができるわけではありません。
Bardは常に応答できるとは限りません。
全体として、Bardは幅広いプロンプトや質問に応じて人間のようなテキストを生成できる強力なツールです。ただし、まだ開発中であり、完璧ではないことに注意することが重要です。
```

# まとめ
できることはかぶっていますが、使っている技術は別物のようです。
個人的にGoogleが好きなので、しばらくBardを使ってみようと思っています。
何かの役に立てばと。