OmniAICreator/Qiita-1.07M huggingface dataset:
Incus: Debian 12 を使う

## 使用した incus のバージョン

```text
$ incus --version
6.0.0
```

## image を探す

```bash
incus image list images:debian | grep amd64
```

## コンテナーのインストール

```bash
incus launch images:debian/12/amd64 debian12
```

インストールされたことを確認

```text
$ incus list debian
+----------+---------+----------------------+------+-----------+-----------+
|   NAME   |  STATE  |         IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+----------+---------+----------------------+------+-----------+-----------+
| debian12 | RUNNING | 10.56.160.214 (eth0) |      | CONTAINER | 0         |
+----------+---------+----------------------+------+-----------+-----------+
```

## root のパスワードを設定

```bash
incus exec debian12  -- bash
```

```text
$ incus exec debian12  -- bash
root@debian12:~# 
```

## login

```bash
incus console debian12
```

```text
$ incus console debian12
To detach from the console, press: <ctrl>+a q

debian12 login:
```

## Login 後の設定

ユーザーの作成

```bash
adduser --uid 1200 uchida
gpasswd -a uchida sudo
```

sshd のインストール

```bash
apt install ssh
```

タイムゾーンの設定

```bash
timedatectl set-timezone Asia/Tokyo
```

## ip アドレスでログイン

```bash
ssh 10.56.160.214
```

```text
$ ssh 10.56.160.214
Linux debian12 6.7.3-arch1-1 #1 SMP PREEMPT_DYNAMIC Thu, 01 Feb 2024 10:30:35 +0000 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat Feb  3 16:51:45 2024 from 10.56.160.1
```

パスワードなしで、sudo が実行できるようにする

```bash
sudo visudo
```

```text
（省略）
%sudo ALL=(ALL:ALL) NOPASSWD:ALL
（省略）
```

## avahi-daemon のインストール

```bash
sudo systemctl status avahi-daemon
```
めちゃくちゃすごいピアノの自動採譜モデルを試してみた

SOTA(現時点で最高性能)のピアノ自動採譜のモデルの重みが公開されていたので、どの程度の精度なのか実際に試してみました。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Our paper on robust automatic piano transcription has been accepted by <a href="https://twitter.com/IEEEorg?ref_src=twsrc%5Etfw">@IEEEorg</a> Signal Processing Letters! It achieves SOTA results on the MAPS test with a simple data methodology, addressing overfitting issues in piano transcription models. Model weights: <a href="https://t.co/z3Ri0EKWjz">https://t.co/z3Ri0EKWjz</a></p>&mdash; Drew (@drooby_doo) <a href="https://twitter.com/drooby_doo/status/1753446623152144608?ref_src=twsrc%5Etfw">February 2, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

学習したモデルはもともとBytedanceが開発したピアノ自動採譜モデルで、このモデルはさらにロバストになるような工夫をして再学習しているようです。

ピアノのみの音源で以前のモデルと比較してみます。
以下は以前のモデルです。音が連打になっていたり本来はない高音の音ができていたりしています。
<iframe width="560" height="315" src="https://www.youtube.com/embed/CEaaXgizkIs?si=UvdNDVZ4OOfk519Z" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

最新のモデルの採譜結果です。最新のモデルでは同じ音が連打されることが少なくなり、存在しない高音の音もなくなっています。少し編集するだけでピアノ採譜に使えそうなクオリティです。
<iframe width="560" height="315" src="https://www.youtube.com/embed/AlbRR2b0ewE?si=9Qg4bkrcoc93DdGC" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

今回使用したコードは[Github](https://github.com/anime-song/piano_transcription_inference)にあります。
【OIDC】ImplicitフローってIDトークンリプレイ攻撃を防ぎきれないのでは？

# 記事の目的・背景
「OIDCのImplicitフローってIDトークンリプレイ攻撃を防ぎきれないのでは？」という疑念を抱いたので、その仮説を検証するのがこの記事の目的です。


# 結論
やはり「ImplicitフローってIDトークンリプレイ攻撃を防ぎきれないよね」ということがわかりました。
（異議があればコメントでご教示いただきたいです！よろしくお願いいたします！）


# IDトークンリプレイ攻撃とは
攻撃者がクライアントアプリケーションに対して、別のコンテキストで発行されたIDトークンを渡す攻撃。
クライアントアプリケーションによってこのIDトークンが正当なものとみなされると、（クライアントアプリケーションの仕様によるが）攻撃者はクライアントアプリケーションのリソースに対してアクセスできるようになってしまう。
※明確な定義はない模様


# OIDCのImplicitフローってどんなんだっけ
OIDCのImplicitフローは下のような感じです。OIDCの仕様書（[[ OpenID Connect Core 1.0 ] 3.2. Authentication using the Implicit Flow （日本語）](https://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html#ImplicitFlowAuth)）をもとに書いてます。
（※骨組みは[こちらの記事](https://qiita.com/kura_lab/items/812a62b5aa3427bdb49d#openid-connect-authorization-code-flow)から拝借しました）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490325/8711eb64-f782-4574-e1bd-2c2228d576e7.png)



# このフローのどこにIDトークンリプレイ攻撃のリスクがある？
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490325/69622c3c-c646-d31b-9fc1-42596e91a78a.png)


リスクがあるのは、上の画像の赤丸の箇所です。
通常、下記の流れでIDトークンリプレイ攻撃を防ぐことができます。
`2`でclientがnonceパラメータを生成しそれをAuthentication Requestに付与。またそのnonce値を記憶しておく。
`14`でauthentication serverが引き渡すidトークンにそのnocneを含める
`16`でnonceを検証する

しかし、例えばリプレイ攻撃で用いるidトークンに含まれるnonce値が`123456`だったら、`2`のタイミングでnonce値を生成したあとに、記憶領域のnonce値をその値で上書きしてしまえばどうでしょう。
あとは`15`のタイミングでidトークンをすり替えてしまえばリプレイ攻撃が成立してしまいます。


# 「IDトークンのリプレイ攻撃を防ぎきれないのである」という仮説に対する確証
Open ID Connect Core 1.0の原文たる英語版の方でnonceは「String value used to associate a Client session with an ID Token, and to mitigate replay attacks.（クライアント・セッションと ID トークンを関連付け、リプレイ攻撃を軽減するために使用される文字列値。）」と表現されてました。

nonceというセキュリティメカニズムはあくまでも脅威の軽減措置であって、完全に脅威をなくすことはできないということです。
（少なくとも自分はそのように解釈しました。）

上記の点を踏まえても、やはり私の「IDトークンのリプレイ攻撃を防ぎきれないのである」という仮説は正しいのだと思います。


# 振り返ると...
今回検証した疑念の根本は「Open ID Connect Core 1.0 の仕様書によるとIDトークンリプレイの対策としてnonceがあるはずなのに、フローをたどってみると対策として成立してないじゃん」という思考でした。
しかし、「nonceはリプレイ対策である」というのは日本語訳版の仕様書の記述であり、今回の調査にあたり原文たる英語版を読んでみたところ「nonceはIDトークンリプレイ攻撃の緩和（mitigate）のためのものである」という旨が記述されていました。
何が言いたいかというと、やはり原文を読むのは大事だということです。


# 課題
## この記事自体の課題
そもそも論、IDトークンリプレイ攻撃とは何かを私が勘違いしている可能性があります。
いろいろ調べてはみたものの定義しているドキュメントが見つからず、諸ドキュメントの書きっぷりから推測するしかありませんでした。
## 新たな疑問
今回この記事を書いていて、新たに二つの疑問が生じました。またどこかで下記二点について調査の上、執筆しようと思います。
Implicitフローにおいてはstateの検証とnonceの検証って結果として同じ役割を果たさないか？であればどっちか一つでよくないか？
PWA Safe Area が取得できない。毎回０が返ってくる。

Safe areaに関する記事自体は死ぬほどあると思いますが、ピンポイントでこの問題に触れてる記事は少なかった気がするのでメモを兼ねて。

## おさらい

最近のiPhoneやAndroidでは画面下部にホームバーと呼ばれる横棒の操作領域が設けられている端末が多く、この操作領域として確保されるべきエリアをセーフエリアと呼びます。

(Google画像検索より)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/713398/0bed3c52-08ed-ade8-1981-a6a82b5a8456.png)

Webアプリやサイト開発の際、これを考慮せずスタイルを組んでしまうとホームバーが干渉する悲しい見た目になってしまいます。

そこでCSSを使って下に一定の余白を設けるわけですが、多くのサイトでは「`env`でセーフエリアの余白値を取得できるよ」と言っていますが、自分の端末(iOS17, iPhone15 Pro)では0が返ってきてしまいだめでした。

```css
padding-bottom: env(safe-area-inset-bottom);
```

## 結論

最終的に以下でうまくいきました。

1: metaタグにviewportを追加する

```tsx
<meta
  name="viewport"
  content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover"
/>
```

2: env・constant関数の2通りでpaddingを指定する
- TypeScript側でやる場合

```tsx

const [safeArea, setSafeArea] = useState(0);
  useEffect(() => {
		// mount後でないと`getComputedStyle`がundefinedになってしまうのでuseEffect内で実行する
    setSafeArea(
      parseInt(
        getComputedStyle(document.body).getPropertyValue('padding-bottom'),
      ),
    );
  }, []);
// 中略
```

```html
<div style={{ paddingBottom: safeArea }}>
  Safe Area is here.
</div>
```

- cssでやる場合

```css
.pb-safe {
    padding-bottom: constant(safe-area-inset-bottom);
    padding-bottom: env(safe-area-inset-bottom);
  }
```

```html
<div className="pb-safe">
  Safe Area is here.
</div>
```

ここが肝で、どうもiOS11.2でconstantが廃止され、それ以降はenvを使う必要があるそうです。

ただ、自分の端末は11どころか17なので、なぜenvだけでダメだったのか謎です・・。
が、とりあえず両方指定しておけば間違いなさそうです。

以下の記事がとても詳しく、助かりました。
https://qiita.com/kanakana0330@github/items/6ae264b9da00c326ab1d
plunkerでテトリス

# 概要
Plunkerでテトリスやってみた。

# 参考にしたページ

https://qiita.com/oyoyo_oyoyo/items/fb3704c5377a24ad1c5c


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/9c767bb9-4819-8e5e-27d3-8b1d426e6148.png)

