結果だけでなく過程も見てください

日々の奮闘を綴る日記です。

噂の画像生成AIソフト「Stable Diffusion」のインストール方法と使用例

デモサイトもある

セットアップが面倒な方、そもそもNVidiaVGAを持っていない!等の方はこちらのデモサイトを利用すると良いでしょう。ただ混み具合によっては時間がかかることがあります。
Stable Diffusion - a Hugging Face Space by stabilityai

筆者の環境

OS Windows 10(64-bit)
VGA Geforce 1060 (6GB)
Python 3.10.6
CUDA Toolkit 11.7
cuDNN 8.5.0

インストール

前提条件としてNVidiaのグラフィクスカードが必要なようです

ドキュメントURL

Stable Diffusion with 🧨 Diffusers

hugging faceのアカウントでのログイン(持っていない場合は作成)

「Usage」のセクションにある、以下の文章の中の「its card」というリンクをクリックする。

In this post we'll use model version v1-4, so you'll need to visit its card, read the license and tick the checkbox if you agree. 

もしくは以下のページに直接飛ぶ。
CompVis/stable-diffusion-v1-4 · Hugging Face

飛んだ先にあるページの「Access repository」ボタンを押下する。

飛んだ先にあるページhugging faceにログインする。
(アカウントがなければここで作成してください)

アクセストークンの作成

このページに飛ぶ。
CompVis/stable-diffusion-v1-4 · Hugging Face

右上のアイコンから→Settingsを選択する。

左のメニューからAccess Token→New Tokenを選択。

Nameには適当な名前をつけ、Roleはreadのままトークンを作成する。

Pythonのインストール

最新版Python(現時点では3.10.6)をインストールする。
Download Python | Python.org

以下のページを参考にインストールする。
Windows版Pythonのインストール: Python環境構築ガイド - python.jp

Anacondaもインストールする必要があるかも?
Windows版Anacondaのインストール: Python環境構築ガイド - python.jp

CUDA Toolkit, cuDNN, pytorchのインストール

以下のページを参考にインストールする。
CUDA+cuDNNをインストールしPyTorchでGPUを認識させるまでの手順(Window11)

CUDA Toolkit(2022/8/24時点で最新11.7)はこちら。

CUDA Toolkit 11.7 Update 1 Downloads | NVIDIA Developer

cuDNNのインストール(CUDAと同様のバージョンを選択してインストールする)

ここはNVIDIAのアカウントが必要になるので、必要に応じて作成する。
https://developer.nvidia.com/rdp/cudnn-download

こちらも参考にしてください。
【NVIDIA】CUDAとcuDNNの導入手順(インストールとダウンロード) : ひまチュンの機械ブログ

CUDAが11.7なのでcuDNNも11.xを選択します。

上記ページの通りC:\tool\cuda配下に「bin」などのフォルダが来るように配置したら、環境変数Pathにパスを通します。

以下をコマンドプロンプトで実行して正しい結果が返るか(エラーにならないか)を確認しましょう。

where cudnn64_8.dll

PyTorchはCUDA 11.6を選んだんですが、なんかうまくいかないので11.3を選択。
以下のコマンドを実行する。

conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch

PyTorchがGPUを認識しているかどうかを確認するため、コマンドプロンプトで以下を順番に入力する。

conda activate pytorch
import torch
torch.cuda.is_available()

結果がTrueとなれば成功。

#True

必要なパッケージのインストール

以降、管理者権限のコマンドプロンプトでconda activate pytorchした上で、以下を実行する。

pip install diffusers==0.2.4 transformers scipy ftfy

Pythonのコード入力

import torch
from diffusers import StableDiffusionPipeline

pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", revision="fp16", torch_dtype=torch.float16, use_auth_token="上記で作成したアクセストークン")

初回はダウンロードでしばらく時間がかかる。

続いて

pipe = pipe.to("cuda")

