OmniAICreator/Qiita-1.07M huggingface dataset:
「工数報告しろ」って言われて絶望 → 3年前の自分を救った自作ツールが地味に便利だった話

## 「この案件、直接と間接の工数、分かる？」

──その一言がすべての始まりでした。

新卒で入社して間もない頃、上司に突然そう言われた3年前の僕。
「えっ、管理するための標準ツールとかって…ありますか？」と聞いてみたものの、

> あるわけない。

当然ながら、そんな気の利いたものは存在せず。  
右も左も分からない状態で、とにかくPCの前に座って考えること数時間……いや、体感3年。

---

## 「これ、自分でツール作ったほうが早くね？」

ということで、勢いとテンションだけで作ってみたのがこちら。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235105/b01615bb-3b56-4935-8e2f-2c7268e2445b.png" width="500" />

#### じゃーーーん！！！

びっくりするくらいシンプルですが、**必要な機能だけ**に絞ってます。

---

## ✅ このツールでできること

- 全体の工数実績の把握  
- 案件ごとの工数実績の把握  
- 日付ごとの工数実績の把握  

案件名をクリックすれば──  
![案件リンク画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235105/07c8a3a8-4174-4917-bb97-33a0b18d3b44.png)  
作業履歴がズラリと出てきます。

---

## ✅ 入力はマークダウンだけでOK！

日付ごとに、こんな感じの `.md` ファイルを作って、7行目から記入していくだけ。

![マークダウン入力例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235105/f0de2d67-96d1-4dc8-92f5-7aa9bf535878.png)

- **内容**：作業内容（任意）  
- **案件**：案件名（※スペースNG）  
- **作業**：直接 / 間接 / 任意の値（任意）  
- **工数**：かかった時間（必須）

---

## ✅ すると…GitHub Actions が全部やってくれます

- 全体まとめのREADME作成  
- 案件別の工数ファイル作成  
- 各日付ファイルにも、実績合計と小計がちゃんと追記されるため、記録されます  

![自動生成イメージ1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235105/864c1a8f-2a02-4978-b299-4453a47c08da.png)

![自動生成イメージ2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235105/592907e2-9a55-4acd-9f14-f82183a49798.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235105/2e4afb4a-9255-460b-8bbc-b748c5ef6abd.png)

---

## ✅ 使い方（めっちゃ簡単）

1. [リポジトリ](https://github.com/benjaaamin0518/test_daily_process) をクローン  
2. 「input」フォルダに `年_月_日.md` ファイルを作成  
3. `.github/workflows/main.yml` のブランチ名を変更  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235105/8bb3edd8-6bbf-4822-a7ac-de7359ec55f5.png)
4. コミット＆プッシュ  
5. 自動でファイル生成＆整形されて、GitHubに反映！

---

## 🔗 実際のリポジトリはこちら  
👉 [https://github.com/benjaaamin0518/test_daily_process/tree/2025](https://github.com/benjaaamin0518/test_daily_process/tree/2025)

---

## 最後に。

このツール、元々は**3年前の右も左も分からない自分を助けるため**に作ったものでした。  
でも今、ちょっとしたチームでも、**地味に便利に使えている**ので公開してみます。

---

> 「工数報告、マジで面倒くさい…」  
> 「けど、手を抜くと後で泣くの自分だよなぁ…」

そんなあなたに、届けばうれしいです。
NetSuiteと電子署名サービスの連携、サンプルスクリプトのデモ

**前回のあらすじ**
[前回の記事](https://qiita.com/fujitak/items/c5563b62d3ac3b1a58a6) では、NetSuiteと電子署名サービスの連携を確立するための仕組みをご紹介いたしました。本稿では、具体的なトランザクション画面のスクリーンショットを使用して、その連携がどのようなユーザー体験になるのかを、ご紹介いたします。
    <br>
    
**デモの流れ**

**1.　NetSuiteのトランザクション画面から、ボタンをクリックして電子署名サービスへ**
今回は見積書画面（Estimate）を使用しますが、サンプルソースコードは、基本的なトランザクションやマスタに既に対応しています（支払請求書、発注書、見積、注文書、請求書、顧客、仕入先、など）。「Send to xxxxxSign」ボタンをクリックすると、NetSuiteのトランザクションIDを引き継いで、署名サービスの画面に遷移し、電子契約の下書きが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3431564/2706f07b-170f-42be-ad2a-3e512533fa7a.png)
    <br>

**2.　署名サービスで文書をアップロード**
「Send to xxxxxSign」ボタンをクリックした直後、署名サービスの画面が開き、ユーザーは署名対象のPDFファイルをアップロードします。送信先や署名者を設定して「送信」ボタンを押します。（このプロセスは、NetSuiteから自動で行うこともできますが、疎結合なパターンでまずはテンプレートをご提供し、必要に応じて作りこんで頂くことを前提にしております。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3431564/91b187f1-ef50-488c-bd7e-1141b449aad0.png)
    <br>

**3.　署名依頼が送信され、相手が署名**
署名依頼を受け取った相手は、メールで届いたリンクをクリックして署名します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3431564/75d69c68-d083-47a3-8aa0-f1fb2a207ae8.png)
    <br>

**4.　自動でNetSuiteに署名済みPDFが保存される**
署名が完了すると、自動で署名済みのPDFがNetSuiteに連携されます。対象のトランザクションの画面には、「署名済み」のステータスとともに、署名済みPDF（NetSuiteファイルキャビネット内）へのリンクが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3431564/99fb80e9-055b-4642-9efe-fa8cbf6d3461.png)

リンク先のファイルキャビネット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3431564/37e47bd3-0d25-4c79-a013-a94d1d027d0c.png)
    <br>

補足
NetSuiteと署名サービスの文書のマッピングは、1と4で自動登録されるカスタムレコードに保持されます（初期設定は必要）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3431564/15af6287-9173-4370-98a5-0b79dece1093.png)

なお、署名サービスへ安全にアクセスするための情報は、別の専用のカスタムレコードに保持し、そのレコードへのアクセスは専用ロール以外は不可と設定します（アクセス情報暗号化ための、NetSuiteの有料オプションも利用は可能）。
    <br>

**サンプルスクリプト、設定手順書**
今回のデモでは、前回の記事のJWT認証ではなく、「Client ID Web API 認証（Client ID + Bearerトークンで認証」を使用しています。そのサンプルスクリプトと設定手順書については、適切なタイミングでのご提供を予定しております。（※あくまで参考のためのサンプルであり、動作保証はありません。）
<br>

**NetSuiteと電子署名サービス連携のメリット**
•	署名進捗状況と署名済文書を、NetSuite上で一元管理可能
•	送信ミスや署名依頼の漏れを防ぎ、コンプライアンス強化
<br>


**NetSuiteの柔軟性**
NetSuiteと電子署名サービスの連携で、契約業務などの効率化と正確性向上が実現できます。ユーザーはスムーズな画面の遷移により、煩雑な手順を意識する必要がなくなり、日々の業務の負荷が下がります。OAuth 2.0といった他の認証方式も含め、この安全で便利なSaaS間の連携は一般的な手法であり、実はどんなサービスとの連携にも応用が可能です。
    <br>

