20210909のJavaに関する記事は9件です。

「JavaはOSに依存しない」ちゃんと説明できるか俺?

はじめに Javaに関することは一通り他人にちゃんと説明できる「つよつよJavaエンジニア」になるための第一歩の記事(そんなこと知らんがなって話ですよねすみません) 当たり前のことなんだけど、改めてOUTPUTして整理しやす まず結論 OSに依存しない理由は「実行環境(JVM)にてバイトコードをOSに合わせた機械語に変換する」から 細かくみていこう プログラミング言語は2種類に分かれる。 「コンパイラ方式」と「インタプリタ方式」 インタプリタ方式は、ソースコードを機械語に変換しつつ実行する。 コンパイラ方式は、ソースコードを事前に機械語に変換してから、一気に実行する。 違いは「事前に機械語に変換するかどうか」だ。 この2つ。事前に機械語に変換するかどうかで↓のような差が生まれる。 インタプリタ方式のBadなところが、コンパイラ方式では実現できている。 コンパイラ方式のBadなところが、インタプリタ方式では実現できている。 ・ ・ ・ これは、インタプリタ方式とコンパイラ方式を融合すれば良いとこ取りできるのでは....!! ・ ・ ・ Java「で、俺が生まれたってわけ」 インタプリタ方式とコンパイラ方式を融合させたJavaとは? こんな感じ。 ↑の通り、コンパイラ方式の良いところとインタプリタ方式の良いところだけを吸収できた。 ややこしポイント1:Javaは2回コンパイルしている 機械語に変換するときも「コンパイル」と言うし、バイトコードに変換するときも「コンパイル」と言う。 Javaの開発現場で「コンパイル」といえば9割9分「javaファイルからclassファイルへの変換」のことを指して会話するが、当然Javaも機械語に変換されて実行されるので「Javaは2回コンパイルされている」と言えるのだ。 ややこしポイント2:JVM内には「インタプリタ」と「コンパイラ」の2つがあって、両方使われる。 ①javaファイル → ②classファイル → ③機械語 JVM内では、②から③にかけて「インタプリタ方式」「コンパイラ方式」の両方で機械語への変換ができる。 「まとめて機械語にコンパイルしてから実行した方がこの処理は効率良いよね」みたいなものはコンパイラ方式を採用し、そうでない場合はインタプリタ方式で実行すると言う具合だ。 ※自分用MEMO インタプリタの何が良いかって、"実行時"にOSに合わせて機械語に変換するからOSに依存しないこと。なので「OSに依存したくないならインタプリタ1択か!」と思っていたが、Javaでは"実行時"に(JVMランタイム環境で)インタプリタとコンパイラの両方を使えるので、理解の仕方としては【JavaはJVMで実行される時に機械語に変換するから、OSに依存しない】としとこう。 ポイント整理 ✔︎ 実行前にコンパイル(classファイルへの変換)をすることで、エラー検知して修正できる。 ✔︎ 通常のコンパイル(機械語への変換)では、コンパイル時点で実行環境となるOSが確定してしまう(OSに依存してしまう)が、Javaではコンパイルの成果物をOSに依存しないもの(機械語ではなくclassファイル)にしているので「実行前に事前にコンパイルしているのにOSに依存していない!」となる。 ✔︎ Javaでは実行環境で「バイトコード→機械語」のコンパイルを行うことができる。JITコンパイラ!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

mockmvcでUnparsable JSON stringが発生する & Response Bodyが常に空になる

SpringBoot MockMvcでControllerの単体テストを書いているときに上記のエラーが発生して1時間程度無駄にしたので備忘録です。 概要 mockmvcで以下のようにレスポンス値を確認するようなコードを書いていました。 (簡略化しています。) Sample sample = new Sample("sample"); mvc.perform(get(URI) .param("userId", "1") .accept(MediaType.APPLICATION_JSON) ).andExpect(status().isOk()) .andExpect(content().json(JsonOutput.toJson(sample))); 実際にはjson化できているにもかかわらず、以下のエラーが出てしまい頭を抱えてしまいました。 Condition failed with Exception: org.json.JSONException: Unparsable JSON string: 原因 モノによると思いますが、基本的にはエラー文の通り、「JSONに変換できないこと」が原因です。 自分の場合は、期待値として設定しているsampleがJSON化できないのではなく、テスト対象のエントリポイントから帰ってくるBody値が空だったため、こちらのエラーがでていたみたいです。 自分が若干悩んだポイントとしては、レスポンス値が空の場合でもAssertが出るのでは?というところですが、 Assertionを出すより先に以下の部分でResponseBodyのJSONパース処理が走って、JSONのパースエラーが出るみたいです。 https://github.com/spring-projects/spring-framework/blob/8f33450df20352ad6eabe632c082d9b02cb46c9a/spring-test/src/main/java/org/springframework/test/web/servlet/result/ContentResultMatchers.java#L227 また、テスト対象のエントリポイントが常に空のBodyを返すという問題についてですが、原因としては、対象コントローラーを以下のように@MockBeanで呼んでしまっており、期待通りにリクエストができていなかったことが問題でした。 @MockBean private TargetController target; 実際には、以下のようにAutowiredで呼ぶ必要があります。 @Autowired private TargetController target;
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Couchbase Server Java SDK解説: エラー処理の基礎