prompt = "a photograph of an astronaut riding a horse"

from torch import autocast

with autocast("cuda"):
  image = pipe(prompt)["sample"][0]

「a photograph of an astronaut riding a horse」の部分が生成したい画像の説明を入れる箇所。
imageの行は行頭にスペースが必要なので注意(pythonの文法上)
imageの行を入力してEnterを押した後、さらにEnterを押すと画像の生成が始まる。
当方Geforce 1060 (6GB)のため、かなり時間がかかった・・・。(2分くらい?)

画像の保存は以下のコマンドで行う。カレントディレクトリの画像が保存されます。

image.save(f"ファイル名")

再度画像を生成するときには

prompt="a beautiful mountain landscape"
pipe = pipe.to("cuda")
with autocast("cuda"):
  image = pipe(prompt)["sample"][0]

生成された画像

ただの宇宙飛行士が生成されてしまった。馬はどこへ?w

もう一つ、「a beautiful mountain landscape」で出力されたものがこちら。

ゼノブレイド3個人メモ

のんびり進めながらメモしていきます。

ノポンの名簿

場所 NPC ジェムの色
丘陵のキャラバン シルジル
荒野のキャラバン ベネル洞窟の休息地 or レセント湖の休息地 キヌヌ
ネウス湖の休息地 ミムミム
坑道のキャラバン 三話 ゾゾカ
アルフェト渓谷 べレジェ地帯 先陣の野営地 マミマー
古道のキャラバン 四話 ロロカ
第二浮遊岩礁 四話 ジリジリ 黄?
エルティア海 コヌル島 島のキャラバン ハラバラ
ダナ砂漠 砂漠の朽ちた鉄巨神 ソルル
レーべ高原 セイラス段丘 セイラス段丘の休憩地 ツトト
リ・ガート収容所 雑居房区画 闇流しのキャラバン ゴツゴツ エスト「なくした石」の選択肢で決まる
エルティア海 ラヴィア砂丘砂丘島の朽ちた鉄巨神 タムタム
カプトコルヌ山嶺 ザンクの道 ザンクの休息地 モママ 失くしたらしくもらえない
不治ヶ原 古戦場跡のキャラバン ナパパ
エルティア海 ヒクトの入り江 入り江の休息地 ワレワー
高原のキャラバン アカアカー

執政官一覧

エスト名などメモ アルファベット
A
想いの在り処 B
サイドストーリーノア C
一話で合うメビウス D
コロニーイオタ E
F
力の行く先 G
サイドストーリーランツ H
コロニーミュー I
第三話 J
義を見てせざるは K
サイドストーリーユーニ L
Nとペアの… M
イケメン N
なんだな O
Oとコンビの女性 P
ルディのコロニー 優しい右手 Q
R
サイドストーリーセナ S
コロニー15 軍務長 T
U
回想・サイドストーリータイオン V
W
サイドストーリーユーニ X
サイドストーリーミオ Y
ボスっぽい Z

サブクエス

迷いのおくりびと

アグヌス兵との戦闘後のモレイの居場所

ナビゲーションの目的地から北(崖付近)の岩の裏に隠れている

ユニークモンスター

