OmniAICreator/Qiita-1.07M huggingface dataset:
データベース設計の学習_1

## 自己紹介
　webアプリの自社開発をしている企業のプログラマーです。バックエンドとフロントエンドの開発をしています。広い分野を学習しなければならないため尖ったスキルを身につけるのが難しいということが事実として存在しています。そこで、まずはアプリケーション開発に必須のデータベースに関するスキルを磨いていこうと思います。学習のアウトプットのために投稿していきます。

## 投稿内容
　主な投稿内容は、学習の中心であるデータベースになりますが、Python、AWSやサーバー、ネットワークなどのインフラの分野もアウトプットとして投稿することがあるかもしれません。

## はじめに
 今回は、データベースの論理設計の概要について学習したことをまとめていきます。データベースに関する基本的なことも復習として書きます。なお、学習に使用する書籍は「達人に学ぶDB設計徹底指南書」です。

##  論理設計の概要
### 論理設計のステップ
```mermaid
graph TD;
    エンティティの抽出-->エンティティの定義;
    エンティティの定義-->正規化;
    正規化-->ER図の作成;
```
### ・エンティティの抽出
#### 　エンティティ（entity）　＝　実体
　**現実世界に存在するデータの集合体を表す**
 
　例）社員、店舗、会社、部署
 　  これらのデータは物理的実体を伴うものと伴わないものが存在する
    
　**例から分かるようにエンティティは物理的実体を伴う必要はない**
　
　エンティティをテーブルという物理的単位で格納していく必要がある。そのため、システムにどのようなデータが必要になるかどうかを抽出する。これが、論理設計のエンティティ抽出ステップで行うべきこと。

 ### ・エンティティの定義
 　エンティティの抽出を終えたら、エンティティがどのようなデータを保持するかを決める必要がある。エンティティはデータを属性（attribute）という形で保持する(属性はテーブルの列（colomun）とほぼ同義）。
　つまり、エンティティの定義では **テーブルがどのような列を持つかを決める** 必要がある。
　また、エンティティの定義で重要なのは、主キーや外部キーを定義すること。

 ### ・正規化
 　正規化はデータベースで保持するデータの冗長性を排除し、一貫性と効率性を保持するためのデータ形式。
  正規化には、以下のような段階がある。
　・第１正規化
　・第２正規化
　・第３正規化
　・ボイスーコッド正規化
　・第４正規化
　・第５正規化
 
 　＊正規化については別の記事にまとめます。

### ・ER図の作成
　正規化が終わると、基本的にはエンティティの数が増える（正規化は、テーブルを細かく分けていくことでもあるから）。
 　当たり前のことではあるが、エンティティの数が増えると関係が把握しにくくなる。数十、数百のエンティティを頭の中で理解することは困難であるので、ER図を作成することが重要である。

## おわりに
　今回は、論理設計の概要についてまとめました。次回は、物理設計の概要についてまとめたいと思います。
StackBlitzでGitHubにpushできない

# はじめに
StackBlitzで、GitHubにpushできない

# 問題
Create a repositoryボタンから、リポジトリを作っている
改めてプロジェクトを開き直すと、また「Create a repository」ボタンしかなく、ブランチ作成、コミット、pushができない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3881019/3c60b8bb-42ca-c1c7-a273-34bcdc0bd120.png)

# 解決方法
dashboardからプロジェクトを開く時、「Recent projects」から開いていたが、
「Recent repositories」から開く必要があった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3881019/2f92f8a3-1202-591b-9e36-7c1797b05df9.png)

「コミットしてプッシュ」からGitHubにpushできる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3881019/2a535ae7-1114-b87d-e2c1-edc564c6c0b3.png)

# おわりに
分からなくて、何回も「Create a repository」しては削除を繰り返してしまいました、、

# 参考
StackBlitzの導入からGitHub同期まで
https://qiita.com/saurus12/items/9f4fa1ffe421a8b26fa2
GitHub からプロジェクトを起動する(StackBlitzドキュメント)
https://developer.stackblitz.com/guides/integration/open-from-github
【JavaGold】モジュール・システム

# モジュール・システム

* 最適化されたモジュール構成によってパフォーマンスが向上する。
* モジュール間の依存関係を明確化できる。
* 柔軟な実行環境を実現できる。
* プラットフォーム間の整合性が向上する。
* 公開されたクラスにしかアクセスできないためセキュリティが高まる。
* 名前付きモジュールから自動モジュールにはアクセスできる。
* 無名モジュールから名前付きモジュールにアクセスするには、コンパイルや実行時に--add-modulesオプションを追加する。
* 自動モジュールから無名モジュールにはアクセスできる。

モジュール・ディレティブのうち、リフレクションはopens

#### ボトムアップ移行
* 最も依存されているモジュールから順番に、名前付きモジュールに変換していく。

#### トップダウン移行
* 依存しているモジュールから順番に、名前付きモジュールに変換していく。
* 依存されているモジュールは、いったん自動モジュールに変換しておく。

java --module-path modules --module App/Main

### java.util.ServiceLoder
#### java.util.ServiceLoderに関する説明
* SPIを実現するためのクラスである。
* META-INF/services内のファイルを検索する
* loadメソッドにはclassリテラルを渡す。

#### load()
```java:実装例
public interface Test {
    public void execute();
}
```
```java
ServiceLoder<Test> loader = ServiceLoder.load(Test.class);
for (Test test : loader) {
    test.execute();
}
```

公開するインタフェースをモジュール定義ファイルで宣言するのに使用するディレクティブとしてusesを使用

#### -jdkinternals
JDKの内部APIでクラスレベルの依存関係を検索するためのもの

```:実装例
jdeps -jdkinternals C:￥workspace￥jar￥lib.jar
```

#### exportsディレクティブ
モジュールでパッケージを利用できるようにするには、exportsを使用する。

#### SPIで使われる２つのディレクティブ

※ディレクティブ　モジュールの定義で使われるもの

①provides（インタフェース）with（実現クラス）
→どのインタフェースをどのクラスで実現するかを定義する

②uses（インタフェース）
→SPIとして利用するインタフェースを定義する

※①②ともに利用する際はインタフェース、実現クラスをexportする必要あり。それかexports定義があるモジュールをrequireする。
PDFから表を抽出し、DataFrameやMarkDown形式に加工する。

# はじめに
PDF内の表データを取り出して、pandasで解析したりMarkDown形式でできないか調べてみた。```pymupdf```というPythonライブラリ使う。
その他PythonでPDF処理できる内容については、別記事でまとめているので👇を参照。

https://qiita.com/tapitapi/items/6b1982467f0345f3da67

