OmniAICreator/Qiita-1.07M huggingface dataset:
Daeja ViewONE Virtualでカスタム・スタンプを使用する

# カスタム・スタンプを使用したい
Daeja ViewONEでは、アノテーション機能を用いて、文字や図形などをPDFファイルに追記することが可能です。利用可能なアノテーションにはスタンプ機能が含まれ、テキストを含むスタンプや、画像イメージをスタンプとして利用することが可能です。紙からデジタルへのシフトが進んでいるといっても、ハンコ文化が根付いており、スタンプを押印したいという要件はまだまだあります。この記事ではカスタム・スタンプを機能を用いて任意の画像イメージをスタンプとして利用する方法について説明します。

## カスタム・スタンプの利用方法
カスタム・スタンプを利用するには以下の様にパラメータを指定すればOKです。
image:を指定することでイメージ・ベースのスタンプを指定することが可能です。

今回は固定の相対URLを指定しましたが、javascriptやサーブレッドなどを使用して異なる画像を用いるような要件に対応することも可能です。
https://www.ibm.com/docs/en/daeja-viewone/5.0.x?topic=style-stamps
```
<param name="annotationStamp1" value="image:../../hanko.png" />
<param NAME="annotationStampProperties1" value="<menu=はんこ>">
```

## 実際の動作イメージ
実際に動作確認してみましょう。
以下の様にスタンプメニューからスタンプを選択可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/e0c3be35-321f-b8df-bd46-dfe647ca7f6c.png)
PDFファイルにスタンプを押すことが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/d4d1b74e-ab6c-3658-fe16-105d2a4680fc.png)

また、テキスト・ベースのスタンプでは日付やユーザ名などを挿入することも可能になっています。

## 焼き付け処理
ViewONEでは焼き付け処理をサポートし、PDFにアノテーションを焼き付けることが可能です。しかし、残念ながら、イメージ・ベースのカスタム・スタンプの焼き付け処理はサポートされていません。焼き付けが必要な場合には、テキストベースのスタンプや他のアノテーションを利用するなど、代替案を検討する必要があります。

## まとめ
Daeja ViewONEでは、PDFにアノテーションを付加することが可能で、カスタム・スタンプ機能を用いることで任意の画像をスタンプとして利用することが可能です。
SWX3100の初期化

# SWX3100 初期化

1. コンソールポートで接続
2. スイッチの電源投入
3. 特権モードに遷移
4. リスタートコマンド投入
    SWX3100#cold start
5. 大文字のI(アイ)を連打
6. 「Initialize or not ?(y/n)」と表示されたら、yを入力
※わざわざコンソールで繋がずに電源ケーブルの抜き差しでもOKですが、
５と６を出すのが難しい環境もあると思うので、このような手順にしました。

# 詰まったら
- Please change the administrator password.と表示された場合
	SWX3100(config)#enable password ●●
	※デフォルトのパスワード(admin)を変える必要あり
    SWX3100(config)#end

- パスワードを間違えすぎてログインできなくなった
    しばらく待つか、再起動してやり直せばOK
    初期のログイン情報：admin/admin
s-nail で mail root できなかったのときの解決策

# 状況
```bash:Bash
[rocky@hoge ~]$ mail root
Subject: TEST mail
To: root
テストメールです。
TESET
.
.
.


^D
-------
(Preliminary) Envelope contains:
From: rocky@hoge.jp
To: root
Subject: TEST mail
Send this message [yes/no, empty: recompose]? yes
s-nail: Cannot start '/usr/sbin/sendmail -oi -t': executable not found (adjust *mta* variable
/home/rocky/dead.letter 20/439
s-nail: ... message not sent
```
# 原因と解決策
## 原因1：~/.mailrc の設定ミス
mailrc で設定していた s-nail コマンドの書き方にミスがあり、メールの送信部分で止まっていた。
- 誤り：set mta="/usr/sbin/sendmail -oi -t"
- 修正：set mta=/usr/sbin/sendmail
- 修正：set sendmail-arguments="-oi -t"
## 解決策：
- s-nail は mta変数にコマンドのパスのみを入力する
- オプションを含む場合は分けて設定する必要がある

## 原因2： .mailrc をユーザごとに設定しないと、メール送信ができないと思い込んでいた

## 解決策2：　
- 誤り： mailrc 設定のミス
- 修正：~/.mailrc ファイルの削除

## 学んだこと：
- admin ユーザのメール送信ができているのを見て、自分の設定に間違いがあることに気づいた
- mailrc で送信元アドレスを書かなくても、メールヘッダには送信ユーザ名が記載されることを学んだ
レビューアイで スマイルホテル 浅草 のレビュー分析をしてみた

弊社リテジーリンクではレビュー分析AIレビューアイの無料デモを公開中です。
レビューアイ (英語表記 ReviewAI) は、商品・サービスのレビューを分析し、
観点ごとに強みと改善点を明らかにする、レビュー分析AIです。

本記事では、スマイルホテル 浅草 のレビューを例に
レビューアイで明らかになった強みと改善点を1つずつ紹介します

## 強み ##
レビューアイでレビュー分析すると、レビューでよく出てくる観点が一覧できます。
強み順に並べると、**部屋、スカイツリー** などが上がってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/aad4e707-0737-09e8-ed31-a4ed5db21f0e.png)



**スカイツリー** の詳細を確認すると、スカイツリーに関連してどのようなレビューが
あるのか可視化されます。こちらを強み順に並べると、**窓、きれい** などが上位にきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/06212ef3-b0f5-5076-b2c1-6e141913f710.png)


**窓** のレビューを見ると、感情分析した結果で整理してレビューの抜粋文が確認できます。
窓からスカイツリーがバッチリ見える部屋があるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/99762631-025c-557e-fafc-863ee79c06b9.png)





## 改善点 ##

レビュー分析で見つかる観点を改善順で見ると、**風呂**の赤色が目立ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/8ef2c259-6cbf-3576-22aa-feeef5eec9a4.png)


**風呂** の詳細を確認すると、どのような点で改善の余地があるか一覧できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/91491d70-2986-b898-e154-1310f0966478.png)


**狭い**のレビュー文を見てみると、風呂が狭いと感じる人が多いようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/3a0e8601-d627-ed76-e003-7c7db76ffdac.png)




## まとめ ##
レビューアイで スマイルホテル 浅草 のレビュー分析をしました。

結果として
・窓からスカイツリーがバッチリ見える
・お風呂が狭い
ということが判明しました。

今回は紹介できませんでしたが、
・朝食について
・駅について
の意見もありました。