場所 名前 LV
イザナ平原 コロニー9周辺 追従のリリス 5
アルフェト渓谷 ヴォルフのねぐら 飢狗のヴィース 9
コロニー9の北東の水の中 滝の傍 湧泉のマスクィン 24
コロニー9の北東の水の中 醜怪のディープス 24
フォーニス地方 リビ平原 スパス丘陵 老賢のオルダ 20
フォーニス地方 リビ平原 スパス丘陵 隠厚のナラ 19
フォーニス地方 リビ平原 ターキンの本営 愉楽のターキン 23
レーべ高原 リーザの園 幼気のリュミイ 23
ペンテラス地方 インヴィディア坑道 ロアの泉 喧噪のリンプス 27
ペンテラス地方 インヴィディア坑道 閃走のマルロ 28
ペンテラス地方 インヴィディア坑道 ロープを滑っているときに飛び降りる 嫣然のタルタリア 50
ペンテラス地方 コンティ大瀑布 誘蕾のフラリ 32
ペンテラス地方 インヴィディア坑道 地走のボックル 30
シウェラ浮遊岩礁地帯 第四浮遊岩礁 烈日のカーライル 40
シウェラ浮遊岩礁地帯 第三浮遊岩礁 怯懦のポガード 38
ケヴェスキャッスル 格納庫 下層 エクスキューショナーズ(断罪のアビトレイター&誅罰のドミネイター) 42
同上 漆黒の三連星 43
シウェラ浮遊岩礁地帯 エクダソの崖 弩角のダンテス 55
大剣の麓 隠世のルミー 42
大剣の麓 木漏れ日のフローリア 71 まだ
大剣 鍔飾りのファルターレ 47
モクルナ大森林・上層 ターキンの砦 暗愚のターキン 45
インヴィディア山道 要撃戦型フェリト 48
インヴィディア山道 攻城戦型シュルツ 48
レーべ高原 エルセア山峡 怪訝のラキーヌ 45
レーべ高原 エルセア山峡 軒昂のニムルグ 68 まだ
インヴィディア山道 ロスカ洞窟 紅吸血のエヴリス 53
大剣の麓 猪突のサイード 58 まだ
エルティア海 アントルの深淵 荊棘のオーレリア 63 まだ
エルティア海 エルティア中継基地 巡航型ヘリオス 48
エルティア海 エルティア中継基地 司令型インペリオン 49
エルティア海 ディダーラ島 妖蟲のクレオノール 75 まだ
エルティア海 ディダーラ島 忠勇のハーキン 52
エルティア海 アルカフォール半島 欲心のゲロノドン 60 まだ
エレス大道 ロレーテの大岩棚 邪鬼のゴンドバルト 74 まだ
カデンシア地方 至天の滝 幽界のロッドシルト 60
カデンシア地方 ラヴィア砂丘島の地下 64 まだ
エレス大道 イグーナの本営 奸賊のイグーナ 46
カプトコルヌ山嶺 ザンクの道 渦角のバックロウ 56
カプトコルヌ山嶺 ピューラの道 重蹄のトルファン 57
カプトコルヌ山嶺 樹角のクティノス 61
モルクナ大森林・下層 独沼 峻厳のフェネク 78 まだ
シウェラ浮遊岩礁地帯 エクダソの崖 弩角のダンテス 55
シウェラ浮遊岩礁地帯 第四イクシア大橋 侵攻型ガルナック 64
エルティア海 ラヴィア砂丘 猜疑のミズライール 72 まだ
エルティア海 クレセン海岸 頑殻のアドマリー 57
オリジン内部 第二増幅器 這い寄るハマエル 67
オリジン内部 格納庫 上層 虚ろなる者たち 70くらい
オリジン内部 格納庫 下層 迫り来るラドリエル 69
オリジン内部 中央防衛区画 攫み縋るアザエルの出現場所とドロップ情報 69

七鉄巨神の遺産

場所 備考 アイテム
エルティア海 コヌル島 虫眼鏡マークの場所から ルナエリングス

Windows PCを使っていたら突然ネットから切断されオフラインになったときの復旧方法。OS再起動不要で対処します。

ネットワークインターフェースカード(NIC)の再起動だけを行います。

1.まずタスクバーにある以下のネットワークアイコンを探してください。
見つかったら右クリック→ネットワークとインターネットの設定を開く、と選択する。

2.「イーサネット」を選択する

3.「アダプターのオプションを変更する」を選択する

4.自分の使っているネットワークカード(アダプタ)を右クリックする
その後「無効にする」を選び、少しだけ待ったあと「有効にする」に戻す。
複数NICがあり、自分がどれを使っているかわからないときは、「イーサネット」「イーサネット2」などを対象にしてみてください。