# 成果物

https://embed.plnkr.co/plunk/9q7hIUIliptK8aNR


以上。
OpenWrtのシステムアップグレードガイド：22.03から23.05へのアップグレード



x86_64のOpenWrtシステムを分割せず、システムの再設定なしでアップグレードすることは、重要で慎重に行う必要があるタスクです。この記事では、アップグレード手順の詳細を提供し、アップグレードプロセスがスムーズに完了することを確認します。

## 準備作業

アップグレードを実行する前に、重要なデータをバックアップし、操作中に注意事項を確認してください。

### 1. **カーネルモジュールリストとインストール済みソフトウェアリストのバックアップ**：

```bash
# インストールされているカーネルモジュールのリストをエクスポート
opkg list-installed | grep kmod | cut -f 1 -d ' ' > /root/kmod-list.txt

# インストールされているソフトウェアのリストをエクスポート
opkg list-installed | cut -f 1 -d ' ' > /root/packages-list.txt
```

### 2. **新しいバージョンのファームウェアをダウンロード**：

```bash
# 新しいバージョンの generic-kernel.bin をダウンロード
cd /tmp
wget https://downloads.openwrt.org/releases/23.05.2/targets/x86/64/openwrt-23.05.2-x86-64-generic-kernel.bin

# rootfs.tar.gz をダウンロードし、/tmp/upgrade に展開
wget https://downloads.openwrt.org/releases/23.05.2/targets/x86/64/openwrt-23.05.2-x86-64-rootfs.tar.gz
mkdir /tmp/upgrade
tar -xvzf openwrt-23.05.2-x86-64-rootfs.tar.gz -C /tmp/upgrade
```

## アップグレード手順

### 3. **旧バージョンのカーネルファイルのバックアップ**：

```bash
# 旧バージョンのカーネルファイルをバックアップ
cp /boot/vmlinuz /boot/vmlinuz.old
```

### 4. **新しいバージョンのカーネルファイルをインストール**：

```bash
# ダウンロードした generic-kernel.bin ファイルを /boot/vmlinuz にコピー
cp /tmp/openwrt-23.05.2-x86-64-generic-kernel.bin /boot/vmlinuz
```

### 5. **アップグレード環境の準備**：

```bash
# 設定ファイル、パスワードファイル、ホスト名、hosts、resolv.conf などのファイルを削除して、既存の設定が上書きされないようにします
rm -rf /tmp/upgrade/etc/config
rm /tmp/upgrade/etc/passwd
rm /tmp/upgrade/etc/shadow
rm /tmp/upgrade/etc/group
rm /tmp/upgrade/etc/hostname
rm /tmp/upgrade/etc/hosts
rm /tmp/upgrade/etc/resolv.conf
```

### 6. **新しいバージョンのファイルをシステムにコピー**：

```bash
# cp -rf コマンドを使用して新しいバージョンのファイルをシステムにコピー
cp -a /tmp/upgrade/. /
```

### 7. **ソフトウェアパッケージをアップグレード**：

```bash
# すべてのソフトウェアパッケージをアップグレード
opkg update
opkg upgrade $(opkg list-upgradable | cut -f 1 -d ' ')
```

### 8. **カーネルモジュールとソフトウェアパッケージを復元**：

```bash
# 1-2の手順でエクスポートしたカーネルモジュールとソフトウェアパッケージをインストール
xargs -a /root/kmod-list.txt opkg install
xargs -a /root/packages-list.txt opkg install
```

### 9. **アップグレードの完了**：

```bash
# 最後に、再起動コマンドを実行してアップグレードプロセスを完了します
reboot
```

## 注意事項

- アップグレード中は、ネットワーク接続が安定していることを確認してください。
- 何か問題が発生した場合は、すぐに操作を停止し、専門家の支援を求めてください。
- 操作には注意し、誤った操作によるデータの損失やシステムの破損を防いでください。

このガイドを通じて、OpenWrtシステムを22.03から23.05にアップグレードし、新しい機能と改善をお楽しみいただけるはずです。

アップグレードがスムーズに完了することを願っています！
仮想環境（venv）について



## はじめに
仮想環境（venv）についてに関しての備忘録です。
初心者です😅
間違えてる部分が多々あると思います。
もし見つけた場合、ツッコミいただけると助かります🙇
<br>
## 🦁<INS>**結論**</INS>🦁
<INS>**システムのPython環境を汚染せずに、必要なパッケージのインストールと管理ができて、互換性の問題を避けやすくなるシステム**</INS>

:::note info
押さえておくべき点
* venvは Pythonでの仮想環境を作るモジュール
* Python3.3以降は標準ライブラリに含まれてる
* 仮想環境は異なるプロジェクト間での依存関係の衝突を防ぐことができる
* <INS>**プロジェクトごとに異なるライブラリのバージョンを管理できるため、互換性の問題を避けやすくなる**</INS>
* <INS>**システムのPython環境を汚染せずに、必要なパッケージのインストールと管理が可能**</INS>
* <INS>**複数のプロジェクトを同時に進める場合でも、それぞれの依存関係を清潔に保つことができる**</INS>
:::  
***


:::note warn
利用シーン
* 開発環境と本番環境をできるだけ近い環境で行いたい場合。
* 異なるプロジェクトで異なるバージョンのライブラリを使用したい場合。
:::  
***


:::note alert
注意点
* PCを立ち上げて仮想環境を使う場合、アクティブコマンドが必要。
* 環境依存のあるスクリプトの場合、仮想環境のPythonインタープリタに正しく設定する必要。
:::  

***

## コマンド一覧
基本は作成したいディレクトリに移動してから作成。
※移動しなくても作成は可能

### 仮想環境作成コマンド
```
python3 -m venv [仮想環境名]
```
ファイル名がない場合は「venv」
***  

### アクティブ化コマンド
```
source [仮想環境名]/bin/activate
```
***  

### アクティブ解除コマンド
```
deactivate
```
***  

### 削除方法
作成したディレクトリに仮想環境名のフォルダがあるのでそれを削除して完了。
***  

## まとめ😺
私自身、汚い環境が苦手なこともあり、非常に気持ちいい環境で作業できてる感じが気持ちいいです🥴
***
windows11でVSCodeのRemote-SSHを使用してEC2に接続しようとすると、「It is required that your private key files are NOT accessible by others. > This private key will be ignored.」と表示された場合の１つの解決策

## 状況
* Windows11に最近アップデート
* AWSを学んでみたいと、EC2上にapacheを立ててhtmlにアクセスできるか試し中

## 発生したエラー
VCCodeの拡張機能「Remote-SSH」を使用して、VCCode左のリモートエクスプローラーから接続しようとすると、  
「It is required that your private key files are NOT accessible by others. > This private key will be ignored.」
のエラーが発生

## 解決策
pemファイルをデスクトップに作成したフォルダ内に格納していたのだが、
.ssh/configのIdentityFileに記載しているpemファイルまでのパスにOneDriveを含んでいたため、
発生していた。
OneDriveを含まないパスにすれば解決

## 余談
おそらく権限を変更しても解決しそうなのだが、一緒に進めていたWindows10の同期がすんなり接続できていたため試してみた。
ちなみにOneDrive上でなく、ローカルのデスクトップに戻したい場合は以下の手順で戻せます。
1. エクスプローラーからOneDriveを右クリック
2. OneDrive→OneDriveのバックアップを管理を選択
3. デスクトップをOFFにする
4. ユーザー/ユーザー名のデスクトップが表示されるので、OneDriveのデスクトップの内容をコピーしてくる
Elevating Your Brand with High-Quality, Professional Labels in the Heart of the Midwest				

After years of having been a local shop in our community, we have broken out into an online store in order to sell our products to a wider audience. Everything is made in-house. We use professional machines to make our products so the quality is better than a lot of places online, and we have a 5 star review on Etsy. 				

