Devlopment note / Java 検索結果

検索件数 : 29

1

こんにちは。明月です。この投稿はjavaでjwt(json web token)を発行、確認する方法に関する説明です。私は今までウェブ環境でログイン、ログアウト機能を作成する時、普通セッションを利用する方法でログイン、ログアウトを使いました。実は最近までそのように使いました。セッションを利用して情報を扱ってもクッキーのセッションidを奪われたらセキュリティで問題があることは同じですが、私が知る限り、一番よく使う認証方法ではないかと思いますね。最近、プロジェクトスタイルがマイクロサービスアーキテクチャでモジュール別にサーバーを分割するか大容量トラフィックに合わせてウェブサーバーロードバランシングで複数のサーバーにトラフィック分散形式で構成をします。その場合、問題はログインセッションをどのように構成することでしょう。解決する方法では一つのセッションサーバーを構成してredisデータベースを置いて各サーバーでセッションチェックすることで対応することが可能でしょう。それでも欠点があり、マイクロサービスでウェブサーバーを極端的に分割すればセッションサーバーに負荷になるし、様々な問題が発生する可能性があります。実は私の場合はその状況でjwtを使ったことではなく、プロントエンドとサーバーサイドの作業を分離するところでセキュリティを考える場合、もっと効果的にログイン管理機能を使う方法がないと思うところでjwtということを知ることになりました。リンク - https://jwt.io/introductionjwtの機能を理解することで時間が少しかかりました。考えれば凄く単純な論理式ですが、ログイン情報をサーバーに置かないという固定観念のせいで、この方式がセキュリティで有効かとずっと悩みました。実は認証だけできると思えばその情報をサーバーのセッションに置く理由がないですが。。思えば今まで何でそんなに非効率的にログイン情報をセッションに置いたかと思われますね。reference - https://ansibytecode.com/jwt-peek-into-the-jargon-java-web-token/jwtは上のイメージみたいに「xxxxx.xxxxx.xxxxx」の構造になっています。まず、headerはトークンタイプやアルゴリズム情報に関して設定されています。 そしてpayloadはセッションみたいに使う情報が

Devlopment note / Java

#java,#jwt

作成日付 : 2022/03/14 19:12:58       修正日付 : 2022/03/14 19:14:02

2

こんにちは。明月です。この投稿はjavaでredisデータベースを接続して使い方(jedisライブラリ)に関する説明です。redisデータベースはrdb種類ではなく、nosql種類のkey-valueタイプのデータベースです。簡単に共有メモリのデータベースです。以前の投稿でlinux環境にインストール及び使い方に関して説明したことがあります。リンク - [centos] redisデータベースをインストールする方法とコマンドを使い方そのredisデータベースをjavaで使ってみましょう。javaでredisデータベースを使うためにmavenを通ってjedisライブラリをインストールしなければならないです。リポジトリ - https://mvnrepository.com/artifact/redis.clients/jedis/4.1.1先に基本的にredisデータベースに値を格納して取得するコード作成しましょう。上のソースにはtestキーでhello world値を格納しました。そしてtest1で満了時間60秒のhello world expire値を格納しました。そしてtestとtest1のキーでデータを取得すると上で格納したhello world値が出力します。関連関数に関してはapiドキュメントを参照してください。リンク - https://javadoc.io/doc/redis.clients/jedis/latest/index.html上のソースは単純にkeyキーを利用してデータを格納して取得する処理です。そうすると実践でプログラムを作成する時によく使われるコードを作成して見ましょう。nodeクラスのインスタンスを生成してシリアル化してbyteタイプで変換しました。そしてbyteタイプで変換する値をredisデータベースに入力しました。また、格納したデータを取得しましょう。redisデータベースでnodeキーになっているbyte値を取得して逆直列化してnodeクラスに変換します。print関数を呼び出すと入力したhello world値を出力します。シリアル化すると同じjava言語のプログラムでは問題ありませんが、別の言語のプログラムでは使えません。それでjsonのstringタイプに変換して使いましょう。nodeインスタンスをgsonライブラリ利用してjsonタイプのstringデータに

Devlopment note / Java

#java,#jedis,#redis

作成日付 : 2022/02/16 18:13:17       修正日付 : 2022/02/16 18:14:39

3

こんにちは。明月です。この投稿はjavaのwebsocketでチャット履歴をローディングする方法に関する説明です。私のメールでチャットプログラムを実装する時に、以前にチャットした内容をロードする方法に関して質問があって作成しました。link - [java] websocketを利用してユーザ(サイト運用者)が他のユーザとチャットする方法我々がよく使うスマホでlineなどのチャットアプリの内容はどのぐらいはサーバに格納しますが、基本的にローカル(スマホ内部)に格納することになります。もちろん、pcや他のスマホにも同期化するためにもサーバにも格納するかも知りません。でも、ウェブは基本的にブラウザ政策でローカルファイルを操作(格納及び読み込み、書き込み)が制限されています。もし、ブラウザでローカルファイルが操作できればウェブサイトで接続することだけで内部システムを操作することができると意味なのでセキュリティ脆弱性の問題になります。そうすれば、ブラウザからチャット内容をサーバに格納しなければならないです。チャット内容を格納する方法は様々がありますが、個人的にはデータベースにチャット内容をすべて格納することよりファイルで格納する方がよいと思います。でも、仕様によりdbに格納する場合もあるので、ファイルに格納することや読み込みするところをdbにinsert、updateで格納するし、selectで読み込みすることで修正するとよいです。まず、サーバとクライアント(ブラウザ)と複雑なデータを送受信するためにjsonタイプのデータを扱うほうが良いです。そのため、pom.xmlにjavaで使うjsonパーシングライブラリを使いましょう。link - [java] jsonタイプのデータを使う方法(gsonライブラリ)そしてブラウザから使うhtmlとjavascriptソースです。参考にjavascriptのライブラリはjqueryを使いました。デバッグして実行しましょう。loginテキストボックスとボタンが活性化になっているし、messageボックスとsendボタンが非活性化になっています。testをいれてログインしましょう。そしてaaaaaというメッセージを入れたらチャットでaaaaaというメッセージが表示されます。他のブラウザでまた当該なurlを接続しましょう。今回はtest1をidとして入れてログインしましょう。そう

