Java FX インストーラーを作成する

Java FXでJavaで手軽にGUIアプリを作れますが、いざそれを配布しようとすると少しハードルが高いです。少しトリッキーですが成功した実例をもとに手順を紹介します。

使用したツールは以下の通りです。Windows環境です。

  • pleiades-2025-03-ultimate-win-64bit-jre_20250319(Java開発、作業用)
  • openjdk-22.0.2_windows-x64_bin(Java開発、作業用)
  • openjfx-23.0.1_windows-x64_bin-sdk(JavaFX開発、作業用)
  • openjfx-23.0.1_windows-x64_bin-jmods(JavaFX実行用モジュール)
  • wix314(jpackageから使用される)
  • innosetup-6.4.2(インストーラー作成ツール)

システム環境変数設定

  • JAVA_HOME=C:\pleiades\2025-03\java\jdk-22.0.2(jdkを置いた場所)
  • WIX=C:\Program Files (x86)\WiX Toolset v3.14\(WIXインストール時に書き込まれている)
  • path=%JAVA_HOME%\bin(リストに追加)(Javaコマンド実行用)

以下手順です

まずはJava FXのプロジェクトを作ります。

eclipseでMavenを使ってJava FXアーキタイプ(ひながた)から作成します

プロジェクトができてビルドまでできました。このまま実行すると

アプリが動作します。

インストーラーを作成する。

プロジェクトをエクスポートします

jarファイルとlibフォルダが出力されます

次にカスタムJREを作成します。上図のパス上からコマンドラインを開きjlinkコマンドを実行します

jlink --module-path "C:\pleiades\2025-03\java\javafx-jmods-23.0.1" ^
--add-modules java.base,javafx.controls,javafx.fxml,javafx.graphics,java.management,java.naming ^
--output custom-jre

コマンドラインからjpackageコマンドを実行してMSI インストーラーを作成します。

jpackage --type msi ^
--input . ^
--main-jar jfxsample.jar ^
--main-class jp.co.abridge.jfxsample.App ^
--runtime-image custom-jre ^
--name JavaFXSample ^
--dest result

resultフォルダが出力されて中にmsiファイルがあります。これを実行してアプリをインストールします

インストールされました。ただしこれは仮のインストールでこれをもとに正式なインストーラーを作成します

Inno Setup を使って日本語インストーラーを作成する

Inno Setupを起動して以下のようなスクリプトを実行します

[Setup]
AppName=JavaFxSample
AppVersion=1.0
DefaultDirName={pf}\JavaFxSample
OutputBaseFilename=JavaFxSampleInstaller
DisableDirPage=false
CreateAppDir=true
PrivilegesRequired=admin
Compression=lzma
SolidCompression=no
UninstallDisplayIcon="{app}\JavaFxSample.exe"

[Languages]
Name: "Japanese"; MessagesFile: "compiler:Languages\Japanese.isl"

[Files]
Source: "C:/Program Files/JavaFxSample/app/*"; DestDir: "{app}/app"; Flags: ignoreversion
Source: "C:/Program Files/JavaFxSample/runtime/*"; DestDir: "{app}/runtime"; Flags: recursesubdirs
Source: "C:/Program Files/JavaFxSample/JavaFxSample.exe"; DestDir: "{app}"; Flags: ignoreversion

[UninstallDelete]
Type: filesandordirs; Name: "{userappdata}\JavaFxSample"

~/Documents/Outputフォルダにファイルが出力されます。これが最終のインストーラーファイルです

インストーラーを実行すると

インストールされて、起動すると

アプリが動作します

以上です。

Laravel 12で追加された一部新機能について

Laravel 12の新機能について

この記事では、2025年2月にリリースされた Laravel 12 の一部新機能について紹介します。

Laravel 12

Laravel 12は、大きな変更というよりも改良がいくつか含まれているので、今回はその中の一部を紹介します。

1. セキュリティ強化 : secureValidate()