Shop Now- https://stellasstickers.com/		![Untitled design (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691293/3db0ca50-b5ef-379c-2e13-10c457fc67a0.png)
お名前ドットコムのネームサーバを切り替えて別AWSアカウントのホストゾーンへ移行する方法

お名前ドットコムで取得しているドメインのNSを切り替え、あるAWSアカウントにあるホストゾーンを別のAWSアカウントのホストゾーンへ移行する方法です。

お名前ドットコム以外のドメイン取得サービスでもやる事はほとんど変わらないので、参考になれば幸いです。

移行元のAWSアカウントのホストゾーンをエクスポートし、移行先に同じドメイン名でホストゾーンを作成後にインポート、最後にNSの切り替えを行います。

公式の方法でエクスポート・インポートをする場合、エクスポート後にファイルを修正したりなどが面倒だったため、cli53というツールを使いました。

macの場合はbrewからインストールできます。
```
brew install cli53
```

windowsの場合は下記からインストーラーのダウンロードができます。
https://github.com/barnybug/cli53/releases/tag/0.8.22

移行元と移行先のAWSのcredentialを定義している前提で説明します。
なんのこっちゃ分からない…という方は[こちら](https://qiita.com/bakira/items/3a4876cbb39f9a7ec3b8)の記事を読んで設定してください。

cli53を使ってエクスポートを行います。
下記コマンドで移行元のホストゾーンのエクスポート(ゾーンファイルの出力)を行います。
```
cli53 export --profile profile_a example.com > example.com
```

次に移行先のホストゾーンを作成します。
```
cli53 create --profile profile_b example.com
```

作成したホストゾーンに対してインポートします。
ちなみにSOAレコードとNSレコードは**上書きされない**のでご安心ください。
```
cli53 import --profile profile_b --file example.com example.com
```

正しくインポートが出来ているか確認します。
```
cli53 export --profile profile_b example.com
```

このとき、NSレコード4行を控えておきます。
```
@	172800	IN	NS	ns-xxx.awsdns-xx.org.
@	172800	IN	NS	ns-xxx.awsdns-xx.com.
@	172800	IN	NS	ns-xxx.awsdns-xx.co.uk.
@	172800	IN	NS	ns-xxx.awsdns-xx.net.
```

表示された内容を確認し、大丈夫そうならNSの切り替えに移ります。
本記事ではお名前ドットコムで説明していますが、他のドメイン取得サービスでも大きく変わらないはずなので置き換えて頂ければと思います。

お名前ドットコムにログインし、ネームサーバーの設定メニューから「ネームサーバーの設定」を選択します。

該当のドメイン名のリンクを押下し、チェックボックスにチェックを入れて「他のネームサーバーを利用」を選択します。
すると現在のネームサーバの情報が入力されているため、先ほど控えたNSレコードに書き換えます。

![スクリーンショット 2024-02-03 15.18.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1671245/92977672-8681-df8d-b4e8-42f1278b3bc9.png)

書き換えたら「確認画面へ進む」で内容を確認し、OKなら「設定する」ボタンを押下します。

しばらく待ってみて下記コマンドで新しいNSに切り替わっていれば成功です。
```
nslookup -type=NS example.com
```

早めに確認したい場合はGoogleやCloudflareのDNSを使って確認します。
```
nslookup -type=NS example.com 8.8.8.8
```

```
nslookup -type=NS example.com 1.1.1.1
```

これでダウンタイム無しで移行は完了です。
おつかれさまでした。

※各プロバイダーのキャッシュが消えるタイミングが違うので、古い方のホストゾーンも3日ほど残しておくのが良いと思います。

※cli53は使い勝手が良いのでホストゾーン周りをいじる際は今後も活躍しそうです。
VSCodeで、remote-sshを用いてログインできなくなった原因→サーバ側の容量超過。

Vscodeでリモートサーバにログインするため、パスコードを入れました。
しかし、接続できないとのエラーがありました。
突然の事でびっくり。

結論原因は、サーバ側の容量超過でした。


以下、容量確認画面
quota -s
quota: invalid option: -s
Disk quotas for usr xxxxxxx (uid yyyy): 
  Filesystem         kbytes          quota          limit  grace      files      quota      limit  grace
       /home      100964664      100000000      110000000   none     314039    1000000 



/homeディレクトリで、quotaを超える容量を使用していました。
リモートサーバーにVS Codeサーバーをインストールでするための容量が足りず、接続できないみたいでした。

/homeディレクトリの容量を減らした結果、ログイン成功！
最近RDS周りで勉強したこと②

最近業務を通じてRDBについて色々勉強したのでその内容をまとめました。 
どなたかの参考になりましたら、幸いです😌
# Stored Procedureとは？

### 定義
データベースに保存される一連のSQLステートメントやロジックの集まりであり、名前を付けてデータベース内に保存され、アプリケーションから呼び出すことができるデータベースオブジェクトです。Stored Procedureは主にデータベース内での処理のカプセル化や再利用を可能にし、データベースアクセスの効率を向上させるのに役立ちます。

```
CREATE PROCEDURE procedure_name
    @parameter1 data_type,
    @parameter2 data_type,
    ...
AS
BEGIN
    -- SQL ステートメントやロジックをここに記述
END;
```

### そのメリットとデメリット
# メリット:

- 再利用性: 
プロシージャは同じロジックを何度も実行でき、データベース内で効果的な再利用が可能です。これにより、冗長なコードの繰り返しを防ぎ、保守性が向上します。
- ネットワークの削減: 
プロシージャはデータベース内に保存されるため、アプリケーションとデータベースの間で実行されるSQLステートメントのネットワークトラフィックが削減されます。これにより、データの取得や処理の効率が向上します。
- アプリケーションとデータベースの分離: 
プロシージャにより、データベースロジックがデータベース内に隔離されます。これにより、アプリケーションコードとデータベースロジックの分離が促進され、保守性が向上します。
- トランザクション管理: 
プロシージャ内で複数のSQLステートメントが一連のトランザクションとして実行されるため、トランザクションの一貫性が確保されます。
- アクセス制御: 
プロシージャにはアクセス権を設定でき、特定のユーザーやアプリケーションだけがプロシージャを実行できるようにできます。これにより、データベースのセキュリティが向上します。
### デメリット:
- 学習コスト: 
プロシージャの作成や管理にはSQLプログラミングの知識が必要であり、初学者にとって学習コストがかかることがあります。
- データベース依存性: 
プロシージャがデータベースに依存しているため、データベースを変更する場合にはプロシージャも変更が必要となり、保守性に課題が生じることがあります。
- パフォーマンスの制約: 
一部のデータベースシステムでは、プロシージャのパフォーマンスがクエリよりも低い場合があります。最適化が不足していると、実行計画の再生成が頻繁に行われ、オーバーヘッドが発生することがあります。
- 複雑性とメンテナンス: 
大規模なプロシージャが複雑になると、理解やメンテナンスが難しくなります。コードが増えると、デバッグや変更が困難になることがあります。
- プラットフォームの依存性: 
プロシージャがデータベースプラットフォームに依存しているため、異なるデータベースシステムで同じプロシージャを使用することが難しいことがあります。

### 所感
メリットとして感じているのは、再利用性です。演算項目設定機能など計算結果を保存する機能を実装する際にはその実行したりクエリをStoredProcudureにもたせることで煩雑なロジックにならず実行できます。ただ、デメリットは複数RDBを使う場合です。業務で保守・運用しているシステムだとSQLServerとPostgresの両方の顧客がいるので、顧客に合わせてDBの種類で条件分岐させて実行する際に条件分岐させるなどの対応が煩わしいなという印象です。
(そもそもそんな仕様のシステムにした人が悪い気もしますが、、笑)
【初めてのJava】コードリーディングしてみた（スレッド / タイマー）

## はじめに
Java習得の修行の一環として、Javaのタイマー機能（util.Timer）のソースコードを読み、シーケンス図にしてみました。

https://github.com/openjdk-mirror/jdk7u-jdk/blob/master/src/share/classes/java/util/Timer.java

なお、例外フローと思われるものは反映させていません
また、シーケンス図として正確ではない箇所もあるかと思います。

## シーケンス図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3669288/55c322c3-946d-ecb5-1420-c5161332d47e.png)


## 感想
タイマーの使い方もそうですが、排他制御やスレッドの書き方など　色々と勉強になりました。

JavaのTimer機能は使ったことがありません。
そこであえて使い方を調べずに、またソース中のコメントもあまり読まずに
ソースコードだけで何をしようとしているのかをつかもうとしました。
（最後に使い方を調べて、間違えた箇所を修正してからqiitaにアップしています）

結果、最初に述べたように勉強になったなと感じています。（時間かかりましたが）
正直を言うと、細部のところでイマイチ把握出来ていない部分（fixDownなど）もあるので、もう少し時間を取りたいと思います。
PythonでUIをつくる【３Dモデルを表示する】

![Feb-03-2024 15-07-25.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/824e0556-ae03-23c0-2fbd-ce134584bf4a.gif)

# 必要なライブラリをインストール

```shell
pip3 install pyqt5
pip3 install pyqtgraph
```

PythonでGUIをつくるライブラリや３Dを表示するライブラリはいろいろありますが、今回は
pyqt5（GUI）
pyqtgraph（3D表示）
を使います。

# 3Dを表示できるウィジェットを表示

画面を出す。

```python
import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel
from PyQt5.QtGui import QPixmap
import pyqtgraph.opengl as gl
import numpy as np
from stl import mesh  # numpy-stlを使用
import cv2

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        
        self.setWindowTitle("PyQt with 3D Model")
        self.setGeometry(100, 100, 800, 600)

        self.widget = gl.GLViewWidget(self)
        self.widget.setCameraPosition(distance=500)  # カメラの距離を調整
        self.widget.setGeometry(0, 0, 800, 600)
        self.widget.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())
```

![スクリーンショット 2024-02-03 15.17.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/76631d02-2a96-6bb2-7400-98298dee425c.png)

黒い画面が表示される。

# ３Dモデルを作ってウィジェットに与える

今回はstlファイルを表示する。

```python
def createModel(self,model_path):
    # STLファイルの読み込みと3Dモデルの作成
    your_mesh = mesh.Mesh.from_file(model_path)  # STLファイルパス
    vertices = np.array(your_mesh.vectors, dtype=np.float32)
    faces = np.arange(vertices.shape[0] * 3, dtype=np.uint32).reshape(vertices.shape[0], 3)
    model = gl.GLMeshItem(vertexes=vertices.reshape(-1, 3), faces=faces, smooth=False, color=(1, 1, 1, 1), shader="shaded")
    
    return model
```

```python
self.model = self.createModel("cola.stl")
self.widget.addItem(self.model)
```

これで３Dモデルが表示され、マウスドラッグで回転させられる。

![Feb-03-2024 15-07-25.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/824e0556-ae03-23c0-2fbd-ce134584bf4a.gif)


🐣
****
フリーランスエンジニアです。
AIについて色々記事を書いていますのでよかったらプロフィールを見てみてください。

もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習／AR関連の情報を発信しています。

[X](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
【AndroidStudio】SDKバージョンのアップデートにはAndroid SDK Upgrade Assistantが便利

＃ はじめに
Androidバージョンは大体1年に一度上がる形で更新がなされているかと思いますが、内容によってはエンジニアが非常に苦労するような内容の濃いアップデートもあるかと思います。
その都度影響範囲や対応すべき内容を調べたりすると思いますが、実はAndroidStudioには SDKバージョンを上げる際にサポートしてくれる便利なAssistant機能が存在します。
今回はそんな便利なAndroid SDK Upgrade Assistantをご紹介したいと思います。

# Android SDK Upgrade Assistant
Android SDK Upgrade Assistantは数あるAssistant機能の中で対応SDKバージョンを上げる際に便利な機能です。
表示の仕方としてはいくつかあります。

①　Tools > Android SDK Upgrade Assistantを選択して表示する。

![スクリーンショット 2024-02-03 15.04.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/e3dd7775-d879-494e-1a99-af7476116feb.png)

②　警告バルーンから、Launch Android SDK Upgrade Assistantを選択して表示する

![スクリーンショット 2024-02-03 15.03.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/8efe16cd-5d8c-adb8-c203-e3109c0e456d.png)

主に上記二通りから表示が可能です。
上記手順により表示すると、以下のようなAssistant画面が表示されます。

![スクリーンショット 2024-02-03 15.06.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/ff0a010c-1abf-74b0-3906-9b8d674ed3a5.png)

上記の中からアップデートしたいバージョンを選択することで、そのアップデートに関連のある差分を知ることが可能です。
例えば、13から14に上げる項目を選択すると以下のような表示になります。

![スクリーンショット 2024-02-03 15.09.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/e315e0e8-7076-fade-2fef-5aba757f810e.png)

そのバージョンに関係のある差分やアップデート情報などが事細かく記載されています。
また、項目ごとに詳細のリンクが用意されているので、気になる項目のリンクからより詳細な情報を確認することが可能です。
アップデートに関する情報は断片的だったりして対応が漏れてしまうケースが懸念されますが、これであれば歯抜けになるリスクは最小限に抑えることができ、安全にアップデートが可能になります。

# さいごに
2月は少し時間ができるので、色々トライしていきたいというお気持ち表明しておきます。
プリミティブ型執着（「良いコード悪いコードで学ぶ設計入門」復習）

# 背景
「良いコード悪いコードで学ぶ設計入門」の復習の為です。TypeScriptで記述します。
今回は「プリミティブ型執着」についてです。

# プリミティブ型とは

https://developer.mozilla.org/ja/docs/Glossary/Primitive

プリミティブ (primitive、プリミティブ値、プリミティブデータ型) はオブジェクトでなく、メソッドを持たないデータのことです

number型、string型、boolean型等です。

# プリミティブ型執着とは
プリミティブ型を乱用したコードのことを言います。
以下の記事での定義も引用させて頂きます。

https://qiita.com/arakaji/items/eb8a93cac1d8e83d53fc

>ドメインの概念を表すのに基本データ型を用いること
>例
>- メッセージを表すのに文字列を使う
>- 金額を表すのに整数を使う

今回の例では郵便番号と住所を扱います。

```typescript:Address.ts
const fetchZipcodeByGoogleMapLink = async (googleMapLink:string,address:string) => {}

const validateAddressForZipcode = (address:string)=> {}

const fetchZipcodeByOriginalApi = async (address:string) => {}

const formatZipcode = (zipcode:string) => {}

const formatAddress = (address:string) => {}

```

# プリミティブ型執着によって起こる問題
- 同じ処理を複数箇所で記述
    ```Address.ts
    const formatZipcode = (zipcode:string) => {}
    ```
    別のファイルで同じ処理を記述してしまいます。
    ```b.ts
    const formattedZipCode = (zipCode:string) => {}
    ```

- 可読性の低下
Address.tsファイル内で修正、機能追加をすると住所、郵便番号の処理が複雑化していきます。

# 意味のあるクラスを作る
AddressクラスとZipCodeクラスを作ります。
各クラスそれぞれに関連のあるロジックを凝集させることができます。

```Address.ts
class Address {
    private address:string;

    constructor(address:string){
        if(!address) throw new Error('住所が空で渡されました')
        this.address = address;
    }

    private validateAddressForZipcode(){
        this.address = ~~~
    }

    private reshapeKyotoAddress(){}

    getAddress(){
        ~~~~~~~~
        return this.address();
    }
}
```

```ZipCode.ts
class ZipCode {
    private zipcode:string|null = null;

    async getZipcode(address:Address){
        await setZipcode(address:Address);
        this.formatZipcode();
        return this.zipcode
    }

    private async setZipcode(address:Address){
        const reshapedAddress = address.getAddress();
        this.zipcode = await this.fetchZipcode(reshapedAddress);
    }

    private async fetchZipcode(address:string){
        const promiseArray = [this.fetchZipcodeByOriginalApi(address),this.fetchZipcodeByGoogleMap(address)];
        resultList = await Promise.allSettled(promiseArray);
        ~~~~~~~~~~~
    }

    private async fetchZipcodeByOriginalApi(address:string){}

    private async fetchZipcodeByGoogleMapLink(address:string){}

    private createGoogleMapLink(address:string){}

    private formatZipcode(){
        this.zipcode = ~~~~;
    }
}
```

```call.ts
const address = new Address('広島県広島市南区段原1丁目1-1');
const zipcode = new ZipCode().getZipCode(address);
```

# その他
プリミティブ型の引数が多い時にも、その引数をインスタンス変数に持つ意味のあるクラスでまとめられると可読性が改善できます。

# 最後に
- データはプリミティブ型だけで実装はできますが、データとそのロジックを一つのクラスで管理するのはバグも起きづらく、可読性も上がるので有効だなと思いました
- プリミティブ型執着を回避するのを業務のコードにも使う場面があれば導入したいと思います
- 無理にこのプリミティブ型執着を回避するのではなく、本当に概念としてクラス化できるか考えた上で行いたいです
- オブジェクトでまとめたことはありますが、ロジックは別で書いていたことがあるのでそこをクラス化して改善したいです

# 参考
- [Primitive-obsession(基本データ型への執着)](https://qiita.com/arakaji/items/eb8a93cac1d8e83d53fc)
- [良いコード悪いコードで学ぶ設計入門](https://gihyo.jp/book/2022/978-4-297-12783-1)
最近RDM周りで勉強したこと①

最近業務を通じてRDBについて色々勉強したのでその内容をまとめました。
どなたかの参考になりましたら、幸いです😌

# Viewとは？

### viewの定義
ビューとは、クエリによって内容が定義される仮想テーブルです。 ビューは、テーブルと同様に、一連の名前の付いた列とデータ行で構成されます。 インデックスが設定されていないと、データベース内に保存された一連のデータ値としてビューが作成されることはありません。 データは、ビューを定義するクエリが参照するテーブルから取り出され、ビューの行と列はビューを参照したときに動的に作成されます。

```viewの作成例
CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;
```

### viewを使うことのメリットとデメリット
一般的には下記のようなことが言えると思います。

### メリット:
- 簡略化されたクエリの利用:
ビューはクエリを簡略化し、複雑な結合や条件を内部的に処理できます。これにより、データへのアクセスが容易になります。
- セキュリティの向上:ビューを使用すると、ユーザーに必要なデータのみを公開することができ、不要な情報へのアクセスを制限できます。セキュリティとアクセス制御の観点から有用です。
- データの抽象化:
ビューは基礎となるテーブルの構造を抽象化するため、データモデルの変更があってもビューの定義だけを変更すれば済みます。これにより、アプリケーションがデータ構造の変更に追従しやすくなります。
- 再利用性:
ビューは再利用可能なオブジェクトであるため、同じデータセットに対して異なるクエリを使用する必要がある場合や、複数のクエリで同じ結果を利用する場合に便利です。
### デメリット:
- パフォーマンスの低下:
ビューが複雑なクエリや多くのテーブルを結合している場合、実行時に性能の低下が発生する可能性があります。
- 更新の制限:
特定の条件下では、ビューが更新対象として使用できないことがあります。たとえば、複数のテーブルを結合したビューは、一部の条件下では更新できません。
- 定義の変更が制限される:
一部のビューの定義を変更する場合、ビューを使用しているクエリやアプリケーションに影響を与える可能性があります。定義の変更が難しい場合があります。
- 実行計画の複雑化:
複雑なビューは、実行計画が複雑になり、最適なクエリの実行が難しくなることがあります。
インターネットの基幹技術について

### はじめに

「なぜ、該当サーバーを特定できるのか？」やURLにアクセスできる仕組みについて、サーバー周りのことを学ぶことが最近多いので備忘録。
学ぶ順番を間違えたと後悔中・・

### よく、リクエスト・レスポンスと出てくるがその過程に至るまでの経緯は？

開発に関してのを勉強する中で、httpリクエストやhttpレスポンスと出てくるが、そこに至るまでの工程はどうなっているか？

```
① 例　http://www.sample.comへアクセス

② 該当ドメインのIPアドレスを検索するため、クライアントコンピューターとDNSサーバーでやり取りを行い、
該当のWebサーバーを特定する
※DNSサーバーは、リクエストのドメインをIPアドレスに変換し、該当のWebサーバーを検索・特定する

③ クライアントコンピューターと②で特定したWebサーバーとの間で、TCP/IP接続を行う
※http通信は、TCP上に構築されるため

④ ③までの工程を終えて、ここでhttpリクエスト⇔httpレスポンスが行われる
```

### よく出てくるワードについて　※独自の見解です

:::note info
ホスト
→ 資源を提供するコンピューターのこと
※リソースだとなかなかしっくりきていないので勝手に例えています。

ウェブサイトのホストは、ウェブサーバーコンピューターやメールサーバーコンピューターを指す。
ホスト名は、セカンドレベルドメインやサブドメインで表される
:::

:::note info
ドメイン
→ 資源（リソース　ウェブサーバーなど）を特定するものであり、ユーザーが分かりやすい名前で表されている。以下の3種類がある。

・トップレベルドメイン　→ 「.jp」や「.com」などを指す
・セカンドレベルドメイン　→ 例えば、example.comであれば、「example」の部分を指す
・サブドメイン　→ 例えば、www.example.comであれば、「www」の部分を指す
:::

:::note info
IPアドレス
→ コンピューター上で、ネットワーク上のデバイス（サーバーやネットワーク機器）を識別する識別子のこと。
:::

また随時更新します。
nginxのインストール方法

## nginxのインストール方法
備忘録であり、リンク先の資料のほうがわかりやすいし、丁寧。
### 環境
- ubuntu22.04
### nginx
https://nginx.org/en/linux_packages.html#Ubuntu

### 流れ
Step1: 依存パッケージをインストール
Step2: GPG keyを追加
Stpe3: source.listを追加
Stpe4: apt update
Step5: apt install

#### Step1: 依存パッケージをインストール
```
sudo apt update
sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring -y
```
#### Step2: GPG keyを追加
```
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
```
確認: 
```
gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
```
#### Stpe3: source.listを追加
```
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list
```
#### Stpe4: apt update
```
sudo apt update
```
#### Step5: apt install
```
sudo apt install nginx -y
```
node-red-contrib-s3モジュールでAmazon S3 bucketのSession Token対応してみた

# はじめに

以前、Herokuのdyno無料枠が廃止された際に、移行先(代替え先)の検討をしました。

https://qiita.com/kitazaki/items/970a10cbd1059c89aca5

その中の一つ、Cyclicはcomputeリソース以外にストレージリソース(AWS S3 bucket)が提供されています。

しかし、外部から直接AWS S3 bucketへアクセスする場合、通常のAccess Key、Secret Access Keyに加えて、60分間だけアクセスできるSession Tokenを使用する必要があります。

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/b16f2a6e-ad3b-36ab-9586-ab0e1d6d0ba3.jpeg)

# Session Tokenに対応する

Cyclicの管理画面で、Data/Storage項目で表示されるLocal Credentialsをコピーして、ターミナルで実行すると、環境変数としてCredential情報が設定されます。

### リスト表示するプログラム(Javascript版)

```javascript
const { S3Client, ListObjectsV2Command } = require("@aws-sdk/client-s3");

// AWS認証情報とクライアントを設定
const s3Client = new S3Client({
    credentials: {
        accessKeyId: process.env.AWS_ACCESS_KEY_ID,
        secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
        sessionToken: process.env.AWS_SESSION_TOKEN
    },
    region: 'ap-southeast-2'
});

// S3バケット内のファイルリストを取得する関数
async function listS3Bucket(bucketName) {
    try {
        const data = await s3Client.send(new ListObjectsV2Command({ Bucket: bucketName }));
        console.log("Bucket Contents:", data.Contents);
    } catch (err) {
        console.log("Error", err);
    }
}

// バケット名を指定して関数を呼び出し
listS3Bucket('cyclic-easy-pike-poncho-ap-southeast-2');
```

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/85132471-4c89-eda5-96e3-e8f9bbbf0cf8.jpeg)

### リストを表示、ファイルをアップロード・ダウンロードするプログラム(Python版)

```python
import boto3

s3 = boto3.resource('s3')

BUCKET_NAME = 'cyclic-easy-pike-poncho-ap-southeast-2'

# バケット内の全オブジェクトを表示
bucket = s3.Bucket(BUCKET_NAME)
objects = bucket.objects.all()
for obj in objects:
    print(obj.key)

# オブジェクトをアップロード
#bucket.upload_file('file.txt', 'file.txt')

# オブジェクトをダウンロード
#bucket.download_file('file.txt', 'download.txt')
```

### node-red-contrib-s3

Session Tokenに対応したカスタムノードを作成しました。

https://github.com/kitazaki/node-red-contrib-s3

2024年2月1日にマージされました。🎉

https://github.com/DiegoViniciusCosta/node-red-contrib-s3/pull/7

# サンプル

ねこ画像APIでねこ画像を取得し、S3へ格納、S3から取得するサンプルフローです。

![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/81623b2f-e51b-7132-85a3-8126b521b123.jpeg)

![スクリーンショット 2024-02-03 14.41.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/e73cbb44-3a7a-1b38-636b-15036e099803.png)

![スクリーンショット 2024-02-03 14.41.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/8c6b432f-4c50-b52e-44e2-b265727fdb9f.png)
基本情報これだけ（2023新形式、エンジニア1~2年程度経験者向け）

# これは何？

基本情報技術者試験取得の記事は何番煎じだという感じですが、
2023年4月以降の新形式かつエンジニア経験が少しある人向けの記事があまりなく、
また基本情報は試験形式も少し分かりづらいので「これだけやって合格しました」ということを簡単にまとめます。

### 基本情報技術者試験の概要

https://www.ipa.go.jp/shiken/kubun/fe.html

https://www.tac-school.co.jp/kouza_joho/joho_fe/fe_henkou.html

### 前提

私はUdemyを使いましたがUdemyの講座は普通に買うと高いので、
セールのときに買うか同じような内容の書籍を購入することをおすすめします。

### 筆者のステータス

- エンジニア歴
    - 2022年1月～
    - 主にJavaを使ってERPパッケージソフトウェアの保守・開発をしています
- 受験日
    - 2023年11月18日(土)
- 勉強期間
    - 10月~11月受験日まで約1か月半、週末両日勉強していました

# 勉強したこと

- 科目A
  - 概要把握(Udemyなどで)
  - 基本情報過去問道場で直近5回分マスター
- 科目B
  - 問題を解く(Udemyなどで)

これのみで私は合格できました。
以降、詳細を書きます。

#### (一応結果は以下の通りでした)
- 科目A評価点 770点
- 科目B評価点 775点
（満点、合格基準点は以下の通りです。）
合格基準 科目A評価点 600点以上／1,000点
合格基準 科目B評価点 600点以上／1,000点

## 科目A

### 概要把握(Udemyなど)

まず基礎知識をインプットします。
私はUdmeyの以下講座を使いましたが書籍でも類似内容のものはあると思います。

https://www.udemy.com/course/lerning-fe/

この講座は知識のインプット→過去問という流れで構成されています。
**インプットのセクションだけ**一旦最後まで見てください。
倍速機能を使うことをおすすめします。
エンジニア経験のある方は既知の内容も多いと思いますのでその範囲は
飛ばしながら見ていただいて大丈夫です。
とにかく一旦概要を把握することに専念します。

### 基本情報過去問道場で直近5回分マスター

基本情報技術者試験ドットコムの過去問道場で問題を解きます。

https://www.fe-siken.com/fekakomon.php

直近5回分の過去問を解けるようになればOKです。
私は以下の手順で学習しました。
- 「試験回を指定して出題」から最新の回のみチェックして出題開始
- 分からない問題はチェックを付けてメモツールなどにメモしておく（私はNotionにメモしていました）
    - このときにUdemyの講座で解説されていたものは見返してメモしていました
- 1周終わったらチェックが付いた問題のみ解き直す
- 間違えた問題が全部解けるようになったら次の回に進む

## 科目B

### 問題を解く(Udemyなどで)

こちらも私はUdemyを使いましたが、類似内容の書籍もあると思います。
Udmeyは以下の講座がおすすめです。

https://www.udemy.com/course/kihon_joho_b/

この講座後半のサンプル問題や模擬試験の範囲だけを3周くらいして、
内容を理解して全て解けるようにしました。

# 多分これで受かると思います

エンジニア経験が少しある方はこの記事の内容で十分だと思いますが、
これだけ学習すれば絶対合格できます！と保証するものではないのでご了承ください。
皆さまのご参考になれば幸いです。
ChatGPT retrieval plugin + LangChainを試すメモ

# はじめに
前回までにConohaVPSに構築したPostgreSQL+pgvector+ChatGPT retrieval pluginをローカルPCからLangChainで試します。
社内文書の検索やQAの無人化などに使えればと考えて検証をしました。

# 環境について
ConohaVPSのretrieval pluginには自宅のNASを経由してSSHトンネルで接続しています。
Anaconda上にPython 3.11環境を構築し、その上でJupyterNotebookを利用しています。
このあたりの導入については、他のブログなどを参考にしてください。

# LangChainを試す
まずは必要になるパッケージを導入します。
```
!pip install langchain
!pip install langchain-openai
!pip install openai
```
次にOpenAIのAPIキー、retrieval pluginのBearerトークンを設定します。
```
import os
os.environ["OPENAI_API_KEY"] = "sk-...(OpenAIのAPIキー)"
from langchain.retrievers import ChatGPTPluginRetriever
retriever = ChatGPTPluginRetriever(
    url="http://192.168.0.xxx:8000（retrieval pluginのIP及びポート）", 
    bearer_token="ey...(Bearerトークン)"
)
```
RetrivalQAのキーチェーンの作成
langchain.chat_modelsを利用することで使う大規模言語モデルを指定することができます。
利用可能なモデルやパラメータなどは下記URLに記載されています。
https://platform.openai.com/docs/models
https://platform.openai.com/docs/api-reference/chat/create
```
from langchain_openai import OpenAI
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
qa = RetrievalQA.from_chain_type(
    llm=ChatOpenAI(model_name="gpt-3.5-turbo-0125", temperature=0),
    #llm=ChatOpenAI(model_name="gpt-4", temperature=0),
    chain_type="stuff", 
    retriever=retriever
)
```
# 検証
簡単なQAを試す
```
qa.run("SiriLでは天体写真のどのような画像処理が可能ですか?日本語で教えてください。")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203259/81ecacb9-1270-e5d5-0e64-24f44a2777c0.png)
上記のような回答が返ってきました。
この結果がドキュメントのどの個所を参照されたかを確認するためには```return_source_documents=True```を指定してキーを作成します。
```
from langchain_openai import OpenAI
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
qa = RetrievalQA.from_chain_type(
    llm=ChatOpenAI(model_name="gpt-3.5-turbo-0125", temperature=0),
    #llm=ChatOpenAI(model_name="gpt-4", temperature=0),
    chain_type="stuff", 
    retriever=retriever,
    input_key="question", return_source_documents=True
)
```
再度質問をします。上記設定をするとrunが使えなくなるので下記のような形で問い合わせと結果を確認します。
```
result=qa("SiriLでは天体写真のどのような画像処理が可能ですか?日本語で教えてください。")
print(result)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203259/97d89bde-766a-ef94-3a55-0662123deb86.png)

参照されたドキュメントの箇所などを確認することができます。

# API使用量など
- PDFファイルをインポートしたときのリクエストアクティビティは下記のグラフを参照してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203259/768be9ef-c593-f0b6-f8b5-e03f0da46c75.png)