はじめに エラーは避けられません。そのため、SDKには、(一時的な)障害が発生した場合でも、アプリケーションを可能な限り最高の状態に保つという1つの目標に焦点を当てた非常に広範なエラー処理および再試行機能があります。 当然ながら、アプリケーションドメインを理解していないため、SDKだけでは、必要なすべての決定を下すことができません。ほとんどの場合、透過的な再試行が最善の選択になり得ますが、場合によっては、すぐに失敗して別のデータソースに切り替える必要があります。 ここでは、エラー処理の基礎について記します。 別の機会に、高度なエラー処理メカニズム、についても整理したいと考えています。 エラー処理の基礎 次の基本事項は、SDKが再試行の決定を行う方法とエラーがどのように表示されるかを理解するのに役立ちます。 リクエストのライフサイクル 次の画像は、リクエストライフサイクル中の高レベルのフェーズを示しています。 プレディスパッチ Pre-Dispatch: これは、リクエストのライフサイクルの初期段階です。リクエストが作成され、SDKは操作をディスパッチする適切なソケット/エンドポイントを見つけようとしています。 ディスパッチ Dispatch: SDKは操作をネットワークに配置し、応答を待ちます。再試行可能性は要求のべき等性に依存するため、これはライフサイクルの重要なポイントです(後で説明します)。 応答到着 Response Arrived: サーバーから応答が到着すると、SDKはそれをどう処理するかを決定します(最良の場合、操作を正常に完了します)。 まず、例外の大まかな分類について概説します。 応答が到着し、それが失敗を示し、SDKがそれを再試行できないと判断した場合、明示的な例外を除いて操作は失敗します。たとえば、insert操作を実行し、ドキュメントがすでに存在する場合、SDKはDocumentExistsExceptionを発生させて操作を失敗させます。 他のすべての場合、特にプレディスパッチまたはディスパッチ中に障害が発生すると、TimeoutExceptionまたはRequestCanceledExceptionのいずれかになります。 タイムアウト例外 TimeoutException、その実装であるUnambiguousTimeoutExceptionとAmbiguousTimeoutExceptionについて解説します。 タイムアウトが問題の原因になることはなく、常に症状であるという考え方を確立することが重要です。 必要な際にタイムアウトを発生させることは重要です。そうしないと、代わりにスレッドが長時間ブロックされてしまうからです。 タイムアウト例外を使用すると、タイムアウトが発生したときに何が発生するかを制御でき、何らかの理由で操作を完了できない場合のセーフティネットと最後の手段が提供されます。 SDKは、サーバー側に副作用が発生していないことが確実でない限り、AmbiguousTimeoutExceptionを発生させます(たとえば、次のセクションで説明するべき等操作がタイムアウトした場合)。ほとんどの場合、ジェネリックのTimeoutExceptionを処理するだけで十分です。 タイムアウトが原因になることはなく、常に症状であるため、最初にタイムアウトの原因となった可能性のあるコンテキスト情報を提供することが重要です。最新世代のSDKでは、まさにそれを支援するErrorContextの概念を導入しました。 ErrorContext上の方法として利用可能であるTimeoutExceptionを通じてcontext()ゲッターが、ログに出力するとき、最も重要なことは、自動的に例外出力に取り付けられています。TimeoutExceptionコンテキストが添付されたそのようなの出力例を次に示します。 Exception in thread "main" com.couchbase.client.core.error.UnambiguousTimeoutException: GetRequest, Reason: TIMEOUT {"cancelled":true,"completed":true,"coreId":"0x5b36b0db00000001","idempotent":true,"reason":"TIMEOUT","requestId":22,"requestType":"GetRequest","retried":14,"retryReasons":["ENDPOINT_NOT_AVAILABLE"],"service":{"bucket":"travel-sample","collection":"_default","documentId":"airline_10226","opaque":"0x24","scope":"_default","type":"kv"},"timeoutMs":2500,"timings":{"totalMicros":2509049}} at com.couchbase.client.java.AsyncUtils.block(AsyncUtils.java:51) // ... (rest of stack omitted) ... 以下の情報を観察することができます GetRequestは、2500MS後にタイムアウトになった travel-sampleバケットのIDairline_10226を持つドキュメントに関するリクエスト 15回再試行されましたが、その理由は常にENDPOINT_NOT_AVAILABLEだった ENDPOINT_NOT_AVAILABLEは、ソケットが接続されていない/使用できないため、ソケットを介して操作を送信できなかったことを示します。ソケットに問題があることがわかったので、ログを調べて、関連するものがないかどうかを確認できます。 2020-10-16T10:28:48.717+0200 WARN endpoint:523 - [com.couchbase.endpoint][EndpointConnectionFailedEvent][2691us] Connect attempt 7 failed because of AnnotatedConnectException: finishConnect(..) failed: Connection refused: /127.0.0.1:11210 {"bucket":"travel-sample","channelId":"5B36B0DB00000001/000000006C7CDB48","circuitBreaker":"DISABLED","coreId":"0x5b36b0db00000001","local":"127.0.0.1:49895","remote":"127.0.0.1:11210","type":"KV"} com.couchbase.client.core.deps.io.netty.channel.AbstractChannel$AnnotatedConnectException: finishConnect(..) failed: Connection refused: /127.0.0.1:11210 Caused by: java.net.ConnectException: finishConnect(..) failed: Connection refused at com.couchbase.client.core.deps.io.netty.channel.unix.Errors.throwConnectException(Errors.java:124) // ... (rest of stack omitted) ... サーバーに接続しようとしたようですが、接続が拒否されました。次のステップは、サーバー側でソケットの問題をトリアージすることになります。 リクエストのキャンセル RequestCanceledExceptionは、次の場合にスローされます。 RetryStrategyにより、再試行されるべきではないと判断された(RetryStrategyについては、別稿で解説します) あまりにも多くのリクエストが再試行されるのを待ってスタックしている(バックプレッシャーのシグナル)。 操作実行の際に、SDKはすでにシャットダウンされていた 潜在的に他の理由もありますが、それがどこから発生したかは、それが伝える情報ほど重要ではありません。RequestCanceledExceptionを取得した場合は、SDKが操作をそれ以上再試行できず、タイムアウト間隔の前に終了したことを意味します。 透過的な再試行は、RetryStrategyがカスタマイズされており、再試行された操作がデータ損失につながる可能性のあるサーバー上の副作用を実行していないことが確実な場合にのみ実行される必要があります。ほとんどの場合、何が悪かったのかを把握するために、事後にログを検査する必要があります。 事後のデバッグを支援するために、にRequestCanceledExceptionは、ErrorContextを持ち、上記のタイムアウトセクションで説明したものと非常によく似た内容が含まれています。 冪等(Idempotent)要求と非冪等(Non-Idempotent)要求 SDKを流れる操作は、冪等または非冪等のいずれかです。操作が冪等である場合、結果が変更される心配なしに、サーバーに複数回要求を送信できます。 この区別は、SDKがサーバーに操作を送信し、応答を受信する前にソケットが閉じられる場合に重要です。冪等でない場合、SDKは、サーバー側で副作用が発生したかどうかを確認できず、キャンセルする必要があります。この場合、アプリケーションはRequestCanceledExceptionを受け取ります。 冪等である場合、SDKは最終的に成功する可能性があるため、透過的に操作を再試行します。リクエストの種類によっては、別のノードに送信したり、操作がタイムアウトする前にソケット接続を再確立したりできる場合があります。 ネットワークに送信する前、またはSDKが応答を受信した後の操作を再試行する必要がある場合、冪等性は重要ではなく、他の要因が考慮されます。次の図は、要求のライフサイクルで冪等性が重要な場合を示しています。 SDKは、偶発的なデータ損失を回避したいので、どの操作が冪等であると見なされるかについて非常に保守的です。変更操作が誤って2回適用されたが、その間に別のアプリケーションサーバーが変更した状況を想像してみてください。その変更は、潜在的に回復する機会なしに失われます。 Couchbase Serverの次の操作は、冪等と見なされます。 クラスター:search、ping、waitUntilReady バケット:view、ping、waitUntilReady コレクション:get、lookupIn、getAnyReplica、getAllReplicas、exists 参考情報
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Java基礎⑥]配列 複数行を配列に格納 split・hasNextLineメソッド