このメソッドが追加されたことで、フォームからの入力チェックがより安全になりました。

$request->secureValidate([
'password' => ['required', 'min:8', 'strong'],
]);

バリデーション(validation)とは、ユーザーが入力したデータが正しいかどうかをチェックする仕組みです。

例えば

  • メールアドレスの形式が正しいか?
  • パスワードの長さは十分か?
  • 必須項目が空になっていないか?
    など。

Laravelでは、従来から $request->validate() を使ってこのバリデーションを行ってきました。

secureValidate() とは?

secureValidate() は、Laravel 12で新たに追加されたメソッドで、従来の validate() と同じように使えますが、セキュリティに配慮したルール(例:強力なパスワード)を簡単に適用できるのが特徴です。

$request->secureValidate([
'password' => ['required', 'min:8', 'strong'],
]);

この例の意味

 

strongルールの意味とは?

strong というルールは、安全なパスワードを推奨するための組み込みルールで、Laravel 12において以下のようなチェックを行うことができます。

  • 英大文字、小文字、数字、記号の組み合わせが含まれているか
  • 辞書にあるような簡単な単語を避けているか
  • 繰り返しや連番(”1234″ や “aaaa”)が含まれていないかこうしたチェックを自前で書くのは大変ですが、strongルールを使えば一発で適用できます。

なぜ secureValidate() を使うべきか?

  • セキュリティ対策が標準で強化される
  • 独自のカスタムバリデーションを定義しなくてよくなる
  • コードがシンプルで読みやすい

2. クエリがもっと読みやすくなる nestedWhere() が追加された

nestedWhere() は複雑な条件のクエリをより直感的・読みやすく記述できるようにするための新機能です。

そもそも WHERE 条件って何?

Laravelのクエリビルダでは、where() を使って条件付きのデータを取得できます。

$users = User::where('status', 'active')->get();

条件が複雑になってくるとwhere 条件のネストが必要になり、関数の中に関数が入るためとても難解です。

$users = User::where(function ($query) {
$query->where('age', '>', 25)
->orWhere('city', 'Tokyo');
})
->where('status', 'active')
->get();

nestedWhere() の登場

Laravel 12では、このネストを簡単に書けるようにする nestedWhere() が追加されました。

$users = User::where('status', 'active')
->nestedWhere('age', '>', 25, 'or', 'city', 'Tokyo')
->get();

普通のSQLに変換するとこうなります。

WHERE status = 'active'
AND (age > 25 OR city = 'Tokyo')

nestedWhere() の構文

->nestedWhere($column1, $operator1, $value1, $boolean, $column2, $value2)

使いどころ

  • AND (…) や OR (…) などの複雑な論理条件を含むクエリを書くとき
  • ネストの書き方が苦手な初心者
  • チーム開発で読みやすいコードを書きたいとき

まとめ

Laravelは初心者にもやさしく使いやすい機能が満載なので、これからWebアプリを始めるならおすすめです。

初心者にも分かりやすいPHP言語のフレームワークとなっているので、まずは気軽に触ってみて、その便利さを体感してみてください!

Figmaのアイコンプラグイン『Iconify』

『Iconify』は、FontAwesomeやMaterial Design Iconsなど、有名なサービスのアイコンをはじめ、150以上のアイコンセットを一括検索して配置できるFigmaのプラグインです。

→Iconify

 

例えば「user」で検索すると、全アイコンセットからuserアイコンを抽出してくれます。

 

追加したいアイコンを選択すると、サイズと色を設定できます。

 

 

ライセンスはアイコンセットによって違いますが、それぞれ確認できます。

 

 

 

 

 

 

さくっとアイコンを選んで配置できるので、プロトタイプをイイ感じに早く仕上げることができますね。

チャットボット構築サービス「Dialogflow」を使ってみた

チャットボットを調べる機会があったので「Dialogflow」でサービスを作ってWEBサイト上で動かすまでをまとめてみました。

