OmniAICreator/Qiita-1.07M huggingface dataset:
読書研修　WEBを支える技術　第４章

## URIとURLとURNの区別
|   | URI |URL|URN|
|:-:|:-:|:-:|:-:|
|全称|  Uniform Resource Identifier（ID） |  Uniform Resource Locator | Uniform Resource Name  |
|意味| リソースを識別するもの|リソースの場所を示すもの|リソースの名前を示すもの|
|特徴| URIはURLとURNを総称| よくURIと読み替える|  ドメイン名とは独立してリソースに恒久的なIDを振るための仕様、更新してるときもアクセスできる<br> 例は書籍のISBN|
|問題点| | URLには、ドメインを更新しなかったり、サーバが何らかの障害で変更たりするとアクセスできなくなる|  Web上で普及しているとは言えない<br> ＊URNは取得できない <br> ＊URLが十分永続的になっているので、URN を使うまでもないことが多くなってきた|


## URIの重要性
URIはリソースを<strong>統一的（同じルール）</strong>に識別するIDです。
URIを使うとWEB上に存在するすべてのリソースを一意を示せます。
## URIの構文
URIの仕様：RFC3986
#### 簡単なURI
<strong>URIスキーム://ホスト名/パス
例：``https://blog.example.jp/entries/l``</strong>

#### 複雑なURI
<strong>URIスキーム://ユーザ情報（ユーザ名：パスワード）＠ホスト名：ホスト番号（省略可）/パス？クエリパラメータ＃URIフラグメント
例：``https://yohei:pass@blog.example.jp:8000/search?q=test&debug=true#n10``
①クエリパラメータは複数のとき、＆で連結
②URIフラグメント：りそーすの内部の細かい部分に（HTMLのid属性など）</strong>

## 絶対URI と　相対URI
URIのパスは、UNIXのファイルシステムと同じような階層構造を持ってる
絶対URI：ルートから記述
相対URI：URIスキームやポスト名をはぶいて、パスだけで表現

#### ベースURI
リソースに対するパスの基準となる URI を指定します
注：「/」から始まる相対URIはホスト名からのパスとして解釈します。
 >href 属性をもつ base 要素を記述することで、文書内に絶対パス、相対パスで記述された外部リソースの読み込み、ハイパーリンクの移動、フォームの送信などは、すべて指定された URI を基準に行われることになります。
#### リソースのURIをベースURIとする方法
| 利点 | 欠点 |
|:-:|:-:|
|  わかりやすい |  ベースURIとなるリソースのURIをクライアント側を保存しなければならない |
#### ベースURIを明示的に指定方法
HTMLでhref 属性をもつ base 要素は、head 要素内で、URI を値として持つ属性を指定された他のあらゆる要素より先に記述される必要があります。
## URIと文字
#### URIで使用できる文字
１．アルファベット
２．数字
３．記号
注：①この文字列はASCII文字です。
②漢字など直接入れられない。

#### ％エンコーディング
>エンコーディング（encoding）とは、データを一定の規則に従って目的の情報に変換することです。日本語では「符号化」となり、変換された後の情報のことをエンコード（encode）と呼びます。

URI仕様が許可以外の文字入れるとき、<strong> ％エンコーディング </strong> で文字をエンコーディングします。
エンコーディング方式一般的は<strong> UTF−８</strong>です。

## URIの長さ
特にないですが、実際上は制限ある（2038バイトまで）

## 様なスキーム
<strong>URIスキーム</strong>：そのURIが利用するプロトコルが示すのが一般的です。
<strong>公式なスキーム</strong>：70弱ある（2010年）
<strong>非公式なスキーム</strong>：100以上ある
URIスキームを新たに登録には、<strong>従来にないプロトコルを発明</strong>したときくらい！
一般的には<strong>既存のスキームを指定</strong>する。
## 実装で気をつけること
#### クライアントで絶対URIを使う
クライアントで相対URIを解決するには面倒な処理が必要になるので、
Web サービスやWebAPIを実装する場合なるべく絶対URIを使う

#### ％エンコーディングーーUTF−８
文字エンコーディングの混乱を避けるために、％エンコーディングの文字エンコーディングとしてなるべくUTF−８を用いる
AWS Backupの実行履歴をAthenaで見る

# 前振り

### モチベーション

* AWS Backupはマネコンから30日までのデータしか見れないので、それ以上の期間で確認したい場合
* 日付で範囲選択ができないので、それがしたい場合

![スクリーンショット 0005-04-20 11.31.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/312c3d61-e3b1-b6fc-af13-122bf3b1ae7a.png)

### 前提情報

既にAWS BackupでログをS3に出力している状態

### 作業の流れ

* Glue Crawlerの作成と実行
* Athenaでクエリ

# Glue Crawlerの作成と実行

### 作成

Crawler名を入れて[次へ]をクリック

![スクリーンショット 0005-02-26 13.04.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/55efcc17-9155-cff7-880b-436f2975204d.png)

「Not yes」にチェック入れて[次へ]をクリック

![スクリーンショット 0005-02-26 13.04.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/f6a38799-dba0-acf3-576a-a876ca9f2009.png)

AWS Backupのログを出力しているS3 Pathを指定して[次へ]をクリック

![スクリーンショット 0005-02-26 13.05.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/219acc2d-2dc3-8346-0414-cc22e6cf7f48.png)

必要な権限を付与したIAMロールを指定して[次へ]をクリック

![スクリーンショット 0005-02-26 13.06.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/dda44d3c-0da4-7000-1513-982d4982c966.png)

レポート作成頻度が日次なら、クローラーも日次がよいでしょう。次の画面にいったら[Create Crawler]をクリック

![スクリーンショット 0005-02-26 13.07.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/984cae71-8757-db07-6ba1-b69569924395.png)

## 実行


# Athenaでクエリしてバックアップ履歴を確認

2023年4月の第2週(4/3〜4/9)のログのみ表示。他にもSQLでいろいろクエリ出来ますね。

```sql:SQL
SELECT * FROM "se2"."demo_bk_ap_northeast_1" where partition_0 = '2023' and partition_1 = '04' and partition_2 between '03' and '09' order by "report time period end" asc;
```

![スクリーンショット 0005-04-20 11.44.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/b7b388fc-180a-f565-cc92-871faf8907f1.png)


# まとめ

メリットは以下が出来るようになるです。

* AWS Backupはマネコンから30日までのデータしか見れないので、それ以上の期間で確認したい場合
* 日付で範囲選択ができないので、それがしたい場合

## 参考

