OmniAICreator/Qiita-1.07M huggingface dataset:
【Kotlin】AndroidStudioとfirebaseAuthでKotlinコンパイラのバージョンが競合した件

## 何が起きたのか

新しくアプリでも作るか〜と「build.gradle.kts」ファイルに依存関係とかを追記して、
ビルドしてエミュレータでHelloWorld確認しておくか。とRUNボタンをポッチっとしてみたら、あれ、、、

```
XXXX firebase-auth-api.kotlin_moduleModule was compiled with an
incompatible version of Kotlin.The binary version of its 
metadata is 2.1.0, expected version is 1.9.0.
```

なんかエラーになっちゃいました。
何が問題なんですかね？

調査の結果としては、「Android Studioで使用するKotlinコンパイラのバージョンと、Firebase Authenticationライブラリ（firebase-auth）で使用されているKotlinコンパイラのバージョンが競合している」ことが問題だったみたいです。

これをなんとか回避したので、備忘を兼ねて残しておきます


## どう対処することにしたのか

前提として、こんな感じで「build.gradle.kts」ファイルを書いてました

- プロジェクト直下
    ```
    plugins {
        id("com.android.application") version "8.2.1" apply false
        id("org.jetbrains.kotlin.android") version "1.9.0" apply false
        id("com.google.dagger.hilt.android") version "2.51.1" apply false
        // Add the dependency for the Google services Gradle plugin
        id("com.google.gms.google-services") version "4.4.2" apply false
        //composeに関する依存関係を2.1.0に合わせる
    
    }
    ```

<br>

- app直下

    ```

    dependencies {
    //firebaseの依存関係
    implementation(platform("com.google.firebase:firebase-bom:33.10.0"))
    implementation("com.google.firebase:firebase-auth")
    implementation("com.google.firebase:firebase-firestore")


    ```

---

ここで、firebase-bomを使っているので、bomがいい感じにAuthとかfirestoreとかのバージョンを解決してくれたりしていますが、そのいい感じになっているAuthのバージョンの中でKoltinコンパイラ2.1.0が使われているっぽいんですよね〜

今回は、1.9.0側に合わせようという判断をなんとなくしたので、このbom33.10.0をいい感じにダウングレードして、その中のAuthがいい感じにダウングレードしてくれれば、1.9.0のコンパイラを使ってくれるんじゃね？と思ったので、そんな対処を模索することにしました。

※コンパイラのバージョンが揃わないのが何が問題なんだ。というのは私もいまいちわかっていなかったので、そちらは最後に調べた結果をまとめておきました〜

## どうやってダウングレードしたのか

javaコードやjavaの親戚みたいなkotlinのライブラリはMarvenCentralってとこで管理されているっぽいので、そこにアクセスして
[Marven Central](https://mvnrepository.com/)

FirebaseAuthと検索バーで調べて、23.2.0が出てきたので、「Dependencies」ってところを見たら、kotlin-stdlibの依存関係のところにVersion2.1.0と書かれていました。（正しくエラーで出てたバージョンの情報ですね）

![スクリーンショット 2025-03-12 21.40.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760174/2bb80d16-d135-4c00-848a-5732f60049a2.png)


なので、FirebaseAuthの以前のバージョンの「Dependencies」を見てみて、以下のfirebaseの公式サイトでBomとFirebaseのバージョン情報をみて見たら、

[FirebaseBomとAuth等のバージョン情報を確認する](https://firebase.google.com/support/release-notes/android)

- implementation(platform("com.google.firebase:firebase-bom:33.10.0"))
を
- implementation(platform("com.google.firebase:firebase-bom:32.2.0"))

に変えたらうまく動きました。（よかった〜〜）





## 参考：コンパイラのバージョン違いは何が問題？

（1.9.0でも2.1.0でもどっちでもいいじゃん）

そう思っていましたが、何が問題なんでしょうか。調べてみました。
一例として挙げられる問題は、メモリの格納方法が変わっている可能性があるとのことでした。

何を言っているか全くわからなかったので、図示してみます。

何が言いたいかというと、
- 2.1.0ではメモリ効率を考えて、field1:Intをメモリの2つ目のセグメントに割り当てる。field2:Stringを1つ目のセグメントに割り当てる。と言うロジックになっていたとする
- 1.9.0ではfield1:Intが2つ目のセグメントに。と言った感じで、メモリへの割り当てルールが異なるため、本来取得したい値ではないものを取得する可能性があるということらしい。


![1.9.0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760174/7cf982e1-c55f-4f2a-88f9-23ebf9701699.jpeg)


以上です〜
シンクライアント端末と仮想PCの連携、セッション管理、VPNの仕組みについて

シンクライアント端末と仮想PC（またはリモートデスクトップ）を活用する環境では、リモートでアプリケーションを使用するためにさまざまな仕組みが連携します。本記事では、シンクライアント端末、仮想PC、セッション管理サーバ、SSL-VPN装置などの役割と、それらの連携について詳しく解説します。

## シンクライアント端末とは
シンクライアント端末は、ユーザーが物理的に操作する**「ディスプレイ端末」**です。これらの端末はローカルで計算処理を行わず、リモートの仮想PCやサーバー上で動作するアプリケーションを利用します。シンクライアント端末の主な役割は、ユーザーの入力を受け付け、仮想PCの結果を表示することです。

## 主な特徴
・低スペック: シンクライアント端末は、計算処理を行わないため、通常のPCよりも低性能でも問題ありません。
・リモート接続: 仮想PCやリモートデスクトップ環境に接続し、そこで動作するアプリケーションを利用します。

## シンクライアント端末と仮想PCの関係
シンクライアント端末は、仮想PCを利用するための「表示端末」の役割を担います。仮想PCは、リモートデスクトップ環境や仮想化プラットフォーム（VMware Horizonなど）を通じて、シンクライアント端末に仮想的なデスクトップやアプリケーションを提供します。シンクライアント端末は、入力デバイス（キーボードやマウス）を使って仮想PCに指示を送ります。

仮想PCの役割
仮想PCは、シンクライアント端末から送られる入力を受け取り、その結果を処理します。処理結果（画面描画やアプリケーションの出力）は、シンクライアント端末に表示されます。

## セッション管理サーバの役割
セッション管理サーバは、シンクライアント端末が仮想PCに接続する際に、どの仮想PCに接続するかを決定する重要な役割を果たします。仮想PCは、物理サーバー上で複数インスタンスが立ち上げられることが多いため、セッション管理サーバはユーザーの接続要求を受けて、適切な仮想PCインスタンスに接続を割り当てます。

・ユーザーの認証: セッション管理サーバは、シンクライアント端末から送られた認証情報を基に、ユーザー認証を行い、仮想PCへのアクセスを許可します。
・セッションの確立: 認証が成功すると、セッション管理サーバは仮想PCとの接続を確立し、シンクライアント端末に接続先の仮想PCを指定します。

## SSL-VPN装置の役割
SSL-VPN装置は、外部ネットワークから安全に社内のシステム（仮想PCやデータ）へアクセスできるようにするための装置です。シンクライアント端末が外部から社内ネットワークに接続する場合、SSL-VPNを通じてセキュアな通信を行います。

SSL-VPN装置とシンクライアント端末
・リモートアクセス: 外出先などからシンクライアント端末で社内の仮想PCにアクセスするために、SSL-VPN装置はセキュアな通信を確立します。

・認証連携: SSL-VPN装置がユーザーの認証情報を確認した後、シンクライアント端末に適切な接続情報を渡し、仮想PCへのアクセスが許可されます。認証が成功すれば、シンクライアント端末は仮想PCに接続し、デスクトップやアプリケーションを操作できるようになります。

## DHCPリレーエージェントの役割
シンクライアント端末がDHCPサーバが設置された別のネットワークセグメントに存在する場合、通常、シンクライアント端末からのDHCP要求（IPアドレスの取得要求）は、直接DHCPサーバには届きません。なぜなら、DHCPはブロードキャスト通信を使用するため、異なるセグメントにいる端末にはそのまま届かないからです。

この問題を解決するために使用されるのが、DHCPリレーエージェントです。DHCPリレーエージェントは、DHCPクライアント（シンクライアント端末）から送られたDHCP要求を受け取り、それをDHCPサーバに転送する役割を果たします。

DHCPリレーエージェントの動作
1.シンクライアント端末からDHCP要求（IPアドレスの取得要求）がブロードキャストで送信されます。
2.DHCPリレーエージェントは、その要求を受け取り、DHCPサーバが存在するセグメントに転送します。
3.DHCPサーバは、その要求に基づいて、IPアドレスを割り当て、DHCPリレーエージェントを通じてシンクライアント端末に返答します。

## 適任となる機器
・ルータ: サブネット間で通信を行い、DHCPリレーエージェント機能を持つことができる。
・L3スイッチ: L3スイッチもルータと同様にサブネット間で通信できるため、DHCPリレーエージェントとして機能できます。
これにより、シンクライアント端末が異なるネットワークセグメントにいても、DHCPサーバからIPアドレスを取得できるようになります。













## シンクライアント端末と仮想PCの通信の流れ
シンクライアント端末から仮想PCへの通信の流れは次のようになります。

1.シンクライアント端末での操作 
ユーザーがシンクライアント端末でキーボードやマウスを使って操作します。この入力が仮想PCに送信されます。

2.SSL-VPN装置による通信のセキュリティ確保 
外部からアクセスする場合、SSL-VPN装置がセキュアな通信チャネルを確立し、認証を行います。

3.セッション管理サーバによる仮想PCの割り当て 
シンクライアント端末が接続要求を送ると、セッション管理サーバがユーザーを認証し、適切な仮想PCインスタンスを割り当てます。

4.仮想PCとの接続確立 
セッション管理サーバが仮想PCとの接続を確立し、シンクライアント端末は仮想PCの画面を受け取る準備が整います。

5.双方向の通信 
ユーザーの操作（入力）が仮想PCに送信され、仮想PCが処理結果をシンクライアント端末に表示します。

## まとめ
シンクライアント端末と仮想PCは、リモートでの業務効率化に非常に有用な技術です。シンクライアント端末は、仮想PCで動作するアプリケーションやデスクトップを操作するためのインターフェースとして機能し、セッション管理サーバやSSL-VPN装置がその接続を安全かつ効率的にサポートします。

・シンクライアント端末: ユーザー操作を受け付け、仮想PCの結果を表示。
・セッション管理サーバ: 仮想PCへの接続を管理し、ユーザーに最適な仮想PCを割り当てる。
・SSL-VPN装置: 外部からの接続をセキュアに保ち、リモートでの安全なアクセスを実現。
これらの技術が連携することで、企業はセキュアかつ効率的にリモートワークをサポートできます。
【BS実践編】ソフトウェア資産と技術的負債 - バランスシートで考えるコードの価値

会計と技術の両面から見た『ソフトウェア資産と技術的負債』について、自分の備忘録的にまとめた記事を書きました。バランスシートの考え方を使って見えにくいコードの価値と負債を可視化する試みです。開発チームと経営陣の「共通言語」になれば。📝

## はじめに

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/83627ca5-cc96-44ef-9eff-3009f76af526.png)

- ソフトウェア開発の世界では、コードは単なる文字列の集まりではなく、企業にとって重要な「資産」です。
- 一方で、時間の経過や環境変化によって蓄積される「技術的負債」は将来の開発速度や品質に影響を与える「負債」として機能します。
- 本記事では、会計学のバランスシート（BS）の考え方を用いてソフトウェア資産と技術的負債を可視化し、開発投資の意思決定に役立てる方法を解説します。
- **注意**: 記事内で言及する「技術的負債のBS計上」は、あくまで**管理会計上の拡張的な考え方**であり、実際の法定会計基準上の負債にそのまま計上できるわけではありません。

---

## 1. ソフトウェアという「資産」の特殊性

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/a7a78754-30d9-4a0f-a1d4-b56d99c570d3.png)