1.「Dialogflow」サイトへ行き(GoogleアカウントでDialogflowを開始して)CREATE AGENTします。

2.AGENT情報を入力します。名称と言語とタイムゾーンを入力してCREATE

3.Intents画面になるのでCREATE INTENTS

4.Intentsのタイトルを入力してSAVE

5.Training phrasesとResponsesを入力してSAVE

6.右のパネルでテストしてみます。応答がありました

7.動作が確認できたのでチャットボットをWEBサイトに設置します。IntegrationsのページからDialogflow Messangerを選択します。

8.htmlに張り付けるソースコードが表示されるのでコピーします

9.適当さWEBサイト(今回は私が課題制作しているlocalhost上のWEBサイト)を用意します

10.該当のhtmlソースにコピーしたスクリプトを貼り付けます

11.WEB画面を開いてみます。チャットボットが現れます

12.質問すると応答があります

以上です。

バス移動・通勤を便利にするサービスを構築している中でチャットボットを+αの便利機能として付加させてみました。今後はIntentsを増やして対応する路線、停留所を増やす。Entity(同義語登録)を増やして音声入力に対応する。ほかサービスとの連携。など拡充していきます。

Laravelの不具合をサクッと解決!

Laravelを使っていると、開発中にエラーや不具合にぶつかることがあります。ここでは、よくある問題とその解決方法をわかりやすく紹介します。

1. Class “App\Http\Controllers\XxxController” not found

原因

コントローラーが見つからないときは、名前空間のミスやファイルの配置ミスが原因のことが多いです。

解決策

  • app/Http/Controllers/ にファイルがあるか確認。
  • namespace App\Http\Controllers; を追加。
  • composer dump-autoload を実行。
composer dump-autoload

2. .env の変更が反映されない

原因

.env を編集しても変更が反映されないのは、キャッシュが影響している可能性が高いです。

解決策

  • キャッシュをクリアする。
php artisan config:clear
php artisan cache:clear
  • サーバーを再起動する。
php artisan serve --port=8000

3. マイグレーションエラー (`SQLSTATE[HY000] [1045] Access denied for user`)

原因

データベースの接続情報が間違っている可能性あり。

解決策

  1.  .env  の DB_HOST ,  DB_DATABASE ,  DB_USERNAME ,  DB_PASSWORD  を確認。
  2. 変更後、以下のコマンドで設定を反映。
    1. php artisan config:clear
      php artisan migrate
  3. mysql -u ユーザー名 -p  で手動ログインし、アクセス権限をチェック。
     

4. 419 Page Expired エラー

原因

CSRFトークンが送信されていないか、セッションが切れている可能性。

解決策

  • フォームに  @csrf  を追加。
<form action="/submit" method="POST">
    @csrf
    <input type="text" name="name">
    <button type="submit">送信</button>
</form>
  • セッションをクリア。
php artisan session:clear
  •  config/session.php  の  SESSION_DRIVER  を  file  に設定。

5. Route [xxxx] not defined.

原因

指定したルートが定義されていない可能性あり。

解決策

  •  routes/web.php  や  routes/api.php  を確認。
  • ルートを適切に記述。
Route::get('/dashboard', [DashboardController::class,'index'])->name('dashboard');
  • ルートのキャッシュをクリア。
php artisan route:clear

まとめ

Laravelでよくあるエラーとその解決策を紹介しました。エラーが発生したら、

  1. .env 設定やキャッシュを確認
  2. コマンドを実行して設定を更新
  3. 公式ドキュメントもチェック

この流れで対応すれば、大体の問題は解決できます!

PANTONE COLOR OF THE YEAR 2025はMocha Mousse(モカムース)

PANTONEからカラーオブザイヤー2025が発表されました。
PANTONE COLOR OF THE YEAR 2025

2025年のトレンドカラーは「PANTONE 17-1230 Mocha Mousse(モカムース)」。
その名の通り、美味しそうなチョコレート色ですね。

