プログラミングの最近のブログ記事

この間、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) はスーパータイプ・メソッドをオーバーライドまたは実装する必要があります」とか言われちゃって。

20260514_spring_batch1.jpg

そういう時はとりあえず現在の 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.jp
Subject: Test Mail
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-2022-JP
X-Mailer: The original perl script - LOLI POPPER

Test Test Test Go Go Go
EOM

close(OUT);

これでちゃんと Gmail に転送しても送られるぞ。もちろん直接 Gmail のアドレスに送ってもグー。
Java のバッチ処理を Spring Batch フレームワークを使って作成しようと思って、サイトの情報をググりながら作業してたんだけど、Spring Batch の「chunk(チャンク)」モデルのバッチを作成しようとしていきなり問題が(^^;;;
org.springframework.batch.item 以下のクラスが import できないのである。

Maven のローカルキャッシュ(.m2)の下の repository\org\springframework\batch を見てみると、

spring-batch-bom
spring-batch-core
spring-batch-infrastructure
spring-batch-test

しかないやん。今回、Spring Batch は最新バージョンの 6.0.3 を使っているので、クラスの構成変わったんかな?
ググってみたけど、org.springframework.batch.item というのがある前提の記事ばっかで・・・

結局、item は org.springframework.batch.infrastructure の下にあった。

エラーが出ている行で「インポートの構成」を選択。

20260508_spring1.jpg

「インポートする型の選択」で「org.springframework.batch.infrastructure.item.ParseException」を選択。
(「org.springframework.batch.item.ItemReade」のエラー行を指定しているので「org.springframework.batch.infrastructure.item.ItemReader」が表示されそうなもんだが、よくわからん。こういうもの?)

20260508_spring2.jpg

これで、

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 なんか使ってない」ちゅう話なんやで。

20260504_eclipse1.jpg

結局、プロジェクトの右ボタンメニューで「プロパティ」→「プロジェクト・ファセット」でファセットの構成を行ったら、なんかエラーが出なくなった。
ファセットに 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 なサイトとか利用しないので、まともにネットワーク設定してないのよ。

20260503_eclipse1.jpg

というわけで、その 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 も使い込んでいるわけではないので、さて、フレームワークを変更するには・・・と、ネットに頼ったわけよ。

でも、ネット上の情報は、プロジェクトのプロパティ開いて、「アプリケーション」タブの「ターゲット フレームワーク」の一覧から変更したいフレームワークを選択します・・・ってのばっかり。

ふざけんなよ。俺の画面、「ターゲット フレームワーク」のプルダウンなんかねえよ!(バージョン違い?)

20241223_DOTNET1.jpg

結局正解は、

  1. プロジェクトのプロパティを開く(「My Project」ダブルクリックでも可)
  2. 「コンパイル」タブを選択
  3. 画面の一番下の「詳細コンパイル オプション」ボタン押下
  4. 「コンパイラの詳細設定」画面の「対象のフレームワーク」一覧で「.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 に設定される。
いやあ、今日は SpreadsheetGear という Excel 互換のスプレッドシート コンポーネントに振り回された一日・・・いや、半日だったけど(笑)・・・だった。

ASP.NET で開発している Web システムがあって、Web画面からアップロードした Excel ファイルをサーバサイドであれこれするんだけど、Excel ファイルによってちゃんと処理できるケースと、「Corrupt OpenXML document.」例外を発生するケースがあるのだ。

<asp:Label ID="lblExcelSel" runat="server" Text="Excelファイル"></asp:Label>&nbsp;
<asp:FileUpload ID="fileExcel" runat="server" />&nbsp;
<asp:Button ID="btnUpFile" runat="server" Text="取込" /> 

こんな感じで、FileUpload コントロールでアップしたデータを、サーバサイドで SpreadsheetGear を使って処理をする。

サーバサイドのプログラムがこんな感じ。

    ''' <summary>
    ''' 取込ボタン処理
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Protected Sub btnUpFile_Click(sender As Object, e As EventArgs) Handles btnUpFile.Click

        ' ファイルがアップロードされていなければ終了
        If (fileExcel.HasFile = False) Then Return

        ' ファイルをメモリーに格納
        Dim data(fileExcel.PostedFile.ContentLength - 1) As Byte
        fileExcel.PostedFile.InputStream.Read(data, 0, fileExcel.PostedFile.ContentLength)

        Dim xlsWorkBookSet As SpreadsheetGear.IWorkbookSet = SpreadsheetGear.Factory.GetWorkbookSet()
        Dim xlsWorkBook As SpreadsheetGear.IWorkbook = Nothing
        Try
            'メモリからワークブックにセット
            xlsWorkBook = xlsWorkBookSet.Workbooks.OpenFromMemory(data)
        Catch ex As Exception
            alert("Excelファイルを読み込めませんでした。(" + ex.Message + ")")
            Return
        End Try

        Dim currentSheet As SpreadsheetGear.IWorksheet = CType(xlsWorkBook.Worksheets(0), SpreadsheetGear.IWorksheet)
<以下略>

この、xlsWorkBook = xlsWorkBookSet.Workbooks.OpenFromMemory(data) しているところで「Corrupt OpenXML document.」例外エラーが発生するのである。

色々調べていたら、他のブックからシートをコピーしたり、他のブックのシートの一部をコピー&ペーストしたファイルがエラーになるようだ。元々ちゃんと読めていたファイルが読めなくなる。

xlsx ファイルは OpenXML 形式のファイルなので、コピー元の情報を書き込んだときに、何か問題が発生するんだろうなあ。日本語ファイル名をシングルクォーテーションで囲まないとか。
まだそこまで調べてないし、調べる時間もなさそうなんで、俺よりエロい人、ぜひご教示くださいませ。

本家サイトにも色々 OpenXML 形式のファイルを扱うときの障害例が載っていたが、そのほとんどが「残念ながら、既知の制限になります。」で締められていて闇を感じた(笑)
Sourcetree で GitHub に 新規プロジェクトの main ブランチを push しようとしたら、GitHub が

git --no-optional-locks -c color.branch=false -c color.diff=false -c color.status=false -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags origin refs/heads/main:refs/heads/main 
Pushing to ssh://github.com/XXXXXXX/sXXXXXXX.git
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

というエラーを出して失敗する。
よくわからないが、どうも「Permission denied (publickey)」というメッセージから、公開鍵(PublicKey)の問題のようだ。

いや、もちろん思い当たる(^^;;;
ええと、SSH 接続用の秘密鍵も公開鍵も作ってましぇん(^^;;;

というわけで、下記に対応手順。
やり方は GitHub Docs に載っている手順通り。
この俺のブログ(このページ)も含めて(笑)、ネット上の情報は古くなっているものが多いので、GitHub Docs のような正規のドキュメントを参照した方がいいよ。

・新しい SSHキー(秘密鍵、公開鍵)の作成
※ GitHub に登録しているメールアドレスで作成
※ ディフォルトの名前を変更して作成(ケツに GitHub と付ける)

% ssh-keygen -t ed25519 -C "hogehoge@exsample.com"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/hogehoge/.ssh/id_ed25519): /Users/hogehoge/.ssh/id_ed25519_GitHub
Enter passphrase (empty for no passphrase): <パスフレーズ>
Enter same passphrase again: <パスフレーズ>
Your identification has been saved in /Users/hogehoge/.ssh/id_ed25519_GitHub
Your public key has been saved in /Users/hogehoge/.ssh/id_ed25519_GitHub.pub
The key fingerprint is:
SHA256:oKy<略>h4 hogehoge@exsample.com
The key's randomart image is:
+--[ED25519 256]--+
|           .=..  |
|           o.+   |
|      .    .=E   |
|   . . . ..++o.  |
|    + o S ..+.+ o|
|   o . + .   = =+|
|  o       .   B.*|
|oo.        . + X+|
|*=.         . =o=|
+----[SHA256]-----+

・ssh-agent の起動
% eval "$(ssh-agent -s)"
Agent pid 6763

・~/.ssh/config ファイルの作成
% open ~/.ssh/config
The file /Users/hogehoge/.ssh/config does not exist.

存在していないので空ファイルを作成
% touch ~/.ssh/config

・config ファイルの編集
% vi ~/.ssh/config
% cat ~/.ssh/config
Host github.com
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519_GitHub

※ UseKeychain yes 行を書かなければ、キーにパスフレーズを追加しないようにできるらしい

・作成した SSH 秘密鍵を ssh-agent に追加する
% ssh-add --apple-use-keychain ~/.ssh/id_ed25519_GitHub
Enter passphrase for /Users/hogehoge/.ssh/id_ed25519_GitHub: <パスフレーズ>
Identity added: /Users/hogehoge/.ssh/id_ed25519_GitHub (hogehoge@exsample.com)

・SSH 公開鍵をクリップボードにコピー
% pbcopy < ~/.ssh/id_ed25519_GitHub.pub

※ .pub がついている公開鍵をコピーしよう。俺は .pub のついていない秘密鍵の方をコピーして GitHub から「Key is invalid. You must supply a key in OpenSSH public key format」と叱られた

・New SSH key の登録
Web で GitHub にログインし、設定画面を開く→[アクセス] セクションの[SSH キーと GPG キー]を開き、New SSH Key の登録を行う

以上の処置で、無事 push ができるようになった。
よかった、よかった(笑)

このアーカイブについて

このページには、過去に書かれたブログ記事のうちプログラミングカテゴリに属しているものが含まれています。

前のカテゴリはパソコンです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら