OmniAICreator/Qiita-1.07M huggingface dataset:
ITパスポートに2週間で合格しました

## 受験理由
　プログラミング学習をはじめる際に基礎知識の不足を感じたため受験しました。

## 筆者のスペック
- 地方公立大学卒の22歳
- 新卒で食品卸の事務職
- 情報系の知識ゼロ(高校の時の情報処理の授業は苦手でした)
- pcスキルは最低限のタイピングとExcelやWordが使える程度

## 使用した教材
#### いちばんやさしいITパスポート

　これを一冊読めば本番の7-8割の問題は解けます。
　ページごとの情報量はそこまで多くないのですが、分厚くて1周だけでは覚えきれないです。一度に覚えようと気合いを入れすぎず、さらっと読み進めましょう。

https://www.amazon.co.jp/dp/4815618402/ref=redir_mobile_desktop?_encoding=UTF8&aaxitk=e575c5c85be30308b334d34feeb26e7c&content-id=amzn1.sym.940fa71d-7f78-44a7-86e7-0cc4901f1d5f%3Aamzn1.sym.940fa71d-7f78-44a7-86e7-0cc4901f1d5f&hsa_cr_id=6457335280203&pd_rd_plhdr=t&pd_rd_r=6a9fb05d-11ba-4d2d-a92a-795a91b84950&pd_rd_w=JrCxF&pd_rd_wg=HksFk&qid=1679112857&ref_=sbx_be_s_sparkle_mcd_asin_0_title&sr=1-1-ac08f2b1-eb5b-4f1a-aa64-9e8f448c33ed

::: note warn
参考書は必ず最新版を購入しましょう。ITパスポートでは頻繫に出題範囲の変更や拡大が行われているので、年度によっては昨年度の参考書では出題範囲をカバーできていない場合があります。
:::

#### ITパスポート過去問道場

　みんな大好き過去問道場です。ユーザー登録で解答履歴を保存できるので、見直しや弱点を見つける際にも便利です。無料で使えるのすごい。

https://www.itpassportsiken.com/ipkakomon.php

#### ITパスポート全問解説
　じっくり問題を解く時間が無い、電車の中や休憩時間など隙間時間でささっと勉強したい方はアプリで過去問を解きましょう。試験直前1か月だけは課金することをおすすめします。

- apple版

https://apps.apple.com/us/app/it%E3%83%91%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88-%E5%85%A8%E5%95%8F%E8%A7%A3%E8%AA%AC/id1445110474

- Android版

https://play.google.com/store/apps/details?id=jp.co.trips.shikakuitpassport&hl=ja

# 学習スケジュール

- 期間：2週間
- 勉強時間：平日2時間　休日5時間

#### 開始日～7日目
　参考書の全体をざっくりでよいので読み通します。1周目は分からないところは6割くらいの理解で飛ばしながら、2週目は理解不足の部分を重点的に読み込んでいきます。

#### 8日目～12日目
　とにかく過去問を解きまくりました。10年分は解きましょう。
　過去問道場では年度と出題範囲を指定できるので、慣れないうちはストラテジ系だけなど分野を絞って解いていきました。私は分野が混ざると混乱してしまったので年度ごとに解くことは試験直前までやっていません。
　2～3年分やってみると苦手な範囲が見えてくると思うので、参考書の見直しと過去問の復習をすると良いです。

#### 9日目～14日目(試験当日)
　年度ごとに100問過去問を解きました。私はやらなかったのですが、余裕があれば時間を計りながら解くと実際の試験の時間配分がわかって良いと思います。

# 感想
　簡単な試験で有名なITパスポートですが、IT分野の基礎を浅く広く学べるので初学者は挑戦してみて損はないと思います。私は実質1週間と少しで試験当日を迎えたのですが、インプット不足を感じました。これから受験する方は2週間～1ヶ月は学習期間を設けると余裕を持って試験日を迎えられると思います。
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">

# 3つのタイプのレポート

全てのステークホルダーがレポートから必要な情報を得られるようにするために、ソーシャルメディア・マーケターが知っておくべき3つのタイプのレポートがあります。キャンペーンのあらゆる側面に関する包括的なデータを提供するには、必要なステークホルダーに各タイプのレポートを提示することが最適です。

## オペレーション・レポート

オペレーション・レポートは、

- ***<font color="MediumBlue">オーディエンスの増加率</font>***
- ***<font color="MediumBlue">インプレッション</font>***
- ***<font color="MediumBlue">クリックスルー率</font>***

などの測定基準について、チームメンバーにリアルタイムの更新と情報を提供します。

これらのレポートは、ソーシャルメディアマーケターがキャンペーンの成功を追跡するために必要なデータを迅速に提供するため、必要に応じて戦略を調整することができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/d8fd7b70-e265-4919-95f1-5da938379a51.png" width="700">

## インサイト・レポート

インサイト・レポートは、チームメンバーやステークホルダーに単なる生データを提供するだけではなく、キャンペーンを説明するためのストーリーラインを提供します。

インサイトレポートの目的は、データの意味を探り、その意味をステークホルダーに高いレベルで伝えることです。

このレポートでは、

- ***<font color="MediumBlue">なぜクリックスルー率が高いのか？</font>***
- ***<font color="MediumBlue">どのソーシャルメディア・プラットフォームが最も多くのリードを生み出しているのか？</font>***
- ***<font color="MediumBlue">どのソーシャルメディア・プラットフォームが最も多くのリードを生み出しているのか？</font>***
- ***<font color="MediumBlue">オーディエンスは動画コンテンツと画像コンテンツのどちらを好むのか？</font>***
- ***<font color="MediumBlue">それが予算にとってどのような意味を持つのか？</font>***
- ***<font color="MediumBlue">データにはどのような傾向が見られるか、それはなぜか？</font>***

といった疑問にお答えします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/dac1d7a5-e010-dbde-4fd4-bfd7dd85b18f.png" width="700">

# インフォマティブ・レポート

インフォマティブ・レポートは、主に企業のリーダーがキャンペーンのパフォーマンスをより幅広く理解するために使用されます。

投資収益率（ROI）などの大きな指標やその他の重要業績評価指標（KPI）は、キャンペーンの価値を高いレベルで示すため、インフォメーション・レポートで提示されます。

企業のリーダーはインサイトを分析する時間があまりないため、これらのレポートは非常にわかりやすく、簡潔であるべきです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/8364880d-1c35-f429-da49-63d931efa412.png" width="600">

# Google Data Studio

Google Data Studioを使えば、データを活用してストーリーを伝えることができます。チャートや表などの可視化ツールを使い、チームメンバーと洞察を共有し、レポート作成プロセスをスピードアップできます。また、コラボレーション機能も備えているので、チームで協力してレポートを作成することもできます。