これでOS再起動と同等の効果がNICにだけ適用されるはずです。

H2 Databaseをとりあえずレベルで動かしてみる

酔った状態で適当にやったら動いたんだけどね、次の日になったらなんと何も覚えてないの。
なんとか簡単な手順だけでも記録しておかねば・・・。

H2 DatabaseはJavaで動くDatabaseであり、気軽に使用できるDBとしては最適です。
自分もテストで作成してみましたが、わずか1時間程度でJavaから情報を引き出すことができました。

1.まずはJava(JDK)のインストール
これJDKインストールしなくても、JAVA_HOMEでJavaへのパスが通っていればいい気がします。
自分の場合はpleiadesをインストール済みなので、pleiades内のJavaにパスを通しています。

C:\pleiades\2022-03\java\17

JAVA_HOMEの内容はこんな感じで。

2.H2 Databaseのインストール
H2 Database Engine
ここからWindowsインストーラーをダウンロードしてインストールします。

3.スタートメニューからH2 Consoleを起動して新たにデータベースを作成する
とりあえずC:\temp\db2\testにDBを作るとします。
ユーザー名sa、パスワードは空でログインする。

で、ここで存在しないDBがある場合、新規に作られるはずだが、エラーになってしまうことがある。自分はエラーになった。

その場合はタスクアイコンにあるH2アイコンから先に新規DBを作る必要がある。右クリック→Create a New Database→Database path「C:\temp\db2\test」としてパスワードは適当に設定する。

4.テーブルを作成する
SQL文を入力して、実行ボタンを押す。
以下のSQL文でテーブルを作成する。IDと名前を持つテーブルである。

CREATE TABLE BEER(
  ID INT PRIMARY KEY,
  NAME VARCHAR(100) NOT NULL
);

5.テーブルにデータを入力する

INSERT INTO BEER (ID, NAME) VALUES (1, 'SUPERDRY');
INSERT INTO BEER (ID, NAME) VALUES (2, 'YEBISU');

セットした値を確認したいときは以下。

SELECT * FROM BEER;

6.JDBCドライバをダウンロードする
https://www.h2database.com/html/download.html
ここのMaven (Binary JAR, Javadoc, and Source)のBinary JARをダウンロードします。ここではC:\tempに配置することとします。h2-2.1.214.jar。

7.EclipseJDBCドライバを追加する
プロジェクトを右クリック→[プロパティー]→[Javaのビルド・パス]→[ライブラリー]→クラスパスに外部JARの追加でC:\temp\h2-2.1.214.jarを追加する。

8.Javaのコードを書く
パスワードはsaとしていますが、

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

:

String JDBC_URL2="jdbc:h2:file:C:\\temp\\db2\\test";

try
{
	Connection conn = DriverManager.getConnection(JDBC_URL2, "sa", "sa");
	
	String sql = "SELECT ID, NAME FROM BEER";
	PreparedStatement pStmt = conn.prepareStatement(sql);
	
	
	ResultSet rs = pStmt.executeQuery();
	while(rs.next())
	{
		String id = rs.getString("ID");
		String name = rs.getString("NAME");
		
		System.out.println("ID=" + id);
		System.out.println("NAME=" + name);
	}
}
catch (SQLException sqlex)
{
	System.out.println(sqlex);
}

9.Javaコードを実行する
javaファイルを右クリック→[実行]→[Javaアプリケーション]

トラブルシューティング

他の接続をすべて閉じてください的なことを言われたときは、タスクアイコンにあるH2 Database Engineを終了させるといいかもしれません。

Windowsで超シンプルなC/C++のDLL作成方法、C/C++からDLLの関数を呼ぶ方法、JavaからDLLの関数を呼ぶ方法、DLLに含まれる関数の調べ方