Devlopment note / Java

java

作成日付 : 2021/06/15 18:34:45       修正日付 : 2021/06/15 18:35:12

4

こんにちは。明月です。この投稿はwebsocketを利用してユーザ(サイト運用者)が他のユーザとチャットする方法に関する説明です。私のメールでサイト運用者とユーザ間にwebsocketを利用して1:1チャットする方法に関して質問があって実装してみました。web上でリアルでチャットするためにはwebsocket機能に関して知るべきです。link - [java] websocket (ウェブソケット)websocketの構造は一般socketと差異がありますが、仕様に関しては似ているのでsocket仕様だけ分かれば簡単に実装することができます。link - [java] 27. ネットワーク通信(socket)をする方法まず、仕様の条件は運用者が他のユーザとwebsocketでチャットすることです。サーバの基準をみれば運用者とユーザはソケットクライアントです。つまり、server側ではclientが運用者ユーザと一般ユーザかの区分する必要があります。webの環境は接続ページによる接続者の区分ができるので、接続urlによるclientを区分しましょう。始めの仕様は一般ユーザはindex.jspに接続するし、運用者はadmin.jspを接続しましょう。一般ユーザは運用者と1:1チャットですが、運用者はユーザとn:1チャットになります。サーバとクライアントは一つのソケットに連結されているので、keyを通って区分します。二つ目の仕様は一般ユーザが接続すればuniqueキーを与えて、運用者はユーザの区分のためこのuniqueキーを通ってデータを送受信しましょう。一般ユーザとサーバ間の通信です。ここまではindex.jspと/broadsocketのwebsocket通信部分です。これからは運用者とサーバ間の通信です。ソース作成は完了しました。デバッグして実行しましょう。他のブラウザで運用者ユーザを接続しましょう。接続すると運用者ブラウザで三つのチャットが開いていることを確認できます。一般ユーザチャットで各違うメッセージを送信しましょう。運用者ユーザの各チャットで各メッセージが送受信したことを確認できます。今回は運用者ユーザが送信しましょう。各ユーザのブラウザにメッセージを受信したことを確認できます。今回はユーザ2の閉じます。運用者のブラウザでユーザのチャットが消えました。仕様が大体に合います。デザインとスクリプトは理

Devlopment note / Java

java

作成日付 : 2021/06/15 17:20:08       修正日付 : 2021/06/15 17:20:08

5

こんにちは。明月です。この投稿はjavaでhttpconnectionを利用してウェブページを取得する方法に関する説明です。我々がウェブサービングをするとたまにウェブのデータをダウンロードしてデータ用で使いたい時があります。特にウェブページではなくてもrssやウェブのデータなどを扱いたい時があります。その時にソケット通信でデータを受け取ることが可能です。なぜならウェブサーバーもソケットサーバーなので、一般通信ソケットで通信が出来ます。でも、ただソケット通信でデータを取得するためには通信プロトコルを合わせてヘッダー要請を送らなければならないです。でも、ソケット通信でもヘッダーは自動設定してブラウザみたいにurlだけでデータを取得するクラスがありますが、それがhttpurlconnectionといいます。httpconnectionの場合はウェブレンダリングはしないので、javascriptのajaxの動的なデータや計算値などはなくて、純粋なウェブサーバーから受け取ったデータだけ取得できます。一番上の結果200はウェブサーバーから正常にデータを受け取ったの正常コードです。次は接続アドレスにパラメータが付けることをちゃんと確認できます。次は私のブログの最初の投稿のデータを出力した結果です。view-sourceで確認すると同じデータだと判断できます。今回はpost方式をテストするサイトが特にありませんが、パラメータをヘッダーに入れることだけの差なので特に問題がありません。以前、jsoupでhtmlを探索する方法に関して投稿したことがあります。link - [java] jsoupを利用してxmlファイル(html)を扱う方法その二つの機能をちゃんと混ぜって作成するとhtmlの望むデータを取得できます。ここまでjavaでhttpconnectionを利用してウェブページを取得する方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / Java

#java,#HttpConnection

作成日付 : 2020/05/20 23:53:24       修正日付 : 2020/05/20 23:53:24

6

こんにちは。明月です。この投稿はjavaでjsoupを利用してxmlファイル(html)を扱う方法に関する説明です。プロジェクトを作成するとxmlファイルをよく使います。特にウェブの場合は画面デザインはhtml形式で作成します。xmlの形式はタグが開く、閉めるの構造でアトリビュートやデータになっています。xmlを探索する方法は様々の方法がありますが、最近はjqueryのsizzleエンジンでcssselectorでタグを探索してデータを取得する方法をよく使っています。でもjqueryはjavaのライブラリではなく、javascriptのライブラリです。javaにはjsoupというライブラリがあります。 jqueryのcssselectorと同じ方法で探索が可能です。jsoupを使うためにはmavenを利用してライブラリをダウンロードしなければならないです。repository - https://mvnrepository.com/artifact/org.jsoup/jsoup/1.12.1xmlを探索テストをするためにこのブログのrssファイルを利用しましょう。link - https://www.nowonbun.com/rss上の例でchannel->item->title->をコンソールに出力しましょう。上の例はhttpurlconnectionを利用してデータを取得しました。自分のブログは普通のウェブホスティングではないので、ヘッダーが正常に表示されません。そのため、jsoup.connectを使うとエラーが発生します。stringデータをdocumentタイプに生成します。 select関数を使って探索を開始します。結果はitemのtitleは各投稿のタイトルなのでコンソールに出力します。上の例はxmlを利用しましたが、htmlファイルも探索ができます。ブログの名を取得しましょう。htmlファイルも取得してタグのclassで探索します。結果はブログの名がよく出力されました。ここまでjavaでjsoupを利用してxmlファイル(html)を扱う方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / Java

#java,#Jsoup

作成日付 : 2020/05/19 19:32:21       修正日付 : 2020/05/19 19:32:21

8

こんにちは。明月です。この投稿はjavaのサーブレット(servlet)の環境でファイルアップロード(プログレスバーでファイルアップロード状態を表示する方法)する方法に関する説明です。以前、springプレームワーク環境でアップロードする方法に関して説明したことがあります。link - [java] spring環境でファイルアップロード(プログレスバーでファイルアップロード状態を表示する方法)する方法jspの領域の部分はサーブレットと同じだと思いますが、サーバーサイドの実装が違うので説明します。サーブレットのプログラムを構築する方法に関しては以前に説明したことがあります。link - [java] web serviceプログラムのservletを作成方法(eclipse)先にサーブレットのウェブサービスを構築してindex.jspファイルを作成しましょう。上のソースはspringプレームワーク側で作成したjspファイルと同じです。「localhost/upload」のパスでファイルをアップロードするでしょう。アップロードするためにweb.xmlを設定する必要があります。これからプログラムを起動しましょう。アップロードする前のindex.jspの状況です。アップロードしようと思うファイルは150mbのサイズのバイナリデータです。アップロードしましょう。プログレスバーが動くことを確認できます。アップロードが完了しました。指定された「d:\work」フォルダにファイルが格納されたことを確認できます。ここまでjavaのサーブレット(servlet)の環境でファイルアップロード(プログレスバーでファイルアップロード状態を表示する方法)する方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / Java

#java,#servlet,#upload

作成日付 : 2020/03/24 00:48:21       修正日付 : 2020/03/24 00:48:57

9

こんにちは。明月です。この投稿はjavaのspring環境でファイルアップロード(プログレスバーでファイルアップロード状態を表示する方法)する方法に関する説明です。ウェブサービスでアップロードすることだと思えばformの要素でenctypeをmultipart/form-dataに設定してヘッダーにバウンダリーを設定し、アップロードすることをサーバ側でバウンダリーデータを受け取ったらアップロードが完了します。ウェブサービスのアップロードの仕様です。でもspringフレームワークはこの単純なアップロードロジックが少し複雑になっています。そのため、よく要約をしていないとアップロードを実装するたびに、忘れるか迷う時があります。以前、spring環境を構築する方法に関して説明したことがあります。link - [java] eclipseでspring web frameworkを利用してウェブサービスプロジェクトを立ち上がる方法先にファイルアップロードを実装するためにはmavenレポジトリから二つのライブラリをダウンロードして連携しなければならないです。そしてmvc-config.xmlでアップロードする時ファイルサイズのリミット設定をしなければならないです。そのあと、ファイルアップロードするウェブページ(jsp)を生成しましょう。そのあと、サーバ側のcontollerを作成しましょう。ここまで作成したらuploadする準備は完了しました。そうすれば起動しましょう。アップロードする前のindex.htmlの状況です。アップロードしようと思うファイルは150mbのサイズのバイナリデータです。アップロードしましょう。プログレスバーが動くことを確認できます。アップロードが完了しました。指定された「d:\work」フォルダにファイルが格納されたことを確認できます。ここまでjavaのspring環境でファイルアップロード(プログレスバーでファイルアップロード状態を表示する方法)する方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / Java

#java,#form-ajax

作成日付 : 2020/03/22 23:15:12       修正日付 : 2020/03/22 23:15:12

10

こんにちは。明月です。この投稿はjavaでftpに接続してファイルをダウンロード、アップロードする方法(ftpclient)に関する説明です。以前に私がwindow環境でftp serverを構築する方法に関して説明したことがあります。link - [centos] ftpインストールする方法(vsftpd)link - [window] windowでftpサーバを構築する方法ftpclientプロトコールは以前ほどではないけれども、様々でファイル転送プロトコールとして使うところがあるので紹介します。先、java環境でftpを使うようにはライブラリをダウンロードおよび参照しなければならないです。repository - https://mvnrepository.com/artifact/commons-net/commons-net/3.6ftp client環境を必ずウェブサービスで使うことだけではないのでconsoleで作成しましょう。上のソースはprogramのmain関数でftp環境のファイルとディレクトリをすべて削除して「ftptest/upload」のディレクトリのファイルと派生ディレクトリ、ファイルをすべてアップロードして、「ftptest/download」にすべてダウンロードすることです。上のファイルを「ftp://localhost(ftptest/ftp)」にアップロードするでしょう。そしてまた上のファイルを(ftptest/download)にダウンロードするでしょう。そうすればプログラムを実行しましょう。「ftp://localhost(ftptest/ftp)」にアップロードされたか確認しましょう。ftpサーバにちゃんとアップロードされました。ちゃんとダウンロードもされました。簡単なソースなので一つのファイルですべての例を作成しました。よく使うapiはlistfilesの関数のftpファイルリスト取得することとchangeworkingdirectory関数のディレクトリカーソル移動です。カーソル移動に関して現在のカーソル位置に関して教える関数は無いです。ftpclientではなく変数を利用してカーソル移動を管理しなければならないです。上でアップロードする時、storefileを使いましたが、既存のftpに同じ名のファイルが存在すれば上書きします。でもftpには既存ファイル

Devlopment note / Java

#java,#ftp

作成日付 : 2020/03/20 02:44:36       修正日付 : 2020/03/20 02:44:36

11

こんにちは。明月です。この投稿はjspのspring環境でschedulerのcronを使う方法に関する説明です。以前に私がjsp環境でspring web frameworkを利用してウェブ環境を構築する方法に関して説明したことがあります。link - [java] eclipseでspring web frameworkを利用してウェブサービスプロジェクトを立ち上がる方法cronとは簡単に考えるとスケジューラだと思えば良いです。以前、unix時代に使ったschedulerのユーティリティの名前ですが、これがlinuxにてcronスケジューラになってjava系のスケジューラの名前もcronになったらしいです。スケジューラはプログラムサービスで運用することよりosで運用することがサーバ管理側でもいろいろことが楽ですが、スケジューラ特性によってウェブサービスの中で運用する時も必要なのでspringウェブサービスでも使えます。ウェブサービスで使えるスケジューラだと思えば、基本的にサービス内で生成する必要がないlogデータ削除、掲示板サービスの投稿予約システム、仕様によってデータベース整理など様々作業を予想できます。でも、os環境で使えるスケジューラとウェブサービス内で使えるスケジューラを明確に区切りする必要があります。例えば、ロードバランシング(分散システム)で分けている2台以上のウェブサービスの場合、各ウェブサービスでcronジョブスケジューラが各実行中なので重複処理が発生可能性もあります。この時にはウェブサービスではなく別途のスケジューラサービスを構築するかosスケジューラ、dbスケジューラを利用してスケジューラを実行することが正しいです。(以外でこんなミスが多いです。)ウェブサービス内で使えるスケジューラはロードバランシングがない単一システムでキャッシュリロード、セッション、tempファイル、ログファイルなどを管理します。さて、spring環境でcronを設定する方法に関して説明します。pom.xmlで二つのライブラリを登録しましょう。repository - https://mvnrepository.com/artifact/org.quartz-scheduler/quartzrepository - https://mvnrepository.com/artifact/org.quartz-sc

Devlopment note / Java

#java,#cron

作成日付 : 2020/03/18 00:24:32       修正日付 : 2020/03/18 00:24:32

12

こんにちは。明月です。この投稿はjavaでpoiを利用してexcelを扱う方法に関する説明です。様々業務でexcelというプログラムはたくさん使います。どのぐらいかといえばexcelがなければ世界の電算システムは動かないほどです。それで様々ポータルシステムでexcelデータをダウンロードする機能は必須であります。java環境でexcelを使うライブラリはpoiライブラリだといいます。poiライブラリを使うためにはmavenのrepositoryでダウンロードして後、連携して使います。repository - https://mvnrepository.com/artifact/org.apache.poi/poirepository - https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml/今回はexcelを読み込んで修正します。修正した内容をファイルに格納しましょう。添付ファイル - test.xlsnpoiみたいにエクセルファイルを読み込んでまた値を再設定することでグラフも自動に変わることを確認することができます。実際に業務でエクセルを一から作ることよりドキュメントテンプレートを作って値を再設定して木偶セルデータの数値などを変わる方法でよく使います。そのほうがfontやスタイル設定することがしやすいです。そしてシステムのパフォーマンスでも改善することができます。ここまでjavaでpoiを利用してexcelを扱う方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / Java

#java,#excel,#poi

作成日付 : 2020/03/17 01:48:00       修正日付 : 2020/03/17 01:49:27

13

こんにちは。明月です。この投稿はjavaでpdfを出力する方法(itextpdf)に関する説明です。ウェブサービスで、特にポータルサービスならデータの結果を出力するところならpdf出力が多いです。最近はほとんどpdfの出力なら標準でなっているほど多いです。pdfで出力したら修正もできないし、イメージよりドキュメント形式になっているフォーマットになっているのでです。これをjava環境でpdfを作成して出力して使う方法に関して説明します。java環境で使うためにmavenレポジトリを通ってitextpdf」と「xmlworker」をしなければならないです。repository - https://mvnrepository.com/artifact/com.itextpdf/itextpdf/5.5.13.1repository - https://mvnrepository.com/artifact/com.itextpdf.tool/xmlworker/5.5.13.1簡単なpdfを出力するプログラムを作成しましょう。コンソールで実行するとpdfが生成するプログラムです。ソースでcssファイルを二つ読み込みます。上のcssファイルを下記のディレクトリに設定します。設定は完了しました。プログラムを実行して結果を確認しましょう。ここまでjavaでpdfを出力する方法(itextpdf)に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / Java

#java,#pdf,#itextpdf

作成日付 : 2020/03/13 00:47:31       修正日付 : 2020/03/13 01:06:27

14

こんにちは。明月です。この投稿はjavaで使うログライブラリ(log4j)を使う方法に関する説明です。ログということはプログラム開発する時にデータ追跡や呼出されたクラスや関数、エラー確認などを調べるため使うライブラリです。普通に開発する時にはideツールを利用してデバックすればデータ追跡ができますが、開発が終わってプログラムをコンパイルやビルドした後、productionにリリースになったらデータ追跡することはしやすくないです。でも、完璧なプログラムなら問題ないですが、人間が作ったプログラムなのでバグが必ずあるし、そのバグによって間違い演算してエラーが発生します。エラーが発生する時にデータを追跡ができなければならないですが、それがログ機能によってデータを探せるのができます。javaではログライブラリが様々がありますが、その中でlog4jが一番簡単だし、楽なライブラリだと思います。ログはただエラー追跡だけではなく、ユーザアクションパターンやシステムメモリパターンなどを追跡して様々に統計データを活用することができます。javaでlog4jを使うためにmavenレポジトリを通ってlog4jライブラリを連携しなければならないです。repository - https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core/2.13.1実際にプログラムの中で作成しましょう。link - https://logging.apache.org/log4j/2.0/manual/api.htmllog4jはconsoleやファイルログ以外にメール送信、データベース設定などがあります。設定によって追加することができます。link - https://logging.apache.org/log4net/release/manual/configuration.htmlここまでjavaで使うログライブラリ(log4j)を使う方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / Java

#java,#log4j

作成日付 : 2020/03/12 00:54:39       修正日付 : 2020/03/12 00:54:39

15

こんにちは。明月です。この投稿はjavaでjsonタイプのデータを使う方法に関する説明です。jsonデータは「キー:値」になっているデータオブジェクトで人間が読めるテキスト形式の開放型標準フォーマットということです。javaでデータオブジェクトをjsonタイプに変換するためにはgoogleで提供するgsonのライブラリを使います。まず、mavenでgsonを登録してライブラリを連結しましょう。reference - https://mvnrepository.com/artifact/com.google.code.gson/gsonmaven repositoryに接続してgsonの最新maven情報を読み込みます。私はeclipseを利用するのでeclipseのpom.xmlに登録します。登録した後、maven updateをしてライブラリを連結します。そしてテストクラスを作成して試してみましょう。以前にシリアライズに関して説明したことがあります。link - [java] シリアライズ(直列化: serializable)シリアライズとかjsonタイプに変換するのはデータをstringタイプに変換することができることです。結果は違いますが、仕様によって各良い点があるし悪い点があるでしょう。シリアライズはクラスのインスタンスをバイナリ化することなので、見えない変数(private)までデータが変換します。でも人間が読みにくいデータ構造に変換します。jsonの場合はプロパティがないデータ(getterがない変数)ならjsonタイプに変換することは限界があります。でも人間が読みやすいテキストテキストに変換します。意味はデータ構造の直接に修正ができることです。プロジェクトの仕様によってシリアライズかjsonタイプかに選択して使いましょう。ここまでjavaでjsonタイプのデータを使う方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / Java