[【前回の記事】JWT認証を用いたNetSuiteとデジタル署名サービス (DSS) の連携](https://qiita.com/fujitak/items/c5563b62d3ac3b1a58a6) 
    <br>


© 2025 Takusuke Fujii
本記事は CC BY 4.0（原作者名の表記が必要）で自由に共有・改変・配布できますが、無保証につき著作者は一切責任を負いません。
【Rails】Capybaraを使用した結合テスト

# 記事概要
Ruby on Railsの結合テストについて、まとめる

# 前提
- Ruby on Railsでアプリケーションを作成している
- アプリにCapybaraをインストールしている

# System Spec
結合テストコードを記述するための仕組みのこと
`Capybara`というGemを使用し、デフォルトでRailsに搭載されている

# 手順(テストファイル作成)
1. テストファイルを生成するため、下記コマンドを実行する
    ```
    # アプリのディレクトリに移動
    % cd ~/[アプリ名]
    
    % rails g rspec:system [モデル名の複数形]
    ```
1. `spec/system/[モデル名の複数形]_spec.rb`が作成されたことを確認する

# 手順(テストケースの記述)
1. [[モデル名の複数形]_spec.rb](https://qiita.com/likapantrip/items/7c47aa8e81612c8a6694)にテストケースを記述する
    1. 機能別・条件別・テスト詳細別にグループ分けを行う
        ※ユーザー目線で考え、「ブラウザでどのような操作をすると、どうなるのか」をテストケースに反映する
    1. 保存するデータ(インスタンス)を作成する
    1. テストコードを記述する
        ※各テストコードが想定通りに実行できるかを確認するため、`rails c`コマンドでコンソールを起動して確認を行う

# 手順(テストファイルの実行)
1. テストファイルを実行するため、下記コマンドを実行する
    ```
    # アプリのディレクトリに移動
    % cd ~/[アプリ名]
    
    % bundle exec rspec spec/system/[モデル名の複数形]_spec.rb
    ```
1. ターミナル.appで正常完了していることを確認する
    結果が緑色で表示されれば実行成功
    ※ターミナルに`DEPRECATION WARNING`と表示されることがあるが、無視して問題ない


# Ruby on Railsまとめ
https://qiita.com/likapantrip/items/46b43c9d1309b6633f0a
【Rails】[モデル名の複数形]_spec.rbについて

# 記事概要
Ruby on Railsの結合テストファイルについて、まとめる

# 前提
- Ruby on Railsでアプリケーションを作成している
- アプリにCapybaraをインストールしている

# 基本情報
## ファイルパス
spec/system/[モデル名の複数形]_spec.rb

# まとめ(テストケース整理)
```モデル名の複数形_spec.rb
RSpec.describe '[処理名]', type: :system do
  context '[条件]' do 
    it '[テストケース]' do
      # テストケースに合わせたテストコードを記述
    end
  end
  context '[条件]' do
    it '[テストケース]' do
      # テストケースに合わせたテストコードを記述
    end
  end
end
```

```users_spec.rb
RSpec.describe 'ユーザー新規登録', type: :system do
  context 'ユーザー新規登録ができるとき' do 
    it '正しい情報を入力すればユーザー新規登録ができてトップページに移動する' do
      # トップページに移動する
      # トップページにサインアップページへ遷移するボタンがあることを確認する
      # 新規登録ページへ移動する
      # ユーザー情報を入力する
      # サインアップボタンを押すとユーザーモデルのカウントが1上がることを確認する
      # トップページへ遷移することを確認する
      # カーソルを合わせるとログアウトボタンが表示されることを確認する
      # サインアップページへ遷移するボタンや、ログインページへ遷移するボタンが表示されていないことを確認する
    end
  end
  context 'ユーザー新規登録ができないとき' do
    it '誤った情報ではユーザー新規登録ができずに新規登録ページへ戻ってくる' do
      # トップページに移動する
      # トップページにサインアップページへ遷移するボタンがあることを確認する
      # 新規登録ページへ移動する
      # ユーザー情報を入力する
      # サインアップボタンを押してもユーザーモデルのカウントは上がらないことを確認する
      # 新規登録ページへ戻されることを確認する
    end
  end
end
```

# まとめ(インスタンス生成)
- [FactoryBot(Gem)](https://qiita.com/likapantrip/items/1dedea14ed93c37053c4)を使用する
    ```user_spec.rb
    RSpec.describe User, type: :model do
      before do
        # インスタンス生成
        @user = FactoryBot.build(:user)
      end
      
      # 省略
      it '[テストケース]' do
        # before処理実行後に処理
      end
      # 省略
    end
    ```
- FactoryBot(Gem)を使用しない
    ```user_spec.rb
    RSpec.describe User, type: :model do
      # 省略
      it '[テストケース]' do
        # インスタンス生成
        user = User.new(nickname: 'test', email: 'test@example', password: '000000', password_confirmation: '000000')
        
        # 処理
      end
      # 省略
    end
    ```
クライアント/サーバー/DBの関係について

# 今日のトピック

-   クライアント・サーバー・DBの関係について

## クライアント・サーバー・DBの関係について

Webシステムを理解する上で重要な「クライアント」「サーバー」「データベース（DB）」の関係性は、**Web3層アーキテクチャ**と呼ばれる。
このアーキテクチャは、システムを機能ごとに「3つの層」に分割して構成する考え方である。

### プレゼンテーション層

ユーザーが直接触れるインターフェースを提供する層。主にユーザーへの情報表示と、ユーザーからの入力を受け付ける役割を担う。

-   **動作例**:
    1.  ユーザーがWebブラウザにURLを入力すると、ブラウザはWebサーバーに対してリクエスト（例: 特定のウェブページの表示要求）を送信する。
    2.  このとき、URLに含まれるドメイン名（例: `www.example.com`）からWebサーバーのIPアドレスを特定するために、DNSサーバーへの問い合わせ（名前解決）が行われる。
    3.  Webサーバーはリクエストに応じて、HTML、CSS、JavaScriptといったファイルをレスポンスとしてブラウザに返す。
    4.  ブラウザは受け取ったHTMLとCSSを解釈してウェブページを画面に描画（レンダリング）し、JavaScriptをJavaScriptエンジンで実行して動的なコンテンツの表示やユーザーインタラクションの処理を行う。
    <br>
-   **APIエンドポイントとDNS**:
    クライアントがAPIのエンドポイント（例: `https://api.example.com/data`）にアクセスする際、エンドポイントの**ドメイン部分**（例: `api.example.com`）も、Webサーバーのアドレスと同様にDNSサーバーによってIPアドレスに解決される。クライアントは、このIPアドレスを持つサーバーに対してAPIリクエストを送信する。

### アプリケーション層

システムの中心的な処理、いわゆるビジネスロジックを実行する層。プレゼンテーション層からのリクエストを受け取り、それに基づいてデータの計算、加工、外部システムとの連携など、アプリケーション固有の機能提供する。

-   **動作例**:
    1.  クライアントは、公開されているAPIのエンドポイントに対してリクエストを送信する。（一般的に「APIを叩く」と表現される）
    2.  アプリケーションサーバーにホストされたバックエンドアプリケーションは、APIエンドポイントへのリクエストを受け取る。
    3.  受け取ったリクエストの種類やパラメータに応じて、定義されたビジネスロジック（例: 商品検索、ユーザー認証、注文処理など）を実行する。
    4.  ビジネスロジックの実行過程で、データの取得や永続化が必要な場合は、データ層（データベース）に問い合わせや更新指示を行う。
    5.  処理が完了すると、アプリケーションサーバーはクライアントに対して、処理結果を含むレスポンス（例: 要求されたデータ、処理の成功/失敗を示すステータスコードなど）を返す。

### データ層

アプリケーションが必要とするデータを永続的に保存し、管理する層。

-   **動作例**:
    1.  アプリケーション層から、データの作成（Create）、参照（Read）、更新（Update）、削除（Delete）といった操作（総称してCRUD操作）のリクエストを受け取る。
    2.  データベース管理システムは、これらのリクエストに従って、データベース内のデータを操作する。
    3.  データの参照リクエストの場合は、検索結果をアプリケーション層に返す。データの更新・作成・削除リクエストの場合は、処理結果（成功/失敗など）をアプリケーション層に返す。

### 3層アーキテクチャのメリット

プレゼンテーション層、アプリケーション層、データ層がそれぞれ論理的・物理的に分離されているため、以下のようなメリットがある。

-   **独立性の向上**: 各層が疎結合（依存関係が薄い状態）になるため、ある層の変更や改修が他の層へ与える影響を最小限に抑えることができる。例えば、UIのデザイン変更（プレゼンテーション層）が、ビジネスロジック（アプリケーション層）やデータ構造（データ層）に直接影響を与えることは少なくなる。
-   **開発効率の向上**: 各層の責務が明確になるため、それぞれの層を専門のチームが並行して開発・テストしやすくなる。これにより、開発期間の短縮や品質向上が期待できる。

# おわりに
間違いがあれば、ご指摘いただけますと幸いです(__)

## 参考文献
[3層アーキテクチャーとは](https://www.ibm.com/jp-ja/topics/three-tier-architecture "3層アーキテクチャーとは")
nginxをロードバランサーとして使うときに unknown directive "stream"が発生する

# TL;TR
Debian系のnginxのパッケージに`stream`モジュールが含まれていないことが原因
```sh
sudo apt install libnginx-mod-stream
```

# 状況
nginxをロードバランサーとして使うために、以下のような設定を`nginx.conf`に追加した。
```conf
stream {
    upstream controller_backend {
        server 192.168.8.11:6443;
        server 192.168.8.12:6443;
        server 192.168.8.13:6443;
    }
    server {
        listen     6443;
        proxy_pass controller_backend;
    }
}
```
nginxを実行すると、以下のようなエラーが発生する。
```sh
sudo systemctl restart nginx
> Job for nginx.service failed because the control process exited with error code.
> See "systemctl status nginx.service" and "journalctl -xeu nginx.service" for details.
```
`nginx.conf`の構文テストを実施してみると、
```sh
sudo nginx -t
> unknown directive "stream" in /etc/nginx/nginx.conf:84
```
と表示される。
（もし異なるエラーなら、本記事の内容が原因ではない）
`stream`を認識できるように、追加でパッケージを入れたら解決。
【トラブルシューティング】DjangoプロジェクトでPostgreSQLのテーブルを誤って削除してマイグレーションできない対処方法

# どんな現象？
つい今、カラム名を更新するためにPostgreSQLの対象テーブルを手動で削除した。
理由は、データが2つしか入っていなかったため最初から作り直せば良いや～と思っていたらマイグレーションでに失敗した。

マイグレーションの状態を見ようと下記のコマンド打った。
```
python manage.py showmigrations <テーブル>
```
すると、下記の結果が返ってきた。
```
python manage.py showmigrations <テーブル> 
adminuser
 [X] 0001_initial
 [ ] 0002_rename_name_adminuser_username
 ````
つまり、`0001_initial `マイグレーションがすでに 適用済み だと Django は認識しているけれど、手動でテーブル`（adminuser_adminuser）`を` Drop `したため、テーブルは存在しない という不整合状態です。

そのため` 0002_rename_name_adminuser_username `を適用しようとしても、「そもそも元のテーブルがない」ので失敗しているのです。

## ✅ 解決策（安全にやる）
🔧 手順1：マイグレーション履歴から 0001 を削除
マイグレーションを「未適用」に戻してから再実行すれば、テーブルが正しく作られます。
```
# 管理ツールやpsqlなどでデータベースに接続して
DELETE FROM django_migrations WHERE app = 'adminuser' AND name = '0001_initial';
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/4da0e0cf-9855-4808-9e63-c0f457024511.png)

## 🔁 手順2：マイグレーションを再実行
```
python manage.py migrate adminuser

```

以上です。

# サイト

https://smallit.co.jp/blog/a4901/
【Mac】ネットワークドライブに.DS_Storeが作成されないようにする方法

## ネットワークドライブに作成されないようにする

以下のコマンドを実行するとネットワークドライブに`.DS_Store`が作成されなくなります。

```terminal
defaults write com.apple.desktopservies DSDontWriteNetworkStores -bool true
```

## USBドライブに作成されないようにする

以下のコマンドを実行するとUSBドライブに`.DS_Store`が作成されなくなります。

```terminal
defaults write com.apple.desktopservices DSDontWriteUSBStores -bool true
```
buildrootのcプロジェクトを部分的にRustに移行する方法

# 目的

コードが増えるにつれてメモリ管理がだるくなってきたので
楽したい

# 経緯
最初はc++にしようと思ったけど
試しに流行り？(多分だいぶ遅れてる)のRustを使ってみよう

# 環境

| ソフト | バージョン |
| - |-|
| Fedora | 6.14.0-0.rc6.49.fc43.x86_64(rawhide) |
| buildroot | buildroot-2025.02.tar.gz| 
| qemu | 9.2.0 |

# 手順

Rustでstatic libraryを作ってcでリンクする

パッケージはcとRustで分けた方が絶対に楽

## Rust側のパッケージ

例) `pdf-viewer-rustlib` という名前で作った場合

```
├ package
┊  ├ pdf-viewer-rustlib
┊  ┊  ├ Config.in
┊  ┊  └ pdf-viewer-rustlib.mk
<snip>
```

configは適当でOK

package/pdf-viewer-rustlib/Config.in
```config
config BR2_PACKAGE_PDF_VIEWER_RUSTLIB
    bool "pdf_viewer_rustlib"
    help
      PDF Viewer Rust Library
```

makefileはstatic libraryだけだと
`cargo` がインストール対象なしとなってエラーになる
したがって、[パッケージ名]_INSTALL_TARGET_CMDSを作成する必要がある

gitに置く場合は [ここ](https://qiita.com/ta_yano/items/77d960b03fa2e96d8b88)などを参考にしてください

package/pdf-viewer-rustlib/pdf-viewer-rustlib.mk
```makefile
PDF_VIEWER_RUSTLIB_LICENSE = Public Domain

PDF_VIEWER_RUSTLIB_VERSION = 0.0.1
PDF_VIEWER_RUSTLIB_SITE = /home/tyano/workspace/pdf/pdf_viewer_rustlib
PDF_VIEWER_RUSTLIB_SITE_VERSION = $(PDF_VIEWER_RUSTLIB_VERSION)
PDF_VIEWER_RUSTLIB_SITE_METHOD = local
PDF_VIEWER_RUSTLIB_INSTALL_STAGING = YES


define PDF_VIEWER_RUSTLIB_INSTALL_TARGET_CMDS
    $(INSTALL) -D $(@D)/target/aarch64-unknown-linux-gnu/release/librustlib.a $(STAGING_DIR)/usr/lib/librustlib.a
    $(INSTALL) -D $(@D)/src/rustlib.h $(STAGING_DIR)/usr/include/rustlib.h
endef

$(eval $(cargo-package))

```

## Rust側のソースコード

こんな感じ
```
├ Cargo.lock
├ Cargo.toml
└ src
  ├ lib.rs
  └ rustlib.h
```

buildroot側で `--locked` を外す方法が分からなかった
本来不要なはずなのでbuild時のオプションを変えられたら削除可能と思う

Cargo.lock
```
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4

[[package]]
name = "rustlib"
version = "0.1.0"
```

Cargo.toml
```toml
[package]
name = "rustlib"
version = "0.1.0"
edition = "2021"

[lib]
name = "rustlib"
crate-type = ["staticlib"]
```

cからの受け口。好きに作ってください
src/rustlib.h
```c
#ifndef __RUSTLIB_H__
#define __RUSTLIB_H__

extern int rust_add(int a, int b);

#endif
```

これも適当に作ってください
src/lib.rs
```rust
#[no_mangle]
pub extern "C" fn rust_add(a: i32, b: i32) -> i32 {
    a + b
}
```

## c側からコール
これはinclude追加してリンクするだけ

main.c
```c
#include "rustlib.h"

...
    d("rust 1+2=%d", rust_add(1, 2));
```

Makefile.am
```makefile
...
pdf_viewer_lvgl_LDADD = $(STATIC_LIB) -lrustlib
...
```

# 実行結果

## ホスト
当然動く

![Screenshot_2025-05-16_22-45-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3786381/94ba34d2-d2a7-4ccf-a46c-62ce6e4adefa.png)

rustも動いてる
```
$ grep rust /tmp/pdf_viewer.log
250516_093959.746 main.c(70) main rust 1+2=3
250516_224413.541 main.c(70) main rust 1+2=3
250516_224501.451 main.c(70) main rust 1+2=3
```

## qemu上

動いた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3786381/6c74892c-5294-4153-8ea5-97391a986cef.png)


ログもちゃんと表示されてる
```
Welcome to the rock4c+ board
rock4cp login: [  100.561075] hrtimer: interrupt took 893232 ns
root
# grep rust /tmp/pdf_viewer.log 
250516_144236.240 main.c(70) main rust 1+2=3
# 
```


# その他

サブプロジェクトにして
同じパッケージ内でクロスビルドしようとするとすごい大変です
能動的サイバー防御法について解説

2025年5月16日に、「能動的サイバー防御法」に向けた関連法が、参院本会議で成立しました。

この法案の内容を一言でいうと、

「**サイバー攻撃を受ける前に、政府が通信を監視して、攻撃元に先に対処する仕組み**」です。

この記事では、内閣官房の資料などを用いながら、背景～今後の動きについて、なるべくわかりやすく解説していきたいと思います。

## 目次

1. [背景](#背景)
   - [増加する海外からのサイバー攻撃](#増加する海外からのサイバー攻撃)
   - [欧米主要国も対応している](#欧米主要国も対応している)
2. [法案について](#法案について)
   - [2-1. 官民連携の強化](#官民連携の強化)
   - [2-2. 通信情報の利用](#通信情報の利用)
   - [2-3. 攻撃者のサーバ等への侵入・無害化](#攻撃者のサーバ等への侵入と無害化)
   - [2-4. NISCの発展的改組とサイバー安全保障分野の政策を一元的に総合調整する新たな組織の設置](#niscの発展的改組とサイバー安全保障分野の政策を一元的に総合調整する新たな組織の設置)
3. [法案が可決・成立](#法案が可決成立)
4. [今後の動き](#今後の動き)
5. [参考](#参考)


## 背景

### 増加する海外からのサイバー攻撃

- サイバー攻撃は近年増加傾向
- その99%以上が**海外からの発信**とされています

![trend.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758412/16acc74c-d311-44dc-b11f-5ee172a6186e.png)


### 欧米主要国も対応している

| 国 | 取り組み |
| --- | --- |
| アメリカ | 2022年：重要インフラサイバーインシデント報告法<br>2023年：国家サイバーセキュリティ戦略 |
| イギリス | 2022年：国家サイバー戦略 |
| EU | 2024年：サイバーレジリエンス法 |
| オーストラリア | 2023年：豪州サイバーセキュリティ戦略 |

上記のように、近年、欧米主要国が対応を進めており、「日本も乗り遅れるわけにはいかない！」という流れが見てとれます。

## 法案について

法案の全体イメージの図を以下に示します。(引用)

![image_law.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758412/976b6e8a-6d34-4b6b-8221-7d2645bb0eb6.png)


### 法案の目的：

1. 官民連携の強化  
2. 通信情報の利用  
3. 攻撃者のサーバ等への侵入・無害化  
4. NISCの発展的改組・新たな組織の設置  

それぞれについて、簡単に見ていきましょう。

---

### 官民連携の強化

**[要約]**  
基幹インフラ事業者は、サイバー攻撃を受けた場合、速やかに政府へ報告します。  
また、政府は民間事業者に情報を共有し、対策支援も行います。

---

### 通信情報の利用

**[要約]**  
サイバー攻撃の実態を把握するために、通信情報を分析目的で利用します。  
ただし、**通信の秘密**には十分配慮します。

※ 通信の秘密：憲法21条および電気通信事業法などに基づき、通信の内容・相手先等が保護されるという権利

---

### 攻撃者のサーバ等への侵入と無害化

**[要約]**  
攻撃による被害を未然に防ぐため、**警察や自衛隊**が攻撃元のサーバ等に侵入し、無害化する措置を可能にします。

---

### NISCの発展的改組とサイバー安全保障分野の政策を一元的に総合調整する新たな組織の設置

**[要約]**  
内閣官房新組織を設置して、取り組みを推進していきます。

---

## 法案が可決成立

2025年5月16日に、参院本会議において、サイバー攻撃を未然に防ぐ

「**能動的サイバー防御(ACD : Active Cyber Defence)**」が

賛成多数で可決、成立しました。

### 賛成
- 自民党
- 公明党
- 立憲民主党
- 日本維新の会
- 国民民主党

### 反対
- 共産党
- れいわ新選組

<br>

林官房長官は  
「より早期かつ効果的にサイバー攻撃を把握し、対応することが可能になる」  
と、その意義を強調しました。

---

## 今後の動き

- **本格運用は2027年から**を予定
- 政府は、制度の監視・検証を行う独立機関  
  「サイバー通信情報監理委員会」の新設も予定しています


## 参考

- [Yahoo!ニュース](https://news.yahoo.co.jp/articles/47b18e15f2a362b8404b0c8f6206a4309c198795)
- [サイバー対処能力強化法案及び同整備法案について|内閣官房
サイバー安全保障体制整備準備室](https://www.cas.go.jp/jp/seisaku/cyber_anzen_hosyo_torikumi/pdf/setsumei.pdf)
- [朝日新聞](https://www.asahi.com/articles/AST5J0CZGT5JUTFK01HM.html)
- [NTTコミュニケーションズ｜能動的サイバー防御とは](https://www.ntt.com/bizon/active-cyber-defense.html#:~:text=%E8%83%BD%E5%8B%95%E7%9A%84%E3%82%B5%E3%82%A4%E3%83%90%E3%83%BC%E9%98%B2%E5%BE%A1%E3%81%A8,ACD%EF%BC%89%E3%81%A8%E8%A1%A8%E7%8F%BE%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82)
- [読売新聞](https://www.yomiuri.co.jp/politics/20250516-OYT1T50068/)
- [5．通信の秘密、個人情報保護について|総務省](https://www.soumu.go.jp/main_sosiki/joho_tsusin/d_faq/5Privacy.htm)

※ 本記事は、内閣官房が公開している「サイバー対処能力強化法案及び同整備法案の説明資料」をもとに作成し、一部データを二次利用しています。
SQL初心者向け：GROUP BYとPARTITION BYの違いと使い分け完全ガイド

<h2>はじめに：集計関数が苦手なエンジニアへ</h2>
<p>
SQLでデータを集計する際、<strong>GROUP BY</strong>や<strong>PARTITION BY</strong>の使い方に戸惑った経験はありませんか？<br>
「GROUP BYを使ったらエラーが出た」「PARTITION BYって何？」といった疑問を持つエンジニアは少なくありません。<br>
本記事では、<strong>SQL初心者</strong>や<strong>集計関数に苦手意識を持つエンジニア</strong>を対象に、<strong>GROUP BYとPARTITION BYの違い</strong>や<strong>使い分けのポイント</strong>を解説します。
</p>

<h3>GROUP BYとPARTITION BYの概要</h3>
<p>
<strong>GROUP BY</strong>は、指定した列でデータをグループ化し、各グループごとに集計を行うための句です。<br>
一方、<strong>PARTITION BY</strong>は、ウィンドウ関数と組み合わせて、データをパーティション（区切り）に分けて集計を行います。<br>
以下に、両者の主な違いを示します。
</p>

<table>
  <tr>
    <th>項目</th>
    <th>GROUP BY</th>
    <th>PARTITION BY</th>
  </tr>
  <tr>
    <td>使用目的</td>
    <td>データをグループ化して集計</td>
    <td>ウィンドウ関数でパーティションごとに集計</td>
  </tr>
  <tr>
    <td>結果の行数</td>
    <td>グループごとに1行</td>
    <td>元の行数を保持</td>
  </tr>
  <tr>
    <td>使用例</td>
    <td>部門ごとの売上合計</td>
    <td>部門ごとの売上合計を各行に表示</td>
  </tr>
</table>

<h3>よくある課題とエラー</h3>
<p>
<strong>GROUP BY</strong>を使用する際、以下のようなエラーや課題が発生することがあります。
</p>
<ul>
  <li><span style="color:red;">SELECT句にGROUP BYで指定していない列を含めるとエラーになる</span></li>
  <li><span style="color:red;">集計関数と通常の列を混在させるとエラーになる</span></li>
  <li><span style="color:red;">GROUP BYとPARTITION BYを同時に使用するとエラーになる場合がある</span></li>
</ul>
<p>
これらのエラーを回避するためには、<strong>GROUP BY句で指定した列</strong>、<strong>集計関数を使用した列</strong>、<strong>定数</strong>のみをSELECT句に含めるようにしましょう。
</p>

<h3>解決策とコード例</h3>
<p>
以下に、<strong>GROUP BY</strong>と<strong>PARTITION BY</strong>の使用例を示します。
</p>

<p><strong>GROUP BYの例：部門ごとの平均給与を求める</strong></p>
<pre><code>
SELECT
  department,
  AVG(salary) AS avg_salary
FROM
  employees
GROUP BY
  department;
</code></pre>

<p><strong>PARTITION BYの例：各社員の給与と部門の平均給与を表示</strong></p>
<pre><code>
SELECT
  department,
  employee,
  salary,
  AVG(salary) OVER (PARTITION BY department) AS dept_avg_salary
FROM
  employees;
</code></pre>

<h3>ベストプラクティスと運用上の注意</h3>
<ul>
  <li><strong>GROUP BY</strong>を使用する際は、SELECT句に含める列をGROUP BY句で指定した列と集計関数のみに限定する。</li>
  <li><strong>PARTITION BY</strong>は、ウィンドウ関数と組み合わせて使用し、元の行数を保持したまま集計を行う。</li>
  <li><strong>GROUP BY</strong>と<strong>PARTITION BY</strong>を同時に使用する場合は、エラーが発生しないように注意する。</li>
</ul>

<h3>まとめと今後の展望</h3>
<p>
<strong>GROUP BY</strong>と<strong>PARTITION BY</strong>は、SQLでのデータ集計において重要な役割を果たします。<br>
それぞれの特徴と使い分けを理解することで、より柔軟で効率的なデータ分析が可能になります。<br>
</p>
[ぽもログ]AIを使って個人開発でサービスを作ってみた話

## はじめに
最近、AIがエンジニアのかわりになるというのをよく耳にして、実際に使って何かサービスを作ってみようと思った。またこれからサマーインターンや就職活動が始まるにあたって何かを作って話せる内容を作っておきたく、今回「ぽもログ」というサービスを作りました。
## 簡単な自己紹介
・地方の国公立大学に通っている大学生（B3）
・専攻は情報学
・プログラミング経験は地元の零細企業のインターンで1年半ほど
## 開発したwebサービス
[ぽもログ](http://pomolog.net)
本題に入る前に少しサービスの紹介をしようと思います。
![スクリーンショット 2025-05-16 174316.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676395/c35e68b5-4d70-467e-ae6a-0c702568c64a.png)
主に4つの機能
・カレンダー
・ポモドーロタイマー
・AIが1日を評価
・ブログ
があります。
### カレンダー
![スクリーンショット 2025-05-16 174409.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676395/ace61e10-3e9e-4295-99c9-a766a3966522.png)
![スクリーンショット 2025-05-16 194458.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676395/f0f2c5b8-369f-42de-af37-55e712da7a99.png)
カレンダーには毎日の記録をメモできます。
他の人のカレンダーを見に行くこともできる。
自分のカレンダーを公開、非公開にもできる。
ポイントを他の人に譲渡することもできる。
### ポモドーロタイマー
![スクリーンショット 2025-05-16 194519.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676395/ff0d3028-cd15-45d5-a829-1a1740112dd0.png)
25分で作業に集中して取り組むことができる。
25分を1ポモドーロといいたまるごとに100ptがもらえる。
これはギフトカードやPayPayに交換できる
### AI評価
![スクリーンショット 2025-05-16 194556.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676395/ac9a8cf4-9a65-4e9e-a5f3-3302b1cf513b.png)
AIが1日の頑張りを評価してくれる
xで共有して200ptをgetできる
### 記事
![スクリーンショット 2025-05-16 194537.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676395/3bc4bd49-cc1a-4c2b-8928-48f62627f6d1.png)
5分で読める役に立つ内容がたくさん。
勉強、作業の合間に！
## 使った技術
### バックエンド技術
・Flask + Blueprint構成：ルーティングの分離（routes.py）でモジュール化を実現
・セッション管理：Flask標準のセッションを使用してTwitterログイン or 通常ログインを区別
・Supabase連携：ストレージを使った画像のアップロード（ブログ投稿用）
### フロントエンド技術
・HTML + Jinja2テンプレート：全ページ（home.html, pomodolo.html など）にて使用。
・JavaScript：
Pomodoroタイマー制御（pomodolo.js）：作業時間切り替えとポイント記録【fetch API】
FullCalendar.js連携（calendar.js）：カレンダー表示、公開設定、メモ入力
CSS設計:レスポンシブ対応（@media）含むデザインチューニング(スマホ対応)
### AI連携機能
・OpenAI API (gpt-4o) を利用した自己評価機能

## AIを使った開発で思ったこと
AIを活用することで、開発スピードは格段に向上しました。もしAIがなければ、開発にはおそらく5倍以上の時間がかかっていたと思います。特にフロントエンドに関しては、基本的な構造をAIに生成してもらい、その後、細かい部分を自分で調整するというスタイルを取りました。

ただし、AIにコードを書いてもらうと、自分が十分に理解していない部分も出てくるため、結果的にバグや不具合の原因になることがあります。そうしたリスクを避けるためにも、生成されたコードの内容は極力自分で調べて理解するように心がけました。

このサービスでは、OpenAIのAPIやX（旧Twitter）のAPIを使用しています。これらの連携を行う際にも、AIは非常に役に立ちました。APIの最新情報を網羅的に扱った記事を探すのは手間がかかるうえ、情報が古かったり不完全だったりすることもあります。そうした中で、AIを通じて公式ドキュメントを効率よく読み解く手助けが得られたのは非常に大きかったです。

また、エラーが発生したときにも、AIは原因の特定や解決方法の提示において大きな助けとなりました。エラーメッセージに対する説明や、再発防止のための解説まで示してくれるため、とても勉強になりました。

## 終わりに
今回初めてwebサービスを作り、作る前ほどハードルは高く感じませんでした。ほとんど自己満足のようなアプリになってしまったのでこの後はどうするか未定ですが集客やマネタイズまで少し考えてみようと思いました。

よかったらぜひ使ってみてくださると幸いです。最後まで読んでくれてありがとうございました。
【GCP × New Relic】Cloud Runを可視化・監視するベストプラクティス


## 📚 目的
- Cloud Runはサーバレスながらアプリを導入しやすいが、観測性に難がある
- Google Cloud Monitoring に加えて New Relic を使うことで APM とログを統合的に可視化

## 🖥️ 全体構成図

```
+---------------------------+
|       Cloud Run          |
|  (GCP Serverless App)    |
+---------------------------+
          |
          |  Export Logs / Metrics
          v
+---------------------------+
| Google Cloud Logging      |
+---------------------------+
          |
          | via Log Export (Pub/Sub)
          v
+---------------------------+
| New Relic Infrastructure |
| (Logs / Metrics Ingest)  |
+---------------------------+
```

## ⚙️ Cloud Run 監視のポイント

### 1. パフォーマンス
| 項目 | 説明 |
|--------|------|
| request_latencies | レイテンシ分布 (P95/最大値)。遅延を検知 |
| request_count | リクエスト数。急増急減を検知 |
| container_start_count | コールドスタートの発生回数 |

### 2. エラー系
| 項目 | 説明 |
|--------|------|
| HTTP 5xx率 | response_code_class = 5xx の割合 |
| タイムアウト回数 | 出力時間超過の検知 |
| クラッシュ回数 | アプリ内クラッシュが原因 |

### 3. リソース
| 項目 | 説明 |
|--------|------|
| cpu_utilization | CPU利用率 |
| memory_utilization | メモリ使用量 |
| instance_count | スケール状況を可視化 |

### 4. コスト
| 項目 | 説明 |
|--------|------|
| リクエスト数 x 処理時間 | コストへの直等関係指標 |
| 非活性インスタンスの時間 | 無駄な空走を検出 |

### 5. セキュリティ
| 項目 | 説明 |
|--------|------|
| IAM/デプロイログ | Audit Logs で確認 |
| 不正IPからのアクセス | 地域情報ベースで検知 |

## ⚙️ New Relic 連携手順

### 1. GCP のログを New Relic に連携
- Google Cloud Logging のログルーターで、Pub/Sub 経由でログを送信
- New Relic 側に [GCP Integration](https://docs.newrelic.com/docs/infrastructure/google-cloud-platform-integrations) を設定
- Terraform や UI で Service Account / Role / Subscription を設定

### 2. Cloud Run のログ出力
- 構造化ログ (structured logging) を使用
```json
{
  "severity": "ERROR",
  "message": "外部APIタイムアウト",
  "labels": {
    "request_id": "abc-123"
  }
}
```

### 3. New Relic ダッシュボード
- NRQL を使って Cloud Run の表示

| NRQL例 | 説明 |
|--------|------|
| SELECT average(duration) FROM Transaction | レイテンシ可視化 |
| SELECT count(*) FROM Transaction WHERE http.statusCode LIKE '5%' | 5xx検出 |
| SELECT rate(http.server.request.count, 1 minute) | リクエスト速度 |

## 🚧 よくあるトラブル
| 問題 | 対処 |
|------|------|
| ログが届かない | Pub/Sub サブスクの設定ミス |
| メトリクスが表示されない | 監視設定、Cloud Run API 権限を確認 |
| エラーログの抽出できず | structured logging を設計 |

## ✅ まとめ
- New Relic による Cloud Run 監視は観測性を大きく向上
- GCPのログ・メトリクスを一元管理
- Terraformやインフラコードと組み合わせて DevOps に組み込める

---
Ktlintの簡単な設定方法をまとめてみた

# はじめに
どうも、ikasumi1503です。[Kotlinのリンターシリーズ](https://qiita.com/ikasumi1503/items/5c4ae78a64b7a8d40ffe)のKtlint編です。Kotlin開発においてKtlintを使ってコードのフォーマットをしていきたい場面は多いかと思います。そこで、本記事ではKtlintの簡単な設定方法をまとめていこうと思います。

# 導入方法

導入方法を次の4つに分けて説明していこうと思います。

0. リンタールールの設定方法
1. Ktlint Pluginの導入(開発中のフォーマット)
2. 手動で実行できるようにする
3. GitHub Actions連携

### 1. リンタールール自体の設定方法
ktlintはリンタールールを直接設定しなくともkotlinの公式ガイドラインに基づいた設定をしてくれます。設定しなくてもいいという方は、[次の段落へ](https://qiita.com/ikasumi1503/items/5639d4650bc13be519f0#2-ktlint-plugin%E3%81%AE%E5%B0%8E%E5%85%A5%E9%96%8B%E7%99%BA%E4%B8%AD)進んでください。

まずプロジェクトルート直下に.editorconfigを作りましょう。
左上のプロジェクトの表示方法のポップアップがあるので、これをProjectまたはProject Filesにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4073140/4446b55b-391d-4a89-836d-554a48456d97.png)

そしてルートディレクトリに.editorconfigを追加しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4073140/f2c18928-9f3e-4ba8-981e-d6911581ee0d.png)

.editorconfig内に適当に書いていきます
```
root = true

[*]
indent_style = space
indent_size = 4
charset = utf-8
end_of_line = lf
insert_final_newline = true
```

### 2. Ktlint Pluginの導入(開発中にリンターをかける)
Android StudioのPluginsを開きましょう。
左上のメニュー > File > Settings > Plugins

次に、検索バーで「ktlint」と入力すると一番上にKtlintが出てくるのでこれをインストールしてIDEを再起動しましょう。これで書いている途中でおかしなコードがあればエラーを出してくれます。

次にリンターを有効にしましょう
左上のメニュー > File > Settings > Tools > KtLint
“Distract Free” モードを有効にしてOKを押すとリンターが有効化されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4073140/2db124f5-9643-424e-a383-2a5f5c71929c.png)


### 3. 手動で実行できるようにする
プロジェクトのbuild.gradle.ktsを開きましょう。見つからないという方はshiftキーを2回押してなんでも検索によってこのファイルを見つけ出しましょう。
```
// プロジェクト構成：
your-project/
├─ build.gradle.kts        ← × 
├─ settings.gradle.kts
├─ app/
│  └─ build.gradle.kts       ← 〇ここです
```

見つけたら、早速プラグインを入れます。

```
plugins {
    id("org.jlleitschuh.gradle.ktlint") version "11.6.0" // バージョンは都度合わせていきましょう
}
```

次にリンターのふるまいを設定します。上のプラグインを入れて**Sync Now**ボタンで設定を適用させてから出ないと、この設定が見つからないよと言われるのですが、同時に入れてから適用させても問題ありません。
```
ktlint { 
    android.set(true)
    outputToConsole.set(true)
    ignoreFailures.set(false)
}
```
この設定の意味については[他投稿者様の記事]()が参考になります。

これで右上に出ている**Sync now**をクリックすると、設定が適用されます。

そして、プロジェクトルートで次のコードを実行して成功したら導入できています。

```
./gradlew ktlintCheck    # スタイル違反のチェック
./gradlew ktlintFormat   # 自動整形
```
以上のコマンドでCLIに警告内容が出力されます(レポートファイルは出力されません)。

### 4.GitHub Actions連携
.github/workflows/ にGitHub Actionsワークフローを作成しましょう。


ファイル内容は長いので次のレポジトリ内に入れています。あくまで例としてAIに吐き出させたものを使っています。一応私の環境では動作確認済みです。
https://github.com/ikasumi1503/KtlintSample

ktlint_example.yml ... プルリクエストしたら、Ktlintを実行してワークフローのコンソール内で警告内容をXML形式で吐き出しています。
ktlint_reviewdog_example.yml ... 一応reviewdogバージョンも出しておきます。プルリクエストしたら警告内容をPRコメントにばらまきます。
以上のファイルがmainブランチにないと機能しない点にご注意ください。

# おわりに
以上がKtlintの簡単な設定方法です。ぜひ試してみてください。
結合が遅いと感じたら見直すべき「結合アルゴリズム」と「実行計画制御」

# 結合が遅いと感じたら見直すべき「結合アルゴリズム」と「実行計画制御」

SQLパフォーマンスが悪い原因のひとつとして、「結合処理」が挙げられます。結合アルゴリズムには複数の種類があり、それぞれの特性を理解し、状況に応じて最適なアルゴリズムを使い分けることが重要です。

## 代表的な結合アルゴリズムと特徴

結合アルゴリズムは主に以下の3つに分類されます。

| アルゴリズム       | 利点                                                                 | 欠点                                                                 |
|--------------------|----------------------------------------------------------------------|----------------------------------------------------------------------|
| Nested Loops       | ・小さな表に向く<br>・内部表にインデックスがあれば高速<br>・OLTPにも向いている | ・大規模テーブル同士の結合に不向き<br>・内部表にインデックスがないと遅い              |
| Hash Join          | ・大規模テーブル同士の結合に向いている                               | ・メモリ消費が多い<br>・メモリ不足でTEMP落ちの可能性<br>・OLTPには不向き               |
| Sort Merge Join    | ・非常に複雑な結合にも対応可能<br>・結合キーがソート済みなら高速         | ・メモリ消費が多い<br>・TEMP落ちの可能性<br>・ソート済みでなければ効率が悪い            |

## ケース別の最適な選択

### 小×小
→ テーブルが小さい場合は、どのアルゴリズムでも大差なし

### 小×大
→ 小さいテーブルを外部表（ループの起点）にした Nested Loops が適している

### 大×大
→ 条件次第で Hash Join または Sort Merge Join を選択  
特に結合キーがソート済みであれば Sort Merge Join、そうでなければ Hash Join

## 実行計画をユーザーが制御できるのか？

結論としては「RDBMSによる」。近年のDBMSではオプティマイザが統計情報に基づき自動で最適なアルゴリズムを選ぶ傾向にありますが、以下のようにヒント句やパラメータ設定により制御できるケースもあります。

### DBMS別の制御状況

- **Oracle**  
  ヒント句により結合アルゴリズムを細かく制御可能（例: `USE_NL`, `USE_HASH`, `LEADING`）

- **SQL Server**  
  ヒント句で `LOOP`, `HASH`, `MERGE` の指定が可能

- **DB2**  
  ヒント句は存在するが、原則ユーザーは実行計画を制御できない

- **PostgreSQL**  
  拡張機能 `pg_hint_plan` により制御可能  
  サーバパラメータでグローバルにアルゴリズムの有効・無効を設定可能（例: `enable_nestloop`）

- **MySQL**  
  結合アルゴリズムは `Nested Loops` のみ。ユーザーによる制御余地はない

## まとめ

- 実行速度に問題を感じたら、結合アルゴリズムの選定と統計情報の更新を検討
- 小規模なら Nested Loops、大規模なら Hash や Sort Merge を選択
- 制御可能かどうかはDBMS次第。可能であればヒント句や設定でチューニングを

---

# 参考
[SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)](https://www.amazon.co.jp/SQL%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80%E2%94%80%E2%94%80%E9%AB%98%E9%80%9F%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%84%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9-WEB-DB-)
SES企業の入社後の研修のパターンについて

## はじめに
　SES企業の採用面接を多数受験していくなかで、入社後の研修のやり方にパターンがあることが段々と分かるようになったため、まとめてみます。

## 研修期間が長期間（半年以上など）のパターン
　研修期間が長期間（半年以上など）のパターンは、その間にオンラインで自己学習を進めて課題をこなすケースである。学習のみに集中出来ればよいが、そのような会社は極めてまれで、ほとんどの会社は**コールセンターや販売といった業務を行いながら**、業務時間外でオンラインの自己学習をこなしていく必要がある。理由としては、研修期間中に支払う給与を確保するため、エンジニアは技術力だけでなく、コミュニケーション力やヒューマンスキルも必要なため、それらを高めてもらうため、といった理由を聞く。募集要項に業務を行いながらの自己学習である旨を記載しておけばよいと思うのだが、**なぜか研修についてのみ記載されており、業務を行うことについては記載されていないケースがほとんどである（業務について記載されているケースは、自分は見たことがない）**。

## 研修期間が数か月（１～２か月など）のパターン
研修期間が数か月（１～２か月など）のパターンは、学習のみである（数か月（１～２か月など）のパターンで業務を行うケースは、自分は聞いたことはない）。会社独自の研修カリキュラムをこなしたり、あるいはUdemy等の教材を使用したり、といったケースがある。

## 研修がないパターン
　研修がないパターンは、OJTで実務にはやく慣れてもらう、というケースである。特に研修はないが、Udemy使い放題の学習補助があったりするケースもある。

## まとめ
　研修に対する考え方は会社によって様々であるため、面接前にチャットで確認するなり、面接時に聞いてみるなり、要確認しておいたほうがよい。
[2025年5月時点]無料のGoogleビジネスアカウントを独自ドメインで作る方法


以下のページにアクセスし、「ビジネス管理用」をクリックします。

https://support.google.com/accounts/answer/27441


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243130/c8088bbe-0a2f-4f72-9391-1112a3232c7e.png)

「Gmailアドレスを取得」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243130/f9297b0e-9554-4929-91f7-82eb44851e0e.png)

姓名を入力し、次へをクリックします。
※姓は省略可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243130/2ce63f9d-b3f0-459e-b609-a5d42426bcfc.png)

生年月日を入力し、次へをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243130/6c18a24a-b4c4-4f1a-868e-08994bd98a35.png)

独自ドメインでアカウントを作る場合は、「既存のメールアドレスを使用する」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243130/234aff54-e1f6-4f0f-a7ae-0accb0ba412b.png)

独自ドメインのメールアドレスを入力し、次へをクリックします。
**※ここで指定するメールアドレスは既に存在しているものでなければなりません。**
**※ご利用のレンタルサーバー等でメールアカウントを事前に作成しておく必要があります。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243130/5a0f9462-d595-45e8-a638-4797c0e5c14f.png)


指定したメールアドレス宛に確認コードが記載されたメールが届くので、それを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243130/6e36cddb-d580-45f4-a31e-8bed7fcfb127.png)


メールで届いた6桁のコードを入力し、クリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243130/2b1cf643-f2cc-4a4c-96af-2e1a7e40e0ba.png)



アカウントのパスワードを入力し、次へをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243130/124a0334-410e-4cff-bd85-fc46ecfc6e0b.png)

本人確認のために電話番号の認証を行います。
ご利用の電話番号を入力し、次へをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243130/c4ea7d0f-ce79-4031-b197-2027034c1791.png)

SMSで届いた6桁のコードを入力し、次へをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243130/fb942f05-6528-46cd-9775-d2b985f4b94d.png)


あとはプライバシー＆ポリシーに同意し、アカウント作成完了となります。
[SOLVED] Activating Wifi5 in Linux Mint Xia ver. 22.1 

In Linux Mint Xia ver.22.1, it is now possible to use the wifi5 by a standard driver (module) compatible with rtl8812au. 

[1] Basic steps:
Installing the standard driver
After starting the system and plugging the USB wireless LAN adapter, you will be asked whether you use the standard module. If you select "Use," the rtl8812-dkms is installed then the wifi is connected.

[2] In case of connection falure of the wifi by use of the above steps:
[A]If the wifi is soft/hard blocked, remove the soft block on the wifi.
$sudo rfkill list
0: phy0: Wireless LAN
Soft blocked: yes
Hard blocked: no
2: phy2: Wireless LAN
Soft blocked: yes
Hard blocked: no
$sudo rfkill unblock all
$sudo rfkill list
0: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
2: phy2: Wireless LAN
Soft blocked: no
Hard blocked: no　

[B] If the wifi is hard blocked yet:     
1.Initializing the BIOS
If your PC's BIOS has no option to initialize the wireless LAN, try the CMOS-battery-pull-reset the bios, as follows: 
2.Remove the CMOS battery, and insert it again (1).
Note:
(1) Some PCs have wireless lan toggle switches.
Datadog Lambda Extensionのバージョンを上げてcold startを早くしよう

Datadog Lambda ExtensionはRust化され、高速になりました。(project bottlecap)
Extension自体が遅いなどの批判があっての対応です。

これにより、cold startが高速化され、メモリCPUなどフットプリントも軽くなり、パフォーマンス面がよくなりました。(地味にinitフェーズが有償化される話もあるのでコストにもちょっぴり効いてきます)

# 未対応Lambdaの探し方
DatadogのServerless画面から探すのが簡単です。
Datadog Extension Versionでnextがついていないものが非Rustの旧バージョンです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37384/107969ce-b956-43b5-9ada-1994a17cf8d6.png)

v67以降がnext対応です。

# 上げ方
layerはextensionのと、各言語(e.g. node.js)のlayerと2種類あります。
両方上げるとよいでしょう

IaCなら自分たちでバージョンを指定していればその部分を変更する。
最新のバージョンはドキュメントを見るか、githubを見ましょう

package.jsonなどではなく、自分たちで数字を指定しているはずです
あえてrenovateの設定を作り込まない限り古いままになりますね

## 最新バージョン番号のありか
extenstionの最新バージョン

https://docs.datadoghq.com/serverless/aws_lambda/configuration?tab=datadogcli#migrate-to-the-datadog-lambda-extension

各言語の最新バージョン

https://docs.datadoghq.com/ja/serverless/libraries_integrations/cdk/

## cdk

CDKならconstructsのv2が出ています。せっかくなので上げておきましょう。

https://github.com/DataDog/datadog-cdk-constructs?tab=readme-ov-file#migrating-from-v2-1xx-to-v2-2xx

これはAWSCDKのv2かつ、datadog-cdk-constructs-v2かつ、v2-2です。
一部モジュール名が変わっているのでそこだけ修正すればOK

# coldstart結果確認方法

APMなどでinitフェーズだけ確認するか、metricsで統計を確認しましょう

https://docs.datadoghq.com/ja/serverless/enhanced_lambda_metrics/

# その他参考

古いやり方だとDatadog Forwarder(という別Lambda)経由でTraceやLog含めさまざまなデータを送信しています。
これだとコストが嵩む、欠損リスクなど多数の問題があるのでExtensionへの移行が推奨です。

https://docs.datadoghq.com/serverless/aws_lambda/troubleshooting/?tab=serverlessflare


やれることが多数あるので一度眺めておくとよいですね

https://docs.datadoghq.com/serverless/aws_lambda/configuration/?tab=datadogcli



extensionの技術的詳細はこの辺を

https://www.datadoghq.com/blog/datadog-next-gen-lambda-extension/

https://www.datadoghq.com/blog/engineering/datadog-lambda-extension-rust/
SQL Server ローカル環境構築手順（Windows向け）

# SQL Server 環境構築手順（Windows向け）
**ローカル環境でSQL Serverを入れるための参考情報です。**
ソフトをインストールして接続まで確認します。

## 1 SQL Server のインストール

### ❖ ダウンロード
[Microsoft公式サイト](https://www.microsoft.com/ja-jp/sql-server/sql-server-downloads)から **SQL Server Express**（無料版）または **SQL Server Developer** をダウンロード。

### ❖ インストール手順
1. インストーラーを実行し **「基本インストール」** または **「カスタムインストール」** を選択。
2. インスタンス名を設定（デフォルトは `SQLEXPRESS`）。
3. 認証方式を選択
   - **Windows認証**（推奨）  
   - **SQL Server認証**（ユーザー名・パスワードで認証）

---

## 2 SQL Server Management Studio（SSMS）のインストール

SQL Server の管理ツール [SSMS](https://learn.microsoft.com/ja-jp/sql/ssms/download-sql-server-management-studio-ssms) をダウンロード＆インストール。

---

## 3 接続確認
インストールが完了したらSSMSで接続してみる。
connectボタンを押下して接続できればOK。

**接続先の選択について**
Connect to Server→Server name→プルダウンから<Browse for more>を選択
→Data Base Engineの左にある+で展開するとインストール時に指定したインスタンスがあるのでそれを選択する。デフォルトの「SQLEXPRESS」だと「SQLEXPRESS」が選択肢にある。
SQL Serverでお試し用データベースやユーザを作成する

## アプリの学習用で使うためのデータベースやユーザを作成

勉強用に使う環境を構築してみました。
とりあえず個人で使うための構築です。

管理者と利用者の権限設定は行い、グループに権限を付与しました。

### saユーザを有効にする
強い権限の付与が必要であり、saユーザを使用しました。
[SQL Server 2019でsaアカウントを有効化する方法](https://it-study.info/sql-server-2019-sa-enable/)

### データベース作成や権限設定
```
--　1. データベースの作成
CREATE DATABASE SampleDataBase;
GO
```

```
--  2. スキーマの作成
USE SampleDataBase;
GO
CREATE SCHEMA Sample;
GO
```

```
--  3. ユーザーグループ（ロール）の作成
CREATE ROLE AdminGroup;
GO
CREATE ROLE UserGroup;
GO
```

```
--  4. ユーザーの作成
CREATE LOGIN AdminUser WITH PASSWORD = 'SecureAdminPass';
CREATE USER AdminUser FOR LOGIN AdminUser;
ALTER ROLE AdminGroup ADD MEMBER AdminUser;
GO

CREATE LOGIN NormalUser WITH PASSWORD = 'SecureUserPass';
CREATE USER NormalUser FOR LOGIN NormalUser;
ALTER ROLE UserGroup ADD MEMBER NormalUser;
GO
```

```
--  5. 権限の設定
--管理者にdb_owner権限を付与する
USE SampleDataBase;
GO
ALTER ROLE db_owner ADD MEMBER AdminGroup;
GO

GRANT SELECT, INSERT, UPDATE ON SCHEMA::Sample TO UserGroup;  -- 利用者に基本権限
GO
GRANT DELETE ON SCHEMA::Sample TO UserGroup;  -- 利用者にレコード削除権限を別途追加
```

### 参考 テーブルの作成
管理者用ユーザ(AdminUser)でテーブルの作成が出来ることを確認しました。
権限設定が上手くいっていそうかの簡易確認をするためです。
```
USE SampleDataBase;
GO

CREATE TABLE Sample.TBLSample (
    ID INT PRIMARY KEY IDENTITY(1,1),  -- 自動採番の主キー
    Name NVARCHAR(100) NOT NULL,       -- 名前（100文字まで）
    CreatedAt DATETIME DEFAULT GETDATE(), -- 作成日時（デフォルト現在時刻）
    IsActive BIT DEFAULT 1             -- 有効フラグ（1=有効, 0=無効）
);
```
文字列の反転　reverse()



文字列を反転するだけのシンプルな問題。やってみると意外といろんなやり方があった！

<br>

## 問題概要

文字列 `S` が与えられるので、 `S` の前後を反転させた文字列を出力せよ。
<br>
入力例：

    paizaazzap

出力例：

    pazzaaziap

<br>

https://paiza.jp/works/mondai/string_primer/normal_step10

<br>

## ✅コード例：reverse()
```js
// 入力受け取り
const rl = require('readline').createInterface({ input: process.stdin });

rl.once('line', (input) => {

    // ① split('') で1文字ずつの配列に変換 → ['a','b','c','d','e']
    // ② reverse() で順番を反転 → ['e','d','c','b','a']
    // ③ join('') で文字列に戻す → "edcba"

    const reversed = input.split('').reverse().join('');

    // 出力
    console.log(reversed);

    // 入力終了
    rl.close();
});
```

<br>

## 🔁 for文を使って文字列を反転する方法
```js
const rl = require('readline').createInterface({ input: process.stdin });

rl.once('line', input => {
    let reversed = [];

    // 後ろから前に向かって1文字ずつ push
    for (let i = input.length - 1; i >= 0; i--) {
        reversed.push(input[i]);
    }

    // 配列を文字列に変換して出力
    console.log(reversed.join(''));
});
```
✅ 補足ポイント

- `input.length – 1` からスタートして `i >= 0` までループ。
- `.push(input[i])` で逆順に格納。
- 最後に `join'')` で文字列として出力。

`split().reverse().join()` に頼らず、自分でアルゴリズムを制御！

<br>

## 🔁 文字列だけで反転する方法
```js
const rl = require('readline').createInterface({ input: process.stdin });

rl.once('line', input => {
    let reversed = '';

    // 文字列を後ろから1文字ずつ先頭に追加していく
    for (let i = input.length - 1; i >= 0; i--) {

        // 配列ではなく文字列に直接追加
        reversed += input[i]; 
    }

    console.log(reversed);
});
```
✅ ポイント解説

- `let reversed = ''` として空の文字列を初期化。
- `reversed += input[i];` によって、1文字ずつ文字列の末尾に追加。
- 配列 + `join()` を使ってないので、コードが少しシンプル。

<br><br>

## 気づきメモ

- `reverse()` は配列専用。文字列には使えない！
- `join('')` を忘れるとカンマ付きで出力されてしまう…

- 反転方法は3パターン：`split+reverse+join`、`for`文で配列に`push`、文字列に`+=`

## <br>まとめ

最初は簡単そうに見える問題も、実際にコードを書くとたくさんの気づきがあった！Paizaの問題は基礎力アップに最適なので、コツコツ解いていきたい！


<br><br><br>[僕の失敗談(´;ω;｀)と解決法🐈](https://paizabeginner.wordpress.com/about/)
クラウドエンジニアです

# はじめに
クラウドエンジニア志望として、Terraform × AWSの構成を実際に作成し、GitHubにポートフォリオとして公開しました。

本記事では、構築の目的／工夫した点／苦労した点／今後の展望をまとめます。

---

# 構築の目的
- AWS×Terraformの構成スキルを証明したかった
- モジュール化や状態管理、依存管理までカバーした構成を実現したかった
- 「世界中どこでも働ける技術力」を目指し、アウトプットの第一歩にしたかった

---

# 使用技術・構成

| カテゴリ | 内容 |
|----------|------|
| IaC | Terraform v1.7（lifecycle, depends_on, import 等） |
| クラウド | AWS（VPC / EC2 / S3 / RDS / CloudWatch） |
| OS | Linux (Ubuntu) |
| 言語 | HCL / Bash / Python（基本） |
| 資格 | AWS SAP / 基本情報 / LPIC-1 |

---

# 工夫したポイント
- Terraformモジュールをリソースごとに分離
- `depends_on`や`lifecycle`で依存や再作成を制御
- `terraform.tfvars`と`variable.tf`で再利用性を確保
- CloudWatchなど監視面まで網羅
- `.terraform`や`.tfstate`はLFS問題を避けて除外管理

---

# 詰まったポイント
- GitHubへのpushで`.terraform`ディレクトリによりLFS制限に引っかかった
- `.gitignore`と`.gitattributes`の調整に苦戦
- 状態管理ファイルの扱いが一番大変だった（消す？残す？）

---

# リポジトリはこちら

👉 [GitHub - terraform-aws-portfolio](https://github.com/Kkasuga904/terraform-aws-portfolio)

---

# 今後の展望
- CloudFront付きS3静的サイトホスティング対応
- CI/CD（GitHub Actions）との連携
- セキュリティ設計の深掘り（IAM, KMSなど）

---

# おわりに
読んでいただきありがとうございました。

どんな環境でも働ける力を目指して、構築→GitHub→発信まで自分の手で回せるようになってきました。
もし「こういう構成でよかったよ」などあればぜひコメントで教えてください！


## 📦 この構成のソースコード（GitHub）

👉 [GitHubリポジトリはこちら](https://github.com/Kkasuga904/terraform-aws-portfolio)

## 🛠️ AWS構成のご相談・依頼について

この構成をベースにした AWS環境の構築や Terraform導入支援も可能です。  
**初回無料でのご相談受付中です。お気軽にどうぞ！**

👉 [ココナラ出品ページはこちら](https://coconala.com/services/3709841)
---

## 📦 Terraform構成テンプレ販売中！

本記事で紹介したようなAWS構成をすぐに使いたい方に向けて、  
Terraform構成テンプレ（EC2 / S3 / ALB 一式＋解説付き）を販売中です。

👉 [ココナラで販売中（1,000円）](https://coconala.com/contents/xxxxxxx)

## 📦 Terraformテンプレを販売しています！

本記事の構成をベースに、再利用可能な構成テンプレートをBoothで販売しています👇

👉 [Terraform × AWS構成テンプレ（Booth）](https://awsssteraform.booth.pm/items/6994781)

- 初学者向けでも使いやすい設計
- モジュール分離済み、保守性・可搬性を意識
- 初月は購入者特典で「コードレビュー」付き

※ぜひ導入・改善のベースにご活用ください！
カシオ、新製品ラッシュか？fx-CG50値崩れ

## fx-CG100発売でfx-CG50の価格が66.66USDまで急落
Graph Math+ の北米版（グローバル版）である fx-CG100 が4月24日に発売開始された。

https://www.notebookcheck.net/Casio-launches-its-best-fx-CG100-ClassWiz-graphing-calculator-with-MicroPython-programming-in-America.1004479.0.html

Graph Math+ や fx-CG100 の操作体系には賛否両論あったことから、旧機種である fx-CG50 の価格が上がることも想定されたが、米アマゾンは在庫処分価格なのか、2025/5/16現在 66.66USD で販売している（ここ1年で最安）。
![cg50-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/fafbb982-9ced-488c-9300-9f10cd577399.png)
日本までの送料 8.83USD を加えても1万1千円強で購入できる。
![cg50-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/1c251825-a378-47a7-9915-2381029e5975.png)

fx-CG50を購入しようと思っていた人は、今が買い時ではないだろうか。

なお、在庫が不安定であり、私は日本時間14日未明に注文したが未だ決済すら終わっていない。急ぎの購入には向かないことを追記しておく。

## 米アマゾンにfx-9910CG 2nd editionの写真
同じく米アマゾン。
カシオの関数電卓のトップに fx-9910CG 2nd edition の写真が掲載されたと話題になっている。（追記：この記事を投稿した翌日にバナーは fx-991CW に差し替えられた）
![9910cw-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/15f6d1be-ce91-4d93-af50-5f2f206381d4.png)

すでに9910の型番はナイジェリア向け fx-9910NG 2nd edition で使用されており、991のソーラー電池無しモデルは従来の570から9910に移行させるのではないか。

https://www.jetro.go.jp/biznews/2024/07/4847afe53a587621.html

そして気になる 2nd edition の文字。
Baidu Tiebaにこんな書き込みがあった。

https://tieba.baidu.com/p/9596070888

ここでは次期CWでメニューの直接選択が可能になるといったことが書かれているが、指数入力も Graph Lite のように従前方式を選ぶことができるようになるか注目である。

遅きに失した感はあるが、初代ClassWizの良かった点を再搭載した改良版CWが早期に発売されるよう期待したい。
【最新のOpenSSLに対応】libzipをソースコードからインストール

最新のOpenSSL3.4.1を基本的な基盤にしたくて、libzipをソースからスクラッチしてみました。
結構ハマったのでメモ代わりに記事にしておきます。

以下、手順になります。

```
wget https://libzip.org/download/libzip-1.11.3.tar.gz
tar xvfz libzip-1.11.3.tar.gz
cd libzip-1.11.3

mkdir build
cd build

cmake .. -DCMAKE_INSTALL_PREFIX=/var/home/lib/libzip \
         -DCMAKE_INSTALL_RPATH=/var/home/lib/openssl/lib64:/usr/lib:/usr/lib64 \
         -DENABLE_OPENSSL=ON \
         -DOPENSSL_ROOT_DIR=/var/home/lib/openssl \
         -DOPENSSL_LIBRARIES=/var/home/lib/openssl/lib64

make
make install

cd /var/home/lib

mv libzip libzip1.11.3
ln -s libzip1.11.3 libzip
```
cmakeはあまり使う事がないので、パラメータを把握するまで時間がかかりました。cmakeに渡すパラメータ名がわかれば難しい事をしているわけではないので、すぐ理解できるかと思います。
[SOLVED] Linux Mint ver. 22.1におけるrtl8812auのwifi設定

Linux Mint Xia ver.22.1から、標準モジュール（ドライバー）でrtl8812au対応のUSB-wifiが使えるようになった。
　
基本手順：
[1]標準ドライバーのインストール
システムを立ち上げて、USB無線LANアダプターを差し込むと、標準モジュールを使用するかどうか訊いてくる。「使用する」を選択するとrtl8812-dkmsがインストールされ、wifiが繋がる。

基本手順だけではwifiに繋がらない場合：
１．soft/hard blockされていて、Wwfiが使えない場合
[1]wifiのsoft blockを外す。
　$sudo rfkill list
　0: phy0: Wireless LAN
	　Soft blocked: yes
　Hard blocked: no
　2: phy2: Wireless LAN
	　Soft blocked: yes
	　Hard blocked: no
　$sudo rfkill unblock all
　$sudo rfkill list
　0: phy0: Wireless LAN
	　Soft blocked: no
	　Hard blocked: no
　2: phy2: Wireless LAN
	　Soft blocked: no
	　Hard blocked: no　
[2]wifiがhard blockされている場合
　1.BIOSの初期化
PCのBIOSに、wireless lanの初期化のオプションがある場合は、
　2.CMOSの電池を外して、電池を差し込み直す(1)。

Note:
　(1) wireless lanのスイッチがあるPCもある。
ファイルシステムとストレージに関わるバックアップの課題(サイレントデータ破壊)

バックアップ（個人ユーザー向けの場合）を、手間無く確実に行うために、相当時間をかけて研究しました。
日頃、顧客のサポートをしている中で、常に、バックアップをして下さい、と言っています。しかし、それでも、バックアップをしていない人も多いのです。そのため、2025年時点での、実務に有効な方法を次の記事にまとめました。
[バックアップ計画](https://ganges.pro/customer/blog/backup-plan/)

結論は、

:::note warn
ファイルを、常時接続していない外部ストレージ（HDDやSSD）に、バックアップするのは必須
:::

です。
この理由や、その実現方法は、記事を参照してもらうと良いのですが、バックアップの知見を深める中で、技術的な課題が分かりました。ここでは、それらを補足します。

# ファイルのコピーに失敗しても、それに気づかない可能性

[NTFS](https://ja.wikipedia.org/wiki/NTFS)のファイルシステムでは、サイズが一致していも、コピーに失敗していて同じでない可能性があります。

画像の例では、同じサイズですが、データは違います（実際に失敗したファイルではなく、バイナリエディタで編集）。
コピーしたファイルを開けないなら、エラーとわかりますが、ファイルを開くことができると、データのどこが変わったか分からないこともあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/9d6598d4-b4f9-45ee-8e7f-626de3a649da.png)


コピーに成功したかを確認するには、例えば、ハッシュ値が一致するのを確認します。

[エラーチェックをしながらコピーができるFastCopyの使い方](https://video-knowledge.com/fastcopy)

# サイレントデータ破壊（無兆候データ破壊・Silent Data Corruption）

ストレージに保存したデータは、保存した時は正確でも、時間経過とともに壊れる可能性があります。
これは、サイレントデータ破壊の1つです。

- [あなたのデータは既に壊れているかもしれない（Silent Data Corruption）](http://raven.air-nifty.com/night/2009/07/silent-data-cor.html)
- [FastCopyはファイルの変更と破損を区別しますか？](https://groups.google.com/g/fastcopy/c/cdPZqhFC0JQ/m/jNEfIbc2AQAJ)
- [Bitrot and atomic COWs: Inside “next-gen” filesystems](https://arstechnica.com/information-technology/2014/01/bitrot-and-atomic-cows-inside-next-gen-filesystems/)

サイレントデータ破壊に備えたファイルシステムは、次があります。
- [ReFS](https://learn.microsoft.com/ja-jp/windows-server/storage/refs/refs-overview)
    - [ReFS 整合性ストリーム](https://learn.microsoft.com/ja-jp/windows-server/storage/refs/integrity-streams)

- [ZFS](https://ja.wikipedia.org/wiki/ZFS)
- [BTRFS](https://btrfs.readthedocs.io/en/latest/)
    - [Auto-repair on read](https://btrfs.readthedocs.io/en/latest/Auto-repair.html)
    - [Checksumming](https://btrfs.readthedocs.io/en/latest/Checksumming.html)
		
# NTFSのファイルシステムでのバックアップ
NTFSのファイルシステムには、サイレントデータ破壊に対処する仕組みはありません。バックアップにおいて対応するには、2025年時点では、例えば、次の方法が良いように考えます。

- バックアップのために、ファイルをコピーした時に、ハッシュ値の一致を確認。同時に、ハッシュ値を保存。
- バックアップは複数のストレージに行い、複数の同じバックアップを作成。これにより、サイレントデータ破壊があったファイルではなく、正常なファイルから復元できる可能性が高まる。
- バックアップから復元時、保存したハッシュ値に一致するかどうか、復元する前に確認。

これを実現するには、FastCopyでは、例えば、次の設定でファイルをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/5e5f25ed-3416-4a46-866b-33c7ab53f87a.png)

そして、バックアップからファイルを復元する前に、ベリファイ情報検証を実行して、サイレントデータ破壊がないか調べます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/55ceeeda-6d8b-4102-bd2f-da15de606715.png)

##### 副次ストリーム（代替データストリーム・Alternate Data Stream）について
[dirやPowerShellでNTFSの代替データストリーム情報を表示する](https://atmarkit.itmedia.co.jp/ait/articles/1407/11/news111.html)

# 留意点
- Windows 11で、ReFSを、USBドライブに接続したストレージでは利用できないようです。
- バックアップのファイルではなく、NTFSのCドライブにあるオリジナルのファイルが、サイレントデータ破壊になったかどうかを確認する良い方法は思いつきません。Windows Serverを利用し、ReFSのドライブにファイルを保存するなら良いでしょうが。
- [開発ドライブ](https://learn.microsoft.com/ja-jp/windows/dev-drive/)は、ReFSなので、良さそうです。しかし、開発者向けなので、一般ユーザーには不向きです。また、「[Dev Drive に何を格納すべきですか？](https://learn.microsoft.com/ja-jp/windows/dev-drive/#what-should-i-put-on-my-dev-drive)」によると、開発用のファイル以外は目的外です。