変奏現実

パソコンやMMORPGのことなどを思いつくまま・・・記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

この画面は、簡易表示です

未分類

バイオセントリズム

死後も意識は生き続ける。
ランザ博士は、「生命中心主義(バイオセントリズム)」を標榜し、意識と物質である肉体はまったくの別物であると仮定、意識こそが物質を生み出しているという大胆な仮説を提唱していることで知られる。この仮説の根底には量子力学に見られる観測者問題がある。光が観測されている状態では粒子として振る舞い、観測されていない状態では並として振舞う「二重スリット実験」から、ランザ博士は物質に還元できない意識が宇宙において重要な役割を果たしていると考えているのだ。
だそうだ。
二重スリット実験の不可思議な結果は、外部の観測者(巨視的な視点)のための観測(つまり何かの測定器)が与えられると、波動的な特徴は収束してしまい見えなくなってしまうのは単に設置した観測装置がスリッドを通過する光子から波動的な特徴は取り除いてしまうけど・・・
なぜそうなるのか、まだ判っていない。光子の波動的な振る舞いについては『よく判りません』な状況。
しかし、この人は、英知のある人類という観察者の存在がその結果を導いたのだ!
という、ありがちな(都合の良い)方向に発展させたらしい。
勿論、勘違いも甚だしいモノとは思うけど、面白ければビジネスになる世の中なので、それはそれでいいのかもしれない。
「信じる者は救われる」という言葉があるので、「信じている間は救われた様な気分がする」だろう。
先の測定器の欠陥が判る日までは。(合掌
仮に「死後も意識は生き続ける。」として、肉体を牢獄として捉えると、死は肉体からの解放と云えるが、肉体からの五感を失った意識は何から情報を得、また何へ情報を伝えることができるのだろうか?情報を得ることも外部へ送ることもできないような気がする。それは刑期の終りが無い禁固刑に処せられる事を意味するではないだろうか?



Intel Core-9 9900K

ネットのニュースを見てネームに9が続くので、Core-i シリーズはこれが最後なのかな?と思いました。
※次は9990Kで、その次の9999Kがラストかもしれない
それに出ていたのはCoreのKシリーズだけなのであまり関心が無い。(これで遊ぶゲームが無いせい。
INTELのデータシートを見ると、
開発ネームはCoffee Lakeのまま。リソグラフィーも14nmのまま。
第八世代のデータ(モバイルしかなかったのでコア数、スレッド数、キャッシュ容量は比較しない)との違いは、ターボブーストで200MHzほどUPしているくらい。
Core  i9-8950HKで消費電力等の都合でモバイル用に削った部分を補ったデスクトップ版のような感じがするので、やっと、Core  i9-8950HKのデスクトップ版が出た!感じなのかな?
性能はハイエンドの3Dゲームを2つ同時にプレイできるくらい凄いらしいので、FF14のプロデューサーレターライブでアップデート前後のプレイの比較するのを見た記憶があるが、これを1台で見せる芸当もできるのだろう。
さて、これがシリーズ最後(と勝手に妄想中!)なら新しいシリーズ名は何になるのだろう?
Intel Thread-16 とかになるのだろうか?
AMDのThreadripperっぽくて没かな。
まさか、Intel Amazing processor とか、没個性的なものにはならないだろうし、
どんなのになるのかな・・・
Optaneメモリも気になるけど、本来CeleronやPentiumの方が「システム全体の応答性」が悪く特にHDDアクセスが遅いので特に重宝しそうなのに、「第7世代インテル® Core™ プロセッサー・ベース・プラットフォーム以降のシステム・アクセラレーション・ソリューションです」になっているし、(大笑
とりあえず、今回CeleronやPentiumの発表は無く、仮に出ても、オンボーのGPUが撃速になったり、TDPが異常なまでに下がってたり、でも限り買い替える必要は感じない気がする。
気になるのは、GPUボードを出すらしいというくらいかな?
細菌のハイスペックCPUを見ると、INTELもAMDも株主とマスコミの空気しか見ていないご様子で、一般向けのCPUはさっぱりな気がする。これではどんどんPCの販売台数はB2Bに偏っていくだろう。
いづれにしても、来年が楽しみだ。(と去年も云ってた気がするなぁ・・・



【sandisk】SDCZ430-032G-J57

USBメモリSDCZ43-0 がヘタリ気味なので、新たなUSBメモリをAmazonでポチりました。
SDCZ430-032G-J57
性能は、

読取り速度 最大130MB/秒、書込み速度は USB2.0ドライブよりも最大15倍スピードアップ(32GB~256GB) 

の通りでした。

SanDisk(サンディスク) USBメモリー 親指サイズの小型設計 Ultra Fit USB3.0対応 最大130MB/s 32GB 海外パッケージ品 SDCZ43-0
はキャップ付きだったけど、これは

超小型だからノートPCに挿したままでも気にならない

ということでキャップ無し。
【Fire, Fire HD 8, Fire HD 10対応】Samsung microSDカード32GB EVOPlus Class10 UHS-I対応 Nintendo Switch 動作確認済 正規代理店保証品 MB-MC32GA/ECO
も一緒に買ったけど、こっちはどうかな?



【Eclipse】Maven プロジェクトのJAVAバージョンが1.5になってしまう

EclipseのMavenプロジェクトでpom.xmlからmvn install とかすると、プロジェクトのJAVAのバージョンが1.5になってしまう。
対策としては、本家から。
Propertiesの項目を見ると、

    <project>
      ...
      <properties>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      </properties>
      ...
    </project>

と、1.7に書き換えて保存すると、即反映される
※自動的にビルドするがONなたば・・・
デフォが1.5なんだろうなぁ・・・



【Thorontail】セッションは?

JAX-RSでググって
(1)21 HTTPセッションを使用したステートフルJAX-WS Webサービスのプログラミング
を見つけ
通常、JAX-WS Webサービスはステートレスです。
という、当然のことが書いてあった。
ログイン情報とか、前に操作したページに履歴とかどうしようかと思ってたら、
当然の様に「しかし、HTTPセッションを使用して複数のWebサービス呼出しにわたって状態を保持すれば、」
とあったので、そのまま・・・
@Resource で、 コンテクストをマップしてみたが
NullPointerException 敗退。
よく見ると、

@WebService
という、別系統のアノテーション(つまりJAX-WS)の場合に有効な手段だったようだ。

JAX-RSかJAX-WSなのかで、アノテーションの書き方が全く違ってしまう。
Javaも使われて長くなってきたから、派閥(あるいは黒歴史)の垣根が酷いなぁ~(合掌
ま、同じアノテーションだったら、Importsのクラスパスのミスでハマりそうだけどね。
暫く探し続け、やっとRSの方があった
(2)[Java]JAX-RSはセッションを自動で開始しない
を見つけた。
以前メソッドのパラメータにHttpServletRequest requestを置いたら、別系統のメソッドと判定されInvokeに失敗してヒドイ目にあったが、アノテーションでインジェクションすればよかったらしい。
メソッドのパラメータに@Context HttpServletRequest requestを置いてお願いしてみたら、GETできた。
後は、
String data = session.getAttribute(“何たら”);
で取得し、
session.setAttribute(“難たら”, データ);
で、最新の内容に更新すればいいから、楽で良かった。
でも、ログイン情報とか、操作履歴とか、その辺のWebサービスはパラメータに@Context HttpServletRequest requestを置かないといけないことになった。
また、この記事の通りに、
String id = request.getSession().getId();
return Response.ok(戻り値).cookie(new NewCookie(“JSESSIONID”, id)).build();
と、やっておけば、クライアントからもIDが見れるし、Webサーバーを並列化した時にも、DBにセッション(+アカウント情報)・テーブルを置けば・・・なんとかなるのかもしれない。
 
おかしいな?
マイクロ・サーバーでお手軽なThorontailでウハウハのハズだったのに、
どんどん、変な深みにはまっていく。
 
既に、WEBサーバーと云うよりも、
ブラウザから観れば、
mavenのリポジトリィから好き勝手にパッケージを見繕ってくっ付けられるHTTPプロトコル・インタープリター
な気がしてきた。
HttpServletRequestとHttpServletResonseクラスがベタで使いやすかったらよかったのになぁ・・・
いや、listen()を直で呼び出すと、取りこぼししやすいのが、本当の問題点な気がする。



【Eclipse】Eclipseの上からThorntail Demoを直接起動してみた

これがTomcatかJBossのアプリのプロジェクトなら、
実行⇒サーバーから実行
で起動できるが、
WebプロジェクトのランタイムにThorntailが無いので簡単には直接起動できない。
また、Thorntailのサイトのジェネレータで作ったものはmavenプロジェクトなので、
Eclipseとはちょっと相性が悪い。
変なエラーが消えなくなったら、プロジェクトを右クリック⇒maven⇒プロジェクトの更新 で大体直ってしまうが、
プロジェクトのプロパティのJavaのビルド・パスにある「JREシステム・ライブラリィ」がデフォ(実行環境)に戻ってしまうので、代替えJREにしていると毎度直さないといけない。
ビルドしなおすのに Eclipseのクリーンとmav install の両方でやらないと、やはり調子が悪い。
コマンドラインからはmvn thorntail:runで起動するが、mvnはターゲットではないので、この設定ではEclipseからは起動できない。(らしい
実行しようとしても、
Mainが!
not foundexecption x:\xxxxxxxx\xxxxxxxxx\xxxxx\lasspath!
と出てエンストするだけ。
悩んだ末、
プロジェクトのtargetフォルダにビルドしてあったdemo-thorntail.jarを
demo-thorntail.zipの別名でコピって、
エクスプローラのZIP拡張機能を使って中を調べたら、
org\wildfly\swarm\bootstrapのフォルダにMain.classを見つけたので
メイン・クラスはorg.wildfly.swarm.bootstrap.Mainに決定。
 
更には
実行の設定画面のクラスパス・タグで、
プロジェクトのtargetフォルダに実行に関わりそうなJarやWar
(先のjarファイルと親プロジェクトと思われるwarファイル)
demo.war – \demo\target\
demo-thorntail.jar.war – \demo\target\
の2つを追加。
GOすると、ブラウザから http://127.0.0.1:8080/{作ったサービス} で反応があった。
【実行】させるのはいいけど
コマンドラインから起動したように
taskkill /im java.exe /fでは消せない。
タスクマネジャーで見ると、
Eclipseのプロセス・グループの配下のサブ・タスク(Java(TM) Platform SE binaryという名前)として起動されているから
Eclipseを終了すると綺麗に消えてくれるが、
これは時間がかかるので、タスクマネージャに載ってたEclipseのサブ・タスク(Java(TM) Platform SE binaryという名前)をクリックして「タスクの終了」から終了させた方がいいだろう。
今度は【デバッグ】で実行してみると、ブレークポイントがサクっと当たるので楽チンだった。【停止】ボタンで先のサブ・タスクも消える。
次からはコレで行こう。
しかし、mvn thorntail:runから起動している訳では無いので
ソースを修正すると、デバッグ・ビューには一斉に「同期が取れていない」表示になってしまう。
【停止】してPOM.XMLからmvn installで再ビルドしないと直らないので、
ソースを修正する度にThorntailを【デバッグ】再起動することになってしまい時間がかかる。
ブレークポイントを設定して、そこで止めるダケなら、この方法でもいいけど、操作方法でたまに違うスレッドがあたってしまうこともある。
ソースにチマチマとLOGを入れる時はリモート・デバッグのブレークポイントで止めて修正&ビルド&RELoadの流れの方が便利だ。



【Java】あのテーション

EnumとキャストでInvokeしまくるソースよりは・・・
Strutsの様にその実装をXMLで隠蔽した方が数段マシ。
しかし、StrutsのXMLよりは・・・
SpringというかJAX-RSのアノテーションを使った方がマシ。
とは云うものの自分でアノテーションを書く機会がほとんどなく、すっかり忘れてしまったので

また調べてみた。

Java 独自のアノテーションを作成して値を取得するサンプル
がレイアウトが見やすく、サンプルで使い方を説明していて好感が持てた。
しかし、実際に使うにはサンプルのクラスの中が混ざりすぎ、更に調べてみると
Java Java リフレクションとアノテーションを組み合わせて使用する
の記事が、そのまま使えそう風のサンプル・ソースが付いていたが、特定のクラスしか調べられない。
なので更に調べてみた。
java パッケージ配下のクラス一覧を取得 外部ライブラリは使用しない
特定のパッケージのみだが、そこにあるクラスをザザっと調べるので、使えそう。
ここで、2番目の記事のソースのReflectionUtil.output(Object obj) { … } のパラメータを Class<?> cc に変えてみたバージョンを追加。
途中で後悔しそうになったけど、
Eclipseのエラった時のヘルプの誘導でクリアできた。
書き込んだアノテーションは全部列挙するようになっている(ハズ
でも、f.get(cc.newInstance()); の部分はどうにかならないかな?(と思っている。
途中で本当にドン詰まりになってしまってから・・・
「プロジェクトのJavaのランタイムがJDK5」のままだったことに気が付き、
JDK8に切り替えたので、そこまでの部分は無駄が多いかもしれない。

	public static void output(Class<?> cc) {
		if (cc == null) {
			return;
		}
		System.out.println("クラス名:" + cc.getName() + "{");
		Field[] fieldList = cc.getDeclaredFields();
		for (Field f : fieldList) {
			f.setAccessible(true);
			String name = f.getName();
			System.out.print(" プロパティ名:" + name + " ");
			try {
				/*Object fieldObj =*/ f.get(cc.newInstance());
			} catch (IllegalArgumentException e) {
				// TODO 自動生成された catch ブロック
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO 自動生成された catch ブロック
				e.printStackTrace();
			} catch (InstantiationException e) {
				// TODO 自動生成された catch ブロック
				e.printStackTrace();
			}
			// RetentionPolicy.RUNTIME以外はここがnullになります。
			if (f.getAnnotation(CustomAnnotation.class) != null) {
				Annotation[] anoLst = f.getAnnotations();
				for (Annotation ano : anoLst) {
					Annotation element = f.getAnnotation(ano.annotationType());
					System.out.print(" " + " アノテーションの設定値:"
							+ f.getAnnotation(CustomAnnotation.class));
				}
			}
			System.out.println("");
		}
		System.out.println("}");
	}

これを3番目の記事のソースからちょっこと呼び出してみる。

	public static void main(String... args) throws Exception {
		String packageName = PK_NAME;
		List<Class<?>> classes = getClasses(packageName);
		for (Class<?> class1 : classes) {
			System.out.println(class1.getName());
			//ここから
			Class<?> cc = Class.forName(class1.getName());
			ReflectionUtil.output(cc);
			//ここまで
		}
	}

でも、配下のパッケージとかも対象にして欲しかったのでちょっと追記してみた。

			// ディレクトリ配下のファイル数分ループ
			for (String path : dir.list()) {
				// ".class"で終わるファイルのみ返却用のリストに追加
				if (path.endsWith(".class")) {
					classes.add(Class.forName(packageName + "." + path.substring(0, path.length() - 6)));
					//
				} /* ここから */ else {
					// サブ・パッケージ
					classes.addAll(getClasses(packageName + "." + path));
				} // ここまで
			}

そして実行結果
※検索するパッケージのパスはSampleに変えてあります。

Sample.CustomAnnotation
クラス名:Sample.CustomAnnotation{
}
Sample.demo1.Hoge2
クラス名:Sample.demo1.Hoge2{
 プロパティ名:name アノテーションの設定値:@Sample.CustomAnnotation(value=aaaa)
 プロパティ名:value アノテーションの設定値:@Sample.CustomAnnotation(value=bbbb)
}
Sample.GetClassList
クラス名:Sample.GetClassList{
メソッド名:PK_NAME
}
Sample.Hoge
クラス名:Sample.Hoge{
 プロパティ名:name アノテーションの設定値:@Sample.CustomAnnotation(value=aaaa)
 プロパティ名:value アノテーションの設定値:@Sample.CustomAnnotation(value=bbbb)
}
Sample.ReflectionUtil
クラス名:Sample.ReflectionUtil{
}
Sample.TestMain
クラス名:Sample.TestMain{
}

まだ、調査が甘いけど、アノテーションを使ったワークフレームの雰囲気をちょっとだけ触れた気がしてきた。
もっと理解が進めば、WEBアプリのワークフレームやJUnitモドキを作れるようになれるのかな?(大笑
しかし、一番気になるのはSpringとかアノテーションをたっぷり使ったワークフレームのサンプルだったら、実行やデバッグの準備に半日(かな漢変換すると「反日」がデフォな変な日本語IMEだな)かかったりするんだよね(大笑
やっぱり実装はEnumとキャストでInvokeしまくってるか?良くてもジネリックな<?>や<T>な?ソースだろうから、依存パッケージの微妙なバージョンの違いで、微妙な実行結果が出てしまうんだろうな・・・(トホホ
上のソースにも Class cc) なんて書いてしまってるけど、これなんかはJDKのアップデートが来ただけで、動かなくなることは十分にあり得る。(と思う。
※ソース中の < や > が < や &rt; に化けていたので修正。
※ソース中の メソッド名を プロパティ名に 訂正。
メソッドとプロパティって内包するデータの構造がチョット違う程度なので、今でも同じに見えてしまう。
C言語のStructやClassがJavaではみんなClassな様に、だったらJavaのEnumやinterfaceもClassしても良さそうなものだが、実行時の事前分析がとてもメンドクサイことになり起動がもっともっさりしてしまうに違いない。



【Thorntail】project-defaults.ymlの置き場所

ドキュメント
Auto detection picks up project-defaults.yml from src/main/resources
と書いてあるので、src/main/resourcesフォルダを作って、project-defaults.ymlを置いておけばいいのかな?
その下の
ClassLoader cl = Main.class.getClassLoader();
URL stageConfig = cl.getResource(“project-defaults.yml”);
がベタ過ぎてこまる気がする。
どう書くのかは、この辺
でもデータベースとかポートとかは、この辺かな?
JUnit風にテストするには、arquillianを使うらしい。
本家のドキュメントには
pom.xmlに

<dependencies>
  <dependency>
    <groupId>io.thorntail</groupId>
    <artifactId>arquillian</artifactId>
    <scope>test</scope>
  </dependency>
</dependencies> を付け、さらにproject-defaults.ymlにデータベースの設定(例)が
swarm:
  datasources:
    data-sources:
      MyDS:
        driver-name: myh2
        connection-url: jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
        user-name: sa
        password: sa
    jdbc-drivers:
      myh2:
        driver-class-name: org.h2.Driver
        xa-datasource-name: org.h2.jdbcx.JdbcDataSource
        driver-module-name: com.h2database.h2 と続き、
package org.wildfly.swarm.howto.incontainer;
@RunWith(Arquillian.class)
@DefaultDeployment(type = DefaultDeployment.Type.JAR)
public class InContainerTest {
@ArquillianResource

InContainerTest context;

で、インスタンスを確保して、

@Test
public void testDataSourceIsBound() throws Exception {
    DataSource ds = (DataSource) context.lookup("java:jboss/datasources/MyDS");
    assertNotNull( ds );
}

が走るようになればいいのかな?

}

これで、InContainerTestをGoすればいつもの様にJDBCの設定のテストができるっぽい。
でも、記憶を遡ると、JBOSSのJDBCの設定って通算で4通りくらいあったし、最近のJBOSS系の設定はサッパリだ。
違うドキュメントにはJUnitっぽい方法が書いてあったり、この辺は実際に動かしてみたいと(><; ) わかんないんです!なぁ。
実際のSQLは、どうなるのかな?とググってみると
Connection con;PreparedStatement prepStmt ;ResultSet rs ;
        try {
            Context context = new InitialContext();
            DataSource ds = (DataSource) context.lookup("java:jboss/datasources/${DS名}");
            con = ds.getConnection();
            String selectStatement =  "select * from ${table名} where ${field名} = ?";
            prepStmt = con.prepareStatement(selectStatement);
            prepStmt.setString(1, "*");
            rs = prepStmt.executeQuery();
            while (rs.next()) String title = rs.getString(0);
        } catch (NamingException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            rs.close(); prepStmt.close(); con.close();
        }
のように書けばいいらしい。
というか
<dependency>
  <groupId>io.thorntail</groupId>
  <artifactId>camel-mybatis</artifactId>
</dependency>
を使った方がいいかな。
ここを見たけど、挫折しそう。ここはMyBatisの本家がいい。
本家のドキュメントには The task of the JDBC driver is communicating with the database while providing a constant API to application developers. An application must supply its own JDBC driver because of the wide range of available databases and the driver version. Usually, the application does not directly interact with the JDBC driver; instead, the underlying runtime manages creating a datasource, which provides an efficient way to share and manage a discrete connection or a pool of connections to a particular database using the driver. と書いてあるから先の様にDataSourceを参照すれば、自動的にPostgreSQLConnectionPoolDataSourceが使われてコネクション・プール化されるような気がする。 ただし、postgreSQLの場合はdataSourceNameやinitialConnectionsやmaxConnectionsも必要らしいので、project-defaults.ymlの設定項目が swarm: datasources: jdbc-drivers: org.postgresql: driver-class-name: org.postgresql.Driver xa-datasource-class-name: org.postgresql.xa.PGXADataSource driver-module-name: org.postgresql data-sources:   ${DS名}: driver-name: org.postgresql connection-url: jdbc:postgresql://localhost:5432/postgres user-name: postgres password: postgres で十分なのか?不安がある。 ログ用の書き方はとても長いけど、ちゃんと作らないと困りそう。
swarm:
  logging:
    pattern-formatters:
      LOG_FORMATTER:
        pattern: "CUSTOM LOG FORMAT %p [%c] %s%e%n"
    periodic-rotating-file-handlers:
      FILE:
        file:
          path: path/to/your/file.log
        suffix: .yyyy-MM-dd
        named-formatter: LOG_FORMATTER
    root-logger:
      handlers:
      - CONSOLE
      - FILE

 
 



【nginx】設定ミスでハマる

大方のボンミスはエラるので判るが
初期設定で、
location = /50x.html {
root html;
}
の様な部分がある。
ここだけは、=があっても動くが、
ここをコピってproxy_pathの設定を作ると
location = /rest/ {
proxy_pass http://localhost:8080/;
}
となってしまいがち。
=付なので、/rest/ に完全に一致した場合のみヒットするルールになる様で
/rest/xxxxx/yyyyyなどはヒットせず、
恐らく
location / {
root html;
index index.html index.htm;
}
に沿って探していって、404。
ログには${NGINX}/html//rest/xxxxx/yyyyy not found.となるハズ。
location /rest/ {
proxy_pass http://localhost:8080/;
}
と、気が付いて直すまで結構時間を食ってしまった。
え?ヘボいミスだって?
いっぱいルールを書いた後は、まず気が付かないと思うよ?



nginx(エンジンエックスっぽく発音するらしい)

素で、読み方が判らない。
今回は、このnginxThrontailを繋いでみる。
nginxはv.1.12.2、Throntailはv.2.2Final。
Throntailのプロジェクトを専用のGeneratorで作成するとpom.xmlの<version>1.0.0-SNAPSHOT</version>となるが、
<properties>をみると<version.thorntail>2.2.0.Final</version.thorntail>なのでMavenからは最新のものをダウンロードしているのだろう。
デバッグしやすいようにpom.xmlは

<dependency>
<groupId>io.thorntail</groupId>
<artifactId>bom-all</artifactId>
<version>${version.thorntail}</version>
<scope>import</scope>
<type>pom</type>
</dependency>

の後ろに

<dependency>
<groupId>io.thorntail</groupId>
<artifactId>thorntail-devtools</artifactId>
</dependency>

を、

<groupId>io.thorntail</groupId>
<artifactId>thorntail-maven-plugin</artifactId>
<version>${version.thorntail}</version>

の後ろに

<configuration>
<mode>thin</mode>
</configuration>

を追記しておく。
Eclipseでリモートデバッグする場合は、プロジェクトのフォルダで、以下のコマンドを実行しておく。

cd /d %~dp0
echo on
echo "java.exe 強制終了"
taskkill /im java.exe /f
taskkill /im java.exe /f
taskkill /im java.exe /f
taskkill /im java.exe /f
taskkill /im java.exe /f
pause "☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆"
echo "Throntailリモートデバッグ実行(自動リロード付き)"
mvn thorntail:run -Dswarm.debug.port=8000
pause "☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆"

これでThrontailの方は準備完了。
リモートデバッグを使わないなら、 -Dswarm.debug.port=8000を消す。
nginxは、ダウンロードページから落としたnginx-1.12.2.zipは展開しておく。
nginx.exeを起動するとnginx -s stopで停止、nginx -s reloadで再設定。
らしい。
nginx.confは、

location /rest/ {
proxy_pass http://localhost:8080/;
}

を追記して、/rest/で始まるリクエストは全部/rest/部分を除いたURLでThrontailへ飛ばす様にした。
/rest/login の場合は loginに短くなった後、http://localhost:8080/が頭に付くので、Throntailに渡るURLは、http://localhost:8080/loginになる。

参考ソース
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="css/style.css" >
<script src="script/jquery-3.3.1.js"
<title>Test</title>
</head>
<body>
<h1 class="center">ログイン</h1>
<form class="center">
<table class="center">
<tr>
<th>ユーザID:</th>
<td><input type="text" id="userid" ></td>
</tr>
<tr>
<th>パスワード:</th>
<td><input type="password" id="password" ></td>
</tr>
<tr>
<td class="center" colspan="2"><input type="button" id="send" value="ログイン"></td>
</tr>
</table>
</form>
</body> </html>

CSSはこれだけ。

.center { text-align: center; }
.colspan2 { colspan=2; }
table { margin-left: auto; margin-right: auto; }

ただこのままでは誰が送ってきたのか判らないので、
JAX-RSの @HeaderParam アノテーションを使ってみる。

@Path("/login")
public class LoginEndpoint {
	@GET
	@Produces("text/plain")
	public Response doGet() {
		String msg="ログインしましたget";
		System.out.println(msg);
		return Response.ok(msg).build();
	}
	@POST
	@Produces("text/plain")
	public Response doPost(@HeaderParam("User-Agent") String userAgent,
            @HeaderParam("Accept") String accept,
            @HeaderParam("Accept-Encoding") String encoding,
            @HeaderParam("Accept-Language") String lang) {
		String msg="ログインできるかな?";
    	Map<String,String> map = new HashMap<String,String>();
    	map.put("message", msg);
    	map.put("User-Agent", userAgent);
    	map.put("Accept", accept);
    	map.put("Accept-Encoding", encoding);
    	map.put("Accept-Language", lang);
		System.out.println(map);
    	return Response.ok(map).build();
	}
}

これでHTML+JavaScript+RESTのWebサービスのとっかかりが出来た。




top