「ブログ」カテゴリーアーカイブ

ブログ投稿用のカテゴリ

🧠 Pythonで学ぶ画像認識入門:TensorFlowとKerasで手書き数字を判定する方法(5) ~複数の自作画像を一括で認識~

前回

🧠 Pythonで学ぶ画像認識入門:TensorFlowとKerasで手書き数字を判定する方法(4) ~学習済みモデルで自作画像を認識~

の記事では、学習済みモデルを使って「1枚の手書き数字画像」を判定しました。
今回はさらに発展して、フォルダ内にある複数の画像を一括で認識してみましょう。

これにより、手書きで作成した「0〜9」の数字画像をまとめてテストできるようになります。


🧩 動作環境(共通)

項目バージョン / ツール
OSWindows 11 Pro 24H2
Python3.12.6
pip24.2
エディタPowerShell / VS Code
ライブラリpandas 2.x / matplotlib 3.x / openpyxl 3.x


📁 ステップ①:フォルダ構成を準備

まず、テスト用フォルダを作成します。

各画像は 白背景 × 黒または青文字、中央寄せ、28×28ピクセル推奨です。


🧠 ステップ②:複数画像を一括認識するスクリプト

ファイル名:predict_batch.py

内容:


⚙️ ステップ③:実行方法

仮想環境を有効化して、次を実行します:


🧾 ステップ④:出力結果(例)

コンソール出力例:

グラフ表示:

  • 横一列に数字画像が並び、各画像の下にAIの判定結果が表示されます

  • 一目でどの画像をどの数字と認識したか分かります


📊 ステップ⑤:結果と考察

項目内容
処理対象フォルダ内の全画像(png/jpg)を自動スキャン
推論処理load_modelでCNNモデルを再利用し、一括predictを実施
表示形式コンソール出力+matplotlibで可視化
精度1枚ずつ推論と同等(約99%)を維持
応用例書類や帳票の一括認識、データセットの一括評価など
考察単一推論を拡張してバッチ処理化。フォルダ単位で実行できるため自動化が容易


💡 発展ポイント

テーマ内容
結果をCSV出力pandas.DataFrame(results).to_csv('result.csv', index=False)
サブフォルダ対応os.walk() を使えば階層フォルダも処理可能
推論速度UPGPU環境なら処理時間が大幅短縮
異常画像の検出サイズやフォーマットが不正な画像をスキップ処理可能

✅ まとめ

本記事では、学習済みモデルを使って複数の手書き数字画像をまとめて判定しました。
フォルダ単位で一括処理できるため、データテストやAIモデルの精度検証にも最適です。

次回は、

🧠 (6) 判定結果をCSV出力し、正解データと比較して精度を分析
として、「自作データセットの評価編」に進みます。

SQL:NOT IN と NOT EXISTS の違いとパフォーマンス比較

SQLでサブクエリを使って除外条件を指定する際に利用される「NOT IN」と「NOT EXISTS」。両者の動作の違いやNULLの扱い、パフォーマンス差を実例付きで徹底解説します。

EXISTSANSI SQL(国際標準SQL)に含まれる構文 のため、
ほぼすべてのリレーショナルデータベースで利用できます。
古いバージョンの一部DBを除き、標準構文として移植性が非常に高いのが特徴です。

1. NOT IN と NOT EXISTS の基本構文

構文例説明
NOT INSELECT * FROM A WHERE ID NOT IN (SELECT ID FROM B);サブクエリの結果に含まれないIDを抽出
NOT EXISTSSELECT * FROM A WHERE NOT EXISTS (SELECT 1 FROM B WHERE A.ID = B.ID);Bに同じIDが存在しない場合のみAを取得

ポイント:

  • 両者とも「除外」目的だが、評価タイミングとNULL処理が異なる。


2. 動作の違い(NULLの扱いに注目)

条件NOT INの結果NOT EXISTSの結果
サブクエリにNULLが含まれるすべての行が除外される正常に比較できる
サブクエリが空(0件)全件取得される全件取得される

理由:
NOT IN は内部的に「A.ID <> B.ID」を繰り返すような処理を行うため、NULLが含まれると比較結果がUNKNOWNとなり、全体が評価されなくなる。
一方、NOT EXISTS行ごとに存在チェックを行うため、NULLの影響を受けない。


3. 実行結果の比較例

以下の例を見てみましょう。

テーブルA

ID NAME
1 田中
2 鈴木
3 佐藤