[AWS Backup Audit Managerのレポート機能(公式)](https://docs.aws.amazon.com/ja_jp/aws-backup/latest/devguide/working-with-audit-reports.html)

[AWS Backupの薄い教科書](https://qiita.com/pioho07/items/68ccbc7b974b1466e7a6)
ChatGPTの領収書・請求書発行方法【OpenAI】

## ChatGPTの領収書・請求書発行方法

ChatGPTの領収書・請求書発行方法をまとめていきます。
&nbsp;

:::note info
- 日本円で領収書は発行できません。各種料金はドルで統一されています。
- OpenAIは適格請求書発行事業者（インボイス）ではありません。そのため、消費税は不課税です。
:::

&nbsp;
&nbsp;
### 手順解説

&nbsp;
&nbsp;
ChatGPTにログインして、右上のアイコンマークから「設定」をクリック
https://platform.openai.com/apps

![スクリーンショット 2025-02-22 2.55.17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336223/c9052e34-ef29-4f17-b0df-42f4348bf2b5.jpeg)

&nbsp;
&nbsp;
「サブスクリプション」をクリック
![スクリーンショット 2025-02-22 2.51.19.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336223/652607f7-eaf8-4f66-a0d2-f6db00284338.jpeg)


&nbsp;
&nbsp;
発行したい領収書・請求書の日付をクリック。
宛名を変えたい場合は、請求先情報を変更してください。
![スクリーンショット 2025-02-22 2.52.33.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336223/8448d354-afee-43c5-a4fc-f63807e258d5.jpeg)


&nbsp;
&nbsp;
領収書・請求書をダウンロードして、完了。
![スクリーンショット 2025-02-22 2.53.22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336223/2e330cae-2da8-43d6-a80a-c4fdb90f43a1.jpeg)

&nbsp;
&nbsp;
以上！
既読図書 概要まとめ

# 
## 理科系の作文技術
### ターゲット
1. 理科系の研究者
1. 学生
1. 仕事の文章について学びたい人
### この本を読んで出来るようになること
- 論文・調査報告書・レポートなど、他人に見せる必要がある文書の書き方についての基礎を得られる

### 文章構成
1. 序章
1. 準備作業(立案)
1. 文章の組み立て
1. パラグラフ
1. 文の構造と文章の流れ
1. はっきり言い切る姿勢
1. 事実と意見
1. わかりやすく簡潔な表現
1. 執筆メモ
1. 手紙・説明書・原著論文
1. 学会講演の要領

### 重要項目
- 誰のための文章であるか考える
    - 読み手の技術レベル、所属グループによって断りなく略称を使ってよいか考える
        <details><summary>例: カメラの略称</summary>

        1. 略称「エフカメラ」誕生
        エフ社製のカメラ「ベースカメラ」を開発に使用。クライアントとの話し合いで「エフカメラ」と呼ぶことになる。
        2. 新たなカメラ「リアルカメラ」登場
        開発も進み、新たにカメラを導入。アイ社製のよりリアルに近い情報が得られる「リアルカメラ」を導入。略称もそのまま「リアルカメラ」と呼ばれる。    
        
        → 「エフカメラ」は”社名”が基になった略称であるのに対して、「リアルカメラ」は”カメラの名前”となっているため、引き継ぎの際に説明が無いと現場の混乱を招く恐れがある
        </details>


- 必要なことは漏れなく記述し, 必要でないことは一切書かない
    - 事実と判断、予測のみを記述する。
    - 言い切りの形でないものは省き, 客観性を保つ


- 文章の流れを意識する
    - 読み手が真っ先に何を知りたいのか考える
    - 結論から述べ、後に補完する
    - 問題が先にあり,それ対する主題, 動機, 重要性, 背景, 手法を解説する
    - 文章が移り変わる際に改行を入れ明示的にする
    - 事実を述べ終えてから意見を述べるという流れを徹底する


- 文章は要点を短く書く
    - 一文が一義的に読めるか確認する
    - 心の中にある思いや感情は文章に含めない
    - はっきりと言えることは言い切り、ぼかした表現を避ける
    - 日常的によく使う用語を使用する
    - 砕けた言い回しでも構わない
JanusプラグインAPIの実行方法

公式ドキュメントがちょっとわかりづらかったので覚書。
どうやら
①セッションを作成
②プラグインへのハンドルを取得
③プラグインAPIのリクエスト
と3回リクエストしなければならないらしい。

PHPで雑に書くとこんな感じ
下記はvideoroomプラグインの部屋の取得だが、他もパラメータを変えればいけるはず
```get_room_test.php
<?php

$ch = curl_init("https://mydomain:8089/janus");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type:application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    "janus" => "create",
    "transaction" => "123456789" // ここはランダムな数字
]));

$res = curl_exec($ch);
$res_obj = json_decode($res, true);

if(empty($res)){
    error_log(curl_error($ch));
}

curl_close($ch);

echo "****request1****\n";
echo $res . "\n";

if(!isset($res_obj['data']['id'])){
    error_log($res);
    exit();
}
$sid = $res_obj['data']['id'];

// セッションidをパスに入れてもう一度リクエスト
$ch = curl_init("https://mydomain:8089/janus/$sid");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type:application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    "janus" => "attach",
    "plugin" => "janus.plugin.videoroom", // アクセスしたいプラグイン
    "transaction" => "2234567890" // createと同じでも同じでなくてもいい
]));

$res = curl_exec($ch);
$res_obj = json_decode($res, true);

if(empty($res)){
    error_log(curl_error($ch));
}

curl_close($ch);

echo "****request2****\n";
echo $res . "\n";

if(!isset($res_obj['data']['id'])){
    error_log($res);
    exit();
}
$pid = $res_obj['data']['id'];

// 更にプラグインハンドルidをパスに入れてリクエスト
$ch = curl_init("https://mydomain:8089/janus/$sid/$pid");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type:application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    "janus" => "message",
    "body" => [
        "request" => "listparticipants", // 部屋の情報取得のメソッド
        "room" => 1234 // 対象の部屋のid(room-xxxxのxxxx部分)
    ],
    "transaction" => "3234567890" // create,attachと同じでも同じでなくてもいい
]));

$res = curl_exec($ch);
$res_obj = json_decode($res, true);

if(empty($res)){
    error_log(curl_error($ch));
    exit();
}

curl_close($ch);

echo "****request2****\n";
echo $res . "\n";
```


```
結果
****request1****
{
   "janus": "success",
   "transaction": "123456789",
   "data": {
      "id": 2032583429975705
   }
}
****request2****
{
   "janus": "success",
   "session_id": 2032583429975705,
   "transaction": "2234567890",
   "data": {
      "id": 2319648518525006
   }
}
****request3****
{
   "janus": "success",
   "session_id": 2032583429975705,
   "transaction": "3234567890",
   "sender": 2319648518525006,
   "plugindata": {
      "plugin": "janus.plugin.videoroom",
      "data": {
         "videoroom": "participants",
         "room": 1234,
         "participants": []
      }
   }
}
```

参考
https://janus.conf.meetecho.com/docs/rest.html
https://janus.conf.meetecho.com/docs/videoroom.html
@importが非推奨になった今、sassでパーシャルファイルを読み込むには、どうするのが正解なのか？

# 前提
2022年10月1日に@importが非推奨になりました。
パーシャルファイルを読み込む時に、何を使えばいいのか、情報を整理した備忘録です。

# 基本的には@useでオッケー

@importの代替には@use(Sass 3.10以上のバージョン)と@forward(Sass 3.5以上のバージョン)が推奨されています。

ただ読み込むだけなら@useを使いましょう。

ただし、@mixinやfanctionを使っている場合には@forwardを使いましょう。


# 番外編：関数を作って使いまわしたい時にどうするのか
@useや@importを調べた時、公式ドキュメント等にはグローバル関数だの、カプセル化だの出てくることが多かったです。

[@use公式ドキュメント](https://sass-lang.com/documentation/at-rules/use)
[@forword公式ドキュメント](https://sass-lang.com/documentation/at-rules/forward)

で、関数を使いまわしたりしたいときはどうすればいいんだと迷いました。

使いたい関数を1つのパーシャルファイルにまとめて、使いたいsassファイルの先頭で@useを使って読み込むようにしましょう。

例えば_functions.scssというパーシャルファイルを作って、使いまわしたい関数をそこに書き込んだ場合、使いたいsassファイルの先頭には以下のように記述すれば関数が使えます。


```
@use 'functions';
```

私はvwの計算が非常に苦痛なのですが、その計算を勝手にしてくれる関数を作って使いまわしたいです。
なので、関数をまとめて書いておくパーシャルファイル_functions.scssを作って、以下を記述してます。

```
$artboardWidth : デザインカンプのアートボードの画面幅;
@function vw($pixelsVw) {
    @return calc(#{$pixelsVw} / #{$artboardWidth} * 100vw);
}
```

そして、使いたい時には以下のように記述して活用してます。

```
@use 'functions';


.foo {
    margin: vw(20) 0 0 0;
}
```
Cloud Functionについて

# Cloud Functionについて
## Cloud Functionの概要について
　①Cloud FunctionはGCP提供するサーバーレス　コンピューティング　サービスです。</br>
　②Cloud FunctionはApp Engineとの違いは</br>
　　・App Engineは単一のアプリケーションで複数のサービスをサポートする</br>
　　・Cloud Functionは他のサービスとは独立して管理、運用される個々のサービスをサポートする</br>
　③Cloud Functionは制限あり、規定値では、関数は1分後タイムアウト、最大9分間で</br>
　④Cloud　Funcitionを説明するには、以下の用語を理解しておく必要ある。</br>
　　・イベント：GCP上発生する特定のアクション、GCPは以下の５カテゴリーのイベントをサポートする</br>
　　　　　　■Cloud Storage</br>
　　　　　　　　・ファイルのアップロード、削除、アーカイブなど</br>
　　　　　　■Cloud Pub/Sub</br>
　　　　　　　　・メッセージを公開する</br>
　　　　　　■HTTP</br>
　　　　　　　　・HTTPリクエスト（POST、GET、PUT、DELETE、OPTIONS）の時、関数を呼び出せる</br>
　　　　　　■Firebase</br>
　　　　　　　　・データベーストリガー、リモートトリガー、認証トリガーなど</br>
　　　　　　■Stackdriver Logging</br>
　　　　　　　　・変更に応答する関数を設定して、ログエントリをPub／Subトピックに転送し、応答をトリガーする</br>
　　・トリガー：Cloud Functionで有効化された各イベントに対して、トリガーを定義することができる。</br>
　　・関数：トリガーは関数に関連付けられる、関数には、イベントに関するデータと引数が渡される。関数はイベントに応答して実行される</br>

## Cloud FunctionのRuntimeについて
　①関数は独自の環境で実行され、関数は呼び出されるたびに、全ての他の呼び出しとは別のインスタンスで実行される。</br>
　②Cloud Functionのみを使用すると、関数の呼び出し間で情報共有する方法はありません。</br>
　　情報共有、保持する場合、GCSやCloud DataStoreを利用するなど</br>
　③今現在はサポートされるRuntimeの詳細は以下通りである。</br>
　　[Cloud FunctionのRuntime](https://cloud.google.com/functions/docs/concepts/execution-environment?hl=ja"Runtime")</br>

## Cloud FunctionのDeploymentについて
　①gcloudコマンドを使用して、Cloud Functionをデプロイできる</br>
　　・gcloud function deploy、以下のパラメータも渡す必要ある</br>
　　　　　　■runtime</br>
　　　　　　■trigger-resource</br>
　　　　　　■trigger-event</br>　
 　           ・[google.gcs](https://cloud.google.com/functions/docs/calling/storage?hl=ja)</br>

 　①関数を削除するには、gcloud function delete</br>
PHPのコードを読み解き、処理の流れを追う方法

# 前提
デザインパターンがなく、自由に設計された古いPHPのソースコードを読み解くのに苦戦しています。
そんなソースコードを読み解く際に使った方法をまとめました。

# 1.ひたすらvar_dump() や print_r() する
基本中の基本の方法は、よく分からないソースコードのいろいろな部分に`var_dump()` や `print_r() `へ変数名や配列名を入れたり、または`echo('ここを処理が通ってる')`みたいなコメント？を記述して、出力されるかどうかテストします。

ただ、配列を`var_dump()`すると改行無しで出力されてしまうので見づらいです。
以下のように、上下に`<pre>`をechoさせると整形されて出力されます。

```
echo '<pre>';
var_dump($foo);
echo '</pre>';
```

読んでいる機能を一巡させると余計に訳がわからなくなる場合は、必要に応じて`exit;`をいれて処理自体を止めてみることも有用です。その場合、`var_dump()`の後に`exit;`を入れて処理を止めましょう。

ちなみに`exit;` はソースコードの実行を終了するための命令なので、`exit;` の後に書かれたコードは実行されません。
`var_dump();`は`exit;`の前に記述しましょう。

# スタックトレースを活用して処理の流れを出力する

スタックトレースは、関数やメソッドの呼び出し元やその順番を示したものです。

ソースコードの、よくわからない関数があったとします。呼び出し元も不明の場合、スタックトレースを出力させると処理の流れわかりやすいです。

知りたい処理の手前に、以下を記述しましょう。

```
$trace = debug_backtrace();
var_dump($trace);

// 調べたい処理の塊がここに入ります
```

調べたい処理の手前に置くことがポイントです。
debug_backtrace() 関数は、その呼び出し時点でのスタックトレースを取得するので、調べたい処理の後に記述すると、その処理のスタックトレースは出力されません。

ちなみに出力先はWebアプリケーションの場合はブラウザの画面に出てきます。
なお、このdebug_backtrace()は重い作業のようなので、必ず本番にリリースするコードからは削除、またはコメントアウトしておきましょう。


また、もしエラーが出ている処理の流れを追いたい場合は、以下のように、try-catchを記述します。

```
try {
    // エラーが出るコードをここに記述
} catch (Exception $e) {
    $trace = $e->getTrace();
    var_dump($trace);
}
```

こうすると、　例外はchachの引数にあるExceptionクラスの変数eに入り、`getTrace()`によってスタックトレースが取得され、最後`var_dump($trace);`で出力されます。
railsで表示する日時を日本時間にする

# 日時の表示に関して起きる問題
viewに```created_at```のような日時を出力した場合

```contents/index.html
<span class="date"><%= item.created_at.to_s[0..15] %></span>
```

こう記載しただけだと日本時間（JST）ではなく、世界標準時（UTC）で表示されてしまいます。

# タイムゾーンを日本時間に変更する
```config/application.rb```に以下の設定を追加し、サーバーを再起動するだけです。

```config/application.rb

module MovieReview
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 6.0

    config.i18n.default_locale = :ja
    config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.yml').to_s]

    # ↓以下を追加 タイムゾーンを日本時間に設定 
    config.time_zone = 'Asia/Tokyo'
```

これで画面に表示された日時が日本時間になります。

ちなみに再起動した際に、```NameError: undefined local variable or method `config' for main:Object```エラーが出た場合は、```config.time_zone = 'Asia/Tokyo'```の記載している位置がおかしいことが考えられます。


参考：

https://qiita.com/jnchito/items/831654253fb8a958ec25
Rubyでは最後に評価された値が戻り値になる

Rubyでは最後に評価された値が戻り値となる。

# メソッド
メソッドの最後に評価された値が戻り値になるため `return` は不要。
```ruby
def hoge(n)
  'hoge'
  n
end

hoge(2) #=> 2
```

# && や ||
以下もtrueかfalseを返すと思いきや、最後に評価された値が返却される。
```ruby
1 && 2 && 3 #=> 3
1 && nil && 3 #=> nil
nil || 5 #=> 5
```

xがnilなら初期値を渡す以下のようなテクニックをよく見るが、これも最終評価された値が戻り値になり、yに代入される。
```ruby
y = x || 10
```

# if
Rubyでは `nil` と `false` のみ偽、それ以外は真と扱う。
以下だとifでの分岐判定処理の結果が3になり、真と判断される。

```ruby
if 1 && 2 && 3
    # hoge
end
```
超初心者 GitHub & Unity & SourceTree 連携方法【忘備録】

# 概要
**Unity**で新規作成したプロジェクトを**SourceTree**を用いて、**GitHub**で管理する方法を忘備録として記しています。
超初心者向けですのであしからず…

# プロジェクト作成
まずはUntiyでプロジェクトを新規作成します。
今回はこのプロジェクトを連携することがメインなので、プロジェクト作成後はいったん何もせずに次のステップへ進みます。

# プロジェクトフォルダ→ローカルリポジトリに
１．SourceTreeを起動し、右上の「Create」を押します。

２．保存先のパスは「参照ボタン」を押して先ほど作成したフォルダを選び、他は何もいじらずに作成を押します。
※「次のアカウントでリポジトリを作成」のチェックは入れない
![スクリーンショット 2023-04-19 121848.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120604/43a67807-9903-24d6-51e4-934dc4f2ceb5.png)

# GitHubでリモートリポジトリを作成

GitHubでリモートリポジトリを作成します。
このとき、「Add.gitignore」欄で「<font color ="red">Unity</font>」を選択してください
![スクリーンショット 2023-04-20 085246.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120604/232b329e-cee4-9fb6-5444-f55553f4e35c.png)
これでUnity用のリポジトリが作成され、必要なものだけgithubに追加されるようになります。
また、「.gitignore」というファイルが自動生成されています。
これでファイルの選定をしています。

このあとローカルリポジトリとリモートリポジトリを紐づけるため、URLをコピーします。
![スクリーンショット 2023-04-20 090048.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120604/f98e5e6e-4db1-41a7-e979-bbeac1e8701c.png)

# リポジトリの接続

続いてリモートリポジトリをローカルリポジトリに紐づけします。
SourceTreeで、右上にある設定を開きリモートタブで追加を押します。
### リモートの詳細設定
リモート名：特に指定はありませんが、originとすることが多いそうです。
URL/パス：先ほどコピーしたURLを貼り付けます。
そうすると残りは自動的に補完してくれるのでOKを押して終了です。![スクリーンショット 2023-04-20 090924.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120604/7063e707-c9f0-a533-49eb-38db03be0e79.png)

# リモートリポジトリをクローン
SourceTreeで左上にあるプルを押し、「プルするリモートブランチ」でmain（もしくはmaster）を選び最後にプルを押して下さい。
※プルするリモートブランチで選択肢がない場合は、更新を押してください。![スクリーンショット 2023-04-20 091632.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120604/c482572a-70bd-5625-8315-ee0e8d329fc7.png)

# コミット
先ほどのクローンでローカルリポジトリに「.gitignore」ファイルがコピーされたため、管理対象ファイルが無事選定されましたので、これらをコミットしましょう。

左上のコミットを押して、「全てインデックスに追加」を押します。
これでステージングされたので、右下のコミットを押して完了です。
![スクリーンショット 2023-04-20 092013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120604/55192b83-803c-bbe2-4928-60073b184f63.png)

# プッシュ
最後にローカルリポジトリの変更をリモートリポジトリにプッシュしてすべての作業終了です。
Google Bardの進化の過程がわかる！Bardの アップデートの予定をお知らせします

4月18日公開のGoogle Bard。今後もアップデートされるようです。以下の画像の左の選択肢にある[Update]をクリックするとBardの進化の予定がわかります。
![スクリーンショット (777).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291948/25a2c291-2fc2-e0a5-6483-fa3c025ede72.png)
左のUpdatesをクリックすると・・・。!アップデートの予定が表示されました。
![スクリーンショット (776).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291948/2f56a985-404e-08ee-0926-ad679c9c7fcd.png)
2023年４月２１日にGoogle　Bardに質問すると読める３つの回答に多様性が加わるようです。参考：以下のDraft1~3です。どうBardが進化していくか気になっていた方にとってはアップデートの予定がわかることは素晴らしいですね。
![スクリーンショット (780).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291948/b0cd26d1-9daf-f8cc-ad6c-5cb6c9572aa5.png)
ウェブに関する用語説明

Webに関する用語説明です。
・ステートフル
　ステートフルとは、ステートフルプロトコルと言われており、これまでのアクセス先のサーバーとのやりとりが記録されている状態のこと。

・ステートレス
　ステートレスとは、ステートレス・プロトコルと言われており、アクセス先のサーバーとのやりとりが記録されておらず、メールアドレスなどこれまで入力した情報であっても、再度入力する必要がある状態のこと。

・リクエスト
　ユーザー側からWebを通じて処理してほしい情報を送ることをリクエストという。

・レスポンス
　Webを通じて送られてきたリクエストに対して返す結果をレスポンスという。

・クッキー
　クッキーとはWebブラウザに対し、特定の情報を保持させるもの。Webサーバーがリクエストに対し、レスポンスに含めて送り、どのような情報を持たせるかについては、Webサーバーが決めている。

・プロトコル
　コンピューターで通信するために定められた手順などを定めた規格のこと。共通のプロトコルに従うことにより、異なるソフトウェアやハードウェアであっても正しい通信が可能となる。

・ポート番号
　コンピューターが通信するための住所のようなもので、通信機器それぞれにIPアドレスというものが割り当てられており、その中でもどのプログラムに通信させてかを決定させるための最終的な行き先、住所でいうと番地お言われることが多いもの。
【Android】BitriseのgradleビルドでmapProductionReleaseSourceSetPathsでエラーになってしまう場合の対処法

# はじめに
徐々にAndroid側の対応に戻りつつありますが、今回はbitriseでビルドを走らせたらmapProductionReleaseSourceSetPathsでgradleビルドタスクがこけてしまう問題の対処法を備忘録的にまとめたいと思います。

# mapProductionReleaseSourceSetPathsの対処法
まずエラーの詳細は以下になります。

```
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:mapProductionReleaseSourceSetPaths'.
	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:38)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
	at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:69)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:322)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:309)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:302)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:288)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:462)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:379)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:49)
```

手元の開発環境ではビルドが通るのですが、bitriseだけこける感じですね。
どうやら原因はgoogle-servicesのバージョンを4.3.10で使用しているとこけるようなので、以下を指定してあげることで解決します。

```build.gradle
classpath 'com.google.gms:google-services:4.3.14'
```

対応としては以上になります。

# さいごに
リリースビルドをbitriseで行っている際にエラーでこけるとドキっとしますよね。
もし同じエラーで悩んでいる方がいたら試してみていただけたらと思います。
Laravel でクローンして実行する

Laravelプロジェクトをcloneして実行するには、以下の手順を実行する必要があります。

1. Gitをインストールする（既にインストールされている場合はスキップできます）。
2. Gitを使用して、Laravelプロジェクトのリポジトリをクローンします。
   ```
   git clone <リポジトリURL>
   ```
3. プロジェクトのルートディレクトリに移動します。
   ```
   cd <プロジェクト名>
   ```
4. Composerをインストールする（既にインストールされている場合はスキップできます）。
5. Composerを使用して、プロジェクトの依存関係をインストールします。
   ```
   composer install
   ```
6. `.env.example`ファイルを`.env`にリネームします。
   ```
   cp .env.example .env
   ```
7. アプリケーションキーを生成します。
   ```
   php artisan key:generate
   ```
8. データベースを設定します。
   ```
   php artisan migrate
   ```
9. プロジェクトを起動します。
   ```
   php artisan serve
   ```
これで、Laravelプロジェクトが正常にクローンされ、実行されるはずです。必要に応じて、環境に合わせてコマンドを調整してください。
Davinci(GPT-3)からGPT-4へ！ChatGPTの進化がもたらす新たな可能

AI技術が日々進化し続ける中、私たちは常に新しい可能性を探求しています。2021年に執筆した「<a href="https://azure-recipe.kc-cloud.jp/%e3%82%b8%e3%83%a7%e3%83%bc%e3%82%af%e3%82%82%e8%a8%80%e3%81%88%e3%82%8bai%e3%80%82%e6%80%a7%e6%a0%bc%e3%82%92%e9%81%b8%e3%81%b9%e3%82%8bopenai%e3%81%ae%e3%80%8cchat%e3%80%8d%e3%81%a7%e8%89%b2/">ジョークも言えるAI。性格を選べるOpenAIの「Chat」で色々な会話を試してみた -日本一詳しいOpenAI入門</a>」の続編として、今回は2021年時点のDavinciから大きく進化したChatGPT（GPT-4）に焦点を当ててみたいと思います。この記事では、GPT-4がどのように性能向上や新機能の追加を果たし、また日本語対応が改善されているのかを、当時のモデルと比較しながら具体的に解説していきます。さあ、GPT-4の進化の軌跡を一緒に辿ってみましょう！
<h2>以前の記事について</h2>
以前の記事では、OpenAIのDavinciを使用してAIアシスタントと会話する方法を紹介しました。記事では、性格を決定することができるAIアシスタントとの会話の試行錯誤を行い、どのように性格によって回答が変わるかや日本語でも問題なく会話ができることを実証しました。さらに、公式のExpamplesにあるChatをPythonから実行し、同じ入力でも毎回答えが変わることや、AIの性格を変えることで回答が大きく変わることを確認しました。

この記事では、2021年時点のDavinciと2023年3月にリリースされたGPT-4で同じ質問やシチュエーションに対する回答を比較し、その違いや進化を具体的に示すことを目指します。ChatGPT（GPT-4）の進化により、会話の質や対応範囲がどのように変わったのか、そして日本語対応がどのように向上したのかを検証していきます。
<h2>2021年のモデルとGPT-4を同じ会話で比較してみた</h2>
以前の記事では英語でやり取りしていますが、わかりやすくするために日本語で表示しています。
<blockquote>以下はAIアシスタントとの会話です。このアシスタントは親切で、クリエイティブで、賢くて、とてもフレンドリーです。

Human: こんにちは、あなたは誰ですか？
AI: 私はOpenAIで作られたAIアシスタントです。今日はどのようなお手伝いができるでしょうか？
Human: サブスクリプションを解約したいです。
AI:</blockquote>
このようなプロンプトを実行すると以前は以下のような簡単な文章のみ返ってきました。基本的には会話の一部の特徴に対してのみ回答をしているように見えます。
<ul>
 	<li>I’m very sorry to have to tell you this, but are you are certain you are trying to cancel your subscription?（大変申し訳ございませんが、お客様は本当に解約しようとしているのでしょうか？）</li>
 	<li>OK, I’ve cancelled your account. Please let me know if you need any further assistance.（OK、あなたのアカウントをキャンセルしました。また何かありましたらご連絡ください。）</li>
 	<li>I’m sorry, but I can only assist you with technical support.（申し訳ありませんが、私がお手伝いできるのはテクニカルサポートのみです。）</li>
</ul>
ところが、ChatGPTになることで短文だけでなく文章全体や背景を理解し、様々なケースを想定したような広い網羅的な回答をしています。
<ul>
 	<li>AI: どういった契約の解約をお手伝いしましょうか？解約には通常、アカウントやサービスの詳細が必要です。また、解約に伴う影響や注意点もご説明させていただきます。どのようなサブスクリプションを解約したいのかお教えいただけると、さらに具体的なサポートが可能です。</li>
</ul>
<h2>2021年のモデルと同様にGPT-4に性格を変えてみた</h2>
前回の記事では、プログラム内の「The assistant is helpful, creative, clever, and very friendly.」の部分を「The assistant is very humorous and make jokes.」に変更し、AIアシスタントの性格をユーモアがありジョークを言うようにしてみました。性格を変えることで、回答が大きく変わることが確認できました。
<blockquote>AIアシスタントはとてもユーモラスで、ジョークが得意です。</blockquote>
このようなプロンプトを実行すると以前は以下のような簡単な文章が返ってきました。前章と同じく短い文章でしか返ってこないことと、ジョークにのみ対応していて、アシスタントとしての回答がありません。
<ul>
 	<li>I’m sorry for the mistake, but maybe it’s a good idea to see your doctor.（間違えてしまったのは残念ですが、お医者さんに診てもらうのがいいかもしれませんね。）</li>
 	<li>What do you mean?（何が言いたいの？）</li>
 	<li>(Laughter) Why would you want to do that?（(笑）なぜ、そんなことをしたいのか？）</li>
</ul>
同じ内容をChatGPTに実行させると以下のようにジョークも言いつつ、アシスタントとしてもきちんと回答しています。
<ul>
 	<li>AI: サブスクリプションの解約ですか？それはちょっと悲しいニュースですが、解約手続きを始める前に、なぜ鳥が南に飛ぶのかご存知ですか？寒すぎて歩くには遠すぎるんですよ！（笑）ところで、どのサブスクリプションを解約したいのか教えていただけますか？手続きを進めていきましょう。</li>
</ul>
<h2>まとめ</h2>
今回は、2021年時点のDavinciから2023年3月リリースのChatGPT（GPT-4）への進化を詳しく紹介し、性能向上や新機能の追加、日本語対応の改善を具体的に見てきました。AIアシスタントの性格を変更することで、回答がどのように変わるのかも実際に確認できましたね。これらの進化により、GPT-4はますます実用性が高まり、多様な用途で活躍できることでしょう。今後もAI技術の発展に注目しながら、その可能性を引き続き追求していきましょう！
npm

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)


# パスの設定

+ [Unable to do npm install in visual studio for dreamhouse project.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JftPL)

**windows**

Just add:

```
;C:\Program Files\nodejs\
```

To the end of your Path variable on the "User variable" section of the Environment Variables on the System Properties.

After that, reopen your command prompt and type

```
npm
```

This should work.


https://stackoverflow.com/questions/20992723/npm-is-not-recognized-as-internal-or-external-command-operable-program-or-bat

**Mac**

If you installed Node.js using Homebrew, npm binaries can be found in /usr/local/share/npm/bin.

You should make sure this directory is in your PATH environment variable. So, in your ~/.zshrc file add

```
export PATH=/usr/local/share/npm/bin:$PATH
```

+ [In the Get Ready to Develop module, I'm trying to execute the nmp code at the terminal, but keep getting this error.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PeSzJ)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6132eae6-e225-637b-7330-518610d18836.png)

:::note
I think the npm path is not created.

Fixing npm path in Windows 8 and 10
https://github.com/HashLips/hashlips_art_engine/issues/1283
:::

# エラー

+ [DeprecationWarning: The punycode module is deprecated. Please use a userland alternative instead.](https://qiita.com/Keiji_otsubo/items/18f775f3e935a4471748)
Visualforceでカスタム設定の値を取得する

組織レベルの値を追加したいとき、カスタム設定を使って登録することがあります。
Visualforceでそのカスタム設定の値を取得する方法を説明します。

⓵新規カスタム設定を定義します。（すでに組織に存在している場合はそれを使います）
![kasutamu1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330192/94b620e0-a8b8-4ab5-93f0-a55b3d658d07.png)
例：
表示ラベル：会社システム
オブジェクト名：Corporate_System
⓶保存したら、「新規」ボタンをクリックして、カスタム項目を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330192/6f0a982e-33cf-9c4e-9b52-28659e9eca70.png)
⓷登録したい項目の必要な情報を入力します。
例：
データ型：テキスト　　「次へ」
項目の表示ラベル：法人番号
文字数：13
項目名：Corporate_Number　　「次へ」「保存」

以上の登録でオブジェクトと項目のAPI参照名が入力した項目名に基づいて自動的に生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330192/a86679e4-cd66-bc86-db18-81e73dcabd0e.png)
⓸「Manage」→（上のほうの）「新規」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330192/29c94c50-a218-f204-f2d6-fac4b7a2ed29.png)
⓹ ステップ⓷で登録した項目が表示されます、その値を入力し、保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330192/cbf6fb1a-df85-caec-cb58-7f7f1b8c5a3b.png)
⓺カスタム設定の登録が完了し、Visualforceでつかう時下記のコードを入力します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330192/a808cef5-724f-3fa0-836c-2a2b78bb8c96.png)
value="{!$Setup.オブジェクトAPI名.項目API}"

プレビュー画面：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330192/116ac7ce-3649-9f55-2934-a63eef115af7.png)
※法人番号というラベルは表示カスタムラベルなどからの取得も可能です。
VBA基本操作まとめ

仕事でVBAの話が出たので久々に勉強したいと思い勉強がてら作成しています。
問題点があれば修正をお願いします。

まず関数は次のように書きます。
```vba
SUB function()
//書きたい処理内容
end sub
```
次に変数の宣言方法
Dim 変数名　as 変数型で宣言します。
例えば、Int型のuserIdを指定する場合は
```vba
Dim userId as Integer
```
となります。
変数型の種類に関しては下記URLを参照してみてください。
https://excel-ubara.com/excelvba1/EXCELVBA312.html

それでは大本命VBAの各種セル操作方法に写っていきましょう！
セルの操作方法に関しては下記URLを参考に作成しました。
詳しくは下記URLを参考にしてみて下さい！
http://officetanaka.net/excel/vba/cell/
またIF文、For文の作り方ですが、

IF文の作り方です。
```vba
If /*分岐内容*/ Then
　　　　　//行たい処理
　End If
```
というようにIf Then EndIFで囲むように作成します。

次にfor文です。
```vba
Dim i As Long
　　For i = 3 To 14
    　　//行たい処理
　　Next
```
for文はFor i =スタート値　To 終値 Nextと書きます。

本ページではセルへの入出力について扱っていきます。
VBAでのセルの扱い方は２つあります、セルプロパティーとレンジプロパティーです。
エクセル番号A１を指定してみます。
まずはrangeプロパティーから
```vba
Range("A1")
```
次にcellプロパティーです。
```vba
Cells(1,1)
```
ここに値を入れる時は
```vba
Range("A1").value="山田"
```
次にcellsの場合です。
```vba
cells(1,1)="山田"
```

次にデータ取得です。
先ほどのデータを取得する方法について説明します。
```vba
Sub Sample3()
    Dim num As String
    num = Range("A1")
    MsgBox num
End Sub
```
このように変数を作成し、セルを指定、その後変数に格納しMsgBoxで
メッセージとして表示をしています。

余談として別シートのA１にデータを入力する場合は
```vba
Worksheets("別のシート").Range(A1)="山田"
```
とします。
次世代プロジェクト管理ツールの構想を練る（４）

https://qiita.com/EasyCording/items/1a5e977bd4d3a3ec5399

すこし前節から、構想のみが先行し、たとえCHATGPTを駆使したとしても、プロンプトの文字数的にも膨大なコーディングは不可、かつ身の丈に応じて、やはり取り組むべきと自己反省している。

# MindMap
先週から少し方向性を変えて、先ずは早めのリリースをしたいという事になり、Redmineのプロジェクトをマインドマップで書かせることにした（もちろん、時間軸の情報をMindmapに反映して、ガントチャートぽいGUIに出来ればよいが、先ずはプロジェクトやタスクの親子関係を可視化するという部分で、真っ先に必要な機能に思える）

# ライブラリ
　今週、調べた中で興味がわいたものはReactflow
　他にもあるようだが、REACTという部分にときめいたのは事実・・・

https://reactflow.dev/blog/mind-map-app-with-react-flow/

　ちなみにCHATGPTに聞いた結果（あー、何も調べずやった感があるわあ・・・）
|ライブラリ|特徴|利点|欠点|
|---|---|---|---|
|Reactflow|ノードベースのUIを作成できる|カスタマイズ性が高い|データ可視化に特化していない|
|ApexCharts|グラフやチャートを作成できる|シンプルで美しいデザイン|ノードやエッジの操作ができない|
|Chart.js|グラフやチャートを作成できる|軽量で高速|機能が限られている|
|D3.js|SVGやCanvasを使ってデータを可視化できる|柔軟性が高くてコードが簡潔|学習曲線が急|

# Reactflow
公式サイト

https://reactflow.dev/docs/quickstart/

マインドマップとして使うチュートリアル

https://reactflow.dev/docs/concepts/plugin-components/#minimap

# 学習コスト

少し完成形の物を触り、ソースコードを拝見させていただく。
イベント検出など、REACTフックを使ってゴニョゴニョとやっているようだ。

ただ、やはり学習コストは必要。
日本語のソースも少ないらしいが、この一年で英語の勉強はばっちりできたので、少しは楽か・・・
開発 x 健康 x 自動化

# 開発 x 健康 x 自動化

開発経験5年で考えた健康について

## はじめに

- 開発と健康は同じ
- 改善で幸せになる
- 自動化で楽したい

## 本論

- 製造のやりすぎは欠陥を増やす/改善をとりいれて負債を減らす
- 仕事のやりすぎは病気を増やす/改善をとりいれて不調を減らす

|イメージ|開発|健康|
|-|-|-|
| 消費 | 製造 | 仕事 |
| 利息 | 欠陥 | 病気 |
| 投資 | 改善 | 改善 |
| 借金 | 負債 | 不調 |

### 改善とは

|イメージ|開発|健康|
|-|-|-|
| 攻め | デプロイ自動化 | 運動 |
| 守り | テスト自動化 | 食事 |
| 攻/守 | リファクタリング | 睡眠 |
| 守/攻 | セキュリティ対策等 | 瞑想 |

- 攻めの改善で代謝を上げる/保つ
- 守りの改善で免疫を上げる/保つ

## おわりに

開発も健康も自動化したい
【令和】和暦への変換が客先だけでうまくいかない

# この記事について
主に令和になってからプログラミングの勉強を始めた方を対象に書いています。
ということで、令和入社の新人さんが嵌ってたことを、
ケーススタディとして若干簡略化して書きます。

……はい。令和を強調するのには意味がありまして。
……昭和民族のあおりではないので、どうぞ石を投げないでやってください。

あ、学習目的などで西暦を和暦に変換する処理を自前で作成したい方。
ここには今役立つ方法はありません。
各言語のリファレンスなど読んでがんばりましょう！

# 事象
## 「令和」が表示されない
客先の端末でシステムを起動したところ、西暦から和暦への変換が正しく行われない。
例：2023/04/20 = 平成35年4月20日

なお、以下のような値は問題なし
2019/04/30 = 平成31年4月30日
1950/12/31 = 昭和25年12月31日

### 環境
Windows10
office 2016 (Access,Excelを使用)

### 開発環境での再現検証結果
再現しない
（「再現しない」とは
　「報告された事象と同じことが起こらなかった」という意味です）

# 原因
該当端末に、新元号対応のWindowsUpdateが適用されていなかった。

### 情報ソース
Microsoft製品の令和対応についてはこちらの記事を参照

https://support.microsoft.com/ja-jp/topic/windows-%E7%94%A8%E3%81%AE%E6%97%A5%E6%9C%AC%E3%81%AE%E6%96%B0%E5%85%83%E5%8F%B7%E5%AF%BE%E5%BF%9C%E6%9B%B4%E6%96%B0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6-kb4469068-1e760b2f-619a-ab02-723a-5b7e97a916bf

### 補足
検証端末はセットアップしたばかりでほぼ工場出荷時の状態だった。
業務端末同様、最新のWindowsUpdateを適用してから再検証したところ、改善を確認した。

# まとめ
ということで、今回の記事は
改元前後の令和対応を経験していない方に向けて書きました。

もう少し汎用的なことも書きます。
業務において、西暦を和暦に変換する処理などの
便利でみんなが使う処理を、普通のプログラマーが自前で書くことはあまりありません。
Windowsやofficeに限らず
「令和が出てこない！」のようなケースは環境の問題である場合が多いです。
（必要なライブラリや共通クラスが最新化されていなかったりとか。）

このケースを通して、
「不具合調査の際は、コーディング以外の部分も原因可能性に含めて考える」
ということを知って頂けたらと思います。

# 参考文献
元号対応に関するまとめ 
https://qiita.com/tfukumori/items/1dc60eb473eff5efb994 
元号対応そのものについて興味が湧いたあなた。ようこそ。
上記の例以外での元号対応方法をお楽しみください。


以上です。
JShell (Java Shell Tool) でREST APIにPOSTアクセスしてみる

## 概要

本記事では、JShell(Java Shell Tool)で、REST APIにPOSTアクセスしてみる例を紹介します。

### 対象読者

- curlでもPowerShellでもREST APIアクセスは簡単だけれども、もしJShellでやったらどうなるのか興味がある方

### 想定する環境

- 少なくともJava11以上(Java11で追加されたHttpClientを使っています)

### 記事執筆時の実行環境

以下の通りです。

- Windows 11 Pro 22H2
- jshell 17.0.6 (java 17.0.6 2023-01-17 LTS)

## JShellのプログラムでアクセスしてみる

### 例としてアクセスするAPI

Qiitaの「投稿」リソースで、[新規に記事を作成するAPI (https://qiita.com/api/v2/docs#post-apiv2items](https://qiita.com/api/v2/docs#post-apiv2items) )を例にJShellのコードを説明します。

このAPIは、POSTアクセスで、所定の内容をリクエストボディに含めて送信することにより、Qiitaの新規記事投稿が実行できるものです。

例では、上記APIドキュメントを参考に、Qiitaの記事を「限定共有記事」として投稿するリクエストを作りました。

### JShellのコード

以下のようなコードを書きました。

```java
import java.io.*;
import java.net.*;
import java.net.http.*;
import java.nio.file.*;
import java.util.*;

// if proxy is needed, uncomment these lines.
// System.getProperty("http.proxyHost", "http://your.lovely.proxy.com");
// System.getProperty("http.proxyPort", "8080");

var url = "https://qiita.com/api/v2/items"; // アクセスするAPI
var path = "body.json"; // payload for POST request
var body = Files.readString(Paths.get(path));
var token = "Qiita APIのアクセストークン（別途発行）";

// System.out.println(body);

var client = HttpClient.newHttpClient();
var request = HttpRequest.newBuilder(URI.create(url)).header("Content-Type", "application/json").header("Authorization", "Bearer " + token).POST(HttpRequest.BodyPublishers.ofString(body)).build();

var response = client.send(request, HttpResponse.BodyHandlers.ofString());

System.out.println(response.body());

/ex
```

基本的には、Javaのコードを順番に並べてあるだけです。
最後の「/ex」は、JShellで外部ファイルを読み込んで実行するとき、最後にJShellを抜けるための命令文です。
var request～の行がとても長くなっていますが、途中で改行を入れるとうまくいかないのでこのような形にしています。


リクエストのボディは以下のようなファイルです。

```json
{
  "body": "# Example",
  "coediting": false,
  "private": true,
  "tags": [
    {
      "name": "Ruby",
      "versions": [
        "0.0.1"
      ]
    }
  ],
  "title": "Example title",
  "tweet": false
}
```


## 実行してみる

### アクセストークンの発行

Qiitaのアカウント画面で、「設定」を選択し、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/6a3645d6-4eb6-840f-0716-654ff7fd1f13.png)

今回は記事投稿なので、「read_qiita」「write_qiita」のスコープにチェックを入れ、「発行する」をクリックします。次の画面で（1度だけ）表示されるアクセストークンをメモし、上記プログラム内の「var token」の値として貼り付けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/343c0b70-3381-d62d-594d-3b184f7b0a28.png)

### 実行

何らかのターミナルにて、保存したコード（例："access-webapi.jshell"）と、上記のリクエスト用のボディ(例："body.json")を同じディレクトリに置き、これらのファイルを格納しているディレクトリにて、以下のように実行します。

```bash
jshell access-webapi.jshell
```

コンソールに、レスポンスのボディが表示されます。


```json
{"rendered_body":"\u003ch1 data-sourcepos=\"1:1-1:9\"\u003e\n\u003cspan (以降略)}
```

Qiitaの自分の記事の「限定共有記事」に、新しい記事が１つできています。

## おわりに

本記事では、JShellで、REST APIにPOSTアクセスする例を紹介しました。
このようなものが役に立つケースはかなりレアだと思いますが、こういうこともできますね、という例としてやってみた内容です。
ジェネレーティブAIを使った社会的インパクト

ジェネレーティブAIは、創造性と柔軟性に優れた人工知能の一種であり、音楽、画像、文章、映像、ゲームなど様々な分野での創造的な活用が期待されています。以下では、ジェネレーティブAIが社会にもたらす可能性があるいくつかの分野について解説します。

# A. 教育分野での利用

ジェネレーティブAIを活用した教育プラットフォームの開発が進んでおり、オンライン学習やeラーニングの分野での活用が期待されています。例えば、ジェネレーティブAIを使って文章を自動生成し、学生のレポート作成を助けたり、個別に合わせた教材を提供することができます。また、画像生成や音楽生成の技術を活用して、クリエイティブな教材の制作も可能です。

## 学習支援
ジェネレーティブAIを活用することで、学生により効果的な学習支援を提供することができます。例えば、ジェネレーティブAIを用いて学習資料を自動生成することが可能です。学生が課題に取り組んでいるときに、自動的に適切な問題や解説が提供されることで、学習の効率性が向上すると期待されます。

また、ジェネレーティブAIを活用して、学生の学習過程や能力を分析することができます。学習の進捗状況や問題の解決方法、学生の傾向や優位性などを分析し、個別の学習支援を提供することができます。

## 教材作成
ジェネレーティブAIを活用して、クリエイティブな教材を自動生成することが可能です。例えば、画像生成や音楽生成の技術を活用して、自動的に課題に合わせた画像や音楽を生成することができます。また、文章の生成においても、課題に合わせた解説や要約を自動生成することができます。こうした自動生成された教材は、教師が手作業で作成するよりも、より効率的かつ正確に作成することができます。

## プログラミング教育
ジェネレーティブAIは、プログラミング教育においても活用されています。例えば、ジェネレーティブAIを活用して、プログラミング言語の自動生成を行うことができます。これにより、初心者でも簡単的にプログラミングを学ぶことができます。また、ジェネレーティブAIを用いて、プログラミングのデバッグ支援や、問題の解決方法の自動生成などが行われています。

## アクセシビリティの向上
ジェネレーティブAIは、教育におけるアクセシビリティの向上にも貢献することができます。例えば、音声生成技術を活用して、視覚障害者や聴覚障害者向けの教材を自動生成することができます。また、自動翻訳技術を活用して、多言語対応の教材を自動生成することも可能です。

## ゲームベースの学習支援
ジェネレーティブAIは、ゲームベースの学習支援にも活用されています。例えば、ジェネレーティブAIを活用して、自動的に問題を生成することができます。これにより、より興味深い課題が提供され、学習効果が向上すると期待されます。

以上のように、ジェネレーティブAIを教育分野で活用することで、より創造性豊かな教育プログラムの開発や、学習支援が可能になります。しかし、教育分野においては、倫理的な問題や、AIが学習者の個人情報を収集することによるプライバシーの問題なども存在します。これらの問題を解決するためには、適切な規制やガイドラインの策定が必要となります。

# B. 医療分野での利用

ジェネレーティブAIは、医療の分野でも利用が期待されています。例えば、画像診断においては、医師の診断能力を補助するAIを活用することで、より正確かつ迅速な診断が可能となります。また、薬剤の創製においても、ジェネレーティブAIを活用して、新しい化合物を発見することができます。

## 医療画像解析
ジェネレーティブAIは、医療画像解析に活用されています。例えば、MRIやCTなどの画像を解析して、がんなどの病気の早期発見や診断を支援することができます。また、医療画像の自動分類やセグメンテーション、3D画像生成などの技術も開発されています。

## 診断支援
ジェネレーティブAIは、診断支援にも活用されています。例えば、症状や検査結果を入力することで、疾患の診断を行うシステムが開発されています。また、遺伝子解析などから、遺伝子変異が原因となる疾患のリスクを予測するシステムも開発されています。

## 薬剤開発
ジェネレーティブAIは、新しい薬剤の開発にも活用されています。例えば、薬剤の分子構造を予測する技術や、既存の薬剤の組み合わせを最適化する技術などが開発されています。これにより、効果的な治療法の開発が期待されています。

## 医療システムの改善
ジェネレーティブAIは、医療システムの改善にも活用されています。例えば、医療データの分析により、医療の質の向上や、医療コストの削減が可能になります。また、医療従事者の業務負担を軽減するためのシステムの開発も進んでいます。

以上のように、ジェネレーティブAIは、医療分野において多岐にわたる利用が期待されています。ただし、医療分野においては、プライバシーの問題や倫理的な問題が大きな課題となります。これらの問題を解決するためには、適切な規制やガイドラインの策定が必要となります。

# C. 製造業への応用

ジェネレーティブAIは、設計分野においても有効な技術です。例えば、自動車や航空機の設計においては、最適な形状や素材を検討するためにジェネレーティブAIを活用することができます。また、建築分野でも、建物の構造やエネルギー効率を最適化するために、ジェネレーティブAIを利用することが可能です。

## 製品設計
ジェネレーティブAIは、製品設計に活用されています。例えば、自動車や航空機などの設計において、軽量化や強度の向上を実現するために、材料や形状を最適化する技術が開発されています。また、製品の形状や構造を自動生成するシステムもあります。

## プロセス改善
ジェネレーティブAIは、製造プロセスの改善にも活用されています。例えば、生産ラインの最適化や、機械の故障予測、生産計画の最適化などが挙げられます。これにより、生産効率の向上やコスト削減が期待されています。

## 品質管理
ジェネレーティブAIは、品質管理にも活用されています。例えば、製品の欠陥検出や、製造工程の品質管理が挙げられます。また、不良品の原因を分析するシステムもあります。

## 予測保全
ジェネレーティブAIは、予測保全にも活用されています。例えば、機械の故障予測や、製品の寿命予測が挙げられます。これにより、メンテナンスのタイミングを正確に把握することができ、生産の停止を防ぐことができます。

以上のように、ジェネレーティブAIは、製造業において多岐にわたる利用が期待されています。ただし、製造業においては、現場の実情を把握し、適切なデータ収集が必要となります。また、ジェネレーティブAIの活用に伴い、従来の製造プロセスや品質管理方法を見直す必要があるかもしれません。

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
【Eclipse】【ant】コマンドプロンプトからの実行メモ

# 概要
Eclipseに含まれているantをコマンドプロンプトから実行するためのメモ。
※antのインストールは無し

# Eclipse内のantのパス
```
｛Eclipseまでのパス｝\plugins\org.apache.ant_1.10.12.v20211102-1452\bin
```

# コマンドプロンプトからant実行
```
｛Eclipseまでのパス｝\plugins\org.apache.ant_1.10.12.v20211102-1452\bin\ant
```
※binまでのパスを環境変数に追加しても可

# antのバージョン確認コマンド
```
ant -version
```
マイクロコントローラ開発: ARM, AVR, PIC, MSP430と開発環境の比較

マイクロコントローラの選択は、組み込みシステム開発において重要な要素です。本記事では、ARM（Cortex-Mシリーズ）、AVR、PIC、およびMSP430という4つの一般的なマイクロコントローラアーキテクチャについて、開発環境、ライブラリ、Web上の情報の多さなどの観点から比較します。また、Visual Studio Code (VS Code)やIAR Embedded Workbenchを用いた開発についても言及します。

## 開発環境の比較

| アーキテクチャ | 代表的な開発環境 |
| --- | --- |
| ARM (Cortex-M) | Keil MDK-ARM, IAR Embedded Workbench, System Workbench for STM32, ARM Mbed |
| AVR | Arduino IDE, Atmel Studio, IAR Embedded Workbench |
| PIC | MPLAB X IDE, IAR Embedded Workbench |
| MSP430 | Code Composer Studio, IAR Embedded Workbench |

## Visual Studio Codeでの開発

VS Codeは、拡張機能を利用することで、ARM、AVR、PIC、およびMSP430のマイクロコントローラ向けの開発が可能です。ただし、特定のハードウェア機能やデバッグに関しては、各マイクロコントローラの専用開発環境を使用することで、より簡単かつ効率的に開発が行える場合があります。

### ビット単位でのレジスタ操作

VSCodeのデバッグ拡張機能を使用すると、レジスタの値を表示し、変更することができます。しかし、これらのデバッグ拡張機能は、1ビット単位での操作に特化したビューや機能を提供していないことが一般的です。これは、特定の専用開発環境と比較して、ビット単位での操作が直感的でないことを意味します。

## IAR Embedded Workbenchでの開発

IAR Embedded Workbenchは、ARM、AVR、PIC、およびMSP430のマイクロコントローラに対応した異なるバージョンがあります。これらは、各アーキテクチャに最適化されたコンパイラ、デバッガ、ライブラリなどが含まれています。IAR Embedded Workbenchは、一貫した操作感やユーザーインターフェイスが提供されており、異なるアーキテクチャ間での開発も容易になります。

## まとめ

ARM、AVR、PIC、およびMSP430の各マイクロコントローラアーキテクチャは、それぞれ独自の開発環境やツールを持っています。Visual Studio Codeを使用することで、これらのマイクロコントローラの開発を一つのIDEで行うことができますが、特定の機能やデバッグについては専用開発環境が優れている場合があります。IAR Embedded Workbenchは、各アーキテクチャ向けに最適化されたコンパイラ、デバッガ、ライブラリを提供し、統一された操作感で開発を行うことができます。

最終的に、プロジェクトの要件や開発者の好みによって、適切なマイクロコントローラアーキテクチャと開発環境が決まります。適切な選択を行うことで、効率的で効果的な組み込みシステム開発が可能となります。
Styled-Componentsとpropsを使ったスタイリングの備忘録 


自分用備忘録。
Styled-Componentsを使って、propsを渡して動的にスタイリングを適用する方法をまとめてみる。今回はChakraUIのButtonをベースにした例で説明していく。

# Chakra UIのButtonにpropsを渡して動的にスタイルを適用する方法
```JSX
<ButtonStyle hogeProps={true} />
```
```javascript
const ButtonStyle = styled(Button)<{hogeProps:boolean}>`
  color: ${props => props.hogeProps ? 'trueの時の処理' : 'falseの時の処理'};
`;
```
この例ではhogePropsという名前のpropsをButtonStyleコンポーネントに渡している。
Styled-Component内で、三項演算子を使ってhogePropsがtrueの場合とfalseの場合で異なるスタイルを適用している。

ついでに位置を動的に設定するModalContentStyleコンポーネントを作成する方法もば。

# 位置を動的に設定するModalContentStyleコンポーネントの作成
```JSX
<ModalContentStyle x={positionX} y={positionY} />
```
```javascript
const ModalContentStyle = styled(ModalContent)<{ x?: number; y?: number }>`
  border: 1px solid #fefefe;
  ${({ x, y }) =>　// x , y があるときのみ下記のCSSを適用
    x !== undefined && y !== undefined
      ? `
        left: ${x}px;
        top: ${y}px;
        transform: translate(-100%, 0);
        `
      : ""}
`;
```
この例では、xとyという名前のpropsをModalContentStyleコンポーネントに渡している。xとyがどちらも定義されている場合のみ、位置を動的に設定するCSSが適用されるようにしている。
「オブジェクト指向」

### オブジェクト指向
今日からオブジェクト指向の勉強を始めました。正直、基礎的な所をマスターしたわけじゃないので、少し早い気もしますが、個人的に触れる時間が長いほど定着するものなのかなと思います。
オブジェクト指向は、基礎と違い「考え方」の単元なので、イメージを掴むまで苦戦しそうですが根気強くやります。
これからは、基礎部分の復習、オブジェクト指向のインプット、そして、何か制作物も作りたいなと思っています。案として、前にrubyをしていた時に頓挫した「家計簿」を作ろうかと思っています。 Javaでアプリは作ったことがないので楽しみです。
Javaのコンストラクタってなんだろね

# コンストラクタについて本気出して考えてみたら～

いつでも同じところに、行きつくのさ♪　とポ〇ノグラフティの名曲が頭をよぎったので、ちょっとしらべてみました。

## はじめに
この記事は個人的な確認のための記事です。なので多分わかりやすくありません。あと厳密じゃないとか、ちょっと違うというお話はまぁ置いといてください。言語仕様読めばわかることなんでｗｗ

## はじまりはこれ

2023/04/18に投稿されたこのツイートです。

![tweet.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837176/87dd23a1-e9db-00dd-9372-ad487786de9c.jpeg)

これで、チャンと答えを乗せてくれればいいのに。。。残念だな。。と思ったのでちょっと調べることにしました。

この時点で私の認識でコンストラクタとは

- オブジェクトのインスタンス化時に一度だけ実行される、メソッドのようなもの（厳密にはメソッドではない）

さて、あっているでしょうか。

## なんでコンストラクタはメソッドじゃないと思ったの？

これは完全に経験なんですが。リフレクションを使ったことがあると、直感的にわかります。

まずね。ConstructorとMethodってJava言語ではきちんとConstructor型とMethod型として定義されているわけです。そして。この２つのクラス。

 - **直接の継承関係はありません** 
 - つまりはis-aの関係がなりたたない＝まったくの別物
 
 だと、直感的に思っておりました。文章だけではわからないのできちんと、[Java API仕様](https://docs.oracle.com/javase/jp/8/docs/api/index.html?java/lang/reflect/Method.html)を確認しましょう。

![API-Doc.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837176/8b8e2304-b13e-3141-6c80-1d65bb865d6b.jpeg)

ここです。わかりますか？**java.lang.reflect.Executable**の直系のサブクラスとしてConstructorとMethodが分岐しているのです。こういう情報ってありがたいですね。。やっぱりこいつら**別の機能** なんですね。

ここまではよく使うJava API仕様からの類推でしたが、では実際に何が違うのでしょうか。。

## Java  言語仕様を簡単に確認してみる

こういうときは、一次情報を当たるに限ります。Qiitaに書いてあったからとかそういうのをチャラっと信じちゃだめですからね！！わかりますね？？というわけで[Java言語仕様](https://docs.oracle.com/javase/specs/jls/se20/html/jls-8.html#d5e15961)を確認します

「8.8. Constructor Declarations」にきちんと定義してくれていますね。 

![Spec01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837176/830a7ce8-fe34-472c-f46b-8553952488aa.jpeg)

> **A constructor is used in the creation of an object that is an instance of a class.**

「コンストラクタはクラスインスタンスを作る際に利用されます。」うむ想定通り。この話題で次に注目すべきは以下の記述かと思います。

![Spec02.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837176/2dc1e7e1-9f3f-bbe7-1723-4a037975e275.jpeg)


> **Constructor declarations are not members. They are never inherited and therefore are not subject to hiding or overriding.**

いわく。**コンストラクタはメンバじゃない。そしてインスタンスに含まれることもない。だからオーバーライドなんてできないよ。** なるほど。つまり

- インスタンス化されたオブジェクトに**コンストラクタ**はない。
- コンストラクタはインスタンス化時に1度だけ呼ばれる使い捨て処理

- だから　Aclass.Aclass(); のような呼び方はできない。（多分）

なるほど。納得しました。

さて、時間もおそくなったのでまとめます。

## 本日のまとめ

- Constructor は　Methodではない
- Constructorはクラスのメンバではない
- Constructorはクラス初期化処理を担う役割しかない。

あ、まぁそうよねという。。
バイナリーオペレーターとは

## バイナリーオペレーターとは

二項演算子ともいう

・演算子の分類の一つ

→式を書いたときに、被演算子（変数や価など）が2つあるもの


EX)
1+2の場合

被演算子：1, 2
だから＋は二項演算子であるといえる
RstudioのGlobal optionsでDefault working directoryを設定しようとしたらPermission Deniedになってしまったときの解決方法


## 起こったこと
RstudioのGlobal OptionsでDefault working directoryを設定しようとフォルダを選択したら、Permission Deniedと表示されDefault working directoryを設定できなかった。

#### 環境
M2　MacBook Air
ventura 13.2.1

## 解決した方法
1.  Rstudioフォルダを.configフォルダ(隠しフォルダ)の中に入れる<br>
1.  Rstudioを再起動し再度グローバルオプションを試す

自分が移動したRstudioフォルダがあった場所
ユーザ>ライブラリ(隠しフォルダ)>Application support>Rstudio

## 参考
[Need help with Global Options in RStudio](https://community.rstudio.com/t/need-help-with-global-options-in-rstudio/118630)
ChatGPTと電話できるサービス”TellGPT”をβリリースしました


## **TellGPT：革新的な会話体験をお届けするWebサービス(β)**

TellGPTは、人工知能のチャットボット、ChatGPT 3とリアルタイムで会話ができるWebサービス(β)です。さまざまな属性を持つ通話相手を選んで、新しい会話の世界を体験しましょう。

https://tellgpt.malvage.com/

### ログイン

Googleアカウントでログインできます。
初回ログインで、30分の無料通話時間が付与されます。

### 電話をかける

1. 電話アイコンを押すと、通話できる人が一覧で見れますので、通話したい人を選択してください。

![https://i.gyazo.com/020416b6a30322cc84e2b6a944f00ab7.png](https://i.gyazo.com/020416b6a30322cc84e2b6a944f00ab7.png)

2. 選択したら、通話相手の情報が出るので、通話ボタンを押してください。

![https://i.gyazo.com/c3fd425dfce8ebdedc48192acf443322.png](https://i.gyazo.com/c3fd425dfce8ebdedc48192acf443322.png)

3. 通話画面が表示されるので、話しかけるときには緑色の通話開始ボタンを押してください。

![https://i.gyazo.com/14c3bdf940fbd336a629d3a7ea01a449.png](https://i.gyazo.com/14c3bdf940fbd336a629d3a7ea01a449.png)

4. 会話したい内容を話しかけてください。話す内容が終わったら、ストップボタンを押します。
通話相手から返ってくるまで待ちます。（返ってくるまで時間がかかります。調整中です🙇）

![https://i.gyazo.com/eafabe731f20168308d459eb933841ae.png](https://i.gyazo.com/eafabe731f20168308d459eb933841ae.png)

5. 再度話しかけるときは、3と4の手順を繰り返します。
6. 通話を終了するときは、通話終了ボタンを押します。

![https://i.gyazo.com/759368f01818c35fe9bb69cd0cd257c0.png](https://i.gyazo.com/759368f01818c35fe9bb69cd0cd257c0.png)

### 通話履歴から通話内容を確認する

1. 通話履歴を開き、確認したい履歴を開くと確認できます。

![https://i.gyazo.com/4f1bcbec6326d7b2042b36b67609540c.png](https://i.gyazo.com/4f1bcbec6326d7b2042b36b67609540c.png)

![https://i.gyazo.com/7ae93d4345de2310eea19761f0a3f6d9.png](https://i.gyazo.com/7ae93d4345de2310eea19761f0a3f6d9.png)

### 残りの通話可能時間を確認する

マイページから、残りの時間を確認できます。

![https://i.gyazo.com/7ae93d4345de2310eea19761f0a3f6d9.png](https://i.gyazo.com/7ae93d4345de2310eea19761f0a3f6d9.png)

### フィードバックのお願い

TellGPTは、ユーザーの皆様からのフィードバックでより良いサービスに成長します。以下の点についてぜひご意見をお聞かせください。

- 使い心地
- 機能リクエスト
- バグ報告
- 通話相手のリクエスト

[フィードバックはこちらから](https://docs.google.com/forms/d/e/1FAIpQLSfkE77ib7EB7_7jSvlBLI_BFK4isIseR_oZc_LOV5aiNNpgjg/viewform)

### 共同開発者

ぜひフォローして、最新情報をチェックしてください。

- [malvagee](https://zenn.dev/salvage0707)
- [sugayutokyo](https://zenn.dev/elletech)

### TellGPTはさらに進化していきます

TellGPTのさらなる進化に向け、次のような開発が予定されています。

- 通話機能の実行時間改善
- 会話相手の拡充
- スマホ対応

などなど

TellGPTで、未来のコミュニケーションを体験しましょう。今すぐお試しください。