SQL:ウィンドウ関数(OVER句)でランキング・累計を計算する

データ分析やレポート作成では、「順位付け」「累計」 のような集計処理がよく登場します。
従来はサブクエリや自己結合を使う必要がありましたが、SQLの ウィンドウ関数(OVER句) を使えば簡潔に記述できます。
この記事では、代表的な使い方と主要DBMSごとの対応状況をサンプル付きで解説します。


🧠 ウィンドウ関数とは?

ウィンドウ関数とは、集計関数に対して「範囲(ウィンドウ)」を指定できる機能です。
通常の SUM()AVG() はグループ全体を集計しますが、OVER() を使うことで「行単位の集計」も可能になります。

🔸 基本構文

関数名(列名) OVER (PARTITION BY 列名 ORDER BY 列名)
役割
PARTITION BYグループを分ける(省略可)
ORDER BY並び順を指定
ROWS BETWEEN ~範囲を細かく指定(任意)

🏅 ランキングを求める

商品の売上データを例に、売上額で順位をつけます。

📘 サンプルテーブル:sales

productcategoryamount
A飲料300
B飲料500
C食品400
D食品200
E食品700

📗 SQL例

📊 実行結果

categoryproductamountrank
飲料B5001
飲料A3002
食品E7001
食品C4002
食品D2003

ポイント

  • 同じカテゴリ内で順位を付与 (PARTITION BY category)

  • 売上が高い順に並び替え (ORDER BY amount DESC)

  • RANK() は同順位がある場合にスキップ(例:1位,1位,3位)


🔢 累計を求める

カテゴリ別に売上の累計を出してみましょう。

📗 SQL例

📊 結果

categoryproductamountrunning_total
飲料B500500
飲料A300800
食品E700700
食品C4001100
食品D2001300

ポイント

  • SUM()OVER() を組み合わせることで行ごとの累積が可能

  • ORDER BY により順序を指定できる

  • PARTITION BY を省略すると全体累計に


🧮 他の代表的なウィンドウ関数

関数説明
ROW_NUMBER()連番(重複なし)を付与
RANK()同順位があるとスキップ(例:1,1,3)
DENSE_RANK()同順位があっても連続(例:1,1,2)
NTILE(n)n等分にグループ分け(例:四分位)
LAG(col, n)n行前の値を取得
LEAD(col, n)n行後の値を取得
SUM(), AVG(), MAX(), MIN()累計・平均などの集計を行単位で

💡 応用例:前回比を計算する

前回の売上からの増減を求めたい場合は LAG() 関数を使用します。



FROM sales;
categoryproductamountprev_amountdiff
飲料B500NULLNULL
飲料A300500-200
食品E700NULLNULL
食品C400700-300
食品D200400-200

🧭 DBMS別のウィンドウ関数対応表

DBMS対応状況対応バージョン備考
Oracle Database◎ 完全対応8i 以降ウィンドウ関数発祥の実装。機能最も豊富
PostgreSQL◎ 完全対応8.4 以降PARTITION, ORDER, RANGE句など全対応
MySQL○ 部分対応8.0 以降8.0から正式対応(それ以前は非対応)
SQL Server◎ 完全対応2012 以降LAG/LEADなどもサポート
SQLite○ 部分対応3.25 以降一部関数は制限あり(NTILEなど)
MariaDB△ 限定対応10.2 以降SUMなどは対応、LAG/LEADは制限あり
IBM Db2◎ 完全対応9.7 以降分析関数として強力なサポートあり
Snowflake / BigQuery◎ 完全対応最新クラウドDWH系でもネイティブ対応

補足

  • 旧バージョンのMySQL(5.x系)ではウィンドウ関数が非対応のため、サブクエリで代替が必要。

  • PostgreSQLとOracleはROWS BETWEENなどの範囲指定も細かく制御可能。

  • BigQueryはOVER()句のほかQUALIFY句でフィルタリングが可能。


🔍 まとめ