今更な内容の個人的メモ。極力手短な手順で。環境はWindows 10(64-bit)です。
例としてVisual Studio Community 2019を使って、2つの整数を受け取り、その和を返す関数を作ります。
JavaEclipse(Pleiades)を使ってます。

C/C++のDLL作成方法

1.[ファイル]→[新規作成]→[プロジェクト]→「dll」で検索して出てきたテンプレートを選択する。プロジェクト名は「sum」とする。
2.ヘッダファイルを作成する。名前はfunc.hとする。内容は以下。

#pragma once
#ifndef __FUNC_H
#define __FUNC_H

#ifdef DLLEXPORTS
#define DllExport extern "C" __declspec(dllexport)
#else
#define DllExport extern "C" __declspec(dllimport)
#endif

DllExport int __cdecl sum(int a, int b);

#endif

3.プロジェクトを右クリック→[プロパティ]→[C/C++]→[プリプロセッサ]→[プリプロセッサの定義]に「DLLEXPORTS」というマクロを定義する
4.dllmain.cppに関数の定義を書く。内容は以下。
ポイントとして必ず上記func.hをincludeすること!(includeしないと関数はexportされません)

#include "func.h"

int __cdecl sum(int a, int b)
{
    return a+b;
}

5.ビルドしてsum.dllを生成する
※以降で使うので同じ場所に生成されたsum.libがちゃんと生成されてるかも確認してください

C/C++からDLLの関数を呼ぶ方法

1.C/C++のプロジェクトを適当に作る
2.プロジェクトを右クリック→[プロパティ]→[リンカー]→[追加のライブラリ ディレクトリ]に上記「C/C++のDLL作成方法」で生成されたsum.libが存在するディレクトリを指定する
3.プロジェクトを右クリック→[プロパティ]→[リンカー]→[入力]→[追加の依存ファイル]に「sum.lib」を追加する
4.上記「C/C++のDLL作成方法」で作成したfunc.hをプロジェクトに追加する。
5.ビルドして実行ファイルを生成する
6.実行ファイルと同じ場所に「sum.dll」を配置してから、実行ファイルを実行する

JavaからDLLの関数を呼ぶ方法

ここの記事はあまりシンプルにまとまっていないかもしれません。ごめんなさい。
1.Eclipse(pleiades)で[ファイル]→[新規]→[Javaプロジェクト]で適当なプロジェクトを作る。ここではプロジェクト名をUseDllとする。
2.プロジェクトを右クリック→[新規]→[その他]→[Java]→[クラス]を選び、パッケージは「samplepkg」など適当なものにし、[名前]のところは「UseDll」とする。また画面下の方から「public static void main」を生成するように設定する。

3.以下にアクセスしてJavaからC/C++のDLLを呼び出すためのJNAのjarファイルをダウンロードする。わかりにくいけど「JNA Platform」あたりにあるjna-platform-5.11.0.jar(バージョンは時期によって異なる)あたりからjarをダウンロードできる。
github.com
4.プロジェクトを右クリック→[プロパティ]→[Javaのビルド・パス]→[ライブラリー]→[クラスパス]→[外部jarの追加]を選び、3.でダウンロードしたjna-<バージョン>.jarを指定する。[適用して閉じる]でウィンドウを閉じる。
5.DLLをJavaから見える場所に配置する。ここがちょっとややこしい頑張ってください。EclipseでworkspaceにプロジェクトUseDllを作っているとしたら「(Eclipse)インストールパス\workspace\UseDll\bin\」の場所にsum.dllを配置してください。
6.UseDll.javaが以下のソースになるようにする。

package samplepkg;

import com.sun.jna.Library;
import com.sun.jna.Native;

public class UseDll 
{
	public interface CLibrary extends Library 
	{
		public int sum(int a, int b);
	}