### 1.1 有形資産vs無形資産としてのソフトウェア

- 一般的な会計処理ではソフトウェアは「無形固定資産」として計上されます。
- 物理的な建物や設備と比較すると、ソフトウェアには次のような特徴があります：
  - **劣化の特性**: 物理的な摩耗ではなく、技術環境や要件の変化により価値が下がる
  - **価値の測定**: 開発コストは把握できても「市場価値」の評価は難しい
  - **拡張性**: 追加投資により、機能追加や性能向上が可能
  - **複製コスト**: コピーの限界費用がほぼゼロ

### 1.2 ソフトウェア資産の減価償却

- 日本会計基準では「自社利用ソフトウェア」は通常5年間の定額法で減価償却しますが、実際の「技術的価値」は必ずしも直線的には減少しません：
  - **初期段階**: 市場適応や機能追加でむしろ価値が上昇するケースもある
  - **成熟段階**: 価値は安定する一方、徐々に技術的負債が蓄積
  - **衰退段階**: 技術スタックの陳腐化により価値が急速に下がる
- したがって**会計上の減価償却**とは別に、**技術的観点での価値評価**を定期的に行うことが重要です。
- ※IFRSやUS GAAPでは研究開発段階の区分や費用化基準が異なる場合があります。国際的なルールでは資産化できる範囲に違いが出るので、グローバルに展開する企業は注意しましょう。

---

## 2. 技術的負債のBS表現

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/3b0878ba-dabc-4812-b083-a79bfaab3d9e.png)

### 2.1 技術的負債の定量化

- 技術的負債を数値化し、BSの「負債」として見立てる方法は以下のとおりです：
  - **コード品質メトリクス**: 複雑度・重複度・テストカバレッジなどの指標
  - **修正コスト見積もり**: 負債解消に要する工数×平均人件費
  - **将来コスト増加率**: 負債による今後の開発効率低下や工数増加
  - **リファクタリング必要度**: 問題箇所ごとにスコアリング
- 例として、以下のように「技術的負債額」を試算できます：
  ```
  技術的負債額 = Σ(モジュールごとの修正工数 × 平均人件費) + 
               将来の追加開発コスト増加分
  ```

### 2.2 BS上での表現方法

- 技術的負債を実際の財務諸表で「負債」として計上することは難しいため、内部管理用途として以下のアプローチを考えます：
  1. **引当金アプローチ**: 将来的に必要となる修正コストを内部的に引当金として把握
  2. **資産評価アプローチ**: ソフトウェア資産から技術的負債相当額を差し引き、残存価値を試算
  3. **注記アプローチ**: BS本体ではなく、管理資料や注記として「潜在的な負債」を把握
- いずれにせよ公式な財務会計基準とは異なるため、**「拡張BS」**として可視化する形が現実的です。

### 2.3 技術的負債のポートフォリオ管理

- 技術的負債を一括りの数値ではなく、以下のように分類すると意思決定がスムーズです：
  - **短期負債**: 小規模リファクタで解消可能
  - **長期負債**: アーキテクチャレベルの再設計が必要
  - **戦略的負債**: 市場投入速度を優先し、あえて負債を抱えたケース
  - **偶発負債**: ライブラリのサポート終了など外部要因で将来的に発生するかもしれない負債

---

## まとめ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/4fadbd98-01f9-4753-a58f-ec49f00d9545.png)


- ソフトウェア資産と技術的負債をBSの視点で捉えると、開発組織と経営サイド双方にとって「共通言語」が生まれます。
- これは単なる会計処理というよりも、技術的な意思決定と経営的な意思決定をつなぐ手法です。
- 「見えにくい」ソフトウェアの価値と負債を一元的に可視化することで、長期的・戦略的な投資判断を行いやすくなります。

---

> ※本記事は会計的・技術的観点を融合させた概念解説であり、正式な会計処理を示すものではありません。  
> 実際の計上方法は自社の会計ポリシーや適用会計基準(日本基準/IFRS/US GAAPなど)を踏まえ、専門家の判断を仰いでください。

## マインドマップ

![マインドマップ (30).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/605d9d10-4220-4c7d-ad17-4ea0e919edc8.png)
AIエージェント時代の自動開発と業務変革の仕方について

2025年に入ってから、益々AIについては遅れを取れなくなっているなと感じています。特にAIエージェントについては、新しいサービスや機能がどんどん増えてきており、正直見切れていない部分もかなりあるなと感じました。そこで、この1週間は生成AIに関するウェビナーを10個くらい受講しました。その中で学んだこと、感じたことを共有します。

## AIエージェントによる自動開発の可能性
AIを活用した自動開発が進む中、開発者には新たな役割が求められています。特に、自動開発のでは、AIがコーディングしている間、開発者に空き時間が生じます。その空き時間の使い方として、他の自動コーディングツールを活用し、並行して開発を進めることで、最適なソリューションを選択可能にしたり、DeepResearchなどで詳細な調査を行なうなどで有効活用ができます。
<br>
それから、これからの開発者にはマネジメント能力がより一層重要になってくると感じました。AIに適切な指示（プロンプト）を出し、バグを管理しながら品質を担保するなど、ただ開発をしてきたこれまでとは違い、AIを使ってそれ以上の品質を出していくためにマネジメントする必要があります。
<br>
またウェビナーでは、最新のAIコーディングツールについても言及がありました。
ーーーーーーーーーーーーーーーー
・Windsurf
特徴：AIエージェント特化
強み：プロジェクト全体のコンテキストを理解し、適切な修正を行う
注意点：データ整形や事前設定が必要

・Cursor
特徴：LLM補助型 IDE
強み：コード補完やリファクタリングに強い
注意点：プロジェクト全体の理解は浅い

・Cline
特徴：高速処理型 AI
強み：処理能力が高く、コード生成が速い
注意点：文脈を無視して暴走することがある
ーーーーーーーーーーーーーーーー

↓

【適切なツールの選び方】

・AIに開発をある程度任せるなら → Windsurf
・補助ツールとして使うなら → Cursor
・爆速で試したいなら → Cline

<br>

## AIエージェントとは

AIエージェントは、1つのAGIの中に数十億のエージェントが（脳内）ネットワークのように存在するイメージ。AGI（汎用人工知能）と通常のAIの関係は、IoTとITの関係に似ています。

【AIエージェントの3つのポイント】

・自律的な判断・行動
・総合的なタスク管理
・継続的な学習と改善

<br>
AIエージェント時代において、企業が競争力を維持するために重要なのは以下の3点です。

・経営者のビジョン → 明確な指針を示す。
・データの蓄積・整形 → 有用なデータを持つことが鍵。
・プロダクト開発と社内活用 → まず社内で実証実験を行い、改善を繰り返す。


## 企業におけるAIエージェントの段階的適応

企業がAIを活用して業務を変革するには、自動運転技術の発展と同じように段階的なレベルアップが必要です。

ーーーーーーーーーーーーーーーー
・レベル1
戦略：企業内の積極活用
概要：生成AIの導入で生産性向上
主な取り組み：照会応答の効率化、文書作成、ミーティング録音・要約
コア技術：RAG
↓
・レベル2
戦略：全体業務の再設計
概要：生成AIと他技術を組み合わせ業務を最適化
主な取り組み：コールセンターの自動化、営業・マーケティング最適化
↓
・レベル3
戦略：競争優位性確立
概要：独自データを活用しビジネスモデルを変革
主な取り組み：企業エージェント導入、新規事業創出
ーーーーーーーーーーーーーーーー

ちなみにRAGとは、ユーザーの質問後に、事前に与えていた整形したデータとその質問をAIが読み込んで回答する、というような仕組み。簡易的なものを体験したい方は、GoogleのNotebookLMを使ってみてほしい。資料を与えた上で質問すると、その資料に沿った回答が得られるといった具合だ。



## SoftbankのCristalとデータ活用

SoftbankのCristalは、企業の全データを統合し、業務支援を行うAIエージェントです。企業内のデータを整理し、実際の業務で活用できる形にすることができます。これはまだ開発途中らしいですが、リリースされたら日本国内ではシェアを獲得できるサービスなのではないかなと感じています。

### AIエージェント時代の課題

長期記憶の活用とアクセス方法が重要 → Cristalの活用で解決可能
データプラットフォームの整備は必須 → データ整備が進んでいる企業ほど、AIの恩恵を受けやすい

### データ品質のジレンマ

社内のデータを整備する際、ジレンマがある。それは、正しいデータ（知識）を知っている人たちが忙しくて、意味あるデータを得られない。むしろ、そのデータの今後の重要性（AIに食わせたら自分達の作業がどれほど簡略化されるかなど）をわからずに、雑なデータを与えてしまうと、なんの見返りも得られない。逆に、AIを推進したい開発者側は、その重要性はわかっているが、現場の意味ある知識を把握できておらず、故に最大限有益なデータにならない可能性が高い。