テーブルB

ID
1
NULL

4. パフォーマンスの違い

比較項目NOT INNOT EXISTS
NULLの影響受ける受けない
実行計画(最適化)インデックス利用されにくい場合あり最適化されやすい
大量データ時の効率遅くなるケースありより安定して高速
Oracleの最適化傾向半結合(Anti-Join)に変換されることあり同様に最適化される

実測例(概略)

件数NOT IN所要時間NOT EXISTS所要時間
1万件0.25秒0.20秒
10万件3.1秒1.8秒

※ 実測環境:Oracle 19c、インデックスあり、CPU 4コア相当


5. どちらを使うべきか

条件推奨句
サブクエリにNULLが含まれる可能性ありNOT EXISTS
データが小規模でNULLなしどちらでも可
大規模データ・実行計画を重視NOT EXISTS(推奨)
可読性を優先NOT EXISTS のほうが誤動作が少ない

6. まとめ

観点内容
ANSI SQL対応○(どのDBでも使用可能)
実行パフォーマンスDBごとに最適化される(MySQL 8以降で特に改善)
推奨度高い(NOT INより安全で移植性が高い)
注意点MySQL 5.x 以前では最適化が弱いケースがある

✔ 結論:
除外条件を指定する場合は、基本的に「NOT EXISTS」を使う方が安全で高速です。
ただし、NULLが確実に存在しないことが保証される小規模データではNOT INも選択肢になります。

Java:安全な乱数生成に役立つ!SecureRandomの使いどころ

1. SecureRandomとは

SecureRandomは、**暗号論的に安全な乱数(CSPRNG:Cryptographically Secure Pseudo-Random Number Generator)**を生成するためのJavaクラスです。
java.securityパッケージに含まれ、セキュリティトークン、APIキー、暗号鍵などの生成に利用されます。

通常のRandomクラスは予測可能な乱数を生成するため、攻撃者にシードを特定される危険性があります。
対してSecureRandomはOSの暗号エンジンを利用して予測不能な乱数を生成します。


2. Randomとの違い

項目RandomSecureRandom
主な用途ゲーム・抽選・シミュレーション暗号・セキュリティ関連
再現性シード指定で再現可能予測困難・安全性重視
エントロピー源疑似乱数(数列)OSの乱数エンジン
パフォーマンス高速やや低速(安全性優先)
実装場所java.utiljava.security

3. Javaバージョン別の対応ポイント

バージョン特徴・変更点
Java 8最も広く使われる環境。SecureRandomはデフォルトで十分安全。getInstanceStrong()も使用可能(JDK実装依存)。
Java 11Base64.getUrlEncoder()などの標準エンコーダが安定。マルチスレッド環境でのSecureRandom利用も改善。
Java 17 (LTS)デフォルトの乱数アルゴリズムが強化(DRBGが推奨)。新しいSecureRandom実装が追加。
Java 21 (LTS)SecureRandomのアルゴリズム選択がより細かく制御可能に。DRBGがデフォルトで推奨パス。

💡 DRBGとは?
Java 17以降では、NIST標準(SP800-90A)に準拠したDRBG(Deterministic Random Bit Generator)が使用可能です。
これは暗号学的により強固な乱数生成手法で、今後の推奨実装となります。


4. サンプルコード:安全なトークン生成 

🧩 出力例:

安全なトークン: qZ1jJ9vCQyQJk6lK2fYvUg

5. 高度な使い方(Java 17以降対応)

✅ 強力なDRBGインスタンスを明示的に取得

💡 HexFormatはJava 17で追加された便利クラスです。
Base64よりも短い表現でログ出力に適しています。


6. よくある利用シーン

シーン使用目的推奨API
認証トークン生成セッションIDやAPIキーSecureRandom + Base64
CSRFトークンWebフォームの保護SecureRandom + HexFormat
パスワードリセットURL予測困難な一時リンク生成getInstanceStrong()
暗号鍵生成AESなどの鍵素材SecureRandom
UUID代替高強度ランダムIDSecureRandomで独自生成

7. ベストプラクティス

推奨事項理由
SecureRandomの使い回し毎回生成するとコストが高い
OS依存のソースを活用/dev/urandomなどで高品質な乱数
getInstanceStrong()を必要時のみ使用起動が遅くなるため常用は非推奨
Base64やHexFormatで可読化ログやトークンで扱いやすい
シード指定は避けるセキュリティが低下するため

8. パフォーマンス比較(目安)

操作平均速度安全性
Random.nextInt()非常に高速
SecureRandom.nextInt()中程度
SecureRandom.getInstanceStrong()やや遅い最高
SecureRandom (DRBG)中〜高最高(推奨)

9. まとめ

ポイント内容
用途暗号・認証・トークン生成に最適
バージョン対応Java 8〜21全対応
推奨実装SecureRandom または DRBG(Java 17+)
注意点シード指定・再生成の多用を避ける
一言安全性を重視する場面では必ずSecureRandomを!

🧠 コラム:SecureRandomを使うべき「具体例」

  • OAuth 2.0 認可コードの生成

  • JWTの署名鍵生成

  • Cookieのsession_id生成

  • APIトークン・CSRFトークン・暗号鍵など

「ユーザーや外部に漏れたら困る値」には必ずSecureRandom!

Oracle「ORA-01830: 日付書式の変換で不要なデータが含まれています。」原因と対処法

🧩 エラーの概要

Oracleデータベースで日付型を扱う際に発生する代表的なエラーのひとつが、
「ORA-01830: 日付書式の変換で不要なデータが含まれています。」 です。

このエラーは、TO_DATE 関数や TO_TIMESTAMP 関数などで
日付文字列とフォーマットマスクが一致していない ときに発生します。


⚠️ 主な原因

原因詳細
フォーマットと実際の文字列が一致していない例:TO_DATE('2025/10/10 12:00:00','YYYY-MM-DD HH24:MI:SS') のように、区切り文字(/ と -)が異なる
余分な空白や文字が含まれている例:'2025-10-10 '(末尾にスペース)や '2025-10-10T12:00:00'("T" が不要)など
不正な日付データを変換しようとしている例:'2025-13-10'(13月など存在しない日付)
型変換の二重適用既にDATE型の列に対して再度 TO_DATE を適用しているケース
NLS設定の影響セッションのデフォルト日付形式が異なる場合、フォーマット不一致が起きやすい

💡 再現例と解説

この例では、/(スラッシュ)で区切られているのに
フォーマットマスクが -(ハイフン)になっているため不一致です。

✅ 正しい例:


🔍 対処法まとめ

対処法内容
フォーマットマスクを一致させる区切り文字・桁数・要素(年・月・日)を文字列と揃える
TRIM関数で空白を除去TO_DATE(TRIM(列名), 'YYYY-MM-DD') のように記述
型を確認する既にDATE型なら TO_CHAR などで変換すべき
NLS設定を確認SELECT * FROM NLS_SESSION_PARAMETERS WHERE PARAMETER LIKE 'NLS_DATE%'; で現状を確認
データクリーニング不正な日付を REGEXP_LIKE などで除外してから変換

🧠 補足:フォーマット指定の注意点

Oracleの日付フォーマット指定子には以下のようなものがあります:

指定子意味
YYYY西暦(4桁)
MM月(01〜12)
DD日(01〜31)
HH24時(00〜23)
MI
SS

たとえば YYYY-MM-DD HH24:MI:SS のように指定すれば
「2025-10-10 12:00:00」形式の文字列を正しく変換できます。


🧾 まとめ

ポイント内容
発生原因フォーマットとデータの不一致
よくあるパターン区切り文字違い・余分な空白・不正な日付
確認ポイントNLS設定、文字列の内容、列のデータ型
対処法フォーマット統一・データクリーニング・TRIM活用

✨ 例:実践的なクエリ

不正データを確認するSQL例:

変換時に安全に行う例:


🏁 まとめの一言

ORA-01830 は「フォーマットと実データのズレ」がほぼすべての原因。
SQLのフォーマット指定を正確に合わせるだけで、ほとんどのケースは解消します。

Excel:Ctrl+Enterが便利!複数セルに一気に同じ値を入力する方法

Excelで「同じ値を何度も入力していて面倒…」と思ったことはありませんか?
そんな時に知っておくと超便利なのが、Ctrl+Enter
複数セルへ同じ値を一瞬で入力できる“神ショートカット”です。
事務作業からデータ整理まで、覚えるだけで作業スピードが劇的に変わります。


🪄 対応バージョン

バージョン対応状況
Excel 2010✅ 対応
Excel 2013✅ 対応
Excel 2016✅ 対応
Excel 2019✅ 対応
Microsoft 365(サブスク版)✅ 対応
Excel for Mac✅ 対応(⌘+Enter)