	public static void main(String[] args)
	{
		// TODO 自動生成されたメソッド・スタブ
		final CLibrary clib = (CLibrary)Native.loadLibrary("sum", CLibrary.class);				
		System.out.println("result = " + clib.sum(10, 32));
	}
}

7.ここからがあまり慣れていない点ですが、ちょっと手探りです。とりあえずうまく動いたので記事は書いていますが、32-bitのJavaをインストールする必要があったり、少し面倒な印象。なんとかならないのかな…。シンプルでなくてごめんなさい。Visual Studio Communityで何も考えずにDLLを作るとどうやらDLLが32-bit版になるようです。で、64-bitのJavaから32-bitのDLLはどうやらコールできないようで・・・Javaも32-bitにする必要があるようです。今回は古い32-bitのDLL(再作成が不可な状況)を想定していますので、Javaを32-bitにする方法を採用したいと思います。
[https://www.java.com/en/download/manual.jsp:title=Java Archive Downloads - Java SE 8 | Oracle 日本]
ここから「Windows x86」(つまり32-bit版)をダウンロードしてインストールします。
8.Eclipseに7.でインストールしたJavaを追加する。[ウィンドウ]→[設定]→[Java]→[インストール済みのJRE]→[追加]自分は「C:\Program Files (x86)\Java\jre1.8.0_333」を追加した。
9.プロジェクトを右クリック→[プロパティー]→[Javaのビルド・パス]→[ライブラリー]でJRE システム・ライブラリーを選択して[編集]ボタン→代替JRE→8.で追加したJREを指定
10.UseDll.javaを右クリック→[実行]→[Javaアプリケーション]

おまけ

DLLに含まれる関数の調べ方

1.VisualStudioの開発者用のコマンドプロンプト(英語でインストールされているときはDeveloper Command Prompt)を起動する
2.dumpbin /exports <対象のDLLファイル>
3.以下のように「ordinal hint RVA name」みたいなヘッダがあれば関数がエクスポートされている(DLLの関数として使える)ことになります。

DLLが64bitか32bitかを調べる方法

1.VisualStudioの開発者用のコマンドプロンプト(英語でインストールされているときはDeveloper Command Prompt)を起動する
2.dumpbin /headers <対象のDLLファイル> | findstr machine
3.「machine (x86)」のような表記の場合は32-bit、「machine (x64)」のような表記の場合は64-bitだとわかる

トラブルシューティング - libファイルが生成されない

おそらくなんらかの理由で関数がエクスポートされていません。
このあたりのコードが抜けていませんか?

#include "func.h"
#define DLLEXPORTS

DLLとして使用できる関数がない場合、libファイルは生成されません。
↑で紹介したdumpbinコマンドで関数がエクスポートされているか確認してください。
libが生成されない場合おそらくは関数のエントリポイントが存在しないはずです。

トラブルシューティング - JavaでDLLが見つからないときのエラーメッセージ

以下のように「指定されたモジュールが見つかりません」と言われます。

Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'sum':
指定されたモジュールが見つかりません。

指定されたモジュールが見つかりません。

指定されたモジュールが見つかりません。

Native library (win32-x86/sum.dll) not found in resource path ([file:/C:/pleiades/2022-03/workspace/UseDll/bin/, file:/C:/temp/jna-5.11.0.jar])
:
:

エクスポート/インポートを自動で切り替えるマクロについて

プロジェクトで「DLLEXPORTS」というマクロを定義しておくとエクスポートになり、定義していないと自動的にインポートになるようなマクロです。DLL関数を定義する際によく使う手法です。

Windows版Discordで「アプリ」を指定して画面共有してるのに、指定したアプリ以外の画面も共有されてしまう現象が発生

題名の通り、指定したアプリ以外の画面がライブに映りこんでしまう現象を確認しました。
これは怖い!!😱ということで情報共有します。
個人的に、これはセキュリティ上かなり重大な問題だと思っています…。


詳細

例として以下の画面を「アプリ」を指定して画面共有しているとします。
CLIP STUDIO PAINTというペイントソフトです。

ここでAlt+Tabを押すと、以下のように「ウィンドウの切り替え画面」が表示されますが・・・

普通なら「アプリ」指定しているのだから、CLIP STUDIO PAINT以外のものは画面共有されないはず、と思うかもしれません。


しかし、実際には、以下「ウィンドウの切り替え画面」の緑色斜線部分も画面共有で見えてしまうのです

メール、ブラウザ、その他テキストなどに本名住所が書いてあったり、一時的にクレジットカード番号が映っていたり、その他見られたくないもの(/ω\)が映っていたりすると、それらすべてライブ視聴者に見られてしまいます。


回避策

画面のキャプチャにOBSを利用する

OBSは有名な画面キャプチャ・配信ソフトです。
OBSはDiscordと連携することができ、PC上の画面をキャプチャする部分をOBSにまかせることができます。
キャプチャをOBSにまかせると、↑で言った「ウィンドウの切り替え画面」が配信に映りこむことはないようです。

OBSとDiscordの連携は以下のURLを参考にしてください。
DiscordでOBSを連携させ画面共有する方法!音が出ない時の対処法も! | しふぁチャンネルのゲーム実況ブログ

配信用アカウントで画面共有を行う

映りこんでも大丈夫なものだけで構成した配信用のアカウントを作成しておき、画面共有をするときはこのアカウントでログオンしなおすという方法が考えられます。…が、めんどうですね。

仮想デスクトップを使う

Windows 10の場合は標準でついている機能ですが、作業するデスクトップを複数に分けられる機能です。
タスクバーのスタートボタンの近くに、以下の赤枠の部分のようなボタンがあると思います。

このボタンをクリックしてから、新しいデスクトップを作成し、そちらで配信で行うという方法が考えられます。
アカウント切り替えよりは面倒ではないですね!

画面共有するアプリを最大化すると、この現象は発生しない…かも?

環境によっては共有しているアプリ(ウィンドウ)を最大化すると現象が発生しなくなるようです。
自分の場合は最大化しても本現象が発生してしまいましたので、確実な回避策ではないようです。


これってバグ(不具合)では?

本件をDiscord公式に問い合わせてみたところ

この動作はすべて意図したものであり、不具合ではない

とのことで、バグではなく仕様とのことでした。


その他Discordの怪しい挙動

画面共有しているアプリを素早く移動させると、なんとその背面にある別のアプリの画面が一瞬見えてしまいます


Apache Tomcatでサーバーが「問題が発生しました」「起動に失敗しました」のエラーメッセージだけを表示して起動できないときの対処法 (Eclipse)

Java/サーブレット/jsp初心者でかなり詰まったときです。
事あるごとにEclipseで↓こいつが表示されたサーバーが起動できなくなるのです。なんでだろうなぁと思っていましたが・・・。

原因はweb.xmlでした。Eclipseサーブレットを追加すると、自動的にweb.xmlに色々と追加されてしまっていて、そいつが悪さをしているようなのでした。
自分はアノテーションを使ってServletのURLを決定しているので、web.xmlには記載が不要だと思うのですが、web.xmlを見ると以下のように色々と記載が追加されていて、それが原因でサーバーの起動に失敗しているようでした。

  <servlet>
    <description></description>
    <display-name>Main</display-name>
    <servlet-name>Main</servlet-name>
    <servlet-class>servlet.Main</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Main</servlet-name>
    <url-pattern>/Main</url-pattern>
  </servlet-mapping>
  <servlet>
    <description></description>
    <display-name>Logout</display-name>
    <servlet-name>Logout</servlet-name>
    <servlet-class>servlet.Logout</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Logout</servlet-name>
    <url-pattern>/Logout</url-pattern>
  </servlet-mapping>

上記をすべて消して、サーバーを起動したら無事正常に起動することができました。

プライバシーポリシー お問い合わせ