現場のデータ：実運用には必要だが、忙しくて雑になりがち。
開発側のデータ：理論的には正しいが、現場の実用性が低い。
↓
雑なデータ：AIのパフォーマンスを大きく低下させる。

## まとめ

AIエージェント時代では、適切なデータ整備が競争力を決める要素になります。
企業はデータ品質を高め、適切なAIツールを活用することで、次世代のビジネスに適応していく必要があります。

今後も、AIエージェントがもたらす変革に注目し、最適な活用方法を模索していきましょう。
CUE言語のFunctionパターン

CUE言語は他の言語のような独自の関数を定義する構文は用意されていません。そのためFunctionパターンと言って、structsを利用して、関数のように振る舞わせることができるテクニックがあります。

https://cuetorials.com/patterns/functions/

cuetorialsを参考に偶数、奇数判定をする関数を作成しました。
cue言語にはif～elseがないので、同じ条件を書きたい時などに使いたいかなと思いました。

```golang
#Is_odd_number: {
	in:  int
	out: bool

	out: mod(in, 2) > 0
}

randum_number: 10

if (#Is_odd_number & {in: randum_number}).out {
	result: "奇数です。"
}
if !(#Is_odd_number & {in: randum_number}).out {
	result: "偶数です。"
}

/// $ cue export function.cue 
/// {
///     "randum_number": 10,
///     "result": "偶数です。"
/// }
```
Laravel開発時によく使うあれこれ

取り急ぎのメモ

## SQLを確認
Laravelで作ったSQLをパラメータ付きで確認したいとき
`preg_replace_array('/\?/', array_map(fn($param) => "'" . $param . "'", $query->getBindings()), $query->toSql());`

dd()と組み合わせた場合
`dd(preg_replace_array('/\?/', array_map(fn($param) => "'" . $param . "'", $query->getBindings()), $query->toSql()));`

## tinker
```
# トランザクション

## トランザクション開始
DB::beginTransaction();

## ロールバック
DB::rollBack();

## トランザクションをコミット
DB::commit();

# クエリログ

## クエリログ有効
DB::enableQueryLog();

## クエリログ取得
DB::getQueryLog();
```

## Laravelのログファイルから期間を絞って特定の文字を調べたいとき
grepしてからawkバージョン
`grep 'ERROR' laravel-root-2025-03-12.log | awk '$1 == "[2025-02-06" && $2 >= "12:35:00]" && $2 <= "12:45:00]" { print }'`

awkだけバージョン
`awk '$1 == "[2025-02-06" && $2 >= "12:35:00]" && $2 <= "12:39:00]" && $3 ~ /ERROR/ { print }' laravel-root-2025-03-12.log`

# 番外
## git履歴ツリー表示
`git log --graph --pretty=format:'%x09%C(auto) %h %Cgreen %ar %Creset%x09by"%C(cyan ul)%an%Creset" %x09%C(auto)%s %d'`

## git log差分
`git log --no-merges origin/main..origin/develop`
main..developはlogのフィルター記法。
このように書くと後者のブランチ（この例では origin/develop）には含まれるが
前者のブランチ（この例では origin/main）には含まれないコミットのログだけ表示する。
https://git-scm.com/book/ja/v2

## 変更があったファイル名のみ表示
ブランチ比較の例
`git diff main..hotfix/1021 --name-only`
コミット間は
コミットハッシュ..コミットハッシュにする

## 複数の連続したコミットをcherry-pickしたいとき
`git cherry-pick {始点となるコミットの１つ前のコミットハッシュ}..{終点となるコミットハッシュ}`
VBA で Try～Catch～Finally を実装する

例として「Sheet1の表から都道府県が東京都のデータをSQLでSheet2に抽出するマクロ」に `Try～Catch～Finally` を実装してみよう。
VBA には `Try～Catch～Finally` がないので `GoTo`文で代用する。

ポイントは、

- エラーがあってもなくても `Finally` は実行する
- オブジェクトの `Close` と参照の開放は `Finally` でまとめて行う

上記に留意すればとくに難しい部分はない。

```vb
Sub TryCatchFinally()

On Error GoTo ErrCatch

    Dim errNum As Long

    Dim cn As Object
    Dim rs As Object
    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")

    With cn
        .Provider = "Microsoft.ACE.OLEDB.12.0"
        .Properties("Extended Properties") = "Excel 12.0;HDR=YES;IMEX=1"
        .Open ThisWorkbook.FullName
    End With

    With rs
        .CursorLocation = 3
        .Open "SELECT * FROM [" & Sheet1.Name & "$] WHERE 都道府県='東京都';", cn
    End With

    With Sheet2
        .Rows("2:" & .Rows.Count).ClearContents
        .Range("A2").CopyFromRecordset rs
        .Columns.AutoFit
    End With

    GoTo Finally  '-- これを忘れないように

ErrCatch:

    errNum = DebugPrintError(Err, "TryCatchFinally")
    Resume Finally
    
Finally:

    Call CloseADO(rs, cn)
    Call SetNothing(rs, cn)
    Call EndOnError(errNum)

End Sub
```

```vb
'// エラー情報を出力してエラー番号を返す

Function DebugPrintError(e_r_r As ErrObject, ByVal err_point As String) As Long

    '--［err_point］エラーCatchしたプロシージャ名

    Dim errNum As Long: errNum = e_r_r.Number

    If errNum <> 0 Then
        Debug.Print "エラー箇所："; err_point
        Debug.Print "エラー内容："; e_r_r.Description
        Debug.Print "エラー番号："; e_r_r.Number
        Debug.Print "エラーソース："; e_r_r.Source
    End If
    e_r_r.Clear

    DebugPrintError = errNum

End Function
```

```vb
'// 引数で与えられたすべてのADOオブジェクト（ado）を閉じる

Sub CloseADO(ParamArray ado())

    Dim adStateOpen As Long: adStateOpen = 1

    Dim i As Long
    For i = LBound(ado) To UBound(ado)
        If ado(i).State = adStateOpen Then ado(i).Close
    Next i

End Sub
```

```vb
'// 引数で与えられたすべてのオブジェクト（obj）への参照を解放する

Sub SetNothing(ParamArray obj())

    Dim i As Long
    For i = LBound(obj) To UBound(obj)
        If Not obj(i) Is Nothing Then Set obj(i) = Nothing
    Next i

End Sub
```

```vb
'// エラーが発生した場合はマクロを終了する

Sub EndOnError(ByVal errNum As Long)

    If errNum <> 0 Then
        MsgBox "エラーが発生したのでプログラムを停止します。", vbExclamation
        End
    End If

End Sub
```

このままだとエラーが発生しないので、エラーを発生させたい場合は、例えば、

　**`"SELECT * FROM [" & Sheet1.Name & "$] WHERE 都道府県='東京都';"`**

の部分の `WHERE` と `都道府県` の間のスペースを削除して、

　**`"SELECT * FROM [" & Sheet1.Name & "$] WHERE都道府県='東京都';"`**

にするとエラーが発生する。
ASTERIA Warp 開発ユーザー作成

### ASTERIA Warpのユーザー権限
ユーザーの権限として・管理者・開発者・運用者 を選択することができます。
```
管理者: 自分の管理するドメイン内のユーザー情報や設定を表示、更新、削除できます。
開発者: 自分が作成したフローや設定のみを表示、更新、削除できます。
運用者: 所属するドメイン内のすべての情報や設定を表示するのみで、編集はできません。
```
ユーザーと権限の詳細について、詳しくは以下のURLをご覧ください。

https://help.asteria.com/documentation/warp/ja/current/flow/mc/index.html#role_top

### 開発ユーザーを作成する手順
##### 1. ASTERIA Warp 正常起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463540/f5d045c6-7e96-492d-b207-7d306f704479.png)
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463540/9150357b-13fd-486d-b662-a69320ae60de.png">

##### 2.フローサービス管理コンソール(FSMC)　ログインする
例)　・https://localhost:28080/ ・https://サーバーのIPアドレス:28080/


<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463540/973410b8-f42d-49b0-b16b-b0b153d3eaef.png">

###### ※　ユーザー名：asu　パスワード：初期設定時に指定されたパスワードです
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463540/d420bd88-f812-4eda-ab12-1e9c3ac186e2.png">


##### 3.フローサービス管理コンソール(FSMC)にログインする
###### 「ツール」＞「アカウント」＞「所属ユーザー作成」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463540/20f10192-cdf9-473c-b27a-eb6b03a35418.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463540/ba47e1e7-961d-45ae-8d7f-825a92051890.png)




### 作成したユーザーからログインし、フロー開発することができます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463540/397297b4-cfff-4624-816d-0e702c82f41a.png)


フローサービス管理コンソール(FSMC)のユーザー設定では、フォルダー、コンテキスト、FTP、証明書などの設定が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463540/123f8c9a-768a-42ee-9fe7-f2306cb26508.png)



参考：

https://support.asteria.com/hc/ja/articles/229087647

https://help.asteria.com/documentation/warp/ja/current/flow/mc/index.html
useActionState で「pending」状態を活用する方法

～ユーザーに優しいフィードバックを実現するために～

React や Next.js を使った開発で、サーバーに処理を依頼する際に便利なフックとして「useActionState」があります。
このフックは、サーバー側で何らかのアクションを実行し、その結果を受け取るだけでなく、アクションが実行中かどうか、つまり「pending」状態を管理できるのが特徴です。
ここでは、実際のコード例を交えながら、どうすればユーザーにわかりやすいフィードバックが提供できるかを、初学者にでも分かりやすく解説します！

## 1. そもそも「pending」って何？

pending 状態とは、簡単に言えば「今、処理中だよ」というサインです。
たとえば、ユーザーがボタンをクリックして何かの処理を頼んだとき、処理が完了するまでの間に「処理中…」やスピナーを表示することで、ユーザーに「今、ちゃんと動いてるよ」と知らせることができます。
これが pending 状態の役割です。

## 2. なぜ pending 状態が大切なの？

ユーザーにとっては、何も起こらないと操作が効いていないように感じてしまうことがあります。
たとえば、ボタンを押しても何の反応がなければ「クリックしても効果がないのか…」と不安になりますよね。
そこで、処理中はボタンを無効化したり、テキストを「処理中…」に変更することで、ユーザーに安心感を与えることができるのです。

## 3. 実際のコード例

以下は、useActionState を使ってアクション中に pending 状態を利用する例です。
このコードでは、サーバーにリクエストを送り、その間にボタンが無効化される仕組みになっています。
```typescript
import { startTransition } from "react";
import { useActionState } from "react";

// サーバー側で何か処理を実行するアクション
async function sampleAction(prevState: string, formData: FormData) {
  // ここでサーバーにリクエストを送る（例：fetch を使う）
  const response = await fetch("/api/sample");
  const result = await response.json();
  return result.message;
}

export default function Page() {
  // useActionState は、状態（state）、アクションをトリガーする関数（triggerAction）、そして pending 状態を返すとします
  const [state, triggerAction, pending] = useActionState(sampleAction, "初期状態");

  const handleAction = () => {
    // startTransition を使って低優先度の更新として処理を行う
    startTransition(() => {
      triggerAction(new FormData());
    });
  };

  return (
    <div>
      <p>結果: {state}</p>
      <button onClick={handleAction} disabled={pending}>
        {pending ? "処理中..." : "アクションを実行"}
      </button>
    </div>
  );
}
```
このコードのポイント
	•	状態管理がシンプルに！
useActionState を使うと、サーバーから返ってきた結果を state にセットできるほか、アクション実行中かどうかを pending で管理できます。
	•	ユーザーにわかりやすいフィードバック
ボタンの disabled 属性を pending に連動させることで、アクションが実行中はボタンが押せなくなり、「処理中…」と表示されます。
	•	startTransition の活用
React の startTransition を使うことで、処理を低優先度として扱い、他の重要な更新と競合しないようにしています。
空のActionを実行する時には、startTransitionを使用しないpendingが上手く動かなかったことがあります。
空のAction（FromDataを使わないアクション）を使用する時にはstartTransitionを使用しましょう。

## 4. まとめ
	•	pending 状態を使う理由
ユーザーに「今、処理中です」という明確なフィードバックを提供し、誤って何度も同じアクションを実行しないようにするためです。
	•	実装のポイント
useActionState を使って状態や pending 状態を管理し、ボタンの表示や無効化などの UI を連動させることが大切です。
また、startTransition を併用することで、ユーザー体験を損なわない形で更新を行えます。

このテクニックを上手に取り入れて、ユーザーにとってストレスのない、スムーズなインターフェースを実現しましょう。日々の開発の中で、細かなフィードバックがユーザー体験に大きく影響することを実感できるはずです。
紐づいたテーブルにデータが反映されない症状の解決方法について

# はじめに
開発中usersテーブルにフォームに入力したデータをonSubmitで登録しても紐づいたuser_skillテーブルにデータが追加されない箇所でつまずいたため、解決方法を共有させていただきます。なお、Foreign key設定はsupabaseで設定済です。

<br>

このように記述していました。
``` users.ts
import { supabase } from "../../utils/supabase";
import { UserParams } from "../../domain/users";

export async function insertUsers(user: UserParams): Promise<UserParams>{
  const { data, error } = await supabase.from("users").insert([{
   user_id: user.user_id, name: user.name, description: user.description, github_id: user.github_id, qiita_id: user.qiita_id, x_id: user.x_id}])
  .select();

  if (error) {
    console.error(error);
    throw error;
  }
  if (!data || data.length === 0) {
    throw new Error("データがありません");
  }

  user.skill_id?.map(skillId => ({
    user_id: user.user_id,
    skill_id: skillId
  }))

  const { error: skillError} = await supabase.from("user_skill").insert([{user_id: user.user_id, skill_id: user.skill_id}])
  if (skillError) {
    console.error(skillError);
    throw skillError;
  }


  return data[0] as UserParams;
}
```


# 解決方法
user_skillテーブルにuser.skill_idを配列で追加する
Promiseの型もuserとskillsの2つ指定し、最後に返すことでコンソールでも出力できました。

``` users.ts
import { supabase } from "../../utils/supabase";
import { UserParams } from "../../domain/users";

export async function insertUsers(user: UserParams): Promise<{user: UserParams; skills: {skill_id: number }[]}>

{
  const { data, error } = await supabase.from("users").insert([{
   user_id: user.user_id, name: user.name, description: user.description, github_id: user.github_id, qiita_id: user.qiita_id, x_id: user.x_id}])
  .select();

  if (error) {
    console.error(error);
    throw error;
  }
  if (!data || data.length === 0) {
    throw new Error("データがありません");
  }

  
  const { error: skillError} = await supabase.from("user_skill")
  .insert(user.skill_id?.map(skillId => ({
    user_id: user.user_id,
    skill_id: skillId
  })));

  if (skillError) {
    console.error(skillError);
    throw skillError;
  }

  return {
    user: data[0] as UserParams,
    skills: user.skill_id?.map(skillId => ({ skill_id: skillId})) || []
  };
}
```

```Register.tsx
// supabaseにデータ登録
  const onSubmit = async (data: UserParams) => {
    try {
      const insertedUser = await insertUsers(data);
      console.log("insertedUserの中身", insertedUser)
    } catch (error) {
      console.error(error);
    }
  };

```


# おわりに
これで、意図した動きになってくれました。

<br>

