Study / Java 検索結果

検索件数 : 64

1

こんにちは。明月です。この投稿はspring bootとreactを連結する方法(buildする方法)に関する説明です。最近のプロジェクトのトレンドはフロントエンドとサーバーサイドの区分して作業します。実はこのように割り振って作業することはずいぶん前からのトレンドなんですが、私が遅い感じがありますね。私は最近までjavascriptとjqueryを使って画面とプログラムを作成しました。プロジェクトを一人でやったことではないですが、この状況をそんなに悪いとは思わなかったんです。jqueryでも十分にspa(single page application)を実装できるし、私の感じではjqueryでシステムが遅いとも思わなかったんです。しかし、jqueryからreactに変わらなければならないと思ったことが、一つ目はライブラリがもうjqueryを依存しない、使わないことです。そうするとjqueryを使う必要があるかと思いからです。その同時に数多くのライブラリがangular、vue、reactを支援するし、その中でreactを選択した理由は単純にダウンロードが多いし、大勢の人が使うフレームワークだと思って選択しました。以前には画面を作成する時はただeclipseからhtmlを作成し、css、jsを作成しましたが、reactの場合はeclipseから作成することが簡単ではありません。なのでreactはnode.jsを使ってvisual studio codeで開発してspring bootはintellijやeclipseで開発します。各、別のideツールで開発すれば最終的にbuildしたら結果物が別に生成されるので、一つに合わせる作業が必要でしょう。eclipseでspring bootの開発環境を設定する方法は以前に説明しました。リンク - [java] 57. eclipseでspring bootを設定する方法そしてreactをvisual studio codeで開発環境を設定する方法も説明しました。リンク - [javascript] node.jsをインストールしてreactを使う方法それなら一旦、二つの開発環境を連結する方法は凄く簡単です。reactのpackage.jsonファイルにspring bootのアドレスを連結すれば良いでしょう。私はeclipseからspring bootのポートを8

Study / Java

#java,#react,#springboot

作成日付 : 2022/03/25 21:02:18       修正日付 : 2022/03/25 21:04:05

2

こんにちは。明月です。この投稿はjavaのspring bootでcronスケジューラとcomponentアノテーションに関する説明です。私が以前にweb frameworkでcronスケジューラを使ったことがあります。リンク - [java] jspのspring環境でschedulerのcronを使う方法我々がウェブサーバーを運用したらブラウザ(browser)から要請により実行処理することではなく、決めている時間にプログラム内部のキャッシュ管理とかデータベースのデータ管理など様々な処理をしなければならない時があります。もちろん、windowサーバーならウィンドウスケジューラがあるしlinuxサーバならcrontabスケジューラがあります。ウェブサーバーと独立でスケジューラを運用して使ってもよろしいですが、システム内部で運用しなければならない時があります。cronスケジューラをプログラム中で実装したら一つの問題点があります。例えば、決まってる時間にメールを転送するロジックがあり、それをプログラムのcronスケジューラにより実装しました。そして偶然にこのウェブサーバーがロードバランシングで分散処理になっています。そうするとスケジューラにより様々で重複実行になります。そのため、cronスケジューラを作成する時にはいつもこの部分を考えて実装しなければならないです。(私がこのバカ―な経験を持っていることではないです。)spring bootでcronスケジューラを使うのは凄く簡単です。別にpom.xmlライブラリを追加する必要もありません。この部分は以前のweb frameworkより凄く楽ですね。spring bootを実行するmain関数があるクラスに@enableschedulingアノテーションを追加することでできます。上みたいにアノテーションだけ追加するとcronスケジューラを使いましょう。そうするとこれからcronスケジューラを使うためにbeanを追加しましょう。ここで@componentアノテーションを追加してspring beanに登録しましょう。そしてスケジューリングする関数に@scheduledアノテーションを追加して文法を利用してスケジュールを設定しましょう。ここでは私が10秒単位で実行することに設定しました。ここでscheduledアノテーションに設定するcron文法があります。この部

Study / Java

#spring,#cron,#component

作成日付 : 2022/03/16 18:57:30       修正日付 : 2022/03/16 18:59:03

3

こんにちは。明月です。この投稿はjavaのspring bootでweb-filterを設定する方法(spring security)に関する説明です。私も実はspring securityに関して詳細的までは知りません。 関連仕様書とドキュメントを見たけれど、量も多すぎるし、すべて内容をちゃんと活用することができるかと疑問もあります。ただ、「ブラウザからの要請(request)がある時、controllerから処理する前にfilterとして呼び出されること」ほど知っています。 web frameworkを使った際にもただセッション確認してuserインスタンスがあれば認証だし、それではなければ認証失敗するほど設定することがすべてだと思います。それで今回にspring bootを全般的に整理するところ、web-filterに関してどのように整理するほうが良いかを凄く悩みしました。含めて今回に私がweb frameworkからspring bootに移行する作業しながら、もう一つの目標を設定したのはフロントエンド(front-end)とバックエンド(back-end)の完全な分離を目標で作業しています。そのために適用しなければならないことがセッションを利用したログイン認証ではなくjwt(json web token)を利用してログイン管理がならなければならないです。リンク - [java] jwt(json web token)を発行、確認する方法以前から私がフロントエンドのフレームワーク(angular, vue, react)を使いたいでしたが、いつもセッションを完全に分離しなければならないという限界がありました。spa(single page application)の環境にはメインページのpage requestが最初に一回だけ発生して、javascriptを利用して動的にdomとヘッダーを設定する環境になりますが、その場合にページのクッキーとセッション、変数のデータ管理、そして非同期で要請するajaxのクッキーとセッション、変数のデータ管理がずいぶん複雑になるでしょう。私だけそうかも知りません。この部分は各の経験により感じる部分の差異があると思いますね。一旦、この投稿の目標はspring bootにてweb-filterを使ってjwt(json web token)を利用して認証するプログラムを作成

Study / Java

#java,#web-filter

作成日付 : 2022/03/15 22:16:37       修正日付 : 2022/03/15 22:20:38

4

こんにちは。明月です。この投稿はspring bootでredisデータベースを利用してセッションクラスタリング設定する方法に関する説明です。以前の投稿でapacheとspring bootのtomcatを連結してロードバランシングする方法に関して説明しました。リンク - [java] 60. spring bootでapacheの連結とロードバランシングを設定する方法ロードバランシングは一応ウェブ環境で数多くトラフィック(接続)が発生するとウェブサーバーもブラウザ(クライアント)とソケット通信するコネクションがあるリソースなので同時に発生すればその接続と応答が遅くなるしかないです。また、ウェブサーバー環境に要請する処理が複雑になれば処理がもっと遅くなるでしょう。それで接続キャッシングはapacheで管理して、動的ウェブ処理(htmlパッシング処理)はアプリケーションサーバー(was:tomcat)で管理します。また、その負荷がもっと多くなると、tomcatを複数に分けてロードバランシングで管理することで大容量のトラフィックを処理します。一旦、以前の投稿で簡単に説明しましたが、apacheで同じsessionなら同じtomcatを要請するように設定しましたが、状況により1番のtomcatで要請応答したコネクションが2番のtomcatに転換する場合もあります。その状況というのはいきなり1番のtomcatがショットダウンしたり、急に一つのサーバーに大容量のトラフィックが発生するとapacheのロードバランシングが移動させます。その以外の様々な状況がありますが、代表的にはその二つのケースではないかと思います。ここで問題が発生することがセッションです。セッションというのは簡単に説明します。ブラウザで各サイトに接続するたびにローカルで格納しているデータでクッキーということがあります。上のヘッダー情報は私がブラウザでブラぐを接続する時の接続情報です。ここではクッキーの値がアルゴリズムで暗号化になっています。暗号化になっていても、このクッキーというのはブラウザでデータを見ることができます。このデータをなぜブラウザで持っているかを説明するとブラウザの歴史の内容まで説明しなければならないので説明しにくいですが、簡単に説明するとウェブプロトコール仕様はソケット非同期の形、つまり、ソケットで要請する時接続して応答すると接続を切

Study / Java

#java,#redis,#springboot

作成日付 : 2022/03/01 18:20:52       修正日付 : 2022/03/01 18:25:39

5