- 数回質問した後のGPT-3.5TurboとGPT-4のリクエストアクティビティは下記のグラフを参照してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203259/4acbcd3a-65d2-e1e7-8ca6-381a587c4a98.png)



以上です。
Chrome で利用可能なカメラの解像度・フレームレートやデバイス名を手軽に確認する（＋余談）：「chrome://media-internals/」

Chrome でカメラ画像を入力としたプログラムを書くことが良くあります。

自分がよく使うものだと、例えば [p5.js の createCapture()](https://p5js.org/reference/#/p5/createCapture)　や、JavaScript で扱う方法の 1つの [MediaDevices の getUserMedia() メソッド](https://developer.mozilla.org/ja/docs/Web/API/MediaDevices/getUserMedia)を使った方法です。

そのカメラ画像を使う際に、入力で利用するカメラの解像度やフレームレートはどんな値でも使えるわけではなく、カメラごとに決まった値があります。

それを Chrome上で簡単に確認する方法の 1つが、今回の「chrome://media-internals/」を使った方法です。

## 使い方
使い方は簡単で、Chrome の アドレスバーに「chrome://media-internals/」と入力して、その後に「Video Captureタブ」を選択するだけです。

そうすると、以下は自分の場合の例ですが、このようにデバイス名と、それらのデバイスで利用可能なフォーマット（解像度、フレームレート）などの一覧を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/dab3d111-b84e-6667-e88e-b216b78dc1b4.png)