[レビューアイ](https://reviewai.next-seed.work/)の無料デモを公開中です。
ぜひ[こちら](https://reviewai.next-seed.work/)からお申込みください。
Super Commands

[Previous << Install Instructions](https://qiita.com/flowcadence/items/530223569e603e10e1a7)
[Next >> Get an Account](https://qiita.com/flowcadence/items/aa31ec968844f6f79ad6)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#flow-cli-と-fcl

Flow CLI スーパーコマンドは、あなたのdAppの開発中に使用できるコマンド群であり、ワークフローを大幅にシンプルにします。その結果、あなたはスマートコントラクトの作成に集中でき、コマンドが残りの処理を行ってくれます。

<h1 id="Init">Init</h1>

新しいFlowプロジェクトを開始する為の一番最初のコマンドはflow initです。最初にプロジェクトの設定に関するいくつかの質問が表示されます。その後、必要なファイルとフォルダが作成され、設定ファイルが構成され、あなたにとって必要なコアコントラクト依存群がインストールされます。

初期化のプロセス中に、`flow init`はコア・スマートコントラクト（例えば、`NonFungibleToken`）をインストールしてあなたのプロジェクトに設定するかどうかを尋ねてきます。コアコントラクトをインストールするを選択した場合は、CLIは裏で[Dependency Manager](https://qiita.com/flowcadence/items/9195f9872874baab611e)を使用して、必要なスマートコントラクトの依存関係を自動的にインストールします。
> 注：もし、`flow.json`ファイルを構成するだけでフォルダやファイルを作成したくない場合は、`flow init --config-only`を実行することでそう出来ます。

以下コマンドを実行します。
```ruby
> flow init $PROJECT_NAME
```
これは以下のフォルダとファイルを作成します。
* `/contracts`フォルダには、すべてのCadenceコントラクトを格納します。
* `/scripts`フォルダには、すべてのCadenceスクリプトを格納します。
* `/transactions`フォルダには、すべてのCadenceトランザクションファイルを格納します。
* `/tests`フォルダには、すべてのCadenceテストファイルを格納します。
* `flow.json`はプロジェクトの構成ファイルであり、自動的にメンテナンスされます。

<h3 id="Using-Scaffolds">Using Scaffolds</h3>

プロジェクトの目的に応じて、利用可能なスケルトン(scaffold)のリストから選択することができます。`--scaffold` フラグを指定するだけでできます。次のようにします。
```ruby
> flow init $PROJECT_NAME --scaffold
```
インタラクティブなスケルトン(scaffold)選択モードをスキップしたい場合は、 `--scaffold-id`フラグを使用してIDを指定します。
```ruby
> flow init $PROJECT_NAME --scaffold-id=1
```
スケルトン(scaffold)のリストは今後も増え続ける予定であり、皆様からの貢献を歓迎いたします。ご自身の足場(scaffold)リポジトリを作成することで、その後作成したリポジトリを[こちらの指示](https://github.com/onflow/flow-cli/blob/master/CONTRIBUTING.md#adding-a-scaffold)に従ってスケルトン(scaffold)リストに追加することで貢献が可能です。

<h1 id="Testing">Testing</h1>

`flow init`コマンドは、`/tests`フォルダ内にサンプルのテストファイルも作成します。`flow test`コマンドを使用することでそのテストを実行できます。

<h1 id="Import Schema">Import Schema</h1>

スマートコントラクトは名前で簡単にインポートできます。私達はスマートコントラクトのインポートに新しい方法を採用しました。これにより、ワークフローがシンプル化されます。

新しいインポートスキーマのフォーマットは次のようになります。
```ruby
import "{name of the contract}"
```
例:
```ruby
import "HelloWorld"
```
これはあなたのプロジェクト内で同名で作成したスマートコントラクトが自動的にインポートされて、その設定をflow.jsonに保存します。スマートコントラクトが`default`以外のアカウントにデプロイされている場合でも問題ありません。

<h1 id="Learn-More">Learn More</h1>

初期セットアップ後の次のステップについてさらに詳しく知りたい場合は、以下のリンクを参照してください。
* [Dependency Manager](https://qiita.com/flowcadence/items/9195f9872874baab611e)：CLIコマンドを使用してスマートコントラクト上の依存関係をインストールし管理します。
* [Manage Configuration](https://qiita.com/flowcadence/items/b600e1896db8cc1f5297)：プロジェクト構成ファイルの管理方法について説明します。

*Last updated on **Dec 17, 2024** by **j pimmel***

翻訳元

https://developers.flow.com/tools/flow-cli/super-commands

***
<b>[Previous << Install Instructions](https://qiita.com/flowcadence/items/530223569e603e10e1a7)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (Super Commands)

<b>[Next >> Get an Account](https://qiita.com/flowcadence/items/aa31ec968844f6f79ad6)</b>
Reactにルート設定をする

Reactにルート設定するための必要な設定をまとめてみました。
react-router-dom v6.28.0

## 全体像
![画面収録 2024-11-18 14.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906768/df2eb894-6390-73c1-fc4d-f5ecafdde740.gif)


### ライブラリのインストール
`npm install react-router-dom`

### ページの作成
componentsディレクトリを作成し、各ページを作成
分かりやすく、h1タグのみです。
```typescript:Home.tsx
const Home: React.FC = () => {
  return <h1>HOME</h1>;
};
export default Home;
```
```typescript:Before.tsx
const Before: React.FC = () => {
  return <h1>BEFORE</h1>;
};
export default Before;
```
```typescript:Next.tsx
const Next: React.FC = () => {
  return <h1>NEXT</h1>;
};
export default Next;
```
```typescript:Page404.tsx
const Page404: React.FC = () => {
  return <h1>Not found</h1>;
};
export default Page404;
```

### Navbarコンポーネントの作成
画面遷移用のボタンを配置したコンポーネント
```typescript:Navbar.tsx
import { Link } from "react-router-dom";

const Navbar: React.FC = () => {
  return (
    <div style={{ display: "flex", justifyContent: "center", gap: "20px" }}>
      <Link className={"link_button"} to="/before">Before</Link>
      <Link className={"link_button"} to="/">Home</Link>
      <Link className={"link_button"} to="/next">Next</Link>
    </div>
  );
};
export default Navbar;
```

### ルート設定のコンポーネントを作成
ルート用のコンポーネントを作っておくと、App.tsxの見通しが良くなる。
```typescript:AppRoutes.tsx
import { Route, Routes } from "react-router-dom";
import Home from "./Home.tsx";
import Next from "./Next.tsx";
import Before from "./Before.tsx";
import Page404 from "./Page404.tsx";

const AppRoutes: React.FC = () => {
  return (
    <Routes>
      <Route path="/" element={<Home />} />
      <Route path="/next" element={<Next />} />
      <Route path="/before" element={<Before />} />
      <Route path="*" element={<Page404 />} />
    </Routes>
  );
};

export default AppRoutes;
```
path="*" は、どのpathにも一致しない場合にここへ来る。
Not Foundページに使う

### App．tsxの設定
```typescript:App.tsx
import "./App.css";
import Navbar from "./components/Navbar.tsx";
import AppRoutes from "./components/AppRoutes.tsx";

const App = () => {
  return (
    <>
      <h1>react-router-dom</h1>
      <AppRoutes />
      <Navbar />
    </>
  );
};

export default App;

```
ルーターが輻輳を回避

>輻輳の原因となっている送信者に対して、ルーターが即座にフィードバックを届けることである。
...
輻輳を抑えるためにはネットワークを使用している送信者が行動を起こす必要がある。ルーターは対象となる送信者を適切に選び、その送信者に対してフィードバックを行う。

## フィードバックの種類

### ランダム初期検知(RED:Ramdom Early Detection)
>パケットの破棄を開始するタイミングを決定するため,ルーターでキューの長さの移動平均を計算しておく。あるリンクのキューの長さが閾値を超えた場合には、そのリンクで輻輳が発生していると判断し、`一部のパケットをランダムに破棄`する。このように破棄するパケットをランダムに選択することによって、`高速でトラフィックを送信している送信者のパケットほど破棄される可能性が高くなる`。`データグラム・ネットワークでは、どの送信元が輻輳の主な原因を引き起こしているかをルーターで判断することが出来ない`ため、これが最善の選択となる。

* 多く送信している場合は破棄される割合が高くなる

#### どのような仕組みか？
>`破棄されたパケットに対してはACKが返ってこない`ため、送信者がこのパケットロスを検知し、トランスポート層のプロトコルによって送信速度が下げられる。このように破棄されたパケットは、服装の発生を送信者に伝える働きがある。ただし、`ルーターが明示的に通知を送るわけではない`。

### チョーク・パケット
>輻輳を引き起こしている送信者へ、そのことを直接伝える方法である。

#### どのような仕組みか？
>ルーターが輻輳パケットを選択し、`送信元ホストへチョーク・パケットを返送`する。送信元ホストは、`チョーク・パケットの内容から、問題となっている宛先を知る`ことができる。もともとのパケットは通常通り転送されるが、ヘッダーのビットを立てることによって印をつけ、`同一の経路上ではそれ以上チョーク・パケットが生成されない`ようにする。`チョーク・パケットは低レートで送信`し、輻輳時にネットワークの負荷をさらに増大することを防いでいる。

### ECN(Explicit Congestion Notification:明示的な輻輳通知)
>輻輳を通知するためのパケットを追加で生成する代わりに、`転送しているパケットにタグをつける`ことで(具体的には、`ヘッダーの特定のビットを立てる`ことで）輻輳を知らせることもできる。

* ヘッダーのビットを立たせることで知らせるようにするのか

#### どのような仕組みか？
>タグづけされたパケットが宛先に届くと、受信者は輻輳の発生を知ることができる。その後、応答パケットの中にその`情報を含めることで、送信者にも輻輳の発生を通知することが可能`となる。
...
この処理はTCP層などIP層より上位の層で行われる

* 送信するパケットを減らすのは送信者自身

# 感想
輻輳が起きたらランダムでパケットを破棄するか送信元に通知することをルーターが行う
コードレビューチェックリスト

## 基本編
- [ ] コードは全て動作確認済みです
- [ ] インデントはずれていないです
- [ ] フォーマッタは利用しています
- [ ] 関係ないソースは変更していないです
- [ ] `console.log`や`Log::debug`は残っていないです
- [ ] 利用されていないuseは削除しています
- [ ] コピペした箇所は見直しました
- [ ] 同様の修正が必要な箇所など横展開の調査はしました
- [ ] PJ個別のルールを確認しています

## 命名規則編
- [ ] スペルミスはないです
- [ ] 変数名や関数名を省略する際、誰でも元の省略名称が言える状態です
- [ ] ローマ字表記は避けています
- [ ] 変数名はキャメルケースになっています
- [ ] 限定的なスコープ以外でtmp,result などの汎用的な命名をしていないです
- [ ] 関数名はキャメルケースになっています
- [ ] 関数名は作用や動作がわかりやすいです
- [ ] 関数の引数は型が指定されています
- [ ] 関数の引数の型でobjectやCollectionを指定している際、他に適切な型はありません
- [ ] 関数の引数の型でnullableにしている際、エラーチェックは十分です
- [ ] マジックナンバーは使用していないです
- [ ] ファイル名の大文字小文字に誤りはないです

## メソッド編
- [ ] ifやforのネストを減らせません
- [ ] 1関数あたりの記述を減らせません
- [ ] 必要な引数だけ渡しています
- [ ] 引数の数は減らせません
- [ ] 早期リターンはできています
- [ ] ループ処理の行数は減らせません
- [ ] 自前のコレクション処理は実装していないです
- [ ] すでに存在する共通処理を自分で実装していないです
- [ ] 循環的複雑度は減らせません

## コメント編
- [ ] コメントはコードの意図を明確に説明しています
- [ ] 複雑なロジックには適切な説明が付けられています
- [ ] コメントには「コードから読み取れない事」を書いています
- [ ] 定数にはコメントが書かれています

## セキュリティ編
- [ ] センシティブな情報（パスワード、APIキーなど）はハードコードされていないです

## パフォーマンス編
- [ ] 不必要なループや処理がないです
- [ ] 大量のデータを扱う場合、メモリ使用量は適切です
- [ ] データベースクエリは最適化されています
- [ ] N+1を発生させる実装はないです
Pythonの辞書を作成する際の `{}` と `dict()` の違いとパフォーマンス比較

Pythonのdict()と{}で違いがあるらしいと聞いたので、調べてみました。

## `{}` と `dict()` の違い

- **`{}`（リテラル）**  
  リテラルを使用して直接辞書型オブジェクトを作成します。
  
  ```python
  my_dict = {}
  ```

- **`dict()`（コンストラクター）**  
  `dict` クラスのコンストラクターを呼び出して辞書型オブジェクトを作成します。
  
  ```python
  my_dict = dict()
  ```


`dict()` を使用すると、関数呼び出しのオーバーヘッドが発生するため、`{}` を使用するよりも実行速度が遅くなります。しかし、関数呼び出しのオーバーヘッドはせいぜいナノ秒オーダーのため、パフォーマンス的には無視できるレベルです。

### 実行速度の比較

以下のコードで、`{}` と `dict()` を使用して辞書を作成する際の実行時間を比較しました。
※手元の環境で試したため、実行環境によっては差が出る恐れがあります。

```python
import timeit

# {}を使用して辞書を作成
time_literal = timeit.timeit("my_dict = {}", number=1_000_000)

# dict()を使用して辞書を作成
time_func = timeit.timeit("my_dict = dict()", number=1_000_000)

print(f"{{}}: {time_literal} 秒")
print(f"dict(): {time_func} 秒")
```

#### 実行結果

```
{}: 0.026 秒
dict(): 0.045 秒
```

100万回実行して約0.019秒の差が出ました。1回あたり約19ナノ秒（10^-9 秒）ですね。

## 結論

関数呼び出しのオーバーヘッドはナノ秒オーダーであるため、通常の開発では `dict()` を使用してもほぼパフォーマンスには影響がないです。パフォーマンスに非常にシビアな状況でなければ、どちらの方法を使用してもいいと思います。しかし、そもそもこのレベルでパフォーマンスがシビアな場合は、Pythonではなく他の言語を使用したほうがいいと思います。

## 参考資料

- [Pylint Documentation - use-dict-literal](https://pylint.readthedocs.io/en/latest/user_guide/messages/refactor/use-dict-literal.html)
- [プログラミング言語ごとの速度比較](https://github.com/niklas-heer/speed-comparison)
NeovimでSalesforceのApexのLSPを使用する

# Apexとは？

salesforceではフローという機能を使用してノーコード開発を行うことができます。
一方でsalesforceApexにはApexというjavaライクな言語を使って機能開発を行う機能もあります。
ぱっと見、ノーコード開発ができならプログラミング言語は不必要かと思われますが、複雑な機能を作り込む場合にはテストを書いたりできるApexの方が開発しやすい場面が多くなります。

# LSPとは
Language Server Protcol の略で、VSCodeなどで機能開発を行うときにユーザーにいろんなサポートを提供してくれます。
この機能があるとないとだとかなり開発体験が変わってきます。

例）
- 変数名を提案してくれる
- 関数やメソッドにジャンプすることができる
- 関数やメソッドを使っているところを一覧にして見ることができる
- 構文エラーなどを検知して知らせてくれる

# この記事で扱うこと
Apexは標準でVSCodeを使用することを推奨しており、ApexのLSPもVSCodeの拡張機能に含まれているのでそちらには触れません。
この記事では`neovimでApexのLSPを使用する方法`を取り扱っています。
VSCodeのようにパッとできるものではありませんが、この記事を見て皆さんのneovim上でのApexのでの開発体験が良くなれば幸いです。

# 事前準備
ApexのLSPを使用するためにはjavaが必要です。
要件を調べて必要なバージョンのjavaのインストールを行なっておいてください。
 
java setupページ: https://developer.salesforce.com/docs/platform/sfvscode-extensions/guide/java-setup.html

ubuntuであれば、以下のコマンドでOKです
```
$ apt install -y openjdk-21-jdk
```

# Neovimの拡張機能について
ApexのLSP導入に関して、以下の拡張機能が必須です。

- nvim-lspconfig
    - LSPの設定を行う
- mason
    - LSP自体のインストールをneovim上で行うことができる

# LSPファイルの準備
neovimで`:mason`を実行するとLSPなどを管理する画面が出ると思います
そこで`apex_ls`で検索して出てきたものに対して`i`キーでインストールができます
↓はすでにインストール済みの画面です
![スクリーンショット 2025-03-06 17.40.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489761/b6b5dfb4-8cca-4ff9-99b5-feaa4220749e.png)


# LSPの設定
1. masonでインストールしたjarファイルの場所を確認する
    1. Ubuntuのコンテナであれば `/root/.local/share/nvim/mason/share/apex-language-server/apex-jorje-lsp.jar` にあります
1. nvim-lspconfigの設定を開き、jarファイルのパスを含めた以下のコードを貼り付ける
```lua
nvim_lsp['apex_ls'].setup{
  cmd = { 'java', '-jar', '/root/.local/share/nvim/mason/share/apex-language-server/apex-jorje-lsp.jar' },
  filetypes = { 'apex' },
  on_attach = custom_attach,
  flags = {
    debounce_text_changes = 150,
  },
  settings = {
    apex = {
      enable_semantic_errors = true,
      enable_completion_statistics = true,
    }
  }
}
```
2. init.luaを開き、clsクラスやtriggerクラスをApexクラスとして認識できるよう以下のコードを追加
```lua
vim.filetype.add({
  extension = {
    cls = 'apex',
    trigger = 'apex',
    cmp = 'html',
  }
})
```
3. ApexのファイルをNeovimで開いて、:LspInfo コマンドを実行し以下のようにLSPが認識されていればOK
```
 Client: apex_ls (id: 3, bufnr: [1, 47, 21])
 	filetypes:       apex
 	autostart:       true
 	root directory:  /usr/projects/salesforce/hoge
 	cmd:             /usr/bin/java -jar /root/.local/share/nvim/lsp_servers/apex-jorje-lsp.jar
```
4. LSPの動作確認
Assert.  まで入力すると、Assertクラスのメソッドなどが提案されるようになります
![スクリーンショット 2024-11-18 15.18.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489761/a6e243c1-134b-07fa-0ca4-9b7661903c16.png)


# LSPがうまく動かない時
ubuntuであれば、以下のディレクトリにLSPのエラー情報が書き込まれています。
/root/.local/state/nvim/lsp.log

必要であればLSPのインデックスデータベースの初期化も試してみてください。
https://developer.salesforce.com/docs/platform/sfvscode-extensions/guide/apex-language-server.html#reset-apex-indexing
Docker Composeで動かしているMeilisearchコンテナのログ容量が圧迫してきたので一次対応したときのログ

# 概要
- Docker composeで動作させているMeilisearchコンテナのログ容量が圧迫してきた
- ログローテートを行いたいが、一次対応としてサクッとやりたかったのでサクッとやった
- そのメモ


# 前提

- Google Cloud Compute Engineで動作させています
- ログの避難場所として、GCSを選定しています。バケット作成済み
- SSHログイン済みからスタートしている

# 作業ログ


## 容量確認

```bash
$ sudo su
```

以下から管理者権限で作業する

```bash
$ cd /var/lib/docker/

# コンテナIDを確認する
$ docker ps

$ cd xxxyyyzzz...

$ ls -lh *log*
-rw-r----- 1 root root 4.1G Jan 18 05:32 xxxyyyzzz...-json.log
```

対象ログの確認。念の為バックアップとっておく。GCSへコピーする

```bash
$ gcloud auth login

# ログイン後、下記コマンドを実行
$ gcloud storage cp xxxyyyzzz...-json.log gs://xxx-yyy-zzz-backup
```

コピーできたらログ削除する


```bash
$ truncate -s 0 xxxyyyzzz...-json.log
```

# 雑感

ログローテート早く設定しなきゃ


# 参考にしたURL

https://qiita.com/TachiTech/items/ae4f5da70cadc392516e
react-notification-system on Rails

```yml
"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build:js": "esbuild app/javascript/*.* --bundle --sourcemap --outdir=app/assets/builds --loader:.js=jsx"
  },
```

```js
import React from 'react';
import NotificationSystem from 'react-notification-system';
import { createRoot } from 'react-dom/client'

export default class MyComponent extends React.Component {
  notificationSystem = React.createRef();

  addNotification = event => {
    event.preventDefault();
    const notification = this.notificationSystem.current;
    notification.addNotification({
      message: 'Notification message',
      level: 'success'
    });
  };

  render() {
    return (
      <div>
        <button onClick={this.addNotification}>Add notification</button>
        <NotificationSystem ref={this.notificationSystem} />
      </div>
    );
  }
}

createRoot(document.getElementById('root')).render(<MyComponent/>);
```
【Web】TCP/IPとは

# はじめに
こんにちは！アメリカの大学で語学を学びながら、独学でソフトウェアエンジニアを目指している者です。
今回は、インターネットや様々なネットワーク通信で重要な役割を果たしているTCP/IPについて解説します。
TCP/IPは、クライアントとWebサーバ間での通信はもちろんのこと、私たちの日常生活で行われる幅広いデータ通信にも使用されています。
なお、本記事はTCP/IPの概要を知りたい初心者向けの記事となりますのでご了承ください

# TCP/IPの4つの層とその役割
TCP/IPは、クライアントとサーバ間でやり取りする際に用いられる仕組みです。
サーバとやり取りをする前に、事前にいくつかルールを設定することで効率的にネットワーク通信を行う仕組みで主に4つの層に分かれています。

それぞれの層が異なる役割を担い、データを送受信する際に順番に処理を行います。

### アプリケーション層
ユーザーが直接触れる部分で、Webブラウザやメールクライアント、ファイル転送ソフトなどのアプリケーションが動作します。
HTTP、FTP、SMTPなどのプロトコルを使い、データの作成や受信を行います。

### トランスポート層
通信の信頼性を確保する層で、TCP（接続型通信）やUDP（非接続型通信）などのプロトコルを使います。TCPでは、データを「セグメント」に分割し、送信先と通信を確立してエラー検出や再送処理を行います。
一方、UDPは高速で軽量ですが、信頼性の保証が少ない特徴があります。

### ネットワーク層
データがどの経路を通って相手に届くかを管理する層で、IPアドレスを使ってデータのルーティングを行います。
IPアドレスはいわば住所のようなもので、IPアドレスがわからないと目的のサーバにアクセスすることはできません。
この層では、パケットという単位でデータが処理され、適切な経路を選んで転送されます。

### データリンク層
実際に物理的な通信が行われる層で、ネットワークインターフェース（イーサネットやWi-Fi）を通じてフレーム単位でデータを送信します。この層は隣接するデバイスとのやり取りを管理します。

# TCP/IPが使用される場面
TCP/IPは、特定の場面に限らず、さまざまなシーンで使用されています。いくつか具体例を挙げてみましょう。

1. WebブラウザとWebサーバの通信
Webページの閲覧時、クライアント（ブラウザ）とWebサーバの間でTCP/IPを使ってHTTPリクエストとレスポンスがやり取りされます。

2. メールの送受信
メールの送受信でも、SMTP、IMAP、POP3などのプロトコルを介してTCP/IPを使った通信が行われます。これにより、メールサーバへの接続やメッセージの送受信が行われます。

3. ファイル転送
FTPやHTTPを使ってファイルをアップロード・ダウンロードする際、TCP/IPがデータ転送の基盤として機能しています。

4. オンラインチャットや音声・ビデオ通話
TCP/IPを使ったリアルタイム通信が行われ、特に音声やビデオ通話では高速でのデータ転送が求められるため、UDPプロトコルが使用されることもあります。

# まとめ
TCP/IPは主にクライアントとサーバとのやり取りの際に使われるいわばルールのようなものであることがわかっていただけたでしょうか
TCP/IPは、ネットワーク通信の基盤となる仕組みであり、具体例を見てみるとインターネットや日常のデータ通信の中核を担っていることがよくわかると思います。
Elastic Network InterfaceとElastic IP Addressメモ

AWSのENI（Elastic Network Interface）とEIP（Elastic IP Address）は、ネットワーク関連のリソースですが、それぞれ役割や用途が異なります。以下に違いをまとめます。

---

### **ENI（Elastic Network Interface）**
1. **概要**  
   仮想ネットワークアダプタで、Amazon EC2インスタンスにネットワーク接続を提供するリソース。

2. **主な特徴**  
   - プライベートIPアドレスとパブリックIPアドレスを割り当て可能。
   - 複数のENIを単一のEC2インスタンスにアタッチ可能。
   - セキュリティグループを個別に割り当て可能。
   - インスタンス停止中にも保持されるため、簡単に他のインスタンスに移行可能。
   - サブネット、MACアドレス、DNSホスト名を持つ。

3. **ユースケース**  
   - マルチネットワークアダプタが必要なアプリケーション。
   - 高可用性構成で、ネットワークインターフェースを他のインスタンスに切り替える場合。

---

### **EIP（Elastic IP Address）**
1. **概要**  
   AWSが提供する固定パブリックIPアドレス。インターネットからアクセスするために使用。

2. **主な特徴**  
   - 静的なパブリックIPアドレスを提供。
   - VPC内のENIやEC2インスタンスに関連付け可能。
   - アタッチされたインスタンスを停止すると、再利用できる。
   - 使われていない場合、課金が発生する。

3. **ユースケース**  
   - 固定のパブリックIPが必要なアプリケーション。
   - IPアドレスを変更せずにインスタンス間で切り替える場合。
   - インターネット経由でアクセスされるリソース用。

---

### **主な違いのまとめ**
| **項目**           | **ENI**                                       | **EIP**                                       |
|--------------------|-----------------------------------------------|-----------------------------------------------|
| **種類**           | ネットワークインターフェース                 | 静的パブリックIPアドレス                     |
| **アタッチ先**     | EC2インスタンス                              | ENIまたはEC2インスタンス                     |
| **役割**           | ローカルネットワーク接続用                   | インターネットアクセス用                     |
| **移行可能性**     | インスタンス間で移行可能                     | ENIやインスタンス間で再割り当て可能          |
| **課金**           | 無料（データ転送料金は別途）                | 未使用時は課金される                         |

---

**要点**: ENIはローカルネットワークでの接続を扱い、EIPは固定のパブリックIPアドレスを提供するものです。用途に応じて使い分けが必要です。
Unity(Linux)でTarget PlatformにWindowsを追加したい

# はじめに
「Unityでゲームができたからビルドするぞ！」と意気込んでいると、Target Platformの中にWindowsが見当たらなかったので、実際に追加した際の手順を書きました。（LinuxでUnityをWindows用にビルドしたい人向けです）
![unity_build_setting_pic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3930483/1bf4a237-9456-73c5-dcec-3c8512942714.png)

# 手順
　Unity Hubを起動したら、インストール（Installs）に移動して、プロジェクトで使用するエディタのバージョンの歯車マークをクリックしてください。
![名称未設定のデザイン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3930483/9bdfda46-47da-83c3-e3f4-6eeeb417f2e2.png)
 
　「モジュールを加える（Add Modules）」から、Windows Build Supportにチェックをしてインストールしましょう。
![unity_hub_install_pic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3930483/093aa5e7-2ba5-5d2e-88d9-3fe5dac2e46d.png)

　インストールが完了したらプロジェクトを開いて、File>Build Settings..からTarget PLatformの部分にWindowsが追加されたと思います。
![unity_build_setting_windows_pic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3930483/d272b976-a4e3-2680-e0c4-26d3c418eb49.png)
　あとはビルドすれば完了です！

# 終わりに
同様の方法でMacやLinuxのTarget Platformも追加できると思います。
はじめての投稿なのでところどころ抜けていたり至らないところがありますのでどうかご参考程度に...
毎日決まった時間にOutlook内を確認するPowerShell

毎日決まった時間に、日次バッチの完了メールが届いているかを確認するルーチンワークがありました。
さすがにこれを人間がやるのは平成の働き方を引きずり過ぎているので、自動化を試みました。

方針としては、以下の手順で実現します。
①Outlookの受信トレイを確認する処理を実装する ← PowerShell
②決まった時間に①を呼び出す ← タスクスケジューラ

バッチ完了メールが届いていない場合、全体周知用のメールを送るのですが
そのための下書きを自動作成する処理も含んでいます。


①のスクリプトがこちら
~~~PowerShell
# タスクスケジューラで毎朝09:02:30に本スクリプトを起動する

#Outlookアプリケーションを取得
$Outlook = New-Object -ComObject Outlook.Application
$Namespace = $Outlook.GetNamespace("MAPI")

#受信トレイを取得
$Inbox = $Namespace.GetDefaultFolder([Microsoft.Office.Interop.Outlook.OlDefaultFolders]::olFolderInbox)

#検索条件
$yesterday = Get-Date (Get-Date).addDays(-1) -Format "yyyyMMdd"
$subject  = "件名"+ $yesterday
$sender   = "test@test.jp"

$found = $false
$notFoundMsg = ""

#受信トレイ内の各メールの件名と宛先を確認する。
foreach ($item in $Inbox.Items){
    if($item.Subject -eq $subject -and $item.SenderEmailAddress -eq $sender){
        $found = $true
        break
    }
}

if($found){
    Write-Host "◯「$subject」"
} else {
    Write-Host "×「$subject」"
    $notFoundMsg += "×「$subject」`r`n"
}
$found = $false


#メール不達の場合
if($notFoundMsg -ne ""){
    $notFoundMsg += "`r`n`r`n日次バッチ未完了メールの下書きを作成しますか？"

    # メッセージボックスを表示
    $WS = New-Object -com Wscript.Shell
    $result = $WS.Popup($notFoundMsg, 30, "確認", 4)
    
    #日次バッチ未完了メールの下書きを作成
    if($result -eq 6){
        $mail = $Outlook.CreateItem(0)
        $mail.Subject = "タイトル"
        $mail.Body  = "関係者各位`r`n`r`n`r`n"
        $mail.Body += "いつもお世話になっております。`r`n`r`n"
        $mail.Body += "◯◯部の＊＊です。`r`n`r`n`r`n"
        $mail.Body += "あいうえおかきくけこ`r`n`r`n"
        $mail.Body += "どうぞよろしくお願いいたします。`r`n"

        $mail.save()
        $inspector = $mail.GetInspector
        $inspector.Display()
    }
}
#メールが正常に届いていた場合
else {
    $today = Get-Date -Format "M/d"

    Write-Host ""
    Write-Host ""
    Write-Host $today
    Write-Host "$subject"
    Write-Host ""
    Write-Host "確認済み。"
}


#30秒経過で画面を閉じる
Start-Sleep -Seconds 30
~~~

タスクスケジューラへの登録手順は割愛します。
LeetCodeを1日1題解いてみる (day19)

19日目に取り組んだ問題はこちら！

# 104. Maximum Depth of Binary Tree

https://leetcode.com/problems/maximum-depth-of-binary-tree/description/

## 問題文
Given the root of a binary tree, return its maximum depth.

A binary tree's maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node.

## 僕の回答
```py
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        return 1 + max( self.maxDepth(root.left),self.maxDepth(root.right) )
```

## 他の良い回答例

```py
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    # returns max depth starting at node as the root
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        def dfs(node, depth):
            if not node:
                return depth
            return max(dfs(node.left, depth + 1), dfs(node.right, depth + 1))
        return dfs(root, 0)
```

### コメント
再帰的な方法に気づくことができて嬉しい。ただ、イメージができず、実行してみてうまく行っただけなのでイメージまでできるようにしたい。

### 次の問題はこちら!
https://qiita.com/h_y_s_d/items/980f7d4fac3050e9dc3a
ルーターのキュー管理で輻輳を回避

>インターネットをはじめとするコンピュータ・ネットワークでは、`送信者が出力トラフィックを調整することによって、ネットワークが本来転送できる量と同等のトラフィックを実際に転送できる`ようにしている。このため、ネットワークは、輻輳が発生する寸前のところで、動作することを目指している。輻輳が発生しそうな場合には、`送信者にそのことを伝えてトラフィックの送信を抑制させ、速度を落とす必要`がある。このフィードバックは`例外的な状況ではなく、普段から頻繁`に行われている。

* リーキーバケット、トークンバケットアルゴリズムを使って調整される

### 輻輳回避が起こる理想のタイミング
>ルーターは輻輳が起きそうな場合にそれを検出する必要がある。できれば輻輳が実際に発生してします前に検出できることが望ましい。

#### 理想のタイミングを得るための手段
> ルーターは自身が使用しているリソースを常に監視を続けられるようになっている。

>監視対象となるリソースの候補としては、`出力リンクの使用率`、`ルーター内のキューにバッファリングしているパケット量`、`バッファ不足によってロスしたパケットの数`などがある。これら３つの中では、２番目が最も有用である。

>一つ目の`平均使用率`では、多くのトラフィックが持つバースト性を考慮しきれない。トラフィックが平滑である場合には使用率が５０％であればまだまだ低いと言えるが、`変化が大きいトラフィックであれば、同じ使用率でも高すぎる`と言える

>3つ目のロスしたパケット数に関しては、パケットのロスが発生している時点で、もうすでに`輻輳が起こっているため時すでに遅しの状況`である。

### ルーター内のキューにバッファリングしているパケット量に注意する
>ルータ内のキューにおける遅延時間は、パケットによる輻輳の発生を直接的に捉えることができる。遅延時間は、普段は小さい値となるが、`トラフィックがまとまって到着し、未処理のパケットがキューに溜まると、急激に増加`する。

`d(new) = ad(old) + (1-a)s`

↑の式は上手く表現できませんでした。newとoldは変数の説明です（変数、定数ではないです）

>`aは過去の履歴を保持する期間を決定する定数`である。これは`EWMA(Exponentially Weighted Moving Average:指数過重移動平均)`と呼ばれ、ローパス・フィルタと同様に、変動を平滑化する効果がある。ルータはdがある閾値を超えた場合に輻輳の発生を通知する

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/

# 感想
ルーターのキューの管理ができなければ輻輳が起きる。
逆にうまいタイミングで管理できれば輻輳を回避できる。
複数の Salesforce インスタンスで発生したサービス障害のまとめ



+ [2024 年 11 月 15 日に複数の Salesforce インスタンスで発生したサービス障害に関する中間報告](https://help.salesforce.com/s/articleView?id=003876113&type=1)

対象

AP43, AP44, AP45, AP46, AP47, AP48, AP49, AP50, AP51, AP52, AP53, AP54, AP55, AP56, AP57, AP58, AP59, AP60, AP61, AP62, CS237, CS238, CS239, CS242, CS246, CS247, CS248, CS249, CS250, CS251, CS252, CS253, CS254, CS256, CS258, CS259, CS260, CS263, CS264, CS268, CS269, CS270, CS272, CS273, CS274, CS275, CS276, CS277, CS278, CS279, CS280, CS290, CS291, CS292, CS293, CS294, CS295, CS310, CS311, CS312, CS313, CS314, CS315, CS316, CS317, CS318, CS319, CS320, CS321, CS343, CS344, CS345, NA123, NA139, NA224, NA226, NA231, NA232, NA233, NA235, NA238, NA239, NA241, NA242, NA245, NA247, NA249, NA251, NA252, NA254

+ [ 国内の複数組織に影響が及んだSalesforceのシステム障害についてまとめてみた](https://piyolog.hatenadiary.jp/entry/2024/11/18/040039)


+ [2023 年 12 月 16 日に Salesforce コアサービスで発生した複数インスタンスの機能障害に関するご報告](https://help.salesforce.com/s/articleView?id=000744669&type=1)

+ [2023 年 3 月 31 日に複数インスタンスで発生したサービス障害](https://help.salesforce.com/s/articleView?id=000395039&type=1)

NA147 インスタンス：2023 年 3 月 31 日 2 時 8 分
NA161 インスタンス：2023 年 3 月 31 日 2 時 16 分
NA168 インスタンス：2023 年 3 月 31 日 2 時 24 分
NA174 インスタンス：2023 年 3 月 31 日 2 時 36 分
ビット演算黒魔術集

※　ここでいう黒魔術とは、「マジックナンバーや、あまり一般的でない演算子を使うので、実装はシンプルになるけど、可読性は低いから、その点は注意しようね～」ぐらいの意味です。
※　符号付き整数を想定しています

# トグル

`x ^= 1`

　`0` にこれを作用させると `1` になり、`1` にこれを作用させると `0` になります。これを利用して、トグルスイッチみたいに切り替えたり、「ペアのうち片方を指す」みたいな使い方をできたりします。

# 補数によるペア

`~x`

　`~` は全ビットを反転させます（補数）。反転前の数を $A$ とすると、 $-A-1$ を返します。

　これの嬉しいポイントとして、**ある非負整数に対して一対一対応のペアが作れる** ということがあります。
 
 　例えば、非再帰DFSにおいて「行きがけ」と「帰りがけ」のそれぞれのノードを、「ある非負整数」と「その補数」として表現できます。

 　参考記事：[それ、非再帰で書けます](https://qiita.com/KowerKoint/items/870ea9ef7a39f3fe4ce3)

　ちなみに、補数の関係は以下のようになっています。わかりやすく示すために、$4$ bit符号付整数で考えています。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288125/434ae0de-d8c8-9b64-82ca-397e7bcad600.png)


# 「数値の文字」と「数値」の切り替え

`c ^= 48`

　数値の文字ならばその数値を、数値ならばそれに対応する文字を返します。

## なぜそうなるのか

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288125/1db59f41-89e0-c39b-8da5-863bcd44fe4b.png)

# 小文字と大文字の切り替え

`c ^= 32`

　`char` 型の文字に対して、小文字ならば大文字を、大文字ならば小文字を返します。

## なぜそうなるか

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288125/a05abdff-4820-d9eb-7690-cc86a23ec9eb.png)


# 最も右にあるビットを削除する

`x & (x-1)`

　その数で立っているビットのうち、最も右にあるものを削除します。

## なぜそうなるか

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288125/db6ae1be-3886-3496-7dcf-343db93b6562.png)

# 最も右にあるビットだけを抽出する

`x & -x`

　上のと似ていますが、その数で立っているビットのうち、最も右にあるだけを抽出します。

## なぜそうなるか

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288125/aa2710bb-6a22-5774-2ce7-cd9f674a2c04.png)

# 2冪かどうかを判定

`x & (x-1) == 0`

　上の応用ですが、「1つ以上ビットが立っており、最も右にあるビットを削除したとき、$0$ になる」と「$1$ つのビットだけが立っている」は同値です。そして、$1$ つのビットだけが立っていることは、$2^n$（$n$ は非負整数） で表される $2$ 冪の数であることと同値です。

```c++
int main(){
    for(int i=1;i<=16;i++){
        bool beki = (i&(i-1)) == 0;
        cout << i << " " << beki << endl;
    }
}
```

```:output
1 1
2 1
3 0
4 1
5 0
6 0
7 0
8 1
9 0
10 0
11 0
12 0
13 0
14 0
15 0
16 1
```

# 最も近い2冪を出す

　$2$ 冪かどうかの判別と、最右ビットの削除を組み合わせると、最も近い $2$ 冪を出すことができます。

「その数以下で最小の $2$ 冪」を求めます。その数が $2$ 冪ならそのまま、そうでなければ、そうなるまで最右ビットを削除していけばよいです。

```c++
int main(){
    for(int i=1;i<=16;i++){
        int x = i;
        while(x&(x-1)){
            x &= x-1;
        }
        cout << i << " " << x << endl;
    }
}
```

```:output
1 1
2 2
3 2
4 4
5 4
6 4
7 4
8 8
9 8
10 8
11 8
12 8
13 8
14 8
15 8
16 16
```

　少し改造すると、「その数以上で最小の $2$ 冪」を出すこともできます。

```c++
int main(){
    for(int i=1;i<=16;i++){
        int x = i;
        if(x&(x-1)){
            while(x&(x-1)){
                x &= x-1;
            }
            x <<= 1;
        }
        cout << i << " " << x << endl;
    }
}
```

```:output
1 1
2 2
3 4
4 4
5 8
6 8
7 8
8 8
9 16
10 16
11 16
12 16
13 16
14 16
15 16
16 16
```
pre-trained modelが見つからない

機械学習の推論のライブラリを久しぶりに実行したところ、ダウンロードできないという状況に陥った。


例：
https://github.com/NVIDIA-AI-IOT/trt_pose?tab=readme-ov-file
https://drive.google.com/open?id=13FkJkx7evQ1WwP54UmdiDXWyFMY1OxDU

「アクセス権が必要です
アクセス権をリクエストするか、アクセス権のあるアカウントに切り替えてください。」

## 問題の回避方法を探る
#### その１：該当のモデルファイル名で検索して探す。
densenet121_baseline_att_256x256_B

#### その２：そのモデルファイルを利用しているライブラリのgithub のIssueに何か解決方法が書かれていないか探す。

#### その３：そのモデルファイルを利用しているライブラリを含むDockerImageを探してみる。
Docker Imageの中にダウンロード済みのpre-trained model が含まれている場合もある。

data/mobile_sam_mask_decoder.onnx
data/resnet18_image_encoder.onnx 

Docker環境を立ち上げて、その中から該当のファイルをみつけてscp でホスト環境の側にコピーしよう。

（あるいは、そのDockerImage を使おう）

# 付記
Segmant anything のJetson用の実装であるnanosam について、
以下のリポジトリで動作するようにした。
Docker image の中から該当のonnx ファイルをコピーしてリポジトリに追加した。

https://github.com/katsunori-waragai/jetson-llm-docker/tree/main/nanosam-docker
VRAMが足りないならPytorchのメモリ割り当て方式そのものを変えちゃえばいいじゃない

# TL;DR
### torch.cuda.memory.CUDAPluggableAllocatorを使え:punch:
サンプルコード

https://github.com/SuperHotDogCat/custom-torch-allocator-demo/blob/main/simple_training_process.py

よっこらしょ。
　　　　∧＿∧　　ミ　＿　ドスッ
　　　 （　　　　）┌─┴┴─┐
　　　 /　　　　つ.　終　　了　|
　　 :/o　　 /´ .└─┬┬─┘
　　（＿（＿）　；;､`;｡;`|　|
　　この記事は無事に終了しました
　　ありがとうございました
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
流石に少し解説
公式ドキュメントを読む, 

https://pytorch.org/docs/stable/generated/torch.cuda.CUDAPluggableAllocator.html

```python
class torch.cuda.CUDAPluggableAllocator(path_to_so_file, alloc_fn_name, free_fn_name)
```
`CUDA memory allocator loaded from a so file.`とある。要は共有オブジェクトファイルを読み込んでallocate関数とfree関数の名前をかけとのこと, ここで気になるのはallocate関数とfree関数がどういう引数を取るかだが, それはソースコードを読めばわかる。

```python
r"""
alloc_fn_name(str): Name of the function to perform the memory allocation
                in the so file. The signature must be:
                void* alloc_fn_name(ssize_t size, int device, cudaStream_t stream);
free_fn_name(str): Name of the function to perform the memory release
                in the so file. The signature must be:
                void free_fn_name(void* ptr, size_t size, cudaStream_t stream);
"""
```
というわけで, allocate関数は(ssize_t size, int device, cudaStream_t stream)を引数にとり, free関数は(void* ptr, size_t size, cudaStream_t stream)を引数にとれば良い(CUDAの構造体に関しての説明は省略)

実装してみる
```CUDA
#include <cuda_runtime_api.h>
#include <stdlib.h>

extern "C" {

void *custom_malloc(ssize_t size, int device, cudaStream_t stream) {
    void *ptr;
    #ifdef MANAGED
    cudaMallocManaged(&ptr, size);
    #elif CPU
    cudaMallocHost(&ptr, size);
    #else
    cudaMallocAsync(&ptr, size, stream);
    #endif
    return ptr;
}

void custom_free(void *ptr, ssize_t size, int device, cudaStream_t stream) {
    #ifdef MANAGED
    cudaFree(ptr);
    #elif CPU
    cudaFreeHost(ptr);
    #else
    cudaFreeAsync(ptr, stream);
    #endif
}

}
```
こいつをPythonから呼び出すには, 共有オブジェクトとしてコンパイルして
```python
# memory allocator 変更
new_alloc = torch.cuda.memory.CUDAPluggableAllocator('allocator.so', 'custom_malloc', 'custom_free')
torch.cuda.memory.change_current_allocator(new_alloc)
```
こうすれば良い

よっこらしょ。
　　　　∧＿∧　　ミ　＿　ドスッ
　　　 （　　　　）┌─┴┴─┐
　　　 /　　　　つ.　終　　了　|
　　 :/o　　 /´ .└─┬┬─┘
　　（＿（＿）　；;､`;｡;`|　|
　　この記事は本当に無事に終了しました
　　ありがとうございました
Vue.jsのconst count = ref(0)はcount.valueってつけなくてもいいときがあるよって話

使い分けがややこしいです。template内とthis.を付ける場合は、.valueが不要みたい。ほかの条件のときは不明

```vue
<script>
import { ref } from 'vue'

export default {
  setup() {
    const count = ref(0)

    // テンプレートや他の Options API フックを公開します
    return {
      count
    }
  },

  mounted() {
    console.log(this.count) // 0
  }
}
</script>

<template>
  <button @click="count++">{{ count }}</button>
</template>
```

https://ja.vuejs.org/api/composition-api-setup#basic-usage
エンジニアの成長を加速するコーチングの基本、実践

# はじめに

エンジニアリング現場での生産性や個人の成長を引き出すためには、「コーチング」という手法が非常に効果的です。  
この記事では、コーチングの概念だけでなく、具体的な実践方法や課題解決のための応用例、さらにはコーチングをエンジニアリング現場で最大限活用するためのヒントを紹介します。

---

## コーチングの本質とは？

### **1. ティーチングとの違い**  
ティーチングは、「解決方法を教える」ことが中心ですが、コーチングは「相手の中に既にある答えを引き出す」ことを目的とします。

#### 例：
- **ティーチング**：「このエラーはこうすれば解決できるよ。」
- **コーチング**：「このエラーを解決するために、どのようなアプローチが考えられますか？」

この違いにより、コーチングは以下のようなメリットを生み出します：
- 自律的な問題解決能力の向上
- 新たな視点の発見
- 内発的動機（本人が動きたいと思う意欲）の引き出し

---

## コーチングに必要な5つのスキル

1. **アクティブリスニング（積極的傾聴）**
   - 相手が話す内容を深く聞き取り、言葉の裏にある意図や感情を汲み取ります。
   - 技術的な議論だけでなく、相手のストレスやモチベーションにも目を向けます。

   **実践例**：
   - 「この機能を担当するのが不安だ」と言われた場合、単に解決策を提案するのではなく、「どの部分に不安を感じていますか？」と問いかけて深掘りします。

2. **オープンクエスチョン**
   - 相手の思考を促す質問をします。
   - 「なぜそう考えたのですか？」「他にどんな方法がありますか？」のように、答えを限定しない質問を心がけます。

3. **エンパシー（共感）**
   - 相手の感情に寄り添い、理解を示すことで信頼関係を構築します。
   - 「その気持ちはわかります」と共感しつつ、「次はどのように進めたいですか？」と建設的な方向に誘導します。

4. **観察力**
   - 言葉以外の情報（表情や態度）を観察し、相手が本当に伝えたいことを読み取ります。

5. **フィードバック**
   - 具体的かつ行動を促すフィードバックを行います。
   - 「この部分は非常に良かったですね。次はこう改善するとさらに効果的です。」

---

## コーチングのプロセスを深掘り

### **1. ゴール設定**
コーチングはゴールを明確にすることから始まります。ゴールが曖昧な場合、SMARTフレームワークを使うと良いでしょう。

- **Specific（具体的に）**：何を達成したいのか？
- **Measurable（測定可能）**：どのように成果を測るのか？
- **Achievable（達成可能）**：現実的か？
- **Relevant（関連性）**：プロジェクトや個人の成長と関連しているか？
- **Time-bound（期限あり）**：いつまでに達成するのか？

**例**：
「新しいフレームワークを1か月以内に習得し、プロジェクトに導入する」という具体的な目標。

---

### **2. 状況の把握**
現状の課題や問題点を整理し、目標達成に必要なステップを明らかにします。

#### 質問例：
- 「今、何が最も困難だと感じていますか？」
- 「理想の状態と比べて、今はどれくらいの位置にいますか？」

---

### **3. 解決策の引き出し**
直接的な解決策を提供するのではなく、相手が自ら考えるプロセスを支援します。

#### 質問例：
- 「他にどのような選択肢がありますか？」
- 「リスクを考えると、どの方法が最も現実的だと思いますか？」

---

### **4. 実行とフォローアップ**
行動計画を立て、進捗を追いながら改善をサポートします。

#### 実践例：
- 定期的に1on1を実施し、目標達成の進捗を確認。
- 行動後に振り返りの場を設け、「何がうまくいったか」「次回はどう改善するか」を一緒に考えます。

---

## 現場での応用例：エンジニア向けケーススタディ

### **ケース1：モチベーションが低下したエンジニア**
#### 状況：
- メンバーAが「最近、やる気が出ない」と相談してきた。

#### アプローチ：
1. 傾聴：「最近、何が原因でそう感じているのか、詳しく聞かせてください。」
2. 質問：「どんな状態なら、もっと楽しく働けると思いますか？」
3. フィードバック：「そのアイデア、素晴らしいですね。どう実現するか一緒に考えてみましょう。」

---

### **ケース2：新しい技術を導入したいが自信がない**
#### 状況：
- メンバーBが「新しいライブラリを試してみたいけど、失敗したらどうしよう」と悩んでいる。

#### アプローチ：
1. 共感：「新しいことに挑戦するのは勇気がいりますよね。」
2. 質問：「そのライブラリを導入することで、プロジェクトにどんなメリットがありますか？」
3. フィードバック：「良い考えだと思います。まず小さな範囲で試してみるのはどうでしょう？」

---

## コーチングの課題と対策

### 課題1：相手が答えを出さない場合
- **対策**：質問の質を見直し、「もっと具体的に」「もっと広い視点で」などの方向性を調整します。

### 課題2：時間がかかる
- **対策**：日々の1on1やデイリースタンドアップで短時間のコーチングを取り入れ、小さなステップで進めます。

---

## まとめと次のステップ

コーチングは即効性のあるスキルではありませんが、エンジニア個人やチーム全体の成長を促進する強力な手段です。  
今日から以下のステップを始めてみましょう：

1. 次回の1on1で「質問」に重点を置いてみる。
2. 小さな成功体験を積み重ねる。
3. コーチングスキルを高めるために書籍やセミナーで学び続ける。

あなたも、エンジニアとして、マネージャーとして、コーチングの力を活用してみませんか？
AWSのEC2を使って、Nodeサーバーを構築してみようpart3

今回はpart3ということで、作成したEC2 インスタンスにnginxとnodeをインストールしていきます。

# はじめに
▼環境
* Windows PC
* Windows Powershell
* Amazon Linux 2023

# なぜNginxを導入するのか？
### 1.セキュリティ対策
Nginxをプロキシサーバーとして構築することで、Nodeサーバーのポート番号を外部に公開する必要がなくなる。すべてのリクエストはNginxを介してNodeサーバーへ送信されるため、アクセス制御が可能になり、直接攻撃のリスクを低減できる。

### 2. 負荷分散の実現
Nginxを使用すると、複数のNodeサーバーにリクエストを振り分ける負荷分散を比較的簡単に実現できる。今回実務で開発したシステムは高いトラフィックが発生する環境であるが、スケーラブルで安定したサービス運用が可能に。

# ステップ1: Nginxをインストール
①. EC2 インスタンスにNginxをインストールする
```bash
sudo dnf install -y nginx
```

②. Nginxのバージョンを確認する。
バージョンが表示されたらNginxが無事インストールされています。
```bash
nginx -v
```

②. Nginxの自動起動を設定する
```bash
sudo systemctl enable nginx
```

③. Nginxを起動する
```bash
sudo systemctl start nginx
```

# ステップ2: Nodeのインストール

①NodeSourceリポジトリを追加
```bash
curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
```

②Node.jsをインストール
```bash
sudo yum install -y nodejs
```

③nodeとnpmのバーション確認
バージョンが表示されたら正しくインストールできています。
```bash
npm -v
node -v
```

# ステップ3: アクセスする
Nginxが正常に起動しているか確認します。

AWSにログインし、作成したインスタンスの画面を開き、パブリックIPアドレスをブラウザの検索バーに入力しましょう。
'Welcome to nginx'と表示されればnignxは正常に起動しています。

![スクリーンショット 2024-11-18 124543.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/a0aaecd1-ea68-9dc6-f774-4adcea748a5c.png)

![スクリーンショット 2024-11-18 12.52.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/0270f79f-ae39-e239-7f7a-0883bfea9550.png)


# おわりに
次回はサーバーにNode.jsアプリケーションをデプロイします。
最後までご覧いただきありがとうございました！
Flow CLI

[Previous << Testing](https://qiita.com/flowcadence/items/831eeb4521c4b645fb04)
[Next >> Install Instructions](https://qiita.com/flowcadence/items/530223569e603e10e1a7)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#flow-cli-と-fcl

**Flow コマンドラインインターフェース**（**CLI**）は、開発者がFlowブロックチェーンとシームレスにやりとりできる強力なツールです。テストネット、メインネット、Flowエミュレータを使用したローカル開発などのさまざまな環境で利用できます。使いやすさを重視して設計されたFlow CLIは次の一般的なブロックチェーンのタスクを使いやすくします。アカウントの管理、スマートコントラクトの依存関係の管理、トランザクションの送信、チェーンの状態を照会する、スマートコントラクトをデプロイするなど。

Flow CLI を使用することで、開発者は以下のことが出来るようになります。

 * **プロジェクトの初期化**：`flow init`コマンドを使用して、新しい Flow プロジェクトを素早くセットアップします。このコマンドは、必要なファイルとディレクトリを作成し、プロジェクト構成を設定し、コアコントラクトの依存関係をインストールします。
 * **コントラクトの依存関係の管理**：[依存関係マネージャー](https://qiita.com/flowcadence/items/9195f9872874baab611e)を使用して、スマートコントラクトの依存関係を簡単にインストールおよび管理し、外部コントラクトをプロジェクトに統合することをシンプルにします。
 * **アカウントの管理**：Flowアカウントの作成と管理、キーの設定、アカウント関連の操作を行います。
 * **トランザクションの送信**：トランザクションを構築し、署名し、Flowネットワークに送信することで、スマートコントラクトによるやりとりや資金の移動が可能になります。
 * **チェーンの状態の問い合わせ**：Flowブロックチェーンから、アカウント残高、イベントログ、特定のトランザクションの状態などのデータを取得します。
 * **スマートコントラクトのデプロイ**：Cadenceスマートコントラクトを、Flow環境（エミュレーター、テストネット、本番ネット）に簡単にデプロイおよび更新できます。
 * **エミュレータの使用**：Flowエミュレータを使用してローカルにFlowブロックチェーンインスタンスをセットアップし、ネットワーク上にデプロイする前に開発環境で、スマートコントラクトのテストやデバッグを行います。
 * **[Flow Access API](https://developers.flow.com/http-api)とのやりとり**：コンフィグレーションファイルおよびコマンドライン・スクリプティングを使用して複雑なワークフローを自動化します。また、これにより継続的インテグレーション（CI）やカスタム開発ツールでのより柔軟な対応が可能になります。
 * **Flowのツールのエコシステムへのアクセス**：Flow CLIを[Cadence Extension for VSCode](https://marketplace.visualstudio.com/items?itemName=onflow.cadence)などの他の開発者向けツールと統合し、開発体験を向上させます。

Flow CLIは、Flowブロックチェーン上で分散型アプリケーションを効率的に構築・テスト・保守したい開発者にとって不可欠なものであり、初心者から経験豊富なブロックチェーン開発者まで、機能が豊富で使いやすいインターフェイスを提供しています。

<h1 id="Installation">Installation</h1>

[以下の手順](https://qiita.com/flowcadence/items/530223569e603e10e1a7)に従って、macOS、Linux、WindowsにFlow CLIをインストールしてください。

<h1 id="create-your-first-project">Create Your First Project</h1>

Flowプロジェクトの作成を開始したりするため、Flow CLIのスーパーコマンドの使用方法をさらに詳しく学ぶためには、[Super Commandsのドキュメント](https://qiita.com/flowcadence/items/7009b1f3b889e7923acc)を参照してください。これらのコマンドは、セットアップや開発プロセスをシンプルにし、設定について心配することなくアプリケーションの構築に集中できるようにします。

*Last updated on **Nov 5, 2024** by Alex*

翻訳元

https://developers.flow.com/tools/flow-cli

***
<b>[Previous << Testing](https://qiita.com/flowcadence/items/831eeb4521c4b645fb04)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (Flow CLI)

<b>[Next >> Install Instructions](https://qiita.com/flowcadence/items/530223569e603e10e1a7)</b>
音楽用ライブコーディングツールを作成した。（2024年版）

### 概要

自作の音楽ライブコーディングが可能な環境・ソフトウェアを作成しました。
SESSION2024でライブコーディング環境を動作した映像を提出、ありがたいことにMusicCompo 2ndPrizeいただけました。
本当にありがとうございます。

この記事では、自作のソフトの案内およびどんな機能を持っているか概要レベルで記載して、おまけとしてSESSIONS2024で準備した環境の紹介をしたいと思います。

よかったらソフトウェア使ってみてください。
あとなんか気になることがあったら報告ください。

X（Twitter）/misskey.io/：@MachiaWorx
bluesky：@machiaworx.bsky.social

### ライブコーディングとは

https://spice.eplus.jp/articles/193984

### ソフトウェア

以下のページからダウンロード可能にしております。
https://machiaworx.net/?p=914
サポートページも作りました。
https://machiaworx.net/recode/doku.php?id=start
他にboothやitch.ioからもダウンロードできるようにしたいと思います。

映像はこんなの。
リアルタイムでソースコードを書き込み、音楽を演奏しています。

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

### どんなことができるか

* 平易なプログラミング言語記述で音楽演奏の譜面を作成可能
* サンプル再生/シンセサイザーの再生/MIDIノートの再生が可能（現行のバージョンでは主にMIDIノートに関する機能が多いです）
* リアルタイムに更新が可能、楽器のように演奏することが可能

#### メリット

##### 1.楽器演奏ができなくてもリアルタイム演奏が可能
その場でソースコードを書き換えて再コンパイルすることで、演奏を止めないでフレーズの差し替えが可能です。
上記によって、打ち込みでライブを行うのが容易に可能。
また、楽曲作成において演奏しながらデータを書き込んで比較する等、楽曲のメモを作成するのが容易になります。
##### 2.保存・バックアップが容易に可能（テキストファイルなので）
楽曲のデータについては、ソースコードとして保存されます。すなわち、テキストファイルとして保存されます。
テキストファイルであれば容量もそれほど大きくならないためバックアップは容易、かつバイナリではないため、一部データ破損によって読み込みができなくなるリスクを低下させます。
##### 3.必要なソフトウェアは少なくなる（はず）
Re:codeは単体で音楽再生を行うことができます。現時点では単音や少ない音ですが、サンプル再生に対応しており、将来的にはシンセサイザー実装を予定しております。

録音機能は備えてないため、他にDAW等を用意いただく形になります。

### ソフトウェアについて
下記がRe:code本体になります。
![スクリーンショット 2024-11-18 113720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142645/b3ae8a5d-a2bb-f722-9ba7-010a375028cb.png)

このソフトからソースコードを読み込みコンパイルし、音楽再生を行います。
また、ショートカットキーにも対応しており、現行はF10でコンパイル＋再生、F9で停止になります。

特徴的なのは「最前面に表示されており、OS上のキー入力からショートカット命令を実行可能」なことです。
すなわち、VSCodeでソースコードを変更して、フォーカスを変えずにF10を押すとすぐフレーズの更新ができます。

### 記述言語について

Re:codeはデータ作成・再生にMiniScriptの文法・機能を使っています。

MiniScriptとは
https://miniscript.org/

また譜面の整形については、独自に定義したMMLという簡単なマクロ言語が利用可能です。
適当にMIDI演奏を鳴らすなら以下の記述だけでOKです。

記述例：（ドレミファソラシ＊2回をオクターブ変えて演奏）
```
rc_midi0( sq_mml("o4 cdefgab>cdefgab") )
```

この他に繰り返し命令や条件分岐、変数を使ったフレーズ分割・結合等整形が可能となっております。

 
### 今後の拡張予定

* UI周りの修正・機能追加
* キーハック（OS上で受け取ったショートカット入力を他のソフトに通さなくする）
* シンセサイザー実装（テキストで制御しやすいシンセってなんだろ・・・と悩んでいる最中です）
* サンプルのピッチ変更・サンプルスライス等の実装
* 譜面機能の拡張

- - -

### おまけ

SESSIONS2024で提出した動画の構成解説を行います。
https://www.youtube.com/watch?v=g52rHtOzGnI

#### Re:code側の設定
まず再生についてはMIDIデータ限定にしています。
演奏を出力して音源は別のところで鳴らす形式ですね。

一応MIDI出力と音声を同期するための機能（MIDIレイテンシー調整）は付いてるのですが、レイテンシー機能が動いてるかわかりにくいのと調整に時間がかかること、用意する音源の種類を考慮し、MIDI出力オンリーで構築してます。

出力は後述の「仮想MIDIデバイス」に行います。

ソースコードは動画内で書いた通りです。
映像で記述したソースコードについて、実行ファイル一式にも封入しましたので、参考にしていただければ幸いです。

#### ルーティング・音源構成

仮想MIDIデバイスを動作させてます。
これはloopMIDIを利用してます。
https://www.tobias-erichsen.de/software/loopmidi.html

仮想MIDIデバイスからの出力をAbletonLiveで受け取り、Liveから各音源に出力を分配します。
今回は以下の音源を利用しています。
* DeeAcid
https://www.dotec-audio.com/deeacid_jp.html
* Operator（AbletonLiveの組み込み音源）
* AbletonLiveプリセットのドラム音を改造
* Roland Integra-7

### 映像

VisualSynthesizerから映像を作ってます。
https://www.imaginando.pt/products/vs-visual-synthesizer

VSTiとして起動できるため本当はMIDI制御も可能なのですが、時間がなかったのとソースコードが見づらくなるリスクがあったので、音声に合わせ書き出しし、最終的な出力を合成しております。
最低限の準備でオーディオリアクティブができるのはありがたいです。

また、このソフトウェアはGLSLのフラグメントシェーダで映像を生成しているらしく、最悪自分でソースコードを書けば拡張できるじゃん！という結論に至ったのも導入理由のひとつです。
（音楽作ってはいるものの、元々GLSL書いてましたので）
ORACLE MASTER Silver SQL 2019 (1Z0-071) の合格体験記(実務経験あり)

# 自己紹介
・業務系システムのエンジニア3年目　
※PCやパッケージソフトの導入等、開発以外の業務をおこなっている期間を含みます。
・SQLServerとOracleを使った実績あり。
受験前から基本的なSQLを書くことはできました。
・基本情報技術者試験は合格済み。

# 受講した経緯
・SQLを学習する動機付け
SQLに関する資格があまりなく、ORACLEはそこまで使わないが、SQLの勉強にはなるだろうと受験を決意しました。
・プログラムはアルゴリズムとデータがセットのため、データについて理解を深めたいと思った。
・実務でよく使うSQLについてはパっと頭に浮かんで書けるようなレベルになりたいと思った。
※例えば結合した時やグループ化したときに、どういうデータ構造になるかすぐに頭に浮かぶようなレベル

# 勉強方法
①黒本(オラクルマスター教科書 Silver SQL Oracle Database SQL　以下黒本)を2周読む
②黒本の章末にある練習問題を8割程度正解できるようにする
③Ping-tにて、各章(リレーショナル・データベース、SELECTなど)ごとに過去問を解く
④試験の1週間前の過ごし方
Ping-tにて
・直近の正答率を各章ごとに集計
例
リレーショナル・データベース 75%
DML 70%
DDL 65%など
・出題頻度の高い章を中心に学習
・とくに間違えやすい問題は「お気に入り」に登録
※Ping-Tでは問題をお気に入りに登録し、お気に入りに登録した問題だけ出題することができる

④試験当日
・頻出かつ正答率が低い章を中心に学習する
・「お気に入り」に登録した問題を解く

# 勉強時間
・2024年5月中旬～2024年11月初旬
・勉強時間数　50～70時間程度　

# 結果
・合格　正答率68%
※63%以上で合格のため、ギリギリ合格でした。　

# 感想
・有意義な試験だった。
SQLの理解を深めることができる内容だった。
・学習したい内容と試験の内容が一致する場合は学習する動機付けとして受験するのは有効だと感じた。
ただ、資格取得は目的ではなく、資格取得の中で学習した内容を実務でいかすための手段であることを肝に銘じる(課題を解決する)

試験について(反省含む)
・模擬よりも難しく感じた。
当たり前ですが、試験時の問題のフォントやテーブルやカラム名が普段見慣れたもの違っていました。
※自分はそれだけで少し動揺しました。
ただ問題の本質は教科書やPing-Tで解いてきた問題と同じものが多いため、雰囲気にのまれず、落ち着いて回答すれば正解できます。
・見直しできる時間を確保したかった。
最終的に時間がなく1/3程度しか見直しできなかったため、時間を意識した試験対策をするべきでした。
・試験日が近づくにつれて、理解よりも暗記に比重を置いてしまった。
約4万の費用がかかっていること、試験付近であまり学習時間が取れなかったこともあり、焦りがありました。

ご覧いただきありがとうございました。
これから受講する人は頑張ってください！
特定のテーブルには存在するが、もう一方のテーブルには存在しないレコードを取得するSQL

# 特定のテーブルには存在するが、もう一方のテーブルには存在しないレコードを取得するSQL

データベースを操作する際、2つのテーブルを比較して、片方には存在するがもう片方には存在しないレコードを取得したいことがある。これは、データの不整合を検出したり、特定の差分を分析する際に非常に役立つ。

## 使用する条件

- 2つのテーブルには複数のカラムを含む複合主キーがあることを想定。
- これらのカラムを組み合わせて、一意のレコードを特定する必要がある。

## 基本的なクエリ構造

複合主キーを使用してテーブルを比較するには、`LEFT JOIN`を使う方法が一般的だ。`LEFT JOIN`を使用して、条件に一致しないレコードを抽出する。

```sql
SELECT a.*
FROM table1 a
LEFT JOIN table2 b
ON a.key1 = b.key1
   AND a.key2 = b.key2
   AND a.key3 = b.key3  -- 複合主キーの各カラムを結合条件に指定
WHERE b.key1 IS NULL;
```

### クエリの説明

1. **`SELECT a.*`**: `table1`のすべてのカラムを選択する。
2. **`LEFT JOIN`**: `table1`のすべてのレコードを取得し、`table2`と結合する。ただし、結合条件に一致しないレコードも含める。
3. **`ON a.key1 = b.key1 AND a.key2 = b.key2 AND a.key3 = b.key3`**: 複合主キーの各カラムを使って、2つのテーブルを結合する。
4. **`WHERE b.key1 IS NULL`**: `table2`に存在しないレコードを抽出する。`b.key1`が`NULL`である場合は、`table2`に一致するレコードがないことを意味する。

## 実用例

### 例1: ユーザーデータの比較

2つのテーブル`users_2023`と`users_2024`があり、複合主キーが`user_id`と`email`だとする。

```sql
SELECT u23.*
FROM users_2023 u23
LEFT JOIN users_2024 u24
ON u23.user_id = u24.user_id
   AND u23.email = u24.email
WHERE u24.user_id IS NULL;
```

- **結果**: `users_2023`に存在し、`users_2024`には存在しないレコードが取得される。

### 例2: 商品データの差分チェック

2つのテーブル`products_old`と`products_new`があり、複合主キーが`product_id`と`category_id`の場合。

```sql
SELECT po.*
FROM products_old po
LEFT JOIN products_new pn
ON po.product_id = pn.product_id
   AND po.category_id = pn.category_id
WHERE pn.product_id IS NULL;
```

- **結果**: `products_old`に存在し、`products_new`には存在しない商品データが取得される。

## 注意事項

- **NULLチェック**: `LEFT JOIN`の後に`WHERE b.key1 IS NULL`とすることで、`table2`に存在しないレコードを絞り込む。結合条件に一致するレコードがない場合に`NULL`が返されるため、この条件を使用する。
- **複合主キー**: 複合主キーをすべて`ON`条件に含めることが重要。1つでも漏れると、正確な比較ができなくなる。