Spring Boot 3.1にアップグレードする

Spring Bootの3.1がリリースされたため、早速アップグレードしたところ、Spring Securityのバージョンが6.1になっていた。

その結果、このクラスでは以下のメソッドが非推奨になった。
.exceptionHandling()
.cors()
.csrf()
.formLogin()
.httpBasic()
.authorizeExchange()
.and()

@Bean
public SecurityWebFilterChain securitygWebFilterChain(ServerHttpSecurity http) {
    return http
            .exceptionHandling()
            .authenticationEntryPoint((swe, e) -> {
                return Mono.fromRunnable(() -> {
                    swe.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
                });
            }).accessDeniedHandler((swe, e) -> {
                return Mono.fromRunnable(() -> {
                    swe.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
                });
            }).and()
            .cors().configurationSource(corsConfigurationSource())
            .and().csrf().disable()
            .formLogin().disable()
            .httpBasic().disable()
            .authenticationManager(authenticationManager)
            .securityContextRepository(securityContextRepository)
            .authorizeExchange()
            .pathMatchers(HttpMethod.OPTIONS).permitAll()
            .pathMatchers("/crawler-api/login").permitAll()
            .pathMatchers("/crawler-api/signup").permitAll()
            .pathMatchers("/crawler-api/users*").hasAuthority("ROLE_USER")
            .pathMatchers("/crawler-api/novels*").hasAuthority("ROLE_USER")
            .anyExchange().authenticated()
            .and().build();
}

非推奨になったメソッドには新たにラムダ式で記述出来る同名のメソッドが追加されている。今後はそちらを使用する。

新しいメソッドに置き換えると下記の通りとなる。

.exceptionHandling(exceptionHandling -> exceptionHandling
        .authenticationEntryPoint((swe, e) -> {
            return Mono.fromRunnable(() -> {
                swe.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            });
        }).accessDeniedHandler((swe, e) -> {
            return Mono.fromRunnable(() -> {
                swe.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
            });
        }))
.csrf(csrf -> csrf.disable())
.formLogin(formLogin -> formLogin.disable())
.httpBasic(httpBasic -> httpBasic.disable())
.authenticationManager(authenticationManager)
.securityContextRepository(securityContextRepository)
.authorizeExchange(exchanges -> exchanges
        .pathMatchers(HttpMethod.OPTIONS).permitAll()
        .pathMatchers("/crawler-api/login").permitAll()
        .pathMatchers("/crawler-api/signup").permitAll()
        .pathMatchers("/crawler-api/users*").hasAuthority("ROLE_USER")
        .pathMatchers("/crawler-api/novels*").hasAuthority("ROLE_USER")
        .anyExchange().authenticated())
.build();

cors()についてはCorsConfigurationSourceのBeanが定義されていれば自動的に読み込まれるとのことなので、SecurityWebFilterChainからは削除した。
また、新しいメソッドを置き換えた結果、.and()は不要になった。

PyTorch 2.0にアップグレードする

環境

Windows 11
Microsoft Store版 Python 3.10

動機

Stable Diffusion web UIがPyTorch 2.0でテストされるようになったため、これを機にローカル環境をアップグレードする。(Stable Diffusion web UIのアップグレードについては、ページ最後の「その他」の章を参照)
現在の環境には、以下のバージョンがインストールされているので、ここからアップグレードする。

$ python -c "import torch; print( torch.__version__ )"
1.13.0+cu117

CUDA Toolkit 11.8のインストール

NVIDIAからCUDA Toolkit 11.8をダウンロードし、インストールする。

cuDNN v8のインストール

NVIDIAからcuDNN v8.9.1 (May 5th, 2023), for CUDA 11.xをダウンロードし、インストールする。

ダウンロード後、任意のファルダに解凍し、binフォルダにパスを通す。

PyTorch 2.0のインストール

1.旧バージョンを削除

$ pip uninstall torch torchvision torchaudio

2.新バージョンをインストール

PyTorchのページでインストール用のコマンドを作成する。

$ pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

インストール完了後、下記のコマンドを実行しバージョンを確認する。

$ python -c "import torch; print( torch.__version__ )"
2.0.1+cu118

その他

Stable Diffusion web UIをアップグレードするなら、Stable Diffusion web UIのインストールフォルダで以下のコマンドを実行する。

$ git pull

その後、webui-user.batファイルのCOMMANDLINE_ARGSに、下記の通り「–reinstall-torch –reinstall-xformers」を追記して、batファイルを実行する。

COMMANDLINE_ARGS=--xformers --reinstall-torch --reinstall-xformers

SonarQubeのPort番号変更方法

動機

テレワークでZscalerを使用している場合、SonarQubeがデフォルトで使用するポート番号9000がZscalerに占有されてしまっている。SonarQubeのポート番号を変更する必要があった。

環境

Windows 11
Java 17
Apache Maven 3.9.1
SonarQube 9.9 LTS

SonarQubeサーバー側

インストールフォルダのconf下にある、sonar.propertiesでPort番号を設定できる。

# TCP port for incoming HTTP connections. Default value is 9000.
#sonar.web.port=9000

以下の通り、空いているPort番号に変更する。

# TCP port for incoming HTTP connections. Default value is 9000.
sonar.web.port=9090

SonarQubeクライアント側(スキャナー側)

自分は以下の通りバッチ起動時の環境変数に設定した。

set MAVEN_OPTS=-Xmx2048m -Dsonar.host.url=http://localhost:9090
call mvn sonar:sonar

JunitでMock使用時、エラーになる場合がある

mockito-core-5.2.0.jar

JunitでMockを使用しているとき、下記のエラーが出る。何度も実行していると、たまに正常に終了するときもある。

Error creating bean with name 'userDao' defined in class path resource [common/service/applicationContext-test.xml]: Failed to instantiate [java.lang.Object]: Factory method 'mock' threw exception with message: Please don't pass any values here. Java will detect class automagically.

調べてみたら下記に理由が書いてあった。
automatically detect class to mock #2779

修正内容は以下の通り。

    <bean id="userDao" class="org.mockito.Mockito" factory-method="mock">
-        <constructor-arg value="common.dao.jpa.UserDao" />
+        <constructor-arg>
+            <value type="java.lang.Class">common.dao.jpa.UserDao</value>
+       </constructor-arg>
    </bean>

MMVCを試してみる(Google Colaboratory版)

以前、WSL2にて試したMMVCをGoogle Colaboratoryで動かしてみる。

MMVC_Trainerを手順通りに動かす

非常にわかりやすいColab用の実行ファイルがあるので、まずはそれで試してみる。手順通りに実行するだけで、特に環境設定は変更する必要はなかった。

00_Rec_Voice.ipynbのrec関数の下記1点だけ修正した。

-  librosa.display.waveplot(speecht, sr=rate)
+  librosa.display.waveshow(speecht, sr=rate)

録音中にマイクが反応しなくなることがあったが、Webページを再読み込みすると問題なく先に進めることが出来た。これは自分のPCの問題だと思われる。

次に、順番通り01_Create_Configfile.ipynbを実行する。

その後、02_Train_MMVC.ipynbを実行してトレーニングを実施するのだが、無料会員の場合は途中で利用上限により「GPU バックエンドに接続できません」となってしまう。

その場合は、ユニットを購入するかしばらく待って(1日以上?)から、「6 学習を実行する」の「New_or_Resume:」をResumeに切り替えてから再度実行する。

最終的に「7 学習結果をONNXファイルに変換」まで問題なく実施することが出来た。

MMVC_Clientをローカル環境で動かす

Windowsの実行ファイルを利用する。公式からダウンロードしたファイルを任意のフォルダに解凍する。

環境設定myprofile.confの入出力デバイスの部分を書き換える。他はデフォルトで良いと思う。

MMVC_Trainerで作成した学習済みファイル(config.json、G_latest_99999999.onnx)をlogsフォルダの下に20220306_24000フォルダを作成してコピーする。

最後に、mmvc_client.batを実行する。

Stable Diffusion web UIをインストールして絵を描く

Stable Diffusion web UIをWindows 11のローカル環境で実行するための、覚書。

目次

環境

  • Windows 11
  • GeForce 10以上のGPUがインストールされている

事前準備

  • Pythonをインストールする
  • Gitをインストールする

Stable Diffusion web UI

  • ダウンロード
  • インストールと実行
  • 画像の出力

Pythonをインストールする

Windows 11を使用しているなら、Microsoft Storeからインストールする。Pythonで検索して、バージョンは3.10を選択する。

コマンドプロンプトで下記のコマンドを実行して、Pythonの後にバージョンが表示されればインストール成功。

> python --version
Python 3.10.10

Gitをインストールする

Git for Windowsのサイトからインストーラーをダウンロードして実行する。

コマンドプロンプトで下記のコマンドを実行して、gitの後にバージョンが表示されればインストール成功。

> git --version
git version 2.39.2.windows.1

Stable Diffusion web UIのダウンロード

インストールしたいフォルダで下記のコマンドを実行する。
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git

> git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
Cloning into 'stable-diffusion-webui'...
remote: Enumerating objects: 17046, done.
remote: Counting objects: 100% (253/253), done.
remote: Compressing objects: 100% (173/173), done.
remote: Total 17046 (delta 148), reused 151 (delta 79), pack-reused 16793
Receiving objects: 100% (17046/17046), 27.92 MiB | 7.52 MiB/s, done.
Resolving deltas: 100% (11888/11888), done.

modelのダウンロード

Stable Diffusion web UIだけでは画像を出力することは出来ない。様々な画像を学習させて作成した「model」が必要になる。「model」の種類によってアニメ系が得意、リアル系が得意、背景が得意など色々あるが、今回は下記のアニメ系が得意なモデルをダウンロードする。画像を出力して気に入らなければ、別のモデルを探せば良い。

https://huggingface.co/andite/anything-v4.0/tree/mainのページにあるanything-v4.0-pruned.safetensors(v4.5の方が良いかも)をダウンロードして、Stable Diffusion web UIのインストールフォルダ下のmodels/Stable-diffusionフォルダに保存する。

VAEのダウンロード

VAE(変分自己符号化器)の導入は必須ではない。
必須ではないが、VAEを導入することで画像が鮮明になったり、より細かいディテールで出力されるようになる。

https://huggingface.co/stabilityai/sd-vae-ft-mse-original/tree/mainのページにあるvae-ft-mse-840000-ema-pruned.safetensorsをダウンロードして、Stable Diffusion web UIのインストールフォルダ下のmodels/VAEフォルダに保存する。

この先の手順を実行して、Stable Diffusion web UIをインストールした後に、Stable Diffusion web UIの画面上で下記の設定を行う。

画面上のメニューの「Settings」、次に左のメニューの「Stable Diffusion」をクリックし、SD VAEの項目のプルダウンからvae-ft-mse-840000-ema-pruned.safetensorsを選択し、「Apply settiongs」をクリックする。

EasyNegativeのダウンロード

Stable Diffusion web UIでは、Promptに入力したテキストによって画像の出力内容を制御する。しかし、それだけでは低品質の画像が出力されたり、足が3本あったり、指の方向がおかしい画像が出力されたりする。

そこで画像を出力するときは、Negative Promptに「(worst quality, low quality:1.4), multiple limbs」のようなお決まりの文言を入力してそれらの画像が出力されることを抑制する。EasyNegativeを使用するとそれらの面倒な入力をある程度省略することが出来るようになる。

https://huggingface.co/datasets/gsdf/EasyNegative/tree/mainのページにあるEasyNegative.safetensorsをダウンロードして、Stable Diffusion web UIのインストールフォルダ下のembeddingsフォルダに保存する。

