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

そういえばそうだった。ずいぶん昔悩んだことがあるのだがすっかり忘れていた。

ファイルをアップロードするのではなく、単純にフルパスだけ Controller に渡してやって、実際のファイルの読み込みは Javaで行いたかったのだが、そういえばセキュリティ上の対策でローカルファイルのフルパスはブラウザからサーバ側には渡せないんだった。

一応、ファイル名を取ってくる処理を Spring Boot + Thymeleaf で書いてみたので、備忘録で載せておく・・・が、ファイル名しか取れないんじゃ意味がないんだよな(^^;;;
(ちなみに、これだけなら Thymeleaf で書かなくても、普通の HTML でいいじゃん・・・というご意見はあるでしょうが、フルパス取れたら色々拡張していこうと思ってたのよね)

■resources/templates/SelectLogs.html

<!DOCTYPE html>

<html xmlns:th="http://www.thymeleaf.org" lang="ja">

<head>
	<title>対象ログファイル選択</title>

	<script>
		document.addEventListener('DOMContentLoaded', function() {
			document.getElementById('fileInput').addEventListener('change', function(e) {
				// 選択されたファイルを取得
				const file = e.target.files[0];
				const displayArea = document.getElementById('fileNameDisplay');

				if (file) {
					// ファイル名を表示要素にセット
					displayArea.textContent = file.name;
				}
				else {
					// キャンセルされた場合などのリセット処理
					displayArea.textContent = 'ファイルが選択されていません';
				}
			});
		});
	</script>
</head>
<body>
	<form>
		<!-- ファイル選択ダイアログ -->
		<input type="file" id="fileInput" style="display: none;" />

		<!-- ダイアログを呼び出すボタン -->
		<button type="button" onclick="document.getElementById('fileInput').click();">
		ファイルを選択
		</button>

		<!-- ファイル名を表示する要素 -->
		<span id="fileNameDisplay">ファイルが選択されていません
	</form>
</body>

</html>

※注意
ちなみに、addEventListener な処理を頭(head の中とか)に書くと、まだ実際には body部の要素(例えば、'fileNameDisplay' って名前の span要素)が読み込まれていないので、document.getElementById('fileNameDisplay')って指定でエラーになって addEventListener されない。
この場合は、この 'change'イベントの addEventListener を 'DOMContentLoaded'イベント のaddEventListener で囲ってやれば、すべての読み込みが終了後に 'change'tイベント追加処理が実行されるので問題ない。
body の一番後ろに script を書けば良いんだけど、古い人間なので、script は head 内に書きたいのよね(笑)


■java/com/netandfield/test/controller/SelectLogsController.java

package com.netandfield.test.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/SelectLogs")
public class SelectLogsController {

	/**
	* 初期表示
	* @return
	* @throws Exception
	*/
	@GetMapping
	public String init() throws Exception {

		return "SelectLogs";

	}

}

ローカルファイルのパスをどうしても Java に渡す処理を Web技術(HTML,CSS,JavaScript)を使って書きたいのなら、Electronなどで「デスクトップアプリ」として作れってことみたい。

Spring Boot と Electron を組み合わせるというのはありだな。Electron でフロントエンドを作り、Spring Boot で Electronデータの画面とデータのやり取りをするだけの REST API を動かすって形で。
なるほど。しかし、これだと Thymeleaf の出番がない?(^^;;; そもそも Thymeleaf の勉強もしたくて、Spring Boot + Thymeleaf の業務システムを作ろう思ったのよね。

ま、ブラウザがサーバにフルパスを渡せられるようになったら「セキュリティ上、大変問題」ってのはわかるので、Electron の勉強するか・・・
Kato83 さんの Web サイト「Pulog プログラムのブログ 略してプログ」の中の「Spring BootでSpring BatchのChunkモデルを試す」というエントリーを参考に Spring Batch を勉強させてもらっているんですが、この記事が書かれたのが約 6年前ということで対象バージョンが古い。今は SpringBatch も 6 までバージョンが上がっていて、そのままソースを拝借したのでは動きません。
 
そこで、Spring Batch 6 に対応した修正を行ったので、ここで公開しておきます。
俺以上に Spring Batch 素人で、それでも「とりあえず動かしてみんとようわからん」という方向けです(笑)
 
プロジェクトの依存関係(Dependencies)とかは Kato83 さんのサイトを参考にしてください。
ちなみに、今回は com.netandfield.test フォルダの下に全ファイル配置しています。
(なので、Config用のクラスの中で、User や UserRepository の import は行っていません)
 
 
■BatchTest1/src/main/resourses/application.properties
 
spring.application.name=BatchTest1
spring.datasource.url=jdbc:h2:./.data/h2/db;MODE=MySQL
spring.jpa.hibernate.ddl-auto=update
spring.h2.console.enabled=true
 
 
■BatchTest1/src/main/java/com/netandfield/test/User.java
 
package com.netandfield.test;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Entity(name = "`user`")
@NoArgsConstructor
public class User {
    public User(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Integer id;
    public String firstName;
    public String lastName;
}
 
※注意
h2 データベースを MODE=MySQL で使っているせいか、テーブル名=user が MySQL の予約語 USER とかぶって expected "identifier" エラーとなってしまいます。
@Entity(name = "user") の user をバックスラッシュで囲んで、@Entity(name = "`user`") のようにしてください。
 
 
■BatchTest1/src/main/java/com/netandfield/test/UserRepository.java
 
package com.netandfield.test;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
}
 
 
■BatchTest1/src/main/java/com/netandfield/test/BatchTest1Application.java
 
package com.netandfield.test;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class BatchTest1Application {

	public static void main(String[] args) {
		SpringApplication.run(BatchTest1Application.class, args);
	}

}
 
 
■BatchTest1/src/main/java/com/netandfield/test/BatchTest1Configuration.java
 
package com.netandfield.test;

import java.text.Normalizer;

import org.springframework.batch.core.job.Job;
import org.springframework.batch.core.job.builder.JobBuilder;
import org.springframework.batch.core.job.parameters.RunIdIncrementer;
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.infrastructure.item.ItemProcessor;
import org.springframework.batch.infrastructure.item.data.RepositoryItemWriter;
import org.springframework.batch.infrastructure.item.data.builder.RepositoryItemWriterBuilder;
import org.springframework.batch.infrastructure.item.file.FlatFileItemReader;
import org.springframework.batch.infrastructure.item.file.builder.FlatFileItemReaderBuilder;
import org.springframework.batch.infrastructure.item.file.mapping.BeanWrapperFieldSetMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.FileSystemResource;
import org.springframework.transaction.PlatformTransactionManager;

import lombok.extern.slf4j.Slf4j;

@Configuration
@Slf4j
public class BatchTest1Configuration {

    @Autowired
    public UserRepository userRepository;

    /**
     * sample.csv ファイルを読み込む
     * @return バッチ処理用 Reader item
     */
    @Bean
    public FlatFileItemReader<User> reader() {
        return new FlatFileItemReaderBuilder<User>()
                .name("userItemReader")
                .resource(new FileSystemResource("sample.csv"))
                .delimited()
                .names("firstName", "lastName")
                .fieldSetMapper(new BeanWrapperFieldSetMapper<>() {{
                    setTargetType(User.class);
                }})
                .build();
    }

    /**
     * Reader から渡されたオブジェクトを保存する形に変換する
     * 今回はアルファベットの大文字変換と、半角カナを全角カナに変換している
     * @return 変換後に保存するアイテム
     */
    @Bean
    public ItemProcessor<User, User> processor() {
        return user -> {
            final var firstName = Normalizer.normalize(user.getFirstName().toUpperCase(), Normalizer.Form.NFKC);
            final var lastName = Normalizer.normalize(user.getLastName().toUpperCase(), Normalizer.Form.NFKC);
            final var transformedUser = new User(firstName, lastName);

            log.info("before converted : " + user);
            log.info("transformed user : " + transformedUser);
            return transformedUser;
        };
    }

    /**
     * Processor から渡されたオブジェクトを書き込む(保存処理をかける)
     * @return 保存処理用のリポジトリ
     */
    @Bean
    public RepositoryItemWriter<User> writer() {
        return new RepositoryItemWriterBuilder<User>()
                .repository(userRepository)
                .methodName("save")
                .build();
    }

    /**
     * 1つのバッチ処理の処理順やエラーハンドリング等の定義を行う
     * @return Jobを返却
     */
    @Bean
    public Job importUserJob(JobRepository jobRepository, Step step1) {
        return new JobBuilder("importUserJob", jobRepository)
                .incrementer(new RunIdIncrementer())
                .flow(step1)
                .end()
                .build();
    }

    /**
     * Jobの中に含まれるステップを定義する
     * @return ステップを返却する
     */
    @Bean
    public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
        return new StepBuilder("step1", jobRepository)
                .<User, User>chunk(10)
                .reader(reader())
                .processor(processor())
                .writer(writer())
                .build();
    }

}
 
 
テストデータは、Kato83 さんのものをそのまま使っています。
 
■BatchTest1/sample.csv
 
ジョン, スミス
田中, 太郎
ジョセフ, ジョースター
Erik, Satie
 
 
これらのファイルを用意して、BatchTest1Application.java を Java アプリケーションとして実行します(俺は Eclipse 上で実行してるもんで)
 
これで、
 
2026-06-09T17:18:46.581+09:00 INFO 684 --- [BatchTest1] [ main] o.s.batch.core.step.AbstractStep : Executing step: [step1]
2026-06-09T17:18:46.648+09:00 INFO 684 --- [BatchTest1] [ main] c.n.test.BatchTest1Configuration : before converted : User(id=null, firstName=ジョン, lastName=スミス)
2026-06-09T17:18:46.648+09:00 INFO 684 --- [BatchTest1] [ main] c.n.test.BatchTest1Configuration : transformed user : User(id=null, firstName=ジョン, lastName=スミス)
2026-06-09T17:18:46.649+09:00 INFO 684 --- [BatchTest1] [ main] c.n.test.BatchTest1Configuration : before converted : User(id=null, firstName=田中, lastName=太郎)
2026-06-09T17:18:46.649+09:00 INFO 684 --- [BatchTest1] [ main] c.n.test.BatchTest1Configuration : transformed user : User(id=null, firstName=田中, lastName=太郎)
2026-06-09T17:18:46.649+09:00 INFO 684 --- [BatchTest1] [ main] c.n.test.BatchTest1Configuration : before converted : User(id=null, firstName=ジョセフ, lastName=ジョースター)
2026-06-09T17:18:46.650+09:00 INFO 684 --- [BatchTest1] [ main] c.n.test.BatchTest1Configuration : transformed user : User(id=null, firstName=ジョセフ, lastName=ジョースター)
2026-06-09T17:18:46.650+09:00 INFO 684 --- [BatchTest1] [ main] c.n.test.BatchTest1Configuration : before converted : User(id=null, firstName=Erik, lastName=Satie)
2026-06-09T17:18:46.650+09:00 INFO 684 --- [BatchTest1] [ main] c.n.test.BatchTest1Configuration : transformed user : User(id=null, firstName=ERIK, lastName=SATIE)
2026-06-09T17:18:46.818+09:00 INFO 684 --- [BatchTest1] [ main] o.s.batch.core.step.AbstractStep : Step: [step1] executed in 236ms
2026-06-09T17:18:46.821+09:00 INFO 684 --- [BatchTest1] [ main] o.s.b.c.l.s.TaskExecutorJobLauncher : Job: [FlowJob: [name=importUserJob]] completed with the following parameters: [{JobParameter{name='run.id', value=1, type=class java.lang.Long, identifying=true}}] and the following status: [COMPLETED] in 248ms
2026-06-09T17:18:46.831+09:00 INFO 684 --- [BatchTest1] [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
 
※一部抜粋
 
このような結果が得られます。やった(笑)
 
20260530_spring1.jpg

とりあえず、

Spring Boot DevTools
Lombok
Spring Batch
Spring Data JPA
PostgreSQL Driver

この辺を使用すればバッチ組めるんかな?
Web 関係のものが含まれていると勝手に tomcat が起動したりするんで、ちゃんと非使用にしておこう。

で、DB関係は Spring Data JPA を設定すれば(JPA で DB 操作を書くなら?)、Spring Data JDBC はいらんのよね?

今やってる案件は JDBC を使って、ごりごり生の SQL を書いてるんだけど、勉強のために家では JPA 使ってみようかなっと。
いやあ、試しに色々なサイトのソースを参考に 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
@EnableBatchProcessing
public 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
    @StepScope
    public Tasklet helloTasklet() {
        return (contribution, chunkContext) -> {
            log.info("Hello World!");
            return RepeatStatus.FINISHED;
        };
    }

    @Bean
    public Step step1(Tasklet helloTasklet) {
        return new StepBuilder("step1", jobRepository).tasklet(helloTasklet)
                .build();
    }

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

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」選択

これでフレームワークの変更が終了。

このアーカイブについて

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

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

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

月別 アーカイブ

電気ウナギ的○○ mobile ver.

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