観点内容
機能グループ単位での行ごとの集計・順位付け
主な用途累計・ランキング・前回比・順位比較
メリットサブクエリ不要・可読性向上・パフォーマンス改善
対応DBOracle, PostgreSQL, SQL Server, MySQL 8+, BigQueryなど

ウィンドウ関数は、分析SQLの最重要機能といっても過言ではありません。
集計・比較・順位などを自在に扱えるようになれば、レポート作成の幅が大きく広がります。

🧩 Oracle「ORA-01000: 最大オープン・カーソル数を超えました」対処手順

🔍 エラー概要

項目内容
エラーコードORA-01000
メッセージ最大オープン・カーソル数を超えました
発生原因開いたカーソルをクローズせずに処理を繰り返した結果、open_cursors の上限に達した
対応優先度高(アプリケーション修正・設定見直しが必要)

🧠 原因と仕組み

Oracle では、SQL 実行時に「カーソル」という内部ハンドルを使用して SQL 文を管理します。
アプリケーションが PreparedStatementResultSet を閉じずに再利用し続けると、未解放のカーソルが蓄積し、open_cursors パラメータで設定された上限値を超えた時点で ORA-01000 が発生します。


🧩 よくある原因パターン

原因詳細
JDBCのクローズ漏れResultSet や Statement を close() していない
ループ内で毎回 SQL を preparePreparedStatement を都度生成して再利用していない
コネクションプールの設定ミスコネクションが正しく解放されず、カーソルが残存
長時間実行バッチ同一セッションで大量SQLを連続実行してカーソルが累積
外部ライブラリのバグORM(MyBatis、Hibernate等)でのカーソル管理不具合

🧭 対処法(順序付き)

手順対処内容
アプリケーションコードを点検(ResultSet, Statement, Connection を確実に close)
try-with-resources 構文を使用して自動クローズ化(Java7以降推奨)
open_cursors パラメータ値を確認(show parameter open_cursors;)
必要に応じて上限を引き上げ(例:ALTER SYSTEM SET open_cursors = 1000 SCOPE=BOTH;)
v$open_cursor ビューで調査(どのSQLが残っているか確認)

🔧 調査SQL例 


💡 Javaでの修正例(try-with-resources構文)

✅ これにより、ResultSetPreparedStatementConnection が自動的にクローズされます。


⚙️ open_cursors の推奨設定値

システム規模推奨値備考
開発・検証環境300〜500検証負荷に応じて柔軟に設定
小〜中規模業務システム500〜1000通常アプリでは十分
大規模バッチ・Webサービス1000〜2000コネクションプール利用時に余裕をもたせる

🚨 注意点

  • open_cursors の値を単純に上げるだけでは根本解決になりません。
    アプリケーションでのクローズ処理修正が最優先

  • 定期的に v$open_cursor を監視することで、リークを早期発見できます。


✅ まとめ

観点内容
発生原因カーソルの未クローズや過剰生成
一時対応open_cursors の増加
根本対応コード修正(try-with-resources等)
チェック方法v$open_cursor / v$sesstat ビュー
再発防止コーディング規約・静的解析の導入

サイトの表示速度が遅い原因はこれ!画像の最適化で劇的改善

ブログなどの「サイトが重い」「表示に時間がかかる」と感じていませんか?
実は、その原因の1つに 画像の最適化不足 にあります。
どんなに優れたデザインや記事内容でも、ページの読み込みが遅いと離脱率が上がり、SEO評価も下がります。

この記事では、画像の最適化でブログの表示速度を劇的に改善する方法を、初心者でもできる手順で解説します。


🚨 表示速度が遅くなる主な原因

原因内容
画像サイズが大きい高解像度の画像をそのままアップロードしている
フォーマットが古いJPEGやPNGを多用し、WebPなどの軽量形式を使っていない
遅延読み込みが未設定ページ内の全画像を一度に読み込んでいる
キャッシュ未設定同じ画像を毎回サーバーから再取得している
CDN未使用地理的に離れたユーザーへの配信が遅れている