初めに 前回はJavaの基本的な配列を学習しましたが、 今回は応用編です。 決まった文字で区切って配列に格納する split と、 複数行を読み込むhasNextLineメソッドを学習しました。 split カンマで分割して配列に格納する import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String data = sc.nextLine(); String[] array = data.split(","); System.out.println(array[0]); } } 標準入力で、「ごはん,おかか,梅干し」と打つと、「ごはん」が出力されます。 以下を追記すると、配列の中身を一つずつ出力できます。 配列の中身を取り出す for (String lunch : array){ System.out.println(lunch + "を食べた"); } 複数行データ→配列に格納 まずは複数行のデータを読み込む import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); //行データがある間繰り返すという記述 while (sc.hasNextLine()) { String data = sc.nextLine(); System.out.println(data); } } } このように書けば、行を増やしても増やしても表示されます。 hasNextLine()メソッドは、 入力されてる行がまだあるかどうかを確認するメソッドです。 配列に格納し、拡張for文で出力 import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); //データの数がわからないのでArrayListを用意する ArrayList<String> array = new ArrayList<String>(); while (sc.hasNextLine()) { //データが存在する間、dataに格納する String data = sc.nextLine(); //dataをarrayにaddする = 配列に格納する array.add(data); } //ここからは拡張for文の出番。 for(String str : array) { System.out.println(str); } } } 難:カンマ区切りの複数行データを配列に格納し出力 カンマ区切りのデータが複数行あり、 「りんごを5個買った」「レモンを3個買った」というように出力したい。 標準入力の内容 りんご,5 レモン,3 メロン,5 import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); //行がある限り処理を繰り返す while (sc.hasNextLine()) { String line = sc.nextLine(); String[] fruit = line.split(","); System.out.println(fruit[0] + "を" + fruit[1] + "個買った"); } } } 終わり
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Java基礎⑥]配列 複数行を配列に格納/配列をランダム出力 split・hasNextLineメソッド