## おわりに
この「chrome://media-internals/」を使った確認方法について、時々、利用したくなることがでてきては検索しているような状況になったので、見返しやすいようにシンプルな記事にしました。

## 余談
今回の「chrome://media-internals/」は、Video Capture 以外に、複数のタブがあり、他の情報も見ることができます。

さらに、「chrome://。。。/」という形式で見られる情報は、他にもいろいろあるのですが、それらを一括で確認する方法があります。
アドレスバーに「chrome://about」と入力するという方法です。

●Chrome「about:」コマンドのちょっと便利なまとめ | TECH+（テックプラス）
　https://news.mynavi.jp/techplus/article/20110708-a059/

このアドレスでアクセスしてみると、以下のような URL が一覧で表示されるページを見ることができます（以下は画面におさまっておらず、さらに下にも URL が記載されています）。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/89cce948-6990-0a5d-b31d-1c4e575bdefa.png)
【SharePoint】いちいち氏名やメアドを入力させたくないFormsの作り方【ゲストユーザー】

ゲストユーザーにFormsを回答してもらうとき、いちいち氏名やメールアドレスを入力させたくないですよね

それを解決したいと思います

# 条件
・SharePointに外部のゲストユーザーを招待
・Formsの「回答の送信と収集」で __”システム内のユーザーのみが回答できます”__ を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/3be5fb75-5bd5-e144-87c3-9ed9a4a39fdd.png)