#java,#gson

作成日付 : 2020/03/11 00:30:15       修正日付 : 2020/03/11 00:30:15

16

こんにちは。明月です。この投稿はjavaでbase64をエンコード、デコードする方法に関する説明です。base64とは実は様々な複雑な説明がありますが、私が簡単に説明するとbyteタイプになっているbinaryデータをプログラム間にデータ交換をため、ascii文字に変換しているコードをbase64といいます。つまり「byteデータやstreamデータをstringのタイプに変換すること、stringの値はcharのデータ範囲を超えない(データ値が127)ものになっている」ということです。先に簡単なファイルをioで読み込んでbase64に変換します。pcに「hello world」という値がある「test.txt」を準備しました。そしてそれを読み込んだらbyteタイプのbinaryになります。そのbinaryをbase64に変換します。実行結果は下記とおりになります。それが「hello world」のbase64コードです。またbase64コードになっているデータを元のbinary(byte[])データに変換しましょう。実行結果は下記とおりになります。base64タイプをbyteタイプに変換しました。byteデータをstringタイプに変換して出力すると「hello world」が出ます。実はプログラム間に通信する時にbase64にエンコードやデコードにするとデータ長さが増えるので非効率です。でも、base64を使うところはbinaryをstringに表現するところはイメージデータをstringデータで格納する時や、暗号化されたファイルをstringデータとしてデータをデータ通信する時にはよく使います。ここまでjavaでbase64をエンコード、デコードする方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / Java

#java,#base64

作成日付 : 2020/03/09 10:24:01       修正日付 : 2020/03/26 02:21:30

17

こんにちは。明月です。この投稿はjava環境でcmdコマンドを実行するための方法に関する説明です。プログラムを作成する時にウェブアプリケーションや一般アプリケーションでほかのプログラムを実行するとか内部サーバをコントロールする時にあります。例えば、jankinsの場合、ウェブ環境でgitやsvnのコマンドを操作するとかシェルコマンドでウェブ環境でサーバをコントロールするようなプログラムです。このようにプログラムを通ってシェルコマンドを使う場合がありますが、その時に使うことができるソースコードです。上の結果画面をみればコンソールに「cd」のコマンドと「dir」のコマンドを実行して結果を出力する結果のイメージです。最後に「exit」コマンドを実行してプログラムを終了します。eclipse環境で文字化けがありますが、単純にeclipseのエンコーディング問題です。実際に変数をデバッグでみれば日本語が入力されています。それでも文字化けの問題が解決できなければinputstreamreaderにエンコーディングタイプを入れたら解決なります。ここまでjava環境でcmdコマンドを実行するための方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / Java

#java,#process

作成日付 : 2020/03/06 18:01:10       修正日付 : 2020/03/06 18:01:10

18

こんにちは。明月です。この投稿はjavaでメール(javax.mail)を発送する方法に関する説明です。プログラム上で我々がメール発送することは様々のところで使えることができます。会員登録する時に登録認証やパスワード探すことなどがあるし、システム上で様々なアラームメッセージをメール発送することもできます。最近はsnsがたくさんあるのでsnsでメッセージを発送する方法もよく使いますが、それでもまだ、メール発送機能はなくならないでしょう。私はgoogle mail(gmail)を通ってメールを発送する例です。google mail - https://support.google.com/a/answer/176600?hl=ja先にクロームに接続して右上のアカウント管理に行きましょう。(ログインができなかった状況なら先にログインしてから。)アカウント管理に移動して安全性の低いアプリのアクセスのタブに移動します。安全性の低いアプリの許可を有効にします。このチェックをしないと外部からグーグルメールを使用できないようにすることです。なので、idやpwの漏れがなければそんなに問題はありません。javaでメールを発送するソースを作成するためにpom.xmlでメールライブラリを登録しなければならないです。レポジトリ - https://mvnrepository.com/artifact/javax.mail/mailメール発送はconsoleに作成しても問題ないので、consoleで作成しましょう。私がsessionのデバックモードに設定しましたのでメールサーバと送受信されるメッセージの状態が表示されます。もし、プロトコールで追加する内容があればこのログを見て追加すればよいです。メールを発送しましたので、自分のメールトレイにメールがあるかどうか確認しましょう。メールの送信がよくできました。ここまでjavaでメール(javax.mail)を発送する方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / Java

#java,#mail

作成日付 : 2020/03/05 20:07:49       修正日付 : 2020/03/05 20:07:49

19

こんにちは。明月です。この投稿はjavaでクラス複製(clonable, reflection)に関する説明です。クラス複製はプリミティブデータみたいにイコール記号(=)で簡単にデータを複製することができません。クラスにはスタック値とヒープメモリがあります。クラスはヒープで割当て(インスタンス宣言)して、スタック値にポインタ参照を繋がれています。ただ、イコール(=)でコピーするのはクラス複製じゃなくスタック値、つまり参照値をコピーすることです。上の例をみればnodeクラスをa変数に割当しました。node b変数にイコールでデータをコピーしました。b変数に「10」のデータを格納しましたが、a変数のデータも「10」に代わりました。ここでハッシュコードをみれば同じデータに出力します。つまり「node b = a」でクラスが新しく割当したことじゃなく、参照値(スタック値)だけコピーして結局、同じクラスを指すものになってしまいました。我々が必要なことはクラスの複製です。上の例をみれば、確かに「a」の変数と「b」の変数に各クラスが割当しています。b変数にデータを格納してもa変数に影響がありません。ハッシュコードも別の値を出力するので確かに別のクラスです。上の方法がjavaで一般的なクラスコピーです。でもすべてのクラスが「cloneable」を継承しているなら問題ないですが、実際には継承してないクラスもたくさんあります。そのクラスはどのようにクラスを複製しましょうか。今回はクラス複製関数を作成してコピーしました。クラスの場合は一般クラスで「cloneable」を継承してないです。clone関数でクラスを新しくクラスを割当てしてメンバ変数をすべてコピーします。そのためクラス複製効果になります。私の場合はクラスの修正ができない状況かつ継承もできない状況では上の方法でクラス複製をよくします。ここまでjavaでクラス複製(clonable, reflection)に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / Java