初めに 前回はJavaの基本的な配列を学習しましたが、 今回は応用編です。 決まった文字で区切って配列に格納する split と、 複数行を読み込むhasNextLineメソッドを学習しました。 split カンマで分割して配列に格納する import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String data = sc.nextLine(); String[] array = data.split(","); System.out.println(array[0]); } } 標準入力で、「ごはん,おかか,梅干し」と打つと、「ごはん」が出力されます。 以下を追記すると、配列の中身を一つずつ出力できます。 配列の中身を取り出す for (String lunch : array){ System.out.println(lunch + "を食べた"); } 複数行データ→配列に格納 まずは複数行のデータを読み込む import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); //行データがある間繰り返すという記述 while (sc.hasNextLine()) { String data = sc.nextLine(); System.out.println(data); } } } このように書けば、行を増やしても増やしても表示されます。 hasNextLine()メソッドは、 入力されてる行がまだあるかどうかを確認するメソッドです。 配列に格納し、拡張for文で出力 import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); //データの数がわからないのでArrayListを用意する ArrayList<String> array = new ArrayList<String>(); while (sc.hasNextLine()) { //データが存在する間、dataに格納する String data = sc.nextLine(); //dataをarrayにaddする = 配列に格納する array.add(data); } //ここからは拡張for文の出番。 for(String str : array) { System.out.println(str); } } } 難:カンマ区切りの複数行データを配列に格納し出力 カンマ区切りのデータが複数行あり、 「りんごを5個買った」「レモンを3個買った」というように出力したい。 標準入力の内容 りんご,5 レモン,3 メロン,5 import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); //行がある限り処理を繰り返す while (sc.hasNextLine()) { String line = sc.nextLine(); String[] fruit = line.split(","); System.out.println(fruit[0] + "を" + fruit[1] + "個買った"); } } } 難 配列の中身をランダムで出力 以下はじゃんけんプログラムです。 グー,チョキ,パー という標準入力からランダムに出力します。 import java.util.*; public class Main { public static void main(String[] args) { // 標準入力から1行取得 グー,チョキ,パー Scanner sc = new Scanner(System.in); String data = sc.nextLine(); String[] array = data.split(","); // rand変数に、配列の長さの数字をランダムに入れる double rand = Math.random()*array.length; //num変数にint型にしたrandを入れる int num = (int)rand; // ランダムに選んだ配列の要素を出力 System.out.println(array[num]); } } 終わり
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

サーブレットとJSPのキホンのキ