まだこの状態だと、ゲストユーザーはFormsを開くことができません
なぜなら、MSアカウントへのログインを求められるから

# ここでワンポイント
それは


__SharePointにFormsを埋め込む__
これが一番大事
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/33a77e7a-7045-8fa3-6062-48ead68a79b4.png)


そうすることで
Formsさん「あ～SharePointにログインしてるということはテナント内の人かぁ～」と思ってくれます

中身の確認はPowerAutomateで回答結果を取得するとあら不思議
**回答者のメールアドレスが取得できます**


# さらに氏名を取りたいときは
「ユーザーの検索（V2）」を使いましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/3328ceb3-b700-3c98-4ae1-0c935a5a4eb1.png)

「ユーザープロフィールの取得（V2）」ではユーザープリンシパル名とIDでしか取得できないのでご注意を...




# 結果として
__ゲストユーザーなのにFormsの回答者を特定__ できます
　→ということは氏名やメールアドレスの入力が不要になり
　　→ __すっきりしたFormsをつくれた__




ゲストユーザーのために作っていたFormsは
「すべてのユーザーが回答可能」にしないと回答できなかった煩わしさから解放されました




めでたしめでたし
Windowsに、あのsudoコマンドを実装！？ - どうなるの？

# 序章
sudoコマンドを知っているでしょうか？linuxやmacを触っている人、VPS、プログラミング関係のことをしている人ならわかるでしょう。しかし、Windowsにはsudoコマンドがないらしく、いざ管理者権限で行うことをするには`右クリック` -> `管理者権限で開く`を押さなければできませんでした。
# 本編
そして、Windows Latestの2024年2月1日の記事「First look: Windows 11 is getting native macOS or Linux-like Sudo command」によると、MicrosoftがWindows 11に「sudo」コマンドの追加を準備している模様です。