#java,#clone

作成日付 : 2020/03/05 00:03:19       修正日付 : 2020/03/05 00:03:19

20

こんにちは。明月です。この投稿はjavaのシリアライズ(直列化: serializable)に関する説明です。シリアライズとは割当てしたクラス(インスタンス)をバイナリ化することをシリアライズ(直列化: serializable)といいます。クラスのメモリ割当てはクラス内部のメンバー変数で構成しています。(関数の場合はメモリに割当てないです。)メンバー変数はプリミティブタイプやクラスになっています。すなわち、クラスのデータをファイルやソケット通信で転送するためにはbyteタイプに変換しなければならないです。その方法でjsonタイプに変換してクラスのデータをstringタイプに変換してバイナリ化する方法もあります。実際に、最近、その方法でよく使います。でも、クラスをjsonタイプに変換するのは限界があるし、クラス内部の見えないデータ(private)まで完全に変換されたとは言えません。それでこのシリアライズ機能を使ってクラスをバイナリ化するとクラスをデータを完全にbyteタイプに変換するのでよいでしょう。でも、シリアライズよりjsonをよく使うのは下記とおりの理由があります。1.シリアライズでバイナリ化になったデータは人間がそのままに見て理解しにくい構造になっています。つまり、逆シリアライズする前にはデータが正しいかの検証ができません。でも、jsonタイプになったデータは人間が見やすいし、プログラムを利用せずに修正も簡単です。逆にそれがjsonよりいいことがセキュリティにはよいでしょう。2.プラットフォームの制約があります。java言語でシリアライズしたデータはc#やpythonなどで逆シリアライズができません。正確には出来ないことではないですが、データ漏れが発生します。3.クラス修正があれば、以前シリアライズしたデータを逆シリアライズする時にデータ漏れが発生する可能性があります。シリアライズの利点はセキュリティがよいし、クラス自体をバイナリするため、クラス状態をログにして把握することでよいでしょう。上の例は「node」クラスを割当てしてバイナリ化(byte[])にしてファイルに格納しました。格納したデータをまた読み込んでクラスに変換しました。jsonで一々にデータをstringタイプに変換することよりシリアライズ変換が簡単です。上をみればシリアライズされたデータは構造把握が難しいです。javaでシリアライ

Devlopment note / Java

#java,#Serializable

作成日付 : 2020/03/03 00:03:33       修正日付 : 2020/03/03 00:03:33

21

こんにちは。明月です。この投稿はjavaのstringbuilderとstringbufferの差異に関する説明です。javaの中で文字列タイプのデータタイプは「string」があります。「string」はプリミティブデータタイプ(primitive data type: int, char, double...)じゃなく、objectクラスから継承されたクラスタイプです。すなわち、「string」の内部はbyte(unsigned char)タイプになっています。それで我々が「string data1 = "abc";」ということに宣言すれば内部は「byte[] data1 = new byte[] {'a', 'b', 'c'}」になります。そのため、「string」タイプと「string」タイプの文字列を合わせると思えば、下記の処理になります。stringで文字列を合併すれば上のフローとおりに文字列が合併されます。つまりstringにstringを合併すれば新しいstringが割当します。それなら「string test = "abc" + "def" + "ghi" + "jkl";」は合併フローがすごく複雑になります。そのため、stringとstringを合併することはパーフォーマンスに影響があります。そうすれば上のarrayタイプじゃなく、連結リストタイプ(list)みたいに文字列を「add」関数で追加する方法がないかと疑問になります。それがarrayタイプじゃなく、listタイプで文字列を合併するのが「stringbuffer」と「stringbuilder」です。上の例だけでみれば差異がそんなになさそうです。でも文字列の合併が多いほどパーフォーマンスの差異は確かに出ると思います。それなら「stringbuffer」と「stringbuilder」の差異はなにでしょうか。同期化の差異です。stringbufferの場合はクラス内部で同期化しますが、stringbuilderの場合は同期化がありません。初めのスレッドで10個、2つ目のスレッドで10個を入れたので全ての文字桁数は20個になるはずです。結果はstringbuilderには2

Devlopment note / Java

#java,#StringBuilder,#StringBuffer

作成日付 : 2020/03/02 07:52:22       修正日付 : 2020/03/02 07:52:22

22

こんにちは。明月です。この投稿はjavaでcompare関数を使う方法に関する説明です。javaで値を比較する関数で「equals」関数があります。このequals関数はobjectタイプにあり、全てのデータタイプで使うことができる関数です。でもequals関数はただデータ値が同じか同じじゃないかと判断だけできるし、比較データがどっちがもっと大きいかは知ることができません。もちろんif関数で「if (a > b) else if (a < b) else」でチェックしてもいいですが、少し品格があるように実装することはcompare関数を利用することがあります。integerタイプでcompare関数のパラメータ基準で初めのパラメータをa、2つ目のパラメータをbと考えましょう。aがbより小さいなら「-1」、同じなら「0」、大きいなら「1」の結果が出ます。つまり<=>順で-1,0,1の結果です。integerではなくdateタイプで比較しましょう。dateタイプもクラスにcompare関数がありますが、今回はインスタンスから比較するcompareto関数を使用しました。comparetoの場合は、インスタンス変数がa、パラメータデータがbと考えましょう。aがbより前日なら「-1」、同日なら「0」、後日なら「1」の結果が出ます。つまり<=>順で-1,0,1の結果です。compare関数は比較対象が比較値に比べてデータが小さいなら「-1」、同じなら「0」、大きいなら「1」の結果が出ます。つまり<=>順で-1,0,1の結果です。このパターンをよく覚えばソート式や様々なアルゴリズムを組み立てる時、ソースが簡単に実装することができます。ここまでjavaでcompare関数を使う方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / Java