💡 Mac版では ⌘+Enter で同様に一括入力が可能です。


⚡ 基本の使い方ステップ

ステップ操作内容説明
同じ内容を入れたいセルを選択ドラッグまたはShift+方向キーで範囲選択
1つのセルに値を入力例:「済」や「OK」など
Ctrl+Enterを押す選択したすべてのセルに同じ値が一括入力


💡 補足:選択方法によってCtrlの使い方が変わる

状況操作方法説明
連続したセルドラッグまたはShift+方向キーCtrlを押す必要なし
離れたセル(非連続)Ctrlを押しながらクリック複数箇所にまとめて入力したい時に便利

🔍 Ctrlキーの役割とは?

普通のEnterキーは「1セルだけ確定して次へ移動」します。
一方、Ctrl+Enter は「選択中すべてのセルに確定」して、移動しません

操作動作の違い
Enter1セル確定 → 下のセルへ移動
Ctrl+Enter全選択セルに同じ値を確定 → カーソルはそのまま

💡 Ctrlキーは「移動を止めて、全選択セルに反映させる命令キー」です。


🚀 どんなシーンで使える?

実務・日常問わず、Ctrl+Enterが活きる場面はとても多いです👇

🗂️ 1. ステータス管理の更新

進捗管理表などで、「完了」「未対応」などの文字を一括で入力。
範囲選択 → Ctrl+Enter で一発反映。

📅 2. 日付の一括設定

同じ日付を複数行に入力したいときに便利。
例:「2025/10/09」を範囲指定してCtrl+Enter。

👥 3. 担当者名・部署名の一括入力

一覧表で「営業部」「経理部」など同じ部署名をまとめて反映。
離れた場所でもCtrl+クリックで選択して一括確定。

🔢 4. テストデータ・ダミー値の作成

仮の数値や文字を一気に入力して、検証や集計を行うときに便利。

🧮 5. 数式を一括入力

たとえば =TODAY() を入力 → Ctrl+Enter で全セルに今日の日付を表示。


⚙️ 類似ショートカットとの違い

ショートカット内容特徴
Ctrl+Enter同じ値を一括入力最も汎用的
Ctrl+D上のセルをコピー縦方向に使う
Ctrl+R左のセルをコピー横方向に使う

💡 Ctrl+Enter は「最初に選んだセルの値を全体に適用」するのが特徴です。


🧠 まとめ

ポイント内容
ショートカットCtrl+Enter(Macは⌘+Enter)
効果複数セルに同じ値を一括反映
対象文字・数値・関数もOK
対応バージョンExcel 2010以降すべて対応
主な活用例ステータス・日付・部署名・数式など
メリット作業効率が劇的にアップ


✨ 編集後記

Excelの作業時間を短縮したいなら、まず覚えるべきが Ctrl+Enter
単純作業を何倍も早く終わらせられるショートカットです。
今日からぜひ試してみてください!

WinMerge:正規表現を使った高度な差分検索テクニック

WinMergeは「ファイルの違いを見るだけのツール」ではありません。
正規表現とフィルタ機能を組み合わせることで、不要な差分を除外し、実質的な変更だけに集中できます。

この記事では、
初心者でもすぐに使える「正規表現の基本」と、
上級者向けの「フィルタファイルを使った高度な差分除外テクニック」までを詳しく解説します。


🔍 正規表現を使える主な場面

機能対応説明
検索・置換検索ダイアログで「正規表現を使用」にチェック
フィルタファイル(.flt)比較時に除外ルールを定義できる
差分検出ロジック⚙ 一部特定パターンの行を無視可能

🧩 よく使う正規表現例

目的正規表現例意味
空行を無視^\s*$空白や改行のみの行を除外
日付を無視\d{4}-\d{2}-\d{2}例:2025-10-09 のような日付を除外
コメント行を無視^#.* / ^\s*//.*コメント始まりの行をスキップ
数値部分を無視\d+動的なIDやカウンタ値を除外