https://www.windowslatest.com/2024/02/01/first-look-windows-11-is-getting-native-macos-or-linux-like-sudo-command/

これはWinddows Serverの更新プログラムに間違って実装してしまったと思います。機能しないから。

## sudoコマンドってなーに？
sudoコマンドは先ほど申した通り、指定したコマンドを管理者権限で実行するための`実行したいコマンドに管理者権限付与つけちゃうよコマンド`なんです。要するに`コマンドのコマンド`なんです。

## いつ出るの？
出される時期は分かっていませんが、現在sudoコマンドを設定アプリからONにしてもsudoコマンドは使えないといっているので現在開発中だと思います。
PowerShell初心者がこっそり躓いた話

## はじめに
今月参画した開発PJに`PS1`ファイルがありました。ビルドのタイミングで`PS1`スクリプトを実行する必要があったんですが、とあるエラーに止められてしまいました。実体としては5分くらいの調査&解消だったんですが、備忘録として記事を書いておきます。

## こっそり躓いた話
### 前提の話
WIndows10で開発していまして、VSCodeのターミナルで発生&解消できました。
### 遭遇したエラー
リポジトリ内の`PS1`スクリプトを実行すると下記エラーが発現しました。
```
PS (プロジェクトのパス)> .\sample.ps1 <...arguments>
.\sample.ps1 : ファイル(プロジェクトのパス)\sample.ps1 を読み込めません。
ファイル(プロジェクトのパス)\sample.ps1 はデジタル署名されていません。
このスクリプトは現在のシステムでは実行できません。
スクリプトの実行および実行ポリシーの設定の詳細については、「about_Execution_Policies」 を参照してください。
```
「デジタル署名」？？「実行ポリシー」??

ぼんやりと「権限修正して解消しよー」と考えたんですが、`chmod`が実行できないことに少し思考停止しました。（もしここで冷静に`cacls`コマンドを使用していた場合だともっと頭がこんがらがってしまっていたかもしれません苦）

少し冷静になって（諦めて）エラー本文を読んでみると、PowerShellポリシーに反して`PS1`ファイルを実行したことが原因のようです。

参考：[about_Execution_Policiesについて](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.4)

### 対処しました
エンジニア人生ここに来て初めてPowerShellボリシーの問題に遭遇しました。どうやら一時的にポリシーを変更するか該当ファイルに自己署名を付与するかのいずれかの解消方法があるとのことです。

参考：[PowerShell 実行時の「デジタル署名されていません」エラーの対処法](https://kondeneenen.com/powershell_digitalsignature/)

都度実行する必要はありますが、今回はポリシーを変更する方針で解消しました。
``` sh
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass 
```
`Bypass`と続けることでPowerShellを閉じればProcessの実行ポリシーは変更前に戻るそうです。自己署名を付与する場合、そのスクリプトを管理するのが手間だなと感じました。（セキュリティ的にもこちらの方が安全そうなので...）

お昼休憩では反省して下記のサイトで勉強しました。
Windows開発でしっかり一人前の働きができるように頑張ります。

参考：[PowerShellの実行ポリシー変更](https://qiita.com/earthdiver1/items/b3f529c81f5892972a72)

## おわりに
「そりゃそうだよ(笑)」となる先輩方がほとんどかと思いますが、「デジタル署名」「実行ポリシー」などのキーワードに一瞬たじろいでしまうくらいのヒヨコエンジニアなのでご容赦ください。躓きが「こっそり」で解消できただけ幸いでした。これからまた躓く度に更新していけたらと思います。

ここまで読んでいただきありがとうございました。
Spring Boot 新規のスタータープロジェクトで、pomがエラーになる場合

# 最初からエラー？なぜ？
新規のスタータープロジェクトを作成した時点でエラーになった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658170/4342fb7c-34af-2b25-e593-f63a602650ef.png)

# 原因
「3.2.2.RELEASE」というバージョンが存在しないから（らしい）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658170/af2e03ae-1e24-4ccc-e1a4-d04a03cea60b.png)

# 対処
「.RELEASE」を削除するとエラーが消える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658170/311c2740-52f3-6e56-1daf-781b3707cb19.png)

# ちょっとだけ追及

このサイトでバージョンが管理されているっぽい
https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent

3.2.2であれば、こちらに記載の記述で<parent>タグを設定してあげればよさそう
ゆえに「.RELEASE」が不要だったと解釈
https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent/3.2.2

# これだけだとダメっぽい
プロジェクトを更新してあげる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658170/677578a7-4650-f254-b7ff-ba7e68758a36.png)

※次の画面「Marven プロジェクトの更新」では、
　どこにも触れず「OK」ボタンを押せばよい

 # 直ったっぽい
 フォルダ構成が通常になった気がする
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658170/5410faf0-ef2b-2017-ccc1-ceb1c85b165f.png)
mpvのインストール方法

## CLI 音楽再生ソフト mpv　を apt でインストールする方法
### 環境
- Ubuntu20.04
- amd64
### official install guide
https://mpv.io/installation/
fruitというapt repositoryで管理されているっぽい
### fruit repository
https://fruit.je/apt
### fruit repositoryからmpvをインストールする流れ
- Step1: GPG keyをダウンロード
- Stpe2: source.listを追加
- Stpe3: apt update
- Step4: apt install
#### Step1: GPG keyをダウンロード
```
sudo curl --output-dir /etc/apt/trusted.gpg.d -O https://apt.fruit.je/fruit.gpg
```
#### Step2: source.listを追加
```
sudo touch /etc/apt/sources.list.d/fruit.list
echo 'deb [arch=amd64] https://apt.fruit.je/ubuntu jammy mpv' | sudo tee /etc/apt/sources.list.d/fruit.list
```
arch=amd64を指定しないとエラーが出ます。
#### Stpe3: apt update
```
sudo apt update
```
#### Step4: apt install
```
sudo apt install mpv
```
以上
Chrome拡張でクリップボードにテキストをコピーする(Manifest V3)


クリップボードにテキストをコピーする `navigator.clipboard.writeText` ですが、サービスワーカーでは `Window.navigator` が利用できません。しかし、タブにスクリプトを送り、実行させることで利用できます。

* サービスワーカーで `chrome.scripting` APIを利用します
* アクティブタブでスクリプトを実行させるため `activeTab` 権限が必要です

```json:manigeft.json
{
  "name": "タイトルとURLをコピー",
  "description": "ページのタイトルとURLを Ctrl+Shift+X でMarkdown形式にてコピーします。",
  "version": "1.0",
  "manifest_version": 3,
  "background": {
    "service_worker": "service-worker.js"
  },
  "commands": {
    "copy-title-and-url": {
      "suggested_key": {
        "default": "Ctrl+Shift+X",
        "mac": "Command+Shift+X"
      },
      "description": "Copy title and URL"
    }
  },
  "permissions": [
    "activeTab",
    "scripting"
  ]
}
```

```javascript:service-worker.js
chrome.commands.onCommand.addListener((command) => {
  chrome.tabs.query({ 'active': true, 'lastFocusedWindow': true }, tabs => {
    chrome.scripting.executeScript({
      target: { tabId: tabs[0].id },
      function: () =>
        navigator.clipboard.writeText(`[${document.title}](${location.href})`)
    });
  });
});
```

### HTML形式でコピーする場合
```javascript:service-worker.js
chrome.commands.onCommand.addListener((command) => {
  chrome.tabs.query({ 'active': true, 'lastFocusedWindow': true }, tabs => {
    chrome.scripting.executeScript({
      target: { tabId: tabs[0].id },
      function: () =>
        navigator.clipboard.write([
          new ClipboardItem({
            'text/html': new Blob(
              [`<a href="${location.href}">${document.title}</a>`],
              { type: 'text/html' }
            ),
            'text/plain': new Blob(
              [document.title],
              { type: 'text/plain' }
            )
          })]
        )
    });
  });
});
```

https://developer.chrome.com/docs/extensions/reference/api/scripting?hl=ja

https://developer.mozilla.org/ja/docs/Web/API/Clipboard/writeText
Incus: Gentoo Linux を使う

## image を探す

```bash
incus image list images:gentoo | grep amd64
```

## コンテナーのインストール

```bash
incus launch images:gentoo/systemd/amd64 gentoo
```

インストールされたことを確認

```bash
incus list gentoo
```

```text
$ incus list gentoo
+--------+---------+----------------------+------+-----------+-----------+
|  NAME  |  STATE  |         IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+--------+---------+----------------------+------+-----------+-----------+
| gentoo | RUNNING | 10.56.160.170 (eth0) |      | CONTAINER | 0         |
+--------+---------+----------------------+------+-----------+-----------+
```