思慮深い贅沢さを表現しています。洗練されていて豪華でありながら、同時に気取らないクラシックなPANTONE 17-1230 Mocha Mousse は、控えめで落ち着いたブラウンのイメージから、野心的で贅沢なブラウンのイメージまで、私たちのブラウンのイメージを広げています。
まろやかなブラウンの色合いに注目しています。その色調が持つ豊かさと感覚的で心地よい暖かさは、快適さを求める気持ちや、贈ったり他の人と共有したりできるシンプルな喜びへの耽溺にまで広がります。

カラーデータ

HEX #A47864
sRGB 164, 120, 100
LAB 54.79, 17.05, 18.56

Photoshopのカラーピッカーではこんな感じです。

PANTONE CONNECT

Mocha Mousseを元にしたカラーパレットやシェードも用意されています。
PANTONE CONNECT(要会員登録)

LaravelのPipelineについて

今回はLaravelのPipelineについて調べてみました。
Laravelの公式ドキュメントには以下のように記されています。

LaravelのPipelineファサードは、一連の呼び出し可能なクラス、クロージャ、またはcallableを通して与えられた入力を
「パイプ」する便利な方法を提供し、各クラスに入力を検査または修正する機会を与え、パイプライン内の次のcallableを呼び出します

簡単にざっくり説明すると「Pipelineに何らかのデータを入れてそれに対して指定したクラスの処理をさせるもの」です。

基本となるPipelineのコードは以下の通りです。

Pipeline::send(/* 処理させたいクラスに渡すデータ */)
    ->through(/* 処理させたいクラスの配列 */)
    ->then(/* 最終処理 */);

処理させたいクラスに渡すデータ
処理させたい対象のデータです。
文字列やQuery、オブジェクトなどなんでも渡せます。

処理させたいクラスの配列
sendメソッドで渡されたデータを処理させたいクラスを以下のように配列形式で指定します。

Pipeline::send(/* 処理させたいクラスに渡すデータ */)
    ->through([
        ClassA::class,
        ClassB::class,
        ClassC::class,
    ])
    ->then(/* 最終処理 */);

ClassA → ClassB → ClassCの順番で処理が実行されます。

最終処理
thenメソッドに実装された処理は必ず実行される処理です。
実行されるタイミングはthroughメソッドの処理が完了した後です。

実装例

class Pipeline
{
    public function handle()
    {
        $string = "abcde";
        $string = Pipeline::send($string)
            ->through([
                SubStr::class,
                AddString::class,
            ])
            ->thenReturn();
        var_dump($string);
    }
}
class SubStr
{
    public function handle($string, $next)
    {
        $string = substr($string, 1, 4);
        return $next($string);
    }
}
class AddString
{
    public function handle($string, $next)
    {
        $string = $string . "123";
        return $next($string);
    }
}

このような実装をすると先にSubStrクラスで2文字目〜4文字のみ取得され、”bcde”が$stringにセットされます。
次にAddStringクラスで”bcde”の後ろに”123″が文字列結合され最終的に「bcde123」が返されます。

以上、Pipelineが何か気になり調べた結果をまとめてみました。

たった1行でローディングアニメーションが実装できるCSSジェネレーター

HTML1行だけで、様々なローディングアニメーションを実装できるCSSジェネレーターを紹介します。
CSS Loaders

よくありそうなシンプルなものから、CSSだけで表現されているとは思えない複雑なものまで、バラエティ豊かに用意されています。

使い方はとても簡単。
HTMLはたった1行です。

<div class="loader"></div>

 
cssは対象をクリックしてコピペするだけ。

中身はこんな感じ。

