OmniAICreator/Qiita-1.07M huggingface dataset:
【高齢化社会】M5Stickで高齢者の見守り装置を作った。[見守り当番]

電子工作を始めて一ヶ月、磁気ドアセンサで遊んでいたところふと思い浮かんだ。
**「ドアの開閉で生存確認できるのでは...?」**


私には骨折を機に自発的に外出しなくなった90代の叔母さんがいる。耳が遠く電話が来ても気づくことができず、週1回ヘルパーさんの訪問で生存確認をしている状況である。
ヘルパーさんが帰った直後に倒れたら気付くまで時間がかかるのでは、と少しの不安は残っていた。

そこで今回は[Observer](https://github.com/11104/Observer/)と言うものを作成した。

# Observerとは
一定時間ドアの開閉が検知されなかった時、LINEに通知する装置です。
WiFiと電源が届く所であればどこのドアでも対応します。
冷蔵庫やトイレのドアを想定しています。


# 必要なもの
- M5StickCPlus
- [磁気ドアスイッチ](https://ssci.to/7390)
- WiFi環境
- [LINENotify](https://notify-bot.line.me/ja/)のToken x1
 
# 作り方
[GitHubリポジトリ](https://github.com/11104/Observer/)のプログラム9~12行目にWiFi情報とLINENotifyTokenを入れてM5Stickに書き込んでください。
13行目は通知するまでの時間間隔です。デフォルトでは12時間になっています。

26番ピンとGNDピンに磁気ドアスイッチを差し込み、ドアに設置します。
電源を入れると「.」とだけ表示されます。
![IMG_6758.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125452/8e244406-9e60-fe92-29ec-d8132a2d56de.jpeg)


サイドボタンでデバッグモードに切り替えができます。
これはドアの状態をディスプレイに表示するモードです。
![IMG_6759.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125452/8d0ad8ff-3b12-1883-b361-b1db05ecebf1.jpeg)


# 所感
材料費は五千円以内なので下手に見守り機器を購入するより安価だと思います。ただし、WiFi環境が必須なのでそこが難点です。
現状では昼夜問わず指定した時間感覚でしか設定できませんが、夜間は長く、昼間は短く設定できるなど、もっと練度を高めると便利なのではと構想中です。

# 参考文献
- [M5StackとLineNotifyを使って通知を飛ばしてみた](https://qiita.com/kita9810/items/6920a4cd6fae35fca3b2)
LINENotifyの設定や書き込み方法などが参考になります。
Unityで画面をキャプチャしてタイミングをずらして保存

# はじめに

この記事はUnityで画面のキャプチャをして、キャプチャした画像を任意のタイミングで出力する方法について記載しています

# 画面のキャプチャ方法
UnityにはScreenCapture.CaptureScreenshotで画面をキャプチャ＆ファイル保存をすることができます
保存するだけならこれでおそらく大丈夫です
Unity Documentation にサポートなし・非推奨と書かれたバージョンでも使えると思います
(使えないバージョンがあったらすみません)

https://docs.unity3d.com/ja/2019.4/ScriptReference/ScreenCapture.CaptureScreenshot.html

ScreenCapture.CaptureScreenshotではキャプチャした直後にそのまま保存することしかできないので、今回はキャプチャした画像を一旦ストックしておいて、任意のタイミングでファイル出力する方法について記載します

動作確認したバージョン
・2020.3.20f1

# ScreenCapture.CaptureScreenshotを使わずに画面キャプチャ
ScreenCapture.CaptureScreenshotを使わない場合、キャプチャ＋保存する手順としては下記のようになります

1. 取得領域のRectを設定
1. キャプチャするTexture2D領域を作成
1. WaitForEndOfFrameを使ってフレームの最後まで待つ
1. 2で作成したTexture2D領域にキャプチャして保持＋適用する
1. Texture2D領域にキャプチャした画像をファイル出力

1～2が準備、3～5が実際にキャプチャ＋保存する部分になります

# キャプチャする部分の実装

Texture2Dにキャプチャするクラスを下記のように作成してみました

```C#
class CaptureTextureControl : MonoBehaviour
{
	public Texture2D texture { get; private set; }

	private bool complete = false;

	public IEnumerator CaptureFrame( TextureFormat textureFormat )
	{
		Reset();

		Rect rect = new Rect( 0, 0, Screen.width, Screen.height );

		texture = new Texture2D( ( int ) rect.width,
		( int ) rect.height,
		textureFormat,
		false );

		yield return new WaitForEndOfFrame();

		texture.ReadPixels( rect, 0, 0, false );

		texture.Apply();

		complete = true;
	}

	public bool Save( string savePath )
	{
		if( complete == false )
		{
			Debug.Log( "画面キャプチャが完了していないのでファイル出力処理を終了します" );
			return false;
		}

		if( texture == null )
		{
			Debug.Log( "Textureがnullなのでファイル出力処理を終了します" );
			return false;
		}

		byte[] file = texture.EncodeToPNG();
		File.WriteAllBytes( savePath, file );

		return true;
	}

	public void Reset()
	{
		complete = false;

		if( texture != null )
		{
			Object.Destroy( texture );
            texture = null;
		}
	}
}
```

上記の呼び出し箇所はこんな感じ
Capture関数とSave関数を2つのButtonのOnClickにそれぞれ設定して動かしています

```C#
public class CaptureScreen : MonoBehaviour
{
	private CaptureTextureControl captureTextureControl = null;

	void Start()
	{
		captureTextureControl = new CaptureTextureControl();
	}

	public void Capture()
	{
		StartCoroutine( captureTextureControl.CaptureFrame( TextureFormat.ARGB32 ) );
	}

	public void Save( string savePath )
	{
		captureTextureControl.Save( savePath );
		captureTextureControl.Reset();
	}
}
```

今回はキャプチャした画像を保存するだけという実装ですが、少し変更したらキャプチャした画像を加工してから出力することも可能です
特定のマイグレーションファイルをマイグレートする

# ステータスを確認
```
***********@mbp *********** % rails db:migrate:status                                    

database: ***********
 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20221228045452  ***********
.
.
.
  down    20230315004348  ***********
  down    20230315005931  ***********
```
# 4.4 特定のマイグレーションのみを実行する
```特定のマイグレーションをupまたはdown方向に実行する```必要がある場合は、db:migrate:upまたはdb:migrate:downタスクを使います。以下に示したように、適切なバージョン番号を指定するだけで、該当するマイグレーションに含まれるchange、up、downメソッドのいずれかが呼び出されます。
```
$ bin/rails db:migrate:up VERSION=20080906120000
```
上を実行すると、```バージョン番号が20080906120000のマイグレーションに含まれるchangeメソッド（またはupメソッド）が実行されます。```このコマンドは、最初にそのマイグレーションが実行済みであるかどうかをチェックし、Active Recordによって実行済みであると認定された場合は何も行いません
# 出典
https://railsguides.jp/active_record_migrations.html#:~:text=4.4%20%E7%89%B9%E5%AE%9A%E3%81%AE,%E8%A1%8C%E3%81%84%E3%81%BE%E3%81%9B%E3%82%93

# 実践
```
************@mbp ******* % bin/rails db:migrate:up VERSION=20230315005931   
```

# ステータスで確認する
```
***********@mbp ********: % rails db:migrate:status                       

database: **********

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20221228045452  ********
.
.
.
  down    20230315004348  *************
   up     20230315005931  *************
```

# 感想
探し出すことができてよかった。
さくらのレンタルサーバーでPOST時に謎の403 Errorが発生する

# 症状

さくらのレンタルサーバーに設置したPHPスクリプトから、同ディレクトリ内のPHPに対してPOSTを行った際に403エラーが発生する。

・送信する内容によって発生したり、しなかったりする
・同じサービス内で使用している、別のサブドメインでは発生しない

# 原因

さくらのレンタルサーバーに搭載されている、WAF（ウェブアプリケーションファイアウォール）の誤検知によりリクエストが拒否されていました。
WAFはドメイン単位でON/OFF設定となるため、後から追加してWAFをONにしていないサブドメインでは発生しない状態になっていました。

今回設置したPHPスクリプトではCSSファイルの編集を行っており、このCSSファイルの内容としてコメント行があります。（ /* ～ */ )
このコメント行をWAFが何らかの攻撃と誤検知し、拒否している模様です。

# 回避

・WAFを無効化する
・WAFを無効にしたサブドメインを用意し、当該スクリプトを使用する場合だけそちらを利用する
enebularでalexaスキル その13

# 概要
enebularで、alexaスキルのwebhookを返してみた。
irリモートを選んでみた。

# irリモートを選んでみた。

|候補|tuya|Nature|SwitchBot|
|:--|:--|:--|:--|
|androidアプリ|tuya smart|Nature Remo|SwitchBot|
|alexa連携|〇|〇|〇|
|irリモコン価格|2,780円|11,919円|4,166円|
|クラウドapi|tuyaapi|Nature Remo Cloud API|SwitchBot Api|
|python|tinytuya|NatureRemo API|SwitchBotAPI|
|デヴァイスクローン|tasmote|?|?|

以上。
Springboot 2.3to2.4

Spring Boot 2.3 から 2.4 にアップグレードする場合、脆弱性の問題は発生しないはずです。実際に、2.4 にアップグレードすると、セキュリティとパフォーマンスの改善が期待できます。

ただし、アップグレードする際には、いくつかの互換性の問題に注意する必要があります。Spring Boot 2.4 では、いくつかの大きな変更や削除が導入されているため、いくつかのアプリケーションは、正常に動作するために適切な変更を加える必要がある場合があります。具体的には、次の点に注意する必要があります。

spring-boot-starter-web は、Tomcat 9 のサポートを追加しました。もしアプリケーションが古いバージョンの Tomcat に依存している場合、新しい Tomcat API をサポートするようにコードを更新する必要があるかもしれません。

Spring Boot 2.4 では、推奨されない機能がいくつか廃止されました。もしアプリケーションがこれらの機能を使用している場合、推奨される代替策を使うようにコードを更新する必要があります。

spring-boot-devtools の動作方法が変更され、アプリケーションの状態を維持するためのホットデプロイメントがサポートされるようになりました。もし spring-boot-devtools を使用している場合、これらの変更に対応するようにコードを更新する必要があるかもしれません。

Spring Boot 2.4 では、より強力なパスワード暗号化アルゴリズムやより厳密なデフォルトのセキュリティポリシーなど、いくつかのセキュリティ改善が導入されています。これらの変更はアプリケーションに影響を与える可能性があるため、コードを慎重に確認して、引き続き正常に動作することを確認する必要があります。

以上から、Spring Boot 2.3 から 2.4 にアップグレードすることは比較的簡単なプロセスであると言えますが、潜在的な変更に適応できるように、コードを慎重に確認する必要があります。


Spring Boot 2.3 から 2.4 にアップグレードする際には、いくつかの潜在的な変更に注意する必要があります。以下にいくつかの例を挙げます。

Spring Boot 2.4 では、Java 8 以前のバージョンをサポートしなくなりました。もしアプリケーションが Java 8 以前で動作している場合、アップグレードする前に Java のバージョンをアップグレードする必要があります。

@SpringBootTest は、@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) のように、暗黙的にランダムポートを使用するように変更されました。もしアプリケーションが明示的にポート番号を指定している場合、コードを更新する必要があるかもしれません。

Spring Boot 2.4 では、デフォルトで src/main/resources にある application.properties や application.yml ファイルが自動的に読み込まれなくなりました。代わりに、src/main/resources のサブディレクトリに application.properties や application.yml ファイルを置くことができます。これにより、アプリケーションが読み込むプロパティファイルをより細かく設定できるようになりました。

Spring Boot 2.4 では、@AutoConfigureMockMvc を使用してモックの MVC テストを構成する場合、@MockBean で注入されたビーンが、アプリケーション本体で使用されているビーンを置き換えないようになりました。これは、より正確なモックテストを可能にするための変更ですが、以前のコードが影響を受ける可能性があるため、注意が必要です。

これらは一部の例ですが、Spring Boot 2.4 には他にも多くの変更が含まれています。アップグレードする際には、公式のリリースノートを確認し、アプリケーションに影響を与える可能性のある変更を特定する必要があります。
deviseで用意されている form_forをform_withに変更する

# はじめに
Railsのgemにあるdeviseを使用するとユーザー登録のためのヘルパーメソッドはform_forになっているかと思います。

Rails5.1になって以降、form_forからform_withに推奨されていますので変更が必要かと思います。

app\views\devise\registrations\new.html.erbを元に置き換えをしていきます。

## 変更前
```app\views\devise\registrations\new.html.erb
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
```
## 変更後
```app\views\devise\registrations\new.html.erb
<%= form_with model: @user, url: user_registration_path, id: 'new_user', class: 'new_user', local: true do |f| %>
```
model: @userでデータベースのusersテーブルに保存されているユーザー情報を入力フォームに入れてくれる構造になっています。

また、urlの指定には注意してください。
上記はregistrationsフォルダで行っていますが、他にも複数存在しますのでurl指定の際はお気をつけください。

## 参考にさせていただいた記事
「ユーザー認証機能 devise」
https://zenn.dev/odentravel/books/e69a157daeecb3/viewer/f54358
Googleデジタルマーケティング＆Eコマース：投稿の頻度とタイミング

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/24ea32fb-2fb3-bdb2-462a-4ffc4d60a96f.png" width="800">

# 投稿の頻度

ソーシャルメディア上で一貫した存在感を示すことで、あなたのブランドを潜在顧客に見てもらい、発見してもらうことができます。しかし、ソーシャルメディアでの発信は、多ければ多いほど良いというわけではありません。視聴者の心に残るようにしたいのですが、あまりに頻繁に投稿して視聴者のフィードを圧迫し、視聴者を遠ざけてしまう可能性はあります。

ソーシャルメディアに投稿する頻度は、さまざまな要因に左右されます。特に、各プラットフォームとその仕組みが重要です。

### 時系列フィード

Twitterでは、ユーザーが自分の投稿を時系列のフィードで表示することができます。このようにフィードをカスタマイズした場合、ストリームには最新の公開コンテンツが表示されます。

- 時系列フィードのプラットフォームでは、1日に何度も投稿することで、異なるタイムゾーンにいるターゲットオーディエンスに、1日のさまざまなタイミングでリーチする機会が得られます。
- Twitterがあなたのブランドに関連するプラットフォームである場合、少なくとも1日に数回投稿することを目標にするとよいでしょう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/9ab8c440-bf0e-849f-7028-a3bcfe206f11.png" width="600">

### アルゴリズムベース

主にアルゴリズムベースのプラットフォームでは、投稿の頻度を計画する必要があります。ソーシャルメディアのアルゴリズムは、ユーザーのフィードにある投稿を、公開順ではなく、関連性に基づいて分類する方法です。つまり、これらのプラットフォームでは、ユーザーが実際に見たいと思う可能性によって、どのコンテンツを最初にフィードで見るかを優先しているのです。

FacebookやInstagramのようなアルゴリズムベースのプラットフォームでは、投稿が多すぎるとエンゲージメントが低下するため、質の高いコンテンツをあまり頻繁に公開しないほうがよいでしょう。これらのプラットフォームでは、あなたのブランドによって投稿の頻度が異なります。
- あなたのブランドに最適な頻度は1日1回かもしれませんが、他のブランドでは週に数回かもしれません。

# 投稿のタイミング

プラットフォームによって、最適な投稿のタイミングは異なります。

朝一番の投稿は、人々がソーシャルメディアのフィードをキャッチアップしている時間帯であるため、一般的に非常に効果的です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/8493a4f2-1694-1ef9-9e5b-e1c5d33d7b7d.png" width="600">

昼休みに投稿するのもよいでしょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/41bfc706-e188-084f-8730-cadab32a23a0.png" width="600">

就業時間直後も、一日のうちに見落としたものを見つけたい人が多いので、効果的な投稿のタイミングです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/c6990bdc-1487-f766-a2f8-0f96b8f86787.png" width="600">

あなたのブランドにとって最適な投稿時間を見つけるには、さまざまな要素を考慮する必要があります。
- ターゲットとするユーザーがオンライン上で活動している時間帯を調べます。フォロワーが特定のプラットフォームにいる時間を調査し、その時間に投稿することで、あなたのコンテンツがフォロワーに届く可能性を最大化することができます。
- ターゲットオーディエンスのタイムゾーンを考慮し、それに合わせて投稿のスケジュールを組むようにしましょう。
- 過去の最もパフォーマンスの高い投稿を分析することで、投稿する時間を決めることもできます。成功したコンテンツを投稿した時間帯や曜日を確認し、パターンがないかどうかを判断します。分析ツールを使用すれば、成果の高い投稿や視聴者のオンライン活動に関するデータを収集することができます。
- 季節や祝日も考慮する必要があります。
    - 例えば、消費者は1月に休暇を予約する可能性が高い傾向にあります。旅行ブランドであれば、旅行先の魅力的な画像を投稿するのに適した時期です。
- 時事問題を考慮する必要があります。
    - 例えば、国家的な災害や紛争が発生した場合、これらの出来事に敏感になるために投稿のスケジュールを外したり、支援を示す投稿を追加したりする準備をしておく必要があります。
123^456を78で割った余り「【鈴木貫太郎さん出題】べき乗の周期性」をwolframalphaとsympyでやってみた。

合同式、素因数分解を使っていません。勉強中。

オリジナル

https://youtu.be/Op2kSLqhikY

# wolframで

https://www.wolframalpha.com/input?i=123%5E456+%E3%82%9278+%E3%81%A7%E5%89%B2%E3%81%A3%E3%81%9F%E4%BD%99%E3%82%8A&lang=ja

数学入力

https://www.wolframalpha.com/input?i2d=true&i=Power%5B123%2C456%5Dmod+78+&lang=ja

自然言語

https://www.wolframalpha.com/input?i=123%5E456+mod+78&lang=ja

表示桁数を増やす

https://www.wolframalpha.com/input?i=%28123%5E456-27%29++%2F+78&lang=ja

結果
1 272～(省略)～853
# sympyで
私の環境は,pycharmです。よく聞くのは、Jupyterです。
```python
from sympy import *
print("#",Mod(123**456,78))
print("#",(123**456-Mod(123**456,78))/78)
# 27
# 1272～(省略)～853
```
web上で、上記のソースをコピー貼り付けでも、できました。
黒背景の右上に、マウスを移動すると、コピーマークが発生します。

https://live.sympy.org/

# 参考

https://www.google.com/search?q=wolfram+alpha+%E6%95%B4%E6%95%B0%E8%A7%A3&rlz=1CAUHAM_enJP1038JP1038&oq=wolframalpha+%E6%95%B4%E6%95%B0&aqs=chrome.1.69i57j0i546l4.12325j0j7&sourceid=chrome&ie=UTF-8

https://www.geeksforgeeks.org/python-sympy-mod-method/

＞扱える桁数は無制限となります（システムのメモリには依存します）。

https://www.google.com/search?q=python+int+%E6%9C%80%E5%A4%A7%E6%A1%81%E6%95%B0&rlz=1CAUHAM_enJP1038JP1038&biw=1366&bih=645&sxsrf=AJOqlzXQVa6C6DtOIlQJa1Jx_BEJEAL8Wg%3A1678843016938&ei=iBwRZP_tOJGx2roPxZ6Y4Ag&oq=python+%E6%9C%80%E5%A4%A7%E6%A1%81&gs_lcp=Cgxnd3Mtd2l6LXNlcnAQARgBMgsIABAEEIAEECUQIDIGCAAQCBAeMgYIABAIEB4yBggAEAgQHjoKCAAQRxDWBBCwAzoFCAAQogQ6BwgAEB4QogRKBAhBGABQsgdYvg5g1jdoAXABeACAAXmIAagEkgEDMC41mAEAoAEByAEKwAEB&sclient=gws-wiz-serp
【データ基盤構築/Snowflake】S3（データレイク）からデータをロードするためのSnowflakeの便利機能

# 今回の課題
データレイクとしてAWSのS3を使用している場合に、
Snowflakeへデータをロードするための機能を調査する。

下記の記事を読んで、不明だった機能について理解してみた。


https://itsol.isid.co.jp/snowflake/blog/snowflake-aws-vol-004-2778/

## S3からSnowflakeにデータをロードできるSnowflakeの機能
### 1)Snowflakeの「TASK」機能
スケジュールや前処理の終了をトリガーにして、SQLを自動実行するように設定できる機能。
ロード処理をSnowflakeの「TASK」機能で定義しておけば、自動化できる。

Snowflakeは、S3を**外部ステージ**として使用することができ、クエリでのデータをロードすることも可能となっている。
TASK機能と組み合わせることで、S3のデータファイルを使用して定期的にSnowflakeでテーブル生成することが可能になる。

※参考：[タスクの紹介(公式ドキュメント)](https://docs.snowflake.com/ja/user-guide/tasks-intro)

### 2)Snowpipe機能
S3からSnowflakeにデータを手動でロードしなくても、
S3でファイルが利用できるようになったことを検知して、自動で継続的にロードできるようにする仕組み。
下記の流れで処理を自動化できる。

**■Snowpipe実装の流れ**
1.S3にデータが格納されたタイミングでAWS SQSを使ってSnowpipeに通知を送る。
2.通知をされたSnowpipeがSnowflakeの中にデータをロードする。



下記の記事で、Snowpipeの実装方法が紹介されていた。

※参考
・[Amazon S3用のSnowpipeの自動化(公式ドキュメント)](https://docs.snowflake.com/ja/user-guide/data-load-snowpipe-auto-s3)
・[Snowpipeの作成](https://qiita.com/KimiyukiMuramatsu/items/a88b0e527377ecd35626
)


# まとめ
S3からSnowflakeにデータをロードする流れをイメージできた。
コニュニティーでのChatterのメンション


+ [Chatterのメンション時のニックネームまたは別名の適用について](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007I5xq3)

ExperienceCloudでサイト利用者のニックネーム機能が有効になったのがWinter20からです

[コミュニティ: Salesforce CMS、アクセス制御、ゲストユーザのセキュリティ強化](https://help.salesforce.com/s/articleView?id=release-notes.rn_networks.htm)

設定方法

[Experience Cloud サイトでの氏名に代わるニックネームの表示 (salesforce.com)](https://help.salesforce.com/s/articleView?id=sf.networks_enable_nickname_display.htm&type=5)
 


+ [外部ユーザとの Chatterと通知（ベル＆メール）について](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JgVegSAF)

:::note
いくつか設定を見直してエクスペリエンスクラウドの状況を「有効」に変更したタイミングで（変更前はおそらく「プレビュー」だった）、外部ユーザに通知がくるようになりました。
:::


+ [サイトユーザが Chatter で内部ユーザをメンションできない](https://help.salesforce.com/s/articleView?id=000381557&type=1)

+ [Unable to @mention Partner user on chatter feed by Salesforce Internal User](https://salesforce.stackexchange.com/questions/17605/unable-to-mention-partner-user-on-chatter-feed-by-salesforce-internal-user)

レコード フィードでコミュニティ ユーザを @メンションするには、2 つのことが必要です。

+ レコードを表示し、コミュニティ コンテキストで内部ユーザが Chatter 投稿を開始する必要があります。つまり、コミュニティのベース URL (例: https://mycommunity.force.com/recordid ) でレコードを表示している必要があります。

+ 次に、内部ユーザーからの Chatter 投稿の可視性を Everyone に設定する必要があります。デフォルトは内部ユーザーです。

Two things must happen in order to @mention a community user on a record feed. The record must be viewed and the Chatter post initiated by the internal user in the communities context. In other words, you must be viewing the record with the Community base URL( e.g. https://mycommunity.force.com/recordid ). Second, the visibility of the Chatter post from the internal user must be set to Everyone. The default is internal users.

追記:追加するには、これはバグではなく、設計によるものです。コミュニティ ユーザーは、社内の Salesforce CRM の一部ではありません。レコードはコミュニティと「内部」コミュニティにまたがることができますが、それらのレコードの Chatter は、投稿する場所のコンテキストに依存します。

EDIT: To add, this is not a bug, this is by design. Communities users are not part of your internal Salesforce CRM. Although records can span communities and your "internal" community, Chatter on those records is contextual to the place you are posting it.

# ベルマーク通知の設定について

+ [ベルマーク通知の設定について](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PfAaA)

:::note
通知の配信設定でChatterを選択すれば通知の設定が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e36f7f21-f067-5088-7155-8432c5fc0066.png)
:::
一年目のサーバーサイドエンジニアが簡単なネイティブアプリ(Android)を初リリースした話

## 初めに
私事ですが、一年目のサーバーサイドエンジニアが簡単なネイティブアプリ(Only Android)を初リリースしました！🎉

https://play.google.com/store/apps/details?id=tes.masanarea.datumou&pli=1

昨日は至ってシンプルで『Hello world!』を表示するだけというものになります。

https://twitter.com/Masa36940064/status/1635784558502363136

ここでの注目ポイントはやはり
  * バックエンドエンジニアでも、
0->1で(頑張り次第ですが)2日かければアプリのリリース段階に持っていけること

ということです。

普段はPHP(COdeIgniter,Laravel),JavaScript(jQuery,Vue.js)でのWeb開発を行なっておりまして、全く別の技術になりますが、かなり作業量が少ないので手順(方法論)さえわかってしまえばかなり容易だということが今回わかりました。(もちろん『Hello World!』を表示するだけの簡単なアプリをアップロードするだけというのもあります。)

## 使用技術

* 使用環境

  * Macbook（Intel）
  * Visual Studio Code
  * Android OS の実機（Android の携帯）(※  iOS については触れませんでした。)
 

* 言語、フレームワーク
  * Docker（ubuntu、Android Studio、Flutter を構築）
  * Flutter

※Docker を使用しているため、
Windows でも参考程度であれば同様にできるかもしれません。

※ 挫折しないように（初期段階では）、実行に必要なものはなるべく用意しなくても実行できるようになるように工夫しました。

※ また、Google PLAY Console でアカウントを作成するためには、$25（日本円にして約2,999円）が必要です。作成後は、今後は料金がかかることはありません。


## 終わりに
今回は以上です。
kotlin controllerからのresponceにcache-controlを設定してブラウザキャッシュを有効化する

# はじめに
無駄なバックエンドへのアクセスを減らしたいと思いブラウザキャッシュの設定方法を調べました。


# 実装
Controllerからレスポンスヘッダーにキャッシュを設定してあげるだけでOKです。

```kotlin:controller
import jakarta.servlet.http.HttpServletResponse
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController


@RestController
class ImageController {
    @GetMapping("/image")
    fun getImage(response: HttpServletResponse): ByteArray {//・・・①
        //resourcesフォルダに格納した画像を取得する処理・・・②
        val classLoader = javaClass.classLoader
        val image = classLoader.getResourceAsStream("react.png")!!.readBytes()

        //responseヘッダーにcacheを設定する・・・③
        response.setHeader("Cache-Control", "max-age=3600")

        return image
    }
}
```
上記の例は/imageのエンドポイントに対してリクエストを返すコントローラの実装です。
①responseをHttpServletResponseを型にして引数に取ります。
②ここは仮の処理です。resourcesフォルダに格納されているreact.pngの画像を
　取得する処理です。実際はserviceを呼び出したり、各々の処理を記述してください。
③引数でとったresponseのヘッダーに対してcacheを設定します。
　max-age のあとの数字がcacheの有効時間（秒）です。現在だと3600なので1時間になります。
　
以上の設定でこのresponseを受け取ったブラウザは3600秒間はバックエンドへのアクセスを行わず、キャッシュからこの画像をロードするようになります。


　
# テスト
一応、この実装が正しくできてるかのテストも書いておきましょう！
```kotlin:controllerテスト
import org.junit.jupiter.api.Assertions.*
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.header

@SpringBootTest
@AutoConfigureMockMvc
@DisplayName("/image")
class ImageControllerTest {
    @Autowired
    private lateinit var mockMvc: MockMvc
    @Test
    fun `ヘッダーにキャッシュの設定がされていること`(){
        mockMvc.perform(
            get("/image")
        )
            .andExpect(header().string("Cache-Control","max-age=3600"))
    }
}
```

上記のテストを実行すれば問題なく通るかと思います。


# ブラウザ側での確認
ブラウザで開発者モードからネットワークタブを開きます。
そこに表示されるSizeが以下の用に(memory cache)になってればOKです
※disc　cacheの場合もあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916357/92674a8a-9020-a690-2b9a-5dc1836fa866.png)

# ブラウザでのキャッシュ削除の方法
キャッシュの実装してるとキャシュを削除したくなります。
そこで　⌘　　+ shift + Rで　スーパーリロードをしてもキャッシュが消えないことがあるので
そんなときは
開発者モードを開く→ブラウザの更新ボタンを右クリック→キャッシュの削除と再読み込み
の手順でキャッシュを削除して再読み込みをしてくれます。
※予め開発者モードを開いておく必要があるので注意です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916357/97d5f840-6139-d304-5147-9a94fabac27d.png)


ブラウザの履歴からキャッシュを削除しても同じくキャッシュを消せます。




# 参考
キャッシュの設定値と動きについてはこちらが分かりやすかったです。

https://qiita.com/hkusu/items/d40aa8a70bacd2015dfa
CSSの論理プロパティ？知ってた方が便利！

CSSには論理プロパティってのがあります！

:::note
論理プロパティを使うとこれまでの記述がスマートに書けるので覚えておいた方が良いです！
:::

## 論理プロパティってなに？

これまで下記のような記述を書いた記憶が数えきれないほどありますよね？

```scss
.header {
  margin: 0 auto;
}
```

本来topとbottomは0なので指定しなくていいはず…とモヤモヤします。

:::note alert
上下を0で指定しているということから『何か打ち消している』ことを読み手は気にしなくてはいけません…
:::

それなら…

```scss
.header {
  margin-left: auto;
  margin-right: auto;
}
```

良いのですが冗長的な気がします…。
論理プロパティを使うと…

```scss
.header {
  margin-inline: auto;
}
```

ほほーん…。
必要な部分だけを指定できます！

### 論理プロパティinlineとblockの解説
inlineは水平方向、blockは垂直方向に作用するプロパティです。

```scss
.header {
  // 物理プロパティ　左右 
  margin-left: auto;
  margin-right: auto;

  //　　物理プロパティ　上下
  margin-top: auto;
  margin-bottom: auto;

  // 論理プロパティ　左右 
  margin-inline: auto;

  // 論理プロパティ　上下
  margin-block: auto;
}
```

:::note
left、right、top、bottomで指定されるプロパティは物理プロパティと呼ばれるようです！
恥ずかしながら初めて知りました…。
:::

### 論理プロパティはいつ使うのか？
基本的に物理プロパティで記述して良いと思います！

:::note warn
長年運用しているサイトでは物理プロパティで記述されていることが多いと思います。
急に切り替えるとコーディングに統一感がなくなるのでチームで認識をすり合わせてから利用することをオススメします！
:::

## startとend
論理プロパティはstartとendがあります。
書き方は下記の通りです。

```scss
.header {
  // 論理プロパティ　左右 
  margin-inline-start: auto;
  margin-inline-end: auto;

  // 論理プロパティ　上下
  margin-block-start: auto;
  margin-block-end: auto;
}
```

startというのは要素の始まり、endは要素の終わりです。
左から読む言語であれば`margin-inline-start`は要素左側のmargin-left、`margin-inline-end`は要素右側のmargin-rightを指します。

`margin-block`も同じ考え方です。

:::note
要素が縦書きでコーディングされている場合は、inlineとblockが逆転してblockが水平方向、inlineが垂直方向に作用するプロパティとなります！
:::

### 論理プロパティはどのプロパティで使える？
一覧を見ましたが一度では覚えられないと思ったので使いながら覚えたいと思います！
よく使うプロパティは`width`、`height`、`margin`、`padding`、`border`、`poition`、`text-align`かと思います。

下記のURLで一覧をご覧いただけます！

https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Logical_Properties#reference


## 【まとめ】CSSの論理プロパティ
勉強や理解が足りないことが多いと思います…。
CSSの新しい仕様やプロパティを知ることでこれまでのコードが冗長的に感じられます。

対応ブラウザやOSは気にする必要がありますが、新しいものに更新していくことが必要です。
読みやすく、変更しやすいコードを保つために引き続き精進したいと思います！

## 参考にした記事

https://coliss.com/articles/build-websites/operation/css/css-logical-properties.html

https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Logical_Properties
Whisperを活用して動画の内容を簡単に文字起こしに変換する方法


OpenAIのWhisperは、自動音声認識（ASR）技術に基づくシステムです。Whisperは、大量の音声データと対応するテキストデータを用いて訓練されており、音声をテキストに変換する機能を提供しています。この技術は、様々な言語やアクセントに対応し、動画やオーディオの字幕生成、通話の文字起こし、音声アシスタントなど、多くの用途に活用されています。今回はOpenAIのWhisper APIを使用して動画から文字起こしをする方法を説明します。以下はより詳細な手順の説明です。

# 事前準備

まず、MacOSにffmpegをインストールします。Terminal.appを開き、以下のコマンドを実行します。

```shell
brew install ffmpeg
```

次に、Pythonパッケージであるopenaiとffmpeg-pythonをインストールします。同じターミナルウィンドウで、以下のコマンドを実行します。

```shell
pip install openai
pip install ffmpeg-python
```

これで、必要なパッケージがすべてインストールされました。

# プログラミング

次に、Pythonスクリプトで音声から文字起こしを行います。上記のブログ記事のサンプルスクリプトを参考に、以下の手順を実行します。
※一度に文字起こしできるサイズに制限があるので音声を5分毎に分割して変換します。

### 1.必要なモジュールをインポートします。

```python
import os
import openai
import ffmpeg
```

### 2.OpenAIのAPIキーを環境変数から取得します。APIキーは、OpenAIのウェブサイトで取得できます。

```python
# OpenAIのAPIキーを環境変数より取得
openai.api_key = os.environ.get('OPEN_AI_KEY')
```

### 3.入力動画ファイルのパスを設定します。

```python
input_file = './audio/sample_all.mp4'
```

### 4.分割された音声ファイルを保存するフォルダを設定します。

```python
output_dir = './audio/'
```

### 5.音声ファイルを5分間隔で分割します。

```python
split_time = 5 * 60
```

### 6.分割された音声ファイルから文字起こしを行います。

```python
# 入力ファイルの情報を取得
probe = ffmpeg.probe(input_file)
video_info = next(s for s in probe['streams'] if s['codec_type'] == 'video')
duration = float(video_info['duration'])

# 分割された音声ファイルの抽出
for t in range(0, int(duration), split_time):
    # 分割された音声ファイルのファイル名
    output_file = f'{output_dir}/audio_{t}.mp3'

    # 分割された部分の動画ファイルを作成
    stream = ffmpeg.input(input_file, ss=t, t=split_time)

    # 音声ストリームの抽出とエンコード
    audio = stream.audio
    audio = ffmpeg.output(audio, output_file, acodec='libmp3lame')

    # FFmpegを実行する
    ffmpeg.run(audio)

    # OpenAIのWhisperを使って音声から文字起こしする
    audio_file = open(output_file, "rb")
    transcript = openai.Audio.transcribe("whisper-1", audio_file)

    # 文字起こし結果をためる
    text += transcript.text
```

### 7.最後に、変換されたテキストを出力します。

```python
print(text)
```

出力されたテキストを見ると、以下の様に日本語でそれなりの精度では出力されましたが、ご認識もあるため人手でチェックや修正する必要はありそうでした。
また、音声の間は空白となり点（てん）や丸（まる）までは自動で付かないので、校正する必要もありました。

【修正前】
```text
皆さんこんばんはそれでは指示帝国になりましたので始めたいと思います はい本日は第28回ピンテック養成勉強会 金融に生かすデータの開拓と利活用の技術編ということで勉強会を始めたいと思います 本日は優れたテクノロジーを駆使して金融業界に新たな可能性を創出する 素晴らしい講演者の方々をにお招きしております 皆様の専門分野において....
```

【手作業での修正】
```text
皆さんこんばんはそれでは定刻になりましたので始めたいと思います。
はい本日は第28回フィンテック養成勉強会 金融に生かすデータの開拓と利活用の技術編ということで勉強会を始めたいと思います。
本日は優れたテクノロジーを駆使して金融業界に新たな可能性を創出する 素晴らしい講演者の方々をにお招きしております。
皆様の専門分野において....
Tableau CRMのバグ？


# Interaction Chart in component.

[Interaction Chart in component.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JgT0O)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6a8bd85c-ff6a-9e05-35ae-4dd49cab4f60.png)


:::note
This is something we are aware of and have a bug for. 

You have two workarounds:

1. You can create the same interaction without using components, just with a chart on your dashboard and using the interaction there. I know this is defeating the purpose of reusability so it is a matter of priority.

2. You can hack it to make it work by making the destinationType: page in your component and add a placeholder page. Then when bringing the component to the dashboard and creating the interaction, modify the JSON directly using CMD+E: to match something similar to this:

```
"destinationLink": {
                            "name": "Dashboard_name",
                            "pageName": "Dashboard_page"
                        },
                        "destinationType": "component"
```
:::
mongoコマンドが使えない　command not found: mongo

MongoDBの学習中に教材に沿って進めていると環境構築で詰まったので、その際に調べた解決方法をまとめました。

# 開発環境
macOS Big Sur 11.6
Homebrew 3.6.18
MongoDB 5.0.14

# 詰まった内容
```zsh
$ brew install mongodb-community

$ mongo --help #mongoコマンド確認用
zsh: command not found: mongo
```
学習していた教材では`brew install mongodb-community`でmongoコマンドが使用できると記載されていましたが、実際はそれだけではmongoコマンドは使用できませんでした。

# 解決方法
```zsh
$ brew install mongodb-community-shell
```
`brew install mongodb-community`の後に上記コマンドを実行することでmongoコマンドが使用できるようになりました。

以前はMongoDBのパッケージにはmongoコマンドの実行に必要なMongoシェルも含まれていたようですが、バージョンアップによりMongoDBサーバーとMongoシェルが別々のパッケージに分割されたようです。
そのため、brewコマンドでMongoDBをインストールした場合は、Mongoシェルは別でインストールする必要があります。

# 参考記事
https://www.mongodb.com/docs/manual/release-notes/4.4/

https://velog.io/@jiminnote/zsh-command-not-found-mongo
リファクタリングには回帰テストが無いと実行不可能

リファクタリングは、設計や実装を改善する。

「何でそれが前と同じ機能を持って動くと信じられるか」と言ったら、改善されたそれが前と同じだと回帰テストを行なって確認するしか無い。

もし、高速にリファクタリングしたいならば自動化する。

なので回帰テストを書く時間が許されないならリファクタリングは無理。

開発してそれっきりの案件なら回帰テストを書くのは難しいだろう。しかしプロダクト開発は、ずっとソレを機能改善しないといけない。
そんな案件ならば話は違う。
回帰テストを書かないとやっていけないし、自動化しないとコスト削減できない。
リファクタリングを実施するのも抵抗なく出来るだろう。
チェンジシナリオにリファクタリングを混ぜて仕舞えば楽だ。

兎に角。

リファクタリング案件ではまずテストを書いて正しい振る舞いを定義してからやる。
テストはシステムでもインテグレーションでもユニットでも単体でもリファクタリングしたいスケールに合わせて作る。

まずは何を作り直すか、そしたら、そのレベルの回帰テストを書く。そこからリファクタリングが始まる
NginxでSSL/TLSを利用する際の主な流れ

●SSL/TLSの設定

NginxでSSL/TLSを利用する際の主な流れ

1. 秘密鍵を作成する
2. サーバ証明書を認証局に作成してもらう為、CSR（Certificate Signing Request：証明書の署名要求）を作成
3. 認証局にCSRを提出し、その後、中間CA証明書とサーバ証明書が認証局より発行される
4. 秘密鍵とサーバ証明書（中間CA証明書があれば結合したもの）をサーバの所定の場所へ設置し、設定ファイルでそれぞれのファイルを指定する
5. 設定を再読み込みする
nginx -s reload
GPT-4 Is Eating the World

GPT-4がSoftwareを駆逐しようとしている

![startups.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/130ca4a3-2522-97ce-1970-4780003b187a.jpeg)

https://openai.com/research/gpt-4
GPT-4でOCR【文字認識】

画像から文字を認識できます。既存のOCRシステムはもう必要ありません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/6a92e6af-be8d-9e28-c136-08b64bf3a36e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/0137636e-50c5-9d33-5302-fabcdfc5ba77.png)
Salesforce 多要素認証に関するロードマップが更新されました (2023/3/14)

+ [Multi-Factor Authentication (MFA) Enforcement Roadmap](https://help.salesforce.com/s/articleView?id=000362737&type=1)

**Core Platform 製品(Sales Cloud, Service Cloud 等)**

+ 自動有効化: Spring'23 リリース (2023/1-2)～ Spring'24 リリース (2024/1-2) の間のメジャーリリースにて段階的に実施
+ 強制適用: Summer'24 リリース (2024/5-6) にてフェーズ 1 を実行、その後段階的に実施予定

**MuleSoft Anypoint Platform**

+ 2023/8/1 に全ユーザーの強制適用を実施
GPT-4で出来ること

# 1. 質疑応答

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/f7f99845-c8ae-8af7-a0b9-2b2891146dcd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/460e90f7-d30e-a5c1-49e1-ce32a8929361.png)


# 2. プログラミング

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/9c77897d-c23d-3eff-8e9c-b04df4c5cf25.png)


# 3. 画像理解

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/199798ca-a60c-f5d4-d03c-c0923700fbec.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/50e46008-c81d-6477-5efc-1603e8acec04.png)

いかがでしたか

https://www.youtube.com/watch?v=oc6RV5c1yd0


Generative AI on Google Cloudは使わないようがいいです
https://cloud.google.com/ai
オブジェクトマネージャーのエラー




# 次へのボタンがない？

 Customized Salesforce Platform

+ [How to complete the Customized Salesforce Platform step as the " Next" button is not working](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JgUZQ)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/16ce4325-2dbb-79b4-8a4f-74264b4c6d99.png)

:::note
 it solved by logout/ relog in.
:::

# Object Manager が表示されない

+ [Can't complete Getting Started Hands-on Challenge - blank pages](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000NRGeF)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/bd553f35-5862-9b75-2513-571d26106de1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/52656dd9-148b-3390-6593-88ba7466fa7a.png)

:::note
Try your browser's incognito mode.Or try it in a different browser.
:::

# You can't view this item in Lightning Experience. Open in Salesforce Classic."

+ [Is there any restrictions for custom objects to display only in classic but not in lighting](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Pen7N)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/fe0afe01-9293-fe63-ad36-4670faaa1827.png)

:::note
 It worked after creating the first record in the classic
:::

# Essentials Edition Trial - Essentials Edition

+ [I can't see "create custom object" option](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JgYZb)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e777015f-b77d-6828-a2d1-4ae10b30685d.png)

:::note
I see from the screenshot that you are on an Essentials Edition Trial - Essentials Edition does not include the ability to create custom objects - please refer to [the limitations listed here](https://help.salesforce.com/s/articleView?id=sf.overview_limits_general.htm&type=5) for more information.  
:::


# オブジェクトのページ レイアウトを編集しようとすると共有エラーが表示されるため、モジュールを完了できません。

+ [Insufficient Privileges Error on the module](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007bLUeo)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d9cae8d5-70b0-4235-01b4-a0001ba89174.png)

新しいプレイグランドを使った
GPT-4はHTMLコーダーを駆逐する

**顧客が本当に必要だったもの** を作るのがGPT-4

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/df448e70-a533-4486-40c8-5f1fcb76e0fc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/511d42a6-7968-d3e9-ea6d-955327fb7235.png)

https://www.youtube.com/live/outcGtbnMuQ?feature=share&t=1093
目標：@kazuo_reveさんの紹介記事を16個加筆する。

今日から、@kazuo_reveさんの紹介記事を16個加筆することにしました。　


<この項は書きかけです。順次追記します。>

# 動機　

「想定外」3.11 東日本大震災をIT技術者が振り返る

https://qiita.com/kaizen_nagoya/items/80433f4bf7fe116bddd1

の記事に最初にいいねをくださり、おかげさまで、トレンドに入り、いいねを１６いただきました。　

残念だったのは、viewsが8500まで行った時に、トレンドから外れてしまったことです。　

そこで考えたのは、viewsを伸ばすにはどうしたらいいかでした。　

そういえば、@kazuo_reve さんが書かれて、一瞬で、私のいいね一番を抜かれた記事はこちら。

@kazuo_reve 新人の方によく展開している有益な情報

https://qiita.com/kazuo_reve/items/d1a3f0ee48e24bba38f1

という記事を書いていただいたときに、参照していただいた記事のいいね、viewsがぐっと増えました。

その経験から、３つの行動を取ることにしました。 

1. すでに書いてある@kazuo_reveさんの紹介記事を16個加筆する。「「想定外」3.11 東日本大震災をIT技術者が振り返る」から@kazuo_reveさんの紹介記事のURLを追記する。
2.  「「想定外」3.11 東日本大震災をIT技術者が振り返る」から@kazuo_reveさんの紹介記事のURLに、@kazuo_reveさんの記事のURLを記載する。@kazuo_reveさんの記事の後に、「「想定外」3.11 東日本大震災をIT技術者が振り返る」のURLが並ぶ。
3. 1.2をしながら、新しい切り口を探すとともに、他の方法を考える。たとえば、小川メソッド、DOCAPのタグの一覧についての構造化を検討する。

「@kazuo_reve 新人の方によく展開している有益な情報」はじめ記事を参照して頂いた時にしていること。

https://qiita.com/kaizen_nagoya/items/0e4e92f45c158ef81423

「@kazuo_reve 私が効果を確認した「小川メソッド」」引用確認記事

https://qiita.com/kaizen_nagoya/items/233f81ebe9166ea44d09

「@kazuo_reve 新人の方によく展開している有益な情報」確認一覧

https://qiita.com/kaizen_nagoya/items/b9380888d1e5a042646b


「@kazuo_reve の Qiita記事の分析」

https://qiita.com/kaizen_nagoya/items/233f81ebe9166ea44d09


## 小川メソッド

@kazuo_reve 私が効果を確認した「小川メソッド」

https://qiita.com/kaizen_nagoya/items/233f81ebe9166ea44d09

## DOCAP 


＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20230315

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

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

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

Please press the like icon 💚　and follow me for your happy life.
退屈なことはGPT-4にやらせよう 第2版

コードを貼り付けてエラーがあれば、修正してくれます。退屈なことはGPT-4に任せましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/ab958012-c27c-6d1c-638e-8af4b9e9645e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/49522688-a2bf-59e8-bd91-727ec68fead5.png)


https://www.youtube.com/live/outcGtbnMuQ?feature=share&t=518

![51frbRbyjmL._SX350_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/cdad43f8-780c-de8a-9889-a2e3bd6f3fbc.jpeg)
GPT-4のAPIを試す

https://openai.com/waitlist/gpt-4-api

必要事項を入力してジョインしましょう。楽しみにですね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/24e96280-13be-63b6-922e-d8bd35be3502.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/9e69defd-3396-968a-c892-9069bdb07106.png)
GPT-4来ちゃったよ

2023/3/14 発表されるかもと噂されていたGPT-4が発表されました。

https://openai.com/research/gpt-4

# ざっくりまとめ
Google翻訳にぶちこんだまとめ

- マルチモーダル モデル (画像とテキストの入力を受け入れ、テキスト出力を発行する) 
- GPT-4 は、GPT-3.5 およびその他の LLM (チンチラ、PaLM) の英語のパフォーマンスを上回る
- 模擬司法試験に受験者の上位 10% 程度のスコアで合格(GPT-3.5 のスコアは下位 10% 前後)
- APIの待機リストあり、ただし個人はダメな模様
- ChatGPT Plus サブスクライバーは早速使える（ただし、需要デカすぎたら制限するかも）

待機リストはこちら

https://openai.com/waitlist/gpt-4-api

# さっそく使える？
さっそくマルチモーダルを試したかったのですが、アップロードができないようです。
やり方知ってる方いたら教えてください。

ちなみにGPT-4に聞いてもだめ（というか自分をGPT-3.5だと思ってる？）
![スクリーンショット 2023-03-15 7.09.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254871/e8769bdf-9346-a531-39aa-91f946e43037.png)

# まとめ
- GPT-4はなんかすごい
- まだちゃんとは使えなさそう
- 人類は退職届を準備せよ
Googleデジタルマーケティング＆Eコマース：Earned, owned, and paid mediaを利用する

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/24ea32fb-2fb3-bdb2-462a-4ffc4d60a96f.png" width="800">

# Earned, owned, and paid mediaを利用する

アーンドメディアの定義は、その名前にあります。つまり、あなたが獲得したメディアです。これは広報活動に似ていて、コンテンツを作るのではなく、ジャーナリストやブロガーに影響を与え、あなたについて書いてもらうのです。あなたのブランドについて、人々が会話をするように仕向けるのです。適切なインフルエンサーに製品を提供し、彼らが有機的に貴社について話し始めれば、多くの話題を生み出し、他の方法では到達できなかった新しい聴衆に認知度を高めることができます。


オウンド・メディアでは、チャンネルを所有しているため、可能な限りクリエイティブになれるという利点がありますし、個人ブランドであれ、経営しているビジネスであれ、ブランドを代表して発信されるものの物語をコントロールすることができます。Twitter、Facebook、Instagramなどのソーシャル・チャンネルを所有することができます。

ペイド・メディアでは、特定の視聴者がいることが保証されており、その視聴者にヒットさせるためにお金を支払います。ペイド・メディアの優れた点は、FacebookやInstagramなどのソーシャルネットワークで、特にローカルビジネスでは、少ない予算で大きな効果を上げることができる点です。

オーガニックメディアやオウンド・メディアでできることは、最適なメッセージングやクリエイティブ資産をテストすることです。そして、何かが浸透し、人気を博し始めたら、ペイドメディアを使ってそのコンテンツを後押しすることができるのです。このように、オウンド・チャネルを活用し、ペイド・メディアを活用する場所を賢く判断できることは、非常に大きなメリットです。

ソーシャルネットワークは実に多様で、それぞれに異なる利点があります。しかし、自分のニッチを見つけ、オーディエンスがどこにいるのかを知り、そのチャンネルを本当に自分のものにしたなら、そのチャンネルでアーンド、オウンド、ペイドを組み合わせて使うことで、そのチャンネルで特定の種類の戦術しか使わない場合よりもはるかに大きな成果を上げることができるようになるのです。

ですから、ソーシャルメディア・マーケティングを始めたばかりの人に私が一番言いたいことは、とにかくやってみることです。そして、自分のチャンネルは、自分のブランドを反映するものであることを忘れないでください。

# 効果的なEarned media戦略

アーンド・メディアをコントロールすることはできませんが、シェア、リポスト、メンション、ポジションレビューなどの可能性を高めるためにできることがあります。

- アーンドメディアで最も重要なことは、魅力的なコンテンツを作成することです。魅力的なコンテンツであればあるほど、オーディエンスがそれをシェアする可能性は高くなります。
- 他のブランド、メディア関係者、ジャーナリストとの関係を深めることです。これがうまくいけば、結果として、あなたのブランドは好意的な報道を受けるかもしれません。
- 顧客に対して満足以上のカスタマーサービスを提供していることを確認します。フォロワー、顧客、ユーザーなど、あなたとの関係が何であれ、あなたの顧客がその旅を楽しんでいれば、彼らはあなたのブランドを他の人と共有する可能性が高いのです。
- あなたの組織内の他の人々が、共有することを奨励します。より多くの人があなたのコンテンツを共有すればするほど、より多くの人がそれを見ることになり、より多くの人がそれを共有する可能性が高くなります。
json.MarshalIndentはJSONとしての正当性を保証しない

# TL; DR

```go
type User struct {
	Name string `json:"name"`
}

func main() {
	user := &User{Name: "Taro"}
	b, _ := json.MarshalIndent(user, "", "ほげほげ")
	fmt.Println(string(b))
}
```

```json:！？
{
ほげほげ"name": "Taro"
}
```

# はじめに

`json.MarshalIndent` は、オブジェクトを指定したインデント付きでmarshalできる関数です。

https://pkg.go.dev/encoding/json#MarshalIndent

```go
user := &User{Name: "Taro", Friends: []string{"Hanako", "Jiro"}}
// 第2引数はprefix、第3引数はindent
b, _ := json.MarshalIndent(user, "", "  ")
fmt.Println(string(b))
```

```json
{
  "name": "Taro",
  "friends": [
    "Hanako",
    "Jiro"
  ]
}
```

ネストの深いJSONの場合、Marshalよりも人間にとって読みやすいです。

```go:比較（Marshal）
func main() {
	user := &User{Name: "Taro", Friends: []string{"Hanako", "Jiro"}}
	b, _ := json.Marshal(user)
	fmt.Println(string(b))
}
```

```json
{"name":"Taro","friends":["Hanako","Jiro"]}
```

ところで、MarshalIndentはインデントとしてどんな文字が使えるのでしょうか？
...実は、**任意の文字が指定可能**です。

# JSONとしてパースできないバイト列を生成する

空白文字以外をインデントに指定することで、不正なJSONを生成できてしまいます。

```go
user := &User{Name: "Taro", Friends: []string{"Hanako", "Jiro"}}
b, err := json.MarshalIndent(user, "", "ほげほげ")
if err != nil {
	fmt.Println(err) // エラーは起きない！
	return
}
fmt.Println(string(b))
}
```

```json
{
ほげほげ"name": "Taro",
ほげほげ"friends": [
ほげほげほげほげ"Hanako",
ほげほげほげほげ"Jiro"
ほげほげ]
}
```

当然Unmarshalには失敗します。

```go
// ...
var decoded User
if err := json.Unmarshal(b, &decoded); err != nil {
	fmt.Println(err)
	return
}
```

```
invalid character 'ã' looking for beginning of object key string
```

# さらに悪用：中身を書き換える

インデントにプロパティを書き込めば中身の改ざんも可能です！

```go
user := &User{Name: "Taro", Age: 20}
// nameを上書きするようなインデントを設定
b, _ := json.MarshalIndent(user, "", `"name": "Cracker",`)
fmt.Println(string(b))
```

```json
{
"name": "Cracker","name": "Taro",
"name": "Cracker","age": 20
}
```

```go
var decoded User
_ = json.Unmarshal(b, &decoded) // {Name:Cracker Age:20}
```

# おまけ: jsoniterでは？

json-iteratorは、`encoding/json` と100%の互換性を謳うモジュールです。

https://github.com/json-iterator/go

コードに一切の変更を入れずに高速化ができるのが売りですが、果たして...

```go
import (
	"fmt"

	jsoniter "github.com/json-iterator/go"
)

// このjsonオブジェクトを `encoding/json` と全く同じように使える
var json = jsoniter.ConfigCompatibleWithStandardLibrary

type User struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	user := &User{Name: "Taro", Age: 20}
	b, _ := json.MarshalIndent(user, "", `"name": "Cracker",`)
	fmt.Println(string(b))
}
```

```
panic: indent can only be space

goroutine 1 [running]:
github.com/json-iterator/go.(*frozenConfig).MarshalIndent(0xc0001280a0, {0x4fc020, 0xc000110498}, {0x0?, 0x0?}, {0x527939, 0x12})
	/tmp/gopath4028780210/pkg/mod/github.com/json-iterator/go@v1.1.12/config.go:315 +0x14e
main.main()
	/tmp/sandbox399066789/prog.go:20 +0x78
```

~~互換性は100%ではありませんでした~~

...というのは冗談で、不正な文字を弾いてくれるjsoniterの仕様の方がありがたいです...
(ちなみに、タブ対応のPRも上がっているようです)

https://github.com/json-iterator/go/pull/273

# おわりに

以上、`json.MarshalIntent` の挙動についての紹介でした。Goはなんでも安全に倒す印象が強かったので、今回の結果には驚きました。
エラーを返してほしいところですが、Go compatibilityの都合で1系の間は今の仕様を変えられないでしょう。インデントを扱う場合はテストを入念にしておきたいところです。
デイトラ「Web制作コース」　受講内容をアウトプット 20日目

学んだことをアウトプットしています。完全に自己満足ですので悪しからず。
以下の点を確実にアウトプット
①何で学んでるか
②日々の学習内容
③学びのポイント
④制作物
⑤+αで参考にした記事
⑥+αでやってみたこと

①デイトラ「Web制作コース初級編」　ポートフォリオを公開
②自分のポートフォリオサイトの公開
③
　・エックスサーバー契約
　・永久無料ドメイン取得
　・サーバーとドメインの紐付
　・サーバーにファイルをアップロード
　　⇒FTPツール
　・VS Codeの拡張機能でもサーバーへアップロード
　・Twitterカードを設

　　
④なし
⑤なし
⑥なし
プログラミングよりも大事にな品質管理について！

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！
今回は品質管理の色々について更に詳しく調べてみましょう！
![インスタスライド_202303023.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/28ca4af7-e65e-4b19-bffb-afa24e66e3a4.gif)


# 品質管理
- 機能性
- 信頼性
- 使用性
- 効率性
- 保守性
- 移植性

を注意してシステムを構築する必要がある

## 機能性
主に機能的に問題ないかに加えて下記の点に注意する必要がある
- 合目的性
- 正確性
- 相互運用性
- 標準適合性
- セキュリティ

## 信頼性
システムの信頼性の観点で下記の点に注意する必要がある

- 成熟性
- 障害許容性
- 回復性

## 使用性
システムの使用しやすさの観点で下記の点に注意する必要がある

- 理解性
- 習得性
- 運用性

## 効率性
システムの効率の観点で下記の点に注意する必要がある

- 時間効率性
- 資源効率性

## 保守性
システムを保守する観点で下記の点に注意する必要がある

- 解析性
- 変更性
- 安定性
- 試験性

## 移植性
システムを移植する観点で下記の点に注意する必要がある

- 環境適応性
- 設置性
- 規格適合性
- 置換性

# まとめ
品質管理には、
- 機能性
- 信頼性
- 使用性
- 効率性
- 保守性
- 移植性
　がある

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

# クラス図

### 汎化 (継承)
- 汎化（継承）は、一般クラス（親クラス）とそれを特化したクラス（子クラス）との関係を表す。

<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637823/d765fb0e-217c-22f1-7875-099244d92024.png">

- PlantUML ` <|-- `

### 実現 (実装)
- 実現（実装）は、インターフェースとそれを実装するクラスの関係を示す。

<img width="150" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637823/85961eea-386f-db1f-b635-c5edf51a20d9.png">

- PlantUML ` <|.. `

### 集約
- 集約は、あるクラスが他のクラスを保持し、それらが全体-部分の関係を持つことを示す。
<img width="150" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637823/078f287d-b88a-8c04-307b-d61919841157.png">

- PlantUML ` o-- `

### 合成 (Composition)
- 合成は、集約よりも強い関連性を持つ全体-部分の関係を表す特別な形式の関連である。
- 例: `Person`と`Heart`の関係。
- PlantUML ` *-- `

### 依存関係
- 依存関係は、あるクラスが他のクラスのメソッドを一時的に使用する場合や、特定のパラメータとして他のクラスを使用する場合に存在する。
- 依存関係はクラス図上で破線の矢印で表される。
- 例: `Printer` <------- `Course`。
- PlantUML ` --> `

### 関連
- 関連は、あるクラスが他のクラスのオブジェクトを長期にわたって保持する場合に存在する。
- 関連はクラス図上で実線の矢印で表される。
- 例: `Student` ＿＿＿＿ `Course`。
- PlantUML ` -- `

|表記|意味|
|----|----|
|A→B<br>Uses▶|AがBを使用する|
|A→B<br>Creates▶|AがBを生成する||
|A→B<br>Notifies▶|AがBに通知する||

### 表記
- `A→B Uses▶`: AがBを使用する。
- `A→B Creates▶`: AがBを生成する。
- `A→B Notifies▶`: AがBに通知する。

### 参考URL
- [依存関係](https://qiita.com/h2m_kinoko/items/9e82618a8a872e19c7dd#%E4%BE%9D%E5%AD%98%E9%96%A2%E4%BF%82dependency)
- [クラス図の書き方](https://qiita.com/azuki8/items/0836d2c8539c400cb744)
- [Cacooのブログ](https://cacoo.com/ja/blog/how-to-write-class-diagram/)
- [Zennの記事](https://zenn.dev/speedingrenchon/articles/ba78c8b8c4952b)


# シーケンス図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637823/3fb91e00-2181-bee3-5642-f7eb562b9036.png)

コロン(:),下線はインスタンスを表す。
2023/3/15主にITとかセキュリティの記事

「Proofpoint Enterprise Protection」に複数の脆弱性 - パッチがリリース
https://www.security-next.com/144438

ネットワークサーバがランサム感染 - 石巻地区広域行政事務組合
https://www.security-next.com/144428

「GitHub Enterprise Server」にパストラバーサルの脆弱性
https://www.security-next.com/144431

「ライフカード」装うフィッシング - 「直近の取引に質問」などと誘導
https://www.security-next.com/144420

ソフトバンクをかたるフィッシング詐欺メールに要注意！(3/13)
https://iphone-mania.jp/news-528111/

飲食店予約イーティゴー、情報流出で罰金(3/14)
https://www.nna.jp/news/2492974

「パソコンがハッキング…」修理費名目で70代男性が21万円の詐欺被害　大分(3/13)
https://news.yahoo.co.jp/articles/b3acf1b52d407ecdc16b52f02310845a75a983bc?source=rss

2023年に注意すべき情報セキュリティ10大脅威と企業が取り組むべき対策(3/13)
https://dime.jp/genre/1557677/

北朝鮮のサイバー犯罪グループがLinkedInで活動中か。正規の採用担当者を装う(3/13)
https://pc.watch.impress.co.jp/docs/news/1485316.html

2月のランサムウェア動向、被害最多の第1位は引き続き「LockBit」- 注意を(3/13)
https://news.mynavi.jp/techplus/article/20230313-2612720/

欧米政府機関に広がる「TikTok排除」の連鎖反応(3/13)
https://news.yahoo.co.jp/articles/9e1733336c7bbd4c745a4d4df9679e7d95014eb2?source=rss

福岡市職員を“情報漏洩”で逮捕(3/13)
https://news.yahoo.co.jp/articles/69a44084438fadfc98f967b0ebae0e24ec68da8d

Trellix、2022年第4四半期の脅威レポートを発表(3/13)
https://securityinsight.jp/news/13-inbrief/5349-230313-1

ブロックチェーン、メタバース、NFT：2023年のWeb3技術を展望(3/13)
https://www.exchangewire.jp/2023/03/13/blockchain-the-metaverse-nfts-making-web3-work/

リモート管理ツールをうたう「NetWire」をマルウェアと断定するべくFBIが取った方法とは？(3/13)
https://gunosy.com/articles/ajgbz

ChatGPTが生成した質問をする記者と答える官房長官 ほか(3/13)
https://internet.watch.impress.co.jp/docs/column/curation/1485188.html

Google、Androidの2つの重大な脆弱性を修正 - ただちに更新を(3/13)
https://news.mynavi.jp/techplus/article/20230313-2620668/

パスワードに誕生日を使っているあなたへ(3/13)
https://www3.nhk.or.jp/news/html/20230313/k10014004331000.html

ポリクライシスのリスクが高まる時代における、サイバーセキュリティ(3/13)
https://jp.weforum.org/agenda/2023/03/jp-cybersecurity-in-an-era-of-polycrisis/

グーグルも「後追い」　ChatGPT騒動の衝撃
［Part 4］(3/14)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/030700344/030700004/

日米欧で狭まる包囲網　支配力の源に法のメス
［Part 3］(3/14)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/030700344/030700003/

デジタル人材を4倍超に　事業創出の担い手求む
柘植 悠太 氏　パーソルホールディングス 執行役員CIO/CDO(3/14)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600003/030700066/

JALや野村不動産HD、SaaS活用先進企業に見る最適解への挑戦(3/14)
https://xtech.nikkei.com/atcl/nxt/column/18/02386/031100006/

国立研究所で「PPAP」を使うも個人情報漏洩、被害者に指摘受けて行政機関に報告(3/14)
https://xtech.nikkei.com/atcl/nxt/column/18/00598/021000205/

小売業のデジタル活用はもはや当然　デジタル部隊を4倍の150人体制に
相木 孝仁 氏　ベイシア 社長(3/14)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600001/030800131/

新基幹システムの利用中止を即断　原状回復請求訴訟で勝訴
Z会(3/14)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600011/030800127/
RSpecでモックを使って外部サービスなどに接続する処理の呼び出しを確認する

内部でAWSなどの外部サービスに接続してリクエストを送信する処理がある場合にその処理の呼び出し、および引数を確認したい時のコード例です。
外部サービスに接続するクライアント実装をモックする都合上 `it` 内部でモックの準備をする必要があるのがポイントになります。

```ruby
# 外部サービスに接続する実装のイメージ
class HogeClient
  def send_message(arg)
    # 外部サービスに接続してリクエストする処理
  end
end
```

```ruby
it 'HogeClientのsend_messageメソッドが呼び出され、引数に「fuga」が渡される' do
  client = spy(HogeClient)
  allow(HogeClient).to receive(:new).and_return(client)

  # 検査対象の実行

  # 外部サービスに接続する処理の呼び出しと引数の確認
  expect(client).to have_received(:send_message).with('fuga').once
end
```

なお、検査対象のメソッドが **クラスメソッド** なら `spy` でインスタンスを生成する必要もなく、呼び出されるメソッドを上書きするだけで済みます。

```ruby
# 外部サービスに接続する実装のイメージ
class HogeClient
  def self.send_message(arg)
    # 外部サービスに接続してリクエストする処理
  end
end
```

```ruby
before do
  allow(HogeClient).to receive(:send_message).and_return(true)
end

it 'HogeClientのsend_messageメソッドが呼び出され、引数に「fuga」が渡される' do
  # 検査対象の実行

  # 外部サービスに接続する処理の呼び出しと引数の確認
  expect(HogeClient.send_message).to have_received(:send_message).with('fuga').once
end
```
ChatGPTにChatGPT APIに接続するPHPプログラムを書かせてみた！

どもっ！ でびっです！
ChatGPT凄い人気ですね！
ChatGPTは未来の可能性しか感じないほどワクワクしてきちゃいます。

そりゃぁみんなが夢中になるのも頷けます。

プログラミング学習にもChatGPTが最高過ぎると言うツイートもよく見かけるようになりました。

それならいっそChatGPTに接続するAPIプログラミングを全部ChatGPTに書いて貰おうじゃないですか！ってことでさっそく質問してみた記録をご紹介します。

結果から言えば大成功でした！まじで凄いです

<a href="https://dstrikes.net/2023/03/15/chatgpt%e3%82%92php%e3%81%8b%e3%82%89%e8%87%aa%e5%8b%95%e7%94%9f%e6%88%90%e3%81%a7%e3%81%8d%e3%82%8b%e3%82%88%e3%81%86%e3%81%abapi%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%e3%82%92chatgpt%e3%81%ab%e8%81%9e/">ChatGPTにChatGPT APIに接続するPHPプログラムを書かせてみた！</a>
Webサイトが表示されるまでの仕組み

面接でついに聞かれ、下記以上に深く答えれなかったので、忘れないうちに記録します！
また、自分が答えた内容は下記です・・。


- URLを叩くとクライアントからサーバーにリクエストが飛んで、レスポンスが返ってくる
- リクエストの時は、GETとPOSTがあり、使い分け方（リクエストパラメータ）が違う
    - GET
        - URLに＆で繋げ、何をリクエストしてるのかわかる
        - 例） ECサイトの商品を調べた時
    - POST
        - リクエストをURLにくっつけずにサーバーに送る方法
        - 例） formタグで囲むような、プライベートな情報（名前や住所など）


###  Webサイトが表示されるまでの仕組み（詳しめ）
    1. URLに含まれるドメインからDNSサーバーにWebサーバーのIPアドレスを問合せ
       - URLを構成する主な要素は「ドメイン」と、ページファイルを指定する「パス」です。Webサイトを表示するには、URLのドメイン部分を抜き出してDNSサーバーに照会し、通信相手となるWebサーバーのIPアドレス（住所）を特定します。
    
    2. アクセス先のIPアドレスの送信
       - NSサーバーから返ってきたIPアドレスをもとに、webサイトが保管されているwebサーバーをたずねます。
       - webサーバーに対して目的のURLに関連するファイルをもらいます。

    3. Webページの転送と表示
       - webサーバーから受け取ったファイルはコンピューター言語で書かれており、webブラウザがないと理解できず、HTMLとCSSといった言語が自分たちのわかりやすいように変換してくれて画面が見れる


#### もしキャッシュがある場合は？
- 2つのパターンがある

A. 同じサイトの別ページに遷移する場合（DNSキャッシュを利用）

    1. Webサーバーにアクセスしてページデータを要求
    2. Webページの転送と表示
      *URLに含まれるドメインからDNSサーバーへのWEBサーバーのアドレス問い合わせと、IPアドレスの送信省かれる

B. 一度訪れたサイトページを再表示させる場合（DNSキャッシュとWebキャッシュの両方を利用）

    1.クライアント端末が持つDNSキャッシュとWebキャッシュを利用します
      *DNSサーバーから得たIPアドレス情報と、Webサーバーから送信済みのページファイルを再利用できるため、サーバーとの通信は省略されます。



明日再度調べて、詳しくの書けそうな箇所があれば追記します！！