# 目次
+ [ライブラリ：pymupdf](#ライブラリpymupdf)
+ [使い方](#使い方)
+ [用途](#用途)


## ライブラリ：pymupdf
``` pip install pymupdf```でライブラリを入手。このライブラリの```find_table()```を使う。参考にしたサイトは下記。[ドキュメントから表の内容を抽出する方法](https://pymupdf.readthedocs.io/ja/latest/recipes-text.html#how-to-extract-table-content-from-documents) / [Page.find_tables()](https://pymupdf.readthedocs.io/ja/latest/page.html#Page.find_tables)。

https://pymupdf.readthedocs.io/ja/latest/

[戻る](#目次)

## 使い方
PDFファイルを読み出して、ページ数、テーブル番号を指定すると、配列、DataFrame、MarkDownの形式に出力することができる。

コマンド|内容
---|---
pdf = pymupdf.open('ファイル名')|PDFファイルを読み出し
tables=pdf[page]find_tables().tables|指定したpageにテーブルがあればオブジェクトを出力する
tables[table].extract()|指定したtableを配列形式で出力する。
tables[table].to_pandas()|指定したtableをPandasのDataFrame形式で出力する。
tables[table].to_markdown()|指定したtableをMarkDown形式で出力する。

```python:
import pymupdf 

pdf_file = input('PDFファイル名：')
pdf = pymupdf.open(pdf_file)

for page in pdf:
	#表情報を確認
	tables = page.find_tables().tables
	
	#表があれば
	if(tables):
		print(f'{page=}/{len(tables)=}')
		for table in tables:
			# DataFrame形式
			print(table.to_pandas())
			# MarkDown形式
			print(table.to_markdown())
			# 配列形式
			print(table.extract())
```

[戻る](#目次)

## 用途
例えば各企業のIR情報などはPDFで配信されているので、その表から情報を取得したり、下記のような統計サイトのPDF情報からデータを抽出するときに便利と思う。

https://www.stat.go.jp/data/

[戻る](#目次)
ESP32: GATT通信 (ArduinoBLE.h)

こちらと同様のことを、ArduinoBLE.h を使って行いました。
[ESP32: GATT通信](https://qiita.com/ekzemplaro/items/6ec3be2bfe3ae51f455d)

スケッチ例を参考にしました。

## プログラム

```text:BatteryMonitor.ino
// ---------------------------------------------------------------
/*
	BatteryMonitor.ino

					Sep/22/2024
*/
// ---------------------------------------------------------------
#include <ArduinoBLE.h>

BLEService batteryService("180F");

BLEUnsignedCharCharacteristic batteryLevelChar("2A19",  // standard 16-bit characteristic UUID
    BLERead | BLENotify); // remote clients will be able to get notifications if this characteristic changes

int icount = 0;
// ---------------------------------------------------------------
void setup() {
	Serial.begin(115200);
	while (!Serial);

	if (!BLE.begin()) {
		Serial.println("starting BLE failed!");

		while (1);
	}

	BLE.setLocalName("BatteryMonitor");
	BLE.setAdvertisedService(batteryService); // add the service UUID
	batteryService.addCharacteristic(batteryLevelChar); // add the battery level characteristic
	BLE.addService(batteryService);

	int oldBatteryLevel = 0;
	batteryLevelChar.writeValue(oldBatteryLevel);

	BLE.advertise();

	Serial.println("Bluetooth® device active, waiting for connections...");
}

// ---------------------------------------------------------------
void loop() {
	Serial.print("*** loop *** ");
	Serial.println(icount);
	icount++;
	delay(1000);
	// wait for a Bluetooth® Low Energy central
	BLEDevice central = BLE.central();

	// if a central is connected to the peripheral:
	if (central) {
		Serial.print("Connected to central: ");
		// print the central's BT address:
		Serial.println(central.address());

		if (central.connected()) {
			updateBatteryLevel();
			}
		}
	else
		{
		Serial.print("Disconnected from central: ");
		Serial.println(central.address());
		}
}

// ---------------------------------------------------------------
void updateBatteryLevel() {
	int batteryLevel = 25 + icount;

	Serial.print("Battery Level % is now: "); // print it
	Serial.println(batteryLevel);

	batteryLevelChar.writeValue(batteryLevel);

}
// ---------------------------------------------------------------
```

## Arduino IDE
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/1d16f17f-c430-d30c-8a4b-2a8f63f9eb06.png)
リダイレクト処理、クッキー出力、メール送信とファイルアクセスの脆弱性

引き続き、[体系的に学ぶ 安全なWebアプリケーションの作り方](https://www.amazon.co.jp/%E4%BD%93%E7%B3%BB%E7%9A%84%E3%81%AB%E5%AD%A6%E3%81%B6-%E5%AE%89%E5%85%A8%E3%81%AAWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9-%E7%AC%AC2%E7%89%88-%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%8C%E7%94%9F%E3%81%BE%E3%82%8C%E3%82%8B%E5%8E%9F%E7%90%86%E3%81%A8%E5%AF%BE%E7%AD%96%E3%81%AE%E5%AE%9F%E8%B7%B5-%E5%BE%B3%E4%B8%B8/dp/4797393165)を読んだので、覚えたい部分を記事にしていく。

# リダイレクト処理

## オープンリダイレクト

パラメータにより指定したURLにリダイレクトできる機能を備えるものがあり、任意のドメインにリダイレクトできる脆弱性のことを、オープンリダイレクト脆弱性と呼ぶ。

オープンリダイレクト脆弱性の原因は、
- リダイレクト先のURLを外部から指定できる
- リダイレクト先のドメインのチェックができない

上記二点に当てはまること。

ただ、もともと外部のドメインに遷移する仕様や、外部ドメインに遷移することが自明である場合は、脆弱性ではない。

対策は、
- リダイレクト先のURLを固定にする
- リダイレクト先のURLを直接指定せずに番号指定にする
- リダイレクト先のドメイン名をチェックする

## HTTPヘッダインジェクション

リダイレクトやクッキー発行など、外部からのパラメータをもとにHTTPレスポンスヘッダを出力する際に発生する脆弱性。

脆弱性の原因は、HTTPレスポンスヘッダはテキスト形式で1行に1つのヘッダが定義できる。
つまり、ヘッダとヘッダは改行で区切られることになる。
この性質を悪用することで、ヘッダを誤認させること。

対策は、
- 外部からパラメータをHTTPレスポンスヘッダとして出力しない
- リダイレクトやクッキー生成をAPIに任せる。かつ、ヘッダ生成するパラメータの改行文字をチェックする

# クッキー

## クッキーの不適切な利用

クッキーはセッション変数と違い、利用者が値を変更することができる。
なので、保存すべきでない情報（書き換えられると困る情報）を保存することにより脆弱性が生じる。

## クッキーのセキュア属性不備

クッキーにはSecure属性があり、これを指定するとHTTPSの場合のみブラウザからサーバーに送信される。
この属性を指定していない場合は、HTTPS通信を利用していても、平文で送信されることがある。

原因としては、
- 開発者がセキュア属性について知らない
- セキュア属性をつけるとアプリケーションが動作しない

対策は、クッキーにセキュア属性をつけること。

# メール送信

## メールヘッダ・インジェクション
宛先や件名などのメールヘッダを外部から指定する際、改行文字を使ってメールヘッダや本文を追加・変更することで生じる脆弱性。

原因は、以下の通り。
ヘッダの各フィールドは改行で区切られている。
そのため、アプリケーションが改行をチェックしていない場合に、ヘッダや本文を追加・変更できることになる。

対策は、メール送信には専用ライブラリを使用する
プラスで、
- 外部からのパラメータをメールヘッダに含ませないようにする
- 外部からのパラメータには開業を含まないようにメール送信時にチェックする

# ファイルアクセス

## ディレクトリ・トラバーサル

ファイル名に対するチェックが不十分であると、アプリケーションの意図しないファイルに対して、閲覧や改ざん等ができる脆弱性。

原因は
- ファイル名を外部から指定することができる
- ファイル名として、絶対パスや相対パスの形で異なるディレクトリを指定できる
- 組み立てたファイル名に対するアクセスの可否をチェックしていない

対策は、
- 外部からファイル名を指定できる仕様を避ける
- ファイル名にディレクトリ名が含まれないようにする
- ファイル名を英数字に限定する

## 意図しないファイルの公開

原因は、
- ファイルが公開ディレクトリに置かれている
- ファイルに対するURLを知る手段がある
- ファイルに対するアクセス制限がかかってない

対策は
- アプリケーション設計時に、ファイルの安全な格納場所を決める
- レンタルサーバを契約する場合は、非公開ディレクトリが利用できることを確認する
rootでも実行権限のないファイルを実行できない理由

# はじめに
スクリプトを実行する前に権限をchmodコマンドで変更したりすると思いますが、
rootユーザやsudoで実行権限のないファイルを実行することができない理由について
疑問に思ったこと、勘違いしていたことをまとめます。

# 実行するシェルスクリプトについて
下記の簡単なシェルスクリプトを用意しました。
```
[tom@ubuntu:~/Qiita/sh] $ ls -l test.sh
-rw-r--r-- 1 tom tom 56  9月 16 12:50 test.sh

[tom@ubuntu:~/Qiita/sh] $ cat test.sh
#!/bin/bash

echo "Hello!"
echo "My name is $(whoami)" 
```

# スクリプトを実行してみる
現在実行権限がないため、そのまま実行しようとすると下記のようになります。

```
tom@ubuntu:~/Qiita/sh$ ./test.sh
bash: ./test.sh: 許可がありません
```

また現在実行権限は誰にも与えられていないため、
sudoでの実行やrootユーザでも実行することはできません。

```
tom@ubuntu:~/Qiita/sh$ sudo ./test.sh
sudo: ./test.sh: コマンドが見つかりません

tom@ubuntu:~/Qiita/sh$ sudo su
root@ubuntu:/home/tom/Qiita/sh#

root@ubuntu:/home/tom/Qiita/sh# ./test.sh
bash: ./test.sh:許可がありません
```

# rootユーザで実行できない理由
ファイルの実行時にはLinuxカーネルがパーミッションの確認を行うため、
rootであっても無視できないルールが適用されているようです。

これは実行権限のないファイルを実行することにより、
セキュリティリスクを高める可能性があることやシステム全体に不安定な動作を引き起こす可能性があるためです。

そのため、実行権限がないファイルについてはrootであっても実行することはできません。

# sudoで実行できない理由
sudoコマンドはプロセスの実行ユーザをrootに変更するものです。
上記の通りカーネルが実行権限を確認するため、
実行権限のないファイルはsudoを使っても実行することはできません。

# エラーメッセージが異なる理由
先ほどのエラーメッセージですが、
sudoでの実行とrootでの実行でエラーメッセージが異なっています。

```
tom@ubuntu:~/Qiita/sh$ sudo ./test.sh
sudo: ./test.sh: コマンドが見つかりません

tom@ubuntu:~/Qiita/sh$ sudo su
root@ubuntu:/home/tom/Qiita/sh#

root@ubuntu:/home/tom/Qiita/sh# ./test.sh
bash: ./test.sh:許可がありません
```
これはsudoが『コマンドを実行する』ためのツールだからです。

実行権限のないファイルは『コマンドとして扱う』ことができないため、
sudoは実行権限のないファイルを『コマンドとして存在しない』と認識し、
『コマンドが見つかりません』と表示します。

それに対し、rootはそのままの理由で『許可がありません』と表示します。

# まとめ
パーミッションはカーネルで制御されているため、
たとえrootであっても実行権限のないファイルを直接実行することはできません。

実行する場合はシェルを通しての実行したり
chmodコマンドで実行権限を与えることで実行できるようになります。
あまり気にすることではありませんが気になったので調べてみたお話でした。

以上です。
最後までお読みいただきありがとうございました。
【SSO】SnowflakeにローカルPCのAnaconda環境のjupyter notebookから接続

前回書いた下記の投稿で、ID/パスワードをjsonファイルに保存しておいて、それを読み込んでSnowflakeに接続するのを試しました。

https://qiita.com/baihebu/items/03e38f6e6d6f242ad8a3

実際は会社で使う環境などではSSO（シングルサインオン）で使っていて、パスワードを設定していないケースもあると思います。
SSOでSnowflakeに接続するということを試してみます。

前回の投稿の
- 仮想環境作成
- jupyter notebookでの操作
までは全く同じなので省略します。
jupyter notebook内でのpythonのファイルは別ファイルで新たに用意してもいいかもですね。
![スクリーンショット 2024-09-22 105516.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487310/aad98ef4-ee90-b9f7-187a-4303b9ccc8e2.png)
sso_testというpythonのファイルを「▼New」から作りました。

- Snowflakeへの接続設定
からが異なります。

# Snowflakeに接続
Snowflake Communityのこのページを参考にさせてもらいました。

https://community.snowflake.com/s/article/Using-Single-Sign-On-SSO-with-Python-using-Jupyter-Notebook

jupyter notebookでやっていきます。
```
import snowflake.connector
import sys
con = snowflake.connector.connect(
    user="xxxxx",
    account="xxxxx",
    authenticator="externalbrowser",
)
```
ユーザーとアカウントの部分はマスクとさせてもらいました。
![スクリーンショット 2024-09-22 105909.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487310/cfce4ddf-8210-fa10-5cd7-a7c466dc8a7d.png)

authenticator="externalbrowser"・・・外部ブラウザで認証する
という指定なんだと思います。
SSO接続のキモがここですね。
前回の投稿の後、Sakatokuさんからも教えてもらってました。

https://x.com/AkSakatoku/status/1837157413079879826

これを実行するとブラウザ別タブで以下のメッセージが出ました。
![スクリーンショット 2024-09-22 110008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487310/a5b7217a-fda4-133f-964b-1443adbd008a.png)
「confirmed」だからOKっぽいです。
「このwindowをcloseしていいよ」とも書いていますので、タブは閉じちゃいましょう。

jupyter notebookのタブに戻ると、何やらメッセージが出てました。
![スクリーンショット 2024-09-22 110040.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487310/8157893f-3b8d-1100-39f1-d12a686a04e3.png)

ではSnowflakeを操作してみます。

```
cur = con.cursor()
try:
    cur.execute("USE ROLE SYSADMIN")
    cur.execute("USE WAREHOUSE COMPUTE_WH")
    cur.execute("USE DATABASE TEST_DB")
    cur.execute("USE SCHEMA TEST_SCHEMA")
    cur.execute("select * from test_json")
    row=cur.fetchall()
    for r in row:
        print(r)
    
finally:
    cur.close()
```
test_jsonテーブルからselectして結果を出力します。

![スクリーンショット 2024-09-22 110521.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487310/d02585c8-cb3d-a784-0eb6-951f4b79a9e9.png)
3行出力できました。
バッチリSnowflakeにつながってます。

なお、Snowsightで見るとこんな感じです。
![スクリーンショット 2024-09-22 110604.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487310/3f186f9a-0b2d-ba3b-e18e-1f9c8489ea08.png)

同じ結果ですね。

# まとめ
会社のSSOユーザーでもこんな感じで接続ができることが実証できました。
ABC372回答メモ

# 0.はじめに
　最近若干調子上向きの中臨んだABC372。
　A・B・Cを解いた後、Dは解き方が思いつかず
　Eは何とか行けそうだったので挑戦しましたが
　TLEは消せずあえなく時間切れ。
　それでも今のレートでは3問解けただけで+9と
　微増でした。


# 1.A - delete .
　pythonだと地味にめんどくさい文字列操作系問題。
　素直に以下の手法で解きました。
　入力する文字列をリスト化してリストSに読み込み
　回答用文字列ansを空で定義
　Sから一文字ずつ読み出し、”."以外をansに加えていき
　最後にansを出力して終了

　https://atcoder.jp/contests/abc372/submissions/57953706


# 2.B - 3^A
　Bにしては難しくない？と思った問題。
　回答を見たら3進数に変換して解くとあり
　目からうろこでしたがまぁ、思いついた以下の実装。
　【実装】
　　1.Mをインプット
　　2.回答用リストansを空で初期化
　　3.添え字iを10→0で1ずつ減らすfor文で以下の処理
　　　-1.Mが3のi乗以上の間以下を繰り返す
　　　　-1.ansにｉを追加
　　　　-2.Ｍから3のｉ乗を減算
　　4.ansにM回0を追加(試行錯誤中に入れたロジックなので実際は不要)
　　5.ansの長さと、中身を出力して終了

　https://atcoder.jp/contests/abc372/submissions/57961871


# 3.C - Count ABC Again
　普通にクエリーごとにABCをカウントしていたら間に合わないので
　クエリーで変更される部分だけABCが減ったり増えたりしないかをチェックすることで
　高速化を図りました。
　【考え方】
　　1.N、Q、リストMを読み込む
　　2.回答用変数ansを0で初期化
　　3.Mを頭からチェックし、ABCの数を数えansにセット
　　4.以下、クエリーをQ回繰り返し
　　　-1.X、Cを読み込み
　　　-2.置き換え先M[X]がAorBorCの時
　　　　置き換える前の状態で置き換え先を含む文字列がABCをなしており、かつ
　　　　Cが置き換え先の文字と異なる場合はansから１減算
　　　-3.置き換え文字(C)がAorBorCの時
　　　　置き換える前の状態で置き換え先を含む文字列がABCをなしておらず、かつ
　　　　Cを置き換えた場合の文字列がABCとななる場合はansに１加算
　　　-4.M[x]をCに置き換えてansを出力
　なんとなく冗長になっている気もしますがまぁACを頂けました。

　https://atcoder.jp/contests/abc372/submissions/57973376


# 4.D - Buildings
　コンテスト時は後ろから見ていくとよさそうだなくらいしか
　回答方法がピンときませんでした。
　解説でスタックを使うと見て、なるほどと、解き方が分かりました。
　【考え方】
　　1.N、Aを読み込む
　　2.チェックしたビルから見えるビルのリストsを空で定義
　　　sは後ろから格納し、格納時に見えなくなるビルは省く
　　3.チェックしたビルから見えたビル数のリストansを空で定義
　　　後ろからチェックして格納するので、出力時は順番を入れ替える
　　4.for文でリストAを後ろから取り出し変数aに格納
　　　-1.aのビルから見えるビル数はsの長さなので、sの長さをリストansに追加
　　　　～以下、aの1個後のビルから見た時のビルを整備する処理
　　　-2.aの1個前から見た場合、aより低いビルは見えなくなるので、while文でリストsから
　　　　aより小さいビルをpopで除去
　　　-3.sにaを追加
　　5.ループ後ansを後ろから表示

　https://atcoder.jp/contests/abc372/submissions/58001762


# 5.E - K-th Largest Connected Components
　コンテスト中はユニオンファインド木を使うんだろうなと思いつつ、簡易的に
　ユニオンファインド木的な実装を軽量化しつつ行い
　何とかなるかと思いましたが、TLEが30とダメダメでした。
　コンテスト後5分解説を見ると、ベスト10だけ管理すればよいと
　説明があり、目からうろこでした。
　ABC370で使ったユニオンファインド木クラスを使い
　根毎にベスト10を管理する事で、簡単に実装できました。

　https://atcoder.jp/contests/abc372/submissions/57999722


以上
Go言語でPostgreSQLを使ったデータベースのリセット方法

# 本記事の内容
Go言語を使って数値計算シミュレーションアプリのバックエンドを開発しています。計算に使用する数値データを保存するためにデータベースを活用しており、開発中にはテストや新しいデータを作成する際にデータベースをリセットする必要が頻繁に発生します。もちろん、特定の部分だけを更新することも可能ですが、データ構造自体も試行錯誤しながら進めているため、既存のテーブルや登録データを削除してデータベースをクリーンに保つ方が、開発の効率化につながります。

この記事では、既存のテーブルを削除して再作成する具体的な方法について解説します。

※本記事はあくまで個人開発の一環であり、PostgreSQLやデータベース管理に関して誤りがあればぜひご指摘いただけると幸いです。

# 使用環境

* Windows11 pro
* PostgresSQL
* Go言語
* pgAdmin4

# Postgresデータベースのリセット方法
PostgreSQLでデータベースをリセットする際には、主に以下のステップを踏みます。

1. **スキーマの削除**: テーブル、ビュー、シーケンスなどすべてのオブジェクトを削除します
2. **スキーマの再作成**: 削除したスキーマを再作成します

## Go言語での実装: データベースのリセット
Go言語でデータベースのリセットを行うために、ORMライブラリであるGORMを使います。GORMは、GoとPostgreSQLをシンプルに統合できる強力なツールで、SQLクエリの実行やテーブル管理を効率的に行うことができます。

以下が、データベースのリセットを行うためのコード例です。

``` Go
func resetDatabase(db *gorm.DB) error {
    // スキーマの削除と再作成
    if err := db.Exec("DROP SCHEMA public CASCADE;").Error; err != nil {
        return err
    }
    if err := db.Exec("CREATE SCHEMA public;").Error; err != nil {
        return err
    }
    return nil
}
```

1. スキーマの削除
    - このコードでは、まず `DROP SCHEMA public CASCADE;` で public スキーマ内の全オブジェクト（テーブル、ビュー、シーケンスなど）を削除します
2. スキーマの再作成
    - 次に、`CREATE SCHEMA public;` を使って再度 public スキーマを作成しています。このようにすることで、データベースは完全にリセットされ、再度データの登録やテストが可能になります

## テスト環境での利用例
この方法は、開発段階での頻繁なデータベースのリセットに非常に有用です。例えば、データ構造の修正や型の変更、データの追加時に状態をリセットし新しいデータを投入して動作を確認する際に簡単にデータベースをクリアして再利用することができます。

テストの前にデータベースをリセットする例を示します。

``` Go
func TestMain(m *testing.M) {
    db, err := gorm.Open("postgres", "host=localhost user=test dbname=test sslmode=disable")
    if err != nil {
        log.Fatalf("failed to connect to the database: %v", err)
    }

    var deleteAll bool
	fmt.Print("Delete all data? (true/false): ")
	fmt.Scan(&deleteAll)

	if deleteAll {
		// テスト前にデータベースをリセット
        if err := resetDatabase(db); err != nil {
            log.Fatalf("failed to reset the database: %v", err)
        }

        if err := db.AutoMigrate(&models.Data1{}, &models.Data2{}, &models.Data3{}); err != nil {
		log.Fatalf("failed to migrate: %v", err)
	    }

        for _, data := range data1Arr {
		    if err := db.Create(&data).Error; err != nil {
			    log.Fatalf("failed to save element: %v", err)
		    }
	    }
    }

    // 以下必要な処理を記述
}
```

:::note alert
注意点
データベースのリセットは非常に強力な操作であり、全てのデータやテーブルが失われるため、必ず事前にバックアップを取ってから行うようにしてください。また、本番環境での使用は避けるべきです。リセットはあくまで開発やテスト環境での操作として使用することをお勧めします。
:::

# まとめ
データベースを用いた開発段階では、PostgreSQLをリセットしてクリーンな状態にすることは、開発効率を大幅に向上させます。今回紹介した方法を使用すれば、簡単にスキーマやテーブルを削除し、再作成することが可能です。今後の開発やテストの際にぜひ活用してみてください。
Quick Start: Explore the Automation Components Sample App  


https://trailhead.salesforce.com/content/learn/projects/quick-start-explore-the-automation-comps-sample-app

# Deploy Automation Components

９つのパッケージをインストールしました。

# Get to Know Automation Components

以下の指示はさっぱり理解できませんね。

In the Browse Demos section,　はどこだろう？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/95f27a02-5c05-0a29-1d8f-c1f993346cd9.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/61b9219a-28b3-1bac-75d9-e43ef97d9490.png)

仕方ないので、検証ボタンをクリックすると何と合格？
内容は全く理解できませんでした。意味なし

# Use Automation Components in Flow Builder

何もしないで、検証ボタンをクリック。ここはチェックしているみたい

:::note alert
We couldn't find an active flow labeled 'Lock Opportunity Record'.
:::


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/cb02d592-ef0b-2b75-339f-c82b4bd06213.png)

:::note alert
You encountered some errors when trying to save this record
We can't save this record because the “Lock Opportunity Record” process failed. Give your Salesforce admin these details. An Apex error occurred: System.UnexpectedException: Apex approval lock/unlock api preference not enabled. Error ID: 1418448175-8312238 (-1041290331): Apex approval lock/unlock api preference not enabled. Error ID: 1418448175-8312238 (-1041290331)
:::

以下のエラーです。

:::note alert
We couldn't find the opportunity record named 'University of AZ Installations' in the 'Closed Lost' stage.
:::

仕方ないので、まずはフローを非有効化してフェーズを変えましょう



:::note alert
We couldn't find an active flow labeled 'Lock Opportunity Record'.
:::

アクティブにするか...

:::note alert
We could not validate if the opportunity record named 'University of AZ Installations' in the 'Closed Lost' stage is locked. Make sure the values are correct according to the requirements.

「Closed Lost」ステージの「University of AZ Installations」という名前の商談レコードがロックされているかどうかを検証できませんでした。値が要件に従って正しいことを確認してください。
:::

困ったね


デバックすると

:::note alert
An Apex error occurred: System.UnexpectedException: Apex approval lock/unlock api preference not enabled.
:::


ログを見ると

:::note alert
System.UnexpectedException: Apex approval lock/unlock api preference not enabled.
:::

こんな設定あった？

Setup -> Process Automation -> Process Automation Settings

and set checkbox Enable record locking and unlocking in Apex as true

https://salesforce.stackexchange.com/questions/108524/approval-lock-unlock-with-apex


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0a04306e-ac56-b253-f3c0-1cc5c8ca1d87.png)

合格できました...
Amazon ECS(Fargate): Firelensの[FILTER]に、name ecsを設定した場合としない場合のログ形式の違い

# はじめに
Fluent BitのFILTERには、ECSというものがあります。
Amazon ECS(Fargate)からログを出力するときに、FILTERにECSを設定した場合としない場合で、
どのような違いがあるかを調べてみました。

https://docs.fluentbit.io/manual/pipeline/filters

# confファイル
今回の検証で使ったconfファイルです。
FILTERをコメントアウトした場合としない場合で、テストしました
```conf
# Fluent Bit 設定ファイル
[SERVICE]
    Flush               5
    Grace               30
    Log_Level           info

# # 
# [FILTER]
#     Name                ecs
#     Match               *

# CloudWatch Logs にログを出力
[OUTPUT]
    Name                cloudwatch_logs
    Match               *
    region              ap-northeast-1
    log_group_name      /ecs/learn-backend-prod
    log_stream_prefix   backend/
    auto_create_group   true    
```

# ログ形式
ログの形式を確認したところ、同じ形式でした

- [FILTER] ecsが存在する場合
```json
{
  "container_id": "8f7a73b5da1f4d62a641ed763edb4656-1955534044",
  "container_name": "learn-backend-container-prod",
  "source": "stdout",
  "log": "[GIN] 2024/09/22 - 01:52:44 | 422 |    1.182171ms |    1.73.152.207 | POST     \"/query\"",
  "ecs_cluster": "learn-backend-ecs-cluster-prod",
  "ecs_task_arn": "arn:aws:ecs:ap-northeast-1:${AWS ACCOUNT ID}:task/learn-backend-ecs-cluster-prod/8f7a73b5da1f4d62a641ed763edb4656",
  "ecs_task_definition": "learn-backend-task-definition-prod:52"
}
```

- [FILTER] ecsが存在しない場合
```json
{
  "container_id": "f5427818b40547ff952af8aab9f77ba4-1955534044",
  "container_name": "learn-backend-container-prod",
  "source": "stdout",
  "log": "[GIN] 2024/09/22 - 01:58:01 | 422 |    1.423036ms |    1.73.152.207 | POST     \"/query\"",
  "ecs_cluster": "learn-backend-ecs-cluster-prod",
  "ecs_task_arn": "arn:aws:ecs:ap-northeast-1:${AWS ACCOUNT ID}:task/learn-backend-ecs-cluster-prod/f5427818b40547ff952af8aab9f77ba4",
  "ecs_task_definition": "learn-backend-task-definition-prod:52"
}
```
【web開発】基礎知識SPAとMPAとは？

# はじめに
- コンピュータサイエンス初心者です。わからないことばかりです。
- Reactの勉強をしていて、REACTはSPAでルト意味不明なことを言っていたので、SPAとMPAについて調べた。
- 「知識のアウトプットをしたい」「自分と同じ初心の方の参考になればな」「あわよくば上級者からのコメント欲しい」という思いで書きます。

# SPAとMPAとは？
### SPA
- SPAとは、シングルページアプリケーション（Single Page Application）
- 最初のページロード時に、webサイトの見た目に必要なデータを全てダウンロードする。
- 以後は、ページ遷移時の動的なデータは、クライアントサイドからサーバーサイドにファイルデータを送信する際に、必要最低限のデータを**非同期処理**によって送る。
これによって、スムーズなページ遷移が可能になる。

※非同期処理：あるタスクが実行されているときに、他のタスクが別の処理を実行できる方式



### MPA
- MPAとは、マルチページアプリケーション（Single Page Application）
- 初期段階のwebアプリケーション開発でよく使われていた技術。
- クライアントサイドからファイルデータのリクエストをサーバーサイドに送って、ファイルデータのレスポンスが返される。そのため、ページのと見込みに時間がかかってしまって、ラグが生じてしまう。
- また、大規模なアプリ開発では複雑な構造になってしまうため、向いていない。
- しかし、個々のページが独立しているため、情報が整理しやすく、検索エンジンによるインデックス作成が容易になる。

※検索エンジンによるインデックス作成：検索エンジンのデータベースに、webページを登録すること


### まとめ
SPAとMPAの違いは、簡単にいうとページ遷移時のファイルデータの取得方法の違いである。

|  | メリット | デメリット |
| ---- | ---- | ---- |
| SPA | ページ遷移がスムーズ | 初回ページを読み込むのに時間がかかる。SEOに不利。 |
| MPA | SEOに有利 | ページ遷移にラグが生じる |
トポロジーの全体像：バス型、スター型、リング型、メッシュ型の違いと適用例を徹底解説！

#### 概要
ネットワークトポロジーとは、ネットワークデバイスやノードの接続形態を指します。この記事では、4つの代表的なトポロジー（バス型、スター型、リング型、メッシュ型）について、それぞれの特徴や利点、デメリットを詳しく解説します。

---

#### 1. バス型トポロジー

![Slide1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3886343/93dd052a-7078-b015-ae6d-2a8a70ebb5d1.jpeg)

- **説明**: バス型トポロジーは、全デバイスが一本の主幹ケーブル（バス）に接続される方式です。データはこのバスを通じて送受信されます。
- **特徴**: 設置が簡単でコストが低いが、一本のケーブルが切断されるとネットワーク全体がダウンするリスクがある。
小規模なネットワークでは効率的なデータ伝送が可能である。
- **用途**: 小規模なLAN環境で使われることが多い。

#### 2. スター型トポロジー

![Slide2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3886343/7c81f659-81cf-9b72-d4ca-7138f742f714.jpeg)

- **説明**: スター型トポロジーは、中央に配置されたハブやスイッチに各デバイスが直接接続される方式です。
ハブやスイッチを介した通信で、データの伝送効率が向上し、ネットワークの信頼性も高まる。
- **特徴**: 中央のハブが機能する限りネットワークは安定。拡張が容易で障害が発生したデバイスのみが影響を受ける。
中央の機器で障害があると、ネットワーク全体が影響を受ける可能性がある。また、大規模ネットワークでスター型トポロジーを使うと、中央装置に過負荷がかかります。
デバイス間の接続性を単純化し、管理が簡単。
- **用途**: 一般的な家庭やオフィスのLAN環境。

#### 3. リング型トポロジー

![Slide3.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3886343/1abc2411-1a2d-57e4-f0d4-13fdc1b3dd71.jpeg)

- **説明**: リング型トポロジーは、デバイスがリング状に接続され、データが一方向または両方向に循環する方式です。
- **特徴**: データの流れが一方向に制御されるため、衝突が少ないが、どこかで接続が切れると全体に影響を与える。
- **用途**: 古いネットワークや特定の用途向けネットワーク。

#### 4. メッシュ型トポロジー

![Slide4.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3886343/2ac6198a-a1e4-7b2d-b68c-25457ad90f92.jpeg)

- **説明**: メッシュ型トポロジーは、各デバイスが他の複数のデバイスと直接接続される方式です。冗長性が高く、どのデバイスが故障しても通信が維持される可能性が高い。
- **特徴**: 高い信頼性とパフォーマンスを持つが、設置コストが非常に高い。
- **用途**: 重要なサーバー間や大規模ネットワーク、データセンターで利用される。

---

#### 総括
各トポロジーにはそれぞれ特定の環境や用途に適した強みがあります。規模や冗長性のニーズに合わせて最適なトポロジーを選ぶことで、ネットワークの効率や信頼性を向上させることができます。
Arrayを継承したクラスの.filterや.concatがT[]を返してしまう【Typescript】

## おことわり
:::note warn
`Array.filter(x => x != null)`がnullを除外してくれない、という類の話題**ではありません**。
:::

## 問題
以下のようにArrayを継承したクラスを作ります。
```ts
class MyArray extends Array<Item> {
    isEmpty() {
        return this.length == 0
    }
}
```

MyArrayを用いて以下のようなコードを書くと、`プロパティ isEmpty は型 Item[]に存在しません。` とエラーが出てしまいます。


```ts
const arr = new MyArray(...items)
// ↓TS上はエラーになる
const hasItem = !arr.filter(x => x.name == 'hoge').isEmpty() 
```

しかし、（少なくともブラウザでは）MyArrayクラスのfilterメソッドは、ArrayではなくMyArrayを返してくれます。なので、型エラーを無視してコンパイルしてしまえば、上のコードは正しく動きます。

なぜjsで動くものがtsでエラーになるのでしょうか。

## 原因
Typescriptの型定義が対応していないためです。
Typescriptの基本的なメソッドでこのような罠がある場合、だいたいは実装すると困る深遠な理由があるか、あるいは技術的に困難かのどちらかという印象ですが、筆者はTypescriptマニアではないので、理由まではわかりません。TypescriptのGithubのissueの山を漁る気も起きませんでした。

同じように、配列から新たな配列を生成するビルトインメソッドである`slice`や`concat`, `toSorted`なども同じ問題を引き起こします。
ちなみに`sort`ではこの問題は起きません。新しい配列を生成するのではなく、thisを返すからでしょうか。

## 対策
仕方がないのでfilterメソッドを自前でオーバーライドします。
```ts
class MyArray extends Array<Item> {
    override filter(predict: (value: Item, index: number, array: Item[]) => unknown, thisArg?: any) {
        return new MyArray(...super.filter(predict))
    }
    
    isEmpty() {
        return this.length == 0
    }
}

```

実装を書かなくても動くものを、型定義のためだけに再実装するのは本来筋の良い方法ではありません。filterの型定義を写経しないといけないのもイケてないポイントですね……。
本当は型定義だけを誤魔化したいのですが、そのような方法は見当たりませんでした。知ってる方がいれば教えて下さい。
Juliaの文字列に特殊文字をエスケープ不要で指定する方法

# はじめに
[こちら](https://qiita.com/nyoi/items/a0a65e4d4e0b997eacf5)の記事のやりたいことを1つの正規表現で表し、パターンの一部を変数の内容に置き換えようとしたところ、文字列がエスケープ文字だらけで意味不明になったので、生文字列を指定できる構文があったので紹介します

# 生文字列を指定する方法
rawを使えば生文字列で指定可能です
[生文字列リテラル](https://inzkyk.xyz/julia_doc/manual/strings/#man-raw-string-literals)
ただし、ダブルコーテーション(")だけは文字列中に使用する場合は```\"```とする必要があります


# 例
```julia
rev="_v3"
fn_zen = [
    "matome_001_v3.dat",
    "matome_002_v1.dat",
    "matome_003_v3.txt",
    "data_v3.dat",
    "matome_004_v3.dat",
    "matome_005.dat",
    "summary_v3.dat",
    "matome_006_v4.dat"
]
# 通常の文字列指定でエスケープ文字を使用する場合
pattern = "^matome_.*$rev.*\\.dat\$"  # matome_ で始まり、rev が途中にあり、.dat で終わる

fn = [x for x in fn_zen if occursin(Regex(pattern), x)]

実行結果
2-element Vector{String}:
 "matome_001_v3.dat"
 "matome_004_v3.dat"
```

rawを使用して以下のように書き換えることが出来ます
```diff_julia
-pattern = "^matome_.*$rev.*\\.dat\$"  # matome_ で始まり、rev が途中にあり、.dat で終わる
+pattern = raw"^matome_.*{rev}.*\.dat$" |>
+          x -> replace(x, "{rev}" => rev) # {rev}の部分を変数の中身で置換
```
VScodeでデータサイエンス向けのプラグインが登場

先日、VScodeのマーケットプレイスでデータサイエンス向けのプラグインがリリースされました。

https://marketplace.visualstudio.com/items?itemName=ms-toolsai.python-ds-extension-pack


データの準備、データ分析の実施、データの視覚化から、ML モデルのプロトタイピング、評価、トレーニングまで、データ サイエンス ワークフロー用のツールをワンストップで入手できるサービスで、
以下のものが含まれています。
+ Python + Pylance ： Python言語の充実したサポートを利用
+ Jupyter ： Jupyter ノートブックの作成と編集
+ Data Wrangler ： 表形式のデータを探索、視覚化、整理する
+ GitHub Copilot ： AIペアプログラマー

この拡張子はGitHub Codespacesで試すことができます。
興味あればぜひ！
Padの「フィルター データテーブル」アクティビティを使ってみた

　今回は、今年(2024年)にアップデートされたPowerAutomateのデータテーブル操作アクティビティについて検証してみた。
  注目しているアクティビティは以下の通り。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533364/96f07e7d-7ec5-e98a-d6a3-2d02500bef02.png)
　UiPathに比べて、フィルターやマージそして結合がなかったためデータテーブル操作の不便があった。アップデートでそのアクティビティが出てきたので、そのうちフィルターを見てみた。

# 検証内容
条件：適当にデータテーブルを作成→数字でフィルタリング可能かどうか見る
```
Variables.FilterDataTable DataTable: DataTable FilterParameters: { ^['RULE', 'COLUMN', 'OPERATOR', 'VALUE'], [$'''And''', $'''StaffNumber''', $'''Equal''', 123456] } FilteredDataTable=> FilteredDataTable
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533364/7e74670a-a5aa-cd60-09d0-f29bae8b068f.png)

# 検証結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533364/50b6874d-ff75-7f6e-0e59-d21a6a064390.png)

結果、列名指定で数字をしてすればうまくフィルタリングできました。UiPathのクラシックモードと違いアクティビティの汎用性は高いということが判明。
【React】defaultValueとvalue


inputタグたちに設定するvalueにはdefaultValueとvalueがある。

# defaultValue
ページ遷移時などのデフォルト値を設定する。

# value
ユーザーによる入力値を設定する。
onChangeイベントで変更を反映しないと、デフォルト値から値が変更できないから注意。
GitHubへのアクセスをSSH認証に切り替える初期設定方法

GitHubへのアクセスをSSHに切り替えることで、より安全にリポジトリを操作できるようになります。この記事では、SSHキーの生成からGitHubへの登録、設定確認までの初期設定方法を分かりやすく解説します。

## 1. SSHキーを生成する

まずは、SSHキーを生成します。以下のコマンドをターミナルに入力してください。

```bash
ssh-keygen -t ed25519 -C "your_email@example.com"
```

- `-t ed25519` は最新の推奨される暗号方式です。  
- `-C` はキーに紐づけるメールアドレスを指定します。

コマンドを実行すると、キーを保存する場所を聞かれます。デフォルトの場所（`~/.ssh/id_ed25519`）で問題ないので、そのままEnterを押します。次に、パスフレーズを設定するかどうかを聞かれますが、空でも設定しても構いません。

## 2. SSH公開鍵をGitHubに登録する

次に、生成したSSH公開鍵をGitHubに登録します。

### 公開鍵の確認

以下のコマンドで、公開鍵を確認します。

```bash
cat ~/.ssh/id_ed25519.pub
```

コマンドを実行すると、公開鍵が表示されるので、これをコピーします。

### GitHubに公開鍵を登録

1. GitHubにログインし、右上のプロフィールアイコンをクリックして、「**Settings**」を選択します。
2. 左側のメニューから「**SSH and GPG keys**」を選び、「**New SSH key**」をクリックします。
3. 「Title」に任意の名前を入力し、「Key type」は**Authentication Key**を選択、「Key」欄に先ほどコピーした公開鍵を貼り付けて「**Add SSH key**」をクリックします。

## 3. SSH接続の確認

次に、GitHubとSSH接続が正常に行えるか確認します。

```bash
ssh -T git@github.com
```

初めて接続する場合、ホストを確認するメッセージが表示されるので、「yes」と入力します。成功すると、次のようなメッセージが表示されます。

```
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
```

このメッセージが表示されれば、SSH接続の設定は完了です。

### 4. グローバルにGitの設定を変更する方法
まず、Gitの設定を変更して、すべてのリポジトリでデフォルトでSSHを使うように設定します。

1. **Gitの設定ファイル（`~/.gitconfig`）に設定を追加**することで、常にSSHで接続するようにします。以下のコマンドをターミナルに入力して、SSHをデフォルトに設定します：

   ```bash
   git config --global url."git@github.com:".insteadOf "https://github.com/"
   ```

2. これで、HTTPSのURLでクローンしたり、GitHubのリモートにアクセスしようとすると、自動的にSSHのURLに置き換えてくれます。

### 5. 手動でSSHを指定してクローンする方法
もし新しいリポジトリをクローンする場合は、最初からSSHでクローンすることもできるよ。GitHubのレポジトリページで「**Code**」ボタンをクリックして、SSHのURLを選んでクローンします。

```bash
git clone git@github.com:username/repository.git
```

### 6. 既存のリポジトリをSSHに変更する
もし既にクローンしたリポジトリがHTTPSで設定されている場合も、SSHに簡単に変更できます。

1. リモートURLを確認する：

   ```bash
   git remote -v
   ```

2. リモートURLが `https://github.com/username/repository.git` のようになっていたら、以下のコマンドでSSHに変更します：

   ```bash
   git remote set-url origin git@github.com:username/repository.git
   ```

---
`username/repository` の部分は、実際のGitHubのユーザー名とリポジトリ名に置き換えてください。これで、GitHubに接続する際に毎回SSHを使うように設定しました。

## まとめ

これでGitHubへのアクセスをSSH認証に切り替える初期設定が完了しました。セキュリティ面で強化されるため、今後のプロジェクトで積極的にSSHを利用していきましょう。

--- 

必要に応じて、[GitHubの公式ドキュメント](https://docs.github.com/en/authentication/connecting-to-github-with-ssh)も参考にしてください。
S3 署名付きURL

## 背景
Laravelを使用してS3への画像等のファイルをアップロードやダウンロードをしたいというケースが多いと思います。
今回はS3のPrivate Bucketのファイルに対して署名付きURLを発行する方法をご紹介します。

## 署名付きURL
個人情報が含まれるファイルをS3で管理する場合、基本的にはPrivate Bucketで管理し外部からのアクセスは禁止します。
署名付きURLとはBucket内のオブジェクトに対して有効期限内に一時的にアクセスできるURLを発行する機能です。
特定のユーザーに紐づく個人情報ファイルを一時的に配布するケースなどで使用出来ます。
>Authorization HTTP ヘッダーを使用する代わりに、必要な情報をクエリ文字列パラメーターとして渡すことで、特定の種類のリクエストを認証できます。これは、サードパーティーのブラウザで、リクエストのプロキシを行わずにプライベートの Amazon S3 データに直接アクセスさせる場合に便利です。これを行うには、「署名付き」のリクエストを作成し、エンドユーザーのブラウザが取得できる URL としてエンコードします。さらに、署名付きのリクエストは、有効期限を指定することで制限できます。

## 実装
LaravelからAWSのリソースへは基本的にAccessKeyとSecretAccessKeyを使用すればアクセス可能です。
ただし上記の情報を.envなどに書き込み運用することはセキュリティ的にアンチパターンなので、EC2へIAMロールを割り当てます。
EC2へIAMロールを割り当てる記事は沢山あるので今回割愛します。
ライブラリはAWS SDK for PHPを使用します。

# 環境
- PHP 8.0.10
- Laravel 8

### 設定ファイル（.env）
```
#s3
FILESYSTEM_DRIVER=s3
AWS_S3_DEFAULT_REGION=ap-northeast-1
AWS_S3_ENDPOINT=http://s3.amazonaws.com/

# public
AWS_S3_ACCESS_KEY_ID_PUBLIC=
AWS_S3_SECRET_ACCESS_KEY_PUBLIC=
AWS_S3_BUCKET_PUBLIC=public-storage
AWS_S3_URL_PUBLIC=https://public-storage.s3.amazonaws.com/
AWS_S3_USE_PATH_STYLE_ENDPOINT_PUBLIC=false

# private
AWS_S3_ACCESS_KEY_ID_PRIVATE=
AWS_S3_SECRET_ACCESS_KEY_PRIVATE=
AWS_S3_BUCKET_PRIVATE=private-storage
AWS_S3_URL_PRIVATE=https://private-storage.s3.amazonaws.com/
AWS_S3_USE_PATH_STYLE_ENDPOINT_PRIVATE=false
```

### S3 署名付き URL 生成メソッドの実装
```php:
use Aws\Credentials\CredentialProvider;
use Aws\S3\S3Client;

/**
 * Create presigned url
 * @param  string $targetPathS3
 * @return string
 */
private function createPresignedUrl(string $targetPathS3): string
{
    // S3 クライアントを設定し、必要な認証情報やリージョンなどを指定。
    $s3Client = new S3Client([
        'credentials'             => CredentialProvider::defaultProvider(),
        'version'                 => 'latest',
        'region'                  => env('AWS_S3_DEFAULT_REGION'),
        // 認証URLをSSL化するために必要
        'use_path_style_endpoint' => env('AWS_S3_USE_PATH_STYLE_ENDPOINT_PRIVATE'),
    ]);

    //指定されたバケットとキーに対する操作を定義。
    $command = $s3Client->getCommand('GetObject', [
        'Bucket' => env('AWS_S3_BUCKET_PRIVATE'),
        // 対象ファイルのs3ファイルパスを指定。
        'Key'    => $targetPathS3,
    ]);

    // 有効期限1時間の署名付きURLを生成
    return strval($s3Client->createPresignedRequest($command, '+1 hour')->getUri());
}
```

## 参考文献
https://docs.aws.amazon.com/ja_jp/sdk-for-php/v3/developer-guide/guide_credentials_provider.html

https://docs.aws.amazon.com/ja_jp/sdk-for-php/v3/developer-guide/s3-presigned-url.html


## 一緒に働く仲間を募集しています！
株式会社コネクター・ジャパンでは一緒に働いてくれる仲間を募集しています！

事業拡大に伴い、エンジニアさんを大募集しています。
興味のある方は下記リンクから弊社のことをぜひ知っていただき応募してもらえると嬉しいです。
▼会社について
https://www.wantedly.com/companies/cnctor/about
▼代表メッセージ
https://cnctor.jp/10years-anniversary/
▼応募はこちら
https://www.wantedly.com/projects/1522201
javascript　json　天気予報

### javascriptの勉強とhtmlの勉強とjsonの勉強でした。

参考サイト
https://anko.education/apps/weather_api
https://itsakura.com/js-selectbox


```html
<DOCTYPE html>
<head>
<title>天気予報取得</title> 
</head>
<body>

<h1>欲しい地域の天気予報情報を取得できます</h1>

<select name="region" id="selectregion1">
<option value="110000">埼玉県</option>
<option value="120000">千葉県</option>
<option value="130000">東京地方</option>
<option value="140000">神奈川県</option>

</select>
<input type="button" value="天気予報検索" onclick="forcast()">


<p id="wea1" ></p>
<p id="wea2" ></p>
<p id="wea3" ></p>
<p id="wea4" ></p>
<p id="wea5" ></p>


<script> 

function forcast(){

const str = document.getElementById("selectregion1").value;

let url = "https://www.jma.go.jp/bosai/forecast/data/forecast/";

url2 = url + str + ".json"

fetch(url2)
   .then(function(response) {
       return response.json();
   })
   .then(function(weather) {
       console.log(weather);
       
       document.getElementById("wea1").innerHTML = weather[0].publishingOffice;
       document.getElementById("wea2").innerHTML = weather[0].reportDatetime;
       let areas1 = weather[0].timeSeries[0].areas[0];
       document.getElementById("wea3").innerHTML = areas1.area.name;
       document.getElementById("wea4").innerHTML = areas1.weathers[0];
       document.getElementById("wea5").innerHTML = areas1.weathers[1];
});


}


</script>

</body>
</html>
```
Unity AnimationWindowの操作方法

# はじめに
VeryAnimation買ったけどAnimation Windowがちゃんと操作出来ないと結局使えないので勉強した備忘録
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935918/29d6b55d-8ae6-4bd3-bcd2-f811b94793ee.png)

- [公式](https://docs.unity3d.com/ja/2019.4/Manual/animeditor-UsingAnimationEditor.html)
- [カーブの編集方法](https://docs.unity3d.com/ja/2019.4/Manual/EditingCurves.html)


# 用語の定義(非公式)
- プロパティエリア：Animationウィンドウの左側のこと
- 表示エリア：Animationウィンドウの右側のこと
    - Dopesheet：DopeSheetモードのときの表示エリア
    - Curves：Curvesモードのときの表示エリア
- ホイールする：マウスの真ん中についているやつをくるくるする
- パンする：表示エリアを左右水平に移動する

# わかっていること
- 表示エリア
    - **A**：プロパティエリアで選択している要素の全体が見えるようにする
    - **F**：表示エリアで選択している要素の全体が見えるようにする
    - ホイール：xy同時に拡大縮小(DopeSheetはy拡縮出来ないのでxのみ)
    - Alt + 右ドラッグ：拡縮
    - Ctrl + 拡縮：x拡縮
    - Shift + 拡縮：y拡縮 (Curvesのみ)
    - 中ボタンドラッグ：パン
    - Alt+左ドラッグ：パン
    - 左ボタンドラッグ：選択
    - **,**：前のキー
    - **.**：次のキー
    - Alt + **,**：前のキーフレーム
    - Alt + **.**：次のキーフレーム
- プロパティエリア
    - ホイール：上下に移動
- DopeSheet
    - Ctrl+C：コピー
    - Ctrl+V：貼り付け
- Curves
    - ダブルクリック：キーフレームの追加
    - Click or 範囲を左ドラッグ：選択
    - Shift + 選択：追加選択
    - Ctrl + クリック：選択解除
    - 選択 → Del：削除
    - 選択 → Enter：値入力
    - 選択 → 右クリック：接線モードの編集
    - 選択 → ドラッグ：まとめて移動
    - 選択 → ある程度ドラッグしてからShift：移動方向をそれまでドラッグしてたx,yのどちらか方向へ固定
- その他
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935918/807e1173-911f-f128-740c-c4121884a81b.png)：上の目盛を時間/Frameで切り替え


# わかってないこと
- Curvesで選択したとき、それがどのプロパティなのか調べる方法
- プロパティを1つ選択してCurvesの表示が１つだけになっているときに簡単に全表示に戻す方法
ComposeMultiplatformボタンのタップ処理

ComposeMultiplatformでプロジェクトを作成したので理解を深めていきたいと思います。

ボタンタップの処理です。
こちらはシンプルでそのままComposeの実装と同じ感じでできました。

# サンプルコード

```App.kt
@Composable
@Preview
fun App() {
    MaterialTheme {
        var text by remember { mutableStateOf("何もしてないよ") }
        Column {
            Text(text)
            Button(onClick = { text = "タップしたよ" }) {
                Text("ボタン")
            }
        }
    }
}

```

# 実行結果
iOS
![Videotogif (7).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/681af1d5-afc3-b7b8-9814-fa0632d7ccf5.gif)

Android
![Videotogif (8).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/c60a01f6-7504-2a00-f519-30d572f52bc8.gif)
サーバー再構築記録: Proxmox VE + Ubuntu Server + Nginx + uWSGI + Flask

# 備忘録: 本文

2024年09月20日に、突然メインサーバーにアクセスできなくなった。

なんだか、様子がおかしかったので再起動。  
再起動したら、見たくないものが発生…なんと、論理パーティションが読み込めていない様子。  
`fsck`を実行し、うまく修復できるか試してみたが。。。

なんと、症状は悪化。とうとう、`kernel panic`という文字が出てしまった…。

諦めて、サーバーを再構築することにした。

今までは物理サーバー上でUbuntu Serverを動作させていたが
Proxmox VE上にUbuntu ServerをゲストOSとして動作させる環境に再設計。

ちなみに今回で消失したのはファイルシステムのみである…。  
そのため、コンフィグやデータベースなどは全て消えてしまった。

しかし、幸いなことに別データ自体は別のHDDに移して稼働させていたため、設定さえしてしまえば復旧自体はわりかし楽な方である…。(ありがとう、過去の自分。)

## ファイルサーバーの復旧

まず初めに、当サーバーはファイルサーバーとして動作していた。この復旧作業は少し手こずる面もあったが、比較的簡単だった。

### HDDの追加

まずは、該当のHDDをVMのハードウェアに追加する。  
USB接続のHDDは簡単だったが、SATA接続されたHDDは追加するのにCLI操作が必要だった。  
以下のサイトが参考になった。  
[ProxmoxでRDMを使う方法](https://blog.hitsujin.jp/entry/2023/05/17/proxmoxrdm)

### Sambaの導入と設定

次に、Sambaを導入。コンフィグファイルを弄り、以前の状態になった。

## Webサービスの復旧 (Nginx + uWSGI + Flask)

次にやったのは、Webサービスの復旧。  
Nginx + uWSGI + Flaskの構成でWebサービスをホスティングしていたのだが…作業を進めるうちに問題発生。

### venv環境の作成とuWSGIのビルドエラー

`venv`を作成して、必要なライブラリをインストールしている途中に、uWSGIのビルドに失敗する。

原因を探ってみた結果、単純にpipが導入されていなかった様子。  
`pip`を導入後、`venv`を作り直してうまく動作するか確認したら、何も問題なくビルド成功。

```bash
# venvの作成とライブラリインストール
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
```

### uWSGIの起動確認

該当のディレクトリまで移動して `uwsgi --ini app.ini` を入力して動作確認。  
と思ったら、何故かログが出力されない…。

色々詮索した結果、ログファイルに書き込まれていた。  
`tail -f`でログをトレースしたら、無事にログが流れていたことを確認できた。
（よかった…）

```bash
# ログのトレース
tail -f app.log
```

### uWSGIのサービス化
最後に、uWSGIをサービス化した。以下の通りに設定した。

```ini
[Unit]
Description=uWSGI instance to server Flask
After=network.target

[Service]
User=ユーザー名
Group=グループ名
WorkingDirectory="/media/hogehoge"
Environment="PATH=/media/hogehoge/venv/bin"
ExecStart=/media/hogehoge/venv/bin/uwsgi --ini app.ini
Restart=always

[Install]
WantedBy=multi-user.target
```

### Nginxの設定

Nginxに以下の必要最低限の設定を行い、無事にホスティングが完了。

```/etc/nginx/conf.d/uwsgi.conf
server {
    listen 80;
    listen 443 ssl;
    ssl_certificate /media/hogehoge/origin.pem;
    ssl_certificate_key /media/hogehoge/private_key.pem;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:///tmp/uwsgi.sock;
    }
}

```




## DiscordのBotのホスティング

あとは、DiscordのBotだけ…。  
正直、これは別の方法でホスティングするつもりだ。  
LXCを作成して、その上で稼働するように再構築したい。
（せっかくの機会だし…。）

これは、また別の記事で書くつもりです。

---

以上が、今回のサーバー再構築の流れです。同じような問題に直面した方の参考になれば幸いです。

---
Ubuntuのsudo apt aupdateコマンドの意味

# よくインストール前に実行するapt updateって何してる？
sudo apt updateコマンドは、システムに設定されているリポジトリを介してパッケージリストをダウンロード、更新します。このコマンドを実行すると、リポジトリから最新のパッケージ情報がダウンロードされ、システムのパッケージリストが最新の状態に保たれます。

## ■実行プロセス
1.リポジトリの確認：システムに設定されているリポジトリのURLにアクセスします。

2.パッケージ情報の取得：リポジトリから最新のパッケージリスト（メタデータ）をダウンロードします。

3.ローカルリストの更新：ダウンロードしたパッケージリストをローカルのパッケージデータベースに反映します。更新対象はlistsファイル
```console
/var/lib/apt/lists
```
アップデート後に実行するapt installやapt upgradeコマンドはlistsを参照して、最新のパッケージをインストールまたはアップグレードします。

※sudo apt updateはあくまでも登録されたリポジトリから最新のパッケージ情報を取得、更新します。リポジトリを追加するには以下コマンドを入力します。
```console
sudo add-apt-repository ppa:リポジトリ名
```


chromeのダウンロード等wgetでサーバーから直接ダウンロードしたものはリポジトリを介さずインストールできます。
パッケージデータベースの更新はインストール後に反映されます。

インストール後、以下コマンドで依存関係を修復します。
sudo apt-get install -f
ROS シミュレーター Gazebo 導入　macos

自分メモ用
＝＝＝＝＝＝＝＝＝＝＝＝＝＝

# 検証PC
macmini m2  
メモリ 8G
macOS Sonoma


# 公式ソース (2024/9/22 確認時点のを参考)
https://gazebosim.org/docs/all/getstarted/#macos


# バイナリインストール

```bash
brew tap osrf/simulation
```

👇インストールに時間かかる(30分程度)
```bash
brew install gz-harmonic
```

# シミュレーター起動確認
二つターミナルを起動して確認

```bash:ターミナル1
gz sim -v 4 shapes.sdf -s
```


```bash:ターミナル2
gz sim -v 4 -g
```

# 以下のシミュレーターが起動
![CleanShot 2024-09-22 at 07.21.13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/937274/29c37e4e-4f7c-326e-0219-613543e965ed.jpeg)
M5NANO C6を使ってM5Stack EXT.IOで遊ぶ。(理系フリマで入手)



参考


https://docs.m5stack.com/en/unit/extio


x 過去ログを見よ!!!


目的
I2C エックステンダーの8ビットポートICを使って遊ぶ
中身は、PCA9554


いろいろ
今日もmakeなんちゃかんちゃらやっているよ(0922)
実は、m5stamp s3も千円で入手したよ。(スイッチサイエンス)
I/Oと本体(極小)のバランスが悪い。ちいさくてかわいい
なんか、ドッキングステーションなんかがあるといいかも
I2Cを使った組み込みでBluetoothなんか使った用途に向いているかも。
やっぱり、デザイン性がよい。
(EXTI.IOは、理系フリマで100円で入手)


結果
(わかりずらいけど光っているよ)

![o_coq449.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4ad48ef0-f6be-69c1-4d65-0a3a2a95354e.jpeg)


プログラム


```c++


//PCA9554_C3_1
//EXT.IO  UNIT
//https://docs.m5stack.com/en/unit/extio


//インクルド
#include <Arduino.h>
#include <Wire.h>      //I2C


//初期化
void setup() {

  //I2Cの初期化
  Wire.begin(); //C3
  delay(200);

  //8ビット全て出力にする
  Wire.beginTransmission(  0x27  ); //アドレス

  Wire.write(0x03); //コマンド

  Wire.write(0x00); //データ

  Wire.endTransmission();

  delay(200); //0.2秒待つ
  
}//setup


//メインループ
void loop() {

  //8ビット全て1にする。
  Wire.beginTransmission(  0x27  ); //アドレス

  Wire.write(0x01); //コマンド

  Wire.write(0xFF); //データ　全て1

  Wire.endTransmission();

  delay(1000); //1秒待つ


  //8ビット全て0にする。
  Wire.beginTransmission(  0x27  ); //アドレス

  Wire.write(0x01); //コマンド

  Wire.write(0x00); //データ 全て0

  Wire.endTransmission();


  delay(1000); //1秒待つ

}//loop



```
ビジュアルプログラミングで高位合成 その8

# 概要
ビジュアルプログラミングで組み合わせ回路を組み立てて、シュミレーションして、verilogを生成します。
高位合成です。
実は、今の実装では、全加算器が高位合成できません。
全加算器の高位合成を計画します。
ワイヤーの概念を導入します。
構想編

# 論理デバイスと論理デバイスが繋がっている。

今のコードでは、対応できない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/3c060bc7-2359-7c45-7ee3-2366521d250e.png)

# ワイヤーの概念を導入する。

論理デバイスと論理デバイスが繋がっている場合、ワイヤーがあると設定する。

# 生成されるverilog

```
module x(input B, input A, input Cin, output Sum, output Cout);
    wire w0;
    wire w1;
    wire w2;
	assign Sum = (Cin ^ w0);
	assign w0 = (A ^ B);
	assign w1 = (A & B);
	assign Cout = (w1 | w2);
	assign w2 = (Cin & w0);
endmodule
```

以上。
008 AI屋さんの　streamlitと200万トークン全文入力　追加学習済み　LLMの　streamlitでWebアプリをクラウドデプロイ　実践編


AI屋さんの　追加学習済み　LLMの　streamlitでWebアプリをクラウドデプロイ　実践編


streamlitをお手軽に、
サーバーレスでWebアプリをデプロイしてみましょう。


---
ソースコードとデモ他

https://st.bono0.com

![スクリーンショット 2024-12-08 15.06.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/3748be47-73d1-4421-9621-c5b9b1cf7b55.png)

---
---




追加学習済みのＬＬＭを安価に共有する方法です。
完成ずみのwebapiを使って、
既にある、皆様のポータルサイトで呼び出したり
別途、独立サイトで運用したり　色々できます。

![Screenshot_20240922-061135.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/32dd824d-520a-6627-e0a8-2e1975c169a0.jpeg)





![Screenshot_20240922-060128.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/26b600c9-3bdd-511e-ca73-50c63614d067.jpeg)



既知のサイトです。（第五回参照）

https://bono0-ghc4uieygq-an.a.run.app

https://
bono0-ghc4uieygq-an.a.run.app


flaskは基本にして万能ですが、やっぱりstreamlitでサクッと作りたいですよね。
はい、簡単につくれます。


streamlitをサーバーレスでデプロイする方法は、いくつかありますが、
今回は、
cloud run の　Dockerfile （先頭は大文字）で作ります。
ポートは　8080　を開けます。
pip install　も直接書いちゃえば　requirements.txt　不用。
ローカルのdockerで　ビルドしてランして　動作確認します。
薄皮一枚のWebアプリにして、極力単純構成、
重そうなのは、再利用可能なwebapiに分離しときます。

LLMの追加学習　２００万トークン　全文入力　プロンプトモデルのAPIを沢山用意して交換すれば、
あらゆる　専門分野特化のLLM　もいけちゃいます。
必要なファイルは、これだけです。

　app.py
　Dockerfile

ファイル内容：準備中
動作確認が無事に終われば
後は、コマンド一発

　gcloud run deploy

で完成です。
複数の命令のコンボです。

　１、ソースコードからイメージをビルド
　２、イメージをクラウドにプッシュ
　３、イメージからwebアプリを　docker run
　４、待機インスタンス：0で　8080リッスン 
 
更に、ドッカー経由とビルドパック経由（最新全自動ビルド？）でビルドできるので
flaskなどは、Dockerfileなしでもデプロイできます。
ただし、streamlitは一工夫必要です。
今回は、ローカルでビルド確認済みDockerfileのままです。


細かな、初回設定などは公式のサンプルをコピーして一度実行すれば
もれなく整います。




公式参照

https://cloud.google.com/run/docs/quickstarts/build-and-deploy/deploy-python-service?hl=ja


ちなみに、dockerHubからcloudrunへデプロイする方法もあります。
もっと簡単です。
基本を押さえたら　お試しください。

目次

https://qiita.com/bono0/items/dc1d000c98af7e07c9a7



第八回：AI屋さんの　streamlitでWebアプリをクラウドデプロイ　実践編
本書

https://qiita.com/bono0/items/5c691f7cfe20c155a774


第七回：AI屋さんの　Webアプリをクラウドデプロイ　実践編

https://qiita.com/bono0/items/8b9563830a94cd7b68b0


第六回：追加学習済み　LLMの　flaskでWebアプリをクラウドデプロイ


https://qiita.com/bono0/items/968264adea0183d7a4fa


第五回：追加学習済み　LLMの　streamlitでWebアプリをクラウドデプロイ

https://qiita.com/bono0/items/2f7fbdbd1ad843e7858e




第四回：追加学習済み　LLMのwebapiをクラウドデプロイ

https://qiita.com/bono0/items/f954ca48d19cc51fb344



第三回：追加学習済み　LLMのwebapiを作る

https://qiita.com/bono0/items/f3330d8a57024e7cd44b


第二回：大規模言語モデルの簡単な追加学習、実践編

https://qiita.com/bono0/items/bd0a01e50d5804bdacf3



第一回：大規模言語モデルの簡単な追加学習

https://qiita.com/bono0/items/4a992dc388527d3b99f4




無事に
　AI屋さんの　追加学習済み　LLMの　streamlitでWebアプリをクラウドデプロイ　実践編
完成です。おめでとうございます。


ー完ー
ビジュアルプログラミングで高位合成 その7

# 概要
ビジュアルプログラミングで組み合わせ回路を組み立てて、シュミレーションして、verilogを生成します。
高位合成です。
実は、今の実装では、全加算器が高位合成できません。
全加算器の高位合成を計画します。
設計編

# 全加算器を動作させて、真理値表を作る。
こちらに、simcirjsがあります。動作させて、真理値表を作成しましょう。

https://embed.plnkr.co/plunk/UOeNFNBciol1kqprJ2Pu

# 左のデバイス一覧から、FullAdder、DC、In、Out、Toggle、LEDをドラッグします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5e73921f-4c03-dc7b-5af4-feb9d3d057f0.png)


# ワイヤーをつなぎます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/2f8b000e-5edc-c101-34cb-53955ab3ea10.png)

Toggleボタンを押して、シュミレーションします。

# 真理値表を書きます。

|Cin |A	|B	|Sum	|Cout|
|:-|:-|:-|:-|:-|
|0|0	|0	|0	|0
|0|0	|1	|1	|0
|0|1	|0	|1	|0
|0|1	|1	|0	|1
|1|0	|0	|1	|0
|1|0	|1	|0	|1
|1|1	|0	|0	|1
|1|1	|1	|1	|1

# SumはXOR、XORで、CoutはAND、AND、ORですね。置き換えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/61620727-c4fc-0d90-ff37-312567ed57af.png)


これを、高位合成するのが、目標です。

以上。