.loader {
  width: 50px;
  --b: 8px;
  aspect-ratio: 1;
  border-radius: 50%;
  background: #514b82;
  -webkit-mask:
    repeating-conic-gradient(#0000 0deg,#000 1deg 70deg,#0000 71deg 90deg),
    radial-gradient(farthest-side,#0000 calc(100% - var(--b) - 1px),#000 calc(100% - var(--b)));
  -webkit-mask-composite: destination-in;
          mask-composite: intersect;
  animation: l5 1s infinite;
}
@keyframes l5 {to{transform: rotate(.5turn)}}

 
CSSなので、色を変えるのも簡単です。

AWSの機能について調べてみた

【AWSの機能について調べてみた】

 

 

今回は、awsって沢山のサービスを提供しているということを知ったので、一部ではありますが、機能をまとめていこうと思います。

目次
――――――――――――――――――――――――――――
1 AWSとは
2 各機能について
3 まとめ
――――――――――――――――――――――――――――

1.AWSとは
AWSとは、【Amazon Web Services】の略称で、Amazonが提供しているクラウドサービスのことです。
公式サイト→https://aws.amazon.com/jp/what-is-aws/

2.各機能について
DirectConnect
・AWS Direct Connect は、標準のイーサネット光ファイバケーブルを介して内部ネットワークを AWS Direct Connect ロケーションにリンクします。ケーブルの一方の端はルーターに接続され、もう一方の端は AWS Direct Connect ルーターに接続されています。この接続を使用すると、パブリック AWS サービス (Amazon S3 など) または Amazon VPC への仮想インターフェイスを直接作成し、ネットワークパス内のインターネットサービスプロバイダーをバイパスできます。 AWS Direct Connect ロケーションは、関連付けられているリージョン AWS の へのアクセスを提供します。パブリックリージョンで単一の接続を使用するか、他のすべてのパブリックリージョンでパブリック AWS サービス AWS GovCloud (US) にアクセスできます。

TransitGateway
・Transit Gateway は、仮想プライベートクラウド (VPC) とオンプレミスネットワークを相互接続するために使用できるネットワークの中継ハブです。クラウドインフラストラクチャがグローバルに拡張されるにつれて、リージョン間ピアリングはAWSグローバルインフラストラクチャ AWS データセンター間のすべてのネットワークトラフィックは、物理層で自動的に暗号化されます。

EC2
・Amazon Elastic Compute Cloud (Amazon EC2) は、Amazon Web Services (AWS) クラウドでオンデマンドでスケーラブルなコンピューティング能力を提供します。Amazon EC2 を使用するとハードウェア コストが削減されるため、アプリケーションをより迅速に開発および展開できます。Amazon EC2 を使用すると、必要な数の仮想サーバーを起動したり、セキュリティとネットワークを構成したり、ストレージを管理したりできます。月次または年次プロセスや Web サイト トラフィックの急増など、コンピューティング負荷の高いタスクを処理するために、容量を追加 (スケールアップ) できます。使用量が減ったら、容量を再度削減 (スケールダウン) できます。

RDS
・Amazon Relational Database Service (Amazon RDS) は、AWS クラウドでのリレーショナル データベースのセットアップ、運用、拡張を容易にする Web サービスです。業界標準のリレーショナル データベースにコスト効率に優れたサイズ変更可能な容量を提供し、一般的なデータベース管理タスクを管理します。

EFS

・Amazon Elastic File System (EFS) は、サーバーレスで完全に伸縮自在なファイルストレージを提供するように設計されており、ストレージ容量とパフォーマンスをプロビジョニングまたは管理しなくても、ファイルデータの共有ができる仕組みになっています。AWS のサービスおよびオンプレミスリソースで使用でき、アプリケーションを中断することなくオンデマンドでペタバイトまで拡張できるように構築されています。

CloudWatch

・Amazon CloudWatch は、Amazon Web Services (AWS) リソースと、AWS で実行されているアプリケーションをリアルタイムでモニターリングします。CloudWatch を使用してメトリクスを収集し、追跡できます。メトリクスとは、リソースやアプリケーションに関して測定できる変数です。
CloudWatch のホームページには、使用している AWS の各サービスに関するメトリクスが自動的に表示されます。さらに、カスタムダッシュボードを作成してカスタムアプリケーションのメトリクスを表示したり、選択したメトリクスのカスタムコレクションを表示したりできます。
メトリクスを監視し、しきい値を超過したときに通知を送信したり、モニターリングしているリソースを自動的に変更したりするアラームを作成できます。例えば、Amazon EC2 インスタンスの CPU 使用率およびディスク読み取り/書き込みをモニターリングし、そのデータを基に、増加する負荷を処理する追加のインスタンスを起動すべきかどうかを判断します。また、このデータを使用して、十分利用されていないインスタンスを停止することで、費用を節約することができます。
CloudWatch により、システム全体のリソース使用率、アプリケーションパフォーマンス、およびオペレーションの状態において可視性を得ることができます。

Route 53
・Amazon Route 53 は、可用性と拡張性に優れたドメインネームシステム (DNS) ウェブサービスです。Route 53 を使用すると、ドメイン登録、DNS ルーティング、ヘルスチェックの 3 つの主要な機能を任意の組み合わせで実行できます。

WAF
・WAF(Web アプリケーションファイアウォール)とは、Web アプリケーションの通信をフィルター、監視、ブロックするためのソフトウェアまたは、ハードウェアのセキュリティ対策です。一般のファイアウォールや IDS/IPS との違いは、アプリケーションレベルで通信の中身を解析し、特定の条件にマッチする通信を検知・遮断する点です。WAF の代表的な用途には、SQL インジェクション、クロスサイトスクリプティングなど、アプリケーションの脆弱性を悪用した攻撃の遮断やアプリケーション層の DDoS 対策、不正なボットによるアクセスの遮断などがあります。

S3
・Amazon Simple Storage Service (Amazon S3) は、業界をリードするスケーラビリティ、データ可用性、セキュリティ、パフォーマンスを提供するオブジェクト ストレージ サービスです。あらゆる規模と業種のお客様が Amazon S3 を使用して、データ レイク、Web サイト、モバイル アプリケーション、バックアップと復元、アーカイブ、エンタープライズ アプリケーション、IoT デバイス、ビッグ データ分析など、さまざまなユースケースで任意の量のデータを保存および保護できます。Amazon S3 には管理機能が用意されており、特定のビジネス、組織、コンプライアンスの要件を満たすようにデータへのアクセスを最適化、整理、構成できます。

3.まとめ
AWSには、今回の記事でまとめたサービス以外にもまだまだあります。
気になる方はご自身でも調べてみてはどうでしょうか。

【Laravel 11について】

今回は、2024年3月12日にリリースされた、Laravelのバージョン11について軽くまとめていきたいとおもいます。
公式サイト:https://readouble.com/laravel/11.x/ja/

目次
――――――――――――――――――――――――――――
① 変更点は?
② まとめ
――――――――――――――――――――――――――――

①変更点は?
・まず、welcomeページが大きく変わりました!!
※黒と赤がベースとなり、カッコ良くなっています。

【旧】

【新】

・ディレクトリ構造の変化
Laravel 11では、開発効率を高めるためにディレクトリ構造が一新されました。この変更により、プロジェクトファイルの構成がシンプルになり、以前のLaravelバージョンに含まれていた定型的なコードが削減されました。

【旧】
app
┣ Console
┣ Exceptions
┣ Http
┣ Models
┗ Providers
bootstrap
┣app.php
┗cache
artisan

【新】
app
┣ Http
┣ Models
┗ Providers
bootstrap
┣app.php
┗cache
artisan

②まとめ
・このようにLaravel 11では開発者の生産性やアプリケーションのパフォーマンスを引き上げるいくつもの革新的な機能が導入されており、カスタムが自由にやりやすくなっております。まだリリースされたばっかりなのでこらから修正も沢山はいるかと思いますが、皆さんも使ってみてはいかがでしょうか?
以上、Laravel 11についてでした。