記事の目的 サーブレットとJSPについて入門書を一通り読みましたが、数ヵ月もして久しぶりに触れると一切思い出すことができず、悲しくなりました。今回はそんな悲しい時にさらっと確認して元気になりたいという思いから、超基本的な内容を記事にまとめてみました。 目次 はじめに サーブレットとは JSPとは サーブレットとJSPの役割 参考文献 はじめに サーバサイドプログラミングの仕組みを実現する技術はいくつかあるが、Javaで開発する場合は、「サーブレット」と「JSP」を使用する。 JavaでWebアプリケーションを開発するには、サーブレットコンテナを持つアプリケーションサーバが必要。 (アプリケーションサーバの機能を提供するソフトウェアのことを「サーブレットコンテナ」、または単に「アプリケーションサーバ」と呼ぶこともある) サーブレットとは サーブレットはJavaを使ってサーバサイドプログラムを作るための技術。 サーブレットクラスというクラスを開発することで、アプリケーションサーバ上でそれらを実行できる。 サーブレットクラスはブラウザからのリクエストによって実行され、その実行結果をHTMLで出力する。 Demo.java package controller; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class Demo */ @WebServlet("/Demo") public class Demo extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public Demo() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.getWriter().append("Served at: ").append(request.getContextPath()); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } } ├── Javaリソース/src      └── servlet ─ Demo.jsp ブラウザからリクエストが届くと、アプリケーションサーバはサーブレットクラスのdoGet()を呼び出す。 パラメータとして渡される、 HttpServletRequestはブラウザからの「リクエスト」 HttpServletResponseはサーバから送り出す「レスポンス」 処理をしてから、HTML情報をHttpServletResponseでブラウザに送り返す。 ブラウザからサーブレットの呼び出しは、@WebServlet("/Demo") で定義してあげるとhttp://<サーバ名>/<アプリケーション名>/Demoで実行できる。(Web.xmlで設定することもできる) JSPとは JSP(JavaServer Pages)はサーブレットと同じサーバサイドプログラムの技術。 JSPファイルが、リクエストされるとサーブレットクラスに変換される。 つまり、サーブレットクラスで行えることはJSPファイルでも行える。 違いは、JSPファイルを使用するとHTMLの出力が楽になるという点。 Eclipseを使用している場合、JSPファイルから生成されたサーブレットクラスは、ワークスペース内 .metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\Demo101\org\apache\jsp の中に生成される。 ファイル名は、demo.jsp -> demo_jsp.javaとなる。 demo.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> </body> </html> ├── WebContent ─ demo.jsp      └── view ─ demo.jsp JSPファイルの正体はサーブレットクラスだけど、扱いはHTMLファイルなのでWebContentの配下に保存することで http://localhost:8080/<アプリケーション名>/index.jsp http://localhost:8080/<アプリケーション名>/view/index.jsp で実行できる。 サーブレットとJSPの役割 Webアプリケーション開発(MVCモデル)において ユーザからの要求(リクエスト)を受けて全体の制御を行うコントローラは、サーブレットクラスが担当 ユーザの要求に応える処理を行うモデルは、一般的なJavaクラスが担当 出力を行うビューはHTMLの出力を得意とするJSPファイルが担当 となります。 また、MVCモデルに従ってWebアプリケーションを作ると、ブラウザからのリクエストされるのは基本的にサーブレットクラスとなり、JSPファイルは直接呼び出されない想定である場合が多い。そんな時は、JSPファイルをWebContent/WEB-INFに置くと、直接リクエスト自体を禁止することができる。 JSPファイルの呼び出しは、サーブレットクラスからRequestDispatcherインスタンスのforward()メソッドで行う。 JSPファイルの場合 -> /WebContentからのパス サーブレットクラスの場合 -> /URLパターン 参考文献 スッキリわかるサーブレット&JSP入門
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Visual Studio CodeでOpen LibertyサーバーサイドJavaアプリをデバッグする