[<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/8bfacf61-7d8d-6d27-cb07-98d1f8f27fcd.png"  width=100%>](https://projisou.jp)
docomoのモバイル通信による認証はテザリングで通るかもしれない

## 要約
普段スマホをwifiで運用していると、キャリア系の認証が必要な場面でwifiを切るよう指示されることがある
通常は素直にwifiを切ってモバイルデータ通信にすれば問題ないのだが、別端末で認証を通したい場面があって困った
テザリングを試したらうまく行った話

## 発端
docomoの回線契約はしておらず、iPhoneで**d払い**を使っていた
iPhoneにはUQの物理SIMが入っていて、サブ機のAndroid用に月550円で運用できるirumo(docomo)を契約し、eSIMを入れた
irumoの契約に際して、**d払い**で使っていた**dアカウント**を結びつけていた
irumo無事開通。すると何通かのメールが一気に届いて、その中に
> **【d払い】重要_d払い残高お預かりのお知らせ**

何とも不穏なメールが

## 困った
慌ててメインのiPhoneに入れていたd払いを確認すると**残高が0になっており**、支払い方法が**電話料金合算払い**に変わっている
落ち着け。メールをよく読んでみると
>・お預かりしたd払い残高の受取りには、「d払い残高の利用登録」が必要となります。
・「d払い残高の利用登録」は、ご利用いただいておりましたdアカウントにてd払いアプリにログインいただくことで完了いたします。下記手順にてd払い残高を受取りください。

大した額じゃないが資産が凍結されてしまった。今まで普通に使えていたものが、開通と同時に使えなくなるなんて
とにかく「d払い残高の利用登録」に進むが、出た！wifi切ってモバイル通信で接続せよの指示
d払いはiPhoneに入っている。docomoのeSIMはAndroidに入れて開通してしまった。もちろんwifi切ってUQの回線で接続してもdocomoの認証は通りませんわ
物理SIMなら差し替えてみるところだがeSIMなので、iPhoneで使うにはeSIMを再発行してもらわないといけないし、またAndroidに戻さなきゃいけないので面倒

## ダメ元で
要するにdocomoのネットワークで接続しろって話だから、テザリングでいけるんじゃね？
AndroidでWi-FiアクセスポイントをONしてiPhoneを接続する
無事「d払い残高の利用登録」できた！

## 補足
凍結されていたd払い残高が戻ってきたのは2日後だった
アプリからは接続がモバイル回線かwifiか見分ける方法があるので、アプリの作りが厳格であれば使えないかもしれない
[Python][Equations] 方程式の種類とそのユースケース

# 1. 一般方程式 (関数)
- **定義**: 導関数や偏導関数を含まない関数の関係式。
- **形式**:
  ```math
  f(x) = 0
  ```
  または
  ```math
  y = f(x)
  ```
- **ユースケース**:
  - 代数: 線形方程式や非線形方程式。
  - 経済学: 需要と供給の関係、マーケットの均衡。
  - 数理最適化: 最適化問題の目的関数や制約条件。

# 2. 線形方程式 (Linear Equations)
- **定義**: 変数が1次（またはそれ以下）の項だけを含む方程式。
- **形式**:
  ```math
  a_1x_1 + a_2x_2 + \dots + a_nx_n = b
  ```
- **ユースケース**:
  - 代数: 連立線形方程式、行列の操作。
  - 経済学: 生産関数、需給のバランス。
  - 物理学: 静的な力学系の解析。

# 3. 非線形方程式 (Nonlinear Equations)
- **定義**: 変数が1次以外の項（例えば二乗項や高次の項）を含む方程式。
- **形式**:
  ```math
  a_1x_1^2 + a_2x_2^2 + \dots + a_nx_n^2 = b
  ```
- **ユースケース**:
  - 物理学: 非線形振動、カオス理論、力学系。
  - 生物学: 個体群モデル、感染症の伝播。
  - 化学: 反応速度論における非線形現象。

# 4. 整数方程式 (Diophantine Equations)
- **定義**: 解が整数（または有理数）であることを要求する方程式。
- **形式**:
  ```math
  a_1x_1 + a_2x_2 + \dots + a_nx_n = b
  ```
- **ユースケース**:
  - 数論: 整数の解を求める問題（最大公約数、最小公倍数）。
  - 暗号学: RSA暗号など、整数論に基づいた暗号技術。

# 5. 微分方程式 (Ordinary Differential Equation, ODE)
- **定義**: 1つの変数に関する関数の導関数を含む方程式。
- **形式**:
  ```math
  \frac{dy}{dx} = f(x, y)
  ```
- **ユースケース**:
  - 物理学: 速度や加速度、運動方程式（ニュートンの法則）。
  - 化学: 反応速度論における物質の濃度変化。
  - 生物学: 個体群の成長モデルや感染症の伝播。
  - 電気回路: RLC回路の解析。

# 6. 偏微分方程式 (Partial Differential Equation, PDE)
- **定義**: 複数の変数に関する関数の偏導関数を含む方程式。
- **形式**:
  ```math
  \frac{\partial u}{\partial t} = \alpha \frac{\partial^2 u}{\partial x^2}
  ```
- **ユースケース**:
  - 流体力学: ナビエ–ストークス方程式。
  - 熱伝導: 熱方程式（物質内の熱の拡散）。
  - 波動方程式: 音波、光波、弾性波など。
  - 量子力学: シュレディンガー方程式。

# 7. 差分方程式 (Difference Equations)
- **定義**: 離散的な変数に関する方程式で、関数の値が隣接する値に依存する。
- **形式**:
  ```math
  y_{n+1} = f(n, y_n)
  ```
- **ユースケース**:
  - 経済学: 経済動向、消費者行動の時間変化。
  - 人口動態: 年ごとの人口の成長。
  - 金融学: 投資のリターン、株価の変動。

# 8. 確率方程式 (Stochastic Equations)
- **定義**: 確率論に基づいた方程式で、ランダム変数を含む。
- **形式**:
  ```math
  dX = \mu dt + \sigma dW_t
  ```
- **ユースケース**:
  - 金融: 株価のモデリング（ブラック・ショールズ方程式）。
  - 物理学: 粒子のランダム運動（ブラウン運動）。
  - 経済学: 確率的ダイナミクスやランダムショック。

# 9. 最適化方程式 (Optimization Equations)
- **定義**: ある目的関数を最大化または最小化する方程式。
- **形式**:
  ```math
  \text{minimize} \quad f(x)
  ```
  subject to:
  ```math
  g(x) \leq 0, \quad h(x) = 0
  ```
- **ユースケース**:
  - 工学: 製造プロセスの最適化、リソース配分。
  - 経済学: 利益最大化、コスト最小化。
  - 機械学習: ニューラルネットワークのパラメータ最適化。

---
# 参考リンク
- [Wikipedia - 微分方程式](https://ja.wikipedia.org/wiki/%E5%BE%AE%E5%88%86%E6%96%B9%E7%A8%8B%E5%BC%8F)
- [Wikipedia - 偏微分方程式](https://ja.wikipedia.org/wiki/%E5%81%8F%E5%BE%AE%E5%88%86%E6%96%B9%E7%A8%8B%E5%BC%8F)
- [Khan Academy - 微分方程式の基本](https://ja.khanacademy.org/math/differential-equations)
- [Wolfram MathWorld - Differential Equations](https://mathworld.wolfram.com/OrdinaryDifferentialEquation.html)
- [Wolfram MathWorld - Partial Differential Equations](https://mathworld.wolfram.com/PartialDifferentialEquation.html)
- [Coursera - 微分方程式とその応用](https://www.coursera.org/learn/differential-equations)
- [Wikipedia - 最適化理論](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%81%B8%E5%8C%96)
Linuxコマンド入門：pwd・mkdir・rmdir・rm の使い方を体系的にまとめてみた

## はじめに

Linuxを操作する上で、基本的なコマンドを理解しておくことは非常に重要です。本記事では、ディレクトリの操作やファイルの削除に関する基本的なコマンドを紹介し、使い方や注意点を詳しく解説します。

## 書こうと思ったきっかけ

Linuxを初めて触る人や、基本的なコマンドの使い方を復習したい人向けに、シンプルかつ分かりやすい記事を書こうと思いました。

***特に、ディレクトリの作成や削除、現在の作業ディレクトリの確認など、日常的に使用する頻度が高いコマンドに焦点を当てています。***

## Linuxの基本コマンド

今回は、以下のコマンドについて解説します。

- `pwd` コマンド
- `mkdir` コマンド
- `rmdir` コマンド
- `rm` コマンド

## 1. `pwd` コマンド（現在のディレクトリの表示）

`pwd`（print working directory）は、現在作業しているディレクトリのパスを表示するコマンドです。

### 使い方
```sh
pwd
```

### 実行例
```sh
$ pwd
/home/user
```
この例では、`/home/user` ディレクトリにいることが分かります。

## 2. `mkdir` コマンド（ディレクトリの作成）

`mkdir`（make directory）は、新しいディレクトリを作成するコマンドです。

### 使い方
```sh
mkdir ディレクトリ名
```

### 実行例
```sh
$ mkdir new_folder
```
このコマンドを実行すると、カレントディレクトリに `new_folder` というディレクトリが作成されます。

### オプション
- `-p` : 親ディレクトリもまとめて作成する
  ```sh
  mkdir -p parent/child/grandchild
  ```
  `parent` ディレクトリが存在しない場合でも、一緒に作成されます。

## 3. `rmdir` コマンド（ディレクトリの削除）

`rmdir`（remove directory）は、空のディレクトリを削除するコマンドです。

### 使い方
```sh
rmdir ディレクトリ名
```

### 実行例
```sh
$ rmdir old_folder
```
`old_folder` が空であれば削除されます。

### 注意点
`rmdir` は **空のディレクトリしか削除できません**。中にファイルや別のディレクトリがある場合は削除できません。

## 4. `rm` コマンド（ファイル・ディレクトリの削除）

`rm`（remove）は、ファイルやディレクトリを削除するコマンドです。

### 使い方
```sh
rm ファイル名
rm -r ディレクトリ名
```

### 実行例
```sh
$ rm file.txt  # file.txt を削除
$ rm -r my_folder  # my_folder ディレクトリを中のファイルごと削除
```

### オプション
- `-r` : ディレクトリを **再帰的** に削除する（ディレクトリが空でなくても削除可能）
- `-f` : 確認なしで強制削除する
  ```sh
  rm -rf dangerous_folder
  ```
  `-rf` オプションは強力なので注意して使用してください。

## まとめ

| コマンド | 機能 |
|---------|------|
| `pwd`  | 現在のディレクトリを表示する |
| `mkdir` | 新しいディレクトリを作成する |
| `rmdir` | 空のディレクトリを削除する |
| `rm`    | ファイルやディレクトリを削除する |

これらのコマンドを使いこなせば、Linuxのファイル操作をスムーズに行うことができるのでおすすめです！
zlibのインストール

## 環境構築
Visual Studio2022、git
[7-Zip](https://7-zip.opensource.jp/)をインストールする。
[CMake GUI](https://cmake.org/download/)の最新のリリース版をインストールする。
## コマンド
``C:\``直下に移動し、管理者権限で以下のコマンドを実行する。
```.bat
rmdir /s /q zlib-1.3.1
git clone https://github.com/madler/zlib.git
del zlib-1.3.1.tar.gz
curl -O https://zlib.net/zlib-1.3.1.tar.gz
del zlib-1.3.1.tar
"c:\Program Files\7-Zip\7z.exe" x zlib-1.3.1.tar.gz
rmdir /s /q libzlib-1.3.1
"c:\Program Files\7-Zip\7z.exe" x zlib-1.3.1.tar
```
```.bat
cd zlib-1.3.1
rmdir /s /q build
mkdir build
cd build
del CMakeCache.txt
rmdir /s /q CMakeFiles\
cmake .. -G "Visual Studio 17 2022" -A x64 -T host=x64 ^
    -DCMAKE_INSTALL_PREFIX="c:/zlib-1.3.1"
```
```.bat
cmake --build . --config RELEASE
```
```.bat
cmake --build . --config RELEASE --target INSTALL
```
## 環境変数の設定
「<strong>PATH</strong>」に``C:\zlib-1.3.1\bin``、
「<strong>ZLIB_ROOT</strong>」に``C:\zlib-1.3.1``、
「<strong>LIB</strong>」に``C:\zlib-1.3.1\lib``をシステムの環境変数に設定する。
```.bat
powershell -command "$oldpath = [System.Environment]::GetEnvironmentVariable('Path', 'Machine'); $oldpath += ';C:\zlib-1.3.1\bin'; [System.Environment]::SetEnvironmentVariable('Path', $oldpath, 'Machine')"
powershell -command "[System.Environment]::SetEnvironmentVariable('ZLIB_ROOT', 'C:\zlib-1.3.1', 'Machine')"
powershell -command "$oldpath = [System.Environment]::GetEnvironmentVariable('LIB', 'Machine'); $oldpath += ';C:\zlib-1.3.1\lib'; [System.Environment]::SetEnvironmentVariable('LIB', $oldpath, 'Machine')"
```

以上、お疲れ様でしたー
このNMEAメッセージは何!?

未熟なもんで誤字脱字あるかもしれないです。読みにくい記事ですみません。
# はじめに
 　GPSの受信機**AT6668 = M5stack GPS v1.1**を使用し、PCAS03コマンドですべてのセンテンスを表示するようにした。
 その結果、いくつかのメッセージが表示された。
 ```
 $GNDHV
 $GPTXT
 $GNRMC
 $GNVTG
 $GNGGA
 $GPGSV(GPS)
 $GLGSV(GLONASS)
 $GAGSV(GALILEO)
 $BDGSV(BEIDOU)
 $GQGSV(QZSS)
 $GNGLL
 $GNGST
 $GNZDA
 $PCAS50 ←問題のデータ（センテンス）
 ```
 実際のPCAS50データ
 ```nmea:PCAS50
 複数あります
$PCAS50,104035.00,15.002,2147483648.2147482647,12.188,-0.027,242,125,1.0,2147483648.2147482647*2A

$PCAS50,104038.00,15.002,-2147483648.2147482647,12.184,-5924143.500,242,125,1.0,2147483648.2147482647*0A

$PCAS50,104046.00,15.002,2147483648.2147482647,12.172,-0.000,241,125,1.0,0.000*23

$PCAS50,104050.00,15.002,,,-2147483648.2147482647,240,125,1.0,2147483648.2147482647*1C

$PCAS50,104150.00,,0.000,12.074,,232,125,1.0,*1D
```
なんなんですかね このデータは...
# 推測
(,カンマで区切り、左からn番目で以下に書きます。1番目は$PCAS50です)
2 UTC時刻
3 不明 15が最大値?
4 ある時とない時がある 2^31(+ -)というところが面白い。AT6668のシステム的な?
5 小数点もある　最大値は240?
6 数字があったりなかったり、小数だったり...
7 必ず整数っぽい
8 必ず整数?
9 1.0らしい
10 あったりなかったり...

# 詳しい方教えてください!!
 何かあり次第追記していきます。

# 追記
AT6668ではないですが、AT300の仕様書にこんな記載がありました。

![f58bffda-8597-4b09-b707-d0bb58fd8e32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3994157/058aabfd-f714-4023-b5ce-2eac109f2f70.png)

Google Translateを使って翻訳したのでなぞの文字がありますが、なんとかわかります。

https://download.s21i.faiusr.com/15960580/0/0/ABUIABA9GAAgiqelrAYo-tvS8wY.pdf?f=AT300%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C_%20GNSS%E5%8D%95%E9%A2%91%E9%AB%98%E7%B2%BE%E5%BA%A6%E5%AE%9A%E4%BD%8D%E5%AE%9A%E5%90%91%E6%A8%A1%E5%9D%97.pdf&v=1703498636

でも上限値が正しくないですね。あくまでも参考程度としてです。
（-2147483648.2147482647 これの意味とは...）
AWS SAA備忘録記事⑤〜Amazon S3〜

# はじめに
本記事では、AWS最も基本的かつ重要なストレージサービスであるS3について解説します。

# Amazon S3の基本

### ストレージクラス
- Standard
 頻繁にアクセスするデータ向け
- Standard-IA
 アクセス頻度が低いマスターデータの長期保存向け
- Glacier
 アーカイブデータ向け

## S3のデータ保護機能

### オブジェクトロック機能
S3バケットに保存されるドキュメントが保存後に変更も削除もできないようにするには、オブジェクトロックのコンプライアンスモードを活用する。

- コンプライアンスモード
 オブジェクトが削除または上書きできないように一定期間または無期限に防止できる。
- MFA Delete機能
 バケットからのデータ削除時にMFA入力を必須化して、誤った削除を防止する。

### データ削除保護の選択
- 一部社員が消せない → ガバナンスモード
- みんな消せない → コンプライアンスモード

### S3の暗号化オプション
- SSE-S3
 AES-256を利用したS3の暗号化機能。追加料金が発生せず、APIコールの制限を考慮する必要もないのがメリット。ただし、利用状況の監査証跡が取れないのがデメリット。
- SSE-C
 顧客が管理する暗号化キーをS3に適用する形式。ユーザー側で独自の暗号化キーを作成可能。
- SSE-KMS
 暗号化キーの管理機能をマネージドサービスで提供。CloudTrailによりアクティビティの証跡ログが取得可能。

## S3の拡張機能

### S3イベント通知
S3バケットに新しいオブジェクトがアップロードされた際などに、自動的に処理を実行できる機能。

`S3バケットにデータが保存されたイベント → トリガー → Lambda関数 → データ処理`

### S3 Select
シンプルなSQLステートメントを使用してS3オブジェクトのコンテンツをフィルタリングし、必要なデータのサブセットのみを取得できる機能。
S3が転送するデータ量を削減でき、データ取得コストと待ち時間を改善できる。

## S3の応用的な活用法

### 静的ウェブホスティング
S3バケットを使って静的ウェブサイトをホスティングする方法は下記である。
1. 静的ウェブホスティングをS3バケットに構成
2. Amazon CloudFrontを構成し、S3バケットをオリジンとして設定
3. バケットポリシーでインターネットからのS3:GetObjectを許可
4. パブリックアクセスブロックを無効化

### S3バケットへのアクセス制限
特定のユーザーに一時的にアクセス許可を与える方法
事前署名付きURLを発行することで、特定の画像を一時的に共有するための特別なURLを発行できる。

### 不正アクセスからの保護
- Referer制限
  CloudFrontディストリビューションにAWS WAFを設定し、直接URLリンクを参照することを制限する
- OAI(オリジンアクセスアイデンティティ)
  CloudFront側でOAIを割り当て、そのOAIにのみS3バケット内への読み取り権限があるようにS3バケットポリシーを設定
- OAC(オリジンアクセスコントロール)
  OAIと同様の機能を提供する新しい方式

### S3 Transfer Acceleration
S3バケットへのデータアップロードを効率化する機能。
CloudFrontのエッジロケーションを活用して、遠隔地からのアップロードパフォーマンスを向上させる。

### マルチパートアップロード
大きなファイルを分割してアップロードする機能で、アップロード速度の向上と信頼性の確保に役立つ。

## 暗号化関連の注意点
S3バケットでは、バケットポリシーによってデータアップロードリクエストを評価してアクセス許可を実施した上で、データアップロード時の暗号化が適用される。

バケットの暗号化設定を有効化していても、暗号化情報なしのPUTリクエストを拒否するバケットポリシーがある場合は、そのPUTリクエストは拒否される。
暗号化失敗が発生した場合は、バケットポリシーの設定を確認する。
新米データサイエンティストの日常（架空）｜工数削減システムの提案編

# はじめに
今回は、「新米データサイエンティストの日常」シリーズの第８弾になります。新米データサイエンティストが躓きがちなテーマについて、先輩データサイエンティストと会話しているシーンをChatGPTに生成してもらいました。

第７弾はこちら↓

https://qiita.com/UKI_datascience/items/c9d7fa7aacfdb75cf36a

# 登場人物（架空）
- **佐藤（新米データサイエンティスト・入社1年目）**  
- **田中（先輩データサイエンティスト・入社5年目）**  
- **鈴木（クライアント・企業のデータ活用担当者）**  

---

### **シーン1：社内ミーティング（提案の準備）**

**佐藤**：「田中先輩、今回のクライアント向けの提案資料を作成しました。これまで手作業で行っていたデータ処理を自動化するシステムを導入すれば、かなりの工数削減が可能です。」  

**田中**：「いいね。どのくらいの削減効果が見込める？」  

**佐藤**：「計算すると、月に200時間ほどの工数削減になります。人員換算すると、ほぼ1人分の作業が不要になる計算です。」  

**田中**：「ふむ……。佐藤、この提案のポイントは“工数削減”だけど、それを“人員削減”と直接結びつけて提案すると、クライアントの反応が悪くなる可能性があるよ。」  

**佐藤**：「えっ？ なぜですか？ 会社としてはコスト削減ができるし、効率化も進むはずですよね？」  

**田中**：「確かに会社側の視点ではそうかもしれない。でも、クライアントの担当者がシステム導入にOKを出すかどうかは、また別の話なんだ。特に、今回のクライアントは長年この業務を続けてきたチームを抱えている。単純に“人を減らせる”と言ってしまうと、“じゃあ自分の仕事がなくなるのか”と警戒される可能性が高い。」  

**佐藤**：「なるほど……。では、どのように提案すればいいでしょうか？」  

**田中**：「“人員削減”ではなく、“より付加価値の高い業務へシフトできる”ことを強調するといい。例えば、定型業務が減ることで、より高度なデータ分析に時間を使えるようになる、とかね。」  

**佐藤**：「確かに、その方がクライアントにもメリットとして伝わりやすいですね。では、その方向で資料を修正してみます。」  

---

### **シーン2：クライアントとの打ち合わせ**  

（クライアント企業の会議室）  

**鈴木（クライアント）**：「今日はお越しいただきありがとうございます。さっそくですが、ご提案の内容を伺えますか？」  

**佐藤**：「はい。今回の提案は、現状手作業で行われているデータ処理を自動化し、業務の効率化を図るものです。これにより、月に200時間の工数削減が見込めます。」  

**鈴木**：「なるほど。しかし、その分の人員はどうなるのでしょう？ うちのチームのメンバーは、これまでこの業務をずっと担当してきました。」  

**佐藤**：「ええと……（田中さん、助けてください……）」  

**田中**：「鈴木さん、今回のシステム導入は単なる人員削減が目的ではなく、業務の質を向上させることが狙いです。たとえば、これまでデータ整理に費やしていた時間を、より高度なデータ分析や戦略立案に使えるようになります。」  

**鈴木**：「より高度な業務……ですか？」  

**田中**：「はい。現在、貴社のデータ活用は定型業務が中心ですが、今回のシステムを導入すれば、より戦略的な分析や予測モデルの活用にシフトできます。データサイエンティストの役割が、単なるデータ整理からビジネスの意思決定を支援する方向へ進化できるわけです。」  

**鈴木**：「確かに、それが実現すれば理想的ですね。でも、現場のメンバーが新しい業務に対応できるか不安があります。」  

**佐藤**：「その点については、システム導入後に研修やOJTを行い、スムーズに移行できるようサポートします。また、業務フローの見直しもお手伝いできます。」  

**鈴木**：「なるほど。確かに、単なる人員削減ではなく、業務の高度化という視点なら前向きに検討できます。」  

**田中**：「ありがとうございます。では、具体的な導入スケジュールや研修計画について、詳細をご相談させていただければと思います。」  

**鈴木**：「はい、よろしくお願いします。」  

---

### **シーン3：打ち合わせ後の振り返り**

（帰社途中のカフェ）  

**佐藤**：「いやぁ、最初に“人員削減”の話を出さなくてよかったです。鈴木さん、最初は警戒していましたけど、最終的には前向きに考えてくれましたね。」  

**田中**：「そうだね。クライアントに提案するときは、相手の立場や心理を考えることが重要なんだ。“この提案が自分たちにとってどうプラスになるか”を納得してもらうことが大事だからね。」  

**佐藤**：「勉強になりました。次回の提案も、クライアント目線を意識して準備してみます！」  

**田中**：「いいね。どんどん経験を積んでいこう！」
AWS SAA備忘録記事④〜AMI・EBS・ELB等〜

## はじめに
本記事では、AMIの共有と暗号化、EBSストレージの管理、Elastic Load Balancingの活用方法、ハイブリッドクラウド環境の構築、そしてコスト最適化のためのオプションについて解説します。

## AMIの共有と暗号化

暗号化されたAMIを別のAWSアカウントと共有する方法は下記である。

1. AMIのLaunchPermissionプロパティを変更して、特定のAWSアカウントとのみ共有するように設定
2. AWS KMSのキーポリシーを変更して、第三者のAWSアカウントに対してAMIの暗号化に利用したKMSキー（CMK）を使用できる権限を付与

## EBSストレージ

### EBSボリュームのアタッチ方法

- 実行中のアタッチ（ホットアタッチ）  
インスタンスが実行中の状態でアタッチ

- 停止中のアタッチ（ウォームアタッチ）  
インスタンスが停止している状態でアタッチ

- インスタンスが起動中のアタッチ（コールドアタッチ）  
インスタンス起動時にアタッチ

### Amazon Data Lifecycle Manager (DLM)

EBSのスナップショット取得のライフサイクルポリシーを設定できるサービス。
EBSボリュームのスナップショットの作成、保存、削除を自動化するスケジュールを設定できる。

## ELB (Elastic Load Balancing)

### Connection Draining

既存の接続を開いたまま、登録解除または異常なインスタンスへのELBのリクエスト送信を停止する機能で、ロードバランサーは登録解除または異常なインスタンスに対して行われた実行中のリクエストを完了するトラフィック処理を実施する。

### スティッキーセッション

ELBがサーバにリクエストを振り分ける際にCookieを確認して、特定のクライアントからのリクエストを特定のサーバに継続的に送信することができる。

## ハイブリッドクラウド環境の構成

### AWS Storage Gateway

オンプレミスとAWS間のハイブリッド環境を構築するためのサービス。
#### 主なゲートウェイの種類
- キャッシュ型ボリュームゲートウェイ  
  * プライマリーはS3ストレージ
  * オンプレミス環境のストレージをS3に拡張
  * 頻繁にアクセスされるデータはローカルのストレージゲートウェイに保持
  * 最大32TiBのサイズのボリュームを作成可能

- 保管型ボリュームゲートウェイ  
  * プライマリーはオンプレミスストレージ
  * プライマリデータをローカルに保存する一方で、そのデータを非同期にS3にバックアップ
  * オンプレミスのアプリケーションがデータセット全体に低レイテンシーでアクセス可能

### iSCSI対応

AWS Storage Gatewayを利用することで、オンプレミスのアプリケーションサーバーにiSCSIデバイスとして接続できる。

`iSCSI = 物理的に接続されているデバイスとネットワーク越しにSCSI接続をするためのインターネットプロトコル`

## コスト最適化オプション

### リザーブドインスタンス

主なリザーブド購入オプションは下記の通りである。

- EC2リザーブドインスタンス
- RDSリザーブドインスタンス
- ElastiCacheリザーブドキャッシュノード
- DynamoDBリザーブドキャパシティ
- Redshiftリザーブドノード

長期利用が見込まれる場合は、これらのオプションを検討することでコスト削減が可能。

## まとめ
次回は、Amazon S3について詳しく見ていきます。
AWS SAA備忘録記事③〜ハイパフォーマンスコンピューティングとネットワーク基礎〜

# はじめに
AWSには様々なサービスがありますが、実務でよく使われる機能やコンセプトについて整理してみました。
本記事は、ハイパフォーマンスコンピューティングとネットワーク基礎に焦点を当てています。

## ハイパフォーマンスコンピューティング (HPC)

### AWS ParallelCluster
HPC（ハイパフォーマンスコンピューティング）環境を迅速に構築・デプロイできるAWSのサービス。概念実証から本番稼働まで、必要なコンピューティングリソース、スケジューラ、共有ファイルシステムが自動的に設定される。

- EFA（Elastic Fabric Adapter）
 特定のインスタンスタイプで使える高性能ネットワークインターフェース。
 HPCや機械学習ワークロードに最適。

- MPI（Message Passing Interface）
 並列コンピューティングで使用される標準的な通信プロトコル。

### ユースケース
銀行取引に対するハイパフォーマンスコンピューティングと機械学習を利用した不正検知システムなど、膨大な量の計算処理を高速に実行する必要があるケースに適している。

`AWS ParallelCluster + EFA + MPI = 高性能な分散処理環境`

## ネットワーク関連

### VPCエンドポイント
インターネットを経由することなくAWS内のサービスにアクセスするための機能。

- ゲートウェイエンドポイント
 VPC内のサービスからS3やDynamoDBなどのサービスに、インターネットを介さずに接続できる。

- インターフェースエンドポイント
 その他のAWSサービスに対してプライベート接続を提供する。

### オンプレミスとAWSの接続方法
オンプレミス環境とAWSネットワークを接続する主な方法

1. AWS Direct Connect
  専用線接続を構成。低レイテンシーで可用性の高い安全な接続が可能。

2. AWS Site-to-Site VPN
  インターネット経由のVPN接続。コスト最適ながら、パフォーマンスはDirect Connectよりも低下する。

プライマリ接続には低レイテンシーで可用性の高いDirect Connectを使用し、セカンダリ（バックアップ）にはVPNを利用する構成が一般的。

## Amazon Route 53
DNSサービスとして様々なルーティングポリシーを提供している

- 位置情報ルーティング
 ユーザーの地理的位置に基づいてトラフィックを処理するリソースを選択。この機能によって、ユーザーの位置に応じて言語表示やトラフィック処理方法を変更できる。

- 地理的近接性ルーティング
 レイテンシーを向上させたい場合に使用する。

- 複数値回答ルーティング
 DNSクエリに対する応答として複数の値（ウェブサーバーのIPアドレスなど）を返すように設定可能。
 IPアドレス単位でのヘルスチェックを実施して、複数のIPアドレスにDNSレスポンスを分散できる。

### Route 53レコードタイプ

- Aレコード
 IPv4に基づいたドメイン設定に使用

- AAAAレコード
 IPv6アドレスの時に使用

- ALIASレコード
 CloudFrontなどのAWSリソースをRoute 53レコードに設定する場合に使用する、AWS独自のレコード

- CNAMEレコード
 特定のドメインに対して別のドメインを設定して、ドメイン間の名前解決を設定する際に利用

### CloudFrontと連携した構成例
`ドメイン → Route53（ALIASレコード、Aレコードタイプ）→ CloudFrontディストリビューション`

## まとめ
この記事では、AWSのハイパフォーマンスコンピューティングとネットワーク基礎について解説しました。
次回は、AMI・EBS・ELB等について詳しく見ていきます。
BERTの実装を試す

BERTの実装を試す。

BERTもLLMだが、ChatGPTと違うのは、双方向(bidirectional)でマスクトランゲージモデル（単語の一部を隠して学習）を採用している点だ。今回はCPUのみで行う。

Jupyter Notebookで作成したので、[こちら](https://github.com/kawagashira/llm/blob/master/fine_tune_bert.ipynb)を参照。

参考書：
[BERTによる自然言語処理入門: Transformersを使った実践プログラミング](https://amzn.to/3S5HAhQ)

## ライブラリをインストール
Hugging Faceのtransoformersをインストールする。

```
pip install transformers datasets torch scikit-learn
```

## 映画レビューDBを使ってファイン・チューニング

データセットのロードとトークン化
```
from datasets import load_dataset

# IMDb映画レビューのデータセット
dataset = load_dataset("imdb")

from transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")

# データの前処理関数
def encode(examples):
    return tokenizer(examples["text"], truncation=True, padding="max_length", max_length=512)

# データセットをトークナイズ
dataset = dataset.map(encode, batched=True)
```

## モデルロードとパラメータ設定
```
from transformers import BertForSequenceClassification

# 感情分析用に2クラスの出力を持つBERT
model = BertForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2)

from transformers import TrainingArguments

training_args = TrainingArguments(
    output_dir="./results",       # 学習後のモデルの保存場所
    per_device_train_batch_size=4, # バッチサイズ
    per_device_eval_batch_size=4,
    num_train_epochs=3,           # 学習エポック数
    logging_dir="./logs",         # ログの保存場所
)
```

### 学習
メモリを消費しすぎるので、バッチサイズ4にした。
```
from transformers import Trainer

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=dataset["train"],
    eval_dataset=dataset["test"],
)

# 学習の開始
trainer.train()
```

それでもCPUだけだと、学習に時間かかりすぎなので、次はONNXに変換してやってみたい。

ググったら、もっと簡単に一行でできるみたい。本当に現代はスキルがすぐに陳腐化する時代なあ。
[HuggingFaceのTransformerライブラリを使ってみよう](https://qiita.com/ski2_1116/items/f74e7b97008663d0702d)
AWS SAA備忘録記事②〜Auto Scaling 後半〜

# はじめに
[AWS SAA備忘録記事①-Auto Scaling-
](https://qiita.com/saburo555/items/37a4294ca267f578b42f)に引き続き、Auto Scaling機能があるものをまとめてみました。

# キャッシュ/メッセージング系
## ElastiCache（キャッシュ）
ElastiCacheはRedisとMemcachedに対応したマネージドキャッシュサービス。
- ElastiCache for Redis Auto Scaling
レプリカノードの自動調整
- 自動フェイルxオーバー
プライマリノード障害時の自動切り替え
- シャード自動調整
Redis (クラスターモード有効) でのシャード数の自動調整

## Amazon MSK（Kafkaサービス）
MSKはApache Kafkaのマネージドサービス。
- Auto Scaling
ブローカーのストレージ容量の自動調整
- プロビジョニングされたスループット
必要に応じたスループットの自動調整
- パーティション再分散
ブローカー間の負荷分散の自動最適化

## SQS（キューイング）
SQSはフルマネージドメッセージキューサービス。
- 無制限のスケーリング
キューサイズによる制限なし
- Auto Scaling連携
SQSキューの深さに基づいてEC2 Auto Scalingグループをスケールする仕組み

## Redshift（データウェアハウス）
Redshiftは大規模なデータウェアハウスサービス。
- Redshift Concurrency Scaling
同時実行クエリ数に応じた自動スケーリング
- Redshift Serverless
需要に応じた自動的なデータウェアハウスリソースの調整
- Elastic resize
クラスターサイズの迅速な変更（ノード数の調整）

# AI/ML系
## SageMaker（機械学習）
SageMakerは機械学習モデルの構築、トレーニング、デプロイを支援するマネージドサービス。
- トレーニングジョブの自動スケーリング
データ量に応じたトレーニングリソースの調整
- エンドポイントのAuto Scaling
推論エンドポイントのインスタンス数を自動調整
- SageMaker Serverless Inference
トラフィックに応じて自動的にスケーリングするサーバーレス推論
[Python][Financial Engineering][Fluid Mechanics] 線形PDEと非線形PDE

# 線形PDE（Linear PDE）
**定義**：  
PDE が **線形** であるとは、未知関数とその偏導関数が **1次の線形結合** の形をしていることを意味します。つまり、未知関数やその導関数が **掛け算** されたり、**べき乗** になったりしない場合です。

**一般形（線形PDE の例）**  
```math
a(x,t) \frac{\partial u}{\partial x} + b(x,t) \frac{\partial u}{\partial t} + c(x,t) u = f(x,t)
```
ここで、$ u(x,t) $ は未知関数であり、係数 $ a(x,t), b(x,t), c(x,t) $ は $ u $ に依存しません。

## 代表的な線形PDE：
### 1. **熱方程式（Heat Equation）**  
   ```math
   \frac{\partial u}{\partial t} = \alpha \frac{\partial^2 u}{\partial x^2}
   ```
   → 温度の時間変化を記述するPDE（拡散現象を表す）

### 2. **波動方程式（Wave Equation）**  
   ```math
   \frac{\partial^2 u}{\partial t^2} = c^2 \frac{\partial^2 u}{\partial x^2}
   ```
   → 振動や波の伝播を記述するPDE

### 3. **ラプラス方程式（Laplace Equation）**  
   ```math
   \nabla^2 u = 0
   ```
   → 静的な場の分布（例：電位、温度、圧力など）を記述するPDE

---

# 非線形PDE（Nonlinear PDE）
**定義**：  
PDE が **非線形** である場合、未知関数やその偏導関数が **累乗** されたり、**掛け算** されたりします。つまり、未知関数やその導関数が **非線形な形** をしているときです。

**一般形（非線形PDE の例）：**  
```math
\frac{\partial u}{\partial t} + u \frac{\partial u}{\partial x} = 0
```
この場合、$ u $ の1次導関数が $ u $ に掛け算されているため、**非線形PDE** になります。

## 代表的な非線形PDE
### 1. **バーガーズ方程式（Burgers' Equation）**  
   ```math
   \frac{\partial u}{\partial t} + u \frac{\partial u}{\partial x} = \nu \frac{\partial^2 u}{\partial x^2}
   ```
   → 交通流、衝撃波、流体力学の簡略化モデルとして使用

### 2. **ナビエ–ストークス方程式（Navier-Stokes Equations）**  
   ```math
   \rho \left( \frac{\partial u}{\partial t} + (u \cdot \nabla) u \right) = - \nabla p + \mu \nabla^2 u + f
   ```
   → 流体の運動を記述（対流項 $( (u \cdot \nabla) u )$ が非線形）

### 3. **ブラック–ショールズ方程式（Black-Scholes Equation, 線形だが非線形拡張あり）**  
   基本形は線形だが、**ボラティリティが資産価格に依存する場合など、拡張すると非線形PDE** になる。

---

# 線形PDE と 非線形PDE の違い

| 特徴 | 線形PDE | 非線形PDE |
|------|--------|--------|
| **未知関数の性質** | 1次の線形結合のみ | べき乗や掛け算が含まれる |
| **解の振る舞い** | 重ね合わせの原理が成り立つ | 非線形相互作用が発生 |
| **数値解析の難しさ** | 解きやすい | 解が複雑になり、特異点・カオスが発生しやすい |
| **例** | 熱方程式、波動方程式、ラプラス方程式 | ナビエ–ストークス方程式、バーガーズ方程式 |

---

# まとめ
- **線形PDE** は **解析的に解きやすい** ことが多く、**重ね合わせの原理** が成り立つ。
- **非線形PDE** は **相互作用やカオス的な振る舞い** があり、数値解析が難しい。
- **金融工学・物理・流体力学など、実世界の問題は非線形PDEを含むことが多い**（例：ナビエ–ストークス方程式、ブラック–ショールズの非線形拡張）。

# 参考リンク
- []()
imageのpushで "Error: writing blob: uploading layer chunked: blob upload invalid" 発生

## 環境
- OpenShift 4.15 (OpenShift Data Foundation 4.15)
- Red Hat Quay 3.13.4
[こちら](https://rheb.hatenablog.com/entry/2022/09/26/151603)のような手順で、PVをバックエンドにしたMCGのバケットをデータストアとした Red Hat Quay を使用。

## 発生したエラー
docker push が次のようなエラーで失敗していました。
```
WARN[0169] Failed, retrying in 1s ... (1/3). Error: writing blob: uploading layer chunked: blob upload invalid

Error: writing blob: uploading layer to https://.....: received unexpected HTTP status: 500 Internal Server Error
```

quay_app_pod のログを見ると次のようなメッセージがみつかりました。

```text:oc logs my-registry-quay-app-84b8bbc97b-wcfbz -n quay-enterprise
gunicorn-registry stdout | 2025-03-06 04:33:52,738 [252] [WARNING] [storage.cloud] Error when writing to stream in stream_write_internal at path uploads/962875f7-6f85-470b-ae51-0bb281d52b7a: An error occurred (InvalidBucketState) when calling the UploadPart operation: The request is not valid with the current state of the bucket.
gunicorn-registry stdout | 2025-03-06 04:33:52,782 [252] [ERROR] [data.registry_model.blobuploader] storage.stream_upload_chunk returned error An error occurred (InvalidBucketState) when calling the UploadPart operation: The request is not valid with the current state of the bucket.
gunicorn-registry stdout |     raise BlobUploadException(upload_error)
gunicorn-registry stdout | data.registry_model.blobuploader.BlobUploadException: An error occurred (InvalidBucketState) when calling the UploadPart operation: The request is not valid with the current state of the bucket.
```
## 対応
OpenShift Container Platform コンソールから確認する限りバケットは正常でした。
しかし、今回使用しているのが ODF 4.15 であったことから、以前遭遇したことのある default backingstore のリソース不足を疑いました。そこで、次のようにリソース割り当てを増やしたところ、imageのpush が成功しました。

```
$ oc patch -n openshift-storage backingstore noobaa-default-backing-store --type=merge --patch='{"spec":{"pvPool":{"resources":{"limits":{"cpu": "999m","memory": "1Gi"}}}}}'
$ oc patch -n openshift-storage backingstore noobaa-default-backing-store --type=merge --patch='{"spec":{"pvPool":{"resources":{"requests":{"cpu": "999m","memory": "1Gi"}}}}}'
```

```
$ oc get backingstore noobaa-default-backing-store -n openshift-storage
NAME                           TYPE      PHASE   AGE
noobaa-default-backing-store   pv-pool   Ready   2d13h
```

## 参考
ODF 4.16 で「OpenShift Data Foundation Multicloud Object Gateway BackingStore のリソース割り当ての増加」という機能拡張が入っています。
4.16以前のバージョンを使用する場合は、注意が必要です。

https://docs.redhat.com/ja/documentation/red_hat_openshift_data_foundation/4.16/html/4.16_release_notes/increase_in_resource_allocation_for_openshift_data_foundation_multicloud_object_gateway_backingstore
AWS リージョンとAZ(アベイラビリティーゾーン)

## リージョンとは
データセンターの所在地

## AZとは
リージョン内の独立したデータセンター

## リージョンの選び方
### 通信速度を重視する場合
日本のユーザー向けの場合、`ap-northeast-1 `(東京)や`ap-northeast-3`(大阪)が最適です

### コストを重視する場合
`us-east-1`(バージニア北部)、`us-west-2`(オレゴン)が一番安いです。(`ap-northeast-1`（東京）は約1.3倍高いです。)

### サービスの対応状況を重視する場合
AWSのサービスが1番多いのは`us-east-1`(バージニア北部)です

### 将来的な拡張性を重視する場合
事業の成長を見越して、拡張しやすいリージョンを選びます

## シングルAZとは
1つのAZのみを利用してシステムを構築する方法です

## マルチAZとは
2つ以上のAZを利用してシステムを構築する方法です

### メリット
- 可用性の向上
  - ダウンタイムを減らすことができます
- 耐障害性の向上
  - AZごとに独立した電源・ネットワーク・設備があるため、1つのAZがダウンしても、他のAZで稼働を継続できます
- データの冗長化（データ損失リスクの低減）
  - RDS（MySQL, PostgreSQL など）では、マルチAZを利用すると同期レプリケーションでデータを別のAZにコピーし、データ消失を防ぐことができます

### デメリット
- コストの増大
- レイテンシ(通信遅延時間)の増加

## まとめ
リージョンの選び方
- 通信速度重視 → `ap-northeast-1`(東京) / `ap-northeast-3` (大阪)
- コスト重視 → `us-east-1` (バージニア北部) / `us-west-2` (オレゴン)
- サービスの充実度重視 → `us-east-1` (バージニア北部)

AZの選び方
- コスト重視 → シングルAZ
- 可用性重視 → マルチAZ
Windows11にアップグレード後、初期設定を変更して快適になったこと（その１）

## まえがき

Windows10のサポートが2025年10月14日（火）で終了することで、Windows11にアップグレードされている方が多いと思います。

Windows11にアップグレードしてから不便になり、設定変更して快適になったことがありましたのでご紹介します。

## 高速スタートアップ有効を解除
高速スタートアップは、Windows を終了する際にメモリーや CPU の状態を保持して、起動を高速化する機能で初期設定では有効になっています。﻿
起動が早くなるメリットはありますが、Windowsアップデート後に不調になったり、設定変更が適用されず、正常に起動しなかったりすることがあります。
私はパソコンが不調になり、再起動や完全シャットダウンを繰り返して解決していましたが、設定変更したことで不調は起きなくなりました。

### ＜設定方法＞
- コントロールパネル>ハードウェアとサウンド>電源オプションを開く
- 左メニューから「電源ボタンの動作を選択する」を押下
![高速スタートアップのスクショ１.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392883/28eae86f-79e0-40be-a04a-4c0610331b18.jpeg)  
　　
- シャットダウン設定で「高速スタートアップを有効にする（推奨）」にチェックが入っていることを確認
- 「現在利用可能でない設定を変更します」を押下
![高速スタートアップのスクショ２.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392883/57175b54-4250-4e93-9a22-1eb7ed270b46.jpeg)
　
- 「高速スタートアップを有効にする」のチェックをオフにして「変更の保存」を押下
![高速スタートアップのスクショ４.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392883/8ca734f9-7dd7-44e7-9a4a-eba35f4628a5.jpeg)
　
「変更の保存」押下後、電源オプション画面に戻りますので、
左メニューから「電源ボタンの動作を選択する」を押下、
「現在利用可能でない設定を変更します」を押下、
シャットダウン設定で”高速スタートアップを有効にする（推奨）”にチェックが外れていることを確認します。

以上で設定完了です。

## 注意事項
あくまで私の経験談ですので、設定は自己責任でお願いします。

### 補足
他にもWindows11から初期設定を変更して快適になったことがありますので、情報共有したく思います。