[Google Data Studio](https://lookerstudio.google.com/navigation/reporting?utm_source=hc&utm_medium=button&utm_campaign=about-datastudio&utm_content=access-ds-now)にアクセスしたら、あとはさまざまな種類のレポートを検索するだけです。テンプレートを使ったレポート作成について詳しくは、こちらをご覧ください。

https://lookerstudio.google.com/gallery?category=marketing
Gitコマンドを打つとxcrun: error: が出る

# はじめに
gitコマンドを打つと下記のエラーが発生した。

```
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```
※注意※
プログラミング学習中の初心者です。
記述に間違いがあれば、ご指摘いただけますと幸いです。

# 環境
macOS Ventura 13.2.1
git version 2.37.1 (Apple Git-137.1)

# 解決方法
このエラーは、Xcode Command Line Toolsがインストールされていないか、
古いバージョンが使用されているか、
またはOSのアップデート時に発生するそうです。

今回はアップデートした影響で使用不可となっていました。
下記の通り再インストールで解決しました。
```
xcode-select --install
```

# 参考ページ
https://qiita.com/ss_33_sss/items/7e026bbbc7e42db88da7
Swift Combineの使い方

# Swift Combineについて
Swift Combineは、iOSやmacOS、watchOSなどのAppleプラットフォーム向けのアプリ開発において、非同期処理やデータフローの操作を行うためのフレームワークです。この記事では、Swift Combineの基本的な使い方について解説します。

## Combineの概要
Combineは、PublisherとSubscriberという2つの役割を持ったオブジェクトによって構成されます。Publisherは、値やイベントのストリームを生成し、Subscriberはそれを受け取り、処理を行うオブジェクトです。このストリームには、何らかの処理が加えられることによって、変換やフィルタリング、マージなどが行われます。

## Combineの使い方
Combineを使用するには、まずPublisherとSubscriberを作成します。Publisherは、以下のようにして生成できます。

```
let publisher = Just("Hello, world!")
```

この例では、JustというPublisherを使用して、"Hello, world!"という値を1回だけ発行するストリームを生成しています。他にも、TimerやURLSessionなどの標準ライブラリや、自分でカスタムしたPublisherを作成することもできます。

一方、Subscriberは、以下のようにして生成します。

```
let subscriber = Subscribers.Sink<String, Error>(receiveCompletion: { completion in
    // エラー処理など
}, receiveValue: { value in
    print(value)
})
```

この例では、SinkというSubscriberを使用して、ストリームから受け取った値をコンソールに出力しています。他にも、AssignやFutureなどの標準ライブラリや、自分でカスタムしたSubscriberを作成することもできます。

そして、PublisherとSubscriberを結びつけることで、ストリームの生成と処理を行います。

```
publisher.subscribe(subscriber)
```

この例では、Justで生成したストリームを、Sinkで定義した処理に結びつけています。

## Combineの操作
Combineには、ストリームの操作を行う演算子が用意されています。以下に代表的なものを示します。

マップ
```
let publisher = Just("123")
    .map({ value in
        return Int(value) ?? 0
    })

publisher.subscribe(subscriber) // 123という文字列がInt型の123に変換される
```

フィルタリング
```
let publisher = [1, 2, 3, 4, 5]
    .publisher
    .filter({ value in
        return value % 2 == 0
    })

publisher.subscribe(subscriber) // 2, 4が出力される
```

マージ
```
let publisher1 = [1, 2, 3]
.publisher
let publisher2 = ["a", "b", "c"]
.publisher

let mergedPublisher = Publishers.Merge(publisher1, publisher2)

mergedPublisher.subscribe(subscriber) // 1, "a", 2, "b", 3, "c"が順番に出力される
```
コンバイン

```swift
let publisher1 = PassthroughSubject<Int, Never>()
let publisher2 = PassthroughSubject<String, Never>()

let combinedPublisher = publisher1.combineLatest(publisher2)
    .map({ value in
        return "\(value.0) \(value.1)"
    })

combinedPublisher.subscribe(subscriber)

publisher1.send(1)
publisher2.send("a")
publisher1.send(2)
publisher2.send("b")
publisher1.send(3)
publisher2.send("c")
```

この例では、PassthroughSubjectを使用して、2つのストリームを生成し、combineLatestでコンバインしています。それぞれのストリームから値が送信されるたびに、コンバインされたストリームが生成され、マップ演算子で文字列に変換されます。結果として、"1 a"、"2 b"、"3 c"が順番に出力されます。

## Combineのエラー処理
Combineでは、ストリームの処理中にエラーが発生する可能性があります。そのため、Subscriberは、以下のようにしてエラー処理を行います。

```
let subscriber = Subscribers.Sink<String, Error>(receiveCompletion: { completion in
    switch completion {
    case .finished:
        print("finished")
    case .failure(let error):
        print(error.localizedDescription)
    }
}, receiveValue: { value in
    print(value)
})
```

この例では、Sinkで定義したエラー処理を、receiveCompletionに記述しています。ストリームの処理が正常に終了した場合は、.finishedを、エラーが発生した場合は、.failureを受け取ります。エラー処理では、localizedDescriptionを使用して、エラーメッセージをコンソールに出力しています。

## まとめ
Swift Combineは、非同期処理やデータフローの操作を行うためのフレームワークであり、PublisherとSubscriberという2つの役割を持ったオブジェクトによって構成されます。ストリームの生成や操作、エラー処理について、基本的な使い方を解説しました。
startup

・始めるにあたってのきっかけ
    スキル磨き
    何らかのアプリを作りたい
    会社のサービスに携わりたい
        携わってゴールになってしまう
        もっと明確な目標、、ex)開発に携わり利用者目線のサービスを作り上げる
    
・流れ
progate Javaマスター
    期間的には二週間で完璧
    ドットインストールも併用
progate jave以外をマスター
Rubyon Rails マスター
スイッチングハブ

受信しあたパケットを```宛先MACアドレスが存在するLANポートだけに転送```する

# 出典
https://gihyo.jp/book/2022/978-4-297-13178-4

# スイッチングハブ
ブリッジを複数束ねたもの。

# ブリッジ
```データリンク層（第２層）の中継機能```を提供する装置です。

```セグメント間の中間役```として、```流れてきたパケットのMACアドレス情報を確認```、必要であれば他方のセグメントへとパケットを流します。

流れてきたパケットを監視することで、最初に「それぞれの```セグメントに属するMACアドレスの一覧```」を記憶しています。

以降はその一覧に従って、```セグメント間を橋渡しする必要のあるパケットだけ中継```を行います。
中継パケットは```CSMA/CD方式```に従って送出するため、```コリジョンの発生が抑制されて、ネットワークの利用効率向上```に役立ちます。

# 出典
https://gihyo.jp/book/2020/978-4-297-11781-8