これらの要因を1つずつ対策すれば、PageSpeed Insightsのスコアが90点以上も狙えます。


💡 改善策①:画像を最適なサイズに圧縮する(WordPress対応)

ブログの表示速度改善において最も効果的なのが画像圧縮とリサイズです。
特にスマホ撮影画像やAI生成画像は数MBになることもあるため、1枚100KB以下を目指しましょう。


🔧 方法①:外部ツールで手動圧縮

ツール名特徴URL
TinyPNGPNG・JPEG対応。画質を保ちながら最大80%圧縮https://tinypng.com
Squoosh(Google製)WebP変換や画質比較ができるhttps://squoosh.app
ImageOptim(Mac)複数画像をドラッグ&ドロップでまとめて圧縮https://imageoptim.com

コツ:

  • 不要に大きい画像は横幅1200px程度にリサイズ

  • JPEGは写真向き、PNGは透過画像向き

  • 画質80%前後に設定すると肉眼ではほぼ違いなし


⚙️ 方法②:WordPressプラグインで自動圧縮

WordPressで作成されているサイトなら画像のアップロード時に自動圧縮してくれるプラグインを使えば、毎回手動で調整する必要がありません。
更新頻度の高いブログや、複数人で運営しているサイトに最適です。

プラグイン名主な機能無料範囲備考
EWWW Image Optimizer自動圧縮・WebP変換・既存画像一括最適化無制限(ローカル圧縮)高機能で安定
Imagify3段階圧縮(Normal/Aggressive/Ultra)+WebP対応月25MBまで無料操作が簡単
ShortPixelWebP+AVIF変換対応。画質維持率が高い月100枚まで無料自然な仕上がり
Smush一括最適化・遅延読み込み・CDN対応無料で5MB/画像定番&安心

🔹 EWWW Image Optimizer の設定例

  1. プラグインをインストールして有効化

  2. 「設定」→「EWWW Image Optimizer」を開く

  3. 「画像の自動最適化」を有効にする

  4. 「WebP変換」をONに

  5. 「既存画像を一括最適化」でライブラリ全体を処理

💡 ポイント: 初回は時間がかかりますが、次回以降は差分のみ圧縮されます。


💡 改善策②:WebP形式に変換する

WebPはGoogleが開発した次世代画像フォーマットで、JPEGより最大50%軽量化できます。
見た目の劣化もほとんどなく、主要ブラウザはすべて対応済みです。

プラグイン名主な機能
EWWW Image Optimizer自動WebP変換+フォールバック機能
Imagifyアップロード時に自動変換+圧縮
ShortPixelWebPとAVIFを両方生成

導入のメリット:

  • 軽量化によりLCP(Largest Contentful Paint)が改善

  • モバイルでの読み込み体感速度が向上

  • SEOスコアにも良い影響


💡 改善策③:遅延読み込み(Lazy Load)を有効化

ページを開いた瞬間に全画像を読み込む必要はありません。
**Lazy Load(レイジーロード)**を有効化すれば、
「ユーザーの画面に表示されたタイミングで読み込む」ようになります。

設定方法

  • WordPress 5.5以降:標準で loading="lazy" が自動付与

  • プラグイン利用例:

    • a3 Lazy Load

    • WP Rocket(有料)

    • Smush(画像圧縮+遅延読み込み対応)

💬 Lazy Loadを導入するだけで、初期ロード時間を30〜40%短縮できる場合があります。


💡 改善策④:CDNを活用する

CDN(Content Delivery Network)は、
世界中のサーバーに画像をキャッシュして、
ユーザーの位置に近いサーバーから配信します。

サービス名特徴
Cloudflare無料プランでも画像CDNが利用可能
Jetpack BoostWordPress専用CDN(Photon)対応
AWS CloudFront高速&安定。企業向けに最適

💡 改善策⑤:キャッシュプラグインを活用

画像最適化とあわせて、HTMLやCSSもキャッシュ化するとさらに高速化します。