## root パスワードの設定

```bash
incus exec gentoo bash
```

```text
$ incus exec gentoo bash
gentoo ~ # 
```

## login

```bash
incus console gentoo
```

```text
$ incus console gentoo
To detach from the console, press: <ctrl>+a q

gentoo login:
```

## Login 後の設定

ユーザー、パスワードの設定

```bash
useradd -u 1200 -m -G users,wheel,audio -s /bin/bash uchida
passwd uchida
```

sudo のインストール

```bash
emerge -avt app-admin/sudo --quiet
```

sshd のインストール

```bash
emerge -avt openssh --quiet
systemctl start sshd.service
systemctl enable sshd.service
```

vim のインストール

```bash
emerge --ask app-editors/vim
```

作成したユーザーでログイン

```bash
ssh 10.56.160.170
```

タイムゾーンの設定

```bash
sudo timedatectl set-timezone Asia/Tokyo
```
rex0220 計算式プラグイン 郵便番号の nnn-nnnn 自動変換

計算式プラグインで郵便番号を nnn-nnnn 形式に自動変換します。

# 概要

郵便番号を nnn-nnnn 形式に統一したい場合、計算式プラグインで自動変換できます。

![2024-02-03_12h33_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/95a573cd-0b76-34f9-c790-ec6bc76a8b47.png)

# 操作例

![2024-02-03_12h50_44.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/ee0ba5ff-5a25-46c3-b866-c581a330d135.gif)

# 計算式プラグイン設定

「循環参照を許可」をチェックし、郵便番号の計算式を設定します。

- 郵便番号の計算式
文字列を半角変換し、数字以外を削除、"-" を追加します。
数字が7文字以上の場合は、そのままにしています。

![2024-02-03_12h40_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/d904eac7-0a84-d439-c55d-c2360bcf30a7.png)

```.js
// 郵便番号 SINGLE_LINE_TEXT (editable)
LET(w,REPLACERE(ASC(郵便番号),"[^0-9]","g",""),
  IF(LENGTH(w)>3,LEFT(w,3)&"-"&SLICE(w,3),w),
)
```
メモ：libcurlの開発環境構築（WSL2 Ubuntu22.04）

# インストール手順
```shell
# makeの準備
sudo apt install gcc make unzip

# curlのソースコードを取得
wget https://curl.se/download/curl-8.6.0.zip
cd curl-8.6.0

# configure実行
./configure --with-openssl

# エラーが出たのでパッケージを追加
sudo apt libssl-dev libpsl-dev

make
sudo make install
```


# 動作確認
最低限のソースコードがビルドできればOK

```c:test.c
#include <curl/curl.h>

int main(void)
{
    CURL *curl;
    curl = curl_easy_init();
    return 0;
}
```

### ビルドコマンド
`gdb test.c -lcurl`
情報通信の技術

情報通信は「[内閣サイバーセキュリティセンターが重要インフラとみなす14分野](https://www.nisc.go.jp/policy/group/infra/index.html)」に含まれる、生活に不可欠な業界です。一方で情報通信の技術は高度に専門化しており、ITエンジニアにとってわかりにい用語が含まれます。この記事では用語紹介として、「[電子情報通信ハンドブック](https://www.ohmsha.co.jp/book/9784274035142/)」の目次を紹介します。個別の内容は機会がある時に紹介します。

https://www.ohmsha.co.jp/book/9784274035142/
## 1群 情報環境とメディア
- 1.1編 情報環境とメディアとは
- 1.2編 インターネット
- 1.3編 マルチメディアプラットフォーム
- 1.4編 モバイルマルチメディア
- 1.5編 仮想空間メディア
- 1.6編 マルチメディアと生活・娯楽
- 1.7編 マルチメディアと経済・産業環境
- 1.8編 マルチメディアと社会・情報倫理・制度
- 1.9編 情報メディア環境の安全性・信頼性
## 2群 脳と人間
- 2.1編 脳と神経モデル
- 2.2編 ニューラルネットワーク
- 2.3編 人工知能
- 2.4編 ロボット
- 2.5編 ヒューマンインタフェース
- 2.6編 文書処理と知的作業支援
- 2.7編 コラボレーションシステム
- 2.8編 医用電子と福祉
- 2.9編 感性情報処理
- 2.10編 教育
- 2.11編 アミューズメント
## 3群 画像・音声・言語
- 3.1編 画像処理
- 3.2編 パターン認識理論とコンピュータビジョン
- 3.3編 コンピュータグラフィックス
- 3.4編 画像の符号化
- 3.5編 3Dディスプレイ
- 3.6編 音声とその処理
- 3.7編 音声・オーディオ符号化
- 3.8編 音楽情報処理
- 3.9編 自然言語処理
- 3.10編 機械翻訳
## 4群 信号・システム・波動
- 4.1編 離散数学
- 4.2編 グラフとネットワーク
- 4.3編 関数解析
- 4.4編 確率と統計
- 4.5編 オートマトンと形式言語
- 4.6編 数理論理
- 4.7編 数値計算
- 4.8編 シミュレーション
- 4.9編 ファジィ
- 4.10編 回路の基礎
- 4.11編 アナログ回路
- 4.12編 ディジタル回路
- 4.13編 制御理論
- 4.14編 信号理論
- 4.15編 通信理論
- 4.16編 通信方式
- 4.17編 ディジタル信号処理
- 4.18編 非線形問題
- 4.19編 カオス・フラクタル・ソリトン
- 4.20編 情報理論
- 4.21編 符号理論
- 4.22編 トラヒック理論
- 4.23編 暗号
- 4.24編 電波伝搬
- 4.25編 音響と騒音
- 4.26編 超音波
## 5群 電子材料・デバイス・装置
- 5.1編 電子材料・デバイス・装置とは
- 5.2編 半導体
- 5.3編 磁性体・誘電体
- 5.4編 金属・超伝導体
- 5.5編 増幅・スイッチングデバイス
- 5.6編 発光・受光・撮像デバイス
- 5.7編 光伝送・回路デバイス
- 5.8編 電磁波伝送・回路デバイス
- 5.9編 センサ・弾性波デバイス・機構デバイス
- 5.10編 インタコネクション・実装技術
- 5.11編 情報ストレージ装置
- 5.12編 電子ディスプレイとプリンタ
- 5.13編 アンテナ
- 5.14編 通信ハードウェア先端技術
- 5.15編 電子通信用電源技術
- 5.16編 真空・低温・強磁場技術
## 6群 集積回路
- 6.1編 集積化技術とは
- 6.2編 高速化技術
- 6.3編 ローパワー技術
- 6.4編 メモリLSI
- 6.5編 信号・データ処理LSI
- 6.6編 アナログLSI
- 6.7編 システムオンチップ技術
- 6.8編 モノリシックマイクロ波集積回路(MMIC)
- 6.9編 LSI設計自動化技術
- 6.10編 プロセス・デバイス設計支援技術
- 6.11編 集積回路製造技術
- 6.12編 光電子集積回路
- 6.13編 新概念集積回路
- 6.14編 集積化センサとマイクロマシン
## 7群 情報通信ネットワーク
- 7.1編 情報通信ネットワークとは
- 7.2編 情報通信ネットワークの設計・運用・管理
- 7.3編 公衆ネットワークサービス
- 7.4編 専用・企業ネットワーク
- 7.5編 国際通信ネットワーク
- 7.6編 コンピュータネットワーク
- 7.7編 伝送システム
- 7.8編 交換システム
- 7.9編 アクセスシムテム
- 7.10編 通信線路
- 7.11編 地上固定無線通信
- 7.12編 移動通信
- 7.13編 衛星通信
- 7.14編 放送
- 7.15編 CATV
- 7.16編 情報通信の標準化
- 7.17編 情報通信の行政・組織・法制度
- 7.18編 情報通信の料金 直江
## 8群 コンピュータ
- 8.1編 コンピュータの歴史
- 8.2編 アルゴリズムとデータ構造
- 8.3編 コンピュータアーキテクチャ
- 8.4編 マイクロプロセッサ
- 8.5編 オペレーティングシステム
- 8.6編 プログラミング言語
- 8.7編 ソフトウェア工学
- 8.8編 分散処理
- 8.9編 データベース
- 8.10編 入出力システム
- 8.11編 パーソナルコンピュータ・ワークステーション・メインフレームコンピュータ
- 8.12編 スーパ・並列コンピュータ
- 8.13編 高信頼性コンピュータ
## 9群 産業・社会・環境
- 9.1編 交通情報システム
- 9.2編 気象・環境観測情報システム
- 9.3編 災害情報・危機管理システム
- 9.4編 医療情報システム
- 9.5編 行政情報システム
- 9.6編 流通情報システム
- 9.7編 金融情報システム
- 9.8編 経営情報システム
- 9.9編 生産情報システム
- 9.10編 コンカレントエンジニアリング
- 9.11編 環境・省電力技術
- 9.12編 環境電磁工学(EMC)