### CSMA/CD方式
* ```イーサネットLAN```で採用
* データを送る際には、```伝送路が空いているかどうかをチェックしてから送信```
* データ衝突(コリジョン）を検出した場合は、```ランダムな時間待って再送信```
* 回線が混雑すると```衝突と待ちが繰り返される```ことになり、```スループットが低下する```。

### 出典
https://gihyo.jp/book/2022/978-4-297-12375-8

### スループット
```与えられた時間内に処理できる仕事量```。

### 出典
https://gihyo.jp/book/2022/978-4-297-12375-8
pythonのコマンドラインで特定の関数のみを指定して実行したいとき


## サンプル

 ```test.py
def print_message(s: str):
    print(s)
```

##  特定の関数を指定して呼ぶ
上記のtest.pyを実行します
-cをつけます

```
python3 -c "import test; test.print_message('aiueo')"
```
踏み台サーバは必要ない！SSMをつかえ！

# はじめに
今回は踏み台観点でのSSMの活用について記載していきます。

# 古典的な構成
まずは通常の古典的な構成を見てましょう。
この場合、パブリックサブネットに踏み台サーバとして、グローバルIPを持ったサーバを構築、管理者はその踏み台サーバにインターネット経由でアクセスし、踏み台経由で該当サーバにアクセスするという方法です。
この方法では、対象サーバへのアクセスに対して、踏み台を経由することで1段階セキュリティの向上が期待できますが、踏み台サーバ自体はインターネットにさらされること、また、踏み台サーバのリソースの料金がかかってしまうというデメリットがあります。この構成を取る場合、接続元のIPアドレスを絞ったりするなど踏み台自体のセキュリティ対策を強化する必要があります。
![スクリーンショット 2023-03-04 14.55.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/f4408826-e7e5-3d97-9d98-357fc18ad131.png)

# SSMを利用した構成
ではSSMを利用した構成でみてみましょう。
この場合、アクセス対象のサーバにはSSMAgentのインストールと、必要なIAMロールの設定、セキュリティグループの設定が必要になります。また、SSM関連のVPCエンドポイントの作成もしくはNATGWの作成が必要です。
サーバにインストールされたSSMAgentはVPCエンドポイント経由でSSMのサービスとのコネクションを常時確立しています。接続したい管理者は、SSMのサービスに対して接続（アクセスはマネジメントコンソールやCLIから可能）するだけです。サーバ側はSSMサービスとのアウトバウンド通信しか必要ないため、外部にポートを公開する必要もありません。非常にセキュアかつ、コストが低い構成になります。
以下３つのアクセス方法を記載していきます。
![スクリーンショット 2023-03-04 15.02.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/7cfd59f0-b936-7398-4712-21df369b3bc9.png)

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started.html

## セッションマネージャを利用したブラウザアクセス
これは非常にシンプルで、EC2もしくはSSMのコンソールからアクセスするパターンです。
気軽にアクセスする際はこの方法が便利ですね。
ただし、WindowsSVに関しては、Powershellアクセスとなってしまう点や、ユーザ指定に関しては事前にAgentの設定を実施しておく必要があるため、注意が必要です。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-sessions-start.html#start-sys-console

## FleetManagerを利用したブラウザアクセス
AWS上のWindowsSVにRDPで接続したいというケースは多いかと思います。
その場合に、FleetManagerを利用すると気軽にアクセスができます。
ブラウザ上でFleetManagerを選択し、ユーザ、パスワードを入力するだけです。
ただし、通常のRDPとは違い、ファイルのやり取りなどが少し不便に感じるかもしれません。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/fleet-working.html

## セッションマネージャポートフォワーディングによるアクセス
個人的にはこの方法が非常におすすめです。
アクセス元ではAWSCLIならびに、SessionManagerPluginの設定が必要となります。
その後、アクセスキー等の設定を行い、対象サーバのアクセス先ポート番号と転送先の自身の端末のポート番号を指定しセッションを確立します。その後、自信端末の指定したポート番号に対して、RDPやSSHで接続を行うだけです。
振る舞いとしては、直接アクセスしているのと同じように利用できます。例えばTerratermやWiｎSCPなどのツールからでも、対象ポートへの接続が可能なので、SSM経由にしても直接アクセスしているのとかわらず、これまでどおり同じことが利用可能です。また、対象のプロトコルはSSH、RDPだけでなく、FTPやHTTPなど任意のポートを転送可能ですので、対象サーバの動作確認をしたりなんてことにも応用できます。
※プロトコルによっては利用できないこともあったり複数ポートを転送する必要があったりなので注意が必要です。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with.html

# まとめ
踏み台サーバを未だに利用しているケースがありますが、SSMを利用すれば殆どの場合で不要になると思います。
ぜひこの機会に乗換を検討してみてはいかがでしょうか。
排他制御

# 排他制御
```複数のタスク（プログラム）が同時に同じデータを更新```しようとしても、データに矛盾が生じないようにする機能である。

### 占有ロック
```更新処理中のプログラム以外の読み書きを一切許可しない```

### 共有ロック
```複数のプログラムが同時に読み出すことのみ（更新は不可）許可する```

### デッドロック
二つのプログラムが、お互いに相手が要求するデータ（資源）の解放を待ったまま、```永久に待ち状態から抜け出せなくなる```状態のこと

### ロック粒度
ロックをかける範囲のことで、```粒度を細かくする```と
待ちが減ることで```同時に実行できるトランザクションは増える```が、```オーバヘッド時間も増えて処理効率が悪くなる```。
一方```粒度を粗くする```と
同時に実行できる```トランザクションが減る```が、```処理効率は良く```なる。
# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8

#### オーバーヘッド時間
オーバーヘッド時間は、システムが```共有リソースを解放した所有者から取得した所有者に提供するのにかかる時間```です。理想的には、オーバーヘッド時間は、リソースがアイドル状態で無駄に消費されていないことを意味するため、```ゼロに近い値にする```必要があります。
#### 出典
https://www.isus.jp/wp-content/uploads/vtune/2020/help/GUID-AB714EB2-BD4C-11E2-927D-E02A82CB6E13.html#:~:text=%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%98%E3%83%83%E3%83%89%E6%99%82%E9%96%93-,%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%98%E3%83%83%E3%83%89%E6%99%82%E9%96%93,%E3%82%BC%E3%83%AD%E3%81%AB%E8%BF%91%E3%81%84%E5%80%A4%E3%81%AB%E3%81%99%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82,-%E3%81%97%E3%81%8B%E3%81%97%E3%80%81%E4%B8%A6%E5%88%97%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3

ITの分野では、コンピュータで```何らかの処理を行う際に、その処理を行うために必要となる付加的、間接的な処理や手続き```のことや、そのために機器やシステムへかかる負荷、```余分に費やされる処理時間```などのことをオーバーヘッドということが多い。
#### 出典
https://e-words.jp/w/%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%98%E3%83%83%E3%83%89.html#:~:text=IT%E3%81%AE%E5%88%86%E9%87%8E%E3%81%A7%E3%81%AF%E3%80%81%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%A7%E4%BD%95%E3%82%89%E3%81%8B%E3%81%AE%E5%87%A6%E7%90%86%E3%82%92%E8%A1%8C%E3%81%86%E9%9A%9B%E3%81%AB%E3%80%81%E3%81%9D%E3%81%AE%E5%87%A6%E7%90%86%E3%82%92%E8%A1%8C%E3%81%86%E3%81%9F%E3%82%81%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%A8%E3%81%AA%E3%82%8B%E4%BB%98%E5%8A%A0%E7%9A%84%E3%80%81%E9%96%93%E6%8E%A5%E7%9A%84%E3%81%AA%E5%87%A6%E7%90%86%E3%82%84%E6%89%8B%E7%B6%9A%E3%81%8D%E3%81%AE%E3%81%93%E3%81%A8%E3%82%84%E3%80%81%E3%81%9D%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB%E6%A9%9F%E5%99%A8%E3%82%84%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%B8%E3%81%8B%E3%81%8B%E3%82%8B%E8%B2%A0%E8%8D%B7%E3%80%81%E4%BD%99%E5%88%86%E3%81%AB%E8%B2%BB%E3%82%84%E3%81%95%E3%82%8C%E3%82%8B%E5%87%A6%E7%90%86%E6%99%82%E9%96%93%E3%81%AA%E3%81%A9%E3%81%AE%E3%81%93%E3%81%A8%E3%82%92%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%98%E3%83%83%E3%83%89%E3%81%A8%E3%81%84%E3%81%86%E3%81%93%E3%81%A8%E3%81%8C%E5%A4%9A%E3%81%84%E3%80%82
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">

今回、データが意思決定と戦略に与えるさまざまな影響について説明します。

# ソーシャルメディア・コンテンツの改善

まず、データ分析は、ソーシャルメディアコンテンツを改善するのに役立ちます。

### <font color="MediumBlue">オーディエンスの心に響くコンテンツは何かを知る</font>

エンゲージメントデータを測定することで、

- どのコンテンツがオーディエンスに共感されのか
- どのコンテンツがそうでないか

がわかります。また、

- 投稿の長さ
- ビジュアル
- ハッシュタグ
- トーン

などが、エンゲージメントにどのように影響するかを評価することができます。

その結果に基づいて、コンテンツ戦略を調整することもできます。

- 例えば、インフォグラフィックを含む投稿のエンゲージメントが高いというデータがあれば、今後より多くのインフォグラフィックを掲載するよう計画することができます。

### <font color="MediumBlue">競合他社を追跡する</font>

競合他社のエンゲージメントデータを追跡して、

- どのコンテンツが最もパフォーマンスが高いか
- どのプラットフォームでコンテンツが最も共有されているか
- どのインフルエンサーがコンテンツのプロモーションに最も効果的か

などの成功要因を特定することができます。その情報をもとに、自社の戦略を調整することができます。

### <font color="MediumBlue">新たなトレンドを発見する</font>

さまざまなコンテンツのシェアやリツイートなどのデータを追跡することで、ソーシャルメディア全体の新しいトレンドを発見することができます。

- 例えば、拡張現実（コンピュータで作成した画像をユーザーの現実世界の景色に重ねる技術）は、ソーシャルメディアにおける新しいトレンドで、非常にインタラクティブであるため、エンゲージメントに非常に効果的です。

このデータを分析することで、どのようなコンテンツ、製品、広告が最も関心を集めているのかを知ることができます。これにより、人々がその時々に最も興味を持っていることに関連した、リアルタイムのマーケティングコンテンツを作成することができます。

- 例えば、オーディエンスの多くが特定のニュース記事に関する投稿を共有していることがわかれば、その記事に関連するコンテンツを作成できるかもしれません。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/abe3a53a-fde6-4f2e-7608-4757668c06c7.png" width="600">

### <font color="MediumBlue">最適なプラットフォームを決定する</font>

分析により、あなたのブランドにとって最適なプラットフォームを決定するのにも役立ちます。各プラットフォームでさまざまな指標を追跡すると、そのプラットフォームでのコンテンツのパフォーマンスをよりよく理解することができます。そして、コンテンツが最もよく機能するプラットフォームに的を絞ることができます。

- 例えば、FacebookでのパフォーマンスがInstagramよりもずっと良い投稿がある場合、Facebookでは同様のコンテンツを公開し続け、Instagramのコンテンツ戦略を調整することができます。

### <font color="MediumBlue">コンテンツをカスタマイズする</font>

分析により、顧客向けにコンテンツをカスタマイズすることができます。ペルソナに基づく特定の顧客に関するデータを収集することで、顧客にカスタマイズされたコンテンツを提供することができます。

- 例えば、地元のオーディエンス向けに、地元の問題や興味、場所、天気に言及したターゲットコンテンツを作成することができます。 
 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/5f9a9b83-5651-7852-3070-ea518f46ddbf.png" width="400">

カスタマイズされたコンテンツは、エンゲージメントとコンバージョンを促進することが分かっています。なぜなら、顧客は本物で信頼できるブランドを評価し、パーソナライズされたコンテンツはそのような印象を与えることができるからです。
Kubernetes Engineの色々

# Kubernetes Engineの色々
## ●Kubernetes EngineはＧＣＰが管理するKubernetesサービスです。
　　・このサービスを使用すると、利用者はKubernetesプラットフォームを管理せずに、独自Kubernetesクラスタを作成して利用することができます。
　　・Kubernetesは仮想マシンのクラスタでコンテナを実行します。またはコンテナの場所を決定し、コンテナの正常性をモニタリングし、仮想マシンインスタンスのライフサイクル全体を管理します。

　　・Kubernetesクラスタはマスターノードと1個以上のノードから構成されてます。
　　　このノードはクラスタのワーカーです。マスタノードはクラスタを制御します。

　　・マスターノードはKubernetes　API、コントローラ、スケジューラなどサービスを管理します。
　　　クラスタでの情報のやり取りはすべて、KubernetesAPIを使用して、マスターノード経由で実行されますた。マスターノードは、ノードでアクションを実行するコマンドを発行します。ユーザはkubectlコマンドを使用して、クラスタとの通信はできます。

　　・ノードは、クラスタで実行されるワークロードを実行します。ノードは、アプリケーションを実行するように構成されたコンテナを実行する仮想マシンです。

## ●Kubernetes オブジェクト
　　ワークロードはどのように分散されるのかを理解するために、基本的な概念を理解する必要があります。
　

　特に、以下の項目は重要です。

・ポッド　</br>
・サービス　</br>
・ボリューム</br>
・名前空間
* ポッド
  　ポッドは、クラスタにおける実行中のプロセスの一つのインスタンスです。ポッドには1個以上のコン  テナは含まれます。</br>

  　ポッドは、コンテナにまたがる共有ネットワーキングとストレージを使用します。</br>
    各ポッドは一意のIPアドレスとポートの設定を取得します。コンテナはポートに接続され、複数のコンテナの場合、異なるポートに接続され、Localhostで相互に通信できます。

    ポッドによって、コンテナは分離された仮想マシン、共通ストレージ、1個のIPアドレス、ポートのセットで実行されているかのように動作することができます。このようにすると、構成を変更せずに、同じノードまたは異なるノードで、同じアプリケーションの複数のインスタンス、異なるアプリケーションの異なるインスタンスをデプロイすることができます。

    一般的に、ポッドはグループとして作成されてます。レプリカはポッドのコピーであり、一つの単位として管理されるポッドのグループです。ポッドは自動スケーリングもサポートします。</br>スケーリングと正常性をモニタリングを司るメカニズムは「コントローラ」と呼ばれています。
  
  * サービス</br>
     Kubernetesは、ポッドで実行中のアプリと、そのアプリを呼び出すほかのアプリをこのサービスによって、疎結合にすることができます。
     サービスとは、APIエンドポイントに安定したIPアドレスを割り当てるオブジェクトです。
    　ポッドが変更されると、サービスが更新され、サービスはアプリを実行しているポッドの最新リストを保持しています。

   * ReplicaSet</br>
     ReplicaSetは定義された数のポッドを維持するために使用されるコントローラです。例えば、あるポッドが異常であると判定される場合、コントローラがポッドを終了して、ReplicaSetはアプリまたはワークロードで十分な数のポッドが実行されていないことを検出し、別のポッドを作成します。
     ReplicaSetはポッドの更新や削除を行うためにも使用されます。

   * Deployment</br>
  　　Deploymentは同一のポッドのセットです。あるポッドは終了し、別のポッドが起動すると、このセットのメンバーが変わりますが、ポッドは同じポッドテンプレートを使用して作成されるため、それらは同じアプリケーションを実行するのです。Deploymentに存在すべき最小数のポッドの定義があり、ポッド数がその数を下回った場合は、ReplicaSetで呼び出すことで、新しいポッドがDeploymentに追加されます。
chatGPTを使ってみた感想

ラーメンは豚骨ラーメンが大好きな小野です。

最近話題の「chatGPT」
私もしっかりと遊んでいます。

すでにAPIを利用してアプリになっているものもありますね。
精度はまだまだですが...（GPT-4はかなり凄いそうです笑）

特にアプリを作ることはしませんが、どうなるか遊んでみました。
今回は「chatGPT」の初感について書いていきます。

## 試しにやってみた

**「完食できる二郎系ラーメンの食べ方」**

> 二郎系ラーメンは、その特徴的な大盛りと厚めの麺、濃厚なスープが人気のラーメンです。完食できるコツは以下の通りです。

> 食べる前にスープを一口飲む
> まずは、スープを一口飲んでから麺を食べると、スープの味わいをしっかりと感じることができます。また、スープを先に飲むことで、麺がスープでふやけてしまうことを防ぐことができます。

> 麺と具材を小分けにする
> 麺と具材を小分けにして食べることで、大量のラーメンを食べる際に飽きずに食べ続けることができます。また、麺を先に食べることで、麺がスープでふやけないようにすることができます。

> 水をこまめに飲む
> 二郎系ラーメンは、塩分や脂肪分が多く含まれているため、水分補給をこまめにすることが大切です。また、水分補給をすることで、お腹の中のスペースを確保し、食べ続けることができます。

> スープ割りをする
> スープが濃厚で飲み干せない場合は、スープ割りをすることがおすすめです。スープに水を加えることで、味を薄めることができ、スープを飲みやすくなります。

> ゆっくりと食べる
> 急いで食べると、お腹がいっぱいになりやすく、完食することができないことがあります。ゆっくりと食べ、味わいながら食べることで、満腹感を感じにくくなります。

### 必ずしも正しい情報が返ってくるわけではない

まだまだ嘘つきです（笑）
他の言葉で、どんな内容になるか試してみましたが、全然正確じゃない内容が返ってきました。

例えば、「都内でおすすめのラーメン屋さんを10店舗教えてください」と入れてみると、誰もが知っているチェーン店やすでに閉店済みのお店がずらっと返ってきました。

まだまだ人が欲しい情報からは、程遠い感じですねー。
**ただ、ドンピシャな答えを返すことも何回かありました！**
たまにそういうのも見れるので、数年後にはAIが作った文章が世の中に溢れることでしょう。

そういう時代になった時は、真実を見極める能力が大事になってくると思います。
「まぁ、AIで調べたらちゃんとした答え返ってくるし聞いてみるか」
というのが当たり前の時代になったら、AIが嘘を付いているかどうかを見極められないと困ります。

AIが直接騙してくることはないでしょうが、AIを悪用する人は絶対出てくるでしょう。
最近のニュースなどを見ていると、結局ツール自体に善悪はなく、使う人に善悪があるので。

https://www.youtube.com/watch?v=kJRrn_tgxy8
Googleデジタルマーケティング＆Eコマース：ソーシャルテスト（A/Bテスト・多変量テスト）

# はじめに

”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">

# ソーシャルテスト

***<font color="MediumVioletRed">『ソーシャルメディアコンテンツがターゲット・オーディエンスの間でどのように機能しているかを示す実験的なプロセスのこと』</font>***

ソーシャルテストが重要なのは、他のタイプのマーケティング分析と同様に、ブランドのソーシャルメディアのパフォーマンスとオーディエンスの好みについてデータに基づく洞察を提供するためです。ソーシャルメディアマーケターはソーシャルテストを利用して、どのコンテンツが効果的か、どのタイプの投稿が最もオーディエンスの関心を集めるか、効果的なタイプの投稿にどのように予算を割り当てるかを判断します。

ソーシャルテストにはいくつかの種類があります。どのタイプを使用するかは、ブランドのビジネス目標によります。目標が明らかになれば、どのタイプのソーシャルテストが最も効果的に必要な情報を明らかにするのに役立つかを判断することができます。


### <font color="MediumBlue">A/Bテスト（A/B testing）</font>

A/Bテストでは、1つの変数が異なる2つのバージョンの投稿を比較します。

例えば、Webサイトのトラフィックを増やす方法をテストするために、ユーザーをホームページに送る2つの有料ソーシャルメディア広告を実行することができます。広告は、1つの変数を変更する以外は、まったく同じにすることができます。

- 1つの広告には、人気曲の引用を含む見出しがある。
- もう1つの広告にはない。

オーディエンスが人気曲の引用を含むバージョンを、もう一方のバージョンよりも頻繁にクリックした場合、あなたは将来的にポップカルチャーの参照を使用してより自信を感じるかもしれません。

### <font color="MediumBlue">多変量テスト（Multivariate testing）</font>

多変量テストは、いくつかの異なる変数を持つ2つ以上のバージョンの投稿を比較します。

例えば、あなたが作成した広告の異なるバリエーションが互いにどのように作用するかを調べるために、4つの異なるバージョンを作成することができます。

- バージョン1では、キャプション付きの画像を使用します。
- バージョン2は、画像の代わりにGIFを使用し、異なるキャプションを付ける。
- バージョン3は、異なるコピーと異なる配色を含み、
- バージョン4では、配色を変更し、2番目のバリエーションで使用したGIFを含むかもしれません。

# ソーシャルテストの結果

ソーシャルテストで非常に重要なのは、テスト完了後に得られる結果です。結果を正しく評価し、統計データに基づいた結論を導き出すことは、今後のソーシャルメディア・キャンペーンや戦略にとって重要です。

十分な結果を得るためには、テストを何度か実行することを検討してください。

- 1週間
- 1ヶ月
- それ以上

の期間テストを実施し、オーディエンスが何を好み、何を好まなかったかを観察するとよいでしょう。テストを重ねれば重ねるほど、より確かな結果を得ることができます。

また、どの変数を変更するかを慎重に選択することも重要で、そうすることで結果から学び、戦略を最適化することができます。
grub にカーネル起動パラメーターを追加する

イマドキは /boot 内の grub.cfg を直接触らないんだ。令和なやりかたをやってみる。

# 環境


- Ubuntu 22.04 LTS

# やりかた


`iommu=pt` を追加したい。


https://gihyo.jp/admin/serial/01/ubuntu-recipe/0743
これを元に、以下のようにやってみる。

```
$ grub-editenv - list
```

何も出てこないので、何も設定されていないということらしい。


パラメータを設定する


```
$ sudo grub-editenv - set  iommu=pt
```
こうすると、以下のように設定される。


```
$ grub-editenv - list
iommu=pt
```

これが実際には、/boot/grub/grubenv に以下のように書かれるらしい。



```
# GRUB Environment Block
# WARNING: Do not edit this file by tools other than grub-editenv!!!
iommu=pt
next_entry=
#############################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################
```
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">

# ソーシャルメディア分析ツール

ソーシャルリスニングを行うためのツールがあるように、分析のためのツールもあります。ソーシャルメディア分析ツールによって、ブランドはトレンドを特定し、全体的なパフォーマンスを最適化するための実行可能な洞察を得ることができます。

ソーシャルメディアには毎日多くの消費者データが投稿されるため、ソーシャルメディア分析ツールは、オーディエンス分析、競合調査、製品調査において重要な要素になっています。データとインサイトを収集することで、企業は自社ブランドに関する情報を入手し、ビジネス上の意思決定を行うことができます。

以下に、業界で信頼されているソーシャルメディア分析用のツールをいくつかご紹介します。

### Sprout Social

[Sprout Social](https://sproutsocial.com/)はクロスチャネルのソーシャルメディア分析ツールで、すべてのソーシャルメディアチャネルでパフォーマンスを比較することができます。自社のソーシャルメディアアカウントが互いにどのような評価を受けているかを確認し、どれにもっとエネルギーと予算をかけるべきか、どのプラットフォームで成功を収めたかを判断することができるのです。

Sprout Socialでは、データをレポートにまとめることもできるので、チームメンバーに進捗状況をシームレスに伝えることができます。

### Google Analytics

Google Analyticsはソーシャルメディア分析だけのツールではありませんが、ソーシャルメディア分析に統合すると、Webサイトがソーシャルメディアからどれだけのトラフィックを受けているかを追跡することなどに使用することができます。

### Keyhole

ソーシャルメディアチャンネルに投稿する際、ハッシュタグを使用することが戦略の重要な一部であると判断されるかもしれません。その場合、キャンペーンに関連するあらゆるハッシュタグのパフォーマンスレポートをリアルタイムで提供するKeyholeのようなツールが便利です。

### TapInfluence

TapInfluenceは、特にブランドがインフルエンサーマーケティングキャンペーンを追跡するのに役立つ独自の機能を提供します。TapInfluenceでは、個々のインフルエンサーのエンゲージメント、リーチ、投資対効果を追跡することができます。 各インフルエンサーの典型的なリーチとエンゲージメントを確認することで、パートナーシップを構築するためにアプローチするかどうかを判断することができます。
バイナリ形式VTKファイルの出力

# はじめに
バイナリ形式でvtkファイルを出力する方法をまとめています。
アスキー形式よりもバイナリ形式のほうが読み込みが速いので、大規模計算結果の可視化の際にはバイナリ形式の使用を検討してみても良いかもしれません。

# バイナリ形式VTKファイルの一例
バイナリ形式VTKファイルのサンプルコード(4x4x4の直方体メッシュを可視化するファイル)を次に示します[^1]。
ここでは、バイナリ形式のデータをファイル末尾に記述するappend方式を採用しています。

```xml
<VTKFile type="UnstructuredGrid" version="0.1"  byte_order="LittleEndian">
    <UnstructuredGrid>
        <Piece NumberOfPoints="125" NumberOfCells="64">
            <Cells>
               <DataArray type="Int32" Name="connectivity" format="appended" RangeMin="" RangeMax="" offset="0" />
               <DataArray type="Int32" Name="offsets" format="appended" RangeMin="" RangeMax="" offset="2052" />
               <DataArray type="UInt8" Name="types" format="appended" RangeMin="" RangeMax="" offset="2312" />                
            </Cells>
            <Points>
               <DataArray type="Float32" NumberOfComponents="3" format="appended" RangeMin="0" RangeMax="1e10" offset="2380" />;
            </Points>
        </Piece>
    </UnstructuredGrid>
    <AppendedData encoding="raw">
    _NNNN????????????????????????????????????NNNN?????????????????????????????....
    </AppendedData>
</VTKFile>
```
サンプルコードを観察すると、ヘッダ部分(UnstructuredGrid要素で囲まれた領域)とデータ部分(AppendedData要素で囲まれた部分)の2つに分かれていることがわかります。以下でそれぞれの役割について記載します。

## ヘッダ部分について
ヘッダ部分では、可視化に必要な変数のデータサイズや名前を定義します。今回はappend方式を採用していることから、format属性でのappendタグの指定、offset属性でのオフセット値の指定が必要となります。
ここで、データ部分では変数ごとに総バイト数およびデータの中身をセットで記述することから、オフセット値は「4バイト+総バイト数」のように計算する必要があります。サンプルコードではconnectivity、offsets、types、pointsの4変数を定義していますが、各変数のオフセットは下記の表のように計算することができます。pointsの後に別変数を定義する場合にも、同様の方法でオフセット値を計算します。

|変数名|オフセット|データサイズ|総バイト数(4バイト分含む)|次変数のオフセット|
|----|----|----|----|----|
|connectivity|0byte|4bytes|2052bytes(=4bytes+512x4bytes)|2052bytes|
|offsets|2052bytes|4bytes|260bytes(=4bytes+64x4bytes)|2312bytes|
|types|2312bytes|1byte|68bytes(=4bytes+64x1byte)|2380bytes|
|points|2380bytes|4bytes|1504bytes(=4bytes+375x4bytes)|3884bytes|

## データ部分について
データ部分では、ヘッダ部分で定義した変数の値をバイナリ形式で記述します。encoding属性ではrawタグを指定します[^2]。
続けてデータをバイナリ形式で記述しますが、下記の2点に注意する必要があります。
(1) 全データの先頭に「_(アンダーバー)」を記述すること(ただしアンダーバー分のバイト数はオフセット計算時に考慮しなくてよい)
(2) 各変数の先頭に総バイト数を4バイトで記述すること(サンプルコード中の「NNNN」がこれに相当)

サンプルコードを例にとると、下記のようになります。
```xml
_NNNN????????????????????????????????????NNNN?????????????????????????????....
↑  ↑  ↑                                    ↑  ↑
|  |  |                                    |  └ offsetsのデータ中身(バイナリ、256バイト)
|  |　|                                    └ offsetsの総バイト数(バイナリ、4バイト)
|  |  └ connectivityのデータ中身(バイナリ、2048バイト)
|  └ connectivityの総バイト数(バイナリ、4バイト)
└ アンダーバー
```

# 可視化
サンプルコードをparaviewで読み込むと、次のように可視化することができます。
![output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1751984/2e48650e-b7f7-a6f4-51aa-75a3bd032887.png)

# 参考
[^1]: [vtkファイルフォーマット（バイナリ形式）](https://bigvalley.hatenablog.com/entry/2016/02/03/160414) 
[^2]: [XMLベースのvtk形式に関する覚書](https://qiita.com/hsimyu/items/a8fba8866c5f5c2d8b78)
Apple SiliconでのOpenJDK8のインストール（Azul Zulu JDK）

## はじめに
職場でJDK8指定のリポジトリがありインストールする必要があったのですが、会社PCがMacのM2チップでOracleのJDK等が対応してなかったので、Apple Siliconだった場合のインストール方法をまとめておきます。今回はAzul社が提供しているZuluというOpenJDKをインストールします。かつてはAzul Zulu for AzureというAzure用のJDKがMicrosoftとAzulの戦略的パートナーシップにより提供されていたそうですが、今は提供が終了しています。ZuluのJDK自体は現在も提供されていてM1・M2チップにも対応しているということでこちらをインストール。設定後に気づいたのですがAmazonのJDKにもM1・M2対応のOpenJDK8があったので、こちらでも良いかもしれません。([Amazon Corretto](https://docs.aws.amazon.com/corretto/latest/corretto-8-ug/macos-install.html))時間がある時にこちらの記事も投稿できればと思っております。

## 環境
|項目|バージョン|
| ---- | ---- |
|OS|macOS Monterey 12.6.3|
|プロセッサ|Apple M2|
|OpenJDK(8)|1.8.0_362|

## インストール手順
### Zuluの公式ページを開く
[Zulu公式ページ](https://www.azul.com/downloads/?version=java-19-sts&package=jdk)
![zulu_top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/d59a9498-c622-8542-91a5-8d350ee38db6.png)

### インストールしたいJDKのバージョンを入力
下にスクロールすると以下の検索欄があるのでインストールしたいJDKの情報を入力。[ショートカット](https://www.azul.com/downloads/?version=java-19-sts&package=jdk#download-openjdk)
![zulu_jdk_form_empty.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/28f2c52d-6010-5455-812a-9b434e5eb649.png)

今回はOpenJDKの8をインストールしたいので以下のように入力
![zulu_jdk_form_selected.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/7d0d4d8a-5de7-5980-a2c4-8414d43c026e.png)

### インストーラーのダウンロード
検索欄に情報を入力するとJava 8が絞られていますのでインストーラーをダウンロードします。zipやtar.gzもありますが、手軽なdmgをインストールします。
![zulu_jdk_8_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/9ef6614b-e858-1d57-a294-55be7648defc.png)

### インストールの開始
dmgのインストーラーをダブルクリックすると以下のウィンドウが表示されますので、pkgのアイコンをダブルクリックしてインストールを開始します。
![zulu_install_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/78fbb5a9-c025-ebf9-d187-90c2dc284c6d.png)

「続ける」をクリックします。
![zulu_install_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/f077e66e-d010-ebf5-152e-bf7184d8e193.png)

「インストール」をクリックします。
![zulu_install_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/c188f58d-3f86-a3db-942c-69b75ffb92a8.png)

端末のIDで認証します。
![zulu_install_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/90ebe3bd-28f1-12c8-fd46-178f9226ef6d.png)

インストールが完了するので閉じます。
![zulu_install_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/f1933c64-83f1-adce-0b03-b850b00128b7.png)

### インストールの確認
ターミナル上で以下のコマンドを実行し、JDKがインストールされていることを確認します。
```
$ java -version
openjdk version "1.8.0_362"
OpenJDK Runtime Environment (Zulu 8.68.0.21-CA-macos-aarch64) (build 1.8.0_362-b09)
OpenJDK 64-Bit Server VM (Zulu 8.68.0.21-CA-macos-aarch64) (build 25.362-b09, mixed mode)
```
## 参考
[Microsoft Build of OpenJDK について (Azul Zulu for Azure リタイアに伴う移行パス)](https://www.nobtak.com/entry/mb01)
Ubuntu でアップデートで問題の発生したカーネルを旧カーネルに戻す

イマドキは /boot にある grub.cfg は直接触らないらしい。
仕組みを調べて試してみる。

# 環境

- Ubuntu 22.04 LTS


# grub の構成

/etc/default/grub は以下のようになっている。

```
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
.
.
.
```

```
$ sudo grep menuentry /boot/grub/grub.cfg
```
とすると

```
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-c93329a3-e409-45c4-ae63-9a5608a32d05' {
	menuentry 'Ubuntu, with Linux 5.19.0-35-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.19.0-35-generic-advanced-c93329a3-e409-45c4-ae63-9a5608a32d05' {
	menuentry 'Ubuntu, with Linux 5.19.0-35-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.19.0-35-generic-recovery-c93329a3-e409-45c4-ae63-9a5608a32d05' {
	menuentry 'Ubuntu, with Linux 5.19.0-32-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.19.0-32-generic-advanced-c93329a3-e409-45c4-ae63-9a5608a32d05' {
	menuentry 'Ubuntu, with Linux 5.19.0-32-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.19.0-32-generic-recovery-c93329a3-e409-45c4-ae63-9a5608a32d05' {
	menuentry 'Ubuntu, with Linux 5.15.0-60-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.0-60-generic-advanced-c93329a3-e409-45c4-ae63-9a5608a32d05' {
	menuentry 'Ubuntu, with Linux 5.15.0-60-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.0-60-generic-recovery-c93329a3-e409-45c4-ae63-9a5608a32d05' {
menuentry 'UEFI Firmware Settings' $menuentry_id_option 'uefi-firmware' {
```

今動いているのは  `'Ubuntu, with Linux 5.19.0-35-generic'`、  `'Ubuntu, with Linux 5.15.0-60-generic'` を動かすようにしたい。


# 作業

```
$ sudo vim /etc/default/grub
```

として、

```
GRUB_DEFAULT="1>4"
```

としました。これは、2番目のメニュー内の5番目のサブメニューの選択を示しています(数字はゼロスタートです)。


反映は

```
$ sudo update-grub
```

再起動して
```
$ uname -a
Linux nanbuwks-B550M-S2H 5.15.0-60-generic #66-Ubuntu SMP Fri Jan 20 14:29:49 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
```

うまくいったようです。

# うまくいかなかった例!

```
GRUB_DEFAULT='Ubuntu, with Linux 5.15.0-60-generic'
```

としたら、うまくいきませんでした。シングルクォーテーションがダメだったかな?
M2 MacbookProにHomebrew導入する

# Homebrewとは
MacOSまたはLinux用のパッケージ管理ツールです。システムが提供していない開発などで必要なパッケージなどを手軽にインストールできる。

https://brew.sh/

# 環境

- MacOS Ventura 13.2.1
- Apple M2 Pro
- XCode Version 14.2

# インストール
公式のレポジトリがあるのでそのままインストールを進めます。

```shell
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

確認する。
```
$ brew -v
Homebrew 4.0.6
```
バージョンが4.0.6(2023-03-17時点)です。

# アンインストール
クリーンインストールしたい場合は一度アンインストールしてから再インストールしてもよい。

```shell
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"
```

すでにインストール済みの場合、アップグレードは以下コマンドを実行する。
```shell
$ brew upgrade
```
インストールに関しては以下を参照して進めてください。

https://github.com/homebrew/install

# まとめ
HomebrewもAppleシリコンに対応しているようです。よかった :smile:
[競プロ][Leetcode2589] ジョブ実行時間の最小化

# 概要

ジョブ実行時間の最小化問題を下記の問題を元に解説する
[2589. Minimum Time to Complete All Tasks](https://leetcode.com/problems/minimum-time-to-complete-all-tasks/)

# 問題の要約

無限にジョブを並列実行可能なコンピュータがあるとする。
ある期間の間に実行する必要のあるジョブが複数与えられる。
コンピュータの実行順序を最適化すると最小実行時間はいくつになるか。

# 考え方

直感ではジョブの実行時間が重なっているほど効率的に計算が可能。
なのでできるだけジョブの実行時間が重なるように実行順序を考える。

1. ジョブの実行優先度はそのジョブの最終実行可能時間で決まる。
(一番優先度の高いジョブは一番最初に完了させる必要のあるジョブ)
なのでまずはジョブの最終実行可能時間でソートすることが重要。

2. 実行ジョブを選んだ後はそのジョブをどの時間帯で実行させるかが重要になる。これはそのジョブの実行が遅ければ遅いほど良い。なぜなら遅いほどその次のジョブと実行時間が重なる可能性が高くなるため。

# 実装

```c++
int findMinimumTime(vector<vector<int>>& tasks) {
        sort(tasks.begin(), tasks.end(), [&](auto& t1, auto& t2) {
            if (t1[1] == t2[1]) {
                return t1[0] < t2[0];
            }
            return t1[1] < t2[1];
        });

        int ans = 0;
        vector<bool> executed(tasks.back()[1]+1, false);
        for (auto& task: tasks) {
            // 実行時間
            int remaining_time = task[2];
            // 実行済みの時間があれば実行時間から引く
            for (int i=task[0]; i<=task[1]; i++) {
              if (executed[i]) remaining_time--;
            }
            // 一番遅い実行可能時間から実行していく
            int executing_time = task[1];
            while (remaining_time > 0) {
              if (!executed[executing_time]) {
                executed[executing_time] = true;
                remaining_time--;
                ans++;
              }
              executing_time--;
            }
        }

        return ans;
    }
```
Q:最近、仕事が不安定で収入が減ったので経済的な不安を感じています。どうすれば良いですか？

Q:最近、仕事が不安定で収入が減ったので経済的な不安を感じています。どうすれば良いですか？
A:そのような状況はストレスを引き起こすことがよくありますが、今後のことを考えて焦らずに対処しましょう。予算を立てて支出を見直し、ネットワークを活用して新しい仕事の機会を探すことをお勧めします。

Q:急な出費があり、今月の生活費が足りません。どうしたらいいですか？
A:まず、必要な出費について再評価することから始めましょう。節約することも考えて、食費を抑えたり、節約術を見つけましょう。また、家族や友人から借金することも一つの方法です。

Q:うまく貯金できず、将来が不安です。どうすればよいでしょうか？
A:貯蓄をするためには、支出を抑えることと同時に、収入を増やすことが重要です。副業を探してみたり、投資について学んでみることもお勧めです。また、定期的な節約にも取り組みましょう。

Q:お金がなくて旅行に行けません。どうしたらいいですか？
A:旅行はお金がかかるものです。まずは今回は諦め、将来のために貯蓄を頑張ってみるのはいかがでしょうか？ 節約術を見つけて、自分に合った投資を見つけることもお勧めです。

Q:クレジットカードの借金が増えて困っています。どうすればいいですか？
A:まず、カードの利用を控えることをお勧めします。そして、現在の借金を返済するために、返済計画を立てることが必要です。返済しながら、収入を増やすために副業を始めたり、他の支出を見直して節約することも考えましょう。

Q:貯蓄が少なく、予期せぬ出費に対応できません。どうしたらいいですか？
A:出費を抑えるために、節約することが重要です。予定外の出費に対応するために、緊急の貯蓄を作っておくこともお勧めです。また、収入を増やす方法について考えることも重要です。

Q:今月は収支がプラスマイナスゼロで、次月固定費が増えるため不安です。どうしたらいいですか？
A:支出計画を立てることが大切です。節約する方法を探し、収入を増やすために副業を探してみましょう。また、借金をしてまで支払う必要のないものは、今回は諦めることも考えられます。

Q:家計が苦しく、子供の教育費の支払いが心配です。どうすればいいですか？
A:重要な支出は教育費です。まず、教育費にかかる費用を把握し、返済計画を立てましょう。また、副業で収入を増やして負担を減らすこともできます。

Q:退職して収入が減ったので、生活が苦しいです。どうすればいいですか？
A:予算を再評価し、必要な支出を限定することをお勧めします。また、退職後に新しい収入源を見つけるために、資格を取得することや副業を始めることも考えましょう。

Q:病気や怪我で仕事に行けず、収入が減って困っています。どうしたらいいですか？
A:病気や怪我に対応するために、公的な支援制度を活用することが大切です。また、仕事を見つけて収入を増やすこともお勧めです。

Q:自己破産をしてしまいました。次にどうすればいいですか？
A:自己破産は一生付き合っていかなければならない問題です。先ずは借金を作らないことが最優先です。その上で、安定した生活を送るために副業を始めることや検討してみることも必要です。

Q:借金が返せず、今後の人生が不安です。どうすればいいですか？
A:状況を正確に把握し、借金の返済計画を立てることが必要です。その上で、節約することを始め、副業で収入増加をすることも検討してみましょう。また、専門家のアドバイスも必要かもしれません。

Q:家計が苦しいので、買い物ができず生活が不便です。どうしたらいいですか？
A:まずは節約することから始めましょう。食品ロスを減らしたり、クーポンを利用することができます。また、必要であれば、フードバンクなどの支援サービスを利用することも検討してみましょう。

Q:夫婦で収入が減ったため、家計が苦しいです。どうしたらいいですか？
A:まず、今一度予算を見直し、必要な支出について再評価することから始めましょう。また、節約する方法を探し、副業を始めて収入を増やすこともお勧めです。

Q:サラリーマンとして働きながら、副業を始めたいと思っています。何を始めたら良いですか？
A:自分の得意なこと、趣味などを活かした副業がおすすめです。また、現在の職場でできることを見つけることも重要です。どんな副業でも収入が安定していることが大切です。

Q:昇給やボーナスがなく、収入が増えません。どうしたらいいですか？
A:収入を増やすために、他の会社に転職することを考えることも一つの方法です。また、副業を始めることも検討してみましょう。自己投資に有益な資格を取得することもお勧めです。

Q:生活費がかさみ、借金が増えて困っています。どうしたらいいですか？
A:まず、必要な支出について再評価し、支出を抑えることを考えましょう。また、借金の返済計画を立て、副業を始めて収入を増やすこともお勧めです。たとえ少しずつでも貯蓄をして、未来のための備えをしましょう。

Q:住宅ローンが返せず、そのまま放置してしまいました。どうしたらいいですか？
A:そのような場合は、早急に銀行などの関係機関に相談しておくことが重要です。返済期限を過ぎると、債務不履行になることもあるため、相談窓口に相談することをお勧めします。

Q:生活費を節約したいのですが、何が効果的でしょうか？
A:食費を抑えることが一番効果的です。

---
貴方も相談できます。
https://lin.ee/dJISiPX
pgAdminのHomebrewでのインストール

## 環境
|項目|バージョン|
| ---- | ---- |
|OS|macOS Monterey 12.6.3|
|プロセッサ|Apple M2|
|Homebrew|4.0.4|
|PostgreSQL|11.19|
|pgAdmin4|6.19|

## インストール手順
### HomebrewでインストールできるpgAdminの確認
```
$ brew search pgadmin
```

### pgAdminのインストール
2023/3/3現在はpgadmin4のみなので、こちらをインストール。
```
$ brew install pgadmin4
```

### pgAdminの起動
LaunchpadにpgAdminがあるはずなので、それを起動する。
![pgAdmin_icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/fba0e273-9ffe-258c-7e7b-9af2042c2e65.png)

以下の通り起動される。
![pgAdmin_toppage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/977ddb71-915e-7f73-5e19-2bfc81df7bb4.png)

マスターパスワードを設定するか聞かれるが、特に設定が不要であればキャンセルでよい。

## 参考
[【Mac&Homebrew】PostgreSQLのインストール方法とpgAdmin4を使った接続方法を丁寧に説明！](https://ai-trend.jp/programming/db/postgre-mac-install/)
Git & GitHub まとめてみた

# git とは
## バージョン管理システムのこと
 - バージョン管理：変更履歴を保存・管理すること
 - 目的：**任意の状態にファイルを戻せるようにするため**
 - 利用機会
     - ① 変更したけど、前の状態に戻したい！➡︎すぐに戻せる
     - ② いつ・誰が・どんな変更をしたか分かる➡︎ 複数人での共同開発が可能！！
 - gitを使わないとどうなるのか？
     - → 変更 ➡︎ 保存 ➡︎ やっぱ前の状態に戻したい ➡︎ 手作業で戻す ＝ **human errorの原因…**
     - → 変更後、随時ファイル保存してバージョン管理 ＝ **ファイルの数が膨大に＆ファイルの命名ミス➡︎正確なバージョン管理✖︎**
  - ➡︎ git を使わないことで多くの不都合が起こりやすくなる！

## gitのイメージ
- **スナップショット**： 一場面を切り取ったもの
<<写真>>
■ git = 変更履歴を保存・管理
→ 変更履歴をスナップショットとして保存
→ スナップショット・・・＋αデータ：変更日時・変更者を保存する
→ 「**いつ・誰が・どのファイルに・どんな変更をしたか**」がわかる！！


## 変更時のファイルの移り変わり/開発フロー
1.  ワークツリー：**ソースコードを編集するファイルがある、 Git管理下のディレクトリ**
　→　ファイルの変更をするディレクトリ（別名：作業ディレクトリ・ワーキングツリー）
1.  ステージングエリア（別名：インデックス）：**コミット前にスナップショットを配置する領域**
　→ ワークツリーから直接、ローカルリポジトリにいかない。
　→ 「add」して初めて、Git 管理下にファイルを移動させられる
1.  リポジトリ：**ステージングエリアのスナップショットを保存する領域**
　＝　コミットを記録する領域
　→ ローカルリポジトリ：それぞれのPCにあるリポジトリ（localのスナップショットを保存する領域）

<<写真>>

※ ステージングエリア＆ローカルリポジトリ＝ワークツリー内部にある領域
　→ 構造：ワークツリー　▶︎ **.git**　▶︎ ステジングエリア・ローカルリポジトリ（**.git配下にあるファイルのみgitのバージョン管理対象になる**）
※ 「コミット」2つの意味
① ステージングエリア　→ ローカルリポジトリ　：スナップショットを登録すること
② ローカルリポジトリにあるスナップショットそのもの


## 「ステージングエリア」の存在意義
■ Git の考え方：**コミット履歴は綺麗な方が良い**
→ 理由：コミットが綺麗 ＝ **任意の変更地点に戻りやすくなるから**
→ 「コミットが綺麗」とは：　**一つの変更目的＝一つのコミット**
<<写真>>
<table>
    <caption>ステージングエリアの流れ</caption>
        <thead>
            <tr>
                <th>流れ</th><th>領域</th><th>状態</th>
            </tr>
            <tr>
                <th>［１］</th><td>ワークツリー</td><th>それぞれの目的で変更したスナショが多数</th>
            </tr>
            <tr>
                <th>［２］</th><td>ワークツリー→ステージングエリア</td><th>ある目的で変更した一つのスナップショットを add</th>
            </tr>
            <tr>
                <th>［３］</th><td>ステージングエリア→ローカルリポジトリ</td><th>ある目的で変更した一つのスナップショットのみ保存</th>
            </tr>
            <tr>
                <th>［４］</th><td>［２］［３］繰り返し</td>
            </tr>
        </thead>
</table>
▶︎ ステージングエリア　ある
　→ **一つ一つの変更履歴がどういう目的で行われたのか明確になる**

▶︎ ステージングエリア　なし
　→ ワークツリーにあるすべてのスナップショットがローカルリポジトリに登録される
　→ **どういう目的でどういう変更がなされたのか分からなくなる**


# Git を使う
## Gitをはじめる　→ ユーザー名＆メアド登録　なぜ？
共同開発時する際：誰がコミットしたの？→他のユーザに伝えるため
## gitconfig(アカウント作成に使うコマンド)の基本
- 参考
    - https://qiita.com/C_HERO/items/c35e679f0b03a5f06469
        - → **-- system/global/local オプション** 違いと使い分け
    - https://www.sejuku.net/blog/72246
        - → **gitconfigコマンドの説明**
PostgeSQLのHomebrewでのインストール

# PostgeSQLのHomebrewでのインストール
## 環境
|項目|バージョン|
| ---- | ---- |
|OS|macOS Monterey 12.6.3|
|プロセッサ|Apple M2|
|Homebrew|4.0.4|
|PostgreSQL|11.19|

## インストール手順
### HomebrewでインストールできるPostgreSQLの確認
```
$ brew search postgre
```

### PostgreSQLのインストール
Version11の指定があったため、version11をインストール
```
$ brew install postgresql@11
```

### PATHの設定
筆者はzshを使用しているため、zshの設定ファイルにPATHを設定する。
```
$ echo 'export PATH="/opt/homebrew/opt/postgresql@11/bin:$PATH"' >> ~/.zshrc
$ source ~/.zshrc
```

### インストールの確認
```
$ psql --version
psql (PostgreSQL) 11.19
```

### PostgreSQLの初期化
```
$ sudo initdb /usr/local/var/postgres -E utf8
```

### PostgreSQLの起動
```
$ brew services start postgresql@11
```

### デフォルトのデータベースへアクセスする
```
$ psql -h localhost -p 5432  postgres
```

### スーパーユーザを作成する
```
postgres=# create user postgres with SUPERUSER;
CREATE ROLE
```

### スーパーユーザでログインできるかどうか確認する
```
postgres=# \q
$ psql -h localhost -p 5432 -U postgres
psql (11.19)
Type "help" for help.
postgres=#
```

ログインが確認できたら完了。

## 参考
[【PostgreSQLをMacで使う方法】インストールから基本的な使い方まで紹介します](https://amateur-engineer.com/postgresql-mac-install/)
[【macOS】PostgreSQLのインストール&設定手順](https://saki-htr.hatenablog.com/entry/2020/10/22/132759)
グラフの種類とその特徴

タイトル：グラフの種類とその特徴

はじめに

グラフは、数学やコンピュータ科学、工学、社会科学などの分野で広く用いられるデータ構造です。グラフには様々な種類があり、それぞれ異なる特徴や応用が存在します。この記事では、無向グラフ、有向グラフ、重み付きグラフ、二部グラフなどのグラフの種類を解説し、その特徴や応用について説明します。

第1章：グラフの基本概念

1.1 グラフの定義

グラフは、頂点（ノード）と辺（エッジ）の集合で構成されます。頂点は、オブジェクトやアイテムを表し、辺は、それらの関係性や相互作用を示します。グラフは数学的には、頂点の集合Vと辺の集合Eからなる組G=(V, E)として定義されます。

1.2 隣接と次数

グラフ上で、ある頂点から辺をたどって直接結ばれている頂点を隣接頂点といいます。また、ある頂点に接続されている辺の数をその頂点の次数といいます。

第2章：グラフの種類と特徴

2.1 無向グラフ

無向グラフは、辺に向きがないグラフです。無向グラフでは、頂点間の関係性は対称的で、ある頂点Aから頂点Bへの辺が存在する場合、逆に頂点Bから頂点Aへの辺も存在します。無向グラフは、友人関係や無向ネットワーク、化学構造など、向きのない関係性を表すのに適しています。

2.2 有向グラフ

有向グラフは、辺に向きがあるグラフです。有向グラフでは、頂点間の関係性は非対称的で、ある頂点Aから頂点Bへの辺が存在しても、必ずしも頂点Bから頂点Aへの辺が存在するわけではありません。有向グラフは、ウェブページのリンク構造やソーシャルネットワークのフォロー関係、一方通行の道路ネットワークなど、向きのある関係性を表すのに適しています。

2.3 重み付きグラフ

重み付きグラフは、辺に重みが付与されたグラフです。重みは、頂点間の関係性の強さやコスト、距離などを表します。重み付きグラフは、交通ネットワークの最短経路問題や最小全域木問題、最適化問題など、辺に特性を持たせることが重要な問題に適しています。

2.4 二部グラフ

二部グラフは、頂点集合を2つの互いに素な部分集合に分割し、異なる部分集合の頂点間にのみ辺が存在するようなグラフです。二部グラフは、異なる2つのカテゴリ間の関係性を表すのに適しており、バイパーティットマッチングや最大流問題などのアルゴリズムが適用されます。

第3章：グラフの応用例

3.1 無向グラフの応用例

無向グラフは、友人関係や無向ネットワーク、化学構造などの分野で利用されています。また、クラスタリングやコミュニティ検出、最小全域木問題などのアルゴリズムが無向グラフ上で適用されます。

3.2 有向グラフの応用例

有向グラフは、ウェブページのリンク構造やソーシャルネットワークのフォロー関係、一方通行の道路ネットワークなどで利用されています。さらに、トポロジカルソートや強連結成分分解、最短経路問題などのアルゴリズムが有向グラフ上で適用されます。

3.3 重み付きグラフの応用例

重み付きグラフは、交通ネットワークや通信ネットワーク、遺伝子相互作用ネットワークなどで利用されています。重み付きグラフ上でのアルゴリズムとしては、ダイクストラ法やベルマンフォード法、プリム法やクラスカル法などがあります。

3.4 二部グラフの応用例

二部グラフは、仕事と労働者の割り当て問題や、学生とプロジェクトのマッチング問題などで利用されています。また、ハンガリアン法や最大流問題などのアルゴリズムが二部グラフ上で適用されます。

まとめ

グラフ理論は、数学やコンピュータ科学、工学、社会科学など幅広い分野で応用されています。本記事では、無向グラフ、有向グラフ、重み付きグラフ、二部グラフなどの主要なグラフの種類とそれぞれの特徴について解説しました。また、各種グラフの応用例や関連するアルゴリズムも紹介しました。

グラフの種類によって適用される問題やアルゴリズムが異なりますが、これらの理解を深めることで、より効果的な問題解決が可能となります。さらなる発展や応用が期待されるグラフ理論は、これからも様々な分野で重要な役割を果たし続けることでしょう。
ChatGPTのAPIの返答を、Unityでもリアルタイムで一文字ずつ表示できるようにしてみた

# 概要
ChatGPTってChatGPTのサイトだと、以下のように返答が逐次的に表示されるじゃないですか。
<iframe width="560" height="315" src="https://www.youtube.com/embed/Xo4930T9zH0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

でもChatGPTのAPIを使用するといくらか待った後に、一気にぱっと表示されてしまう。
ストリーミングで送られてこないから時間がかかって、あんまり会話している感じがしない。
UnityでもChatGPTのUIのようにリアルタイムで会話したい！


ということで、Unity上でも同じようにリアルタイムに会話できるようになったのが以下の動画です。
<iframe width="560" height="315" src="https://www.youtube.com/embed/qgg-I83txr0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

逐次的に表示されているから、めちゃくちゃ返答が早いし会話しているように話せる！
今回の記事はこの逐次的な表示をどう作ったか、という説明と、この機能を自分のアプリにアップデートしたよ！　という報告です。

上の動画で映っているアプリは今週自分がGoogle Playに公開した以下のアプリです。
どんな感じか試してみたい方は無料でインストールできるので、是非使ってみてください。

使い方の紹介記事：[見た目や話し方を自由に設定して、AIキャラと音声で話せるアプリを公開した！](https://qiita.com/mfuji3326/items/cba068d1497a3c9099b8)
公開場所：[Google Store MakeYourFriend ～AIキャラ作成・体験ツール～](https://play.google.com/store/apps/details?id=com.Gyokuro.MakeYourFriend)

# 参考記事
[【Python】ChatGPT APIでウェブサイト版のように返答を逐次受け取る方法](https://qiita.com/Cartelet/items/cfc07fc499b6ebbc7dde)
# 作り方
実はChatGPTのAPIのドキュメントをよく読んでみると、[APIのパラメータ](https://platform.openai.com/docs/api-reference/chat/create#chat/create-stream)にstreamについての記述が存在しています。
こういうものです。
```
stream boolean Optional Defaults to false
設定されている場合、ChatGPTのように部分的なメッセージのデルタが送信されます。
トークンは、データのみのサーバー送信イベントとして、利用可能になると送信され、ストリームはデータによって終了します。
[DONE]メッセージでストリームを終了します。
サンプルコードについては、OpenAI Cookbookを参照してください。
```

ここでいうストリーミングとは、「インターネット上の動画や音声などのデータをダウンロードしながら同時に再生すること」
今回の場合だと、ChatGPTからのレスポンスがすべて生成されてから一度に来るのではなく、一文字ずつ生成される順に情報が送られてくるような処理になるってことですね。

で、サンプルコードが[ここ](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_stream_completions.ipynb)に書いています。
これをC＃に変換して送ればいいです。
具体的には、以下のようにJsonを作って、

```
string jsonBody = JsonConvert.SerializeObject(new
{
    model = "gpt-3.5-turbo",
    messages = new[]
    {
        new {role = "user", content = "こんにちは"}
    },
    stream = true
});
```

それをUnityWebRequestとかで送るだけでできます。

```
UnityWebRequest request = new UnityWebRequest(apiUrl, "POST");
byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(jsonBody);
request.uploadHandler = new UploadHandlerRaw(bodyRaw);
request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("Authorization", $"Bearer {apiKey}");
request.SetRequestHeader("Content-Type", "application/json");

request.SendWebRequest();
```

めちゃくちゃ簡単。
あとはstreamingで送られてくる情報を適当に受け取って、表示したい形式、速度で画面に表示すればそれだけで逐次的に表示ができるようになります。


# 感想
やっぱりリアルタイムで逐次的に表示できると、しゃべっている感じが出ていいですね。
待つ時間がないから表示も素早くなるし、だいぶ話しやすくなった。
ただそうなると今度は音声認識の部分のタイムラグが気になってくる。
次は録音の逐次的処理、をしてみたいけど、音声を録音しながらぶつ切りで送ると音声認識の精度が圧倒的に下がることが簡単に予想できるので、何かいい方法がないかな、と思ったり。
音声認識の専門家に質問したい……