#java,#compare

作成日付 : 2020/02/29 03:00:00       修正日付 : 2020/02/29 03:00:00

23

こんにちは。明月です。この投稿はjavaで数字フォーマット(お金表示及び小数点以下表示)に関する説明です。プログラム内で数字を扱う時にお金表示、つまり千単位でコンマがある表示を設定することが必要な時があります。お金の場合は「0」が多い数字値だし、コンマ(,)表示がなければ迷う単位が多いからよく使うフォーマット変換だと思います。javaは「int」や「double」、「float」タイプを「string」タイプに変換する時には「decimalformat」クラスを利用します。上の例で「#」はあれば表示するし、なければ表示しないことだし、「0」はなかったらデフォルトで「0」を表示するということでフォーマット設定になります。そうすれば、上は小数点2桁までの設定でしだが、3桁になるとどうなるでしょうか?四捨五入になって「0.127」から「0.13」になりました。でも、状況によって四捨五入じゃなく、切り捨てする時もあります。その時にはフォーマットだけじゃなく、mathクラスを利用して計算するか、bigdecimalタイプに変換して切り捨て関数で計算するかの方法があります。個人的にbigdecimalを使うとメモリ使用がありますが、math.floorの場合はoverflowエラー可能性があるので、bigdecimalタイプに変換して切り捨てする方が良いと思います。ここまでjavaで数字フォーマット(お金表示及び小数点以下表示)に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / Java

#java,#dataformatting

作成日付 : 2020/02/28 03:00:00       修正日付 : 2020/02/28 03:00:00

24

こんにちは。明月です。この投稿はjavaのサーブレット環境で現在の実行ディレクトリを取得する方法に関する説明です。プログラムを作成する時に現在のディレクトリを知る時があります。特にeclipse環境で実行する時にはコンパイルして実行させる場所 を探しにくいので開発する時に困る時があります。例えば、環境ファイルを読み込む時やプロジェクト仕様として各種ファイルやテンプレートを読み込む時に必要です。その時にローカルディレクトリを探す方法は2つあります。実行しているクラスのファイルの場所で探す方法です。threadクラスで現在に動いているスレッドのクラスの場所を探すと現在の実行パスを探すのが出来ます。上の関数の処理では問題ないですが、lambda式やマルチスレッドなどで呼出すと結果が可笑しくなる可能性があります。その時に「thread.currentthread().getcontextclassloader()」ではなく、「this.getclass().getclassloader()」を呼出して取得ができます。でも全てloaderを通って取得するから、マルチスレッドなら正確に取得出来ない可能性はあります。(可能性といってもすごく低いです。)我々はサーブレットを作っているのでサーブレットのcontextを利用して取得する方法もあります。上の場合はcontextインスタンスから取得するものなので、マルチスレッドやlambda式で間違って取得する問題はありません。でも、サーブレットクラス(httpservletを継承したクラス)だけ取得ができることなので一般クラスで現在パスを取得するようには上のloaderを通って取得する方法しかないです。私の場合はwebserverを起動する時にインスタンス初期化する方法で「static」タイプの変数に実行パスを格納して使うことでよく使います。link - [java] java servletでインスタンスを初期する方法ここまでjavaのサーブレット環境で現在の実行ディレクトリを取得する方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / Java

#java,#servlet,#path

作成日付 : 2020/02/27 03:00:00       修正日付 : 2020/02/27 03:00:00

25

こんにちは。明月です。この投稿はjavaで日本語をユニコードに変換して、ユニコードから日本語に変換する方法に関する説明です。javaのプロパティや様々の設定ファイル、htmlのjsonコードなどで「\uxxxx」の形のコードを使う時があります。「\uxxxx」はユニコードですが、英語や数字、つまりasciiコードの以外はユニコードで表示することです。グーグルで検索してユニコードをエンコードまたはデコードするライブラリやソースがありません。私の検索能力が悪い可能性もありますが、一応私の場合はありませんでした。先はこのユニコードに関して確認しましょう。英語とasciiコードは変換なしでそのまま表示されます。日本語になっている部分は「\u」が付けていて4文字の16進数コードになりました。6^4+16^3+16^2+16^1の組み立てです。ユニコードが日本語に変換されてコンソールに表示しました。また、これをユニコードに変換する関数を作成しましょう。実は私が必要な関数はユニコード変換する関数です。最初、日本語に変換する前のユニコードと同じ結果になりました。eclipseのpropertiesファイルで自動変換する値が出ました。大文字、小文字の差異はありますが、フォーマットは「%04x」から「%04x」にかわれば大文字に変わります。ここまでjavaで日本語をユニコードに変換して、ユニコードから日本語に変換する方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / Java

#java,#unicode

作成日付 : 2020/02/26 03:00:00       修正日付 : 2020/02/26 03:00:00

26

こんにちは。明月です。この投稿はjavaのコンソール環境でユーザからデータを入力させる方法に関する説明です。javaのプログラミングをすると「system.out.println」関数をよく使います。「system.out.println」関数はデータをコンソールに表示する関数です。eclipse(ide)の開発環境では「sysout」だけ入力しても自動変換(intellisense)機能で自動に変換されます。逆に「system.in」という関数は無いかと思ったら、逆にコンソールからデータを入力するスキャン関数であります。例をみればコンソールから「test」という値を受け取って、出力しました。上のとおりに作成しても問題ないですが、バッファを設定することが気になります。結果は同じですが、コネクションがあるので、リソース管理がしやすいです。(コンソールもioなので結局リソースです。)try ~ catchもなくなるし、バッファ設定がないので、コードがシンプルになりました。ここまでjavaのコンソール環境でユーザからデータを入力させる方法に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Devlopment note / Java

#java,#system.in

作成日付 : 2020/02/25 03:00:00       修正日付 : 2020/02/25 03:00:00

27

