プログラミングの最近のブログ記事
いやあ、試しに色々なサイトのソースを参考に Spring Batch を試してたんだけど、一向に実行できない(^^;
ソース上のエラーは全部消しても、実行時に
***************************APPLICATION FAILED TO START***************************
みたいなエラーを出して止まってしまう。原因は色々だが、どこが問題なのかわからない・・・
ただ、調べていくうちに、どうも参考にしているサイトの Spring Batch が古いのが問題なのではないか?という気がしてきた。
なので、まさに俺の環境(最新の Spring Batch 6 / Spring Boot 4 環境)で説明がされている IK.AM さんの
というページを参照。
結局、下のようなソース(著作権は IK.AM さんにあると思いますが、一応、若干 import 先が違っていたりするので公開します)でついにバッチ実行ができた。
<BatchTestApplication.java>
package com.netandfield.test;import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication@EnableBatchProcessingpublic class BatchTestApplication {public static void main(String[] args) {SpringApplication.run(BatchTestApplication.class, args);}}
<config/JobConfig.java>
package com.netandfield.test.config;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.batch.core.configuration.annotation.StepScope;import org.springframework.batch.core.job.Job;import org.springframework.batch.core.job.builder.JobBuilder;import org.springframework.batch.core.repository.JobRepository;import org.springframework.batch.core.step.Step;import org.springframework.batch.core.step.builder.StepBuilder;import org.springframework.batch.core.step.tasklet.Tasklet;import org.springframework.batch.infrastructure.repeat.RepeatStatus;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configuration(proxyBeanMethods = false)public class JobConfig {private final Logger log = LoggerFactory.getLogger(JobConfig.class);private final JobRepository jobRepository;public JobConfig(JobRepository jobRepository) {this.jobRepository = jobRepository;}@Bean@StepScopepublic Tasklet helloTasklet() {return (contribution, chunkContext) -> {log.info("Hello World!");return RepeatStatus.FINISHED;};}@Beanpublic Step step1(Tasklet helloTasklet) {return new StepBuilder("step1", jobRepository).tasklet(helloTasklet).build();}@Beanpublic Job job1(Step step1) {return new JobBuilder("job1", jobRepository).start(step1).build();}}
この2ファイルを作成。(俺は Eclipse 上で作成しているので)プロジェクトエクスプローラーで BatchTestApplication.java を選択し、右ボタンメニューから「デバッグ」→「Javaアプリケーション」で実行される。
やっと Eclipse のコンソールに
[BatchTest] [ restartedMain] com.netandfield.test.config.JobConfig : Hello World!
と表示された。
しかし、Spring Batch 6 を使って説明している Web ページ、少ないなあ・・・
「まずは丸々コピーで参考サイトのソースを持ってきて、それを実行しながらプログラムの勉強をする」スタイルの俺からすると、「プログラムと実行結果を見比べながら記述内容の確認をして言語を理解していく」ことができないので、「動かないことには動くようにできない」というパラドックスにハマってしまったのであった・・・
エロい、いや、偉い人たち、最新環境での参考ページ制作をよろしくお願いします(笑)
この間、import とするクラスがどこにあるのかわからないときに「インポートする型の選択」を実行するといい具合に目的のクラスを見つけてきてくれる話を書いたが、もちろん間違いもある(笑)
本当は、
org.springframework.batch.core.job.Job
を import しなければいけないのに
org.springframework.boot.batch.autoconfigure.BatchProperties.Job
を import して「型の不一致: Job から BatchProperties.Job には変換できません」なんてエラーになったり。
あと、
org.springframework.batch.core.job.JobExecution
を見つけずに
org.springframework.batch.core.repository.persistence.JobExecution
の方を import してしまったり。
で、「型 JobCompletionNotificationListener のメソッド afterJob(JobExecution) はスーパータイプ・メソッドをオーバーライドまたは実装する必要があります」とか言われちゃって。
そういう時はとりあえず現在の import をコメントにしたら候補が複数出るので正しいものを選択する。
ちなみに、a-ikeshitaさんの「Spring Batchについて基礎からまとめてみた」って記事を今参考にさせてもらっております。
サーバの自動監視をしているプログラムからの状況連絡のメールが Gmail に届かない。
いや、届かない理由はわかってる。RFC5321に違反した From メールアドレスは Gmail で弾かれる。
Gmail のサーバからの、
Remote_host_said:_553-5.1.7_The_sender_address_<#@[]>_is_not_a_valid_RFC_5321_address._For_more/553-5.1.7_information,_go_to/553-5.1.7__https://support.google.com/a/answer/3221692_and_review_RFC_5321/553_5.1.7_specifications._d2e1a72fcca58-839684a49e3si35399207b3a.131_-_gsmtp/
なんてメッセージがログに残っている。
ここで言う From アドレスはメールを見るときに表示されている From アドレス(いわゆる MAIL FROM)ではなく、メールソフトやメールサーバがメールデータの頭に自動でセットしている Envelope From アドレスである。
具体的には、メールの頭の
Return-Path: <hoge@exsample.com>
とかね。Envelope From を指定せずに sendmail とかでメールを送ると、ここが
Return-Path: <>
みたいに空になってたりして、Gmail から「RFC5321に違反してる」と判断され捨てられてしまうわけだね。
なので最近はちゃんとプログラム内で Envelope From を指定してるんだけど、古いプログラムはそのままだ(^^;;;。まあ、うちのメールサーバはそれでも受信するので今までは問題なかったんだけど、最近、メールを Gmail に転送して外出時なんかにスマホでチェックするようになったので困ったことになったんよね。
古い監視プログラムとかからのメールが届かなくなっちゃって。
というわけで修正。ま、-f オプションを付けるだけだけど(笑)
Perl ならこんな感じ。
if (!open(OUT,"| /usr/sbin/sendmail -t -f hoge\@exsample")) {return(0);}print OUT <<EOM;From: hoge hoge <hoge\@exsample>To: atesaki\@exsample.co.jpSubject: Test MailMIME-Version: 1.0Content-Type: text/plain; charset=ISO-2022-JPX-Mailer: The original perl script - LOLI POPPERTest Test Test Go Go GoEOMclose(OUT);
これでちゃんと Gmail に転送しても送られるぞ。もちろん直接 Gmail のアドレスに送ってもグー。
Java のバッチ処理を Spring Batch フレームワークを使って作成しようと思って、サイトの情報をググりながら作業してたんだけど、Spring Batch の「chunk(チャンク)」モデルのバッチを作成しようとしていきなり問題が(^^;;;
org.springframework.batch.item 以下のクラスが import できないのである。
Maven のローカルキャッシュ(.m2)の下の repository\org\springframework\batch を見てみると、
spring-batch-bomspring-batch-corespring-batch-infrastructurespring-batch-test
しかないやん。今回、Spring Batch は最新バージョンの 6.0.3 を使っているので、クラスの構成変わったんかな?
ググってみたけど、org.springframework.batch.item というのがある前提の記事ばっかで・・・
結局、item は org.springframework.batch.infrastructure の下にあった。
エラーが出ている行で「インポートの構成」を選択。
「インポートする型の選択」で「org.springframework.batch.infrastructure.item.ParseException」を選択。
(「org.springframework.batch.item.ItemReade」のエラー行を指定しているので「org.springframework.batch.infrastructure.item.ItemReader」が表示されそうなもんだが、よくわからん。こういうもの?)
これで、
import org.springframework.batch.item.ItemReader;import org.springframework.batch.item.NonTransientResourceException;import org.springframework.batch.item.ParseException;import org.springframework.batch.item.UnexpectedInputException;
が、
import org.springframework.batch.infrastructure.item.ItemReader;import org.springframework.batch.infrastructure.item.NonTransientResourceException;import org.springframework.batch.infrastructure.item.ParseException;import org.springframework.batch.infrastructure.item.UnexpectedInputException;
に置き換わって幸せになった。
しかし、この先も最新版を使ってる故の苦労がありそうだ。
エロい人たち、早く Spring Batch 6 を使った記事を書いてほしいです。
macOS 版 Eclipse でビルドツールに Maven を指定して Spring Boot プロジェクトを作成していた。
で、プロジェクトの右ボタンメニューから「デバッグ」→「Spring Boot アプリケーション」を選択しビルドを始めると、なぜか Gradle によるビルドエラーが発生するのである。
上に書いたように、ビルドツールには Maven を指定してて、Gradle は使わない設定なのに・・・である。
エラーログをコピーしておくのを忘れたので正確な情報ではないが、「Gradle Core Plugins (plugin is not in 'org.gradle' namespace)」とか、build.gradle が not found だとか、そんな感じのエラーが出てた。
これらの解決方法はネットでググれば色々出てくるんだけど、いや、そうじゃないんやねん。はじめに書いたように、そもそも「Gradle なんか使ってない」ちゅう話なんやで。
結局、プロジェクトの右ボタンメニューで「プロパティ」→「プロジェクト・ファセット」でファセットの構成を行ったら、なんかエラーが出なくなった。
ファセットに Gradle は最初から無かったけど。
というわけで、これが本当に原因だったかどうかはわからないが、また同じ状況になったときのためにメモしとく。
macOS にインストールした Eclipse 2026(Pleiades Java Edition)で「新規 Spring スターター・プロジェクトの作成」を選択すると、Spring Initializr(https://start.spring.io)への接続に失敗し「利用可能なコンテンツがありません」と表示される件。
Parallels Desktop 上の Windows 11 Pro で Eclipse を使えば問題ないので放置していたのだが、やっぱ macOS 環境で使いたいので再挑戦。
しかし、どこのサイトにも「ネットワーク設定(プロキシの設定)がおかしい」「SSL証明書(start.spring.io)がインポートされていない(Javaのセキュリティ設定に抵触)」という二点ばかりが書かれている。質問サイトでも、まずこの二つの回答以外お目にかからない。
あほかあ!!インターネットにはビンビンに接続しとるし、Windows 環境なら接続されるんやから、Javaのセキュリティ云々関係ないやろ!!他の情報はないんかい!!と、なぜか教えを乞う俺の方が逆ギレする始末(^^;;;
だって、よそのサイトに書かれている記事をそのまま自分のところで丸写しで紹介している技術系ブログとか多いんだもん。よそのサイトと同じ情報はいらんのよ、検索の邪魔だから(あ、またいらんことを言うてしまった(^^;)
結局、AI からの回答で解決。
「IPv6環境で通信エラーが起きている場合があります。Eclipseの起動設定にIPv4を優先するオプションを追加します。」
これだった。(AIがどこかのサイトから拾ってきたのだと思いますが、その情報を掲載してくれてたサイトのオーナーさん、ありがとうございます。本当に感謝します)
どうも、macOS 版だと、IPv6 で接続に行くようなんだけど、俺、日頃 IPv6 なサイトとか利用しないので、まともにネットワーク設定してないのよ。
というわけで、その AI の言葉に従い、Eclipse.app(またはSTS.app)/Contents/Eclipse/eclipse.ini の最後に
-Djava.net.preferIPv4Stack=true
を追加して Eclipse を再起動したらバッチリだった。(最初、一瞬「利用可能なコンテンツがありません」が表示されたので「おっ!?」と思ったけど、すぐに正常に表示された)
いやあ、バッチリ、バッチリ。
アクセス稼ぐためによそのサイトの内容を丸コピしてる情報サイトは地獄に落ちてほしいわ(笑)
Visual Studio でソリューションにコンソールアプリケーション開発のプロジェクトを追加すると、フレームワークが勝手に Client バージョン?になってしまう。
具体的には、「.NET Framework 4 Client Profile」になってしまう。
しかし、今作ってるプログラムは Client Profile だと機能不足なんよね。
ということで、フレームワークを素の .NET Framework 4 に変更したかったんだけど、あんま Visual Studio も使い込んでいるわけではないので、さて、フレームワークを変更するには・・・と、ネットに頼ったわけよ。
でも、ネット上の情報は、プロジェクトのプロパティ開いて、「アプリケーション」タブの「ターゲット フレームワーク」の一覧から変更したいフレームワークを選択します・・・ってのばっかり。
ふざけんなよ。俺の画面、「ターゲット フレームワーク」のプルダウンなんかねえよ!(バージョン違い?)
結局正解は、
- プロジェクトのプロパティを開く(「My Project」ダブルクリックでも可)
- 「コンパイル」タブを選択
- 画面の一番下の「詳細コンパイル オプション」ボタン押下
- 「コンパイラの詳細設定」画面の「対象のフレームワーク」一覧で「.NET Framework 4」選択
これでフレームワークの変更が終了。
一応、メモ。ちょっと悩んだので(^^;
「戻る」ボタン押下で GokeiKeisan っていう JavaScript が実行されてるっぽいんだけど、aspx ファイル見ても、全然 onClick 属性で実行スクリプトの指定をしてないので「なんで?」ってなった。
JavaScript そのものは、aspx ソース内に記述がある。
<script type="text/javascript">function GokeiKeisan(objRitsu) {var gokeikingaku = 0;<略>}
でも、onClick や onChange などの記述はない。
で、VB.NETのソースを見てたら、
Me.btnBack.OnClientClick = "javascript:GokeiKeisan('" & ddlZeiritsu.SelectedValue & "');"
なんて記述が。そうか、ASPではボタンオブジェクトに OnClientClick なんてプロパティがあるんだ。
一覧の手数料や値引額を変更しても合計額が変更されるんだけど、その設定は・・・と思ったら、こちらも VB.NET 内で onChange 属性のセットをしていた。
Dim sScript As String = "GokeiKeisan('" & ddlZeiritsu.SelectedValue & "', sGokei);" '実行スクリプトCType(e.Item.FindControl("txtTesuryo"), TextBox).Attributes.Add("onChange", sScript) '手数料が変わったら再計算CType(e.Item.FindControl("txtNebiki"), TextBox).Attributes.Add("onChange", sScript) '値引額が変わったら再計算
JavaScript だけで属性セットもできるが、VB.NET 側に書いておいたほうが(COBOL から VB6 に流れ、今は VB.NET をやってるけど、JavaScript とかそういうのはわからんよ・・・と堂々と言っちゃうような老害プログラマ、あ、SEか(笑)。そういう人たちにとっても)メンテがやり易いというのはあるのか(^^;;;
VB.NETで、iTextSharp を使って PDF ファイルを生成しているプログラムがあり、その修正をしていたのだが、文字色を変えてくれと言われて色々ググったのだが記事を見つけられなかったのでメモっておく。
iTextSharp の使い方をググっても、本家や一部のエロい人の記事をそのままコピってるような記事が多くて辟易するわ・・・。ソース例をそのまま持ってきてるやつとかな(^^;;; そういうページは検索のときにホントに邪魔だから作らないで・・・と強く思う(笑)
あ、話がずれた。
iTextSharp でフォント色を設定するのは、以下のようなやり方で。
(テンプレートの PDF を読み込んできてアレコレ・・・のところは省きます)
Dim cb As PdfContentByte' ベースフォントの設定(msmincho.ttc、水平方向文字、フォント埋込をする)' 日本語フォントはフルパス指定でDim bf As BaseFont = BaseFont.CreateFont("c:\windows\fonts\msmincho.ttc,0", BaseFont.IDENTITY_H, True)cb.BeginText()cb.SetRGBColorFill(0, 0, 192) ' 色指定(青 #0000C0)cb.SetFontAndSize(bf, 13) ' 文字サイズ 13po
これで、
' 中央よせ(X=100,Y=200 指定したところが中心になる)で文字セットcb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, "私は慎吾", 100, 200, 0)
とすれば「左下を 0:0」として、文字列の横の中心を 100 の位置とした "私は慎吾" が PDF に設定される。