こんにちは。明月です。この投稿はspring bootでapacheの連結とロードバランシングを設定する方法に関する説明です。spring bootにはtomcatが内蔵しているので、すぐビルドして配布してもウェブサーバーで運用可能です。つまり、複雑なtomcat設定が必要ないです。このウェブというのはブラウザから要請と応答処理で接続からパーシングまで様々な処理があります。でもトラフィック(接続者)が多くなるとtomcatサーバーだけでは足りないので、apacheとtomcatで分割して役割を割り振りします。役割というのはブラウザの要請と応答処理、様々なプロトコール処理をapacheに任せて、tomcatはhtmlパーシングとセッション管理の役割をします。それでapacheサーバーとtomcatサーバーを連結する方法がありますが、以前の投稿でapacheとtomcatを連結する方法に関して説明したことがあります。リンク - [centos] apacheとtomcatの連携でも、spring bootにはtomcatがフレームワークの中で含めている形になっています。それでtomcatの設定(以前のserver.xml)をプロジェクトの中で設定しなければならないです。まず、以前のプロジェクトから@configurationアノテーションを宣言したajpconfigクラスファイルを生成しましょう。ajpconfigクラスを上みたいに作成してapplication.propertiesにtomcat.ajp.portを追加しましょう。apache設定の場合あhmod_jk.soファイルをインストールしてhttpd.configファイルを修正するし、workers.propertieファイルを追加します。(windowの場合あhapache loungeからダウンロードします。 リンク - https://www.apachelounge.com/download/)これからapacheを起動してイクリプスからspring bootを起動しましょう。ajpプロトコールが起動されることを確認できます。apacheで80を接続するとtomcatと連結したことを確認できます。でも、トラフィック(接続者)がもっと増えてapacheとtomcatだけで足りない時期が来ました。そうすると普通のウェブ要請と応答処理で一番時間が

Study / Java

作成日付 : 2022/02/28 18:45:48       修正日付 : 2022/02/28 18:46:57

6

こんにちは。明月です。この投稿はspring bootのjpaでentitymanagerを使い方に関する説明です。以前の投稿でspring boot framework環境でjpaを設定して使う方法に関して説明したことがあります。リンク - [java] 58. eclipseでspring bootのjpaを設定する方法しかし、以前の問題はjparepositoryインターフェースを継承して使うことです。jparepositoryインターフェースのことが問題があることではありません。データベースコネクションを簡単にアクセス可能にするし、トランザクション処理を自動に処理することで凄く楽な部分です。でも、この自動に処理することが問題があることです。自動というのは初期設定は凄く簡単にすることで良い部分ですが、結局、トランザクションをコントロールすることで限界があることです。例えば、複数のテーブルを同時に入力して処理する途中でエラーが発生します。その場合はすべてロールバックしなければならないですが、トランザクションを一つのテーブルではなく、同時に複数のテーブルを制御することが簡単ではないし、ソースが複雑になる可能性があります。つまり、jparepositoryもトランザクションを別に取得して制御が可能ですが、統合的(?)な管理がならないので逆にソースが複雑になるし、リソース管理などの明確な流れが制御になれません。まず、abstractdaoとfactorydaoを作成しましょう。リンク - [java] 50. jpaプロジェクトでdaoクラスを作成する方法リンク - [java] 52. springフレームワークでdaoをfactory method patternを利用して依存性注入する方法まず、abstractdaoの抽象クラスを作成しましょう。上のソースをそのままに継承してdaoを作って実行するとエラーが発生します。つまり、abstractdaoで11番目のラインの内容を見るとspring bootにはpersistence.xmlファイルがないので、entitymanagerfactoryを取得できません。76番目のラインと116番目のラインを見るとentitymanagerfactoryからentitymanagerを取得してtransactionを受け取って実行するので、やはりentityma

Study / Java

#java,#springboot,#jpa

作成日付 : 2022/02/25 18:27:48       修正日付 : 2022/02/25 19:20:25

7

こんにちは。明月です。この投稿はeclipseでspring bootのjpaを設定する方法に関する説明です。spring web framework環境でjpaを設定する方法に関して説明したことがあります。リンク - [java] 45. jpaを設定する方法基本的の設定はspring web framework環境で設定することと同じです。差異があればspring web framework는 persistence.xmlで接続環境を設定してspring bootはapplication.propertiesで設定することになります。spring bootは環境設定ファイルが一つに統合することになるので管理しやすいですね。まず、jpaを連結するためにローカルデータベースにテストテーブルを作成しましょう。そしてテーブルにテストデータを格納します。これから上のデータをspring bootを利用して画面に表示しましょう。一応、以前の投稿で作成したプロジェクトでjpaを追加しましょう。リンク - [java] 57. eclipseでspring bootを設定する方法まず、ウィザードを実行してjpaライブラリを追加しましょう。プロジェクトでマウス右クリックしてspring의 add starterを実行しましょう。そしてこれがeclipseのバグかどうか知らないですが、既存に選択したものが選択されていません。それで選択せずにfinishを押下すると既存に設定したライブラリが解除する状況になります。なので、以前に設定したものもチェックしなければならないです。(バグらしい。。。)jpaを使うためにはjdbc api、spring data jdbc、spring data jpa、mariadb driverを追加しなければならないです。nextボタンを押下するとソース比較画面が表示します。ここでpom.xmlだけ更新することをチェックしてfinishボタンを押下するとmavenアップデートします。ウィザードを使わなくてpom.xmlを直接に修正する方法もあります。実はウィザードを使うことより直接に環境設定するほうが正確なので、直接にpom.xmlを設定する方法をお勧めです。そしてeclipseでjpaを使わなければならないので、jpaモードに変更しなければならないです。eclipseはspring boo

Study / Java

#java,#jpa,#springboot

作成日付 : 2022/02/23 18:11:10       修正日付 : 2022/02/23 18:13:04

8

こんにちは。明月です。この投稿はeclipseでspring bootを設定する方法に関する説明です。最近、私が色々のイッシューでフレームワークをspring web frameworkからspring bootに乗り換えました。spring bootが楽だというのは以前から知ってましたが。。個人的に何かが自動に設定されることを好きではありません。理由は様々がありますが、その中で問題が発生する時に。。何処でエラーが発生したか明確に分かりにくいことが一番の理由ですね。そのため、私は一からすべてを設定して作成することを好きです。(「プログラムは自動に処理することは絶対ない! 何処かで処理するはずだ」という傾向です。つまり、バグも何処かで間違って処理したので発生するはずだと思いです。)でも、一つ一つ設定して作成することが利点だけあることではありません。生産性が悪いし設定することが多すぎるので管理が大変になることが大問題ですね。それで安定性が100%に確保してないライブラリは使わないです。特にオプーンライブラリ。。(昔の人。。おじちゃん。。(笑))私も生産性も凄く重要だと思います。でもバグが発生して、そのバグを把握することが大変だし、回避が難しいなら。使わない方が良いと思って今までspring bootを使わなかったんですね。でも、最近個人イッシューで。。spring boot frameworkを主に使った人が以前より増えたし、逆にweb frameworkを使う人が少なくなって。。プロジェクトを一人でやることでもないし。。一人でspring bootを使わないということもできないので、spring bootを使うことにしました。でも。。凄く良いですね。。spring boot。。凄く楽ですね。何で今まで使わなかったんだろうと思うほどに安定性も良いし楽ですね。特に、配布前略やビルド工程を設定することで凄く楽ですね。。ただ、一つのサーバーにウェブアプリケーションのトムキャットが多くなる問題はありますね。これも設定を出来るかと知りません。まだ、私も知らない部分が多いです。それで今までweb frameworkで設定した部分をspring bootにはどのようにsっていするか、開発環境を設定するかを説明します。intellijはultimateバージョンをインストールするとspring bootライブラリも自動にイン

Study / Java

#java,#springboot

作成日付 : 2022/02/22 19:04:49       修正日付 : 2022/02/22 19:06:57

9

こんにちは。明月です。この投稿はweb serviceのサーブレット(servlet)で初期化作業(properties設定)に関する説明です。web serviceプログラムを作成すると、サーバを起動する時に初期化作業が必要な場合があります。例えば、先にマスタテーブルのデータをインスタンス生成してメモリに割り当てするか、サーバの実行ディレクトリ設定などがあります。また、先に我々がweb serviceでormをjpaで使う場合、最初にconnection初期化が必要です。上の例は先にindex.htmlページを要請すればajaxでtest.jsonのデータを取得します。最初、起動する後でindex.htmlがローディングします。その後でtest.jsonを呼び出す場合に時間がどのぐらいかかるかを確認するプログラムです。結果は約1秒ほどの時間がかかります。時間がかかる理由は最初にconnection初期化するために時間がかかることです。再起動せずに同じページを再更新(f5 -reload)をすればajaxでデータを取得することが1秒もかからないです。この意味はサービスが最初だけ少し(?)遅くなることで初期化する必要がありませんが、それでも少し完璧(?)に設定するためには初期化を別途にするほうが良いです。初期化設定はweb.xmlで設定します。実行順番は初期化するクラスが一つではない場合はload-on-startupを通って順番を設定することができます。initcontrollerクラスはhttpservletのクラスを継承します。そしてinit関数でormを通ってデータを取得することでorm connectionを生成します。初期化で取得する関数はマスタテーブルを先にメモリに割り当てしてcontrollerでは再使用することでパフォーマンスを上がります。最初の起動からデータ取得が速いことを確認できます。その以外にウェブの環境設定データを設定する場合があります。例えば、ライセンスキーやsmtpのemailパスワードなどがあります。initcontrollerでpropertyを取得する関数を作成しました。staticタイプのflyweightパターンで最初にpropertyを読み込んでメモリに割り当てして再使用する方法で作成しました。(property値を修正するとサーバを再起動しなければならないです。)

Study / Java

#java

作成日付 : 2021/07/02 17:10:36       修正日付 : 2021/07/02 17:10:47

10

こんにちは。明月です。この投稿はspring frameworkに文字化けを解決する方法(encoding設定)に関する説明です。eclipseで我々がプログラムを作成する時、基本的にファイルの文字コードを設定します。上の例はjavaファイルとjspファイルに設定した文字コードですが、その以外にxmlファイルやpropertiesファイルにも我々は基本的にutf-8を設定します。このことはファイルに関する文字コードなのでサーバとクライアント間の通信の文字コードではありません。つまり、ブラウザから要請する時、その中では要請ヘッダー値があるし、このヘッダーの文字コードを指定しなければならないです。また、ブラウザから要請したことをまた、controllerの値とviewのデータをパーシングして返却するけど、ここにも文字コードの設定が必要です。上のソースを作成して起動すればindex関数が呼び出してindex.jspファイルがパーシングになってテキストボックスとsubmitボタンがある画面が表示されます。そしてtextboxで'こんにちは'というデータを入れてsubmitボタンを押下するとtextboxのデータがname名でparamdataの変数名に設定してformデータでpost関数が呼び出します。そしてパラメータparamdataでデータを受け取ってmodelmapのdataが設定された後、index.jspファイルがパーシングしてブラウザで応答します。予想する結果はsubmitボタンの下に'こんにちは'というデータが表示することを予想しますが、文字化けになってどの文字か分からない文字になりました。ここで我々はブラウザで要請するデータを文字コードを変換しなければならないです。まず、web.xmlのfilter設定でspringframeworkの文字コードを設定しましょう。link - characterencodingfilter.htmlfilterに関するには以前の投稿で説明したことがあります。link - [java] 54. spring frameworkでweb filterを使う方法文字変換クラスをフィルターに反映するとブラウザのすべての要請はcharacterencodingfilterクラスを通ることになります。そこですべての要請の文字コートは自動

Study / Java

java

作成日付 : 2021/06/30 16:37:16       修正日付 : 2021/06/30 16:37:16

11

こんにちは。明月です。この投稿はspring frameworkでweb filterを使う方法に関する説明です。我々がウェブサービスを構築する時にセッション管理やメモリ管理などのブラウザ要請に関する全体的に管理および設定が必要なことがあります。例えば、ログインした後でサーバ側ではユーザのセッションがあるかどうかの確認する場合があります。ユーザのセッションがある場合はユーザがログインしている状況になります。同然ですが、ユーザのセッションが格納されてない場合は当該なページからログインページに遷移やログイン要求をしなければならないです。※ 参考にセッション値とはサーバ側から管理するデータです。そのデータはブラウザのクッキー値にセッションキーをいれ、ブラウザのクッキー値が初期化及び満了にならないならサーバ側でキーとして格納されているデータを取得することです。方法としてはcontrollerで関数を呼び出すところの開始するところにセッションチェックする部分を実装して解決しても構いないです。でも、もっと簡単な方法としてはブラウザから呼び出しする時、常に呼び出す関数filterクラスを利用してセッション可否を確認する方法もあります。フィルダーはまず、web.xmlでどのurlパターンでどのクラスを呼び出すかを設定します。フィルダーマッピング(filter-mapping)タグにはブラウザから要請するマッピングパターンを設定します。私の場合はspring frameworkで基本的に*.htmlで呼び出すパターンをfilterを通るように作成しました。もし、すべてのページを設定しようと思えばアスタリスク(*)で設定すればよいです。でも、ウェブサービスに要請するリソースがウェブページだけあることではなく、imageやcssファイル(スタイルシートファイル), jsファイル(javascriptファイル)などもあるので、正確に設定する方が良いです。フィルダータグにはフィルダーマッピング(filter-mapping)で設定したページがcontrollerの呼び出す関数の前に呼び出すクラスを設定することです。私はcontroller.filterのパッケージのwebfilterクラスを呼び出します。init-paramはfilterクラスで使える変数値で、私はfilterチェックをしないようなページ、つまり、userログイン

Study / Java

java

作成日付 : 2021/06/29 18:25:12       修正日付 : 2021/06/29 18:25:12

12

こんにちは。明月です。この投稿はウェブサービス(web service)でエラーページを処理する方法に関する説明です。基本的なウェブプロジェクトを設定することは以前の投稿まで説明することで終わりました。ウェブサービスのフレームワークのspring framworkを設定することからデータベースのorm(object reference mapping)のjpa設定間です。つまり、実際にクライアント(ブラウザ)がサーバに接続して当該なデータをデータベースから取得してクライアント(ブラウザ)に表示するhtmlをパーシングする作業までです。ここまで設定してプロジェクトを作成してウェブプログラムを運用することで問題はありません。しかし少しディテールな作業があります。例えば、エラーが発生した時、エラーページを表示する作業やログイン管理のため、セッション作業などのプログラムの完成度を上げるような作業です。基本的にトムキャットサービスでエラーが発生すると下記とおりのページが表示されます。実際に運用するウェブサービスで上みたいなページが表示されるとダメです。何かが完成されてないみたいな画面です。それでエラーが発生した時、我々が指定したページを表示するような方法があります。ウェブ設定(web.xml)でエラーフォーワードを設定することができます。上の設定はerrorが発生した場合にerror.htmlに遷移することです。私は拡張子が.htmlの場合、spring frameworkのcontrollerをとおりようにしましたのでcontrollerクラスにerror.htmlを設定します。error.htmlに要請するパターンを設定してerror.jspとパーシングしてブラウザに応答します。確実にerror.htmlが要請されエラーコードが404(ページ無し)が表示されます。ブラウザデバッグモードでnetworkタブの要請応答の状況を確認すればerror要請すれば404エラーが発生しますが、redirectで発生したこと(再送信)ではなく、errorページに関数エラーページが発生しました。実際のサービスでエラーが発生するか間違いアドレスに接続すると、基本トムキャットページではなく、エラーページが表示することを見たことがあります。上のイメージはグーグルで間違いアドレスに接続した場合に表示される画面です。ウェブのエラーコード別

Study / Java

Java

作成日付 : 2021/06/25 13:35:54       修正日付 : 2021/06/25 13:35:54

13

こんにちは。明月です。この投稿はspringフレームワークでdaoをfactory method patternを利用して依存性注入する方法に関する説明です。以前の投稿でspringフレームワークでjpa ormのdaoを@autowiredのアトリビュートを使って依存性注入する方法に関する説明しました。link - [java] 51. springフレームワークでjpaを使い方(依存性注入@autowired)spring controllerにはdaoを取得してjpa ormを利用してデータを取得する部分に関しては問題ありません。でも、問題はspring controllerではないクラスでdaoを取得する方法が問題です。もちろん、一般クラスでただdaoクラスのインスタンスを生成(new)して使っても問題ありません。しかし、springで依存性注入でsingleton形式で使うのに、他の一般クラスで一般インスタンス生成してデータベースに接続してデータを取得することではなく、同じsingletonパターンで取得して使いたいです。そのため、daoクラスを制御するfactory method patternを先に作成することが必要です。上のソースはfactorydaoクラスをsingletonパターンタイプで作成しました。つまり、プログラムが開始してfactorydaoのインスタンスはただ一つだけ生成されます。そしてgetdaoはfactory method patternです。つまり、パラメータのクラスタイプによりインスタンスを取得します。しかし我々がdaoのインスタンスを生成するたびにfactorydaoでifやswitchの分岐文を作成することが大変なので、パラメータのクラスタイプでreflectionを利用してインスタンスを生成するflyweight patternを適用しました。つまり、改めてまとめたらsingleton + factory method + flyweightパターンの結果です。じゃ、springのcontroller部分ではなく、一般クラスの関数部分でdaoを取得して使いましょう。じゃ、controllerでcommonクラスのgetusernamebyid関数を利用しましょう。上の結果をみればcommonクラス中でuserdaoを利用してデータベースに接続してデータを取得し

Study / Java

#java

作成日付 : 2019/10/17 07:15:48       修正日付 : 2021/06/24 17:32:00

14

こんにちは。明月です。この投稿はspringフレームワークでjpaを使い方(依存性注入@autowired)に関する説明です。以前の投稿でjpa ormフレームワークを通ってデータベースからデータを取得するしそれをdaoクラスを作成して使う方法に関して説明しました。link - [java] 50. jpaプロジェクトでdaoクラスを作成する方法そのjpa ormをspringフレームワークで使いたいですが、そのままにdaoクラスのインスタンスを生成して使うことも問題ありません。でも、daoクラスというのは様々なインスタンスを生成して使うことより、singletonパターンの形式で一回にインスタンスを生成して再使用するのがプログラム性能が良いです。なぜなら、インスタンスを生成(new)するのは考えより時間がかかります。(何秒単位でかかることではありません。)そしてマスタテーブルのdaoクラスなら一回のデータ取得で何回に再使用する方が良いです。そのためにdaoをsingletonパターンで作成して、それを取得するためにfactoryパターンを作成したらよいですが、springフレームワークはそれを支援する依存性注入(dependency injection)という概念があります。依存性注入とはsingletonパターンとfactoryパターンを併せたパターンだと思えばよいです。(実はsingletonパターンとfactoryパターンを併せた概念とは差異がありますが、ほぼ似てます。依存性注入パターンはデザインパターンのカテゴリで説明します。)依存性注入パターンを使うためには@autowiredアノテーションを知らなければならないです。@autowiredアノテーションはspring設定のxml(mvc-config.xml)で設定したbeanオブジェクトを取得して使うアノテーションです。最初に呼び出すときにインスタンスが生成され、次から呼び出すときには生成されたインスタンスを再使用する方法です。(singletonパターン)まず、以前の投稿で作成したentityクラスとdaoクラスをspringプロジェクトにコピーしましょう。link - [java] 39. spring web frameworkを利用してウェブサービスプロジェクトを作成する方法まず、mvc-config.xmlを設定しましょう。mvc-

Study / Java

作成日付 : 2019/10/16 07:32:55       修正日付 : 2021/06/23 17:26:57

15

こんにちは。明月です。この投稿はjpaプロジェクトでdaoクラスを作成する方法に関する説明です。以前の投稿までjpaフレームワークを使い方に関して説明しました。今回はjpaを実務のプロジェクトにどのように使うかに関する内容です。jpaフレームワークにtransaction共通関数を作成してそのままにウェブプロジェクト(servletやspringフレームワーク)のcontrollerに使っても問題はありません。例えば、controllerの要請がある時、当該なデータをデータベースから取得してそのデータをentityクラスに格納してクライアント(ブラウザ)に応答しても構いないと意味です。でも、実務のウェブプロジェクトを作成する時に少しルールがあります。まず、ウェブ要請がある時に当該な要請で使うデータベースのデータは一括で取得します。その後、セッションに格納するデータや取得するデータを取得して最大に簡潔なロジックを実装して応答します。なぜ、こんなルールがあるかというとウェブというのはcontrollerで処理が多くなれば応答速度が遅くなります。使用者の特性上、ページを要請したのに1秒以上がかかっても何か問題があるではないかと認知するので処理速度が遅くなるとダメです。その理由で一番時間がかかる処理(database connection)を一番先に配置して、その後で処理ロジックを実装することです。そうすると後にデバッグやプロファイリングする時の性能チェックが簡単になります。そのことでデータベースからデータを取得してcontrollerから使うデータに変換する作業がdao(database access object)クラスを作成することです。ウェブからは二つのデータ変換オブジェクトがあります。それがdtoとdaoです。dtoはクライアント(ブラウザ)から要請するデータ値をクラスインスタンスタイプに変換することで、この部分はspringで自動に処理します。link - [java] 40. web spring frameworkでcontrollerを扱う方法daoはデータベースのデータをクラスインスタンス値に変換する作業です。それも一部jpaフレームワーク側で処理します。でも、データを様々にjoinするか複雑に取得する場合があるため、daoクラスを作成します。まず、daoクラスを作成するために共通的に使ってい

Study / Java

#java

作成日付 : 2019/10/15 20:12:35       修正日付 : 2021/06/22 12:32:50

16

こんにちは。明月です。この投稿はjpaでトランザクション(transaction)を扱う方法と共通関数作成する方法(observerパターン)に関する説明です。トランザクション(transaction)とはデータベースで論理的な状態の変化、つまりinsert、update、deleteでデータベースのデータの更新があることをトランザクション(transaction)という意味です。その意味でデータの更新が多いことをトランザクション(transaction)テーブル、そうではないことをマスタ(master)テーブルといいます。このトランザクション(transaction)は範囲を設定することができますが、範囲設定を通ってアトミック(atomicity)、一貫性(consistency)、独立性(isolation)、耐久性(durability)を守れられます。もっと理解しやくのため、ウェブを通って会員登録設定を作ると思いましょう。会員登録を通って基本的なidと様々なテーブルにデータを同時にinsertをすると思いましょう。でも、最初idがある基本情報テーブルにinsertを完了して様々なテーブルにinsertする途中でエラーが発生しました。つまり、テーブル一つの単位でトランザクション(transaction)をかけ、基本情報のデータをinsertしましたが、エラーが発生して他のテーブルにinsertをできませんでした。そうならデータの無結成を守られません。それですべてのデータがしっかりinsertにした後、commitを通って一括で同時にデータが格納され、もし、エラーが発生すればcommitかわりにrollbackを通って途中でinsertしたデータをトランザクションが始まる前の状況に戻らなければなりません。それをトランザクション(transaction)範囲設定です。上のソースは私が途中でpersist関数を使ってデータを格納する関数を呼び出しましたが、途中にruntimeexceptionで強制にエラーを発生しました。そして上のトランザクション(transaction)範囲でcommitを実行しなずにrollbackを実行することにしてpersist関数やmerge関数、remove関数で呼び出したデータがデータベースのデータが更新しなずにそのままにトランザクション(transaction)範囲を設定

Study / Java

#java

作成日付 : 2019/10/14 20:13:44       修正日付 : 2021/06/21 18:51:00

17

こんにちは。明月です。この投稿はjpaでqueryを使う方法(jpqlクエリを作成する方法)に関する説明です。jpaで基本的にデータを取得する方法はentityで宣言されているnamequeryを通ってデータを取得します。そしてリファレンスのjoinになったデータを取得するために取得するデータでlistの関数get、size関数を通ってデータを取得します。でも、上の方法の問題はデータをすべて取得してコード上のfilterや分岐でデータを取得します。つまり、データが多いとシステムが遅くなります。そうならクエリでデータベースからデータを取得する段階でデータを分類して取得した後、処理する方が良いです。jpaはクエリでデータを取得する方法が二つがあります。一つはjpaで使うjpqlクエリで取得する方法とデータベースで使うsqlクエリで取得する方法です。まず、データベースで使うsqlクエリを利用する例です。managerクラスのcreatenativequery関数を利用してデータベースのsqlクエリでデータを取得することができます。問題はjpaで生成したentityクラスのマッピングでできないことです。jpaを利用して取得したデータはデータを修正すると、その値をデータベースにupdateするし、削除するし、様々な作業ができます。でも、クラスのマッピングができなければjpaを使う理由がないです。そのため、jpqlクエリでデータを取得したデータではなければjpa機能を完全に使えないです。実はjpqlクエリでもsqlと全然違う種類のクエリではありません。ほぼ90%は似てます。sqlクエリと違う点はテーブル名です。sqlにはテーブル名を大小文字区分なしで取得ができますが、jpqlはテーブル名ではなくクラス名です。つまり、クラス名は大小文字を区分するので、userではなく、正確にuserということに作成しなければならないです。そしてアスタリスクマーク(*)ですべてのデータを取得することもありません。リターンするクラスを使います。我々はuserクラスでリターンするためにuserクラスの置換名(aliases)というuを使います。そしてwhere節にある検索のフィールド名はsqlのカラム名ではなく、クラスの変数名です。現在の例は変数名とsqlカラム名が同じなので同じくみえます。そうなら変数名を変更してテストしましょう。idに@

Study / Java

#java

作成日付 : 2019/10/13 22:55:52       修正日付 : 2021/06/17 16:20:51

18

こんにちは。明月です。この投稿はjpaのentityクラスのリファレンス設定(cascade, fetch)に関する説明です。以前の投稿でideツール(eclipse)でjpaのentityを自動生成して基本的に設定しなければならない方法に関して説明しました。link - [java] 46. jpaのentityクラスの基本設定(@generatedvalue、 @manytomany)基本的な設定でプロジェクトを運用及び作成することは問題ないですが、パフォーマンスのためにもっと修正しなければならないことがあります。例えば、以前投稿で使ったデータベースでuserテーブルを検索してinfoテーブルのデータを読み込むことで基本的な設定ではuserのリファレンステーブルのinfoデータがありません。上の例をみればuserクラスでgetinfos()を呼び出してstream式でデータを出力すればデータがないことで出力します。でも、get(0)やforeachを使ったら関数の呼び出す共にリファレンスデータをデータベースから取得します。つまり、始めのuserクラスにはデータが無いですが、getとiteratorを呼び出したらその時にデータをデータベースから取得します。仕様によりstream式を使わなかったら構いないですが、最近のプログラムコードはstream式を使わなかったらすごく複雑になるので、今は必須になっています。これを解決する方法にはfetch設定です。fetchfetchは当該なクラスをデータベースから検索して取得する時、同時にリファレンスデータを取得するかgetの関数を使う時に取得するかのオプションです。オプションの終了はeagerとlazyがあります。eagerのオプションは当該なクラスの取得する時にjoinして取得するし、lazyのオプションは関数の呼び出しがある時に取得します。つまり、上の例みたいにgetの関数の呼び出しがある時に取得することはlazyのオプションです。別に設定しなくても構いないのデフォルト設定です。当該な変数にfetch = fetchtype.eagerを設定しました。始めの例を、また実行したら今回にはコンソール出力にemptyではなく、データが表示されます。デバッグでポインタを掛けてuserを取得する段階で確認すればもうデータがあることを確認できます。これをなぜオプションで選

Study / Java

#java

作成日付 : 2019/10/13 00:40:08       修正日付 : 2021/06/16 19:30:14

19

こんにちは。明月です。この投稿はjpaのentityクラスの基本設定(@generatedvalue、 @manytomany)に関する説明です。以前の投稿でjpaを基本的に設定する方法と使う方に関して説明しました。link - [java] 45. jpaを設定する方法jpa ormの構成は一応データベースにテーブルを生成してide(eclipse)を通ってテーブルの構造を読み込んで自動にentityクラスを生成します。でも、これがeclipseのバグかjpa仕様かは知りませんが、生成する時に基本的な設定だけして具体的な設定はユーザが設定しなければならない部分があります。例えば、基本キーを設定してauto_increment値に関しても別に設定しなければならないし、各referenceに関してもどのタイプに設定するかも設定しなければならないです。そしてデータタイプでもbitやdatetimeを設定すればclassにはどのデータタイプかを正確に設定しなければならないです。この部分が少し不便ですね。まず、我々がクエリを作成してclassを設定する方法に関して説明します。userテーブルのキーはidカラムです。そしてinfoテーブルはuserテーブルのidでreferenceを連結して、info2テーブルはinfoテーブルのkey(idx)でreferenceを連結しました。そしてpermissionテーブルはuserテーブルとm:n関係ですが、データベースはm:nの関係を表現できないので、permission_mapテーブルを置いてm:n関係を作りました。上のテーブルをjpaでクラスを生成(generate)しましょう。テーブルは5個ですが、クラスは4個が生成されました。なぜならデータベースにはm:n関係を表現できないですが、プログラムクラスはm:n関係を表現できるので、permission_mapのテーブルの対するクラスは生成されませんでした。それならプログラムでデータを追加しましょう。userテーブルにisdeletedのカラムでデータタイプが合わないというエラーが発生します。クエリをみれば、bitタイプで設定しましたが、eneityクラスファイルはobjectタイプで設定されています。bitタイプは物理的には0と1、論理的にはtrueとfalseのデータを使います。なので、プログラムにはboolean

Study / Java

#java

作成日付 : 2019/10/11 07:30:14       修正日付 : 2021/06/14 20:46:10

20

こんにちは。明月です。この投稿はjpaを設定する方法に関する説明です。javaプログラムでデータベースのコネクション管理するフレームワークがあります。そのフレームワークを我々はorm(object-relational-mapping)といいます。以前、ormフレームワークを使わなかった時、または使用頻度が少なかった時にはプログラムでsql connectionを組み立てソースに直接にsqlクエリを作成してデータベースからデータを取得しました。その方法はプログラム管理する時に様々な問題があります。例えば、データベースのテーブルを修正した場合、sqlクエリをstringタイプで作成したのでプログラムのコンパイルエラーやデバッグエラーが発生しません。そのため、大きいプロジェクトだっと思えば各sqlクエリを修正することがずいぶん大変だったんです。また、stringで作成したことなので、もしかして修正漏れがある場合、デバッグエラーで取れないので、実行中でエラーが発生します。他の問題はreference管理です。sqlクエリ上でテーブル間にjoinして結果に合わせてentityクラスを作成します。でも、joinの状況によりクラスがたくさん生成される結果になります。そうすればクラスが多くなって管理が大変になるし、テーブル修正がある場合に作業が多いです。個人的にこの2つの問題を解決するしデータベースのツリー構造のデータをプログラムのクラスタイプの連結リストタイプの構造に変換するフレームワークをormフレームワークといいます。javaののormフレームワークは種類が多いです。hibernateということもあるし、domaのseasorということもあります。私の場合は昔ibatisというフレームワークも使ったことがあります。いつからかは知りませんが、java側ではjpa(java persistence api)というフレームワークがjavaの標準ormに指定されました。最近はjava ideツールのeclipseでjpaフレームワークを扱いやすく支援しています。なので最近の雰囲気はjpaをormに選択して使うことが標準になっています。jpaを使うためにはmavenでライブラリを連結しなければならないです。「pom.xml」で2つのライブラリを連結しましょう。一番目のdependencyはjpaライブラリです。二番目のde

Study / Java

#java

作成日付 : 2019/10/10 07:29:43       修正日付 : 2021/06/11 10:14:12

21

こんにちは。明月です。この投稿はweb spring frameworkのviewで使うプログラム言語(jstl) - xmlに関する説明です。以前の投稿でjstl言語のコアー、フォーマット、関数、データベースに関して説明しました。xml処理はhtmlファイルから別のxmlファイルのデータを抽出して使うライブラリです。最近はajaxでjsonタイプのデータを通信する方法をよく使うし、そのことに関してライブラリも多いし、使い方も使いやすいのでこのxmlライブラリをよく使いません。しかし地域化(localization)やメッセージのデータを取得するために使うこともあるので知ってる方がよいです。xmlライブラリまず、xmlライブラリを使うためにはpom.xmlにライブラリを追加しなければならないです。まず、xmlファイルの一つを生成しましょう。ここでこのxmlファイルのパスはウェブブラウザ状態のパスではなく、サーバ側のディレクトリパスです。なぜならviewのファイルはサーバ側でcontrollerのデータとviewのjstl言語のファイルのデータを結合して最終のhtmlをブラウザに応答することです。なのでjstlはブラウザ側のパスではなく、サーバ側のパスを考えて作成しなければならないです。xmlパーシングと出力 <x:parse />, <x:out />xmlデータの繰り返し <x:foreach />xmlデータを変数に置換 <x:set />xmlデータの分岐文 <x:if />xmlデータの分岐文 <x:choise />, <x:when />, <x:otherwise />xslファイルと結合 <x:transform />, <x:param />xslファイルとはxmlスタイルシートファイルだと思えばよいです。(extensible stylesheet language)つまり、xml構造とxslファイルを結合して一つのhtmlファイルを作ることです。cssを使ったらxml構造とxslファイルを結合するとスタイルシ

Study / Java

#java

作成日付 : 2019/10/09 07:34:08       修正日付 : 2021/06/10 15:12:52

22

こんにちは。明月です。この投稿はweb spring frameworkのviewで使うプログラム言語(jstl) - 関数、データベースに関する説明です。以前の投稿でjstl言語のコア―とフォーマットライブラリに関して説明しました。コア―はjstlの言語でよく使うライブラリだし、フォーマットも最近momentのjavascriptライブラリがあって前よりよく使わないですが、よく使うライブラリの一つです。ここで使う関数ライブラリは文字の関するライブラリですが、普通は文字処理に関してはjspファイルで処理することよりサーバ側、controller側に処理した後、結果だけ出力することが普通です。もちろん、データベースライブラリもjspファイルで処理することよりcontroller側で処理することが普通です。つまり、最近はよく使うライブラリではないですが、以前にはよく使うライブラリだったし、仕様によって使われる可能性があるので簡単に説明します。関数ライブラリコア―とフォーマットライブラリはjstlをタグタイプに使いました。でも、関数ライブラリは値を表す方式がドルマークと中括弧(${データ})形式に使います。文字含め可否 fn:contains(string, sbustring)文字含め可否(大小文字無視) fn:containsignorecase(string, sbustring)文字列がprefixで始まる可否 fn:startswith(string, prefix)文字列がsuffixで終わる可否 fn:endswith(string, suffix)特殊文字(<, >, &, ', ")をxmlエンティティコード(<, >, &, &#039, &#034)に変換 fn:escapexml(string)一致する文字列のインデックス fn:indexof(string, sbustring)文字列をseparatorの文字によって配列に分離 fn:split(string, separator)配列をseparatorの文字で結合 fn:join(array, separator)文字列の長さを返却 fn:length(string)strin

Study / Java

#java

作成日付 : 2019/10/08 07:43:33       修正日付 : 2021/06/09 16:38:02

23

こんにちは。明月です。この投稿はweb spring frameworkのviewで使うプログラム言語(jstl) - コア―、フォーマットに関する説明です。jstlとはjsp standard tag libraryの略語です。jspのウェブページで使うタグタイプのプログラム言語です。この言語はspringフレームワークだけではなく、servlet、struts(ストラッツ)プレームワークでも使えます。以前、開発者(デベロッパー)とウェブデザイナーの業務が分けて開発する時代にウェブデザイナーさんがプログラム言語に慣れてないし使いにくい時、デザイナー専用言語という話(?)がある時がありました。この話が本当かは知りませんが、確実にjavaプログラム言語より簡単だし使いやすいです。そしてプロジェクト中で作成したプログラム言語と別の概念なのでcontrollerとview、つまりfront-endとback-endが区分されて開発することができます。この話はプロジェクト工程の話ですが、back-endはデータベースやサーバ環境設定、構成する開発を担当するし、front-endはcssやjavascript言語を使ってプログラムすることの意味です。でも、私の場合はそんなに区分して開発したことがありませんね。開発経歴は少ない時にはウェブデザイナーからウェブデザインのイメージなどを渡って受けたら仕様によりcssに変換、javascriptを作成するし、以降にはajax概念ができて、データ値はjavascriptで処理することにしました。その後、bootstrapなどで開発者に合わせる画面開発方法や工程概念ができて画面から納品まで開発者(デベロッパー)がすべて担当して作業しました。いつかウェブデザイナーという方がプロジェクトから見たことがないですね。単純な私の経験なので一般的にはありません。なので最近はプロジェクトを立ち上がって完成するには勉強しなければならないことが多いですね。jstlの話に戻ってまず、jstlを使うためにはpom.xmlにライブラリを追加しなければならないです。そしてjstlライブラリを使うためにはjspファイルの上に宣言して使ったらよいです。jstlを使う方法にはライブラリより接頭辞の使い方が違います。まず、ライブラリの週類は五つあります。一般プログラム言語を処理する変数宣言、出力、簡単な条件文、

Study / Java

#java

作成日付 : 2019/10/07 07:38:13       修正日付 : 2021/06/07 18:44:10

24

こんにちは。明月です。この投稿はweb spring webframeworkのcontrollerからajaxの要請する時、jsonタイプのデータを返却する方法に関する説明です。以前の投稿でweb spring frameworkのcontrollerを扱う方法に関して説明しました。link - [java] 40. web spring frameworkでcontrollerを扱う方法controllerとはウェブブラウザから要請すると実行する関数を探して実行します。その後、ウェブブラウザに応答する役割までします。しかし、ここでcontrollerメソッドは基本的にstring値をリターンすることになっています。このstringタイプはviewファイル名を探すために作成することになっています。でも、我々がajaxでウェブページのhtmlのデータを受け取る場合もありますが、普通はjsonタイプでデータを受け取る方法が普通ですね。そうしたら、viewのhtmlファイルをマッピングすればだめですね。逆にリターン値でデータ値を格納して受け取る必要があります。サーブレットみたいですね。リターン値をnullや文字がないstringタイプでリターンしてパラメータのhttpservletresponseのgetwriterの関数は使うことはどうでしょう。可能です。でも、そうことにしたらspring frameworkでサーブレット文法を使う気がしますね。それならもっとspringらしいな作成する方法に関して説明します。以前私がspring環境を設定する時、mvc-config.xmlで設定していることに説明したことがあります。link - [java] 39. spring web frameworkを利用してウェブサービスプロジェクトを作成する方法ここでajaxのための設定を追加しましょう。先にmvc-ajax-config.xmlを追加します。上のxml設定ファイルをweb.xmlに設定しましょう。以前のコントローラーパッケージはcontrollerだったですが、ajaxコントローラーパッケージはcontroller.ajaxです。contoller.ajaxパッケージ中でクラスを生成します。ここのポイントは@responsebodyのアトリビュートです。@responsebodyを設定するとviewを探索しな

Study / Java

#java

作成日付 : 2019/10/04 19:24:43       修正日付 : 2021/06/04 17:41:15

25

こんにちは。明月です。この投稿はweb spring frameworkでcontrollerを扱う方法に関する説明です。以前の投稿でウェブサービスをspring frameworkを利用して構築する方法に関して説明しました。link - [java] 39. spring web frameworkを利用してウェブサービスプロジェクトを作成する方法controllerとはクライアント(browser)から要請があればホストを取り除いたアドレス値をパーシングして当該なメソッドを呼び出す機能です。このアドレス値でパーシングしてメソッドを呼び出す時に一番やりやすい方法は各のページで呼び出す方法をあり、よく使いますが、その以外には複数ページや正規表現の方法で呼び出す方法もあります。または呼び出すヘッダーの情報やパラメータの値によって呼び出す方法もあります。@requestmapping@requestmappingとはウェブから要請されたらアドレス値によって探索が可能にするアトリビュートです。このアトリビュートはクラスとメソッドに使えます。上の例をみれば「/home/index.html」を呼び出したらindex関数が実行されたことを確認できます。requestmappingは一つのページをマッピングすることではなく、複数のアドレスを一つの関数に呼び出すことができます。単純にアドレスを指定することより正規表現式によりマッピングすることも可能です。呼び出すメソッドタイプによりマッピングすることもできます。その以外にもパラメータ、ヘッダーの値により関数探索が可能です。仕様により区分して細かく使うことができますが、普通はそんなに細かく分けて設定しないです。細かく使くなったら逆に可読性が悪くなるし、プログラムだけ複雑になります。私もvalueとmethodの以外は使ったことがありません。modelmapspringでマッピング関数を作成する時にパラメータがなくても構いません。マッピングは@requestmappingで区分されるからです。でも、ブラウザにパラメータ値を受け取る時や様々なセッション情報、要請値(request)、応答値(response)を使う時があります。そのため、基本的にmodelmap modelmap, httpsession session, httpservletrequest req, ht

Study / Java

#java

作成日付 : 2019/10/03 20:02:06       修正日付 : 2021/06/03 17:09:28

26

こんにちは。明月です。この投稿はspring web frameworkを利用してウェブサービスプロジェクトを作成する方法に関する説明です。以前の投稿でjavaのservletを利用してウェブサービスを構築する方法に関して説明したことがあります。link - [java] 38. javaでウェブサービスプロジェクト(jsp servlet)を作成する方法jsp servletというのはjavaの言語でウェブサービスを構築するようにするフラットフォームだと思います。つまり、サーバとクライアント(browser)の間のhttpプロトコールを利用してソケット通信するウェブサービスを別途で構築する必要がなしでservletを利用して簡単に通信環境を作られるようなフラットフォームです。ライブラリとフラットフォームの差異はライブラリはさまざまな規約とapiを使うためにクラスや関数を作成しておいたものだし、フラットフォームはどの環境を使うために先に構築しておいた環境です。そのため、servletはフラットフォームという意味にもっと近いと思います。このservletはウェブサービスを使うための先に構築された環境だと思います。しかし、そのservletは使うためにはとても不親切です。例えば、ブラウザから要請を受け取ってservletでリターンするとhtmlデータをすべてstringタイプに変換しなければならないです。上の例をみれば、doget関数のreponse値にhtmlタグをstringタイプに格納します。簡単なhtml値でもステップ数が結構ありますね。それならもっと複雑なページを作ると思ったら一つのページでもすごく複雑になると思います。そうならhtmlファイルに作ってfilestreamで読み込んでstringで変換するなら?可能です。でも例みたいにパラメータの値やpostデータ値を格納する時はreplace関数で置換しなければならないです。また、データをstringタイプで扱うことなのでcelipseではdebugエラーをチェックしてくれないです。そのため、servletをそのままに使うことはすごく不便です。また、これを解決するため、毎度frameworkを開発することは開発工数がすごくかかると思います。javaにはこのことを解決するためのopen frameworkがたくさんありますが、その中でここで紹介するこ

Study / Java

#java

作成日付 : 2019/10/02 21:00:22       修正日付 : 2021/06/02 15:50:35

27

こんにちは。明月です。この投稿はjavaでウェブサービスプロジェクト(jsp servlet)を作成する方法に関する説明です。ウェブというプログラムはserver(web server)とclient(browser)の間に決めっている標準規約でソケット通信することということです。簡単に説明すると、client(browser)でurlアドレス含めているパスとparam string(ホストアドレスの?の後で設定されている値)と基本的なhttpヘッダー情報を作成してserverに要請すれば当該な値を計算して規約とおりに返事して接続を切る規約をウェブサービスといいます。それで我々はウェブサービスサーバを構築するためにはブラウザから要請される値を解析してその値に合わせて返事ヘッダーとデータ値を作成しなければならないです。それをコンソール環境で作成することでは大変難しいことになります。javaには特定な要請を自動にパーシングして我々が簡単に宣言されている変数などを通ってデータを簡単に取得するし、応答ヘッダーやデータ値を作成する時にも簡単なルールを通りにリターンすることで簡単にウェブサービスを作成することができます。それをjava server page(jsp)といいます。参考に、我々がウェブサービスを作成する時にストラッツやスプリングなどの話をよく聞きます。ストラッツやスプリングなどはウェブプログラミングのフレームワークのライブラリです。それがウェブプラットフォームではありません。フレームワークというのは我々がプログラムを作成する時によく使う関数やライブラリ、そして複雑なアルゴリズムを簡単に作成するように手伝ってくれる集約されたライブラリということに思えばよいです。つまり、基本的にjspプロジェクト上でこのjspをもっとしやすく扱うためのライブラリです。それで始めにjavaでウェブサービスを作成することならフレームワークを習う前にjava servletに関して理解する必要があります。link - https://ja.wikipedia.org/wiki/java_servlet先にサーブレットプロジェクトを作成する前にはideツールにトムキャットを設定する必要があります。以前の投稿でトムキャットを設定する方法に関して作成したことがあります。link - [java] 37.イクリプス(eclipse)でト

Study / Java

#java

作成日付 : 2019/10/01 21:48:08       修正日付 : 2021/05/31 17:34:57

28

こんにちは。明月です。この投稿はイクリプス(eclipse)でトムキャット(tomcat)を設定する方法に関する説明です。ウェブサービスを開発するためにはwas(ウェブアプリケーションサーバ)のトムキャットを先にインストールしなければならないです。その後に開発ツール(ide-eclipse)にトムキャットを設定して開発環境を構成しなければならないです。まず、トムキャットをインストールするためにホームページに接続してトムキャットをダウンロードしましょう。link - https://tomcat.apache.org/download-80.cgiトムキャットをインストールするためにはzipファイルをダウンロードして圧縮を解凍する方法があるし、window installerを利用してインストールする方法があります。window installerを利用してインストールする場合はインストーラでサービスを登録させてくれるしウィンドウが起動する時に自動にサーバ起動をする設定までやってくれます。しかしこの方法は開発が終わった後にwebアプリケーション(web application)を登録する時にはよいですが、我々は開発環境を構築することなのでインストーラより圧縮ファイルをダウンロードして開発環境(eclipse)に設定しましょう。それならzipファイルをダウンロードしましょう。圧縮ファイルをダウンロードしたら適当なところに解凍してもよいですが、プログラム管理の便利性のため、eclipseの下のフォルダやプロジェクトフォルダに解凍しましょう。私の場合はeclipseがインストールしたところに解凍しました。トムキャットをインストールはこれだけでよいです。そうすると開発のために開発ツール(eclipse)にトムキャットを登録しましょう。まず、イクリプス(eclipse)を実行して新しいプロジェクトを生成しましょう。eclipseのプロジェクトウィザードでserverを選択しましょう。ダウンロードしたトムキャットバージョンを合わせてサーバタイプを設定しましょう。私の場合は8.5.xバージョンをダウンロードしたのでtomcat v8.5 serverを選択しました。次はトムキャットがインストールパス(解凍されたフォルダパス)を選択して設定しなければならないです。私の場合はeclipseの下のフォルダに解凍したのでそのパス

Study / Java

#java

作成日付 : 2019/09/30 22:19:34       修正日付 : 2021/05/31 11:28:58

29

こんにちは。明月です。この投稿はjavaでコーディングする時、よく使うコーディングパターンとステップ数を減らす方法に関する説明です。以前の投稿でjavaのコーディング規約に関して説明したことがあります。link - [java] 35. コーディング規約設定(google standard coding style)プログラムのプロジェクトを設計する時にコーディング規約を守ることも重要ですが、どのプログラムを設計するか、どのデザインパターンを反映するか、ステップを減らすためのどのアルゴリズムを使うかを考えることになります。デザインパターンやアルゴリズムに関しては別の投稿で説明します。ここの投稿ではデザインパターンよりは簡単なパターンやアルゴリズムの作成方法に関して説明しようと思います。クラスを作成する時にインタフェース、抽象クラスを活用しよう。javaには一般インタフェースと違い、特殊な文法を使えるようなインタフェースがあります。例えば、runnableとcallableのインタフェースはラムダ式を使えるし、clonableインタフェースはクラスのメモリコピーができます。closeableのインタフェースはtry~catchで自動close関数を呼ばれる式を作れます。throwableの場合は例外処理クラスを生成するし、serializableの場合は直列化(シリアライズ)ができるインタフェースです。上の例はdataタイプの抽象クラスとprocessタイプの抽象クラスを作りました。dataタイプの抽象クラスはデータベースや色々のデータがあるentityタイプのクラスだし、processタイプの抽象クラスをそのデータを処理するcontrollerタイプのクラスです。それでdataタイプのクラスはクラスのメモリコピーが可能なcloneableインタフェースと直列化(シリアライズ)ができるserializableインタフェースを継承します。processタイプのクラスはスレッドで使えるrunnableインタフェースとclose関数が使えるcloseableインタフェースを継承します。もちろん、クラスで直接にインタフェースを継承して作成することができますが、インタフェースとクラス間に抽象クラスを置いて、クラス側で共通部分と派生部分を分けて開発することができます。分岐文はif~elseよりbreakとcontinu

Study / Java

#java

作成日付 : 2019/09/27 20:39:09       修正日付 : 2021/05/28 17:33:23

30

こんにちは。明月です。この投稿はjavaのコーディング規約設定(google standard coding style)に関する説明です。プログラムプロジェクトを作成する時に様々なルールと規約を設定しなければならない時があります。プロジェクトを一人で作成して運用すれば別に関係ないと思いますが、普通は一人ではなく、多人数で作成するので人の間のコーディングルールと規約を決めて無駄な工数を減らすことが重要だと思います。例えば、変数名を「abcde」ということに設定して作成したら作成した本人は変数の意味を分かるかも知らないですが、他人の場合はデバックするまでは何の変数かを分かりません。でも変数名は「avg」ということに設定すれば大体に平均値ではないかと予想することができます。つまり、コーディング規約はプログラム性能やパフォーマンス改善とはそんなに関係あることではなく、コードの可読性を改善することで、変数名や関数名だけでも何の機能するかを分かるように作成するし、クラス名だけでもデザインパターンを理解するし何の構造になっているかを他人がみても分かりやすく作成することです。javaのコーディング規約は様々なスタイルがありますが、最近はgoogleのコーディング規約をよく使います。link - google java style1. ソースファイル基本事項1.1 ソースファイル名が含めているクラス名は大文字、小文字区分で単語を区分して命名を決めます。拡張名は.javaになります。    例) examplesource.java (o) examplesource.java(x)1.2 ファイルのエンコードはutf-8にします。1.3 スペース(空白文字)はソースファイルで唯一に勝手に使える文字です。1.4 すべての特殊文字を使う時はエスケープシーケンス(\b,\t,\n,\f,\r,\",\',\\)を使います。でもその文字の進数(\012)、ユニーコード(\u000a)は使いません。1.5 コード可読性に影響がなければascii(\u221e)文字は使ってもよいです。※上の例は変数を作成して初期値を格納する時の例です。一番よいのはコメントなく、分かりやすい変数名を決めてデータを格納することですが、エンコード上でそれが不可能な

Study / Java

#java

作成日付 : 2019/09/26 21:31:25       修正日付 : 2021/05/27 17:32:53

31

こんにちは。明月です。この投稿はwindowでmariadbをインストールする方法に関する説明です。我々がプロジェクトを設計してプログラムを作成することで一番よく使うプログラムはデータベースです。データベースの種類はすごく多いですが、その中で無料でパフォーマンスがいいし、rdbms系のデータベースのmariadbがあります。mariadbの特徴に関して説明するとoracleとmssql(sql-server)と同じタイプのrdbms系だし、ライセンスが無料になります。なのでsqlクエリでテーブルやデータを入力、検索が可能です。それならmariadbをインストールしましょう。以前にlinux(centos,ubuntu)でmariadbをインストールしたことがあります。link - [ubuntu] mariadb(mysql)をインストールする方法link - [centos] mariadb(mysql)をインストールwindow環境でmariadbをインストールすることはlinuxみたいに複雑ではありません。link - https://go.mariadb.com/download-mariadb-server-community.html上のアドレスリンクで接続すればnameや様々な情報を入力してっていいますが、簡単に入力してdownloadを押下してダウンロードしましょう。それならosのversionを選択してっていいますが、window環境でインストールするからwindow64を選択してダウンロードします。インストールファイルをダブルクリックしてインストールしましょう。ライセンスの同意しましょう。インストールするドライブを選択しましょう。次は初期rootのidのパスワードを設定しましょう。そしてservices.mscに表示するラベル名とポート設定ですが、特異事項がなければdefaultでnextボタンを押下しましょう。使用中でフィードバックを可否ですが、チェック解除してnextボタンを押下しましょう。これからinstallが始まります。インストールが完了すればスタートメニューでmariadbフォルダが生成されます。この中でmysql clientをクリックして接続します。そしてmysqlデータベースで接続してuser情報を確認しましょう。そしてユーザを一つ生成して権限を与えます。これでsql

Study / Java

#java

作成日付 : 2019/09/25 19:58:30       修正日付 : 2021/04/28 19:12:44

32

こんにちは。明月です。この投稿はjavaのオープンライブラリを参照する方法(eclipseからmavenを連結)に関する説明です。我々がプロジェクトを構成してプログラムを作成する時、すべてのアルゴリズムと構造体、parsingして変換する関数などのすべてのプログラムソースを作成しながらプログラムを作成することはできません。なぜならそうなら検証する領域も増えるし、作業ステップが多くなるからです。それじゃなくてもネットから検証してないソースを使うこともリスクがあります。例えば、プロジェクト内部でjsonタイプの構造体を使います。stringタイプになっているjsonデータをクラスに変換することやクラスタイプにあるデータをstringタイプのjsonデータに変換しようと思えばjava標準ライブラリでは変換クラスや関数がないので変換関数を作成しなければならないです。作ったと思っても様々なケースを予想してテストや検証をしなければならないです。つまり、我々がやろうと思ったプロジェクトがあるのにその付属関数を作ることで時間がたくさんかかることになります。それでapacheではよく使うソースなどをライブラリを公開しますが、それをオープンライブラリだといいます。このオープンライブラリはmavenというプログラムとmaven repositoryを通ってオープンライブラリを簡単に検索してプロジェクトに自動に依存性チェックまでして連結することができます。(依存性チェックとはaライブラリを参照します。でもaライブラリを使うためにはbとcのライブラリが必要です。それならmavenではaというプロジェクトだけ連結すれば自動にbとcライブラリまでダウンロードして連結する機能ということです。)私もmavenの詳細な仕様はわからないですが、簡単にオープンライブラリを連結して使えるプログラムだということまで知っています。他の言語ではc#のnugetがあるしphpはcomposer、pythonにはpipがあります。それならmavenをインストールしてeclipseに連結して使いましょう。(私はjavaを使う時によく使うツールはeclipseです。)link - https://maven.apache.orgサイトでzipファイルをダウンロードしましょう。そして適当なところで圧縮を解凍します。そして「cmd」で当該なフォルダに行って「bin

Study / Java

#java

作成日付 : 2019/09/24 19:35:54       修正日付 : 2021/04/23 15:58:07

33

こんにちは。明月です。この投稿はjavaのreflection機能を使う方法(annotation編)に関する説明です。以前の投稿でjavaのreflection機能をclassとmethod、variableを分けて説明しました。link - [java] 29. reflection機能を使う方法(class編)link - [java] 30. reflection機能を使う方法(method編)link - [java] 31. reflection機能を使う方法(variable編)今まではreflectionがクラスを割り当てするか内部関数、変数の値を取得することで使いました。javaではannotationは機能が何もないです。annotationはjavaでメタデータの役だけです。つまり、javaのコードの解析記述や説明に関数データです。でも、annotationはjavaのreflectionと一緒で使えば単純なメタデータの機能だけではないです。上の例をみれば、exampleでアノテーションの値を取得して設定されているvalueの値をコンソール出力に出力しました。ここまでみればアノテーションのreflectionは別に活用度がなさそうです。上のソースをみればexampleクラスでメンバー変数を二つを宣言します。そして親抽象クラスのコンストラクタからdependancyinjectionのアノテーションを持っている変数に変数に関してインスタンス生成します。結果でprint関数を呼び出すとnode1はnullではなく、print関数が呼び出せることを確認できます。上の関数はコンストラクタからautoexecuteアノテーションを持っている関数を探して実行する関数です。print関数とrun、testはアノテーションが設定されているので実行されることを確認できます。元にアノテーションはメタデータの機能だけありますが、reflectionと一緒に使えば依存性注入や実行パターンを設定する(戦略パターン、facadeパターン)などの様々なパターンを設定することができます。ここまでjavaのreflection機能を使う方法(annotation編)に関する説明でした。ご不明なところや間違いところがあればコメントしてください。

Study / Java

#java

作成日付 : 2019/09/24 00:19:25       修正日付 : 2021/04/22 13:49:39

34

こんにちは。明月です。この投稿はjavaのreflection機能を使う方法(variable編)に関する説明です。以前の投稿でjavaのreflection機能をclassとmethodを分けて説明しました。link - [java] 29. reflection機能を使う方法(class編)link - [java] 30. reflection機能を使う方法(method編)classとmethodにはstringでクラスやメソッドを探して割り当てすることや呼び出すことが重要なreflection機能でした。このvariableでも別に違う機能があることではありません。メンバー変数はoopの特性でprivateのアクセス修飾子によりカプセル化します。link - [java] 14. オブジェクト指向プログラミング(oop)の4つ特性(カプセル化、抽象化、継承、多相化)普通はクラス内部でreflectionを利用して変数の値を取得することではないです。なので別に必要性がありません。でも、クラスの外部でクラスの変数値を取得したい場合は?privateになっているから取得できないです。それがoopの特性なので。上の例をみればnodeインスタンスを生成してgetdeclaredfield関数でデータ値を取得します。setaccessibleの関数はprivateの時にアクセスが可能にする関数です。実はmainではnodeインスタンスのメンバー変数はprivateなのでアクセスができないです。でも、上の例ではprivateになっているメンバー変数のデータを取得しました。そしてデータを格納することまでしました。つまり、reflectionを利用すればunitテストのプログラムを作成する時、関数の結果だけではなく、途中のクラスのデバッグ値やメンバー変数の値を確認することができます。reflectionのメソッドでもありますが、変数にもクラスの変数リストを取得する関数があります。methodではgetdeclaredmethods関数が呼ばされたクラスだけ、 getmethods関数は親クラスまでの関数がリストに出力されます。変数は少し違いです。getdeclaredfieldsとgetfieldsの差異はgetdeclaredfieldsはprivateの含め変数、getfieldsはpublicだけの変数です

Study / Java

#java

作成日付 : 2019/09/20 22:34:40       修正日付 : 2021/04/22 10:48:03

35

こんにちは。明月です。この投稿はjavaのreflection機能を使う方法(method編)に関する説明です。以前の投稿でreflection機能のクラスを説明したことがあります。link - [java] 29. reflection機能を使う方法(class編)reflectionの機能はクラスの構造を分析してメソッドや変数を使える機能だと説明しました。そうするとreflectionの動的の割り当てでクラスをobjectに格納するとobjectクラスの関数だけではなくreflection機能を通ってクラス構造を分析してメソッドを探索して使えます。上の例でnodeクラスを取得してインスタンスを生成しました。そしてnodeクラスでprintメソッドを探してメソッドにインスタンスを入れて実行(invoke)します。main関数でソース上ではnodeキーワードを使えなかったので、nodeクラスを動的に分離することができます。javaにはメソッドのタイプが関数の種類が2つです。コンストラクタと一般関数に分けます。コンストラクタの場合は返却タイプがない形です。javaのreflectionではgetconstructor()関数を使って取得できます。一般関数の場合は返却タイプがある形です。javaのreflectionではgetmethod()関数を使って取得できます。関数を探索する時に関数の名前も重要ですが、javaにはオバーロード機能があるので、パラメータの個数とタイプも重要です。上みたいに同じ関数名でもパラメータ設定より呼び出しを別々にすることができます。getconstructor関数も同じ方法でコンストラクタを探索してインスタンスを生成することができます。class編でクラスをstringタイプで探索してインスタンスを生成することができました。メソッドも同じ方法でstringタイプで探索をして実行することができます。上みたいにstringタイプに関数を探索して実行することも可能です。この意味はプログラムの実行順番をプログラムの中で実装することではなく、テキストや環境変数によりプログラム実行順番を実装こともできます。上の例は簡単に実行関数名をパラメータから受け取って実行することにしましたが、テキストで実行する関数名を順番とおりに作成してioで読み取って実行することもできます。reflectionでは単純

Study / Java

#java

作成日付 : 2019/09/19 20:20:10       修正日付 : 2021/03/12 13:04:09

36

こんにちは。明月です。この投稿はjavaのreflection機能を使う方法(class編)に関する説明です。reflectionとはクラスの構造を分析して動的ローディングが可能にする機能です。ということに説明されていますが、この意味では何の意味が分からないですね。link - https://www.oracle.com/technical-resources/articles/java/javareflection.html今までjavaでインスタンスを生成することはnewキーワードを使って生成します。link - [java] 7. クラスを作成する方法(コンストラクタを作成方法)でも、newキーワードを使わなくてインスタンスを生成する方法があります。結果をみればnodeクラスのprintを呼び出してコンソールでhello worldの結果が出力しました。上の例では何処でもnew nodeという実装はありません。reflectionの機能を通ってnodeのインスタンスを生成したことです。そうならnew nodeを使ったら、もっと少ないステップでインスタンスを生成することができますが、なぜreflectionを使うことでしょうか?上の例をみればstringタイプでクラスを探索してインスタンス生成することができます。その機能で二つ方法を実装することができます。一つ目はstringの値はコンパイル段階でチェックしないです。上の例でtostringを再定義することでキャストなしでtostringでコンソール出力しました。つまり、exampleクラス内部ではnodeクラスを使ってないので、コンパイルする段階でnodeクラスがなくてもコンパイルできます。つまり、動的バインディングが可能するという意味です。上の例はexampleクラスだけ実装してnodeクラスは実装しませんでした。コンパイル段階は問題ないです。でも、実行するとnodeクラスがないというエラーが発生しますね。nodeクラスを作ってコンパイルして同じフォルダに置きます。今回はバインディングにして実行することを確認できます。この意味は起動中のプログラムの再実行なしてソース交換ができるという意味です。理論はそうです。しかし、実際のサービスでは予想できないエラーが発生する可能性があるのでしない方がよいです。例えば、nodeインスタンスを生成してメモリに登録

Study / Java

#java

作成日付 : 2019/09/18 20:02:14       修正日付 : 2021/03/11 18:20:43

37

こんにちは。明月です。この投稿はjavaで使う文字タイプ(characterset)とエンディアン(endian)で変換する方法に関する説明です。以前の投稿でioとsocketに関して説明したことがあります。link - [java] 26. ファイル(io)を扱う方法(ファイル作成、ファイル修正、アクセス日付変更とioをclose(リソース返却)する理由、closableインタフェース)link - [java] 27. ネットワーク通信(socket)をする方法javaにはioとsocketでinputstreamとoutputstreamを利用してファイルを読み取りか書き込みをするし、通信はメッセージを送信、受信します。このinputstreamとoutputstreamで扱うデータタイプはbyte配列(byte[])タイプです。このbyteは何かというとデータのバイナリというする8bitのデータの2進データです。我々が普通にファイルのサイズを話す時に上のイメージみたいに何バイトという言います。つまり、上のファイルはbyte配列でbyte[524556]になっているデータということにします。そうすると我々がファイル伝送プログラムを作成すると思えばどうでしょう。ioからファイルを読み取ってbyte[]タイプに変換します。それをsocketを通って伝送します。受信側はsocketを通ってbyte[]タイプでデータを受け取ってそのままにioを利用してファイルを書き込んだらそれがファイル送受信プログラムになります。byte[](stream)のタイプは分かりました。そうするとプログラムの中で使う各種のデータタイプはどのようにbyte[]に変換するでしょう。例えば、stringタイプで文字列のデータを入れてbyte[]に変換して格納すればそれがtextドキュメントになります。文字列はbyte[]に変換する時に扱うデータ値は決まっています。それがasciiコードということです。過去、javaがある前のc言語時代にはpcが日本語はできなく、英語だけ使える時がありました。 その時には英語の大文字、小文字の52語、特殊文字まですべて128個の文字だけ使いました。asciiコードはすべて128個でcharタイプ(範囲: -128~127)の整数(0~127)部分で入れる文字です。それで文字列を扱う時にはcharタイプを

Study / Java

#java

作成日付 : 2019/09/17 20:22:02       修正日付 : 2021/03/10 15:37:24

38

こんにちは。明月です。この投稿はjavaでネットワーク通信(socket)をする方法に関する説明です。プログラムでソケットと言えばプログラムとプログラムまたはpcとpc間に通信をするという意味です。簡単に思えば通信する時に伝送するパケット(データ)がパソコンのlanカードによってランケーブルに伝送します。ランケーブルに伝送したデータはdnsとルータなどを通って到達しようとpcのlanカードによって最終に目標したプログラムでパケット(データ)を読み込みます。端末と端末の間にデータを通信します。この時、我々は各端末間にデータ変換や装置間のプロトコール、規約などに関して実装してないです。この通信規約に関してはすべてos側で設定して(osi7階層)、我々はその上で差し込んで使うという意味でsocket通信という言います。link - osi参照モデルsocket通信規約は処理プロシージャが決まっています。先に、通信接続を待つ側をサーバという言います。サーバはportを開いてクライアントの接続を待ちます。そして接続する側をクライアントという言います。クライアントがサーバのipとportに接続したら通信が開始します。サーバとクライアント間の通信はsend、receiveの形式でデータを送信、受信します。そして通信が終わればcloseで接続を切ります。そのsocketの概念でjavaでソケット(socket)通信を作成みましょう。先にはサーバを作成してwindowのtelentプログラムを利用して接続を確認します。確認できたらその仕様に合わせてclientを作成しましょう。上のacceptはwhile(true)の無限ループに入れてクライアントを待機します。クライアント接続すればスレッドプールにsocketを渡してクライアントからメッセージを待機します。ここからsocketのstreamを受け取ってwrite、readを使うことになりますが、ioと同じロジックです。link - [java] 26. ファイル(io)を扱う方法(ファイル作成、ファイル修正、アクセス日付変更とioをclose(リソース返却)する理由、closableインタフェース)起動すればコンソールにinitialize completeメッセージがコンソールに出力してlistenの状態になります。windowコンソールからtelnetに接続してメッセ

Study / Java

#java

作成日付 : 2019/09/16 23:42:46       修正日付 : 2021/03/09 19:09:21

39

こんにちは。明月です。この投稿はjavaでファイル(io)を扱う方法(ファイル作成、ファイル修正、アクセス日付変更とioをclose(リソース返却)する理由、closableインタフェース)に関する説明です。itでi/oという意味はinput/outputということで入力装置、出力装置という意味です。入力装置とはマウス、キーボードなどのパソコンにデータを入力する装置という意味だし、出力装置とはモニター、プリンターなどの出力する装置という意味です。でも、プログラムでi/oという意味はファイルを作成、読み込みなどのファイル扱うことという意味です。少し違いますね。プログラムで一番よく使うリソースはソケット(通信)とファイル(i/o)でファイルを作成、読み込みは重要な領域です。まず、データを処理する装置ということはcpuがあるし、一時的にデータを格納するメモリがあります。cpuはデータを計算する機能しかないし、メモリはデータを格納する機能だけありますが、プログラムが終了するとデータは自動に削除されるので、プログラムでデータを記録する装置が必要です。プログラム終了と関係ない装置がハードディスクということがあります。ファイルをハードディスクに格納するためにはメモリ構造のstackとheap構造からbinaryタイプに変換しなければならないです。またはcpuとメモリの速度は速いですが、ハードディスクを遅いので、その速度の差を合わせるリソース管理(コネクション)が必要です。その機能があるリソースライブラリをioということになります。ioで使うデータタイプはbyte(unsigned char)です。まず、stringになっているデータをファイルに格納しましょう。上の例を確認すればdドライブのworkディレクトリのtest.txtファイルにhello worldというstringタイプのデータを作成しました。ここでfileクラスとoutputstreamインタフェースを継承したfileoutputstreamを使いました。fileクラスはファイルのメーター情報があるクラスです。ファイルの内容よりファイルが作成した時間、ファイルのサイズなどの情報があります。javaのbyteの配列でデータを作成しましたが、そのデータはメモリのheapにあるので、一列になっているかを分からないです。つまり、論理的にプログラム上では配列ですが、

Study / Java

#java

作成日付 : 2019/09/13 20:03:58       修正日付 : 2021/03/04 19:27:19

40

こんにちは。明月です。この投稿はjavaのobjectクラス(notify、waitの使い方)に関する説明です。以前の投稿で再定義(override)に関して説明した時に、hashcodeとequals、tostringに関して説明したことがあります。link - [java] 11. stringのhashcodeとequals、そしてtostringの再定義(override)javaの最小の単位がクラスになっています。つまり、実行関数のmain関数だけを作ろうと思ってもクラスを作ってその中でstatic void mainで実行関数を作成します。その最小単位のクラスが基本的にobjectクラスを継承しています。つまり、extentsで継承をしてなくても基本的にobjectを継承していると思えばよいです。そうなら、javaは複数の継承ができないですが、その他のクラスを継承したら複数継承になるかと思いますが、すべてのクラスがobjectクラスを継承しているので複数継承ではなく、継承の継承になったことです。そうならすべてのクラスがobejctクラスを継承しているのでobjectクラスに関して整理する必要があります。objectクラスは総11個の関数で構成しています。内部のメンバー変数はありません。 関数 説明 public final native class<?> getclass() オブジェクトのクラスタイプをリターンする。 public native int hashcode(); オブジェクトのアドレスの値をハッシュ値でリターンする。 public boolean equals(object obj) オブジェクトのアドレス値を比較して同じならtrue、違いならfalseをリターン protected native object clone() オブジェクトをコピーする。単純なアドレス値のコピーではなくクラスのインスタンスをコピーすること。クラスコピーのためにインタフェースcloneableを継承

Study / Java

#java

作成日付 : 2019/09/13 00:58:31       修正日付 : 2021/03/03 18:00:38

41

こんにちは。明月です。この投稿はjavaの同期化(synchronized)とデッドロック(deadlock)に関する説明です。以前にスレッドに関して説明したことがあります。link - [java] 22.スレッド(thread)を使う方法link - [java] 23. スレッドプール(threadpool)を使う方法スレッドというのは簡単に説明するとメインプロセスから独立な処理領域を生成して並列処理することという意味です。上の例はスレッドの各領域から0から9までのコンソール出力の例です。別に問題があることではありません。ここで0から9まで足すと45の値になります。それをスレッドで2回に実行したから予想値は90になると思いますが、69という値が出力しました。理由は並列処理せいで発生して上の現象みたいになります。つまり、nodeインスタンスからgetdataでデータを取得してiの値を足します。始めのスレッドでgetdataで取得してデータが0でiの値が1といえばsetdataする時にnodeのデータは1になります。でも二つ目のスレッドには始めのスレッドのgetdataしてsetdataするまで待てないです。同時にgetdataして各スレッドでsetdataで1を格納すれば1足す計算は2回しましたが、結果は1になります。スレッドの中でコンソール出力して確認しましょう。iが1の時に始めのスレッドのgetdataから1の値を取得して二つ目のスレッドのgetdataからは2の値を取得します。でもiが2の時には始めと二つ目のスレッドのgetdataからは4のデータを取得します。つまり、二つのスレッドで同期化になってないのでこの問題が発生します。同期化すれば問題がなくなります。nodeインスタンスに関してlockを設定しましょう。runnableのラムダー式の中でsynchronizedのキーワードを使いました。synchronizedは並列処理するスレッドで特定なobjectに関して同期化するキーワードです。つまり、nodeインスタンスで設定したsynchronizedスタック領域に進入すると他のnodeインスタンスで設定したsynchronizedにはsynchronizedが終わるまで待って進入したsynchronized領域処理が終われば進入します。つまり、synchronizedの領域の中のgetdat

Study / Java

#java

作成日付 : 2019/09/11 23:06:09       修正日付 : 2021/03/02 20:21:28

42

こんにちは。明月です。この投稿はjavaでスレッドプール(threadpool)を使う方法に関する説明です。以前の投稿でjavaでスレッドを使う方法に関する説明したことがあります。link - [java] 22.スレッド(thread)を使う方法スレッドは別に制限がなく、生成するたびに生成されます。例えばfor文で1から100まで繰り返しを作ってスレッドを生成すればスレッドは100個まで生成されます。適切なスレッド個数で並列処理するとかなり早い演算処理をしますが、我々のハードウェアは物理的な容量の限界があるので、無限にスレッドを生成することでプログラムのパフォーマンスが速くなることではないです。つまり容量の限界が届くとスレッドの管理するリソースのせいでメモリやシステムリソースがいっぱいになってシングルスレッド(main threadだけ)より遅くなる結果になります。javaではプログラムではなく、システムによってスレッド個数を管理して運用するライブラリがあり、それがスレッドプール(threadpool)ということです。スレッドプール(threadpool)とはプール(pool)の中でスレッドを生成してそのプールのなかでスレッドの個数やリソース、運用メモリなどを管理することです。または、スレッド個数を管理することもありますが、スレッド再使用率を管理して全般的なパフォーマンスも管理します。プログラム中でスレッドを生成、消滅することでかなり時間がかかります。実はスレッドだけではなく、リソース系オブジェクトは生成や消滅が時間がかかりますね。でも、スレッドプールではスレッドを先に生成してスレッドを呼ばれたら生成されたオブジェクトに載せて使うことでスレッド生成、消滅時間が守ります。つまり、ただのスレッドを使うことよりスレッドプールを利用してスレッド再使用率は上げることで全般的にシステムパフォーマンスが改善することができます。上はスレッドプールの中で一つのスレッドだけあるスレッドプールです。結果をみればスレッドを何回に呼ばれても順番でスレッドが実行されます。上のスレッドはスレッド個数の制限がないスレッドプールです。スレッド個数の制限がないので、別にプールを使わなく、ただのnew threadでインスタンス生成して使うことと同じ感じなスレッドプールです。ただ、スレッドプールの中でスレッドを実行するので、リソース管理がで

Study / Java

#java

作成日付 : 2019/09/10 21:55:36       修正日付 : 2021/02/16 18:45:06

43

こんにちは。明月です。この投稿はjavaのスレッド(thread)を使う方法に関する説明です。スレッド(thread)とはプロセスの中で動いている最小の実行単位ということに定義させています。プロセスとは我々がプログラムを実行して終了する時まで一連の処理ロジックという意味です。改めてまとめるとプロセスの中では様々でスレッドを持つことができます。つまり、プロセスの中では並列に様々な実行単位を実行することができます。説明が難しいです。まず、簡単な繰り返しのロジックで1から10までコンソールに出力するプログラムを作成します。上の実行関数ではfor文を実行してコンソールに出力してまたfor文で1から10まで値をコンソールに出力します。全然問題がないソースです。でも私は上の二つのfor文を順番ではなく、同時に処理したいです。結果をみればコンソール結果が順番とおりに出ることではなく、threadのrun関数とfor文の繰り返しが同時に実行されることを確認できます。スレッドを使えば様々の処理を同時に処理できます。上の例は2から9までの倍数の合算を出力する例です。こんな簡単な処理式はthreadを使ってなくても早くできますが、threadを使ったら同時に処理するのでもっと早くできます。(参考にthreadのインスタンスの生成時間があるので、必ずthreadや並列処理が速いことではありません。)つまり、データベースの多いデータを処理する時にスレッドを使ったらもっと早く処理することができます。スレッド(thread)とはメインプロセスから独立でスレッドを作って実行される並列処理だと説明しました。でも、仕様によってメインプロセスからスレッドの計算を待てなければならないことがあります。上のソースはthread中で0から99まで足す関数を呼び出しますが、メインプロセスで結果を見ると0です。理由は並列処理なのでコンソール出力する時にスレッドのforの繰り返し文がまだ実行されてないからです。それならスレッドが終わらなければならないですが、その時に使う関数がjoinです。join関数はスレッドを呼び出したところから呼び出すことができる関数です。スレッドをただ並列の処理だけではなく、どの時間間にスレッドを止まることもできます。thread.sleepはスレッド内部でスレッドを止まる関数です。パラメータはミリ秒基準で1000が1秒になります。

Study / Java

#java

作成日付 : 2019/09/06 22:30:49       修正日付 : 2021/02/10 17:45:24

44

こんにちは。明月です。この投稿はjavaのアノテーション(annotation)を使う方法に関する説明です。javaのアノテーション(annotation)とはクラスやメソッド、変数なのでメタデータ、データの定義を設定するデータという意味です。つまり、アノテーションのデータはプログラム実装では影響がなくて、クラスやメソッド、変数を区分するためのデータだと言えます。アノテーションはアットマーク(@)を利用して設定することができます。javaでよく使うアノテーションはoverride、deprecatedがあります。overrideはクラスを継承して再定義する時に設定するアノテーションです。deprecatedはメソッドを削除すると既存に継承したクラスでエラーが発生するため、メソッドを削除もできなくて、ただ使用をお勧めしないのことをお知らせする時に使うアノテーションです。@functionalinterfaceのアノテーションを使ったインタフェースは関数を二つに作成するとエラーが発生することを確認できます。printの関数は取り消し線があります。@deprecatedのアノテーションの影響で関数を呼び出すことをすればwarningメッセージが表示します。 testの関数はint aaa=0;がありますが、@suppresswarningsが無ければ、unusedのwarningメッセージが出ます。上のことはjavaで提供するアノテーションです。アノテーションは開発者が作成することもできます。アノテーションはプログラム実行することでは影響がありません。ただ、メタデータとして様々なクラスと関数、変数を区分するための情報として使うことができます。アノテーションを生成する時に、@targetアノテーションは使う区分を設定、@retentionは設定するポジションを設定することができます。 タイプ 説明 @target type クラス、インタフェース、enumなどに設定 field メンバー変数に設定 method メソッドに設定

Study / Java

#java

作成日付 : 2019/09/05 22:58:20       修正日付 : 2021/01/27 14:19:59

45

こんにちは。明月です。この投稿はjavaでiterator(for-each)とstream apiを使う方法に関する説明です。オブジェクト指向(oop)でデータをオブジェクト化すると、よく使うアルゴリズムはlistとmapだと思います。listとmapをよく使う理由はデータの探索がしやすいし整列、データ分類などがしやすいからだと思います。listを探索する時にfor文などを使ってi=0からsizeまで比較する方法でよく使うと思います。リストにデータを格納して奇数のデータはfor文とif文を組み合わせて抽出しました。このリスト形式のデータはデザインパターンによるiteratorパターンになってnextとhasの関数を利用してデータを取得することができます。for文ではなく、while文を使って繰り返しの形が変わりましたが、ステップが減らしたことではないです。逆にlist.iterator()の処理項目が増えてもっと難しいプログラムみたいに見えます。でも、for(for-each)文を使って簡単に作成することができます。リストをfor文で探索すると初期値や増加値がいらないです。つまり、もっと簡単に作成することができるという意味です。stream apiに関して説明します。streamという意味はプログラムでは連続的な値の配列の意味です。例えば、一つの動画のファイルを見るときに一つのbyteの値を見れば全然意味がないですね。でもそのbyteのデータが集まって一つの意味があるファイルになって動画がプレイーすることができます。javaにはこの連続なデータつまり、配列やlist、mapをもっとしやすく使えるapi(application provider interface)がありますが、それがstream apiです。上の例でlistからdataが奇数値だけ分類する時にfor-each文を使ってifで比較して格納しました。これをstreamのfilterを使えば簡単になります。ソースのステップが最初より確実に減らしました。可読性もよくなりました。返却値も新しいリストでリターンするので、元のデータにも影響がありません。stream式はチェインメソッドパターン式でstream式を再使用することが可能し、filter関数を何回も付けることができます。並列処理はスレッドと関係がある部分です。簡単に説明するとfor文でリス

Study / Java

#java

作成日付 : 2019/09/04 20:11:28       修正日付 : 2021/01/26 21:01:27

46

こんにちは。明月です。この投稿はjavaにはラムダ(lambda)を使う方法に関する説明です。javaには基本的にオブジェクト指向プログラミング(oop)を中心でクラス単位で構成しています。つまり、関数だけ必要なプログラムを作ると思ってもjavaにはクラスを作成して関数を作成しなければならないです。この部分は以前に匿名クラスを説明した時に説明しました。link - [java] 18. 匿名クラス(anonymous class)とクロージャ(closure)上の例をみればrun関数でtestableを経書したクラスのインスタンスを生成しました。javaの場合、特にアンドロイド開発する時にイベントを登録してcallback関数を作る時に上のパターンで作成されます。test関数で実行フローを作成して最終にtestクラスのrun関数を呼び出す形です。でも、再使用性が多くなるクラスではなく、一回性クラスなら上のパターンで作成することは悪いです。そのことに関して匿名クラスを作成する時に説明しました。ここで、匿名クラスよりもっと簡単に作成する方法がラムダ関数式です。匿名クラスをラムダ関数式で変換する条件はインターフェースに抽象関数が必ず一つだけに作成しなければならないです。インターフェースが二つ以上になるとラムダ式でどの関数を呼び出すのが分からなくなります。javaにはラムダ式でよく使うインターフェースが二つあります。runnableインターフェースとcallableインターフェースです。上のイメージをみればrunnableインターフェースとcallableインターフェースは抽象関数が一つだけあります。runnableインターフェースとcallableインターフェースの差異はリターン値が、voidかジェネリックタイプでobjectタイプかです。ラムダ式は匿名クラスでできたクロージャ機能がラムダ式でも使えます。ラムダ式でパラメータも使えます。インタフェースで関数のとおりにパラメータが設定します。p1とp2は10と20の値をintタイプのパラメータで受け取ります。そしてその値をtest1関数によって足して結果を変数retに30の値で格納します。最後に変数ret値をコンソールに出力すれば30の結果が表示されます。このラムダ式はc/c++で関数ポインタ、関数系プログラムのcallback関数と似ているな形でプログラムが実行

Study / Java

#java

作成日付 : 2019/09/03 20:37:14       修正日付 : 2021/01/25 16:21:55

47

こんにちは。明月です。この投稿はjavaの匿名クラス(anonymous class)とクロージャ(closure)に関する説明です。以前にクラスとインタフェースに関して説明したことがあります。link - [java] 7. クラスを作成する方法(コンストラクタを作成方法)link - [java] 12. インタフェース(interface)改めてまとめるとjavaで最小の動作単位はクラスだし、つまりオブジェクト生成(インスタンスを生成)する単位です。そしてそのクラスを抽象化することがインタフェースです。インタフェースを作成する時には関数を作成します。上の例は私がtestableのインターフェースを作成してtest1のクラスに継承してインスタンスを生成してtest関数を利用してtablableインターフェースを継承したクラスのrun関数とexecute関数を実行するプログラムです。ここまで問題がないです。私は上の例を一つのファイルに作成しましたが、実のjavaの標準ならファイル一つで一つのクラスが原則なので、testable.java、test1.java、example.javaの三つのファイルを作成しなければならないです。ここで我々はtest関数を中心で確認しましょう。test関数のパラメータはtestableインターフェースのタイプで受け取ります。つまり、testableインターフェースを継承したクラスなら良いです。我々がtest1のクラスを作成してインスタンスを生成してtest関数に渡って実行しました。つまり、run関数とexecute関数を呼び出しました。また、他のtestableのケースを作成する時にはクラスをまた生成しなければならないです。test2クラスを作成してtestableを継承してインスタンス生成してtest関数に渡します。また、他のtestableのケースを作成する時には繰り返します。つまり、クラスが増えるし、クラスファイル(.java)が増えるという意味です。各testケースを作成するたびにクラスを生成することは非効率です。もしかして,100個のケースがある場合、100個のクラスを生成するという意味になります。そして我々はクラスを作成しなくてインターフェースだけでインスタンスを生成して使う方法があります。それを匿名クラス(anonymous class)ということです。上の

Study / Java

#java

作成日付 : 2019/09/02 20:30:34       修正日付 : 2021/01/22 14:47:14

48

こんにちは。明月です。この投稿はjavaのジェネリックタイプ(generic type)を使う方法に関する説明です。クラスの内部メンバー変数を設定する時に、データタイプと変数名を作成します。しかし、メンバー変数のデータタイプをクラス内部で設定することではなく、クラスをインスタンス生成(割り当て)する時に決めたい時があります。上の例を単純なリンクスタックアルゴリズムです。リンクスタックアルゴリズムはリストやマップみたいにデータを挿入して取り出して出力します。リストと差異があればaddで格納したら逆順でpop関数でデータを取り出すことです。上の例はint型のデータタイプしか使えません。でも、仕様によってstringタイプも使いたいです。その場合は内部クラスのnodeのメンバー変数のデータタイプとadd関数のパラメータ、pop関数のリターンタイプを変更してソースをコピペするしかないです。あるいはデータタイプをobjectタイプにしてもよいです。でもobjectタイプに使うとデータタイプの整合性の確認ができなくなります。継承する方法もあります。でも、簡単に考えるとそのデータタイプをインスタンスを生成する時に決めることにできれば簡単に解決します。その機能がジェネリックタイプです。ジェネリックは薬のジェネリックと同じ意味で枠だけ作っておいて内部のタイプは外部から設定するという意味です。上のジェネリックタイプをみれば以前のlistやmapでもよく見たことです。link - [java] 5. 配列とリスト(list)、マップ(map)の使い方ジェネリックはクラスだけではなく、インタフェースや関数などでも使えます。インタフェースにジェネリックを宣言して継承したtestクラスでジェネリックタイプをstringに設定しました。そして関数にはインタフェースのジェネリックタイプでリターン値が設定されます。なので、test関数を使う時には別にジェネリックタイプを設定しなくてよいです。ジェネリックは基本的にobjectタイプですべてのクラスを設定することができますが、その設定する範囲も設定することができます。上の例はデザインパターンのbuildパターンを参考しました。ジェネリックを知らなかったらプログラムを作成できないことではありません。ジェネリック代わりにobjectタイプに設定すればプログラム作成することはできます。でもジェネリ

Study / Java

#Java

作成日付 : 2019/08/27 19:05:44       修正日付 : 2021/01/21 11:15:49

49

こんにちは。明月です。この投稿はjavaの例外処理(try~catch~finally, throw)を使う方法に関する説明です。プログラムを作成しながら、予想できなかった例外が発生する時があります。この例外がプログラムを間違って実装して発生するバグもありますが、プログラムを使っているユーザからも間違ってデータを入力や既存のデータがnullの場合も発生する時があります。特にプログラムの運用でよく発生する例外はnull exceptionです。上の例をみればex変数はインスタンスを生成しない、つまり割り当てしなかったので、ex.run()を呼び出すとheapメモリに生成されてないクラスから関数を探すのでエラーが発生します。ここでエラーが発生するとエラーを無視して次のステップに実行することではなく、プログラムがそのまま終了になります。上の例をみればex.runでエラーが発生してhello worldというメッセージはコンソールに表示されてないです。そのため例外処理をすることです。使用方法には何処にエラーが発生する可能性がある部分でtryキーワードと中括弧でstack領域を設定して例外が発生すればcatchに移動することに設定します。上の例を見ればex.run関数でエラーが発生したので、catchのエラー内容がコンソールに出力しました。次のhello worldがコンソール出力しました。not errorというメッセージは同じtryスタック領域にあるのでエラーが発生することで飛ばしました。ここで私がcatchの中でthrowableというインタフェースを使いました。catchには条件式にエラークラスやインタフェースが必要ですが、throwableインタフェースはすべてのエラークラスの最上位のインタフェースです。この最上位インタフェースを設定すればすべてのエラーがcatch(throwable)に移動します。次の例で説明します。上の例はcatchが二つがあります。ex.run()にはnullpointerexceptionが発生(参考-最初の例をみれば結果にnullpointerexceptionが発生しましたと赤い文字で表示しました。)したのでcatch(nullpointerexception)の領域に移動しました。もしかして、nullpointerexceptionではない場合はcatch (throwab

Study / Java

#Java

作成日付 : 2019/08/26 23:40:29       修正日付 : 2021/01/20 15:05:32

50

こんにちは。明月です。この投稿はjavaの列挙型(バイナリデータビット演算子の使用例)に関する説明です。データを格納する時には値を格納し、修正ができる一般変数とfianlキーワードを使って値を変更できない定数型で使うことができます。link - [java] 2. 変数と定数の宣言方法、そして原始データタイプとクラスデータタイプの差異定数型で使う場合はプログラム上で基準になるキー値で使うか比較をしなければならない値でよく使います。上のソースはpeopleというクラスを人に設定してどの行動をしたかを追加するソースです。ここで行動の基準を作るためにintタイプの定数を四つを作成しました。そしてaddstate関数で行動を追加してpeopleクラス中でバイナリビット演算子を利用して行動を追加することになりました。そしてprint関数で内訳を出力します。こんなに作成しても何も問題ありません。オブジェクト指向の特性をため、行動をclassで分類して抽象化、継承しなければならないですが、簡単にこんなに作成しても構いません。実際に実務でこんなに作成する場合も多いです。ルールに従ってプログラムを作成することも重要ですが、そのルールがあることが可読性や管理しやすくためなので、簡単に作成する方法と見やすい方法があればその方が良いです。上の比較データによって定数を使いました。プロジェクトサイズが大きくなって、行動データが増える場合、定数が増えることになります。定数のデータもデータタイプがintタイプなので、state変数だけみれば何のデータがあるかを確認することが大変です。上のソースは変数名も理解しやすいし、コメントもちゃんとあるので別に問題なさそうですが、データが多く、変数名も迷いやすいことで決めると後でプログラム管理が簡単ではないと思います。それを解決するためには列挙型があります。結果は同じです。でも列挙型ではパラメータを渡すから誰が見てもaddstateにどの値が格納するかを見やすいです。始めのソース例はintタイプでバイナリデータ比較をしました。普通はバイナリデータではなく、stringなどを使って定数を宣言する時が多いです。でもバイナリデータ比較はプラグが多いときにずいぶん早いパフォーマンスで処理することができます。実際の業務でもそんなバイナリデータコードが多いです。列挙型を使うことでもパフォーマンスが遅くなることで

Study / Java

#java

作成日付 : 2019/08/23 19:46:10       修正日付 : 2021/01/15 09:40:43

51

こんにちは。明月です。この投稿はjavaのオブジェクト指向プログラミング(oop)の4つ特性(カプセル化、抽象化、継承、多相化)に関する説明です。オブジェクト指向(object-oriented programming)ということはプログラミングの開発方法の中で一つです。ここでプログラミングの開発方法とは、プログラムを開発する時にどの目的に関して開発することかについての方法です。その中でオブジェクト指向(oop)はオブジェクト(object)の中心でプログラムを設計、開発するという意味です。例えば、「業務計画書作成 -> 計画実行 -> テスト -> 結果確認 -> 報告書作成 -> 決済 -> 承認」ということの一つの業務プロセスを考えましょう。ここでまず全体の業務単位(controller)で構成して計画書データ、テストデータ、結果データ、報告書データ、決済データのオブジェクトのプロセスに配置します。プログラム言語として考えると最小なオブジェクトの単位のクラスにして上の業務オブジェクトをクラスに特性を与えて管理することがオブジェクト指向プロジェクトになります。このオブジェクト指向(oop)には4つ原則がありますが、それがカプセル化、抽象化、継承、多相化ということです。この原則に関しては部分的に説明したことがあります。link - [java] 9. アクセス修飾子とstaticlink - [java] 12. インタフェース(interface)link - [java] 8. クラスの継承とthis、superキーワードの使い方link - [java] 6. 関数の使い方(関数のオーバーロードと再帰的な方法について)この投稿ではその特性に関して詳細にまとめて説明します。カプセル化カプセル化とは言語的に表現は何かを包むという意味です。つまり、アクセス修飾子でクラスのデータと関数を秘匿化するという意味ですが、私の考えはクラスの特性を正確に区分する方法ではないかと思います。例えば、一つクラス(組)で10人がいます。そして国語、英語、数学の成績のオブジェクトを作成しましょう。最小単位で学生のオブジェクトが作り、各の国語、英語、数学のオブジェクトを作りました。そして学生は国語、英語、数学のオブジェクトを持っていて、組クラス

Study / Java

#java

作成日付 : 2019/08/22 20:08:37       修正日付 : 2021/01/14 16:14:12

52

こんにちは。明月です。この投稿はjavaで抽象クラス(abstract)と継承禁止(final)に関する説明です。私が以前にクラス継承とインタフェース(interface)に関して説明したことがあります。link - [java] 8. クラスの継承とthis、superキーワードの使い方link - [java] 12. インタフェース(interface)この抽象クラスはインタフェース(interface)と一般クラスの機能を混ぜていると思えばよいと思います。インタフェースはクラスの割り当て(new)することはできません。理由は複数継承のため、メモリ構成するメンバー変数がないし、それを処理する関数の処理が実装されてないからです。クラスはメンバー変数や関数の実行するところまで実装されています。なのでクラスはメモリに割り当てができます。抽象クラスは基本的に構造は一般クラスと同じです。でも、クラスを生成する時に、直接にインスタンスを生成することではなく、継承する部分まで考えてクラスを作る場合があります。つまり、インタフェースみたいに実行領域は継承されるクラスに任せて定義だけ実装して作成することができます。実行領域がない関数があるので抽象クラスはクラス割り当て、つまりインスタンス生成はできません。または抽象クラスは実行領域があるので複数継承ができません。抽象クラスの継承はextendsキーワードを使います。上のソースを見ればabstractclassにprintという関数名だけ定義して実行領域は実装してないです。abstractclassを継承したaclassやbclassからprint関数を再定義されます。上のソースを見てもクラスの属性を持っているしインタフェースの属性も持っていることに見えます。それなら抽象クラスは複数継承もできないし、一つの完全体のクラスにもありません。そうなれば、抽象クラスを作る意味があるかと疑問があります。変数タイプで使うみたいにlistジェネリックタイプでabstractclassを使ってaclassとbclassのインスタンスを集まって扱いました。でも、この機能はインタフェースだけでも十分にできる機能です。でも、実務に行くと抽象クラスはすごくよく使います。インタフェースよりも使います。理由はoopの特性のカプセル化のせいです。上の例を見てもmain関数ではaclassのprint

Study / Java

#java

作成日付 : 2019/08/22 00:06:20       修正日付 : 2021/01/13 18:11:27

53

こんにちは。明月です。この投稿はjavaのインタフェース(interface)に関する説明です。以前の投稿でクラスとクラスの継承に関して説明したことがあります。link - [java] 8. クラスの継承とthis、superキーワードの使い方一応、継承の概念はクラスのすべての機能を続いてもらってクラスの機能を拡張することです。でもjavaでは複数継承、つまり、連関性がない二つのクラスを継承することができません。多分、関数のあいまい点せいでできないと思います。 c/c++言語でよく発生した問題でしたが、javaでは複数継承をできないようにして関数のあいまい点を初めからなくしたと思います。上の例通りにeclipseに作成すればコンパイルエラーが発生します。exampleクラスを見ればaclassとbclassを継承してfunc関数を再定義(override)しました。再定義までよいですが、func関数の中で親クラスのfunc関数を呼び出しますね。この時に親クラスの何処のfunc関数かというあいまい点があります。c/c++では最後にローディングされた関数を呼び出します。でも、プログラム上でどっちが遅くローディングされるかを分からない問題があります。この問題を解決するために、javaからは複数継承をできないようにしたらしいです。しかし、オブジェクト指向プログラミング(oop)にきてオブジェクトの一番いい点がデータをクラス化して分類しながらリスト化にできることです。つまり、aclassから継承したクラスははaclassグループ分類、bclassから継承したクラスははbclassグループに管理することができます。まず、理解することはaclassとcclass間の関係です。cclassはaclassを継承しました。以前、stackとheapの関係に関して説明したことがあります。link - [java] 10. メモリの割り当て(stackメモリとheapメモリ、そしてnew)とcall by reference(ポインタによる参照)クラスのインスタンスを生成する時に変数タイプとインスタンスタイプは同じことにして実装します。aclass a = new aclass();aclass aはstackメモリに格納するし、new aclassはheapメモリに割り当てします。実は変数のデータタイプを宣言する時に合わせる

Study / Java

#java

作成日付 : 2019/08/20 23:46:23       修正日付 : 2021/01/12 18:13:52

54

こんにちは。明月です。この投稿はjavaのstringのhashcodeとequals、そしてtostringの再定義(override)に関する説明です。以前に私がメモリ割り当てに関して説明する時にメモリアドレスに関してhashcodeに関して説明したことがあります。link - [java] 10. メモリの割り当て(stackメモリとheapメモリ、そしてnew)とcall by reference(ポインタによる参照)このhashcodeはメモリのアドレス値をハッシュしたことで割り当てたメモリたびに別に表示されます。(ハッシュアルゴリズムの限界で他のメモリに割り当てても同じハッシュ値が出る可能性がある。)ということに説明しました。それならstringタイプの変数のhashcodeを確認しましょう。同じ値をstringタイプの変数に格納しましたが、hashcodeの値が同じです。aとbは同じ二重引用符で格納したものは同じ値だと思ってもnewで格納したstringもhashcodeが同じです。この関して私も知りたいから様々なところを調べてみましたが、ちょうどこれが正解だと思うほどの説明はないです。でも自分の経験だと次みたいになるではないかと思います。まず、stringのhashcodeソースを見ればobjectクラスからstringのhashcode関数は再定義しています。stringの文字列はjavaでbyte(unsigned char)の配列のタイプです。つまり、string aの値はa[0] = 'h'、a[1] = 'e'、a[2] = 'l'、a[3] = 'l'、a[4] = 'o'になっています。でも、このhはアスキーコードの定数値の104でeは101の値です。この文字は一つずつ定義されているし、変わらない値です。これはhashで並べると"s[0]*31^(n-1)+s[1]*31^(n-2)+...+s[n-1]"の形で計算され、hashcodeになります。link - https://www.tutorialspoint.com/java/java_string_hashcode.htmこれをプログラムで実装すると下記通りになります。これがstringのhashc

Study / Java

#java

作成日付 : 2019/08/20 00:42:04       修正日付 : 2021/01/11 17:51:53

55

こんにちは。明月です。この投稿はメモリの割り当て(stackメモリとheapメモリ、そしてnew)とcall by reference(ポインタによる参照)に関する説明です。以前の投稿でクラスについて説明したことがあります。link - [java] 7. クラスを作成する方法(コンストラクタを作成方法)javaで変数を使う時、原始データタイプ(primitive type)ではなければすべてのタイプはnewで割り当てします。例えば、文字列タイプのstringを使う時に、我々はstring a = "hello world"と使いますが、内部的には string a = new string("hello world");と同じく処理が行います。つまり、javaでは原始データタイプ(primitive type)以外はすべてがクラスタイプになっております。クラスを使う時にはnewというキーワードを使います。上の例は当たり前ですが、我々が確認しなければならない部分はexample ex = new example(10);の部分です。イコールの前のexample exの部分は変数宣言です。ここで私がexample ex = 10;に作成すればエラーが発生します。なぜなら、example exにはintタイプではなくexampleタイプのインスタンスだけ格納するのでです。つまり、javaの内部ではexample ex = new example(10);に作成すると下記のイメージみたいにメモリ構造が生成されます。ここでstackメモリとheapメモリにの構造について説明が必要です。stackメモリは我々がプログラムを作成する時に、実行する領域を中括弧({})で作成します。この中括弧を我々はstack領域といいます。つまり、stack領域で宣言した変数はstackメモリに格納されるんだと思えば良いです。上のイメージを見るとmain関数の中で任意の中括弧を作成して新しいstack領域を作りました。その新しい領域で宣言したdataはstack領域を外れて使えません。また、元に戻ってexample exはstack領域で宣言した変数です。new example(10)の場合はheap領域で割り当てしたことです。heap領域というのはプログラムのメモリ領域ですが、プログラムが実行

Study / Java

#Java

作成日付 : 2019/08/07 20:53:34       修正日付 : 2021/01/08 17:55:28

56

こんにちは。明月です。この投稿はアクセス修飾子とstaticに関する説明ですこの投稿はアクセス修飾子とstaticに関する説明です。以前の投稿でクラスに関して説明したことがあります。link - [java] 7. クラスを作成する方法(コンストラクタを作成方法)アクセス修飾子クラスは変数と関数、コンストラクタを持っているし、その属性にアクセスするためにはアクセス修飾子が必要だと説明したことがあります。アクセス修飾子はプログラミングのオブジェクト指向(oop)の4つ特徴の中でカプセル化と関係があるキーワードです。カプセル化とはクラスをオブジェクトに考えて一つの目的と役割を設定してデータと機能を一つのオブジェクトに結ぶという意味になります。少し難しい概念ですね。オブジェクト指向(oop)の4つ特徴に関しては別の投稿で詳細に説明します。その意味でアクセス修飾子は関数や変数、クラスのアクセスの方法に関して設定することです。javaで扱うアクセス修飾子は下記通りになります。 アクセス修飾子 アクセス修飾子 説明 public すべてクラスからアクセスが可能です。 private クラス内部だけにアクセスが可能です。 protected 同じパッケージに属するクラスかつ継承されたクラスだけにアクセスが可能です。(クラス内部もアクセス可能) アクセス修飾子のアクセス権限は下記通りになります。 アクセス権限 アクセス修飾子 クラス 継承されたクラス 同じパッケージ すべてクラス private ○ ☓ ☓ ☓ (default) ○ ☓ ○ ☓ protected ○

Study / Java

#java

作成日付 : 2019/08/06 20:22:48       修正日付 : 2020/12/24 14:06:41

57

こんにちは。明月です。この投稿はクラスの継承とthis、superキーワードの使い方に関する説明です。以前にクラスを作成する方法に関して投稿しました。link - [java] 7. クラスを作成する方法(コンストラクタを作成方法)クラスは一つの目的をおいて構成すると説明しました。でも仕様によって様々なクラスをオブジェクトを作れば似ているクラスを多数に作ることを見れることがあります。以前の投稿で説明した家計計算クラスで例を説明したことがありますが、それを参照して説明します。privatefinanceのクラスは入金、出金に関数クラスです。基本的に入金、出金を貰って最終にcalculator関数を通って値段を計算することです。でも、ここで仕様によって通帳の内訳の機能があるクラスを追加したいです。つまり、クラスの内容は基本的に入金、出金は同じですが、入金、出金の順番と内容がある内訳が必要です。ここで条件は上のクラスはもうサービスで運用しているし、もう検証が終わったクラスなので、できれば修正したくないです。なぜなら、修正があるとまた検証のためにテストが必要からです。上のクラスはすごく簡単のクラスだから少し修正しても問題ないですが、もっと複雑な仕様だと思えば理解すると思います。その条件にするとすごく簡単にする方法は上のクラスをコピペしてクラス名を変更して作成すればよいです。また、他の仕様が追加すれば、そのことに続けてクラスをコピペで追加すればよいです。でも、javaの仕様によってlistクラスは使用禁止になりました。その可能性はほぼ0パーセントになりますが、例えばのとして考えます。それば問題がすべてのクラスのメンバー変数のinputとoutputのデータタイプを変更しなければならないです。そのクラスが20個~30個にするとすべて修正してすべてテスト及び検証しなければならないです。実際のプロジェクトで本当にその作業することが多いです。でも、上の問題はjavaの継承の機能を利用すればすごく簡単に解決します。上のaccountクラスはprivatefinanceのクラスを継承しました。クラスを継承する時にはextendsのキーワードを使います。javaの継承ルールは二つ以上のクラスの複数継承は禁止されています。つまり、一つだけのクラスを継承することができます。継承の意味はaccountクラスでprivatefinanc

Study / Java

#java

作成日付 : 2019/08/05 23:22:58       修正日付 : 2020/12/23 18:49:43

58

こんにちは。明月です。この投稿はクラスを作成する方法(コンストラクタを作成方法)に関する説明です。javaではクラスとは実行するための最小単位の動作する形です。我々がmain関数を利用してプログラムを実行しましたが、構造で確認すればすべてclassのキーワードでスタックを囲まれました。上の例はprogramのクラスでmain関数を作成して実行する例のソースです。 プログラムでmain関数を実行することでは別にクラスが必要なことではないですが、基本構造としてクラスをなしで関数を作成することがjavaでは不可能です。改めてまとめると、javaはクラスがなしでプログラムを作成することができません。クラス内部では作成するのはコンストラクタ、関数を作成することができます。そしてクラスのサイズを決定するメンバー変数を設定することができます。 クラス要素 説明 コンストラクタ クラスの初期処理及び関連機能処理 メンバー変数 フィールドという呼ばれるグローバル変数 関数 メソッド クラスで上の属性を使うためには必ずアクセス修飾子が必要です。アクセス修飾子は別途の投稿で説明します。一応、変数はprivate、関数はpublicで設定します。プログラムを実行するとデバッガーは始めにstatic main関数を探します。関数でstaticキーワードが付けると内部関数ではないと思えばよいです。詳細に関しては別の投稿で説明します。つまり、main関数は外部関数なのでprogramインスタンスが生成することは関係なく、呼び出すことができます。programのクラスをインスタンスを生成します。それはnewキーワードを利用します。newキーワードはメモリ割り当てと関係がある内容なのでこれも別途の投稿で説明します。インスタンスが生成する時にはクラスのコンストラクタが呼び出します。コンストラクタはリターンタイプが決めてないし、クラス名と同じ名の関数名に作成します。なのでnewでインスタンスを生成する時にパラメータを個数とタイプを合せなければならないです。上の例だと、コンストラクタでthis.a

Study / Java

#java

作成日付 : 2019/08/02 22:45:42       修正日付 : 2020/12/22 17:16:09

59

こんにちは。明月です。この投稿は関数の使い方(関数のオーバーロードと再帰的な方法について)に関する説明です。すべてのプログラムの言語で関数の使い方は文法的な差異がありますが、概念についてはc言語からすべて似ているです。プログラムの言語で関数は二つの概念があります。一つは関数は変数と違い、メモリ割り当てがなしで単純な処理概念だけあるので、main関数から始ますプログラム設計をもっと見やすく分ける役割をします。二つは数学的な関数と同じ概念で「f(x)=x+1」みたいに関数の目的をはっきりして「f(1)=2、f(2)=3」みたいに関数とパラメータの組み合てで一つ以上の二項関係を生成してプログラムの正義を単純にします。javaで関数の使い方は下記通りになります。アクセス修飾子は関数のアクセス設定ですが、これは関数の機能によりクラスのカプセルと関係があるので別の投稿で説明します。関数を定義するのはメソッド名が一番重要ですが、javaはオーバーロード機能があり、メソッドの名+パラメータの組み合てで結んで関数を定義します。オーバーロードは投稿の下の部分の詳しく説明します。まず、関数のリターンタイプ(データタイプ)、メソッドの名、パラメータの構造で作成されます。リターンタイプが無い場合じゃなければ、すべて関数でreturnを生成してタイプを一致しなければならないように作成します。もし、上の処理式みたいに関数を使わなくてもmain関数で計算してプログラムを実装することができます。 でも関数を使うことで同じ処理を一つにまとめることができます。上みたいに少し複雑な計算を関数式に変換するとコードの可読性もよくなるし、関数再使用がよくなるのでソース管理のこともよくなります。calcという関数は可変のパラメータから値段を受け取って税金の10パーセントの計算まで処理してリターンする関数です。もし、この関数の内容もmainに計算式を入れてプログラムを作成することも可能です。でも同じ計算式がmain関数に作成しソースのステップがすごく大きくなります。これは数学の因数分解、置換性と関係があることですね。つまり、main関数でa、b、c、dの変数宣言した後にa、c、dの総額合算+税金計算+コンソール出力、a、cの総額合算+税金計算+コンソール出力、b、c、dの総額合算+税金計算+コンソール出力の処理になることで総額合算+税金計算を関数に生成し

Study / Java

#java

作成日付 : 2019/08/01 20:40:40       修正日付 : 2020/12/21 17:14:04

60

こんにちは。明月です。この投稿は配列とリスト(list)、マップ(map)の使い方に関する説明です。配列は以前c/c++でデータをデータタイプのサイズによって順番的に並べることが配列だといいます。javaはランタイムメモリ構造なのでデータがメモリに順番的に並べることについては意味がありません。すべてデータをポインターで連結するからです。それでも使うことは同じデータタイプのデータを一つの変数名に格納することが可能し、不要なステップを減ることができるし、連結リスト構造みたいにポインター検索ではないので検索する時にパフォーマンスがよくなるからです。配列を宣言することは変数の大括弧で宣言することができます。上の大括弧を一つ使ったことを一次元配列だといいます。そうすれば、配列の中で配列を使えるか?それを多次元配列といいます。大括弧は開き、閉めの個数ほと次元が増えます。配列の短所は宣言する時に配列の個数を宣言してその以上のデータを格納するとエラーが発生します。配列で宣言することを静的宣言といいまうが、我々が複数のデータを扱う時に先にデータ個数を何個使うかを知る時がありますが、入力個数が仕様によって何個使うかを知らない場合もあります。それを動的宣言といいますが、それは配列ではなくlistクラスで扱うことができます。javaはリスト(list)のオブジェクトがインタフェースに構成させ、実装されているクラスはarraylistとlinkedlistがあります。arraylistは内部的に配列形式になって、linkedlistは連携リストの構造になっています。(データ構造とアルゴリズムは別途の投稿で説明します。)配列の場合は複数個数を宣言すると特定な位置のデータを取り除くのができません。でもリスト(list)の場合は入力する個数を決めることもないし、どの位置でも挿入、取り除きができます。linkedlistとarraylistは基本的にlistインタフェースを継承しましたので、使い方は同じです。リスト(list)は配列に比べて随分に動的だしデータ入れ除くが楽です。データ探索することでも配列とリストは似てます。上の例では一つ、二つのデータを例をしましたが、データが何万個になると探索も随分重要になります。 データを探すたびにfor文を利用して0から何万まで繰り返すと思えばパフォーマンスに影響があります。それでリスト(list)構

Study / Java

#Java#

作成日付 : 2019/07/26 23:25:58       修正日付 : 2020/12/18 14:36:13

61

こんにちは。明月です。この投稿は制御文に関する説明です。制御文とはプログラムの流れを制御するか繰り返しを決定するキーワードという意味です。例えば、関係演算子か論理演算子を通って二つの変数でブール(boolean)の値によってtrueの時には処理や、falseの時に処理を制御すること、またその処理は繰り返して何回に処理することを制御するという意味です。この制御文は始めc言語から派生した文法でjavaやc#などのほぼすべてのプログラム言語が表現することは文法として差異があるかもしれませんが、処理方法は同じです。制御文は処理する方法に関して条件文、選択文、繰り返し文、分岐文ということに区分になります。if ~ else if ~ elseif ~ else if ~ elseはブール(boolean)の値によって処理する条件文です。要約してif文の条件が真(true)なら当該なスタックを実行する構造です。最後にelseがある場合、ifやelse ifがすべて偽ならelseのスタックを実行されます。上の例を説明すると始めの条件でaの変数の条件を確認します。aのブール値がtrueなのでif(a)のスタックが実行されます。なのでコンソールには「first condition = true」のメッセージがコンソールに表示されます。次の条件式でif~elseですが、変数aがtrueならif(a)のスタックが実行されるし、falseならelseのスタックが実行されます。aの値をfalseに設定したので、「second condition = false」のメッセージがコンソールに表示されます。最後は変数の関係演算子でtrue、falseの値を計算してスタックが実行されるように設定しました。bの値は2なのでelse if(b==2)のスタックが実行されます。なので「third condition b = 2」がコンソールに表示されます。switch ~ caseswitch ~ caseの選択文でif ~ else if ~ elseと似ている処理に行います。switch ~ caseで重要なキーワードはbreakです。switchの条件数式と合う値を探してスタックが実行されますが、breakがなければ当該caseスタックだけではなく、当該なcaseの以下のスタックもすべて実行してしまうことになります。上の例を見ると始めのs

Study / Java

#Java#

作成日付 : 2019/07/25 23:37:36       修正日付 : 2020/12/17 18:11:28

62

こんにちは。明月です。この投稿は演算子に関する説明です。演算子という意味は数式を計算する記号です。プログラムで使っている数学的な記号は我々が数学時間で勉強した数学記号とほぼ同じ意味です。それでプログラムで演算記号で勘違いことが少ないです。しかしプログラムではただ数学が表現だけではなくビット演算、論理演算記号があるので区分しておくほうが良いです。 演算子 使用方法 説明 算術演算子 ++ ++a, a++ 値を1を増加する。(前位,後位演算子) -- --a, a-- 値を1を加減する。(前位,後位演算子)값을 하나 감소시킵니다.(전위, 후위 연산자) + a + b 足す算 - a - b 引く算 * a * b 掛ける算 / a / b 割る算 % a % b 割れ残り 関係演算子 > a > b aがbより大きならtrueを返却、少ないか同じならfalseを返却 >= a >= b aがbより大きいか同じならtrueを返却、少ないならfalseを返却 < a < b aがbより少ないならtrueを返却、大きいか同じならfalseを返却 <= a <= b aがbより少ないか同じならtrueを返却、大きいならfalseを返却 == a == b aとb同じならtrueを返却、違いならfalseを返却 != a != b aとbが違いならtrueを返却、同じならtrueを返却 ビット演算子 << a << b 整数aの2進数値を左にbほど移動させ、残りは0にする。例) 0001(1) << 2 = 0100

Study / Java

#Java#

作成日付 : 2019/07/25 23:38:36       修正日付 : 2020/12/16 17:14:43

63

こんにちは。明月です。この投稿は変数と定数の宣言方法、そして原始データタイプとクラスデータタイプの差異に関する説明です。プログラムを始めに習う時に一番初めに説明することはこの変数と定数を宣言することではないかと思います。変数と定数というのはプログラム中で宣言する方法、使い方法だけの差異があることで実際にシステムの中では同じ意味のキーワードです。それで一応、説明をしやすくするためにすべて変数ということで説明します。パソコンは大きく見ればcpuとメモリ、ハードディスクに構成しているし、一般的なio(input、output)装置でモニター、キーボード、マウスがあります。cpuとは演算する装置だし、メモリとハードディスクはデータを格納する装置です。メモリとハードディスクはパソコンやプログラムが終了してもデータが保存されるか消滅するかの差異があります。ここで我々がプログラムを作成する時、メモリにデータを一時的に保存する必要があります。それがプログラム言語で変数の役割です。変数のタイプは(primitive type基準)大きく見れば整数型、実数型、文字型、ブール型に分けます。整数型ではint、byte、short、longタイプがあり、実数型はfloat、doubleタイプがあります。文字型はcharタイプがります。ブール型の場合は真偽の区分でbooleanタイプがあります。ここで私の経験上でよく使うデータタイプはint、byte、booleanがあり、たまにcharタイプを使うことがあります。小数点以下のデータを表現するためにはfloatとdoubleを使いますが、最近は「浮動小数点誤差」というバグではないバグがありますが、それのせいで計算上にエラーが発生する時があるのでbigdecimalを使います。(bigdecimalはprimitive typeではなくクラスタイプです。) データタイプ 説明 文字型データタイプ char 16ビッドユニーコード文字(アスキーコード参考) string byte(unsigned char)タイプになっているユニーコード文字列タイプクラス ブール型データタイプ boolean 真(true)、 偽(false)タイプの論理データタイ

Study / Java

#Java#

作成日付 : 2019/07/24 23:12:32       修正日付 : 2020/12/15 16:14:47

64

こんにちは。明月です。この投稿はjavaとは?、javaインストール、eclipseインストールに関する説明です。この投稿からjavaに関して説明しようと思います。私の注力の言語はc#です。javaとc#の差異といえばほぼ同じです。オープンソースの種類の差異がありますが、似ているので、c#の言語が主に使ってもjavaを使うことで違和感がありませんでした。逆にオープンソースの量だけ考えるとc#より多いことがあるので使うことではもっと楽なこともありました。でも、ライセンスや整合性保証に関して疑問があるので、使うことではよく考えて使わなければなりませんでした。でも、日本の仕事現場に関してc#よりjavaのことが多いです。仕事のスタイルによって違いますが、一応、私が考えるのはそうです。それならこれからjavaに関して調べてみましょう。javaについて「java」は1991年代にジェームズ・ゴスリンとその人のチームによって開発されて1995年に発表しました。初めは家電製品等のため開発されましたが、現在はウェブアプリケーションで一番人気があるプログラム言語になりました。現在、「java」はサン・マイクロシステムズによって無料で提供しているし、「java」のバージョンは12.0まで発表しました。「java」の場合は「c#」と比べて値段が安いですが、安いって言うのは「c#」言語ライセンスがお金をがかかることではなく、javaの環境を作るように立ち上がるシステムが無料オープンソースが多いです。例えば、サーバの場合はcentosがあるし、ideツールでも「eclipse」、「netbeans」があるます。そしてウェブサーバ、アプリサーバの「apache」、「tomcat」、「glassfish」、「jboss」がすべて無料なので、システムを立ち上げる時、比較的に安く構築ができます。そうすればjavaを開発するためにjavaのインストールとeclipseをインストールしましょう。最近のwindows環境だと基本的にjavaがインストールされていますが、バージョンが古いことがあるので最新バージョンをダウンロードしましょう。(参考:javaのバージョンはoracleバージョンとopenjavaバージョンがありますが、oracleの場合は最近著作権の問題で一応無料ですが、念のためopenjavaでインストールしましょう。)javaイ

Study / Java

#Java#

作成日付 : 2019/07/24 23:03:21       修正日付 : 2020/12/15 12:20:07