プラグイン名特徴
LiteSpeed Cache画像圧縮・WebP・CDN・Lazy Load全部入りで高性能
WP Fastest Cacheシンプル操作で安定した効果を発揮
W3 Total Cache細かなチューニングが可能で上級者向け

🧠 Tip: LiteSpeedサーバー環境なら、LiteSpeed Cache一択でOKです。


🧪 改善効果の実例

項目最適化前最適化後改善率
トップページ画像10枚約6.2MB約1.8MB約70%削減
PageSpeed Insightsスコア63点91点+28ポイント改善
読み込み速度(3G環境)5.8秒2.1秒約3.7秒短縮

🧭 まとめ:画像最適化は“SEOとUX”の両方に効く!

  • 📉 無駄なデータ転送を削減 → 表示速度アップ

  • 📈 Core Web Vitals改善 → SEO評価向上

  • 😍 ユーザー離脱率を下げて滞在時間を増加

画像最適化=ブログの信頼性向上です。
一度設定しておけば、自動で軽量化される仕組みが完成します。
今日からあなたのブログも、「速くて軽い」理想のサイトへ変わります!

Java初心者必見!Optionalでnullチェックを安全に行う方法【サンプル付き】

Javaで避けて通れないのが「nullチェック」。
しかし、if文を多用するとコードが読みにくくなり、思わぬNullPointerExceptionが発生することもあります。
そんな悩みを解消してくれるのが Optionalクラス です。

本記事では、Optionalを使った安全でスマートなnullチェックの方法を、サンプルコード付きで分かりやすく解説します。


💡 Optionalとは?

Optionalは、Java 8で追加されたクラスで、
nullの代わりに値の有無を明示的に扱う」ためのラッパーです。

Optionalは「値がある」か「空(empty)」かを明確に区別できるため、
if (obj != null) のような古い書き方を減らせます。


✅ よくあるnullチェックの問題例

この書き方は一見安全ですが、
複数のフィールドをネストすると次のようにネスト地獄に陥ります。

→ これをスマートに書けるのがOptionalです。


🧩 Optionalを使った安全な書き方

これだけで「nullがあれば自動的にスキップ」されます。
つまり、nullチェックをネストせずに安全に値を取り出せるのです。


🔍 Optionalの主なメソッド一覧

メソッド説明使用例
of()null禁止でOptionalを作成Optional.of("Hello")
ofNullable()null許可でOptionalを作成Optional.ofNullable(obj)
isPresent()値が存在するか判定if(opt.isPresent())
ifPresent()値がある場合に処理を実行opt.ifPresent(System.out::println)
orElse()値がない場合のデフォルト値を設定opt.orElse("default")
orElseGet()遅延生成のデフォルト値opt.orElseGet(() -> "default")
orElseThrow()値がない場合に例外を投げるopt.orElseThrow()

🧠 orElseとorElseGetの違い

比較項目orElse()orElseGet()
評価タイミング常に評価値が空のときのみ評価
パフォーマンス無駄な生成が起こる場合あり必要なときだけ生成
opt.orElse(createDefault())opt.orElseGet(() -> createDefault())

💬 ポイント:
createDefault() のような重い処理を含む場合は、orElseGet()を使う方が効率的です。


🧾 サンプルコード全体

✅ 出力結果:

名前が未設定です。

🚀 Optionalを使うメリットまとめ

メリット内容
可読性向上if文のネストを削減できる
安全性向上NullPointerExceptionのリスクを軽減
関数型スタイルmap, filter, flatMapなどと組み合わせ可能
メソッドチェーン処理の流れを1行で表現できる

⚠️ 注意点:Optionalは「すべてに使う」ものではない

  • フィールド変数に使うと逆に可読性が下がる

  • シリアライズ対象(例:エンティティクラス)には不向き

  • 「戻り値専用」として使うのが基本スタイルです。


🧭 まとめ

Optionalは「nullチェックを明示的に表現する」ための便利な仕組みです。
使い方を覚えることで、より安全で読みやすいJavaコードが書けるようになります。

🪟 Windows 11:PINやパスワードを忘れたときのリセット方法