こんにちは。明月です。この投稿はjavaのservlet環境でwebsocket通信中、httpsessionを取得する方法に関する説明です。以前の投稿でwebsocketに関して説明したことがあります。link - [java] websocket (ウェブソケット)link - [java] websocketでweb sessionを使う方法(broadcast)とウェブチャットの例websocketとは初め接続することはhttpプロトコルでhandshake処理をしてヘッダでwebsocketなら接続を続けて保持することになるし、一般http要請なら応答して接続を切断します。websocketの要請は初め要請以外には続けて接続しているので、ソケットでメッセージを送受信するため、httpクッキー情報を貰うタイミングがありません。なので、初め接続する際にwebsocket sessionをキーにしてセッションオブジェクトを管理するリストにweb sessionを格納します。その後、メッセージを受信する時に「@onmessage」関数が呼ばれたらwebsocket sessionでリストからsessionを取得して使ったらよいでしょう。websocket serverクラスを作成しましょう。websocketを接続するようなhtmlドキュメントを作成しましょう。webserverにセッションをテストするために、セッションにデータを格納するサーブレットとクリアするサーブレットを作成しましょう。上のwebsocket serverでwebsessionを「testsession」キーで取得しましたので、格納する時に「testsession」キーで格納しました。次はsessionをクリアするサーブレットを作成しましょう。ここまでwebsocket serverからwebsessionを取得する部分とテストするためのサーブレットまで作成しました。ブラウザもwebsocket serverに接続する前にはhttpプロトコールで要請します。その時、webページ要請かwebsocket接続かの判断することがhandshakeです。なので、初めのhttpのプロトコールで要請する時に、サーブレットからrequestインスタンスをもらえるし、クッキーからセッションキーも取得ができるのでセッションの値の取得が可能です。web

Devlopment note / Java

#java,#WebSocket,#servlet

作成日付 : 2020/02/24 07:47:20       修正日付 : 2020/02/24 07:47:20

28

こんにちは。明月です。この投稿はwebsocketでweb sessionを使う方法(broadcast)とウェブチャットの例に関する説明です。以前の投稿でwebsocketを設定してブラウザから接続、メッセージを送信、受信、切断まで説明したことがあります。link - [java] websocket (ウェブソケット)csプログラムでソケット通信すると思えば、サーバソケットで接続するとクライアントソケットを受け取ってリストで管理します。それでサーバからクライアントに一括送信するものがあればリストからクライアントコネクションを受け取って繰り返してメッセージを送信します。websocketにはsessionというリソースがあります。このsessionはwebsession(サーバにクライアント別に情報を格納するリソース)とは違います。ただソケットのコネクションのリソースです。csプログラムだとclientsocketと同じ意味のインスタンスです。基本的に以前websocketに説明した構造と同じです。今回は各リスナーからパラメータを「session」を受け取ります。「session」データはソケット通信だと「socket」クラスと同じです。サーバとクライアント(ブラウザ)間にコネクション情報があります。messageを受け取る時に呼ばれる関数でメッセージを分析する流れがあります。私が各セッションの区分のため、メッセージを「{{ユーザ名}}メッセージ」の形式でサーバにメッセージを送りました。それをユーザ名とメッセージ内容を分離する作業です。セッションリストからセッションを受け取ってメッセージを送る時にメッセージを送ったセッションは抜いてメッセージを転送します。websocketサーバにメッセージを転送する時に形式を「{{ユーザ名}}メッセージ」形で組み立てして送りました。 それをサーバ側からユーザ名とメッセージ内容を分離して区分することです。これから起動しましょう。起動した後、私が各3つのブラウザを開いて接続しました。ユーザ名は各「test1」、「test2」、「test3」で決めてメッセージを送りました。「test1」から送ったメッセージが「test2」、「test3」にも見えます。このようにウェブチャットプログラムが実装されました。サーバ側のコンソールログはクライアント3つが接続して各メッセージを送った

Devlopment note / Java

#java,#websocket

作成日付 : 2020/02/22 03:00:00       修正日付 : 2020/02/22 03:00:00

29

こんにちは。明月です。この投稿はjavaのservlet環境でwebsocketを使う方法に関する説明です。普通のweb環境はクライアントからwebサーバーにhtmlドキュメントを要請するとwebサーバは要請されたhtmlドキュメントを作成してクライアントに応答して後接続を切断する非同期ソケット通信です。websocketとはクライアントの要請してwebサーバが応答した後、接続を切断することじゃなく、connectionをそのまま保持してクライアントの要請がなくてもデータを転送することが可能なプロトコールです。例えば、チャット機能を考えば、ユーザがチャット内容を書いてサーバに転送することがあります。それはサーバにクライアントから要請することです。でも、他のユーザがチャット内容を書いてサーバに転送すれば私の場合はサーバからデータを取得しなければならないです。その場合はユーザから要請がなくてもサーバからクライアントにデータを転送する流れですが、既存のwebプロトコールで接続が切断する状況には転送することができないでしょう。websocketの場合は接続が切断している状況じゃないので、サーバからクライアントにメッセージを転送することができます。参考に既存の方法でも出来ないことじゃないです。ajax(webプロトコール)で5秒や10秒単位でメッセージ確認を要請すると可能です。でも、頻繁な要請でwebサーバが負荷になる可能性もあるでしょう。websocketはhtml5から標準になりました。プロトコール要請は「ws://~」で始まります。webプロトコールの場合は「http://~」で始まります。sslセキュリティタイプの場合は「wss://~」になります。以前にjava環境でサーブレットを構築する方法に関して説明したことがあります。link - [java] web serviceプログラムのservletを作成方法(eclipse)web servlet環境でクラスを生成してwebsocket serverを実装しましょう。websocketは別に複雑ではなく簡単に実装ができます。別にソケットサーバやプロトコール宣言なども必要ないです。ただwebsocket ホスト設定のアノテーションとwebsocketとクライアント間のイベントをアノテーションで設定可能です。関数名は任意で作成してもよいです。websocke

Devlopment note / Java

#java,#websocket

作成日付 : 2020/02/21 03:00:00       修正日付 : 2020/02/21 03:00:00