ダウンロード後、Stable Diffusion web UIが起動中であれば再起動する。Negative PromptにEasyNegativeと入力すれば適用出来る。

Stable Diffusion web UIのインストールと実行

インストール前にダウンロードしたフォルダのwebui-user.batをエディターで開き、COMMANDLINE_ARGS=の後に–xformersを追記する。

@echo off

set PYTHON=
set GIT=
set VENV_DIR=
set COMMANDLINE_ARGS=--xformers

call webui.bat

webui-user.batを実行する。初回起動時、実行に必要なソフトウェアが自動的にダウンロードされる。データ通信量(数GBほど)も多くかなり時間がかかる。

色々メッセージが表示されるが、下記の一文が表示さればインストールと起動が成功している。

Running on local URL:  http://127.0.0.1:7860

上記のURLにブラウザからアクセスすると、下記の画面が表示される。

画像の出力

txt2imgタブのPromptに文言を入力し、Generateをクリックすると、画像が出力できる。しかし、最初は何を入力したら良いかわからないと思う。

そこで、PNG Infoタブの機能を使用する。このSource欄にStable Diffusion web UIによって出力された画像をドラッグアンドドロップすると、その画像を出力したときのPromptを見ることが出来る。Promptが表示されたらSend to txt2imgをクリックすることで内容をコピーすることが出来る。

例えば、AIによって出力されたと表記されている画像を画像投稿サイトからダウンロードして、上記の機能を利用すれば同じような画像を出力出来る。

ただし、使用している「model」が違えば生成される画像はかなり違ってくるため、出来るだけ同じ「model」で出力された画像を選ぶか、同じ「model」をインストールしておく。どの「model」を使用しているかも、PNG Infoで確認出来る。

試しに下記画像をダウンロードして、画像を生成してみる。

上記の画像をダウンロードしたら、PNG InfoのSource欄にドラッグアンドドロップする。すると下記のように出力時の情報が表示されるので、Send to txt2imgをクリックする。

txt2imgに先ほどの内容が入力されたのを確認したら、Generateをクリックする。(初回実行時は時間がかかる)

ほぼ同じ画像が出力された。Seed欄横のサイコロのようなボタンをクリックすれば、Seed値が初期化されランダム生成に変わるので、Promptの条件に沿った違う画像を出力することが出来る。

その他設定変更

Clip skipには2を設定すると良いらしい。

RTX Video Super Resolutionを使う

AIを活用したアップスケーリング機能が、Google ChromeおよびMicrosoft Edgeブラウザで使用できるようになったらしいので早速設定する。ビデオの解像度より大きな解像度のディスプレイで再生する場合、単純な拡大だとぼやけた感じになってしまうところを、AIによってシャープにすることが出来るらしい。

どのような機能なのか詳しい内容はこちらの記事(Pixel Perfect: RTX Video Super Resolution Now Available for GeForce RTX 40 and 30 Series GPUs)を参照。

1.スタートボタンからNVIDIA Control Panelを起動する。

NVIDIA Control Panelの「ビデオ イメージ設定の調整」にある、「RTXビデオ強調」をオンにする。

Eclipseのフォントを変更する

いつもEclipseでコーディングするときは、MS ゴシックを使用していた。しかし、最近になってもっと見やすいフォントに変更したいと思うようになった(歳のせいかもしれない)。その過程で、プログラミング向けフォントというものがあることを知った。

これらのプログラミング向けフォントは幾つかの種類が公開されているが、今回は日本語に対応している「UDEV Gothic」を試してみることにした。

フォントのインストール

ダウンロードしたファイルを解凍して、右クリックのメニューからインストールをクリックする。UDEV Gothic内にも色々なスタイルが存在しているが、標準で良ければ以下の選択で良い。

Eclipseのフォントの変更

Eclipseの設定から、一般>外観>色とフォントを選択し、「テキスト・エディター・ブロック選択フォント」と「テキスト・フォント」のフォントをUDEV Gothicに変更する。