Windows 11では、MicrosoftアカウントやPINコードを使ってログインするのが一般的です。
しかし、「PINを忘れた」「パスワードを思い出せない」といったトラブルは誰にでも起こります。
この記事では、Windows 11でサインイン情報をリセットする方法をわかりやすく解説します。

この記事でわかること

  • PINやパスワードを忘れたときのリセット手順

  • ローカルアカウント・Microsoftアカウントの違い

  • トラブル時に試すべき順序と注意点


🧭 1. まず確認!どのタイプのアカウントか?

アカウント種別特徴リセット方法
MicrosoftアカウントOutlook、OneDriveなどと連携Web経由でリセット可能
ローカルアカウントPC単体で使うオフラインでパスワード変更可能
会社や学校アカウント(Azure AD)組織管理下のPC管理者またはIT部門に依頼

確認方法(通常時):
「設定」→「アカウント」→「あなたの情報」→「アカウントの種類」で判別できます。
サインインできない場合は、ログイン画面に「Microsoftアカウントでサインイン」と出ていればオンライン型です。


🔑 2. PINを忘れたときのリセット手順

✅ サインイン画面から再設定する

  1. ログイン画面で「PIN(I forgot my PIN)」をクリック

  2. Microsoftアカウントのパスワードを入力

  3. 登録しているメールまたは電話に確認コードが届く

  4. 新しいPINを設定して完了

💬 補足:PINはローカルPCにのみ保存されるため、他のデバイスには影響しません。


🌐 3. Microsoftアカウントのパスワードを忘れた場合

手順内容
スマホや別PCから https://account.live.com/password/reset にアクセス
登録メールまたは電話番号を入力
セキュリティコードを受け取り入力
新しいパスワードを設定

ポイント:

  • セキュリティ情報を事前に設定していないとリセットが難しくなります。

  • その場合、「追加情報の提供を求める」フォームから本人確認が必要です。


💻 4. ローカルアカウントのパスワードを忘れた場合

方法1:パスワードリセットディスクを使う

以前に作成したUSBキーを挿して「パスワードをリセット」を選択。
作成していない場合は、次の方法へ。

方法2:セーフモード+コマンドプロンプトで再設定

※上級者向けの手順です。

  1. 電源ボタンを押して再起動 → ログイン画面で「Shift」+「再起動」

  2. 「トラブルシューティング」→「詳細オプション」→「コマンド プロンプト」

  3. 以下を入力して新しいユーザーを作成


  1. 再起動後、「NewUser」でログインし、既存アカウントのパスワードを変更。


🧱 5. サインインオプションからPINを再設定する方法(設定から)

手順操作内容
「設定」→「アカウント」→「サインインオプション」
「PIN(Windows Hello)」を選択
「削除」→「新しいPINを設定」
再ログイン後にPINを再登録

⚠️ 一部環境では「この設定は組織によって管理されています」と表示され、管理者権限が必要な場合があります。


🧠 6. トラブルを防ぐための事前対策

対策項目内容
セキュリティ情報の登録Microsoftアカウントに電話番号・予備メールを登録
PINのバックアップメモ帳やパスワードマネージャーに控える
ローカルアカウントの予備作成管理者権限のバックアップユーザーを追加
パスワードリセットディスクの作成「コントロールパネル」→「ユーザーアカウント」から作成可能

🧩 7. どうしてもログインできない場合の最終手段

  • **リカバリドライブ(USB)**から起動し、Windowsを再インストール

  • 重要データがある場合は、別PCでドライブを読み取り救出可能

  • 組織PCの場合は、IT管理者に連絡


🚀 まとめ

状況リセット方法注意点
PINを忘れた「PINを忘れた」から再設定Microsoftアカウント認証が必要
Microsoftパスワードを忘れたWebでリセットセキュリティ情報が必須
ローカルアカウントのパスワードを忘れたセーフモードや別ユーザー上級者向け手順

🧠 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
単純作業を何倍も早く終わらせられるショートカットです。
今日からぜひ試してみてください!