⚙️ WinMergeの検索で正規表現を使う方法

  1. メニューから 「編集」→「検索…」 を開く

  2. 検索キーワードに正規表現を入力(例:^ERROR.*

  3. 下部の「正規表現を使用」にチェック

  4. 「次を検索」で対象行を強調表示

🔍 よく使う検索パターン集

パターン意味
^ERROR.*ERRORで始まる行を検索
TODO|FIXMETODO または FIXME を検索
[A-Z]{3}3文字以上の大文字英単語
\bhttps?://[^\s]+URLを抽出

🧱 フィルタファイルとは?

WinMergeで比較時に「特定の行を無視」するための設定ファイルです。
拡張子は .flt
コメントや空白行、日付などのノイズを除外して、本質的な差分を見やすくできます。


🧰 フィルタファイルの作り方

① 新規作成

  1. メモ帳などで新しいテキストファイルを作成

  2. 以下の内容を記述


    項目意味
    Enable=1フィルタ有効化
    IncludeFileMask対象ファイル(例:*.java)
    ExcludeRegExp除外したい正規表現(カンマ区切りOK)
  3. 名前をつけて保存
    例:

    C:\Users\<ユーザー名>\Documents\WinMerge\filters\comment_filter.flt

② WinMergeに読み込ませる

  1. WinMergeを起動

  2. メニューで
    [編集] → [フィルタを選択] をクリック

  3. 「ファイル比較フィルタ」ダイアログで
    [参照…] → 作成した .flt ファイルを選択

  4. 「OK」を押すと有効化完了!

これで比較時にフィルタが自動的に適用されます。


③ 効果を確認する例

比較ファイルA

比較ファイルB

通常比較では「日付が違う」と表示されますが、
次のようなフィルタを設定すれば「差分なし」になります。

ExcludeRegExp=^//.*,^\d{4}-\d{2}-\d{2}.*$

→ コメントや日付行を完全に無視できるようになります!


🎯 フィルタの応用テクニック

シーン推奨設定例
コードレビューコメント・空行を除外 (^//.*, ^\s*$)
ログ比較タイムスタンプを除外 (\d{2}:\d{2}:\d{2})
設定ファイル(JSON)動的値を除外 ("updated_at":\s*".*")
HTML比較script/styleタグ内を除外 ()
💡 複数の .flt ファイルを作り、用途に応じて切り替えるのがおすすめです。

🧠 まとめ

ポイント内容
正規表現で柔軟に検索複雑な条件でも効率的にマッチング
フィルタファイルで差分を制御コメント・日付などノイズを無視
設定は簡単メモ帳で作ってWinMergeに読み込むだけ
比較効率UP実質的な変更に集中できる

🏁 結論

WinMergeの「正規表現」と「フィルタファイル」を組み合わせると、
**「無駄な差分を消して、本質だけを見る」**比較環境が作れます。

コードレビュー、ログ検証、設定差分チェックなど、
日常の比較作業を大幅に効率化してくれる強力な武器です。

Redmineコメントを読みやすくするMarkdown記法まとめ

Redmineでは、チケットコメントやWikiでMarkdown記法が使えます。
ただのテキスト入力よりも見やすく、チーム内の情報共有が格段にスムーズになります。
この記事では、Redmineのコメントで使える代表的なMarkdown書式をまとめて紹介します。


🔹 Markdownの基本ルール

Redmineの設定で「テキスト書式」が Markdown になっている場合に使用可能です。
管理者設定から [管理] > [設定] > [全般] > [テキスト書式] で確認しましょう。


📘 よく使うMarkdown記法一覧

目的記法例表示例
見出し# タイトルタイトル
強調**重要**重要
斜体*補足*補足
打ち消し~~不要~~不要(取り消し線)
箇条書き- 項目1
- 項目2
・項目1
・項目2
番号付きリスト1. 手順A
2. 手順B
1. 手順A
2. 手順B
引用> メモ内容メモ内容(引用表示)
コードブロック```java
System.out.println("Hello");
```
コード枠付きで表示
リンク[Redmine公式](https://www.redmine.org/)Redmine公式へのリンク
画像![代替テキスト](画像URL)画像を表示
水平線---水平線が引かれる
チェックリスト- [x] 完了
- [ ] 未完了
☑ 完了/□ 未完了

💡 コメントを見やすくするテクニック

1. 見出しで構造化

### 問題の詳細
### 再現手順
### 対応方針

といった形で区切ると、レビューする側がすぐに内容を把握できます。


2. コードやログは囲む

Redmineはコードハイライトに対応しているため、

sql
SELECT * FROM users WHERE status = 'active';

のように書くと、整ったコードブロックで表示されます。


3. 引用でメッセージのやりとりを整理

前回のコメント引用
対応方針を確認しました。

このように相手の発言を引用してから返信すると、会話の流れが分かりやすくなります。


4. リンクで関連チケットを明示

  • [チケット#123](https://redmine.example.com/issues/123)

  • #123 とだけ入力しても自動リンクされる


🧩 Redmine特有の便利書式

機能記法例説明
チケット参照#123該当チケットにリンク
添付ファイルリンクattachment:log.txt添付済みファイルを参照
Wikiページ参照[[Wikiページ名]]Wiki内リンク
メンション@ユーザー名通知を送る(設定による)

🌟 まとめ

ポイント内容
構造化見出しと箇条書きで整理
明確化引用とリンクで文脈を共有
強調太字・斜体で重要箇所を目立たせる
見やすさコードや表を活用して情報を整理

Markdownを使いこなせば、Redmineのコメントは「読む」ものから「伝わる」ものへ進化します。
特に開発・運用チームでは、ログ・SQL・設定内容をコードブロックで整えるだけでも大幅に改善できます。

Teamsで背景をカスタムする方法:オリジナル画像で印象アップ

Microsoft Teamsでは、オンライン会議の背景を自由にカスタマイズできます。
オリジナルの背景画像を設定することで、印象アッププライバシー保護、さらには企業ブランディングにもつながります。
この記事では、自作画像の設定手順からおすすめの背景アイデアまでをメモしておきます。


🎨 背景カスタムのメリット

項目メリット
プライバシー保護自宅やオフィスの様子を隠せる
印象アッププロフェッショナルな雰囲気を演出
ブランド強化会社ロゴや企業カラーを反映できる
気分転換会議の雰囲気を柔らかくできる

🧭 背景設定の基本手順(PC版)

  1. Teamsを起動し、会議を開始または参加します。

  2. 画面右上の 「…(その他の操作)」→「背景効果」 をクリック。

  3. 既存の背景一覧の下にある 「新しい画像を追加」 を選択。

  4. 任意の画像ファイル(JPGまたはPNG)をアップロード。

  5. 選択した画像をクリックして 「適用」

💡 補足: 背景画像は、%AppData%\Microsoft\Teams\Backgrounds\Uploads に保存されます。
直接このフォルダに画像を追加しても反映されます。


📱 スマホアプリでの設定方法(iOS / Android)

  1. 会議中に 「…」メニュー → 背景効果 をタップ。

  2. 「+」ボタンで新しい画像を選択。

  3. 適用をタップして反映。

※ スマホ版では一部端末でカスタム背景が非対応の場合があります。


🖼️ 背景に使えるおすすめ画像テーマ

テーマ雰囲気使用例
シンプルグラデーション落ち着き・清潔感社内ミーティング
書斎・オフィス風信頼感・集中力プレゼン・面談
自然風景リラックスチーム懇談や雑談
自社ロゴ入り背景プロ意識外部会議・商談
ファンタジー/アート風創造性クリエイティブ職・イベント配信

💡 背景画像の推奨サイズ・形式

項目名1項目名2項目名3項目名4項目名5
A2B2C2D2
A3B3C3D3E3
A4B4D4E4
A5B5C5D5E5

✨ オリジナル背景を作るコツ

  • Canva や Fotor などのオンラインツールを活用

  • ロゴ透過PNGを重ねるだけでブランド背景に

  • 背景色は 青・グレー系が会議映えしやすい

  • 明るさをやや落とすことで人物が目立つ


🔒 背景が反映されない場合のチェックポイント

原因対処法
Teamsが古い最新バージョンへ更新
GPU設定が無効設定→デバイス→GPUアクセラレーションを有効に
画像形式が非対応JPGまたはPNGに変換
フォルダ権限の問題管理者権限でTeamsを起動

🧩 まとめ:自分らしさを演出して印象アップ!

Teamsの背景カスタマイズは、わずか数クリックで印象を変えることができる便利な機能です。
会議の目的や雰囲気に合わせて背景を使い分ければ、コミュニケーションの質も向上します。
ぜひ自分だけの背景で、次のミーティングをスタイリッシュに演出しましょう!

Oracle「ORA-01652: 一時セグメントを拡張できません」対処手順

Oracleデータベースで大規模なソート処理や集計を行うと、
次のようなエラーが発生することがあります。

ORA-01652: 一時セグメントを拡張できません

このエラーは、一時表領域(TEMP)の空き容量不足によって
SQL実行が中断されたことを意味します。
ここでは、その原因と具体的な対処手順をわかりやすく解説します。


⚠️ エラーの意味

「ORA-01652」は、OracleがSQL実行中に必要な一時領域を確保できなかったことを示すエラーです。
特に次のような処理で発生しやすくなります。

  • 大量データを扱う ORDER BY / GROUP BY / DISTINCT / JOIN

  • インデックス作成集計処理

  • TEMP表領域が固定サイズで、自動拡張が無効


🔍 主な原因

原因詳細
TEMP表領域の容量不足TEMPファイルのサイズが小さい
自動拡張が無効TEMPFILE の AUTOEXTEND が OFF
不要なセッションがTEMPを占有他ユーザーの大規模SQLがTEMPを使用中
SQLの非効率な実行計画インデックス未使用・結合順序の問題

🧭 対処手順

① TEMP表領域の使用状況を確認

現在の使用率を確認します。

または以下のSQLでも確認可能です。


② TEMPファイルを追加または拡張

TEMP領域が不足している場合、ファイルを追加します。

または新しいTEMPファイルを追加します。


③ 不要なセッションを確認・終了

一時領域を使い続けているセッションを確認します。

不要なセッションが確認できた場合は、管理者権限で終了します。


④ SQLをチューニングする

  • インデックスを利用する

  • 不要なDISTINCTやORDER BYを削除

  • 結合順序を見直す

  • 集計処理を段階的に分割

一時領域を減らすため、SQLの実行計画を確認します。


⑤ TEMP表領域を再作成(最終手段)

TEMPファイル破損や肥大化が疑われる場合は、
再作成を検討します。


🌟 まとめ

対処法内容
TEMP使用量確認V$TEMP_SPACE_HEADERやV$SORT_USAGEで確認
TEMP拡張ADD TEMPFILE または RESIZE
セッション整理不要なセッションをKILL
SQLチューニング実行計画の見直し
TEMP再作成最終手段として実施

📘 補足:再発防止策

  • 定期的に V$TEMP_SPACE_HEADER を監視

  • TEMP表領域は AUTOEXTEND ON を推奨

  • 大規模SQL実行前に EXPLAIN PLAN を確認

  • バッチ処理では 分割実行 を検討

Java:SQL接続でつまずかないためのtry-with-resources活用法

JavaでSQL接続を扱うとき、多くの初心者が陥るのが「リソースの解放忘れ」「例外処理の煩雑さ」です。
特に Connection, PreparedStatement, ResultSet の3つは明示的に close() しないと、メモリリークや接続枯渇の原因になります。

この記事では、そんな問題をtry-with-resources構文でスマートに解決する方法を紹介します。


🧱 try-with-resourcesとは?

Java 7以降で導入された構文で、AutoCloseable インターフェースを実装したオブジェクトを
自動的にクローズしてくれる仕組みです。

✅ 従来のコード例(Java 6以前)


👉 冗長で、finally ブロックがネストしやすく、例外の見落としが発生しやすいのが難点です。

🚀 try-with-resourcesを使った改良版


✨ メリットまとめ
項目従来の書き方try-with-resources
リソース解放明示的にclose()が必要自動でcloseされる
コード量冗長スッキリ
例外の安全性finallyで記述ミスの恐れ例外を安全に補足
可読性低い高い

🧠 複数リソースを扱うときのポイント

try(...) の中で複数のリソースを「セミコロン ;」で区切って宣言できます。


順序は重要

最後に開いたリソース (ResultSet) から順に自動クローズされます(LIFO順)。


⚙️ try-with-resourcesとカスタムクラス

自作クラスでも AutoCloseable を実装すれば、
try-with-resources構文で安全に自動クローズが可能です。


出力結果:
処理中...
リソースを解放しました

⚠️ 注意点:例外の隠蔽に注意

もし try 内と close() 内の両方で例外が発生した場合、
try 内の例外が優先され、close() の例外は「抑制された例外」として記録されます。


🔍 まとめ

ポイント内容
構文try(リソース宣言){ ... }
バージョンJava 7以降
対応型AutoCloseableを実装する全クラス
主な利点コード簡略化・例外安全性・リソースリーク防止

💬 おわりに

try-with-resources は見た目以上に強力です。
「リソース管理を明示的に書かない」だけで、コードの信頼性と保守性が大幅に向上します。

特にSQL接続まわりでは、この構文を使わない理由がないほどの必須テクニックです。
今後のJava開発では「標準の書き方」として身につけておきましょう。