適用して閉じると以下の通りエディターのフォントが変わる。
変更前(MSゴシック):

変更後(UDEV Gothic):

かなり見やすくなったと思う。

Ubuntu Proを使ってみる

少し前に個人利用であれば、Proバージョンを無償で使用できるようになった。そこで、このサイトとは別に個人で利用しているサーバーのUbuntuをProにアップグレードしてみる。

Ubuntu Oneアカウント作成

Proバージョンの利用を始めるには、Ubuntu Oneアカウント作成しTokenを発行する必要がある。まだ持っていない場合は、以下のURLにアクセスしてアカウントを作成する。
https://login.ubuntu.com/

ログイン後、トップ画面に戻り、右上メニューのUbuntu Pro dashboadをクリックする。

画面が切り替わり少し待つと以下のような画面が表示されFree Personal Tokenが発行される。

Ubuntu Proにアップグレードする

Ubuntu Proを利用したいサーバー上で以下のコマンドを入力する。

sudo apt update
sudo apt upgrade
# 必要ならここでサーバー再起動
sudo pro attach 先ほどのトークン
sudo apt install ubuntu-advantage-tools
sudo apt update
sudo apt upgrade

ChatGPTを使ってみる

ちょっと試してみたくなった。

ユーザー登録

ユーザー登録だけで、今は無料で使用できる。最初に以下のページにアクセスし、「TRY CHATGPT」をクリックしてユーザー登録を行う。
https://openai.com/blog/chatgpt/

使ってみる

試しに「ChatGPTを上手に使うには?」と質問してみた。

ChatGPT:ChatGPTを上手に使うには以下のようなポイントがあります。

  1. 明確な質問をすること: ChatGPTには具体的な質問をすることが重要です。
  2. 十分な情報を提供すること: 質問に対する回答を最適化するために、できるだけ多くの情報を提供することが大切です。
  3. 自然な言語を使うこと: ChatGPTは人工知能モデルですが、自然な言語を使うことで、より正確な回答を得ることができます。
  4. 信頼性の高い情報ソースからの情報を求めること: ChatGPTはトレーニングデータに基づいていますが、常に正確な情報を保証することはできません。正確な情報を求める場合は信頼性の高い情報ソースからの情報を求めることをお勧めします。

対話式に質問を続けられるはすなので、さらに意地悪に質問を掘り下げてみた。

「ChatGPTからの回答が間違えている可能性はどのくらいあるのか?」

ChatGPT:ChatGPTはOpenAIによってトレーニングされた大規模な言語モデルですが、常に正確な回答を保証することはできません。トレーニングデータに基づいて回答を生成しますが、トレーニングデータに誤りが含まれていたり、最新の情報が含まれていなかったりする場合があります。また、ChatGPTは意図や文脈を正確に理解することもできない場合があります。そのため、ChatGPTからの回答を単独で信頼することは避け、常に他の情報源と照らし合わせて判断することが重要です。

「そうではなくて、間違いが含まれている可能性の具体的な数値を知りたい。」

ChatGPT:具体的な数値は提供されていませんが、ChatGPTは高精度の言語モデルであり、多くの場合、正確な回答を生成します。ただし、トレーニングデータに基づいているため、トレーニングデータに含まれていない情報や最新の情報に対する回答など、間違いが含まれる可能性があります。また、文脈や意図の誤りなどもありますので、常に他の情報源と照らし合わせて判断することが重要です。

「最新の情報ほど間違いが含まれている可能性が高いということか?」

ChatGPT:はい、そのような傾向があります。トレーニングデータは一定期間前の情報であり、最新の情報は含まれていない可能性があります。また、最新の情報はまだ完全には明らかでない場合もありますので、正確性が低い可能性があります。そのため、最新の情報に関する質問に対しては特に他の情報源と照らし合わせて確認することが重要です。

まとめ

同じような回答になってしまっているところもあるが、自然に会話しているように文章が繋がっている。本当にすごいツールが出てきたと思う。