はじめに これまでフロントエンドはVisual Studio Code、サーバーサイドはEclipseで開発をしていましたが、Eclipseのヒープが結構とられるため、Visual Studio CodeでJavaも開発できるようにしたいと思います。 私の仕事柄、以下の機能が必要となります。 Javaでコーディングするだけでなく、ローカルでJava EEアプリをデバッグしたい アプリケーションサーバーとしてOpen Libertyを利用したい 参考 セットアップ Visual Studio CodeでJavaで開発環境を整えるため、前提として以下のセットアップを行います。 Java SDK (JREではないです) maven Visual Studio Code Visual Studio Codeを立ち上げたら、以下の拡張機能をインストールします。 Extention Pack for Java Open Liberty Tools pom.xmlの変更 webアプリ用のpom.xmlにOpen Liberty Toolsへのbuild依存を追加します。 <build> <plugins> <plugin> <groupId>io.openliberty.tools</groupId> <artifactId>liberty-maven-plugin</artifactId> <version>3.4</version> </plugin> </plugins> </build> liberty-maven-pluginが追加されているプロジェクトを自動スキャンして、LIBERTY DEV DASHBOARDにそのアプリが表示されます。 ワークスペース全ファイルをスキャンしているためか、ここになかなか対象アプリが表示されない場合があります。 server.xmlの用意 Libertyの設定を行うserver.xmlはsrc > main > liberty > config > server.xmlに配置します。こちらのファイルもホットデプロイ対象です。こちらのファイルを編集して、Libertyのfeatureの編集やその他依存ライブラリーを定義します。以下はその一例です。 <server description="new server"> <!-- Enable features --> <featureManager> <feature>webProfile-8.0</feature> <feature>localConnector-1.0</feature> </featureManager> <!-- To access this server from a remote client add a host attribute to the following element, e.g. host="*" --> <httpEndpoint httpPort="9080" httpsPort="9443" id="defaultHttpEndpoint"/> <!-- Automatically expand WAR files and EAR files --> <applicationManager autoExpand="true"/> <!-- Default SSL configuration enables trust for default certificates from the Java runtime --> <ssl id="defaultSSLConfig" trustDefaultCerts="true"/> <jdbcDriver id="db2-driver-local" libraryRef="db2-library-local"/> <library id="db2-library-local"> <fileset dir="C:\temp\db" id="db2-fileset-local" includes="db2jcc4.jar"/> </library> <dataSource id="db2-SQL Database-local" jdbcDriverRef="db2-driver-local" jndiName="jdbc/defaultDS" statementCacheSize="30" transactional="true"> <properties.db2.jcc databaseName="BLUDB" password="yourPassword" portNumber="50000" serverName="yourServer" translateForBitData="2" user="user"/> </dataSource> <logging traceFileName="stdout" traceFormat="BASIC" traceSpecification="eclipselink.sql=all"/> <applicationMonitor updateTrigger="mbean"/> </server> Open Liberyの起動 LIBERTY DEV DASHBOARDの対象アプリを右クリックしてstartを実行します。初回時に、Open Liberyの最新版をダウンロードして自動セットアップされます。 起動が完了すると、localhost:9080 にアクセスしてみましょう。ちゃんと自分のwebアプリがローカルで稼働していることが確認できます。 デバッグの実施 VS Codeの「実行とデバッグ」からlanch.jsonによるデバッグ設定を表示し、以下のDebug Liberty部分を追加します。 { "version": "0.2.0", "configurations": [ { "type": "java", "name": "Debug Liberty", "request": "attach", "hostName": "localhost", "port": 7777 }, { "type": "java", "name": "Launch Current File", "request": "launch", "mainClass": "${file}" } ] } 左上の実行とデバッグのプルダウンより定義したDebug Libertyを選択し、その左の緑の▷を実行します。 コールスタック・ビューにLibertyサーバーのJavaのスレッドが見えたら成功です。自分のソースコードの開いて任意の場所にブレークポイントを設定して、アプリを呼び出してみましょう。変数の中身などもちゃんとデバッグモードで確認可能です。 感想 VS Codeがちょっともっさりになりました。デバッグ含めて通常のJava サーバーサイド開発はできそうですが、なんか重いですね。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Java】Javaで出来ること

目的 Javaで出来ることを把握する。 目次 Javaの特徴 アプリの開発 Webサイトの作成 Webサービス システムの開発 組み込みシステムの開発 Javaの特徴 まず、Javaの特徴ですが、以下のような特徴があります! ・実行速度が速い ・ライブラリが充実している ・プラットフォームに依存しない Javaは環境に左右されない言語で、JVM(Java Virtual Machine:Java仮想マシン)が入っていればWindowsでもLinuxでもMac上でも動きます。 アプリの開発 まずJavaで出来ることの1つにアプリの開発があります。 特にJavaで開発されるAndroidアプリはとても多く、Androidスマートフォンアプリのどんな分野も開発できるため、標準開発システムと言えます。 また、パソコンのアプリにもJavaで開発されたものがあります。 Webサイトの作成 続いてJavaで出来ることとして、Webサイトの作成があります。 Javaの役割としては、サーバー側のプログラム処理に利用されます。 他の言語である「Ruby」「PHP」「Python」でも処理することは可能ですが、Javaの方が処理速度が速いといった特徴もある為、Webサイトの作成ではJavaが使用されていることが多いです。 ECサイトや旅行予約サイト、掲示板、SNSといったなんでも作ることができ、有名なところだと、楽天の裏側にJavaが使われています。 Webサービス Javaはインターネットと相性が良く、私たちの想像できるWebサービスは大体Javaを使えば作れます。 有名なところだと、TwitterがJavaを利用しており、Twitterに限らずチケットの予約サイトなどのWebサービスでJavaが使用されています。 システムの開発 システム開発するうえで、Javaはとても安定性に優れた言語で、セキュリティ性も高いシステムになっています。 Javaによって、みずほ銀行や三菱UFJ銀行などの銀行システムが開発されており、その他クレジットカードシステムのほか、金融機関のシステム開発にも用いられています。 組み込みシステムの開発 Javaは元々は家電などに組み込まれ、動作するため、ハードウエアに依存しないプログラムとして開発されました。 ハードウェアに依存しないJavaを使用したシステムに出来ることとして、家電だけでなく携帯電話やブルーレイディスクプレーヤーなどを稼働させるためのシステムを構築させることができます。 最後に こう振り返ると、かなり多くの範囲をカバーしていると感じました。Javaを習得することで、様々な業務に活かすことができそうです。 では。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Python】【Ruby】【Java】ビンゴカード作成問題!

 現在僕はPythonを学んでいます。Pythonを学び始めて1週間ほどが経過したので、過去にRubyやJavaで作成していたプログラムをPythonでも作ってみることにしました。 B:1~15のどれか I:16~30のどれか N:31~45のどれか G:46~60のどれか O:61~75のどれか B | I | N | G | O 13 | 22 | 32 | 48 | 61 3 | 23 | 43 | 53 | 63 4 | 19 | | 60 | 65 12 | 16 | 44 | 50 | 75 2 | 28 | 33 | 56 | 68  上記のような出力結果を得るプログラムになります。 Rubyの場合 Javaの場合 Pythonの場合  以上の流れでコードを載せていきます。 Rubyの場合 puts " B | I | N | G | O" b = (1..15).to_a.sample(5) i = (16..30).to_a.sample(5) n = (31..45).to_a.sample(5) g = (46..60).to_a.sample(5) o = (61..75).to_a.sample(5) 5.times do |count| printf("%3d", b[count]) print " |" print " #{i[count]} |" if count == 2 print " |" else print " #{n[count]} |" end print " #{g[count]} |" print " #{o[count]} " puts "\n" end  後半部分はもう少し綺麗な記述ができそうです。 Javaの場合 package example; import java.util.ArrayList; import java.util.Collections; public class Bingo { public static void main(String[] args) { ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>(); int num = 1; for (int i = 0; i <= 4; i++) { ArrayList<Integer> list = new ArrayList<>(); for (int j = num; j <= num + 14; j++) { list.add(j); } Collections.shuffle(list); lists.add(list); num += 15; } System.out.println(" B | I | N | G | O"); for (int i = 0; i <= 4; i++) { for (int j = 0; j <= 4; j++) { if (i == 2 && j == 2) { System.out.print(" "); } else { System.out.printf("%3d", lists.get(j).get(i)); } if (j != 4) { System.out.print(" |"); } } System.out.println(); } } } Pythonの場合  今回作ったPythonでのビンゴカード作成問題です。Rubyとほぼ同じやり方で解きました。Pythonの方がRubyよりもシンプルな記述が可能な印象です。  「sample」のように、重複なしで特定の範囲から複数の値を取得できるメソッドがJavaでは見当たらなかったため、Javaの場合はその辺が少し複雑になっています。 import random b = random.sample(range(1,16),5) i = random.sample(range(16,31),5) n = random.sample(range(31,46),5) g = random.sample(range(46,61),5) o = random.sample(range(61,76),5) print(" B | I | N | G | O ") for j in range(5): print("%3d" % b[j],end=" |") print("%3d" % i[j],end=" |") if j == 2: print(" ",end=" |") else: print("%3d" % n[j],end=" |") print("%3d" % g[j],end=" |") print("%3d" % o[j])  ご意見いただけると非常に勉強になります。よろしくお願いいたします。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む